<?xml version="1.0"?>
<!-- name="generator" content="blojsom v2.30" -->
<rss version="2.0" xmlns:wfw="http://wellformedweb.org/CommentAPI/">
    <channel>
        <title>www.entropy.ch blog</title>
        <link>http://www.entropy.ch/blog/</link>
        <description>Marc Liyanage’s weblog on www.entropy.ch</description>
        <language>en</language>
        <image>
            <url>http://www.entropy.ch/blojsom/favicon.ico</url>
            <title>www.entropy.ch blog</title>
            <link>http://www.entropy.ch/blog/</link>
        </image>
        <docs>http://blogs.law.harvard.edu/tech/rss</docs>
		<generator>blojsom v2.30</generator>
		<managingEditor>blog@entropy.ch</managingEditor>
		<webMaster>blog@entropy.ch</webMaster>
		<pubDate>Thu, 14 Apr 2011 06:07:04 +0200</pubDate>

        	            <item>
            <title>Santa Cruz Seascape Workshop</title>
            <!--<link>http://www.entropy.ch/blog/Pictures/?permalink=Santa-Cruz-Seascape-Workshop.html</link>-->
            <link>http://www.entropy.ch/blog/Pictures/2011/04/14/Santa-Cruz-Seascape-Workshop.html</link>
            <description>&lt;div style=&quot;padding: 0; overflow: hidden; margin: 0; width: 480px;&quot;&gt;


&lt;a href=&quot;http://www.flickr.com/photos/liyanage/5618361670/in/set-72157626369055867/&quot; title=&quot;Santa Cruz Seascape Workshop&quot; style=&quot;text-decoration: none;&quot;&gt;&lt;img src=&quot;http://farm6.static.flickr.com/5188/5618361670_b0861a92a2_s.jpg&quot; alt=&quot;Santa Cruz Seascape Workshop&quot; style=&quot;padding: 0 10px 10px 0; width: 75px; height: 75px; float: left;&quot;/&gt;&lt;/a&gt;

&lt;a href=&quot;http://www.flickr.com/photos/liyanage/5618174372/in/set-72157626369055867/&quot; title=&quot;Santa Cruz Seascape Workshop&quot; style=&quot;text-decoration: none;&quot;&gt;&lt;img src=&quot;http://farm6.static.flickr.com/5146/5618174372_0c62d3a4cc_s.jpg&quot; alt=&quot;Santa Cruz Seascape Workshop&quot; style=&quot;padding: 0 10px 10px 0; width: 75px; height: 75px; float: left;&quot;/&gt;&lt;/a&gt;

&lt;a href=&quot;http://www.flickr.com/photos/liyanage/5617581975/in/set-72157626369055867/&quot; title=&quot;Santa Cruz Seascape Workshop&quot; style=&quot;text-decoration: none;&quot;&gt;&lt;img src=&quot;http://farm6.static.flickr.com/5301/5617581975_f2cceabc38_s.jpg&quot; alt=&quot;Santa Cruz Seascape Workshop&quot; style=&quot;padding: 0 10px 10px 0; width: 75px; height: 75px; float: left;&quot;/&gt;&lt;/a&gt;

&lt;a href=&quot;http://www.flickr.com/photos/liyanage/5618163676/in/set-72157626369055867/&quot; title=&quot;Santa Cruz Seascape Workshop&quot; style=&quot;text-decoration: none;&quot;&gt;&lt;img src=&quot;http://farm6.static.flickr.com/5068/5618163676_98e8725fb5_s.jpg&quot; alt=&quot;Santa Cruz Seascape Workshop&quot; style=&quot;padding: 0 10px 10px 0; width: 75px; height: 75px; float: left;&quot;/&gt;&lt;/a&gt;

&lt;a href=&quot;http://www.flickr.com/photos/liyanage/5617563033/in/set-72157626369055867/&quot; title=&quot;Santa Cruz Seascape Workshop&quot; style=&quot;text-decoration: none;&quot;&gt;&lt;img src=&quot;http://farm6.static.flickr.com/5189/5617563033_1c0b78b100_s.jpg&quot; alt=&quot;Santa Cruz Seascape Workshop&quot; style=&quot;padding: 0 10px 10px 0; width: 75px; height: 75px; float: left;&quot;/&gt;&lt;/a&gt;

&lt;a href=&quot;http://www.flickr.com/photos/liyanage/5618141768/in/set-72157626369055867/&quot; title=&quot;Santa Cruz Seascape Workshop&quot; style=&quot;text-decoration: none;&quot;&gt;&lt;img src=&quot;http://farm6.static.flickr.com/5101/5618141768_a5f6d27769_s.jpg&quot; alt=&quot;Santa Cruz Seascape Workshop&quot; style=&quot;padding: 0 10px 10px 0; width: 75px; height: 75px; float: left;&quot;/&gt;&lt;/a&gt;

&lt;a href=&quot;http://www.flickr.com/photos/liyanage/5617543973/in/set-72157626369055867/&quot; title=&quot;Santa Cruz Seascape Workshop&quot; style=&quot;text-decoration: none;&quot;&gt;&lt;img src=&quot;http://farm6.static.flickr.com/5029/5617543973_a5912e93a3_s.jpg&quot; alt=&quot;Santa Cruz Seascape Workshop&quot; style=&quot;padding: 0 10px 10px 0; width: 75px; height: 75px; float: left;&quot;/&gt;&lt;/a&gt;

&lt;a href=&quot;http://www.flickr.com/photos/liyanage/5617539565/in/set-72157626369055867/&quot; title=&quot;Santa Cruz Seascape Workshop&quot; style=&quot;text-decoration: none;&quot;&gt;&lt;img src=&quot;http://farm6.static.flickr.com/5270/5617539565_cb05a18d76_s.jpg&quot; alt=&quot;Santa Cruz Seascape Workshop&quot; style=&quot;padding: 0 10px 10px 0; width: 75px; height: 75px; float: left;&quot;/&gt;&lt;/a&gt;

&lt;a href=&quot;http://www.flickr.com/photos/liyanage/5618119562/in/set-72157626369055867/&quot; title=&quot;Santa Cruz Seascape Workshop&quot; style=&quot;text-decoration: none;&quot;&gt;&lt;img src=&quot;http://farm6.static.flickr.com/5027/5618119562_0fbcf34a7e_s.jpg&quot; alt=&quot;Santa Cruz Seascape Workshop&quot; style=&quot;padding: 0 10px 10px 0; width: 75px; height: 75px; float: left;&quot;/&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;font-size: 0.8em; margin-top: 0px; margin-bottom: 5px&quot;&gt;&lt;p&gt;

&lt;a href=&quot;http://www.flickr.com/photos/liyanage/sets/72157626369055867/&quot;&gt;Santa Cruz Seascape Workshop&lt;/a&gt;, a set on Flickr.&lt;/p&gt;&lt;/div&gt;
</description>
            <guid>http://www.entropy.ch/blog/Pictures/?permalink=Santa-Cruz-Seascape-Workshop.html</guid>
			<pubDate>Thu, 14 Apr 2011 06:07:04 +0200</pubDate>
                    </item>
        	            <item>
            <title>A New Mac OS X PHP Distribution</title>
            <!--<link>http://www.entropy.ch/blog/Software/?permalink=A-New-Mac-OS-X-PHP-Distribution.html</link>-->
            <link>http://www.entropy.ch/blog/Software/2011/04/13/A-New-Mac-OS-X-PHP-Distribution.html</link>
            <description>&lt;p&gt;During the last year I was too busy to update my PHP distribution for compatibility with Mac OS X 10.6. Now my friends at &lt;a href=&quot;http://www.local.ch&quot;&gt;local.ch&lt;/a&gt; and &lt;a href=&quot;http://www.liip.ch&quot;&gt;liip&lt;/a&gt; fixed this situation and started a new easy to install PHP distribution, which I recommend for PHP development on Mac OS X 10.6 and hopefully &lt;a href=&quot;http://www.apple.com/macosx/lion/&quot;&gt;beyond&lt;/a&gt;. Check out their announcement:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://blog.liip.ch/archive/2011/04/13/php-5-3-for-os-x-10-6-one-line-installer.html&quot;&gt;http://blog.liip.ch/archive/2011/04/13/php-5-3-for-os-x-10-6-one-line-installer.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If the stock PHP module on Mac OS X doesn’t have all the features you need, check out this distribution.&lt;/p&gt;

&lt;p&gt;Thanks to the local.ch and liip folks for their work!&lt;/p&gt;

</description>
            <guid>http://www.entropy.ch/blog/Software/?permalink=A-New-Mac-OS-X-PHP-Distribution.html</guid>
			<pubDate>Wed, 13 Apr 2011 19:03:14 +0200</pubDate>
                    </item>
        	            <item>
            <title>San Francisco from Twin Peaks after Sunset</title>
            <!--<link>http://www.entropy.ch/blog/Pictures/?permalink=San-Francisco-from-Twin-Peaks-after-Sunset.html</link>-->
            <link>http://www.entropy.ch/blog/Pictures/2011/04/03/San-Francisco-from-Twin-Peaks-after-Sunset.html</link>
            <description>&lt;div style=&quot;padding: 0; overflow: hidden; margin: 0; width: 500px;&quot;&gt;&lt;a href=&quot;http://www.flickr.com/photos/liyanage/5584629572/in/set-72157626416981534/&quot; title=&quot;Sutro Tower&quot; style=&quot;text-decoration: none;&quot;&gt;&lt;img src=&quot;http://farm6.static.flickr.com/5091/5584629572_31463c1ea3_s.jpg&quot; alt=&quot;Sutro Tower&quot; style=&quot;padding: 0 10px 10px 0; width: 75px; height: 75px; float: left;&quot;/&gt;&lt;/a&gt;&lt;a href=&quot;http://www.flickr.com/photos/liyanage/5584040007/in/set-72157626416981534/&quot; title=&quot;San Francisco from Twin Peaks after Sunset&quot; style=&quot;text-decoration: none;&quot;&gt;&lt;img src=&quot;http://farm6.static.flickr.com/5133/5584040007_bb2d6c3ea6_s.jpg&quot; alt=&quot;San Francisco from Twin Peaks after Sunset&quot; style=&quot;padding: 0 10px 10px 0; width: 75px; height: 75px; float: left;&quot;/&gt;&lt;/a&gt;&lt;a href=&quot;http://www.flickr.com/photos/liyanage/5584630384/in/set-72157626416981534/&quot; title=&quot;Sutro Tower from Twin Peaks after Sunset&quot; style=&quot;text-decoration: none;&quot;&gt;&lt;img src=&quot;http://farm6.static.flickr.com/5223/5584630384_3285a9dc10_s.jpg&quot; alt=&quot;Sutro Tower from Twin Peaks after Sunset&quot; style=&quot;padding: 0 10px 10px 0; width: 75px; height: 75px; float: left;&quot;/&gt;&lt;/a&gt;&lt;a href=&quot;http://www.flickr.com/photos/liyanage/5584630626/in/set-72157626416981534/&quot; title=&quot;San Francisco from Twin Peaks after Sunset&quot; style=&quot;text-decoration: none;&quot;&gt;&lt;img src=&quot;http://farm6.static.flickr.com/5183/5584630626_c0a24ecbec_s.jpg&quot; alt=&quot;San Francisco from Twin Peaks after Sunset&quot; style=&quot;padding: 0 10px 10px 0; width: 75px; height: 75px; float: left;&quot;/&gt;&lt;/a&gt;&lt;a href=&quot;http://www.flickr.com/photos/liyanage/5584040911/in/set-72157626416981534/&quot; title=&quot;Sutro Tower from Twin Peaks after Sunset&quot; style=&quot;text-decoration: none;&quot;&gt;&lt;img src=&quot;http://farm6.static.flickr.com/5229/5584040911_cf18830e3b_s.jpg&quot; alt=&quot;Sutro Tower from Twin Peaks after Sunset&quot; style=&quot;padding: 0 0 10px 0; width: 75px; height: 75px; float: left;&quot;/&gt;&lt;/a&gt;&lt;br clear=&quot;all&quot; /&gt;&lt;/div&gt;&lt;div style=&quot;font-size: 0.8em; margin-top: 0px; margin-bottom: 5px&quot;&gt;&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/liyanage/sets/72157626416981534/&quot;&gt;San Francisco from Twin Peaks after Sunset&lt;/a&gt;, a set on Flickr.&lt;/p&gt;&lt;/div&gt;
</description>
            <guid>http://www.entropy.ch/blog/Pictures/?permalink=San-Francisco-from-Twin-Peaks-after-Sunset.html</guid>
			<pubDate>Sun, 3 Apr 2011 10:10:06 +0200</pubDate>
                    </item>
        	            <item>
            <title>2011 Update to checklibs Script for dynamic library dependencies</title>
            <!--<link>http://www.entropy.ch/blog/Developer/?permalink=2011-Update-to-checklibs-Script-for-dynamic-library-dependencies.html</link>-->
            <link>http://www.entropy.ch/blog/Developer/2011/03/05/2011-Update-to-checklibs-Script-for-dynamic-library-dependencies.html</link>
            <description>&lt;p&gt;Here’s another update of my checklibs script for analyzing dynamic library dependencies of Mach-O binaries. See &lt;a href=&quot;http://www.entropy.ch/blog/Developer/2009/07/05/Updated-checklibs-pl-script-to-list-dynamic-library-dependencies.html&quot;&gt;earlier articles&lt;/a&gt; for an introduction.&lt;/p&gt;

&lt;p&gt;It’s in fact not an update but a complete rewrite that was needed to handle the complex load path relationships that can be expressed with some of dyld’s newer features such as &lt;code&gt;@rpath&lt;/code&gt;. The script should be able to properly display every possible linking combination. If it doesn’t, let me know so I can try to make it smarter.&lt;/p&gt;

&lt;p&gt;The main use case is still to catch the unintentional linking against nonstandard frameworks and libraries. Here’s how to use it:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;checklibs.py /path/to/Foo.app/Contents/MacOS/Foo&lt;/pre&gt;

&lt;p&gt;There are some command line options, use the &lt;code&gt;--help&lt;/code&gt; option to get a list of them.&lt;/p&gt;

&lt;p&gt;Referenced non-embedded frameworks in nonstandard locations are highlighted in blue. Frameworks that are not found on the file system are marked with a red &lt;code&gt;(missing)&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://www.entropy.ch/blojsom/resources/marc/checklibs.png&quot; alt=&quot;checklibs.png&quot; border=&quot;0&quot; width=&quot;480&quot; height=&quot;277&quot; /&gt;&lt;/p&gt;

&lt;p&gt;If a framework is embedded and referenced with one of the @ placeholders &lt;code&gt;@executable_path&lt;/code&gt;, &lt;code&gt;@loader_path&lt;/code&gt; or &lt;code&gt;@rpath&lt;/code&gt;, the script shows both the original and the resolved path so you can see how a particular binary was found.&lt;/p&gt;

&lt;p&gt;In the case of &lt;code&gt;@rpath&lt;/code&gt;, the script also shows which binary supplied the rpath value that was used.&lt;/p&gt;

&lt;p&gt;The new version, called &lt;a href=&quot;https://github.com/liyanage/macosx-shell-scripts/blob/master/checklibs.py&quot;&gt;checklibs.py&lt;/a&gt;, is on github. Feel free to enhance it and send pull requests.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Developer/?permalink=2011-Update-to-checklibs-Script-for-dynamic-library-dependencies.html</guid>
			<pubDate>Sat, 5 Mar 2011 09:34:42 +0100</pubDate>
                    </item>
        	            <item>
            <title>forageSF Underground Market</title>
            <!--<link>http://www.entropy.ch/blog/Pictures/?permalink=forageSF-Underground-Market.html</link>-->
            <link>http://www.entropy.ch/blog/Pictures/2011/01/18/forageSF-Underground-Market.html</link>
            <description>&lt;div style=&quot;float: right; margin-left: 10px; margin-bottom: 10px;&quot;&gt;
&lt;a class=&#39;img&#39; href=&quot;http://www.flickr.com/photos/liyanage/5365755725/&quot; title=&quot;forageSF Underground Market&quot;&gt;&lt;img src=&quot;http://farm6.static.flickr.com/5004/5365755725_b36a2d3fe7_m.jpg&quot; alt=&quot;forageSF Underground Market&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;

&lt;br style=&#39;clear: both&#39;/&gt;
&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Pictures/?permalink=forageSF-Underground-Market.html</guid>
			<pubDate>Tue, 18 Jan 2011 17:29:17 +0100</pubDate>
                    </item>
        	             <item>
            <title>Switching ISPs in San Francisco from Comcast to Webpass</title>
            <!--<link>http://www.entropy.ch/blog/?permalink=Switching-ISPs-in-San-Francisco-from-Comcast-to-Webpass.html</link>-->
            <link>http://www.entropy.ch/blog/2010/12/22/Switching-ISPs-in-San-Francisco-from-Comcast-to-Webpass.html</link>
            <description>&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; I did upgrade the Time Capsule to the 4th generation model, see the new section at the end of the article.&lt;/p&gt;

&lt;p&gt;I got a new Internet connection at home today to replace Comcast cable modem service. It’s from &lt;a href=&quot;http://www.web-pass.com&quot;&gt;Webpass&lt;/a&gt;, a local Internet provider currently serving San Francisco and Oakland. Webpass brings connectivity to our building via a &lt;a href=&quot;https://www.saftehnika.com/upload/File/Siebel/20101208_USA_ISP_Network_Lumina_24.pdf&quot;&gt;microwave link&lt;/a&gt; on the roof. They run a mesh network across similar buildings in the city. The buildings get connectivity and are hops to reach other buildings at the same time. From the roof, they distribute the network to the units that subscribe to their service. They only offer this service in buildings that already have cabling infrastructure to support this. There’s no modem or router in the unit, the connection goes straight to an Ethernet jack.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://www.entropy.ch/blojsom/resources/marc/microwave.png&quot; alt=&quot;microwave.png&quot; border=&quot;0&quot; width=&quot;480&quot; height=&quot;205&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Image by &lt;a href=&quot;https://www.saftehnika.com&quot;&gt;SAF Tehnika&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The service is advertised as 45 or 100Mbit/s, depending on the cabling in the building. I found it hard to measure the actual throughput with a tool/website that is not tied to one of the providers, but the new connection is about five times faster, I see download speeds of about 60Mbit/s. See below for some measurements.&lt;/p&gt;

&lt;p&gt;One thing that’s new is that the upload and download speeds are symmetrical so upload is very fast compared to cable or DSL. On most days I wouldn’t care because I need a lot more download- than upload-bandwidth, but every once in a while I do have to upload very large files to servers at work, and then it’s great to be able to do so quickly.&lt;/p&gt;

&lt;p&gt;One thing I noticed is that the bottleneck is now my wireless network, even though I use a draft-N 5GHz AirPort Extreme base station. I’ll try replacing the one I have, which is several years old, with the latest generation model to see if I can optimize it a bit &lt;em&gt;(I did this, see below for an update)&lt;/em&gt;. I probably still won’t be able to reach the Ethernet speeds.&lt;/p&gt;

&lt;p&gt;The cost for the service is US$ 400.– per year, about $33.– per month. The installation was quick and easy, the technician was very friendly, competent and efficient.&lt;/p&gt;

&lt;p&gt;If you can get it in your building, I highly recommend this service, as do most of the &lt;a href=&quot;http://www.yelp.com/biz/webpass-san-francisco&quot;&gt;reviewers on yelp&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Speed Tests&lt;/h2&gt;

&lt;p&gt;Here are some measurements. They were taken with the computer connected directly to the Ethernet port, no wireless.&lt;/p&gt;

&lt;h3&gt;Stanford netspeed test&lt;/h3&gt;

&lt;p&gt;Comcast:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://www.entropy.ch/blojsom/resources/marc/stanford-comcast.png&quot; alt=&quot;stanford-comcast.png&quot; border=&quot;0&quot; width=&quot;480&quot; height=&quot;123&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Webpass:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://www.entropy.ch/blojsom/resources/marc/stanford-webpass.png&quot; alt=&quot;stanford-webpass.png&quot; border=&quot;0&quot; width=&quot;480&quot; height=&quot;117&quot; /&gt;&lt;/p&gt;

&lt;h3&gt;Download of a big test file from a web server&lt;/h3&gt;

&lt;p&gt;Comcast:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://www.entropy.ch/blojsom/resources/marc/testfile-comcast.png&quot; alt=&quot;testfile-comcast.png&quot; border=&quot;0&quot; width=&quot;410&quot; height=&quot;35&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Webpass:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://www.entropy.ch/blojsom/resources/marc/testfile-webpass.png&quot; alt=&quot;testfile-webpass.png&quot; border=&quot;0&quot; width=&quot;385&quot; height=&quot;36&quot; /&gt;&lt;/p&gt;


&lt;h3&gt;Webpass Speed Test by Ookla&lt;/h3&gt;

&lt;p&gt;Not sure how reliable/unbiased this one is, since it’s provided by Webpass.&lt;/p&gt;

&lt;p&gt;Comcast:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://www.entropy.ch/blojsom/resources/marc/ookla-comcast.png&quot; alt=&quot;ookla-comcast.png&quot; border=&quot;0&quot; width=&quot;480&quot; height=&quot;328&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Webpass:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://www.entropy.ch/blojsom/resources/marc/ookla-webpass.png&quot; alt=&quot;ookla-webpass.png&quot; border=&quot;0&quot; width=&quot;480&quot; height=&quot;334&quot; /&gt;&lt;/p&gt;

&lt;h2&gt;Base Station Upgrade&lt;/h2&gt;

&lt;p&gt;After noticing the difference between Ethernet and wireless throughput when performing the initial tests, I upgraded the Time Capsule from a &lt;a href=&quot;http://en.wikipedia.org/wiki/Time_Capsule_(Apple)#Models_by_SKU&quot;&gt;second to a fourth generation&lt;/a&gt; model.&lt;/p&gt;

&lt;p&gt;The difference in performance is quite dramatic, download throughput doubled from 40 to 80MBit/s:&lt;/p&gt;

&lt;p&gt;2nd Generation:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://www.entropy.ch/blojsom/resources/marc/time-capsule-2nd-generation.png&quot; alt=&quot;time-capsule-2nd-generation.png&quot; border=&quot;0&quot; width=&quot;300&quot; height=&quot;135&quot; /&gt;&lt;/p&gt;

&lt;p&gt;4th Generation:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://www.entropy.ch/blojsom/resources/marc/time-capsule-4th-generation.png&quot; alt=&quot;time-capsule-4th-generation.png&quot; border=&quot;0&quot; width=&quot;300&quot; height=&quot;135&quot; /&gt;&lt;/p&gt;



</description>
            <guid>http://www.entropy.ch/blog/?permalink=Switching-ISPs-in-San-Francisco-from-Comcast-to-Webpass.html</guid>
			<pubDate>Wed, 22 Dec 2010 08:40:43 +0100</pubDate>
                    </item>
        	            <item>
            <title>Album Artwork Assistant 3.0</title>
            <!--<link>http://www.entropy.ch/blog/Software/?permalink=Album-Artwork-Assistant-3-0.html</link>-->
            <link>http://www.entropy.ch/blog/Software/2010/11/29/Album-Artwork-Assistant-3-0.html</link>
            <description>&lt;p&gt;I updated &lt;a href=&quot;http://www.entropy.ch/software/macosx/album-artwork-assistant/&quot;&gt;Album Artwork Assistant&lt;/a&gt;, my album cover artwork search tool. Version 3.0 fixes some longstanding Snow Leopard compatibility issues (Quick Look is back!) and cleans up the user interface a bit.&lt;/p&gt;

&lt;p&gt;If you haven’t used Album Artwork Assistant, here’s what people say about it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.macupdate.com/info.php/id/29769/album-artwork-assistant&quot;&gt;macupdate.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://osx.iusethis.com/app/albumartworkassistant&quot;&gt;iusethis.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here are the minor UI changes:&lt;/p&gt;

&lt;p&gt;Old:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://www.entropy.ch/blojsom/resources/marc/Album Artwork Assistant 2.9.png&quot; alt=&quot;Album Artwork Assistant 2.9.png&quot; border=&quot;0&quot; width=&quot;480&quot; height=&quot;529&quot; /&gt;&lt;/p&gt;

&lt;p&gt;New:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.entropy.ch/blojsom/resources/marc/Album Artwork Assistant 3.0.png&quot; alt=&quot;Album Artwork Assistant 3.0.png&quot; border=&quot;0&quot; width=&quot;480&quot; height=&quot;537&quot; /&gt;&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Software/?permalink=Album-Artwork-Assistant-3-0.html</guid>
			<pubDate>Mon, 29 Nov 2010 03:41:27 +0100</pubDate>
                    </item>
        	            <item>
            <title>XML View Plugin 2.1</title>
            <!--<link>http://www.entropy.ch/blog/Software/?permalink=XML-View-Plugin-2-1.html</link>-->
            <link>http://www.entropy.ch/blog/Software/2010/11/22/XML-View-Plugin-2-1.html</link>
            <description>&lt;p&gt;&lt;a href=&quot;http://www.entropy.ch/software/macosx/xmlviewplugin/&quot;&gt;XML View Plugin&lt;/a&gt; has been updated. This version adds a new “View Original” option to the plugin’s menu that temporarily disables all plugins for the current page. This provides a workaround for viewing sites that use XSLT stylesheets, such as &lt;a href=&quot;http://google-styleguide.googlecode.com/svn/trunk/objcguide.xml&quot;&gt;http://google-styleguide.googlecode.com/svn/trunk/objcguide.xml&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Thanks to &lt;a href=&quot;https://github.com/orangenhain&quot;&gt;Stefan&lt;/a&gt; for his clever implementation of this useful feature.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://www.entropy.ch/blojsom/resources/marc/xmlview-plugin-view-original.png&quot; alt=&quot;XML View Plugin View Original Menu Option&quot; border=&quot;0&quot; width=&quot;480&quot; height=&quot;573&quot; /&gt;&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Software/?permalink=XML-View-Plugin-2-1.html</guid>
			<pubDate>Mon, 22 Nov 2010 06:17:45 +0100</pubDate>
                    </item>
        	            <item>
            <title>Graphing Thread Counts in Instruments with DTrace</title>
            <!--<link>http://www.entropy.ch/blog/Developer/?permalink=Graphing-Thread-Counts-in-Instruments-with-DTrace.html</link>-->
            <link>http://www.entropy.ch/blog/Developer/2010/10/18/Graphing-Thread-Counts-in-Instruments-with-DTrace.html</link>
            <description>&lt;p&gt;I recently wanted to watch the thread count history of a running application as a graph in &lt;a href=&quot;http://en.wikipedia.org/wiki/Instruments_(application)&quot;&gt;Instruments&lt;/a&gt;. I didn’t find a built-in instrument that showed me exactly what I needed, so I configured a custom instrument.&lt;/p&gt;

&lt;p&gt;Custom instruments are based on &lt;a href=&quot;http://en.wikipedia.org/wiki/DTrace&quot;&gt;dtrace&lt;/a&gt; probes. When I set up a custom instrument, I usually write a pure dtrace script first, independent of Instruments. It’s easier to tweak it until I get it exactly right, and it’s useful to have a command line variant anyway. When that works, I copy/paste the relevant parts into the instrument configuration sheet.&lt;/p&gt;

&lt;p&gt;The main task was figuring out which providers and probes to use. A DTrace documentation search for various combinations containing “thread” didn’t turn up anything useful. I later realized and remembered that the Solaris/DTrace terminology for thread is light weight process, and indeed there are &lt;code&gt;lwp-create&lt;/code&gt; and &lt;code&gt;lwp-exit&lt;/code&gt; probes in the &lt;code&gt;&lt;a href=&quot;http://wikis.sun.com/display/DTrace/proc+Provider&quot;&gt;proc&lt;/a&gt;&lt;/code&gt; provider that fire at the appropriate times. What helped me find these probe names were the Darwin &lt;a href=&quot;http://www.opensource.apple.com/source/xnu/xnu-1456.1.26/osfmk/kern/thread.c&quot;&gt;kernel sources&lt;/a&gt;. The locations that set up threads are instrumented accordingly (look for &lt;code&gt;lwp__create&lt;/code&gt; and &lt;code&gt;lwp__exit&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;curpsinfo-&gt;pr_nlwp&lt;/code&gt; value provides the number of threads. Putting everything together results in this script (which is on &lt;a href=&quot;http://github.com/liyanage/dtrace-scripts/blob/master/thread-count.d&quot;&gt;github&lt;/a&gt;):&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;BEGIN
{
    globalIndex = 0;
}

proc:::lwp-start
/pid == $target/
{
    this-&gt;mIndex = ++globalIndex;
    printf(&quot;[%d] thread start, count = %d&quot;, this-&gt;mIndex, curpsinfo-&gt;pr_nlwp);
}

proc:::lwp-exit
/pid == $target/
{
    this-&gt;mIndex = ++globalIndex;
    printf(&quot;[%d] thread exit, count = %d&quot;, this-&gt;mIndex, curpsinfo-&gt;pr_nlwp);
}&lt;/pre&gt;

&lt;p&gt;Run it like this, replacing 1234 with your target process id:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;sudo dtrace -s thread-count.d -p 1234&lt;/pre&gt;

&lt;p&gt;The output looks like this:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;thread_info_internal:lwp-create 1287183987 [710] thread create, count = 34
thread_info_internal:lwp-create 1287183987 [713] thread create, count = 35
thread_terminate_self:lwp-exit 1287183987 [715] thread exit, count = 34
thread_info_internal:lwp-create 1287183989 [716] thread create, count = 34
thread_info_internal:lwp-create 1287183989 [717] thread create, count = 35
...
&lt;/pre&gt;

&lt;p&gt;The configuration in Instruments:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://www.entropy.ch/blojsom/resources/marc/custom-instrument-config.png&quot; alt=&quot;custom-instrument-config.png&quot; border=&quot;0&quot; width=&quot;480&quot; height=&quot;469&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The options provided by the instrument inspector define what gets plotted:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://www.entropy.ch/blojsom/resources/marc/custom-instrument-config-1.png&quot; alt=&quot;custom-instrument-config-1.png&quot; border=&quot;0&quot; width=&quot;344&quot; height=&quot;226&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://www.entropy.ch/blojsom/resources/marc/custom-instrument-config-2.png&quot; alt=&quot;custom-instrument-config-2.png&quot; border=&quot;0&quot; width=&quot;344&quot; height=&quot;162&quot; /&gt;&lt;/p&gt;

&lt;p&gt;And finally the result:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://www.entropy.ch/blojsom/resources/marc/custom-instrument-graph.png&quot; alt=&quot;custom-instrument-graph.png&quot; border=&quot;0&quot; width=&quot;480&quot; height=&quot;166&quot; /&gt;&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Developer/?permalink=Graphing-Thread-Counts-in-Instruments-with-DTrace.html</guid>
			<pubDate>Mon, 18 Oct 2010 08:10:18 +0200</pubDate>
                    </item>
        	             <item>
            <title>Say Hi to Flipboard</title>
            <!--<link>http://www.entropy.ch/blog/?permalink=Say-Hi-to-Flipboard.html</link>-->
            <link>http://www.entropy.ch/blog/2010/07/21/Say-Hi-to-Flipboard.html</link>
            <description>&lt;p&gt;I’ve been beta-testing a great new iPad application called &lt;a href=&quot;http://www.flipboard.com/&quot;&gt;Flipboard&lt;/a&gt; for a while, and yesterday it was released to the public as a free app.&lt;/p&gt;

&lt;p&gt;Flipboard creates a magazine that is customized just for you, based on content from your Twitter and Facebook accounts and from predefined news feeds. It presents it all in a unified and very nice visual design, with a user interface that is a perfect fit for the iPad—easy and a lot of fun to use. Flipboard also lets you comment, like and share items.&lt;/p&gt;

&lt;p&gt;The application goes beyond just pasting these snippets of information together. It creates a more interesting magazine by including linked content and images that you would normally only see after following those links. I’ve discovered lots of new things from my Twitter and Facebook friends because they were presented to me upfront.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://www.entropy.ch/blojsom/resources/marc/mzl.yhhuwyxz.480x480-75.jpg&quot; alt=&quot;mzl.yhhuwyxz.480x480-75.jpg&quot; border=&quot;0&quot; width=&quot;360&quot; height=&quot;480&quot; style=&quot;;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Images alone don’t do it justice, you really have to see the way Flipboard makes use of animations and the iPad’s touch interface for yourself. This introduction video comes close, however:&lt;/p&gt;

&lt;p&gt;&lt;object width=&quot;480&quot; height=&quot;295&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/v2vpvEDS00o&amp;amp;hl=en_US&amp;amp;fs=1?rel=0&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowscriptaccess&quot; value=&quot;always&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/v2vpvEDS00o&amp;amp;hl=en_US&amp;amp;fs=1?rel=0&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;480&quot; height=&quot;295&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;

&lt;p&gt;If you want to know more, see the Flipboard website, read its &lt;a href=&quot;http://solution.allthingsd.com/20100720/flipboard-your-own-digital-magazine/&quot;&gt; review at the Mossberg Solution&lt;/a&gt; or if you have an iPad just go &lt;a href=&quot;http://itunes.apple.com/us/app/flipboard/id358801284?mt=8&quot;&gt;download it from the app store&lt;/a&gt; right now.&lt;/p&gt;

&lt;p&gt;Congratulations to the Flipboard team on a great release!&lt;/a&gt;&lt;/p&gt;

</description>
            <guid>http://www.entropy.ch/blog/?permalink=Say-Hi-to-Flipboard.html</guid>
			<pubDate>Wed, 21 Jul 2010 18:30:25 +0200</pubDate>
                    </item>
        	             <item>
            <title>Personalized Shopping</title>
            <!--<link>http://www.entropy.ch/blog/?permalink=Personalized-Shopping.html</link>-->
            <link>http://www.entropy.ch/blog/2010/05/07/Personalized-Shopping.html</link>
            <description>&lt;p&gt;I bought a pair of &lt;a href=&quot;http://www.s-double.com/shop/stadium-shoe&quot;&gt;shoes&lt;/a&gt; online, and they came with this personal, handwritten tag attached. What a nice touch...&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://www.entropy.ch/blojsom/resources/marc/s-double-thank-you-tag.png&quot; alt=&quot;s-double-thank-you-tag.png&quot; border=&quot;0&quot; width=&quot;480&quot; height=&quot;296&quot; /&gt;&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/?permalink=Personalized-Shopping.html</guid>
			<pubDate>Fri, 7 May 2010 08:45:32 +0200</pubDate>
                    </item>
        	            <item>
            <title>Git diff for Localizable.strings Files</title>
            <!--<link>http://www.entropy.ch/blog/Developer/?permalink=Git-diff-for-Localizable-strings-Files.html</link>-->
            <link>http://www.entropy.ch/blog/Developer/2010/04/15/Git-diff-for-Localizable-strings-Files.html</link>
            <description>&lt;p&gt;Out of the box &lt;code&gt;git diff&lt;/code&gt; doesn’t display a readable diff for Cocoa &lt;code&gt;.strings&lt;/code&gt; files because it sees the UTF-16 encoded text files as binary files:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;Binary files a/Localizable.strings and b/Localizable.strings differ&lt;/pre&gt;

&lt;p&gt;Not very useful. With two small configuration changes you can get a readable diff:&lt;/p&gt;

&lt;p&gt;First, add this to the project’s &lt;code&gt;.git/info/attributes&lt;/code&gt; file:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;*.strings diff=localizablestrings&lt;/pre&gt;

&lt;p&gt;(Unfortunately you do have to add it to every project, there doesn’t seem to be a global attributes configuration file)&lt;/p&gt;

&lt;p&gt;Second, add this to your &lt;code&gt;~/.gitconfig&lt;/code&gt; file:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;[diff &quot;localizablestrings&quot;]
	textconv = &quot;iconv -f utf-16 -t utf-8&quot;&lt;/pre&gt;

&lt;p&gt;Now &lt;code&gt;git diff&lt;/code&gt; shows nice readable diffs:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://www.entropy.ch/blojsom/resources/marc/git-diff-stringsfiles.png&quot; alt=&quot;git-diff-stringsfiles.png&quot; border=&quot;0&quot; width=&quot;480&quot; height=&quot;246&quot; /&gt;&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Developer/?permalink=Git-diff-for-Localizable-strings-Files.html</guid>
			<pubDate>Thu, 15 Apr 2010 03:41:32 +0200</pubDate>
                    </item>
        	            <item>
            <title>San Francisco from Bernal Heights</title>
            <!--<link>http://www.entropy.ch/blog/Pictures/?permalink=San-Francisco-from-Bernal-Heights.html</link>-->
            <link>http://www.entropy.ch/blog/Pictures/2010/03/28/San-Francisco-from-Bernal-Heights.html</link>
            <description>&lt;div style=&quot;float: right; margin-left: 10px; margin-bottom: 10px;&quot;&gt;
&lt;a class=&#39;img&#39; href=&quot;http://www.flickr.com/photos/liyanage/4469523880/&quot; title=&quot;San Francisco from Bernal Heights&quot;&gt;&lt;img src=&quot;http://farm3.static.flickr.com/2619/4469523880_80a85b2c17_m.jpg&quot; alt=&quot;San Francisco from Bernal Heights&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;

&lt;br style=&#39;clear: both&#39;/&gt;
&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Pictures/?permalink=San-Francisco-from-Bernal-Heights.html</guid>
			<pubDate>Sun, 28 Mar 2010 11:07:26 +0200</pubDate>
                    </item>
        	            <item>
            <title>XML View Plugin gets JSON Support</title>
            <!--<link>http://www.entropy.ch/blog/Software/?permalink=XML-View-Plugin-gets-JSON-Support.html</link>-->
            <link>http://www.entropy.ch/blog/Software/2010/03/28/XML-View-Plugin-gets-JSON-Support.html</link>
            <description>&lt;p&gt;Ever since I released my &lt;a href=&#39;http://www.entropy.ch/software/macosx/xmlviewplugin/&#39;&gt;XML View Plugin&lt;/a&gt; for improved XML display in Safari/WebKit, people have asked for JSON support in addition to XML. I’m happy to announce that version 1.9, released today, adds this feature.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://github.com/juanger&quot;&gt;Juan Germán Castañeda Echevarría&lt;/a&gt; did all the work, all I had to do was to take it and integrate it into my master version, which was easy thanks to Git and &lt;a href=&quot;http://github.com/liyanage&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you already have an older version installed, the update check should pick it up. If you don’t have the plugin installed, you can get it &lt;a href=&quot;http://www.entropy.ch/software/macosx/xmlviewplugin/#download&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Let me know how JSON support works for you. Here’s a &lt;a href=&quot;http://feeds.delicious.com/v2/json&quot;&gt;test link&lt;/a&gt;.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Software/?permalink=XML-View-Plugin-gets-JSON-Support.html</guid>
			<pubDate>Sun, 28 Mar 2010 03:23:43 +0200</pubDate>
                    </item>
        	            <item>
            <title>Xcode Objective-C Text Macro Collection</title>
            <!--<link>http://www.entropy.ch/blog/Developer/?permalink=Xcode-Objective-C-Text-Macro-Collection.html</link>-->
            <link>http://www.entropy.ch/blog/Developer/2010/01/30/Xcode-Objective-C-Text-Macro-Collection.html</link>
            <description>&lt;p&gt;I put a bunch of Xcode text macros I use for writing Objective-C on GitHub, together with a &lt;a href=&quot;http://www.entropy.ch/software/macosx/xcode-macro-cheat-sheet.html&quot;&gt;cheat sheet&lt;/a&gt; generator:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://github.com/liyanage/xcode-text-macros&quot;&gt;http://github.com/liyanage/xcode-text-macros&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You’re welcome to contribute additional macros to the collection.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Developer/?permalink=Xcode-Objective-C-Text-Macro-Collection.html</guid>
			<pubDate>Sat, 30 Jan 2010 10:43:27 +0100</pubDate>
                    </item>
        	            <item>
            <title>Apple Generic Versioning Setup</title>
            <!--<link>http://www.entropy.ch/blog/Developer/?permalink=Apple-Generic-Versioning-Setup.html</link>-->
            <link>http://www.entropy.ch/blog/Developer/2009/12/11/Apple-Generic-Versioning-Setup.html</link>
            <description>&lt;p&gt;Apple Generic Versioning (AGV) is a system that helps with software project version number management in Xcode projects. Adopting it has some benefits such as stamping the version information into the binaries in a way compatible with the &lt;code&gt;&lt;a href=&quot;http://developer.apple.com/mac/library/documentation/Darwin/Reference/ManPages/man1/what.1.html&quot;&gt;what&lt;/a&gt;&lt;/code&gt; tool.&lt;/p&gt;

&lt;p&gt;I thought about using it for my personal projects in the past, but was never comfortable with the &lt;code&gt;&lt;a href=&quot;http://developer.apple.com/mac/library/documentation/Darwin/Reference/ManPages/man8/agvtool.8.html&quot;&gt;agvtool&lt;/a&gt;&lt;/code&gt; utility manipulating files such as the Xcode project file directly. I thought that I would corrupt these files when I forgot to close the project in Xcode before bumping a version.&lt;/p&gt;

&lt;p&gt;I’m now much more comfortable with that thought because I realized how well Xcode handles external changes to its open files. I realized that when I moved my projects to &lt;a href=&quot;http://git-scm.com/about&quot;&gt;Git&lt;/a&gt; and started using local branches. At first I avoided switching between those branches while the project was open in Xcode for the same reason, but when I actually tested what happens when I switch back and forth I saw that Xcode handles it well:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://www.entropy.ch/blojsom/resources/marc/xcode-project-changed-externall-warning.png&quot; alt=&quot;Xcode project file changed externally warning&quot; width=&quot;468&quot; height=&quot;148&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Obviously you shouldn’t do this with files that have unsaved changes. Xcode seems to store all changes to the project settings to its project file right away, so you usually only have to check for unsaved source code files.&lt;/p&gt;

&lt;p&gt;Now that I’m confident that I can’t get myself into trouble with &lt;code&gt;agvtool&lt;/code&gt; (at least not this particular kind of trouble) here’s how I set it up:&lt;/p&gt;

&lt;p&gt;First I enable AGV on the project level. There are two settings, setting the versioning system to AGV and setting the initial version number:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://www.entropy.ch/blojsom/resources/marc/apple-generic-versioning-project-settings.png&quot; alt=&quot;apple generic versioning project settings&quot; width=&quot;466&quot; height=&quot;274&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Make sure you set this on the project level and in “All Configurations.” There are some other settings on the target level, but Xcode should set those to sensible default values when you flip the switch to enable AGV.&lt;/p&gt;

&lt;p&gt;Next I replace all occurrences of the project version number in the &lt;code&gt;&lt;a href=&quot;http://developer.apple.com/mac/library/DOCUMENTATION/MacOSX/Conceptual/BPRuntimeConfig/Articles/ConfigFiles.html&quot;&gt;Info.plist&lt;/a&gt;&lt;/code&gt; file with a placeholder:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;&amp;lt;key&gt;CFBundleGetInfoString&amp;lt;/key&gt;
&amp;lt;string&gt;Checksum version ${CURRENT_PROJECT_VERSION}, Copyright ...&amp;lt;/string&gt;
&amp;lt;key&gt;CFBundleShortVersionString&amp;lt;/key&gt;
&amp;lt;string&gt;Checksum version ${CURRENT_PROJECT_VERSION}&amp;lt;/string&gt;
&amp;lt;key&gt;CFBundleVersion&amp;lt;/key&gt;
&amp;lt;string&gt;${CURRENT_PROJECT_VERSION}&amp;lt;/string&gt;&lt;/pre&gt;

&lt;p&gt;From now on I can bump versions on the command line like this:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;agvtool new-version 2.9&lt;/pre&gt;

&lt;p&gt;Xcode will display its “changed externally” message when it’s coming to the front again and after it reloads the project you can build with the new version number.&lt;/p&gt;

&lt;p&gt;These two articles cover Xcode project versioning in much more detail, including alternatives to AGV:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.dribin.org/dave/blog/archives/2006/08/02/versioning_os_x_apps/&quot;&gt;http://www.dribin.org/dave/blog/archives/2006/08/02/versioning_os_x_apps/&lt;/a&gt;&lt;br/&gt;
&lt;a href=&quot;http://chanson.livejournal.com/125568.html&quot;&gt;http://chanson.livejournal.com/125568.html&lt;/a&gt;&lt;/p&gt;

</description>
            <guid>http://www.entropy.ch/blog/Developer/?permalink=Apple-Generic-Versioning-Setup.html</guid>
			<pubDate>Fri, 11 Dec 2009 19:45:49 +0100</pubDate>
                    </item>
        	            <item>
            <title>Dropping support for Leopard in Album Artwork Assistant</title>
            <!--<link>http://www.entropy.ch/blog/Software/?permalink=Dropping-support-for-Leopard-in-Album-Artwork-Assistant.html</link>-->
            <link>http://www.entropy.ch/blog/Software/2009/12/06/Dropping-support-for-Leopard-in-Album-Artwork-Assistant.html</link>
            <description>&lt;p&gt;&lt;img style=&quot;float: right&quot; src=&quot;/software/macosx/album-artwork-assistant/album-artwork-assistant-icon.png&quot; alt=&quot;Application Icon&quot;&gt;&lt;/p&gt;

&lt;p&gt;I’m assessing the impact of dropping 10.5 support in one of the next versions of &lt;a href=&quot;http://www.entropy.ch/software/macosx/album-artwork-assistant/&quot;&gt;Album Artwork Assistant&lt;/a&gt;. I’m basing this decision on system profile data included in the application’s software update check requests (courtesy of the awesome &lt;a href=&quot;http://sparkle.andymatuschak.org/&quot;&gt;Sparkle&lt;/a&gt; framework).&lt;/p&gt;

&lt;p&gt;About 50% of the users who enabled automatic software update checks also allowed the application to send along this anonymous system profile data. If you’re curious, it looks like this:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;osVersion=10.5.8
cputype=7
cpu64bit=1
cpusubtype=4
model=iMac7,1
ncpu=2
lang=en
appName=Album Artwork Assistant
appVersion=2.7
cpuFreqMHz=2800
ramMB=2048&lt;/pre&gt;

&lt;p&gt;The data I analyzed indicates a 50/50 split between 10.5 and 10.6 systems, so dropping 10.5 support affects a fair number of people. However, the data also indicates that the split between Intel and PPC systems is 93/7, which means that the vast majority of people who still run 10.5 have computers that &lt;em&gt;could&lt;/em&gt; run 10.6, and in my opinion they really should to get the most out of their Macs.&lt;/p&gt;

&lt;p&gt;So I’ll make Album Artwork Assistant 10.6-only in one of the next versions, because I want to take advantage of &lt;a href=&quot;http://arstechnica.com/apple/reviews/2009/08/mac-os-x-10-6.ars/13&quot;&gt;new development technologies&lt;/a&gt; in Mac OS X 10.6 that make my life easier and the application better. Without support for 10.5, 7% of the users won’t be able to upgrade to future versions, but for them the current version will continue to work just fine, and the program pretty much does what it needs to do in its current form. Plus, Album Artwork Assistant is free, so nobody gets to complain anyway :-)&lt;/p&gt;

&lt;p&gt;By the way, looking at the update request data I was surprised to see how many requests were from the &lt;a href=&quot;http://metaquark.de/appfresh/&quot;&gt;AppFresh&lt;/a&gt; update tracking application, it seems to be very popular. I tried it too a while a go and liked it. Give it a try...&lt;/p&gt;

</description>
            <guid>http://www.entropy.ch/blog/Software/?permalink=Dropping-support-for-Leopard-in-Album-Artwork-Assistant.html</guid>
			<pubDate>Sun, 6 Dec 2009 04:39:58 +0100</pubDate>
                    </item>
        	            <item>
            <title>Big Sur and Santa Cruz November 2009</title>
            <!--<link>http://www.entropy.ch/blog/Pictures/?permalink=Big-Sur-and-Santa-Cruz-November-2009.html</link>-->
            <link>http://www.entropy.ch/blog/Pictures/2009/12/01/Big-Sur-and-Santa-Cruz-November-2009.html</link>
            <description>&lt;div style=&quot;float: right; margin-left: 10px; margin-bottom: 10px;&quot;&gt;
&lt;a class=&#39;img&#39; href=&quot;http://www.flickr.com/photos/liyanage/4150047009/&quot; title=&quot;Big Sur and Santa Cruz November 2009&quot;&gt;&lt;img src=&quot;http://farm3.static.flickr.com/2651/4150047009_b8f928211f_m.jpg&quot; alt=&quot;Big Sur and Santa Cruz November 2009&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Big Sur coastline and Santa Cruz beach sunset on the Thanksgiving weekend.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/liyanage/sets/72157622789577765/&quot;&gt;View the full set&lt;/a&gt;&lt;/p&gt;
&lt;br style=&#39;clear: both&#39;/&gt;
&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Pictures/?permalink=Big-Sur-and-Santa-Cruz-November-2009.html</guid>
			<pubDate>Tue, 1 Dec 2009 18:38:30 +0100</pubDate>
                    </item>
        	             <item>
            <title>Best. Hardware. Upgrade. Ever.</title>
            <!--<link>http://www.entropy.ch/blog/?permalink=Best-Hardware-Upgrade-Ever.html</link>-->
            <link>http://www.entropy.ch/blog/2009/11/09/Best-Hardware-Upgrade-Ever.html</link>
            <description>&lt;p&gt;&lt;a class=&#39;img&#39; href=&quot;http://www.flickr.com/photos/43671129123@N01/4088680174&quot; title=&quot;View &#39;Samsung P256 SSD Drive.jpg&#39; on Flickr.com&quot;&gt;&lt;img src=&quot;http://farm3.static.flickr.com/2800/4088680174_c95bd8ba61_m.jpg&quot; alt=&quot;Samsung P256 SSD Drive.jpg&quot; border=&quot;0&quot; width=&quot;194&quot; style=&#39;margin: 5px 0 20px 20px;&#39; height=&quot;240&quot; align=&quot;right&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I always thought that the overall system performance and responsiveness of powerful modern laptops like the MacBook Pro suffers from the performance characteristics of their 2.5&quot; laptop hard disks. I know that in the past few years, my laptops got more and faster CPUs, faster memory buses, and more memory, but subjectively I still found them sluggish in many situations.&lt;/p&gt;

&lt;p&gt;Now I replaced the 5400 RPM 320GB disk drive in my 2009 15&quot; MacBook Pro with the Corsair P256, a 256GB &lt;a href=&quot;http://en.wikipedia.org/wiki/Solid-state_drive&quot;&gt;solid-state drive&lt;/a&gt; (SSD). SSDs like this one &lt;a href=&quot;http://www.google.com/products/catalog?q=p256&amp;cid=18421243760608441626&amp;sa=title&amp;os=reviews#&quot;&gt;got rave reviews&lt;/a&gt;, which nudged me towards buying one (they are not cheap, unfortunately).&lt;/p&gt;

&lt;p&gt;The difference is like night and day - this thing is ridiculously fast. Booting and logging in are much faster (I start a few small utilities on login, and the system starts its own background processes). Application launch time is much improved. Even heavyweight applications such as Photoshop or Illustrator CS4 start up within seconds. I can realistically set Photoshop as external editor for iPhoto. Smaller applications such as Preview or iCal open instantly. Switching between applications doesn&#39;t lag, even when parts need to be swapped in. Because applications open so quickly, I find myself closing them more often when I don&#39;t need them again right away, which helps battery life in some cases.&lt;/p&gt;

&lt;p&gt;Speaking of battery life, that&#39;s also improved. This laptop with the bigger, non-replaceable battery already had the longest run time I&#39;ve ever had in a laptop, but with this SSD it&#39;s even better.&lt;/p&gt;

&lt;p&gt;So the pros are more speed and longer battery run time, the cons are the price and reduced capacity. 256GB seems to be the largest that&#39;s currently available for the 2.5&quot; form factor. If you can live with that and justify spending the money, get yourself one of these. You won&#39;t regret it.&lt;/p&gt;

&lt;p&gt;My friend &lt;a href=&quot;http://www.betabong.com&quot;&gt;Severin&lt;/a&gt; replaced the boot disk of his Mac Pro with an SSD and is very happy with it too, so it&#39;s not just for laptops.&lt;/p&gt;

&lt;p&gt;I&#39;m not done pimping this laptop. These new MacBooks can handle up to 8GB of RAM with new 4GB SO-DIMMs, and I&#39;ll try that next.&lt;/p&gt;

&lt;p&gt;Update: Unfortunately it turns out that the P256 freezes up completely from time to time, taking the OS and every application that touches the disk with it. The only solution is a hard shutdown and reboot. It seems to happen about every other day. Before Corsair (hopefully) issues a firmware update that fixes this, I cannot recommend this particular SSD drive. Tom’s Hardware has a &lt;a href=&quot;http://www.tomshardware.com/reviews/ssd-x25-m-vertex,2399.html&quot;&gt;review&lt;/a&gt; of some other SSDs.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/43671129123@N01/4166676650&quot; title=&quot;View &#39;Crucial CT256M225 SSD&#39; on Flickr.com&quot;&gt;&lt;img style=&#39;margin: 5px 0 20px 20px;&#39; border=&quot;0&quot; width=&quot;218&quot; align=&quot;right&quot; alt=&quot;Crucial CT256M225 SSD&quot; src=&quot;http://farm3.static.flickr.com/2735/4166676650_376c3af5a7_m.jpg&quot; height=&quot;240&quot;/&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Second update: that was a false alarm. I exchanged the P256 with a &lt;a href=&quot;http://www.newegg.com/Product/Product.aspx?Item=N82E16820148320&quot;&gt;Crucial CT256M225&lt;/a&gt;, and I still get the system hangs, so the problem is not caused by the P256. Having used both now I can recommend either one. The Crucial seems to be a bit faster according to &lt;a href=&quot;http://www.xbench.com/&quot;&gt;Xbench&lt;/a&gt;, but the P256 seems to use quite a bit less power and a charge of the MacBook’s battery lasts noticeably longer with it, so you have a nice choice depending on what you value more. That Tom’s Hardware review also mentions the P256’s power efficiency.&lt;/p&gt;
&lt;p&gt;One thing I do like better about Crucial is that they are open about firmware updates and have a &lt;a href=&quot;http://www.crucial.com/support/firmware.aspx&quot;&gt;dedicated page&lt;/a&gt; for them. Corsair doesn’t give out any information about firmware updates, and the moderators in their forums only repeat unsatisfying responses.&lt;br style=&#39;clear: both&#39;&gt;&lt;/br&gt;&lt;/p&gt;



</description>
            <guid>http://www.entropy.ch/blog/?permalink=Best-Hardware-Upgrade-Ever.html</guid>
			<pubDate>Mon, 9 Nov 2009 07:34:24 +0100</pubDate>
                    </item>
        	            <item>
            <title>Golden Gate Bridge from Crissy Field</title>
            <!--<link>http://www.entropy.ch/blog/Pictures/?permalink=Golden-Gate-Bridge-from-Crissy-Field.html</link>-->
            <link>http://www.entropy.ch/blog/Pictures/2009/10/25/Golden-Gate-Bridge-from-Crissy-Field.html</link>
            <description>&lt;div style=&quot;float: right; margin-left: 10px; margin-bottom: 10px;&quot;&gt;
&lt;a class=&#39;img&#39; href=&quot;http://www.flickr.com/photos/liyanage/4041285855/&quot; title=&quot;Golden Gate Bridge from Crissy Field&quot;&gt;&lt;img src=&quot;http://farm3.static.flickr.com/2783/4041285855_0198ace54e_m.jpg&quot; alt=&quot;Golden Gate Bridge from Crissy Field&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;

&lt;br style=&#39;clear: both&#39;/&gt;
&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Pictures/?permalink=Golden-Gate-Bridge-from-Crissy-Field.html</guid>
			<pubDate>Sun, 25 Oct 2009 07:23:21 +0100</pubDate>
                    </item>
        	            <item>
            <title>Fleet Week Air Show</title>
            <!--<link>http://www.entropy.ch/blog/Pictures/?permalink=Fleet-Week-Air-Show.html</link>-->
            <link>http://www.entropy.ch/blog/Pictures/2009/10/25/Fleet-Week-Air-Show.html</link>
            <description>&lt;div style=&quot;float: right; margin-left: 10px; margin-bottom: 10px;&quot;&gt;
&lt;a class=&#39;img&#39; href=&quot;http://www.flickr.com/photos/liyanage/4040884818/&quot; title=&quot;Fleet Week Air Show&quot;&gt;&lt;img src=&quot;http://farm3.static.flickr.com/2568/4040884818_3c2003dc01_m.jpg&quot; alt=&quot;Fleet Week Air Show&quot;/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Some pictures from earlier this month, from the San Francisco Fleet Week air show.&lt;br /&gt;
Flickr -&gt; blog integration test...
&lt;br style=&#39;clear: both&#39;/&gt;
&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Pictures/?permalink=Fleet-Week-Air-Show.html</guid>
			<pubDate>Sun, 25 Oct 2009 06:04:23 +0100</pubDate>
                    </item>
        	            <item>
            <title>Photo Caption Contest</title>
            <!--<link>http://www.entropy.ch/blog/Travel/?permalink=Photo-Caption-Contest.html</link>-->
            <link>http://www.entropy.ch/blog/Travel/2009/08/16/Photo-Caption-Contest.html</link>
            <description>&lt;p&gt;Here’s one of the &lt;a href=&quot;http://www.facebook.com/album.php?aid=138708&amp;amp;id=797509007&amp;amp;l=f1c8ded10e&quot;&gt;photos from my San Francisco trip&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://www.entropy.ch/blojsom/resources/marc/two turtles one duck.png&quot; width=&quot;480&quot; height=&quot;321&quot; alt=&quot;two turtles one duck.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I’m doing a contest, whoever comes up with the funniest text for the bubble wins a drink (or &lt;a href=&quot;http://www.urbandictionary.com/define.php?term=You%20Win%20the%20Internet&quot;&gt;the Internet&lt;/a&gt; if you live too far away).&lt;/p&gt;

&lt;p&gt;Submit your entry here in the comments or via e-mail&lt;/p&gt;

&lt;p&gt;Update: Schwab’s entry was clearly my favorite so I updated the picture... Comments are closed but you can still see the other submission comments by clicking on the permalink.&lt;/p&gt;

</description>
            <guid>http://www.entropy.ch/blog/Travel/?permalink=Photo-Caption-Contest.html</guid>
			<pubDate>Sun, 16 Aug 2009 10:22:32 +0200</pubDate>
                    </item>
        	            <item>
            <title>Checksum GUI Tool</title>
            <!--<link>http://www.entropy.ch/blog/Software/?permalink=Checksum-GUI-Tool.html</link>-->
            <link>http://www.entropy.ch/blog/Software/2009/07/06/Checksum-GUI-Tool.html</link>
            <description>&lt;p&gt;I updated my small Mac OS X application for calculating file checksums (SHA-1, MD5):&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.entropy.ch/software/macosx/#checksum&quot;&gt;http://www.entropy.ch/software/macosx/#checksum&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The new version contains a few bug fixes as well as user interface improvements, specifically new user interface elements added in Leopard.&lt;/p&gt;

</description>
            <guid>http://www.entropy.ch/blog/Software/?permalink=Checksum-GUI-Tool.html</guid>
			<pubDate>Mon, 6 Jul 2009 14:53:10 +0200</pubDate>
                    </item>
        	            <item>
            <title>Entropy PHP 5.3.0 Release 1</title>
            <!--<link>http://www.entropy.ch/blog/Software/?permalink=Entropy-PHP-5-3-0-Release-1.html</link>-->
            <link>http://www.entropy.ch/blog/Software/2009/07/06/Entropy-PHP-5-3-0-Release-1.html</link>
            <description>&lt;p&gt;The PHP group &lt;a href=&quot;http://www.php.net/archive/2009.php#id2009-06-30-1&quot;&gt;recently released&lt;/a&gt; the final version of PHP 5.3.0 and I just finished a first release of my PHP module package for Apache 2 in Mac OS X 10.5. The download link is in this forum post:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.entropy.ch/phpbb2/viewtopic.php?t=4000&quot;&gt;http://www.entropy.ch/phpbb2/viewtopic.php?t=4000&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Try it out and let me know if there are problems.&lt;/p&gt;

&lt;p&gt;For me, PHP 5.3 finally brings the language closer to the level of others such as Perl, Python or Ruby, where these features have been available for a long time. I really missed them in PHP, and the language sucks less now that it has them :-)&lt;/p&gt;


</description>
            <guid>http://www.entropy.ch/blog/Software/?permalink=Entropy-PHP-5-3-0-Release-1.html</guid>
			<pubDate>Mon, 6 Jul 2009 08:42:05 +0200</pubDate>
                    </item>
        	            <item>
            <title>BBEdit Clipping Sets</title>
            <!--<link>http://www.entropy.ch/blog/Developer/?permalink=BBEdit-Clipping-Sets.html</link>-->
            <link>http://www.entropy.ch/blog/Developer/2009/07/06/BBEdit-Clipping-Sets.html</link>
            <description>&lt;p&gt;&lt;a href=&quot;http://tedmasterweb.com/&quot;&gt;Ted Stresen-Reuter&lt;/a&gt;, author of a big, popular &lt;a href=&quot;http://tedmasterweb.com/php-bbedit-clipping-set/&quot;&gt;BBEdit clipping set for PHP&lt;/a&gt;, Carlton Gibson, and I recently combined all our BBEdit clipping sets into one big collection, and the result is now on GitHub:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://github.com/tedmasterweb/bbeditclippings/&quot;&gt;http://github.com/tedmasterweb/bbeditclippings/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This was a good opportunity to clean up the sets, especially the one for Perl. It got lots of new clippings and a more modern coding style in existing clippings.&lt;/p&gt;

&lt;p&gt;I also realized that the sets on my site were always hopelessly out of date because I never published new versions when I improved and added clippings. With the code now available on GitHub, publishing is much easier for me and users of the sets can always update to the most recent version with a quick &lt;code&gt;git pull&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You’re welcome to contribute additional clipping sets for other programming languages to this collection. If want to add your set, use GitHub’s fork feature to clone our project, then add your stuff and let us know about it.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Developer/?permalink=BBEdit-Clipping-Sets.html</guid>
			<pubDate>Mon, 6 Jul 2009 04:40:30 +0200</pubDate>
                    </item>
        	            <item>
            <title>Updated checklibs.pl script to list dynamic library dependencies</title>
            <!--<link>http://www.entropy.ch/blog/Developer/?permalink=Updated-checklibs-pl-script-to-list-dynamic-library-dependencies.html</link>-->
            <link>http://www.entropy.ch/blog/Developer/2009/07/05/Updated-checklibs-pl-script-to-list-dynamic-library-dependencies.html</link>
            <description>&lt;p&gt;Here’s an updated version of &lt;code&gt;checklibs.pl&lt;/code&gt;, a developer tool that lists dynamic library dependencies of Mac OS X binaries. I introduced it in an &lt;a href=&quot;http://www.entropy.ch/blog/Developer/2007/11/06/checklibs-pl-script-to-list-dynamic-library-dependencies.html&quot;&gt;earlier article&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The new version colorizes all libraries that are outside of the &lt;code&gt;/System&lt;/code&gt; and &lt;code&gt;/usr/lib&lt;/code&gt; directories and therefore not part of a standard Mac OS X installation.&lt;/p&gt;

&lt;p&gt;The color helps spotting non-standard libraries. For each one, you have to determine if the dependency is a build mistake (hello &lt;a href=&quot;http://www.macports.org/&quot;&gt;MacPorts&lt;/a&gt; or &lt;a href=&quot;http://www.finkproject.org/&quot;&gt;Fink&lt;/a&gt; in &lt;code&gt;$PATH&lt;/code&gt;) or if it’s OK because the library will be shipped and installed along with the binary.&lt;/p&gt;

&lt;p&gt;The script is now under revision control as part of my Mac OS X shell script collection on GitHub:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://github.com/liyanage/macosx-shell-scripts&quot;&gt;http://github.com/liyanage/macosx-shell-scripts&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://www.entropy.ch/blojsom/resources/marc/2009-07-05-checklibs-screenshot.png&quot; width=&quot;480&quot; height=&quot;459&quot; alt=&quot;Screenshot of checklibs.pl output&quot; class=&quot;screenshot&quot; /&gt;
&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Developer/?permalink=Updated-checklibs-pl-script-to-list-dynamic-library-dependencies.html</guid>
			<pubDate>Sun, 5 Jul 2009 13:54:31 +0200</pubDate>
                    </item>
        	             <item>
            <title>Moving to the US, Looking for a Software Engineering Job</title>
            <!--<link>http://www.entropy.ch/blog/?permalink=Moving-to-the-US-Looking-for-a-Software-Engineering-Job.html</link>-->
            <link>http://www.entropy.ch/blog/2009/06/27/Moving-to-the-US-Looking-for-a-Software-Engineering-Job.html</link>
            <description>&lt;p&gt;I will be moving to the US later this year and I’m looking for a software engineering job, specifically Cocoa/Cocoa Touch or web development work.&lt;/p&gt;

&lt;p&gt;Currently I’m a senior software engineer in Switzerland working at &lt;a href=&quot;http://www.futurelab.ch&quot;&gt;futureLAB AG&lt;/a&gt;, where my job includes activities such as software design/architecture, implementation, training of software engineers, technical documentation, user interface work and lots of other things, all of it in a UNIX / Mac OS X / open source environment.&lt;/p&gt;

&lt;p&gt;I already have US &lt;a href=&quot;http://en.wikipedia.org/wiki/United_States_Permanent_Resident_Card&quot;&gt;permanent resident&lt;/a&gt; status including a social security number and everything else that goes with it, so there will be zero immigration/visa paperwork for an employer. You can just hire me, and I can just start working.&lt;/p&gt;

&lt;p&gt;I’m interested in an on-site, full-time position in one of these locations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;San Francisco&lt;/li&gt;
&lt;li&gt;Anywhere else in the SF Bay Area&lt;/li&gt;
&lt;li&gt;New York City&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I also got several recommendations for the Portland, Oregon area.&lt;/p&gt;

&lt;p&gt;If you have an interesting job offer, send me an e-mail so we can exchange more detailed information. My address is on the &lt;a href=&quot;http://www.entropy.ch/about/&quot;&gt;about&lt;/a&gt; page.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/?permalink=Moving-to-the-US-Looking-for-a-Software-Engineering-Job.html</guid>
			<pubDate>Sat, 27 Jun 2009 07:37:05 +0200</pubDate>
                    </item>
        	            <item>
            <title>Cocoa-compatible Text Search Shortcuts in Microsoft Word 2008</title>
            <!--<link>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Cocoa-compatible-Text-Search-Shortcuts-in-Microsoft-Word-2008.html</link>-->
            <link>http://www.entropy.ch/blog/Mac+OS+X/2009/06/25/Cocoa-compatible-Text-Search-Shortcuts-in-Microsoft-Word-2008.html</link>
            <description>&lt;p&gt;For me, the Mac OS X keyboard shortcuts for the text editing commands “Use Selection for Find” and “Find Next” / “Find Previous” are a reflex by now. These shortcuts and the way the commands work are pretty consistent across all Mac OS X apps that allow text editing.&lt;/p&gt;

&lt;p&gt;The exception, of course, is Microsoft Word.&lt;/p&gt;

&lt;p&gt;It drove me nuts that it doesn’t work the same way there, and obviously Word is exactly where I edit a lot of text. To bring it in line with the other applications I created three AppleScripts that implement these commands and bound them to the standard shortcuts ⌘E, ⌘G and ⇧⌘G with &lt;a href=&quot;http://www.red-sweater.com/fastscripts/&quot;&gt;FastScripts&lt;/a&gt; (which is out in a &lt;a href=&quot;http://www.red-sweater.com/blog/823/fastscripts-2-4&quot;&gt;great new version 2.4&lt;/a&gt; with more features available for free).&lt;/p&gt;

&lt;p&gt;Use Selection for Find:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;tell application &quot;Microsoft Word&quot;
    set mySelection to content of selection
    set myFind to find object of selection
    set content of myFind to mySelection
end tell&lt;/pre&gt;

&lt;p&gt;Find Next:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;tell application &quot;Microsoft Word&quot;
    set myFind to find object of selection
    execute find myFind wrap find find continue with match forward
end tell&lt;/pre&gt;

&lt;p&gt;Find Previous:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;tell application &quot;Microsoft Word&quot;
    set myFind to find object of selection
    execute find myFind wrap find find continue without match forward
end tell&lt;/pre&gt;

&lt;img src=&quot;http://www.entropy.ch/blojsom/resources/marc/2009-06-25-fastscripts-msword-find-commands.png&quot; width=&quot;321&quot; height=&quot;183&quot; alt=&quot;Microsoft Word 2008 Text Search FastScript menu commands&quot; class=&quot;screenshot&quot; /&gt;
</description>
            <guid>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Cocoa-compatible-Text-Search-Shortcuts-in-Microsoft-Word-2008.html</guid>
			<pubDate>Thu, 25 Jun 2009 14:01:42 +0200</pubDate>
                    </item>
        	            <item>
            <title>Amazon AWS Signed Search Requests in Objective-C</title>
            <!--<link>http://www.entropy.ch/blog/Developer/?permalink=Amazon-AWS-Signed-Search-Requests-in-Objective-C.html</link>-->
            <link>http://www.entropy.ch/blog/Developer/2009/06/18/Amazon-AWS-Signed-Search-Requests-in-Objective-C.html</link>
            <description>&lt;p&gt;I got a notice from Amazon telling me to change my &lt;a href=&quot;http://www.entropy.ch/software/macosx/album-artwork-assistant/&quot;&gt;Album Artwork Assistant&lt;/a&gt; application within 60 days so that it &lt;a href=&quot;http://docs.amazonwebservices.com/AWSECommerceService/latest/DG/index.html?RequestAuthenticationArticle.html&quot;&gt;signs&lt;/a&gt; its search requests to the Amazon AWS product information web service. I use this service to find album artwork images.&lt;/p&gt;

&lt;p&gt;Amazon provides some notes and examples for Java, Perl and C#, but not for Objective-C. I wrapped my signed request URL  generation in a class that other Cocoa developers can reuse. It’s available here:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://github.com/liyanage/album-artwork-assistant/blob/master/src/SignedAwsSearchRequest.h&quot;&gt;SignedAwsSearchRequest.h&lt;/a&gt; and &lt;a href=&quot;http://github.com/liyanage/album-artwork-assistant/blob/master/src/SignedAwsSearchRequest.m&quot;&gt;SignedAwsSearchRequest.m&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Example usage can be seen in the unit test file &lt;a href=&quot;http://github.com/liyanage/album-artwork-assistant/blob/master/src/TestSignedAwsSearchRequest.m&quot;&gt;TestSignedAwsSearchRequest.m&lt;/a&gt;&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Developer/?permalink=Amazon-AWS-Signed-Search-Requests-in-Objective-C.html</guid>
			<pubDate>Thu, 18 Jun 2009 07:27:20 +0200</pubDate>
                    </item>
        	            <item>
            <title>iTunes Playlist Track Export AppleScript</title>
            <!--<link>http://www.entropy.ch/blog/Mac+OS+X/?permalink=iTunes-Playlist-Track-Export-AppleScript.html</link>-->
            <link>http://www.entropy.ch/blog/Mac+OS+X/2009/06/16/iTunes-Playlist-Track-Export-AppleScript.html</link>
            <description>&lt;p&gt;I wanted to export all tracks of an iTunes playlist into a folder, but iTunes’ export feature only exports the track list (as XML or plain text file), not the actual music files.&lt;/p&gt;

&lt;p&gt;Drag-and-drop from the iTunes window to the Finder folder window works but doesn’t preserve the playlist order, and the filenames are messy because of the leading track numbers.&lt;/p&gt;

&lt;p&gt;I wrote this AppleScript that reads the XML export track list file and copies the tracks to a folder on the desktop. It strips leading numbers from the filenames and adds new ones corresponding to the playlist order.&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;
on open (theFiles)
  set theFile to item 1 of theFiles
  set myUrls to {}
  tell application &quot;System Events&quot;
    set myContents to contents of property list file (theFile as string)
    tell myContents
      tell property list item &quot;Playlists&quot;
        tell property list item 1
          tell property list item &quot;Playlist Items&quot;
            repeat with aPlaylistEntry in property list items
              set aTrackId to |Track ID| of (value of aPlaylistEntry as record)
              tell property list item &quot;Tracks&quot; of myContents
                tell property list item (aTrackId as string)
                  set myUrl to |Location| of (value as record)
                  set end of myUrls to myUrl
                end tell
              end tell
            end repeat
          end tell
        end tell
      end tell
    end tell
  end tell
  
  set myIndex to 1
  do shell script &quot;mkdir -p ~/Desktop/itunes-playlist-export&quot;
  repeat with myUrl in myUrls
    if myIndex &amp;lt; 10 then
      set myIndex to &quot;0&quot; &amp;amp; myIndex
    end if
    
    set myUrl to myUrl as URL
    set myPath to POSIX path of POSIX file myUrl
    set myBasename to do shell script &quot;basename &quot; &amp;amp; quoted form of myPath &amp;amp; &quot; | sed -e &#39;s/^[ 0-9-]*//&#39;&quot;
    
    set myDestination to (myIndex as string) &amp;amp; &quot; &quot; &amp;amp; myBasename
    
    set cmd to &quot;cp &quot; &amp;amp; quoted form of myPath &amp;amp; &quot; ~/Desktop/itunes-playlist-export/&quot; &amp;amp; quoted form of myDestination
    do shell script cmd
    
    set myIndex to myIndex + 1
  end repeat
  
end open&lt;/pre&gt;
</description>
            <guid>http://www.entropy.ch/blog/Mac+OS+X/?permalink=iTunes-Playlist-Track-Export-AppleScript.html</guid>
			<pubDate>Tue, 16 Jun 2009 14:39:11 +0200</pubDate>
                    </item>
        	            <item>
            <title>Improved OS X Clear Quarantine Flag Script</title>
            <!--<link>http://www.entropy.ch/blog/Developer/?permalink=Improved-OS-X-Clear-Quarantine-Flag-Script.html</link>-->
            <link>http://www.entropy.ch/blog/Developer/2009/06/12/Improved-OS-X-Clear-Quarantine-Flag-Script.html</link>
            <description>&lt;p&gt;I have written about clearing Apple’s Internet download quarantine flag from files to get rid of the security warning &lt;a href=&quot;http://www.entropy.ch/blog/Developer/2008/08/19/Xcode-Docs-Get-Rid-of-Downloaded-From-Internet-Warnings.html&quot;&gt;before&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Recently Apple pushed Xcode documentation updates frequently, and I somtimes had to clear the flag from other HTML files all over the harddisk, not just in &lt;code&gt;/Developer&lt;/code&gt;. The old way was just too slow for frequently changing and/or big sets of files:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;find /Developer -type f -name &#39;*.html&#39; \
-exec sh -c &#39;xattr &quot;$0&quot; | grep -q quarantine &amp;&amp; xattr -d com.apple.quarantine &quot;$0&quot;&#39; {} \; -print&lt;/pre&gt;

&lt;p&gt;This spawns lots of subprocesses and it turns out that &lt;code&gt;xattr&lt;/code&gt; is not a native binary but a Python script, which means that the Python interpreter is fired up twice for each file.&lt;/p&gt;

&lt;p&gt;It takes ages this way so I rewrote it to loop in Python and use Python’s native &lt;code&gt;xattr&lt;/code&gt; module:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;#!/bin/bash
#
# Remove the quarantine extended attribute from all
# developer documentation HTML files to get rid
# of the &quot;downloaded from the Internet&quot; warning
#
# Marc Liyanage / www.entropy.ch
#

[ $UID -eq 0 ] || { echo $0 must be run as root; exit 1; }

find /Developer -type f -name &#39;*.html&#39; | python &amp;lt;(cat - &amp;lt;&amp;lt;EOF
#!/usr/bin/env python

from xattr import *
import sys
import string

attr = &#39;com.apple.quarantine&#39;

for file in sys.stdin:
	file = string.rstrip(file, &quot;\n&quot;)
	if (attr in listxattr(file)):
		removexattr(file, attr)
EOF
)&lt;/pre&gt;

&lt;p&gt;This is a lot faster.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Developer/?permalink=Improved-OS-X-Clear-Quarantine-Flag-Script.html</guid>
			<pubDate>Fri, 12 Jun 2009 12:52:01 +0200</pubDate>
                    </item>
        	            <item>
            <title>Small LeanCalc Update</title>
            <!--<link>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Small-LeanCalc-Update.html</link>-->
            <link>http://www.entropy.ch/blog/Mac+OS+X/2009/04/05/Small-LeanCalc-Update.html</link>
            <description>&lt;img class=&quot;right&quot; alt=&quot;LeanCalc icon&quot; src=&quot;http://www.entropy.ch/software/macosx/leancalc/LeanCalc.png&quot; /&gt;

&lt;p&gt;I haven’t touched my small calculator application in years because it pretty much does what it needs to do.&lt;/p&gt;

&lt;p&gt;Today I added one feature and bumped the version to 1.3. You can now select one of the results in the history list and use the Copy menu command or its shortcut to copy the result of that history entry to the clipboard.&lt;/p&gt;

&lt;p&gt;Download it on the &lt;a href=&quot;http://www.entropy.ch/software/macosx/#leancalc&quot;&gt;software page&lt;/a&gt; and if you like it feel free to rate it on &lt;a href=&quot;http://www.macupdate.com/info.php/id/30973/leancalc&quot;&gt;MacUpdate&lt;/a&gt; or &lt;a href=&quot;http://osx.iusethis.com/app/leancalc&quot;&gt;iusethis&lt;/a&gt;.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Small-LeanCalc-Update.html</guid>
			<pubDate>Sun, 5 Apr 2009 22:02:54 +0200</pubDate>
                    </item>
        	            <item>
            <title>Better BBEdit Completion With ctags</title>
            <!--<link>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Better-BBEdit-Completion-With-ctags.html</link>-->
            <link>http://www.entropy.ch/blog/Mac+OS+X/2009/04/02/Better-BBEdit-Completion-With-ctags.html</link>
            <description>&lt;p&gt;&lt;a href=&quot;http://ctags.sourceforge.net/&quot;&gt;ctags&lt;/a&gt; is an old-school UNIX program that indexes language objects such as functions, methods, classes etc. in source code files. Text editors read the index (called a “tags” file) to locate these language objects quickly.&lt;/p&gt;

&lt;p&gt;When BBEdit finds a tags file, it enables these features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;opening the contextual menu for a selected language object shows a submenu with all definitions of that object&lt;/li&gt;
&lt;li&gt;the completion list is populated with language objects that match what you typed so far&lt;/li&gt;
&lt;li&gt;your custom language objects are colorized in the source code&lt;/li&gt;
&lt;li&gt;the “Find Definition” menu command jumps directly to the definition of the selected word, if there’s only one match, or shows a list with possible matches if there are several&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let’s look at these four features with and without a tags file.&lt;/p&gt;

&lt;p&gt;First the contextual menu for a selection. Here I selected the &lt;code&gt;rootdir&lt;/code&gt; method call and opened the contextual menu, without a tags file present:&lt;/p&gt;

&lt;img src=&quot;http://www.entropy.ch/blojsom/resources/marc/bbedit-ctags-contextual-no-tags.png&quot; width=&quot;343&quot; height=&quot;219&quot; alt=&quot;BBEdit ctags feature contextual menu without tags file&quot; class=&quot;screenshot&quot; /&gt;

&lt;p&gt;Here’s the same menu with a tags file:&lt;/p&gt;

&lt;img src=&quot;http://www.entropy.ch/blojsom/resources/marc/bbedit-ctags-contextual-with-tags.png&quot; width=&quot;480&quot; height=&quot;193&quot; alt=&quot;bbedit-ctags-contextual-with-tags.png&quot; class=&quot;screenshot&quot; /&gt;

&lt;p&gt;The &lt;code&gt;rootdir&lt;/code&gt; method is defined in four files and selecting an entry from the menu brings you directly to that definition.&lt;/p&gt;

&lt;p&gt;On to the completion list. I type the word “root” and hit the completion shortcut without a tags file present:&lt;/p&gt;

&lt;img src=&quot;http://www.entropy.ch/blojsom/resources/marc/bbedit-ctags-completion-no-tags.png&quot; width=&quot;310&quot; height=&quot;102&quot; alt=&quot;bbedit-ctags-completion-no-tags.png&quot; class=&quot;screenshot&quot; /&gt;

&lt;p&gt;BBEdit offers no completions because what I’m looking for, the &lt;code&gt;rootdir&lt;/code&gt; method, does not occur in the current file.&lt;/p&gt;

&lt;p&gt;With a tags file, it looks like this:&lt;/p&gt;

&lt;img src=&quot;http://www.entropy.ch/blojsom/resources/marc/bbedit-ctags-completion-with-tags.png.png&quot; width=&quot;254&quot; height=&quot;134&quot; alt=&quot;bbedit-ctags-completion-with-tags.png.png&quot; class=&quot;screenshot&quot; /&gt;

&lt;p&gt;Here’s how your own symbols look without a tags file:&lt;/p&gt;

&lt;img src=&quot;http://www.entropy.ch/blojsom/resources/marc/bbedit-ctags-keywords-without-tags.png&quot; width=&quot;320&quot; height=&quot;58&quot; alt=&quot;bbedit-ctags-keywords-without-tags.png&quot; /&gt;

&lt;p&gt;There’s no difference between the language objects and any other text, they’re all black. With a tags file, the language objects are highlighted with a separate color:&lt;/p&gt;

&lt;img src=&quot;http://www.entropy.ch/blojsom/resources/marc/bbedit-ctags-keywords-with-tags.png&quot; width=&quot;357&quot; height=&quot;61&quot; alt=&quot;bbedit-ctags-keywords-with-tags.png&quot; /&gt;

&lt;p&gt;Finally, the “Find Definition” command in the Search menu. You select a word and invoke this command to show the definition of the selected language object. Without a tags file, nothing happens. With a tags file present, BBEdit either opens the definition directly if there’s only one candidate or it presents a list with all matches if there are several:&lt;/p&gt;

&lt;img src=&quot;http://www.entropy.ch/blojsom/resources/marc/bbedit-ctags-find-definition.png&quot; width=&quot;441&quot; height=&quot;323&quot; alt=&quot;bbedit-ctags-find-definition.png&quot; class=&quot;screenshot&quot; /&gt;

&lt;h3&gt;Creating the Tags File&lt;/h3&gt;

To create the tags file, open the Terminal and cd to the toplevel directory of your project, the one that contains all related source code. Issue this command:

&lt;pre class=&quot;code&quot;&gt;/Applications/BBEdit.app/Contents/MacOS/ctags --excmd=number --tag-relative=no --fields=+a+m+n+S -f tags -R &quot;$PWD&quot;&lt;/pre&gt;

&lt;p&gt;I made myself an &lt;a href=&quot;http://en.wikipedia.org/wiki/Alias_(command)&quot;&gt;alias&lt;/a&gt; called “bbtags” with some Perl-specific excludes and added it to my &lt;code&gt;$HOME/.bashrc&lt;/code&gt; file:&lt;/p&gt;

&lt;pre class=&#39;code&#39;&gt;alias bbtags=&#39;/Applications/BBEdit.app/Contents/MacOS/ctags --excmd=number --tag-relative=no --fields=+a+m+n+S -f tags --exclude=blib --exclude=pod -R &quot;$PWD&quot;&lt;/pre&gt;

&lt;p&gt;Now I can just type &lt;code&gt;bbtags&lt;/code&gt; and I’m all set.&lt;/p&gt;

&lt;p&gt;As you edit and save your files, the index gets out of sync. You need to rebuild the tags file from time to time so it matches the changed files. If you work in a programming language that uses a build/compilation phase such as C or Java, you can run the ctags update command during the build process, as Seth notes in the comments below.&lt;/p&gt;

&lt;p&gt;If you work in a dynamic programming language like Perl or PHP, you can try the following BBEdit menu AppleScript:&lt;/p&gt;


&lt;pre class=&quot;code&quot;&gt;on MenuSelect(mycommand, myname)
	return false
end MenuSelect

on PostMenuSelect()
	tell application &quot;BBEdit&quot;
		if not my isKnownLanguage(source language of text document 1) then return
		set docFile to file of text document 1
	end tell
	set docPath to POSIX path of docFile
	repeat while docPath is not equal to &quot;/&quot;
		set docPath to (do shell script &quot;dirname &quot; &amp;amp; (quoted form of docPath))
		if checkAndRebuildTagsFile(docPath) then return
	end repeat
end PostMenuSelect

on isKnownLanguage(sourceLanguage)
	return {&quot;PHP&quot;, &quot;Perl&quot;} contains sourceLanguage
end isKnownLanguage

on checkAndRebuildTagsFile(tagsParentPath)
	set tagsPath to tagsParentPath &amp;amp; &quot;/tags&quot;
	set tagsFile to POSIX file tagsPath
	tell application &quot;Finder&quot;
		if not (exists tagsFile) then return false
	end tell
	if folder of (info for tagsFile) then return false
	set updateCommand to &quot;/Applications/BBEdit.app/Contents/MacOS/ctags 2&gt;&amp;amp;1 --excmd=number --tag-relative=no --fields=+a+m+n+S+l+K+i -f tags --exclude=blib -R &quot; &amp;amp; quoted form of tagsParentPath
	set ctagsResult to do shell script updateCommand
	do shell script &quot;syslog -l notice -s rebuilt tags file with command &quot; &amp;amp; updateCommand &amp;amp; &quot;, result: &quot; &amp;amp; quoted form of ctagsResult
	return true
end checkAndRebuildTagsFile&lt;/pre&gt;

&lt;p&gt;Save it in your &lt;code&gt;$HOME/Library/Application Support/BBEdit/Menu Scripts&lt;/code&gt; folder with the name “File•Save” to run it whenever you save the document. It looks for a tags file in all parent directories of the file you just saved, and if it finds one it runs the ctags update command. It seems to be a bit slow on the big source code trees I work on, but just give it a try, it might work better for you.&lt;/p&gt;

&lt;p&gt;If you want to exclude certain directories permanently in all projects, I suggest you create a &lt;code&gt;$HOME/.ctags&lt;/code&gt; file with exclude lines in it:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;--exclude=blib
--exclude=unittest&lt;/pre&gt;

&lt;p&gt;See the ctags documentation for the details.&lt;/p&gt;

&lt;p&gt;In conclusion, if you use BBEdit in multifile projects, you should try the ctags feature. I suspect that it is seriously under-used and unknown even among experienced BBEdit users.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Better-BBEdit-Completion-With-ctags.html</guid>
			<pubDate>Thu, 2 Apr 2009 12:38:38 +0200</pubDate>
                    </item>
        	             <item>
            <title>Define...</title>
            <!--<link>http://www.entropy.ch/blog/?permalink=Define.html</link>-->
            <link>http://www.entropy.ch/blog/2009/04/01/Define.html</link>
            <description>&lt;img src=&quot;http://www.entropy.ch/blojsom/resources/marc/google-suggest-define.png&quot; width=&quot;436&quot; height=&quot;347&quot; alt=&quot;google-suggest-define.png&quot; /&gt;

</description>
            <guid>http://www.entropy.ch/blog/?permalink=Define.html</guid>
			<pubDate>Wed, 1 Apr 2009 12:18:23 +0200</pubDate>
                    </item>
        	            <item>
            <title>Git and SVN Status in the Bash Prompt</title>
            <!--<link>http://www.entropy.ch/blog/Developer/?permalink=Git-and-SVN-Status-in-the-Bash-Prompt.html</link>-->
            <link>http://www.entropy.ch/blog/Developer/2009/03/30/Git-and-SVN-Status-in-the-Bash-Prompt.html</link>
            <description>&lt;p&gt;Here’s my take on displaying Git and SVN status information in the Bash prompt:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;# Prompt setup, with SCM status
parse_git_branch() {
	local DIRTY STATUS
	STATUS=$(git status 2&gt;/dev/null)
	[ $? -eq 128 -o $? -eq 127 ] &amp;amp;&amp;amp; return
	[[ &quot;$STATUS&quot; == *&#39;working directory clean&#39;* ]] || DIRTY=&#39; *&#39;
	echo &quot;($(git branch 2&gt;/dev/null | sed -e &#39;/^[^*]/d&#39; -e &#39;s/* //&#39;)$DIRTY)&quot;
}

parse_svn_revision() {
	local DIRTY REV=$(svn info 2&gt;/dev/null | grep Revision | sed -e &#39;s/Revision: //&#39;)
	[ &quot;$REV&quot; ] || return
	[ &quot;$(svn st)&quot; ] &amp;amp;&amp;amp; DIRTY=&#39; *&#39;
	echo &quot;(r$REV$DIRTY)&quot;
}

PS1=&#39;\u@\h:\W$(parse_git_branch)$(parse_svn_revision) \$ &#39;&lt;/pre&gt;

&lt;p&gt;Put this into your &lt;code&gt;~/.bashrc&lt;/code&gt; script and you should see the Git/SVN status in your prompt if your working directory is a sandbox.&lt;/p&gt;

&lt;p&gt;For SVN, it displays the current revision:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;liyanage@primavera:foobar(r9851 *) $&lt;/pre&gt;

&lt;p&gt;For Git, it displays the current branch:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;liyanage@primavera:build-entropy-php(php-53 *) $&lt;/pre&gt;

&lt;p&gt;For both, a &lt;code&gt;*&lt;/code&gt; means that there are local changes to the working directory&lt;/p&gt;

&lt;p&gt;An alternative version of &lt;code&gt;parse_svn_revision()&lt;/code&gt;, based on David’s comment below:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;parse_svn_revision() {
	local REV=$(svnversion 2&gt;/dev/null)
	[ $? -eq 0 ] || return
	[ &quot;$REV&quot; == &#39;exported&#39; ] &amp;amp;&amp;amp; return
	echo &quot;($REV)&quot;
}&lt;/pre&gt;

&lt;p&gt;With that, the prompt looks like this:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;liyanage@primavera:foobar(10027:10028M) $&lt;/pre&gt;

&lt;p&gt;This version is faster on large SVN trees. The original one above sometimes introduces a noticeable delay before the prompt appears.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Developer/?permalink=Git-and-SVN-Status-in-the-Bash-Prompt.html</guid>
			<pubDate>Mon, 30 Mar 2009 06:14:20 +0200</pubDate>
                    </item>
        	            <item>
            <title>PHP 5.2.9 and 5.3.0RC1 Packages for Mac OS X 10.5</title>
            <!--<link>http://www.entropy.ch/blog/Software/?permalink=PHP-5-2-9-and-5-3-0RC1-Packages-for-Mac-OS-X-10-5.html</link>-->
            <link>http://www.entropy.ch/blog/Software/2009/03/27/PHP-5-2-9-and-5-3-0RC1-Packages-for-Mac-OS-X-10-5.html</link>
            <description>&lt;p&gt;A long time ago, after Mac OS X 10.5/Leopard came out, I tried to update my PHP distribution for the new OS, but I ran into difficulties building the Apache module as 4-way universal binary, which is required on Leopard. I never found the time to resolve these issues and my PHP package was practically abandoned after some betas.&lt;/p&gt;

&lt;p&gt;Now my friend &lt;a href=&quot;http://jf.omnis.ch/&quot;&gt;Joachim Fornallaz&lt;/a&gt;, sponsored by &lt;a href=&quot;http://straumann.net/&quot;&gt;Straumann AG&lt;/a&gt;, did all the work of updating my build system, many of the libraries needed for the extensions, and the PHP sources. The result is an up to date 5.2.9 package with most, but not all, of the usual extensions present (PDFLib lite is currently missing, for example).&lt;/p&gt;

&lt;p&gt;Read the details in this longer announcement in the user forum:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.entropy.ch/phpbb2/viewtopic.php?t=3937&quot;&gt;http://www.entropy.ch/phpbb2/viewtopic.php?t=3937&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It includes some thoughts on how to prevent the long delays between releases of this distribution in the future.&lt;/p&gt;

&lt;p&gt;The download link to the latest release of the package is in this posting:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.entropy.ch/phpbb2/viewtopic.php?p=12985#12985&quot;&gt;http://www.entropy.ch/phpbb2/viewtopic.php?p=12985#12985&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;The PHP group will soon release the next version of PHP, 5.3, which adds many exciting new features to the PHP language. It’s currently in Release Candidate status and for those of you who would like to experiment with this version on Mac OS X 10.5, I built a different package. The details are here:

&lt;p&gt;&lt;a href=&quot;http://www.entropy.ch/phpbb2/viewtopic.php?t=3949&quot;&gt;http://www.entropy.ch/phpbb2/viewtopic.php?t=3949&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I would appreciate lots of testing (and feedback in the forum), especially of the installer package, because that is all new for Leopard. Please read the forum threads linked above thoroughly and make sure you’re running the latest version of the packages before reporting problems.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Software/?permalink=PHP-5-2-9-and-5-3-0RC1-Packages-for-Mac-OS-X-10-5.html</guid>
			<pubDate>Fri, 27 Mar 2009 14:30:37 +0100</pubDate>
                    </item>
        	            <item>
            <title>Perl Problem After Leopard Security Update</title>
            <!--<link>http://www.entropy.ch/blog/Developer/?permalink=Perl-Problem-After-Leopard-Security-Update.html</link>-->
            <link>http://www.entropy.ch/blog/Developer/2009/03/25/Perl-Problem-After-Leopard-Security-Update.html</link>
            <description>&lt;p&gt;If you’re a Perl developer on Mac OS X Leopard, then you’ve probably heard about &lt;a href=&quot;http://bulknews.typepad.com/blog/2009/02/mac-os-x-security-update-2009001-breaks-perl-cpan.html&quot;&gt;this issue&lt;/a&gt; caused by Security Update 2009-001:&lt;/p&gt;

&lt;blockquote&gt;

&lt;p&gt;...the latest Mac OS X Security Update 2009-001 apparently breaks your Perl, if you&lt;/p&gt;

&lt;ul&gt;

&lt;li&gt;are using Mac OS X 10.5 (Leopard)&lt;/li&gt;
&lt;li&gt;and are using Perl that comes with Mac OS X&lt;/li&gt;
&lt;li&gt;and have upgraded several core modules with CPAN in the past&lt;/li&gt;
&lt;/ul&gt;

&lt;/blockquote&gt;

&lt;p&gt;I read about it a while ago but when I tried it on my machine at the time, I didn’t see the symptoms described in the article, even though I use CPAN a lot, so I thought that my system wasn’t affected.&lt;/p&gt;

&lt;p&gt;Today, however, I had to track down a strange, hard to find bug where I would get messages like this:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;Modification of a read-only value attempted&lt;/pre&gt;

&lt;p&gt;At first I thought I made some &lt;a href=&quot;http://www.perlmonks.org/?node_id=570712&quot;&gt;Perl beginner mistake&lt;/a&gt;, but in the end it turned out that I did indeed have a broken &lt;code&gt;&lt;a href=&quot;http://search.cpan.org/~gbarr/Scalar-List-Utils-1.19/&quot;&gt;List::Util&lt;/a&gt;&lt;/code&gt; module with a version mismatch between the XS binary and the Perl module code. After downloading, compiling and installing a fresh copy of &lt;code&gt;Scalar-List-Utils&lt;/code&gt; from CPAN, everything was back to normal.&lt;/p&gt;

&lt;p&gt;Putting it here in the hope that it saves some other googling Perl developer some time :-)&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Developer/?permalink=Perl-Problem-After-Leopard-Security-Update.html</guid>
			<pubDate>Wed, 25 Mar 2009 23:21:03 +0100</pubDate>
                    </item>
        	            <item>
            <title>This Is Why I Love Mac OS X</title>
            <!--<link>http://www.entropy.ch/blog/Mac+OS+X/?permalink=This-Is-Why-I-Love-Mac-OS-X.html</link>-->
            <link>http://www.entropy.ch/blog/Mac+OS+X/2009/03/01/This-Is-Why-I-Love-Mac-OS-X.html</link>
            <description>&lt;p&gt;Stuff like this is why I love Mac OS X and wouldn’t dream of using anything else:&lt;/p&gt;

&lt;img src=&quot;http://www.entropy.ch/blojsom/resources/marc/recents-menu-duplicates.png&quot; width=&quot;480&quot; height=&quot;248&quot; alt=&quot;Recents Menu Duplicates&quot; class=&quot;screenshot&quot; /&gt;

&lt;p&gt;This shows the “Recent” menu present in most Mac OS X applications. It offers quick access to documents the user has previously worked on.&lt;/p&gt;

&lt;p&gt;In this particular case, the menu shows that in the past I worked on two documents with identical filenames but stored in different locations. The “Recent” menu entries would normally be of no use in figuring out which one is the one I want. But Mac OS X notices the duplicates and provides a helpful hint by appending a folder name to the document name.&lt;/p&gt;

&lt;p&gt;Until now I thought that it simply appends the document’s parent folder name, but I just realized that it is smarter than that, it ascends the hierarchy until it finds the first non-matching folder. The two documents you see in the screenshot are stored in these locations:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;/Users/liyanage/svn/entropy/xmlviewplugin/XMLWebKitPlugin.xcodeproj
/Users/liyanage/git/entropy/xmlviewplugin/XMLWebKitPlugin.xcodeproj&lt;/pre&gt;

&lt;p&gt;The &lt;code&gt;git&lt;/code&gt; or &lt;code&gt;svn&lt;/code&gt; folders are three levels up from the document name and they are the first ones to differ on the path of the documents.&lt;/p&gt;

&lt;p&gt;If I change one of the &lt;code&gt;xmlviewplugin&lt;/code&gt; or &lt;code&gt;entropy&lt;/code&gt; folder names, then &lt;em&gt;those&lt;/em&gt; show up. It’s brilliant!&lt;/p&gt;

&lt;p&gt;It’s a small, simple detail but immensely useful for everyday work. Whoever thought of this implementation is a genius :-). Stuff like this, and there’s a lot of it, is what’s so great about Mac OS X.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Mac+OS+X/?permalink=This-Is-Why-I-Love-Mac-OS-X.html</guid>
			<pubDate>Sun, 1 Mar 2009 19:24:26 +0100</pubDate>
                    </item>
        	            <item>
            <title>The Move From Subversion to Git</title>
            <!--<link>http://www.entropy.ch/blog/Developer/?permalink=The-Move-From-Subversion-to-Git.html</link>-->
            <link>http://www.entropy.ch/blog/Developer/2009/02/28/The-Move-From-Subversion-to-Git.html</link>
            <description>&lt;p&gt;I converted my personal Subversion repository to &lt;a href=&quot;http://git-scm.com/&quot;&gt;Git&lt;/a&gt; and collected a few notes.&lt;/p&gt;

&lt;p&gt;My repository contains the source code of my Mac OS X projects, but also a lot of one-off test programs and experiments. It is a &lt;em&gt;very&lt;/em&gt; basic repository; there are no branches at all (maybe I&#39;ll use them more with Git) and very few of my projects used tags, so the conversion was straightforward. Because there was so little information to preserve, this is not representative of an SVN -&gt; Git conversion in general, but the notes might still be useful for other people converting their personal repos.&lt;/p&gt;

&lt;p&gt;I had about 50 projects in Subversion, some big and some with just one or two files. Each project was in its own subdirectory below the repository root. They were unrelated, so I wanted to separate the projects into their own Git repositories during the conversion.&lt;/p&gt;

&lt;h2&gt;Converting Projects With Tags&lt;/h2&gt;

&lt;p&gt;I converted each of the few projects that did use tags manually, like this:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;SVN_BASE=svn+ssh://host/path/to/svnroot
PROJECT=album-artwork-assistant
git svn clone --trunk=&quot;$SVN_BASE/trunk/$PROJECT&quot; --tags=&quot;$SVN_BASE/tags/$PROJECT/versions&quot; &quot;$SVN_BASE/trunk/$PROJECT&quot;
cd $PROJECT
&lt;/pre&gt;

To convert the SVN tags to real Git tags I ran a modified version of a script by &lt;a href=&quot;http://frank.thomas-alfeld.de/wp/2008/08/30/converting-git-svn-tag-branches-to-real-tags/&quot;&gt;Frank S. Thomas&lt;/a&gt;:

&lt;pre class=&quot;code&quot;&gt;#!/bin/bash
GIT=/opt/local/bin/git
for branch in $($GIT branch -r); do
    if [ $(echo $branch | egrep &quot;tags/.+$&quot;) ]; then
        version=v$(basename $branch)
        subject=$($GIT log -1 --pretty=format:&quot;%s&quot; $branch)
        export GIT_COMMITTER_DATE=$($GIT log -1 --pretty=format:&quot;%ci&quot; $branch)

        echo &quot;Tag $version [Y/n]?&quot;
        read yesno
        if [ -z $yesno ] || [ $yesno = &quot;Y&quot; ]; then
            $GIT tag -a -f -m &quot;$subject&quot; &quot;$version&quot; &quot;$branch^&quot;
            $GIT branch -d -r $branch
        fi
    fi
done&lt;/pre&gt;

&lt;p&gt;This next step converts &lt;code&gt;svn:ignore&lt;/code&gt; properties to &lt;code&gt;.gitignore&lt;/code&gt; files&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;git svn create-ignore
git commit -m &#39;added .gitignore converted from svn:ignore&#39;
cd ..&lt;/pre&gt;

&lt;p&gt;All of this gave me a working copy repository in &lt;code&gt;$PROJECT&lt;/code&gt;. I converted it to a bare repository like this:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;git clone --bare $PROJECT&lt;/pre&gt;

&lt;p&gt;The bare repo was now in &lt;code&gt;$PROJECT.git&lt;/code&gt;&lt;/p&gt;


&lt;h2&gt;Converting Simple Projects Without Tags&lt;/h2&gt;

&lt;p&gt;For all the other simple projects without any tags I used this script:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;#!/bin/bash

WD=&quot;$PWD&quot;
GIT=&quot;/opt/local/bin/git&quot;
SVN_TRUNK=svn+ssh://host/path/to/svnroot/trunk
PROJECTS=$(svn list &quot;$SVN_TRUNK&quot; | sed -e &#39;s#/$##&#39;)
[ -d logs ] || mkdir logs

for project in $PROJECTS; do
	cd &quot;$WD&quot;
	[ -d &quot;$project.git&quot; ] &amp;amp;&amp;amp; continue

	LOG=&quot;$WD/logs/$project.log&quot;
	echo &quot;\nconverting $project\n&quot;

	$GIT svn clone &quot;$SVN_TRUNK/$project&quot; &gt; &quot;$LOG&quot;
	cd &quot;$project&quot;
	$GIT svn create-ignore &gt;&gt; &quot;$LOG&quot;
	$GIT commit -m &#39;added .gitignore converted from svn:ignore&#39; &gt;&gt; &quot;$LOG&quot;
	cd ..
	$GIT clone --bare &quot;$project&quot; &quot;$project.git&quot; &gt;&gt; &quot;$LOG&quot;
	rm -rf &quot;./$project&quot;
done&lt;/pre&gt;

&lt;h2&gt;Move to Server and Checkout Local Repositories&lt;/h2&gt;

&lt;p&gt;Together with the manually converted ones, this resulted in about 50 bare Git repositories, one per project. I moved them all to a server into a common project root directory and then cloned them back to my computer as local working copies:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;for project in $(ssh myserver ls /path/to/git/projectroot); do
    git clone -v ssh://myserver/path/to/git/projectroot/$i
done&lt;/pre&gt;


&lt;h2&gt;Setting up &lt;code&gt;gitweb&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;I got Git for Mac OS X via &lt;a href=&quot;http://www.macports.org/&quot;&gt;MacPorts&lt;/a&gt;, both on my client and on the server. It comes with the &lt;code&gt;gitweb&lt;/code&gt; web viewer so I activated that on my server with the following Apache configuration:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;Alias /git /opt/local/share/git-core/gitweb
&amp;lt;Location /git&gt;
    DirectoryIndex gitweb.cgi
    AddHandler cgi-script cgi
    Options +ExecCGI
&amp;lt;/Location&gt;&lt;/pre&gt;

&lt;p&gt;I had to configure the project root directory in &lt;code&gt;gitweb.cgi&lt;/code&gt;:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;our $projectroot = &quot;/path/to/git/projectroot&quot;;&lt;/pre&gt;

&lt;p&gt;Now it’s visible externally at &lt;a href=&quot;http://www.entropy.ch/git/&quot;&gt;http://www.entropy.ch/git/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Rewriting History&lt;/h2&gt;

After the conversion, the old commits generated by &lt;code&gt;git svn&lt;/code&gt; had auto-generated committer e-mail address
and name information which differed from my Git configuration values. To clean up and unify this information in the
old commits I ran these commands in each working copy:

&lt;pre class=&quot;code&quot;&gt;git filter-branch --env-filter \
    &quot;export GIT_AUTHOR_NAME=&#39;Marc Liyanage&#39; \
    GIT_AUTHOR_EMAIL=&#39;email@example.com&#39; \
    GIT_COMMITTER_NAME=&#39;Marc Liyanage&#39; \
    GIT_COMMITTER_EMAIL=&#39;email@example.com&#39;&quot;
git push --force
&lt;/pre&gt;


&lt;h2&gt;github&lt;/h2&gt;

&lt;p&gt;One nice benefit of using Git is that I get to host code on &lt;a href=&quot;http://github.com/liyanage&quot;&gt;github&lt;/a&gt; for free. I push some of my more recent projects there from time to time.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Developer/?permalink=The-Move-From-Subversion-to-Git.html</guid>
			<pubDate>Sat, 28 Feb 2009 12:48:26 +0100</pubDate>
                    </item>
        	            <item>
            <title>Safari Tab Shortcuts</title>
            <!--<link>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Safari-Tab-Shortcuts.html</link>-->
            <link>http://www.entropy.ch/blog/Mac+OS+X/2009/02/11/Safari-Tab-Shortcuts.html</link>
            <description>&lt;p&gt;Here’s an AppleScript implementation of a great idea by &lt;a href=&quot;http://gorn.ch/&quot;&gt;Ebi&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It provides numeric keyboard shortcuts to jump to a specific Safari Tab directly. You can press ⌘-⌥-1 to switch to the first tab, ⌘-⌥-2 for the second etc.&lt;/p&gt;

Here’s the script code:

&lt;pre class=&quot;code&quot;&gt;
set myPath to (path to me) as text
set tabNumber to (word -2 of myPath) as number

tell application &quot;Safari&quot;
	tell window 1
		try
			set current tab to tab tabNumber
		on error
			beep
		end try
	end tell
end tell&lt;/pre&gt;

&lt;p&gt;I saved this exact same script nine times with the following file names:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;Switch to Tab 1.scpt
Switch to Tab 2.scpt
Switch to Tab 3.scpt
...&lt;/pre&gt;

&lt;p&gt;I put them in my Home &gt; Library &gt; Scripts &gt; Applications &gt; Safari folder and used &lt;a href=&quot;http://www.red-sweater.com/fastscripts/&quot;&gt;FastScripts&lt;/a&gt; to assign numeric keyboard shortcuts:&lt;/p&gt;

&lt;img src=&quot;http://www.entropy.ch/blojsom/resources/marc/2009-02-11-safari-tab-shortcuts-fastscripts.png&quot; width=&quot;480&quot; height=&quot;276&quot; alt=&quot;Safari Tab Shortcuts - FastScripts Preferences&quot; class=&quot;screenshot&quot; /&gt;

&lt;p&gt;Pick whatever you like, you can also use Ctrl-1, ⌘-1 etc.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Safari-Tab-Shortcuts.html</guid>
			<pubDate>Wed, 11 Feb 2009 15:46:23 +0100</pubDate>
                    </item>
        	            <item>
            <title>Exclude From Time Machine Backup Script, New and Improved</title>
            <!--<link>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Exclude-From-Time-Machine-Backup-Script-New-and-Improved.html</link>-->
            <link>http://www.entropy.ch/blog/Mac+OS+X/2009/02/09/Exclude-From-Time-Machine-Backup-Script-New-and-Improved.html</link>
            <description>&lt;p&gt;Here’s the 2009 update to my “Exclude From Backup” AppleScript, which I published in a &lt;a href=&quot;http://www.entropy.ch/blog/Mac+OS+X/2008/06/14/Exclude-Items-From-Time-Machine-Backup-With-Contextual-Menu.html&quot;&gt;previous article&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The script excludes selected items from the &lt;a href=&quot;http://en.wikipedia.org/wiki/Time_Machine_(Apple_software)&quot;&gt;Time Machine&lt;/a&gt; backup. I use it to exclude large downloads such as &lt;span style=&#39;text-decoration: line-through;&#39;&gt;pirated TV shows&lt;/span&gt; Linux ISO images from the backup, so they don’t clutter up the backup disk.&lt;/p&gt;

&lt;p&gt;The new features are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Notifications via Growl both for successful and failed exclusions. Growl is required, I don’t check for it&lt;/li&gt;
&lt;li&gt;Three different ways to launch the script and pass the files (see below)&lt;/li&gt;
&lt;li&gt;As a side effect of the previous one, the script now handles multiple files&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Growl notifications look like this:&lt;/p&gt;

&lt;p&gt;
&lt;img src=&quot;http://www.entropy.ch/blojsom/resources/marc/2009-02-09-exclude-from-backup-growl-success.png&quot; width=&quot;311&quot; height=&quot;192&quot; alt=&quot;Exclude From Backup - Growl Success Notification&quot; class=&quot;screenshot&quot; /&gt;
&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://www.entropy.ch/blojsom/resources/marc/2009-02-09-exclude-from-backup-growl-fail.png&quot; width=&quot;312&quot; height=&quot;118&quot; alt=&quot;Exclude From Backup - Growl Failure Notification&quot; class=&quot;screenshot&quot; /&gt;&lt;/p&gt;

&lt;p&gt;There are three ways to use it:&lt;/p&gt;

&lt;p&gt;1.) Via the Finder contextual menu item through &lt;a href=&quot;http://ranchero.com/2006/06/29/big_cat_scripts_plugin_now_universal&quot;&gt;Ranchero’s BigCat&lt;/a&gt;. This is what it could do before, and this method is still limited to one file at a time. Unfortunately the BigCat web page at Ranchero’s site is missing at the time of this writing, maybe it’s just temporary and it will come back. If not, use one of the other methods.&lt;/p&gt;

&lt;p&gt;You must store the AppleScript in the &lt;code&gt;Library/Application Support/Big Cat Scripts/Files&lt;/code&gt; folder in your home folder.&lt;/p&gt;

&lt;p&gt;&lt;img class=&quot;screenshot&quot; alt=&quot;Exclude From Backup - Contextual Menu&quot; src=&quot;/images/blog/2008-06-14-exclude-from-backup.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;2.) The second way is via &lt;a href=&quot;http://www.obdev.at/launchbar/&quot;&gt;LaunchBar&lt;/a&gt;’s &lt;a href=&quot;http://www.obdev.at/resources/launchbar/help/SendingItems.html&quot;&gt;“Send to” feature&lt;/a&gt;: Select one or more items to be
excluded, press &lt;em&gt;and hold&lt;/em&gt; your activation shortcut, press the Tab
key, type an abbreviation of the script’s name, e.g. “excl”, and hit return.
This requires you to store the script in the &lt;code&gt;Library/Scripts/Applications/Finder&lt;/code&gt; in your home folder.&lt;/p&gt;

&lt;img src=&quot;http://www.entropy.ch/blojsom/resources/marc/2009-02-09-exclude-from-backup-launchbar-sendto.png&quot; width=&quot;457&quot; height=&quot;83&quot; alt=&quot;Exclude From Backup via LaunchBar Sendto&quot; class=&quot;screenshot&quot; /&gt;

&lt;p&gt;Other launchers such as QuickSilver or Butler might work similarly, if they pass the affected files to the script’s &lt;code&gt;open&lt;/code&gt; handler. In fact, since the open handler is a generic feature, there are probably many other ways to use this.&lt;/p&gt;

&lt;p&gt;One of them is to save the script as a droplet, a stand-alone application onto which you can drop the icons of the files you want excluded. If you stick it in the Dock, it’s pretty convenient to use. The download below contains the droplet version in addition to the regular script.&lt;/p&gt;

&lt;p&gt;3.) The third way is via &lt;a href=&quot;http://www.red-sweater.com/fastscripts/&quot;&gt;FastScripts&lt;/a&gt; or Apple’s Script Menu: select the items to be excluded in the Finder and invoke the script from the menu or, in the case of FastScripts, via a keybord shortcut.&lt;/p&gt;


&lt;img src=&quot;http://www.entropy.ch/blojsom/resources/marc/2009-02-09-exclude-from-backup-fastscripts.png&quot; width=&quot;368&quot; height=&quot;180&quot; alt=&quot;Exclude From Backup - FastScripts&quot; class=&quot;screenshot&quot; /&gt;

&lt;p&gt;Download a zip file with the script file here: &lt;a href=&quot;http://www2.entropy.ch/download/exclude-from-backup.zip&quot;&gt;exclude-from-backup.zip&lt;/a&gt;&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Exclude-From-Time-Machine-Backup-Script-New-and-Improved.html</guid>
			<pubDate>Mon, 9 Feb 2009 19:17:56 +0100</pubDate>
                    </item>
        	            <item>
            <title>Safari Plugin for Viewing XML Data</title>
            <!--<link>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Safari-Plugin-for-Viewing-XML-Data.html</link>-->
            <link>http://www.entropy.ch/blog/Mac+OS+X/2009/02/09/Safari-Plugin-for-Viewing-XML-Data.html</link>
            <description>&lt;p&gt;&lt;a class=&#39;img&#39; href=&quot;http://www.entropy.ch/software/macosx/xmlviewplugin/&quot;&gt;&lt;img class=&quot;right&quot; alt=&quot;xxx&quot; src=&quot;http://www.entropy.ch/software/macosx/xmlviewplugin/xmlviewplugin-icon.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It always bothered me that Safari doesn’t show raw XML data in a useful way, like Firefox and other browsers do. I had to use “View Source” every time to see the XML data, because Safari seems to interpret the XML elements as HTML, leaving only text element content visible:&lt;/p&gt;

&lt;p&gt;&lt;img class=&quot;screenshot&quot; alt=&quot;XML in Safari without XML View Plugin&quot; src=&quot;http://www.entropy.ch/images/blog/2009-02-09-safari-xml-without-plugin.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Here’s the same data in Firefox:&lt;/p&gt;

&lt;p&gt;&lt;img class=&quot;screenshot&quot; alt=&quot;XML in Firefox&quot; src=&quot;http://www.entropy.ch/images/blog/2009-02-09-firefox-xml.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;In my current project at work I had to use “View Source” all the time, so I decided to do something about it. &lt;a href=&quot;http://jf.omnis.ch/&quot;&gt;Joachim Fornallaz&lt;/a&gt; pitched in and the result is &lt;a href=&quot;http://www.entropy.ch/software/macosx/xmlviewplugin/&quot;&gt;“XML View Plugin”&lt;/a&gt;, a Safari WebKit plugin that registers as a handler for some XML MIME types and displays the raw XML code:&lt;/p&gt;

&lt;p&gt;&lt;img class=&quot;screenshot&quot; alt=&quot;XML in Safari with XML View Plugin&quot; src=&quot;http://www.entropy.ch/images/blog/2009-02-09-safari-xml-with-plugin.png&quot; /&gt;&lt;/p&gt;



&lt;p&gt;It can optionally pretty-print it with &lt;a href=&quot;http://tidy.sourceforge.net/&quot;&gt;Tidy&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;img class=&quot;screenshot&quot; alt=&quot;XML in Safari with XML View Plugin and Pretty Printing&quot; src=&quot;http://www.entropy.ch/images/blog/2009-02-09-safari-xml-with-plugin-prettyprint.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I’d like to add syntax coloring if I can find a C-based library with a BSD-ish license that does that.&lt;/p&gt;

The inspiration for this project came from the fantastic &lt;a href=&quot;http://github.com/rentzsch/clicktoflash/tree/master&quot;&gt;ClickToFlash plugin&lt;/a&gt; that was in the &lt;a href=&quot;http://daringfireball.net/linked/2009/01/26/clicktoflash&quot;&gt;Mac news&lt;/a&gt; recently. Like XML View Plugin, ClickToFlash is implemented as a WebKit plugin. Before reading about it, I did not realize that there’s a convenient, &lt;a href=&quot;http://developer.apple.com/documentation/InternetWeb/Conceptual/WebKit_PluginProgTopic/Tasks/WebKitPlugins.html&quot;&gt;Objective-C based alternative&lt;/a&gt; to the old-school Netscape browser plugin API.

&lt;p&gt;Download and more information are on the &lt;a href=&quot;http://www.entropy.ch/software/macosx/xmlviewplugin/&quot;&gt;plugin’s info page&lt;/a&gt;. Please try it out and let me know what you think, and especially let me know if you find any problems that impact Safari’s stability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt; 2009-03-04: Version 1.5 added user-customizable syntax coloring, see the info page for details. This is how it looks by default:&lt;/p&gt;

&lt;p&gt;&lt;img class=&quot;screenshot&quot; alt=&quot;XML in Safari with XML View Plugin with syntax coloring and formatting&quot; src=&quot;http://www.entropy.ch/software/macosx/xmlviewplugin/view-formatted-styled.png&quot; /&gt;&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Safari-Plugin-for-Viewing-XML-Data.html</guid>
			<pubDate>Mon, 9 Feb 2009 04:17:24 +0100</pubDate>
              	          <wfw:comment>http://www.entropy.ch/blojsom/commentapi/marc/Mac+OS+X/?permalink=Safari-Plugin-for-Viewing-XML-Data.html</wfw:comment>
              <wfw:commentRss>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Safari-Plugin-for-Viewing-XML-Data.html&amp;page=comments&amp;flavor=rss2</wfw:commentRss>
                    </item>
        	            <item>
            <title>MySQL Workbench Alpha for Mac OS X</title>
            <!--<link>http://www.entropy.ch/blog/Developer/?permalink=MySQL-Workbench-Alpha-for-Mac-OS-X.html</link>-->
            <link>http://www.entropy.ch/blog/Developer/2009/02/03/MySQL-Workbench-Alpha-for-Mac-OS-X.html</link>
            <description>&lt;p&gt;&lt;a href=&quot;http://dev.mysql.com/workbench/?page_id=35&quot;&gt;MySQL Workbench&lt;/a&gt; is coming to the Mac (and Linux). This program is a great database design tool, I use its Windows version to model relational databases visually. It gives me two kinds of very useful results:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DDL SQL files that I can send directly to the MySQL database server to initialize my database schema&lt;/li&gt;
&lt;li&gt;database model diagram vector images that I can use for high quality output technical documentation and also for training and discussion purposes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here’s MySQL’s announcement of the Mac version:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://dev.mysql.com/workbench/?p=192&quot;&gt;http://dev.mysql.com/workbench/?p=192&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As they note, it’s a very early preview that’s probably not yet ready for production, but it already looks great and opens and displays my model file from the Windows version fine.&lt;/p&gt;

&lt;p&gt;When I say it looks great I’m really a bit surprised because I expected a really ugly port like so often with cross-plattform applications (I’m thinking of the ugliness that is often QT and I’m looking in the general direction of Google Earth when I say this).&lt;/p&gt;

&lt;p&gt;&lt;img class=&quot;screenshot&quot; alt=&quot;MySQL Workbench Mac OS X Alpha&quot; src=&quot;/images/blog/2009-02-03-mysql-workbench-alpha-1.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img class=&quot;screenshot&quot; alt=&quot;MySQL Workbench Mac OS X Alpha&quot; src=&quot;/images/blog/2009-02-03-mysql-workbench-alpha-2.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I saw some visual glitches in other parts of the interface, for sure, but overall it’s a positive first impression.&lt;/p&gt;

</description>
            <guid>http://www.entropy.ch/blog/Developer/?permalink=MySQL-Workbench-Alpha-for-Mac-OS-X.html</guid>
			<pubDate>Tue, 3 Feb 2009 21:36:20 +0100</pubDate>
              	          <wfw:comment>http://www.entropy.ch/blojsom/commentapi/marc/Developer/?permalink=MySQL-Workbench-Alpha-for-Mac-OS-X.html</wfw:comment>
              <wfw:commentRss>http://www.entropy.ch/blog/Developer/?permalink=MySQL-Workbench-Alpha-for-Mac-OS-X.html&amp;page=comments&amp;flavor=rss2</wfw:commentRss>
                    </item>
        	            <item>
            <title>These Missing Features Keep Me From Switching To Pages</title>
            <!--<link>http://www.entropy.ch/blog/Mac+OS+X/?permalink=These-Missing-Features-Keep-Me-From-Switching-To-Pages.html</link>-->
            <link>http://www.entropy.ch/blog/Mac+OS+X/2009/01/28/These-Missing-Features-Keep-Me-From-Switching-To-Pages.html</link>
            <description>&lt;p&gt;This was originally a comment on a &lt;a href=&quot;http://www.entropy.ch/blog/Mac+OS+X/2009/01/20/MS-Word-2008-Pleasant-Surprises.html&quot;&gt;previous posting&lt;/a&gt; but I decided to give this topic its own entry.&lt;/p&gt;

&lt;p&gt;I love &lt;a href=&quot;http://www.apple.com/iwork/pages/&quot;&gt;Apple’s Pages application&lt;/a&gt; and I use it for my private stuff, letters, invoices or birthday cards. It just “feels” great, exactly like a Mac application should.&lt;/p&gt;

&lt;p&gt;Unfortunately, it’s not there yet for my professional work.&lt;/p&gt;

&lt;p&gt;A big part of my job is writing long, structured technical documents. Over the years I refined a set of templates and style sheets that let me format the text efficiently while I write, resulting in documents that have the very specific look I want.&lt;/p&gt;

&lt;p&gt;This is where Pages doesn’t work for me. Even in iWork 09, its paragraph styles are still not powerful enough to create the visual effects I use in my templates.&lt;/p&gt;

&lt;p&gt;The missing features are mostly related to paragraph borders and background colors combined with paragraph indents. In Word, a left or right indent also indents the left or right box edge. In Pages, a paragraph indent only shifts the text but the box still uses the full column width. Without borders or background that box is invisible and it doesn’t matter, but with borders or background, the full-width box is visible and looks ridiculous:&lt;/p&gt;

&lt;div class=&quot;thumbnail&quot;&gt;&lt;a href=&quot;http://skitch.com/liyanage/bntgf/techdoc-layout-word-vs-pages&quot;&gt;&lt;img src=&quot;http://img.skitch.com/20090128-p5d3ahwp79a6h5xxsr4qc6rgc1.preview.jpg&quot; alt=&quot;techdoc-layout-word-vs-pages&quot; /&gt;&lt;/a&gt;&lt;/div&gt; 

&lt;p&gt;Another thing: It seems that Pages paragraph styles cannot be based on other styles, which I think is critical. In Word, I build hierarchies of styles so I can change visual effects in one central place and have them propagate through the styles automatically.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Mac+OS+X/?permalink=These-Missing-Features-Keep-Me-From-Switching-To-Pages.html</guid>
			<pubDate>Wed, 28 Jan 2009 23:39:31 +0100</pubDate>
                    </item>
        	            <item>
            <title>Mac OS X Problem Unsolved for Years: Terminal Meta Key and International Keyboards</title>
            <!--<link>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Mac-OS-X-Problem-Unsolved-for-Years-Terminal-Meta-Key-and-International-Keyboards.html</link>-->
            <link>http://www.entropy.ch/blog/Mac+OS+X/2009/01/27/Mac-OS-X-Problem-Unsolved-for-Years-Terminal-Meta-Key-and-International-Keyboards.html</link>
            <description>&lt;p&gt;I’ve been looking for a solution to this for years. Maybe somebody can give me a tip. I posted a detailed description of what I’m looking for in an &lt;a href=&quot;http://discussions.apple.com/message.jspa?messageID=8481260#8481260&quot;&gt;Apple support discussion forum&lt;/a&gt; thread.&lt;/p&gt;

&lt;p&gt;Basically, I want a &lt;em&gt;real&lt;/em&gt; Meta key in the Mac OS X Terminal application. The “Use option as meta key” checkbox in the preferences doesn’t count because on my Swiss German keyboard layout I need the option key to type all sorts of characters that are important on the UNIX command line. The ESC key doesn’t count either, as explained in the discussion post.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Mac-OS-X-Problem-Unsolved-for-Years-Terminal-Meta-Key-and-International-Keyboards.html</guid>
			<pubDate>Tue, 27 Jan 2009 22:24:27 +0100</pubDate>
                    </item>
        	             <item>
            <title>iBlogger Test</title>
            <!--<link>http://www.entropy.ch/blog/?permalink=iBlogger-Test.html</link>-->
            <link>http://www.entropy.ch/blog/2009/01/27/iBlogger-Test.html</link>
            <description>&lt;img style=&quot;padding:0px 10px 10px 10px;&quot; src=&quot;http://www.entropy.ch/blojsom/resources/marc/image1410538678.jpg&quot; width=&quot;280&quot; align=&quot;left&quot; alt=&quot;image1410538678.jpg&quot; title=&quot;image1410538678.jpg&quot; /&gt;I just installed iBlogger on my iPhone and I&#39;m test driving it. I guess it could be fun for mobile blogging of photos taken with the camera. Considering the keyboard, I don&#39;t see myself writing long posts, though...&lt;br/&gt;&lt;br/&gt;&lt;br clear=&quot;all&quot;/&gt;&lt;div class=&quot;iblogger-location-wrapper&quot;/&gt;Mobile Blogging from &lt;a class=&quot;iblogger-location&quot; href=&quot;http://maps.google.com/maps?ll=47.4183,8.5593&quot;&gt;here&lt;/a&gt;.&lt;/div&gt;&lt;div class=&quot;iblogger-footer&quot;&gt;&lt;br clear=&quot;all&quot;/&gt;&lt;p style=&quot;text-align:right;font-size:10px;&quot;&gt;[Posted with &lt;a href=&quot;http://illuminex.com/iBlogger/index.html&quot;&gt;iBlogger&lt;/a&gt; from my iPhone]&lt;/p&gt;&lt;br/&gt;&lt;/div&gt;
</description>
            <guid>http://www.entropy.ch/blog/?permalink=iBlogger-Test.html</guid>
			<pubDate>Tue, 27 Jan 2009 22:17:00 +0100</pubDate>
              	          <wfw:comment>http://www.entropy.ch/blojsom/commentapi/marc/?permalink=iBlogger-Test.html</wfw:comment>
              <wfw:commentRss>http://www.entropy.ch/blog/?permalink=iBlogger-Test.html&amp;page=comments&amp;flavor=rss2</wfw:commentRss>
                    </item>
        	            <item>
            <title>OpenSSL, Public Key and PKI Crash Course, Part 2/4</title>
            <!--<link>http://www.entropy.ch/blog/Developer/?permalink=OpenSSL-Public-Key-and-PKI-Crash-Course-Part-2-4.html</link>-->
            <link>http://www.entropy.ch/blog/Developer/2009/01/25/OpenSSL-Public-Key-and-PKI-Crash-Course-Part-2-4.html</link>
            <description>&lt;p&gt;At &lt;a href=&quot;http://www.futurelab.ch&quot;&gt;work&lt;/a&gt; I recently gave a presentation about the practical aspects of public key cryptography with the &lt;a href=&quot;http://www.openssl.org/&quot;&gt;OpenSSL toolkit&lt;/a&gt;. This is an expanded transcript of the presentation, published here on my blog in the hope that it’s useful for a broader audience.&lt;/p&gt;

&lt;p&gt;There are four parts covering these major topics:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.entropy.ch/blog/Developer/2009/01/11/OpenSSL-Public-Key-and-PKI-Crash-Course-Part-1-4.html&quot;&gt;Part 1: Public Key Cryptography&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Part 2: Public Key Infrastructure (PKI)&lt;/li&gt;
&lt;li&gt;Part 3: Inspecting and Creating X.509 Certificates&lt;/li&gt;
&lt;li&gt;Part 4: OpenSSL Bag of Tricks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You are reading part 2, about Public Key Infrastructure (PKI). This part shows the practical problems with simple public key cryptography, and how a public key infrastructure attempts to solve them. While part 1 was fairly technical, this part is about real-world organizational structures and trust relationships. Part 3 will again be more technical, showing how these real-world concepts are mapped to systems and software.&lt;/p&gt;

&lt;p&gt;Some things in this part are based on the German book &lt;a href=&quot;http://www.amazon.de/Kryptografie-Public-Key-Infrastrukturen-im-Internet/dp/3932588908&quot;&gt;“Kryptografie und Public-Key Infrastrukturen im Internet”&lt;/a&gt;. A revised English edition is available as &lt;a href=&quot;http://www.amazon.com/Cryptography-Public-Key-Infrastructure-Internet/dp/047084745X&quot;&gt;“Cryptography and Public Key Infrastructure on the Internet”&lt;/a&gt;. Both are probably a bit dated by now, so you should look for newer books.&lt;/p&gt;

&lt;h2&gt;Practical Problems With Plain Public Key Cryptography&lt;/h2&gt;

&lt;p&gt;There are a few practical issues with the basic operations provided to us by plain public key crypto. The next few sections highlight some of them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Key authenticity&lt;/li&gt;
&lt;li&gt;Key revocation&lt;/li&gt;
&lt;li&gt;Key validity periods&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are other issues not discussed here, such as &lt;a href=&quot;http://en.wikipedia.org/wiki/Non-repudiation&quot;&gt;non-repudiation&lt;/a&gt; and policy enforcement.&lt;/p&gt;

&lt;p&gt;For public cryptography to be useful in real-world use on a large scale, these issues need to be addressed, and that is what a Public Key Infrastructure, or PKI, is about.&lt;/p&gt;

&lt;h3&gt;Key authenticity&lt;/h3&gt;

&lt;p&gt;Part 1 didn’t go into the details of how two parties who want to exchange encrypted or signed messages exchange their public keys, but these details are critical.&lt;/p&gt;

&lt;p&gt;One possibility is to exchange the keys at a face-to-face meeting. This approach is not feasible on a large scale, and public key cryptography with its asymmetric nature is interesting exactly in a large scale scenario.&lt;/p&gt;

&lt;p&gt;In the absence of a secure communications channel for key exchange between the two parties, another possibility is to exchange the keys over an open, untrusted network like the Internet. The problem with this is that the recipient of the key can never be sure if the key is authentic.&lt;/p&gt;

&lt;p&gt;A third party C, with the ability to intercept messages on the untrusted network, could intercept the public key in transit from the sender A to the recipient B and note it. C could generate a new key pair and send the public key to B, pretending to be A. If B then uses this public key to send an encrypted message to A, the third party could again intercept the message, decrypt it with the private key it generated to read the message, and then re-encrypt the message using A’s &lt;em&gt;real&lt;/em&gt; public key and send it to A, pretending to be the legitimate sender B. It would work the same in the other direction and it’s called the &lt;a href=&quot;http://en.wikipedia.org/wiki/Man-in-the-middle_attack&quot;&gt;man-in-the-middle attack&lt;/a&gt; (MITM).&lt;/p&gt;

&lt;p&gt;A public key infrastructure should make it possible to verify a public key’s authenticity.&lt;/p&gt;

&lt;h3&gt;Key revocation&lt;/h3&gt;

&lt;p&gt;If a private key is compromised, we want our communication partners to stop using the related public key, otherwise confidential information is sent around and people other than the intended recipient are able to decrypt it.&lt;/p&gt;

&lt;p&gt;A public key infrastructure should make it possible to revoke previously distributed public keys.&lt;/p&gt;


&lt;h3&gt;Key validity periods&lt;/h3&gt;

&lt;p&gt;Encryption keys should be replaced in regular intervals. One reason is that the longer a key is in use, the more material is available for &lt;a href=&quot;http://en.wikipedia.org/wiki/Cryptanalysis&quot;&gt;cryptanalysis&lt;/a&gt;. Another reason is to limit the damage caused by a private key being compromised without detection.&lt;/p&gt;

&lt;p&gt;A public key infrastructure should provide means to specify a validity period for a public key.&lt;/p&gt;


&lt;h2&gt;Trust Relationships&lt;/h2&gt;

&lt;p&gt;Ultimately, these issues are about trust and trust relationships between the involved parties. There are different types of trust relationships, and this section shows how well each one addresses the problems.&lt;/p&gt;

&lt;h3&gt;Direct Trust&lt;/h3&gt;

&lt;p&gt;This model could also be called “no infrastructure”. It’s the basic face-to-face meeting case from above, where the parties exchange their public keys directly.&lt;/p&gt;

&lt;p&gt;It’s difficult to do with parties who are total strangers, and between difficult and impossible to do with lots of communication partners.&lt;/p&gt;

&lt;p&gt;Key revocation means directly contacting the other party and telling them to stop using the old key.&lt;/p&gt;

&lt;p&gt;There is no support for formal validity periods.&lt;/p&gt;


&lt;h3&gt;Web of Trust&lt;/h3&gt;

&lt;p&gt;This model is an extension of direct trust. If participants A and B have previously exchanged their keys, both can now act as &lt;em&gt;introducers&lt;/em&gt; and sign (and forward to the other party) the public keys of all other partners they know directly. Each can add the public keys obtained this way to its list of known, trusted keys.&lt;/p&gt;

&lt;p&gt;So if A knows B, and B knows C, B is the introducer and can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;sign C’s public key and send it to A&lt;/li&gt;
&lt;li&gt;sign A’s public key and send it to C&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This enables A and C each to verify the new public keys using B’s public key, which they already know and trust, and begin exchanging secure messages directly, knowing that their public keys for each other are authentic.&lt;/p&gt;

&lt;p&gt;Now that A and C trust each other, they can again sign keys of partners they know directly, and so on, thus creating and extending the web of trust.&lt;/p&gt;

&lt;p&gt;It is usually not just the public key that is signed, but a whole package of information that includes the public key, the subject’s name, e-mail address etc. This whole information package, when signed, is also called a &lt;em&gt;certificate&lt;/em&gt;. Make a mental note of this, because it’s important: A certificate contains a public key and additional information, and somebody signed the whole package with a private key that’s unrelated to the public key in the package.&lt;/p&gt;

&lt;p&gt;The party who signs the bunch of data, and therefore issues the certificate, vouches for the &lt;em&gt;entire&lt;/em&gt; information, and not just for the public key. This means that the signing party needs to verify all information that it signs. For things like e-mail addresses, that can be through an automated process, but for things like a company or personal name, it usually requires checking official records such as commercial registry papers, passports, ID cards etc.&lt;/p&gt;

&lt;p&gt;Handling revocation, expiration and scaling to large users bases can be difficult, as can be getting introduced into a web of trust. &lt;a href=&quot;http://en.wikipedia.org/wiki/Web_of_trust&quot;&gt;Wikipedia’s article on web of trust&lt;/a&gt; has more information.&lt;/p&gt;

&lt;p&gt;Web of trust is the trust model used by &lt;a href=&quot;http://en.wikipedia.org/wiki/Pretty_Good_Privacy&quot;&gt;PGP&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Hierarchical Trust&lt;/h3&gt;

&lt;p&gt;In this model, all parties agree on one or more trusted, independent authorities to issue certificates. These authorities are called &lt;a href=&quot;http://en.wikipedia.org/wiki/Certificate_authority&quot;&gt;certificate authorities&lt;/a&gt; (CAs) or trust centers.&lt;/p&gt;

&lt;p&gt;A CA’s own certificate, which the parties need in order to verify the certificates issued by that particular CA, is called a &lt;em&gt;root certificate&lt;/em&gt; and it is distributed widely, e.g. as part of client programs such as e-mail clients or web browsers or directly in operating systems.&lt;/p&gt;

&lt;p&gt;Here are parts of the root certificate lists of Mac OS X and Windows XP:&lt;/p&gt;

&lt;p&gt;&lt;img class=&quot;screenshot&quot; alt=&quot;Mac OS X Root Certificates&quot; src=&quot;/images/blog/2009-01-26-macosx-root-certs.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img class=&quot;screenshot&quot; alt=&quot;Windows XP Root Certificates&quot; src=&quot;/images/blog/2009-01-26-windows-xp-root-certs.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Because literally millions of users trust these CA certificates, the non-disclosure of the associated private keys is absolutely critical. The CA’s organizational structures and operational processes are designed to prevent a compromise of these very important private keys. A CA has to document the quality of these structures and processes by passing an &lt;a href=&quot;http://209.85.129.132/search?q=cache:L4w3GSJxh3UJ:net.educause.edu/ir/library/powerpoint/PKI0513B.pps+Auditing+certification+authority&amp;amp;hl=en&amp;amp;ct=clnk&amp;amp;cd=6&quot;&gt;audit&lt;/a&gt; before its root certificate is accepted by operating system and other client software vendors. One requirement is the use of &lt;a href=&quot;http://en.wikipedia.org/wiki/Hardware_Security_Module&quot;&gt;Hardware Security Modules&lt;/a&gt; conforming to the &lt;a href=&quot;http://en.wikipedia.org/wiki/FIPS_140-2&quot;&gt;FIPS 140-2 standard&lt;/a&gt; for the generation, storage and use of the CA’s sensitive key material.&lt;/p&gt;

&lt;p&gt;Once a party trusts a CA (by having its certificate with its public key in the list of trusted root certificates), it can immediately validate the probably very large number of certificates issued by that CA now and in the future. A CA can also sign intermediate signing keys of other CAs, and they can in turn do the same, which creates the hierarchical trust structure that gives this model its name.&lt;/p&gt;

&lt;p&gt;With a CA in place, if two parties both trust that CA and want to communicate securely with each other using public keys certified by that CA, they both have to get a certificate. They generate a key pair and prepare a certificate request. The request is the “bunch of data” mentioned above and it consists of the public key along with all other information required by the CA, according to the CA’s policies.&lt;/p&gt;

&lt;p&gt;These policies can vary according to the level of certification, and the price of the certificate usually depends on that level. It could be that only an e-mail address is certified and the certification is free. In other cases, commercial banking-grade certificates are issued that certify not only the name of a web site but also the organization name, after extensive review of legal proof of incorporation and domain name ownership.&lt;/p&gt;

&lt;p&gt;After following its procedures to verify that all information presented in the certificate request is valid, the CA signs the public key and other information in the request with its private key. The result is the certificate, which is sent back to the party that requested it.&lt;/p&gt;

&lt;p&gt;Once both parties have their certificates, they can exchange them, and they can do this even over insecure public networks because both will be able to verify the certificate’s authenticity using the CA’s root certificate, which they both already know and trust.&lt;/p&gt;

&lt;p&gt;So how well does this trust model deal with our practical issues?&lt;/p&gt;

&lt;p&gt;Regarding key revocation: With the centralization resulting from a limited number of trusted certificate issuers (my Mac OS X system keychain lists about 150 trusted root CAs), certificate revocation in the form of certificate revocation lists (CRLs) becomes feasible. A &lt;a href=&quot;http://en.wikipedia.org/wiki/Certificate_revocation_list&quot;&gt;CRL&lt;/a&gt; is a list of serial numbers of certificates that the CA has revoked. When a CA issues a certificate, it includes the location of this CRL. When a client needs to verify a certificate, it can check if it is on the list of revoked certificates.&lt;/p&gt;

&lt;p&gt;For this setup to be useful, the list needs to be updated frequently. On Mac OS X, there’s a daemon called &lt;a href=&quot;http://developer.apple.com/DOCUMENTATION/DARWIN/Reference/ManPages/man1/ocspd.1.html&quot;&gt;ocspd&lt;/a&gt; that does just that. Its name already suggests that it also provides support for an alternative to CRLs, the &lt;a href=&quot;http://en.wikipedia.org/wiki/Online_Certificate_Status_Protocol&quot;&gt;Online Certificate Status Protocol (OCSP)&lt;/a&gt;. With OCSP, the client doesn’t download a potentially large list from the CA’s servers from time to time. Instead, it asks specifically about the validity of one particular certificate that it needs to check in real-time. This results in up-to-date validity information and reduces network and storage requirements, a benefit especially on mobile devices.&lt;/p&gt;

&lt;p&gt;&lt;img class=&quot;screenshot&quot; alt=&quot;Mac OS X ocspd Daemon&quot; src=&quot;/images/blog/2009-01-26-macosx-ocspd.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Other things like validity periods, mandatory attributes etc. are not only possible but actively enforced by the issuing CA according to its policies.&lt;/p&gt;

&lt;h2&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;Of these models, only the hierarchical trust model is considered a &lt;a href=&quot;http://en.wikipedia.org/wiki/Public_key_infrastructure&quot;&gt;Public Key Infrastructure (PKI)&lt;/a&gt;, so that’s what people refer to when they talk about PKI.&lt;/p&gt;

&lt;p&gt;The technical standard in use for this model on the Internet today is &lt;a href=&quot;http://en.wikipedia.org/wiki/X.509&quot;&gt;X.509&lt;/a&gt;, and more specifically the &lt;a href=&quot;http://en.wikipedia.org/wiki/IETF&quot;&gt;IETF&lt;/a&gt;’s variant PKIX.&lt;/p&gt;

&lt;p&gt;The next part in this series, part 3, gets back to the practical technical level and shows you how you can inspect and create X.509 certificates with the OpenSSL toolkit.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Developer/?permalink=OpenSSL-Public-Key-and-PKI-Crash-Course-Part-2-4.html</guid>
			<pubDate>Sun, 25 Jan 2009 21:47:18 +0100</pubDate>
                    </item>
        	            <item>
            <title>MS Word 2008 Pleasant Surprises</title>
            <!--<link>http://www.entropy.ch/blog/Mac+OS+X/?permalink=MS-Word-2008-Pleasant-Surprises.html</link>-->
            <link>http://www.entropy.ch/blog/Mac+OS+X/2009/01/20/MS-Word-2008-Pleasant-Surprises.html</link>
            <description>&lt;p&gt;Microsoft delighted me several times today.&lt;/p&gt;

&lt;p&gt;First I realized that Word 2008 &lt;em&gt;finally&lt;/em&gt; lets me place PDF images in Word files, and when I print the document using the OS X “Print to PDF” feature, the placed PDF images are properly embedded as vector images in the final PDF and not as bitmaps. Yessss!!! :-).&lt;/p&gt;

&lt;p&gt;I’m not sure but I think this is new in Word 2008 and it’s major news for me. I think EPS also didn’t work in previous versions, they were output as bitmaps. I can now finally place logos and diagrams into my technical documents and have them preserved as high quality vector images in the final output.&lt;/p&gt;

&lt;p&gt;This is a page of a Word document with a placed PDF diagram at 2000% magnification in Preview:&lt;/p&gt;

&lt;p&gt;&lt;img class=&quot;screenshot&quot; alt=&quot;Microsoft Word 2008 Vector PDF Output&quot; src=&quot;/images/blog/2009-01-20-ms-word-2008-vector-pdf.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Unfortunately it’s still not possible to transform the document’s heading structure into PDF bookmarks, which is essential for long documents.&lt;/p&gt;

&lt;p&gt;The second pleasant surprise was the &lt;a href=&quot;http://go.microsoft.com/fwlink/?LinkId=135617&quot;&gt;keyboard short cut list for Word 2008&lt;/a&gt; on the Microsoft website. I wanted a hardcopy, but looking at the page’s two-column layout I thought that it would be hard to get a nice printout from that page:&lt;/p&gt;

&lt;p&gt;&lt;img class=&quot;screenshot&quot; alt=&quot;Microsoft Word 2008 Keyboard Shortcut List - Web&quot; src=&quot;/images/blog/2009-01-20-ms-word-2008-keyboard-shortcuts-web.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;But it turns out that Microsoft thought about that and added a &lt;a href=&quot;http://www.w3.org/TR/CSS2/media.html&quot;&gt;print media CSS stylesheet&lt;/a&gt;. It suppresses all of the interactive stuff that’s useless in print, producing in a very printer-friendly page:&lt;/p&gt;

&lt;p&gt;&lt;img class=&quot;screenshot&quot; alt=&quot;Microsoft Word 2008 Keyboard Shortcut List - Print&quot; src=&quot;/images/blog/2009-01-20-ms-word-2008-keyboard-shortcuts-print.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Not rocket science, I know, but nice when somebody thinks about it and makes online help so much more useful by using this feature.&lt;/p&gt;

&lt;p&gt;Lastly, it appears that Word now notices when I move an open document in the Finder and updates the window title and saves to the new location from that point on. Unless I am mistaken, this is also new in Word 2008.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Mac+OS+X/?permalink=MS-Word-2008-Pleasant-Surprises.html</guid>
			<pubDate>Tue, 20 Jan 2009 15:34:24 +0100</pubDate>
                    </item>
        	            <item>
            <title>Google Custom Search Engine for Mac OS X Developers</title>
            <!--<link>http://www.entropy.ch/blog/Developer/?permalink=Google-Custom-Search-Engine-for-Mac-OS-X-Developers.html</link>-->
            <link>http://www.entropy.ch/blog/Developer/2009/01/17/Google-Custom-Search-Engine-for-Mac-OS-X-Developers.html</link>
            <description>&lt;p&gt;&lt;a href=&quot;http://www.google.com/coop/cse/&quot;&gt;Google Custom Search Engine&lt;/a&gt; allows you to set up search engines with a narrow focus on specialized topics. It features powerful search options and match patterns that let you specify precisely what should and should not end up in the search results.&lt;/p&gt;

&lt;p&gt;I set up a custom search engine covering web sites, blogs and mailing list archives related to Mac OS X software development and gave it the following short, easy to remember link:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://bit.ly/macdev&quot;&gt;http://bit.ly/macdev&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Try it out right here with something Mac OS X related, for example “IKImageBrowserView”:&lt;/p&gt;

&lt;form action=&quot;http://www.google.com/cse&quot; id=&quot;cse-search-box&quot;&gt;
  &lt;div&gt;
    &lt;input type=&quot;hidden&quot; name=&quot;cx&quot; value=&quot;003121735520996018220:_bu0g4hqtke&quot; /&gt;
    &lt;input type=&quot;hidden&quot; name=&quot;ie&quot; value=&quot;UTF-8&quot; /&gt;
    &lt;input id=&#39;google_custom_search_engine_query&#39; type=&quot;text&quot; name=&quot;q&quot; size=&quot;31&quot; /&gt;
    &lt;input type=&quot;submit&quot; name=&quot;sa&quot; value=&quot;Search&quot; /&gt;
  &lt;/div&gt;
&lt;/form&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;http://www.google.com/coop/cse/brand?form=cse-search-box&amp;lang=en&quot;&gt;&lt;/script&gt;

&lt;p&gt;The search engine has “Refinements” to focus on results of a particular type, such as reference documentation, mailing list postings etc.:&lt;/p&gt;

&lt;img class=&quot;screenshot&quot; alt=&quot;Google Custom Search Engine for Mac Developers - Refinements&quot; src=&quot;/images/blog/2009-01-17-google-custom-search-macdev-refinements.png&quot; /&gt;

&lt;h2&gt;Usage&lt;/h2&gt;

&lt;h3&gt;Bookmarklet&lt;/h3&gt;

&lt;p&gt;For frequent use, here is a &lt;a href=&quot;http://en.wikipedia.org/wiki/Bookmarklet&quot;&gt;bookmarklet&lt;/a&gt;:

&lt;p&gt;&lt;a style=&#39;padding: 2px; border: 1px solid #ccc;&#39; href=&quot;javascript:x=escape(getSelection());window.location=&#39;http://www.google.com/cse?cx=003121735520996018220:_bu0g4hqtke&amp;ie=UTF-8&amp;sa=Search&amp;q=&#39;+x;&quot;&gt;Mac Dev Search&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Drag it to your browser’s bookmarks bar:&lt;/p&gt;

&lt;img class=&quot;screenshot&quot; alt=&quot;Google Custom Search Engine for Mac Developers - Bookmarklet Installation&quot; src=&quot;/images/blog/2009-01-17-google-custom-search-macdev-bookmarklet.png&quot; /&gt;

&lt;p&gt;Then select some text on a web page and click the bookmarklet button you created to search for the text in the Mac development search engine.&lt;/p&gt;

&lt;h3&gt;LaunchBar/Quicksilver etc.&lt;/h3&gt;

&lt;p&gt;If you use an application launcher such as LaunchBar or QuickSilver, you can define a search template. In &lt;a href=&quot;http://www.obdev.at/products/launchbar/&quot;&gt;LaunchBar&lt;/a&gt; I use this search template with a name/abbreviation of “macdev”:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;http://www.google.com/cse?cx=003121735520996018220%3A_bu0g4hqtke&amp;ie=UTF-8&amp;sa=Search&amp;q=*&lt;/pre&gt;

&lt;h3&gt;Embed&lt;/h3&gt;

&lt;p&gt;You can embed the search box into your own pages. Here’s Google’s code do do that:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;&amp;lt;form action=&quot;http://www.google.com/cse&quot; id=&quot;cse-search-box&quot;&gt;
  &amp;lt;div&gt;
    &amp;lt;input type=&quot;hidden&quot; name=&quot;cx&quot; value=&quot;003121735520996018220:_bu0g4hqtke&quot; /&gt;
    &amp;lt;input type=&quot;hidden&quot; name=&quot;ie&quot; value=&quot;UTF-8&quot; /&gt;
    &amp;lt;input type=&quot;text&quot; name=&quot;q&quot; size=&quot;31&quot; /&gt;
    &amp;lt;input type=&quot;submit&quot; name=&quot;sa&quot; value=&quot;Search&quot; /&gt;
  &amp;lt;/div&gt;
&amp;lt;/form&gt;
&amp;lt;script type=&quot;text/javascript&quot; src=&quot;http://www.google.com/coop/cse/brand?form=cse-search-box&amp;amp;lang=en&quot;&gt;&lt;/script&gt;
&lt;/pre&gt;



&lt;h2&gt;Coverage&lt;/h2&gt;

&lt;p&gt;The configuration of the sites it covers currently looks like this:&lt;/p&gt;

&lt;img class=&quot;screenshot&quot; alt=&quot;Google Custom Search Engine for Mac Developers - Site Configuration&quot; src=&quot;/images/blog/2009-01-17-google-custom-search-macdev-sites.png&quot; /&gt;

&lt;p&gt;Let me know if you know additional useful sites that the custom search should cover.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Developer/?permalink=Google-Custom-Search-Engine-for-Mac-OS-X-Developers.html</guid>
			<pubDate>Sat, 17 Jan 2009 12:55:00 +0100</pubDate>
                    </item>
        	            <item>
            <title>OpenSSL, Public Key and PKI Crash Course, Part 1/4</title>
            <!--<link>http://www.entropy.ch/blog/Developer/?permalink=OpenSSL-Public-Key-and-PKI-Crash-Course-Part-1-4.html</link>-->
            <link>http://www.entropy.ch/blog/Developer/2009/01/11/OpenSSL-Public-Key-and-PKI-Crash-Course-Part-1-4.html</link>
            <description>&lt;p&gt;At &lt;a href=&quot;http://www.futurelab.ch&quot;&gt;work&lt;/a&gt; I recently gave a presentation about the practical aspects of public key cryptography with the &lt;a href=&quot;http://www.openssl.org/&quot;&gt;OpenSSL toolkit&lt;/a&gt;. I showed many &lt;code&gt;openssl&lt;/code&gt; command line examples and when I was asked for a transcript I decided to expand the material and publish it here in the hope that it’s useful for others too.&lt;/p&gt;

&lt;p&gt;If you see broken examples or broken English, please let me know.&lt;/p&gt;

&lt;p&gt;Thanks to Kaspar Brand for reviewing the material and providing additional information and links.&lt;/p&gt;

&lt;p&gt;There are four parts covering these major topics:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Part 1: Public Key Cryptography&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.entropy.ch/blog/Developer/2009/01/25/OpenSSL-Public-Key-and-PKI-Crash-Course-Part-2-4.html&quot;&gt;Part 2: Public Key Infrastructure (PKI)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Part 3: Inspecting and Creating X.509 Certificates&lt;/li&gt;
&lt;li&gt;Part 4: OpenSSL Bag of Tricks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is part 1, about Public Key Cryptography. This part shows how to create RSA private and public keys and then use those keys to encrypt/decript and sign/verify information with &lt;code&gt;openssl&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This assumes that you know what public key cryptography is about. If you don’t, read the &lt;a href=&quot;http://en.wikipedia.org/wiki/Public-key_cryptography&quot;&gt;Wikipedia article&lt;/a&gt;, especially the &lt;a href=&quot;http://en.wikipedia.org/wiki/Public-key_cryptography#A_postal_analogy&quot;&gt;postal analogy&lt;/a&gt;. Wikipedia summarizes:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;i&gt;&lt;b&gt;Public-key cryptography&lt;/b&gt;&lt;/i&gt; is a method for secret communication between two parties without requiring an initial exchange of secret keys. It can also be used to create &lt;a href=&quot;http://en.wikipedia.org/wiki/Digital_signature&quot; title=&quot;Digital signature&quot;&gt;digital signatures&lt;/a&gt;. Public key cryptography is a fundamental and widely used technology, and enables secure transmission of information on the Internet.&lt;/p&gt;

&lt;p&gt;It is also known as &lt;b&gt;asymmetric cryptography&lt;/b&gt; because the key used to encrypt a message differs from the key used to decrypt it. In public key cryptography, a user has a pair of cryptographic keys—a &lt;b&gt;public key&lt;/b&gt; and a &lt;b&gt;private key&lt;/b&gt;. The private key is kept secret, while the public key may be widely distributed. Messages are encrypted with the recipient&#39;s public key and can only be decrypted with the corresponding private key. The keys are related mathematically, but the private key cannot be practically derived from the public key.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;Creating Keys&lt;/h2&gt;

&lt;p&gt;So we need to create a key pair and we start with the private key.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;openssl&lt;/code&gt; command line utility provides a &lt;em&gt;lot&lt;/em&gt; of functionality. To keep it manageable, this functionality is broken down into various subcommands. The subcommand to create an RSA private key is &lt;code&gt;genrsa&lt;/code&gt;. In its simplest form, it works without parameters:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;openssl genrsa&lt;/pre&gt;

&lt;pre class=&quot;code&quot;&gt;Generating RSA private key, 512 bit long modulus
....++++++++++++
.++++++++++++
e is 65537 (0x10001)
-----BEGIN RSA PRIVATE KEY-----
MIIBPAIBAAJBALWv2VcerryVqaj0AZ/tTLUa3L+sf/CVl27gul4l5B/F/FbjpYB1
4HOuewKCXqJqUiNJechliFsi7XqWedOta4MCAwEAAQJBAIaiwic6GHitW2VVNGMD
4WUPe+gZ91EcOXSz2cdswsj7l+LrjiNkOVClQANfZiP/d9YSFsk8WzyHnTtlbgun
VeECIQDvnwNdWJ6Q3y+46s+d2FSe1P22lb5qMuSQYUhDLqZScwIhAMIbFFHW2eKB
3mRCqY6oSY9pK1r6QSssL/QGuIMKe26xAiEA7JgAFXn7zqVgFGBcsMi5/L3m6RH/
mhI4FcrIM/VqqbsCIEgklGrOdfDv395XwHlbJuv8ZLbNqIcJR1FlZhKeRL4hAiEA
nehFFepANrjgjPU6iqM/5T6454mqDpQmOQzZHlDh+Ys=
-----END RSA PRIVATE KEY-----&lt;/pre&gt;

&lt;p&gt;That outputs the private key in a plain text format called PEM on the console. We’ll want it in a file instead:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;openssl genrsa &gt; private-key.pem&lt;/pre&gt;

&lt;p&gt;Another &lt;code&gt;openssl&lt;/code&gt; subcommand called &lt;code&gt;rsa&lt;/code&gt;, and specifically its option &lt;code&gt;-text&lt;/code&gt;, lets us inspect what exactly is in the private key:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;openssl rsa -text &amp;lt; private-key.pem&lt;/pre&gt;

&lt;pre class=&quot;code&quot;&gt;Private-Key: (512 bit)
modulus:
    00:bc:42:41:6e:cd:07:28:0d:0e:27:dc:79:e4:0e:
    fc:9e:f8:74:5d:db:42:82:c1:f9:97:9a:9a:0b:d2:
    2d:76:e0:04:74:34:5b:de:c6:67:58:47:5d:12:84:
    e6:a1:d8:dd:94:67:71:d7:2a:00:4d:27:67:68:5f:
    ef:a3:94:e8:e9
publicExponent: 65537 (0x10001)
privateExponent:
    77:dd:b7:cb:d4:bf:b9:c0:96:42:cb:1e:d1:16:b9:
    c2:7e:6f:99:53:02:06:3f:7b:ac:0b:c4:09:c2:c9:
    2f:e6:5a:a3:e3:a7:0c:bd:ef:59:00:55:8c:79:14:
    35:82:3e:4f:41:0c:5a:cf:e7:b2:09:9f:ba:3a:7c:
    be:a7:b0:01
[...]&lt;/pre&gt;

&lt;p&gt;The private key is sensitive information so it shouldn’t lie around on the file system unprotected like that. &lt;code&gt;openssl&lt;/code&gt;’s &lt;code&gt;-des3&lt;/code&gt; option encrypts the key with a password:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;openssl genrsa -des3 &gt; private-key.pem&lt;/pre&gt;

&lt;pre class=&quot;code&quot;&gt;Generating RSA private key, 512 bit long modulus
......++++++++++++
....++++++++++++
e is 65537 (0x10001)
Enter pass phrase:
Verifying - Enter pass phrase:&lt;/pre&gt;

&lt;p&gt;The key now looks like this:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,93CD4E9C3BD610A5

/gwqg7Vp+y9mN/J8qyzOxBUX5lnVMpwYBe/EMPDcC1KDSj//vSfcRzta/lxT8MPS
7JA+wYajxTNnRoGZCip73GgtfHjiHpf7LlNPHTinDgD0La8ZmNET507ciRmOgRCZ
y8+mmaFUcsgBmn5e/mtFJbFnbv/MCwIEpQ0ootfCgwoqicKG6y+D/3qoR1TxTUTE
sV00+n7BN6s7yZftmaXZANVz8DBbhnAgOQZBHJkAQ0vedIlL2wOWm8MdOUOxeGTY
Y+AzaOy9FJg6rGdiuB4xGKUUXzrVw8ophD2q3cK+ha4RxQiWPzrhLZsjcffXMLEF
U3FLG+ivqDd+v1EgpO213kbPaFH0IjzoWsR8vwEjY6N9T8wYha0mEfAM2HDL2kuk
gohlHnrkFdZMbuqc8jQ6cAhcFrRgzAM+8Bm+yc4Duvw=
-----END RSA PRIVATE KEY-----&lt;/pre&gt;

&lt;p&gt;Note the password prompt and the additional header lines indicating the encryption.&lt;/p&gt;

&lt;p&gt;With this protection, &lt;code&gt;openssl&lt;/code&gt; asks for the password every time the key is used. For example, the &lt;code&gt;rsa -text&lt;/code&gt; command from above now behaves like this:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;openssl rsa -text &amp;lt; private-key.pem&lt;/pre&gt;

&lt;pre class=&quot;code&quot;&gt;Enter pass phrase:
Private-Key: (512 bit)
[...]&lt;/pre&gt;

&lt;p&gt;Sometimes there’s a reason to store the keys unencrypted, for example when systems like a web server need to be able to load the key automatically. For clarity, I also omitted the encryption in the examples below.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;genrsa&lt;/code&gt;’s default settings generate private keys with 512 bits but more would be better. To generate longer keys, add the number of bits as argument:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;openssl genrsa 1024 &gt; private-key.pem&lt;/pre&gt;

&lt;p&gt;This key is longer:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;-----BEGIN RSA PRIVATE KEY-----
MIICXgIBAAKBgQDLVqzJbJMPxpUnUlhv8x1qd6dM2peHYpP3PbTpxBFYXmfPzqMt
XYpdpcLPHP/DGuabkWcfUtlfBuqFy/03aVI24xchYUAvuiJsfPbLErufFfYwUdW/
Bp0xIp/pptjzyOsx86FCroGQ/8VWBnMkmeG39i8sfXYSQt5Jptr1OnSJoQIDAQAB
AoGAcrO1Cnalyothzemkm5oPqORQSokwWx2fjCOR7yA8DJZMhyvwXoHasJL1/nFE
UWHWXkE6Y7APkIxNNSZp850E05G42IEYuvEDYp74WKL9Cf+db4t/JJeR+3Vcrila
poMhkAevuM4QWPmacTu58B2CiJI5GiQxf7w2m4Qm2EtMpuUCQQDvYDmOYRwcZF4Z
ScBeKCI8Atekr7gmfAo83IxRJ4goLtp12/ou6frIFD/dG9dLkWCtTMcD16Bs8GjI
Mvo8fkP/AkEA2XXBl71VCu+iAEysVwL0fDiyRNRs4rOWvH2oHxmP7cQKetDElX50
6ro9/4yU9bbnBddrDeoQKFS9dVl1O66yXwJBAIn9K1CjNEQ9q2zice0VL57ueIbr
8LjmmjQ5Yv3JTxjy4WY9l7wBj1pVKfd4/CQIuvVLpBHX9Be4gn6dvFiw5NsCQQDA
74tdt6vWUhonrd9SK9sCw8LW8qnQ0YmxnsMlJKbgS4kIwmVIRbQx9h+/tdkL0MVU
F3ZyF/NR9S1LCp3K4Ap9AkEA4Ee88r/hkRih3C2sajIpXire7h7rhry5NaNzND7B
q2FpVqaJfoJvhsTIX8ju/pzF6WbVL6VjrY4OJ3miLWGBEg==
-----END RSA PRIVATE KEY-----&lt;/pre&gt;

&lt;p&gt;Now we’ll extract the public key into a separate file, again with the &lt;code&gt;rsa&lt;/code&gt; subcommand:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;openssl rsa -pubout &amp;lt; private-key.pem&lt;/pre&gt;

&lt;pre class=&quot;code&quot;&gt;-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDIxa9c7tYDvCL5ZCk5FGT2Zlo2
nYLEpX1KocTjfggXjrnL6+92HZMJs2jcbxp6Q4lyMPhlGP3t7/DCBpXM39v7w3U7
HRy0GAxa7tWICCnvXZRoI2BKF3bZDuWSeNyHXJtkJwnId6udn7eLj2q5TdTxc8On
JpCKjheJ/xs9fFHmSwIDAQAB
-----END PUBLIC KEY-----&lt;/pre&gt;

&lt;p&gt;And again we’ll want this in a file:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;openssl rsa -pubout &amp;lt; private-key.pem &gt; public-key.pem&lt;/pre&gt;

&lt;p&gt;A tip regarding &lt;code&gt;openssl&lt;/code&gt;’s man pages: Each subcommand has its own manpage, so to get information about &lt;code&gt;genrsa&lt;/code&gt; you would type &lt;code&gt;man genrsa&lt;/code&gt; and not &lt;code&gt;man openssl&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;Using the keys&lt;/h2&gt;

&lt;p&gt;Now we have a key pair. As noted above, this allows us to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;encrypt and decrypt a message to make sure that it is not read in transit&lt;/li&gt;
&lt;li&gt;sign and verify a message to make sure that it is not altered in transit&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is possible to combine these operations, ensuring that a message is neither read nor altered in transit.&lt;/p&gt;

&lt;h3&gt;Encryption and Decryption&lt;/h3&gt;

&lt;p&gt;To send an encrypted message, the sender encrypts the message with the recipient’s public key (what we stored in the file &lt;code&gt;public-key.pem&lt;/code&gt; above). How exactly the sender gets this key is not discussed here but it is important and the topic of the next part in this series, “Part 2: Public Key Infrastructure”. For now let’s assume that sender and recipient met in person and exchanged their public keys.&lt;/p&gt;

&lt;p&gt;The recipient uses his or her private key (what we stored in the file &lt;code&gt;private-key.pem&lt;/code&gt; above) to decrypt the message.&lt;/p&gt;

&lt;p&gt;Our example message content to be protected is the string “Alice in Wonderland”, stored in the file &lt;code&gt;test.txt&lt;/code&gt;:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;echo &quot;Alice in Wonderland&quot; &gt; test.txt&lt;/pre&gt;

&lt;p&gt;Let’s encrypt this content. The &lt;code&gt;openssl&lt;/code&gt; subcommand is &lt;code&gt;rsautl&lt;/code&gt;:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;openssl rsautl -encrypt -pubin -inkey public-key.pem &amp;lt; test.txt &gt; test-encrypted.txt&lt;/pre&gt;

&lt;p&gt;&lt;code&gt;test-encrypted.txt&lt;/code&gt; now contains the encrypted message as unreadable binary data. This block of data is what’s sent over an insecure channel to the recipient.&lt;/p&gt;

&lt;p&gt;The recipient also uses &lt;code&gt;rsautl&lt;/code&gt; to decrypt the message, using the private key:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;openssl rsautl -decrypt -inkey private-key.pem &amp;lt; test-encrypted.txt&lt;/pre&gt;

&lt;p&gt;this outputs&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;Alice in Wonderland&lt;/pre&gt;

&lt;p&gt;What if we want to send a much longer message? Lets’s try the list of English words in &lt;code&gt;/usr/share/dict/words&lt;/code&gt;:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;openssl rsautl -encrypt -pubin -inkey public-key.pem &amp;lt; /usr/share/dict/words &gt; test-encrypted.txt&lt;/pre&gt;

&lt;p&gt;This fails with a “data too large” message as &lt;code&gt;rsautl&lt;/code&gt; can’t encrypt arbitrary amounts of data:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;RSA operation error
37951:error:0406D06E:rsa routines:RSA_padding_add_PKCS1_type_2:data too large for key size:rsa_pk1.c:151:&lt;/pre&gt;

&lt;p&gt;To handle this, we use a clever combination of the public key encryption we already have with a &lt;a href=&quot;http://en.wikipedia.org/wiki/Symmetric-key_algorithm&quot;&gt;symmetric key&lt;/a&gt; algorithm, for example the &lt;a href=&quot;http://en.wikipedia.org/wiki/Advanced_Encryption_Standard&quot;&gt;AES&lt;/a&gt; &lt;a href=&quot;http://en.wikipedia.org/wiki/Block_cipher&quot;&gt;block cipher&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We first encrypt the data with the symmetric key algorithm, which can handle large amounts of data. Such an algorithm requires a key too, and sender and recipient use the same key to encrypt and decrypt the message, which is why it’s called symmetric. Normally sender and recipient need to agree on a shared secret key before exchanging messages, but in this use case, the sender just makes up a random encryption key for the symmetric algorithm and then encrypts the message content with the key. Next, the sender encrypts the made-up, random key with the recipient’s public key. The symmetric algorithm key is small enough (comparable to our “Alice in Wonderland” in size) that &lt;code&gt;rsautl&lt;/code&gt; can process it.&lt;/p&gt;

&lt;p&gt;The message we send to the recipient consists of the large data block encrypted (symmetrically) with the random key and the (asymmetrically) encrypted random key itself. Both are unreadable to someone intercepting the message in transit.&lt;/p&gt;

&lt;p&gt;This combination of symmetric and public key encryption has another advantage: Processing the same amount of data with a public key algorithm is much more computationally intensive than with a symmetric key algorithm. Many encrypted real-world communications protocols such as &lt;a href=&quot;http://en.wikipedia.org/wiki/Secure_Sockets_Layer&quot;&gt;SSL/TLS&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/Smime&quot;&gt;S/MIME&lt;/a&gt; use this combination.&lt;/p&gt;

&lt;p&gt;Let’s work through an example. First we decide on (make up) a random key for the symmetric encryption and stick that key into a file. We’ll use the incredibly hard to guess “foobar”:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;echo -n foobar &gt; test.txt&lt;/pre&gt;

&lt;p&gt;Then we encrypt the large word list file with the AES cipher using this password and store the encrypted data in another file:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;openssl enc -aes-128-cbc -salt -pass file:test.txt &amp;lt; /usr/share/dict/words &gt; words.dat&lt;/pre&gt;

&lt;p&gt;(Technically, “foobar” is not the key but a password from which &lt;code&gt;openssl&lt;/code&gt; derives the actual key used by the algorithm.)&lt;/p&gt;

&lt;p&gt;Now we asymmetrically encrypt the small password file with the recipient’s public key. You already know how to do this, because it is &lt;em&gt;exactly&lt;/em&gt; what we used above:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;openssl rsautl -encrypt -pubin -inkey public-key.pem &amp;lt; test.txt &gt; test-encrypted.txt&lt;/pre&gt;

&lt;p&gt;It’s exactly the same except that instead of “Alice in Wonderland” we encrypt “foobar”.&lt;/p&gt;

&lt;p&gt;We now have the two parts that together make up the protected message, they are in the two files &lt;code&gt;words.dat&lt;/code&gt; and &lt;code&gt;test-encrypted.txt&lt;/code&gt;. These two have to be sent to the recipient, and if someone intercepts them in transit, they are useless.&lt;/p&gt;

&lt;p&gt;For the recipient of the message, the first step is to decrypt the symmetric encryption key. Again, you already know how this works because it is identical to the &lt;code&gt;rsautl&lt;/code&gt; example above:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;openssl rsautl -decrypt -inkey private-key.pem &amp;lt; test-encrypted.txt &gt; test.txt&lt;/pre&gt;

&lt;p&gt;&lt;code&gt;test.txt&lt;/code&gt; now contains “foobar” and we can use this to decrypt the word list:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;openssl enc -aes-128-cbc -d -pass file:test.txt &amp;lt; words.dat &gt; words.txt&lt;/pre&gt;


&lt;p&gt;You might be wondering why we don’t simply use the symmetric algorithm directly to exchange data, instead of going to such lengths to combine the two methods. The reason is that asymmetric keys have desirable properties regarding key distribution and ownership, especially when encryption is used on a large scale, such as between millions of users on the Internet. The Wikipedia article linked above has more information.&lt;/p&gt;



&lt;h3&gt;Signing and Verifying&lt;/h3&gt;

&lt;p&gt;Here’s a look at the other operation we can perform with a key pair, signing and verifying messages. As noted above, this lets the recipient determine if the message has been altered in transit.&lt;/p&gt;

&lt;p&gt;As with encryption, sender and recipient must have exchanged their respective public keys before they can exchange signed messages. In this use case, the sender uses his or her own &lt;em&gt;private&lt;/em&gt; key to sign the message.&lt;/p&gt;

&lt;p&gt;Signing is actually encryption with reversed keys; encryption is performed using the private key and decryption using the public key. Here’s an example of this fact, with some help from Alice again:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;echo &quot;Alice in Wonderland&quot; &gt; test.txt&lt;/pre&gt;

&lt;p&gt;&lt;code&gt;rsautl&lt;/code&gt; is also the subcommand for signing and verifying:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;openssl rsautl -sign -inkey private-key.pem &amp;lt; test.txt &gt; signed.dat&lt;/pre&gt;

&lt;p&gt;&lt;code&gt;signed.dat&lt;/code&gt; now contains the signature data, which is the message data “Alice in Wonderland” encrypted with the private key. It’s unreadable binary data.&lt;/p&gt;

&lt;p&gt;Anyone with the public key can decrypt this data with &lt;code&gt;rsautl&lt;/code&gt;’s &lt;code&gt;-verify&lt;/code&gt; option:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;openssl rsautl -verify -inkey public-key.pem -pubin &amp;lt; signed.dat&lt;/pre&gt;

&lt;p&gt;This yields:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;Alice in Wonderland&lt;/pre&gt;

&lt;p&gt;Now let’s consider how this helps us. Using the keys this way means that &lt;em&gt;everyone&lt;/em&gt; can read the message, as the public key is, well, public. So how can this possibly be useful?&lt;/p&gt;

&lt;p&gt;It’s useful because the recipient being able to successfully decrypt the message using the sender’s public key also means something else: It means that the message in its decrypted form &lt;em&gt;must&lt;/em&gt; have been sent by the sender who gave us the public key (because only the sender has the related private key), and the message must have been sent exactly the way it came out of the decryption process. It tells us unambiguously that the message was sent by who we think sent it, and that it has arrived &lt;em&gt;exactly&lt;/em&gt; the way it was sent.&lt;/p&gt;

&lt;p&gt;You saw during the discussion of encryption/decryption that the amount of data that can be processed directly with the asymmetric algorithm is limited, and our little “Alice in Wonderland” message was short enough but most real-world messages are not. If we want to transmit our English word list as a signed message, it won’t work because the data is too big:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;openssl rsautl -sign -inkey private-key.pem &amp;lt; /usr/share/dict/words &gt; signed.dat&lt;/pre&gt;

&lt;pre class=&quot;code&quot;&gt;RSA operation error
79490:error:0406C06E:rsa routines:RSA_padding_add_PKCS1_type_1:data too large for key size:rsa_pk1.c:73:&lt;/pre&gt;

&lt;p&gt;Like with encryption/decryption, we can use a clever combination of the public key algorithms with a second technique to solve this problem. In this case the second technique is a cryptographic hash function. If you don’t know what a hash function is, take a look at the &lt;a href=&quot;http://en.wikipedia.org/wiki/Cryptographic_hash_function&quot;&gt;Wikipedia description&lt;/a&gt; first. It says:&lt;/p&gt;

&lt;blockquote&gt;

&lt;p&gt;A &lt;b&gt;cryptographic hash function&lt;/b&gt; is a deterministic procedure that takes an arbitrary block of data and returns a fixed-size bit string, the &lt;b&gt;hash value&lt;/b&gt;, such that an accidental or intentional change to the data will almost certainly change the hash value. In many contexts, especially telecommunications, the data to be encoded is often called the &quot;message&quot;, and the hash value is also called the &lt;b&gt;message digest&lt;/b&gt; or simply &lt;b&gt;digest&lt;/b&gt;.&lt;/p&gt;

&lt;p&gt;The ideal hash function has four main properties: it is easy to compute the hash for any given data, it is extremely difficult to construct a text that has a given hash, it is extremely difficult to modify a given text without changing its hash, and it is extremely unlikely that two different messages will have the same hash. These requirements call for the use of advanced cryptography techniques, hence the name.&lt;/p&gt;

&lt;/blockquote&gt;

&lt;p&gt;Our English word list is the “arbitrary block of data” mentioned in the description.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;openssl&lt;/code&gt; has the &lt;code&gt;dgst&lt;/code&gt; subcommand for cryptographic hash functions. We choose the SHA1 algorithm:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;openssl dgst -sha1 &amp;lt; /usr/share/dict/words&lt;/pre&gt;

&lt;p&gt;The resulting digest:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;a7d455ffb810853b51dfd3613af24333ecc603e9&lt;/pre&gt;

&lt;p&gt;Adding (or changing) just a single letter to the word list results in a completely different digest, clearly indicating that the input data has changed:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;echo -n x &gt;&gt; /usr/share/dict/words
openssl dgst -sha1 &amp;lt; /usr/share/dict/words&lt;/pre&gt;

&lt;pre class=&quot;code&quot;&gt;20b920565a9351b259deb11acd6e12867dec8240&lt;/pre&gt;

&lt;p&gt;The message digest is always of the same fixed length, 20 bytes in the case of SHA1. This is short enough for the public key algorithms. This means that we now have all the pieces in place to sign arbitrarily large messages.&lt;/p&gt;

&lt;p&gt;The sender of the message begins by calculating the digest for the message data:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;openssl dgst -sha1 &amp;lt; /usr/share/dict/words &gt; digest.txt&lt;/pre&gt;

&lt;p&gt;The sender signs the digest with the private key:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;openssl rsautl -sign -inkey private-key.pem &amp;lt; digest.txt &gt; digest-signed.dat&lt;/pre&gt;

&lt;p&gt;The signed message to the recipient consists of two parts: The message payload, in this example the &lt;code&gt;/usr/share/dict/words&lt;/code&gt; file containing the word list, and the signed digest, &lt;code&gt;digest-signed.dat&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The recipient first reverses the signing operation, which if successful yields the digest of the payload data as determined by the sender:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;openssl rsautl -verify -inkey public-key.pem -pubin &amp;lt; digest-signed.dat &gt; digest-sender.txt&lt;/pre&gt;

&lt;p&gt;If this doesn’t work, the recipient already knows that something is wrong.&lt;/p&gt;

&lt;p&gt;Otherwise, the next step is to calculate the message digest of the message data, exactly the same way the sender did it:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;openssl dgst -sha1 &amp;lt; words &gt; digest-local.txt&lt;/pre&gt;

&lt;p&gt;If the two hash values in &lt;code&gt;digest-sender.txt&lt;/code&gt; and &lt;code&gt;digest-local.txt&lt;/code&gt; are identical, the recipient knows that the message arrived exactly as the sender sent it. If they differ, the message was altered in transit:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;diff digest-{sender,local}.txt&lt;/pre&gt;

&lt;pre class=&quot;code&quot;&gt;1c1
&amp;lt; a7d455ffb810853b51dfd3613af24333ecc603e9
---
&gt; d0b081cb449533c4c9ad83595c1b35a17f12e625
&lt;/pre&gt;


&lt;p&gt;Note: In my experience, it’s often a source of confusion that the key types are reversed for encryption/decryption (sender uses a public key, recipient uses a private key) and signing/verifying (sender uses a private key, recipient uses a public key), so think about this for a moment to keep it straight in your head...&lt;/p&gt;

&lt;p&gt;As a reward for making it all the way through this part, here’s a comic for you :-)&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://xkcd.com/538/&quot;&gt;&lt;img class=&quot;screenshot&quot; alt=&quot;xkcd security comic&quot; src=&quot;http://imgs.xkcd.com/comics/security.png&quot; /&gt;&lt;/img&gt;&lt;/a&gt;


&lt;h3&gt;What’s next&lt;/h3&gt;

&lt;p&gt;This part introduced the tools needed to exchange encrypted and signed messages. The &lt;a href=&quot;http://www.entropy.ch/blog/Developer/2009/01/25/OpenSSL-Public-Key-and-PKI-Crash-Course-Part-2-4.html&quot;&gt;next part&lt;/a&gt; will show the practical problems of public key exchange/distribution and how a Public Key Infrastructure helps with that problem.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Developer/?permalink=OpenSSL-Public-Key-and-PKI-Crash-Course-Part-1-4.html</guid>
			<pubDate>Sun, 11 Jan 2009 18:21:16 +0100</pubDate>
                    </item>
        	            <item>
            <title>Album Artwork Assistant 2.1</title>
            <!--<link>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Album-Artwork-Assistant-2-1.html</link>-->
            <link>http://www.entropy.ch/blog/Mac+OS+X/2009/01/01/Album-Artwork-Assistant-2-1.html</link>
            <description>&lt;p&gt;I released version 2.1 of &lt;a href=&quot;http://www.entropy.ch/software/macosx/album-artwork-assistant/&quot;&gt;Album Artwork Assistant&lt;/a&gt;, my Mac OS X application for finding iTunes album cover artwork on the web.&lt;/p&gt;

&lt;p&gt;This version lets you surf the web and pick images directly off web pages in an embedded web browser. This is useful if the image search doesn’t turn up suitable results and you have to hunt down the artwork. Watch this screencast to see how it works:&lt;/p&gt;

&lt;p&gt;&lt;a class=&#39;img&#39; href=&quot;http://www2.entropy.ch/video/album-artwork-assistant-web-search.swf&quot; target=&quot;_blank&quot;&gt;&lt;img alt=&quot;Album Artwork Assistant Web Search Feature Screencast&quot; src=&quot;/images/blog/2009-01-02-album-artwork-assistant-screencast-thumbnail.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are also some bug fixes and stability improvements, as listed in the &lt;a href=&quot;http://www.entropy.ch/software/macosx/album-artwork-assistant/release-notes.html#version-2.1&quot;&gt;release notes&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;For Developers&lt;/h2&gt;

&lt;p&gt;Here are some observations for Cocoa developers.&lt;/p&gt;

&lt;h3&gt;WebKit&lt;/h3&gt;

&lt;p&gt;First off, WebKit is a fantastic library, I have used it in many projects and it’s always a joy to use it.&lt;/p&gt;

&lt;p&gt;In this case I was impressed how easy it is to get information about and interact with the DOM elements loaded in a web view when the mouse cursor hovers over them. You get a &lt;a href=&quot;http://developer.apple.com/DOCUMENTATION/Cocoa/Reference/WebKit/Protocols/WebUIDelegate_Protocol/Reference/Reference.html#//apple_ref/occ/instm/NSObject/webView:mouseDidMoveOverElement:modifierFlags:&quot;&gt;delegate callback&lt;/a&gt; with a &lt;a href=&quot;http://developer.apple.com/DOCUMENTATION/Cocoa/Reference/WebKit/Classes/WebView_Class/Reference/Reference.html#//apple_ref/doc/uid/20001903-BBCHHFBA&quot;&gt;dictionary of useful information&lt;/a&gt; about the element. The dictionary content depends a bit on the type of the element. In the case of IMG elements, you even get the full URL of the image source, which is exactly what I needed in my application.&lt;/p&gt;

&lt;p&gt;This delegate method allows the application code to do very interesting interactive things with the web content rendered in the web view; think about all the cool stuff an application can do if it has full access to the structure of the web content and doesn’t just have to deal with it as a dumb bitmap.&lt;/p&gt;

&lt;p&gt;Another thing that’s very easy is to adapt the contextual menu contents when the user opens the menu over some DOM element.&lt;/p&gt;

&lt;p&gt;Both features are provided by the &lt;a href=&quot;http://developer.apple.com/DOCUMENTATION/Cocoa/Reference/WebKit/Protocols/WebUIDelegate_Protocol/Reference/Reference.html&quot;&gt;&lt;code&gt;WebUIDelegate&lt;/code&gt;&lt;/a&gt; protocol.&lt;/p&gt;

&lt;h3&gt;ImageKit&lt;/h3&gt;

&lt;p&gt;ImageKit flat out doesn’t work under garbage collection. See my &lt;a href=&quot;http://openradar.appspot.com/radar?id=2214&quot;&gt;bug report&lt;/a&gt; for the details. In short, old image objects stick around forever and don’t free the resources they use. More and more memory is consumed, but even worse, if you use the &lt;code&gt;IKImageBrowserNSURLRepresentationType&lt;/code&gt; image type and supply &lt;code&gt;http&lt;/code&gt; URLs, the dead objects will keep the HTTP socket open, quickly exhausting the available file descriptors.&lt;/p&gt;

&lt;p&gt;In my application I could work around the open sockets problem by loading the images myself and then passing raw image data instead of the image URL to ImageKit. But the memory consumption is still a problem, the memory usage of the application grows steadily with every image search. I hope this gets fixed by Apple.&lt;/p&gt;

&lt;h3&gt;NSError&lt;/h3&gt;

&lt;p&gt;Related the the previous issue, &lt;a href=&quot;http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSError_Class/Reference/Reference.html&quot;&gt;&lt;code&gt;NSError&lt;/code&gt;&lt;/a&gt;’s &lt;code&gt;localizedDescription&lt;/code&gt; method crashes if the file descriptor table is full. This is bad because you start getting &lt;code&gt;NSError&lt;/code&gt;s from many APIs precisely &lt;em&gt;when&lt;/em&gt; the file descriptor table is full. I &lt;a href=&quot;http://openradar.appspot.com/radar?id=2018&quot;&gt;filed a bug&lt;/a&gt; about this too.&lt;/p&gt;

&lt;h3&gt;Garbage Collection Debugging in GDB&lt;/h3&gt;

&lt;p&gt;The GDB commands &lt;code&gt;info gc-references&lt;/code&gt; and &lt;code&gt;info gc-roots&lt;/code&gt; are very useful to debug garbage collection-related problems (and it’s also interesting and educational to poke around with them).&lt;/p&gt;

&lt;p&gt;Here I hit a breakpoint and inspected the &lt;code&gt;images&lt;/code&gt; array:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;
(gdb) po images
&amp;lt;NSCFArray 0x107eb30&gt;(
&amp;lt;TestImageBrowserItem: 0x107df10&gt;,
&amp;lt;TestImageBrowserItem: 0x102dbf0&gt;,
...
&lt;/pre&gt;

&lt;p&gt;Let’s check out its first item:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;
(gdb) info gc-references 0x107df10
   0 Kind: stack   rc:   0  Address: 0xbfffee9c  Frame level: 0  Symbol: foo
warning: can&#39;t find class named `IKImageBrowserCell&#39; given by ObjC class object
   1 Kind: object  rc:   0  Address: 0x0106def0  Offset: 0x00000008  Class: IKImageBrowserCell
   2 Kind: object  rc:   0  Address: 0x0107b2a0  Offset: 0x00000020
warning: can&#39;t find class named `IKImageCellDatasourceProxy&#39; given by ObjC class object
   3 Kind: object  rc:   0  Address: 0x0108ca60  Offset: 0x00000004  Class: IKImageCellDatasourceProxy
&lt;/pre&gt;

&lt;p&gt;This shows that four locations in memory reference my image object. One is in a local variable &lt;code&gt;foo&lt;/code&gt; on the stack (the high address, with &lt;code&gt;Kind: stack&lt;/code&gt;), the remaining references are in other objects on the heap (the low addresses, with &lt;code&gt;Kind: object&lt;/code&gt;).

&lt;p&gt;In some situations it didn’t work for me, both commands would just hang forever without producing any output. One of them did produce output when I added a type cast in front of the object’s memory address:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;
(gdb) info gc-references (TestImageBrowserItem *)0x107df10
&lt;/pre&gt;
</description>
            <guid>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Album-Artwork-Assistant-2-1.html</guid>
			<pubDate>Thu, 1 Jan 2009 23:50:20 +0100</pubDate>
                    </item>
        	             <item>
            <title>Fedora 10 Appliance Operating System Distribution</title>
            <!--<link>http://www.entropy.ch/blog/?permalink=Fedora-10-Appliance-Operating-System-Distribution.html</link>-->
            <link>http://www.entropy.ch/blog/2008/12/25/Fedora-10-Appliance-Operating-System-Distribution.html</link>
            <description>&lt;p&gt;I had to set up a fresh Linux virtual machine for my &lt;a href=&quot;http://www.entropy.ch/blog/Mac+OS+X/2007/07/28/Juniper-Network-Connect-SSL-VPN-and-Virtualization.html&quot;&gt;Juniper SSL VPN games&lt;/a&gt; after losing the old one some time ago.&lt;/p&gt;

&lt;p&gt;Last time I used the Fedora distribution and it worked great, so I stuck with it. It’s now at version 10 and comes with a stripped-down variant called AOS, short for &lt;a href=&quot;http://thincrust.net/aos.html&quot;&gt;Appliance Operating System&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This AOS variant doesn’t have a GUI and is intended for appliances like gateways or web servers. It’s perfect for my VPN networking purpose because it is very small on disk, uses very little memory and boots quickly. In its original form it is not usable in VMware Fusion so I had to convert it to the VMware format with the &lt;a href=&quot;http://thincrust.net/tooling-conversion.html&quot;&gt;&lt;code&gt;virt-convert&lt;/code&gt; tool&lt;/a&gt; first.

&lt;p&gt;I put up the resulting VMware files for download here:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www2.entropy.ch/download/f10-i686-aos.zip&quot;&gt;http://www2.entropy.ch/download/f10-i686-aos.zip&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I also registered it in VMware’s &lt;a href=&quot;http://www.vmware.com/appliances/directory/63205&quot;&gt;Virtual Appliance Marketplace&lt;/a&gt; as a community upload.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/?permalink=Fedora-10-Appliance-Operating-System-Distribution.html</guid>
			<pubDate>Thu, 25 Dec 2008 00:52:38 +0100</pubDate>
                    </item>
        	             <item>
            <title>Public Transport Maps on the iPhone with Microsoft Seadragon</title>
            <!--<link>http://www.entropy.ch/blog/?permalink=Public-Transport-Maps-on-the-iPhone-with-Microsoft-Seadragon.html</link>-->
            <link>http://www.entropy.ch/blog/2008/12/15/Public-Transport-Maps-on-the-iPhone-with-Microsoft-Seadragon.html</link>
            <description>&lt;p&gt;I tried Microsoft’s first iPhone application “Seadragon Mobile” after reading about it on &lt;a href=&quot;http://daringfireball.net/linked/2008/12/14/seadragon&quot;&gt;Daring Fireball&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I always wanted a zoomable high resolution map of Zurich’s &lt;a href=&quot;http://vbz.ch&quot;&gt;VBZ public transport system&lt;/a&gt; on my iPhone. VBZ provides a &lt;a href=&quot;http://vbz.ch/vbz_opencms/opencms/vbz/deutsch/Fahrplan/Liniennetz/images/linien_zuerich_544.html&quot;&gt;vector PDF&lt;/a&gt; of the map, but rendering it directly on the device is too slow (but it &lt;em&gt;does&lt;/em&gt; render, which I think tells a lot about the progress of mobile devices). If I rasterize the PDF to a bitmap in a size that keeps the text readable, the built-in photo viewer as well as third party programs don’t handle the resulting big bitmap well.&lt;/p&gt;

&lt;p&gt;Today I tried this again with the Seadragon viewer. I rasterized the VBZ map PDF to a huge 10000 by 14000 pixel PNG file in Photoshop and ran that through Microsoft’s &lt;a href=&quot;http://blogs.msdn.com/expression/archive/2008/03/05/download-the-preview-of-the-deep-zoom-composer.aspx&quot;&gt;Deep Zoom Composer&lt;/a&gt;. I put the resulting 33MB Deep Zoom set on my web server at&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;http://www2.entropy.ch/deepzoom/vbz/dzc_output.xml&lt;/pre&gt;

&lt;p&gt;and added this URL to the application on the iPhone. Seadragon lets me start at the overview and zoom in all the way to a ridiculous magnification, as shown on the screenshots below.&lt;/p&gt;

&lt;p&gt;Zooming in and out and moving across the image is incredibly smooth. I also really like how the application completely restores the last state when I close and reopen it. So many other image viewers get this wrong!&lt;/p&gt;

&lt;p&gt;The only drawback is that this only works over the Internet. I wonder if I could somehow get this Deep Zoom set directory onto my iPhone’s file system and then use a &lt;code&gt;file:&lt;/code&gt; URL.&lt;/p&gt;

&lt;p&gt;&lt;img class=&quot;screenshot&quot; alt=&quot;seadragon VBZ overview&quot; src=&quot;/images/blog/2008-12-16-seadragon-vbz-2.PNG&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;screenshot&quot; alt=&quot;seadragon VBZ overview&quot; src=&quot;/images/blog/2008-12-16-seadragon-vbz-1.PNG&quot; /&gt;&lt;/p&gt;

</description>
            <guid>http://www.entropy.ch/blog/?permalink=Public-Transport-Maps-on-the-iPhone-with-Microsoft-Seadragon.html</guid>
			<pubDate>Mon, 15 Dec 2008 23:19:47 +0100</pubDate>
                    </item>
        	             <item>
            <title>rundfunk.fm Swiss Internet Radio Christmas 2008 Edition</title>
            <!--<link>http://www.entropy.ch/blog/?permalink=rundfunk-fm-Swiss-Internet-Radio-Christmas-2008-Edition.html</link>-->
            <link>http://www.entropy.ch/blog/2008/12/01/rundfunk-fm-Swiss-Internet-Radio-Christmas-2008-Edition.html</link>
            <description>&lt;p&gt;&lt;a href=&quot;http://rundfunk.fm&quot;&gt;rundfunk.fm&lt;/a&gt; is a great Swiss radio station that usually broadcasts (and hosts a party) in the summer, but this year there’s a winter christmas special. One of the DJs talks way too much annoying stuff, but the music is really good.&lt;/p&gt;
&lt;!--
&lt;object classid=&quot;clsid:d27cdb6e-ae6d-11cf-96b8-444553540000&quot; codebase=&quot;http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0&quot; width=&quot;600&quot; height=&quot;400&quot; id=&quot;Rundfunk2008&quot; align=&quot;middle&quot;&gt;

	&lt;param name=&quot;allowScriptAccess&quot; value=&quot;sameDomain&quot; /&gt;
	&lt;param name=&quot;allowFullScreen&quot; value=&quot;false&quot; /&gt;
	&lt;param name=&quot;movie&quot; value=&quot;http://www.oliveoliver.com/audioplayer/Main.swf&quot; /&gt;
	&lt;param name=&#39;wmode&#39; value=&#39;transparent&#39; /&gt;
	&lt;param name=&quot;quality&quot; value=&quot;high&quot; /&gt;
	&lt;param name=&quot;bgcolor&quot; value=&quot;#67688c&quot; /&gt;
	&lt;param name=&quot;autoplay&quot; value=&quot;false&quot; /&gt;

	&lt;embed
		wmode=&#39;transparent&#39;
		autoplay=&#39;false&#39;
		src=&quot;http://www.oliveoliver.com/audioplayer/Main.swf&quot;
		quality=&quot;high&quot; bgcolor=&quot;#67688c&quot; width=&quot;600&quot; height=&quot;400&quot; name=&quot;Rundfunk2008&quot; align=&quot;middle&quot;
		allowScriptAccess=&quot;sameDomain&quot;
		allowFullScreen=&quot;false&quot;
		type=&quot;application/x-shockwave-flash&quot;
		pluginspage=&quot;http://www.adobe.com/go/getflashplayer&quot;
	/&gt;
&lt;/object&gt;
--&gt;
&lt;p&gt;There’s also a standalone AIR based player which I prefer:&lt;/p&gt;

&lt;!-- BEGIN EMBED CODE --&gt;
	
	&lt;!-- IMPORTANT: Make sure you also copy the swfobject script tag from the head above --&gt;
	&lt;script type=&quot;text/javascript&quot; src=&quot;http://www.oliveoliver.com/audioplayer/swfobject.js&quot;&gt;&lt;/script&gt;
	&lt;div id=&quot;installplayer&quot;&gt;
		&lt;strong&gt;Please upgrade your Flash Player&lt;/strong&gt;
		This is the content that would be shown if the user does not have Flash Player 9.0.0 or higher installed.
	&lt;/div&gt;

	&lt;script type=&quot;text/javascript&quot;&gt;
		// &lt;![CDATA[
		
		// version 9.0.115 or greater is required for launching AIR apps.
		var so = new SWFObject(&quot;http://www.oliveoliver.com/audioplayer/AIRInstallBadge.swf&quot;, &quot;Badge&quot;, &quot;215&quot;, &quot;180&quot;, &quot;9.0.115&quot;, &quot;#FFFFFF&quot;);
		so.useExpressInstall(&#39;http://www.oliveoliver.com/audioplayer/expressinstall.swf&#39;);
		
		// these parameters are required for badge install:
		so.addVariable(&quot;airversion&quot;, &quot;1.1&quot;); // version of AIR runtime required
		so.addVariable(&quot;appname&quot;, &quot;Rundfunk 2008&quot;); // application name to display to the user
		so.addVariable(&quot;appurl&quot;, &quot;http://www.oliveoliver.com/audioplayer/RundfunkDesktopplayer.air&quot;); // absolute URL (beginning with http or https) of the application &quot;.air&quot; file
		
		// these parameters are required to support launching apps from the badge (but optional for install):
		so.addVariable(&quot;appid&quot;, &quot;RundfunkDesktopplayer&quot;); // the qualified application ID (ex. com.gskinner.air.MyApplication)
		so.addVariable(&quot;pubid&quot;, &quot;DU DA GmbH&quot;); // publisher id
		
		// this parameter is required in addition to the above to support upgrading from the badge:
		so.addVariable(&quot;appversion&quot;, &quot;1.0&quot;); // AIR application version
		
		// these parameters are optional:
		so.addVariable(&quot;image&quot;, &quot;http://www.oliveoliver.com/audioplayer/install.jpg&quot;); // URL for an image (JPG, PNG, GIF) or SWF to display in the badge (205px wide, 170px high)
		so.addVariable(&quot;appinstallarg&quot;, &quot;installed from web&quot;); // passed to the application when it is installed from the badge
		so.addVariable(&quot;applauncharg&quot;, &quot;launched from web&quot;); // passed to the application when it is launched from the badge
		so.addVariable(&quot;helpurl&quot;, &quot;help.html&quot;); // optional url to a page containing additional help, displayed in the badge&#39;s help screen
		so.addVariable(&quot;hidehelp&quot;, &quot;true&quot;); // hides the help icon if &quot;true&quot;
		so.addVariable(&quot;skiptransition&quot;, &quot;false&quot;); // skips the initial transition if &quot;true&quot;
		so.addVariable(&quot;titlecolor&quot;, &quot;#FFFFFF&quot;); // changes the color of titles
		so.addVariable(&quot;buttonlabelcolor&quot;, &quot;#FFFFFF&quot;); // changes the color of the button label
		so.addVariable(&quot;appnamecolor&quot;, &quot;#FFFFFF&quot;); // changes the color of the application name if the image is not specified or loaded
		
		// these parameters allow you to override the default text in the badge:
		// supported strings: str_error, str_err_params, str_err_airunavailable, str_err_airswf, str_loading, str_install, str_launch, str_upgrade, str_close, str_launching, str_launchingtext, str_installing, str_installingtext, str_tryagain, str_beta3, str_beta3text, str_help, str_helptext
		so.addVariable(&quot;str_err_airswf&quot;, &quot;&lt;u&gt;Running locally?&lt;/u&gt;&lt;br/&gt;&lt;br/&gt;The AIR proxy swf won&#39;t load properly when this demo is run from the local file system.&quot;); // overrides the error text when the AIR proxy swf fails to load
		
		so.write(&quot;installplayer&quot;);
		
		// ]]&gt;
	&lt;/script&gt;

&lt;!-- END EMBED CODE --&gt;


&lt;p&gt;Even better than the AIR player is listening to the stream directly in iTunes. Use this URL with iTunes’ “Advanced” &gt; “Open Audio Stream” command:&lt;/p&gt;

&lt;pre&gt;http://rffm2.streamhosting.ch:8000/rundfunkfm&lt;/pre&gt;
</description>
            <guid>http://www.entropy.ch/blog/?permalink=rundfunk-fm-Swiss-Internet-Radio-Christmas-2008-Edition.html</guid>
			<pubDate>Mon, 1 Dec 2008 07:51:31 +0100</pubDate>
                    </item>
        	            <item>
            <title>Album Artwork Assistant</title>
            <!--<link>http://www.entropy.ch/blog/Software/?permalink=Album-Artwork-Assistant.html</link>-->
            <link>http://www.entropy.ch/blog/Software/2008/11/16/Album-Artwork-Assistant.html</link>
            <description>&lt;a href=&quot;http://www.entropy.ch/software/macosx/album-artwork-assistant/&quot;&gt;&lt;img class=&quot;right&quot; alt=&quot;Album Artwork Assistant Application Icon&quot; src=&quot;http://www.entropy.ch/software/macosx/album-artwork-assistant/album-artwork-assistant-icon.png&quot; /&gt;&lt;/a&gt;

&lt;p&gt;I just published a free new Mac OS X application. Say Hello to &lt;a href=&quot;http://www.entropy.ch/software/macosx/album-artwork-assistant/&quot;&gt;Album Artwork Assistant&lt;/a&gt; :-)&lt;/p&gt;

&lt;p&gt;Album Artwork Assistant finds album cover artwork on the Internet and adds it to music track files in iTunes. Other tools like it exist, but none of them worked the way I wanted, or they cost too much.&lt;/p&gt;

&lt;p&gt;Feel free to try it out if you need something like this, and let me know if you find any bugs.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Update:&lt;/em&gt; As noted in the comments, I should mention that the program requires Mac OS X 10.5.&lt;/p&gt;

&lt;br style=&quot;clear: both;&quot;&gt;
</description>
            <guid>http://www.entropy.ch/blog/Software/?permalink=Album-Artwork-Assistant.html</guid>
			<pubDate>Sun, 16 Nov 2008 23:10:29 +0100</pubDate>
                    </item>
        	            <item>
            <title>Finder AppleScript: Eject Volume and Trash its Disk Image</title>
            <!--<link>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Finder-AppleScript-Eject-Volume-and-Trash-its-Disk-Image.html</link>-->
            <link>http://www.entropy.ch/blog/Mac+OS+X/2008/10/29/Finder-AppleScript-Eject-Volume-and-Trash-its-Disk-Image.html</link>
            <description>&lt;p&gt;I wrote the AppleScript below to eject one or more selected volumes in the Finder. If a volume represents a disk image, the script trashes the image at the same time. I use this a lot with downloaded application distribution images.&lt;/p&gt;

&lt;p&gt;I run the script with &lt;a href=&quot;http://www.red-sweater.com/fastscripts/&quot;&gt;FastScripts&lt;/a&gt; with the keyboard short cut Cmd-Option-E. Unfortunately, there seems to be a &lt;a href=&quot;http://www.red-sweater.com/forums/viewtopic.php?pid=5113&quot;&gt;Finder bug&lt;/a&gt; that makes the script take a very long time do finish.&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;
set myVolumes to getSelectedVolumes()
if (count myVolumes) &amp;lt; 1 then return

set myImages to getImageList()

repeat with myVolume in myVolumes
	set myImagePath to &quot;&quot;
	set myImageFile to null
	repeat with myImage in myImages
		repeat with myEntity in |system-entities| of myImage
			try
				set mountPoint to |mount-point| of myEntity
				displayed name of myVolume
				if mountPoint = (&quot;/Volumes/&quot; &amp;amp; displayed name of myVolume) then
					set myImagePath to |image-path| of myImage
					set myImageFile to POSIX file myImagePath
				end if
			end try
		end repeat
	end repeat
	
	tell application &quot;Finder&quot;
		eject myVolume
		if myImageFile is not null then
			try
				delete file myImageFile
			end try
		end if
	end tell
end repeat



on getSelectedVolumes()
	set volumeList to {}
	tell application &quot;Finder&quot;
		set mySelection to selection
		repeat with myItem in mySelection
			set myItem to contents of myItem
			--			log class of myItem
			if kind of myItem is &quot;Volume&quot; then
				set end of volumeList to myItem
			end if
		end repeat
	end tell
	return volumeList
end getSelectedVolumes



on getImageList()
	set diskinfo to do shell script &quot;hdiutil info -plist&quot;
	tell application &quot;System Events&quot;
		set diskinfo to value of (make new property list item with properties {text:diskinfo})
		set imageList to |images| of diskinfo
	end tell
	return imageList
end getImageList&lt;/pre&gt;
</description>
            <guid>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Finder-AppleScript-Eject-Volume-and-Trash-its-Disk-Image.html</guid>
			<pubDate>Wed, 29 Oct 2008 22:41:35 +0100</pubDate>
                    </item>
        	            <item>
            <title>Sparkle Appcast Automation in Xcode</title>
            <!--<link>http://www.entropy.ch/blog/Developer/?permalink=Sparkle-Appcast-Automation-in-Xcode.html</link>-->
            <link>http://www.entropy.ch/blog/Developer/2008/09/22/Sparkle-Appcast-Automation-in-Xcode.html</link>
            <description>&lt;p&gt;Recent versions of the &lt;a href=&quot;http://sparkle.andymatuschak.org/&quot;&gt;Sparkle&lt;/a&gt; auto-update framework used by &lt;a href=&quot;http://osx.iusethis.com/top?sparkle=1&quot;&gt;many Mac OS X applications&lt;/a&gt; require the publisher to protect their users from malicious attacks by either delivering application updates over SSL or digitally signing them, which is a good thing.&lt;/p&gt;

&lt;p&gt;Signing involves a few steps with OpenSSL that need to be executed again for every release build. To make this more reliable and convenient, I automated the process with a custom script phase in my “distribution” Xcode target.&lt;/p&gt;

&lt;p&gt;The first step is to generate a DSA key pair &lt;a href=&quot;http://sparkle.andymatuschak.org/documentation/pmwiki.php/Documentation/BasicSetup&quot;&gt;as documented&lt;/a&gt; on the Sparkle website. This gives you the private key in &lt;code&gt;dsa_priv.pem&lt;/code&gt; and the public key in &lt;code&gt;dsa_pub.pem&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The private key is sensitive and I did not want it lying around on the file system, so I added it to my keychain as a Secure Note in the Keychain Access utility:&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Keychain Access New Secure Note menu item&quot; src=&quot;/images/blog/2008-09-22-keychain-new-secure-note.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Keychain Access DSA Key secure note content&quot; src=&quot;/images/blog/2008-09-22-secure-note-dsaprivkey.png&quot;/&gt;&lt;/p&gt;

&lt;p&gt;For completeness, I also added the public key even though it is not sensitive, resulting in these two secure note items:&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Secure note list items&quot; src=&quot;/images/blog/2008-09-22-keychain-secure-notes.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I deleted the private key from the file system, moved the public key to the resources of my Xcode project and included its name in the &lt;code&gt;Info.plist&lt;/code&gt; file under the &lt;code&gt;SUPublicDSAKeyFile&lt;/code&gt; key, again as documented on the Sparkle Website.&lt;/p&gt;

&lt;p&gt;In Xcode, I added a “Distribution” shell script target:&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Xcode shell script target&quot; src=&quot;/images/blog/2008-09-22-distribution-target.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This is the shell script code:&lt;/p&gt;


&lt;pre class=&quot;code&quot;&gt;set -o errexit

[ $BUILD_STYLE = Release ] || { echo Distribution target requires &quot;&#39;Release&#39;&quot; build style; false; }

VERSION=$(defaults read &quot;$BUILT_PRODUCTS_DIR/$PROJECT_NAME.app/Contents/Info&quot; CFBundleVersion)
DOWNLOAD_BASE_URL=&quot;http://www.example.com/download/&quot;
RELEASENOTES_URL=&quot;http://www.example.com/software/my-cool-app/release-notes.html#version-$VERSION&quot;

ARCHIVE_FILENAME=&quot;$PROJECT_NAME $VERSION.zip&quot;
DOWNLOAD_URL=&quot;$DOWNLOAD_BASE_URL/$ARCHIVE_FILENAME&quot;
KEYCHAIN_PRIVKEY_NAME=&quot;Sparkle Private Key 1&quot;

WD=$PWD
cd &quot;$BUILT_PRODUCTS_DIR&quot;
rm -f &quot;$PROJECT_NAME&quot;*.zip
ditto -ck --keepParent &quot;$PROJECT_NAME.app&quot; &quot;$ARCHIVE_FILENAME&quot;

SIZE=$(stat -f %z &quot;$ARCHIVE_FILENAME&quot;)
PUBDATE=$(LC_TIME=en_US date +&quot;%a, %d %b %G %T %z&quot;)
SIGNATURE=$(
	openssl dgst -sha1 -binary &amp;lt; &quot;$ARCHIVE_FILENAME&quot; \
	| openssl dgst -dss1 -sign &amp;lt;(security find-generic-password -g -s &quot;$KEYCHAIN_PRIVKEY_NAME&quot; 2&gt;&amp;amp;1 1&gt;/dev/null | perl -pe &#39;($_) = /&quot;(.+)&quot;/; s/\\012/\n/g&#39;) \
	| openssl enc -base64
)

[ $SIGNATURE ] || { echo Unable to load signing private key with name &quot;&#39;$KEYCHAIN_PRIVKEY_NAME&#39;&quot; from keychain; false; }

cat &amp;lt;&amp;lt;EOF
		&amp;lt;item&gt;
			&amp;lt;title&gt;Version $VERSION&amp;lt;/title&gt;
			&amp;lt;sparkle:releaseNotesLink&gt;$RELEASENOTES_URL&amp;lt;/sparkle:releaseNotesLink&gt;
			&amp;lt;pubDate&gt;$PUBDATE&amp;lt;/pubDate&gt;
			&amp;lt;enclosure
				url=&quot;$DOWNLOAD_URL&quot;
				sparkle:version=&quot;$VERSION&quot;
				type=&quot;application/octet-stream&quot;
				length=&quot;$SIZE&quot;
				sparkle:dsaSignature=&quot;$SIGNATURE&quot;
			/&gt;
		&amp;lt;/item&gt;
EOF

echo scp &quot;&#39;$HOME/svn/my-cool-app/build/Release/$ARCHIVE_FILENAME&#39;&quot; www.example.com:download/
echo scp &quot;&#39;$WD/appcast.xml&#39;&quot; www.example.com:web/software/my-cool-app/appcast.xml&lt;/pre&gt;

&lt;p&gt;You have to set the shell to &lt;code&gt;/bin/bash&lt;/code&gt; because this code uses features that are not available otherwise.&lt;/p&gt;

&lt;p&gt;This script:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;enforces a Release build&lt;/li&gt;
&lt;li&gt;creates a .zip file of the application. You could also package up a .dmg with additional material.&lt;/li&gt;
&lt;li&gt;fetches the signing private key from the keychain. This step might pop up a dialog:
&lt;img alt=&quot;keychain access dialog&quot; src=&quot;/images/blog/2008-09-22-keychain-access-dialog&quot; /&gt;
&lt;/li&gt;
&lt;li&gt;calculates the SHA1 checksum of the distribution file&lt;/li&gt;
&lt;li&gt;signs the checksum with the private key&lt;/li&gt;
&lt;li&gt;converts the signature to Base64&lt;/li&gt;
&lt;li&gt;emits an &lt;code&gt;item&lt;/code&gt; block with all the information (date, size, version) about the update. You add this block to your appcast XML file.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I also let it print out the &lt;code&gt;scp&lt;/code&gt; commands required to publish the update.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Alan Craig is working on an &lt;a href=&quot;http://allancraig.net/blog/?p=65&quot;&gt;extended Ruby version&lt;/a&gt; of the bash script, featuring a few more options.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Snow Leopard Update:&lt;/strong&gt; It seems that on Snow Leopard, the &lt;code&gt;security&lt;/code&gt; tool’s output changed. You have to replace the multiline variable assignment to SIGNATURE above with this:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;SIGNATURE=$(
	openssl dgst -sha1 -binary &amp;lt; &quot;$ARCHIVE_FILENAME&quot; \
	| openssl dgst -dss1 -sign &amp;lt;(security find-generic-password -g -s &quot;$KEYCHAIN_PRIVKEY_NAME&quot; 2&gt;&amp;amp;1 1&gt;/dev/null | perl -pe &#39;($_) = /&quot;(.+)&quot;/; s/\\012/\n/g&#39; | perl -MXML::LibXML -e &#39;print XML::LibXML-&gt;new()-&gt;parse_file(&quot;-&quot;)-&gt;findvalue(q(//string[preceding-sibling::key[1] = &quot;NOTE&quot;]))&#39;) \
	| openssl enc -base64
)&lt;/pre&gt;

&lt;p&gt;This is because the output is now an XML property list with multiple items.&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; An earlier version of this article used this command to produce the distribution ZIP file:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;zip -qr &quot;$ARCHIVE_FILENAME&quot; &quot;$PROJECT_NAME.app&quot;&lt;/pre&gt;

&lt;p&gt;It turns out that this compresses inefficiently. Thanks to
&lt;a href=&quot;http://www.kwao.de/&quot;&gt;Fabian Jäger&lt;/a&gt; for the &lt;code&gt;ditto&lt;/code&gt; line used above,
which compresses more efficiently and produces smaller files.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Developer/?permalink=Sparkle-Appcast-Automation-in-Xcode.html</guid>
			<pubDate>Mon, 22 Sep 2008 16:17:04 +0200</pubDate>
                    </item>
        	            <item>
            <title>Xcode Docs: Get Rid of Downloaded From Internet Warnings</title>
            <!--<link>http://www.entropy.ch/blog/Developer/?permalink=Xcode-Docs-Get-Rid-of-Downloaded-From-Internet-Warnings.html</link>-->
            <link>http://www.entropy.ch/blog/Developer/2008/08/19/Xcode-Docs-Get-Rid-of-Downloaded-From-Internet-Warnings.html</link>
            <description>&lt;p&gt;When I work on Cocoa programs I read the framework documentation with Xcode’s built in documentation viewer, but sometimes I still open the HTML page for a particular class in Safari with &lt;a href=&quot;http://www.obdev.at/products/launchbar/&quot;&gt;LaunchBar&lt;/a&gt; because it is very quick (see &lt;a href=&quot;http://www.entropy.ch/blog/Developer/2006/09/26/Indexing-Java-SDK-Docs-with-QuickSilver.html&quot;&gt;this older post&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Xcode downloads these documentation sets from the Internet, and unfortunately all of the thousands of files in there are tagged with the &lt;a href=&quot;http://arstechnica.com/reviews/os/mac-os-x-10-5.ars/11&quot;&gt;“quarantine”&lt;/a&gt; extended file system attribute. This means that the system warns you about potentially harmful content every time you open one of the .html files outside of Xcode, such as in the LaunchBar case.&lt;/p&gt;

&lt;p&gt;To get around this, you can clear the quarantine attribute on all files with this command:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;find /Developer/Documentation -type f -print0 | xargs -n 100 -0 sudo xattr -d com.apple.quarantine&lt;/pre&gt;

</description>
            <guid>http://www.entropy.ch/blog/Developer/?permalink=Xcode-Docs-Get-Rid-of-Downloaded-From-Internet-Warnings.html</guid>
			<pubDate>Tue, 19 Aug 2008 12:47:03 +0200</pubDate>
                    </item>
        	            <item>
            <title>Terminal Tricks: A Fuzzy cd Command</title>
            <!--<link>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Terminal-Tricks-A-Fuzzy-cd-Command.html</link>-->
            <link>http://www.entropy.ch/blog/Mac+OS+X/2008/08/14/Terminal-Tricks-A-Fuzzy-cd-Command.html</link>
            <description>&lt;p&gt;Here’s another trick to speed up file system navigation in the shell. A &lt;a href=&quot;http://www.entropy.ch/blog/Mac+OS+X/2008/06/03/UNIX-Tool-Tip-cdargs.html&quot;&gt;previous tip&lt;/a&gt; showed how to use bookmarks to reach deeply nested directories effectively.&lt;/p&gt;

&lt;p&gt;I use that a lot, but I frequently use it to enter directories with a large number of subdirectories whose names are long and share a prefix:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;...
Arteria-Media-ImageEditor
Arteria-Media-ImageEditor-Base
Arteria-Media-ImageRep-Magick
Arteria-Media-JSONClient
Arteria-Media-JSONSegmenter
Arteria-Media-Webapp-MediaServer
...&lt;/pre&gt;

&lt;p&gt;I wanted a way to enter one of these directories by typing only a minimal, unique substring of its name (like typing &lt;code&gt;*substring*&lt;/code&gt; but only considering directories and ignoring case), so I wrote this shell function:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;function c {
	shopt -q nocasematch || resetcase=1
	shopt -s nocasematch
	for i in *; do [ -d &quot;$i&quot; ] &amp;amp;&amp;amp; [[ &quot;$i&quot; == *&quot;$1&quot;* ]] &amp;amp;&amp;amp; cd &quot;$i&quot; &amp;amp;&amp;amp; break; done
	[ $resetcase ] &amp;amp;&amp;amp; shopt -u nocasematch
}&lt;/pre&gt;

&lt;p&gt;Now I can type&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;c ncl&lt;/pre&gt;

&lt;p&gt;and, in the example directory above, it takes me directly into the &lt;code&gt;Arteria-Media-JSONClient&lt;/code&gt; subdirectory.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Terminal-Tricks-A-Fuzzy-cd-Command.html</guid>
			<pubDate>Thu, 14 Aug 2008 07:19:45 +0200</pubDate>
                    </item>
        	            <item>
            <title>Open Terminal Here Finder Keyboard Command</title>
            <!--<link>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Open-Terminal-Here-Finder-Keyboard-Command.html</link>-->
            <link>http://www.entropy.ch/blog/Mac+OS+X/2008/08/07/Open-Terminal-Here-Finder-Keyboard-Command.html</link>
            <description>&lt;p&gt;A while ago I published a Finder toolbar AppleScript called &lt;a href=&quot;http://www.entropy.ch/software/applescript/&quot;&gt;“Open Terminal Here”&lt;/a&gt; to open a terminal window in the directory displayed by the frontmost Finder window or the Finder selection or the files/folders dropped onto the icon.&lt;/p&gt;

&lt;p&gt;However, these days I find myself using a similar script triggered by a keyboard shortcut much more often. I assigned it to Cmd-T which is very convenient and quick. As always, I use &lt;a href=&quot;http://www.red-sweater.com/fastscripts/&quot;&gt;FastScripts&lt;/a&gt; to do the keyboard launching.&lt;/p&gt;

&lt;p&gt;Here’s the script:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;tell application &quot;Finder&quot;
	set sel to selection
	if (count sel) &gt; 0 then
		set myTarget to item 1 of sel
	else if (count window) &gt; 0 then
		set myTarget to target of window 1
	else
		set myTarget to path to desktop folder
	end if
	my openTerminal(myTarget)
end tell

on openTerminal(location)
	set location to location as alias
	set the_path to POSIX path of location
	repeat until the_path ends with &quot;/&quot;
		set the_path to text 1 thru -2 of the_path
	end repeat
	
	set cmd to &quot;cd &quot; &amp;amp; quoted form of the_path &amp;amp; &quot; &amp;amp;&amp;amp; echo $&#39;\\ec&#39;&quot;
	
	tell application &quot;System Events&quot; to set terminalIsRunning to exists application process &quot;Terminal&quot;
	
	tell application &quot;Terminal&quot;
		activate
		if terminalIsRunning is true then
			do script with command cmd
		else
			do script with command cmd in window 1
		end if
	end tell
end openTerminal&lt;/pre&gt;

&lt;a href=&quot;applescript://com.apple.scripteditor?action=new&amp;script=tell%20application%20%22Finder%22%0a%09set%20sel%20to%20selection%0a%09if%20(count%20sel)%20%3e%200%20then%0a%09%09set%20myTarget%20to%20item%201%20of%20sel%0a%09else%20if%20(count%20window)%20%3e%200%20then%0a%09%09set%20myTarget%20to%20target%20of%20window%201%0a%09else%0a%09%09set%20myTarget%20to%20path%20to%20desktop%20folder%0a%09end%20if%0a%09my%20openTerminal(myTarget)%0aend%20tell%0a%0aon%20openTerminal(location)%0a%09set%20location%20to%20location%20as%20alias%0a%09set%20the_path%20to%20POSIX%20path%20of%20location%0a%09repeat%20until%20the_path%20ends%20with%20%22%2f%22%0a%09%09set%20the_path%20to%20text%201%20thru%20-2%20of%20the_path%0a%09end%20repeat%0a%09%0a%09set%20cmd%20to%20%22cd%20%22%20%26%20quoted%20form%20of%20the_path%20%26%20%22%20%26%26%20echo%20%24&#39;%5c%5cec&#39;%22%0a%09%0a%09tell%20application%20%22System%20Events%22%20to%20set%20terminalIsRunning%20to%20exists%20application%20process%20%22Terminal%22%0a%09%0a%09tell%20application%20%22Terminal%22%0a%09%09activate%0a%09%09if%20terminalIsRunning%20is%20true%20then%0a%09%09%09do%20script%20with%20command%20cmd%0a%09%09else%0a%09%09%09do%20script%20with%20command%20cmd%20in%20window%201%0a%09%09end%20if%0a%09end%20tell%0aend%20openTerminal%0a%0a&quot;&gt;Open this script in Script Editor&lt;/a&gt;
</description>
            <guid>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Open-Terminal-Here-Finder-Keyboard-Command.html</guid>
			<pubDate>Thu, 7 Aug 2008 08:38:12 +0200</pubDate>
                    </item>
        	            <item>
            <title>Spook Country</title>
            <!--<link>http://www.entropy.ch/blog/Books/?permalink=Spook-Country.html</link>-->
            <link>http://www.entropy.ch/blog/Books/2008/06/28/Spook-Country.html</link>
            <description>&lt;p&gt;&lt;a href=&quot;http://www.amazon.com/Spook-Country-William-Gibson/dp/0425221415%3FSubscriptionId%3D0PZ7TM66EXQCXFVTMTR2%26tag%3Dwwwentropych-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D0425221415&quot;&gt;&lt;img class=&quot;blog_entry_icon&quot; alt=&quot;&quot; src=&quot;http://ecx.images-amazon.com/images/I/41HBTsRYRkL._SL160_.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Just finished William Gibson’s latest novel, Spook Country. I liked it but if you plan to read it you probably should read &lt;a href=&quot;http://en.wikipedia.org/wiki/Pattern_Recognition_%28novel%29&quot;&gt;“Pattern Recognition”&lt;/a&gt; first.&lt;/p&gt;

&lt;p style=&#39;clear: both&#39;&gt;&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Books/?permalink=Spook-Country.html</guid>
			<pubDate>Sat, 28 Jun 2008 07:12:18 +0200</pubDate>
                    </item>
        	            <item>
            <title>Terminal Tricks: “term” revisited, with tabs</title>
            <!--<link>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Terminal-Tricks-%E2%80%9Cterm%E2%80%9D-revisited-with-tabs.html</link>-->
            <link>http://www.entropy.ch/blog/Mac+OS+X/2008/06/27/Terminal-Tricks-%E2%80%9Cterm%E2%80%9D-revisited-with-tabs.html</link>
            <description>&lt;p&gt;Back in 2005 I &lt;a href=&quot;http://www.entropy.ch/blog/Mac+OS+X/2005/02/28/Terminal_tricks_8220_term_8221_and_8220_clone_8221.html&quot;&gt;published&lt;/a&gt; a little shell script called “term”. It clones the current Mac OS X Terminal session (working directory) into a new window, or executes a command in a new window. See the old posting for some usage examples.&lt;/p&gt;

&lt;p&gt;Here’s a new version that adds a &lt;code&gt;-t&lt;/code&gt; option to open a new tab instead of a new window and the ability to specify window position and size:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;#!/bin/sh
#
# Open a new Mac OS X terminal window or tab in the current or another
# directory and optionally run a command in the new window or tab.
#
# - Without any arguments, the new terminal window opens in
#   the current directory, i.e. the executed command is &quot;cd $PWD&quot;.
# - If the first argument is a directory, the new terminal will &quot;cd&quot; into
#   that directory before executing the remaining arguments as command.
# - The optional &quot;-t&quot; flag executes the command in a new tab 
#   instead of a new window.
# - The optional &quot;-x&quot; flag closes the new window or tab
#   after the executed command finishes.
# - The optional &quot;-p&quot; flag takes an argument of the form x,y (e.g. 40,50) and
#   positions the terminal window to the indicated location on the screen
# - The optional &quot;-s&quot; flag takes an argument of the form w,h (e.g. 800,400) and
#   resizes the terminal window to the indicated width and height in pixels.
#
# Written by Marc Liyanage &amp;lt;http://www.entropy.ch&gt;
#
# Version 2.1
#

set -e

while getopts xtp:s: OPTION; do
[ $OPTION = &quot;x&quot; ] &amp;amp;&amp;amp; { EXIT=&#39;; exit&#39;; }
[ $OPTION = &quot;t&quot; ] &amp;amp;&amp;amp; { TAB=1; }
[ $OPTION = &quot;p&quot; ] &amp;amp;&amp;amp; { POSITION=&quot;set position of window 1 to {$OPTARG}&quot;; }
[ $OPTION = &quot;s&quot; ] &amp;amp;&amp;amp; { SIZE=&quot;set size of window 1 to {$OPTARG}&quot;; }
done

for (( $OPTIND; $OPTIND-1; OPTIND=$OPTIND-1 )); do shift; done

if [[ -d &quot;$1&quot; ]]; then WD=$(cd &quot;$1&quot;; pwd); shift; else WD=$PWD; fi


COMMAND=&quot;cd &#39;$WD&#39; &amp;amp;&amp;amp; echo -n \$&#39;\\\\ec&#39;;&quot;
for i in &quot;$@&quot;; do
	COMMAND=&quot;$COMMAND &#39;$i&#39;&quot;
done

if [ $TAB ]; then

osascript 2&gt;/dev/null &amp;lt;&amp;lt;EOF
	tell application &quot;System Events&quot;
		tell process &quot;Terminal&quot; to keystroke &quot;t&quot; using command down
	end
	tell application &quot;Terminal&quot;
		activate
		do script with command &quot;$COMMAND $EXIT&quot; in window 1
		$POSITION
		$SIZE
	end tell
EOF

else

osascript &amp;lt;&amp;lt;EOF
	tell application &quot;Terminal&quot;
		activate
		do script with command &quot;$COMMAND $EXIT&quot;
		$POSITION
		$SIZE
	end tell
EOF

fi&lt;/pre&gt;
</description>
            <guid>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Terminal-Tricks-%E2%80%9Cterm%E2%80%9D-revisited-with-tabs.html</guid>
			<pubDate>Fri, 27 Jun 2008 07:59:09 +0200</pubDate>
                    </item>
        	            <item>
            <title>del.icio.us Links on 2008-06-14</title>
            <!--<link>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2008-06-14.html</link>-->
            <link>http://www.entropy.ch/blog/Links/2008/06/14/del-icio-us-Links-on-2008-06-14.html</link>
            <description>&lt;ul class=&quot;delicious&quot;&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://www.satine.org/archives/2008/06/03/squirrelfish-is-faster-than-tamarin/&quot;&gt;inside looking out » SquirrelFish is faster than Tamarin&lt;/a&gt; &lt;/div&gt;
				&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/javascript&quot;&gt;javascript&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/mac&quot;&gt;mac&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/web&quot;&gt;web&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/safari&quot;&gt;safari&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/tamarin&quot;&gt;tamarin&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/squirrelfish&quot;&gt;squirrelfish&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/performance&quot;&gt;performance&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/webkit&quot;&gt;webkit&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
&lt;/ul&gt;
</description>
            <guid>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2008-06-14.html</guid>
			<pubDate>Sat, 14 Jun 2008 23:24:27 +0200</pubDate>
                    </item>
        	            <item>
            <title>Things I Learned About My Dad</title>
            <!--<link>http://www.entropy.ch/blog/Books/?permalink=Things-I-Learned-About-My-Dad.html</link>-->
            <link>http://www.entropy.ch/blog/Books/2008/06/14/Things-I-Learned-About-My-Dad.html</link>
            <description>&lt;a href=&quot;http://www.amazon.com/gp/redirect.html%3FASIN=0758216599%26tag=wwwentropych-20%26lcode=xm2%26cID=2025%26ccmID=165953%26location=/Things-Learned-About-Dad-ofwww-dooce-com/dp/0758216599%253FSubscriptionId=0PZ7TM66EXQCXFVTMTR2&quot;&gt;&lt;img class=&quot;blog_entry_icon&quot; alt=&quot;Book: Things I Learned About My Dad&quot; src=&quot;http://ecx.images-amazon.com/images/I/51xlNk7fsuL._SL160_.jpg&quot; /&gt;&lt;/a&gt;

&lt;p&gt;I can’t quite remember where I read the tip about this book, it must have been some blog.&lt;/p&gt;

&lt;p&gt;Although not all essays are of the same quality, it’s a good and fun read overall...&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Compiled by Heather B. Armstrong, award-winning publisher and uber-mistress of the phenomenally popular dooce.com®, this hilarious and heartwarming celebration of &quot;everything dad&quot; features original stories from some of the country&#39;s most celebrated bloggers, including Alice Bradley (Finslippy) Doug French (Laid Off Dad), Maggie Mason (Mighty Girl), Matthew Baldwin (Defective Yeti), Sarah Brown (Que Sera Sera), and more.&lt;/p&gt;


&lt;p&gt;From a new father&#39;s comparison of pregnancy to Tolkien&#39;s Lord of the Rings, to a mother&#39;s story of bravely surviving a husband-son infatuation with Star Wars, to the mini triumphs and tragedies of toddlerhood, this book provides a unique, no-holds-barred glimpse into the quirks and candid moments of modern dads.&lt;/p&gt;

&lt;p&gt;Whether we relish or fear growing up to be like our fathers...whether we&#39;ve inherited his nose, sense of humor, or entire value system, our dads loom large in who we are and the choices we make. Things I Learned about my Dad in Therapy touches upon the many joys and discoveries of fatherhood, one essay at a time.&lt;/p&gt;
&lt;/blockquote&gt;
</description>
            <guid>http://www.entropy.ch/blog/Books/?permalink=Things-I-Learned-About-My-Dad.html</guid>
			<pubDate>Sat, 14 Jun 2008 10:45:04 +0200</pubDate>
                    </item>
        	            <item>
            <title>Exclude Items From Time Machine Backup With Contextual Menu</title>
            <!--<link>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Exclude-Items-From-Time-Machine-Backup-With-Contextual-Menu.html</link>-->
            <link>http://www.entropy.ch/blog/Mac+OS+X/2008/06/14/Exclude-Items-From-Time-Machine-Backup-With-Contextual-Menu.html</link>
            <description>
&lt;p&gt;Note: there’s an &lt;a href=&quot;http://www.entropy.ch/blog/Mac+OS+X/2009/02/09/Exclude-From-Time-Machine-Backup-Script-New-and-Improved.html&quot;&gt;updated version&lt;/a&gt; of this script.&lt;/p&gt;

&lt;p&gt;I often download huge files that I only need temporarily, things like installer packages and disk images. They end up on my desktop because that is my download folder and quite often they also end up in the Time Machine backup, wasting a lot of space there.&lt;/p&gt;

&lt;p&gt;I wanted a contextual menu command to exclude these files from the backup in the Finder so I wrote this AppleScript:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;on main(filelist)
    set target to quoted form of (POSIX path of (item 1 of filelist as alias))
    do shell script &quot;xattr -w com.apple.metadata:com_apple_backup_excludeItem com.apple.backupd &quot; &amp; target
end main&lt;/pre&gt;

&lt;p&gt;It adds extended attributes to the file telling Time Machine to ignore it. I got this information from an excellent &lt;a href=&quot;http://earthlingsoft.net/ssp/blog/2008/03/x5_time_machine&quot;&gt;article about Time Machine&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;To run the script as contextual menu in the Finder I use &lt;a href=&quot;http://www.ranchero.com&quot;&gt;Ranchero Software’s&lt;/a&gt; free &lt;a href=&quot;http://www.ranchero.com/bigcat/&quot;&gt;Big Cat&lt;/a&gt; utility. After installing that and storing my script in &lt;code&gt;$HOME/Library/Application Support/Big Cat Scripts/Files&lt;/code&gt;, I have a new entry in the Finder contextual menu for files:&lt;/p&gt;

&lt;p&gt;&lt;img class=&quot;screenshot&quot; alt=&quot;Finder Contextual Menu AppleScript&quot; src=&quot;/images/blog/2008-06-14-exclude-from-backup.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The only problem is that custom contextual menu items are in a “More” submenu on Leopard, which moves the Big Cat scripts down to the inconvenient third level.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Exclude-Items-From-Time-Machine-Backup-With-Contextual-Menu.html</guid>
			<pubDate>Sat, 14 Jun 2008 08:12:26 +0200</pubDate>
                    </item>
        	             <item>
            <title>Do You Speak Orange...</title>
            <!--<link>http://www.entropy.ch/blog/?permalink=Do-You-Speak-Orange.html</link>-->
            <link>http://www.entropy.ch/blog/2008/06/11/Do-You-Speak-Orange.html</link>
            <description>&lt;p&gt;&lt;a class=&quot;img&quot; href=&quot;http://www.euro2008.uefa.com/tournament/matches/match=300686/report=rp.html&quot;&gt;&lt;img alt=&quot;Do You Speak Orange...&quot; src=&quot;/images/blog/2008-06-11-do-you-speak-orange&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/?permalink=Do-You-Speak-Orange.html</guid>
			<pubDate>Wed, 11 Jun 2008 12:31:58 +0200</pubDate>
                    </item>
        	             <item>
            <title>Drink, Don’t Drive</title>
            <!--<link>http://www.entropy.ch/blog/?permalink=Drink-Don%E2%80%99t-Drive.html</link>-->
            <link>http://www.entropy.ch/blog/2008/06/05/Drink-Don%E2%80%99t-Drive.html</link>
            <description>&lt;p&gt;&lt;img alt=&quot;BEER - Now cheaper than gas! Drink, don’t drive&quot; src=&quot;/images/blog/2008-06-05-drink-dont-drive.jpg&quot; /&gt;&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/?permalink=Drink-Don%E2%80%99t-Drive.html</guid>
			<pubDate>Thu, 5 Jun 2008 12:24:37 +0200</pubDate>
                    </item>
        	            <item>
            <title>UNIX Tool Tip: cdargs</title>
            <!--<link>http://www.entropy.ch/blog/Mac+OS+X/?permalink=UNIX-Tool-Tip-cdargs.html</link>-->
            <link>http://www.entropy.ch/blog/Mac+OS+X/2008/06/03/UNIX-Tool-Tip-cdargs.html</link>
            <description>&lt;p&gt;A &lt;a href=&quot;http://ms.stradax.net/&quot;&gt;coworker&lt;/a&gt; just showed me the useful UNIX tool &lt;a href=&quot;http://www.skamphausen.de/software/cdargs&quot;&gt;cdargs&lt;/a&gt;. It provides bookmarks for often used directories in the shell.&lt;/p&gt;

&lt;p&gt;You can do something similar with shell aliases and &lt;code&gt;pushd&lt;/code&gt;/&lt;code&gt;popd&lt;/code&gt;, but I find this far more convenient.&lt;/p&gt;

&lt;p&gt;It doesn’t seem to be in &lt;a href=&quot;http://www.macports.org/&quot;&gt;MacPorts&lt;/a&gt;, so I downloaded, compiled and installed the source package with these commands:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;$ curl -s http://www.skamphausen.de/software/cdargs/cdargs-1.35.tar.gz | tar -xzf -
$ cd cdargs-1.35/
$ ./configure &amp;&amp; make
$ sudo make install
Password:

$ cp contrib/cdargs-bash.sh /usr/local/bin/

$ echo &quot;. cdargs-bash.sh&quot; &gt;&gt; ~/.bashrc&lt;/pre&gt;

&lt;p&gt;Reopen the terminal window and you’ll get two new commands:&lt;/p&gt;

&lt;dl&gt;
&lt;dt&gt;&lt;code&gt;ca&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;creates a bookmark of the current directory&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;cv&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;displays the list of bookmarks and changes the directory if you pick one.&lt;/dd&gt;
&lt;/dl&gt;

&lt;p&gt;Here’s cdargs in action:&lt;/p&gt;

&lt;object classid=&quot;clsid:D27CDB6E-AE6D-11cf-96B8-444553540000&quot; width=&quot;480&quot; height=&quot;242&quot;&gt; &lt;param name=&quot;movie&quot; value=&quot;http://content.screencast.com/bootstrap.swf&quot;&gt;&lt;/param&gt; &lt;param name=&quot;quality&quot; value=&quot;high&quot;&gt;&lt;/param&gt; &lt;param name=&quot;bgcolor&quot; value=&quot;#FFFFFF&quot;&gt;&lt;/param&gt; &lt;param name=&quot;flashVars&quot; value=&quot;thumb=http://content.screencast.com/media/4bcee87f-6718-44e3-a718-a91bcb3c3509_44c88439-ed70-47ca-b72b-cbaadafb67b2_static_0_0_Thumbnail.gif&amp;content=http://content.screencast.com/media/758f29b8-3c4a-4a4d-9eb4-a71c8f78b645_44c88439-ed70-47ca-b72b-cbaadafb67b2_static_0_0_00000017.swf&amp;width=480&amp;height=242&quot;&gt;&lt;/param&gt; &lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;/param&gt; &lt;param name=&quot;scale&quot; value=&quot;showall&quot;&gt;&lt;/param&gt; &lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot;&gt;&lt;/param&gt;  &lt;embed src=&quot;http://content.screencast.com/bootstrap.swf&quot; quality=&quot;high&quot; bgcolor=&quot;#FFFFFF&quot; width=&quot;480&quot; height=&quot;242&quot; type=&quot;application/x-shockwave-flash&quot; allowScriptAccess=&quot;always&quot; flashVars=&quot;thumb=http://content.screencast.com/media/4bcee87f-6718-44e3-a718-a91bcb3c3509_44c88439-ed70-47ca-b72b-cbaadafb67b2_static_0_0_Thumbnail.gif&amp;content=http://content.screencast.com/media/758f29b8-3c4a-4a4d-9eb4-a71c8f78b645_44c88439-ed70-47ca-b72b-cbaadafb67b2_static_0_0_00000017.swf&amp;width=480&amp;height=242&quot; allowFullScreen=&quot;true&quot; scale=&quot;showall&quot;&gt;&lt;/embed&gt; &lt;/object&gt;


&lt;p&gt;A bookmark consists of a directory path and a shortcut word. &lt;code&gt;ca&lt;/code&gt; without argument uses the current directory name as shortcut. Sometimes that’s not what you want so you can explicitly choose the shortcut by passing it as argument:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;ca arteria&lt;/pre&gt;

&lt;p&gt;&lt;code&gt;cv&lt;/code&gt; without argument shows a list of all bookmarks and lets you choose a directory to change to. With a shortcut as argument, it changes immediately to that directory. This usage supports completion of the shortcut so you only have to type an unambiguous prefix and hit the tab and return keys.&lt;/p&gt;

&lt;p&gt;The list view can do a few more things, for example&lt;/p&gt;

&lt;ul&gt;

&lt;li&gt;it supports &lt;a href=&quot;http://en.wikipedia.org/wiki/Vi&quot;&gt;vi&lt;/a&gt;-style h/j/k/l navigation&lt;/li&gt;
&lt;li&gt;you can drill down into a bookmarked directory with the arrow or “l” key to enter some subdirectory directly&lt;/li&gt;
&lt;li&gt;typing “v” edits the list in your text editor of choice&lt;/li&gt;
&lt;li&gt;typing “d” deletes a bookmark from the list&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Update 2008-08-31: I just &lt;a href=&quot;http://trac.macports.org/ticket/16420&quot;&gt;submitted a port&lt;/a&gt; for cdargs to MacPorts, hopefully you can soon get it from there.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Mac+OS+X/?permalink=UNIX-Tool-Tip-cdargs.html</guid>
			<pubDate>Tue, 3 Jun 2008 14:22:16 +0200</pubDate>
                    </item>
        	            <item>
            <title>Pimp My BBEdit: Execute Scripts on Wakeup With SleepWatcher</title>
            <!--<link>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Pimp-My-BBEdit-Execute-Scripts-on-Wakeup-With-SleepWatcher.html</link>-->
            <link>http://www.entropy.ch/blog/Mac+OS+X/2008/05/28/Pimp-My-BBEdit-Execute-Scripts-on-Wakeup-With-SleepWatcher.html</link>
            <description>&lt;p&gt;This is starting to look like a BBEdit blog :-) Can you tell I spend most of my working hours in this program... I guess I should have a category for it.&lt;/p&gt;

&lt;p&gt;Anyway, a few weeks ago I posted a &lt;a href=&quot;http://www.entropy.ch/blog/Mac+OS+X/2008/05/08/BBEdit-AppleScript-Move-Palettes-to-Screen-Edge.html&quot;&gt;script to move BBEdit’s palettes&lt;/a&gt; to the screen edge. After a while, I got tired of executing it manually. My screen resolution usually changes when the machine wakes from sleep, so I looked for utilities that run AppleScripts on wakeup and found the fantastic &lt;a href=&quot;http://www.bernhard-baehr.de/&quot;&gt;SleepWatcher&lt;/a&gt;, a command line tool that does exactly what I want.&lt;/p&gt;

&lt;p&gt;I installed it, along with its startup item. Then I created a &lt;code&gt;.wakeup&lt;/code&gt; file in my home directory, made it executable and put this in it:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;#!/bin/sh

ps ax | grep -v grep | grep -q BBEdit &amp;&amp; osascript ~/Library/Scripts/Applications/BBEdit/Move\ Palettes\ to\ Screen\ Edge.scpt&lt;/pre&gt;

&lt;p&gt;The other situation where the script should run automatically is when BBEdit is launched, because it is likely that the screen resolution was different when it quit. BBEdit remembers the palette positions and puts them in the wrong spot.&lt;/p&gt;

&lt;p&gt;Fortunately, BBEdit can do exactly that. It runs scripts in the &lt;code&gt;$HOME/Library/Application Support/BBEdit/Startup Items&lt;/code&gt; folder when it starts so I put an alias pointing to the script there and it works perfectly.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Pimp-My-BBEdit-Execute-Scripts-on-Wakeup-With-SleepWatcher.html</guid>
			<pubDate>Wed, 28 May 2008 19:55:45 +0200</pubDate>
                    </item>
        	            <item>
            <title>BBEdit AppleScript: Improved Duplicate Lines and Select Lines</title>
            <!--<link>http://www.entropy.ch/blog/Mac+OS+X/?permalink=BBEdit-AppleScript-Improved-Duplicate-Lines-and-Select-Lines.html</link>-->
            <link>http://www.entropy.ch/blog/Mac+OS+X/2008/05/25/BBEdit-AppleScript-Improved-Duplicate-Lines-and-Select-Lines.html</link>
            <description>&lt;p&gt;Here are improved versions of two AppleScripts introduced in an &lt;a href=&quot;http://www.entropy.ch/blog/Developer/2008/04/13/AppleScripts-for-Some-Missing-BBEdit-Text-Operations.html&quot;&gt;earlier post&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Duplicate Lines&lt;/h2&gt;

&lt;p&gt;The first is a better “Duplicate Lines” script. The improvements are that there can now be multiple duplicated lines. As before, the selection doesn’t have to precisely contain the lines, it’s enough to merely “touch” them.&lt;/p&gt;

&lt;p&gt;Before:&lt;/p&gt;

&lt;p&gt;&lt;img class=&quot;screenshot&quot; alt=&quot;BBEdit selection before Duplicate Lines script&quot; src=&quot;/images/blog/2008-05-25-duplicate-lines-before.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;After:&lt;/p&gt;

&lt;p&gt;&lt;img class=&quot;screenshot&quot; alt=&quot;BBEdit selection after Duplicate Lines script&quot; src=&quot;/images/blog/2008-05-25-duplicate-lines-after.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Also new is that the selection is preserved in the copy. Here’s the code:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;set {l1, l2, start, len, selLines, selLinesLen} to getSelection()

tell application &quot;BBEdit&quot;
	tell window 1
		local lineno
		local lastline
		local emptyLine
		set emptyLine to false
		
		set destinationline to l2 + 1
		set lineCount to count lines
		set lastline to destinationline &gt; lineCount
		if lastline then
			set destination to insertion point after line destinationline
			set contents of destination to return
			set AppleScript&#39;s text item delimiters to &quot;&quot;
			if length of selLines &gt; 1 then
				set selLines to (characters 1 through ((length of selLines) - 1) of selLines) as string
				set start to start + 1
			else
				set emptyLine to true
			end if
		end if
		set destination to insertion point before line destinationline
		if emptyLine is not true then
			set contents of destination to selLines
		end if
		set selLinesLength to length of selLines
		set selectionStart to start + selLinesLength
		set selectionEnd to selectionStart + (len - 1)
		
		if len &gt; 0 then
			select (characters selectionStart through selectionEnd)
		else
			select insertion point after character (selectionStart - 1)
		end if
		
	end tell
end tell


on getSelection()
	local l1, l2, start, len
	tell application &quot;BBEdit&quot;
		tell selection
			set {l1, l2} to {startLine, endLine}
			set {start, len} to {characterOffset, length}
			if length &gt; 0 and endColumn = 1 then
				set l2 to l2 - 1
			end if
		end tell
		set selLines to my collectLines(window 1, l1, l2)
		set selLinesLen to length of selLines
	end tell
	return {l1, l2, start, len, selLines, selLinesLen}
	return {l1:l1, l2:l2, start:start, len:len, selLines:selLines, selLinesLen:selLinesLen}
end getSelection


on collectLines(win, l1, l2)
	local mytext, mystring
	set mytext to &quot;&quot;
	tell win
		repeat with l from l1 to l2
			set mytext to mytext &amp;amp; contents of line l &amp;amp; return
		end repeat
	end tell
	return mytext
end collectLines&lt;/pre&gt;

&lt;a href=&quot;applescript://com.apple.scripteditor?action=new&amp;script=set%20%7bl1%2c%20l2%2c%20start%2c%20len%2c%20selLines%2c%20selLinesLen%7d%20to%20getSelection()%0a%0atell%20application%20%22BBEdit%22%0a%09tell%20window%201%0a%09%09local%20lineno%0a%09%09local%20lastline%0a%09%09local%20emptyLine%0a%09%09set%20emptyLine%20to%20false%0a%09%09%0a%09%09set%20destinationline%20to%20l2%20%2b%201%0a%09%09set%20lineCount%20to%20count%20lines%0a%09%09set%20lastline%20to%20destinationline%20%3e%20lineCount%0a%09%09if%20lastline%20then%0a%09%09%09set%20destination%20to%20insertion%20point%20after%20line%20destinationline%0a%09%09%09set%20contents%20of%20destination%20to%20return%0a%09%09%09set%20AppleScript&#39;s%20text%20item%20delimiters%20to%20%22%22%0a%09%09%09if%20length%20of%20selLines%20%3e%201%20then%0a%09%09%09%09set%20selLines%20to%20(characters%201%20through%20((length%20of%20selLines)%20-%201)%20of%20selLines)%20as%20string%0a%09%09%09%09set%20start%20to%20start%20%2b%201%0a%09%09%09else%0a%09%09%09%09set%20emptyLine%20to%20true%0a%09%09%09end%20if%0a%09%09end%20if%0a%09%09set%20destination%20to%20insertion%20point%20before%20line%20destinationline%0a%09%09if%20emptyLine%20is%20not%20true%20then%0a%09%09%09set%20contents%20of%20destination%20to%20selLines%0a%09%09end%20if%0a%09%09set%20selLinesLength%20to%20length%20of%20selLines%0a%09%09set%20selectionStart%20to%20start%20%2b%20selLinesLength%0a%09%09set%20selectionEnd%20to%20selectionStart%20%2b%20(len%20-%201)%0a%09%09%0a%09%09if%20len%20%3e%200%20then%0a%09%09%09select%20(characters%20selectionStart%20through%20selectionEnd)%0a%09%09else%0a%09%09%09select%20insertion%20point%20after%20character%20(selectionStart%20-%201)%0a%09%09end%20if%0a%09%09%0a%09end%20tell%0aend%20tell%0a%0a%0aon%20getSelection()%0a%09local%20l1%2c%20l2%2c%20start%2c%20len%0a%09tell%20application%20%22BBEdit%22%0a%09%09tell%20selection%0a%09%09%09set%20%7bl1%2c%20l2%7d%20to%20%7bstartLine%2c%20endLine%7d%0a%09%09%09set%20%7bstart%2c%20len%7d%20to%20%7bcharacterOffset%2c%20length%7d%0a%09%09%09if%20length%20%3e%200%20and%20endColumn%20=%201%20then%0a%09%09%09%09set%20l2%20to%20l2%20-%201%0a%09%09%09end%20if%0a%09%09end%20tell%0a%09%09set%20selLines%20to%20my%20collectLines(window%201%2c%20l1%2c%20l2)%0a%09%09set%20selLinesLen%20to%20length%20of%20selLines%0a%09end%20tell%0a%09return%20%7bl1%2c%20l2%2c%20start%2c%20len%2c%20selLines%2c%20selLinesLen%7d%0a%09return%20%7bl1:l1%2c%20l2:l2%2c%20start:start%2c%20len:len%2c%20selLines:selLines%2c%20selLinesLen:selLinesLen%7d%0aend%20getSelection%0a%0a%0aon%20collectLines(win%2c%20l1%2c%20l2)%0a%09local%20mytext%2c%20mystring%0a%09set%20mytext%20to%20%22%22%0a%09tell%20win%0a%09%09repeat%20with%20l%20from%20l1%20to%20l2%0a%09%09%09set%20mytext%20to%20mytext%20%26%20contents%20of%20line%20l%20%26%20return%0a%09%09end%20repeat%0a%09end%20tell%0a%09return%20mytext%0aend%20collectLines%0a%0a%0a&quot;&gt;Open the code in a new Script Editor window&lt;/a&gt;.

&lt;p&gt;It started out cleaner than this. Unfortunately, BBEdit’s text model seems a bit non-uniform in the area of empty and last lines. By the time I had all special cases covered so it behaved like I wanted it to, it didn’t look so clean anymore. I’d love to see an improved, shorter version that does the same.&lt;/p&gt;

&lt;p&gt;Running it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;on the very last line of the document may not introduce an additional empty last line after the copy&lt;/li&gt;
&lt;li&gt;with the last line of the selection empty should not introduce or drop empty lines&lt;/li&gt;
&lt;li&gt;with and without a trailing newline at the end of the selection should produce identical results&lt;/li&gt;
&lt;li&gt;on a completely empty line should add a completely empty line&lt;/li&gt;
&lt;li&gt;must preserve the selection in every case&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Select Lines&lt;/h2&gt;

&lt;p&gt;The improvements here are similar: The script can now select multiple full lines if there is a selection that spans multiple lines. If there’s no selection, behaves like the old version and selects the entire line with the cursor.&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;set {l1, l2} to getSelection()
tell application &quot;BBEdit&quot;
	tell window 1
		select (lines l1 through l2)
	end tell
end tell


on getSelection()
	local l1, l2
	tell application &quot;BBEdit&quot;
		tell selection
			set {l1, l2} to {startLine, endLine}
			if length &gt; 0 and character -1 of (contents as string) = return then
				set l2 to l2 - 1
			end if
		end tell
	end tell
	return {l1, l2}
end getSelection&lt;/pre&gt;


&lt;a href=&quot;applescript://com.apple.scripteditor?action=new&amp;script=set%20%7bl1%2c%20l2%7d%20to%20getSelection()%0atell%20application%20%22BBEdit%22%0a%09tell%20window%201%0a%09%09select%20(lines%20l1%20through%20l2)%0a%09end%20tell%0aend%20tell%0a%0a%0aon%20getSelection()%0a%09local%20l1%2c%20l2%0a%09tell%20application%20%22BBEdit%22%0a%09%09tell%20selection%0a%09%09%09set%20%7bl1%2c%20l2%7d%20to%20%7bstartLine%2c%20endLine%7d%0a%09%09%09if%20length%20%3e%200%20and%20character%20-1%20of%20(contents%20as%20string)%20=%20return%20then%0a%09%09%09%09set%20l2%20to%20l2%20-%201%0a%09%09%09end%20if%0a%09%09end%20tell%0a%09end%20tell%0a%09return%20%7bl1%2c%20l2%7d%0aend%20getSelection%0a&quot;&gt;Open the code in a new Script Editor window&lt;/a&gt;.

</description>
            <guid>http://www.entropy.ch/blog/Mac+OS+X/?permalink=BBEdit-AppleScript-Improved-Duplicate-Lines-and-Select-Lines.html</guid>
			<pubDate>Sun, 25 May 2008 18:42:46 +0200</pubDate>
                    </item>
        	             <item>
            <title>Pie Chart</title>
            <!--<link>http://www.entropy.ch/blog/?permalink=Pie-Chart.html</link>-->
            <link>http://www.entropy.ch/blog/2008/05/22/Pie-Chart.html</link>
            <description>&lt;p&gt;I thought this pie chart is pretty funny:&lt;/p&gt;

&lt;img style=&quot;display: block; background-color: white; padding: 10px;&quot; alt=&quot;Pie Chart&quot; src=&quot;http://www.blogsmithmedia.com/www.tuaw.com/media/2008/05/66pct.gif&quot; /&gt;

[via &lt;a href=&quot;http://www.tuaw.com/2008/05/19/two-thirds-of-premium-pcs-sold-at-retail-are-macs/&quot;&gt;TUAW&lt;/a&gt;]
</description>
            <guid>http://www.entropy.ch/blog/?permalink=Pie-Chart.html</guid>
			<pubDate>Thu, 22 May 2008 11:48:47 +0200</pubDate>
                    </item>
        	            <item>
            <title>How an XML DOCTYPE Can Bring Down Your App</title>
            <!--<link>http://www.entropy.ch/blog/Developer/?permalink=How-an-XML-DOCTYPE-Can-Bring-Down-Your-App.html</link>-->
            <link>http://www.entropy.ch/blog/Developer/2008/05/14/How-an-XML-DOCTYPE-Can-Bring-Down-Your-App.html</link>
            <description>&lt;p&gt;Here’s something that can bite you if your web or desktop applications work with XML data.&lt;/p&gt;

&lt;p&gt;I knew about this issue but it just happened to me again recently. One of my web applications came to a grinding halt. The application logic ran to completion, but the final phase of XSLT-based markup generation would just hang without any response to the client. After several minutes the web framework would abort with an error indicating a problem in the XSLT processing.&lt;/p&gt;

&lt;p&gt;As &lt;a href=&quot;http://www.entropy.ch/blog/Developer/2007/04/09/Unicode-Common-Locale-Data-Repository.html&quot;&gt;noted before&lt;/a&gt;, I’m a big fan of the Unicode consortium’s CLDR locale database. Working for Swiss clients, most of our applications have to support at least three national languages plus English, and CLDR is a great resource for such multilingual projects. It provides localized names for many things such as currencies, countries, and months in a set of XML files in a format called &lt;a href=&quot;http://unicode.org/reports/tr35/&quot;&gt;LDML&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;My XSLT transformation reads these XML files with the &lt;code&gt;&lt;a href=&quot;http://www.w3.org/TR/xslt#document&quot;&gt;document()&lt;/a&gt;&lt;/code&gt; function and uses the localized names to translate elements of the application’s user interface. This worked fine for many months, so why did it stop now?&lt;/p&gt;

&lt;p&gt;This is how an LDML file starts:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; ?&gt;
&amp;lt;!DOCTYPE ldml SYSTEM &quot;http://www.unicode.org/cldr/dtd/1.5/ldml.dtd&quot;&gt;
&amp;lt;ldml&gt;
	&amp;lt;identity&gt;
		&amp;lt;version number=&quot;$Revision: 1.50 $&quot;/&gt;
		&amp;lt;generation date=&quot;$Date: 2007/07/19 22:31:38 $&quot;/&gt;
		&amp;lt;language type=&quot;de&quot;/&gt;
		&amp;lt;territory type=&quot;CH&quot;/&gt;&lt;/pre&gt;

&lt;p&gt;Note the &lt;code&gt;DOCTYPE&lt;/code&gt; declaration with its system identifier pointing to the LDML &lt;a href=&quot;http://en.wikipedia.org/wiki/Document_Type_Definition&quot;&gt;DTD&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It turns out that my XSLT processor’s &lt;code&gt;document()&lt;/code&gt; function implementation follows that URL to fetch the DTD. The reason my web application suddenly stopped working was that on that day, the unicode.org website went down, taking my app with it...&lt;/p&gt;

You can reproduce the problem on the command line with &lt;a href=&quot;http://xmlsoft.org/XSLT/xsltproc2.html&quot;&gt;libxslt’s &lt;code&gt;xsltproc&lt;/code&gt;&lt;/a&gt;. Put the following into test.xslt:

&lt;pre class=&quot;code&quot;&gt;&amp;lt;xsl:stylesheet version=&quot;1.0&quot; xmlns:xsl=&quot;http://www.w3.org/1999/XSL/Transform&quot;&gt;
&amp;lt;xsl:template match=&quot;/&quot;&gt;
	&amp;lt;xsl:variable name=&quot;foo&quot; select=&quot;document(&#39;test.xml&#39;)&quot; /&gt;
	&amp;lt;test/&gt;
&amp;lt;/xsl:template&gt;
&amp;lt;/xsl:stylesheet&gt;&lt;/pre&gt;

&lt;p&gt;And this into test.xml:&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;&amp;lt;!DOCTYPE ldml SYSTEM &quot;http://www.unicode.org/cldr/dtd/1.5/ldml.dtd&quot;&gt;
&amp;lt;ldml/&gt;&lt;/pre&gt;

&lt;p&gt;Now run it through &lt;code&gt;xsltproc&lt;/code&gt;:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;$ time echo &#39;&amp;lt;ldml/&gt;&#39; | xsltproc test.xslt -
&amp;lt;?xml version=&quot;1.0&quot;?&gt;
&amp;lt;test/&gt;

real	0m6.467s
user	0m0.013s
sys	0m0.008s&lt;/pre&gt;

&lt;p&gt;Wow. 6 seconds for something that should take a few milliseconds. Let’s try this again, this time denying &lt;code&gt;xsltproc&lt;/code&gt; net access with its &lt;code&gt;--nonet&lt;/code&gt; option:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;$ time echo &#39;&amp;lt;ldml/&gt;&#39; | xsltproc --nonet test.xslt -
I/O error : Attempt to load network entity http://www.unicode.org/cldr/dtd/1.5/ldml.dtd
test.xml:1: warning: failed to load external entity &quot;http://www.unicode.org/cldr/dtd/1.5/ldml.dtd&quot;
&amp;lt;!DOCTYPE ldml SYSTEM &quot;http://www.unicode.org/cldr/dtd/1.5/ldml.dtd&quot;&gt;
                                                                     ^
&amp;lt;?xml version=&quot;1.0&quot;?&gt;
&amp;lt;test/&gt;

real	0m0.006s
user	0m0.002s
sys	0m0.005s&lt;/pre&gt;

&lt;p&gt;That’s better, 6 milliseconds is more like it. &lt;code&gt;xsltproc&lt;/code&gt; complained about the net access on STDERR, but it did produce the output.&lt;/p&gt;

&lt;p&gt;The clean solution in my web app would be to switch off net access like this. Unfortunately I don’t see a feature similar to the &lt;code&gt;--nonet&lt;/code&gt; switch in the XSLT processor API and version I use (&lt;a href=&quot;http://search.cpan.org/~pajas/XML-LibXSLT/&quot;&gt;XML::LibXSLT&lt;/a&gt;). What I did instead was to remove the system identifier from all LDML files:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; ?&gt;
&amp;lt;!DOCTYPE ldml&gt;
&amp;lt;ldml&gt;
	&amp;lt;identity&gt;
		&amp;lt;version number=&quot;$Revision: 1.50 $&quot;/&gt;&lt;/pre&gt;

&lt;p&gt;Back on the command line, it now looks like this:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;$ time echo &#39;&amp;lt;ldml/&gt;&#39; | xsltproc --nonet test.xslt -
&amp;lt;?xml version=&quot;1.0&quot;?&gt;
&amp;lt;test/&gt;

real	0m0.006s
user	0m0.002s
sys	0m0.005s&lt;/pre&gt;

&lt;p&gt;So to recap, if you run XML data through an XML parser, make sure it doesn’t try to load external entities via HTTP when it doesn’t have to. It could cause long delays and take down your application.&lt;/p&gt;

&lt;p&gt;I wonder how many hits sites like unicode.org get because of this.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; My co-worker Patrick Stählin sent me one answer to the question above, at the W3C which effectively finds itself at the receiving end of a distributed denial of service attack: &lt;a href=&quot;http://www.w3.org/blog/systeam/2008/02/08/w3c_s_excessive_dtd_traffic&quot;&gt;W3C’s Excessive DTD Traffic&lt;/a&gt;.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Developer/?permalink=How-an-XML-DOCTYPE-Can-Bring-Down-Your-App.html</guid>
			<pubDate>Wed, 14 May 2008 04:01:21 +0200</pubDate>
                    </item>
        	            <item>
            <title>Fix Cycle Windows Shortcut in Apple Numbers With a Script</title>
            <!--<link>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Fix-Cycle-Windows-Shortcut-in-Apple-Numbers-With-a-Script.html</link>-->
            <link>http://www.entropy.ch/blog/Mac+OS+X/2008/05/13/Fix-Cycle-Windows-Shortcut-in-Apple-Numbers-With-a-Script.html</link>
            <description>&lt;p&gt;It drives me &lt;em&gt;nuts&lt;/em&gt; that pressing the ⌘-&amp;lt; keyboard shortcut in Apple’s &lt;a href=&quot;http://www.apple.com/iwork/numbers/&quot;&gt;Numbers&lt;/a&gt; application zooms out instead of cycling through the open windows like in every other application on Mac OS X. I use  this shortcut all the time, thereby shrinking my spreadsheet. I can’t believe it’s an Apple application that gets this wrong.&lt;/p&gt;

&lt;p&gt;I realized later that I can simply remap the “Zoom Out” menu command in System Preferences to get the default behavior back.&lt;/p&gt;

&lt;p&gt;Before that I wrote the following AppleScript that uses GUI scripting to cycle through the open windows:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;tell application &quot;System Events&quot;
	tell window -1 of process &quot;Numbers&quot; to perform action 1
end tell&lt;/pre&gt;

&lt;p&gt;Action 1 seems to be the “Raise” action, I found that by poking around in the live System Events data structures in &lt;a href=&quot;http://www.latenightsw.com/sd4/explore.html&quot;&gt;ScriptDebugger’s Explorer&lt;/a&gt; view.&lt;/p&gt;

&lt;p&gt;I assigned this script to ⌘-&amp;lt; using &lt;a href=&quot;http://www.red-sweater.com/fastscripts/&quot;&gt;FastScripts&lt;/a&gt; and it worked fine.

&lt;p&gt;I love how I can “fix” all kinds of application features with FastScripts because it intercepts keyboard events so early in the process. For example, Safari remembers window positions a bit too aggressively for my taste, so I now override the “New Window” command ⌘-N with my own version that sizes the window to a default dimension:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;tell application &quot;Safari&quot;
	make new document
	set bounds of window 1 to {110, 60, 1000, 1000}
end tell&lt;/pre&gt;

&lt;p&gt;I also have a separate script to just resize the front window, it’s the same without the “make new document” line and I assigned it to ⌘-1. I used to do that with a JavaScript bookmarklet but that didn’t remember the new window position, and the AppleScript version does.&lt;/p&gt;

</description>
            <guid>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Fix-Cycle-Windows-Shortcut-in-Apple-Numbers-With-a-Script.html</guid>
			<pubDate>Tue, 13 May 2008 15:07:13 +0200</pubDate>
                    </item>
        	            <item>
            <title>del.icio.us Links on 2008-05-08</title>
            <!--<link>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2008-05-08.html</link>-->
            <link>http://www.entropy.ch/blog/Links/2008/05/08/del-icio-us-Links-on-2008-05-08.html</link>
            <description>&lt;ul class=&quot;delicious&quot;&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://www.youtube.com/watch?v=QsTqspnvAaI&quot;&gt;YouTube - Crayon Physics Deluxe&lt;/a&gt; &lt;/div&gt;
				&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/Fun&quot;&gt;Fun&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/games&quot;&gt;games&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/interaction&quot;&gt;interaction&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/video&quot;&gt;video&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/physics&quot;&gt;physics&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/game&quot;&gt;game&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/youtube&quot;&gt;youtube&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/drawing&quot;&gt;drawing&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/interactive&quot;&gt;interactive&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
&lt;/ul&gt;
</description>
            <guid>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2008-05-08.html</guid>
			<pubDate>Thu, 8 May 2008 23:29:19 +0200</pubDate>
                    </item>
        	            <item>
            <title>BBEdit AppleScript: Move Palettes to Screen Edge</title>
            <!--<link>http://www.entropy.ch/blog/Mac+OS+X/?permalink=BBEdit-AppleScript-Move-Palettes-to-Screen-Edge.html</link>-->
            <link>http://www.entropy.ch/blog/Mac+OS+X/2008/05/08/BBEdit-AppleScript-Move-Palettes-to-Screen-Edge.html</link>
            <description>&lt;p&gt;I use my MacBook Pro both at home and at work, most of the time on external monitors whose resolutions differ. Together with the internal screen that makes three different resolutions.&lt;/p&gt;

&lt;p&gt;The constant changes mean that BBEdit’s palette windows, which I keep glued to the right screen edge, end up in the middle of the screen all the time. Moving them back to the screen edge every time is annoying so I wrote this AppleScript which I use with a keyboard shortcut to quickly move all open palettes back to where they belong.&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;tell application &quot;Finder&quot;
	set screenBounds to bounds of window of desktop
end tell

set screenWidth to item 3 of screenBounds

tell application &quot;BBEdit&quot;
	repeat with target in palettes
		tell target
			set b to bounds
			set paletteWidth to (item 3 of b) - (item 1 of b)
			set x to screenWidth - paletteWidth
			set item 3 of b to screenWidth
			set item 1 of b to x
			set bounds to b
		end tell
	end repeat
end tell&lt;/pre&gt;

&lt;p&gt;I found the screen resolution code at &lt;a href=&quot;http://daringfireball.net/2006/12/display_size_applescript_the_lazy_way&quot;&gt;Daring Fireball&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you’re into gratuitous eye candy as much as I am, here’s an animated version just for you:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;tell application &quot;Finder&quot;
	set screenBounds to bounds of window of desktop
end tell

set screenWidth to item 3 of screenBounds

tell application &quot;BBEdit&quot;
	repeat with target in palettes
		tell target
			set b to bounds
			set currentX to item 1 of b
			set paletteWidth to (item 3 of b) - currentX
			set targetX to screenWidth - paletteWidth
			set deltaX to targetX - currentX
			if deltaX ≠ 0 then
				repeat with nextX from currentX to targetX by (deltaX / 10)
					set item 1 of b to nextX
					set item 3 of b to nextX + paletteWidth
					set bounds to b
				end repeat
				set item 1 of b to targetX
				set item 3 of b to screenWidth
				set bounds to b
			end if
		end tell
	end repeat
end tell&lt;/pre&gt;

</description>
            <guid>http://www.entropy.ch/blog/Mac+OS+X/?permalink=BBEdit-AppleScript-Move-Palettes-to-Screen-Edge.html</guid>
			<pubDate>Thu, 8 May 2008 15:31:32 +0200</pubDate>
                    </item>
        	            <item>
            <title>del.icio.us Links on 2008-05-05</title>
            <!--<link>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2008-05-05.html</link>-->
            <link>http://www.entropy.ch/blog/Links/2008/05/05/del-icio-us-Links-on-2008-05-05.html</link>
            <description>&lt;ul class=&quot;delicious&quot;&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://phocks.org/stumble/lsd-history-comic/&quot;&gt;LSD History Comic -&gt; phocks.org stumbles&lt;/a&gt; &lt;/div&gt;
				&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/LSD&quot;&gt;LSD&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/drugs&quot;&gt;drugs&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/history&quot;&gt;history&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/comic&quot;&gt;comic&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/Fun&quot;&gt;Fun&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/graphics&quot;&gt;graphics&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/Humor&quot;&gt;Humor&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/science&quot;&gt;science&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
&lt;/ul&gt;
</description>
            <guid>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2008-05-05.html</guid>
			<pubDate>Mon, 5 May 2008 23:29:09 +0200</pubDate>
                    </item>
        	            <item>
            <title>XML Pretty Printing in BBEdit and vi With xmllint</title>
            <!--<link>http://www.entropy.ch/blog/Developer/?permalink=XML-Pretty-Printing-in-BBEdit-and-vi-With-xmllint.html</link>-->
            <link>http://www.entropy.ch/blog/Developer/2008/04/23/XML-Pretty-Printing-in-BBEdit-and-vi-With-xmllint.html</link>
            <description>&lt;p&gt;Here’s a little trick to format XML in BBEdit and vi.&lt;/p&gt;

&lt;p&gt;BBEdit can format markup, but none of its built-in styles do what I want. Like so often when working with XML, the awesome &lt;a href=&quot;http://xmlsoft.org/&quot;&gt;libxml&lt;/a&gt; library helps out. It comes with the &lt;a href=&quot;http://xmlsoft.org/xmllint.html&quot;&gt;xmllint&lt;/a&gt; command line utility, which formats XML in a way I like.&lt;/p&gt;

&lt;p&gt;In BBEdit, I use it as a UNIX Filter by storing the following script as &lt;code&gt;xmllint.sh&lt;/code&gt; in the &lt;code&gt;$HOME/Library/Application Support/BBEdit/Text Filters/xml&lt;/code&gt; directory.&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;#!/bin/sh

XMLLINT_INDENT=$&#39;\t&#39; xmllint --format -&lt;/pre&gt;

&lt;img class=&quot;right&quot; alt=&quot;BBEdit UNIX Filters Palette with xmllint Script&quot; src=&quot;/images/blog/2008-04-23-bbedit-unix-filters.png&quot; /&gt;

&lt;p&gt;You can use spaces instead of a tab by changing &lt;code&gt;\t&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It should show up in your UNIX Filters palette. Keep in mind that UNIX Filters in BBEdit operate on the selection or on the entire document if nothing is selected so you should make sure that there’s no selection.&lt;/p&gt;

&lt;p style=&quot;clear: both;&quot;&gt;The following version additionally performs some normalization (sort attribute order, unify attribute quotes etc.) by &lt;a href=&quot;http://www.w3.org/TR/xml-c14n&quot;&gt;canonicalizing&lt;/a&gt; the output first.&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;#!/bin/sh

xmllint --c14n - | XMLLINT_INDENT=$&#39;\t&#39; xmllint --format -&lt;/pre&gt;


&lt;p&gt;The vi editor also has a filter feature. To format using xmllint, type this sequence:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;:%!xmllint --format -&lt;/pre&gt;

Or mark the area visually and then type

&lt;pre class=&quot;code&quot;&gt;!xmllint --format -&lt;/pre&gt;

&lt;p&gt;The video shows these two:&lt;/p&gt;

&lt;div id=&quot;video.2008-04-18.xmllint&quot;&gt;
    &lt;a href=&quot;/video/blog/2008-04-18-xmllint.m4v&quot;&gt;Video: xmllint&lt;/a&gt;
&lt;/div&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
    flashembed(&quot;video.2008-04-18.xmllint&quot;,
        {src:&#39;/video/flowplayer/FlowPlayerDark.swf&#39;, width: 320,  height: 262},
        {config: {
            videoFile: &#39;blog/2008-04-18-xmllint.m4v&#39;,
            configFileName: &#39;http://www.entropy.ch/video/flowplayer/config.js&#39;
        }}
    );
&lt;/script&gt;

&lt;p&gt;&lt;strong&gt;Update May 2012:&lt;/strong&gt; Adjusted the shell script snippets for BBEdit 10 and TextWrangler 4, which pass the text on STDIN instead of in a temp file. Also adjusted the location of text filter scripts inside BBEdit’s Application Support directory.&lt;/p&gt;






</description>
            <guid>http://www.entropy.ch/blog/Developer/?permalink=XML-Pretty-Printing-in-BBEdit-and-vi-With-xmllint.html</guid>
			<pubDate>Wed, 23 Apr 2008 16:28:34 +0200</pubDate>
                    </item>
        	             <item>
            <title>Vandalismus muss nicht sein</title>
            <!--<link>http://www.entropy.ch/blog/?permalink=Vandalismus-muss-nicht-sein.html</link>-->
            <link>http://www.entropy.ch/blog/2008/04/16/Vandalismus-muss-nicht-sein.html</link>
            <description>&lt;p&gt;Saw this in Basel yesterday... Loosely translated it says “Vandalism doesn’t need to be!” :-)&lt;/p&gt;

&lt;a href=&quot;http://www.snapmania.com/users/mstock/vandalismus/&quot; class=&#39;img&#39;&gt;&lt;img alt=&quot;Vandalismus muss nicht sein&quot; src=&quot;/images/blog/2008-04-16-vandalismus-muss-nicht-sein.jpg&quot; /&gt;&lt;/a&gt;
</description>
            <guid>http://www.entropy.ch/blog/?permalink=Vandalismus-muss-nicht-sein.html</guid>
			<pubDate>Wed, 16 Apr 2008 20:32:53 +0200</pubDate>
                    </item>
        	            <item>
            <title>del.icio.us Links on 2008-04-15</title>
            <!--<link>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2008-04-15.html</link>-->
            <link>http://www.entropy.ch/blog/Links/2008/04/15/del-icio-us-Links-on-2008-04-15.html</link>
            <description>&lt;ul class=&quot;delicious&quot;&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://sigact.acm.org/floyd/&quot;&gt;Robert W Floyd, In Memoriam by Donald E. Knuth&lt;/a&gt; &lt;/div&gt;
		&lt;div class=&quot;delicious-extended&quot;&gt; Biography about computer scientist Robert W Floyd by Donald E. Knuth &lt;/div&gt;		&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/computerscience&quot;&gt;computerscience&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/acm&quot;&gt;acm&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/knuth&quot;&gt;knuth&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/cs&quot;&gt;cs&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/floyd&quot;&gt;floyd&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/history&quot;&gt;history&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/people&quot;&gt;people&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://www.zedshaw.com/tips/ragel_state_charts.html&quot;&gt;Ragel State Charts&lt;/a&gt; &lt;/div&gt;
		&lt;div class=&quot;delicious-extended&quot;&gt; Very good introduction to Ragel &lt;/div&gt;		&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/c&quot;&gt;c&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/parsing&quot;&gt;parsing&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/statemachine&quot;&gt;statemachine&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/programming&quot;&gt;programming&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/parser&quot;&gt;parser&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/compiler&quot;&gt;compiler&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/ragel&quot;&gt;ragel&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/languages&quot;&gt;languages&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/software&quot;&gt;software&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://www.falvotech.com/content/cut/&quot;&gt;CUT - A C Unit Tester&lt;/a&gt; &lt;/div&gt;
				&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/programming&quot;&gt;programming&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/unit-testing&quot;&gt;unit-testing&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/c&quot;&gt;c&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/unittesting&quot;&gt;unittesting&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
&lt;/ul&gt;
</description>
            <guid>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2008-04-15.html</guid>
			<pubDate>Tue, 15 Apr 2008 23:28:29 +0200</pubDate>
                    </item>
        	            <item>
            <title>AppleScripts for Some Missing BBEdit Text Operations</title>
            <!--<link>http://www.entropy.ch/blog/Developer/?permalink=AppleScripts-for-Some-Missing-BBEdit-Text-Operations.html</link>-->
            <link>http://www.entropy.ch/blog/Developer/2008/04/13/AppleScripts-for-Some-Missing-BBEdit-Text-Operations.html</link>
            <description>&lt;p&gt;BBEdit lacks some operations present in other editors such as NetBeans or Eclipse. Here are AppleScript implementations for some of them.&lt;/p&gt;

&lt;h2&gt;Kill Line&lt;/h2&gt;

&lt;p&gt;This command deletes the line with the cursor. It’s useful because the cursor position within the line and the selection don’t matter.&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;tell window 1 of application &quot;BBEdit&quot; to delete line (startLine of selection)&lt;/pre&gt;

&lt;p&gt;Recommended keyboard shortcut: ⌘⌥⌫ (Command-Option-Delete)&lt;/p&gt;

&lt;h2&gt;Duplicate Line&lt;/h2&gt;

&lt;p&gt;This duplicates the entire line with the cursor. Again the current cursor position and selection are irrelevant.&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;tell window 1 of application &quot;BBEdit&quot;
	duplicate line (startLine of selection)
	select insertion point before line ((startLine of selection) + 1)
end tell&lt;/pre&gt;

&lt;p&gt;Recommended keyboard shortcut: ⌘D (Command-D)&lt;/p&gt;

&lt;h2&gt;Move Line Up/Down&lt;/h2&gt;

&lt;p&gt;These exchange the line with the cursor with the previous or following line.&lt;/p&gt;

&lt;p&gt;To move up:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;tell application &quot;BBEdit&quot;
	set x to startLine of selection
	if x = 1 then
		beep
		return
	end if
	tell text 1 of window 1
		set oldCount to count of lines
		set myline to contents of line x
		delete line x
		if x = 2 then
			if length of line 1 = 0 then
				make line at beginning with data &quot;
&quot;
			end if
			make line at beginning with data myline
		else
			if length of line (x - 2) = 0 then
				make line at line (x - 2) with data &quot;
&quot;
				make line at line (x - 1) with data myline
			else
				make line at line (x - 2) with data myline
			end if
		end if
		select insertion point before line (x - 1)
	end tell
end tell&lt;/pre&gt;

&lt;p&gt;Recommended keyboard shortcut: ^⇡ (Ctrl-Up)&lt;/p&gt;

&lt;p&gt;To move down:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;tell application &quot;BBEdit&quot;
	set x to startLine of selection
	tell text 1 of window 1
		if x = (count of lines) then return
		set myline to contents of line x
		delete line x
		if length of line x = 0 then
			make line at line x with data &quot;
&quot;
			make line at line (x + 1) with data myline
		else
			make line at line x with data myline
			
		end if
		select insertion point before line (x + 1)
	end tell
end tell&lt;/pre&gt;

&lt;p&gt;Recommended keyboard shortcut: ^⇣ (Ctrl-Down)&lt;/p&gt;

&lt;p&gt;Unfortunately these are fairly ugly because special cases like blank or the first and last lines require special code. Also there is one bug left, if you move the last line up, a blank line is added at the end of the document. Let me know if you know of a better way to do this. A nice improvement would be the ability to move multiple lines up or down.&lt;/p&gt;

&lt;p&gt;It’s a bit annoying that something so simple is so hard to achieve.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Developer/?permalink=AppleScripts-for-Some-Missing-BBEdit-Text-Operations.html</guid>
			<pubDate>Sun, 13 Apr 2008 12:40:42 +0200</pubDate>
                    </item>
        	            <item>
            <title>Repeat Last Terminal Command With a Shortcut</title>
            <!--<link>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Repeat-Last-Terminal-Command-With-a-Shortcut.html</link>-->
            <link>http://www.entropy.ch/blog/Mac+OS+X/2008/04/08/Repeat-Last-Terminal-Command-With-a-Shortcut.html</link>
            <description>&lt;p&gt;When I work in the Terminal, I often have to repeat the last command from the history (and I mean &lt;em&gt;very&lt;/em&gt; often). It only takes two keystrokes—arrow up and return—but I wanted an even quicker shortcut like command-return which doesn’t make me leave the &lt;a href=&quot;http://en.wikipedia.org/wiki/Home_row&quot;&gt;home row&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I tried to implement it with some AppleScript and a shortcut utility to fire the script. You can use &lt;a href=&quot;http://www.red-sweater.com/fastscripts/&quot;&gt;FastScripts&lt;/a&gt; (paid) or &lt;a href=&quot;http://proxi.griffintechnology.com/&quot;&gt;Proxi&lt;/a&gt; (free) for that. I use FastScripts because it uses less memory and is, well, fast :-)&lt;/p&gt;

&lt;p&gt;Here’s my first attempt:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;tell application &quot;Terminal&quot; to do script &quot;!!&quot; in window 1&lt;/pre&gt;

&lt;p&gt;That works fine in a bash shell but not if I’m in other readline-based environments such as the &lt;code&gt;mysql&lt;/code&gt; client.&lt;/p&gt;

&lt;p&gt;So I tried to script the user input for pressing the up and return keys directly:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;tell application &quot;System Events&quot;
	tell process &quot;Terminal&quot;
		key code 126
		key code 36
	end tell
end tell&lt;/pre&gt;

&lt;p&gt;This works in both bash and other command interpreters&lt;/p&gt;

&lt;p&gt;Unfortunately it doesn’t work with my particular shortcut of choice command-return, because the command key is still down when the script runs. Terminal sees the input as command-arrow up, which is already assigned to “Line Up”. It would work with a different shortcut like ctrl-return.&lt;/p&gt;

&lt;p&gt;In the end I used escape sequences and that works in all cases:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;set up_command to string id {27} &amp;amp; &quot;[A&quot;
tell application &quot;Terminal&quot; to do script up_command in window 1&lt;/pre&gt;


&lt;p&gt;As a bonus, now that I have the script I can add an &lt;a href=&quot;http://alum.hampshire.edu/~bjk02/xGestures/&quot;&gt;xGestures&lt;/a&gt; mouse trigger, preferably a short one:&lt;/p&gt;

&lt;img class=&quot;screenshot&quot; alt=&quot;xGestures configuration window&quot; src=&quot;/images/blog/2008-04-08-xgestures-config.png&quot; /&gt;

&lt;p&gt;A stingle upward stroke runs the script:&lt;/p&gt;
&lt;img class=&quot;screenshot&quot; alt=&quot;xxx&quot; src=&quot;/images/blog/2008-04-08-xgestures-in-action.png&quot; /&gt;
</description>
            <guid>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Repeat-Last-Terminal-Command-With-a-Shortcut.html</guid>
			<pubDate>Tue, 8 Apr 2008 06:56:50 +0200</pubDate>
                    </item>
        	            <item>
            <title>Two AppleScripts for Perl/PHP Developers using BBEdit</title>
            <!--<link>http://www.entropy.ch/blog/Developer/?permalink=Two-AppleScripts-for-Perl-Developers-using-BBEdit.html</link>-->
            <link>http://www.entropy.ch/blog/Developer/2008/04/01/Two-AppleScripts-for-Perl-Developers-using-BBEdit.html</link>
            <description>&lt;p&gt;When I develop my Perl programs, I often run the programs or their tests in the Terminal, either locally or on a remote server. At the same time, I have the Perl class .pm files open in BBEdit, usually lots of them, again either from a local sandbox or from the remote server using SFTP (via &lt;a href=&quot;http://interarchy.com/&quot;&gt;Interarchy&lt;/a&gt; or &lt;a href=&quot;http://www.magnetk.com/expandrive&quot;&gt;ExpanDrive&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Very often during the edit/run/debug cycle I want to jump to the specific location (file and line number) of an error as displayed in the Terminal in BBEdit.&lt;/p&gt;

&lt;p&gt;I define an error location as a line in the Terminal history with this pattern:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;&amp;lt;some message text&gt; at &amp;lt;some file path ending in .pm&gt; line &amp;lt;a number&gt;&lt;/pre&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;img class=&quot;screenshot&quot; alt=&quot;Perl error message in Terminal&quot; src=&quot;/images/blog/2008-04-02-terminal-perl-error.png&quot; /&gt;

&lt;p&gt;It’s tedious to switch to BBEdit and hunt down the right document and line manually, so I wrote two AppleScripts to do it for me. Both scripts only consider documents which are already open in BBEdit so they won’t go and open documents for you. That would be hard to do correctly in all cases for remote files.&lt;/p&gt;

&lt;p&gt;This first script will only consider the very &lt;em&gt;first&lt;/em&gt; error line in the history of the frontmost Terminal window. This means you do not have to select the message, I only did that for illustration purposes in the screenshot above.&lt;/p&gt;

&lt;p&gt;Here’s the script:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;tell application &quot;Terminal&quot;
	set myhistory to history of window 1
end tell


set location to do shell script &quot;echo &quot; &amp;amp; quoted form of myhistory &amp;amp; &quot; | perl -n -e &#39;m#(\\w+/\\w+\\.(?:php|pm|pl))(?::(\\d+)| (?:on )?line (\\d+))# &amp;amp;&amp;amp; print qq#$1 # . ($2 || $3) . qq#\\n#&#39; | head -1&quot;
set locationInfo to |splittext|(&quot; &quot;, location)
if (count of locationInfo) &amp;lt; 2 then
	doGrowl()
	return
end if
set {locationFile, locationLine} to locationInfo

tell application &quot;BBEdit&quot;
	activate
	
	set hits to (text documents whose on disk is true and URL contains locationFile)
	--set hits to (documents whose URL contains locationFile)
	
	if (count of hits) &gt; 0 then
		set mydoc to first item of hits
		activate
		select mydoc
		select line (locationLine as number) of mydoc
	else
		display dialog &quot;No file called “&quot; &amp;amp; locationFile &amp;amp; &quot;” is open in BBEdit&quot;
	end if
end tell



on |splittext|(delimiter, someText)
	set prevTIDs to AppleScript&#39;s text item delimiters
	set AppleScript&#39;s text item delimiters to delimiter
	set output to text items of someText
	set AppleScript&#39;s text item delimiters to prevTIDs
	return output
end |splittext|


on doGrowl()
	tell application &quot;GrowlHelperApp&quot;
		-- Make a list of all the notification types 
		-- that this script will ever send:
		set the allNotificationsList to ¬
			{&quot;No Error Location Found&quot;}
		
		-- Make a list of the notifications 
		-- that will be enabled by default.      
		-- Those not enabled by default can be enabled later 
		-- in the &#39;Applications&#39; tab of the growl prefpane.
		set the enabledNotificationsList to ¬
			{&quot;No Error Location Found&quot;}
		
		-- Register our script with growl.
		-- You can optionally (as here) set a default icon 
		-- for this script&#39;s notifications.
		register as application ¬
			&quot;Show Error Location in BBEdit Script&quot; all notifications allNotificationsList ¬
			default notifications enabledNotificationsList ¬
			icon of application &quot;Terminal&quot;
		
		--	Send a Notification...
		notify with name ¬
			&quot;No Error Location Found&quot; title ¬
			&quot;No Error Location Found&quot; description ¬
			&quot;No Error Location was found in the current Terminal window&quot; application name &quot;Show Error Location in BBEdit Script&quot;
		
	end tell
end doGrowl&lt;/pre&gt;

&lt;p&gt;(I took &lt;code&gt;splitText()&lt;/code&gt; from &lt;a href=&quot;http://bbs.macscripter.net/viewtopic.php?id=18377&quot;&gt;here&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Running it jumps directly to this location in BBEdit:&lt;/p&gt;

&lt;img class=&quot;screenshot&quot; alt=&quot;BBEdit text window&quot; src=&quot;/images/blog/2008-04-02-bbedit-text-window.png&quot; /&gt;

&lt;p&gt;The second script finds &lt;em&gt;all&lt;/em&gt; error locations in the Terminal history and puts them in a Result Browser window in BBEdit. Result browsers look like this:&lt;/p&gt;

&lt;img class=&quot;screenshot&quot; alt=&quot;BBEdit Results Browser&quot; src=&quot;/images/blog/2008-04-02-bbedit-result-browser.png&quot; /&gt;

&lt;p&gt;Here’s the script to do that:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;tell application &quot;Terminal&quot;
	set myhistory to history of window 1
end tell

set locationText to do shell script &quot;echo &quot; &amp;amp; quoted form of myhistory &amp;amp; &quot; | perl -e &#39;$files{qq#$_-&gt;[1]:$_-&gt;[2]#} ||= $_ foreach grep {@$_ &gt; 1} map {[$_-&gt;[0], $_-&gt;[1], ($_-&gt;[2] || $_-&gt;[3])]} map {[m#(.+) (?:at|in) .+/(\\w+/\\w+\\.(?:php|pm|pl))(?::(\\d+)| (?:on )?line (\\d+))#, $i++]} &amp;lt;&gt;; print map {qq#$_-&gt;[0] --- $_-&gt;[1] --- $_-&gt;[2]\\n#} sort {$a-&gt;[3] &amp;lt;=&gt; $b-&gt;[3]} values %files&#39;&quot;

set locationData to {}
repeat with location in |splittext|(&quot;
&quot;, locationText)
	copy |splittext|(&quot; --- &quot;, location) to end of locationData
end repeat


tell application &quot;BBEdit&quot;
	
	set resultItems to {}
	repeat with location in locationData
		
		set {locationMessage, locationFile, locationLine} to location
		
		set hits to (text documents whose on disk is true and URL contains locationFile)
		if (count of hits) &gt; 0 then
			set mydoc to first item of hits
			set locationLine to locationLine as number
			set myLine to line locationLine of mydoc
			set s_offset to characterOffset of myLine
			if (count of characters of myLine) &gt; 0 then
				set e_offset to characterOffset of last character of myLine
			else
				set e_offset to s_offset
			end if
			set resultEntry to {start_offset:(s_offset - 1), end_offset:e_offset, message:locationMessage, result_kind:error_kind, result_file:file of mydoc, result_line:locationLine}
			copy resultEntry to end of resultItems
		end if
		
	end repeat
	
	make new results browser with data resultItems with properties {name:&quot;Errors in Terminal&quot;}
	
end tell


on |splittext|(delimiter, someText)
	set prevTIDs to AppleScript&#39;s text item delimiters
	set AppleScript&#39;s text item delimiters to delimiter
	set output to text items of someText
	set AppleScript&#39;s text item delimiters to prevTIDs
	return output
end |splittext|&lt;/pre&gt;

&lt;p&gt;(I found example code for populating result browsers at &lt;a href=&quot;http://daringfireball.net/projects/csschecker/&quot;&gt;Daring Fireball&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;I put these scripts into &lt;code&gt;$HOME/Library/Scripts/Applications/Terminal&lt;/code&gt;. They are more useful if they have keyboard shortcuts; you can use &lt;a href=&quot;http://www.red-sweater.com/fastscripts/&quot;&gt;FastScripts&lt;/a&gt; ($14.95) or &lt;a href=&quot;http://proxi.griffintechnology.com/&quot;&gt;Proxi&lt;/a&gt; (free) to assign those.&lt;/p&gt;


&lt;p&gt;Since both scripts scan the Terminal history from the top, it makes sense to clear the buffer before running a program or test, so I hit the Cmd-K many times during the day. You can put this at the start of your test driver script to do it automatically:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;which -s osascript &amp;amp;&amp;amp; osascript -e &#39;tell application &quot;System Events&quot; to keystroke &quot;k&quot; using command down&#39;&lt;/pre&gt;

&lt;p&gt;The &lt;code&gt;which -s osascript&lt;/code&gt; part makes sure you can leave it in there without bothering your Linux-using friends :-)&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Developer/?permalink=Two-AppleScripts-for-Perl-Developers-using-BBEdit.html</guid>
			<pubDate>Tue, 1 Apr 2008 10:21:31 +0200</pubDate>
                    </item>
        	            <item>
            <title>Installing Perl DBD::mysql on Mac OS X 10.5</title>
            <!--<link>http://www.entropy.ch/blog/Developer/?permalink=Installing-Perl-DBD-mysql-on-Mac-OS-X-10-5.html</link>-->
            <link>http://www.entropy.ch/blog/Developer/2008/03/25/Installing-Perl-DBD-mysql-on-Mac-OS-X-10-5.html</link>
            <description>&lt;p&gt;I just had to install &lt;a href=&quot;http://search.cpan.org/search?query=dbd%3A%3Amysql&amp;amp;mode=all&quot;&gt;DBD::mysql&lt;/a&gt; on my machine running Mac OS X 10.5 and found out that a few combinations don’t work:&lt;/p&gt;

&lt;ul&gt;

&lt;li&gt;Since I am on a 64 bit machine I originally installed the x86_64 MySQL packages available from mysql.com. However the system-supplied Perl is 32 bit only so that requires 32 bit MySQL client libraries. Trying to link with the 64 bit versions produced &lt;code&gt;Symbol not found: _is_prefix&lt;/code&gt; errors.&lt;/li&gt;

&lt;li&gt;I was running MySQL 5.1 RC, currently that means 5.1.23. Unfortunately, in this specific version a data structure member used by the DBD::mysql code was renamed, causing the build to fail. This renaming is going to be &lt;a href=&quot;http://trac.macosforge.org/projects/macports/ticket/14579&quot;&gt;reverted for versions 5.1.24&lt;/a&gt; and up. This problem resulted in &lt;code&gt;dbdimp.c:2763: error: ‘NET’ has no member named ‘last_errno’&lt;/code&gt; errors.&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;After installing and starting the 32 bit, 5.0.51a version of MySQL, installation worked flawlessly:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;$ PATH=/usr/local/mysql/bin:$PATH sudo cpan
cpan&gt; install DBD::mysql

...

All tests successful, 2 tests skipped.
Files=34, Tests=656,  3 wallclock secs ( 2.03 cusr +  0.53 csys =  2.56 CPU)
  /usr/bin/make test -- OK
Running make install
Installing /Library/Perl/5.8.8/darwin-thread-multi-2level/auto/DBD/mysql/mysql.bundle
Files found in blib/arch: installing files in blib/lib into architecture dependent library tree
Writing /Library/Perl/5.8.8/darwin-thread-multi-2level/auto/DBD/mysql/.packlist
Appending installation info to /System/Library/Perl/5.8.8/darwin-thread-multi-2level/perllocal.pod
  /usr/bin/make install  -- OK
&lt;/pre&gt;

&lt;pre class=&quot;code prettyprint&quot;&gt;$ perl -MDBD::mysql -e 0&lt;/pre&gt;

&lt;p&gt;I will try MySQL 5.1 again once 5.1.24 is available.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Developer/?permalink=Installing-Perl-DBD-mysql-on-Mac-OS-X-10-5.html</guid>
			<pubDate>Tue, 25 Mar 2008 12:57:54 +0100</pubDate>
                    </item>
        	            <item>
            <title>List Files and Sizes in Last Time Machine Backup</title>
            <!--<link>http://www.entropy.ch/blog/Mac+OS+X/?permalink=List-Files-and-Sizes-in-Last-Time-Machine-Backup.html</link>-->
            <link>http://www.entropy.ch/blog/Mac+OS+X/2008/03/23/List-Files-and-Sizes-in-Last-Time-Machine-Backup.html</link>
            <description>&lt;p&gt;Mac OS X 10.5’s &lt;a href=&quot;http://www.apple.com/macosx/features/timemachine.html&quot;&gt;Time Machine&lt;/a&gt; was backing up over 200MB every single hour on my machine even when it was idle.&lt;/p&gt;

&lt;p&gt;I wrote the Perl script below to find out which files were changing all the time using information from &lt;a href=&quot;http://earthlingsoft.net/ssp/&quot;&gt;Sven-S. Porst&lt;/a&gt;’s detailed article about &lt;a href=&quot;http://earthlingsoft.net/ssp/blog/2008/03/x5_time_machine&quot;&gt;how Time Machine works&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The script lists the files included in the last backup:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;$ perl latest-time-machine-files.pl
...
 209323008 /Volumes/Backup of Primavera/Backups.backupdb/Primavera/2008-03-22-195837/Primavera/Users/liyanage/Library/Application Support/SpamSieve/History.db
...&lt;/pre&gt;
&lt;p&gt;It turns out &lt;a href=&quot;http://c-command.com/spamsieve/&quot;&gt;my spam filter’s&lt;/a&gt; big history file is what’s changing all the time, so I excluded it from the backup. It’s now back down to a few KB per hour when I don’t use the machine.&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;#!/usr/bin/perl

use strict;
use warnings;

my $BACKUPDIR = &quot;/Volumes/Backup of Primavera/Backups.backupdb/Primavera&quot;;
die &quot;&#39;$BACKUPDIR&#39; doesn&#39;t exist&quot; unless -d $BACKUPDIR;

my $TIME = time() - 978307199 - 3600;

printf(&quot;%10d %s\n&quot;, @$_) foreach
    sort {$b-&gt;[0] &amp;lt;=&gt; $a-&gt;[0]}
    map {[-s, $_]}
    grep {-f}
    map {/(.+)/}
    qx(mdfind -onlyin &quot;$BACKUPDIR&quot; &quot;_kTimeMachineOldestSnapshot &gt; $TIME&quot;);&lt;/pre&gt;

&lt;p&gt;I also have a Python version in case somebody wants to extend the script and prefers this:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;#!/usr/bin/env python

import commands
import os.path
import sys
from Foundation import NSDate

backupdir = &quot;/Volumes/Backup of Primavera/Backups.backupdb/Primaverax&quot;
time = NSDate.timeIntervalSinceReferenceDate() - 7200

if not os.path.exists(backupdir):
    raise Exception, &quot;backupdir %s doesn&#39;t exist (need to mount backup volume?)&quot; % backupdir

cmd = &quot;mdfind -onlyin &#39;%s&#39; &#39;_kTimeMachineOldestSnapshot &gt; %s&#39;&quot; % (backupdir, time);
items = [(x, os.path.getsize(x)) for x in commands.getoutput(cmd).split(&quot;\n&quot;) if not os.path.isdir(x)]

def cmp(a, b):
    if b[1] &amp;lt; a[1]:
        return -1
    if b[1] == a[1]:
        return 0
    return 1

items.sort(cmp)

for item in items:
    print &quot;%10d %s &quot; % (item[1], item[0])&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; These days I use &lt;a href=&quot;http://www.fernlightning.com/doku.php?id=software:misc:tms&quot;&gt;Robert Pointon’s tms utility&lt;/a&gt; instead of this script.&lt;/p&gt;


</description>
            <guid>http://www.entropy.ch/blog/Mac+OS+X/?permalink=List-Files-and-Sizes-in-Last-Time-Machine-Backup.html</guid>
			<pubDate>Sun, 23 Mar 2008 09:03:36 +0100</pubDate>
                    </item>
        	            <item>
            <title>OBJECT Element as IFRAME Replacement Broken in Internet Explorer</title>
            <!--<link>http://www.entropy.ch/blog/Developer/?permalink=OBJECT-Element-as-IFRAME-Replacement-Broken-in-Internet-Explorer.html</link>-->
            <link>http://www.entropy.ch/blog/Developer/2008/03/03/OBJECT-Element-as-IFRAME-Replacement-Broken-in-Internet-Explorer.html</link>
            <description>&lt;p&gt;Embedding a web page from another site using an &lt;code&gt;object&lt;/code&gt; element (as a replacement for &lt;code&gt;iframe&lt;/code&gt;) doesn’t seem to work in Internet Explorer 7. I’m trying something like this:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;
&amp;lt;object data=&quot;http://www.sun.com&quot; type=&quot;text/html&quot; width=&quot;480&quot; height=&quot;300&quot;&gt;
&amp;lt;/object&gt;
&lt;/pre&gt;

&lt;p&gt;Here is the object element in action:&lt;/p&gt;

&lt;object data=&quot;http://www.sun.com&quot; type=&quot;text/html&quot; width=&quot;480&quot; height=&quot;300&quot;&gt;&lt;/object&gt;

&lt;p&gt;It works fine in other browsers. It also works in IE 7 if both the embedding and the embedded page load from the same site (possibly using an &lt;a href=&quot;http://www.456bereastreet.com/archive/200612/dump_iframes_and_use_object_elements_instead/&quot;&gt;additional classid attribute&lt;/a&gt;), or if the embedding document is loaded from a local &lt;code&gt;file:&lt;/code&gt; location.&lt;/p&gt;

&lt;p&gt;I’d be interested to learn about a solution for this problem.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Developer/?permalink=OBJECT-Element-as-IFRAME-Replacement-Broken-in-Internet-Explorer.html</guid>
			<pubDate>Mon, 3 Mar 2008 23:42:07 +0100</pubDate>
                    </item>
        	             <item>
            <title>Sunday Brunch Places in Zurich</title>
            <!--<link>http://www.entropy.ch/blog/?permalink=Sunday-Brunch-Places-in-Zurich.html</link>-->
            <link>http://www.entropy.ch/blog/2008/03/02/Sunday-Brunch-Places-in-Zurich.html</link>
            <description>&lt;p&gt;A Google Map of my favorite &lt;a href=&quot;http://maps.google.com/maps/ms?hl=en&amp;amp;ptab=0&amp;amp;ie=UTF8&amp;amp;msa=0&amp;amp;msid=109250094244326962855.00044258f2a43549cf572&quot;&gt;Sunday brunch places in Zurich&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Feel free to add your favorites in the comments...&lt;/p&gt;

&lt;p&gt;
&lt;object width=&quot;480&quot; height=&quot;350&quot; type=&quot;text/html&quot; data=&quot;http://maps.google.com/maps/ms?hl=en&amp;amp;ptab=0&amp;amp;ie=UTF8&amp;amp;s=AARTsJqvEjxqN2M8m58ayWslalZYwexUMw&amp;amp;msa=0&amp;amp;msid=109250094244326962855.00044258f2a43549cf572&amp;amp;ll=47.349408,8.543501&amp;amp;spn=0.020353,0.041199&amp;amp;t=h&amp;amp;z=14&amp;amp;output=embed&quot;&gt;
&lt;/object&gt;
&lt;/p&gt;

&lt;p&gt;&lt;small&gt;&lt;a href=&quot;http://maps.google.com/maps/ms?hl=en&amp;amp;ptab=0&amp;amp;ie=UTF8&amp;amp;msa=0&amp;amp;msid=109250094244326962855.00044258f2a43549cf572&amp;amp;ll=47.349408,8.543501&amp;amp;spn=0.020353,0.041199&amp;amp;t=h&amp;amp;z=14&amp;amp;source=embed&quot;&gt;View Larger Map&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/?permalink=Sunday-Brunch-Places-in-Zurich.html</guid>
			<pubDate>Sun, 2 Mar 2008 04:42:36 +0100</pubDate>
                    </item>
        	            <item>
            <title>Mac OS X Application Code Signing</title>
            <!--<link>http://www.entropy.ch/blog/Developer/?permalink=Mac-OS-X-Application-Code-Signing.html</link>-->
            <link>http://www.entropy.ch/blog/Developer/2008/02/11/Mac-OS-X-Application-Code-Signing.html</link>
            <description>&lt;p&gt;This article is about &lt;a href=&quot;http://en.wikipedia.org/wiki/Code_signing&quot;&gt;digitally signing executable code&lt;/a&gt; and converting the required public/private key and &lt;a href=&quot;http://en.wikipedia.org/wiki/X.509&quot;&gt;X.509&lt;/a&gt; certificate material between different formats using the OpenSSL toolkit. It adds to the information in my earlier article &lt;a href=&quot;http://www.entropy.ch/blog/Developer/2007/08/16/Converting-Microsoft-pvk-Private-Keys-to-Java-Keystore.html&quot;&gt;“Converting Microsoft .pvk Private Keys to Java Keystore”&lt;/a&gt;. If this kind of stuff makes your eyes glaze over, you might want to skip this one :-)&lt;/p&gt;

&lt;h2&gt;Benefits of Signing Applications on Mac OS X&lt;/h2&gt;

&lt;p&gt;The latest version 10.5 (Leopard) of Mac OS X adds the ability to digitally sign executable code. I wanted to do that with one of our Mac OS X applications, the &lt;a href=&quot;http://my.snapmania.com/software/&quot;&gt;image uploader&lt;/a&gt; for our &lt;a href=&quot;http://www.snapmania.com/&quot;&gt;snapmania Online Photo Manager&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Right now, the main user-visible benefit of signed applications is that accessing objects in the user’s Keychain no longer triggers this confirmation dialog after a new version of the application is installed:&lt;/p&gt;

&lt;img alt=&quot;Mac OS X Keychain access confirmation dialog after application update&quot; src=&quot;/images/blog/2008-02-11-codesign-keychain-update-confirmation.png?xy&quot; /&gt;

&lt;p&gt;I recently added &lt;a href=&quot;http://sparkle.andymatuschak.org/&quot;&gt;Sparkle&lt;/a&gt;-based auto-updating to this application and the update user experience is now really smooth except for this Keychain dialog. Getting rid of it by digitally signing the application promises even less mental friction for the user.&lt;/p&gt;

&lt;h2&gt;Preparing the Certificate&lt;/h2&gt;

&lt;p&gt;The Apple developer tool used to sign an application is the &lt;tt&gt;codesign&lt;/tt&gt; command line utility (check out its &lt;a href=&quot;http://developer.apple.com/documentation/Darwin/Reference/ManPages/man1/codesign.1.html&quot;&gt;man page&lt;/a&gt; for details). In order to sign an application with it, you need a code signing &lt;a href=&quot;http://en.wikipedia.org/wiki/Public_key_certificate&quot;&gt;certificate&lt;/a&gt; from a &lt;a href=&quot;http://en.wikipedia.org/wiki/Certificate_authority&quot;&gt;certificate authority&lt;/a&gt; trusted by the system. As noted in my &lt;a href=&quot;http://www.entropy.ch/blog/Developer/2007/08/16/Converting-Microsoft-pvk-Private-Keys-to-Java-Keystore.html&quot;&gt;earlier article&lt;/a&gt;, we already have such a certificate in the format used by Microsoft’s tools. Our provider in this case is the &lt;a href=&quot;https://www.thawte.com/ssl-digital-certificates/code-signing/&quot;&gt;Thawte Code Signing CA&lt;/a&gt; and they are in Mac OS X’s list of trusted CAs.&lt;/p&gt;

&lt;p&gt;&lt;tt&gt;codesign&lt;/tt&gt; expects the certificate and associated private key in your keychain. The way to get them in there is by packaging them up in a &lt;a href=&quot;http://en.wikipedia.org/wiki/PKCS12&quot;&gt;PKCS#12&lt;/a&gt; container file which Keychain can import. I’ll use the Swiss Army Knife of cryptography, the &lt;a href=&quot;http://www.openssl.org/&quot;&gt;openssl&lt;/a&gt; command line tool, to do the conversion.&lt;/p&gt;

&lt;p&gt;I had already converted the private key from Microsoft’s .pvk format into openssl RSA PEM format for the Java conversion the last time around. Let’s take a look:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;$ openssl rsa -text &amp;lt; futurelab-codesign.privkey.rsa.pem 
Enter pass phrase:
Private-Key: (2048 bit)
... fancy prime number ...&lt;/pre&gt;

&lt;p&gt;I didn’t have to convert the certificate for Java the last time because the Java tools can import Microsoft .spc (Software Publisher Certificate) files directly. &lt;a href=&quot;http://www.tech-pro.net/export-to-pvk-spc.html&quot;&gt;It turns out&lt;/a&gt; that .spc files are PKCS#7 containers, so I can take a look at it with openssl’s &lt;tt&gt;pkcs7&lt;/tt&gt; command:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;$ openssl pkcs7 -inform der -text -print_certs &amp;lt; futurelab-codesign.spc&lt;/pre&gt;

&lt;p&gt;I am checking out two things, namely if the certificate is still within its validity period and if the X.509 extensions for code signing are present:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;Subject: C=CH, ST=ZH, L=Winterthur, O=futureLAB AG, OU=ENGINEERING, CN=futureLAB AG
Issuer: C=ZA, O=Thawte Consulting (Pty) Ltd., CN=Thawte Code Signing CA

Validity
    Not Before: Nov 14 00:00:00 2007 GMT
    Not After : Nov 25 23:59:59 2008 GMT

...

X509v3 extensions:
    X509v3 Extended Key Usage: 
        Code Signing, Microsoft Commercial Code Signing

    Netscape Cert Type: 
        Object Signing&lt;/pre&gt;

&lt;p&gt;In our case there are several certificates in the .spc file because it’s a “certificate chain” which includes the certificates of the intermediate subjects in the trust hierarchy. The one whose &lt;tt&gt;Subject:&lt;/tt&gt; refers to our orgainzation is the actual code signing certificate we are going to use.&lt;/p&gt;

&lt;p&gt;Now that I know that the certificate is valid, I can convert the entire certificate chain to a text file with a series of X.509 PEM format certificates:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;openssl pkcs7 -inform der -print_certs \
&amp;lt; futurelab-codesigning.spc \
&gt; futurelab-codesigning.cert.pem&lt;/pre&gt;

&lt;p&gt;With the private key and certificate data converted I can merge them into the PKCS#12 container:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;openssl pkcs12 -export -inkey futurelab-codesign.privkey.rsa.pem \
-in futurelab-codesign.cert.pem  \
-out futurelab-codesign.p12

Enter pass phrase for futurelab-codesign.privkey.rsa.pem:
Enter Export Password:
Verifying - Enter Export Password:
&lt;/pre&gt;

&lt;p&gt;The “pass phrase” is what protects the contents of the RSA key input file, enter what you used when you created that file. The “Export Password” is something which you can choose freely here, it protects the private key in the PKCS#12 container.&lt;/p&gt;

&lt;p&gt;Double-clicking the resulting .p12 file opens it in Keychain which will prompt for the export password used in the previous step. The imported certificate should look like this:&lt;/p&gt;

&lt;img class=&quot;screenshot&quot; alt=&quot;Imported Code Signing Certificate in Apple Keychain&quot; src=&quot;/images/blog/2008-02-11-codesign-keychain-certificate.png?x&quot; /&gt;

&lt;p&gt;And again, it should have the code sign extension flags set:&lt;/p&gt;

&lt;img class=&quot;screenshot&quot; alt=&quot;Code Signing Certificate x509 extension flags in Apple Keychain&quot; src=&quot;/images/blog/2008-02-11-codesign-keychain-extensions.png&quot; /&gt;

&lt;h2&gt;Signing the Application&lt;/h2&gt;

&lt;p&gt;Signing the application with &lt;tt&gt;codesign&lt;/tt&gt; is straightforward:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;$ codesign -s &#39;futureLAB AG&#39; Uploader.app&lt;/pre&gt;

&lt;p&gt;Verifying the signature:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;$ codesign --verbose -v Uploader.app
Uploader.app: valid on disk&lt;/pre&gt;

&lt;p&gt;I automated this in Xcode with an additional “Run Script” build phase that uses the variables &lt;tt&gt;$TARGET_BUILD_DIR&lt;/tt&gt; and &lt;tt&gt;$WRAPPER_NAME&lt;/tt&gt;:&lt;/p&gt;

&lt;img class=&quot;screenshot&quot; alt=&quot;codesign run script phase in Xcode&quot; src=&quot;/images/blog/2008-02-11-codesign-xcode-script.png&quot; /&gt;

&lt;p&gt;The &lt;a href=&quot;http://developer.apple.com/releasenotes/Security/RN-CodeSigning/index.html#//apple_ref/doc/uid/TP40006106-DontLinkElementID_6&quot;&gt;“Transition Notes”&lt;/a&gt; in Apple’s “Leopard Code Signing Release Notes” explain that the first update to a signed application version will trigger the Keychain dialog one last time:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Existing keychain items that allow access to a prior (unsigned) version of your application or tool will trigger a confirmation dialog when the system first encounters an updated signed version of your code. Upon user consent, the ACL is then rewritten to add access to your application gated by its code signature. No further dialogs should appear for that item afterwards, ever (unless you stop signing your updates). New items created by or for a signed application automatically have this benefit.&lt;/p&gt;&lt;/blockquote&gt;

&lt;h2&gt;Resources&lt;/h2&gt;

&lt;ul&gt;
    &lt;li&gt;&lt;a href=&quot;http://developer.apple.com/documentation/Security/Conceptual/CodeSigningGuide/Introduction/chapter_1_section_1.html&quot;&gt;Apple Code Signing Guide&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;http://developer.apple.com/releasenotes/Security/RN-CodeSigning/index.html&quot;&gt;Leopard Code Signing Release Notes&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;The openssl and codesign man pages&lt;/li&gt;
&lt;/ul&gt;
</description>
            <guid>http://www.entropy.ch/blog/Developer/?permalink=Mac-OS-X-Application-Code-Signing.html</guid>
			<pubDate>Mon, 11 Feb 2008 11:29:54 +0100</pubDate>
                    </item>
        	            <item>
            <title>hispeedSMS Widget With Autocompletion</title>
            <!--<link>http://www.entropy.ch/blog/Software/?permalink=hispeedSMS-Widget-With-Autocompletion.html</link>-->
            <link>http://www.entropy.ch/blog/Software/2008/02/10/hispeedSMS-Widget-With-Autocompletion.html</link>
            <description>&lt;p&gt;Now that &lt;a href=&quot;http://www.entropy.ch/blog/Software/2008/02/09/Leopard-Reading-Out-Address-Book-Data-From-a-Widget.html&quot;&gt;getting the Address Book data&lt;/a&gt; is so fast, I decided to add autocompletion to my &lt;a href=&quot;http://www.entropy.ch/software/macosx/#hispeedsms-widget&quot;&gt;hispeedSMS widget&lt;/a&gt; using &lt;a href=&quot;http://wiki.script.aculo.us/scriptaculous/show/Autocompleter.Local&quot;&gt;Autocompleter.Local&lt;/a&gt; from &lt;a href=&quot;http://script.aculo.us/&quot;&gt;script.aculo.us&lt;/a&gt;:&lt;/p&gt;

&lt;a class=&quot;img&quot; href=&quot;http://www.entropy.ch/software/macosx/#hispeedsms-widget&quot;&gt;&lt;img style=&#39;border: none;&#39; alt=&quot;hispeedSMS Widget with autocompletion&quot; src=&quot;/images/blog/2008-02-10-hispeed-sms-widget-autocompletion.png&quot; /&gt;&lt;/a&gt;

&lt;p&gt;I wrote a small Perl script to convert the Address Book database sqlite3 query result into JSON. From the widget I run the script with &lt;a href=&quot;http://developer.apple.com/documentation/AppleApplications/Reference/Dashboard_Ref/GadgetObj/chapter_2_section_3.html#//apple_ref/doc/uid/TP40001339-CH203-SW16&quot;&gt;&lt;tt&gt;widget.system()&lt;/tt&gt;&lt;/a&gt; and feed its output to &lt;a href=&quot;http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Functions:eval#Summary&quot;&gt;&lt;tt&gt;eval()&lt;/tt&gt;&lt;/a&gt;. This gives me an array of items exactly the way &lt;tt&gt;Autocompleter.Local&lt;/tt&gt; needs it.&lt;/p&gt;

&lt;p&gt;One annoying thing which is still broken on Leopard is that &lt;tt&gt;widget.system()&lt;/tt&gt; sometimes truncates the output of commands at around 4000 bytes. That’s not a lot if you have an Address Book with many entries. As a workaround I had to send the Perl script’s output to a file and read that file with an &lt;tt&gt;XmlHttpRequest&lt;/tt&gt; and a &lt;tt&gt;file://&lt;/tt&gt; URL.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Software/?permalink=hispeedSMS-Widget-With-Autocompletion.html</guid>
			<pubDate>Sun, 10 Feb 2008 01:00:24 +0100</pubDate>
                    </item>
        	            <item>
            <title>Building Mac OS X Universal Binary Open Source Packages</title>
            <!--<link>http://www.entropy.ch/blog/Developer/?permalink=Building-Mac-OS-X-Universal-Binary-Open-Source-Packages.html</link>-->
            <link>http://www.entropy.ch/blog/Developer/2008/02/09/Building-Mac-OS-X-Universal-Binary-Open-Source-Packages.html</link>
            <description>&lt;p&gt;Here’s my current summary of information about building GNU autoconf-style and other open source projects as universal binaries for Mac OS X, some of it learned during the update of my build script for the recently released version 8.3 of the PostgreSQL database server. I hope this is useful for others, please correct me in the comments if you see errors or missing information.&lt;/p&gt;

&lt;p&gt;A good starting point is Apple’s &lt;a href=&quot;http://developer.apple.com/technotes/tn2005/tn2137.html&quot;&gt;Technical Note TN2137 – Building Universal Binaries from &quot;configure&quot;-based Open Source Projects&lt;/a&gt;. These arguments to the configure command will build most of the projects properly. For the longest time after the Intel Macs came out I did not know about the &lt;a href=&quot;http://www.gnu.org/software/automake/manual/html_node/Dependencies.html#Dependencies&quot;&gt;&lt;tt&gt;--disable-dependency-tracking&lt;/tt&gt; option&lt;/a&gt;. I saw that some packages like PostgreSQL call this option &lt;tt&gt;--disable-depend&lt;/tt&gt;.&lt;/p&gt;

&lt;p&gt;Closely related to the topic of building universal binaries is the choice of the minimal target OS version. Sometimes I support just the OS version on which I am building, but sometimes, as in the case of PostgreSQL, I want to target an earlier OS release. Apple’s instructions include information about cross-compiling for an older OS release using the SDK selection option &lt;tt&gt;-isysroot&lt;/tt&gt;. It’s a bit weird and annoying that this option is not documented in the GCC man page. Michael Rawdon gives a good description of what the option does in his &lt;a href=&quot;http://lists.apple.com/archives/xcode-users/2005/Dec/msg00524.html&quot;&gt;posting to the xcode-users mailing list&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;One piece of information missing in Apple’s technical note (because &lt;a href=&quot;http://lists.apple.com/archives/Xcode-users/2007/Oct/msg00696.html&quot;&gt;it was not required&lt;/a&gt; at the time of writing) is the need to add the &lt;tt&gt;-mmacosx-version-min&lt;/tt&gt; option when cross-compiling with a different SDK on Leopard (without it, the build will fail with a message about a missing &lt;tt&gt;lcrt1.10.5.o&lt;/tt&gt;).&lt;/p&gt;

&lt;p&gt;&lt;tt&gt;-mmacosx-version-min&lt;/tt&gt; seems to be the replacement for the &lt;tt&gt;MACOSX_DEPLOYMENT_TARGET&lt;/tt&gt; environment variable. &lt;a href=&quot;http://paulbeachsblog.blogspot.com/2007/12/i-have-read-in-number-of-places-that-i.html&quot;&gt;Paul Beach writes&lt;/a&gt; that the variable is deprecated (BTW where does it say so?) but that it is still needed. That is also my impression. One example is that some GNU autoconf scripts use it to figure out the intended dynamic linker run time environment at build time. The variable determines which value (&lt;tt&gt;dynamic_lookup&lt;/tt&gt; or &lt;tt&gt;undefined&lt;/tt&gt;) is passed to the linker’s &lt;tt&gt;-undefined&lt;/tt&gt; option, or if the linker should build flat or two-level namespace object files.&lt;/p&gt;


&lt;h2&gt;PostgreSQL specific tweaks&lt;/h2&gt;

&lt;p&gt;PostgreSQL’s build system calls the linker &lt;tt&gt;ld&lt;/tt&gt; directly in some cases instead of through the gcc driver. Unfortunately ld cannot build fat object files, gcc does that by running it twice and using &lt;tt&gt;lipo&lt;/tt&gt; on the result. I had to override the LD setting like this in the arguments to &lt;tt&gt;configure&lt;/tt&gt;:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;LD=&quot;gcc -mmacosx-version-min=10.4 -isysroot $SDK -nostartfiles -arch i386 -arch ppc&quot;&lt;/pre&gt;

&lt;p&gt;The next issue is that Apple’s libxml2 is too old for PostgreSQL so I had to build a newer one from source. I wanted to link it into PostgreSQL statically, which meant I had to add the &lt;a href=&quot;http://lists.apple.com/archives/Xcode-users/2005/Dec/msg00123.html&quot;&gt;&lt;tt&gt;-search_paths_first&lt;/tt&gt;&lt;/a&gt; option to the linker flags.&lt;/p&gt;

&lt;p&gt;You can take a look at my full PostgreSQL 8.3 build script in its current state in a recent &lt;a href=&quot;http://www.entropy.ch/phpbb2/viewtopic.php?p=11366#11366&quot;&gt;forum post&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;General Guidelines&lt;/h2&gt;

&lt;p&gt;When I build these packages I try hard to leave the original source distribution completely untouched and do everything that’s necessary to get a universal binary with options and environment variables. I don’t like to modify the configure scripts or Makefiles if I can avoid it. In the &lt;a href=&quot;http://www.entropy.ch/phpbb2/viewtopic.php?p=10744#10744&quot;&gt;last version of the build script&lt;/a&gt; I rewrote the Makefile rules mentioned above which used &lt;tt&gt;ld&lt;/tt&gt; directly. In this version I replaced that with the LD configure argument which is much cleaner.&lt;/p&gt;

&lt;p&gt;I also try to build universal binaries in one pass just by tweaking the configure flags. Another option, which I have used in the past but try to avoid, is to build twice and then traverse the resulting separate per-architecture directory hierarchies and merge all binaries with &lt;tt&gt;lipo&lt;/tt&gt;.&lt;/p&gt;

&lt;p&gt;However, from time to time I stumble upon a package that generates broken code when built as universal binary in one pass. It is probably because architecture-dependent decisions like endianness and/or word length are made during the configure phase (which runs just once) and not during the compilation (which executes two or even four times). Examples from my PHP module compilation endeavours include libmcrypt and probably the MySQL client libraries or even the &lt;a href=&quot;http://marc.info/?l=php-internals&amp;amp;m=118552960314485&amp;amp;w=2&quot;&gt;PHP source code at one time&lt;/a&gt;. Such build setups have to be fixed accordingly.&lt;/p&gt;

&lt;h2&gt;More Information&lt;/h2&gt;

&lt;p&gt;Another good source of information about this topic is Apple’s &lt;a href=&quot;http://developer.apple.com/documentation/Porting/Conceptual/PortingUnix/intro/chapter_1_section_1.html&quot;&gt;UNIX Porting Guide&lt;/a&gt;, especially the chapter &lt;a href=&quot;http://developer.apple.com/documentation/Porting/Conceptual/PortingUnix/compiling/chapter_4_section_3.html&quot;&gt;“Compiling for Multiple CPU Architectures”&lt;/a&gt;.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Developer/?permalink=Building-Mac-OS-X-Universal-Binary-Open-Source-Packages.html</guid>
			<pubDate>Sat, 9 Feb 2008 13:42:14 +0100</pubDate>
                    </item>
        	             <item>
            <title>Measurement of Code Quality: WTFs/minute</title>
            <!--<link>http://www.entropy.ch/blog/?permalink=Measurement-of-Code-Quality-WTFs-minute.html</link>-->
            <link>http://www.entropy.ch/blog/2008/02/09/Measurement-of-Code-Quality-WTFs-minute.html</link>
            <description>&lt;img alt=&quot;The only valid measurement of code quality: WTFs/minute&quot; src=&quot;/images/blog/2008-02-09-wtfm.jpg&quot; /&gt;


</description>
            <guid>http://www.entropy.ch/blog/?permalink=Measurement-of-Code-Quality-WTFs-minute.html</guid>
			<pubDate>Sat, 9 Feb 2008 13:31:47 +0100</pubDate>
              	          <wfw:comment>http://www.entropy.ch/blojsom/commentapi/marc/?permalink=Measurement-of-Code-Quality-WTFs-minute.html</wfw:comment>
              <wfw:commentRss>http://www.entropy.ch/blog/?permalink=Measurement-of-Code-Quality-WTFs-minute.html&amp;page=comments&amp;flavor=rss2</wfw:commentRss>
                    </item>
        	            <item>
            <title>Leopard: Reading Out Address Book Data From a Widget</title>
            <!--<link>http://www.entropy.ch/blog/Software/?permalink=Leopard-Reading-Out-Address-Book-Data-From-a-Widget.html</link>-->
            <link>http://www.entropy.ch/blog/Software/2008/02/09/Leopard-Reading-Out-Address-Book-Data-From-a-Widget.html</link>
            <description>&lt;p&gt;My &lt;a href=&quot;http://www.entropy.ch/software/macosx/#hispeedsms-widget&quot;&gt;hispeedSMS&lt;/a&gt; Widget, which is now at version 1.13, needed yet another fix for full Leopard compatibility.&lt;/p&gt;

&lt;p&gt;One of my users reported that the Address Book metafiles with people’s mobile phone numbers were in a different location on his machine.&lt;/p&gt;

&lt;p&gt;The old location was &lt;tt&gt;$HOME/Library/Caches/com.apple.AddressBook/MetaData&lt;/tt&gt;. On the users’s machine, the metafiles were in &lt;tt&gt;$HOME/Library/Application Support/AddressBook/Metadata&lt;/tt&gt;. It turns out that that’s also where they are on my machine, but mine had a symbolic link in the old location pointing to the new directory. This is why it worked for me but not for him.&lt;/p&gt;

&lt;p&gt;I first wanted to fix it by changing the path in the widget code to the new directory. While looking at that directory I found a better, much faster way to read the Address Book contents from my widget. Previously I parsed the metafiles which Address Book stores for each contact. Address Book does this so that Spotlight, which operates on the granularity of entire files, can present single contact search results. These metafiles are in Apple’s plist format, they used to be in the XML variant but now they are stored as binary plists. To get at the information I used to run them through &lt;tt&gt;plutil&lt;/tt&gt; and then transform them to HTML with XSLT. This process was rather slow. It took a few seconds to build the contact list popup menu.&lt;/p&gt;

&lt;p&gt;There is of course a faster way to get this data. Address Book’s primary data store is an SQLite database and SQLlite has a command line utility for running SQL queries. I can get a list of all mobile phone numbers plus the contact’s first and last name like this:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;sqlite3 $HOME/Library/App*Sup*/Add*B*/Add*B*-v22.abcddb \
&quot;SELECT pn.zfullnumber, r.zfirstname, r.zlastname \
FROM ZABCDPHONENUMBER pn \
JOIN ZABCDRECORD r ON pn.zowner = r.z_pk \
WHERE pn.zlabel LIKE &#39;%&amp;lt;Mobile&gt;%&#39; \
ORDER by r.zfirstname, r.zlastname;&quot;
&lt;/pre&gt;

&lt;p&gt;This produces a list:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;+41 76 123 45 67|John|Doe
+41 76 111 22 33|Nom|De Plume
+41 79 444 55 66|Fix|Foxy&lt;/pre&gt;

&lt;p&gt;sqlite3’s &lt;tt&gt;-html&lt;/tt&gt; output option produces HTML table rows:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;&amp;lt;TR&gt;&amp;lt;TD&gt;+41 76 123 45 67&amp;lt;/TD&gt;&amp;lt;TD&gt;John&amp;lt;/TD&gt;&amp;lt;TD&gt;Doe&amp;lt;/TD&gt;&amp;lt;/TR&gt;
&amp;lt;TR&gt;&amp;lt;TD&gt;+41 76 111 22 33&amp;lt;/TD&gt;&amp;lt;TD&gt;Nom&amp;lt;/TD&gt;&amp;lt;TD&gt;De Plume&amp;lt;/TD&gt;&amp;lt;/TR&gt;
&amp;lt;TR&gt;&amp;lt;TD&gt;+41 79 444 55 66&amp;lt;/TD&gt;&amp;lt;TD&gt;Fix&amp;lt;/TD&gt;&amp;lt;TD&gt;Foxy&amp;lt;/TD&gt;&amp;lt;/TR&gt;&lt;/pre&gt;

&lt;p&gt;A bit of XSLT code converts this to the &lt;tt&gt;&amp;lt;SELECT&gt;&lt;/tt&gt;/&lt;tt&gt;&amp;lt;OPTION&gt;&lt;/tt&gt; code I need in the widget.&lt;/p&gt;

&lt;p&gt;If you want to learn more about the Address Book database structure, you can get a full SQL dump with this command:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;sqlite3 $HOME/Library/App*Sup*/Add*B*/Add*B*-v22.abcddb .dump&lt;/pre&gt;



</description>
            <guid>http://www.entropy.ch/blog/Software/?permalink=Leopard-Reading-Out-Address-Book-Data-From-a-Widget.html</guid>
			<pubDate>Sat, 9 Feb 2008 02:37:53 +0100</pubDate>
                    </item>
        	            <item>
            <title>PostgreSQL 8.3.0 Package, Great New Features</title>
            <!--<link>http://www.entropy.ch/blog/Software/?permalink=PostgreSQL-8-3-0-Package-Great-New-Features.html</link>-->
            <link>http://www.entropy.ch/blog/Software/2008/02/07/PostgreSQL-8-3-0-Package-Great-New-Features.html</link>
            <description>&lt;p&gt;Here’s a package for the recently released version 8.3.0 of PostgreSQL.&lt;/p&gt;

&lt;p&gt;Download link in the &lt;a href=&quot;http://www.entropy.ch/phpbb2/viewtopic.php?t=2949&quot;&gt;forum post&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;PostgreSQL has always been a fantastic database server, and release &lt;a href=&quot;http://www.postgresql.org/about/press/features83.html&quot;&gt;8.3 adds some great features&lt;/a&gt;. My favorites are two new data types, one for &lt;a href=&quot;http://en.wikipedia.org/wiki/UUID&quot;&gt;UUIDs&lt;/a&gt; and one for &lt;a href=&quot;http://developer.postgresql.org/pgdocs/postgres/datatype-xml.html&quot;&gt;XML data&lt;/a&gt;. The &lt;a href=&quot;http://developer.postgresql.org/pgdocs/postgres/functions-xml.html&quot;&gt;new XML features&lt;/a&gt; are part of the larger goal of implementing the &lt;a href=&quot;http://developer.postgresql.org/index.php/XML_Support&quot;&gt;SQL/XML standard in PostgreSQL&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Here’s an example that uses both UUID and XML columns in a table:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;CREATE TABLE foo (id uuid, data xml);

INSERT INTO foo VALUES (uuid_generate_v1(), &#39;&amp;lt;items&gt;&amp;lt;item color=&quot;red&quot;&gt;one&amp;lt;/item&gt;&amp;lt;/items&gt;&#39;);
INSERT INTO foo VALUES (uuid_generate_v1(), &#39;&amp;lt;items&gt;&amp;lt;item color=&quot;blue&quot;&gt;two&amp;lt;/item&gt;&amp;lt;/items&gt;&#39;);
INSERT INTO foo VALUES (uuid_generate_v1(), &#39;&amp;lt;items&gt;&amp;lt;item color=&quot;yellow&quot;&gt;three&amp;lt;/item&gt;&amp;lt;/items&gt;&#39;);

SELECT * FROM foo;
                  id                  |                       data                       
--------------------------------------+--------------------------------------------------
 5e8a8901-afd2-4a34-b5d4-a89852e4e82e | &amp;lt;items&gt;&amp;lt;item color=&quot;red&quot;&gt;one&amp;lt;/item&gt;&amp;lt;/items&gt;
 5e8a8901-afd2-4a34-b5d4-a89852e4e82e | &amp;lt;items&gt;&amp;lt;item color=&quot;blue&quot;&gt;two&amp;lt;/item&gt;&amp;lt;/items&gt;
 5e8a8901-afd2-4a34-b5d4-a89852e4e82e | &amp;lt;items&gt;&amp;lt;item color=&quot;yellow&quot;&gt;three&amp;lt;/item&gt;&amp;lt;/items&gt;


SELECT id, XPATH(&#39;//item/@color&#39;, data) FROM foo;
                  id                  |  xpath   
--------------------------------------+----------
 5e8a8901-afd2-4a34-b5d4-a89852e4e82e | {red}
 5e8a8901-afd2-4a34-b5d4-a89852e4e82e | {blue}
 5e8a8901-afd2-4a34-b5d4-a89852e4e82e | {yellow}
&lt;/pre&gt;
</description>
            <guid>http://www.entropy.ch/blog/Software/?permalink=PostgreSQL-8-3-0-Package-Great-New-Features.html</guid>
			<pubDate>Thu, 7 Feb 2008 22:34:41 +0100</pubDate>
                    </item>
        	            <item>
            <title>Leopard: Yet Another hispeedSMS Widget Update</title>
            <!--<link>http://www.entropy.ch/blog/Software/?permalink=Leopard-Yet-Another-hispeedSMS-Widget-Update.html</link>-->
            <link>http://www.entropy.ch/blog/Software/2008/02/04/Leopard-Yet-Another-hispeedSMS-Widget-Update.html</link>
            <description>&lt;p&gt;Another fix was required for the hispeedSMS Widget to run on Leopard after my &lt;a href=&quot;http://www.entropy.ch/blog/Software/2007/11/14/Leopard-hispeedSMS-Widget-Update.html&quot;&gt;first update&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can find the new version 1.12 here:&lt;/p&gt;

&lt;a href=&quot;http://www.entropy.ch/software/macosx/#hispeedsms-widget&quot;&gt;http://www.entropy.ch/software/macosx/#hispeedsms-widget&lt;/a&gt;

&lt;p&gt;For the technically minded:&lt;/p&gt;

&lt;p&gt;It turns out that Leopard’s XMLHttpRequest setRequestHeader() method is &lt;a href=&quot;http://bugs.webkit.org/show_bug.cgi?id=16357&quot;&gt;broken&lt;/a&gt; and cannot be used to set Cookie headers. The HTTP request is sent with Cookie header values from Safari instead of the ones I set.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Software/?permalink=Leopard-Yet-Another-hispeedSMS-Widget-Update.html</guid>
			<pubDate>Mon, 4 Feb 2008 00:05:17 +0100</pubDate>
                    </item>
        	            <item>
            <title>del.icio.us Links on 2008-02-02</title>
            <!--<link>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2008-02-02.html</link>-->
            <link>http://www.entropy.ch/blog/Links/2008/02/02/del-icio-us-Links-on-2008-02-02.html</link>
            <description>&lt;ul class=&quot;delicious&quot;&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://gamearchitect.net/Articles/SoftwareIsHard.html&quot;&gt;Software Is Hard&lt;/a&gt; &lt;/div&gt;
				&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/development&quot;&gt;development&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/develop&quot;&gt;develop&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/programming&quot;&gt;programming&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/software&quot;&gt;software&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/project&quot;&gt;project&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/python&quot;&gt;python&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
&lt;/ul&gt;
</description>
            <guid>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2008-02-02.html</guid>
			<pubDate>Sat, 2 Feb 2008 23:17:59 +0100</pubDate>
                    </item>
        	            <item>
            <title>Pictures: Zurich in February 2008</title>
            <!--<link>http://www.entropy.ch/blog/Pictures/?permalink=Pictures-Zurich-in-February-2008.html</link>-->
            <link>http://www.entropy.ch/blog/Pictures/2008/02/02/Pictures-Zurich-in-February-2008.html</link>
            <description>&lt;p&gt;Some photos from a &lt;a href=&quot;http://www.snapmania.com/users/mliyanage/zuerichjanuar2008/&quot;&gt;beautiful February Day in Zurich&lt;/a&gt;. I like this one:&lt;/p&gt;

&lt;a class=&quot;img&quot; href=&quot;http://www.snapmania.com/users/mliyanage/zuerichjanuar2008/&quot;&gt;&lt;img alt=&quot;Zurich Bellevue February 2008&quot; src=&quot;/images/blog/2008-02-02-zurich-bellevue.jpg&quot; /&gt;&lt;/a&gt;

&lt;p&gt;It says “I don’t know what to write on the sign, why don’t you just come inside”&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Pictures/?permalink=Pictures-Zurich-in-February-2008.html</guid>
			<pubDate>Sat, 2 Feb 2008 20:50:46 +0100</pubDate>
                    </item>
        	            <item>
            <title>del.icio.us Links on 2008-01-01</title>
            <!--<link>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2008-01-01.html</link>-->
            <link>http://www.entropy.ch/blog/Links/2008/01/01/del-icio-us-Links-on-2008-01-01.html</link>
            <description>&lt;ul class=&quot;delicious&quot;&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://www.perl.com/pub/a/2007/12/06/soto-11.html&quot;&gt;perl.com: Programming is Hard, Let&#39;s Go Scripting...&lt;/a&gt; &lt;/div&gt;
		&lt;div class=&quot;delicious-extended&quot;&gt; Larry Wall’s State of the Onion 11, very good read... &lt;/div&gt;		&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/perl&quot;&gt;perl&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/programming&quot;&gt;programming&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/scripting&quot;&gt;scripting&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/languages&quot;&gt;languages&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
&lt;/ul&gt;
</description>
            <guid>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2008-01-01.html</guid>
			<pubDate>Tue, 1 Jan 2008 23:24:57 +0100</pubDate>
                    </item>
        	            <item>
            <title>del.icio.us Links on 2007-12-26</title>
            <!--<link>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2007-12-26.html</link>-->
            <link>http://www.entropy.ch/blog/Links/2007/12/26/del-icio-us-Links-on-2007-12-26.html</link>
            <description>&lt;ul class=&quot;delicious&quot;&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://portal.acm.org/toc.cfm?id=SERIES11430&amp;amp;type=series&amp;amp;coll=ACM&amp;amp;dl=ACM&quot;&gt;ACM Classic Books Series&lt;/a&gt; &lt;/div&gt;
		&lt;div class=&quot;delicious-extended&quot;&gt; This list of classic books is the result of a poll ACM conducted where members named their favorite computer science books.We plan to make the full text available online to members as we obtain permissions from authors to display each book.  &lt;/div&gt;		&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/development&quot;&gt;development&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/acm&quot;&gt;acm&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/computerscience&quot;&gt;computerscience&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/Classic&quot;&gt;Classic&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/free&quot;&gt;free&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/Books&quot;&gt;Books&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/Programming&quot;&gt;Programming&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
&lt;/ul&gt;
</description>
            <guid>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2007-12-26.html</guid>
			<pubDate>Wed, 26 Dec 2007 23:16:18 +0100</pubDate>
                    </item>
        	            <item>
            <title>del.icio.us Links on 2007-12-04</title>
            <!--<link>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2007-12-04.html</link>-->
            <link>http://www.entropy.ch/blog/Links/2007/12/04/del-icio-us-Links-on-2007-12-04.html</link>
            <description>&lt;ul class=&quot;delicious&quot;&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://aurelio.net/doc/as4pp.html&quot;&gt;AppleScript for Python Programmers&lt;/a&gt; &lt;/div&gt;
				&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/applescript&quot;&gt;applescript&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/programming&quot;&gt;programming&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/reference&quot;&gt;reference&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/software&quot;&gt;software&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/mac&quot;&gt;mac&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/macosx&quot;&gt;macosx&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/python&quot;&gt;python&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
&lt;/ul&gt;
</description>
            <guid>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2007-12-04.html</guid>
			<pubDate>Tue, 4 Dec 2007 23:52:21 +0100</pubDate>
                    </item>
        	            <item>
            <title>Copy Message URLs AppleScript for Apple Mail</title>
            <!--<link>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Copy-Message-URLs-AppleScript-for-Apple-Mail.html</link>-->
            <link>http://www.entropy.ch/blog/Mac+OS+X/2007/12/04/Copy-Message-URLs-AppleScript-for-Apple-Mail.html</link>
            <description>&lt;p&gt;In a &lt;a href=&quot;http://www.entropy.ch/blog/Mac+OS+X/2007/11/02/Leopard-Data-Detectors-Awesome.html&quot;&gt;previous post&lt;/a&gt; I noted the usefulness of the &lt;code&gt;message&lt;/code&gt; &lt;a href=&quot;http://en.wikipedia.org/wiki/URI_scheme&quot;&gt;URI scheme&lt;/a&gt; (although I wonder why Apple didn’t use the &lt;a href=&quot;http://tools.ietf.org/html/rfc2392&quot;&gt;existing &lt;code&gt;mid&lt;/code&gt; scheme&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;I wrote an AppleScript to copy the message URIs of all currently selected messages in Apple Mail to the clipboard:&lt;/p&gt;

&lt;div class=&quot;code&quot;&gt;tell application &quot;Mail&quot;
    if selection = {} then return
    set urls to {}
    repeat with msg in selection as list
        set end of urls to &quot;message:%3c&quot; &amp;amp; (message id of msg as string) &amp;amp; &quot;%3e&quot;
    end repeat
    set AppleScript&#39;s text item delimiters to &quot;, &quot;
    set the clipboard to urls as string
end tell&lt;/div&gt;

&lt;p&gt;I stored this as an .scpt File into my &lt;code&gt;~/Library/Scripts/Applications/Mail&lt;/code&gt; folder so I can access it from the &lt;a href=&quot;http://www.tuaw.com/2006/08/08/tuaw-tip-enable-the-applescript-menu/&quot;&gt;AppleScript menu&lt;/a&gt; in Mail.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; John Gruber also has an article with a bit more research about this feature today, at &lt;a href=&quot;http://daringfireball.net/2007/12/message_urls_leopard_mail&quot;&gt;Daring Fireball&lt;/a&gt;.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Copy-Message-URLs-AppleScript-for-Apple-Mail.html</guid>
			<pubDate>Tue, 4 Dec 2007 15:36:17 +0100</pubDate>
                    </item>
        	            <item>
            <title>The Life and Times of the Thunderbold Kid</title>
            <!--<link>http://www.entropy.ch/blog/Books/?permalink=The-Life-and-Times-of-the-Thunderbold-Kid.html</link>-->
            <link>http://www.entropy.ch/blog/Books/2007/11/27/The-Life-and-Times-of-the-Thunderbold-Kid.html</link>
            <description>&lt;a href=&quot;http://www.amazon.com/gp/redirect.html%3FASIN=076791936X%26tag=wwwentropych-20%26lcode=xm2%26cID=2025%26ccmID=165953%26location=/o/ASIN/076791936X%253FSubscriptionId=0PZ7TM66EXQCXFVTMTR2&quot;&gt;&lt;img class=&quot;blog_entry_icon&quot; alt=&quot;Book Cover The Life and Times of the Thunderbold Kid&quot; src=&quot;http://ecx.images-amazon.com/images/I/218CETQ014L.jpg&quot; /&gt;&lt;/a&gt;

Funny Memoir by Bill Bryson, author of &lt;a href=&quot;http://www.amazon.com/gp/redirect.html%3FASIN=0767923227%26tag=wwwentropych-20%26lcode=xm2%26cID=2025%26ccmID=165953%26location=/o/ASIN/0767923227%253FSubscriptionId=0PZ7TM66EXQCXFVTMTR2&quot;&gt;“A Short History of Nearly Everything,”&lt;/a&gt; about growing up in the USA in the 1950s:

&lt;blockquote&gt;
&lt;p&gt;Bill Bryson was born in the middle of the American century—1951—in the middle of the United States—Des Moines, Iowa—in the middle of the largest generation in American history—the baby boomers. As one of the best and funniest writers alive, he is perfectly positioned to mine his memories of a totally all-American childhood for 24-carat memoir gold. Like millions of his generational peers, Bill Bryson grew up with a rich fantasy life as a superhero. In his case, he ran around his house and neighborhood with an old football jersey with a thunderbolt on it and a towel about his neck that served as his cape, leaping tall buildings in a single bound and vanquishing awful evildoers (and morons)—in his head—as &quot;The Thunderbolt Kid.&quot; &lt;/p&gt;

&lt;p&gt;Using this persona as a springboard, Bill Bryson re-creates the life of his family and his native city in the 1950s in all its transcendent normality—a life at once completely familiar to us all and as far away and unreachable as another galaxy. It was, he reminds us, a happy time, when automobiles and televisions and appliances (not to mention nuclear weapons) grew larger and more numerous with each passing year, and DDT, cigarettes, and the fallout from atmospheric testing were considered harmless or even good for you. He brings us into the life of his loving but eccentric family, including affectionate portraits of his father, a gifted sportswriter for the local paper and dedicated practitioner of isometric exercises, and OF his mother, whose job as the home furnishing editor for the same paper left her little time for practicing the domestic arts at home. The many readers of Bill Bryson’s earlier classic, A Walk in the Woods, will greet the reappearance in these pages of the immortal Stephen Katz, seen hijacking literally boxcar loads of beer. He is joined in the Bryson gallery of immortal characters by the demonically clever Willoughby brothers, who apply their scientific skills and can-do attitude to gleefully destructive ends.&lt;/p&gt;

&lt;/blockquote&gt;

&lt;br style=&#39;clear: both&#39; /&gt;


</description>
            <guid>http://www.entropy.ch/blog/Books/?permalink=The-Life-and-Times-of-the-Thunderbold-Kid.html</guid>
			<pubDate>Tue, 27 Nov 2007 23:35:42 +0100</pubDate>
                    </item>
        	            <item>
            <title>Spin State / Spin Control</title>
            <!--<link>http://www.entropy.ch/blog/Books/?permalink=Spin-State-Spin-Control.html</link>-->
            <link>http://www.entropy.ch/blog/Books/2007/11/15/Spin-State-Spin-Control.html</link>
            <description>&lt;p&gt;Just finished these two thrilling and imaginative science fiction novels by &lt;a href=&quot;http://www.sff.net/people/moriarty/index.html&quot;&gt;Chris Moriarty&lt;/a&gt;. Check out the “reading advice” on her web site.&lt;/p&gt;

&lt;a href=&quot;http://www.amazon.com/gp/redirect.html%3FASIN=0553586254%26tag=wwwentropych-20%26lcode=xm2%26cID=2025%26ccmID=165953%26location=/o/ASIN/0553586254%253FSubscriptionId=0PZ7TM66EXQCXFVTMTR2&quot;&gt;&lt;img class=&quot;blog_entry_icon&quot; alt=&quot;Spin Control Book Cover&quot; src=&quot;http://ecx.images-amazon.com/images/I/21a14iZiB%2BL.jpg&quot; /&gt;&lt;/a&gt;

&lt;a href=&quot;http://www.amazon.com/gp/redirect.html%3FASIN=0553586246%26tag=wwwentropych-20%26lcode=xm2%26cID=2025%26ccmID=165953%26location=/o/ASIN/0553586246%253FSubscriptionId=0PZ7TM66EXQCXFVTMTR2&quot;&gt;&lt;img class=&quot;blog_entry_icon&quot; alt=&quot;Spin State Book Cover&quot; src=&quot;http://ecx.images-amazon.com/images/I/21H5BRX1BRL.jpg&quot; /&gt;&lt;/a&gt;

&lt;br style=&quot;clear: both;&quot; /&gt;
</description>
            <guid>http://www.entropy.ch/blog/Books/?permalink=Spin-State-Spin-Control.html</guid>
			<pubDate>Thu, 15 Nov 2007 14:14:54 +0100</pubDate>
                    </item>
        	            <item>
            <title>Leopard: hispeedSMS Widget Update</title>
            <!--<link>http://www.entropy.ch/blog/Software/?permalink=Leopard-hispeedSMS-Widget-Update.html</link>-->
            <link>http://www.entropy.ch/blog/Software/2007/11/14/Leopard-hispeedSMS-Widget-Update.html</link>
            <description>&lt;p&gt;I just updated my hispeedSMS widget for compatibility with Leopard. Actually William Harris did all the work and sent me a fix which I just had to integrate :-)&lt;/p&gt;

&lt;p&gt;This is of interest to customers of the Swiss cable ISP cablecom.&lt;/p&gt;

&lt;a href=&quot;http://www.entropy.ch/software/macosx/#hispeedsms-widget&quot;&gt;http://www.entropy.ch/software/macosx/#hispeedsms-widget&lt;/a&gt;
</description>
            <guid>http://www.entropy.ch/blog/Software/?permalink=Leopard-hispeedSMS-Widget-Update.html</guid>
			<pubDate>Wed, 14 Nov 2007 17:31:08 +0100</pubDate>
                    </item>
        	            <item>
            <title>4-Way Universal Binary MySQL for Leopard Configuration</title>
            <!--<link>http://www.entropy.ch/blog/Mac+OS+X/?permalink=4-Way-Universal-Binary-MySQL-for-Leopard-Configuration.html</link>-->
            <link>http://www.entropy.ch/blog/Mac+OS+X/2007/11/14/4-Way-Universal-Binary-MySQL-for-Leopard-Configuration.html</link>
            <description>&lt;p&gt;MySQL seems to build as a four-way universal binary out of the box on Leopard using a &lt;code&gt;configure&lt;/code&gt; line like this:&lt;/p&gt;

&lt;div class=&quot;code&quot;&gt;MACOSX_DEPLOYMENT_TARGET=10.5 \
CFLAGS=&#39;-arch i386 -arch x86_64 -arch ppc7400 -arch ppc64&#39; \
LDFLAGS=&#39;-arch i386 -arch x86_64 -arch ppc7400 -arch ppc64&#39; \
CXXFLAGS=&#39;-arch i386 -arch x86_64 -arch ppc7400 -arch ppc64&#39; \
./configure --disable-dependency-tracking --prefix=/usr/local/mysql&lt;/div&gt;

&lt;p&gt;Followed by &lt;code&gt;make&lt;/code&gt; and &lt;code&gt;make install&lt;/code&gt;, I get a MySQL that seems to be complete.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Mac+OS+X/?permalink=4-Way-Universal-Binary-MySQL-for-Leopard-Configuration.html</guid>
			<pubDate>Wed, 14 Nov 2007 10:54:46 +0100</pubDate>
                    </item>
        	            <item>
            <title>checklibs.pl script to list dynamic library dependencies</title>
            <!--<link>http://www.entropy.ch/blog/Developer/?permalink=checklibs-pl-script-to-list-dynamic-library-dependencies.html</link>-->
            <link>http://www.entropy.ch/blog/Developer/2007/11/06/checklibs-pl-script-to-list-dynamic-library-dependencies.html</link>
            <description>&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; There’s an updated version of this script, see &lt;a href=&quot;http://www.entropy.ch/blog/Developer/2009/07/05/Updated-checklibs-pl-script-to-list-dynamic-library-dependencies.html&quot;&gt;this later article&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;This is a script I get to use a lot these days and other Mac OS X developers might find it useful.&lt;/p&gt;

&lt;p&gt;It uses &lt;code&gt;otool -L&lt;/code&gt; to determine and print all dynamic library dependencies of a given executable or library file recursively and you use it like this:&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;$ checklibs.pl /bin/ls 

/bin/ls:
	/usr/lib/libgcc_s.1.dylib
	/usr/lib/libncurses.5.4.dylib
	/usr/lib/libSystem.B.dylib

/usr/lib/libgcc_s.1.dylib:
	/usr/lib/libSystem.B.dylib

/usr/lib/libncurses.5.4.dylib:
	/usr/lib/libgcc_s.1.dylib
	/usr/lib/libSystem.B.dylib

/usr/lib/libSystem.B.dylib:
	/usr/lib/system/libmathCommon.A.dylib
&lt;/pre&gt;

&lt;p&gt;Here’s the script:&lt;/p&gt;

&lt;pre class=&quot;code prettyprint&quot;&gt;#!/usr/bin/perl
#
# Written by Marc Liyanage &amp;lt;http://www.entropy.ch&gt;
#

use strict;
use warnings;


my ($file) = @ARGV;
die $! unless (-f $file);

my $libs = {};
check_libs(file =&gt; $file, libs =&gt; $libs);

print
    map {(&quot;\n$_:\n&quot;, map {&quot;\t$_\n&quot;} sort {lc($a) cmp lc($b)} @{$libs-&gt;{$_}})}
    sort {lc($a) cmp lc($b)}
    grep {@{$libs-&gt;{$_}}}
    keys(%$libs);

sub check_libs {
    my (%args) = @_;
    my $libs = $args{libs};
    my @file_libs = grep {$_ ne $args{file}} grep {$_} map {/^\s+(\S+)/} qx(otool -L &quot;$args{file}&quot;);
    $libs-&gt;{$args{file}} = \@file_libs;
    foreach my $lib (grep {!$libs-&gt;{$_}} @file_libs) {
        unless (-f $lib) {
            $libs-&gt;{$lib} = [&#39;(missing)&#39;];
            next;
        }
        check_libs(%args, file =&gt; $lib);        
    }
}&lt;/pre&gt;
</description>
            <guid>http://www.entropy.ch/blog/Developer/?permalink=checklibs-pl-script-to-list-dynamic-library-dependencies.html</guid>
			<pubDate>Tue, 6 Nov 2007 06:11:36 +0100</pubDate>
                    </item>
        	            <item>
            <title>Leopard: Data Detectors - Awesome!</title>
            <!--<link>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Leopard-Data-Detectors-Awesome.html</link>-->
            <link>http://www.entropy.ch/blog/Mac+OS+X/2007/11/02/Leopard-Data-Detectors-Awesome.html</link>
            <description>&lt;p&gt;The new data detectors feature in Leopard is awesome!&lt;/p&gt;

&lt;p&gt;I just got an HTML e-mail flyer for an upcoming concert in my city. Apple Mail’s data detectors were able to pick out the date of the concert, in German no less. The visual cue is a dotted line around the recognized piece of information plus a drop down menu triangle:&lt;/p&gt;

&lt;img class=&quot;screenshot&quot; alt=&quot;Leopard Data Detectors in Apple Mail - Visual Cue&quot; src=&quot;http://www.entropy.ch/images/blog/2007-10-10-leopard-data-detectors-1.png&quot; /&gt;

&lt;p&gt;The menu offers commands based on the type of data, in this case actions that make sense with a date, such as creating an iCal entry. That was exactly what I wanted. Choosing this command pops up the iCal edit dialog right next to the data:&lt;/p&gt;

&lt;img class=&quot;screenshot&quot; alt=&quot;Leopard Data Detectors in Apple Mail - Editing Event Details&quot; src=&quot;http://www.entropy.ch/images/blog/2007-10-10-leopard-data-detectors-2.png&quot; /&gt;

&lt;p&gt;The dialog is pre-filled with useful defaults, obviously the detected date but also the e-mail’s subject as event title.&lt;/p&gt;

&lt;p&gt;Since there was no time next to the date, the detector suggested an all-day event. I unchecked that and set the correct time. That was the only work required to get the finished calendar entry:&lt;/p&gt;

&lt;img class=&quot;screenshot&quot; alt=&quot;Leopard Data Detectors in Apple Mail - Finished Event with Location&quot; src=&quot;http://www.entropy.ch/images/blog/2007-10-10-leopard-data-detectors-3.png&quot; /&gt;

&lt;p&gt;But check out the event’s location field which is also pre-filled correctly, how did that happen?&lt;/p&gt;

&lt;p&gt;It turns out that the e-mail message also contains an address further down on the page, an address that the data detector system was able to recognize:&lt;/p&gt;

&lt;img class=&quot;screenshot&quot; alt=&quot;Leopard Data Detectors in Apple Mail - Address detected&quot; src=&quot;http://www.entropy.ch/images/blog/2007-10-10-leopard-data-detectors-4.png&quot; /&gt;

&lt;p&gt;The detector used this address as event location, and in this case it happens to be the correct address for the concert venue. Since iSync is also running, the event was transferred to my mobile phone automatically. This is the kind of integration and technology that makes life a little bit easier...&lt;/p&gt;

&lt;p&gt;A nice detail: Take another look at the third screenshot. It shows a link back to the e-mail message in the event’s URL field. Clicking this link opens the message in Mail. This is very convenient because I don’t have to hunt down the message in my inbox if I want to get back to it in a hurry to check some details of the concert.&lt;/p&gt;

&lt;p&gt;Slightly off topic: The tool tip for this URL demonstrates an interesting feature:&lt;/p&gt;

&lt;img class=&quot;screenshot&quot; alt=&quot;Leopard Data Detectors in Apple Mail - E-Mail Message URLs&quot; src=&quot;http://www.entropy.ch/images/blog/2007-10-10-leopard-data-detectors-5.png&quot; /&gt;

&lt;p&gt;I always wanted a way to link to e-mail messages, for examples from within the OmniOutliner files that I use to keep track of my projects at work. It seems that I can simply use the &lt;code&gt;message:&lt;/code&gt; URL scheme with the message’s “Message-ID” header field.&lt;/p&gt;

&lt;div class=&quot;code&quot;&gt;message:&amp;lt;200710311554349859A4EF4A$C01F594769@FISHMAC&gt;&lt;/div&gt;

&lt;p&gt;Finally a note about a feature which I really loved in Tiger’s iCal, but which seems to be gone in Leopard: The ability to change numeric values like dates and times with the mouse wheel. You used to be able to click a day or an hour/minute value and adjust it with the mouse wheel, that was a very quick and precise way to fine-tune these numbers. I really hope they put that back in.&lt;/p&gt;

&lt;p&gt;I also hate it that double-clicking an event does not open it in edit mode, I have to click yet another button, or use Cmd-E on the event.&lt;/p&gt;

</description>
            <guid>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Leopard-Data-Detectors-Awesome.html</guid>
			<pubDate>Fri, 2 Nov 2007 00:00:13 +0100</pubDate>
                    </item>
        	            <item>
            <title>Leopard : Four-Way Universal Binaries</title>
            <!--<link>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Leopard-Four-Way-Universal-Binaries.html</link>-->
            <link>http://www.entropy.ch/blog/Mac+OS+X/2007/10/30/Leopard-Four-Way-Universal-Binaries.html</link>
            <description>&lt;p&gt;A &lt;a href=&quot;http://www.entropy.ch/phpbb2/viewtopic.php?p=10801#10801&quot;&gt;post in my user forum&lt;/a&gt; made me aware of the fact that in Leopard, some binaries are not just two-way (PPC/Intel) but four-way Universal Binaries. The four variants are Intel 32bit, Intel 64bit, PPC 32bit and PPC 64bit.&lt;/p&gt;

&lt;p&gt;Examples are the Apache web server binary and all its modules:&lt;/p&gt;

&lt;div class=&quot;code&quot;&gt;$ file /usr/sbin/httpd
/usr/sbin/httpd: Mach-O universal binary with 4 architectures
/usr/sbin/httpd (for architecture ppc7400):	Mach-O executable ppc
/usr/sbin/httpd (for architecture ppc64):	Mach-O 64-bit executable ppc64
/usr/sbin/httpd (for architecture i386):	Mach-O executable i386
/usr/sbin/httpd (for architecture x86_64):	Mach-O 64-bit executable x86_64

$ file /usr/libexec/apache2/mod_vhost_alias.so 
mod_vhost_alias.so: Mach-O universal binary with 4 architectures
mod_vhost_alias.so (for architecture ppc7400):	Mach-O bundle ppc
mod_vhost_alias.so (for architecture ppc64):	Mach-O 64-bit bundle ppc64
mod_vhost_alias.so (for architecture i386):	Mach-O bundle i386
mod_vhost_alias.so (for architecture x86_64):	Mach-O 64-bit bundle x86_64&lt;/div&gt;


&lt;p&gt;I think it wasn’t that way in Tiger?&lt;/p&gt;

Only few of the command line binaries are four-way universal:

&lt;div class=&quot;code&quot;&gt;$ file /usr/bin/* /usr/sbin/* | grep &#39;4 architectures&#39;
/usr/bin/auvaltool:                       Mach-O universal binary with 4 architectures
/usr/bin/mpic++:                          Mach-O universal binary with 4 architectures
/usr/bin/mpicc:                           Mach-O universal binary with 4 architectures
/usr/bin/mpicxx:                          Mach-O universal binary with 4 architectures
/usr/bin/mpiexec:                         Mach-O universal binary with 4 architectures
/usr/bin/mpif77:                          Mach-O universal binary with 4 architectures
/usr/bin/mpif90:                          Mach-O universal binary with 4 architectures
/usr/bin/mpirun:                          Mach-O universal binary with 4 architectures
/usr/bin/ompi_info:                       Mach-O universal binary with 4 architectures
/usr/bin/opal_wrapper:                    Mach-O universal binary with 4 architectures
/usr/bin/orted:                           Mach-O universal binary with 4 architectures
/usr/bin/orterun:                         Mach-O universal binary with 4 architectures
/usr/sbin/httpd:                          Mach-O universal binary with 4 architectures&lt;/div&gt;

Many more are two-way:

&lt;div class=&quot;code&quot;&gt;$ file /usr/bin/* /usr/sbin/* | grep &#39;2 architectures&#39; | wc -l
     857&lt;/div&gt;

&lt;p&gt;The graphical end-user apps seem to be two-way too:&lt;/p&gt;

&lt;div class=&quot;code&quot;&gt;$ file /Applications/GarageBand.app/Contents/MacOS/GarageBand 
/Applications/GarageBand.app/Contents/MacOS/GarageBand: Mach-O universal binary with 2 architectures&lt;/div&gt;

&lt;p&gt;The interesting question for me is if I need to start building my PHP5 module as four-way universal binary. That could mean a lot of additional work because not all of the many open source libraries I have to include might even be 64bit-clean.&lt;/p&gt;

&lt;p&gt;Update: &lt;a href=&quot;http://www.entropy.ch/phpbb2/viewtopic.php?p=10813#10813&quot;&gt;Apparently I do...&lt;/a&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Another observation: While working on a PHP5 module build I stumbled upon what seems to be an inconsistency between architectures in the Apple-suppplied libiconv library. The PHP build fails in the link stage. The linker cannot find the symbol &lt;code&gt;_libiconv&lt;/code&gt; in two of the four architectures.&lt;/p&gt;

&lt;p&gt;Sure enough, the two 64bit architectures in the fat library do not seem to define this symbol:&lt;/p&gt;

&lt;div class=&quot;code&quot;&gt;$ for arch in i386 ppc7400 x86_64 ppc64; do echo $arch; nm -arch $arch /usr/lib/libiconv.dylib  | grep _libiconv$; done
i386
0000bc8d T _libiconv
ppc7400
0000de7c T _libiconv
x86_64
ppc64&lt;/div&gt;

&lt;p&gt;The build succeeds if I build my own universal libiconv from source. I wonder why Apple’s PHP5 works with the system-supplied libiconv.&lt;/p&gt;




</description>
            <guid>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Leopard-Four-Way-Universal-Binaries.html</guid>
			<pubDate>Tue, 30 Oct 2007 14:13:34 +0100</pubDate>
                    </item>
        	            <item>
            <title>PostgreSQL 8.2.5 Package Available</title>
            <!--<link>http://www.entropy.ch/blog/Software/?permalink=PostgreSQL-8-2-5-Package-Available.html</link>-->
            <link>http://www.entropy.ch/blog/Software/2007/10/13/PostgreSQL-8-2-5-Package-Available.html</link>
            <description>&lt;p&gt;Here’s a package for the recently released version 8.2.5 of PostgreSQL.&lt;/p&gt;

&lt;p&gt;Download link in the &lt;a href=&quot;http://www.entropy.ch/phpbb2/viewtopic.php?p=10735#10735&quot;&gt;forum post&lt;/a&gt;.&lt;/p&gt;



</description>
            <guid>http://www.entropy.ch/blog/Software/?permalink=PostgreSQL-8-2-5-Package-Available.html</guid>
			<pubDate>Sat, 13 Oct 2007 11:24:05 +0200</pubDate>
                    </item>
        	            <item>
            <title>Ringworld</title>
            <!--<link>http://www.entropy.ch/blog/Books/?permalink=Ringworld.html</link>-->
            <link>http://www.entropy.ch/blog/Books/2007/10/12/Ringworld.html</link>
            <description>&lt;p&gt;I just finished the these four books of &lt;a href=&quot;http://en.wikipedia.org/wiki/Larry_Niven&quot;&gt;Larry Niven’s&lt;/a&gt; &lt;a href=&quot;http://en.wikipedia.org/wiki/Ringworld&quot;&gt;Ringworld&lt;/a&gt; science fiction series. Highly recommended...&lt;/p&gt;

&lt;br clear=&#39;all&#39; /&gt;

&lt;a href=&quot;http://www.amazon.com/gp/redirect.html%3FASIN=0765341026%26tag=wwwentropych-20%26lcode=xm2%26cID=2025%26ccmID=165953%26location=/o/ASIN/0765341026%253FSubscriptionId=0PZ7TM66EXQCXFVTMTR2&quot;&gt;&lt;img class=&quot;blog_entry_icon&quot; alt=&quot;&quot; src=&quot;http://ecx.images-amazon.com/images/I/215BE6RC80L.jpg&quot; /&gt;&lt;/a&gt;

&lt;a href=&quot;http://www.amazon.com/gp/redirect.html%3FASIN=0345412966%26tag=wwwentropych-20%26lcode=xm2%26cID=2025%26ccmID=165953%26location=/o/ASIN/0345412966%253FSubscriptionId=0PZ7TM66EXQCXFVTMTR2&quot;&gt;&lt;img class=&quot;blog_entry_icon&quot; alt=&quot;&quot; src=&quot;http://ecx.images-amazon.com/images/I/21H112VYX5L.jpg&quot; /&gt;&lt;/a&gt;

&lt;a href=&quot;http://www.amazon.com/gp/redirect.html%3FASIN=0345334302%26tag=wwwentropych-20%26lcode=xm2%26cID=2025%26ccmID=165953%26location=/o/ASIN/0345334302%253FSubscriptionId=0PZ7TM66EXQCXFVTMTR2&quot;&gt;&lt;img class=&quot;blog_entry_icon&quot; alt=&quot;&quot; src=&quot;http://ecx.images-amazon.com/images/I/21CNKPRSVPL.jpg&quot; /&gt;&lt;/a&gt;

&lt;a href=&quot;http://www.amazon.com/gp/redirect.html%3FASIN=0345333926%26tag=wwwentropych-20%26lcode=xm2%26cID=2025%26ccmID=165953%26location=/o/ASIN/0345333926%253FSubscriptionId=0PZ7TM66EXQCXFVTMTR2&quot;&gt;&lt;img class=&quot;blog_entry_icon&quot; alt=&quot;&quot; src=&quot;http://ecx.images-amazon.com/images/I/21O8IWsJopL.jpg&quot; /&gt;&lt;/a&gt;






&lt;br clear=&quot;all&quot; /&gt;
</description>
            <guid>http://www.entropy.ch/blog/Books/?permalink=Ringworld.html</guid>
			<pubDate>Fri, 12 Oct 2007 23:42:57 +0200</pubDate>
                    </item>
        	             <item>
            <title>Joel on California</title>
            <!--<link>http://www.entropy.ch/blog/?permalink=Joel-on-California.html</link>-->
            <link>http://www.entropy.ch/blog/2007/10/08/Joel-on-California.html</link>
            <description>&lt;p&gt;I &lt;em&gt;loved&lt;/em&gt; this part of Joel Spolsky’s piece about &lt;a href=&quot;http://www.joelonsoftware.com/items/2007/10/05.html&quot;&gt;“Designed by Apple in California”&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Of course, Microsoft&#39;s Apple Envy is so impossible to disguise that the back of the Zune says, &quot;Hello from Seattle:&quot;&lt;/p&gt;

&lt;p&gt;Um... excuse me? Hello from Seattle? That has, I&#39;m afraid, none of the same resonance. It evokes nothing. Boeing and rain, maybe. Kurt Cobain&#39;s unhappiness.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Make sure to read it...&lt;/p&gt;

(Found on &lt;a href=&quot;http://daringfireball.net/linked/2007/october#sat-06-cali&quot;&gt;Daring Fireball&lt;/a&gt;)
</description>
            <guid>http://www.entropy.ch/blog/?permalink=Joel-on-California.html</guid>
			<pubDate>Mon, 8 Oct 2007 22:48:49 +0200</pubDate>
                    </item>
        	            <item>
            <title>More 802.11n/AirPort Extreme Wireless Notes</title>
            <!--<link>http://www.entropy.ch/blog/Mac+OS+X/?permalink=More-802-11n-AirPort-Extreme-Wireless-Notes.html</link>-->
            <link>http://www.entropy.ch/blog/Mac+OS+X/2007/09/03/More-802-11n-AirPort-Extreme-Wireless-Notes.html</link>
            <description>&lt;p&gt;This post was originally planned as a rant about how Apple’s &lt;a href=&quot;http://en.wikipedia.org/wiki/AirPort#AirPort_Extreme_.28802.11n.29&quot;&gt;AirPort Extreme&lt;/a&gt; base station with 802.11n draft capability &lt;em&gt;still&lt;/em&gt; hangs and drops all NAT port mappings after about 24 hours of use (see my &lt;a href=&quot;http://www.entropy.ch/blog/Mac+OS+X/2007/03/10/AirPort-Extreme-802-11n-Base-Station-Trouble.html&quot;&gt;previous post&lt;/a&gt;). I was going to &lt;a href=&quot;http://www.urbandictionary.com/define.php?term=piece+of+shit&quot;&gt;call it names&lt;/a&gt;. However, it turned out differently, read on for some interesting observations...&lt;/p&gt;

&lt;p&gt;The NAT breakdown is more than a minor annoyance for me because my web server runs behind this router. If the problem occurs and I don&#39;t immediately notice it and restart the base station using AirPort Utility, the web site is not accessible and my mail doesn’t work.&lt;/p&gt;

&lt;p&gt;It was very annoying but I didn’t do anything about it because I thought that Apple would fix this pretty quickly. Unfortunately I was wrong and after the last two firmware updates it’s still broken. I also sent it in for repair and got a replacement unit (still the fast ethernet version though, not the new August 2007 version with Gigabit ethernet). It has the same problem so I guess it really is a firmware issue.&lt;/p&gt;

&lt;p&gt;To stabilize the web site situation, I finally bought a different wireless router. Since I was really hooked on the higher 802.11n draft throughput, I again bought one with this feature, the &lt;a href=&quot;http://netgear.com/Products/RoutersandGateways/RangeMaxNEXTWirelessRoutersandGateways/WNR854T.aspx&quot;&gt;WNR854T&lt;/a&gt; from NetGear. After playing around with it for an evening, I think I know what a real POS is.&lt;/p&gt;

&lt;p&gt;I could not believe how many technical features I knew from the Apple product were completely missing, and how awkward the web based administration used by NetGear and many other vendors still is. I realized how incredibly good the setup and configuration experience of Apple’s AirPort Utility is (the new one, not the old one for the old round Extremes). Here are just a few examples on the administration side:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every single port mapping requires a restart?!? I have lots of port mappings, and each restart takes almost a minute. Seriously, WTF??? I want to configure them all, then commit them together.&lt;/li&gt;
&lt;li&gt;The logging is a joke. No syslog, and the only events it reports are when someone hits the content filter? I am interested in a lot more information, like the Apple base station provides.&lt;/li&gt;
&lt;li&gt;Port mappings seem to be possible only on the same port. I can’t map the incoming port x to the port y on the internal machine. I have two hosts I need to reach with SSH from outside, how am I supposed to do that when only one mapping for port 22 is possible? The Apple base station allows me to configure two different ports on the WAN side.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;(And the web interface is ugly! You’d think they could hire a web designer to freshen it up a bit.)&lt;/p&gt;

&lt;p&gt;The NetGear product is also technically inferior. Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No 5GHz Band??? I could not believe this, and I could not believe I didn&#39;t check this before buying it.&lt;/li&gt;
&lt;li&gt;No USB port for attaching printers or harddisks. I don’t care about the disks, but I do use a printer.&lt;/li&gt;
&lt;li&gt;It’s slooooooooow! I compared throughput before and after the switch, see below...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After setting everything up, I was in for a surprise: The wireless network throughput sucked badly. Here is a measurement from before the switch:&lt;/p&gt;

&lt;div class=&quot;code&quot;&gt;$ curl -o /dev/null minime.local/~liyanage/zero.dat
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 97.6M  100 97.6M    0     0  4072k      0  0:00:24  0:00:24 --:--:-- 4363k&lt;/div&gt;

&lt;p&gt;&lt;code&gt;Average Dload Speed&lt;/code&gt; is the interesting number. Four megabytes per second which feels fairly snappy.&lt;/p&gt;

Here’s the result with the NetGear device (I cancelled it after 30 seconds):

&lt;div class=&quot;code&quot;&gt;$ curl -o /dev/null minime.local/~liyanage/zero.dat
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
 17 97.6M   17 17.2M    0     0   479k      0  0:03:28  0:00:36  0:02:52  345k^C&lt;/div&gt;

&lt;p&gt;I didn’t touch the computer, and the router was in the same location as the AirPort Extreme before it. The download speed is almost 10 times lower!&lt;/p&gt;

&lt;p&gt;I played around with some of the settings, but that didn’t help. The AirPort Extreme was operating in the 5 GHz band and the NetGear can only use the 2.4GHz band, which is pretty full in my neighborhood so that might explain some of the difference. However, when I first set up the AirPort Extreme, I also tried it in the 2.4GHz band and it was &lt;em&gt;much&lt;/em&gt; faster even there.&lt;/p&gt;

&lt;p&gt;To be fair, 802.11n is not yet a final standard and things could (and hopefully will) improve, especially in the area of interoperability between equipment of different vendors, like the NetGear base station and an Apple laptop in this case.&lt;/p&gt;

&lt;p&gt;Because this throughput was not acceptable, but going back was not an option either, I ended up using both devices: I completely switched off the NetGear’s wireless system and use it strictly as an (expensive) NAT router. On the AirPort Extreme, I switched off all routing features, it is now a simple wireless-to-ethernet bridge. When I measured the throughput again, I was in for another big surprise, this time a nice one: The download speed almost doubled!&lt;/p&gt;

&lt;div class=&quot;code&quot;&gt;$ curl -o /dev/null minime.local/~liyanage/zero.dat
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 97.6M  100 97.6M    0     0  7728k      0  0:00:12  0:00:12 --:--:-- 7891k&lt;/div&gt;

&lt;p&gt;It seems that the Apple base station performs much better when NAT/DHCP is deactivated. It’s a bit strange because the connection to the peer host does not even involve NAT, it is connected to one of the router’s LAN ethernet port.&lt;/p&gt;

&lt;p&gt;Either the Extreme’s processor is under-powered or its firmware is &lt;em&gt;really&lt;/em&gt; in a bad shape.&lt;/p&gt;

&lt;p&gt;All this made me realize that Apple does make the perfect wireless network equipment for home use. The whole experience, provided on one hand by technical features like USB and digital audio ports (on the Express) and by their administration software on the other hand is great. It’s funny that Apple’s product is the one providing far far more technical options. They are usually the ones being accused of dumbing down the user interface and limiting options, but in this case there are way more options and features, enabling me to handle even complicated and unusual network configurations (especially regarding NAT/WDS/DHCP/port mapping).&lt;/p&gt;

&lt;p&gt;Now if they could &lt;em&gt;please&lt;/em&gt; fix the hangs and crashes in their firmware!&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Mac+OS+X/?permalink=More-802-11n-AirPort-Extreme-Wireless-Notes.html</guid>
			<pubDate>Mon, 3 Sep 2007 22:44:49 +0200</pubDate>
                    </item>
        	            <item>
            <title>PHP 5.2.4 Package Available</title>
            <!--<link>http://www.entropy.ch/blog/Software/?permalink=PHP-5-2-4-Package-Available.html</link>-->
            <link>http://www.entropy.ch/blog/Software/2007/09/01/PHP-5-2-4-Package-Available.html</link>
            <description>&lt;p&gt;I just released PHP 5.2.4 packages.&lt;/p&gt;

&lt;p&gt;Download links are in the &lt;a href=&quot;http://www.entropy.ch/phpbb2/viewtopic.php?p=10605&quot;&gt;forum post&lt;/a&gt;.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Software/?permalink=PHP-5-2-4-Package-Available.html</guid>
			<pubDate>Sat, 1 Sep 2007 01:01:32 +0200</pubDate>
                    </item>
        	            <item>
            <title>QTFastStart for Flash Video H.264</title>
            <!--<link>http://www.entropy.ch/blog/Software/?permalink=QTFastStart-for-Flash-Video-H-264.html</link>-->
            <link>http://www.entropy.ch/blog/Software/2007/08/29/QTFastStart-for-Flash-Video-H-264.html</link>
            <description>&lt;p&gt;I just published &lt;a href=&quot;http://www.entropy.ch/software/macosx/#qtfaststart&quot;&gt;QTFastStart&lt;/a&gt;, a Cocoa wrapper around the &lt;a href=&quot;http://svn.mplayerhq.hu/ffmpeg/trunk/tools/qt-faststart.c?view=markup&quot;&gt;qt-faststart.c&lt;/a&gt; program by Mike Melanson. qt-faststart reorders the components of an H.264 MPEG4 video file to enable progressive download playback of certain &lt;a href=&quot;http://en.wikipedia.org/wiki/H.264&quot;&gt;H.264 videos&lt;/a&gt; in the Flash Player browser plugin. Read &lt;a href=&quot;http://www.kaourantin.net/2007/08/what-just-happened-to-video-on-web_20.html&quot;&gt;Tinic Uro’s description&lt;/a&gt; of the issue.&lt;/p&gt;

&lt;p&gt;This GUI wrapper was whipped up in a matter of minutes and is thus rather unpolished.&lt;/p&gt;

&lt;p&gt;I have no H.264 files with their moov part at the end to test it so I don’t know if this works as intended. Let me know if you try it out.&lt;/p&gt;

&lt;p&gt;Here is an example of the new H.264 video codec support. If you’re running the &lt;a href=&quot;http://labs.adobe.com/technologies/flashplayer9/&quot;&gt;newest beta&lt;/a&gt; of the Flash player plugin, you should see the video here:&lt;/p&gt;

&lt;div id=&quot;video.2007-08-30.timelapse&quot;&gt;This will be replaced by the player.&lt;/div&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
    flashembed(&quot;video.2007-08-30.timelapse&quot;,
        {src:&#39;/video/flowplayer/FlowPlayerDark.swf&#39;, width: 320,  height: 262},
        {config: {
            videoFile: &#39;blog/2007-08-30-plant_timelapse.m4v&#39;,
            configFileName: &#39;http://www.entropy.ch/video/flowplayer/config.js&#39;
        }}
    );
&lt;/script&gt;

&lt;p&gt;&lt;i&gt;Check out &lt;a href=&quot;http://flowplayer.org&quot;&gt;FlowPlayer&lt;/a&gt; for a great free customizable Flash video player.&lt;/i&gt;&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Software/?permalink=QTFastStart-for-Flash-Video-H-264.html</guid>
			<pubDate>Wed, 29 Aug 2007 19:53:44 +0200</pubDate>
                    </item>
        	            <item>
            <title>Terminal Tricks: Bash directory helper key bindings</title>
            <!--<link>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Terminal-Tricks-Bash-directory-helper-key-bindings.html</link>-->
            <link>http://www.entropy.ch/blog/Mac+OS+X/2007/08/21/Terminal-Tricks-Bash-directory-helper-key-bindings.html</link>
            <description>&lt;p&gt;Here are two small additions for your &lt;code&gt;.bashrc&lt;/code&gt; file which I found useful. Try them out, you might like it too…&lt;/p&gt;
&lt;p&gt;The first one displays the current working directory whenever you hit the shortcut. I find this useful because I often find myself typing a long, complicated or a potentially dangerous command and then I need to quickly confirm that I’m really in the intended directory (the prompt is not always sufficient):&lt;/p&gt;
&lt;pre class=&#39;code&#39;&gt;$ chown -R foo:bar .&lt;/pre&gt;
&lt;p&gt;If I hit the shortcut, Ctrl-P in my case, bash displays the current directory but leaves the command line unchanged and uncommitted:&lt;/p&gt;
&lt;pre class=&#39;code&#39;&gt;$ chown -R foo:bar . /Users/liyanage/svn/…&lt;/pre&gt;
&lt;p&gt;This is the addition to &lt;code&gt;.bashrc&lt;/code&gt; to make it happen:&lt;/p&gt;
&lt;pre class=&#39;code&#39;&gt;# print current working directory (pwd) on Ctrl-P
bind -x &#39;&quot;\C-p&quot;&#39;:&#39;echo $PWD&#39;&lt;/pre&gt;
&lt;p&gt;The second shortcut does something else I need to do often: ascend to the parent directory. There is the well-known &lt;code&gt;..&lt;/code&gt; alias, expanding to &lt;code&gt;cd ..&lt;/code&gt; (&lt;code&gt;alias ..=&#39;cd ..&#39;&lt;/code&gt;), but I wanted something even shorter, and again something I could use while in the middle of a command line edit.&lt;/p&gt;
&lt;pre class=&#39;code&#39;&gt;# Ascend to parent directory on ESC Arrow-Up
bind -x $&#39;&quot;\201&quot;:cd .. &amp;amp;&amp;amp; echo $PWD&#39;
bind &#39;&quot;\e\e[A&quot;&#39;:$&#39;&quot;\201&quot;&#39;&lt;/pre&gt;
&lt;p&gt;This will ascend one directory and print the new location after I hit the Escape key and then type the up arrow key, again without disturbing the currently edited command line.&lt;/p&gt;
&lt;p&gt;An alternative version additionally executes the &lt;code&gt;ls&lt;/code&gt; command after ascending:&lt;/p&gt;
&lt;pre class=&#39;code&#39;&gt;bind -x $&#39;&quot;\201&quot;:cd .. &amp;amp;&amp;amp; echo $PWD &amp;amp;&amp;amp; ls -a&#39;&lt;/pre&gt;
&lt;p&gt;The two-step mapping above is actually a work-around. What &lt;em&gt;should&lt;/em&gt; work is this:&lt;/p&gt;
&lt;pre class=&#39;code&#39;&gt;bind -x &#39;&quot;\e\e[A&quot;:cd .. &amp;amp;&amp;amp; echo $PWD&#39;&lt;/pre&gt;
&lt;p&gt;But that fails with &lt;code&gt;bash_execute_unix_command: cannot find keymap for command&lt;/code&gt; and I have no idea why. Let me know if you know :-) I found the workaround in this old &lt;a href=&quot;http://groups.google.com/group/comp.unix.shell/msg/3b7baccfdfa997c0&quot;&gt;comp.unix.shell newsgroup posting&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Oh and if someone can tell me how to use Ctrl-Arrow-Up instead of ESC-Arrow-Up I’d be very interested. I could not figure out how to specificy that sequence.&lt;/p&gt;
&lt;p&gt;I am using Bash 3.2.15 installed with &lt;a href=&quot;http://www.macports.org/&quot;&gt;MacPorts&lt;/a&gt;, but this should work with the Mac OS X 10.4 default bash version 2.05.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Terminal-Tricks-Bash-directory-helper-key-bindings.html</guid>
			<pubDate>Tue, 21 Aug 2007 09:33:36 +0200</pubDate>
                    </item>
        	            <item>
            <title>Converting Microsoft .pvk Private Keys to Java Keystore</title>
            <!--<link>http://www.entropy.ch/blog/Developer/?permalink=Converting-Microsoft-pvk-Private-Keys-to-Java-Keystore.html</link>-->
            <link>http://www.entropy.ch/blog/Developer/2007/08/16/Converting-Microsoft-pvk-Private-Keys-to-Java-Keystore.html</link>
            <description>&lt;p&gt;We have some web browser extension code that is implemented both as a Java applet and as an ActiveX component (These two technologies cover both relevant cases, Java for Safari, Firefox etc, and ActiveX for MSIE6/7).&lt;/p&gt;&lt;p&gt;We need to sign the final binaries with a &lt;a href=&quot;http://en.wikipedia.org/wiki/Code_signing&quot;&gt;code signing&lt;/a&gt; certificate issued to us by a &lt;a href=&quot;http://en.wikipedia.org/wiki/Certificate_authority&quot;&gt;CA&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;We did it the Microsoft way first (they call it Authenticode) and used their tools. These generated the key pair and we sent off the public key to the CA and got back our certificate. This certificate was in a format compatible with the tools used on the Java side (&lt;code&gt;keytool&lt;/code&gt;) to import key material into a Java keystore. At most some minor PEM/DER conversion is required, all very easy to do using the &lt;a href=&quot;http://www.openssl.org/docs/apps/openssl.html&quot;&gt;OpenSSL command line tools:&lt;/a&gt;&lt;/p&gt;&lt;div class=&quot;code&quot;&gt;openssl x509 -inform pem -outform der &amp;lt; cert.cer &gt; cert.der&lt;/div&gt;&lt;p&gt;However, there are two problems getting the private key into the Java keystore:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;The private key was stored in a proprietary Microsoft format called PVK&lt;/li&gt;&lt;li&gt;The keytool does not allow the import of private keys into a keystore, only certificates&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The first problem is solved very nicely with a Windows tool written by Stephen N Henson called &lt;a href=&quot;http://www.drh-consultancy.demon.co.uk/pvk.html&quot;&gt;pvktool.exe&lt;/a&gt;:&lt;/p&gt;&lt;div class=&quot;code&quot;&gt;pvk -in mykey.pvk -out mykey.pem&lt;/div&gt;&lt;p&gt;It will ask for a password used to protect the new file, choose anything you want.&lt;/p&gt;&lt;p&gt;The result is the private key in RSA / PEM format, which is what sane tools like OpenSSL use.&lt;/p&gt;&lt;p&gt;The second problem is solved by bypassing the keytool command line interface to the keystore and using a Java class called &lt;a href=&quot;http://www.agentbob.info/agentbob/79.html&quot;&gt;ImportKey&lt;/a&gt; written by Jochen Seifarth. It uses the appropriate APIs directly to store the private key.&lt;/p&gt;&lt;p&gt;First the key needs to be wrapped into PKCS8 / DER form:&lt;/p&gt;&lt;div class=&quot;code&quot;&gt;openssl pkcs8 -topk8 -nocrypt -inform pem -outform der &amp;lt; mykey.pem &gt; mykey.der&lt;/div&gt;&lt;p&gt;This will ask for the password you picked before. Now we are ready to run ImportKey:&lt;/p&gt;&lt;div class=&quot;code&quot;&gt;java ImportKey mykey.der cert.der some_alias_goes_here&lt;/div&gt;&lt;p&gt;By default it creates a new keystore in your home directory called &lt;code&gt;keystore.ImportKey&lt;/code&gt;. It also asks for a password used to protect the keystore.&lt;/p&gt;&lt;p&gt;To check what is in the keystore:&lt;/p&gt;&lt;div class=&quot;code&quot;&gt;keytool -keystore ~/keystore.ImportKey -list&lt;/div&gt;

You should now be able to use signing tools like &lt;code&gt;jarsigner&lt;/code&gt;.
</description>
            <guid>http://www.entropy.ch/blog/Developer/?permalink=Converting-Microsoft-pvk-Private-Keys-to-Java-Keystore.html</guid>
			<pubDate>Thu, 16 Aug 2007 20:33:34 +0200</pubDate>
                    </item>
        	            <item>
            <title>CoreImageTool 1.0</title>
            <!--<link>http://www.entropy.ch/blog/Software/?permalink=CoreImageTool-1-0.html</link>-->
            <link>http://www.entropy.ch/blog/Software/2007/08/05/CoreImageTool-1-0.html</link>
            <description>&lt;p&gt;I just released the first version of CoreImageTool.&lt;/p&gt;

&lt;p&gt;It is a command line front end to Apple’s Core Image framework introduced in Mac OS X 10.4. It makes core image filter processing available to scripting languages like bash or Perl/Python/Ruby/PHP used for command line or web applications.&lt;/p&gt;

&lt;p&gt;More information and a download link are available at the &lt;a href=&quot;http://www.entropy.ch/software/macosx/coreimagetool/&quot;&gt;CoreImageTool page&lt;/a&gt;.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Software/?permalink=CoreImageTool-1-0.html</guid>
			<pubDate>Sun, 5 Aug 2007 14:12:12 +0200</pubDate>
                    </item>
        	            <item>
            <title>Looking for a Perl Web Developer</title>
            <!--<link>http://www.entropy.ch/blog/Developer/?permalink=Looking-for-a-Perl-Web-Developer.html</link>-->
            <link>http://www.entropy.ch/blog/Developer/2007/08/02/Looking-for-a-Perl-Web-Developer.html</link>
            <description>&lt;p&gt;We are looking for a Perl web developer at &lt;a href=&quot;http://www.futurelab.ch&quot;&gt;futureLAB AG&lt;/a&gt;. If you have experience with object-oriented Perl, XML, SQL, XSLT, modern, CSS and JavaScript based web development, send us your resumé, at info at futurelab dot ch.&lt;/p&gt;

&lt;p&gt;We have a full-time position, but we also have some short-term project work for which we are considering off-site development.&lt;/p&gt;

</description>
            <guid>http://www.entropy.ch/blog/Developer/?permalink=Looking-for-a-Perl-Web-Developer.html</guid>
			<pubDate>Thu, 2 Aug 2007 16:51:18 +0200</pubDate>
                    </item>
        	            <item>
            <title>Juniper Network Connect SSL VPN and Virtualization</title>
            <!--<link>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Juniper-Network-Connect-SSL-VPN-and-Virtualization.html</link>-->
            <link>http://www.entropy.ch/blog/Mac+OS+X/2007/07/28/Juniper-Network-Connect-SSL-VPN-and-Virtualization.html</link>
            <description>&lt;p&gt;I am currently developing and testing software on a platform that is only reachable through a VPN. The VPN technology in use is an &lt;a href=&quot;http://www.juniper.net/products_and_services/ssl_vpn_secure_access/&quot;&gt;SSL VPN by Juniper Networks&lt;/a&gt;. It has a feature called &amp;#8220;Network Connect&amp;#8221; that connects the client to the remove network with a virtual network interface and exchanges the data with SSL.&lt;/p&gt;

&lt;p&gt;The client is available for Windows, Linux and Mac OS X. The login procedure starts in a web browser. The VPN server&amp;#8217;s login page launches a Java applet (or maybe an ActiveX control on Windows) that downloads and installs the platform-specific VPN client software.&lt;/p&gt;

&lt;p&gt;The Mac client is surprisingly good and works well. It has a nice OS X GUI and plenty of diagnostics for troubleshooting, like a log file viewer. The problem with the client is that&amp;#8212;probably based on server-side policy&amp;#8212;it aggressively shuts down all other network connections and forces the exclusive use of the VPN connection. Manual changes to the routing table are immediately reverted by a daemon. It is actually a pretty clever and elegant piece of software. However, the remote network to which I connect does not have any connection to the Internet, no DNS etc. Developing software this way is simply not possible.&lt;/p&gt;

&lt;p&gt;A friend gave me the tip to connect a virtualized Windows XP machine. All Mac programs can access the Internet and programs like the &lt;a href=&quot;http://www.chiark.greenend.org.uk/~sgtatham/putty/&quot;&gt;Putty SSH client&lt;/a&gt; running inside the virtual Windows XP guest OS can access the remote system.&lt;/p&gt;

&lt;p&gt;This solution is slightly more convenient than two separate machines because it already allows copy/paste and drag/drop. However, I really wanted direct SFTP and SSH connectivity from my Mac client programs like Terminal and &lt;a href=&quot;http://nolobe.com/interarchy/&quot;&gt;Interarchy&lt;/a&gt;/BBEdit. The solution is SSH tunneling through the VM, and Putty can do this, but I wanted a bit more flexibility and automation of the process by using Linux instead of Windows inside the VM (and I actually could not get the VPN connection running in my virtual Windows Vista, even after disabling Vista&amp;#8217;s &lt;a href=&quot;http://en.wikipedia.org/wiki/User_Account_Control&quot;&gt;UAC&lt;/a&gt; got me one step closer).&lt;/p&gt;

&lt;p&gt;What follows is the description of my setup.&lt;/p&gt;

&lt;h2&gt;VMWare / Linux Setup&lt;/h2&gt;

&lt;p&gt;I use &lt;a href=&quot;http://www.vmware.com/beta/fusion/&quot;&gt;VMWare Fusion&lt;/a&gt; for virtualization (Tip: pre-order it now for half the final price while it is still in beta). Its &amp;#8220;Download Virtual Appliances&amp;#8221; command brought me to a &lt;a href=&quot;http://www.vmware.com/vmtn/appliances/directory/941&quot;&gt;pre-built Fedora 7&lt;/a&gt; Linux virtual machine.&lt;/p&gt;

&lt;p&gt;I launched it and made sure I could browse the web in Firefox to confirm that network connectivity was working.&lt;/p&gt;


&lt;h2&gt;Get the VPN to Work in the Browser&lt;/h2&gt;

&lt;p&gt;The first step was to login to the VPN the regular way, through the launcher Java applet in the web browser.&lt;/p&gt;

&lt;p&gt;The Fedora 7 installation had Java SE 6 installed but that didn&#39;t work for me. I installed the older &lt;a href=&quot;http://java.sun.com/javase/downloads/index_jdk5.jsp&quot;&gt;J2SE 5.0&lt;/a&gt; (&lt;code&gt;jdk-1.5.0_12-fcs&lt;/code&gt;) from Sun.&lt;/p&gt;

&lt;p&gt;To enable Java in Firefox a symbolic link is required:&lt;/p&gt;

&lt;div class=&quot;code&quot;&gt;ln -s /usr/java/jdk1.5.0_*/jre/plugin/i386/ns7/libjavaplugin_oji.so /usr/lib/firefox-2.0.0.5/plugins/&lt;/div&gt;

&lt;p&gt;The Linux client links to some outdated libraries, (one of them late at runtime, making the problem hard to find). I had to install these two additional Fedora packages:&lt;/p&gt;

&lt;div class=&quot;code&quot;&gt;yum install compat-libstdc++-296-2.96-138
yum install openssl097a-0.9.7a-9&lt;/div&gt;

&lt;p&gt;After that, I could log in to the VPN. The applet installed and launched the &amp;#8220;Network Connect&amp;#8221; software and a few seconds later &lt;code&gt;ifconfig -a&lt;/code&gt; showed that a new &amp;#8220;tun&amp;#8221; interface was up and connected to the remote network. I could SSH into the remote system. Even better was that I could SSH from a Mac OS X terminal window into the Fedora VM through its virtual VMWare ethernet interface (after enabling the SSH daemon in the services manager) and from there on to the remote system. I really only want to work in the Mac OS X terminal program.&lt;/p&gt;


&lt;h2&gt;Make it Work on the Command Line&lt;/h2&gt;

&lt;p&gt;I wanted a way to start the VPN in a non-GUI way as I planned to completely strip down the Fedora install, including X11 (see my other blog posting about that today).&lt;/p&gt;

&lt;p&gt;Fortunately the Juniper client has a command-line interface, documented by Juniper in a &lt;a href=&quot;http://www.juniper.net/techpubs/software/%20ive/5.x/guides/5.3-NC-Service-Linux.doc&quot;&gt;short note&lt;/a&gt; (&lt;a href=&quot;http://www.google.com/search?q=cache:GaeBo3VRzG8J:www.juniper.net/techpubs/software/ive/5.x/guides/5.3-NC-Service-Linux.doc&quot;&gt;Google Cache HTML Version&lt;/a&gt;, &lt;a href=&quot;/blog-resources/2007-07-28-juniper-networkconnect.html&quot;&gt;local copy&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;It was already installed as part of the applet&amp;#8217;s download package, in &lt;code&gt;$HOME/.juniper_networks/network_connect&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The command-line client needs the x509 certificate of the VPN server. Juniper has a script do get that, but it is hidden in a .jar package:&lt;/p&gt;

&lt;div class=&quot;code&quot;&gt;cd ~/.juniper_networks
/usr/java/jdk1.5.0_12/bin/jar -xf ncLinuxApp.jar getx509certificate.sh
sh getx509certificate.sh vpn.example.com network_connect/vpn.example.com.der&lt;/div&gt;

&lt;p&gt;Although it is not what I needed it might be interesting for others so I include it here: It is possible to fire up the Network Connect GUI client directly instead of going to the login page in the web browser:&lt;/p&gt;

&lt;div class=&quot;code&quot;&gt;cd ~/.juniper_networks/network_connect
/usr/java/jdk1.5.0_12/bin/java -jar NC.jar -h vpn.example.com -u joesixpack -p [PIN][SecurID token] -f vpn.example.com.der -r SecurID&lt;/div&gt;

&lt;p&gt;The VPN I use requires &lt;a href=&quot;http://www.rsa.com/node.aspx?id=1156&quot;&gt;RSA SecurID&lt;/a&gt; tokens for authentication instead of passwords, which is why I had to add the &lt;code&gt;-r SecurID&lt;/code&gt; realm parameter (I found the value in a hidden input field in the login page HTML code). You might not need it if your VPN uses regular passwords.&lt;/p&gt;

&lt;p&gt;So much for the command-line + GUI way. Here is the &amp;#8220;real&amp;#8221; command line way:&lt;/p&gt;

&lt;div class=&quot;code&quot;&gt;cd ~/.juniper_networks/network_connect
./ncsvc -h vpn.example.com -u joesixpack -p [PIN][SecurID token] -r SecurID -f vpn.example.com.der&lt;/div&gt;



&lt;h2&gt;Automation / Access from the Mac&lt;/h2&gt;

&lt;p&gt;Here are a few scripts and tips to automate and streamline the process.&lt;/p&gt;

&lt;p&gt;This first script called &lt;code&gt;start-vpn.sh&lt;/code&gt; is stored on the Linux system in the user&amp;#8217;s home directory:&lt;/p&gt;

&lt;div class=&quot;code&quot;&gt;#/bin/sh
echo enter pin + pw
read -s PW
cd ~/.juniper_networks/network_connect
./ncsvc -h vpn.example.com -u joesixpack -p $PW -r SecurID -f vpn.example.com.der&lt;/div&gt;

&lt;p&gt;Instead of connecting to the virtual machine using its IP address, it would be more convenient to use a host name. Fortunately, the Fedora Linux installation runs a Bonjour daemon, the default name it advertises is &lt;code&gt;linux.local&lt;/code&gt;. I changed it to something more meaningful in &lt;code&gt;/etc/avahi/avahi-daemon.conf&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;code&quot;&gt;host-name=juniper-vpn-gateway&lt;/div&gt;

&lt;p&gt;Now the connect from the Mac side looks like this:&lt;/p&gt;

&lt;div class=&quot;code&quot;&gt;ssh root@juniper-vpn-gateway.local&lt;/div&gt;

&lt;p&gt;To run the startup script directly from the Mac side:&lt;/p&gt;

&lt;div class=&quot;code&quot;&gt;ssh -t root@juniper-vpn-gateway.local sh start-vpn.sh
echo enter pin + pw
123412341234
Connecting to vpn.example.com : 443&lt;/div&gt;

&lt;p&gt;I also set up some port forwardings (SSH tunnels) and all together that made for a long login command on the Mac, so I packed that in a script too and called it &lt;code&gt;juniper-vpn-start.sh&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;code&quot;&gt;#!/bin/sh
ssh -L 10022:10.1.2.3:22 -L 10080:10.1.2.3:80 -t root@juniper-vpn-gateway.local sh start-vpn.sh&lt;/div&gt;

&lt;p&gt;This makes the remote SSH and HTTP ports available on &lt;code&gt;localhost&lt;/code&gt; and I can use Interarchy with an URL like &lt;code&gt;sftp://localhost:10022/foo/bar/baz/&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Another script connects me directly with a remote server&amp;#8217;s SSH daemon:&lt;/p&gt;

&lt;div class=&quot;code&quot;&gt;#!/bin/sh
ssh -t root@juniper-vpn-gateway.local ssh -o ServerAliveInterval=15 -A mliyanage@10.1.2.3&lt;/div&gt;

&lt;p&gt;The keepalive unfortunately doesn&amp;#8217;t do what I want. The VPN connection drops after long periods of inactivity.&lt;/p&gt;

&lt;p&gt;These scripts all reside in my &lt;code&gt;$HOME/bin&lt;/code&gt; directory which I added to my shell&amp;#8217;s &lt;code&gt;$PATH&lt;/code&gt; variable.&lt;/p&gt;

&lt;h2&gt;Optimizing the VM&lt;/h2&gt;

&lt;p&gt;As mentioned above, I removed a lot of unused software in the Fedora Linux virtual machine. The system runs at run level 3 instead of 5 and I set VMWare&amp;#8217;s memory allocation for the instance to about 55MB.&lt;/p&gt;

&lt;p&gt;Acknowledgements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://forums.gentoo.org/viewtopic-t-374292-highlight-juniper+vpn.html&quot;&gt;http://forums.gentoo.org/viewtopic-t-374292-highlight-juniper+vpn.html&lt;/a&gt; had some useful information.&lt;/li&gt;
&lt;/ul&gt;
</description>
            <guid>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Juniper-Network-Connect-SSL-VPN-and-Virtualization.html</guid>
			<pubDate>Sat, 28 Jul 2007 14:39:08 +0200</pubDate>
                    </item>
        	            <item>
            <title>Shrinking an ext3fs virtual disk in VMWare Fusion</title>
            <!--<link>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Shrinking-an-ext3fs-virtual-disk-in-VMWare-Fusion.html</link>-->
            <link>http://www.entropy.ch/blog/Mac+OS+X/2007/07/28/Shrinking-an-ext3fs-virtual-disk-in-VMWare-Fusion.html</link>
            <description>&lt;p&gt;This is information from a tip/question I posted to the &lt;a href=&quot;http://www.vmware.com/community/thread.jspa?threadID=95634&quot;&gt;VMWare forums&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I downloaded a pre-built &lt;a href=&quot;http://bagside.com/bagvapp/index.html&quot;&gt;Fedora 7 Linux&lt;/a&gt; virtual machine and set up the guest OS installation according to my requirements. Among other things this meant ripping out tons of unused packages including everything graphical (gnome/X11) to save space (the &lt;code&gt;yum&lt;/code&gt; front end to RPM  was very helpful, it offers to remove all dependencies along with the requested package). This Linux VM will only be used in the background to relay some network traffic so I want it to use very little memory and disk space.&lt;/p&gt;

&lt;p&gt;The disk image was about 5.4GB and after my &lt;code&gt;yum&lt;/code&gt; frenzy, the installation used only a fraction of that and I wanted to shrink the virtual harddisk files accordingly.&lt;/p&gt;

&lt;p&gt;Shrinking is not possible on a mounted file system so I booted the Linux VM from an attached ISO file of the Fedora 7 live cd (Fedora-7-Live-i686.torrent from &lt;a href=&quot;http://torrent.fedoraproject.org/&quot;&gt;http://torrent.fedoraproject.org/&lt;/a&gt;). BTW, this live cd is awesome, it has all the tools I needed, including the Logical Volume Manager LVM. I will be using it for all my future rescue operations...&lt;/p&gt; 

&lt;p&gt;Using the live cd, I successfully shrunk the ext2 root file system (&lt;code&gt;resize2fs&lt;/code&gt;), then the LVM logical volume on which that file system resided (&lt;code&gt;lvresize&lt;/code&gt;), then the LVM physical volume below the logical volume (&lt;code&gt;pvresize&lt;/code&gt;) and finally, by deleting and recreating it with less cylinders in fdisk, the &lt;code&gt;/dev/sda2&lt;/code&gt; partition containing the LVM physical volume. I also dropped and recreated (&lt;code&gt;lvremove&lt;/code&gt;/&lt;code&gt;lvcreate&lt;/code&gt;) a second logical volume used for swap. I had to do this before the pvresize step because the second volume&amp;#8217;s extents were located at the opposite end of the partition, all the empty space was in between the two logical volumes and I found no way to move extents (Is there really no way to do this? I was lucky that it was just a swap partition).&lt;/p&gt;

&lt;p&gt;After all this, the guest OS booted sucessfully. The &lt;code&gt;/dev/sda2&lt;/code&gt; partition used only about 2GB and I wanted to reclaim the remaining 3GB. Since there is No X11 in the guest OS anymore, I guessed that I could not use the (GUI-based) vmware-tools. Are there any command-line vmware tools that I can use inside the guest?&lt;/p&gt; 

&lt;p&gt;In the host Mac OS X, I found the &lt;code&gt;/Applications/VMware Fusion.app/Contents/MacOS/diskTool&lt;/code&gt; utility with its shrink (&lt;code&gt;-k&lt;/code&gt;) option and tried this:&lt;/p&gt;

&lt;div class=&quot;code&quot;&gt;./diskTool -k 0 /path/to/f7.vmdk 
Shrink : 100% (9060864/9060864) done.&lt;/div&gt;

&lt;p&gt;This took a while and I noticed no change in size.&lt;/p&gt;

&lt;p&gt;I &lt;a href=&quot;http://h0bbel.p0ggel.org/2007/01/02/shrinking-vmdk-files/&quot;&gt;read somewhere&lt;/a&gt; that the utility needs a huge zero-filled file to mark the unused space. Back in the guest OS, I created a new partition &lt;code&gt;/dev/sda3&lt;/code&gt; with all the remaining space, formatted it as ext3 and put the zero-filled file in there:&lt;/p&gt;

&lt;div class=&quot;code&quot;&gt;cat /dev/zero &gt; zero.fill; sync; sleep 1; sync; rm -f zero.fill&lt;/div&gt;

&lt;p&gt;Running &lt;code&gt;diskTool&lt;/code&gt; again did now indeed shrink the size of the files.&lt;/p&gt;

&lt;p&gt;Thinking about it now, I guess diskTool&amp;#8217;s shrink operation is just doing its compression thing on sparse disk images. I could probably have saved myself the trouble of all the resizing and just zero the unused data in the original root file system and then run diskTool.&lt;/p&gt;

As a last operation I wanted to merge the multiple virtual disk image files into one. I found &lt;code&gt;vmware-vdiskmanager&lt;/code&gt; in &lt;code&gt;/Library/Application Support/VMware Fusion&lt;/code&gt;:

&lt;div class=&quot;code&quot;&gt;$ ./vmware-vdiskmanager -r /path/to/f7.vmdk -t 0 ~/Desktop/f7.vmdk&lt;/div&gt;
</description>
            <guid>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Shrinking-an-ext3fs-virtual-disk-in-VMWare-Fusion.html</guid>
			<pubDate>Sat, 28 Jul 2007 11:42:09 +0200</pubDate>
              	          <wfw:comment>http://www.entropy.ch/blojsom/commentapi/marc/Mac+OS+X/?permalink=Shrinking-an-ext3fs-virtual-disk-in-VMWare-Fusion.html</wfw:comment>
              <wfw:commentRss>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Shrinking-an-ext3fs-virtual-disk-in-VMWare-Fusion.html&amp;page=comments&amp;flavor=rss2</wfw:commentRss>
                    </item>
        	            <item>
            <title>Starting Apache 2.x in debug non-fork mode for gdb</title>
            <!--<link>http://www.entropy.ch/blog/Developer/?permalink=Starting-Apache-2-x-in-debug-non-fork-mode-for-gdb.html</link>-->
            <link>http://www.entropy.ch/blog/Developer/2007/07/27/Starting-Apache-2-x-in-debug-non-fork-mode-for-gdb.html</link>
            <description>&lt;p&gt;Every time I need this information, I have to hunt it down again with Google, so I am putting it up here for next time :-) I don’t know why but it is hard to find with Google and undocumented in the Apache documentation.&lt;/p&gt;

&lt;p&gt;Sometimes I want to analyze a crashing bug in an Apache 2.x module like mod_perl or PHP in the gdb debugger. For this, the web server needs to stay in the foreground without handing off requests to forked child processes. Apache 1.3 has the &lt;code&gt;-X&lt;/code&gt; flag:&lt;/p&gt;

&lt;div class=&quot;code&quot;&gt;# gdb /usr/sbin/httpd
(gdb) run -X&lt;/div&gt;

&lt;p&gt;There is no -X in Apache 2.x, instead the various &lt;a href=&quot;http://httpd.apache.org/docs/2.0/mpm.html&quot;&gt;Multi-Processing Modules&lt;/a&gt; understand a few special &lt;code&gt;-D&lt;/code&gt; IfDefined keywords:&lt;/p&gt;

&lt;dl&gt;
&lt;dt&gt;NO_DETACH&lt;/dt&gt; &lt;dd&gt;(Unix and BeOS only): Don’t detach from the controlling terminal.&lt;/dd&gt;
&lt;dt&gt;FOREGROUND&lt;/dt&gt; &lt;dd&gt;(Unix and BeOS only, implies NO_DETACH): Don’t daemonize or detach from the controlling terminal.&lt;/dd&gt;
&lt;dt&gt;ONE_PROCESS&lt;/dt&gt; &lt;dd&gt;(All MPMs, implies NO_DETACH and FOREGROUND): Don’t allow a child process to handle client requests; use the initial process instead.&lt;/dd&gt;
&lt;dt&gt;DEBUG&lt;/dt&gt; &lt;dd&gt;(All MPMs, implies all of the previous): Places the MPM into a special debug mode with additional logging.&lt;/dd&gt;
&lt;/dl&gt;


&lt;p&gt;I found this list at &lt;a href=&quot;http://www.devshed.com/c/a/Apache/Getting-Started-with-Apache/9/&quot;&gt;devshed.com&lt;/a&gt; which in turn seems to have it from a book called &lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/1590593006/qid=1102628555/sr=2-1/ref=pd_ka_b_2_1/103-2330916-1147846&quot;&gt;Pro Apache&lt;/a&gt;. It seems to be the only place where this is documented.&lt;/p&gt;

&lt;p&gt;To start Apache 2 in debug mode under gdb:&lt;/p&gt;

&lt;div class=&quot;code&quot;&gt;# gdb /usr/sbin/httpd
(gdb) run -D DEBUG&lt;/div&gt;

&lt;p&gt;There are a few other built-in &lt;code&gt;-D&lt;/code&gt; define keywords that trigger useful behavior. &lt;code&gt;DUMP_VHOSTS&lt;/code&gt; dumps information about the configured virtual hosts, &lt;code&gt;DUMP_MODULES&lt;/code&gt; lists the dynamically loaded extension modules.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Developer/?permalink=Starting-Apache-2-x-in-debug-non-fork-mode-for-gdb.html</guid>
			<pubDate>Fri, 27 Jul 2007 05:38:50 +0200</pubDate>
                    </item>
        	            <item>
            <title>PostgreSQL 8.2.4 Package Available</title>
            <!--<link>http://www.entropy.ch/blog/Software/?permalink=PostgreSQL-8-2-4-Package-Available.html</link>-->
            <link>http://www.entropy.ch/blog/Software/2007/05/21/PostgreSQL-8-2-4-Package-Available.html</link>
            <description>&lt;p&gt;Here’s a package for the recently released version 8.2.4 of PostgreSQL.&lt;/p&gt;

&lt;p&gt;Download link in the &lt;a href=&quot;http://www.entropy.ch/phpbb2/viewtopic.php?p=10266#10266&quot;&gt;forum post&lt;/a&gt;.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Software/?permalink=PostgreSQL-8-2-4-Package-Available.html</guid>
			<pubDate>Mon, 21 May 2007 21:07:08 +0200</pubDate>
                    </item>
        	            <item>
            <title>Apache ErrorDocument / PHP header() interaction</title>
            <!--<link>http://www.entropy.ch/blog/Developer/?permalink=Apache-ErrorDocument-PHP-header-interaction.html</link>-->
            <link>http://www.entropy.ch/blog/Developer/2007/05/10/Apache-ErrorDocument-PHP-header-interaction.html</link>
            <description>&lt;p&gt;I recently worked on error handling and three related issues/questions came up.&lt;/p&gt;

&lt;p&gt;1.) I am trying to trigger Apache ErrorDocument handlers by setting appropriate HTTP status codes in my PHP code, but I don&#39;t get the expected results.&lt;/p&gt;

&lt;p&gt;My PHP file:&lt;/p&gt;

&lt;div class=&quot;code&quot;&gt;&amp;lt;?php
header(&quot;HTTP/1.0 500 Internal Server Error&quot;);
&lt;/div&gt;

&lt;p&gt;In my Apache configuration I have this:&lt;/p&gt;

&lt;div class=&quot;code&quot;&gt;ErrorDocument 500 &quot;test error 500 handler&lt;/div&gt;

&lt;p&gt;The status code is sent to the browser, but the ErrorDocument handler is never triggered, it looks like Apache passes the value on to the client, but does not interpret it.&lt;/p&gt;

&lt;p&gt;The last posting on this page suggests something to this effect:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.webmasterworld.com/apache/3205630.htm&quot;&gt;http://www.webmasterworld.com/apache/3205630.htm&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This surprises me, is that really how it works? In my Perl applications running under mod_perl, returning status 500 does *both*, send that status to the browser and make Apache interpret and act upon the value. What is mod_perl doing differently?&lt;/p&gt;

&lt;p&gt;I can actually have two separate status values, one that gets sent to the browser (Apache2::RequestRec::status()), and one that is returned to the Apache server (the handler() method&#39;s return value). Does something similar exist in PHP? Or do I really have to replicate the ErrorDocument functionality in my PHP code?&lt;/p&gt;

&lt;p&gt;2.) In my tests with mod_perl just now I also realized that mod_perl will properly signal an error 500 condition to Apache if a Perl error such as a syntax error or an unhandled exception occurs. A configured ErrorDocument 500 handler will be triggered, as I would expect it to be.&lt;/p&gt;

&lt;p&gt;It seems that PHP does not signal an error 500 to Apache when PHP code fails. Wouldn&#39;t this be a useful addition for exactly this reason (ability to use Apache ErrorDocument).&lt;/p&gt;

&lt;p&gt;3.) While playing around with set_error_handler(), I also saw that syntax errors are not trappable with a custom error handler. I use an autoloader that loads classes on demand, and if one of the class files loaded at run-time has a syntax error, my error handler is bypassed. Combined with the inability to trigger ErrorDocuments described above, doesn&#39;t this mean that it is absolutely impossible to hide such errors from users by replacing them with a &quot;friendly&quot; error page when using PHP?&lt;/p&gt;

&lt;p&gt;That would mean that I am not even able to emulate the ErrorDocument feature in PHP code.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Developer/?permalink=Apache-ErrorDocument-PHP-header-interaction.html</guid>
			<pubDate>Thu, 10 May 2007 07:42:01 +0200</pubDate>
                    </item>
        	            <item>
            <title>PHP 5.2.2 Release 1 Packages</title>
            <!--<link>http://www.entropy.ch/blog/Software/?permalink=PHP-5-2-2-Release-1-Packages.html</link>-->
            <link>http://www.entropy.ch/blog/Software/2007/05/04/PHP-5-2-2-Release-1-Packages.html</link>
            <description>&lt;p&gt;I just released PHP 5.2.2 packages.&lt;/p&gt;

&lt;p&gt;You can find more information in the &lt;a href=&quot;http://www.entropy.ch/phpbb2/viewtopic.php?p=10217#10217&quot;&gt;forum post&lt;/a&gt;.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Software/?permalink=PHP-5-2-2-Release-1-Packages.html</guid>
			<pubDate>Fri, 4 May 2007 22:36:04 +0200</pubDate>
                    </item>
        	            <item>
            <title>In London May 2007</title>
            <!--<link>http://www.entropy.ch/blog/Travel/?permalink=In-London-May-2007.html</link>-->
            <link>http://www.entropy.ch/blog/Travel/2007/05/01/In-London-May-2007.html</link>
            <description>&lt;p&gt;I’ll be in London from May 5th to 8th, if anyone wants to meet for a beer and some Mac geek talk drop me a line :-)&lt;/p&gt;

&lt;p&gt;Among other things, I’ll be at &lt;a href=&quot;http://schmurlesque.wordpress.com/2007/05/01/smack-hits-is-coming/&quot;&gt;this event&lt;/a&gt;, organized by my cousin and her friends...&lt;/p&gt;

</description>
            <guid>http://www.entropy.ch/blog/Travel/?permalink=In-London-May-2007.html</guid>
			<pubDate>Tue, 1 May 2007 22:01:01 +0200</pubDate>
                    </item>
        	            <item>
            <title>Alphabetgeschichten / Alphabet Stories</title>
            <!--<link>http://www.entropy.ch/blog/Books/?permalink=Alphabetgeschichten-Alphabet-Stories.html</link>-->
            <link>http://www.entropy.ch/blog/Books/2007/05/01/Alphabetgeschichten-Alphabet-Stories.html</link>
            <description>&lt;a href=&quot;http://www.linotype.com/3288/alphabetstories.html&quot;&gt;&lt;img class=&quot;right&quot; src=&quot;/images/blog/2007-05-01-zapf_alphabet_cover.jpg&quot; alt=&quot;Hermann Zapf Alphabetgeschichten Book Cover&quot;/&gt;&lt;/a&gt;

&lt;p&gt;This is a beautiful book about type designer Hermann Zapf’s work. If you appreciate fine typography, I highly recommend this for your collection. It is published by Linotype and available in English (ISBN 3-9810319-6-2) and German (ISBN 3-9810319-5-4), I have the German edition. I bought it in the Linotype Store, &lt;a href=&quot;http://www.linotype.com/3288/alphabetstories.html&quot;&gt;here is the store page for the book&lt;/a&gt; (under “Merchandise”).&lt;/p&gt;

&lt;p&gt;Here’s their description of the book:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This richly illustrated, first person narrative encompasses Prof. Hermann Zapf’s life and work from his childhood days in Nuremberg though to his newest typeface releases with Linotype GmbH. Along the way, war and peace are documented, as well as Prof. Zapf’s progression from calligraphy to computer programming. Read first hand about the changes in type design typesetting, from handset letters to hot-metal Linotype machinery to photo type and digital fonts.
Among the book’s many secrets: typefaces for musical notation, the history behind Palatino™, Optima™, and Zapfino’s developments, a Cherokee syllabary, Donald Knuth, and even Steve Jobs.
The book is also available in a German edition, entitled “Alphabetgeschichten”.&lt;/p&gt;
&lt;/blockquote&gt;
</description>
            <guid>http://www.entropy.ch/blog/Books/?permalink=Alphabetgeschichten-Alphabet-Stories.html</guid>
			<pubDate>Tue, 1 May 2007 07:38:49 +0200</pubDate>
                    </item>
        	            <item>
            <title>COLGROUP Problem in Firefox</title>
            <!--<link>http://www.entropy.ch/blog/Developer/?permalink=COLGROUP-Problem-in-Firefox.html</link>-->
            <link>http://www.entropy.ch/blog/Developer/2007/04/14/COLGROUP-Problem-in-Firefox.html</link>
            <description>&lt;p&gt;I recently had an unusual experience: My DHTML code worked flawlessly in MSIE6 and Safari, but not in Firefox. I spent almost two days trying to figure out what was wrong. Maybe someone can tell me what’s going on, and maybe this note saves someone else some time and hairs :-)&lt;/p&gt;

&lt;p&gt;The situation: I am replacing a table in a web page. The table is in a DIV and it gets replaced by way of Prototype’s &lt;a href=&quot;http://prototypejs.org/api/ajax/updater&quot;&gt;Ajax.Updater&lt;/a&gt;, which is given the enclosing DIV’s id.&lt;/p&gt;

&lt;p&gt;A bit of JavaScript runs after the update. It manipulates elements in the newly inserted DOM parts. I tried all sorts of manipulations; structural changes like adding or removing the elements in question, but also class name or style rule changes.&lt;/p&gt;

&lt;p&gt;And this is where the problem is. These manipulations &lt;em&gt;seem&lt;/em&gt; to succeed, judging by the fact that node traversal and selection in the DOM work. All elements are found, and method calls on them don’t cause any JavaScript exceptions. However, the results of the manipulations are never visible. The DOM of the table seems to be in a totally whacked state, or maybe there are two different DOMs in memory.&lt;/p&gt;

&lt;p&gt;It is interesting that this whacked state seems to be visible in Firebug. This first screenshot shows Firebug’s DOM view of the table when the page is first loaded and everything works.&lt;/p&gt;

&lt;p&gt;&lt;img class=&quot;screenshot&quot; src=&quot;/images/blog/2007-04-14-firefox-colgroup-1.png&quot; alt=&quot;Screenshot of the DOM Inspector in Firefox showing a clean table structure&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The second and third screenshots show the DOM after the table was replaced dynamically. You can see that the entire table body element is grayed out.&lt;/p&gt;

&lt;p&gt;&lt;img class=&quot;screenshot&quot; src=&quot;/images/blog/2007-04-14-firefox-colgroup-2.png&quot; alt=&quot;Screenshot of the DOM Inspector in Firefox showing a broken table structure&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;screenshot&quot; src=&quot;/images/blog/2007-04-14-firefox-colgroup-3.png&quot; alt=&quot;Screenshot of the DOM Inspector in Firefox showing a broken table structure, expanded&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Normally Firebug displays hidden elements with this dimmed text style, but in this case the table is rendered normally.&lt;/p&gt;

&lt;p&gt;It turns out that the &amp;lt;colgroup&gt; element triggers this behavior. As soon as I take it out and put the &amp;lt;col&gt; elements directly below &amp;lt;table&gt;, everything works fine, and the DOM inspector shows a normal structure again, no dimmed table body element:&lt;/p&gt;

&lt;p&gt;&lt;img class=&quot;screenshot&quot; src=&quot;/images/blog/2007-04-14-firefox-colgroup-4.png&quot; alt=&quot;Screenshot of the DOM Inspector in Firefox showing a clean table structure after removing the colspan element&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Is this a Firefox bug? According to my understanding of &lt;a href=&quot;http://www.w3.org/TR/html401/struct/tables.html#h-11.2.4&quot;&gt;the spec&lt;/a&gt;, both forms, with and without colgroup, should be valid. Also, the other browsers don’t have a problem with it.&lt;/p&gt;

&lt;p&gt;By the way, I tried sending the replacement table (loaded with XmlHttpRequest) both with HTML and XML markup rules and mime types, that didn’t change anything.&lt;/p&gt;

&lt;p&gt;Update: I just tried it in a Firefox nightly build, 3.0a4pre. It seems to work fine there, so maybe this is a bug.&lt;/p&gt;

</description>
            <guid>http://www.entropy.ch/blog/Developer/?permalink=COLGROUP-Problem-in-Firefox.html</guid>
			<pubDate>Sat, 14 Apr 2007 09:31:59 +0200</pubDate>
                    </item>
        	            <item>
            <title>Unicode Common Locale Data Repository</title>
            <!--<link>http://www.entropy.ch/blog/Developer/?permalink=Unicode-Common-Locale-Data-Repository.html</link>-->
            <link>http://www.entropy.ch/blog/Developer/2007/04/09/Unicode-Common-Locale-Data-Repository.html</link>
            <description>&lt;p&gt;Pretty much all customer-facing web frontends on which I’ve worked were localized in many languages. This means that there are long string tables with localized versions of all user-visible messages. These messages are usually specific to the particular application so there’s no way around translating them.&lt;/p&gt;

&lt;p&gt;However, there are also strings that are not specific to the application, such as localized names for countries, days, months, currencies and so on. It turns out that the Unicode consortium maintains an XML-based database of exactly this information. This is a wonderful resource, I am very impressed. Since it’s XML-based it’s easy to use directly, load into an XSLT transformation or convert to an application-specific format with an automated/scripted process.&lt;/p&gt;

&lt;p&gt;Here’s an excerpt from the dates and country sections in English and French:&lt;/p&gt;

&lt;div class=&quot;code&quot;&gt;&amp;lt;dates&gt;
    &amp;lt;calendars&gt;
        &amp;lt;calendar type=&quot;gregorian&quot;&gt;
            &amp;lt;months&gt;
                &amp;lt;monthContext type=&quot;format&quot;&gt;
                    &amp;lt;monthWidth type=&quot;abbreviated&quot;&gt;
                        &amp;lt;month type=&quot;1&quot;&gt;Jan&amp;lt;/month&gt;
                        &amp;lt;month type=&quot;2&quot;&gt;Feb&amp;lt;/month&gt;
                        &amp;lt;month type=&quot;3&quot;&gt;Mar&amp;lt;/month&gt;
                        &amp;lt;month type=&quot;4&quot;&gt;Apr&amp;lt;/month&gt;


&amp;lt;territory type=&quot;CF&quot;&gt;Central African Republic&amp;lt;/territory&gt;
&amp;lt;territory type=&quot;CG&quot;&gt;Congo (Brazzaville)&amp;lt;/territory&gt;
&amp;lt;territory type=&quot;CH&quot;&gt;Switzerland&amp;lt;/territory&gt;
&amp;lt;territory type=&quot;CI&quot;&gt;Ivory Coast&amp;lt;/territory&gt;
&amp;lt;territory type=&quot;CK&quot;&gt;Cook Islands&amp;lt;/territory&gt;&lt;/div&gt;


&lt;div class=&quot;code&quot;&gt;&amp;lt;dates&gt;
    &amp;lt;calendars&gt;
        &amp;lt;calendar type=&quot;gregorian&quot;&gt;
            &amp;lt;months&gt;
                &amp;lt;monthContext type=&quot;format&quot;&gt;
                    &amp;lt;monthWidth type=&quot;abbreviated&quot;&gt;
                        &amp;lt;month type=&quot;1&quot;&gt;janv.&amp;lt;/month&gt;
                        &amp;lt;month type=&quot;2&quot;&gt;févr.&amp;lt;/month&gt;
                        &amp;lt;month type=&quot;3&quot;&gt;mars&amp;lt;/month&gt;
                        &amp;lt;month type=&quot;4&quot;&gt;avr.&amp;lt;/month&gt;


&amp;lt;territory type=&quot;CF&quot;&gt;République centrafricaine&amp;lt;/territory&gt;
&amp;lt;territory type=&quot;CG&quot;&gt;Congo&amp;lt;/territory&gt;
&amp;lt;territory type=&quot;CH&quot;&gt;Suisse&amp;lt;/territory&gt;
&amp;lt;territory type=&quot;CI&quot;&gt;Côte d’Ivoire&amp;lt;/territory&gt;
&amp;lt;territory type=&quot;CK&quot;&gt;Îles Cook&amp;lt;/territory&gt;&lt;/div&gt;

&lt;p&gt;The database contains other locale-specific information which could be very useful in a web application: the typographically correct quotation marks, date and time formats, time zones names, number formats for scientific/decimal/percent notation etc.&lt;/p&gt;

&lt;p&gt;The database is called the &lt;a href=&quot;http://unicode.org/cldr/&quot;&gt;Unicode Common Locale Data Repository&lt;/a&gt;. Go check it out if you ever need this kind of information. I happen to access it from Perl and XSLT, but if you use PHP, the excellent &lt;a href=&quot;http://framework.zend.com/&quot;&gt;Zend Framework&lt;/a&gt; for PHP5 has a wrapper class called &lt;a href=&quot;http://framework.zend.com/manual/en/zend.locale.html&quot;&gt;Zend_Locale_Data&lt;/a&gt;, it contains a copy of the database.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Developer/?permalink=Unicode-Common-Locale-Data-Repository.html</guid>
			<pubDate>Mon, 9 Apr 2007 08:41:08 +0200</pubDate>
                    </item>
        	            <item>
            <title>MySQL client and readline magic spaces</title>
            <!--<link>http://www.entropy.ch/blog/Mac+OS+X/?permalink=MySQL-client-and-readline-magic-spaces.html</link>-->
            <link>http://www.entropy.ch/blog/Mac+OS+X/2007/03/26/MySQL-client-and-readline-magic-spaces.html</link>
            <description>&lt;p&gt;I recently added some of the useful bash tricks found at &lt;a href=&quot;http://www.ukuug.org/events/linux2003/papers/bash_tips/&quot;&gt;http://www.ukuug.org/events/linux2003/papers/bash_tips/&lt;/a&gt; in my shell configuration files, among them &amp;#8220;magic spaces&amp;#8221;. Magic spaces expand completions immediately.&lt;/p&gt;

&lt;p&gt;Today I wanted to use the mysql command line client and I was unable to type spaces. Like the bash shell, the mysql client uses the readline library for command line processing and all applications using readline share the configuration in the &lt;tt&gt;.inputrc&lt;/tt&gt; file. It turns out that the mysql client does not like magic spaces at all, so I went back to my &lt;tt&gt;.inputrc&lt;/tt&gt; file and made their use conditional. Readline now uses magic spaces for bash exclusively.&lt;/p&gt;

&lt;p&gt;Before:&lt;/p&gt;

&lt;div class=&quot;code&quot;&gt;Space: magic-space&lt;/div&gt;

&lt;p&gt;after:&lt;/p&gt;

&lt;div class=&quot;code&quot;&gt;$if bash
Space: magic-space
$endif&lt;/div&gt;

&lt;p&gt;&lt;a href=&quot;http://bugs.mysql.com/27439&quot;&gt;It would be nice&lt;/a&gt; if the mysql client could deal with magic spaces, even if just by recognizing them exactly like regular spaces.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Mac+OS+X/?permalink=MySQL-client-and-readline-magic-spaces.html</guid>
			<pubDate>Mon, 26 Mar 2007 14:23:23 +0200</pubDate>
                    </item>
        	            <item>
            <title>AirPort Extreme 802.11n Base Station Trouble</title>
            <!--<link>http://www.entropy.ch/blog/Mac+OS+X/?permalink=AirPort-Extreme-802-11n-Base-Station-Trouble.html</link>-->
            <link>http://www.entropy.ch/blog/Mac+OS+X/2007/03/10/AirPort-Extreme-802-11n-Base-Station-Trouble.html</link>
            <description>&lt;p&gt;As blogged in an earlier post, I recently replaced my router / wireless base station.&lt;/p&gt;

&lt;p&gt;It is causing me a lot of trouble and I am wondering if someone else has similar issues or if it is just my unit.&lt;/p&gt;

&lt;p&gt;This is my description of the problem sent to the &lt;a href=&quot;http://www.macintouch.com/readerreports/airport802_11n/topic4541.html&quot;&gt;macintouch.com reader report&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;

&lt;p&gt;I replaced an AirPort Extreme Snow White with the new n version.&lt;/p&gt;

&lt;p&gt;I run my website on a Mac on the LAN side, with appropriate port mappings configured from WAN to LAN. This worked flawlessly with the previous base station, but the new one seems to get into a really weird state about every 24 hours, and then I have to reset it.
My website and e-mail server basically drop off the net. Some connections still get through (remote login and remote desktop), but they run very very slowly.&lt;/p&gt;

&lt;p&gt;My server gets a lot of hits and there are also outgoing file transfers running all the time so I guess the base station sees a lot of traffic in both directions, maybe a lot more than in a typical home setup. However, the old base station never showed this problem.&lt;/p&gt;

&lt;p&gt;I am wondering if others have seen similar effects where the base station gets hung up after a while...&lt;/p&gt;

&lt;/blockquote&gt;


</description>
            <guid>http://www.entropy.ch/blog/Mac+OS+X/?permalink=AirPort-Extreme-802-11n-Base-Station-Trouble.html</guid>
			<pubDate>Sat, 10 Mar 2007 13:58:16 +0100</pubDate>
                    </item>
        	             <item>
            <title>HDSPA/UMTS/EDGE/GPRS PCMCIA Card for Sale</title>
            <!--<link>http://www.entropy.ch/blog/?permalink=HDSPA-UMTS-EDGE-GPRS-PCMCIA-Card-for-Sale.html</link>-->
            <link>http://www.entropy.ch/blog/2007/03/10/HDSPA-UMTS-EDGE-GPRS-PCMCIA-Card-for-Sale.html</link>
            <description>&lt;p&gt;I am selling a brand new 4-in-1 protocol &lt;a href=&quot;http://www.swisscom-mobile.ch/scm/gek_mobile-unlimited-en.aspx&quot;&gt;Swisscom-branded&lt;/a&gt; PCMCIA card for mobile Internet access:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://cgi.ebay.ch/ws/eBayISAPI.dll?ViewItem&amp;amp;item=300089431050&quot;&gt;http://cgi.ebay.ch/ws/eBayISAPI.dll?ViewItem&amp;item=300089431050&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The card is sold with Windows software, and that works really well, but with extra software (to be bought separately), it will work on Mac laptops with PCMCIA slots (which means PowerBooks only, not MacBooks). The software is &lt;a href=&quot;http://www.novamedia.de/e_pages/e_produkte_mac_l2n.html&quot;&gt;Launch2Net&lt;/a&gt; by &lt;a href=&quot;http://www.novamedia.de/index_e.html&quot;&gt;nova media&lt;/a&gt;.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/?permalink=HDSPA-UMTS-EDGE-GPRS-PCMCIA-Card-for-Sale.html</guid>
			<pubDate>Sat, 10 Mar 2007 10:32:19 +0100</pubDate>
              	          <wfw:comment>http://www.entropy.ch/blojsom/commentapi/marc/?permalink=HDSPA-UMTS-EDGE-GPRS-PCMCIA-Card-for-Sale.html</wfw:comment>
              <wfw:commentRss>http://www.entropy.ch/blog/?permalink=HDSPA-UMTS-EDGE-GPRS-PCMCIA-Card-for-Sale.html&amp;page=comments&amp;flavor=rss2</wfw:commentRss>
                    </item>
        	            <item>
            <title>JavaScript Minifier BBEdit Unix Filter</title>
            <!--<link>http://www.entropy.ch/blog/Developer/?permalink=JavaScript-Minifier-BBEdit-Unix-Filter.html</link>-->
            <link>http://www.entropy.ch/blog/Developer/2007/03/07/JavaScript-Minifier-BBEdit-Unix-Filter.html</link>
            <description>&lt;img class=&quot;screenshot right&quot; src=&quot;/images/blog/2007-03-08-javascript-minify.png&quot; /&gt;

&lt;p&gt;I embedded the &lt;a href=&quot;http://search.cpan.org/~herrera/JavaScript-Minifier-0.02/&quot;&gt;JavaScript::Minifier&lt;/a&gt; CPAN Perl module in a BBEdit Unix Filter. Now I can compress JavaScript code with just a double-click directly from within BBEdit.&lt;/p&gt;

&lt;p&gt;You can download the full script &lt;a href=&quot;http://www.entropy.ch/software/perl/JavaScript%20Minify.pl&quot;&gt;here&lt;/a&gt;. Store it in your &lt;tt&gt;~/Library/Application Support/BBedit/Unix Support/Unix Filters&lt;/tt&gt; directory and it will show up in your Unix Filter palette.&lt;/p&gt;

&lt;br clear=&quot;all&quot; /&gt;

&lt;div class=&quot;code&quot;&gt;#!/usr/bin/perl -w
#
# Wraps the JavaScript::Minifier CPAN Perl module
# as a BBEdit Unix Filter. The CPAN module code
# is embedded.
#
# Written by Marc Liyanage &amp;lt;http://www.entropy.ch&gt;

use strict;
use IO::File;

my $in = do {local($/); &amp;lt;&gt;};
my $out;

my ($fh_in, $fh_out);
open($fh_in, &#39;&amp;lt;&#39;, \$in);
open($fh_out, &#39;&gt;&#39;, \$out);

JavaScript::Minifier-&gt;new()-&gt;minify($fh_in, $fh_out);

print $out;

# ... 400 lines of module code follow...&lt;/div&gt;


</description>
            <guid>http://www.entropy.ch/blog/Developer/?permalink=JavaScript-Minifier-BBEdit-Unix-Filter.html</guid>
			<pubDate>Wed, 7 Mar 2007 22:17:19 +0100</pubDate>
                    </item>
        	            <item>
            <title>Terminal Tricks: Download with cURL in a Loop Until Completed</title>
            <!--<link>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Terminal-Tricks-Download-with-cURL-in-a-Loop-Until-Completed.html</link>-->
            <link>http://www.entropy.ch/blog/Mac+OS+X/2007/02/28/Terminal-Tricks-Download-with-cURL-in-a-Loop-Until-Completed.html</link>
            <description>&lt;p&gt;Here&amp;#8217;s a little terminal command I use to repeatedly attempt to download a file. This is useful if the transfer aborts frequently or if the server is busy:&lt;/p&gt;

&lt;div class=&quot;code&quot;&gt;while ! curl -C - -O &#39;http://download.parallels.com/GA/Parallels%20Desktop%203186%20Mac%20en.dmg&#39;; do sleep 10; done&lt;/div&gt;

&lt;p&gt;As you can see I used this to download Parallels VM, because their servers keep dropping the connection after a while when they&amp;#8217;re busy, which often happens when a new release comes out.&lt;/p&gt;

&lt;p&gt;The while/do/done loop keeps calling curl, with pauses of 10 seconds. curl will keep returning a failure exit code, which is what keeps the while loop going if inverted with the ! (logical not) operator. The -C - flag tells curl to continue at the last byte position.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Terminal-Tricks-Download-with-cURL-in-a-Loop-Until-Completed.html</guid>
			<pubDate>Wed, 28 Feb 2007 13:26:08 +0100</pubDate>
                    </item>
        	            <item>
            <title>The New AirPort Extreme Base Station</title>
            <!--<link>http://www.entropy.ch/blog/Mac+OS+X/?permalink=The-New-AirPort-Extreme-Base-Station.html</link>-->
            <link>http://www.entropy.ch/blog/Mac+OS+X/2007/02/23/The-New-AirPort-Extreme-Base-Station.html</link>
            <description>&lt;p&gt;I just replaced my AirPort Extreme base station with the &lt;a href=&quot;http://www.apple.com/airportextreme/&quot;&gt;new model&lt;/a&gt; that supports the &lt;a href=&quot;http://en.wikipedia.org/wiki/IEEE_802.11#802.11n&quot;&gt;802.11n&lt;/a&gt; draft standard.&lt;/p&gt;

&lt;p&gt;Performance is better than with the previous (802.11b/g) model, but nowhere near the typical or maximum limits even with full signal strength. I really hope this improves. I am currently getting about 35 Mbit/s over the wireless connection to my MacBook Pro Core 2 Duo. Small changes in the physical setup can apparently make a big difference, even with no change in the signal strength indicator. I did one measurement twice after shuffling around some cables and repositioning devices and read speed dropped from 4.9 to 3.4 MBytes/s.&lt;/p&gt;

&lt;p&gt;AirPort Disk is a new feature that allows you to share harddisks attached to the base station&amp;#8217;s USB port. I have a large hard disk attached to a Mac mini which connects to the base station&#39;s LAN port, i.e. wired Ethernet. The mini acts as a file server for the disk (local FireWire throughput is about 35 MByte/s). I tried moving the disk to the base station&amp;#8217;s USB port and share it with AirPort Disk, but write performance was so poor that I moved it back to the mini. It works better with the mini as file server. I don&amp;#8217;t know if the file server implementation or the USB connection is to blame. I still connect an inkjet printer to the USB port.&lt;/p&gt;

&lt;p&gt;Below are some measurements taken with &lt;a href=&quot;http://www.aja.com/html/support_kona3_swd.html&quot;&gt;AJA KONA System Test&lt;/a&gt;. Interestingly enough, I get better write than read performance. &lt;a href=&quot;http://www.macintouch.com/reviews/airportn/&quot;&gt;Macintouch.com&lt;/a&gt; has an excellent review with performance measurements.&lt;/p&gt;

&lt;p&gt;As a baseline reference, this first one is a measurement of read/write throughput to the Mac mini&amp;#8217;s internal harddisk through the &lt;em&gt;old&lt;/em&gt; base station.&lt;/p&gt;

&lt;p&gt;&lt;img class=&quot;screenshot&quot; src=&quot;/images/blog/2007-02-23-airport-extreme-802.11g.png&quot; /&gt;&lt;/p&gt;


&lt;p&gt;This is the same test with the new base station:&lt;/p&gt;

&lt;p&gt;&lt;img class=&quot;screenshot&quot; src=&quot;/images/blog/2007-02-23-airport-extreme-802.11n-internal-disk.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This measures the mini&amp;#8217;s external harddisk, connected via FireWire. I had a spike with the first measurement which I was unable to reproduce. The second screenshot shows the performance I can reproduce.&lt;/p&gt;

&lt;p&gt;&lt;img class=&quot;screenshot&quot; src=&quot;/images/blog/2007-02-23-airport-extreme-802.11n-external-disk-spike.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;screenshot&quot; src=&quot;/images/blog/2007-02-23-airport-extreme-802.11n-external-disk-regular.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This shows the bad AirPort Disk write performance:&lt;/p&gt;

&lt;p&gt;&lt;img class=&quot;screenshot&quot; src=&quot;/images/blog/2007-02-23-airport-extreme-802.11n-airport-disk.png&quot; /&gt;&lt;/p&gt;


&lt;p&gt;A test with HTTP instead of AFP produced roughly the same result, 3.5 MByte/s:&lt;/p&gt;

&lt;div class=&quot;code&quot;&gt;$ curl -o /dev/null http://minime.local/~liyanage/zero.dat
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 48.8M  100 48.8M    0     0  3475k      0  0:00:14  0:00:14 --:--:-- 3475k&lt;/div&gt;
</description>
            <guid>http://www.entropy.ch/blog/Mac+OS+X/?permalink=The-New-AirPort-Extreme-Base-Station.html</guid>
			<pubDate>Fri, 23 Feb 2007 13:50:44 +0100</pubDate>
                    </item>
        	            <item>
            <title>Neuromancer and Count Zero</title>
            <!--<link>http://www.entropy.ch/blog/Books/?permalink=Neuromancer-and-Count-Zero.html</link>-->
            <link>http://www.entropy.ch/blog/Books/2007/02/18/Neuromancer-and-Count-Zero.html</link>
            <description>&lt;a class=&quot;img&quot; href=&quot;http://www.amazon.com/gp/redirect.html%3FASIN=0441569595%26tag=wwwentropych-20%26lcode=xm2%26cID=2025%26ccmID=165953%26location=/o/ASIN/0441569595%253FSubscriptionId=02ZH6J1W0649DTNS6002&quot;&gt;&lt;img class=&quot;blog_entry_icon&quot; src=&quot;http://ec1.images-amazon.com/images/P/0441569595.01._SCMZZZZZZZ_.jpg&quot; /&gt;&lt;/a&gt;

&lt;a class=&quot;img&quot; href=&quot;http://www.amazon.com/gp/redirect.html%3FASIN=0441117732%26tag=wwwentropych-20%26lcode=xm2%26cID=2025%26ccmID=165953%26location=/o/ASIN/0441117732%253FSubscriptionId=02ZH6J1W0649DTNS6002&quot;&gt;&lt;img class=&quot;blog_entry_icon&quot; src=&quot;http://ec1.images-amazon.com/images/P/0441117732.01._SCMZZZZZZZ_.jpg&quot; /&gt;&lt;/a&gt;


&lt;p&gt;I finally got around to reading these classics by William Gibson. Great books, I’ll have to order his other books too :-)&lt;/p&gt;

&lt;br clear=&quot;all&quot; /&gt;
</description>
            <guid>http://www.entropy.ch/blog/Books/?permalink=Neuromancer-and-Count-Zero.html</guid>
			<pubDate>Sun, 18 Feb 2007 21:04:27 +0100</pubDate>
                    </item>
        	            <item>
            <title>Perl: Search and Replace with Encodings</title>
            <!--<link>http://www.entropy.ch/blog/Developer/?permalink=Perl-Search-and-Replace-with-Encodings.html</link>-->
            <link>http://www.entropy.ch/blog/Developer/2007/02/18/Perl-Search-and-Replace-with-Encodings.html</link>
            <description>&lt;p&gt;Somebody asked me for help with character set encodings in Perl today.&lt;/p&gt;

&lt;p&gt;This script will apply a list of search/replacement string pairs to a series of files. The files can be in different encodings like Unicode UTF-8, UTF-16 or ISO-8859-1. If possible each file will be saved with its original encoding. If that is not possible because a replacement string introduced an unmappable character, the encoding for that file will be upgraded to UTF-8.&lt;/p&gt;

&lt;p&gt;It shows how to use the Perl 5.8 Unicode and PerlIO support, especially the Encode::* series of modules.&lt;/p&gt;

&lt;div class=&quot;code&quot;&gt;#!/usr/bin/perl
#
# Search/replace a list of string pairs in a list of files,
# with support for various encodings.
#
# Usage:
#
# $ perl replace.pl &quot;&#39;foo&#39; =&gt; [&#39;bar&#39;, &#39;g&#39;], &#39;abc&#39; =&gt; [&#39;xyz&#39;]&quot; file1, file2
#
# Marc Liyanage &amp;lt;http://www.entropy.ch&gt;

use strict;
use warnings;

use IO::File;
use Encode::Guess ();
use Encode ();


my $replacements = {eval Encode::decode_utf8(shift @ARGV)};
die &quot;Invalid replacement list: $@&quot; if $@;
my @files = @ARGV;
Converter-&gt;process($replacements, $_) foreach @files;







package Converter;

sub process {
    my $self = shift;
    my ($replacements, $filename) = @_;
    $self-&gt;new(replacements =&gt; $replacements, filename =&gt; $filename)-&gt;run();
}

sub new {
    my $self = shift;
    my (%args) = @_;
    die &quot;Unable to find file &#39;$args{filename}&#39;&quot; unless -e $args{filename};
    return bless {%args}, ref($self) || $self;
}

sub run {
    my $self = shift;
    $self-&gt;read_file();
    $self-&gt;apply_replacements();
    $self-&gt;write_file();
}

sub read_file {
    my $self = shift;
    my $data_in = do {local($/); IO::File-&gt;new($self-&gt;{filename}, &quot;&amp;lt;:raw&quot;)-&gt;getline()};
    $self-&gt;{encoding} = Encode::Guess::guess_encoding($data_in, qw(iso-8859-1)); # or &#39;MacRoman&#39;
    my $input_encoding = ref($self-&gt;{encoding});
    die &quot;Unable to guess encoding for &#39;$self-&gt;{filename}&#39;: $self-&gt;{encoding}&quot; unless $input_encoding;
    $self-&gt;{data} = $self-&gt;{encoding}-&gt;decode($data_in);
}

sub apply_replacements {
    my $self = shift;
    while (my ($search, $list) = each %{$self-&gt;{replacements}}) {
    	my ($replace, $options) = @$list;
    	$options ||= &#39;&#39;;
    	my $re = eval &quot;qr/$search/$options&quot;;
        $self-&gt;{data} =~ s/$re/$replace/g;
    }
}

sub write_file {
    my $self = shift;
    my $output_encoding = $self-&gt;{encoding};
    my $outfilename = &quot;$self-&gt;{filename}.out&quot;;
    my $data_out = eval {$output_encoding-&gt;encode($self-&gt;{data}, Encode::FB_CROAK)};
    if ($@) {
        warn &quot;Output encoding for &#39;$outfilename&#39; changed to UTF-8&quot;;
        $data_out = Encode::encode_utf8($self-&gt;{data});
    }
    IO::File-&gt;new($outfilename, &quot;&gt;:raw&quot;)-&gt;print($data_out);
}

&lt;/div&gt;
</description>
            <guid>http://www.entropy.ch/blog/Developer/?permalink=Perl-Search-and-Replace-with-Encodings.html</guid>
			<pubDate>Sun, 18 Feb 2007 16:56:29 +0100</pubDate>
                    </item>
        	            <item>
            <title>Pictures: Helicopter</title>
            <!--<link>http://www.entropy.ch/blog/Pictures/?permalink=Pictures-Helicopter.html</link>-->
            <link>http://www.entropy.ch/blog/Pictures/2007/02/17/Pictures-Helicopter.html</link>
            <description>&lt;a href=&quot;http://www.snapmania.com/users/mliyanage/helischnupperkurs/&quot;&gt;&lt;img class=&quot;screenshot right&quot; src=&quot;/images/blog/2007-02-17-helicopter.jpg&quot; /&gt;&lt;/a&gt;

&lt;p&gt;I went helicopter flying with some friends... &lt;a href=&quot;http://www.snapmania.com/users/mliyanage/helischnupperkurs/&quot;&gt;Here are some pictures&lt;/a&gt;.&lt;/p&gt;

&lt;br clear=&quot;all&quot; /&gt;
</description>
            <guid>http://www.entropy.ch/blog/Pictures/?permalink=Pictures-Helicopter.html</guid>
			<pubDate>Sat, 17 Feb 2007 15:54:07 +0100</pubDate>
                    </item>
        	            <item>
            <title>PHP 5.2.1 Release 1 Package</title>
            <!--<link>http://www.entropy.ch/blog/Software/?permalink=PHP-5-2-1-Release-1-Package.html</link>-->
            <link>http://www.entropy.ch/blog/Software/2007/02/10/PHP-5-2-1-Release-1-Package.html</link>
            <description>&lt;p&gt;I just released a PHP 5.2.1 package.&lt;/p&gt;

&lt;p&gt;You can find more information in the &lt;a href=&quot;http://www.entropy.ch/phpbb2/viewtopic.php?p=9893#9893&quot;&gt;forum post&lt;/a&gt;.&lt;/p&gt;


</description>
            <guid>http://www.entropy.ch/blog/Software/?permalink=PHP-5-2-1-Release-1-Package.html</guid>
			<pubDate>Sat, 10 Feb 2007 15:45:39 +0100</pubDate>
                    </item>
        	             <item>
            <title>PostgreSQL 8.2.3 Package Available</title>
            <!--<link>http://www.entropy.ch/blog/?permalink=PostgreSQL-8-2-3-Package-Available.html</link>-->
            <link>http://www.entropy.ch/blog/2007/02/10/PostgreSQL-8-2-3-Package-Available.html</link>
            <description>&lt;p&gt;Here’s a package for the recently released version 8.2.3 of PostgreSQL.&lt;/p&gt;

&lt;p&gt;Download link in the &lt;a href=&quot;http://www.entropy.ch/phpbb2/viewtopic.php?p=9891#9891&quot;&gt;forum post&lt;/a&gt;.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/?permalink=PostgreSQL-8-2-3-Package-Available.html</guid>
			<pubDate>Sat, 10 Feb 2007 11:43:55 +0100</pubDate>
              	          <wfw:comment>http://www.entropy.ch/blojsom/commentapi/marc/?permalink=PostgreSQL-8-2-3-Package-Available.html</wfw:comment>
              <wfw:commentRss>http://www.entropy.ch/blog/?permalink=PostgreSQL-8-2-3-Package-Available.html&amp;page=comments&amp;flavor=rss2</wfw:commentRss>
                    </item>
        	            <item>
            <title>PostgreSQL 8.2.1 Package Available</title>
            <!--<link>http://www.entropy.ch/blog/Software/?permalink=PostgreSQL-8-2-1-Package-Available.html</link>-->
            <link>http://www.entropy.ch/blog/Software/2007/01/12/PostgreSQL-8-2-1-Package-Available.html</link>
            <description>&lt;p&gt;Here’s a package for the recently released version 8.2.1 of PostgreSQL.&lt;/p&gt;

&lt;p&gt;Download link in the &lt;a href=&quot;http://www.entropy.ch/phpbb2/viewtopic.php?p=9674#9674&quot;&gt;forum post&lt;/a&gt;.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Software/?permalink=PostgreSQL-8-2-1-Package-Available.html</guid>
			<pubDate>Fri, 12 Jan 2007 20:21:06 +0100</pubDate>
                    </item>
        	            <item>
            <title>del.icio.us Links on 2007-01-09</title>
            <!--<link>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2007-01-09.html</link>-->
            <link>http://www.entropy.ch/blog/Links/2007/01/09/del-icio-us-Links-on-2007-01-09.html</link>
            <description>&lt;ul class=&quot;delicious&quot;&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://www.cbs.com/latenight/latelate/comedy/video/20060130.shtml&quot;&gt;The Late Late Show - Craig Ferguson&#39;s Tribute To His Father&lt;/a&gt; &lt;/div&gt;
		&lt;div class=&quot;delicious-extended&quot;&gt; January 30, 2006 &lt;/div&gt;		&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/tv&quot;&gt;tv&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/latenighttv&quot;&gt;latenighttv&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/comedy&quot;&gt;comedy&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/craigferguson&quot;&gt;craigferguson&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/latelateshow&quot;&gt;latelateshow&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
&lt;/ul&gt;
</description>
            <guid>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2007-01-09.html</guid>
			<pubDate>Tue, 9 Jan 2007 23:41:03 +0100</pubDate>
                    </item>
        	            <item>
            <title>LogitechLCDTool Released, Some Developer Notes...</title>
            <!--<link>http://www.entropy.ch/blog/Developer/?permalink=LogitechLCDTool-Released-Some-Developer-Notes.html</link>-->
            <link>http://www.entropy.ch/blog/Developer/2007/01/03/LogitechLCDTool-Released-Some-Developer-Notes.html</link>
            <description>&lt;p&gt;I just finished the first version of &lt;a href=&quot;http://www.entropy.ch/software/macosx/lcdtool/&quot;&gt;LogitechLCDTool&lt;/a&gt;, which provides the missing Mac support for some features of Logitech’s Z-10 USB speaker system. Go check it out if you run these speakers on a Mac, or if you didn’t buy them for lack of Mac support...&lt;/p&gt;

&lt;p&gt;Here are some notes which might be interesting to developers.&lt;/p&gt;

&lt;p&gt;There are also some infos in &lt;a href=&quot;http://www.oreillynet.com/mac/blog/2007/01/indie_dev_brings_mac_compatibi.html&quot;&gt;this blog&lt;/a&gt; post by Derrick Story over at oreillynet.com.&lt;/p&gt;

&lt;img class=&quot;screenshot right&quot; src=&quot;http://www.entropy.ch/software/macosx/lcdtool/lcdtool-screenshot2.png&quot;/&gt;

&lt;p&gt;What the program does is render a tiny black-and-white HTML page in a WebView and then capture a bitmap representation of that and send it to the speaker display over the USB bus. It also listens for USB button events and runs some AppleScripts in response or forwards the events into the WebKit JavaScript environment in case a script in there is listening.&lt;/p&gt;

&lt;p&gt;The program also injects a proxy object into the JavaScript environment. The proxy provides methods which the JavaScript code can call back to request services from the host application. One set of methods offers the ability to compile and run AppleScript code, so it’s really an interesting combination of Objective-C, JavaScript and AppleScript which provides a lot of flexibility.&lt;/p&gt;

&lt;p&gt;It was a pleasure to implement this, the scripting support in WebKit that combines the JavaScript and Objective-C worlds is very elegant and well-documented. It is a great way to provide extensibility in an application, especially if you need to provide user-customizable visual results.&lt;/p&gt;

&lt;p&gt;Getting a bitmap representation worked well after I used NSBitmapImageRep’s initWithFocusedViewRect: method which produced a faithful reproduction of the bitmapped, aliased fonts as visible on the screen. I first tried loading the result of  NSView’s dataWithPDFInsideRect: into a new NSImage but that resulted in anti-aliased fonts and changed geometry.&lt;/p&gt;


&lt;p&gt;The most difficult part was figuring out how to send data &lt;em&gt;to&lt;/em&gt; a USB device using the USB HID API. I found the terminology confusing and there doesn’t seem to be example code for data output, just input. A &lt;a href=&quot;http://www.rogueamoeba.com/utm/archives/rslight.c&quot;&gt;piece of code&lt;/a&gt; from a Rogue Amoeba engineer helped me a lot.&lt;/p&gt;

&lt;p&gt;I was forced to use the HID API because direct USB communication was prevented by the fact that Mac OS X recognizes the HID devices and grabs exclusive access. It seems I could have changed this with a code-less kernel extension, but I wanted a clean, self-contained application so the USB HID API was the logical choice.&lt;/p&gt;

&lt;p&gt;After some funky noise patterns on the LCD screen, some Mac OS X kernel panics caused by unplugging the USB cable and some Z-10 reboots to fix speaker crashes caused by malformed data packets, I finally got my images displayed on the speaker. After that I wrapped the raw C API in more convenient Objective-C code and transformed the USB HID queue events to NSNotifications to isolate the rest of the program from the USB APIs.&lt;/p&gt;

&lt;p&gt;The “USB Prober” application included in Apple’s developer tools helped me a lot, especially the “Details” drawer in its “IORegistry” tab.&lt;/p&gt;

&lt;img class=&quot;right&quot; src=&quot;http://andymatuschak.org/images/projects/sparkle/logo.png&quot;/&gt;

&lt;p&gt;Before I published the first version, I realized that I might follow up with quite a few bug-fix updates in the first few weeks so tried the &lt;a href=&quot;http://andymatuschak.org/pages/sparkle&quot;&gt;Sparkle&lt;/a&gt; auto-update framework by Andy Matuschak for the first time. I could not believe how easy it was to get it working. I was literally running my first auto-update 15 minutes after downloading the framework from the Sparkle website and starting to read its documentation. If you distribute Cocoa applications, you really need to look at this...&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Developer/?permalink=LogitechLCDTool-Released-Some-Developer-Notes.html</guid>
			<pubDate>Wed, 3 Jan 2007 13:38:57 +0100</pubDate>
                    </item>
        	            <item>
            <title>del.icio.us Links on 2006-12-26</title>
            <!--<link>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2006-12-26.html</link>-->
            <link>http://www.entropy.ch/blog/Links/2006/12/26/del-icio-us-Links-on-2006-12-26.html</link>
            <description>&lt;ul class=&quot;delicious&quot;&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://www.gotoquiz.com/what_american_accent_do_you_have&quot;&gt;What American accent do you have?&lt;/a&gt; &lt;/div&gt;
		&lt;div class=&quot;delicious-extended&quot;&gt; And check your US American accent here... &lt;/div&gt;		&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/Fun&quot;&gt;Fun&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/speech&quot;&gt;speech&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/Language&quot;&gt;Language&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/accent&quot;&gt;accent&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/linguistics&quot;&gt;linguistics&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/culture&quot;&gt;culture&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://dialects.from.ch/&quot;&gt;Das Chochichästli-Orakel&lt;/a&gt; &lt;/div&gt;
		&lt;div class=&quot;delicious-extended&quot;&gt; Check your Swiss German dialect... &lt;/div&gt;		&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/Fun&quot;&gt;Fun&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/switzerland&quot;&gt;switzerland&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/Language&quot;&gt;Language&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/german&quot;&gt;german&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/dialekte&quot;&gt;dialekte&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/dialect&quot;&gt;dialect&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
&lt;/ul&gt;
</description>
            <guid>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2006-12-26.html</guid>
			<pubDate>Tue, 26 Dec 2006 23:01:39 +0100</pubDate>
                    </item>
        	            <item>
            <title>Reverse Engineering Z-10 LCD USB Protocol</title>
            <!--<link>http://www.entropy.ch/blog/Developer/?permalink=Reverse-Engineering-Z-10-LCD-USB-Protocol.html</link>-->
            <link>http://www.entropy.ch/blog/Developer/2006/12/19/Reverse-Engineering-Z-10-LCD-USB-Protocol.html</link>
            <description>&lt;p&gt;I just bought the &lt;a href=&quot;http://www.amazon.com/gp/redirect.html%3FASIN=B000HCUU0Q%26tag=wwwentropych-20%26lcode=xm2%26cID=2025%26ccmID=165953%26location=/o/ASIN/B000HCUU0Q%253FSubscriptionId=02ZH6J1W0649DTNS6002&quot;&gt;Logitech Z-10 Speakers&lt;/a&gt; and I’m very happy with my purchase, except for the fact that they come without Mac OS X drivers for the little LCD screen.&lt;/p&gt;

&lt;p&gt;I’m trying to reverse engineer the USB protocol and write a little tool to control the display. I used a USB protocol sniffer to capture the Windows XP driver’s data transfer to the speaker (running Windows and the sniffer in Parallels VM :-). The bitmap format is bit weird, but it turns out that not much reverse engineering is necessary because the speakers use the same LCD screen format and wire protocol as the Logitech G15 gaming keyboard, for which an open source driver exists in the form of the &lt;a href=&quot;http://g15tools.sourceforge.net/&quot;&gt;g15tools&lt;/a&gt; package.&lt;/p&gt;

&lt;p&gt;That package contains a routine (&lt;code&gt;dumpPixmapIntoLCDFormat()&lt;/code&gt;) to do the actual bitmap conversion, but I wanted to fully understand the format and do the reverse transformation. The result of my experiments is the Perl script below.&lt;/p&gt;

&lt;p&gt;It dumps the bitmap to the screen as ASCII art:&lt;/p&gt;

&lt;img class=&quot;screenshot&quot; src=&quot;/images/blog/2006-12-19-logitech-lcd.jpg&quot; /&gt;

&lt;div class=&quot;code&quot;&gt;#!/usr/bin/perl
#
# Decode the bitmap format used for Logitech G15 gaming
# keyboard or Z-10 USB loudspeaker LCD screens.
#
# Written by Marc Liyanage &amp;lt;http://www.entropy.ch&gt;
#
# Written to study the bitmap format in preparation for
# the development of a Mac OS X tool which needs to generate
# these bitmaps.
# Written with help in the form of the source code to the
# dumpPixmapIntoLCDFormat() function in the libg15 source
# code from the g15tools package at
# http://sourceforge.net/projects/g15tools.
#
# The raw USB data was captured on Windows using the great
# free sniff-bin / SniffUSB USB protocol sniffer
# from http://benoit.papillault.free.fr/usbsnoop/
#
#
# The screen is 160x43 pixels. The bitmap format covers
# 8 vertical pixels per byte. A &quot;normal&quot; input
# format which covers the pixels from left to right and top
# to bottom has each input byte spread to 8 consecutive output
# bytes (the matrix is transposed), i.e. the input value
# 
#     0xff
#
# (which means 8 enabled pixels in a row) becomes the
# 8 low bits of
#
#     0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01
#
# in the data block that is actually sent to the LCD
# screen via USB bulk data transfer. After 160 bytes
# (one full horizontal scan line), the next bit
# position is being used. That means that if input byte 1 and
# input byte 161 are both 0xff, the first 8 bytes of the output
# pattern look like this:
#
#     0x03 0x03 0x03 0x03 0x03 0x03 0x03 0x03
#
# This Perl script reverses the transformation and
# dumps the bitmap to the screen as ASCII art.
#

use warnings;
use strict;

#my $data = &quot;030000000000000000000000000000000000000000000000000000000000000000f0080808081000804040408000c0000000c000c08040408000f0400080404040f800804040408000c00000c00000c000c080404080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070888888100000f04000804040408000c04040408000c00000c00000c000004040408000f04000804040408000f8804040800007080808080400070808080700070808040f000f0000000f00070800070808080f00070808080700030c0300030c03000f0000000f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040808080700000708000708080807003f0808080700030c0300030c0300060909090f000708000708080804000f0000000f0080e070101070e080000080e070101070e0800000000000000080e070101070e0800000f0f01010101010100000000000000080e070101070e080000080e070101070e0800000000000000000000000000000000000000000000080e070101070e080000080e070101070e0800000000000000080e070101070e080000080e070101070e0800000000000000080e070101070e080000080e070101070e08000001f7fe08080e07f1f00001f7fe08080e07f1f000081810000001f7fe08080e07f1f00002363c38181c37e3c000081810000001f7fe08080e07f1f00001f7fe08080e07f1f000000000000000000000000000000000000000000001f7fe08080e07f1f00001f7fe08080e07f1f000081810000001f7fe08080e07f1f00001f7fe08080e07f1f000081810000001f7fe08080e07f1f00001f7fe08080e07f1f000000000000000000000000000000f8f0f0e0e0c04000000000000000000000000000000000000000000000f8f840e0f0f8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f8f0f0e0e0c04000000000000000000000000000000000000000000000f8f840e0f0f80000000000000000000000000000000000000000000000000000000303010100000000000000000000000000000000000000000000000000030300000103000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030301010000000000000000000000000000000000000000000000000003030000010300000000000000000000000000&quot;;
my $data = &quot;03000000000000000000000000000000000000000000000000000000000000000000000000000000000080c0e0f0f0f8fcfcfefefeffffffffff3f1f0600000000000000000000000080c0e0f0f8fc7e7e3e1e0c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080e0f8fcffffffffffffffffffffffffff3f0f0300000000808080c0c0c0c0c0c08080800303010101000000000000000000000000000000000000000000000000000000f0f0f00000000000000000000000000000000000000000000000000000000000000000383838000000e0e0e000000000000000000000000000000000000000000000000000f8f8f800000000000000000000000000000000000000fcffffffffffffffffffffffffffffffff830000f8fcfeffffcfe7fbfb1f0f070707078ffffffffefc0000207070f0f0f0f0f0f0f0f0602000000000000000000000000000ffffff0000000000f8fcfe070303030307fefcf800f8fcfe0f0703030303ffffff0000ffffff000303ffffff030303f8fefe33333333333f3e3cf0fcfe0f03030303030302ffffff0303030303fffef800030300000000000000000f7ffffffffffffffffffffffffffffffffff8e0c10303070f3f7f7f7f6f4f6e6e3f1f1f0f07030100000000000000000000000000000000000000000000000000000000000f0f0f0c0c0c0c0c0d03070e0c0c0c0c0e07030100c1c3878f8e8c8c8c8cffff7f00000f0f0f000000070f0f0c0c0c0103070e0c0c0c0c0c0e000003070f0c0c0c0c0c0c040f0f0f00000000000f0f0f0000000000000000000000000001030f1f3f7ffffffffffffffffffffffffffffe0000000000000000000000000000000000000e3e7cfcf8f0f0e0c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101010101010100000000000000000000000000000000000000000000000000000000000000000000000000fc0000000000f8040404040800fc04040408f00000000000000000000000000000010103030707070707070301000000000000000000000000000000000000000000000000010303070700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000704040404000304040404020007040404020100&quot;;

my $X = 160; # width in pixels

my @values = map {hex($_)} $data =~ /(..)/g;
splice(@values, 0, 32); # 32 leading bytes

my @out;
my $bitcount = 0;

while (@values) {
    my @line = splice(@values, 0, $X);
    foreach my $bit (0 .. 7) {
        foreach my $char (@line) {
            my $value = ($char &amp;amp; 1 &amp;lt;&amp;lt; $bit) &gt;&gt; $bit;
            $out[$bitcount / 8] |= $value &amp;lt;&amp;lt; $bitcount % 8;
            $bitcount++;
        }		
    }
}

while (@out) {
    my @line =
        map {[&#39; &#39;, &#39;@&#39;]-&gt;[$_]}
        map {reverse split(//)}
        map {sprintf(&quot;%08b&quot;, $_)}
        splice(@out, 0, $X / 8);
    print @line;
    print &quot;\n&quot;;
}&lt;/div&gt;
</description>
            <guid>http://www.entropy.ch/blog/Developer/?permalink=Reverse-Engineering-Z-10-LCD-USB-Protocol.html</guid>
			<pubDate>Tue, 19 Dec 2006 02:47:15 +0100</pubDate>
                    </item>
        	            <item>
            <title>del.icio.us Links on 2006-12-18</title>
            <!--<link>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2006-12-18.html</link>-->
            <link>http://www.entropy.ch/blog/Links/2006/12/18/del-icio-us-Links-on-2006-12-18.html</link>
            <description>&lt;ul class=&quot;delicious&quot;&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://xkcd.com/c149.html&quot;&gt;xkcd - A webcomic of romance, sarcasm, math, and language - By Randall Munroe&lt;/a&gt; &lt;/div&gt;
		&lt;div class=&quot;delicious-extended&quot;&gt; I love this one... Didn&#39;t realize how useful sudo is... :-) &lt;/div&gt;		&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/funny&quot;&gt;funny&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/Humor&quot;&gt;Humor&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/web&quot;&gt;web&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/unix&quot;&gt;unix&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/geek&quot;&gt;geek&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/comics&quot;&gt;comics&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/comic&quot;&gt;comic&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
&lt;/ul&gt;
</description>
            <guid>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2006-12-18.html</guid>
			<pubDate>Mon, 18 Dec 2006 23:01:25 +0100</pubDate>
                    </item>
        	            <item>
            <title>del.icio.us Links on 2006-12-16</title>
            <!--<link>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2006-12-16.html</link>-->
            <link>http://www.entropy.ch/blog/Links/2006/12/16/del-icio-us-Links-on-2006-12-16.html</link>
            <description>&lt;ul class=&quot;delicious&quot;&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://video.on.nytimes.com/?fr_story=d14603c1e23e6ce37920a8134a2e27b1405a4991&amp;amp;rf=bm&quot;&gt;New York Times Video&lt;/a&gt; &lt;/div&gt;
		&lt;div class=&quot;delicious-extended&quot;&gt; For the New York Times, David Pogue reviews Windows Vista, trying to prove in his video that “Microsoft did not steal ideas from Mac OS X.” &lt;/div&gt;		&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/mac&quot;&gt;mac&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/macosx&quot;&gt;macosx&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/nytimes&quot;&gt;nytimes&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/windows&quot;&gt;windows&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/apple&quot;&gt;apple&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/vista&quot;&gt;vista&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
&lt;/ul&gt;
</description>
            <guid>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2006-12-16.html</guid>
			<pubDate>Sat, 16 Dec 2006 23:01:20 +0100</pubDate>
                    </item>
        	             <item>
            <title>del.icio.us Links on 2006-12-08</title>
            <!--<link>http://www.entropy.ch/blog/?permalink=del-icio-us-Links-on-2006-12-08.html</link>-->
            <link>http://www.entropy.ch/blog/2006/12/08/del-icio-us-Links-on-2006-12-08.html</link>
            <description>&lt;ul class=&quot;delicious&quot;&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://www.communitymx.com/content/article.cfm?page=2&amp;amp;cid=C37E0&quot;&gt;How To Attack An Internet Explorer (Win) Display Bug&lt;/a&gt; &lt;/div&gt;
		&lt;div class=&quot;delicious-extended&quot;&gt; The Holly Hack, a CSS hack to work around float layout bugs in MSIE6. Probably old news to many, but it helped me a lot recently. &lt;/div&gt;		&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/css&quot;&gt;css&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/webdesign&quot;&gt;webdesign&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/web&quot;&gt;web&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/development&quot;&gt;development&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/msie&quot;&gt;msie&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/hack&quot;&gt;hack&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
&lt;/ul&gt;
</description>
            <guid>http://www.entropy.ch/blog/?permalink=del-icio-us-Links-on-2006-12-08.html</guid>
			<pubDate>Fri, 8 Dec 2006 23:34:42 +0100</pubDate>
                    </item>
        	            <item>
            <title>PostgreSQL 8.2 Final Package Available</title>
            <!--<link>http://www.entropy.ch/blog/Software/?permalink=PostgreSQL-8-2-Final-Package-Available.html</link>-->
            <link>http://www.entropy.ch/blog/Software/2006/12/07/PostgreSQL-8-2-Final-Package-Available.html</link>
            <description>&lt;p&gt;Here&#39;s a package for the final version of PostgreSQL 8.2&lt;/p&gt;

&lt;p&gt;Download link in the &lt;a href=&quot;http://www.entropy.ch/phpbb2/viewtopic.php?p=9519#9519&quot;&gt;forum post&lt;/a&gt;.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Software/?permalink=PostgreSQL-8-2-Final-Package-Available.html</guid>
			<pubDate>Thu, 7 Dec 2006 18:44:25 +0100</pubDate>
                    </item>
        	             <item>
            <title>del.icio.us Links on 2006-12-05</title>
            <!--<link>http://www.entropy.ch/blog/?permalink=del-icio-us-Links-on-2006-12-05.html</link>-->
            <link>http://www.entropy.ch/blog/2006/12/05/del-icio-us-Links-on-2006-12-05.html</link>
            <description>&lt;ul class=&quot;delicious&quot;&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://css.weblogsinc.com/2006/07/24/conditional-css-not-just-for-ie/&quot;&gt;Conditional CSS - not just for IE - CSS Insider&lt;/a&gt; &lt;/div&gt;
		&lt;div class=&quot;delicious-extended&quot;&gt; This is a very cool and clean trick for browser-specific CSS rules &lt;/div&gt;		&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/css&quot;&gt;css&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/javascript&quot;&gt;javascript&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/webdesign&quot;&gt;webdesign&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/msie&quot;&gt;msie&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
&lt;/ul&gt;
</description>
            <guid>http://www.entropy.ch/blog/?permalink=del-icio-us-Links-on-2006-12-05.html</guid>
			<pubDate>Tue, 5 Dec 2006 23:34:16 +0100</pubDate>
                    </item>
        	            <item>
            <title>Pictures: Sunday Shopping in Zurich</title>
            <!--<link>http://www.entropy.ch/blog/Pictures/?permalink=Photos-Sunday-Shopping-in-Zurich.html</link>-->
            <link>http://www.entropy.ch/blog/Pictures/2006/12/03/Photos-Sunday-Shopping-in-Zurich.html</link>
            <description>&lt;a href=&quot;http://www.snapmania.com/users/mliyanage/zurichxmasshopping2006/&quot;&gt;&lt;img class=&quot;screenshot right&quot; src=&quot;/images/blog/2006-12-03-xmasshopping.jpg&quot; /&gt;&lt;/a&gt;

&lt;p&gt;&lt;a href=&quot;http://www.snapmania.com/users/mliyanage/zurichxmasshopping2006/&quot;&gt;Sunday shopping&lt;/a&gt; in the city...&lt;/p&gt;

&lt;br clear=&quot;all&quot;/&gt;
</description>
            <guid>http://www.entropy.ch/blog/Pictures/?permalink=Photos-Sunday-Shopping-in-Zurich.html</guid>
			<pubDate>Sun, 3 Dec 2006 17:29:14 +0100</pubDate>
                    </item>
        	            <item>
            <title>PostgreSQL 8.2 Beta 3 Package available</title>
            <!--<link>http://www.entropy.ch/blog/Software/?permalink=PostgreSQL-8-2-Beta-3-Package-available.html</link>-->
            <link>http://www.entropy.ch/blog/Software/2006/11/24/PostgreSQL-8-2-Beta-3-Package-available.html</link>
            <description>&lt;p&gt;I created a package of PostgreSQL 8.2 Beta 3 for the early adopters :-)&lt;/p&gt;

&lt;p&gt;Download link in this forum post:&lt;/p&gt;

&lt;a href=&quot;http://www.entropy.ch/phpbb2/viewtopic.php?p=9452&quot;&gt;http://www.entropy.ch/phpbb2/viewtopic.php?p=9452&lt;/a&gt;
</description>
            <guid>http://www.entropy.ch/blog/Software/?permalink=PostgreSQL-8-2-Beta-3-Package-available.html</guid>
			<pubDate>Fri, 24 Nov 2006 10:23:31 +0100</pubDate>
                    </item>
        	             <item>
            <title>del.icio.us Links on 2006-11-23</title>
            <!--<link>http://www.entropy.ch/blog/?permalink=del-icio-us-Links-on-2006-11-23.html</link>-->
            <link>http://www.entropy.ch/blog/2006/11/23/del-icio-us-Links-on-2006-11-23.html</link>
            <description>&lt;ul class=&quot;delicious&quot;&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://arstechnica.com/reviews/hardware/ps3.ars/2&quot;&gt;Sony PlayStation 3: the Ars Technica review : Page 2&lt;/a&gt; &lt;/div&gt;
		&lt;div class=&quot;delicious-extended&quot;&gt; I guess I want one :-) &lt;/div&gt;		&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/sony&quot;&gt;sony&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/ps3&quot;&gt;ps3&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/playstation&quot;&gt;playstation&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://cocoatron.com/&quot;&gt;Cocoatron :: Automator Actions for XML Processing Pipelines&lt;/a&gt; &lt;/div&gt;
		&lt;div class=&quot;delicious-extended&quot;&gt; This looks very hot :-) XML Pipelines as Automator Actions... &lt;/div&gt;		&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/xml&quot;&gt;xml&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/xslt&quot;&gt;xslt&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/apple&quot;&gt;apple&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/applescript&quot;&gt;applescript&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/automator&quot;&gt;automator&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/macosx&quot;&gt;macosx&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
&lt;/ul&gt;
</description>
            <guid>http://www.entropy.ch/blog/?permalink=del-icio-us-Links-on-2006-11-23.html</guid>
			<pubDate>Thu, 23 Nov 2006 23:17:55 +0100</pubDate>
                    </item>
        	             <item>
            <title>More NetBeans on Mac</title>
            <!--<link>http://www.entropy.ch/blog/?permalink=More-NetBeans-on-Mac.html</link>-->
            <link>http://www.entropy.ch/blog/2006/11/22/More-NetBeans-on-Mac.html</link>
            <description>While working on the first Java project after switching to the NetBeans IDE, I collected some notes about things which didn’t work as expected. This is a followup to my first &lt;a href=&quot;&quot;&gt;NetBeans on Mac OS X post&lt;/a&gt;.

&lt;h3&gt;Issues&lt;/h3&gt;

Where appropriate I added these items to the NetBeans issue tracking system and noted their bug ids.

&lt;p&gt;1.) Double-click-drag selection doesn’t work as expected. With double-click-drag selection I mean double-clicking a word and keeping the mouse button pressed on the second click. In every other Mac OS X text editing environment, this selects the entire double-clicked word and then allows me to drag-extend the selection in increments of entire words instead of character-by-character. In NetBeans, the double-click is ignored, it behaves like a regular single-click selection. The regular behavior is especially useful since I have mapped the middle mouse button (wheel button) to a double-click. [&lt;a href=&quot;http://www.netbeans.org/issues/show_bug.cgi?id=89607&quot;&gt;89607&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;2.) Triple-click-drag selection has the same problem, it doesn’t work as expected. In BBEdit or Cocoa text views, triple-clicking text selects the entire line or paragraph. Dragging up or down selects more lines. It’s a very convenient feature. In NetBeans, triple-clicking selects the word under the cursor and then starts a drag for the word. [&lt;a href=&quot;http://www.netbeans.org/issues/show_bug.cgi?id=89607&quot;&gt;89607&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;3.) (Seems to be fixed when running under Java 6) Turning the scroll wheel with the shift key down doesn’t scroll horizontally. Horizontal scroll using the trackpad and I guess mighty mouse also work under Java 6. Nice :-)&lt;/p&gt;

&lt;p&gt;4.) (Seems to be fixed when running under Java 6) The code editor sometimes loses keyboard input focus in a strange way. There’s no cursor and I can’t enter text anymore. Bringing up and dismissing the preferences recovers from this state. To reproduce: in method of class A invoke a non-existing method in class B. Allow the assistant to add the method to class B which will also jump there. Switch back to class A and the editor should be in the whacked state now.&lt;/p&gt;

&lt;p&gt;5.) I am unable to reproduce this reliably, but from time to time NetBeans does not accept some keyboard shortcuts. For example, I was unable to assign Ctrl-Left to an action for the longest time. Now it suddenly works again.&lt;/p&gt;

&lt;p&gt;6.) Maybe someone can tell me how to achieve this: I want to use Cmd-J for “Go to Line...” but Cmd-J seems to be a special shortcut which is combined with additional letters to create multi-key sequences. I have to press Cmd-J twice now, the first time it initializes a special mode that waits for a second keystroke, and the second time it actually brings up the line number dialog.&lt;/p&gt;

&lt;p&gt;7.) (Also fixed by now?) Moving diagonally into a submenu usually means that the mouse cursor hits other menu items on the parent level before it reaches the submenu panel. Mac OS X has a grace period for such mouse movement so the submenu panel doesn’t immediately disappear again. I’m pretty sure that this grace period wasn’t present in NetBeans, and I also remember that the small arrows indicating a submenu looked different when I had this problem. Well I won’t complain if it’s fixed for good :-)&lt;/p&gt;

&lt;p&gt;8.) I’d like to control the font in the Output pane. There doesn’t seem to be a way to change this.&lt;/p&gt;

&lt;img class=&quot;screenshot right&quot; src=&quot;/images/blog/2006-11-22-netbeans-fontsize.png&quot; /&gt;

&lt;p&gt;9.) The default font size is too big, causing list items to use up too much space, e.g. in the navigator. When I set a smaller one with the --fontsize option in ~/.netbeans/5.5/etc/netbeans.conf, the font is smaller, but the line spacing stays the same, which is useless if the point is to pack more list items into the same space.&lt;/p&gt;

&lt;p&gt;10.) Maybe I’m using the wrong function, but WSDL validation only provides primitive XML validation. In Eclipse, the feature validates on a higher level, up to WS-I profile compliance, which is what I need.&lt;/p&gt;

&lt;h3 style=&quot;clear: both;&quot;&gt;Running under Java 6&lt;/h3&gt;

&lt;p&gt;Here’s what I did to make NetBeans run under Java 6:&lt;/p&gt;

&lt;p&gt;In /Applications/NetBeans.app/Contents/Resources/NetBeans/platform6/lib/nbexec change “1.5” to “1.6” in these two lines:&lt;/p&gt;

&lt;div class=&quot;code&quot;&gt;
if [ -x /System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home/bin/java ] ; then
    jdkhome=/System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home
&lt;/div&gt;

&lt;img class=&quot;screenshot right&quot; src=&quot;/images/blog/2006-11-22-java6-rendering.png&quot; /&gt;

&lt;p&gt;The default graphics engine renders my coding font really, really ugly and it does’t use subpixel-antialiasing (which I &lt;em&gt;absolutely&lt;/em&gt; need). This is why I switched to the Quartz rendering engine as &lt;a href=&quot;http://developer.apple.com/documentation/Java/Conceptual/JavaPropVMInfoRef/Articles/JavaSystemProperties.html#//apple_ref/doc/uid/TP40001975-DontLinkElementID_6&quot;&gt;described by Apple&lt;/a&gt;. I did this in my personal netbeans.conf file which you can see below.&lt;/p&gt;

&lt;p&gt;You can also see how I changed the memory, font size and file encoding parameters. File encoding because the last encoding I’d ever want is the platform default Mac Roman.&lt;/p&gt;

&lt;br clear=&quot;all&quot; /&gt;
&lt;div class=&quot;code&quot;&gt;
cat ~/.netbeans/5.5/etc/netbeans.conf

netbeans_default_options=&quot;-J-Dfile.encoding=UTF-8 -J-Dapple.awt.graphics.UseQuartz=true -J-Xms32m -J-Xmx512m -J-XX:PermSize=32m -J-XX:MaxPermSize=160m -J-Xverify:none -J-Dapple.laf.useScreenMenuBar=true --fontsize 11&quot;
&lt;/div&gt;


&lt;h3&gt;Plugins someone should write&lt;/h3&gt;

&lt;p&gt;Someone should write these. Maybe I’ll do it :-)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Select Line &lt;em&gt;including&lt;/em&gt; the trailing linefeed&lt;/li&gt;
&lt;li&gt;Something like “Use Selection for Find”&lt;/li&gt;

&lt;/ul&gt;
</description>
            <guid>http://www.entropy.ch/blog/?permalink=More-NetBeans-on-Mac.html</guid>
			<pubDate>Wed, 22 Nov 2006 18:17:07 +0100</pubDate>
                    </item>
        	             <item>
            <title>del.icio.us Links on 2006-11-21</title>
            <!--<link>http://www.entropy.ch/blog/?permalink=del-icio-us-Links-on-2006-11-21.html</link>-->
            <link>http://www.entropy.ch/blog/2006/11/21/del-icio-us-Links-on-2006-11-21.html</link>
            <description>&lt;ul class=&quot;delicious&quot;&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://www.lyricscrawler.com/song/3953.html&quot;&gt;Baz Luhrmann Lyrics - Everybody&#39;s Free (To Wear Sunscreen) - Lyrics Crawler&lt;/a&gt; &lt;/div&gt;
				&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/system:unfiled&quot;&gt;system:unfiled&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
&lt;/ul&gt;
</description>
            <guid>http://www.entropy.ch/blog/?permalink=del-icio-us-Links-on-2006-11-21.html</guid>
			<pubDate>Tue, 21 Nov 2006 23:17:43 +0100</pubDate>
                    </item>
        	             <item>
            <title>Looking for a Java Software Engineer</title>
            <!--<link>http://www.entropy.ch/blog/?permalink=Looking-for-a-Java-Software-Engineer.html</link>-->
            <link>http://www.entropy.ch/blog/2006/11/14/Looking-for-a-Java-Software-Engineer.html</link>
            <description>&lt;p&gt;We are looking for a software engineer for a Java GUI project at &lt;a href=&quot;http://www.futurelab.ch&quot;&gt;futureLAB&lt;/a&gt;. The project will be based on Java J2SE 6, which is new and shiny and nice for Java GUI stuff.&lt;/p&gt;

&lt;p&gt;Requirements/Technologies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Modern Java/Swing programming&lt;/li&gt;
&lt;li&gt;Data/GUI binding frameworks&lt;/li&gt;
&lt;li&gt;SOAP/WSDL because the client talks to a server&lt;/li&gt;
&lt;li&gt;XML&lt;/li&gt;
&lt;li&gt;Possibly experience with one or more rich client frameworks (Spring RCP, NetBeans, Eclipse, ...)&lt;/li&gt;
&lt;li&gt;Fluency in German&lt;/li&gt;
&lt;li&gt;Work on site in Winterthur, Switzerland&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you’re interested, please send your application/CV/resume to info at futurelab dot ch.&lt;/p&gt;

</description>
            <guid>http://www.entropy.ch/blog/?permalink=Looking-for-a-Java-Software-Engineer.html</guid>
			<pubDate>Tue, 14 Nov 2006 12:56:43 +0100</pubDate>
                    </item>
        	            <item>
            <title>Cheap SSL Certificates</title>
            <!--<link>http://www.entropy.ch/blog/Website/?permalink=Cheap-SSL-Certificates.html</link>-->
            <link>http://www.entropy.ch/blog/Website/2006/11/13/Cheap-SSL-Certificates.html</link>
            <description>&lt;p&gt;I just had to renew my SSL server certificate, which I use mostly to secure the connection between Apple Mail on my laptop and my SMTP and IMAP servers, but also to secure access to parts of a website.&lt;/p&gt;

&lt;p&gt;The certificate that just expired was a 2-year cert from StarterSSL/FreeSSL. This product is now called RapidSSL and the price went up a bit so I shopped around and found a good deal at &lt;a href=&quot;http://www.completessl.com&quot;&gt;CompleteSSL&lt;/a&gt;, specifically their &lt;a href=&quot;http://www.completessl.com/onestepssl.php&quot;&gt;OneStepSSL&lt;/a&gt; low-assurance offering which is for &lt;a href=&quot;http://www.completessl.com/onestepssl.php?step=yes&quot;&gt;non-critical&lt;/a&gt; use cases like mine.&lt;/p&gt;

&lt;p&gt;One year certificates cost $25.-, ordering and delivery worked flawlessly, I can recommend it...&lt;/p&gt;

</description>
            <guid>http://www.entropy.ch/blog/Website/?permalink=Cheap-SSL-Certificates.html</guid>
			<pubDate>Mon, 13 Nov 2006 22:44:07 +0100</pubDate>
                    </item>
        	             <item>
            <title>del.icio.us Links on 2006-11-10</title>
            <!--<link>http://www.entropy.ch/blog/?permalink=del-icio-us-Links-on-2006-11-10.html</link>-->
            <link>http://www.entropy.ch/blog/2006/11/10/del-icio-us-Links-on-2006-11-10.html</link>
            <description>&lt;ul class=&quot;delicious&quot;&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://www.nickfitz.co.uk/2005/10/27/ie-conditional-comments-in-xslt-10&quot;&gt;Just a Coder - nickfitz.co.uk  » Blog Archive   » IE Conditional Comments in XSLT 1.0&lt;/a&gt; &lt;/div&gt;
		&lt;div class=&quot;delicious-extended&quot;&gt; I thought MSIE conditional comments are not generatable in XSLT but this blog posting shows how it&#39;s done... &lt;/div&gt;		&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/xslt&quot;&gt;xslt&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/msie&quot;&gt;msie&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/web&quot;&gt;web&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/css&quot;&gt;css&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
&lt;/ul&gt;
</description>
            <guid>http://www.entropy.ch/blog/?permalink=del-icio-us-Links-on-2006-11-10.html</guid>
			<pubDate>Fri, 10 Nov 2006 23:07:33 +0100</pubDate>
                    </item>
        	            <item>
            <title>PHP 5.2.0 Release 1 Package</title>
            <!--<link>http://www.entropy.ch/blog/Software/?permalink=PHP-5-2-0-Release-1-Package.html</link>-->
            <link>http://www.entropy.ch/blog/Software/2006/11/06/PHP-5-2-0-Release-1-Package.html</link>
            <description>&lt;p&gt;I just released a PHP 5.2.0 package.&lt;/p&gt;

&lt;p&gt;You can find more information in the &lt;a href=&quot;http://www.entropy.ch/phpbb2/viewtopic.php?p=9378&quot;&gt;forum post&lt;/a&gt;.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Software/?permalink=PHP-5-2-0-Release-1-Package.html</guid>
			<pubDate>Mon, 6 Nov 2006 12:51:31 +0100</pubDate>
                    </item>
        	            <item>
            <title>PostgreSQL 8.1.5 Package available</title>
            <!--<link>http://www.entropy.ch/blog/Software/?permalink=PostgreSQL-8-1-5-Package-available.html</link>-->
            <link>http://www.entropy.ch/blog/Software/2006/10/30/PostgreSQL-8-1-5-Package-available.html</link>
            <description>&lt;p&gt;I updated the PostgreSQL package to version 8.1.5, you can find the download link in the &lt;a href=&quot;http://www.entropy.ch/phpbb2/viewtopic.php?p=9337#9337&quot;&gt;forum discussion&lt;/a&gt;.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Software/?permalink=PostgreSQL-8-1-5-Package-available.html</guid>
			<pubDate>Mon, 30 Oct 2006 14:36:32 +0100</pubDate>
                    </item>
        	            <item>
            <title>LeanCalc Calculator Application updated to 1.2</title>
            <!--<link>http://www.entropy.ch/blog/Software/?permalink=LeanCalc-Calculator-Application-updated-to-1-2.html</link>-->
            <link>http://www.entropy.ch/blog/Software/2006/10/30/LeanCalc-Calculator-Application-updated-to-1-2.html</link>
            <description>&lt;p&gt;I fixed a very minor but annoying issue in LeanCalc: The expression input text field now has focus when the window opens. Previously, you had to hit the TAB key once to give it focus. This brings LeanCalc to &lt;a href=&quot;http://www.entropy.ch/software/macosx/#leancalc&quot;&gt;version 1.2&lt;/a&gt;.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Software/?permalink=LeanCalc-Calculator-Application-updated-to-1-2.html</guid>
			<pubDate>Mon, 30 Oct 2006 13:38:54 +0100</pubDate>
              	          <wfw:comment>http://www.entropy.ch/blojsom/commentapi/marc/Software/?permalink=LeanCalc-Calculator-Application-updated-to-1-2.html</wfw:comment>
              <wfw:commentRss>http://www.entropy.ch/blog/Software/?permalink=LeanCalc-Calculator-Application-updated-to-1-2.html&amp;page=comments&amp;flavor=rss2</wfw:commentRss>
                    </item>
        	            <item>
            <title>AppleScript to merge MS Word Section PDFs</title>
            <!--<link>http://www.entropy.ch/blog/Mac+OS+X/?permalink=AppleScript-to-merge-MS-Word-Section-PDFs.html</link>-->
            <link>http://www.entropy.ch/blog/Mac+OS+X/2006/10/24/AppleScript-to-merge-MS-Word-Section-PDFs.html</link>
            <description>&lt;p&gt;If you use the built-in print-to-PDF feature of Mac OS X for an MS Word document with multiple sections, you will get multiple PDFs, one per section. You will then have to combine them manually using a tool like Adobe Acrobat, &lt;a href=&quot;http://www.iconus.ch/fabien/pdflab/&quot;&gt;PDFLab&lt;/a&gt; or &lt;a href=&quot;http://www.monkeybreadsoftware.de/Freeware/CombinePDFs.shtml&quot;&gt;Combine PDFs&lt;/a&gt;.&lt;/p&gt;

&lt;img class=&quot;screenshot right&quot; src=&quot;/images/blog/2006-10-24-word-sections-pdf.png&quot; /&gt;

&lt;p&gt;Hitting the &amp;#8220;Preview&amp;#8221; button instead of &amp;#8220;Save to PDF&amp;#8221; as explained in &lt;a href=&quot;http://www.macosxhints.com/article.php?story=2006100303461341&quot;&gt;this tip&lt;/a&gt; might work, unfortunately it didn&amp;#8217;t for me...&lt;/p&gt;

&lt;p&gt;Having to merge the per-section PDFs with the tools mentioned above is admittedly convenient enough and a minor issue, but it does get old if you have to do it often. (Actually I just wanted something to tinker with :-). I thought this would be a perfect job for Mac OS X&amp;#8217;s PDF Workflow feature and so I wrote this little AppleScript. In case you didn&amp;#8217;t know, PDF Workflows allow you to send PDF files from the standard print dialog directly to your code which can be written in AppleScript or UNIX languages like Perl, bash or Python. Apple has some &lt;a href=&quot;http://www.apple.com/applescript/print/&quot;&gt;example code&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I compiled the following code in my &lt;a href=&quot;http://www.latenightsw.com/sd4/&quot;&gt;AppleScript editor&lt;/a&gt; and saved it in compiled script form as &amp;#8220;~/Library/PDF Services/Merge Word Sections.scpt&amp;#8221;. Now I can choose it from the PDF drop down menu in the print dialog. It will churn for a bit and produce a PDF with all sections neatly merged into one file on the desktop. It picks up the output file name from the document automatically, replacing the extension with &amp;#8220;.pdf&amp;#8221;.&lt;/p&gt;

&lt;br clear=&quot;all&quot; /&gt;

&lt;div class=&quot;code&quot;&gt;on open of theFiles
    -- store the name of the temp file created by the printing system
    set theFile to item 1 of theFiles
    set thePosixFile to POSIX path of theFile
    
    tell application &quot;Finder&quot;
        set parentFolder to (container of theFile) as alias
    end tell
    
    set cmd to &quot;perl -n -e &#39;print m#/Title .+ - (.+?)(?:\\.\\w+)?\\)#&#39; &#39;&quot; &amp;amp; thePosixFile &amp;amp; &quot;&#39;&quot;
    set doctitle to do shell script cmd
    set outfile to (POSIX path of (path to desktop)) &amp;amp; doctitle &amp;amp; &quot;.pdf&quot;
    set outfileMissing to (do shell script &quot;test -e &#39;&quot; &amp;amp; outfile &amp;amp; &quot;&#39; || echo missing&quot;)
    set outfileAge to (do shell script &quot;perl -e &#39;print ((-M $ARGV[0]) * (24*60*60))&#39; &#39;&quot; &amp;amp; outfile &amp;amp; &quot;&#39;&quot;) as number
    
    if (outfileMissing is &quot;missing&quot; or outfileAge &gt; 10) then
        do shell script &quot;cp &#39;&quot; &amp;amp; thePosixFile &amp;amp; &quot;&#39; &#39;&quot; &amp;amp; outfile &amp;amp; &quot;&#39;&quot;
    else
        set tempfile to outfile &amp;amp; &quot;.tmp&quot;
        set pdfmerge to &quot;echo f1b88000a1f3d3540030d605bce6380301c33efa8da271861931274a96e052a4e4963ae5a78a2aac1850ca60bd2362f8fbfea9094378a48ca167776667764f03eea5b3ed945364570037675b65c8d806d86b2c61a9e6fe4a9d32c661b4825ee9a42593d0a5127a9aea51516a40c41563e91cdc9166ab37e747e0339ac384e686a370ec988c85965730996b8b2b2c4d2372dd6c86be0e19d0047b134b76a7a247ad836c6095871f56e2c6578fa46bc891a51ebd26ee8a19dae380ca5cf06839818eb46279722697fd6a3323dac1e9c5661583cf49eae5298a21d0683814c0739c881d6aad20991dddf7eb3d47b920b08eaebaae247ed538aee467365f1461863cc65b01e4c5f7ff1f529c82a76618c2d7e841760e599bba56baf8a8c162c280cfa1e7f2fb7851aa2c0398df837a87edab66786fdbcd05fbd032872842a49831c01bc036b6c24a875d7a0dbe44ebf93fd1652597e5879b7bf26165c1fee6aeb5db9d52a916a0551d31924ac979259c6b6f8f71e6f7582435200000 | perl -e &#39;print pack(\&quot;h*\&quot;, &amp;lt;&gt;)&#39; | gzip -d | python -&quot;
        set cmd to pdfmerge &amp;amp; &quot; &#39;&quot; &amp;amp; tempfile &amp;amp; &quot;&#39; &#39;&quot; &amp;amp; outfile &amp;amp; &quot;&#39; &#39;&quot; &amp;amp; thePosixFile &amp;amp; &quot;&#39;&quot;
        do shell script cmd
        set cmd to &quot;mv &#39;&quot; &amp;amp; tempfile &amp;amp; &quot;&#39; &#39;&quot; &amp;amp; outfile &amp;amp; &quot;&#39;&quot;
        do shell script cmd
    end if
    
    tell application &quot;Finder&quot; to delete parentFolder
    
end open&lt;/div&gt;

&lt;p&gt;Because Word runs each print job for each section independently, including a fresh invocation of this script, there is no clean way to find out if the print job is the first or a later one of a series. The script simply checks for an existing output file which has been modified in the last 10 seconds. If it finds one, the current print job is appended, otherwise it creates/overwrites the output file and the following job in the series will append to it. What this means is that you don&amp;#8217;t have a lot of time to confirm dialogs which Word sometimes pops up when it switches sections, for example if it warns you about narrow page margins.&lt;/p&gt;

&lt;p&gt;The script is unfortunately a bit ugly because I embedded a python script for the actual PDF merge. I embedded it to make the AppleScript totally self-contained. I originally kept the python script in my home directory&amp;#8217;s &amp;#8220;bin&amp;#8221; directory as &amp;#8220;pdfmerge.py&amp;#8221;. In case you&amp;#8217;re interested in the python code alone, this is what it looks like:&lt;/p&gt;

&lt;div class=&quot;code&quot;&gt;#!/usr/bin/env python

# Merges multiple PDF files into one.
# usage:
# pdfmerge.py &amp;lt;outfile&gt; &amp;lt;infile1&gt; &amp;lt;infile2&gt; ...
#

from CoreGraphics import *
import os, sys, getopt

outfile = sys.argv[1]

page_rect = CGRectMake(0, 0, 100, 100)
c = CGPDFContextCreateWithFilename(outfile, page_rect)

for arg in sys.argv[2:]: 
    pdf = CGPDFDocumentCreateWithProvider(CGDataProviderCreateWithFilename(arg));
    if pdf:
        for page in range(1, pdf.getNumberOfPages() + 1):
            rect = pdf.getMediaBox(page)
            c.beginPage(rect)
            c.drawPDFDocument(rect, pdf, page)
            c.endPage()

c.finish()&lt;/div&gt;

&lt;p&gt;Now that everything works, let&amp;#8217;s rip it all apart and rewrite it completely in Python &lt;nobr&gt;:-)&lt;/nobr&gt;&lt;/p&gt;

&lt;p&gt;I originally wrote this PDF workflow in AppleScript because it used some GUI / user interaction stuff which is no longer present in the version above. Without the need for AppleScript&amp;#8217;s GUI features, we can just as well write everything in Python which is a lot cleaner:&lt;/p&gt;

&lt;div class=&quot;code&quot;&gt;#!/usr/bin/env python

# args: &amp;lt;programname&gt; &amp;lt;document title&gt; &amp;lt;printing ticket options&gt; &amp;lt;spool file PDF name&gt;

from CoreGraphics import *
import os, sys, re, time, shutil, fcntl


def main():
    lockfile = file(&quot;/tmp/merge_word_sections.lock&quot;, &quot;w&quot;)
    fcntl.flock(lockfile, fcntl.LOCK_EX)
    
    outfile = re.compile(r&#39;(\.\w+|$)&#39;).sub(&#39;.pdf&#39;, sys.argv[1])
    outfile = re.compile(r&#39;^Microsoft Word - &#39;).sub(&#39;&#39;, outfile)
    outpath = os.popen(&quot;echo ~/Desktop/&quot; + outfile).readline().rstrip()
    spoolfile = sys.argv[3]
    
    outfileExists = os.path.exists(outpath)
    outfileAge = outfileExists and time.time() - os.path.getmtime(outpath) or 0
    
    if not outfileExists or outfileAge &gt; 10:
        shutil.copyfile(spoolfile, outpath)
    else:
        outpathTemp = outpath + &quot;.tmp&quot;
        merge_pdfs(outpathTemp, [outpath, spoolfile])
        shutil.move(outpathTemp, outpath)


def merge_pdfs(outfile, infiles):
    page_rect = CGRectMake(0, 0, 100, 100)
    context = CGPDFContextCreateWithFilename(outfile, page_rect)
    
    for infile in infiles:
        pdf = CGPDFDocumentCreateWithProvider(CGDataProviderCreateWithFilename(infile))
        if pdf:
            for page in range(1, pdf.getNumberOfPages() + 1):
                rect = pdf.getMediaBox(page)
                context.beginPage(rect)
                context.drawPDFDocument(rect, pdf, page)
                context.endPage()
    context.finish()


if __name__ == &#39;__main__&#39;:
    main()&lt;/div&gt;

&lt;p&gt;You can store this in a .py file in the same location, e.g. &amp;#8220;Merge Word Sections.py&amp;#8221; and it will show up in the print dialog PDF services popup menu.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Mac+OS+X/?permalink=AppleScript-to-merge-MS-Word-Section-PDFs.html</guid>
			<pubDate>Tue, 24 Oct 2006 01:11:30 +0200</pubDate>
                    </item>
        	            <item>
            <title>EpegWrapper JPEG Thumbnail Framework</title>
            <!--<link>http://www.entropy.ch/blog/Software/?permalink=EpegWrapper-JPEG-Thumbnail-Framework.html</link>-->
            <link>http://www.entropy.ch/blog/Software/2006/10/17/EpegWrapper-JPEG-Thumbnail-Framework.html</link>
            <description>&lt;p&gt;I updated my EpegWrapper Objective-C JPEG thumbnail framework and finally got around to writing a small section about it on the website so it’s a bit more visible and not hidden in the subversion repository. You can read about it and download it &lt;a href=&quot;http://www.entropy.ch/software/macosx/#epegwrapper&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Take a look at the applications using it, you might know some of them.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Software/?permalink=EpegWrapper-JPEG-Thumbnail-Framework.html</guid>
			<pubDate>Tue, 17 Oct 2006 17:48:07 +0200</pubDate>
                    </item>
        	            <item>
            <title>The Pentium Chronicles</title>
            <!--<link>http://www.entropy.ch/blog/Books/?permalink=The-Pentium-Chronicles.html</link>-->
            <link>http://www.entropy.ch/blog/Books/2006/10/17/The-Pentium-Chronicles.html</link>
            <description>&lt;a class=&quot;img&quot; href=&quot;http://www.amazon.com/gp/redirect.html%3FASIN=0471736171%26tag=wwwentropych-20%26lcode=xm2%26cID=2025%26ccmID=165953%26location=/o/ASIN/0471736171%253FSubscriptionId=02ZH6J1W0649DTNS6002&quot;&gt;&lt;img class=&quot;blog_entry_icon&quot; src=&quot;http://images.amazon.com/images/P/0471736171.01._SCMZZZZZZZ_V63404194_.jpg&quot; /&gt;&lt;/a&gt;

&lt;p&gt;An interesting book about the microprocessor design process at Intel, especially about managing such huge and highly complex projects. From the back cover:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A landmark chip like the P6 or Pentium 4 doesn&#39;t just happen. It takes a confluence of brilliant minds, dedication for beyond the ordinary, and management that nurtures the vision while keeping a firm hand on the project tiller.&lt;/p&gt;

&lt;p&gt;As chief architect of the P6, Robert Colwell offers a unique perspective as he unfolds the saga of a project that ballooned from a few architects to hundreds of engineers, many just out of school. For more than a treatise on project management, The Pentium Chronicles gives the rationale, the personal triumphs, and the humor that characterized the P6 project, an undertaking that broke all technical boundaries by being the first to try an out-of order, speculative super-scalar architecture in a microprocessor.&lt;/p&gt;

&lt;p&gt;In refreshingly down-to-earth language, organized around a framework &quot;we wish we had known about then,&quot; Chronicles describes the architecture and key decisions that shaped the P6, Intel&#39;s most successful chip to date. Colwell&#39;s inimitable style will have readers laughing out loud at the project team&#39;s creative solutions to well-known problems. From architectural planning in a storage room jimmied open with a credit card, to a marketing presentation using shopping carts, he takes readers through events from the projects beginning through its production. As Colwell himself recognizes, success is all about learning from others, and Chronicles is filled with stories of ordinary and exceptional people and frank assessments of &quot;oops&quot; moments, like the infamous FDIV bug.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;br clear=&quot;all&quot; /&gt;
</description>
            <guid>http://www.entropy.ch/blog/Books/?permalink=The-Pentium-Chronicles.html</guid>
			<pubDate>Tue, 17 Oct 2006 17:29:03 +0200</pubDate>
                    </item>
        	             <item>
            <title>Laptop RAM for sale on eBay</title>
            <!--<link>http://www.entropy.ch/blog/?permalink=Laptop-RAM-for-sale-on-eBay.html</link>-->
            <link>http://www.entropy.ch/blog/2006/10/12/Laptop-RAM-for-sale-on-eBay.html</link>
            <description>&lt;p&gt;I am selling some laptop RAM modules.&lt;/p&gt;

&lt;p&gt;I put them on eBay:&lt;br /&gt;
&lt;a href=&quot;http://cgi.ebay.de/ws/eBayISAPI.dll?ViewItem&amp;item=300037709569&amp;ssPageName=ADME:L:LCA:DE:11&quot;&gt;1GB PC2-3200 / DDR2-400 SO-DIMM Laptop Memory&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://cgi.ebay.de/ws/eBayISAPI.dll?ViewItem&amp;item=300037709963&amp;ssPageName=ADME:L:LCA:DE:11&quot;&gt;1GB PC2-4200 / DDR2-533 SO-DIMM Laptop Memory&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;The PC2-4200 ones will work in 4th generation 15&quot; PowerBooks (model #A1138) and in 2nd generation 17&quot; PowerBooks (model #A1139). I don’t know what kind of machines use the PC2-3200 modules.&lt;/p&gt;

</description>
            <guid>http://www.entropy.ch/blog/?permalink=Laptop-RAM-for-sale-on-eBay.html</guid>
			<pubDate>Thu, 12 Oct 2006 16:03:57 +0200</pubDate>
                    </item>
        	            <item>
            <title>del.icio.us Links on 2006-10-11</title>
            <!--<link>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2006-10-11.html</link>-->
            <link>http://www.entropy.ch/blog/Links/2006/10/11/del-icio-us-Links-on-2006-10-11.html</link>
            <description>&lt;ul class=&quot;delicious&quot;&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://unixjunkie.blogspot.com/2006/10/launchservices-from-root-daemon.html&quot;&gt;Unixjunkie Blog: LaunchServices From a &lt;code&gt;root&lt;/code&gt; Daemon?&lt;/a&gt; &lt;/div&gt;
		&lt;div class=&quot;delicious-extended&quot;&gt; Lots of bootstrap context info, a problem I am fighting with myself in an application &lt;/div&gt;		&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/mac&quot;&gt;mac&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/unix&quot;&gt;unix&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/macosx&quot;&gt;macosx&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/launchd&quot;&gt;launchd&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
&lt;/ul&gt;
</description>
            <guid>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2006-10-11.html</guid>
			<pubDate>Wed, 11 Oct 2006 23:02:40 +0200</pubDate>
                    </item>
        	            <item>
            <title>The Chronoliths</title>
            <!--<link>http://www.entropy.ch/blog/Books/?permalink=The-Chronoliths.html</link>-->
            <link>http://www.entropy.ch/blog/Books/2006/10/08/The-Chronoliths.html</link>
            <description>&lt;a class=&quot;img&quot; href=&quot;http://www.amazon.com/gp/redirect.html%3FASIN=0812545249%26tag=wwwentropych-20%26lcode=xm2%26cID=2025%26ccmID=165953%26location=/o/ASIN/0812545249%253FSubscriptionId=02ZH6J1W0649DTNS6002&quot;&gt;&lt;img class=&quot;blog_entry_icon&quot; src=&quot;http://ec1.images-amazon.com/images/P/0812545249.01._SCMZZZZZZZ_V1056495354_.jpg&quot; /&gt;&lt;/a&gt;

&lt;p&gt;Just finished another Science Fiction Novel by Charles Wilson:&lt;/p&gt;

&lt;blockquote&gt;American software developer Scott Warden is living a careless expatriate life on the beaches of 21st century Thailand when a monolithic pillar, sheathed in ice and composed of an unknown, indestructible material, appears in the jungle. The artifact is a chronolith, a memorial commemorating the conquest of Thailand--20 years in the future. As Warden follows his estranged wife and badly injured daughter back to the U.S., more chronoliths celebrating future victories appear, to devastating effect. Bangkok and Jerusalem are destroyed, and societies worldwide dissolve in chaos or teeter on the brink of collapse. As the chronoliths close in on America, Scott joins with biker and undercover agent Hitch Paley and experimental physicist Sue Chopra in a literal race against time to find a way to change the future--which has already happened. &lt;em&gt;--Cynthia Ward&lt;/em&gt;&lt;/blockquote&gt;

&lt;p&gt;I think I’ll order Wilson’s bestselling book “Darwinia” next :-)&lt;/p&gt;

&lt;br clear=&quot;all&quot; /&gt;
</description>
            <guid>http://www.entropy.ch/blog/Books/?permalink=The-Chronoliths.html</guid>
			<pubDate>Sun, 8 Oct 2006 02:10:40 +0200</pubDate>
                    </item>
        	            <item>
            <title>NetBeans Mac customization</title>
            <!--<link>http://www.entropy.ch/blog/Developer/?permalink=NetBeans-Mac-customization.html</link>-->
            <link>http://www.entropy.ch/blog/Developer/2006/10/05/NetBeans-Mac-customization.html</link>
            <description>&lt;p&gt;I’ve used Eclipse for my previous Java coding projects, especially for servlets, XML, graphics and web services projects, and I’ve been very happy with it.&lt;/p&gt;

&lt;p&gt;For a new project which focuses more on client-side Swing GUI than server-side web technologies, I am using NetBeans 5.5 with its &lt;a href=&quot;http://form.netbeans.org/&quot;&gt;Matisse&lt;/a&gt; GUI builder, and after working with it for a while I am impressed by what I see.&lt;/p&gt;

&lt;p&gt;Writing code in an editor/IDE involves many personal preferences and I got the impression that I can get NetBeans and especially its text editing keyboard shortcuts to match the Mac conventions more closely. I am totally used to BBEdit and Cocoa text view shortcuts, I use shortcuts a lot, and I find it very distracting when they are different, especially the ones for navigation and text selection.&lt;/p&gt;

&lt;p&gt;Some issues might seem minor but they irritate me when they occur. For example there are two different actions for &lt;q&gt;move to start of line&lt;/q&gt; and &lt;q&gt;move to start of text on line&lt;/q&gt; in NetBeans and I can choose which one I need. I could never get Eclipse to make ⌘-⇠ move the cursor all the way to the very start of a line, &lt;em&gt;including&lt;/em&gt; the leading whitespace in non-Java sources.&lt;/p&gt;

&lt;p&gt;NetBeans also made other customizations easy, for example it works well with my coding font, &lt;a href=&quot;http://www.lucasfonts.com/lucasfnt/thesansmocd/sansmocd-.html&quot;&gt;&lt;q&gt;LucasFonts TheSans Mono Condensed Five&lt;/q&gt;&lt;/a&gt;. (It doesn’t look so hot on that web page, but when rendered with Apple’s subpixel anti-aliasing it looks fantastic). To get that to work right in Eclipse I always had to disable the other fonts in the same font family because Eclipse would use a different font (in the same family) than the one I actually picked.&lt;/p&gt;

&lt;p&gt;The Matisse GUI Editor and the GroupLayout manager really do make Swing GUI development a lot easier. It’s not Cocoa/InterfaceBuilder yet, but definitely nicer than what I used before for Java user interfaces. (BTW &lt;a href=&quot;http://publicobject.com/glazedlists/&quot;&gt;GlazedLists&lt;/a&gt; is a killer library which provides collection classes with event handling and propagation smarts. It comes rather close to Cocoa Bindings and eliminates quite a bit of controller code). I am usually wary of tools that generate source code, but Matisse implements it quite nicely, with a clean separation between system- and user-generated code. Switching back and forth between code and layout view and making changes in both never caused problems.&lt;/p&gt;

&lt;p&gt;I use some hairy nested GUI panels and NetBeans’ navigator panel in the layout mode allowed me to look at and work on each nesting level in isolation.&lt;/p&gt;

&lt;p&gt;Java code editing is supported very well, with lots of smart tools that boost productivity. The user interface is logical, pretty much everything is where I expect to find it. It also looks quite good, nice toolbar icon artwork, few obvious visual glitches.&lt;/p&gt;

&lt;p&gt;The build system is Ant-based, which is what I always wanted from a Java IDE. Most of my projects are built and/or packaged with automated, command-line based processes so that is a perfect fit.&lt;/p&gt;

&lt;p&gt;Following are some random NetBeans customization notes if you come from a Mac/BBEdit background like me.&lt;/p&gt;

&lt;p&gt;Install the camelCase plugins by &lt;a href=&quot;http://blogs.sun.com/scblog/entry/netbeans_module_update_center&quot;&gt;Sandip Chitale&lt;/a&gt;. I am hooked on camelCase navigation/selection with the ^ ⇠ / ^ ⇢ keys ever since BBEdit added them in the last version.&lt;/p&gt;

&lt;p&gt;Here’s what I think Mac text editing keyboard shortcuts should be :-) This is a major reason why I like NetBeans so much, I was able to configure it almost perfectly to this setup. Again it might sound weird to put such an emphasis on this issue, but I switch coding environments a lot (BBEdit, Xcode, Java IDEs, Cocoa text views, AppleScript editor etc.) and differing shortcuts introduce a lot of mental friction, which is the last thing I need when writing software.&lt;/p&gt;

&lt;table&gt;
&lt;col width=&quot;70&quot;/&gt;
&lt;col width=&quot;70&quot;/&gt;
&lt;tr&gt;&lt;td&gt;⌘ ⇡&lt;/td&gt;&lt;td&gt;⌘ ⇣&lt;/td&gt;&lt;td&gt;Insertion Point to Beginning/End of Document&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;⌘ ⇠&lt;/td&gt;&lt;td&gt;⌘ ⇢&lt;/td&gt;&lt;td&gt;Insertion Point to Beginning/End of Line&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;⌥ ⇠&lt;/td&gt;&lt;td&gt;⌥ ⇢&lt;/td&gt;&lt;td&gt;Insertion Point to Previous/Next Word&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;^ ⇠&lt;/td&gt;&lt;td&gt;^ ⇢&lt;/td&gt;&lt;td&gt;Previous/Next Camel Case Position&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;⌘ ⇧ ⇡&lt;/td&gt;&lt;td&gt;⌘ ⇧ ⇣&lt;/td&gt;&lt;td&gt;Extend Selection to Beginning/End of Document&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;⌘ ⇧ ⇠&lt;/td&gt;&lt;td&gt;⌘ ⇧ ⇢&lt;/td&gt;&lt;td&gt;Extend Selection to Beginning/End of Line&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;⌥ ⇧ ⇠&lt;/td&gt;&lt;td&gt;⌥ ⇧ ⇢&lt;/td&gt;&lt;td&gt;Extend Selection Back/to Next Word&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;^ ⇧ ⇠&lt;/td&gt;&lt;td&gt;^ ⇧ ⇢&lt;/td&gt;&lt;td&gt;Select to Previous/Next Camel Case Position&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;⌘ ⌫&lt;/td&gt;&lt;td&gt;⌘ ⌦&lt;/td&gt;&lt;td&gt;Cut from Insertion Point to Line Beginning/End&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;⌥ ⌫&lt;/td&gt;&lt;td&gt;⌥ ⌦&lt;/td&gt;&lt;td&gt;Delete Previous/Next Word&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;^ ⌫&lt;/td&gt;&lt;td&gt;^ ⌦&lt;/td&gt;&lt;td&gt;Delete to Previous/Next Camel Case Position&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;⌘ ⌥ ⌫&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Delete Line&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;^ L&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Select Line&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;⌘ ⇧ Z&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Redo&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;⌘ B&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Build&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;⌘ R&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Run&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;⌘ J&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Go to Line&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;⌘ ^ J&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Go to Javadoc (because F-keys are inconvenient on a laptop)&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;The only tiny difference left is that ⌥ ⇢ includes the whitespace after the word in NetBeans, but doesn’t in BBEdit/Cocoa. Also, Select Line doesn’t select the trailing line break.&lt;/p&gt;

&lt;p&gt;Most of these actions are in the &lt;q&gt;Other&lt;/q&gt; category, where I didn’t look for them until I read &lt;a href=&quot;http://www.tbray.org/ongoing/When/200x/2006/02/25/NetBeans-Annoyances&quot;&gt;this posting&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;As a Cocoa text view side note, ^-L is a special short cut which was originally inspired by BBEdit’s ⌘-L but I moved it to ^-L when I configured it in Cocoa’s text bindings to make it available in all Cocoa text views, including programs like Apple Mail. It’s configured like this in my ~/Library/KeyBindings/DefaultKeyBinding.dict:&lt;/p&gt;

&lt;div class=&quot;code&quot;&gt;{
    &quot;^l&quot; = &quot;selectLine:&quot;;    /* Ctrl-l    = select line */
}&lt;/div&gt;

&lt;p&gt;Selecting the entire current line is quite useful, I often use it followed immediately by the delete key to delete the current line.&lt;/p&gt;

&lt;p&gt;One thing I miss is hitting ⌘-E to put the selection into the find clipboard. I often use that together with ⌘-G to immediately find the next occurrence of the string without bringing up the Find dialog. I often capture the find string in one document and switch to a different one to invoke Find Next there without ever seeing a Find dialog. I might need to write a NetBeans plugin for &lt;q&gt;Use Selection for Find&lt;/q&gt; :-).&lt;/p&gt;

&lt;p&gt;While I was writing this blog entry, NetBeans was updated from 5.5beta2 to 5.5RC1 and I lost all my customizations when I switched, that wasn’t so nice. So (mostly as a note to myself for next time) here’s my list of customizations for setting up a fresh copy of NetBeans:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Download and install the profiler&lt;/li&gt;
&lt;li&gt;Add Sandip Chitale’s plugin update channel and then hit the update center to load up on his and Sun-supplied plugins&lt;/li&gt;
&lt;li&gt;Prefs: Auto Update - Every Startup (because I’m an update junkie :-)&lt;/li&gt;
&lt;li&gt;Prefs: Customize coding font&lt;/li&gt;
&lt;li&gt;Prefs: Setup keyboard shortcuts&lt;/li&gt;
&lt;li&gt;Prefs: Color &gt; Highlighting &gt; Selected Text -&gt; Black Foreground, OS X selection color Background (because the default inverted white-on-gray text is really weird).&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://net3x.blogspot.com/2006/10/changing-font-size-in-netbeans.html&quot;&gt;Reduce font size&lt;/a&gt; because the default is too big and clunky&lt;/li&gt;
&lt;li&gt;Hide Edit, File and other unused toolbars&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Code templates:&lt;/p&gt;

&lt;div class=&quot;code&quot;&gt;
// Abbreviation if1
if (${condition}) ${cursor};
&lt;/div&gt;

&lt;div class=&quot;code&quot;&gt;
// Abbreviation if2
if (${condition}) {
    ${cursor};
}
&lt;/div&gt;
</description>
            <guid>http://www.entropy.ch/blog/Developer/?permalink=NetBeans-Mac-customization.html</guid>
			<pubDate>Thu, 5 Oct 2006 05:31:20 +0200</pubDate>
                    </item>
        	            <item>
            <title>Practical Demon-Keeping</title>
            <!--<link>http://www.entropy.ch/blog/Books/?permalink=Practical-Demon-Keeping.html</link>-->
            <link>http://www.entropy.ch/blog/Books/2006/09/28/Practical-Demon-Keeping.html</link>
            <description>&lt;a class=&quot;img&quot; href=&quot;http://www.amazon.com/gp/redirect.html%3FASIN=0060735422%26tag=wwwentropych-20%26lcode=xm2%26cID=2025%26ccmID=165953%26location=/o/ASIN/0060735422%253FSubscriptionId=02ZH6J1W0649DTNS6002&quot;&gt;&lt;img class=&quot;blog_entry_icon&quot; src=&quot;http://images.amazon.com/images/P/0060735422.01._SCMZZZZZZZ_.jpg&quot; /&gt;&lt;/a&gt;

&lt;p&gt;I just finished this funny novel, it’s the debut novel of Christopher Moore, the author of the book &lt;a href=&quot;http://www.entropy.ch/blog/Books/2006/09/13/Lamb.html&quot;&gt;“Lamb”&lt;/a&gt; which I listed earlier.&lt;/p&gt;

&lt;blockquote&gt;
Good-natured, often funny, but excessively complicated tale that matches a people-eating demon against his reluctant master and the citizens of a small California town. First-novelist Moore throws in more plot twists than the Pacific Coast highway has curves. He obviously knows and is amused by the flawed but feisty denizens with which he inhabits Pine Grove, south of the Big Sur wilderness area. To this tourist town comes Travis O&#39;Hearn, a 20-year-old who, 70 years before, got saddled with a demon, Catch, who gave him eternal youth plus problems. Catch is sometimes under Travis&#39;s control but often not, particularly when he&#39;s hungry. Travis wants out, namely by finding an incantation that will return the demon to Hell. 
&lt;/blockquote&gt;

&lt;br clear=&quot;all&quot; /&gt;
</description>
            <guid>http://www.entropy.ch/blog/Books/?permalink=Practical-Demon-Keeping.html</guid>
			<pubDate>Thu, 28 Sep 2006 08:51:00 +0200</pubDate>
                    </item>
        	            <item>
            <title>Blog comments working again</title>
            <!--<link>http://www.entropy.ch/blog/Website/?permalink=Blog-comments-working-again.html</link>-->
            <link>http://www.entropy.ch/blog/Website/2006/09/27/Blog-comments-working-again.html</link>
            <description>&lt;p&gt;After a rather long time without blog comments, I was recently able to allow them again.&lt;/p&gt;

&lt;p&gt;Because of massive spam robot postings, I activated the Akismet service a while ago. Unfortunately it didn&#39;t work at all, it simply flagged &lt;em&gt;every&lt;/em&gt; comment, including the legitimate ones, as spam, not very helpful.&lt;/p&gt;

&lt;p&gt;I let it run like that for a while, effectively disabling comments, because when I switched it off the work I had to do every day to clean out the blog was even worse. So if you ever wrote a nice, long comment and it got killed, sorry about that :-)&lt;/p&gt;

&lt;p&gt;Next I tried to use a Math comment spam moderation plugin, where the user has to answer a simple math question, like “6 + 4”. If the answer is wrong or missing, as is the case with a spam robot posting, the comment is killed.&lt;/p&gt;

&lt;p&gt;Unfortunately I ran into technical difficulties, &lt;a href=&quot;http://sourceforge.net/mailarchive/forum.php?thread_id=30617169&amp;forum_id=31980&quot;&gt;cookie path mismatch issues&lt;/a&gt; in my proxied Tomcat/Apache setup. After those issues were resolved, the math comment moderation seems to work great, so I welcome your comments again :-)&lt;/p&gt;

</description>
            <guid>http://www.entropy.ch/blog/Website/?permalink=Blog-comments-working-again.html</guid>
			<pubDate>Wed, 27 Sep 2006 01:21:19 +0200</pubDate>
                    </item>
        	            <item>
            <title>Indexing Java SDK Docs with QuickSilver</title>
            <!--<link>http://www.entropy.ch/blog/Developer/?permalink=Indexing-Java-SDK-Docs-with-QuickSilver.html</link>-->
            <link>http://www.entropy.ch/blog/Developer/2006/09/26/Indexing-Java-SDK-Docs-with-QuickSilver.html</link>
            <description>&lt;p&gt;By now I am totally dependent on the ability to look up Cocoa or Java API reference documentation with &lt;a href=&quot;http://quicksilver.blacktree.com/&quot;&gt;QuickSilver&lt;/a&gt; (or &lt;a href=&quot;http://www.obdev.at/products/launchbar/index.html&quot;&gt;LaunchBar&lt;/a&gt; before that). If you&#39;re a developer and you don&#39;t use something like this already, you should definitely check it out.&lt;/p&gt;

&lt;img class=&quot;screenshot right&quot; src=&quot;/images/blog/2006-09-27-quicksilver-bezel.png&quot; /&gt;

&lt;p&gt;I can hit Cmd-Space to invoke QuickSilver, then type “nss” and after hitting Return I get immediate access to the NSString class documentation (when hacking Cocoa); or I can type “stri” and get the java.lang.String reference page. In the screenshot below, you can see that I typed “arrl” to look up “ArrayList”.&lt;/p&gt;

&lt;p&gt;Both the Cocoa and Java API documentation comes as a collection of HTML files, one neatly named file per library class, like NSString.html or HashMap.html. This is an ideal format for indexing into QuickSilver’s catalog using the File/Folder catalog scanner plugin. Being used to QuickSilver’s powerful options everywhere else in the program, I was really disappointed to see how incredibly lame this File/Foler plugin is. I expected a rich set of options to specify precisely which files and folders to include and exclude, possibly even with regular expressions.&lt;/p&gt;

&lt;p&gt;Unfortunately, there are no exclude options at all. This is a problem when trying to index Sun’s SDK Javadoc package: There are about 3500 HTML files for the standard Java classes in the package. Scattered throughout the directory hierarchy, there are “class-use” directories which contain another 3500 HTML files with the exact same class names, but this second set of files is not of interest and should be excluded. I was hoping to be able to set an exclude pattern for these “class-use” directories, something that’s possible in LaunchBar but not in QuickSilver.&lt;/p&gt;

&lt;p&gt;The result of indexing the documentation package this way is that every single class comes up with two entries in QuickSilver’s result list, one is the desired documentation page, and the other one is the unwanted class-use page. It’s completely unusable in this form.&lt;/p&gt;

&lt;p&gt;After ranting about the underwhelming scanner plugin, I’ll also present an easy workaround: Instead of using the File/Folder scanner, I added the “allclasses-frame.html” file into a new “J2SE-150” group in the catalog and set the “Include Contents” option to “HTML Links”. QuickSilver will parse the HTML file and since the file contains a long list of links to all the class pages, the result in the index is exactly what I want. As you can see in the screenshot, it picks up about 3200 classes.&lt;/p&gt;

&lt;img class=&quot;screenshot&quot; src=&quot;/images/blog/2006-09-27-quicksilver-catalog.png&quot;/&gt;
</description>
            <guid>http://www.entropy.ch/blog/Developer/?permalink=Indexing-Java-SDK-Docs-with-QuickSilver.html</guid>
			<pubDate>Tue, 26 Sep 2006 19:48:34 +0200</pubDate>
                    </item>
        	            <item>
            <title>del.icio.us Links on 2006-09-25</title>
            <!--<link>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2006-09-25.html</link>-->
            <link>http://www.entropy.ch/blog/Links/2006/09/25/del-icio-us-Links-on-2006-09-25.html</link>
            <description>&lt;ul class=&quot;delicious&quot;&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://www-128.ibm.com/developerworks/edu/j-dw-java-springswing-i.html&quot;&gt;Introduction to Spring using Swing&lt;/a&gt; &lt;/div&gt;
		&lt;div class=&quot;delicious-extended&quot;&gt; A great introduction to the popular Spring framework in the context of a Swing GUI application. Presented by IBM DeveloperWorks and well worth the registration PITA. &lt;/div&gt;		&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/spring&quot;&gt;spring&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/java&quot;&gt;java&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/swing&quot;&gt;swing&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/IOC&quot;&gt;IOC&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/gui&quot;&gt;gui&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
&lt;/ul&gt;
</description>
            <guid>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2006-09-25.html</guid>
			<pubDate>Mon, 25 Sep 2006 23:21:17 +0200</pubDate>
                    </item>
        	            <item>
            <title>PHP 5.1.6 Release 2 Package</title>
            <!--<link>http://www.entropy.ch/blog/Software/?permalink=PHP-5-1-6-Release-2-Package.html</link>-->
            <link>http://www.entropy.ch/blog/Software/2006/09/24/PHP-5-1-6-Release-2-Package.html</link>
            <description>&lt;p&gt;I re-released the PHP 5.1.6 package.&lt;/p&gt;

&lt;p&gt;You can find more information in the &lt;a href=&quot;http://www.entropy.ch/phpbb2/viewtopic.php?p=9075&quot;&gt;forum post&lt;/a&gt;.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Software/?permalink=PHP-5-1-6-Release-2-Package.html</guid>
			<pubDate>Sun, 24 Sep 2006 22:36:50 +0200</pubDate>
                    </item>
        	            <item>
            <title>del.icio.us Links on 2006-09-21</title>
            <!--<link>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2006-09-21.html</link>-->
            <link>http://www.entropy.ch/blog/Links/2006/09/21/del-icio-us-Links-on-2006-09-21.html</link>
            <description>&lt;ul class=&quot;delicious&quot;&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://www.thesneeze.com/mt-archives/cat_steve_dont_eat_it.php&quot;&gt;The Sneeze - Half zine.  Half blog.  Half not good with fractions.&lt;/a&gt; &lt;/div&gt;
		&lt;div class=&quot;delicious-extended&quot;&gt; Steve, Don&#39;t Eat It! Vol. 1 &lt;/div&gt;		&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/gross&quot;&gt;gross&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/food&quot;&gt;food&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/Humor&quot;&gt;Humor&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/Fun&quot;&gt;Fun&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
&lt;/ul&gt;
</description>
            <guid>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2006-09-21.html</guid>
			<pubDate>Thu, 21 Sep 2006 23:29:25 +0200</pubDate>
                    </item>
        	            <item>
            <title>The Curious Incident of the Dog in the Night-Time</title>
            <!--<link>http://www.entropy.ch/blog/Books/?permalink=The-Curious-Incident-of-the-Dog-in-the-Night-Time.html</link>-->
            <link>http://www.entropy.ch/blog/Books/2006/09/21/The-Curious-Incident-of-the-Dog-in-the-Night-Time.html</link>
            <description>&lt;a class=&quot;img&quot; href=&quot;http://www.amazon.com/gp/redirect.html%3FASIN=0385512104%26tag=wwwentropych-20%26lcode=xm2%26cID=2025%26ccmID=165953%26location=/o/ASIN/0385512104%253FSubscriptionId=02ZH6J1W0649DTNS6002&quot;&gt;&lt;img class=&quot;blog_entry_icon&quot; src=&quot;http://ec1.images-amazon.com/images/P/0385512104.01._SCMZZZZZZZ_.jpg&quot; /&gt;&lt;/a&gt;

I just finished this highly recommended novel, a very unusual read:

&lt;blockquote&gt;
&lt;em&gt;The Curious Incident of the Dog in the Night-Time&lt;/em&gt; is a murder mystery novel like no other. The detective, and narrator, is Christopher Boone. Christopher is fifteen and has Asperger’s Syndrome. He knows a very great deal about maths and very little about human beings. He loves lists, patterns and the truth. He hates the colours yellow and brown and being touched. He has never gone further than the end of the road on his own, but when he finds a neighbour’s dog murdered he sets out on a terrifying journey which will turn his whole world upside down.
&lt;/blockquote&gt;


&lt;br clear=&quot;all&quot; /&gt;
</description>
            <guid>http://www.entropy.ch/blog/Books/?permalink=The-Curious-Incident-of-the-Dog-in-the-Night-Time.html</guid>
			<pubDate>Thu, 21 Sep 2006 21:51:01 +0200</pubDate>
                    </item>
        	            <item>
            <title>Lamb</title>
            <!--<link>http://www.entropy.ch/blog/Books/?permalink=Lamb.html</link>-->
            <link>http://www.entropy.ch/blog/Books/2006/09/13/Lamb.html</link>
            <description>&lt;a class=&quot;img&quot; href=&quot;http://www.amazon.com/gp/redirect.html%3FASIN=0380813815%26tag=wwwentropych-20%26lcode=xm2%26cID=2025%26ccmID=165953%26location=/o/ASIN/0380813815%253FSubscriptionId=02ZH6J1W0649DTNS6002&quot;&gt;&lt;img class=&quot;blog_entry_icon&quot; src=&quot;http://images.amazon.com/images/P/0380813815.01._SCMZZZZZZZ_.jpg&quot; /&gt;&lt;/a&gt;

&lt;p&gt;A funny, very clever novel written from the perspective of Biff, Jesus Christ’s childhood pal:&lt;/p&gt;

&lt;blockquote&gt;While the Bible may be the word of God, transcribed by divinely inspired men, it does not provide a full (or even partial) account of the life of Jesus Christ. Lucky for us that Christopher Moore presents a funny, lighthearted satire of the life of Christ--from his childhood days up to his crucifixion--in Lamb: The Gospel According to Biff, Christ&#39;s Childhood Pal. This clever novel is surely blasphemy to some, but to others it&#39;s a coming-of-age story of the highest order.&lt;br /&gt;
--Michael Ferch&lt;/blockquote&gt;

&lt;br clear=&quot;all&quot; /&gt;
</description>
            <guid>http://www.entropy.ch/blog/Books/?permalink=Lamb.html</guid>
			<pubDate>Wed, 13 Sep 2006 19:16:11 +0200</pubDate>
                    </item>
        	            <item>
            <title>del.icio.us Links on 2006-09-12</title>
            <!--<link>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2006-09-12.html</link>-->
            <link>http://www.entropy.ch/blog/Links/2006/09/12/del-icio-us-Links-on-2006-09-12.html</link>
            <description>&lt;ul class=&quot;delicious&quot;&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://swinglabs.org/index.jsp&quot;&gt;SwingLabs Java™ Desktop Technology&lt;/a&gt; &lt;/div&gt;
		&lt;div class=&quot;delicious-extended&quot;&gt; SwingLabs is an Open Source laboratory for exploring new ways to make Swing applications easier to write, with improved performance and greater visual appeal. &lt;/div&gt;		&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/java&quot;&gt;java&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/gui&quot;&gt;gui&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/swing&quot;&gt;swing&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/desktop&quot;&gt;desktop&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
&lt;/ul&gt;
</description>
            <guid>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2006-09-12.html</guid>
			<pubDate>Tue, 12 Sep 2006 23:19:13 +0200</pubDate>
                    </item>
        	            <item>
            <title>Spin</title>
            <!--<link>http://www.entropy.ch/blog/Books/?permalink=Spin.html</link>-->
            <link>http://www.entropy.ch/blog/Books/2006/09/10/Spin.html</link>
            <description>&lt;a class=&quot;img&quot; href=&quot;http://www.amazon.com/gp/redirect.html%3FASIN=0765309386%26tag=wwwentropych-20%26lcode=xm2%26cID=2025%26ccmID=165953%26location=/o/ASIN/0765309386%253FSubscriptionId=02ZH6J1W0649DTNS6002&quot;&gt;&lt;img class=&quot;blog_entry_icon&quot; src=&quot;http://ec1.images-amazon.com/images/P/0765309386.01._SCMZZZZZZZ_.jpg&quot; /&gt;&lt;/a&gt;

&lt;p&gt;This is a great science fiction novel from 2005. It’s a real page-turner, one of those books you just can’t put down.&lt;/p&gt;

&lt;br clear=&quot;all&quot; /&gt;
</description>
            <guid>http://www.entropy.ch/blog/Books/?permalink=Spin.html</guid>
			<pubDate>Sun, 10 Sep 2006 13:39:49 +0200</pubDate>
                    </item>
        	            <item>
            <title>Joel on Software</title>
            <!--<link>http://www.entropy.ch/blog/Books/?permalink=Joel-on-Software.html</link>-->
            <link>http://www.entropy.ch/blog/Books/2006/09/10/Joel-on-Software.html</link>
            <description>&lt;a class=&quot;img&quot; href=&quot;http://www.amazon.com/gp/redirect.html%3FASIN=1590593898%26tag=wwwentropych-20%26lcode=xm2%26cID=2025%26ccmID=165953%26location=/o/ASIN/1590593898%253FSubscriptionId=02ZH6J1W0649DTNS6002&quot;&gt;&lt;img class=&quot;blog_entry_icon&quot; src=&quot;http://images.amazon.com/images/P/1590593898.01._SCMZZZZZZZ_.jpg&quot; /&gt;&lt;/a&gt;

&lt;p&gt;Joel Spolsky writes about software engineering on his well-known website &lt;a href=&quot;http://www.joelonsoftware.com/&quot;&gt;Joel on Software&lt;/a&gt;. He covers all sorts of topics, software engineering, the software business, user interface, platforms, people / teams etc.&lt;/p&gt;

&lt;p&gt;This book contains a collection of these articles. I like it a lot, there’s lots of useful advice, insight and surprising information in here, and it’s also funny which I value in computer books. If you work in the software business, this is a good read.&lt;/p&gt;

&lt;br clear=&quot;all&quot; /&gt;
</description>
            <guid>http://www.entropy.ch/blog/Books/?permalink=Joel-on-Software.html</guid>
			<pubDate>Sun, 10 Sep 2006 07:41:31 +0200</pubDate>
              	          <wfw:comment>http://www.entropy.ch/blojsom/commentapi/marc/Books/?permalink=Joel-on-Software.html</wfw:comment>
              <wfw:commentRss>http://www.entropy.ch/blog/Books/?permalink=Joel-on-Software.html&amp;page=comments&amp;flavor=rss2</wfw:commentRss>
                    </item>
        	            <item>
            <title>del.icio.us Links on 2006-08-29</title>
            <!--<link>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2006-08-29.html</link>-->
            <link>http://www.entropy.ch/blog/Links/2006/08/30/del-icio-us-Links-on-2006-08-29.html</link>
            <description>&lt;ul class=&quot;delicious&quot;&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://www.detailedbalance.net/glove-compartment/2006/04/18/os-x-java-15-javaawtheadless-and-death&quot;&gt;The Glove Compartment » OS X, Java 1.5, java.awt.headless, and death&lt;/a&gt; &lt;/div&gt;
				&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/java&quot;&gt;java&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/mac&quot;&gt;mac&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/macosx&quot;&gt;macosx&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/software&quot;&gt;software&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/tomcat&quot;&gt;tomcat&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/awt&quot;&gt;awt&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/headless&quot;&gt;headless&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/startupitemcontext&quot;&gt;startupitemcontext&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://cocoondev.org/daisy/features.html&quot;&gt;daisy cms / wiki feature overview (technical)&lt;/a&gt; &lt;/div&gt;
				&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/java&quot;&gt;java&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/cms&quot;&gt;cms&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/wiki&quot;&gt;wiki&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/cocoon&quot;&gt;cocoon&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/XML&quot;&gt;XML&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/daisy&quot;&gt;daisy&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
&lt;/ul&gt;
</description>
            <guid>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2006-08-29.html</guid>
			<pubDate>Wed, 30 Aug 2006 08:52:26 +0200</pubDate>
                    </item>
        	            <item>
            <title>PHP 5.1.6 package</title>
            <!--<link>http://www.entropy.ch/blog/Software/?permalink=PHP-5-1-6-package-1.html</link>-->
            <link>http://www.entropy.ch/blog/Software/2006/08/30/PHP-5-1-6-package-1.html</link>
            <description>&lt;p&gt;I updated the PHP 5 package to 5.1.6.&lt;/p&gt;

&lt;p&gt;You can find more information and a nice, shiny download link in the &lt;a href=&quot;http://www.entropy.ch/phpbb2/viewtopic.php?t=2410&quot;&gt;forum post&lt;/a&gt;.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Software/?permalink=PHP-5-1-6-package-1.html</guid>
			<pubDate>Wed, 30 Aug 2006 05:00:31 +0200</pubDate>
              	          <wfw:comment>http://www.entropy.ch/blojsom/commentapi/marc/Software/?permalink=PHP-5-1-6-package-1.html</wfw:comment>
              <wfw:commentRss>http://www.entropy.ch/blog/Software/?permalink=PHP-5-1-6-package-1.html&amp;page=comments&amp;flavor=rss2</wfw:commentRss>
                    </item>
        	            <item>
            <title>del.icio.us Links on 2006-08-24</title>
            <!--<link>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2006-08-24.html</link>-->
            <link>http://www.entropy.ch/blog/Links/2006/08/25/del-icio-us-Links-on-2006-08-24.html</link>
            <description>&lt;ul class=&quot;delicious&quot;&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://www.sitepoint.com/blogs/2006/07/28/oscon-2006-cross-site-ajax/&quot;&gt;SitePoint Blogs » OSCON 2006: Cross-site Ajax&lt;/a&gt; &lt;/div&gt;
				&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/ajax&quot;&gt;ajax&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/flash&quot;&gt;flash&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/cross-site&quot;&gt;cross-site&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/crossdomain&quot;&gt;crossdomain&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/mashup&quot;&gt;mashup&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/Javascript&quot;&gt;Javascript&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/xmlhttprequest&quot;&gt;xmlhttprequest&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
&lt;/ul&gt;
</description>
            <guid>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2006-08-24.html</guid>
			<pubDate>Fri, 25 Aug 2006 08:00:36 +0200</pubDate>
                    </item>
        	             <item>
            <title>PHP 5.1.5 package</title>
            <!--<link>http://www.entropy.ch/blog/?permalink=PHP-5-1-5-package.html</link>-->
            <link>http://www.entropy.ch/blog/2006/08/20/PHP-5-1-5-package.html</link>
            <description>&lt;p&gt;I updated the PHP 5 package to 5.1.5.&lt;/p&gt;

&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Update from PHP 5.1.4 to 5.1.5&lt;/li&gt;
&lt;li&gt;Added SNMP extension&lt;/li&gt;
&lt;li&gt;Added memcache extension&lt;/li&gt;
&lt;li&gt;Changed authorization flag in installer configuration from Admin to Root so it prompts for root authentication instead of silently upgrading to root without asking for a password, which is probably an Installer bug.&lt;/li&gt;
&lt;li&gt;Ownership of all files below /usr/local/php5/ set to root:wheel. This may not be updated for upgrade installs, so if you care about this you should issue &lt;code&gt;chown -R root:wheel /usr/local/php5/&lt;/code&gt; at least once.&lt;/li&gt;
&lt;li&gt;Zapped resource fork of postinstall script which means unpacking the downloaded file with StuffIt *might* work now, but I still don&#39;t recommend it.&lt;/li&gt;
&lt;li&gt;Added symbolic link from /usr/local/php5/lib/build to /usr/local/php5/lib/php/build so the &quot;/usr/local/php5/bin/phhpize&quot; and possibly other commands should be happy.&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;You can find download information in the &lt;a href=&quot;http://www.entropy.ch/phpbb2/viewtopic.php?p=8977&quot;&gt;forum post&lt;/a&gt;.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/?permalink=PHP-5-1-5-package.html</guid>
			<pubDate>Sun, 20 Aug 2006 18:19:55 +0200</pubDate>
                    </item>
        	             <item>
            <title>del.icio.us Links on 2006-08-16</title>
            <!--<link>http://www.entropy.ch/blog/?permalink=del-icio-us-Links-on-2006-08-16.html</link>-->
            <link>http://www.entropy.ch/blog/2006/08/16/del-icio-us-Links-on-2006-08-16.html</link>
            <description>&lt;ul class=&quot;delicious&quot;&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://www.w3.org/TR/soap12-part0/&quot;&gt;SOAP Version 1.2 Part 0: Primer&lt;/a&gt; &lt;/div&gt;
				&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/soap&quot;&gt;soap&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/webservices&quot;&gt;webservices&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/xml&quot;&gt;xml&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/web&quot;&gt;web&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://www-128.ibm.com/developerworks/webservices/library/ws-tip-namespace.html&quot;&gt;Web services programming tips and tricks: Handle namespaces in SOAP messages you create by hand&lt;/a&gt; &lt;/div&gt;
				&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/soap&quot;&gt;soap&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/webservices&quot;&gt;webservices&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/wsdl&quot;&gt;wsdl&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/xml&quot;&gt;xml&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/namespaces&quot;&gt;namespaces&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://www-128.ibm.com/developerworks/webservices/library/ws-whichwsdl/?ca=dgr-devx-WebServicesMVP03&quot;&gt;Which style of WSDL should I use?&lt;/a&gt; &lt;/div&gt;
				&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/wsdl&quot;&gt;wsdl&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/webservices&quot;&gt;webservices&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/soap&quot;&gt;soap&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/xml&quot;&gt;xml&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
&lt;/ul&gt;
</description>
            <guid>http://www.entropy.ch/blog/?permalink=del-icio-us-Links-on-2006-08-16.html</guid>
			<pubDate>Wed, 16 Aug 2006 23:17:14 +0200</pubDate>
                    </item>
        	            <item>
            <title>Using AppleScript and openssl to View Mail.app S/MIME Signatures</title>
            <!--<link>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Using-AppleScript-and-openssl-to-View-Mail-app-S-MIME-Signatures.html</link>-->
            <link>http://www.entropy.ch/blog/Mac+OS+X/2006/08/08/Using-AppleScript-and-openssl-to-View-Mail-app-S-MIME-Signatures.html</link>
            <description>&lt;p&gt;This script displays the certificate chain of an S/MIME-signed message selected in the list view of Mail.app.&lt;/p&gt;

&lt;p&gt;I saved it into my ~/Library/Scripts/Applications/Mail directory which makes it show up in the AppleScript menu whenever Mail.app is the active application. You can (and should) enable the AppleScript menu using the AppleScript Utility.&lt;/p&gt;

&lt;div class=&quot;code&quot;&gt;tell application &quot;Mail&quot;
	
	set msglist to selection
	repeat with msg in msglist
		
		set rawsource to source of msg
		
		if rawsource contains &quot;multipart/signed&quot; then
			set quotedsource to quoted form of rawsource
			
			do shell script &quot;echo &#39;&amp;lt;pre&gt;&#39; &gt; /tmp/sigs.html&quot;
			set theResult to do shell script &quot;echo &quot; &amp;amp; quotedsource &amp;amp; &quot; | openssl smime -pk7out | openssl pkcs7 -print_certs -noout -text &gt;&gt; /tmp/sigs.html&quot;
			do shell script &quot;echo &#39;&amp;lt;/pre&gt;&#39; &gt;&gt; /tmp/sigs.html&quot;
			
			do shell script &quot;open /tmp/sigs.html&quot;
			delay 1
			do shell script &quot;rm /tmp/sigs.html&quot;
		end if
		
	end repeat
	
end tell&lt;/div&gt;
</description>
            <guid>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Using-AppleScript-and-openssl-to-View-Mail-app-S-MIME-Signatures.html</guid>
			<pubDate>Tue, 8 Aug 2006 22:58:00 +0200</pubDate>
                    </item>
        	            <item>
            <title>Building mod_gzip.so as Universal Binary</title>
            <!--<link>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Building-mod-gzip-so-as-Universal-Binary.html</link>-->
            <link>http://www.entropy.ch/blog/Mac+OS+X/2006/07/31/Building-mod-gzip-so-as-Universal-Binary.html</link>
            <description>Here&amp;#8217;s how to build a Universal Binary version of the &lt;a href=&quot;http://www.schroepl.net/projekte/mod_gzip/&quot;&gt;mod_gzip&lt;/a&gt; Apache Module.

&lt;p&gt;Download the source from &lt;a href=&quot;http://sourceforge.net/projects/mod-gzip/&quot;&gt;http://sourceforge.net/projects/mod-gzip/&lt;/a&gt;. Take the source package named mod_gzip-version.tgz&lt;/p&gt;

&lt;p&gt;Unpack the distribution. I had to change the Makefile to the following. Only the APXS and build: lines are different:&lt;/p&gt;

&lt;div class=&quot;code&quot;&gt;APXS?=/usr/sbin/apxs
RM=/bin/rm

build:
	$(APXS) -Wl,-arch -Wl,i386 -Wl,-arch -Wl,ppc -Wc,-arch -Wc,ppc -Wc,-arch -Wc,i386 -c mod_gzip.c mod_gzip_debug.c mod_gzip_compress.c -o mod_gzip.so

install:
	$(APXS) -A -i mod_gzip.so

clean:
	$(RM) -rf *.o

distclean: clean
	$(RM) -f mod_gzip.so&lt;/div&gt;

&lt;p&gt;Now run &quot;make&quot;. I moved the resulting mod_gzip.so file to /usr/libexec/httpd and added these lines to /etc/httpd/httpd.conf:&lt;/p&gt;

&lt;div class=&quot;code&quot;&gt;LoadModule gzip_module  libexec/httpd/mod_gzip.so
AddModule mod_gzip.c&lt;/div&gt;

For your convenience, here&amp;#8217;s the compiled module, at version 1.3.26.1a: &lt;a href=&quot;http://www2.entropy.ch/download/mod_gzip.so&quot;&gt;http://www2.entropy.ch/download/mod_gzip.so&lt;/a&gt;.
</description>
            <guid>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Building-mod-gzip-so-as-Universal-Binary.html</guid>
			<pubDate>Mon, 31 Jul 2006 14:42:43 +0200</pubDate>
                    </item>
        	            <item>
            <title>Mac OS X Installer Security Issue?</title>
            <!--<link>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Mac-OS-X-Installer-Security-Issue.html</link>-->
            <link>http://www.entropy.ch/blog/Mac+OS+X/2006/07/30/Mac-OS-X-Installer-Security-Issue.html</link>
            <description>The PHP 5 packages available on this site triggered an interesting &lt;a href=&quot;http://discussions.apple.com/thread.jspa?threadID=575176&quot;&gt;discussion&lt;/a&gt; about a potential Installer.app security issue.
</description>
            <guid>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Mac-OS-X-Installer-Security-Issue.html</guid>
			<pubDate>Sun, 30 Jul 2006 11:56:40 +0200</pubDate>
                    </item>
        	            <item>
            <title>Interarchy AppleScript: Edit a Group of Files Together in a New BBEdit Window</title>
            <!--<link>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Interarchy-AppleScript-Edit-a-Group-of-Files-Together-in-a-New-BBEdit-Window.html</link>-->
            <link>http://www.entropy.ch/blog/Mac+OS+X/2006/07/26/Interarchy-AppleScript-Edit-a-Group-of-Files-Together-in-a-New-BBEdit-Window.html</link>
            <description>&lt;p&gt;My SFTP client of choice Interarchy and my text editor of choice BBEdit already work together very well. Hitting Cmd-J in Interarchy sends the file to BBEdit for editing and hitting Cmd-S in BBEdit uploads the file back to the server where it came from.&lt;/p&gt;

&lt;p&gt;Since I usually have 10-20 code files open in BBEdit at the same time, I keep related ones together in the same editor window, switching between them with BBEdit&amp;#8217;s Document Drawer.&lt;/p&gt;

&lt;p&gt;Interarchy&amp;#8217;s Edit With BBEdit command sends the selected files to the frontmost BBEdit window, but often that is not what I want. What I want is to open the file or files together in a fresh BBEdit window, and I don&amp;#8217;t want to have to remember to open up a new one in BBEdit before switching to Interarchy. Opening a new BBEdit window also adds an &amp;#8220;untitled&amp;#8221; document which I have to close after my documents are loaded.&lt;/p&gt;

&lt;p&gt;The AppleScript below does exactly what I want, including closing those untitled documents. I saved it in my ~/Library/Scripts/Applications/Interarchy folder and used a &lt;a href=&quot;http://quicksilver.blacktree.com/&quot;&gt;QuickSilver&lt;/a&gt; trigger to assign the keyboard shortcut Cmd-Option-J (i.e. a variation of Cmd-J) to it.&lt;/p&gt;


&lt;div class=&quot;code&quot;&gt;tell application &quot;BBEdit&quot;
	make new window
end tell


tell application &quot;Interarchy&quot;
	
	set selected to selection of window 1
	repeat with myfile in selected
		edit url (url of myfile)
	end repeat
	
end tell

tell application &quot;BBEdit&quot;
	repeat with doc in text documents of window 1
		if name of doc begins with &quot;untitled text&quot; then
			close doc
		end if
	end repeat
end tell&lt;/div&gt;
</description>
            <guid>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Interarchy-AppleScript-Edit-a-Group-of-Files-Together-in-a-New-BBEdit-Window.html</guid>
			<pubDate>Wed, 26 Jul 2006 10:16:08 +0200</pubDate>
                    </item>
        	            <item>
            <title>New Tourist Remover feature at snapmania.com</title>
            <!--<link>http://www.entropy.ch/blog/Links/?permalink=New-Tourist-Remover-feature-at-snapmania-com.html</link>-->
            <link>http://www.entropy.ch/blog/Links/2006/07/21/New-Tourist-Remover-feature-at-snapmania-com.html</link>
            <description>&lt;p&gt;Our online photo manager &lt;a href=&quot;http://www.snapmania.com&quot;&gt;snapmania.com&lt;/a&gt; recently got a cool new feature called “Tourist Remover”. It removes unwanted moving objects like people or passing cars from a scene. It takes 3 or more pictures of the same scene taken in succession as input and calculates the background area of the images.&lt;/p&gt;

&lt;p&gt;Check out the Tourist remover at &lt;a href=&quot;http://www.snapmania.com/info/en/trm/&quot;&gt;http://www.snapmania.com/info/en/trm/&lt;/a&gt;. Take a look at the &lt;a href=&quot;http://www.snapmania.com/users/touristremover/gallery/&quot;&gt;Gallery&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We also started offering a free account so you should definitely take a look :-)&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Links/?permalink=New-Tourist-Remover-feature-at-snapmania-com.html</guid>
			<pubDate>Fri, 21 Jul 2006 12:54:53 +0200</pubDate>
                    </item>
        	            <item>
            <title>Periodically Run iSync if Mobile Phone is in Bluetooth Range</title>
            <!--<link>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Periodically-Run-iSync-if-Mobile-Phone-is-in-Bluetooth-Range.html</link>-->
            <link>http://www.entropy.ch/blog/Mac+OS+X/2006/07/04/Periodically-Run-iSync-if-Mobile-Phone-is-in-Bluetooth-Range.html</link>
            <description>&lt;p&gt;I was looking for a way to synchronize my mobile phone with iSync automatically every few hours. I already had an AppleScript which runs iSync, but I only wanted the system to attempt synchronization when the mobile phone is actually present on the Bluetooth network.&lt;/p&gt;

&lt;p&gt;As I was planning to run this periodically as a Perl script from Tiger&amp;#8217;s &lt;a href=&quot;http://developer.apple.com/macosx/launchd.html&quot;&gt;launchd&lt;/a&gt;, I needed a way to get the list of available Bluetooth devices on the command line. As far as I know, Tiger doesn&amp;#8217;t have such a tool so I wrote one. It&amp;#8217;s called &amp;#8220;bluelist&amp;#8221; and you can download it &lt;a href=&quot;http://www2.entropy.ch/download/bluelist&quot;&gt;here&lt;/a&gt;. I put it into a &lt;tt&gt;bin&lt;/tt&gt; directory in my home directory (&lt;tt&gt;~/bin/bluelist&lt;/tt&gt;).&lt;/p&gt;

&lt;p&gt;bluelist simply outputs a list of device names:&lt;/p&gt;

&lt;div class=&quot;code&quot;&gt;Foo&amp;#8217;s PowerBook G4 17&quot;
Marcs P800
K750i&lt;/div&gt;

&lt;p&gt;I use this list in the main Perl script which I store as &lt;tt&gt;~/bin/isync.pl&lt;/tt&gt;:&lt;/p&gt;

&lt;div class=&quot;code&quot;&gt;#!/usr/bin/perl
#

use strict;
use warnings;

my $FLAGFILE = &quot;/var/tmp/last-isync-date&quot;;
my $DEVICENAME = &quot;Marcs P800&quot;;

my $age = ((-M $FLAGFILE) || 0) * 24;

exit if ($age &amp;amp;&amp;amp; $age &amp;lt; 12 || !`$ENV{HOME}/bin/bluelist | grep -i &#39;$DEVICENAME&#39;`);

system(&quot;osascript $ENV{HOME}/Library/Scripts/iSync.scpt; touch $FLAGFILE&quot;);&lt;/div&gt;

&lt;p&gt;This invokes the following AppleScript, which I keep in &lt;tt&gt;~/Library/Scripts/iSync.scpt&lt;/tt&gt;:&lt;/p&gt;

&lt;div class=&quot;code&quot;&gt;tell application &quot;iSync&quot;
	
	if not syncing then
		synchronize
		repeat while syncing
			delay 1
		end repeat
		quit
	end if
	
end tell&lt;/div&gt;

&lt;p&gt;And finally, to run it periodically, I use this launchd script which I store in &lt;tt&gt;~/Library/LaunchDaemons/ch.entropy.isync.plist&lt;/tt&gt;:&lt;/p&gt;

&lt;div class=&quot;code&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&amp;lt;!DOCTYPE plist PUBLIC &quot;-//Apple Computer//DTD PLIST 1.0//EN&quot; &quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&quot;&gt;
&amp;lt;plist version=&quot;1.0&quot;&gt;
&amp;lt;dict&gt;
	&amp;lt;key&gt;Label&amp;lt;/key&gt;
	&amp;lt;string&gt;ch.entropy.isync&amp;lt;/string&gt;
	&amp;lt;key&gt;ProgramArguments&amp;lt;/key&gt;
	&amp;lt;array&gt;
		&amp;lt;string&gt;/Users/liyanage/bin/isync.pl&amp;lt;/string&gt;
	&amp;lt;/array&gt;
	&amp;lt;key&gt;LowPriorityIO&amp;lt;/key&gt;
	&amp;lt;true/&gt;
	&amp;lt;key&gt;Nice&amp;lt;/key&gt;
	&amp;lt;integer&gt;1&amp;lt;/integer&gt;
	&amp;lt;key&gt;StartCalendarInterval&amp;lt;/key&gt;
	&amp;lt;dict&gt;
		&amp;lt;key&gt;Hour&amp;lt;/key&gt;
		&amp;lt;integer&gt;11&amp;lt;/integer&gt;
		&amp;lt;key&gt;Minute&amp;lt;/key&gt;
		&amp;lt;integer&gt;00&amp;lt;/integer&gt;
	&amp;lt;/dict&gt;
&amp;lt;/dict&gt;
&amp;lt;/plist&gt;&lt;/div&gt;

&lt;p&gt;Update: Will Harris wrote an improved version of bluelist which also lists non-discoverable but paired devices. You can get it at &lt;a href=&quot;http://will.harris.ch/bluelist.gz&quot;&gt;http://will.harris.ch/bluelist.gz&lt;/a&gt;. Thanks Will :-)&lt;/p&gt;

&lt;p&gt;Update: I realized that launchd&amp;#8217;s StartCalendarInterval is broken. I switched to StartInterval:&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;&amp;lt;key&gt;StartInterval&amp;lt;/key&gt;
&amp;lt;integer&gt;43200&amp;lt;/integer&gt;&lt;/div&gt;
</description>
            <guid>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Periodically-Run-iSync-if-Mobile-Phone-is-in-Bluetooth-Range.html</guid>
			<pubDate>Tue, 4 Jul 2006 14:04:12 +0200</pubDate>
                    </item>
        	            <item>
            <title>WWDC Ticket for Sale</title>
            <!--<link>http://www.entropy.ch/blog/Developer/?permalink=WWDC-Ticket-for-Sale.html</link>-->
            <link>http://www.entropy.ch/blog/Developer/2006/07/03/WWDC-Ticket-for-Sale.html</link>
            <description>&lt;p&gt;I have a WWDC e-ticket but I can’t make it to San Francisco at the conference date this year so I’m selling it. If you’re interested, send me an e-mail with your offer :-) Payment will be via PayPal...&lt;/p&gt;

&lt;p&gt;My e-mail address is on the “About” page...&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Developer/?permalink=WWDC-Ticket-for-Sale.html</guid>
			<pubDate>Mon, 3 Jul 2006 16:19:29 +0200</pubDate>
                    </item>
        	            <item>
            <title>Looking for a Developer With Java GUI Skills</title>
            <!--<link>http://www.entropy.ch/blog/Developer/?permalink=Looking-for-a-Developer-With-Java-GUI-Skills.html</link>-->
            <link>http://www.entropy.ch/blog/Developer/2006/07/03/Looking-for-a-Developer-With-Java-GUI-Skills.html</link>
            <description>&lt;p&gt;We’re looking for a software engineer with Java GUI skills at &lt;a href=&quot;http://www.futurelab.ch&quot;&gt;futureLAB&lt;/a&gt;. Right now we have a three-month contracting job and we might have a permanent position afterwards.&lt;/p&gt;

&lt;p&gt;If you’re interested, please &lt;a href=&quot;mailto:info AT futurelab DOT ch&quot;&gt;e-mail&lt;/a&gt; the usual documents.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Developer/?permalink=Looking-for-a-Developer-With-Java-GUI-Skills.html</guid>
			<pubDate>Mon, 3 Jul 2006 07:35:47 +0200</pubDate>
              	          <wfw:comment>http://www.entropy.ch/blojsom/commentapi/marc/Developer/?permalink=Looking-for-a-Developer-With-Java-GUI-Skills.html</wfw:comment>
              <wfw:commentRss>http://www.entropy.ch/blog/Developer/?permalink=Looking-for-a-Developer-With-Java-GUI-Skills.html&amp;page=comments&amp;flavor=rss2</wfw:commentRss>
                    </item>
        	            <item>
            <title>del.icio.us Links on 2006-06-16</title>
            <!--<link>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2006-06-16.html</link>-->
            <link>http://www.entropy.ch/blog/Links/2006/06/16/del-icio-us-Links-on-2006-06-16.html</link>
            <description>&lt;ul class=&quot;delicious&quot;&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://www.flightlab.com/~joe/sgml/faq-not.txt&quot;&gt;Not the comp.text.sgml Frequently Asked Questions List&lt;/a&gt; &lt;/div&gt;
		&lt;div class=&quot;delicious-extended&quot;&gt; Funny Non-FAQ about SGML, XML, markup etc. &lt;/div&gt;		&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/development&quot;&gt;development&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/funny&quot;&gt;funny&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/markup&quot;&gt;markup&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/sgml&quot;&gt;sgml&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/xml&quot;&gt;xml&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
&lt;/ul&gt;
</description>
            <guid>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2006-06-16.html</guid>
			<pubDate>Fri, 16 Jun 2006 23:48:35 +0200</pubDate>
                    </item>
        	            <item>
            <title>del.icio.us Links on 2006-06-08</title>
            <!--<link>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2006-06-08.html</link>-->
            <link>http://www.entropy.ch/blog/Links/2006/06/08/del-icio-us-Links-on-2006-06-08.html</link>
            <description>&lt;ul class=&quot;delicious&quot;&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://www.darrenhobbs.com/archives/2002/09/classforname_is.html&quot;&gt;Darren Hobbs: Class.forName() is evil.... We&#39;ve all&lt;/a&gt; &lt;/div&gt;
				&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/develop&quot;&gt;develop&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/java&quot;&gt;java&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
&lt;/ul&gt;
</description>
            <guid>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2006-06-08.html</guid>
			<pubDate>Thu, 8 Jun 2006 23:48:10 +0200</pubDate>
                    </item>
        	            <item>
            <title>del.icio.us Links on 2006-06-07</title>
            <!--<link>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2006-06-07.html</link>-->
            <link>http://www.entropy.ch/blog/Links/2006/06/07/del-icio-us-Links-on-2006-06-07.html</link>
            <description>&lt;ul class=&quot;delicious&quot;&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://kevinblanc.com/lauschsicht/&quot;&gt;| kevin blanc | lauschsicht |&lt;/a&gt; &lt;/div&gt;
		&lt;div class=&quot;delicious-extended&quot;&gt; My friend Kevin Blanc made this cool video &lt;/div&gt;		&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/compositing&quot;&gt;compositing&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/zurich&quot;&gt;zurich&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
&lt;/ul&gt;
</description>
            <guid>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2006-06-07.html</guid>
			<pubDate>Wed, 7 Jun 2006 23:48:09 +0200</pubDate>
                    </item>
        	            <item>
            <title>Exporting Images from FileMaker DB fields</title>
            <!--<link>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Exporting-Images-from-FileMaker-DB-fields.html</link>-->
            <link>http://www.entropy.ch/blog/Mac+OS+X/2006/06/03/Exporting-Images-from-FileMaker-DB-fields.html</link>
            <description>&lt;p&gt;I found out that exporting images from a FileMaker database is a major pain. Here&amp;#8217;s what I came up with, I&amp;#8217;d be interested to hear about better ways to do this.&lt;/p&gt;

&lt;p&gt;Sice FileMaker&amp;#8217;s export commands cannot export the container fields used to hold image fields, the goal is to get an XML export of the regular data and a bunch of image files in a directory. The filenames must correspond to some key field in the database so that the exported records can be linked with their images.&lt;/p&gt;

&lt;p&gt;To export the images automatically from a FileMaker script, I had to combine FileMaker scripting, AppleScript and shell scripting.&lt;/p&gt;

&lt;p&gt;The core of the solution is to use the clipboard to get at the image data:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;iterate through the records&lt;/li&gt;
&lt;li&gt;copy the content of the image container field to the clipboard&lt;/li&gt;
&lt;li&gt;use the AppleScript file manipulation functions to open a file&lt;/li&gt;
&lt;li&gt;write the clipboard contents to the file&lt;/li&gt;
&lt;li&gt;close the file&lt;/li&gt;
&lt;li&gt;move the file to the destination directory with a unique filename determined by a DB field&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A difficult part is that the image filename is different for every record so the AppleScript code is dynamic and must be generated in a FileMaker script expression. The generated AppleScript code itself uses shell commands so there are three levels of quoting.&lt;/p&gt;

&lt;p&gt;Another issue is that the code that writes the clipboard contents to the file worked fine in &lt;a href=&quot;http://www.latenightsw.com&quot;&gt;Script Debugger&lt;/a&gt;, but when used unchanged in FileMaker, FileMaker complained about the &lt;q&gt;write to file&lt;/q&gt; command. Turns out that there is a clash because the &lt;q&gt;write&lt;/q&gt; verb seems to mean something different in the context of AppleScript running inside FileMaker. I had to work around the issue by using the raw &lt;q&gt;chevron&lt;/q&gt; AppleScript syntax for that line.&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;s the &lt;q&gt;native&lt;/q&gt; AppleScript for writing the image to a file:&lt;/p&gt;

&lt;div class=&quot;code&quot;&gt;set thePic to the clipboard
try
set thePic to JPEG picture of thePic

set thePath to (path to home folder as Unicode text) &amp;amp; &quot;picture001.jpeg&quot;
set fileRef to open for access file thePath with write permission
set eof fileRef to 0
&amp;#171;event rdwrwrit&amp;#187; thePic given &amp;#171;class refn&amp;#187;:fileRef
close access fileRef
on error
end try&lt;/div&gt;

&lt;p&gt;Here&amp;#8217;s the calculation expression to dynamically generate the AppleScript for moving the image to its final destination:&lt;/p&gt;

&lt;div class=&quot;code&quot;&gt;&quot;set thePicturePath to (path to home folder as Unicode text) &amp;amp; \&quot;picture001.jpeg\&quot;&quot; &amp;amp; &amp;#182;
&amp;amp; &quot;set theDirPath to (path to home folder as Unicode text) &amp;amp; \&quot;picture_export\&quot;&quot; &amp;amp; &amp;#182;
&amp;amp; &quot;set thePosixPicturePath to POSIX Path of thePicturePath&quot; &amp;amp; &amp;#182;
&amp;amp; &quot;set thePosixDirPath to POSIX Path of theDirPath&quot; &amp;amp; &amp;#182;
&amp;amp; &quot;set thePosixDestinationPath to thePosixDirPath &amp;amp; \&quot;/\&quot; &amp;amp; \&quot;&quot; &amp;amp; items::id &amp;amp; &quot;.jpeg\&quot;&quot; &amp;amp; &amp;#182;
&amp;amp; &quot;display dialog thePosixDestinationPath&quot; &amp;amp; &amp;#182;
&amp;amp; &quot;do shell script \&quot;test -f \&quot; &amp;amp; thePosixPicturePath &amp;amp; \&quot; &amp;amp;&amp;amp; mv \&quot; &amp;amp; thePosixPicturePath &amp;amp; \&quot; \&quot; &amp;amp; thePosixDestinationPath &amp;amp; \&quot;; true\&quot;&quot;&lt;/div&gt;

&lt;p&gt;Wow, how FileMaker still sucks after all these years... It&amp;#8217;s insane what has to be done to get something so easy to work.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Exporting-Images-from-FileMaker-DB-fields.html</guid>
			<pubDate>Sat, 3 Jun 2006 18:55:56 +0200</pubDate>
                    </item>
        	            <item>
            <title>Bitmap Layout Helper Tool</title>
            <!--<link>http://www.entropy.ch/blog/Software/?permalink=Bitmap-Layout-Helper-Tool.html</link>-->
            <link>http://www.entropy.ch/blog/Software/2006/06/03/Bitmap-Layout-Helper-Tool.html</link>
            <description>&lt;p&gt;I recently wrote a small inhouse bitmap measurement application and decided to generalize it a bit and realease it with source code. Maybe it&amp;#8217;s useful for someone else...&lt;/p&gt;

&lt;p&gt;My brother had to measure the position and dimensions of user interface elements, especially text fields, on a large bunch of dialog screenshots captured on Windows and Mac OS. There were four languages so he had to measure every field on every screenshot in four versions.&lt;/p&gt;

&lt;p&gt;I wrote a specialized Cocoa tool to speed up the task. It allows the user to drop an image into an image view and then drag and resize a small transparent box across the image. The box marks the rectangular area of interest and there is a button to capture its current coordinates. There is a text area which collects the captured coordinate strings. The dialog also lets the user choose a label/identifier for a particular rectangle, as well as a few color and font values.&lt;/p&gt;


&lt;img alt=&quot;Bitmap Layout Helper tool screenshot&quot; src=&quot;/software/macosx/bitmaplayouthelper/mainwindow.png&quot;&gt;&lt;/img&gt;

&lt;p&gt;Since practically every second shaved off this process counts, moving / resizing of the measurement box and capturing of a set of values are highly optimized with keyboard shortcuts. The idea is that after dropping a screenshot image into the image view, the hands stay on the keyboard while the box is being moved around and all areas are measured. Then the resulting list of coordinate/geometry strings is pasted elsewhere and the next image is dropped into the image view.&lt;/p&gt;

&lt;p&gt;In the first version of the program, the coordinates were output in a project-specific XML format, unusable for anyone else. In order to be useful for other people, it had to have a generic output format, or better yet a customizable one because manual post-processing of the output strings again wastes time.&lt;/p&gt;

&lt;p&gt;I first thought about offering a template string, editable in the preferences. The template string would contain special tokes (%x, %y etc.) which the program would replace with the coordinate values and options picked by the user in the user interface.&lt;/p&gt;

&lt;p&gt;The problem with this approach is that it&amp;#8217;s not clear which tokens to offer. For example, should the x/y coordinates be passed as absolute integers, percentage values of the image width, factor values of the image width, is zero at the top left or bottom left, is the rectangle defined by a point and a size or by two points etc.&lt;/p&gt;

&lt;p&gt;Anticipating and implementing all possible placeholders is a lot of work for me and no matter how many variants I offer, there will always be special use cases which can&amp;#8217;t be handled.&lt;/p&gt;

&lt;p&gt;The solution: I provide only one basic data format and allow the user to write a bit of JavaScript code which can access the values and format them freely. The pattern string is in effect a short JavaScript program which has access to two predefined objects which contain all the data.&lt;/p&gt;

&lt;p&gt;With this solution, the output format possibilities are unlimited, and because there is a full programming language instead of a dumb pattern string, there can even be additional post-processing, as seen in one of the examples which contains a mapping table for additional text inserted depending on the label field value chosen by the user.&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;s an example JavaScript snippet which produces an HTML client side image map rectangle:&lt;/p&gt;


&lt;div class=&quot;code&quot;&gt;var e = document.createElement(&quot;area&quot;);

e.setAttribute(&quot;shape&quot;, &quot;rect&quot;);

var x1 = box.x();
var y1 = box.y();
var x2 = box.x() + box.width();
var y2 = box.y() + box.height();

e.setAttribute(&quot;coords&quot;, x1 + &quot;,&quot; + y1 + &quot;,&quot; + x2 + &quot;,&quot; + y2);
e.setAttribute(&quot;href&quot;, settings.label);

str = e.outerHTML;
str = str.replace(/AREA/g, &quot;area&quot;);

str;&lt;/div&gt;

&lt;p&gt;Its output looks like this:&lt;/p&gt;

&lt;div class=&quot;code&quot;&gt;&amp;lt;area shape=&quot;rect&quot; coords=&quot;17,289,82,309&quot; href=&quot;foobar.html&quot;&gt;&amp;lt;/area&gt;&lt;/div&gt;

&lt;p&gt;Another script produces this output:&lt;/p&gt;

&lt;div class=&quot;code&quot;&gt;&amp;lt;?xml version=&#39;1.0&#39; ?&gt;
&amp;lt;field name=&#39;foobar.html&#39; x=&#39;0.038&#39; y=&#39;0.826&#39; w=&#39;0.144&#39; h=&#39;0.057&#39; color=&#39;ffffff&#39; fontcolor=&#39;000000&#39; boxcolor=&#39;ff0000&#39; box=&#39;false&#39; font=&#39;tahoma&#39; fontsize=&#39;10&#39;&gt;&amp;lt;#placeholder#&gt;&amp;lt;/field&gt;&lt;/div&gt;

&lt;p&gt;Here the coordinates are factors of the image dimensions and go from 0 to 1.&lt;/p&gt;

&lt;p&gt;I learned once again that easy things really are very easy in Cocoa; it took a few hours to get a working version, including learning (and re-learning and understanding for the first time) many new things about NSResponder and NSView programming. It was the first time I programmed a custom NSView that is interactive and draggable / resizable.&lt;/p&gt;

&lt;p&gt;Adding JavaScript support was also easy thanks to WebKit. I injected two of my Objective-C objects into the JavaScript scope according to the WebScripting informal protocol. (What tripped me up was that I had to implement &lt;code&gt;isSelectorExcludedFromWebScript:&lt;/code&gt; even though the docs say that the default is to allow method access).&lt;/p&gt;

&lt;p&gt;You can download the program on the &lt;a href=&quot;/software/macosx/#bitmaplayouthelper&quot;&gt;Mac OS X Software page&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Currently it is usable in all situations where you need to measure rectangular areas on images. If I find some time I might extend it to support other shapes. If you use it for something interesting, let me know. Also let me know what improvements / enhancements you&amp;#8217;d like to see.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Software/?permalink=Bitmap-Layout-Helper-Tool.html</guid>
			<pubDate>Sat, 3 Jun 2006 17:14:10 +0200</pubDate>
                    </item>
        	            <item>
            <title>Using Bookmarklets to Enhance Websites</title>
            <!--<link>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Using-Bookmarklets-to-Enhance-Websites.html</link>-->
            <link>http://www.entropy.ch/blog/Mac+OS+X/2006/06/03/Using-Bookmarklets-to-Enhance-Websites.html</link>
            <description>&lt;p&gt;Bookmarklets are useful to change the appearance or behavior of web sites which do something you don&amp;#8217;t like or don&amp;#8217;t so something you wish they did.&lt;/p&gt;

&lt;p&gt;I wanted a convenient menu with direct links to the RealAudio streams of the tracks on the music web site &lt;a href=&quot;http://www.samurai.fm&quot;&gt;http://www.samurai.fm&lt;/a&gt;. Clicking on the tracks opens an annoying player window and I prefer to listen to the streams externally, in RealPlayer.&lt;/p&gt;

&lt;p&gt;My bookmarklet injects some code to load additional JavaScript from my web server. That code builds the menu on a floating DIV.&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;s the code and below is the bookmarklet, try it out if you like the kind of music they offer there.&lt;/p&gt;

&lt;div class=&quot;code&quot;&gt;var d = document;
var h = d.getElementsByTagName(&#39;head&#39;).item(0);
var e = d.createElement(&#39;script&#39;);
e.setAttribute(&#39;src&#39;, &#39;http://www.entropy.ch/js/safari.fm.js&#39;);
h.appendChild(e);
window.setTimeout(&quot;load1(&#39;menudiv&#39;)&quot;, 500);&lt;/div&gt;

&lt;p&gt;&lt;a href=&quot;javascript:var d = document; var dce = d.createElement; var h = d.getElementsByTagName(&#39;head&#39;).item(0); var e = d.createElement(&#39;script&#39;); e.setAttribute(&#39;src&#39;, &#39;http://www.entropy.ch/js/safari.fm.js&#39;); h.appendChild(e); window.setTimeout(&amp;quot;load1(&#39;menudiv&#39;)&amp;quot;, 500);&quot;&gt;Bookmarklet&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To use it, bookmark this link, go to the web site and open the bookmark.&lt;/p&gt;

&lt;p&gt;Open issues: the main script inserts some additional script elements to load in some of the &lt;a href=&quot;http://script.aculo.us/&quot;&gt;scriptaculous&lt;/a&gt; libraries to make the DIV draggable. I have to stage the loading with &lt;code&gt;setTimeout&lt;/code&gt; calls which is neither elegant nor robust.&lt;/p&gt;


&lt;p&gt;Related to bookmarklets, I&amp;#8217;m also a big fan of combining AppleScript and JavaScript. Specifically, I use Safari&amp;#8217;s &lt;code&gt;do JavaScript&lt;/code&gt; AppleScript command often. It allows me to combine program logic in AppleScript with page manipulation, information extraction or form interaction/submission. I can tie a lot of different programs and even shell or Perl scripts together into one useful action which I invoke from the AppleScript menu bar item.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Using-Bookmarklets-to-Enhance-Websites.html</guid>
			<pubDate>Sat, 3 Jun 2006 17:00:03 +0200</pubDate>
              	          <wfw:comment>http://www.entropy.ch/blojsom/commentapi/marc/Mac+OS+X/?permalink=Using-Bookmarklets-to-Enhance-Websites.html</wfw:comment>
              <wfw:commentRss>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Using-Bookmarklets-to-Enhance-Websites.html&amp;page=comments&amp;flavor=rss2</wfw:commentRss>
                    </item>
        	            <item>
            <title>del.icio.us Links on 2006-06-02</title>
            <!--<link>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2006-06-02.html</link>-->
            <link>http://www.entropy.ch/blog/Links/2006/06/02/del-icio-us-Links-on-2006-06-02.html</link>
            <description>&lt;ul class=&quot;delicious&quot;&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://www-128.ibm.com/developerworks/java/library/j-drools/?ca=dnw-719&quot;&gt;Implement business logic with the Drools rules engine&lt;/a&gt; &lt;/div&gt;
				&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/frameworks&quot;&gt;frameworks&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/java&quot;&gt;java&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/rules&quot;&gt;rules&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://www.earthcode.com/ajax/2005/12/jslog.html&quot;&gt;Web 2.0 Technologies: JSLog - a Lightweight Ajax logger&lt;/a&gt; &lt;/div&gt;
				&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/ajax&quot;&gt;ajax&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/javascript&quot;&gt;javascript&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
&lt;/ul&gt;
</description>
            <guid>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2006-06-02.html</guid>
			<pubDate>Fri, 2 Jun 2006 23:46:29 +0200</pubDate>
                    </item>
        	            <item>
            <title>del.icio.us Links on 2006-06-01</title>
            <!--<link>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2006-06-01.html</link>-->
            <link>http://www.entropy.ch/blog/Links/2006/06/01/del-icio-us-Links-on-2006-06-01.html</link>
            <description>&lt;ul class=&quot;delicious&quot;&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://developer.mozilla.org/en/docs/AJAX:Getting_Started&quot;&gt;AJAX:Getting Started - MDC&lt;/a&gt; &lt;/div&gt;
				&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/ajax&quot;&gt;ajax&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/javascript&quot;&gt;javascript&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://www.onlamp.com/pub/a/onlamp/2005/05/19/xmlhttprequest.html&quot;&gt;ONLamp.com -- A Simpler Ajax Path&lt;/a&gt; &lt;/div&gt;
				&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/ajax&quot;&gt;ajax&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/javascript&quot;&gt;javascript&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
&lt;/ul&gt;
</description>
            <guid>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2006-06-01.html</guid>
			<pubDate>Thu, 1 Jun 2006 23:35:05 +0200</pubDate>
                    </item>
        	             <item>
            <title>PostgreSQL 8.1.4 Package</title>
            <!--<link>http://www.entropy.ch/blog/?permalink=PostgreSQL-8-1-4-Package.html</link>-->
            <link>http://www.entropy.ch/blog/2006/05/28/PostgreSQL-8-1-4-Package.html</link>
            <description>&lt;p&gt;There&#39;s a new package for PostgreSQL 8.1.4:&lt;/p&gt;

&lt;p&gt;See the &lt;a href=&quot;http://www.entropy.ch/phpbb2/viewtopic.php?p=8695&quot;&gt;forum post&lt;/a&gt; for details.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/?permalink=PostgreSQL-8-1-4-Package.html</guid>
			<pubDate>Sun, 28 May 2006 14:49:12 +0200</pubDate>
                    </item>
        	            <item>
            <title>Universal Binary PHP Module PHP 5.1.4 Release 5</title>
            <!--<link>http://www.entropy.ch/blog/Software/?permalink=Universal-Binary-PHP-Module-PHP-5-1-4-Release-5.html</link>-->
            <link>http://www.entropy.ch/blog/Software/2006/05/20/Universal-Binary-PHP-Module-PHP-5-1-4-Release-5.html</link>
            <description>&lt;p&gt;I posted a new PHP 5 module with some new extensions and including a new version for Apache 2.&lt;/p&gt;

&lt;p&gt;See the forum posting for details: &lt;a href=&quot;http://www.entropy.ch/phpbb2/viewtopic.php?t=2327&quot;&gt;http://www.entropy.ch/phpbb2/viewtopic.php?t=2327&lt;/a&gt;&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Software/?permalink=Universal-Binary-PHP-Module-PHP-5-1-4-Release-5.html</guid>
			<pubDate>Sat, 20 May 2006 22:30:09 +0200</pubDate>
                    </item>
        	            <item>
            <title>del.icio.us Links on 2006-05-16</title>
            <!--<link>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2006-05-16.html</link>-->
            <link>http://www.entropy.ch/blog/Links/2006/05/16/del-icio-us-Links-on-2006-05-16.html</link>
            <description>&lt;ul class=&quot;delicious&quot;&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://tuckey.org/urlrewrite/&quot;&gt;UrlRewriteFilter - Rewrite URL&#39;s in Java Web Application Servers&lt;/a&gt; &lt;/div&gt;
				&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/java&quot;&gt;java&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/rewrite&quot;&gt;rewrite&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/servlet&quot;&gt;servlet&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/tomcat&quot;&gt;tomcat&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/url&quot;&gt;url&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/web&quot;&gt;web&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
&lt;/ul&gt;
</description>
            <guid>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2006-05-16.html</guid>
			<pubDate>Tue, 16 May 2006 23:09:16 +0200</pubDate>
                    </item>
        	             <item>
            <title>Universal Binary Apache 2 configure Line</title>
            <!--<link>http://www.entropy.ch/blog/?permalink=Universal-Binary-Apache-2-configure-Line.html</link>-->
            <link>http://www.entropy.ch/blog/2006/05/12/Universal-Binary-Apache-2-configure-Line.html</link>
            <description>&lt;p&gt;A Universal Binary Apache 2 web server seems to be quite easy to build. Here’s the configure line I used:&lt;/p&gt;

&lt;div class=&quot;code&quot;&gt;CFLAGS=&quot;-arch ppc -arch i386 -isysroot /Developer/SDKs/MacOSX10.4u.sdk&quot; \
./configure \
--prefix=/usr/local/apache2 \
--enable-mods-shared=all \
--enable-proxy-balancer \
--enable-proxy-ajp \
--enable-proxy-http \
--enable-proxy-ftp \
--enable-proxy-connect \
--enable-proxy \
--enable-ssl \
--enable-so
&lt;/div&gt;

&lt;p&gt;You can download a compiled tarball &lt;a href=&quot;http://www2.entropy.ch/download/apache2-2.2.3-macosx-universal.tar.gz&quot;&gt;here&lt;/a&gt;. Unpack it in /usr/local and you’ll get the “apache2” directory.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/?permalink=Universal-Binary-Apache-2-configure-Line.html</guid>
			<pubDate>Fri, 12 May 2006 00:27:21 +0200</pubDate>
                    </item>
        	            <item>
            <title>Universal Binary PHP Module Preview updated to PHP 5.1.4</title>
            <!--<link>http://www.entropy.ch/blog/Software/?permalink=Universal-Binary-PHP-Module-Preview-updated-to-PHP-5-1-4.html</link>-->
            <link>http://www.entropy.ch/blog/Software/2006/05/04/Universal-Binary-PHP-Module-Preview-updated-to-PHP-5-1-4.html</link>
            <description>&lt;p&gt;Hot on the heels of PHP 5.1.3 comes 5.1.4 which fixes a &lt;a href=&quot;http://marc.theaimsgroup.com/?t=114665421600001&amp;r=1&amp;w=2&quot;&gt;critical bug in 5.1.3&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;See the details in the forum: &lt;a href=&quot;http://www.entropy.ch/phpbb2/viewtopic.php?p=8532&quot;&gt;http://www.entropy.ch/phpbb2/viewtopic.php?p=8532&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Please also read the previous posts of the past few days about the fundamental changes in these new packages.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Software/?permalink=Universal-Binary-PHP-Module-Preview-updated-to-PHP-5-1-4.html</guid>
			<pubDate>Thu, 4 May 2006 21:11:15 +0200</pubDate>
                    </item>
        	            <item>
            <title>Universal Binary PHP Module Preview updated to PHP 5.1.3</title>
            <!--<link>http://www.entropy.ch/blog/Software/?permalink=Universal-Binary-PHP-Module-Preview-updated-to-PHP-5-1-3.html</link>-->
            <link>http://www.entropy.ch/blog/Software/2006/05/02/Universal-Binary-PHP-Module-Preview-updated-to-PHP-5-1-3.html</link>
            <description>&lt;p&gt;I posted some more beta versions of the Universal Binary PHP module during the last few days. Today the PHP group published PHP 5.1.3 so I released a new package based on this version and including several bug fixes.&lt;/p&gt;

Please read about the known issues in the forum before installing these preview packages: &lt;a href=&quot;http://www.entropy.ch/phpbb2/viewtopic.php?p=8498&quot;&gt;http://www.entropy.ch/phpbb2/viewtopic.php?p=8498&lt;/a&gt;
</description>
            <guid>http://www.entropy.ch/blog/Software/?permalink=Universal-Binary-PHP-Module-Preview-updated-to-PHP-5-1-3.html</guid>
			<pubDate>Tue, 2 May 2006 23:05:00 +0200</pubDate>
                    </item>
        	            <item>
            <title>Universal Binary PHP Module Preview</title>
            <!--<link>http://www.entropy.ch/blog/Software/?permalink=Universal-Binary-PHP-Module-Preview.html</link>-->
            <link>http://www.entropy.ch/blog/Software/2006/04/29/Universal-Binary-PHP-Module-Preview.html</link>
            <description>&lt;p&gt;I posted a first beta version of the Universal Binary PHP Module:&lt;/p&gt;

&lt;a href=&quot;http://www.entropy.ch/phpbb2/viewtopic.php?p=8459&quot;&gt;http://www.entropy.ch/phpbb2/viewtopic.php?p=8459&lt;/a&gt;
</description>
            <guid>http://www.entropy.ch/blog/Software/?permalink=Universal-Binary-PHP-Module-Preview.html</guid>
			<pubDate>Sat, 29 Apr 2006 11:44:22 +0200</pubDate>
                    </item>
        	            <item>
            <title>Progress Report for Universal Binary PHP5 Package</title>
            <!--<link>http://www.entropy.ch/blog/Software/?permalink=Progress-Report-for-Universal-Binary-PHP5-Package.html</link>-->
            <link>http://www.entropy.ch/blog/Software/2006/04/26/Progress-Report-for-Universal-Binary-PHP5-Package.html</link>
            <description>&lt;p&gt;I posted some notes about the work on the not-yet-finished next release of the PHP5 package, which will be a Universal Binary.&lt;/p&gt;

&lt;p&gt;See the details in the forum post:&lt;/p&gt;

&lt;a href=&quot;http://www.entropy.ch/phpbb2/viewtopic.php?p=8452&quot;&gt;http://www.entropy.ch/phpbb2/viewtopic.php?p=8452&lt;/a&gt;
</description>
            <guid>http://www.entropy.ch/blog/Software/?permalink=Progress-Report-for-Universal-Binary-PHP5-Package.html</guid>
			<pubDate>Wed, 26 Apr 2006 00:19:48 +0200</pubDate>
                    </item>
        	             <item>
            <title>PostgreSQL 8.1.3 Package</title>
            <!--<link>http://www.entropy.ch/blog/?permalink=PostgreSQL-8-1-3-Package.html</link>-->
            <link>http://www.entropy.ch/blog/2006/04/23/PostgreSQL-8-1-3-Package.html</link>
            <description>&lt;p&gt;There&#39;s a new package for PostgreSQL 8.1.3:&lt;/p&gt;

&lt;p&gt;See the &lt;a href=&quot;http://www.entropy.ch/phpbb2/viewtopic.php?p=8444&quot;&gt;forum post&lt;/a&gt; for details.&lt;/p&gt;

</description>
            <guid>http://www.entropy.ch/blog/?permalink=PostgreSQL-8-1-3-Package.html</guid>
			<pubDate>Sun, 23 Apr 2006 13:28:40 +0200</pubDate>
                    </item>
        	             <item>
            <title>del.icio.us Links on 2006-04-07</title>
            <!--<link>http://www.entropy.ch/blog/?permalink=del-icio-us-Links-on-2006-04-07.html</link>-->
            <link>http://www.entropy.ch/blog/2006/04/07/del-icio-us-Links-on-2006-04-07.html</link>
            <description>&lt;ul class=&quot;delicious&quot;&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://hcs.harvard.edu/~jrus/Site/Cocoa%20Text%20System.html&quot;&gt;Customizing the Cocoa Text System&lt;/a&gt; &lt;/div&gt;
		&lt;div class=&quot;delicious-extended&quot;&gt; Lots of fun with Emacs-style keyboard shortcuts in Cocoa text entry fields &lt;/div&gt;		&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/cocoa&quot;&gt;cocoa&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/mac&quot;&gt;mac&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/macosx&quot;&gt;macosx&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://www.tldp.org/linuxfocus/English/May2004/article335.shtml&quot;&gt;lf335, SystemAdministration: Colorful Shells -- Using ANSI Color Codes&lt;/a&gt; &lt;/div&gt;
				&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/ansi&quot;&gt;ansi&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/color&quot;&gt;color&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/programming&quot;&gt;programming&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/shell&quot;&gt;shell&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/unix&quot;&gt;unix&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
&lt;/ul&gt;
</description>
            <guid>http://www.entropy.ch/blog/?permalink=del-icio-us-Links-on-2006-04-07.html</guid>
			<pubDate>Fri, 7 Apr 2006 23:40:14 +0200</pubDate>
                    </item>
        	             <item>
            <title>del.icio.us Links on 2006-04-05</title>
            <!--<link>http://www.entropy.ch/blog/?permalink=del-icio-us-Links-on-2006-04-05.html</link>-->
            <link>http://www.entropy.ch/blog/2006/04/05/del-icio-us-Links-on-2006-04-05.html</link>
            <description>&lt;ul class=&quot;delicious&quot;&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://www.cppreference.com/&quot;&gt;C/C++ Reference&lt;/a&gt; &lt;/div&gt;
		&lt;div class=&quot;delicious-extended&quot;&gt; Useful C++ Reference &lt;/div&gt;		&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/c++&quot;&gt;c++&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/compiler&quot;&gt;compiler&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/development&quot;&gt;development&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/programming&quot;&gt;programming&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/reference&quot;&gt;reference&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://www.immoagent.ch/&quot;&gt;ImmoAgent.ch - Das etwas andere Schweizer ImmoPortal&lt;/a&gt; &lt;/div&gt;
		&lt;div class=&quot;delicious-extended&quot;&gt; Ein neuer Stern am CH Immobilien-Website Himmel :-) &lt;/div&gt;		&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/immobilien&quot;&gt;immobilien&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/switzerland&quot;&gt;switzerland&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/zurich&quot;&gt;zurich&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
&lt;/ul&gt;
</description>
            <guid>http://www.entropy.ch/blog/?permalink=del-icio-us-Links-on-2006-04-05.html</guid>
			<pubDate>Wed, 5 Apr 2006 23:40:05 +0200</pubDate>
                    </item>
        	            <item>
            <title>del.icio.us Links on 2006-04-04</title>
            <!--<link>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2006-04-04.html</link>-->
            <link>http://www.entropy.ch/blog/Links/2006/04/04/del-icio-us-Links-on-2006-04-04.html</link>
            <description>&lt;ul class=&quot;delicious&quot;&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://n.ethz.ch/student/naegelic/ac3/index.php&quot;&gt;AC3 QuickTime Component for Intel Macs&lt;/a&gt; &lt;/div&gt;
		&lt;div class=&quot;delicious-extended&quot;&gt; Just what was missing for my Front Row experience :-) &lt;/div&gt;		&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/apple&quot;&gt;apple&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/audio&quot;&gt;audio&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/mac&quot;&gt;mac&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/quicktime&quot;&gt;quicktime&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/video&quot;&gt;video&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://web.mac.com/kaicherry/iWeb/TheCabaal/Dark%20Ten/8F6C946F-54D4-45D7-8BDD-0D3B2D8B385C.html&quot;&gt;Another AC3 QuickTime Component for Intel Macs&lt;/a&gt; &lt;/div&gt;
		&lt;div class=&quot;delicious-extended&quot;&gt; Another AC3 codec. Unfortuantely both crash when I try to play an AC3 movie &lt;/div&gt;		&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/ac3&quot;&gt;ac3&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/audio&quot;&gt;audio&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/intel&quot;&gt;intel&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/mac&quot;&gt;mac&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/macbook&quot;&gt;macbook&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/quicktime&quot;&gt;quicktime&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/video&quot;&gt;video&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
&lt;/ul&gt;
</description>
            <guid>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2006-04-04.html</guid>
			<pubDate>Tue, 4 Apr 2006 23:21:56 +0200</pubDate>
                    </item>
        	            <item>
            <title>del.icio.us Links on 2006-04-03</title>
            <!--<link>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2006-04-03.html</link>-->
            <link>http://www.entropy.ch/blog/Links/2006/04/03/del-icio-us-Links-on-2006-04-03.html</link>
            <description>&lt;ul class=&quot;delicious&quot;&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://chuqui.typepad.com/teal_sunglasses/2006/04/what_i_do_for_a.html&quot;&gt;Teal Sunglasses: What I do for a living...&lt;/a&gt; &lt;/div&gt;
		&lt;div class=&quot;delicious-extended&quot;&gt; All about the Reality Distortion Field... &lt;/div&gt;		&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/apple&quot;&gt;apple&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/funny&quot;&gt;funny&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
&lt;/ul&gt;
</description>
            <guid>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2006-04-03.html</guid>
			<pubDate>Mon, 3 Apr 2006 23:21:53 +0200</pubDate>
                    </item>
        	            <item>
            <title>del.icio.us Links on 2006-04-01</title>
            <!--<link>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2006-04-01.html</link>-->
            <link>http://www.entropy.ch/blog/Links/2006/04/01/del-icio-us-Links-on-2006-04-01.html</link>
            <description>&lt;ul class=&quot;delicious&quot;&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://www.openqrm.org/&quot;&gt;OpenQRM - Open Resource Manager - Home&lt;/a&gt; &lt;/div&gt;
		&lt;div class=&quot;delicious-extended&quot;&gt; open source data center management solution, automatic server provisioning &lt;/div&gt;		&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/system:unfiled&quot;&gt;system:unfiled&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
&lt;/ul&gt;
</description>
            <guid>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2006-04-01.html</guid>
			<pubDate>Sat, 1 Apr 2006 23:21:49 +0200</pubDate>
                    </item>
        	            <item>
            <title>del.icio.us Links on 2006-03-31</title>
            <!--<link>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2006-03-31.html</link>-->
            <link>http://www.entropy.ch/blog/Links/2006/03/31/del-icio-us-Links-on-2006-03-31.html</link>
            <description>&lt;ul class=&quot;delicious&quot;&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://sventon.berlios.de/index.php?page=main&quot;&gt;sventon - subversion repository browser&lt;/a&gt; &lt;/div&gt;
		&lt;div class=&quot;delicious-extended&quot;&gt; Might be my replacement vor ViewVC &lt;/div&gt;		&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/java&quot;&gt;java&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/programming&quot;&gt;programming&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/servlet&quot;&gt;servlet&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/subversion&quot;&gt;subversion&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://www.springide.org/project&quot;&gt;Spring IDE - Trac&lt;/a&gt; &lt;/div&gt;
				&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/eclipse&quot;&gt;eclipse&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/java&quot;&gt;java&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/programming&quot;&gt;programming&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/spring&quot;&gt;spring&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
&lt;/ul&gt;
</description>
            <guid>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2006-03-31.html</guid>
			<pubDate>Fri, 31 Mar 2006 23:21:45 +0200</pubDate>
                    </item>
        	            <item>
            <title>del.icio.us Links on 2006-03-29</title>
            <!--<link>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2006-03-29.html</link>-->
            <link>http://www.entropy.ch/blog/Links/2006/03/29/del-icio-us-Links-on-2006-03-29.html</link>
            <description>&lt;ul class=&quot;delicious&quot;&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://recycle-logs.sourceforge.net/&quot;&gt;Documentation&lt;/a&gt; &lt;/div&gt;
				&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/software&quot;&gt;software&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/unix&quot;&gt;unix&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://www.boost.org/tools/build/jam_src/index.html&quot;&gt;Boost.Jam&lt;/a&gt; &lt;/div&gt;
				&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/develop&quot;&gt;develop&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/programming&quot;&gt;programming&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://www.gamesfromwithin.com/articles/0412/000061.html#cxxtest&quot;&gt;Games from Within: Exploring the C++ Unit Testing Framework Jungle&lt;/a&gt; &lt;/div&gt;
		&lt;div class=&quot;delicious-extended&quot;&gt; A comparison of C++ unit testing frameworks &lt;/div&gt;		&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/c++&quot;&gt;c++&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/programming&quot;&gt;programming&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/unit-testing&quot;&gt;unit-testing&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
&lt;/ul&gt;
</description>
            <guid>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2006-03-29.html</guid>
			<pubDate>Wed, 29 Mar 2006 23:21:44 +0200</pubDate>
                    </item>
        	            <item>
            <title>del.icio.us Links on 2006-03-20</title>
            <!--<link>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2006-03-20.html</link>-->
            <link>http://www.entropy.ch/blog/Links/2006/03/20/del-icio-us-Links-on-2006-03-20.html</link>
            <description>&lt;ul class=&quot;delicious&quot;&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://www.bpmn.org/&quot;&gt;BPMN Information Home&lt;/a&gt; &lt;/div&gt;
		&lt;div class=&quot;delicious-extended&quot;&gt; Business Process Modeling Notation &lt;/div&gt;		&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/BPEL&quot;&gt;BPEL&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/BPM&quot;&gt;BPM&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/BPMN&quot;&gt;BPMN&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/Modeling&quot;&gt;Modeling&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/Process&quot;&gt;Process&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/UML&quot;&gt;UML&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/architecture&quot;&gt;architecture&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/design&quot;&gt;design&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
&lt;/ul&gt;
</description>
            <guid>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2006-03-20.html</guid>
			<pubDate>Mon, 20 Mar 2006 23:45:30 +0100</pubDate>
                    </item>
        	            <item>
            <title>del.icio.us Links on 2006-03-18</title>
            <!--<link>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2006-03-18.html</link>-->
            <link>http://www.entropy.ch/blog/Links/2006/03/18/del-icio-us-Links-on-2006-03-18.html</link>
            <description>&lt;ul class=&quot;delicious&quot;&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://dabbledb.com/utr/&quot;&gt;Dabble DB: 7 Minute Video&lt;/a&gt; &lt;/div&gt;
				&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/system:unfiled&quot;&gt;system:unfiled&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
&lt;/ul&gt;
</description>
            <guid>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2006-03-18.html</guid>
			<pubDate>Sat, 18 Mar 2006 23:45:34 +0100</pubDate>
                    </item>
        	            <item>
            <title>del.icio.us Links on 2006-03-17</title>
            <!--<link>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2006-03-17.html</link>-->
            <link>http://www.entropy.ch/blog/Links/2006/03/17/del-icio-us-Links-on-2006-03-17.html</link>
            <description>&lt;ul class=&quot;delicious&quot;&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://www.iecc.com/gclist/GC-faq.html&quot;&gt;Garbage Collection FAQ -- draft&lt;/a&gt; &lt;/div&gt;
		&lt;div class=&quot;delicious-extended&quot;&gt; Lots of interesting information about garbage collection &lt;/div&gt;		&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/compiler&quot;&gt;compiler&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/memory-management&quot;&gt;memory-management&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/programming&quot;&gt;programming&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/software&quot;&gt;software&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://www.markshuttleworth.com/&quot;&gt;Mark Shuttleworth&lt;/a&gt; &lt;/div&gt;
				&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/blogs&quot;&gt;blogs&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
&lt;/ul&gt;
</description>
            <guid>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2006-03-17.html</guid>
			<pubDate>Fri, 17 Mar 2006 23:45:31 +0100</pubDate>
                    </item>
        	             <item>
            <title>del.icio.us Links on 2006-03-07</title>
            <!--<link>http://www.entropy.ch/blog/?permalink=del-icio-us-Links-on-2006-03-07.html</link>-->
            <link>http://www.entropy.ch/blog/2006/03/07/del-icio-us-Links-on-2006-03-07.html</link>
            <description>&lt;ul class=&quot;delicious&quot;&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://shellcity.net/cgi-bin/DB_Search/db_search.cgi?setup_file=topicpage.setup.cgi&amp;amp;submit_search=yes&amp;amp;topic=Z&quot;&gt;SHELL EXTENSION CITY, millions of free Windows power tools, explorer enhancements, windows add-ons, tweaks, system utilities, freeware, ie5&lt;/a&gt; &lt;/div&gt;
				&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/tips&quot;&gt;tips&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/windows&quot;&gt;windows&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
&lt;/ul&gt;
</description>
            <guid>http://www.entropy.ch/blog/?permalink=del-icio-us-Links-on-2006-03-07.html</guid>
			<pubDate>Tue, 7 Mar 2006 23:15:54 +0100</pubDate>
                    </item>
        	             <item>
            <title>del.icio.us Links on 2006-03-06</title>
            <!--<link>http://www.entropy.ch/blog/?permalink=del-icio-us-Links-on-2006-03-06.html</link>-->
            <link>http://www.entropy.ch/blog/2006/03/06/del-icio-us-Links-on-2006-03-06.html</link>
            <description>&lt;ul class=&quot;delicious&quot;&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://www.oreillynet.com/pub/a/mac/2005/10/11/what-is-quartz.html?page=1&quot;&gt;O&#39;Reilly Network -- What Is Quartz (or Why Can&#39;t Windows Do That)&lt;/a&gt; &lt;/div&gt;
				&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/2d-graphics&quot;&gt;2d-graphics&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/apple&quot;&gt;apple&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/compositing&quot;&gt;compositing&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/mac&quot;&gt;mac&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/macosx&quot;&gt;macosx&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/quartz&quot;&gt;quartz&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://www.quantdec.com/GIS/affine.htm&quot;&gt;Affine Transformations&lt;/a&gt; &lt;/div&gt;
				&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/graphics&quot;&gt;graphics&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/programming&quot;&gt;programming&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://www.svgopen.org/2005/papers/abstractsvgopen/&quot;&gt;Understand Compositing and Color extensions in SVG 1.2 in 30 minutes!&lt;/a&gt; &lt;/div&gt;
				&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/2d-graphics&quot;&gt;2d-graphics&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/compositing&quot;&gt;compositing&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/porter-duff&quot;&gt;porter-duff&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/svg&quot;&gt;svg&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://www.zugakousaku.com/index.cgi?quartz&amp;amp;samples&amp;amp;en&amp;amp;&quot;&gt;Futurismo Zugakousaku&lt;/a&gt; &lt;/div&gt;
		&lt;div class=&quot;delicious-extended&quot;&gt; A gallery of some amazing Quartz Composer demos &lt;/div&gt;		&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/design&quot;&gt;design&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/graphics&quot;&gt;graphics&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/mac&quot;&gt;mac&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/macosx&quot;&gt;macosx&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/programming&quot;&gt;programming&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/quartz&quot;&gt;quartz&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
&lt;/ul&gt;
</description>
            <guid>http://www.entropy.ch/blog/?permalink=del-icio-us-Links-on-2006-03-06.html</guid>
			<pubDate>Mon, 6 Mar 2006 23:15:16 +0100</pubDate>
                    </item>
        	            <item>
            <title>del.icio.us Links on 2006-02-28</title>
            <!--<link>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2006-02-28.html</link>-->
            <link>http://www.entropy.ch/blog/Links/2006/02/28/del-icio-us-Links-on-2006-02-28.html</link>
            <description>&lt;ul class=&quot;delicious&quot;&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://dri.freedesktop.org/~jonsmirl/graphics.html&quot;&gt;The State of Linux Graphics&lt;/a&gt; &lt;/div&gt;
				&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/system:unfiled&quot;&gt;system:unfiled&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
&lt;/ul&gt;
</description>
            <guid>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2006-02-28.html</guid>
			<pubDate>Tue, 28 Feb 2006 23:14:55 +0100</pubDate>
                    </item>
        	            <item>
            <title>del.icio.us Links on 2006-02-25</title>
            <!--<link>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2006-02-25.html</link>-->
            <link>http://www.entropy.ch/blog/Links/2006/02/25/del-icio-us-Links-on-2006-02-25.html</link>
            <description>&lt;ul class=&quot;delicious&quot;&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://support.microsoft.com/default.aspx?scid=kb;en-us;247815&quot;&gt;Necessary criteria for fonts to be available in a command window&lt;/a&gt; &lt;/div&gt;
				&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/fonts&quot;&gt;fonts&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/windows&quot;&gt;windows&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
&lt;/ul&gt;
</description>
            <guid>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2006-02-25.html</guid>
			<pubDate>Sat, 25 Feb 2006 23:14:32 +0100</pubDate>
                    </item>
        	            <item>
            <title>del.icio.us Links on 2006-02-24</title>
            <!--<link>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2006-02-24.html</link>-->
            <link>http://www.entropy.ch/blog/Links/2006/02/24/del-icio-us-Links-on-2006-02-24.html</link>
            <description>&lt;ul class=&quot;delicious&quot;&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://www.ifixit.com/Guide/85.1.0.html&quot;&gt;MacBook Pro disassembly instructions&lt;/a&gt; &lt;/div&gt;
		&lt;div class=&quot;delicious-extended&quot;&gt; Because I know I&#39;ll have one sooner or later :-) &lt;/div&gt;		&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/apple&quot;&gt;apple&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/hardware&quot;&gt;hardware&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/mac&quot;&gt;mac&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/macbook&quot;&gt;macbook&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/powerbook&quot;&gt;powerbook&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
&lt;/ul&gt;
</description>
            <guid>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2006-02-24.html</guid>
			<pubDate>Fri, 24 Feb 2006 23:14:29 +0100</pubDate>
                    </item>
        	            <item>
            <title>del.icio.us Links on 2006-02-21</title>
            <!--<link>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2006-02-21.html</link>-->
            <link>http://www.entropy.ch/blog/Links/2006/02/21/del-icio-us-Links-on-2006-02-21.html</link>
            <description>&lt;ul class=&quot;delicious&quot;&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://mblog.lib.umich.edu/~rdivecha/archives/2006/02/the_world_of_sm.html&quot;&gt;Vic Divecha&#39;s Tech Blog: The World of Smartboards, Sympodiums is about to change&lt;/a&gt; &lt;/div&gt;
		&lt;div class=&quot;delicious-extended&quot;&gt; Interaction with a large smart board, I want one! &lt;/div&gt;		&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/interaction&quot;&gt;interaction&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
&lt;/ul&gt;
</description>
            <guid>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2006-02-21.html</guid>
			<pubDate>Tue, 21 Feb 2006 23:23:51 +0100</pubDate>
                    </item>
        	            <item>
            <title>del.icio.us Links on 2006-02-17</title>
            <!--<link>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2006-02-17.html</link>-->
            <link>http://www.entropy.ch/blog/Links/2006/02/17/del-icio-us-Links-on-2006-02-17.html</link>
            <description>&lt;ul class=&quot;delicious&quot;&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://paste.lisp.org/&quot;&gt;paste.lisp.org pastebin&lt;/a&gt; &lt;/div&gt;
				&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/Chat&quot;&gt;Chat&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/design&quot;&gt;design&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/irc&quot;&gt;irc&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/lisp&quot;&gt;lisp&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/paste&quot;&gt;paste&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/pastebin&quot;&gt;pastebin&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/programming&quot;&gt;programming&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
&lt;/ul&gt;
</description>
            <guid>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2006-02-17.html</guid>
			<pubDate>Fri, 17 Feb 2006 23:58:55 +0100</pubDate>
                    </item>
        	            <item>
            <title>del.icio.us Links on 2006-02-12</title>
            <!--<link>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2006-02-12.html</link>-->
            <link>http://www.entropy.ch/blog/Links/2006/02/12/del-icio-us-Links-on-2006-02-12.html</link>
            <description>&lt;ul class=&quot;delicious&quot;&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://www.epsg.org.uk/pub/warnock/warnock_01.html&quot;&gt;EPSG: John Warnock&#39;s Lovelace Lecture 2004&lt;/a&gt; &lt;/div&gt;
		&lt;div class=&quot;delicious-extended&quot;&gt; The Invention of PostScript and Acrobat – small innovations that had a big impact. John Warnock gave the 2004 &quot;Lovelace Lecture&quot; before an audience of members of the British Computer Society at a conference centre in West London on Thursday, 13th May. &lt;/div&gt;		&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/adobe&quot;&gt;adobe&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/fonts&quot;&gt;fonts&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/graphics&quot;&gt;graphics&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/imaging&quot;&gt;imaging&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/pdf&quot;&gt;pdf&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/postscript&quot;&gt;postscript&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/typography&quot;&gt;typography&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://www.ksuther.com/chax/&quot;&gt;Chax - miscellaneous iChat improvements&lt;/a&gt; &lt;/div&gt;
				&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/Chat&quot;&gt;Chat&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/IM&quot;&gt;IM&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/apps&quot;&gt;apps&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/ichat&quot;&gt;ichat&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/mac&quot;&gt;mac&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/macosx&quot;&gt;macosx&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/osx&quot;&gt;osx&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/software&quot;&gt;software&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://www.spiegel.de/netzwelt/netzkultur/0,1518,399947,00.html&quot;&gt;Kultspiel &quot;Katamari&quot;: Die Welt aufrollen - zu einer Kugel - Netzwelt - SPIEGEL ONLINE - Nachrichten&lt;/a&gt; &lt;/div&gt;
				&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/games&quot;&gt;games&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
&lt;/ul&gt;
</description>
            <guid>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2006-02-12.html</guid>
			<pubDate>Sun, 12 Feb 2006 23:28:22 +0100</pubDate>
                    </item>
        	            <item>
            <title>del.icio.us Links on 2006-02-08</title>
            <!--<link>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2006-02-08-1.html</link>-->
            <link>http://www.entropy.ch/blog/Links/2006/02/08/del-icio-us-Links-on-2006-02-08-1.html</link>
            <description>&lt;ul class=&quot;delicious&quot;&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://goog-ajaxslt.sourceforge.net/&quot;&gt;Google AJAXSLT&lt;/a&gt; &lt;/div&gt;
		&lt;div class=&quot;delicious-extended&quot;&gt; Google AJAXSLT is an implementation of XSLT in JavaScript, intended for use in AJAX applications. Because XSLT uses XPath, it is also an implementation of XPath that can be used independently of XSLT &lt;/div&gt;		&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/ajax&quot;&gt;ajax&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/develop&quot;&gt;develop&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/google&quot;&gt;google&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/javascript&quot;&gt;javascript&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/xml&quot;&gt;xml&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/xpath&quot;&gt;xpath&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/xslt&quot;&gt;xslt&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://www.everymac.com/systems/apple/powermac_g4/stats/powermac_g4_450_cube.html&quot;&gt;Apple Power Macintosh G4/450 Cube Specs @ EveryMac.com&lt;/a&gt; &lt;/div&gt;
				&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/apple&quot;&gt;apple&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/cube&quot;&gt;cube&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/mac&quot;&gt;mac&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/specs&quot;&gt;specs&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://www.myeclipseide.com/&quot;&gt;MyEclipse J2EE IDE - Easy and affordable eclipse plugin development tools&lt;/a&gt; &lt;/div&gt;
				&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/IDE&quot;&gt;IDE&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/develop&quot;&gt;develop&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/eclipse&quot;&gt;eclipse&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/java&quot;&gt;java&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/myeclipse&quot;&gt;myeclipse&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://www.objectlearn.com/index.jsp&quot;&gt;Welcome to ObjectLearn - Home of Lomboz&lt;/a&gt; &lt;/div&gt;
				&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/develop&quot;&gt;develop&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/eclipse&quot;&gt;eclipse&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/java&quot;&gt;java&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
&lt;/ul&gt;
</description>
            <guid>http://www.entropy.ch/blog/Links/?permalink=del-icio-us-Links-on-2006-02-08-1.html</guid>
			<pubDate>Wed, 8 Feb 2006 23:43:54 +0100</pubDate>
                    </item>
        	            <item>
            <title>Today’s del.icio.us Links</title>
            <!--<link>http://www.entropy.ch/blog/Links/?permalink=Today%E2%80%99s-del-icio-us-Links-3.html</link>-->
            <link>http://www.entropy.ch/blog/Links/2006/02/07/Today%E2%80%99s-del-icio-us-Links-3.html</link>
            <description>&lt;ul class=&quot;delicious&quot;&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://www.infosyncworld.com/news/n/6471.html&quot;&gt;Sony Ericsson M600i communicator unveiled - infoSync World&lt;/a&gt; &lt;/div&gt;
		&lt;div class=&quot;delicious-extended&quot;&gt; My next mobile phone :-) If it syncs well with iSync, that is... &lt;/div&gt;		&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/handy&quot;&gt;handy&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/sony&quot;&gt;sony&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/toys&quot;&gt;toys&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://www.lebonze.co.uk/stuff/move.htm&quot;&gt;shakeibabe - The Window Shaker&lt;/a&gt; &lt;/div&gt;
		&lt;div class=&quot;delicious-extended&quot;&gt; Very funny Flash demo that interacts with the browser window &lt;/div&gt;		&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/flash&quot;&gt;flash&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/funny&quot;&gt;funny&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
&lt;/ul&gt;
</description>
            <guid>http://www.entropy.ch/blog/Links/?permalink=Today%E2%80%99s-del-icio-us-Links-3.html</guid>
			<pubDate>Tue, 7 Feb 2006 19:29:20 +0100</pubDate>
                    </item>
        	            <item>
            <title>Today’s del.icio.us Links</title>
            <!--<link>http://www.entropy.ch/blog/Links/?permalink=Today%E2%80%99s-del-icio-us-Links-2.html</link>-->
            <link>http://www.entropy.ch/blog/Links/2006/02/06/Today%E2%80%99s-del-icio-us-Links-2.html</link>
            <description>&lt;ul class=&quot;delicious&quot;&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://www.robsite.de/programme.php?prog=editoren&quot;&gt;Robsite - Editoren&lt;/a&gt; &lt;/div&gt;
		&lt;div class=&quot;delicious-extended&quot;&gt; List of text editors in German &lt;/div&gt;		&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/editors&quot;&gt;editors&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/tools&quot;&gt;tools&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/windows&quot;&gt;windows&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
&lt;/ul&gt;
</description>
            <guid>http://www.entropy.ch/blog/Links/?permalink=Today%E2%80%99s-del-icio-us-Links-2.html</guid>
			<pubDate>Mon, 6 Feb 2006 19:29:18 +0100</pubDate>
                    </item>
        	            <item>
            <title>Today’s del.icio.us Links</title>
            <!--<link>http://www.entropy.ch/blog/Links/?permalink=Today%E2%80%99s-del-icio-us-Links-1.html</link>-->
            <link>http://www.entropy.ch/blog/Links/2006/02/05/Today%E2%80%99s-del-icio-us-Links-1.html</link>
            <description>&lt;ul class=&quot;delicious&quot;&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://24ways.org/&quot;&gt;24 ways to impress your friends&lt;/a&gt; &lt;/div&gt;
		&lt;div class=&quot;delicious-extended&quot;&gt; A list of cool modern web technologies and tricks to learn &lt;/div&gt;		&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/ajax&quot;&gt;ajax&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/css&quot;&gt;css&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/develop&quot;&gt;develop&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/javascript&quot;&gt;javascript&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/programming&quot;&gt;programming&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/web&quot;&gt;web&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/webdesign&quot;&gt;webdesign&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://oemagazine.com/fromTheMagazine/jan05/photofakery.html&quot;&gt;oe magazine - photofakery&lt;/a&gt; &lt;/div&gt;
		&lt;div class=&quot;delicious-extended&quot;&gt; About ways to detect forged images &lt;/div&gt;		&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/design&quot;&gt;design&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/photography&quot;&gt;photography&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/photoshop&quot;&gt;photoshop&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://technology.guardian.co.uk/weekly/story/0,16376,1677772,00.html&quot;&gt;Guardian Unlimited Technology | Technology | Behind the magic curtain&lt;/a&gt; &lt;/div&gt;
		&lt;div class=&quot;delicious-extended&quot;&gt; How Steve Jobs and Apple prepare for a Keynote presentation &lt;/div&gt;		&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/apple&quot;&gt;apple&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/keynote&quot;&gt;keynote&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/mac&quot;&gt;mac&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/presentation&quot;&gt;presentation&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/presentations&quot;&gt;presentations&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/stevejobs&quot;&gt;stevejobs&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://www.cl.cam.ac.uk/~mgk25/iso-paper.html&quot;&gt;A4 paper format / International standard paper sizes&lt;/a&gt; &lt;/div&gt;
				&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/iso&quot;&gt;iso&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/paper&quot;&gt;paper&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/printing&quot;&gt;printing&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/reference&quot;&gt;reference&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/standard&quot;&gt;standard&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/standards&quot;&gt;standards&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://www.crockford.com/jslint/index.html&quot;&gt;JSLint, The JavaScript Verifier&lt;/a&gt; &lt;/div&gt;
				&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/javascript&quot;&gt;javascript&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/jslint&quot;&gt;jslint&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/lint&quot;&gt;lint&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/programming&quot;&gt;programming&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/tools&quot;&gt;tools&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/validator&quot;&gt;validator&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/web&quot;&gt;web&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://www.die-stimme-der-freien-welt.de/post/20051205/apple-aperture&quot;&gt;Apple Aperture Review - oder: Beware of Version 1.0&lt;/a&gt; &lt;/div&gt;
		&lt;div class=&quot;delicious-extended&quot;&gt; Review of the flaws in version 1 of Apple&#39;s Aperture software &lt;/div&gt;		&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/aperture&quot;&gt;aperture&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/apple&quot;&gt;apple&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/design&quot;&gt;design&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/photography&quot;&gt;photography&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/software&quot;&gt;software&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://www.powells.com/authors/swofford.html&quot;&gt;Powells.com Interviews -  Anthony Swofford&lt;/a&gt; &lt;/div&gt;
		&lt;div class=&quot;delicious-extended&quot;&gt; Author interview with Anthony Swofford about &quot;Jarhead&quot; &lt;/div&gt;		&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/military&quot;&gt;military&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/politics&quot;&gt;politics&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/war&quot;&gt;war&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://www.shirky.com/writings/ontology_overrated.html&quot;&gt;Shirky: Ontology is Overrated -- Categories, Links, and Tags&lt;/a&gt; &lt;/div&gt;
				&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/categorization&quot;&gt;categorization&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/classification&quot;&gt;classification&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/ontology&quot;&gt;ontology&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://www.sierraclub.org/pressroom/speeches/2005-09-10rfkjr.asp&quot;&gt;Robert F. Kennedy, Jr. Speech, 9/10/05 &gt; Press Room &gt; Sierra Club&lt;/a&gt; &lt;/div&gt;
		&lt;div class=&quot;delicious-extended&quot;&gt; Transcript of a brilliant speech by Robert F. Kennedy, Jr. at the Sierra Club&#39;s National Convention and Expo on September 10, 2005 in San Francisco &lt;/div&gt;		&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/Bush&quot;&gt;Bush&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/Kennedy&quot;&gt;Kennedy&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/ecology&quot;&gt;ecology&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/environment&quot;&gt;environment&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/politics&quot;&gt;politics&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/speech&quot;&gt;speech&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
&lt;/ul&gt;
</description>
            <guid>http://www.entropy.ch/blog/Links/?permalink=Today%E2%80%99s-del-icio-us-Links-1.html</guid>
			<pubDate>Sun, 5 Feb 2006 19:29:16 +0100</pubDate>
                    </item>
        	            <item>
            <title>Unified Wiki Syntax for Blog and Website</title>
            <!--<link>http://www.entropy.ch/blog/Website/?permalink=Unified-Wiki-Syntax-for-Blog-and-Website.html</link>-->
            <link>http://www.entropy.ch/blog/Website/2006/02/04/Unified-Wiki-Syntax-for-Blog-and-Website.html</link>
            <description>
&lt;p&gt;I realized that I really like to write for the web using wiki syntax and now I’m looking for packages to use on my web site for this purpose. Most of my blog entries or web pages are technical instructions and wiki markup is great for that.&lt;/p&gt;

&lt;p&gt;The goal is to write blog entries and regular web pages with the same syntax so I’ve been searching for combined blog/wiki packages, but I didn’t find anything that is great in both areas. There are great blog  and great wiki packages, but nothing combined. I think what comes closest is &lt;a href=&quot;http://www.snipsnap.org&quot;&gt;SnipSnap&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I’m looking for&lt;/p&gt;

&lt;li&gt;a sane wiki syntax, identical for both blog entries and wiki articles&lt;/li&gt;
&lt;li&gt;full control over URLs (including capitalization) in the wiki part so I can map existing URLs like /software/macosx/php/ etc. to articles in the wiki&lt;/li&gt;
&lt;li&gt;full control over the design of all pages&lt;/li&gt;
&lt;li&gt;well-maintained, active software&lt;/li&gt;
&lt;li&gt;ongoing support for modern, emerging web stuff such as tagging, del.icio.us, anti-spam etc.&lt;/li&gt;
&lt;li&gt;extensibility through an API&lt;/li&gt;
&lt;li&gt;ways to get at the content in a useful XML format&lt;/li&gt;
&lt;li&gt;possibly multi-user&lt;/li&gt;

&lt;p&gt;After playing around for a bit it looks like I might settle for a combination of the &lt;a href=&quot;http://www.blojsom.org&quot;&gt;blojsom&lt;/a&gt; blogging software (which I’m already using) and snipsnap for the wiki. Snipsnap uses the &lt;a href=&quot;http://www.radeox.org&quot;&gt;Radeox&lt;/a&gt; wiki renderer which is also available as a plugin for blojsom, I’m actually writing this article in Radeox wiki syntax.&lt;/p&gt;


&lt;h2&gt;Blogging&lt;/h2&gt;

&lt;p&gt;I like blojsom because of its clean design which puts a lot of functionality into plugins, and there are a lot of new plugins coming out all the time to provide the new features I am looking for. These plugins are why I don’t plan to use SnipSnap’s blog features, it looks like a blogging package still does blogging better.&lt;/p&gt;

&lt;p&gt;I also like that blojsom is a very active project with new releases coming out all the time. I noticed many projects which seem dead, no activity since 2004. There will be a blojsom 3.0 version out soon, a major redesign.&lt;/p&gt;

&lt;p&gt;I don’t like blojsom’s admin interface too much because it is cumbersome to drill down to and modify articles.&lt;/p&gt;

&lt;h2&gt;Wiki&lt;/h2&gt;

&lt;p&gt;I don’t know SnipSnap yet, I’ll set up a test site and see if I can tweak it to my requirements regarding URLs and design/layout. If it doesn’t work out, I noticed that there are other Java wiki engines using Radeox, and the ability to use a unified syntax is really my main concern.&lt;/p&gt;

&lt;p&gt;Speaking of Radeox, that seems to be a very nice piece of software which I might embed into one of my own applications. It also has a plug-in based macro mechanism which means that whatever feature is missing I’ll be able to add by writing a few Java classes.&lt;/p&gt;

&lt;p&gt;I’m not so happy with the activity I see at the snipsnap and radeox sites, many articles and comments are 1-2 years old.&lt;/p&gt;

&lt;p&gt;Write a comment if you use a similar setup and have some tips...&lt;/p&gt;

&lt;p&gt;Update: I looked around some more and although I didn’t want a CMS, the &lt;a href=&quot;http://cocoondev.org/daisy/&quot;&gt;daisy wiki/CMS&lt;/a&gt; looks good and that’s probably what I’ll be using when I migrate my website to a new server.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Website/?permalink=Unified-Wiki-Syntax-for-Blog-and-Website.html</guid>
			<pubDate>Sat, 4 Feb 2006 23:48:18 +0100</pubDate>
                    </item>
        	            <item>
            <title>Today’s del.icio.us Links</title>
            <!--<link>http://www.entropy.ch/blog/Links/?permalink=Today%E2%80%99s-del-icio-us-Links.html</link>-->
            <link>http://www.entropy.ch/blog/Links/2006/02/04/Today%E2%80%99s-del-icio-us-Links.html</link>
            <description>&lt;ul class=&quot;delicious&quot;&gt;
	&lt;li&gt;
		&lt;div class=&quot;delicious-link&quot; &gt;&lt;a href=&quot;http://pyxml.sourceforge.net/topics/xbel/&quot;&gt;The XML Bookmark Exchange Language Resource Page&lt;/a&gt; &lt;/div&gt;
				&lt;div class=&quot;delicious-tags&quot;&gt; (tags: &lt;a href=&quot;http://del.icio.us/liyanage/bookmark&quot;&gt;bookmark&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/bookmarks&quot;&gt;bookmarks&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/programming&quot;&gt;programming&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/web&quot;&gt;web&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/xbel&quot;&gt;xbel&lt;/a&gt; &lt;a href=&quot;http://del.icio.us/liyanage/xml&quot;&gt;xml&lt;/a&gt;  ) &lt;/div&gt;
	&lt;/li&gt;
&lt;/ul&gt;
</description>
            <guid>http://www.entropy.ch/blog/Links/?permalink=Today%E2%80%99s-del-icio-us-Links.html</guid>
			<pubDate>Sat, 4 Feb 2006 19:06:43 +0100</pubDate>
                    </item>
        	            <item>
            <title>PostgreSQL Universal Binary Build Tips</title>
            <!--<link>http://www.entropy.ch/blog/Software/?permalink=PostgreSQL-Universal-Binary-Build-Tips.html</link>-->
            <link>http://www.entropy.ch/blog/Software/2006/02/04/PostgreSQL-Universal-Binary-Build-Tips.html</link>
            <description>&lt;p&gt;Someone asked me how I created the universal binary PostgreSQL build.&lt;/p&gt;

&lt;p&gt;I have a small script that does it for me, it&#39;s in my &lt;a href=&quot;http://www.entropy.ch/viewcvs/trunk/postgresql/build-postgresql?view=markup&quot;&gt;Subversion repository&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The trick is to use &lt;code&gt;CFLAGS&lt;/code&gt; to pass multiple &lt;code&gt;-arch&lt;/code&gt; flags to the compiler as described in Apple&#39;s &lt;a href=&quot;http://developer.apple.com/technotes/tn2005/tn2137.html&quot;&gt;tech note about configure-based command line builds&lt;/a&gt;. For packages which use the compiler driver &lt;code&gt;cc&lt;/code&gt; to link, this is all that is required.&lt;/p&gt;

&lt;p&gt;The PostgreSQL build seems to do some linking directly with &lt;code&gt;ld&lt;/code&gt;, and &lt;code&gt;ld&lt;/code&gt; does not understand multiple &lt;code&gt;-arch&lt;/code&gt; flags, which is why my script runs a small Perl one-liner to rewrite all those &lt;code&gt;ld&lt;/code&gt; lines in all &lt;code&gt;Makefile&lt;/code&gt;s in the PostgreSQL source tree. The changed build rules run &lt;code&gt;ld&lt;/code&gt; twice, once for each architecture, and splice the results together using &lt;a href=&quot;http://developer.apple.com/documentation/Darwin/Reference/ManPages/man1/lipo.1.html&quot;&gt;lipo&lt;/a&gt;. This is exactly what &lt;code&gt;cc&lt;/code&gt; does when passed multiple &lt;code&gt;-arch&lt;/code&gt; flags.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Software/?permalink=PostgreSQL-Universal-Binary-Build-Tips.html</guid>
			<pubDate>Sat, 4 Feb 2006 04:48:08 +0100</pubDate>
                    </item>
        	            <item>
            <title>Minor addition to PostgreSQL 8.1.2 package</title>
            <!--<link>http://www.entropy.ch/blog/Software/?permalink=Minor-addition-to-PostgreSQL-8-1-2-package.html</link>-->
            <link>http://www.entropy.ch/blog/Software/2006/01/29/Minor-addition-to-PostgreSQL-8-1-2-package.html</link>
            <description>&lt;p&gt;I rereleased the 8.1.2 package, the only change is that I included two extension modules, “tsearch2” and “xml2”.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.sai.msu.su/~megera/postgres/gist/tsearch/V2/&quot;&gt;tsearch2&lt;/a&gt; adds full-text-indexing support, needed for example by the &lt;a href=&quot;http://www.mediawiki.org/wiki/MediaWiki&quot;&gt;MediaWiki&lt;/a&gt; &lt;a href=&quot;http://pgfoundry.org/projects/wikipedia/&quot;&gt;port to PostgreSQL&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://developer.postgresql.org/cvsweb.cgi/pgsql/contrib/xml2/README.xml2?rev=1.3&quot;&gt;xml2&lt;/a&gt; adds the ability to use XPath expressions in SQL queries to address data inside an XML document stored in a database field.&lt;/p&gt;

&lt;p&gt;You will need to activate these extensions for each database in which you want to use them. If you activate them in the “template1” database they will automatically be available in each new database created afterwards (because each new database starts out as a clone of template1).&lt;/p&gt;

&lt;div class=&#39;code&#39;&gt;psql -f /usr/local/pgsql/share/contrib/tsearch2.sql template1
psql -f /usr/local/pgsql/share/contrib/pgxml.sql template1
&lt;/div&gt;

&lt;p&gt;A note about the 8.1.2 package: It is built as a universal binary for 10.4 and it won’t run on 10.3/Panter systems. If you need Panther compatibility, please use the older 8.0.x package.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Software/?permalink=Minor-addition-to-PostgreSQL-8-1-2-package.html</guid>
			<pubDate>Sun, 29 Jan 2006 13:17:11 +0100</pubDate>
                    </item>
        	            <item>
            <title>PHP 5.1.2 Packages</title>
            <!--<link>http://www.entropy.ch/blog/Software/?permalink=PHP_5_1_2_Packages.html</link>-->
            <link>http://www.entropy.ch/blog/Software/2006/01/14/PHP_5_1_2_Packages.html</link>
            <description>&lt;p&gt;PHP 5.1.2 was released right after I finished my 5.1.1 packages, so here are some updated packages:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.entropy.ch/phpbb2/viewtopic.php?p=8234#8234&quot;&gt;http://www.entropy.ch/phpbb2/viewtopic.php?p=8234#8234&lt;/a&gt;&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Software/?permalink=PHP_5_1_2_Packages.html</guid>
			<pubDate>Sat, 14 Jan 2006 23:41:19 +0100</pubDate>
                    </item>
        	            <item>
            <title>Universal Binary Packages for PostgreSQL 8.1.2</title>
            <!--<link>http://www.entropy.ch/blog/Software/?permalink=Universal_Binary_Packages_for_PostgreSQL_8_1_2.html</link>-->
            <link>http://www.entropy.ch/blog/Software/2006/01/12/Universal_Binary_Packages_for_PostgreSQL_8_1_2.html</link>
            <description>&lt;p&gt;Here’s my first universal binary package:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.entropy.ch/phpbb2/viewtopic.php?p=8215#8215&quot;&gt;http://www.entropy.ch/phpbb2/viewtopic.php?p=8215#8215&lt;/a&gt;&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Software/?permalink=Universal_Binary_Packages_for_PostgreSQL_8_1_2.html</guid>
			<pubDate>Thu, 12 Jan 2006 10:14:50 +0100</pubDate>
                    </item>
        	            <item>
            <title>PostgreSQL 8.1.1 packages</title>
            <!--<link>http://www.entropy.ch/blog/Software/?permalink=PostgreSQL_8_1_1_packages.html</link>-->
            <link>http://www.entropy.ch/blog/Software/2006/01/08/PostgreSQL_8_1_1_packages.html</link>
            <description>&lt;p&gt;I just put up a package for PostgreSQL 8.1.1, the announcement is here:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.entropy.ch/phpbb2/viewtopic.php?p=8192#8192&quot;&gt;http://www.entropy.ch/phpbb2/viewtopic.php?p=8192#8192&lt;/a&gt;&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Software/?permalink=PostgreSQL_8_1_1_packages.html</guid>
			<pubDate>Sun, 8 Jan 2006 01:00:44 +0100</pubDate>
                    </item>
        	            <item>
            <title>PHP 5.1.1 Packages Available</title>
            <!--<link>http://www.entropy.ch/blog/Software/?permalink=PHP_5_1_1_Packages_Available.html</link>-->
            <link>http://www.entropy.ch/blog/Software/2006/01/03/PHP_5_1_1_Packages_Available.html</link>
            <description>&lt;p&gt;New installer packages for PHP 5.1.1 are available, see the forum post for details:&lt;/p&gt;

&lt;a href=&quot;http://www.entropy.ch/phpbb2/viewtopic.php?t=2206&quot;&gt;http://www.entropy.ch/phpbb2/viewtopic.php?t=2206&lt;/a&gt;

&lt;p&gt;Please test them out and let me know how they work.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Software/?permalink=PHP_5_1_1_Packages_Available.html</guid>
			<pubDate>Tue, 3 Jan 2006 16:15:13 +0100</pubDate>
                    </item>
        	             <item>
            <title>New Features at snapmania.com</title>
            <!--<link>http://www.entropy.ch/blog/?permalink=New_Features_at_snapmania_com.html</link>-->
            <link>http://www.entropy.ch/blog/2005/10/07/New_Features_at_snapmania_com.html</link>
            <description>&lt;p&gt;There are a few cool new features at our online photo management system &lt;a href=&quot;http://www.snapmania.com/affiliate/entropy&quot;&gt;snapmania.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;First off, we have a new live demo of the Flash-based main user interface where you organize your photo collection. This is the highlight of the system which makes it as much fun to use as a local desktop application. If you never looked at it because you didn&#39;t want to register for the free trial account, this is your chance to see and play with it right now, it takes just one click. Start at “Try the Live Demo” on the &lt;a href=&quot;http://www.snapmania.com/affiliate/entropy&quot;&gt;front page&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;We added three new photo export channels:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A rasterizer for creating giant posters on your own printer. It takes your photo and rasterizes it to a grid of dots of varying size and color. You tell it how big the final poster should be and the system slices it across the required number of US Letter or A4 pages, complete with cut and glue marks. The result looks really nice and makes a great gift.&lt;/li&gt;

&lt;li&gt;A blog export channel to post your pictures with some text to your blog. All major blogging systems like Blogger or TypePad are supported and it takes just a few clicks to create the blog entry.&lt;/li&gt;

&lt;li&gt;Create decorative stamps - Choose between a variety of templates to produce stamps featuring your own pictures. Add text or rotate the images any way you want them to appear on the stamp sheet.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These new possibilities come in addition to the existing ones like E-Mail, E-Card, photo prints, MMS to a mobile phone, photo book, panorama, PDF, Flash slide show and of course web album.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/?permalink=New_Features_at_snapmania_com.html</guid>
			<pubDate>Fri, 7 Oct 2005 20:14:16 +0200</pubDate>
                    </item>
        	            <item>
            <title>Need Testers for new PHP 5.0.5 module</title>
            <!--<link>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Need_Testers_for_new_PHP_5_0_5_module.html</link>-->
            <link>http://www.entropy.ch/blog/Mac+OS+X/2005/10/07/Need_Testers_for_new_PHP_5_0_5_module.html</link>
            <description>&lt;p&gt;There is a new early test build of a PHP 5.0.5 module package available at&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.entropy.ch/phpbb2/viewtopic.php?p=7928&quot;&gt;http://www.entropy.ch/phpbb2/viewtopic.php?p=7928&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I could use some more Tiger test feedback for this...&lt;/p&gt;

</description>
            <guid>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Need_Testers_for_new_PHP_5_0_5_module.html</guid>
			<pubDate>Fri, 7 Oct 2005 19:54:17 +0200</pubDate>
                    </item>
        	             <item>
            <title>Got Some Spare Time at Work</title>
            <!--<link>http://www.entropy.ch/blog/?permalink=Got_some_capacity_at_Work.html</link>-->
            <link>http://www.entropy.ch/blog/2005/10/07/Got_some_capacity_at_Work.html</link>
            <description>&lt;p&gt;We have some spare capacity at work right now so if you have an interesting job please contact me directly via email and we’ll work something out through my company &lt;a href=&quot;http://www.futurelab.ch&quot;&gt;futureLAB AG&lt;/a&gt;...&lt;/p&gt;

&lt;p&gt;Possible areas are Mac OS X Cocoa development, web application development, any kind of UNIX/open source systems engineering, databases, XML/XSLT, XSL-FO, Perl, PHP, C or Java jobs, ISP/network engineering etc.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/?permalink=Got_some_capacity_at_Work.html</guid>
			<pubDate>Fri, 7 Oct 2005 18:23:04 +0200</pubDate>
                    </item>
        	            <item>
            <title>Cafepress Merchandise</title>
            <!--<link>http://www.entropy.ch/blog/Website/?permalink=Cafepress_Merchandise.html</link>-->
            <link>http://www.entropy.ch/blog/Website/2005/08/15/Cafepress_Merchandise.html</link>
            <description>&lt;a href=&quot;http://www.cafepress.com/entropy_ch&quot;&gt;&lt;img src=&quot;/images/entropy-tshirt.png&quot; style=&quot;margin: 0 0 10px 10px; float: right; height: 80px;&quot;/&gt;&lt;/a&gt;

&lt;p&gt;I played around with &lt;a href=&quot;http://www.cafepress.com&quot;&gt;cafepress&lt;/a&gt; for fun today, you can buy some &lt;a href=&quot;http://www.cafepress.com/entropy_ch&quot;&gt;entropy.ch logo merchandise&lt;/a&gt; in the shop.&lt;/p&gt;

&lt;br clear=&quot;all&quot;/&gt;
</description>
            <guid>http://www.entropy.ch/blog/Website/?permalink=Cafepress_Merchandise.html</guid>
			<pubDate>Mon, 15 Aug 2005 19:25:14 +0200</pubDate>
                    </item>
        	            <item>
            <title>Perl, Python, Ruby</title>
            <!--<link>http://www.entropy.ch/blog/Developer/?permalink=Perl_Python_Ruby.html</link>-->
            <link>http://www.entropy.ch/blog/Developer/2005/08/15/Perl_Python_Ruby.html</link>
            <description>&lt;p&gt;I’m currently looking at &lt;a href=&quot;http://www.ruby-lang.org/&quot;&gt;Ruby&lt;/a&gt; and I really love what I see.&lt;/p&gt;

&lt;p&gt;I use Perl a lot both in my job and at home and I wrote a lot of code in it over the past 10 years. I know it pretty well and feel comfortable using it.&lt;/p&gt;

&lt;p&gt;I like to look at new stuff and that’s why I tried Python once after reading lots of good things about it, but I really wasn’t impressed after trying it out for a few test projects. There was nothing in there that I couldn’t do in Perl, and some of the constructs looked even uglier than Perl. I think it’s a better language to learn if you start from scratch, but if you are already know Perl well and work in a team/organization that has experience structuring large software system properly in it, it really doesn’t buy you anything to switch.&lt;/p&gt;

&lt;p&gt;Now my impression of Ruby is very different. Its syntax looks totally clean and almost beautiful. I especially like the way code blocks and iterators work. Writing nested code blocks like&lt;/p&gt;

&lt;tt&gt;intersect = a.find_all {|x| b.find {|y| x == y} }&lt;/tt&gt;

&lt;p&gt;is great. The equivalent nested grep code in Perl is uglier, mostly because I cannot choose the name of the aliasing variable and the two $_ clash. I use a second temporary helper variable (usually $__, $__ is the “outer” and $_ the “inner” aliasing variable) and do something like&lt;/p&gt;

&lt;tt&gt;@intersect = grep {my $__ = $_; grep {$_ == $__} @b} @a;&lt;/tt&gt;

&lt;p&gt;Another fine point to mention is that Ruby allows me to be more precise and efficient with these things, i.e. there’s the differentiated behavior provided by &lt;tt&gt;find_all&lt;/tt&gt; and &lt;tt&gt;find&lt;/tt&gt; which is exactly what I need in this case. The Ruby version has less useless iterations because unlike Ruby’s &lt;tt&gt;Enumerable.find()&lt;/tt&gt;, the Perl version’s second (inner) &lt;tt&gt;grep&lt;/tt&gt; wont’t abort after the first successful match, it will continue until it reaches the end of the second input list (@b).&lt;/p&gt;

&lt;p&gt;I also like how thoroughly object-oriented Ruby is. That was one of the main arguments which made me look at Python, and I was not too impressed at what I saw in this regard, compared to Perl’s OO features. In Ruby, absolutely everything is an object and the library classes provide an elegant and logical set of methods.&lt;/p&gt;

&lt;p&gt;Ruby seems to tickle some weird kind of elegance nerve in my brain. I will probably add it to my tool chest, next to Perl. Other languages like Python have so far failed to provide enough benefit for me to invest the time... Of course, the fact that Ruby is what powers &lt;a href=&quot;http://www.rubyonrails.org/&quot;&gt;Ruby on Rails&lt;/a&gt; and all the raves about Rails doesn’t hurt either :-)&lt;/p&gt;


&lt;p&gt;What I don’t like about Ruby is that the documentation sucks. I bought the second edition of the &lt;a href=&quot;http://pragmaticprogrammer.com/titles/ruby/index.html&quot;&gt;Learning Ruby book as a PDF&lt;/a&gt;, and while the book is excellent (like their &lt;a href=&quot;http://pragmaticprogrammer.com/ppbook/index.shtml&quot;&gt;other books&lt;/a&gt;), it’s bad that I can’t get this quality of documentation for free.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Developer/?permalink=Perl_Python_Ruby.html</guid>
			<pubDate>Mon, 15 Aug 2005 17:47:34 +0200</pubDate>
                    </item>
        	            <item>
            <title>The “Mac OS X Tiger Timesaving Techniques” book is out</title>
            <!--<link>http://www.entropy.ch/blog/Mac+OS+X/?permalink=The_%E2%80%9CMac_OS_X_Tiger_Timesaving_Techniques%E2%80%9D_book_is_out.html</link>-->
            <link>http://www.entropy.ch/blog/Mac+OS+X/2005/08/07/The_%E2%80%9CMac_OS_X_Tiger_Timesaving_Techniques%E2%80%9D_book_is_out.html</link>
            <description>&lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/0764579630/wwwentropych-20/&quot;&gt;&lt;img style=&quot;float: right; margin: 5px 0 10px 10px;&quot; src=&quot;http://images.amazon.com/images/P/0764579630.01.TZZZZZZZ.jpg&quot;/&gt;&lt;/a&gt;

&lt;p&gt;... for a while already, actually :-)&lt;/p&gt;

&lt;p&gt;While I was on vacation in June, Wiley released the updated &lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/0764579630/wwwentropych-20/&quot;&gt;&lt;q&gt;Mac OS X Tiger Timesaving Techniques for Dummies&lt;/q&gt;&lt;/a&gt; book which Larry Ullman and I co-wrote.&lt;/p&gt;

&lt;br clear=&quot;all&quot;/&gt;

</description>
            <guid>http://www.entropy.ch/blog/Mac+OS+X/?permalink=The_%E2%80%9CMac_OS_X_Tiger_Timesaving_Techniques%E2%80%9D_book_is_out.html</guid>
			<pubDate>Sun, 7 Aug 2005 15:33:09 +0200</pubDate>
                    </item>
        	            <item>
            <title>FileMaker&amp;#8217;s XSLT support</title>
            <!--<link>http://www.entropy.ch/blog/Mac+OS+X/?permalink=FileMaker_8217_s_XSLT_support.html</link>-->
            <link>http://www.entropy.ch/blog/Mac+OS+X/2005/08/07/FileMaker_8217_s_XSLT_support.html</link>
            <description>&lt;p&gt;I&amp;#8217;m doing some FileMaker work that requires the database contents to be dumped in a custom XML format. I planned to use FileMaker&#39;s built-in XSLT engine, but it appears to be horribly outdated and broken. It is probably an old Xalan-C library, a version which had bugs with some variable bindings.&lt;/p&gt;

&lt;p&gt;The XSLT code is perfectly valid and works with every other engine, including later versions of Xalan-C.&lt;/p&gt;

&lt;p&gt;Since this DB only has to run on Mac OS X, I decided to use the Apple-supplied command line tool xsltproc, part of libxslt which gets installed with recent Safari versions. Because I still want to automate the transformation, I used a script step that runs a calculated AppleScript to invoke the shell command. The script ends up combining 4 languages in one expression: FileMaker formula, AppleScript, bash and Perl.&lt;/p&gt;

&lt;tt&gt;&quot;do shell script \&quot;cd /Volumes`echo &#39;&quot; &amp;#38; Get(FilePath) &amp;#38; &quot;&#39; | perl -ne &#39;print m#file:(.+)/.+.fp[0-9]+$#&#39;`; xsltproc fmp2foo.xslt foo-export-raw.xml &gt; foo-export.xml\&quot;&quot;&lt;/tt&gt;
</description>
            <guid>http://www.entropy.ch/blog/Mac+OS+X/?permalink=FileMaker_8217_s_XSLT_support.html</guid>
			<pubDate>Sun, 7 Aug 2005 15:26:10 +0200</pubDate>
              	          <wfw:comment>http://www.entropy.ch/blojsom/commentapi/marc/Mac+OS+X/?permalink=FileMaker_8217_s_XSLT_support.html</wfw:comment>
              <wfw:commentRss>http://www.entropy.ch/blog/Mac+OS+X/?permalink=FileMaker_8217_s_XSLT_support.html&amp;page=comments&amp;flavor=rss2</wfw:commentRss>
                    </item>
        	            <item>
            <title>“Make Tag” BBEdit AppleScript</title>
            <!--<link>http://www.entropy.ch/blog/Mac+OS+X/?permalink=%E2%80%9CMake_Tag%E2%80%9D_BBEdit_AppleScript.html</link>-->
            <link>http://www.entropy.ch/blog/Mac+OS+X/2005/08/01/%E2%80%9CMake_Tag%E2%80%9D_BBEdit_AppleScript.html</link>
            <description>&lt;p&gt;I wrote this AppleScript for BBEdit. It takes the word immediately preceding the cursor and makes an opening/closing tag pair with it, e.g. you type &lt;code&gt;div&lt;/code&gt; and hit the keyboard shortcut assigned to the script, and it will insert&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;div&amp;lt;##&gt;&gt;&amp;lt##&gt;&amp;lt;/div&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The “Go To Previous/Next Placeholder” menu commands, which you should also assign to keyboard shortcuts, take you to the two &amp;lt##&gt; placeholders for attributes and contents.&lt;/p&gt;

Below is the AppleScript. Save to a compiled AppleScript file and place it into ~/Library/Application Support/BBEdit/Scripts, then assign a shortcut using the “Set Key...” button of the Scripts palette (I use Ctrl-T).

&lt;p&gt;(↵ means the line has been broken for readability but needs to be joined with the next line for the code to run).&lt;/p&gt;

&lt;pre&gt;
tell application &quot;BBEdit&quot;
    
    set frontdoc to front text document
    set mytext to text of frontdoc
    set mywin to window of frontdoc
    
    if length of selection of mywin &gt; 0 then
        display dialog ↵
            &quot;Cursor must be to the right of a word, no selection&quot;
        return
    end if
    
    set cursorLineNumber to startLine of selection of mywin
    set cursorLine to line cursorLineNumber of frontdoc
    set linechar to (characterOffset of selection of mywin) ↵
        - (characterOffset of character 1 of cursorLine)
    
    if linechar &amp;lt; 1 then
        display dialog &quot;Cursor must be to the right of a word&quot;
        return
    end if
    
    set searchstring to characters 1 through linechar of cursorLine
    
    set searchresult to find &quot;([a-z0-9_.:-])+$&quot; searching ↵
        in searchstring options {search mode:grep}
    
    if found of searchresult is false then
        display dialog &quot;Cursor must be to the right of a word&quot;
        return
    end if
    
    set foundtxt to found text of searchresult
    set foundobj to found object of searchresult
    set charstart to (characterOffset of foundobj)
    set charend to charstart + ((length of foundobj) - 1)
    
    set replacement to &quot;&amp;lt;&quot; &amp;amp; foundtxt &amp;amp; &quot;&lt;##&gt;&gt;&lt;##&gt;&quot; &amp;amp; ↵
        &quot;&amp;lt;/&quot; &amp;amp; foundtxt &amp;amp; &quot;&gt;&quot;
    
    set characters charstart through charend of frontdoc to replacement
    set selstart to (charstart + 1 + (length of foundtxt))
    select (characters selstart through (selstart + 3)) of frontdoc
    
end tell
&lt;/pre&gt;
</description>
            <guid>http://www.entropy.ch/blog/Mac+OS+X/?permalink=%E2%80%9CMake_Tag%E2%80%9D_BBEdit_AppleScript.html</guid>
			<pubDate>Mon, 1 Aug 2005 17:55:19 +0200</pubDate>
                    </item>
        	            <item>
            <title>USA 2005 / Boston, New York and Washington DC</title>
            <!--<link>http://www.entropy.ch/blog/Travel/?permalink=USA_2005_Boston_New_York_and_Washington_DC.html</link>-->
            <link>http://www.entropy.ch/blog/Travel/2005/07/01/USA_2005_Boston_New_York_and_Washington_DC.html</link>
            <description>&lt;p&gt;[This is part 4. See part &lt;a href=&quot;http://www.entropy.ch/blojsom/blog/marc/Travel/2005/05/31/USA_2005_In_San_Francisco.html&quot;&gt;1&lt;/a&gt;, &lt;a href=&quot;http://www.entropy.ch/blojsom/blog/marc/Travel/2005/06/05/USA_2005_Week_1_in_San_Francisco.html&quot;&gt;2&lt;/a&gt; or &lt;a href=&quot;http://www.entropy.ch/blojsom/blog/marc/Travel/2005/06/12/USA_2005_Week_2_in_San_Francisco.html&quot;&gt;3&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.entropy.ch/pictures/usa-2005-blog/medium/california_yosemite.jpg&quot;&gt;&lt;img style=&quot;float: right; margin: 0 0 10px 10px;&quot; src=&quot;http://www.entropy.ch/pictures/usa-2005-blog/small/california_yosemite.jpg&quot;/&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I was about to leave San Francisco on Tuesday of the third week. I got ready for checkout one day early on Sunday because I booked a day trip to &lt;a href=&quot;http://www.nps.gov/yose/&quot;&gt;Yosemite&lt;/a&gt; for Monday at pretty much the last minute [&lt;a href=&quot;http://www.snapmania.com/album/CID-u0002164-99/&quot;&gt;Pictures&lt;/a&gt;].&lt;/p&gt;

&lt;p&gt;Of course, such a short visit isn’t all that useful because it takes 6-8 hours just to get there and back which leaves only 2-3 hours for walks around the Yosemite visitor’s center, but I still got to see a few nice waterfalls (including lots of mosquito bites), and the ride through California’s &lt;a href=&quot;http://www.npr.org/programs/atc/features/2002/nov/central_valley/&quot;&gt;Central Valley&lt;/a&gt; has a few nice views too... Now I know why this is called the Golden State.&lt;/p&gt;

&lt;p&gt;I booked a &lt;a href=&quot;http://www.jetblue.com/&quot;&gt;JetBlue&lt;/a&gt; flight from Oakland to Boston, that worked out very well, their self-checkin system is pretty cool and has a great user-interface (I like the ability to pick my seat on-screen).&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.entropy.ch/pictures/usa-2005-blog/medium/boston_pond.jpg&quot;&gt;&lt;img style=&quot;float: right; margin: 0 0 10px 10px;&quot; src=&quot;http://www.entropy.ch/pictures/usa-2005-blog/small/boston_pond.jpg&quot;/&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A &lt;a href=&quot;http://www.steglein.com/&quot;&gt;friend&lt;/a&gt; picked me up at the airport and drove us to the family’s house in Gardner outside of Boston. The New England region looks quite different from California, lots of green, lots of gray sky, looks a lot like Switzerland :-)&lt;/p&gt; 

&lt;p&gt;My stay in Boston was very short so I didn’t see and do too much. There are many interesting historic sites and things to be seen, and I have one restaurant tip: Sorelle Bakery and Cafe at 100 City Square. [&lt;a href=&quot;http://www.snapmania.com/album/CID-u0002164-101/&quot;&gt;Pictures&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;On Thursday I took the Amtrak train from Boston to New York. The train ride featured a few very nice views of the Atlantic coast. A few hours later I arrived at Penn Station and after a short subway ride I checked in at my hotel, the “&lt;a rel=&quot;nofollow&quot; href=&quot;http://www.westsideinn.com/&quot;&gt;West Side Inn&lt;/a&gt;” on 107th street west. A word of advice: Avoid this place, the rooms are really ugly and old (certainly not like the images on the website) and some of the staff members are very unfriendly. Make sure you see the room before you pay as they don’t believe in refunds...&lt;/p&gt;

&lt;p&gt;In my room I popped up my laptop and found 5 wireless networks in range, two of which were open, so I had free Internet access all the time. This proved to be very useful to look up and book all kinds of things about and in New York.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.entropy.ch/pictures/usa-2005-blog/medium/newyork_street.jpg&quot;&gt;&lt;img style=&quot;float: right; margin: 0 0 10px 10px;&quot; src=&quot;http://www.entropy.ch/pictures/usa-2005-blog/small/newyork_street.jpg&quot;/&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The city is overwhelming and the size and number of the buildings in Manhattan create an environment unlike anything else. I was here 10 years ago but I didn’t see too much of it back then. This time I stayed for about 10 days but I definitely want to come back and spend more time here, there is just so much more to see.&lt;/p&gt;

&lt;p style=&quot;clear: both;&quot;&gt;&lt;a href=&quot;http://www.entropy.ch/pictures/usa-2005-blog/medium/newyork_brooklynbridge.jpg&quot;&gt;&lt;img style=&quot;float: right; margin: 0 0 10px 10px;&quot; src=&quot;http://www.entropy.ch/pictures/usa-2005-blog/small/newyork_brooklynbridge.jpg&quot;/&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I booked two &lt;a href=&quot;http://www.bikethebigapple.com&quot;&gt;bicycle tours&lt;/a&gt; one day, the first one led us through parts of Harlem and Grand Central Park, the other one was during and after sunset along the Hudson river, then through downtown Manhattan and finally halfway across the bicyle path on the Brooklyn Bridge, which provides a truly breathtaking view of the city at night.&lt;/p&gt;

&lt;p&gt;I noticed that a bicycle is a great way to get around the city; you get around faster than on foot but still slow enough to see things, you can stop whenever you want, and the car drivers were surprisingly tolerant, so I rented a bicycle for another two days to explore on my own. I spent a lot of time on the road. The beautiful new &lt;a href=&quot;http://www.hudsonriverpark.org&quot;&gt;Hudson River Park&lt;/a&gt; has a bicycle path that allowed me to ride all the way from 107th street to downtown Manhattan. [&lt;a href=&quot;http://www.snapmania.com/album/CID-u0002164-107/&quot;&gt;Pictures&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;During my stay I had to get some work done so I took the PowerBook to the public library where I could sit in the impressive &lt;a href=&quot;http://www.nypl.org/research/chss/grd/index.html&quot;&gt;reading room&lt;/a&gt; and connect the computer to wired Internet and power outlets, it was the perfect spot for working.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.entropy.ch/pictures/usa-2005-blog/medium/newyork_bryantpark.jpg&quot;&gt;&lt;img style=&quot;float: right; margin: 0 0 10px 10px;&quot; src=&quot;http://www.entropy.ch/pictures/usa-2005-blog/small/newyork_bryantpark.jpg&quot;/&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.bryantpark.org/&quot;&gt;Bryant Park&lt;/a&gt; next to the library became one of my favorite spots in the city. It features a beautiful contrast between open, green space with trees and the skyscrapers surrounding it. This is a great place to relax and drink, eat, or surf the Internet using the free wireless network. One Monday evening I arrived there just in time to get a good seat for the first evening of the summer film festival which started on that day. By the time the movie began, right after sunset, the park was packed with about 10’000 people and the atmosphere was very exciting. [&lt;a href=&quot;http://www.snapmania.com/album/CID-u0002164-108/&quot;&gt;Pictures&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.entropy.ch/pictures/usa-2005-blog/medium/newyork_libertyview.jpg&quot;&gt;&lt;img style=&quot;float: right; margin: 0 0 10px 10px;&quot; src=&quot;http://www.entropy.ch/pictures/usa-2005-blog/small/newyork_libertyview.jpg&quot;/&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Wednesday featured ferry rides to and tours of both Liberty and Ellis Island. [&lt;a href=&quot;http://www.snapmania.com/album/CID-u0002164-109/&quot;&gt;Pictures&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;As for nightlife, I went to two events, an &lt;a href=&quot;http://www.enablernetwork.org/&quot;&gt;Enabler&lt;/a&gt; party featuring &lt;a href=&quot;http://dreamchimney.com/brokerdealer/IPO/&quot;&gt;Broker/Dealer&lt;/a&gt; and I saw &lt;a href=&quot;http://www.rhythmism.com/forum/calendar.php?do=getinfo&amp;e=4395&amp;c=1&quot;&gt;Derrick Carter play&lt;/a&gt; at the &lt;a href=&quot;http://www.cieloclub.com&quot;&gt;Cielo club&lt;/a&gt;, which has a fantastic interior design.&lt;/p&gt;

&lt;p&gt;I spent a lot of time wandering around and discovering nice shops, cafes and restaurants, and here are the ones I really liked:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.zenpalate.com/home_h.htm&quot;&gt;Zen Palate&lt;/a&gt; (several locations), &lt;a href=&quot;http://www.menupages.com/restaurantdetails.asp?neighborhoodid=0&amp;restaurantid=519&quot;&gt;Quantum Leap&lt;/a&gt; at 226 Thompson Street, &lt;a href=&quot;http://www.goborestaurant.com/&quot;&gt;Gobo&lt;/a&gt; at 401 6th avenue all have good vegetarian food (and the &lt;a href=&quot;http://www.nyspirit.com/restaurant_guide/restaurant_index.html&quot;&gt;NY Spirit&lt;/a&gt; website has a useful listing of more similar restaurants).&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.pret.com/find_a_pret/usa.htm&quot;&gt;Pret a Manger&lt;/a&gt; is a chain of stores which serve excellent sandwiches. There’s one at 42nd Street and 5th Avenue so you can grab your food there and enjoy it sitting in Bryant Park.&lt;/li&gt;
&lt;li&gt;The &lt;a href=&quot;http://www.soyluckclub.com/&quot;&gt;Soy Luck Club&lt;/a&gt; at 115 Greenwich Av. (Jane St.) is a great cafe with delicious drinks and snacks, friendly staff and free wireless Internet access.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.silvermoonbakery.com/&quot;&gt;Silver Moon Bakery&lt;/a&gt; at 2740 Broadway (105th St.) had *very* good bread for breakfast.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.painquotidien.com&quot;&gt;Le Pain Quotidien&lt;/a&gt; is another good choice for breakfast.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.calleochonyc.com&quot;&gt;Calle Ocho&lt;/a&gt; at 446 Columbus Av. has great Latin food.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.tablany.com/&quot;&gt;Tabla&lt;/a&gt; at 11 Madison Av. serves Indian dishes, try the avocado salad and the cheese kulcha, and try to go there when the patio is open.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mhh can you tell I like eating :-)&lt;/p&gt;

&lt;p&gt;After many days of excitement and fun in New York I was ready for the last part of the trip, about a week in Washington DC. After a few more pleasant hours of Amtrak train ride my friend Larry picked me up at Union Station, I was staying at their place for the rest of the time.&lt;/p&gt;

&lt;p&gt;We went to see the the usual things over the next few days. I noticed that the distances between all the well-known monuments are much larger than I thought. There’s also a lot more open, green space everywhere, it looks way better than on pictures.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.entropy.ch/pictures/usa-2005-blog/medium/washington_hainspoint.jpg&quot;&gt;&lt;img style=&quot;float: right; margin: 0 0 10px 10px;&quot; src=&quot;http://www.entropy.ch/pictures/usa-2005-blog/small/washington_hainspoint.jpg&quot;/&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I was *really* impressed by the size and number of the &lt;a href=&quot;http://www.si.edu/&quot;&gt;Smithsonian Institution’s museums&lt;/a&gt;, I love museums and I could easily spend months in all these places... The Air and Space museum was remarkable, it is great to see many of the actual pieces of equipment and aircraft that went to the moon and back, for example. [&lt;a href=&quot;http://www.snapmania.com/album/CID-u0002164-103/&quot;&gt;Pictures&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;On another day, we explored some of the sites and monuments between the White house and the Capitol using my favorite vehicle, the Segway... Yes, another Segway tour :-). This time we even had members of the tour group crash their Segways into concrete blocks, which led to painfully hard landings on the pavement. [&lt;a href=&quot;http://www.snapmania.com/album/CID-u0002164-111/&quot;&gt;Pictures&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.entropy.ch/pictures/usa-2005-blog/medium/baltimore_baseball.jpg&quot;&gt;&lt;img style=&quot;float: right; margin: 0 0 10px 10px;&quot; src=&quot;http://www.entropy.ch/pictures/usa-2005-blog/small/baltimore_baseball.jpg&quot;/&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Larry is a big sports fan and I always wanted to see a game so we went to the Baltimore Camden Yards baseball stadium where we saw the Baltimore Orioles play against the New York Yankees. Of course Larry had to explain the rules and tactics to me before and during the game, I had no idea that it’s so complicated, with so many special cases :-) I really liked it, I’m sure I’ll do this again next time. [&lt;a href=&quot;http://www.snapmania.com/album/CID-u0002164-110/&quot;&gt;Pictures&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.entropy.ch/pictures/usa-2005-blog/medium/washington_nurse.jpg&quot;&gt;&lt;img style=&quot;float: right; margin: 0 0 10px 10px;&quot; src=&quot;http://www.entropy.ch/pictures/usa-2005-blog/small/washington_nurse.jpg&quot;/&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On the second-last day we did another tour of the memorials and monuments not covered on the Segway tour, specifically the Lincoln, Jefferson and Vietnam War memorials, I’m glad I got to see those as they are all quite impressive. [&lt;a href=&quot;http://www.snapmania.com/album/CID-u0002164-112/&quot;&gt;Pictures&lt;/a&gt;]&lt;/p&gt;


&lt;p style=&quot;clear: both;&quot;&gt;There are only two restaurant tips for this week:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.bilbobaggins.net/&quot;&gt;Bilbo Baggins&lt;/a&gt; in Alexandria has excellent dishes and desserts and a good selection of beers.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.capcitybrew.com/&quot;&gt;Capitol City Brewing Co.&lt;/a&gt; is a brew pub right next to Union Station in Washington DC. Good beers and food.&lt;/li&gt;
&lt;/ul&gt;
</description>
            <guid>http://www.entropy.ch/blog/Travel/?permalink=USA_2005_Boston_New_York_and_Washington_DC.html</guid>
			<pubDate>Fri, 1 Jul 2005 07:45:06 +0200</pubDate>
                    </item>
        	            <item>
            <title>USA 2005 / Week 2 in San Francisco</title>
            <!--<link>http://www.entropy.ch/blog/Travel/?permalink=USA_2005_Week_2_in_San_Francisco.html</link>-->
            <link>http://www.entropy.ch/blog/Travel/2005/06/12/USA_2005_Week_2_in_San_Francisco.html</link>
            <description>&lt;p&gt;[This is part 3. See part &lt;a href=&quot;http://www.entropy.ch/blojsom/blog/marc/Travel/2005/05/31/USA_2005_In_San_Francisco.html&quot;&gt;1&lt;/a&gt;, &lt;a href=&quot;http://www.entropy.ch/blojsom/blog/marc/Travel/2005/06/05/USA_2005_Week_1_in_San_Francisco.html&quot;&gt;2&lt;/a&gt; or &lt;a href=&quot;http://www.entropy.ch/blojsom/blog/marc/Travel/2005/07/01/USA_2005_Boston_New_York_and_Washington_DC.html&quot;&gt;4&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;This is &lt;a href=&quot;http://developer.apple.com/wwdc/&quot;&gt;WWDC&lt;/a&gt; week, which is why I’m here after all.&lt;/p&gt;

&lt;p&gt;I went to the conference venue early on Monday in the hope of getting a good seat for the keynote. Unfortunately that didn’t work out as I had a different badge this year, which means that they stuck me into the overflow room where I got to watch the show on video projection. Oh well... The content is more important than the form, right :-)&lt;/p&gt;

&lt;p&gt;During the keynote, of course, &lt;a href=&quot;http://www.wired.com/news/mac/0,2125,67757,00.html&quot;&gt;Jobs Drops Da Intel Bomb&lt;/a&gt;, which pretty much set the main topic of discussion for the rest of the conference. It also provided a lot of interesting session content. As always, many of the session descriptions which were published before the conference were kind of vague and they made much more sense after the big announcements were made during the keynote. Apple also added a few sessions about the new Xcode 2.1 and Intel porting.&lt;/p&gt;

&lt;p&gt;On the evening of the first conference day I went to the &lt;a href=&quot;http://weblog.scifihifi.com/2005/06/19/wwdc-2005-weblogger-dinner-wrap-up/&quot;&gt;WWDC weblogger’s meetup&lt;/a&gt; organized by Buzz Andersen. It was great to meet many of the people whose weblogs &lt;a href=&quot;http://www.entropy.ch/links/welcome.php#_Blogs%20to%20read&quot;&gt;I read all the time&lt;/a&gt;, I had lots of interesting and funny conversations (I’m still amused about the tail recursion interview question...) The meetup’s location, the &lt;a href=&quot;http://www.thirstybear.com/&quot;&gt;Thirsty Bear&lt;/a&gt;, is a nice place that serves good beers and food, it’s just a block away from Moscone.&lt;/p&gt;

&lt;p&gt;For the rest of the conference I releaxed and enjoyed the show, with the exception of the AMP session led by Apple’s John Montbriand on Tuesday morning, where I got the opportunity to present my website and PHP packages for a few minutes. I was very glad it was just a few minutes :-). The scary thing was that I had planned to come into the presentation room a bit early to install my PHP installation package onto one of the demo machines so I could show off some of the added capabilities of those modules.&lt;/p&gt;

&lt;p&gt;Everything looked normal until I realized that the demo machine was an *Intel* box! Of course, my PHP module is a binary built for PPC machines, so it cannot be loaded into the Intel Apache server runing on this system. Nice surprise to find out about this 30 minutes before the session starts :-) Of course, when we rehearsed and planned this a week before, nobody, not even the Apple people, knew anything about the Intel news... Luckily, there was an alternative G5 demo machine available so that one was swapped in, and everything worked well thereafter.&lt;/p&gt;

&lt;p&gt;I’d like to thank the people at Apple’s DTS group (especially Norm, Stephen and David) for this opportunity and the support of my Open Source-related Mac OS X work over the past few years.&lt;/p&gt;

&lt;p&gt;Anyway, after my small part of the session was over, I could really sit back and enjoy the conference content as a regular attendee... My main interests were news in the Cocoa frameworks, especially Cocoa Bindings and Core Data, and development tools, especially using Xcode efficiently. Xcode gets better and better with every release, I really like to work with it. The Xcode team at Apple is doing an amazing job. [&lt;a href=&quot;http://www.snapmania.com/album/CID-u0002164-96/&quot;&gt;Pictures&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;Of course I visited all Intel porting-related sessions too. I spent a few hours in the Intel porting lab one evening. I realized that pretty much every single one of the Cocoa applications I have written so far uses one or more open-source libraries. That’s a bit of a problem for my porting efforts because in my case I cannot simply flick a switch in Xcode as these libraries are usually built using the GNU autoconf-style build process. These configure scripts and Makefiles have no concept of building fat or, as Apple calls them, universal binaries, and they make all kinds of assumptions that break in this scenario. I tried fiddling with compiler switches, multiple -arch flags, the “lipo” tool etc. but it’s really messy. After a few hours I did manage to build all my XML-related open source libs as universal binaries, and thereafter it really was as easy as Apple described it, the changes in my own, Xcode-based code for my &lt;a href=&quot;http://www.entropy.ch/software/macosx/#testxslt&quot;&gt;TestXSLT&lt;/a&gt; app took less than 10 minutes, and then I had a nice, universal binary application.&lt;/p&gt;

&lt;p&gt;It will be a challenge to build a universal &lt;a href=&quot;http://www.entropy.ch/software/macosx/php/&quot;&gt;PHP module&lt;/a&gt;, because that is nothing *but* open source libraries packaged together nicely. I think my strategy will be something like building every library twice for both architectures by passing the appropriate compiler flags (and I just *hate* how the GNU autoconf/libtool stuff does not properly propagate compiler and linker flags in all cases). Then I’ll write a script to recursively find all binaries in the two trees and glue them together using lipo.&lt;/p&gt;

&lt;p&gt;All the time during the conference, it was fun having people come up to me and telling me that they use my PHP packages. I was really surprised how widely used it is, I usually only hear about it when something doesn’t work right, and not about the (hopefully) many more cases where it just works out of the box and does what people want... It was especially cool when I was shown some Apple-internal servers running it during an office tour at the WWDC campus bash.&lt;/p&gt;

&lt;p&gt;The campus bash was a lot of fun and as always a good opportunity to meet people, although the food was better two years ago... &lt;a href=&quot;http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewArtist?artistId=107946&quot;&gt;Nice music&lt;/a&gt;, too...&lt;/p&gt;

&lt;p&gt;Another great session, both informative and very funny, was a lunch-time talk given by &lt;a href=&quot;http://xenia.media.mit.edu/~wave/&quot;&gt;Michael B. Johnson&lt;/a&gt; who from Pixar’s Studio Tools Group, where they &lt;a href=&quot;http://preview.millimeter.com/mag/video_tool_time_pixar/&quot;&gt;use Cocoa&lt;/a&gt; heavily. There was a *lot* of interest in this session, they started to put people into an overflow room again.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.entropy.ch/pictures/usa-2005-blog/medium/california_baysailing.jpg&quot;&gt;&lt;img style=&quot;float: right; margin: 0 0 10px 10px;&quot; src=&quot;http://www.entropy.ch/pictures/usa-2005-blog/small/california_baysailing.jpg&quot;/&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This week’s highlight was a sailing trip in the San Francisco bay. We were invited to go on Saturday, and conditions were just perfect, enough wind and no fog, a nice and sunny day. We started south of San Francisco and motored for a while until the wind picked up near the Bay Bridge, which is when the sails went up. After passing Alcatraz we got a nice view of the Golden Gate Bridge. Shortly thereafter we turned around, passed on the other side of Alcatraz and headed back. All in all about 4 hours on the water, a nice way to spend half of Saturday... [&lt;a href=&quot;http://www.snapmania.com/album/CID-u0002164-97/&quot;&gt;Pictures&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;This time I finally got around to checking out the night life in San Francisco, specifically I always wanted to see the &lt;a href=&quot;http://www.dnalounge.com/&quot;&gt;DNA lounge&lt;/a&gt;. I was really lucky because one of my favorite record labels had a &lt;a href=&quot;http://www.dnalounge.com/flyers/2005/06/11-om.html&quot;&gt;label night&lt;/a&gt; on Saturday of this week, featuring Mark Farina and &lt;a href=&quot;http://www.djcolette.com&quot;&gt;DJ Colette&lt;/a&gt; (great music and a beautiful voice). I had a great night out there and will go again next time.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.entropy.ch/pictures/usa-2005-blog/medium/california_napavalley.jpg&quot;&gt;&lt;img style=&quot;float: right; margin: 0 0 10px 10px;&quot; src=&quot;http://www.entropy.ch/pictures/usa-2005-blog/small/california_napavalley.jpg&quot;/&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On Sunday &lt;a href=&quot;http://classjuggler.com&quot;&gt;friends&lt;/a&gt; took me to Napa Valley where we visited several wineries, among them beautiful &lt;a href=&quot;http://www.niebaum-coppola.com/&quot;&gt;Niebaum Coppola&lt;/a&gt;, to taste various great Californian wines... [&lt;a href=&quot;http://www.snapmania.com/album/CID-u0002164-100/&quot;&gt;Pictures&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;This week’s restaurant tips:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.anandafuara.com/&quot;&gt;Ananda Fuara&lt;/a&gt; at 1298 Market St. was way too busy when I visited so I couldn’t get a table, but the dishes and the menu looked very promising.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.withthecurrent.com/cafe.html&quot;&gt;Cafe Gratitude&lt;/a&gt; at 2400 Harrison St. was also too busy when I went for brunch, but I’ll try again next time :-)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.toyboatcafe.com/&quot;&gt;Toy Boat Dessert Cafe&lt;/a&gt; at 401 Clement St. has excellent sandwiches.&lt;/li&gt;
&lt;li&gt;I ate at &lt;a href=&quot;http://www.herbivore-restaurant.com/&quot;&gt;Herbivore&lt;/a&gt; several times at both locations, highly recommended.&lt;/li&gt;
&lt;li&gt;If you’re in the Napa Valley region, try the &lt;a href=&quot;http://www.patinagroup.com/pinotBlanc/&quot;&gt;Pinot Blanc&lt;/a&gt; restaurant at 641 Main St. in St. Helena.&lt;/li&gt;
&lt;li&gt;More veggie tips &lt;a href=&quot;http://www.bayareaveg.org/ug/&quot;&gt;here&lt;/a&gt; and &lt;a href=&quot;http://www.vegetarian-restaurants.net/usa/SanFrancisco.htm&quot;&gt;here&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</description>
            <guid>http://www.entropy.ch/blog/Travel/?permalink=USA_2005_Week_2_in_San_Francisco.html</guid>
			<pubDate>Sun, 12 Jun 2005 07:19:35 +0200</pubDate>
                    </item>
        	            <item>
            <title>USA 2005 / Week 1 in San Francisco</title>
            <!--<link>http://www.entropy.ch/blog/Travel/?permalink=USA_2005_Week_1_in_San_Francisco.html</link>-->
            <link>http://www.entropy.ch/blog/Travel/2005/06/05/USA_2005_Week_1_in_San_Francisco.html</link>
            <description>&lt;p&gt;[This is part 2. See part &lt;a href=&quot;http://www.entropy.ch/blojsom/blog/marc/Travel/2005/05/31/USA_2005_In_San_Francisco.html&quot;&gt;1&lt;/a&gt;, &lt;a href=&quot;http://www.entropy.ch/blojsom/blog/marc/Travel/2005/06/12/USA_2005_Week_2_in_San_Francisco.html&quot;&gt;3&lt;/a&gt; or &lt;a href=&quot;http://www.entropy.ch/blojsom/blog/marc/Travel/2005/07/01/USA_2005_Boston_New_York_and_Washington_DC.html&quot;&gt;4&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;So my first week in San Francisco is over, I was looking at things in the city, except for one meeting outside of San Francisco in Cupertino. I rented a car to get there and I’m glad I planned for two hours of driving time instead of only one, because traffic on that highway was horrible, I guess the three-car accident during the morning rush hour didn’t help. Other than that, driving a car is fun here, wide roads and everything :-)&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.entropy.ch/pictures/usa-2005-blog/medium/california_highway1.jpg&quot;&gt;&lt;img style=&quot;float: right; margin: 0 0 10px 10px;&quot; src=&quot;http://www.entropy.ch/pictures/usa-2005-blog/small/california_highway1.jpg&quot;/&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;My meeting was over before noon and since I had the car for the rest of the day I went to Santa Cruz for lunch. One place I highly recommend there is the &lt;a href=&quot;http://www.saturncafe.com/&quot;&gt;Saturn Cafe&lt;/a&gt;. (You’ll notice that most of my restaurant tips in this and the following blog entries focus on places which have good vegetarian food :-). On the way back, I took highway 1 for the scenic coastal views [&lt;a href=&quot;http://www.snapmania.com/album/CID-u0002164-91/&quot;&gt;Pictures&lt;/a&gt;]. Last time I was here in California I did this trip in the other direction, going from San Francisco to Los Angeles.&lt;/p&gt;

&lt;p&gt;In general I used public transportation to get around San Francisco, which works fine. There are enough options, but at first it’s not quite easy to figure out when and where the bus lines run, especially the ones going out of town.&lt;/p&gt;

&lt;p&gt;People tell me I was lucky with the weather so far. All sunshine, not a single day of fog or rain... There is one thing I keep forgetting though: It is *cold* here in the summer in San Francisco. I mentioned this to friends and was amused to hear the same quote independently from two different people on the same day: &lt;a href=&quot;http://www.greenspun.com/bboard/q-and-a-fetch-msg.tcl?msg_id=009Ckt&quot;&gt;“The coldest winter I ever spent was a summer in San Francisco.”&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I’m wearing sweaters now whenever I go out, but I know that if the cold air and chilly wind outdoors doesn’t get me, then the insane air-conditioning everywhere will do it instead...&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.entropy.ch/pictures/usa-2005-blog/medium/california_ghirardelli.jpg&quot;&gt;&lt;img style=&quot;float: right; margin: 0 0 10px 10px;&quot; src=&quot;http://www.entropy.ch/pictures/usa-2005-blog/small/california_ghirardelli.jpg&quot;/&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One of the things I didn’t get to see last time was the &lt;a href=&quot;http://www.ghirardelli.com&quot;&gt;Ghirardelli&lt;/a&gt; square with the chocolate store. I bought a big pile of chocolate so I can do some in-depth studies and comparisons with Swiss chocolate when I’m back home. All in the interest of scientific study :-)&lt;/p&gt;

&lt;p style=&quot;clear: both;&quot;&gt;&lt;a href=&quot;http://www.entropy.ch/pictures/usa-2005-blog/medium/california_palaceoffinearts.jpg&quot;&gt;&lt;img style=&quot;float: right; margin: 0 0 10px 10px;&quot; src=&quot;http://www.entropy.ch/pictures/usa-2005-blog/small/california_palaceoffinearts.jpg&quot;/&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I think the highlight of the week was a &lt;a href=&quot;http://www.sfelectrictour.com/&quot;&gt;Segway city tour&lt;/a&gt;. I always wanted to ride a Segway and this was the perfect opportunity. It was way better than I expected, after 5 minutes I was totally hooked. It looks really dorky, but moving around with this engineering marvel is just so much fun. The tour guide was also pretty witty so I highly recommend these guys. I want to do it again when I’m in one of the other cities I’ll be visiting on this trip. [&lt;a href=&quot;http://www.snapmania.com/album/CID-u0002164-94/&quot;&gt;Pictures&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;The tour doesn’t actually show a lot of San Francisco because Segways are not allowed on streets or sidewalks in the city. Instead we get to see a lot of the waterfront including the Marina District, Palace of Fine Arts, etc. That spot is really beautiful and has lots of photo opportunities so I decide to come back later (unfortunately without Segway)... [&lt;a href=&quot;http://www.snapmania.com/album/CID-u0002164-95/&quot;&gt;Pictures&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;One evening I visited friends who moved to the US to live and work in Foster City near SF, a nice place.  It was interesting to hear their stories about some everyday-life differences between here and Switzerland. Some things are truly surprising, they live in this high-tech region of California yet the cable Internet connection broke down weeks ago and their provider just cannot fix it so they have to switch to DSL, which is also a pain to get going. Weeks of discussions with clueless support people and without Internet connection etc.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.entropy.ch/pictures/usa-2005-blog/medium/california_farmersmarket.jpg&quot;&gt;&lt;img style=&quot;float: right; margin: 0 0 10px 10px;&quot; src=&quot;http://www.entropy.ch/pictures/usa-2005-blog/small/california_farmersmarket.jpg&quot;/&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On Wednesday and Saturday there’s a &lt;a href=&quot;http://sanfrancisco.about.com/cs/familyactivities/a/ferrybldg.htm&quot;&gt;farmer’s market&lt;/a&gt;, on Civic Plaza and at the Ferry Building, respectively. Lots of things to try and buy, mostly organic. I highly recommend a visit. There’s one place that sells nuts in all variations, including ones covered with chocolate and a few quite funky combinations.&lt;/p&gt;

&lt;p style=&quot;clear: both;&quot;&gt;&lt;a href=&quot;http://www.entropy.ch/pictures/usa-2005-blog/medium/california_wwdcreg.jpg&quot;&gt;&lt;img style=&quot;float: right; margin: 0 0 10px 10px;&quot; src=&quot;http://www.entropy.ch/pictures/usa-2005-blog/small/california_wwdcreg.jpg&quot;/&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On Sunday evening, I meet &lt;a href=&quot;http://www.dmcinsights.com&quot;&gt;Larry Ullman&lt;/a&gt; in person for the first time, which is funny considering that by now we’ve written three books together, all using e-mail and iChat only. We met at the Moscone center to pre-register for the conference next week, picking up our badges and the usual goodies. By that time, we were still wondering which of the various &lt;a href=&quot;http://news.com.com/Apple+to+ditch+IBM%2C+switch+to+Intel+chips/2100-1006_3-5731398.html?tag=macintouch&quot;&gt;rumors&lt;/a&gt; flying around would be confirmed at the keynote on Monday morning.&lt;/p&gt;

&lt;p&gt;Some more hotel/restaurant tips:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.melatandoori.com&quot;&gt;Mela Tandoori&lt;/a&gt; serves great Indian / Pakistani food. Make sure to try the garlic naan bread as side order.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.sanfrancisco-budgethotel.com/&quot;&gt;Taylor Hotel&lt;/a&gt; at Post and Taylor was a pleasant surprise. The rooms and the building are really old and it shows, but everything is clean, the location is excellent, just a few blocks from Union Square, and the price is unbeatable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A friend sent me this in preparation for the keynote: :-)&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.geekculture.com/joyoftech/joystuff/stevejobsdressup.html&quot; title=&quot;Steve Jobs Dress-up!&quot;&gt;Steve Jobs Dress-up!&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;P.S.: I’m uploading pictures to my &lt;a href=&quot;http://www.snapmania.com&quot;&gt;snapmania.com&lt;/a&gt; account from time to time:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.snapmania.com/users/mliyanage/usa2005/&quot;&gt;http://www.snapmania.com/users/mliyanage/usa2005/&lt;/a&gt;&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Travel/?permalink=USA_2005_Week_1_in_San_Francisco.html</guid>
			<pubDate>Sun, 5 Jun 2005 11:35:47 +0200</pubDate>
                    </item>
        	            <item>
            <title>USA 2005 / In San Francisco</title>
            <!--<link>http://www.entropy.ch/blog/Travel/?permalink=USA_2005_In_San_Francisco.html</link>-->
            <link>http://www.entropy.ch/blog/Travel/2005/05/31/USA_2005_In_San_Francisco.html</link>
            <description>&lt;p&gt;I’m in San Francisco and ready for &lt;a href=&quot;http://developer.apple.com/wwdc/&quot;&gt;WWDC&lt;/a&gt; next week. This week I’ll meet friends and do some touristy things in and around the city... Thanks to everyone who posted comment tips to my earlier travel &lt;a href=&quot;http://www.entropy.ch/blojsom/blog/marc/Travel/2005/04/02/Trip_to_the_US_booking_flights_online.html&quot;&gt;blog entry&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The trip was nice but it was a long day with all the time shifts on the way from Europe to the US west coast. Having the US immigration service take my &lt;a href=&quot;http://www.dhs.gov/dhspublic/interapp/content_multi_image/content_multi_image_0006.xml&quot;&gt;fingerprints and mug shot&lt;/a&gt; sucks. On my connecting flight from Washington, DC to San Francisco, I was pleasantly surprised by &lt;a href=&quot;http://www.flyi.com/&quot;&gt;Independence Air&lt;/a&gt;, they have great prices and very friendly staff both on the ground and on board.&lt;/p&gt;

&lt;p&gt;After all the long flights, waiting times and a quick BART ride I was glad to drop into my hotel bed. I’m staying at the &lt;a href=&quot;http://www.sanfrancisco-budgethotel.com/&quot;&gt;Taylor Hotel&lt;/a&gt; at the corner of &lt;a href=&quot;http://maps.google.com/maps?q=612+Taylor+Street,+San+Francisco+to+747+howard+street,+san+francisco&amp;spn=0.007401,0.014258&amp;hl=en&quot;&gt;Taylor and Post&lt;/a&gt; (can you tell I love Google Maps :-) It is immensely helpful). The hotel is pretty bare-bones but clean and affordable, with friendly management. Unfortunately I can’t pick up their free wireless signal in the lobby from my room and I can’t be bothered to go down there every time I need Internet connectivity. Luckily, there are about five to six other wireless networks visible from my room if I move my Laptop and tilt its screen just right :-) Several of the networks are unprotected and I can use one of them to connect, although the weak signal keeps it rather flaky.&lt;/p&gt;

&lt;p&gt;I spent most of today walking around and shopping, most stores were open for business even though it was Memorial Day. I could resist the &lt;a href=&quot;http://www.us.playstation.com/psp.aspx&quot;&gt;PSP&lt;/a&gt; for now, but I’ll be here for two more weeks and the SONY center that has them in stock is across the street from Moscone West, so you know what will happen one of these days :-)&lt;/p&gt;
&lt;p&gt;I also had an exceptionally tasty dinner at the &lt;a href=&quot;http://www.toyboatcafe.com/&quot;&gt;Toy Boat Dessert Cafe&lt;/a&gt;, which I highly recommend.&lt;/p&gt;

&lt;p&gt;Tomorrow I’m off to the Apple campus in Cupertino for a meeting, and since I already have the rental car for the day I’ll probably spend a few hours in Palo Alto which I really liked last time.&lt;/p&gt;

&lt;p&gt;For those attending WWDC, &lt;a href=&quot;http://www.icalx.com/html/liyanage/week.php?cal=WWDC2005Sessions&amp;getdate=20050606&quot;&gt;here&lt;/a&gt; are the sessions I plan to attend, although it will probably change several more times.&lt;/p&gt;

&lt;p&gt;BTW, I am *very* impressed by iCal’s cross-timezone capabilities. I used the program to plan all my travel details and by correctly marking the events with their time zones and switching the view time zone at the appropriate times, I was always organized. This is something you almost never use or notice, but when you do need it and it works so well, it’s invaluable.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Travel/?permalink=USA_2005_In_San_Francisco.html</guid>
			<pubDate>Tue, 31 May 2005 15:06:54 +0200</pubDate>
                    </item>
        	            <item>
            <title>Links of the Day – Tiger stuff</title>
            <!--<link>http://www.entropy.ch/blog/Links/?permalink=Links_of_the_Day_%E2%80%93_Tiger_stuff.html</link>-->
            <link>http://www.entropy.ch/blog/Links/2005/04/29/Links_of_the_Day_%E2%80%93_Tiger_stuff.html</link>
            <description>&lt;p&gt;Wow, what a nice harvest of Tiger-related goodies during the last two daily visits to &lt;a href=&quot;http://www.versiontracker.com&quot;&gt;VersionTracker.com&lt;/a&gt; :-)&lt;/p&gt;

&lt;p&gt;I really liked:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.completedigitalphotography.com/index.php?p=339&quot; title=&quot;Complete Digital Photography » Photoshop Automator Actions&quot;&gt;Photoshop Automator Actions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.versiontracker.com/dyn/moreinfo/macosx/19161&quot; title=&quot;OmniGraffle Pro 3.2.2 - VersionTracker:&quot;&gt;OmniGraffle Pro&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.versiontracker.com/dyn/moreinfo/macosx/25067&quot; title=&quot;Delicious Library 1.5 - VersionTracker:&quot;&gt;Delicious Library 1.5 - VersionTracker:&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;a href=&quot;http://www.joyoftech.com/joyoftech/joyarchives/678.html&quot; title=&quot;★ The Joy of Tech! ★&quot;&gt;★ The Joy of Tech! ★&lt;/a&gt;


</description>
            <guid>http://www.entropy.ch/blog/Links/?permalink=Links_of_the_Day_%E2%80%93_Tiger_stuff.html</guid>
			<pubDate>Fri, 29 Apr 2005 23:56:37 +0200</pubDate>
                    </item>
        	             <item>
            <title>Looking for two Software Engineers</title>
            <!--<link>http://www.entropy.ch/blog/?permalink=Looking_for_two_Software_Engineers.html</link>-->
            <link>http://www.entropy.ch/blog/2005/04/28/Looking_for_two_Software_Engineers.html</link>
            <description>&lt;p&gt;We’re looking for one to two German- and English-speaking software engineers at futureLAB AG.&lt;/p&gt;

&lt;p&gt;More details at &lt;a href=&quot;http://www.futurelab.ch/de/jobs.html&quot;&gt;http://www.futurelab.ch/de/jobs.html&lt;/a&gt;.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/?permalink=Looking_for_two_Software_Engineers.html</guid>
			<pubDate>Thu, 28 Apr 2005 11:28:22 +0200</pubDate>
                    </item>
        	            <item>
            <title>Links of the Day</title>
            <!--<link>http://www.entropy.ch/blog/Links/?permalink=Links_of_the_Day.html</link>-->
            <link>http://www.entropy.ch/blog/Links/2005/04/22/Links_of_the_Day.html</link>
            <description>&lt;p&gt;From time to time I’ll post a bunch of interesting links I visit on a particular day together as one entry in the new category “Links”. It’s usually a wild mix, sometimes about technologies I have to research for my job, about graphic design, funny stuff, etc. It’s mostly for items that don’t merit their own bookmark list entry, so I can still find them again later, but also for the benefit of the readers of this blog :-)&lt;/p&gt;

&lt;p&gt;Feel free to comment or trackback with similar items.&lt;/p&gt;

&lt;p&gt;The first bunch...&lt;/p&gt;

&lt;p&gt;I was researching rule engines in the context of billing systems. If anyone has good pointers or books, please let me know.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.compiere.org/&quot; title=&quot;Smart Open Source ERP Software Solutions with integrated CRM Software Solutions - Compiere&quot;&gt;Smart Open Source ERP Software Solutions with integrated CRM Software Solutions - Compiere&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://drools.org/&quot; title=&quot;Drools - Home&quot;&gt;Drools - Home&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blogs.ittoolbox.com/eai/leadership/archives/002172.asp&quot; title=&quot;Thinking Out Loud: Thought Leadership from an Enterprise Architect: Architect&#39;s opinion on Business Rules&quot;&gt;Thinking Out Loud: Thought Leadership from an Enterprise Architect: Architect&#39;s opinion on Business Rules&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://theserverside.com/articles/article.tss?l=Drools&quot; title=&quot;TheServerSide.com - An Introduction to the Drools Project&quot;&gt;TheServerSide.com - An Introduction to the Drools Project&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Photoshop skill galleries, some amazing stuff here: &lt;a href=&quot;http://www.worth1000.com/cache/contest/contestcache.asp?contest_id=5660&amp;start=21&amp;end=30&amp;display=photoshop#entries&quot; title=&quot;Worth1000.com | Photoshop Contests | Are you Worthy™ | contest&quot;&gt;Worth1000.com | Photoshop Contests | Are you Worthy™ | contest&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.blogthings.com/amenglishdialecttest/&quot; title=&quot;Blogthings - What Kind of American English Do You Speak?&quot;&gt;Blogthings - What Kind of American English Do You Speak?&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://osnews.com/story.php?news_id=10366&quot; title=&quot;A Brief Tutorial on Reverse Engineering OS X - OSNews.com&quot;&gt;A Brief Tutorial on Reverse Engineering OS X - OSNews.com&lt;/a&gt;&lt;/p&gt;

</description>
            <guid>http://www.entropy.ch/blog/Links/?permalink=Links_of_the_Day.html</guid>
			<pubDate>Fri, 22 Apr 2005 10:16:37 +0200</pubDate>
                    </item>
        	            <item>
            <title>PHP 4.3.11 Packages available</title>
            <!--<link>http://www.entropy.ch/blog/Software/?permalink=PHP_4_3_11_Packages_available.html</link>-->
            <link>http://www.entropy.ch/blog/Software/2005/04/17/PHP_4_3_11_Packages_available.html</link>
            <description>&lt;p&gt;I updated the PHP packages from 4.3.10 to 4.3.11:&lt;/p&gt;

&lt;a href=&quot;http://www.entropy.ch/phpbb2/viewtopic.php?p=7327&quot;&gt;http://www.entropy.ch/phpbb2/viewtopic.php?p=7327&lt;/a&gt;

</description>
            <guid>http://www.entropy.ch/blog/Software/?permalink=PHP_4_3_11_Packages_available.html</guid>
			<pubDate>Sun, 17 Apr 2005 23:25:42 +0200</pubDate>
                    </item>
        	            <item>
            <title>PHP 5.0.4 Packages available</title>
            <!--<link>http://www.entropy.ch/blog/Software/?permalink=PHP_5_0_4_Packages_available.html</link>-->
            <link>http://www.entropy.ch/blog/Software/2005/04/07/PHP_5_0_4_Packages_available.html</link>
            <description>&lt;p&gt;I put up some packages for PHP 5.0.4:&lt;/p&gt;

&lt;a href=&quot;http://www.entropy.ch/phpbb2/viewtopic.php?t=1900&quot;&gt;http://www.entropy.ch/phpbb2/viewtopic.php?t=1900&lt;/a&gt;
</description>
            <guid>http://www.entropy.ch/blog/Software/?permalink=PHP_5_0_4_Packages_available.html</guid>
			<pubDate>Thu, 7 Apr 2005 08:06:43 +0200</pubDate>
                    </item>
        	            <item>
            <title>Trip to the US / booking flights online...</title>
            <!--<link>http://www.entropy.ch/blog/Travel/?permalink=Trip_to_the_US_booking_flights_online.html</link>-->
            <link>http://www.entropy.ch/blog/Travel/2005/04/02/Trip_to_the_US_booking_flights_online.html</link>
            <description>&lt;p&gt;I’ll be spending this year’s vacation in the US again, including one week at &lt;a href=&quot;http://developer.apple.com/wwdc/&quot;&gt;WWDC&lt;/a&gt; in San Francisco. I will also spend some time on the east coast in Boston, New York and Washington to visit friends and do some sightseeing before returning home.&lt;/p&gt;

&lt;p&gt;While researching my flight options online, I spent a *lot* of time on various travel sites selling airline tickets over the Internet. There were various issues with most of them. 1.) As outlined above, my itinerary is not a simple round-trip journey and most of the systems cannot handle complex queries well. Some don&#39;t even do one-way. 2.) Others have high prices and 3.) most of them will not allow me to book with a credit card whose billing address is non-US, even though it’s all strictly e-ticketing only. 4.) Many have used web coding stuff that does not work in Safari, or does not work in anything but Windows MSIE.&lt;/p&gt;

&lt;p&gt;In the end I was very impressed by &lt;a href=&quot;http://www.travelocity.com&quot;&gt;travelocity.com&lt;/a&gt;. They could handle my schedule of Zurich -&gt; San Francisco -&gt; Boston, and Washington -&gt; Zurich without problems. They accept my Swiss credit card and their prices for domestic flights are the best I’ve seen anywhere.&lt;/p&gt;

&lt;p&gt;I did find a better price for the transcontinental flight from a local site, &lt;a href=&quot;http://www.globetrotter.ch&quot;&gt;globetrotter.ch&lt;/a&gt;, so I booked that part there.&lt;/p&gt;

&lt;p&gt;I highly recommend both sites and if you know of a place that has even better deals, please post a comment :-)&lt;/p&gt;

&lt;p&gt;Oh yeah, and if anyone can offer accommodation or has a good tip on cheap hotels in any of the places mentioned, but especially San Francisco, drop me a note :-)&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Travel/?permalink=Trip_to_the_US_booking_flights_online.html</guid>
			<pubDate>Sat, 2 Apr 2005 17:40:56 +0200</pubDate>
                    </item>
        	             <item>
            <title>Vertical stripes test pattern for analog LCD screen adjustment</title>
            <!--<link>http://www.entropy.ch/blog/?permalink=Vertical_strips_test_pattern_for_LCD_adjustment.html</link>-->
            <link>http://www.entropy.ch/blog/2005/03/30/Vertical_strips_test_pattern_for_LCD_adjustment.html</link>
            <description>&lt;p&gt;When I sit in front of a friend’s computer which is connected to the analog input (shudder...) of its LCD screen, I often have to adjust and fine-tune the horizontal phase and timing first so it doesn&#39;t look all fuzzy. Amazing how many people have a nice screen with totally fuzzy text...&lt;/p&gt;

&lt;p&gt;I always use a test pattern with vertical black and white stripes 1 pixel wide to see when the adjustment is perfect, i.e. when the pixels fall exactly on the screen’s grid.&lt;/p&gt;

&lt;p&gt;I put such a &lt;a href=&quot;http://www.entropy.ch/pictures/lcdscreen-testpattern.png&quot;&gt;pattern image&lt;/a&gt; onto my &lt;a href=&quot;http://www.entropy.ch/pictures/&quot;&gt;pictures page&lt;/a&gt; under “Misc”.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/?permalink=Vertical_strips_test_pattern_for_LCD_adjustment.html</guid>
			<pubDate>Wed, 30 Mar 2005 13:48:08 +0200</pubDate>
                    </item>
        	            <item>
            <title>Quickie shell command to find files with resource forks</title>
            <!--<link>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Quickie_shell_command_to_find_files_with_resource_forks.html</link>-->
            <link>http://www.entropy.ch/blog/Mac+OS+X/2005/03/30/Quickie_shell_command_to_find_files_with_resource_forks.html</link>
            <description>&lt;p&gt;This shell commands finds all files with resource forks in the current directory:&lt;/p&gt;

&lt;pre&gt;find . -type f -exec test -s {}/..namedfork/rsrc \; -print&lt;/pre&gt;

&lt;p&gt;I plan to get rid of all such files in my home directory so I can back it up using simple UNIX tools.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Quickie_shell_command_to_find_files_with_resource_forks.html</guid>
			<pubDate>Wed, 30 Mar 2005 11:49:25 +0200</pubDate>
                    </item>
        	            <item>
            <title>Transparent PNGs in Windows Internet Explorer</title>
            <!--<link>http://www.entropy.ch/blog/Website/?permalink=Transparent_PNGs_in_Windows_Internet_Explorer.html</link>-->
            <link>http://www.entropy.ch/blog/Website/2005/03/24/Transparent_PNGs_in_Windows_Internet_Explorer.html</link>
            <description>&lt;p&gt;After I &lt;a href=&quot;http://www.entropy.ch/blojsom/blog/marc/Website/2005/02/20/Website_Format_Changes.html?page=comments&quot;&gt;converted these web pages to XHTML 1.1&lt;/a&gt; a few weeks ago, they came up blank when viewed in Internet Explorer 6 on Windows. As noted in the comments, that was caused by minimized script tags (&amp;lt;script ... /&gt;).&lt;/p&gt;

&lt;p&gt;I recently spent some more time to fix this issue and to make sure the the missing XML namespace is present in the output.&lt;/p&gt;

&lt;p&gt;While I was at it, I also wanted to tweak the CSS to improve the web site’s look on MSIE 6. The main problem there is MSIE’s lack of support for the 8-bit alpha-transparency masks in PNG images, which I use extensively. For example, the background images in the box divs and in table TH and TD elements are white squares with an opacity of 10 and 20 percent. The resulting boxes are a bit lighter than the background but you can see the background pattern through the boxes.&lt;/p&gt;

&lt;p&gt;Also, lots of the images I use, such as the user forum logo, have soft drop shadows which blend nicely with background. All these effects are rendered correctly on Safari, Firefox and many other browsers, but were not rendered at all on MSIE. Instead of the transparent parts, a really ugly light blue box was drawn. It was especially bad when text was placed on top of the boxes because the white text on the light blue background was completely unreadable.&lt;/p&gt;

&lt;p&gt;Because of this, I am serving a different CSS to MSIE browsers which until now replaced the transparent background PNG images with solid colors of about the same lightness as the other browsers would render. It looks a lot flatter though. And I could not do anything about the transparency in images, the ugly bright rectangles were just there.&lt;/p&gt;

&lt;p&gt;Now I spent some time with the information presented in a Microsoft support article which explains the &lt;a href=&quot;http://support.microsoft.com/default.aspx?scid=kb;en-us;294714&quot;&gt;AlphaImageLoader&lt;/a&gt; filter. It was easy to get it to work in the separate MSIE CSS I already had. I just replaced the background colors with the appropriate filter setting:&lt;/p&gt;

&lt;div class=&quot;box&quot;&gt;&lt;pre&gt;background-image: none;
background-color: #767798;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;became&lt;/p&gt;

&lt;div class=&quot;box&quot;&gt;&lt;pre&gt;background-image: none;
filter: progid:&lt;span/&gt;DXImageTransform.Microsoft.AlphaImageLoader(
    src=&#39;http://www.entropy.ch/images/white-square-10-percent.png&#39;,
    sizingMethod=&#39;scale&#39;);&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt; (the regular CSS rule for sane browsers is &lt;tt&gt;background-image: url(/images/white-square-10-percent.png);&lt;/tt&gt;)&lt;/p&gt;

&lt;p&gt;So much for the PNGs that were specified in the CSS. Getting the regular images on a web page to render correctly was slightly more work. I wrote a JavaScript that is invoked from the body’s onload handler. It looks at all img and some input elements in the page DOM and modifies the ones whose src attribute value ends with “.png”:&lt;/p&gt;

&lt;div class=&quot;code&quot;&gt;function msie_replace_png_imgs() {

  if (!is_msie()) return;

  var i, elements;



  elements = document.getElementsByTagName(&quot;img&quot;);
  for (i = 0; i &amp;lt; elements.length; i++) {
    var img = elements[i];
    if (img.src.toLowerCase().search(/\.png$/) &amp;lt; 0) continue;

    img.style.filter =
      &quot;progid:&lt;span/&gt;DXImageTransform.Microsoft.
        AlphaImageLoader(
          src=&#39;&quot; + img.src  + &quot;&#39;, sizingMethod=&#39;image&#39;)&quot;;
    img.src = &quot;/images/spacer.gif&quot;;

  }

  elements = document.getElementsByTagName(&quot;input&quot;);
  for (i = 0; i &amp;lt; elements.length; i++) {
    var input = elements[i];
    if (input.getAttribute(&quot;type&quot;) != &quot;image&quot;) continue;
    if (input.getAttribute(&quot;src&quot;).toLowerCase().search(/\.png$/) &amp;lt; 0)
      continue;

    input.style.filter = &quot;progid:&lt;span/&gt;DXImageTransform.Microsoft.
      AlphaImageLoader(
        src=&#39;&quot; + input.src  + &quot;&#39;, sizingMethod=&#39;image&#39;)&quot;;
    input.src = &quot;/images/spacer.gif&quot;;
  }

}

function is_msie() {
  return navigator.userAgent.toLowerCase().indexOf(&quot;msie&quot;) != -1; 
}&lt;/div&gt;

&lt;p&gt;The page will still load with the PNGs rendered incorrectly, but at the end of the loading process they will flip over to the final state with the alpha transparency fully enabled.&lt;/p&gt;

&lt;p&gt;The next problem, to which I don’t really have a solution yet, is that most of the links on the web page which are in a box with a semi-transparent background are now somehow inaccessible, I cannot click on any of them. Let me know if you know anything about this...&lt;/p&gt;

&lt;p&gt;The conclusion so far is, once again, that MSIE is an incredibly shitty piece of junk... Interesting stuff that just works on other, modern browsers can be made to work on MSIE too, but it’s as much fun as repeatedly banging on your thumb with a big hammer... What is really, really sad is that Microsoft’s people actually seem to &lt;a href=&quot;http://blogs.msdn.com/ie/archive/2005/03/09/391362.aspx&quot;&gt;hallucinate that they’ve been doing a good job so far...&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; I found a solution to the link problem &lt;a href=&quot;http://web.archive.org/web/20050325090322/http://www.alistapart.com/discuss/pngopacity/14/#c4787&quot;&gt;here&lt;/a&gt; (the background tile height may not be larger than 1 pixel). Another solution is noted below in the comments.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Website/?permalink=Transparent_PNGs_in_Windows_Internet_Explorer.html</guid>
			<pubDate>Thu, 24 Mar 2005 00:46:01 +0100</pubDate>
                    </item>
        	            <item>
            <title>Combining ipfw/natd and SSH Tunnels</title>
            <!--<link>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Combining_ipfw_natd_and_SSH_Tunnels.html</link>-->
            <link>http://www.entropy.ch/blog/Mac+OS+X/2005/03/14/Combining_ipfw_natd_and_SSH_Tunnels.html</link>
            <description>&lt;p&gt;Recently I needed to do some web development on a set of hosts which are part of a test/staging platform. This test system is not reachable directly via the Internet, only via SSH tunneling. Simply setting up a tunnel did not work though, because there are several hosts and only one can use port 80, the others would have to be accessed using different ports. This in turn would not work because the system generates lots of URLs for links and HTTP redirect messages to all involved hosts, and these URLs don’t include the changed port number. All the while, the host names entered in the browser (and therefore in the “Host” HTTP header) must be what the systems expect, otherwise the Apache virtual host mapping and some of my own software breaks.&lt;/p&gt;

&lt;p&gt;In the end I used a few /etc/hosts entries, multiple SSH tunnels, and the ipfw/natd firewalling/network address translation software included in Mac OS X to do it. I used this as an opportunity to learn about natd/ipfw, which were completely new to me. Since I still don’t really know what I’m doing in this area, you’re welcome to post improvements to this setup in the comments :-)&lt;/p&gt;

&lt;p&gt;The setup works like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I need to access port 80 on three hosts, let’s call them hosta.example.com, hostb.example.com and hostc.example.com&lt;/li&gt;
&lt;li&gt;Three different SSH tunnels are set up to these three hosts/ports, listening on the local ports 10082, 10083, 10084&lt;/li&gt;
&lt;li&gt;Since there are no publicly visible DNS records for the hosts, their names are added to the /etc/hosts file. We assign the names to additional 127.0.0.x addresses, which we activate on the loopback interface.&lt;/li&gt;
&lt;li&gt;Firewall rules are set up to divert traffic to the three new addresses to three separate natd processes. Each one rewrites packets for a particular host so they get sent to the corresponding SSH tunnel. When the response packets arrive out of the tunnel, the mapping is reversed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The additions in the /etc/hosts file look like this:&lt;/p&gt;

&lt;div class=&quot;box&quot;&gt;
&lt;pre&gt;127.0.0.2 hosta.example.com
127.0.0.3 hostb.example.com
127.0.0.4 hostc.example.com
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;The script I use to set up everything looks like this:&lt;/p&gt;

&lt;div class=&quot;box&quot;&gt;
&lt;pre&gt;function cleanup {
    echo &quot;cleaning up...&quot;
    killall natd
    ipfw -f flush
    perl -p -i -e &#39;s/^(127.0.0.(2|3|4).+)/#\1/g&#39; /etc/hosts
    sysctl -w net.inet.ip.fw.verbose=0
    exit
}

trap cleanup INT

perl -p -i -e &#39;s/^#(127.0.0.(2|3|4).+)/\1/g&#39; /etc/hosts

sysctl -w net.inet.ip.fw.verbose=1
killall natd
ipfw -f flush


for i in 2 3 4; do

    ifconfig lo0 127.0.0.$i alias
    
    ipfw add divert 1000$i log tcp from me to 127.0.0.$i
    ipfw add divert 1000$i log tcp from 127.0.0.$i 1008$i to me
    natd -l -port 1000$i -interface lo0 \
    -proxy_only -proxy_rule port 80 server 127.0.0.$i:1008$i

done

ssh -g -a -x -N -T \
    -L10082:hosta.example.com:80 \
    -L10083:hostb.example.com:80 \
    -L10084:hostc.example.com:80 \
    mliyanage@gateway.example.com&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;When I start it, it stays in the foreground. As soon as I’m finished, I hit Ctrl-C and it cleans up everything.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Combining_ipfw_natd_and_SSH_Tunnels.html</guid>
			<pubDate>Mon, 14 Mar 2005 11:11:29 +0100</pubDate>
                    </item>
        	            <item>
            <title>Updated PHP 5.0.3 Packages to Release 4</title>
            <!--<link>http://www.entropy.ch/blog/Software/?permalink=Updated_PHP_5_0_3_Packages_to_Release_4.html</link>-->
            <link>http://www.entropy.ch/blog/Software/2005/03/08/Updated_PHP_5_0_3_Packages_to_Release_4.html</link>
            <description>&lt;p&gt;
I just updated the PHP 5 packages to bring some of the libraries up to date.
&lt;/p&gt;&lt;p&gt;
Details at &lt;a href=&quot;http://www.entropy.ch/phpbb2/viewtopic.php?p=7108&quot;&gt;http://www.entropy.ch/phpbb2/viewtopic.php?p=7108&lt;/a&gt;
&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Software/?permalink=Updated_PHP_5_0_3_Packages_to_Release_4.html</guid>
			<pubDate>Tue, 8 Mar 2005 11:57:28 +0100</pubDate>
                    </item>
        	            <item>
            <title>Terminal tricks: &amp;#8220;term&amp;#8221;</title>
            <!--<link>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Terminal_tricks_8220_term_8221_and_8220_clone_8221.html</link>-->
            <link>http://www.entropy.ch/blog/Mac+OS+X/2005/02/28/Terminal_tricks_8220_term_8221_and_8220_clone_8221.html</link>
            <description>&lt;p&gt;Today I had the idea for a short shell/AppleScript hack, and when I started to implement it I noticed I already had the same idea two years ago... So I cleaned it up a little to post it here.&lt;/p&gt;

&lt;p&gt;What it does is open up a new Terminal window and execute the arguments as command in that new window. When no arguments are given, it opens the new window in the current directory, which means it acts like a &amp;#8220;clone&amp;#8221; operation for the frontmost window. This is useful if you&#39;re in some deeply nested directory and you need a second window right there. This way you don&amp;#8217;t have to copy/paste or type the directory path.&lt;/p&gt;

&lt;div class=&quot;box&quot;&gt;
&lt;pre&gt;#!/bin/sh
#
# Open a new Mac OS X terminal window with the command given
# as argument.
#
# - If there are no arguments, the new terminal window will
#   be opened in the current directory, i.e. as if the command
#   would be &quot;cd `pwd`&quot;.
# - If the first argument is a directory, the new terminal will
#   &quot;cd&quot; into that directory before executing the remaining
#   arguments as command.
# - If there are arguments and the first one is not a directory,
#   the new window will be opened in the current directory and
#   then the arguments will be executed as command.
# - The optional, leading &quot;-x&quot; flag will cause the new terminal
#   to be closed immediately after the executed command finishes.
#
# Written by Marc Liyanage &amp;lt;http://www.entropy.ch&gt;
#
# Version 1.0
#

if [ &quot;x-x&quot; = x&quot;$1&quot; ]; then
    EXIT=&quot;; exit&quot;; shift;
fi

if [[ -d &quot;$1&quot; ]]; then
    WD=`cd &quot;$1&quot;; pwd`; shift;
else
    WD=&quot;&#39;`pwd`&#39;&quot;;
fi

COMMAND=&quot;cd $WD; $@&quot;
echo &quot;$COMMAND $EXIT&quot;

osascript 2&gt;/dev/null &amp;lt;&amp;lt;EOF
    tell application &quot;Terminal&quot;
        activate
        do script with command &quot;$COMMAND $EXIT&quot;
    end tell
EOF&lt;/pre&gt;
&lt;/div&gt;

Put this into a file called &amp;#8220;term&amp;#8221; and store it somewhere in your $PATH. I keep a directory called &amp;#8220;bin&amp;#8221;, which I add to $PATH in my .bashrc file, in my home directory for this purpose.

&lt;p&gt;Some examples:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;term&lt;/code&gt;&lt;br/&gt;
Open a second window in the current directory.
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;term ~&lt;/code&gt;&lt;br/&gt;
Open a second window in my home directory.
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;term vi ~/.bashrc&lt;/code&gt;&lt;br/&gt;
Open a second window and start editing my .bashrc file.
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;term ~ vi .bashrc&lt;/code&gt;&lt;br/&gt;
The same thing.
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;term vi xyz.sh&lt;/code&gt;&lt;br/&gt;
Open a second window in the current directory and start editing the xyz.sh file.
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;term tail -f error_log&lt;/code&gt;&lt;br/&gt;
Open a second window in the current directory (presumably /var/log/httpd) and start following the error_log file using tail.
&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Terminal_tricks_8220_term_8221_and_8220_clone_8221.html</guid>
			<pubDate>Mon, 28 Feb 2005 13:19:35 +0100</pubDate>
                    </item>
        	            <item>
            <title>LeanCalc 1.0, yet another calculator app...</title>
            <!--<link>http://www.entropy.ch/blog/Software/?permalink=LeanCalc_1_0_yet_another_calculator_app.html</link>-->
            <link>http://www.entropy.ch/blog/Software/2005/02/25/LeanCalc_1_0_yet_another_calculator_app.html</link>
            <description>&lt;img src=&quot;http://www.entropy.ch/software/macosx/leancalc/LeanCalc.png&quot; alt=&quot;LeanCalc application icon&quot; style=&quot;float: right; margin: 0 0 0 10px;&quot;/&gt;

&lt;p&gt;&lt;a href=&quot;http://www.entropy.ch/software/macosx/#leancalc&quot;&gt;LeanCalc&lt;/a&gt; is a Cocoa calculator program based on the &lt;a href=&quot;http://sourceforge.net/projects/calc&quot;&gt;calc&lt;/a&gt; library. I wrote it because I thought the Mac OS X world needed yet another calculator program :-)&lt;/p&gt;

&lt;p&gt;It can be used for simple arithmetic as well as complex calculations, thanks to calc’s large &lt;a href=&quot;http://www.isthe.com/chongo/tech/comp/calc/calc-builtin.html&quot;&gt;built-in function library&lt;/a&gt; (check out the reference in the application’s help menu). All calculations are kept in a history and you can reuse the results of the last few calculations in the history directly using keyboard shortcuts. Several calculation windows can be open at the same time, and you can save and reopen them as documents.&lt;/p&gt;

&lt;h3&gt;Screenshot&lt;/h3&gt;

&lt;a href=&quot;http://www.entropy.ch/software/macosx/leancalc/leancalc-screenshot-1.png&quot;&gt;Main Window&lt;/a&gt;

&lt;h3&gt;Download&lt;/h3&gt;

&lt;a href=&quot;http://www2.entropy.ch/download/LeanCalc-1.0.zip&quot;&gt;LeanCalc-1.0.zip&lt;/a&gt;
</description>
            <guid>http://www.entropy.ch/blog/Software/?permalink=LeanCalc_1_0_yet_another_calculator_app.html</guid>
			<pubDate>Fri, 25 Feb 2005 08:09:13 +0100</pubDate>
                    </item>
        	            <item>
            <title>The Move From CVS to Subversion</title>
            <!--<link>http://www.entropy.ch/blog/Developer/?permalink=The_Move_From_CVS_to_Subversion.html</link>-->
            <link>http://www.entropy.ch/blog/Developer/2005/02/24/The_Move_From_CVS_to_Subversion.html</link>
            <description>I converted my personal CVS repository to Subversion, running on Mac OS X, today. Here are a few notes...

&lt;h3&gt;Subversion Package&lt;/h3&gt;

&lt;p&gt;The first question (until Mac OS X Tiger arrives) is what packages to install on both client and server, i.e. if a simple client-only package is enough for both sides, or if a more elaborate server installation (with apache2 http server and WebDAV module) is required. Right now a simple svn+ssh connection to my machine hosting the repository is good enough for me, so I don’t need a real server installation. If I ever do, I will probably use DarwinPorts according to the &lt;a href=&quot;http://blog.x180.net/2005/01/subversion_via_.html&quot;&gt;notes by James Duncan Davidson&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;There are several Subversion client-side packages around. I ended up using the non-fink binary version linked to from the official &lt;a href=&quot;http://subversion.tigris.org/project_packages.html&quot;&gt;Subversion download&lt;/a&gt; page. Installation worked flawlessly on both machines and I’m very happy with it.&lt;/p&gt;

&lt;h3&gt;Repository Conversion Preparation&lt;/h3&gt;

&lt;p&gt;After installing Subversion onto the server, I converted my existing CVS repository into a Subversion repository using the &lt;a href=&quot;http://cvs2svn.tigris.org/&quot;&gt;cvs2svn&lt;/a&gt; migraton tool. I used version 1.2.1 (support for the Subversion repository backend type “fsfs”, which I wanted to use, seems to be available since version 1.2).&lt;/p&gt;

&lt;p&gt;cvs2svn is written in Python, which is already installed on Mac OS X Panther, but it requires a recent version of a Berkeley DB extension module, which is not included. I downloaded, built and installed both the &lt;a href=&quot;http://www.sleepycat.com/&quot;&gt;Berkeley DB&lt;/a&gt; package (version 4.3) and the Python wrapper for it, called &lt;a href=&quot;http://pybsddb.sourceforge.net/&quot;&gt;bsddb3&lt;/a&gt; (version 4.3.0). Installation was very easy for both as described in their respective README files:&lt;/p&gt;

&lt;p&gt;Inside the Berkeley DB distribution package, run&lt;/p&gt;

&lt;code&gt;
cd build_unix&lt;br/&gt;
../dist/configure&lt;br/&gt;
sudo make install
&lt;/code&gt;

&lt;p&gt;Inside the Pybsddb distribution package, run&lt;/p&gt;

&lt;code&gt;
python setup.py build&lt;br/&gt;
sudo python setup.py install
&lt;/code&gt;

&lt;p&gt;You can check if everything is installed correctly by invoking cvs2svn without parameters in its distribution directory:&lt;/p&gt;

&lt;code&gt;./cvs2svn&lt;/code&gt;

&lt;p&gt;It will complain if the DB modules are missing, and print a list of options if everything is OK.&lt;/p&gt;

&lt;h3&gt;The Actual Conversion&lt;/h3&gt;

&lt;p&gt;I tried the conversion twice, the way it worked correctly in the end was&lt;/p&gt;

&lt;code&gt;./cvs2svn --no-default-eol --fs-type=fsfs -s /Users/liyanage/Documents/svnroot /Users/liyanage/cvsroot&lt;/code&gt;

&lt;p&gt;The first time I ran it without the &lt;tt&gt;--no-default-eol&lt;/tt&gt; option, which corrupted lots of binary files like images and .nibs in my projects.&lt;/p&gt;

&lt;p&gt;The &lt;tt&gt;--fs-type=fsfs&lt;/tt&gt; option creates the repository with the filesystem-based storage backend, which I prefer after reading about the differences between fsfs and the older option, storage of the data in DB files.&lt;/p&gt;

&lt;p&gt;The &lt;tt&gt;-s&lt;/tt&gt; option supplies the location of the new repository to be created, and the last argument is the existing CVS repository. cvs2svn does not modify anything in the CVS repository, it’s strictly read-only.&lt;/p&gt;

&lt;h3&gt;Working with the new Repository&lt;/h3&gt;

&lt;p&gt;Before the conversion, I closed up all projects in my CVS sandboxes and did one last commit, as the conversion with cvs2svn is one-shot only.&lt;/p&gt;

&lt;p&gt;I literally know nothing about Subversion, but since the basic commands are so similar to CVS, I was able to checkout my migration “test case”, my Cocoa application TestXSLT, without any problems. As mentioned above, the first time around everything was broken because of the missing &lt;tt&gt;--no-default-eol&lt;/tt&gt; flag, but the second time the app built and ran fine.&lt;/p&gt;

&lt;p&gt;I plan some major directory layout adjustments in my source directory for TestXSLT, which is why I wanted to move to Subversion in the first place. I already love “svn rm” and “svn mv” :-)&lt;/p&gt;

&lt;p&gt;Next on the list is some reading in the &lt;a href=&quot;http://svnbook.red-bean.com&quot;&gt;Subversion Book&lt;/a&gt;.&lt;/p&gt;

</description>
            <guid>http://www.entropy.ch/blog/Developer/?permalink=The_Move_From_CVS_to_Subversion.html</guid>
			<pubDate>Thu, 24 Feb 2005 09:09:41 +0100</pubDate>
                    </item>
        	            <item>
            <title>SMTP AUTH for Postfix outbound SMTP connections</title>
            <!--<link>http://www.entropy.ch/blog/Mac+OS+X/?permalink=SMTP_AUTH_for_Postfix_outbound_SMTP_connections.html</link>-->
            <link>http://www.entropy.ch/blog/Mac+OS+X/2005/02/21/SMTP_AUTH_for_Postfix_outbound_SMTP_connections.html</link>
            <description>&lt;p&gt;
My &lt;a href=&quot;http://www.cablecom.ch/&quot;&gt;cable ISP&lt;/a&gt; will be enforcing SMTP AUTH soon (well, in a few months...). My mail server, which I&#39;m running on their line, is using their SMTP server as smart forwarding host because it&#39;s getting harder to deliver directly from a dynamic IP address these days as more and more ISPs reject SMTP connections from such IP ranges.
&lt;/p&gt;&lt;p&gt;
&lt;a href=&quot;http://postfix.state-of-mind.de/patrick.koetter/smtpauth/smtp_auth_mailservers.html&quot;&gt;These instructions&lt;/a&gt; helped a lot to reconfigure my Mac OS X / Postfix setup, I literally had it working correctly in 5 minutes. You do have to work on the command line, the setting is not available in the Server Admin tool.
&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Mac+OS+X/?permalink=SMTP_AUTH_for_Postfix_outbound_SMTP_connections.html</guid>
			<pubDate>Mon, 21 Feb 2005 13:09:20 +0100</pubDate>
                    </item>
        	            <item>
            <title>Website Format Changes</title>
            <!--<link>http://www.entropy.ch/blog/Website/?permalink=Website_Format_Changes.html</link>-->
            <link>http://www.entropy.ch/blog/Website/2005/02/20/Website_Format_Changes.html</link>
            <description>&lt;p&gt;
I played around with the content served on this website, among other things I am moving everything to XHTML 1.1. It’s not completely finished, in particular the HTTP Content-Type header &lt;a href=&quot;http://www.w3.org/TR/xhtml-media-types/xhtml-media-types.xhtml#summary&quot;&gt;required for XHTML 1.1&lt;/a&gt; is not correct and the &lt;a href=&quot;http://www.w3.org/TR/xhtml11/conformance.html#strict&quot;&gt;xmlns declaration&lt;/a&gt; on the html element is missing. The goal was to get the main CSS and the front page to validate using the W3C validators so I could &lt;a href=&quot;http://kalsey.com/tools/buttonmaker/&quot;&gt;go wild&lt;/a&gt; with the &lt;a href=&quot;http://gtmcknight.com/buttons/&quot;&gt;little buttons&lt;/a&gt; :-)
&lt;/p&gt;&lt;p&gt;
I’m getting weird effects in Safari, from time to time I have to reload a page before it displays properly. Let me know how it behaves for you in the various browsers.
&lt;/p&gt;&lt;p&gt;
I’m also still working on finishing the blog layout so I added more of the usual stuff in a new column. The goal is to create a standalone blojsom theme sometime...
&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Website/?permalink=Website_Format_Changes.html</guid>
			<pubDate>Sun, 20 Feb 2005 20:48:03 +0100</pubDate>
                    </item>
        	            <item>
            <title>PostgreSQL 8.0.1 Package</title>
            <!--<link>http://www.entropy.ch/blog/Software/?permalink=PostgreSQL_8_0_1_Package.html</link>-->
            <link>http://www.entropy.ch/blog/Software/2005/02/20/PostgreSQL_8_0_1_Package.html</link>
            <description>&lt;p&gt;
A PostgreSQL 8.0.1 package is available:
&lt;/p&gt;&lt;p&gt;
&lt;a href=&quot;http://www.entropy.ch/phpbb2/viewtopic.php?p=6999#6999&quot;&gt;http://www.entropy.ch/phpbb2/viewtopic.php?p=6999#6999&lt;/a&gt;
&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Software/?permalink=PostgreSQL_8_0_1_Package.html</guid>
			<pubDate>Sun, 20 Feb 2005 12:35:25 +0100</pubDate>
                    </item>
        	            <item>
            <title>TestXSLT updated</title>
            <!--<link>http://www.entropy.ch/blog/Software/?permalink=TestXSLT_updated.html</link>-->
            <link>http://www.entropy.ch/blog/Software/2005/02/20/TestXSLT_updated.html</link>
            <description>&lt;p&gt;
I updated TestXSLT to version 3.1.
&lt;/p&gt;&lt;p&gt;
See the details at &lt;a href=&quot;http://www.entropy.ch/phpbb2/viewtopic.php?t=1804&quot;&gt;http://www.entropy.ch/phpbb2/viewtopic.php?t=1804&lt;/a&gt;.
&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Software/?permalink=TestXSLT_updated.html</guid>
			<pubDate>Sun, 20 Feb 2005 11:14:05 +0100</pubDate>
              	          <wfw:comment>http://www.entropy.ch/blojsom/commentapi/marc/Software/?permalink=TestXSLT_updated.html</wfw:comment>
              <wfw:commentRss>http://www.entropy.ch/blog/Software/?permalink=TestXSLT_updated.html&amp;page=comments&amp;flavor=rss2</wfw:commentRss>
                    </item>
        	             <item>
            <title>snapmania.com online</title>
            <!--<link>http://www.entropy.ch/blog/?permalink=snapmania_com_online.html</link>-->
            <link>http://www.entropy.ch/blog/2005/02/12/snapmania_com_online.html</link>
            <description>&lt;p style=&quot;text-align:right;&quot;&gt;
&lt;a href=&quot;http://www.snapmania.com/redirect/entropy&quot;&gt;&lt;img src=&quot;http://www.entropy.ch/blojsom/resources/marc/snapmania.png&quot; style=&quot;width: 110; height: 70; float: right;&quot; alt=&quot;Snapmania&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;&lt;p&gt;
At work we just opened our online photo management solution &lt;a href=&quot;http://www.snapmania.com/redirect/entropy&quot;&gt;snapmania.com&lt;/a&gt; to the public. This system is what we&#39;ve been working on for a long time and I encourage you to go and check it out. Mac users will appreciate the functional and elegant user interface :-)
&lt;/p&gt;&lt;p&gt;
It is a server-side solution (with a client part in Flash that runs in the browser) so you need to get your photos onto our system first. To do that, I wrote a Cocoa photo upload client which integrates nicely with iPhoto via drag-and-drop.
&lt;/p&gt;&lt;p&gt;
Once your photos are on the server, there are tons of ways to organize, manipulate and publish them. Publishing collections as web albums is especially easy. Some of the export channels which produce physical output, like ordering prints, are currently only available in Switzerland, but more locations will follow in the future, and even just the web-album feature alone is worth it.
&lt;/p&gt;&lt;p&gt;
You can sign up for a limited test account for free to play around with it.
&lt;/p&gt;&lt;p&gt;
If you like it, I encourage you to sign up to the service and tell all your friends about it. If you ever wanted to support the work I do on my website, buying our service and helping us to spread the word would be a cool (and fun for you) way to do so :-)
&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/?permalink=snapmania_com_online.html</guid>
			<pubDate>Sat, 12 Feb 2005 18:58:45 +0100</pubDate>
                    </item>
        	            <item>
            <title>Modifier Keys in Adobe Apps, Flash etc.</title>
            <!--<link>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Modifier_Keys_in_Adobe_Apps_Flash_etc.html</link>-->
            <link>http://www.entropy.ch/blog/Mac+OS+X/2005/01/26/Modifier_Keys_in_Adobe_Apps_Flash_etc.html</link>
            <description>&lt;p&gt;
&lt;img src=&quot;http://www.entropy.ch/blojsom/resources/marc/icon_banghead.gif&quot; style=&quot;width: 25px; height:20px; float: right;&quot; alt=&quot;Icon Banghead&quot; /&gt;Erik Barzeski &lt;a href=&quot;http://nslog.com/archives/2005/01/26/the_terminal_and_the_shift_key.php&quot;&gt;posted the solution&lt;/a&gt; to a problem that I&amp;#8217;ve been having for a while in all Adobe apps and the Flash browser plugin.
&lt;/p&gt;&lt;p&gt;
The problem was that holding down some keys did not have the intended effect in these applications, which made working in them a living hell.
&lt;/p&gt;&lt;p&gt;
For example, I use the space bar a lot in Photoshop while dragging a selection marquee. Holding down the space bar allows me to move the selection without releasing the mouse button so that I can continually adjust both position and size of the selection until it&amp;#8217;s right. Other uses were Shift-drag to force proportional resizing or contstrained movement, Option-drag to clone etc. etc. A feature I need a lot in Illustrator is holding down the space bar to get the grab hand cursor to move the work sheet.
&lt;/p&gt;&lt;p&gt;
At work we produce &lt;a href=&quot;http://www.futurelab.ch/en/videos.html&quot;&gt;an application&lt;/a&gt; with a Flash-based client that was also affected. Multiple-Selection using the Shift and Command keys did not work at all, that&amp;#8217;s fixed too.
&lt;/p&gt;&lt;p&gt;
Turns out it was all caused by the &amp;#8220;Secure Keyboard Entry&amp;#8221; option in the Terminal application. Once that is switched off, everything is back to normal. Seems this is the issue &lt;a href=&quot;http://rentzsch.com/macosx/terminalSecureKeyboardEntry&quot;&gt;reported earlier&lt;/a&gt; by Jonathan Rentzsch.
&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Modifier_Keys_in_Adobe_Apps_Flash_etc.html</guid>
			<pubDate>Wed, 26 Jan 2005 20:57:46 +0100</pubDate>
                    </item>
        	            <item>
            <title>xGestures</title>
            <!--<link>http://www.entropy.ch/blog/Mac+OS+X/?permalink=xGestures.html</link>-->
            <link>http://www.entropy.ch/blog/Mac+OS+X/2005/01/25/xGestures.html</link>
            <description>&lt;p&gt;
&lt;img src=&quot;http://www.entropy.ch/blojsom/resources/marc/xgestures.png&quot; style=&quot;width: 80px; height: 80px; float: right; margin: 0 4px 0 4px;&quot; alt=&quot;Xgestures&quot; title=&quot;xgestures.png&quot; /&gt;I&#39;ve been using &lt;a href=&quot;http://stout.hampshire.edu/~bjk02/xGestures/&quot;&gt;xGestures&lt;/a&gt; for a short time and I am hooked already. I use it instead of &lt;a href=&quot;http://www.cocoasuite.com/&quot;&gt;Cocoa Suite&lt;/a&gt; on my machine now.
&lt;/p&gt;&lt;p&gt;
Unlike Cocoa Suite (which is a fine piece of software too), it is not restricted to Cocoa apps. This means that I can finally use gestures to navigate in the Finder. If you don&#39;t know what the hell I&#39;m talking about, &lt;a href=&quot;http://optimoz.mozdev.org/gestures/&quot;&gt;read this introduction to gestures&lt;/a&gt;.
&lt;/p&gt;&lt;p&gt;
Here are some of my favorite global settings:
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Left -&amp;gt; Choose Menu Item &amp;#8220;Back&amp;#8221;&lt;/li&gt;
&lt;li&gt;Right -&amp;gt; Choose Menu Item &amp;#8220;Forward&amp;#8221;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;
These two work in Safari, Firefox, the Finder and probably others.
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Down/Right/Down -&amp;gt; Toggle iTunes&lt;/li&gt;
&lt;li&gt;Down/Right -&amp;gt; Choose Menu Item &amp;#8220;Hide Others&amp;#8221;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;
Here&#39;s what I did in the Finder so far:
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Up -&amp;gt; Keystroke Cmd-Up&lt;/li&gt;
&lt;li&gt;Down -&amp;gt; Keystroke Cmd-Down&lt;/li&gt;
&lt;li&gt;Left/Right -&amp;gt; Keystroke Cmd-Delete&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;
This allows me to navigate up and down the file system hierarchy and trash selected files with the mouse.
&lt;/p&gt;&lt;p&gt;
And in Safari:
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Up -&amp;gt; Choose Menu Item &amp;#8220;Make Text Bigger&amp;#8221;&lt;/li&gt;
&lt;li&gt;Down -&amp;gt; Choose Menu Item &amp;#8220;Make Text Smaller&amp;#8221;&lt;/li&gt;
&lt;/ul&gt;
</description>
            <guid>http://www.entropy.ch/blog/Mac+OS+X/?permalink=xGestures.html</guid>
			<pubDate>Tue, 25 Jan 2005 22:28:46 +0100</pubDate>
                    </item>
        	            <item>
            <title>Application Switching Delays</title>
            <!--<link>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Application_Switching_Delays.html</link>-->
            <link>http://www.entropy.ch/blog/Mac+OS+X/2005/01/25/Application_Switching_Delays.html</link>
            <description>&lt;p&gt;I just solved a problem on my machine that drove me nuts in the past few weeks: Sluggish application switching performance. When I used Cmd-Tab to toggle between two applications, or clicked onto the desktop to switch to the Finder when another application was in the foreground, there was an annoying, noticeable delay.
&lt;/p&gt;
&lt;p&gt;To figure out what caused it, I created a fresh user account and tested the same things there, and the application switching was lightning fast, so I figured it had to be something particular to my user account. I began to throw out all the accumulated goodies in the “InputManagers”, “Contextual Menu Items”, “StartupItems”, preference panel login items etc. of my own account.
&lt;/p&gt;
&lt;p&gt;In the end it turned out that the problem was caused by non-Apple menu bar additions, which makes sense as the menu bar is being redrawn with each application switch. In particular, I had to remove the &lt;a href=&quot;http://wincent.com/a/products/synergy-classic/&quot;&gt;Synergy&lt;/a&gt; iTunes controller and the SSHKeychain menu item. In the case of &lt;a href=&quot;http://www.sshkeychain.org/&quot;&gt;SSHKeychain&lt;/a&gt;, there&#39;s the preferences option to keep it in the dock and not in the menu bar, which solved my problem nicely. I absolutely could not work without SSHKeychain. In the case of Synergy, I use it all the time too but when I disable all the menu bar items its not really that useful anymore as I never used the global keyboard shortcuts. I&#39;ll probably configure a global &lt;a href=&quot;http://stout.hampshire.edu/~bjk02/xGestures/&quot;&gt;xGestures&lt;/a&gt; action instead to play/pause iTunes.
&lt;/p&gt;
&lt;p&gt;So if you want to find out if your application switching performance could be better than it is, I suggest to create a pristine user account and try it there. Open the System Preferences window and repeatedly click between the desktop background and the Prefs window title bar. Do it a few times to get a feeling for how responsive it should be. Then switch to your regular user account and do the same thing there. If you notice a difference, try disabling 3rd party menu bar extensions.
&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Mac+OS+X/?permalink=Application_Switching_Delays.html</guid>
			<pubDate>Tue, 25 Jan 2005 00:42:03 +0100</pubDate>
                    </item>
        	            <item>
            <title>PostgreSQL 8.0.0 Package Available</title>
            <!--<link>http://www.entropy.ch/blog/Software/?permalink=PostgreSQL_8_0_0_Package_Available.html</link>-->
            <link>http://www.entropy.ch/blog/Software/2005/01/21/PostgreSQL_8_0_0_Package_Available.html</link>
            <description>An updated PostgreSQL installer package is available for the recently released version 8.0.0.

See the announcement in the forum at

&lt;a href=&quot;http://www.entropy.ch/phpbb2/viewtopic.php?p=6770&quot;&gt;http://www.entropy.ch/phpbb2/viewtopic.php?p=6770&lt;/a&gt;
</description>
            <guid>http://www.entropy.ch/blog/Software/?permalink=PostgreSQL_8_0_0_Package_Available.html</guid>
			<pubDate>Fri, 21 Jan 2005 01:37:15 +0100</pubDate>
                    </item>
        	            <item>
            <title>New PHP5 modules with OpenBase support</title>
            <!--<link>http://www.entropy.ch/blog/Software/?permalink=New_PHP5_modules_with_OpenBase_support.html</link>-->
            <link>http://www.entropy.ch/blog/Software/2005/01/04/New_PHP5_modules_with_OpenBase_support.html</link>
            <description>&lt;p&gt;I just updated the PHP 5.0.3 packages from release 1 to release 2. This version adds support for accessing OpenBase database servers.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.entropy.ch/phpbb2/viewtopic.php?p=6664&quot;&gt;http://www.entropy.ch/phpbb2/viewtopic.php?p=6664&lt;/a&gt;&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Software/?permalink=New_PHP5_modules_with_OpenBase_support.html</guid>
			<pubDate>Tue, 4 Jan 2005 20:47:33 +0100</pubDate>
                    </item>
        	            <item>
            <title>Notes About the Website Downtime</title>
            <!--<link>http://www.entropy.ch/blog/Website/?permalink=Notes_About_the_Website_Downtime.html</link>-->
            <link>http://www.entropy.ch/blog/Website/2004/12/20/Notes_About_the_Website_Downtime.html</link>
            <description>&lt;p&gt;As regular visitors may have noticed, this website has been offline for about two weeks starting on December 1st. The reason for the downtime was that intruders hacked the server and defaced the website’s front page.&lt;/p&gt;

&lt;p&gt;I thought I’d post some details about the incident for your reading pleasure and maybe to help prevent similar hacks on other web sites running a similar software setup.&lt;/p&gt;


&lt;h3&gt;What happened&lt;/h3&gt;

&lt;p&gt;On December 1st I checked my email in the morning and there was a message from someone asking me if I was aware that my website was defaced. I couldn’t really believe it but when I loaded the front page, it was indeed gone, replaced with an idiotic script kiddie greeting message.&lt;/p&gt;

&lt;p&gt;It seems that no data was erased on the main web site. Another small web site/virtual host on the same Apache instance was completely gone (mostly PHP pages), but I had backups of those files. It still took me a long time to reformat the server’s disk, reinstall the OS and restore all the data and configuration of the web and mail servers (especially since I have very little spare time right now because we’re wrapping up a project at work, and I’m working on a new edition of our &lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/0764579630/wwwentropych-20/&quot;&gt;Mac OS X book&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Since the machine provides my e-mail service, getting that up and running again was my first priority. I shut down all services and the entire web site, especially all dynamic content. I used DynDNS’s great “offline” feature to redirect all requests to a simple temporary page (with a few download links for the most important packages)
on the www2.entropy.ch server which is hosted at my hosting provider and contains the actual software package downloads. I actually left the server running in its hacked state for a few days because the mail services were still running flawlessly, and I did not have any time at all to look at it right then.&lt;/p&gt;

&lt;p&gt;On the next weekend, when I had time again, I struggled (for various reasons) to get OS X Server installed again. After that I had to tweak lots of things in the cyrus IMAP server setup, especially merging my old IMAP message database back into the freshly installed empty IMAP store. Since I use lots of special lookup tables (access, transport, virtual domains) in Postfix, I had to reconfigure that. It’s pretty annoying that the OS X Server GUI keeps on overwriting my configuration directives...&lt;/p&gt;

&lt;p&gt;After mail services were running again, I set up the web server. Before activating the old content directory, I went through every directory and cleaned out old stuff. I also removed all web applications, (MovableType, ViewCVS and phpBB2) because I did not yet know if one of those contained the vulnerability. When only the static content was left, I reactivated the website so that people could at least get access to the content.&lt;/p&gt;

&lt;h3&gt;How they got in&lt;/h3&gt;

&lt;p&gt;I have no idea. I suspect a vulnerable web application which is why I removed them all. I was running an outdated version of phpBB2, there was a critical security update available for that one that I didn’t notice/install. There was also a PHP vulnerability (hence my new PHP 5 and 4 packages) but I don’t know if that was being exploited at all.&lt;/p&gt;

&lt;p&gt;The server didn’t have many other services active, only the mail-related ports and SSH were open.&lt;/p&gt;

&lt;h3&gt;Future (and Past) Strategy&lt;/h3&gt;

&lt;p&gt;I really don’t have time to actively go out and check for security-related updates to the packages. I want to be notified when anything important needs to be updated. This is exactly why I try to use only Apple-supplied components, because then I can simply run Software Update and I’ll be sure to get any relevant fixes, sooner or later.&lt;/p&gt;

&lt;p&gt;This means, for example, that I replaced the MovableType Blog package with &lt;a href=&quot;http://blojsom.sf.net&quot;&gt;Blojsom&lt;/a&gt;, because that is what Apple will ship (and hopefully maintain) starting with OS X Tiger Server. I switched to that one to get started now and hope to
migrate to the built-in version next year.&lt;/p&gt;

&lt;p&gt;It also means that I’m using the mail and web server versions supplied by Apple instead of compiling my own.&lt;/p&gt;

&lt;p&gt;I also tightened up a few other things, like disabling password authentication for my SSH logins. I already disabled all plaintext authentication mechanisms a long time ago, i.e. mail is only possible with SSL or CRAM-MD5 auth etc.&lt;/p&gt;

&lt;h3&gt;What&#39;s the status&lt;/h3&gt;

&lt;p&gt;After setting up the Blojsom blog package (and learning the Velocity template language and new mod_rewrite and mod_jk tricks on the way), I need to migrate the old blog postings to the new format. Thereafter, the only thing missing is the phpBB2 discussion forum. I’ll install the most recent version as soon as I find some time, I want to try to run it under PHP5.&lt;/p&gt;

&lt;h3&gt;Thanks for the Nice Mails&lt;/h3&gt;

&lt;p&gt;During the time the temporary page was up, I received tons of very nice e-mails from all over the place, I was really surprised and really appreciate it :-)&lt;/p&gt;

</description>
            <guid>http://www.entropy.ch/blog/Website/?permalink=Notes_About_the_Website_Downtime.html</guid>
			<pubDate>Mon, 20 Dec 2004 03:13:11 +0100</pubDate>
                    </item>
        	            <item>
            <title>Delicious Library to Web</title>
            <!--<link>http://www.entropy.ch/blog/Software/?permalink=Delicious_Library_to_Web.html</link>-->
            <link>http://www.entropy.ch/blog/Software/2004/11/24/Delicious_Library_to_Web.html</link>
            <description>I’m working on a &lt;a href=&quot;http://www.delicious-monster.com/&quot;&gt;Delicious Library&lt;/a&gt;-to-Web export, it’s pretty easy thanks to their sane XML format. You can see something here:
&lt;a href=&quot;http://www.entropy.ch/about/library/&quot;&gt;http://www.entropy.ch/about/library/&lt;/a&gt;
It’s just a start, but you get the idea. It’s a bit of Perl and XSLT and the files are available in my &lt;a href=&quot;http://www.entropy.ch/viewcvs/viewcvs.cgi/&quot;&gt;CVS&lt;/a&gt;.
</description>
            <guid>http://www.entropy.ch/blog/Software/?permalink=Delicious_Library_to_Web.html</guid>
			<pubDate>Wed, 24 Nov 2004 00:11:00 +0100</pubDate>
                    </item>
        	            <item>
            <title>New and Updated BBEdit Glossaries</title>
            <!--<link>http://www.entropy.ch/blog/Software/?permalink=New_and_Updated_BBEdit_Glossaries.html</link>-->
            <link>http://www.entropy.ch/blog/Software/2004/11/06/New_and_Updated_BBEdit_Glossaries.html</link>
            <description>	&lt;p&gt;I posted some new and updated BBEdit glossaries. Special thanks to Marco Balestra for the numerous improvements and the cool AppleScript tricks that are now part of the XSLT glossary...&lt;/p&gt;

&lt;p&gt;I’ve been using the newly added Perl glossary for a while now but never got around to publishing it.&lt;/p&gt;

&lt;p&gt;If you use BBEdit but not yet its glossary feature, combined with well-chosen keyboard shortcuts, then you’re missing out on one of BBEdit’s coolest tricks... It saves a lot of typing when you’re able to type “if,” hit a shortcut and get an entire block of code written for you...&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.entropy.ch/software/#xslt-glossary&quot;&gt;http://www.entropy.ch/software/#xslt-glossary&lt;/a&gt;&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Software/?permalink=New_and_Updated_BBEdit_Glossaries.html</guid>
			<pubDate>Sat, 6 Nov 2004 19:16:55 +0100</pubDate>
                    </item>
        	            <item>
            <title>Random Notes about a Fedora Linux installation</title>
            <!--<link>http://www.entropy.ch/blog/Website/?permalink=Random_Notes_about_a_Fedora_Linux_installation.html</link>-->
            <link>http://www.entropy.ch/blog/Website/2004/11/02/Random_Notes_about_a_Fedora_Linux_installation.html</link>
            <description>	&lt;p&gt;I posted some quick and dirty notes about a Fedora Core Linux install on a DELL Inspiron notebook in the hope that it’s useful for someone else.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.entropy.ch/software/docs/fedora-inspiron-510m.html&quot;&gt;http://www.entropy.ch/software/docs/fedora-inspiron-510m.html&lt;/a&gt;&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Website/?permalink=Random_Notes_about_a_Fedora_Linux_installation.html</guid>
			<pubDate>Tue, 2 Nov 2004 00:36:00 +0100</pubDate>
                    </item>
        	             <item>
            <title>Our New Book About C Programming is Out</title>
            <!--<link>http://www.entropy.ch/blog/?permalink=Our_New_Book_About_C_Programming_is_Out.html</link>-->
            <link>http://www.entropy.ch/blog/2004/10/22/Our_New_Book_About_C_Programming_is_Out.html</link>
            <description>&lt;p&gt;
&lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/0321287630/wwwentropych-20&quot; class=&quot;img&quot;&gt;&lt;img style=&quot;float: right; margin: 0 0 0 10px;&quot; src=&quot;/images/book-c-vqs.png&quot; alt=&quot;C programming book cover&quot;/&gt;&lt;/a&gt;
&lt;/p&gt;&lt;p&gt;
For the second time, after &lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/0764558129/wwwentropych-20&quot;&gt;“Panther Timesaving Techniques for Dummies,”&lt;/a&gt; I’ve been invited to join &lt;a href=&quot;http://www.dmcinsights.com/&quot;&gt;Larry Ullman&lt;/a&gt; on a book project. The fruits of our labor over several months have just been released and are now available at &lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/0321287630/wwwentropych-20&quot;&gt;amazon.com&lt;/a&gt; and elsewhere.
&lt;/p&gt;&lt;p&gt;
This time we wrote a friendly introduction to the C programming language. It’s published by &lt;a href=&quot;http://www.peachpit.com/series/series.asp?st=44085&quot;&gt;Peachpit&lt;/a&gt; as part of their “Visual QuickStart Guide” series. The title of the book is “C Programming: Visual QuickStart Guide.”
&lt;/p&gt;&lt;p&gt;
If you ever wanted a gentle introduction to the C programming language, then this book is for you :-) It teaches the platform-independent basics of C, so you’ll be able to work through the examples equally well on Mac OS X, Windows or Linux. Tips about free development environments for all platforms are also included.
&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/?permalink=Our_New_Book_About_C_Programming_is_Out.html</guid>
			<pubDate>Fri, 22 Oct 2004 23:25:00 +0200</pubDate>
                    </item>
        	             <item>
            <title>Do not buy Etymotic Earphones</title>
            <!--<link>http://www.entropy.ch/blog/?permalink=Do_not_buy_Etymotic_Earphones.html</link>-->
            <link>http://www.entropy.ch/blog/2004/08/23/Do_not_buy_Etymotic_Earphones.html</link>
            <description>&lt;p&gt;
A few years ago I got my first iPod and bought a set of Etymotic ER-4 in-ear earplugs to go with it from Etymotic Research after reading good reviews about them.
&lt;/p&gt;&lt;p&gt;
They were *very expensive* but *good*. I absolutely love this product. The sound and the isolation these plugs provide is just awesome. I praised and recommended them to lots of people all the time.
&lt;/p&gt;&lt;p&gt;
Unfortunately, I just discovered that while the product is great, the company sucks and I will never buy or recommend earphones from them again. Once more a case of “Love the product, hate the company.”
&lt;/p&gt;
&lt;a id=&quot;more&quot;&gt;&lt;/a&gt;
&lt;p&gt;
Today I recommend to stay far, far away from these things because once you have a repair case, you will experience the awful and pointless policies that Etymotic Research has. It is especially bad if you happen to live overseas.
&lt;/p&gt;&lt;p&gt;
After years of use, the cable was worn out and completely broken on one side right at the tiny connector that goes into the transducers (a quality problem in itself). I wanted a replacement cable, but they refuse to ship one to me even though it unplugs easily from the transducers. I would have to send in the whole set, and they strongly recommend a parcel service even though I prefer mail because parcel services are just too expensive. That&#39;s about USD 50.- one way. Then they replace the cable at the factory and send it back, again via parcel service. In total this will cost me at *least* USD 150.- The cable alone costs USD 50.-
&lt;/p&gt;&lt;p&gt;
150.– for a cable exchange is absolutely insane.
&lt;/p&gt;&lt;p&gt;
They say that the cable cannot just be unplugged and replugged, it has to be adjusted together with my transducers, which is why they insist on getting them (I know a thing or two about electronics, and I still don&#39;t believe this). I then asked if they could at least sell me two cables at the same time because I expect it to break again. Buying two cables at the same time would save me the shipping charges the second time. Again, no chance. They insist that I send in the transducers YET AGAIN when the cable breaks a second time.
&lt;/p&gt;&lt;p&gt;
I think that if I spend *this* much money on a product, I should be treated especially well when a repair case happens, but obviously Etymotic Research thinks differently and prefers to annoy loyal customers with its inflexible policies.
&lt;/p&gt;&lt;p&gt;
I&#39;m disgusted and I will try the &lt;a href=&quot;http://www.shure.com/earphones/story.asp&quot;&gt;Shure&lt;/a&gt; products next, and I recommend that you do the same thing. Stay away from Etymotic Products.
&lt;/p&gt;&lt;p&gt;
My Etymotic cable will not go back, I will take out my soldering iron and fix it myself.
&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/?permalink=Do_not_buy_Etymotic_Earphones.html</guid>
			<pubDate>Mon, 23 Aug 2004 15:41:00 +0200</pubDate>
                    </item>
        	            <item>
            <title>Updated PHP 5 Package available</title>
            <!--<link>http://www.entropy.ch/blog/Software/?permalink=Updated_PHP_5_Package_available.html</link>-->
            <link>http://www.entropy.ch/blog/Software/2004/08/11/Updated_PHP_5_Package_available.html</link>
            <description>	&lt;p&gt;An updated package for PHP 5 is available. It should fix the installation problems that affected some systems without developers tools installed.&lt;/p&gt;

&lt;p&gt;See the discussion at &lt;a href=&quot;http://www.entropy.ch/phpbb2/viewtopic.php?t=1446&quot;&gt;http://www.entropy.ch/phpbb2/viewtopic.php?t=1446&lt;/a&gt;&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Software/?permalink=Updated_PHP_5_Package_available.html</guid>
			<pubDate>Wed, 11 Aug 2004 12:22:47 +0200</pubDate>
                    </item>
        	            <item>
            <title>Some Street Parade 2004 Pictures</title>
            <!--<link>http://www.entropy.ch/blog/Pictures/?permalink=Some_Street_Parade_2004_Pictures.html</link>-->
            <link>http://www.entropy.ch/blog/Pictures/2004/08/07/Some_Street_Parade_2004_Pictures.html</link>
            <description>	&lt;p&gt;Some unedited pictures from this year’s Street Parade in Zurich:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://album.entropy.ch/users/mliyanage/Streetparade2004/&quot;&gt;http://album.entropy.ch/users/mliyanage/Streetparade2004/&lt;/a&gt;&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Pictures/?permalink=Some_Street_Parade_2004_Pictures.html</guid>
			<pubDate>Sat, 7 Aug 2004 21:44:30 +0200</pubDate>
                    </item>
        	            <item>
            <title>PHP 5 package available for testing</title>
            <!--<link>http://www.entropy.ch/blog/Software/?permalink=PHP_5_package_available_for_testing.html</link>-->
            <link>http://www.entropy.ch/blog/Software/2004/08/06/PHP_5_package_available_for_testing.html</link>
            <description>	&lt;p&gt;A first version of my PHP package for PHP version 5.0.0 is available.&lt;/p&gt;

&lt;p&gt;It installs into a new location and it should therefore be possible to keep both versions 4 and 5 installed at the same time. A manual change in the Apache conf file is required to switch between the two. The installer activates version 5.0 by default.&lt;/p&gt;

&lt;p&gt;See the details in this forum post:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.entropy.ch/phpbb2/viewtopic.php?t=1442&quot;&gt;http://www.entropy.ch/phpbb2/viewtopic.php?t=1442&lt;/a&gt;&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Software/?permalink=PHP_5_package_available_for_testing.html</guid>
			<pubDate>Fri, 6 Aug 2004 09:50:19 +0200</pubDate>
                    </item>
        	            <item>
            <title>Article about OpenOffice on OS X</title>
            <!--<link>http://www.entropy.ch/blog/Website/?permalink=Article_about_OpenOffice_on_OS_X.html</link>-->
            <link>http://www.entropy.ch/blog/Website/2004/07/07/Article_about_OpenOffice_on_OS_X.html</link>
            <description>	&lt;p&gt;I just wrote down some notes about installing and tuning OpenOffice on Mac OS X. I really needed a solution for producing structured PDF documents from word processor files. Since Adobe still couldn’t get its act together and produce a decent MS Word plugin that does what the Windows version does, this is the next best solution for me.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.entropy.ch/software/macosx/docs/openoffice-mac/&quot;&gt;To the article&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next I’ll look at OpenOffice’s XSLT import and export capabilities, but unfortunately these &lt;a href=&quot;http://trinity.neooffice.org/modules.php?name=Forums&amp;file=viewtopic&amp;p=3193#3193&quot;&gt;don’t work on Mac OS X&lt;/a&gt; so I’ll do that on Linux for the time being...&lt;/p&gt;

&lt;p&gt;Update: I was able to improve the font display even more by building a new FreeType library with patches from David Chester. Make sure to check out the font comparison image in the article.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Website/?permalink=Article_about_OpenOffice_on_OS_X.html</guid>
			<pubDate>Wed, 7 Jul 2004 01:29:37 +0200</pubDate>
                    </item>
        	             <item>
            <title>See some of the stuff I do at work...</title>
            <!--<link>http://www.entropy.ch/blog/?permalink=See_some_of_the_stuff_I_do_at_work.html</link>-->
            <link>http://www.entropy.ch/blog/2004/06/25/See_some_of_the_stuff_I_do_at_work.html</link>
            <description>	&lt;p&gt;If you want to see some of the stuff I&#39;m working on during the day, check out these tutorial videos about our online photo management solution:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.futurelab.ch/en/videos.html&quot;&gt;English&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.futurelab.ch/de/videos.html&quot;&gt;German&lt;/a&gt;&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/?permalink=See_some_of_the_stuff_I_do_at_work.html</guid>
			<pubDate>Fri, 25 Jun 2004 00:44:00 +0200</pubDate>
                    </item>
        	            <item>
            <title>Integrating Ragel, XCode and Graphviz</title>
            <!--<link>http://www.entropy.ch/blog/Website/?permalink=Integrating_Ragel_XCode_and_Graphviz.html</link>-->
            <link>http://www.entropy.ch/blog/Website/2004/06/23/Integrating_Ragel_XCode_and_Graphviz.html</link>
            <description>	&lt;p&gt;For software developers: I wrote a short tutorial on how to integrate the Ragel state machine compiler, Apple’s XCode and the Graphviz automated graph layout software.&lt;/p&gt;

&lt;p&gt;It&#39;s at &lt;a href=&quot;http://www.entropy.ch/software/macosx/docs/ragel-xcode-graphviz/&quot;&gt;http://www.entropy.ch/software/macosx/docs/ragel-xcode-graphviz/&lt;/a&gt;&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Website/?permalink=Integrating_Ragel_XCode_and_Graphviz.html</guid>
			<pubDate>Wed, 23 Jun 2004 15:14:58 +0200</pubDate>
                    </item>
        	             <item>
            <title>The Book is Out</title>
            <!--<link>http://www.entropy.ch/blog/?permalink=The_Book_is_Out.html</link>-->
            <link>http://www.entropy.ch/blog/2004/04/21/The_Book_is_Out.html</link>
            <description>	&lt;a class=&quot;img&quot; href=&quot;http://www.amazon.com:80/exec/obidos/ASIN/0764558129/wwwentropych-20?creative=125577&amp;camp=2321&amp;link_code=as1&quot; target=&quot;_blank&quot; class=&quot;postlink&quot;&gt;&lt;img align=&quot;right&quot; src=&quot;http://www.entropy.ch/images/book.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;p&gt;I recently got my copies of the Mac OS X book &lt;a href=&quot;http://www.amazon.com:80/exec/obidos/ASIN/0764558129/wwwentropych-20?creative=125577&amp;camp=2321&amp;link_code=as1&quot; target=&quot;_blank&quot; class=&quot;postlink&quot;&gt;“Mac OS X Panther Timesaving Techniques for Dummies”&lt;/a&gt; that I co-wrote with &lt;a href=&quot;http://www.dmcinsights.com&quot;&gt;Larry Ullman&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;There&#39;s a &lt;a href=&quot;http://www.dmcinsights.com/mactst/&quot;&gt;companion website&lt;/a&gt; as well as a &lt;a href=&quot;http://www.entropy.ch/phpbb2/viewforum.php?f=11&quot;&gt;forum&lt;/a&gt; for readers of the book.&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/?permalink=The_Book_is_Out.html</guid>
			<pubDate>Wed, 21 Apr 2004 10:45:53 +0200</pubDate>
                    </item>
        	            <item>
            <title>Added a Blog</title>
            <!--<link>http://www.entropy.ch/blog/Website/?permalink=Added_a_Blog.html</link>-->
            <link>http://www.entropy.ch/blog/Website/2004/04/18/Added_a_Blog.html</link>
            <description>	&lt;p&gt;I added a weblog (using the very cool Movable Type package) in order to make better use of the web site&#39;s front page.&lt;/p&gt;

&lt;p&gt;The blog will be used mainly to announce updates to my software packages (category “Software”), but I&#39;ll also post whenever I&#39;ve uploaded new pictures or found something on the Web that I think is cool, to keep it interesting...&lt;/p&gt;

&lt;p&gt;So if you want to stay updated, I suggest that you subscribe to the RSS newsfeed using a tool like NetNewsWire or PulpFiction.&lt;/p&gt;

&lt;p&gt;Post a comment to let me know what you think about it :-)&lt;/p&gt;
</description>
            <guid>http://www.entropy.ch/blog/Website/?permalink=Added_a_Blog.html</guid>
			<pubDate>Sun, 18 Apr 2004 15:14:34 +0200</pubDate>
                    </item>
            </channel>
</rss>

