<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
 
 <title>Benedikt Meurer</title>
 <link href="http://feeds.feedburner.com/benediktmeurer" rel="self"/>
 <link href="http://benediktmeurer.de"/>
 <updated>2015-12-25T19:56:02+00:00</updated>
 <id>http://benediktmeurer.de</id>
 <author>
   <name>Benedikt Meurer</name>
 </author>

 
 <entry>
   <title type="html">A new approach to Function.prototype.bind</title>
   <link href="http://benediktmeurer.de/2015/12/25/a-new-approach-to-function-prototype-bind"/>
   <updated>2015-12-25T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2015/12/25/a-new-approach-to-function-prototype-bind</id>
   <content type="html">&lt;p&gt;The performance and compatibility of &lt;a href=&quot;http://tc39.github.io/ecma262/#sec-function.prototype.bind&quot;&gt;Function.prototype.bind&lt;/a&gt; and the resulting bound
 function objects has traditionally always been an issue in &lt;a href=&quot;https://developers.google.com/v8&quot;&gt;V8&lt;/a&gt; (and thereby in &lt;a href=&quot;https://www.chromium.org&quot;&gt;Chromium&lt;/a&gt;
 based browsers and &lt;a href=&quot;https://nodejs.org&quot;&gt;Node.js&lt;/a&gt; driven servers).&lt;/p&gt;

&lt;p&gt;Consider the following simple test driver, which defines a (non-trivial) test function &lt;code&gt;foo&lt;/code&gt; and creates two bound functions &lt;code&gt;foo1&lt;/code&gt; and &lt;code&gt;foo2&lt;/code&gt;
based on it, which both bind the receiver and the first argument to some primitive.&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-javascript&quot; data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;use strict&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;z&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;y&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;z&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;foo1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;bind&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;foo2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;bind&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;// Performance test.&lt;/span&gt;
  &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;sum&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;kr&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;limit&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;y&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;y&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;limit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;z&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;z&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;limit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;z&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;nx&quot;&gt;sum&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;foo1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;z&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;foo2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;z&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// Warmup first.&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;startTime&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;now&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;endTime&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;now&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;Time: &amp;quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;endTime&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;startTime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;ms.&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Now running this program with V8 tip-of-tree as of today requires a whopping 12,078ms to execute the test loop on a HP z620 work station running
Ubuntu 14.04. Looking at the performance profile, almost all the time is spend in the
&lt;a href=&quot;https://github.com/v8/v8/blob/fc23b4949850e68a0877e3426c438ce0f710613d/src/js/v8natives.js#L1239&quot;&gt;&lt;code&gt;boundFunction&lt;/code&gt;&lt;/a&gt; builtin (and the associated
helper runtime functions) that acts as a trampoline for bound functions. Looking closely into that function, we see that on every possible [[Call]]
path through the function (the [[Construct]] path uses the &lt;code&gt;%NewObjectFromBound&lt;/code&gt; C++ builtin), we bailout to C++ at least twice, once into
&lt;code&gt;%BoundFunctionGetBindings&lt;/code&gt;, which returns a new Array with the bound target function, the bound this and the bound arguments, and once into
&lt;code&gt;%Apply&lt;/code&gt;, which calls back into JavaScript to execute the actual target function with the actual parameters.&lt;/p&gt;

&lt;p&gt;Calling into C++ is certainly not fast in V8, but calling back from C++ into JavaScript is very expensive. Also building one or two temporary
Arrays on every invocation of a bound function is not cheap, and can cause unnecessary GC traffic. So, there&#39;s a lot of room for improvement
here. I&#39;ve been working on a new approach to implement &lt;a href=&quot;http://tc39.github.io/ecma262/#sec-bound-function-exotic-objects&quot;&gt;Bound Function Exotic Objects&lt;/a&gt;
in V8 for a few months now, as part of a bigger project to fully support objects with [[Call]] and [[Construct]] internal methods that are not
ECMAScript Function objects, i.e. to support &lt;a href=&quot;http://tc39.github.io/ecma262/#sec-proxy-objects&quot;&gt;Proxy Objects&lt;/a&gt;. After a lot of yak shaving,
I now reached a point where I&#39;m close to landing my new &lt;a href=&quot;https://crrev.com/1542963002&quot;&gt;baseline implementation for Function.prototype.bind&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Running the test program above with my patch requires 239ms for the test loop, which is already a &lt;strong&gt;50x improvement&lt;/strong&gt;. There&#39;s still some
more cleanup to be done in order to land the patch (i.e. some API functions seem to require additional work to deal properly with the new
representation of bound function objects), but the baseline results are already very promising. Once the baseline implementation is stabilized,
we can start looking into optimizing bound functions, i.e. enable inlining of bound functions - which should boost this particular case to
&lt;strong&gt;100x improvement&lt;/strong&gt; - and properly collecting and dealing with bound function type feedback.&lt;/p&gt;

&lt;p&gt;I hope that this will in particular help web sites and web apps using &lt;a href=&quot;https://facebook.github.io/react&quot;&gt;React&lt;/a&gt;, because React makes heavy
use of &lt;a href=&quot;http://tc39.github.io/ecma262/#sec-function.prototype.bind&quot;&gt;Function.prototype.bind&lt;/a&gt;. But for React we will also need to look into
the performance of Function.prototype.bind itself and not only the throughput of bound functions, in order to reduce latency and startup
time.&lt;/p&gt;
</content>
   
   <category term="v8"/>
   
   <category term="chrome"/>
   
   <category term="javascript"/>
   
 </entry>
 
 <entry>
   <title type="html">JetStream performance results</title>
   <link href="http://benediktmeurer.de/2015/04/14/jetstream-performance-results"/>
   <updated>2015-04-14T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2015/04/14/jetstream-performance-results</id>
   <content type="html">&lt;p&gt;The &lt;a href=&quot;https://developers.google.com/v8/&quot; target=&quot;_blank&quot;&gt;V8&lt;/a&gt; team has been working hard on improving JavaScript
performance recently, where performance means both peak performance (as in throughput of long running computations)
as well as user visible latency (as in time wasted not doing useful work towards completing a computation or rendering a
website).&lt;/p&gt;

&lt;p&gt;It is not always easy to improve both throughput and latency, especially since it usually introduces latency to generate
the perfect code for optimal throughput. So there&#39;s always a trade-off to consider. Also the existing benchmark suites used to
focus on either latency (i.e. the &lt;a href=&quot;https://www.webkit.org/perf/sunspider/sunspider.html&quot; target=&quot;_blank&quot;&gt;SunSpider
1.0.2 JavaScript Benchmark&lt;/a&gt;) or throughput (i.e. our own &lt;a href=&quot;https://developers.google.com/octane/&quot;
target=&quot;_blank&quot;&gt;Octane&lt;/a&gt; benchmark), but not both.&lt;/p&gt;

&lt;p&gt;Apple tried to address this problem by &lt;a href=&quot;https://www.webkit.org/blog/3418/introducing-the-jetstream-benchmark-suite/&quot;
target=&quot;_blank&quot;&gt;introducing a new benchmark suite&lt;/a&gt; that aims to combine latency and throughput benchmarks with roughly equal
weighting, the &lt;a href=&quot;http://browserbench.org/JetStream/&quot; target=&quot;_blank&quot;&gt;JetStream&lt;/a&gt; benchmark suite. It contains benchmarks
from both SunSpider and Octane, but also additional interesting benchmarks, like various &lt;a href=&quot;http://emscripten.org&quot;
target=&quot;_blank&quot;&gt;Emscripten&lt;/a&gt; compiled C/C++ programs.&lt;/p&gt;

&lt;p&gt;So JetStream seems to be a good candidate to measure our progress on improving overall performance of Chrome/V8 (considering
both throughput and latency). As you can see from the chart below, we have been doing well pretty lately. Chrome 44 (current
canary build) beats both Firefox and Safari, and we&#39;re working on reducing the latency further for the next release. The numbers
were measured on a MacBook Pro (Mid 2012 / 2.3 GHz Intel Core i7 / 16 GB) running OS X 10.9.5.&lt;/p&gt;

&lt;center&gt;&lt;a href=&quot;/images/2015/jetstream-20150414.png&quot;&gt;&lt;img src=&quot;/images/2015/jetstream-20150414.png&quot; /&gt;&lt;/a&gt;&lt;/center&gt;
</content>
   
   <category term="v8"/>
   
   <category term="chrome"/>
   
   <category term="javascript"/>
   
   <category term="performance"/>
   
   <category term="jetstream"/>
   
   <category term="firefox"/>
   
   <category term="safari"/>
   
 </entry>
 
 <entry>
   <title type="html">Cross-compiling V8 for the Raspberry Pi</title>
   <link href="http://benediktmeurer.de/2013/08/25/cross-compiling-v8-for-the-raspberrypi"/>
   <updated>2013-08-25T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2013/08/25/cross-compiling-v8-for-the-raspberrypi</id>
   <content type="html">&lt;p&gt;The &lt;a href=&quot;http://www.raspberrypi.org&quot;&gt;Raspberry Pi&lt;/a&gt; is probably the most popular Linux ARM device nowadays (not including the ARM based Android smartphones and tablets) and &lt;a href=&quot;http://v8.googlecode.com&quot;&gt;V8&lt;/a&gt; is the most popular JavaScript engine, so chances are you may want to run (a recent version of) V8 on the Raspberry Pi. Building on the device is an option, but that takes ages. So you will probably want to cross-compile V8 on your powerful Linux workstation instead.&lt;/p&gt;

&lt;p&gt;To do this for &lt;a href=&quot;http://www.raspbian.org&quot;&gt;Raspbian&lt;/a&gt;, you&#39;ll need to install the &lt;a href=&quot;https://github.com/raspberrypi/tools&quot;&gt;cross-compile toolchain&lt;/a&gt; first (see &lt;a href=&quot;http://hertaville.com/2012/09/28/development-environment-raspberry-pi-cross-compiler&quot;&gt;this guide&lt;/a&gt; for detailed instructions). Assuming that you installed the tools to &lt;code&gt;$HOME/Applications/rpi/tools&lt;/code&gt;, run the following command from your V8 checkout:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; make &lt;span class=&quot;nv&quot;&gt;AR&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;$HOME/Applications/rpi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-ar&amp;quot;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;CXX&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;$HOME/Applications/rpi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-g++&amp;quot;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;LINK&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;$HOME/Applications/rpi/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-g++&amp;quot;&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;armv7&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;false &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;armfloatabi&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;hard arm&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;This will build a debug version of the V8 shell in &lt;code&gt;out/arm.debug/d8&lt;/code&gt; and a release version in &lt;code&gt;out/arm.release/d8&lt;/code&gt;.&lt;/p&gt;
</content>
   
   <category term="v8"/>
   
   <category term="raspberrpi"/>
   
 </entry>
 
 <entry>
   <title type="html">How to fix the hostname of your Strato V-Server</title>
   <link href="http://benediktmeurer.de/2012/04/26/howto-fix-the-hostname-of-your-strato-vserver"/>
   <updated>2012-04-26T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2012/04/26/howto-fix-the-hostname-of-your-strato-vserver</id>
   <content type="html">&lt;p&gt;The &lt;a href=&quot;http://www.strato.de&quot;&gt;Strato&lt;/a&gt; Linux V-Servers always reset their hostnames to &lt;code&gt;hXXXXXX.stratoserver.net&lt;/code&gt; on boot, no matter what you put in &lt;code&gt;/etc/hostname&lt;/code&gt; and there&#39;s no way to fix this (it&#39;s actually intended behavior). If you happen to have a Strato V-Server running Debian, here&#39;s a simple failsafe way to fix the hostname early during boot and have all daemons use your desired hostname.&lt;/p&gt;

&lt;p&gt;Assuming that your desired fully qualified hostname is &lt;code&gt;www.example.org&lt;/code&gt;, then create a new file &lt;code&gt;/etc/init.d/strato-hostname-fix.sh&lt;/code&gt; with the following content&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;c&quot;&gt;#! /bin/sh&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;### BEGIN INIT INFO&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# Provides:          strato-hostname-fix&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# Required-Start:       &lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# Required-Stop:        &lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# Default-Start:     S  &lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# Default-Stop: &lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# X-Start-Before:    hostname&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# Short-Description: Fix the Strato overwritten hostname.&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# Description:       Fix the hostname in /etc/hostname and /etc/hosts that&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;#                    was previously overwritten by the Strato V-Server.&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;### END INIT INFO&lt;/span&gt;
        
&lt;span class=&quot;nv&quot;&gt;PATH&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/sbin:/bin
  
. /lib/init/vars.sh
. /lib/lsb/init-functions
        
do_start &lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
        sed -i &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
                -e &lt;span class=&quot;s1&quot;&gt;&amp;#39;s/h[0-9][0-9]*/www/g&amp;#39;&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
                -e &lt;span class=&quot;s1&quot;&gt;&amp;#39;s/stratoserver\.net/example.org/g&amp;#39;&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
                /etc/hostname &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
                /etc/hosts
        &lt;span class=&quot;nb&quot;&gt;exit&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$?&lt;/span&gt; 
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;       

&lt;span class=&quot;k&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;$1&amp;quot;&lt;/span&gt; in
  start&lt;span class=&quot;p&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
        do_start
        &lt;span class=&quot;p&quot;&gt;;;&lt;/span&gt;
  status&lt;span class=&quot;p&quot;&gt;|&lt;/span&gt;restart&lt;span class=&quot;p&quot;&gt;|&lt;/span&gt;reload&lt;span class=&quot;p&quot;&gt;|&lt;/span&gt;force-reload&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;Error: argument &amp;#39;$1&amp;#39; not supported&amp;quot;&lt;/span&gt; &amp;gt;&lt;span class=&quot;p&quot;&gt;&amp;amp;&lt;/span&gt;2
        &lt;span class=&quot;nb&quot;&gt;exit &lt;/span&gt;3
        &lt;span class=&quot;p&quot;&gt;;;&lt;/span&gt;
  stop&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; 
        &lt;span class=&quot;c&quot;&gt;# No-op&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;;;&lt;/span&gt;
  *&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;    
        &lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;Usage: strato-hostname-fix.sh [start|stop]&amp;quot;&lt;/span&gt; &amp;gt;&lt;span class=&quot;p&quot;&gt;&amp;amp;&lt;/span&gt;2
        &lt;span class=&quot;nb&quot;&gt;exit &lt;/span&gt;3
        &lt;span class=&quot;p&quot;&gt;;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;esac&lt;/span&gt;    

:&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;and setup the script using the following command:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; sudo insserv /etc/init.d/strato-hostname-fix.sh&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Afterwards just reboot the machine. The above was successfully tested with Debian 6.0.4 (squeeze), and should also work with recent Ubuntu versions.&lt;/p&gt;
</content>
   
   <category term="debian"/>
   
   <category term="hostname"/>
   
   <category term="strato"/>
   
   <category term="vserver"/>
   
 </entry>
 
 <entry>
   <title type="html">arm-linux-gnueabi cross compiler for OS X</title>
   <link href="http://benediktmeurer.de/2011/12/04/arm-linux-gnueabi-cross-compiler-for-osx"/>
   <updated>2011-12-04T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2011/12/04/arm-linux-gnueabi-cross-compiler-for-osx</id>
   <content type="html">&lt;p&gt;I spent some time getting a decent cross compiler toolchain for &lt;code&gt;arm-linux-gnueabi&lt;/code&gt; running on Mac OS X, including GNU binutils 2.22, gcc 4.6.2 and OCaml 3.12.1. The cross compiler toolchain targets ARM boards running Debian/armel squeeze or later.&lt;/p&gt;

&lt;p&gt;The stuff is available from my &lt;a href=&quot;https://github.com/bmeurer/MacPorts&quot;&gt;local MacPorts repository&lt;/a&gt;. To get it working on your Mac, make sure to update to the latest MacPorts first, using:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; sudo port selfupdate
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; sudo port upgrade outdated&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Continue by cloning my MacPorts repository and editing the MacPorts &lt;code&gt;sources.conf&lt;/code&gt; file (as superuser):&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; git clone git://github.com/bmeurer/MacPorts.git
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;MacPorts/ports
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; sudo vim /opt/local/etc/macports/sources.conf&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Add a new line to the file &lt;em&gt;before&lt;/em&gt; the line with the &lt;code&gt;[default]&lt;/code&gt; tag&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;go&quot;&gt;file:///path/to/MacPorts/ports [nosync]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;where &lt;code&gt;/path/to/MacPorts&lt;/code&gt; is the path to the MacPorts repository clone. Once done, run&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; portindex&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;in the &lt;code&gt;MacPorts/ports&lt;/code&gt; subdirectory to add the ports from my local MacPorts repository to the list of available ports (remember to rerun &lt;code&gt;portindex&lt;/code&gt; everytime you pull from my repository). Now you can continue installing the cross compiler ports, using either&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; sudo port install arm-linux-gnueabi-gcc&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;to install just the binutils, gcc and the basic runtime, or&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; sudo port install arm-linux-gnueabi-ocaml-compiler&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;to also install the OCaml cross compiler and its runtime. Installing the toolchain will take some time depending on the available bandwidth and the overall speed of your machine.&lt;/p&gt;

&lt;p&gt;Once done, your new cross compiler will be ready in &lt;code&gt;/opt/local&lt;/code&gt;, with its system root in &lt;code&gt;/opt/local/arm-linux-gnueabi/sysroot&lt;/code&gt; and related tools in &lt;code&gt;/opt/local/bin&lt;/code&gt;, prefixed with &lt;code&gt;arm-linux-gnueabi-&lt;/code&gt;, i.e.&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; arm-linux-gnueabi-as --version
&lt;span class=&quot;go&quot;&gt;GNU assembler (MacPorts 2011/12/02) 2.22&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;Copyright 2011 Free Software Foundation, Inc.&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;This program is free software; you may redistribute it under the terms of&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;the GNU General Public License version 3 or later.&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;This program has absolutely no warranty.&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;This assembler was configured for a target of `arm-linux-gnueabi&amp;#39;.&lt;/span&gt;

&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; arm-linux-gnueabi-gcc --version
&lt;span class=&quot;go&quot;&gt;arm-linux-gnueabi-gcc (MacPorts 2011/12/02) 4.6.2&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;Copyright (C) 2011 Free Software Foundation, Inc.&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;This is free software; see the source for copying conditions.  There is NO&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.&lt;/span&gt;

&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; arm-linux-gnueabi-ocamlopt -config
&lt;span class=&quot;go&quot;&gt;version: 3.12.1&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;standard_library_default: /opt/local/arm-linux-gnueabi/sysroot/usr/lib/ocaml&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;standard_library: /opt/local/arm-linux-gnueabi/sysroot/usr/lib/ocaml&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;standard_runtime: /opt/local/arm-linux-gnueabi/bin/ocamlrun&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;ccomp_type: cc&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;bytecomp_c_compiler: arm-linux-gnueabi-gcc -fno-defer-pop -Wall -D_FILE_OFFSET_BITS=64 -D_REENTRANT -fPIC&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;bytecomp_c_libraries: -lm  -ldl -ltermcap -lpthread&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;native_c_compiler: arm-linux-gnueabi-gcc -Wall -D_FILE_OFFSET_BITS=64 -D_REENTRANT&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;native_c_libraries: -lm  -ldl&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;native_pack_linker: arm-linux-gnueabi-ld -r  -o &lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;ranlib: arm-linux-gnueabi-ranlib&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;cc_profile: -pg&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;architecture: arm&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;model: default&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;system: linux&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;asm: arm-linux-gnueabi-as&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;ext_obj: .o&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;ext_asm: .s&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;ext_lib: .a&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;ext_dll: .so&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;os_type: Unix&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;default_executable_name: a.out&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;systhread_supported: true&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;To help with cross compilation of OCaml projects using &lt;code&gt;ocamlfind&lt;/code&gt;, the &lt;code&gt;arm-linux-gnueabi-ocaml-compiler&lt;/code&gt; port also installs a custom &lt;code&gt;ocamlfind&lt;/code&gt; configuration file &lt;code&gt;/opt/local/etc/arm-linux-gnueabi-ocamlfind.conf&lt;/code&gt;, which you can use to utilize the cross compiler toolchain by setting the environment variable &lt;code&gt;OCAMLFIND_CONF&lt;/code&gt; to point to this file.&lt;/p&gt;
</content>
   
   <category term="ocaml"/>
   
   <category term="cross"/>
   
   <category term="compiler"/>
   
   <category term="gcc"/>
   
   <category term="binutils"/>
   
   <category term="macports"/>
   
   <category term="osx"/>
   
 </entry>
 
 <entry>
   <title type="html">Red-Black Trees for OCaml</title>
   <link href="http://benediktmeurer.de/2011/10/16/red-black-trees-for-ocaml"/>
   <updated>2011-10-16T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2011/10/16/red-black-trees-for-ocaml</id>
   <content type="html">&lt;p&gt;I decided that it was about time to get used to &lt;a href=&quot;http://oasis.forge.ocamlcore.org/&quot;&gt;OASIS&lt;/a&gt;, that &lt;em&gt;new&lt;/em&gt; all-in-one build system generator for OCaml projects. So I started by getting it up and running using various &lt;a href=&quot;https://github.com/bmeurer/MacPorts/&quot;&gt;local MacPorts&lt;/a&gt;. Once everything was up and running, I started to switch my implementation of &lt;a href=&quot;https://github.com/bmeurer/ocaml-rbtrees/&quot;&gt;Red-Black Trees for OCaml&lt;/a&gt; to use OASIS instead of my custom &lt;code&gt;Makefile&lt;/code&gt;-based approach. That went amazingly well, and so here&#39;s my first release, version 0.1.0, of &lt;code&gt;ocaml-rbtrees&lt;/code&gt; featuring an OASIS-generated build system.&lt;/p&gt;

&lt;p&gt;Download: &lt;a href=&quot;https://github.com/downloads/bmeurer/ocaml-rbtrees/ocaml-rbtrees-0.1.0.tar.gz&quot;&gt;https://github.com/downloads/bmeurer/ocaml-rbtrees/ocaml-rbtrees-0.1.0.tar.gz&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Git repository: &lt;a href=&quot;https://github.com/bmeurer/ocaml-rbtrees&quot;&gt;https://github.com/bmeurer/ocaml-rbtrees&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For those of you using &lt;a href=&quot;http://www.macports.org/&quot;&gt;MacPorts&lt;/a&gt; on Mac OS X, ocaml-rbtrees 0.1.0 is also available from my local &lt;a href=&quot;https://github.com/bmeurer/MacPorts/&quot;&gt;MacPorts Portfile repository&lt;/a&gt; as &lt;code&gt;caml-rbtrees&lt;/code&gt;.&lt;/p&gt;
</content>
   
   <category term="ocaml"/>
   
   <category term="research"/>
   
   <category term="red-black trees"/>
   
 </entry>
 
 <entry>
   <title type="html">Towards a native toplevel for the OCaml language</title>
   <link href="http://benediktmeurer.de/2011/10/06/towards-a-native-toplevel-for-the-ocaml-language"/>
   <updated>2011-10-06T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2011/10/06/towards-a-native-toplevel-for-the-ocaml-language</id>
   <content type="html">&lt;p&gt;This paper presents the current state of our work on an interactive toplevel for the OCaml language based on the optimizing native code compiler and runtime. Our native toplevel is up to 100 times faster than the default OCaml toplevel, which is based on the byte code compiler and interpreter. It uses Just-In-Time techniques to compile toplevel phrases to native code at runtime, and currently works with various Unix-like systems running on x86 or x86-64 processors.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://arxiv.org/abs/1110.1029&quot;&gt;http://arxiv.org/abs/1110.1029&lt;/a&gt;&lt;/p&gt;
</content>
   
   <category term="ocaml"/>
   
   <category term="jit"/>
   
   <category term="research"/>
   
   <category term="toplevel"/>
   
 </entry>
 
 <entry>
   <title type="html">Patent Evil</title>
   <link href="http://benediktmeurer.de/2011/10/06/patent-evil"/>
   <updated>2011-10-06T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2011/10/06/patent-evil</id>
   <content type="html">&lt;p&gt;How the Patent War is Stifling Innovation in Silicon Valley.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.mbaonline.com/patents/&quot;&gt;&lt;img src=&quot;/images/2011/patent-evil.jpg&quot; alt=&quot;Patent Evil&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Created by: &lt;a href=&quot;http://www.mbaonline.com/&quot;&gt;MBA Online&lt;/a&gt;&lt;/p&gt;
</content>
   
   <category term="software patents"/>
   
   <category term="patent war"/>
   
 </entry>
 
 <entry>
   <title type="html">Native toplevel test release 3.12.1+ocamlnatjit2</title>
   <link href="http://benediktmeurer.de/2011/10/06/native-toplevel-test-release"/>
   <updated>2011-10-06T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2011/10/06/native-toplevel-test-release</id>
   <content type="html">&lt;p&gt;After several additional hours of testing and bugfixing it was time for another test release of our new OCaml native code toplevel &lt;code&gt;ocamlnat&lt;/code&gt;. The test release includes a fully featured OCaml 3.12.1 distribution plus our new toplevel ocamlnat, which is &lt;a href=&quot;/2011/09/14/ocamlnat-benchmark&quot;&gt;up to 100 times faster&lt;/a&gt; than the byte code toplevel. See the &lt;a href=&quot;/ocaml-experimental&quot;&gt;website&lt;/a&gt; for installation instructions and additional information.&lt;/p&gt;

&lt;p&gt;Website: &lt;a href=&quot;http://benediktmeurer.de/ocaml-experimental&quot;&gt;http://benediktmeurer.de/ocaml-experimental&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Download: &lt;a href=&quot;http://benediktmeurer.de/files/source/ocaml-3.12.1+ocamlnatjit2.tar.bz2&quot;&gt;http://benediktmeurer.de/files/source/ocaml-3.12.1+ocamlnatjit2.tar.bz2&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Git repository: &lt;a href=&quot;https://github.com/bmeurer/ocaml-experimental&quot;&gt;https://github.com/bmeurer/ocaml-experimental&lt;/a&gt;&lt;/p&gt;
</content>
   
   <category term="ocaml"/>
   
   <category term="research"/>
   
   <category term="ocamlnat"/>
   
 </entry>
 
 <entry>
   <title type="html">OCamlNat benchmark</title>
   <link href="http://benediktmeurer.de/2011/09/14/ocamlnat-benchmark"/>
   <updated>2011-09-14T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2011/09/14/ocamlnat-benchmark</id>
   <content type="html">&lt;p&gt;Now that we have working versions of our new native OCaml toplevel &lt;code&gt;ocamlnat&lt;/code&gt; without toolchain dependencies for both &lt;code&gt;i386&lt;/code&gt; and &lt;code&gt;amd64&lt;/code&gt;, I decided to run a few benchmarks, comparing our &lt;a href=&quot;https://github.com/bmeurer/ocaml-experimental/tree/ocamlnat-jit&quot;&gt;ocamlnat&lt;/a&gt; to OCaml 3.12.1 (both the byte code toplevel and the ocamlnat that silently ships with 3.12.1) and to our byte-code just-in-time compiler &lt;a href=&quot;https://github.com/bmeurer/ocamljit2&quot;&gt;OCamlJIT2&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The benchmarks used are test programs from the &lt;code&gt;testsuite/tests&lt;/code&gt; folder of the OCaml 3.12.1 distribution. They do more or less represent typical OCaml applications. The &lt;code&gt;almabench&lt;/code&gt;, &lt;code&gt;fft&lt;/code&gt; and &lt;code&gt;nucleic&lt;/code&gt; programs are floating point benchmarks, &lt;code&gt;quicksort&lt;/code&gt; and &lt;code&gt;sorts&lt;/code&gt; are sorting algorithms, and the remaining are miscellaneous benchmarks. The programs were run on different platforms, measuring the combined user + system time for the process itself and all its child processes (only relevant for the &lt;em&gt;old&lt;/em&gt; &lt;code&gt;ocamlnat&lt;/code&gt; which invokes toolchain programs).&lt;/p&gt;

&lt;p&gt;Below is the resulting speedup of the different toplevels compared to the &lt;code&gt;ocaml&lt;/code&gt; byte code toplevel, with &lt;code&gt;OCamlNat/ext&lt;/code&gt; being the &lt;em&gt;old&lt;/em&gt; &lt;code&gt;ocamlnat&lt;/code&gt; with the toolchain dependencies that ships with OCaml 3.12.1 and &lt;code&gt;OCamlNat/jit&lt;/code&gt; being our new implementation available from the &lt;a href=&quot;https://github.com/bmeurer/ocaml-experimental/tree/ocamlnat-jit&quot;&gt;ocamlnat-jit&lt;/a&gt; branch of my &lt;a href=&quot;https://github.com/bmeurer/ocaml-experimental&quot;&gt;ocaml-experimental&lt;/a&gt; repository.&lt;/p&gt;

&lt;center&gt;&lt;a href=&quot;/images/2011/ocamlnat-benchmark-20110914.pdf&quot;&gt;&lt;img src=&quot;/images/2011/ocamlnat-benchmark-20110914-coruscant.png&quot; /&gt;&lt;/a&gt;&lt;/center&gt;




&lt;center&gt;&lt;a href=&quot;/images/2011/ocamlnat-benchmark-20110914.pdf&quot;&gt;&lt;img src=&quot;/images/2011/ocamlnat-benchmark-20110914-bespin.png&quot; /&gt;&lt;/a&gt;&lt;/center&gt;




&lt;center&gt;&lt;a href=&quot;/images/2011/ocamlnat-benchmark-20110914.pdf&quot;&gt;&lt;img src=&quot;/images/2011/ocamlnat-benchmark-20110914-imac.png&quot; /&gt;&lt;/a&gt;&lt;/center&gt;




&lt;center&gt;&lt;a href=&quot;/images/2011/ocamlnat-benchmark-20110914.pdf&quot;&gt;&lt;img src=&quot;/images/2011/ocamlnat-benchmark-20110914-vcs.png&quot; /&gt;&lt;/a&gt;&lt;/center&gt;




&lt;center&gt;&lt;a href=&quot;/images/2011/ocamlnat-benchmark-20110914.pdf&quot;&gt;&lt;img src=&quot;/images/2011/ocamlnat-benchmark-20110914-echobase.png&quot; /&gt;&lt;/a&gt;&lt;/center&gt;


&lt;p&gt;As you can see, the speedup is quite impressive with our native toplevel being up to &lt;strong&gt;100 times faster&lt;/strong&gt; than the byte code toplevel. It is however worth noting that this is in part due to the fact that &lt;code&gt;llvm-gcc&lt;/code&gt; is now the default with OS X, which disables the register assignment optimization in the byte code interpreter.&lt;/p&gt;

&lt;p&gt;If you want to try our new toplevel (and/or help with testing), you can always grab the latest source from my &lt;a href=&quot;https://github.com/bmeurer/ocaml-experimental&quot;&gt;ocaml-experimental&lt;/a&gt; repository using the following command&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; git clone -b ocamlnat-jit git://github.com/bmeurer/ocaml-experimental.git ocamlnat-jit
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;ocamlnat-jit&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;and build and install it using&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; ./configure -prefix /path/to/ocamlnat-jit
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; make world opt ocamlnat
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; make install&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;similar to the regular OCaml distribution. This will install a fully functional OCaml 3.12.1 system to &lt;code&gt;/path/to/ocamlnat-jit&lt;/code&gt; together with a new binary &lt;code&gt;ocamlnat&lt;/code&gt;, our native toplevel. You should be able to use &lt;code&gt;ocamlnat&lt;/code&gt; as a drop-in replacement for &lt;code&gt;ocaml&lt;/code&gt; in almost every case, unless you really need the byte code runtime (i.e. &lt;a href=&quot;http://coq.inria.fr&quot;&gt;Coq&lt;/a&gt; is one popular application that heavily depends on the byte code runtime).&lt;/p&gt;
</content>
   
   <category term="ocaml"/>
   
   <category term="ocamlnat"/>
   
   <category term="ocamljit2"/>
   
 </entry>
 
 <entry>
   <title type="html">New website design</title>
   <link href="http://benediktmeurer.de/2011/09/09/new-website-design"/>
   <updated>2011-09-09T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2011/09/09/new-website-design</id>
   <content type="html">&lt;p&gt;I decided to update the website design again. Text should be easier to read now, and the new design feels lighter and less cluttered.&lt;/p&gt;
</content>
   
   <category term="web site"/>
   
   <category term="jekyll"/>
   
   <category term="github"/>
   
 </entry>
 
 <entry>
   <title type="html">SSH via SSH Tunnel</title>
   <link href="http://benediktmeurer.de/2011/09/07/ssh-via-ssh-tunnel"/>
   <updated>2011-09-07T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2011/09/07/ssh-via-ssh-tunnel</id>
   <content type="html">&lt;p&gt;Imagine you want to connect via SSH to remote systems &lt;code&gt;hostB&lt;/code&gt; and &lt;code&gt;hostC&lt;/code&gt; on an intranet behind &lt;code&gt;hostA&lt;/code&gt;. This could be achieved easily using port forwarding via &lt;code&gt;hostA&lt;/code&gt;, just pick two arbitrary ports on the local machine and forward them to ports 22 of &lt;code&gt;hostB&lt;/code&gt; and &lt;code&gt;hostC&lt;/code&gt;. This works very well for a small amount of intranet hosts, but it get&#39;s quite messy as the list of hosts grows. After some time you&#39;ll have a rather huge amount of local ports to remember (or to lookup in your port forwarding script several times a day). It&#39;d certainly be easier to just type &lt;code&gt;ssh hostB&lt;/code&gt; and have the tunnel setup automatically.&lt;/p&gt;

&lt;p&gt;Fortunately that is very well possible and quite easy to achieve using the &lt;code&gt;ProxyCommand&lt;/code&gt; directive. Assuming &lt;code&gt;hostA&lt;/code&gt; has &lt;code&gt;nc&lt;/code&gt; installed, you can just add the following lines to your &lt;code&gt;$HOME/.ssh/config&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;Host hostB
    HostKeyAlias hostB
    ProxyCommand ssh hostA &amp;#39;nc hostB 22&amp;#39;

Host hostC
    HostKeyAlias hostC
    ProxyCommand ssh hostA &amp;#39;nc hostC 22&amp;#39;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Once done, you can easily connect to &lt;code&gt;hostB&lt;/code&gt; via &lt;code&gt;ssh hostB&lt;/code&gt;, or &lt;code&gt;hostC&lt;/code&gt; via &lt;code&gt;ssh hostC&lt;/code&gt;. No need to setup the tunnel first, it&#39;ll be set up and teared down automagically as needed.&lt;/p&gt;
</content>
   
   <category term="ssh"/>
   
   <category term="tunnel"/>
   
   <category term="linux"/>
   
   <category term="osx"/>
   
 </entry>
 
 <entry>
   <title type="html">Linear Scan Register Allocator for the OCaml Native Code Compiler</title>
   <link href="http://benediktmeurer.de/2011/08/25/ocaml-linear-scan-register-allocator"/>
   <updated>2011-08-25T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2011/08/25/ocaml-linear-scan-register-allocator</id>
   <content type="html">&lt;p&gt;I recently imported the first working version of the &lt;a href=&quot;http://www.cs.ucla.edu/~palsberg/course/cs132/linearscan.pdf&quot;&gt;Linear Scan Register Allocator&lt;/a&gt; for the &lt;a href=&quot;http://caml.inria.fr/ocaml&quot;&gt;OCaml&lt;/a&gt; Native Code Compiler &lt;code&gt;ocamlopt&lt;/code&gt; into the &lt;a href=&quot;https://github.com/bmeurer/ocaml-experimental/tree/linear-scan-register-allocator&quot;&gt;linear-scan-register-allocator&lt;/a&gt; branch of my &lt;a href=&quot;https://github.com/bmeurer/ocaml-experimental&quot;&gt;ocaml-experimental&lt;/a&gt; repository. The register allocator was implemented for &lt;code&gt;ocamlopt&lt;/code&gt; by Marcell Fischbach as part of his diploma thesis. It presents a first step towards a (better) native OCaml toplevel &lt;code&gt;ocamlnat&lt;/code&gt;. Use the following command to checkout the source code:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; git clone -b linear-scan-register-allocator git://github.com/bmeurer/ocaml-experimental.git ocaml-linscan&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The implementation of the linear scan register allocator can be found in &lt;code&gt;asmcomp/interval.ml&lt;/code&gt;, &lt;code&gt;asmcomp/interval.mli&lt;/code&gt;, &lt;code&gt;asmcomp/linscan.ml&lt;/code&gt; and &lt;code&gt;asmcomp/linscan.mli&lt;/code&gt; (integrated into &lt;code&gt;ocamlopt&lt;/code&gt; via &lt;a href=&quot;https://github.com/bmeurer/ocaml-experimental/commit/741802a5cde4e4ea3ee58dfa91c8832b5bb86544#asmcomp/asmgen.ml&quot;&gt;asmcomp/asmgen.ml&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Some initial timing results are available &lt;a href=&quot;http://ps.informatik.uni-siegen.de/~meurer/tmp/compiletime_timings.pdf&quot;&gt;here&lt;/a&gt;, &lt;a href=&quot;http://ps.informatik.uni-siegen.de/~meurer/tmp/linscan-i7-i386-timings.pdf&quot;&gt;here&lt;/a&gt;, and &lt;a href=&quot;http://ps.informatik.uni-siegen.de/~meurer/tmp/runtime_timings.pdf&quot;&gt;here&lt;/a&gt;. See &lt;a href=&quot;http://caml.inria.fr/mantis/view.php?id=5324&quot;&gt;bug 5324&lt;/a&gt; for additional details.&lt;/p&gt;
</content>
   
   <category term="ocaml"/>
   
   <category term="diploma thesis"/>
   
   <category term="linear scan"/>
   
   <category term="register allocation"/>
   
 </entry>
 
 <entry>
   <title type="html">OCaml GitHub Mirror</title>
   <link href="http://benediktmeurer.de/2011/08/20/ocaml-github-mirror"/>
   <updated>2011-08-20T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2011/08/20/ocaml-github-mirror</id>
   <content type="html">&lt;p&gt;During the last two days I managed to setup a &lt;a href=&quot;http://github.com&quot;&gt;GitHub&lt;/a&gt; &lt;a href=&quot;https://github.com/bmeurer/ocaml&quot;&gt;mirror&lt;/a&gt; of &lt;a href=&quot;http://caml.inria.fr/ocaml/&quot;&gt;OCaml&lt;/a&gt;. It works by importing the changes from the official &lt;a href=&quot;http://caml.inria.fr/cgi-bin/viewcvs.cgi/ocaml/&quot;&gt;OCaml Subversion Repository&lt;/a&gt; using &lt;code&gt;git-svn&lt;/code&gt; and pushing them to the &lt;a href=&quot;https://github.com/bmeurer/ocaml&quot;&gt;GitHub mirror&lt;/a&gt;. This is done automatically every hour by one of my servers. It works by setting up a Git branch for every &lt;code&gt;version&lt;/code&gt; Subversion branch and a Git branch with a &lt;code&gt;tags/&lt;/code&gt; prefix for every &lt;code&gt;tags&lt;/code&gt; Subversion branch. Also note that the master branch is called &lt;code&gt;trunk&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I wanted to do this for some time now, but as some of you know, time is always against us. The major advantage is that there is now a single Git base for all my OCaml projects (and that of others), and there&#39;s is no longer a need to fiddle with &lt;code&gt;git-svn&lt;/code&gt; in each and every project. Feel free to &lt;a href=&quot;https://github.com/bmeurer/ocaml/fork&quot;&gt;fork&lt;/a&gt; my &lt;a href=&quot;https://github.com/bmeurer/ocaml&quot;&gt;ocaml&lt;/a&gt; repository for your own needs.&lt;/p&gt;
</content>
   
   <category term="ocaml"/>
   
   <category term="github"/>
   
   <category term="git"/>
   
 </entry>
 
 <entry>
   <title type="html">Demon Cam Promo Video</title>
   <link href="http://benediktmeurer.de/2011/08/16/demoncam-promo-video"/>
   <updated>2011-08-16T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2011/08/16/demoncam-promo-video</id>
   <content type="html">&lt;p&gt;Wow that &lt;a href=&quot;http://www.demoncam.com/film/&quot;&gt;Promotion Video&lt;/a&gt; for the &lt;a href=&quot;http://www.demoncam.com/app/&quot;&gt;Demon Cam&lt;/a&gt; is just awesome! I wonder if they will be able to actually make money with the app.&lt;/p&gt;

&lt;center&gt;&lt;iframe width=&quot;560&quot; height=&quot;349&quot; src=&quot;http://www.youtube.com/embed/ho6_JeZI9ZI&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;/center&gt;


&lt;p&gt;The &lt;a href=&quot;http://itunes.apple.com/app/demon-cam/id450552272?mt=8&quot;&gt;app&lt;/a&gt; is iPhone-only right now, available at $0.99. A HD or Pro version for the iPad will probably follow at some point.&lt;/p&gt;
</content>
   
   <category term="app"/>
   
   <category term="ios"/>
   
   <category term="iphone"/>
   
   <category term="ipad"/>
   
 </entry>
 
 <entry>
   <title type="html">CocoaHeads Siegen September Meeting</title>
   <link href="http://benediktmeurer.de/2011/08/15/cocoaheads-siegen-september-meeting"/>
   <updated>2011-08-15T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2011/08/15/cocoaheads-siegen-september-meeting</id>
   <content type="html">&lt;p&gt;Next monthly meeting of the &lt;a href=&quot;http://cocoaheads.informatik.uni-siegen.de&quot;&gt;CocoaHeads Siegen&lt;/a&gt; scheduled for September, 13th 2011 at 19:00, feat: &quot;iOS 5 - New and Noteworthy&quot; (Benjamin Mies). Third meeting already and this time we also have a nice flyer!&lt;/p&gt;

&lt;center&gt;&lt;a href=&quot;/images/2011/flyer-cocoaheads-201109.pdf&quot;&gt;&lt;img alt=&quot;CocoaHeads Siegen September Flyer&quot; src=&quot;/images/2011/flyer-cocoaheads-201109.jpg&quot; /&gt;&lt;/a&gt;&lt;/center&gt;


&lt;p&gt;On a related note: The server running the CocoaHeads Siegen &lt;a href=&quot;http://cocoaheads.informatik.uni-siegen.de&quot;&gt;website&lt;/a&gt; will be down on August, 27th 2011 due to some power supply related maintenance work at the &lt;a href=&quot;http://www.uni-siegen.de&quot;&gt;Universität Siegen&lt;/a&gt;.&lt;/p&gt;
</content>
   
   <category term="cocoaheads"/>
   
   <category term="cocoa"/>
   
   <category term="ios"/>
   
   <category term="mac"/>
   
   <category term="osx"/>
   
 </entry>
 
 <entry>
   <title type="html">Random crashes with iOS 4.2.1</title>
   <link href="http://benediktmeurer.de/2011/08/13/random-crashes-with-ios-4-2-1"/>
   <updated>2011-08-13T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2011/08/13/random-crashes-with-ios-4-2-1</id>
   <content type="html">&lt;p&gt;I received several complaints about random crashes lately. The complaints of course did not mention any specific version of iOS nor any other useful details. So I had to digg into it myself. As it turned out the crashes were due to the use of &lt;code&gt;DISPATCH_QUEUE_PRIORITY_BACKGROUND&lt;/code&gt;, which is not only unavailable with iOS 4.2.1 (and earlier), but also causes &lt;code&gt;dispatch_async&lt;/code&gt; to crash - which is rather bad IMHO, a fallback to &lt;code&gt;DISPATCH_QUEUE_PRIORITY_LOW&lt;/code&gt; would be better from both the user&#39;s and the developer&#39;s POV.&lt;/p&gt;
</content>
   
   <category term="ios"/>
   
   <category term="cocoa"/>
   
   <category term="crashes"/>
   
 </entry>
 
 <entry>
   <title type="html">Blocks and Grand Central Dispatch</title>
   <link href="http://benediktmeurer.de/2011/08/11/blocks-and-grand-central-dispatch"/>
   <updated>2011-08-11T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2011/08/11/blocks-and-grand-central-dispatch</id>
   <content type="html">&lt;p&gt;Yesterday I held a talk about &lt;a href=&quot;http://en.wikipedia.org/wiki/Blocks_(C_language_extension)&quot;&gt;Blocks&lt;/a&gt; and
&lt;a href=&quot;http://en.wikipedia.org/wiki/Grand_Central_Dispatch&quot;&gt;Grand Central Dispatch&lt;/a&gt; at the second monthly &lt;a href=&quot;http://cocoaheads.informatik.uni-siegen.de&quot;&gt;CocoaHeads
Siegen&lt;/a&gt; meeting.
My &lt;a href=&quot;/files/blocks-and-grand-central-dispatch2011.pdf&quot;&gt;slides&lt;/a&gt; are available for download from the CocoaHeads Siegen
&lt;a href=&quot;http://cocoaheads.informatik.uni-siegen.de/#2011-08-10&quot;&gt;website&lt;/a&gt;. The presentation gave rise to some interesting
discussion about networking performance with and without GCD, so today I&#39;m digging into that
&lt;a href=&quot;http://code.google.com/p/cocoaasyncsocket/wiki/Reference_GCDAsyncSocket&quot;&gt;GCDAsyncSocket&lt;/a&gt; thing again.&lt;/p&gt;
</content>
   
   <category term="blocks"/>
   
   <category term="gcd"/>
   
   <category term="cocoa"/>
   
   <category term="ios"/>
   
   <category term="cocoaheads"/>
   
 </entry>
 
 <entry>
   <title type="html">How to uncrush pngcrushed images from an iOS App Bundle</title>
   <link href="http://benediktmeurer.de/2011/08/04/how-to-uncrush-pngcrushed-images-from-an-ios-app-bundle"/>
   <updated>2011-08-04T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2011/08/04/how-to-uncrush-pngcrushed-images-from-an-ios-app-bundle</id>
   <content type="html">&lt;p&gt;I recently had to restore some PNG files from an iOS App Bundle, which apparently did not work very well, since they have been compressed automatically using Apple&#39;s version of &lt;a href=&quot;http://pmt.sourceforge.net/pngcrush/&quot;&gt;pngcrush&lt;/a&gt; when they were copied to the App Bundle folder during archiving. Fortunately it&#39;s quite easy to revert the optimizations using the following command (assuming you have installed the Apple Developer Tools and the iOS SDK):&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; mkdir ~/reverted
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/pngcrush -dir ~/reverted -revert-iphone-optimizations -q *.png&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;This will create a folder &lt;code&gt;reverted&lt;/code&gt; in your home directory with the uncrushed PNG files.&lt;/p&gt;
</content>
   
   <category term="ios"/>
   
   <category term="iphone"/>
   
   <category term="app"/>
   
   <category term="bundle"/>
   
   <category term="pngcrush"/>
   
 </entry>
 
 <entry>
   <title type="html">Using Git tags to manage the version of Xcode projects</title>
   <link href="http://benediktmeurer.de/2011/07/25/using-git-tags-to-manage-the-version-of-xcode-projects"/>
   <updated>2011-07-25T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2011/07/25/using-git-tags-to-manage-the-version-of-xcode-projects</id>
   <content type="html">&lt;p&gt;Inspired by a
&lt;a href=&quot;http://stuff.bondo.net/post/7769890357/using-build-and-version-numbers-and-the-art-of&quot;&gt;recent post&lt;/a&gt;
of &lt;a href=&quot;http://twitter.com/osteslag&quot;&gt;Joachim Bondo&lt;/a&gt; I decided to rework my versioning scheme for Xcode
projects as well. One of the major drawbacks of traditional versioning is that the so-called
&lt;em&gt;marketing version&lt;/em&gt; (Apple slang) is kept twice, once in the project&#39;s &lt;code&gt;Info.plist&lt;/code&gt;
file and once in the &lt;a href=&quot;http://git-scm.com&quot;&gt;Git&lt;/a&gt; tag that is created after release. This redundancy
is not only inconvenient, but can also lead to mistakes, i.e. forgetting to bump the
&lt;code&gt;CFBundleShortVersionString&lt;/code&gt; prior to tagging the new release.&lt;/p&gt;

&lt;p&gt;So instead of maintaining the &lt;code&gt;CFBundleShortVersionString&lt;/code&gt; we will now automatically
inject the version number from the most recent Git tag into the generated app bundle. This is
actually pretty easy and requires just the following two lines of shell code in a custom
&lt;em&gt;Build Phase&lt;/em&gt;:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;c&quot;&gt;# Update the CFBundleShortVersionString in the generated Info.plist using the most recent Git tag.&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# Idea taken from http://tinyurl.com/3usjj9d by Joachim Bondo.&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# Get the current release description from Git.&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;GIT_RELEASE_VERSION&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;git describe --tags&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# Set the CFBundleShortVersionString in the generated Info.plist (stripping off the leading &amp;quot;v&amp;quot;).&lt;/span&gt;
defaults write &lt;span class=&quot;s2&quot;&gt;&amp;quot;${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH%.*}&amp;quot;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;CFBundleShortVersionString&amp;quot;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;${GIT_RELEASE_VERSION#*v}&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;To add it to a target in your Xcode project, select the target, then &lt;em&gt;Add Build Phase → Add Run Script&lt;/em&gt;,
set the shell to &lt;code&gt;/bin/bash&lt;/code&gt; and paste the contents of the script above. Make sure it is run
after the &lt;em&gt;Target Dependencies&lt;/em&gt; phase and before the &lt;em&gt;Copy Bundle Resources&lt;/em&gt; phase, as shown in
the following screenshot.&lt;/p&gt;

&lt;center&gt;&lt;a href=&quot;/images/2011/xcode-git-version-run-script.png&quot;&gt;&lt;img alt=&quot;Xcode Set Version script&quot; src=&quot;/images/2011/xcode-git-version-run-script.png&quot; /&gt;&lt;/a&gt;&lt;/center&gt;


&lt;p&gt;It is important to note that this will alter the &lt;code&gt;Info.plist&lt;/code&gt; file of the built app bundle,
not the &lt;code&gt;Info.plist&lt;/code&gt; in your source tree, so your source tree won&#39;t get dirty
from this operation, and you won&#39;t have to either reset or make another commit which would
create a mismatch between the code you tagged and the code containing the correct version
number. This way the version is stored only in the Git tag (i.e. &lt;code&gt;v1.0.0&lt;/code&gt;) and you can
remove the &lt;code&gt;CFBundleShortVersionString&lt;/code&gt; from the &lt;code&gt;Info.plist&lt;/code&gt; in your source tree.&lt;/p&gt;

&lt;p&gt;A nice side effect of using &lt;code&gt;git describe --tags&lt;/code&gt; is that if you make a development build,
in-between any Git tagging, you will get a version number like &lt;code&gt;v1.0.0-12-gf181880&lt;/code&gt;. In this
case the version was built from a commit identified by the (partial) SHA &lt;code&gt;gf181880&lt;/code&gt; which is
12 commits after the last tagged version &lt;code&gt;v1.0.0&lt;/code&gt;. A great way to handle the &lt;em&gt;marking version&lt;/em&gt;
of development builds.&lt;/p&gt;
</content>
   
   <category term="git"/>
   
   <category term="xcode"/>
   
   <category term="ios"/>
   
   <category term="mac"/>
   
 </entry>
 
 <entry>
   <title type="html">Disabling the local snapshots feature of Time Machine in Lion</title>
   <link href="http://benediktmeurer.de/2011/07/24/disabling-the-local-snapshots-feature-of-time-machine-in-lion"/>
   <updated>2011-07-24T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2011/07/24/disabling-the-local-snapshots-feature-of-time-machine-in-lion</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://www.apple.com/macosx/whats-new/features.html#timemachine&quot;&gt;Local snapshots for Time Machine&lt;/a&gt; is one of the new features in OS X Lion that looks really good on paper. But once you have used your new Lion installation for a few days, you will notice that you are running out of disk space. After some digging around I noticed that the &lt;code&gt;/.MobileBackups&lt;/code&gt; folder that is used by Time Machine for local snapshots was at nearly 50GiB, even though the external Time Machine backup disk was connected most of the time. I guess this is done to speedup Time Machine in the common case, and make backups available when not connected to the external Time Machine disk.&lt;/p&gt;

&lt;p&gt;Besides the disk space issue, the local snapshots feature also slows down your MBP noticably. You&#39;ll notice that the disk is spinning most of the time, and the file copying performed by Time Machine trashes your caches. Everything feels terribly slow after some time. Thankfully Apple engineers included a switch to turn of the local snapshots feature, &lt;code&gt;tmutil&lt;/code&gt; supports a new command &lt;code&gt;disablelocal&lt;/code&gt; in OS X Lion. Use the following command to disable the local snapshots feature of Time Machine:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; sudo tmutil disablelocal&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Note that it might take some time for Time Machine to cleanup the &lt;code&gt;/.MobileBackups&lt;/code&gt; folder.&lt;/p&gt;
</content>
   
   <category term="osx"/>
   
   <category term="mac"/>
   
   <category term="lion"/>
   
   <category term="time machine"/>
   
 </entry>
 
 <entry>
   <title type="html">Lion</title>
   <link href="http://benediktmeurer.de/2011/07/21/lion"/>
   <updated>2011-07-21T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2011/07/21/lion</id>
   <content type="html">&lt;p&gt;So I&#39;m trying to get used to &lt;a href=&quot;http://www.apple.com/macosx/&quot;&gt;OS X Lion&lt;/a&gt;
now. One of the first things I noticed was that the &lt;code&gt;Library&lt;/code&gt;
folder does no longer show up in Finder by default. Of course that was
rather trivial to fix using the following command:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; chflags nohidden ~/Library&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;One really nice feature in Lion is that new tabs in
&lt;a href=&quot;http://en.wikipedia.org/wiki/Apple_Terminal&quot;&gt;Terminal.app&lt;/a&gt; now inherit the
current working directory from the tab from which they were opened - something
I implemented in &lt;a href=&quot;http://www.xfce.org/projects/terminal&quot;&gt;Xfce&#39;s Terminal&lt;/a&gt;
seven years ago, BTW. Looks like this is implemented by parsing the path
displayed in the title bar, which can have unexpected results when combined
with &lt;code&gt;ssh&lt;/code&gt; sessions, since the path in the title is actually set
via the (remote) shell. In addition the title bar of Terminal windows
now provides the same handles as the title bar in Finder windows, which is
pretty handy.&lt;/p&gt;

&lt;p&gt;Unfortunately Apple decided to kick Spaces and replace it with &lt;a href=&quot;http://www.apple.com/macosx/whats-new/mission-control.html&quot;&gt;Mission
Control&lt;/a&gt;. This
by itself is not necessarily bad, but now there&#39;s no way to get that two
dimensional workspace layout back, at least until Apple decides
to fix that shortcoming. I&#39;ve also noticed that the order of the workspaces
seems to change under some (obscure) conditions, which is even worse. Maybe
I&#39;m just getting old, but until now I was unable to figure out what triggers
this rearrangement - not what I&#39;d call intuitive.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update 1:&lt;/strong&gt; Lion also says &lt;em&gt;bye bye&lt;/em&gt; to Microsoft Office for Mac 2004, since
&lt;a href=&quot;http://en.wikipedia.org/wiki/Rosetta_(software)&quot;&gt;Rosetta&lt;/a&gt; is not
available for Mac OS X 10.7.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update 2:&lt;/strong&gt; Make sure you don&#39;t miss the &lt;a href=&quot;http://arstechnica.com/apple/reviews/2011/07/mac-os-x-10-7.ars/&quot;&gt;Mac OS X 10.7 Lion
review&lt;/a&gt;
by &lt;a href=&quot;http://arstechnica.com&quot;&gt;ars technica&lt;/a&gt;&#39;s &lt;a href=&quot;http://arstechnica.com/author/john-siracusa/&quot;&gt;John
Siracusa&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update 3:&lt;/strong&gt; Well, I am old... the fix for that &lt;em&gt;Mission Control feature&lt;/em&gt; that
drove me nuts is obvious. In the &lt;strong&gt;Mission Control&lt;/strong&gt; preference pane, disable
the &lt;strong&gt;Automatically rearrange spaces based on most recent use&lt;/strong&gt; option. Even
if I was too blind to discover this earlier, it&#39;s nevertheless a really bad
default. Out of 100 Mac users, how many would their workspaces to rearrange
&lt;em&gt;magically&lt;/em&gt;?&lt;/p&gt;
</content>
   
   <category term="osx"/>
   
   <category term="mac"/>
   
   <category term="lion"/>
   
 </entry>
 
 <entry>
   <title type="html">OS X Lion</title>
   <link href="http://benediktmeurer.de/2011/07/20/osx-lion"/>
   <updated>2011-07-20T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2011/07/20/osx-lion</id>
   <content type="html">&lt;p&gt;Just like almost every other geek on this planet, I&#39;m downloading
&lt;a href=&quot;http://www.apple.com/macosx/&quot;&gt;OS X Lion&lt;/a&gt; from the App Store right
now. Rather slow... but that way I can do a full backup first while
the update is downloading. &lt;a href=&quot;https://twitter.com/search/%23lion&quot;&gt;#lion&lt;/a&gt;
on &lt;a href=&quot;http://twitter.com&quot;&gt;Twitter&lt;/a&gt; is already busy discussing the new
release.&lt;/p&gt;

&lt;p&gt;In related news: The new &lt;a href=&quot;http://www.apple.com/macbookair/&quot;&gt;MacBook Air&lt;/a&gt;
looks really great - especially starting at $999. Finally a real alternative
to the &lt;a href=&quot;http://www.apple.com/macbookpro/&quot;&gt;MacBook Pro&lt;/a&gt;.&lt;/p&gt;
</content>
   
   <category term="osx"/>
   
   <category term="mac"/>
   
   <category term="lion"/>
   
 </entry>
 
 <entry>
   <title type="html">Jekyllified CocoaHeads Siegen website</title>
   <link href="http://benediktmeurer.de/2011/07/20/jekyllified-cocoaheads-siegen"/>
   <updated>2011-07-20T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2011/07/20/jekyllified-cocoaheads-siegen</id>
   <content type="html">&lt;p&gt;I just migrated the &lt;a href=&quot;http://cocoaheads.informatik.uni-siegen.de&quot;&gt;CocoaHeads Siegen&lt;/a&gt; website
to also use &lt;a href=&quot;http://github.com/mojombo/jekyll&quot;&gt;Jekyll&lt;/a&gt;, and uploaded the source to
&lt;a href=&quot;http://github.com/bmeurer/cocoaheads.informatik.uni-siegen.de&quot;&gt;GitHub&lt;/a&gt; (it is not hosted
on &lt;a href=&quot;http://pages.github.com&quot;&gt;GitHub Pages&lt;/a&gt; though).&lt;/p&gt;

&lt;p&gt;I&#39;ve also uploaded the &lt;a href=&quot;http://cocoaheads.informatik.uni-siegen.de/#2011-07-14&quot;&gt;slides and source
code&lt;/a&gt; from the first CocoaHeads Siegen
meeting.&lt;/p&gt;
</content>
   
   <category term="cocoaheads"/>
   
   <category term="jekyll"/>
   
   <category term="github"/>
   
 </entry>
 
 <entry>
   <title type="html">New website</title>
   <link href="http://benediktmeurer.de/2011/07/11/new-website"/>
   <updated>2011-07-11T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2011/07/11/new-website</id>
   <content type="html">&lt;p&gt;It was about time to get my website up2date... once again. In order to get it right this
time, I decided to use &lt;a href=&quot;http://github.com/mojombo/jekyll&quot;&gt;Jekyll&lt;/a&gt; this time, and host
everything on &lt;a href=&quot;http://github.com&quot;&gt;GitHub&lt;/a&gt; using their excellent
&lt;a href=&quot;http://pages.github.com&quot;&gt;GitHub Pages&lt;/a&gt; service.&lt;/p&gt;
</content>
   
   <category term="web site"/>
   
   <category term="jekyll"/>
   
   <category term="github"/>
   
 </entry>
 
 <entry>
   <title type="html">XCasts color theme for Xcode 4</title>
   <link href="http://benediktmeurer.de/2011/06/19/xcasts-color-theme-for-xcode4"/>
   <updated>2011-06-19T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2011/06/19/xcasts-color-theme-for-xcode4</id>
   <content type="html">&lt;p&gt;Check out &lt;a href=&quot;http://github.com/bmeurer/XCasts-color-theme-for-Xcode-4&quot;&gt;my Xcode 4 version&lt;/a&gt;
of Ben Scheirman&#39;s &lt;a href=&quot;http://flux88.com/2010/05/my-xcode-theme/&quot;&gt;XCasts color theme for Xcode 3&lt;/a&gt;,
a dark theme loosely based on &lt;a href=&quot;http://railscasts.com/&quot;&gt;Ryan Bates&lt;/a&gt;&#39; excellent &lt;a href=&quot;http://railscasts.com/about&quot;&gt;Railscasts theme
for Textmate&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Screenshot&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;http://github.com/bmeurer/XCasts-color-theme-for-Xcode-4/raw/master/XCasts-screenshot.png&quot; title=&quot;Screenshot&quot; alt=&quot;Screenshot&quot; /&gt;&lt;/p&gt;

&lt;h2&gt;Installation&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Download and install the &lt;a href=&quot;http://www.levien.com/type/myfonts/inconsolata.html&quot;&gt;Inconsolata&lt;/a&gt; font.&lt;/li&gt;
&lt;li&gt;Place the file &lt;a href=&quot;http://raw.github.com/bmeurer/XCasts-color-theme-for-Xcode-4/master/XCasts.dvtcolortheme&quot;&gt;XCasts.dvtcolortheme&lt;/a&gt; into the directory &lt;code&gt;~/Library/Developer/Xcode/UserData/FontAndColorThemes/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Restart Xcode.&lt;/li&gt;
&lt;li&gt;Open &lt;code&gt;XCode | Preferences | Fonts &amp;amp; Colors&lt;/code&gt; and select the &lt;code&gt;XCasts&lt;/code&gt; theme.&lt;/li&gt;
&lt;/ul&gt;

</content>
   
   <category term="xcode"/>
   
 </entry>
 
 <entry>
   <title type="html">Nice transition from splash screen to main application screen using fade out and zoom in animation</title>
   <link href="http://benediktmeurer.de/2011/06/15/nice-transition-from-splash-screen-to-main-application-screen"/>
   <updated>2011-06-15T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2011/06/15/nice-transition-from-splash-screen-to-main-application-screen</id>
   <content type="html">Change the &lt;code&gt;-application:didFinishLaunchingWithOptions:&lt;/code&gt; method of your application
delegate class like this (assuming your splash image is named &lt;code&gt;Default.png&lt;/code&gt;):

&lt;script src=&quot;http://gist.github.com/1026439.js&quot;&gt; &lt;/script&gt;
</content>
   
   <category term="ios"/>
   
   <category term="iphone"/>
   
   <category term="ipad"/>
   
   <category term="objc"/>
   
 </entry>
 
 <entry>
   <title type="html">Rounded rect additions for UILabel</title>
   <link href="http://benediktmeurer.de/2011/06/13/rounded-rect-additions-for-uilabel"/>
   <updated>2011-06-13T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2011/06/13/rounded-rect-additions-for-uilabel</id>
   <content type="html">Category on &lt;a href=&quot;http://developer.apple.com/library/ios/DOCUMENTATION/UIKit/Reference/UILabel_Class/Reference/UILabel.html&quot;&gt;UILabel&lt;/a&gt; which adds a property &lt;code&gt;showsRoundedRect&lt;/code&gt;, which, if set to &lt;code&gt;YES&lt;/code&gt;, causes the label to be drawn on a rounded rect, similar to the emblem shown for the number of new mails in the iPhone Mail app. Check out the &lt;a href=&quot;http://gist.github.com/1022934&quot;&gt;Gist&lt;/a&gt; on Github.
</content>
   
   <category term="ios"/>
   
   <category term="iphone"/>
   
   <category term="ipad"/>
   
   <category term="objc"/>
   
 </entry>
 
 <entry>
   <title type="html">git-utils - Various git related utilities</title>
   <link href="http://benediktmeurer.de/2011/05/31/git-utils"/>
   <updated>2011-05-31T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2011/05/31/git-utils</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://github.com/bmeurer/git-utils&quot;&gt;Git Utils&lt;/a&gt; is a collection of simple utilities that made
my &lt;a href=&quot;http://git-scm.com&quot;&gt;Git&lt;/a&gt; life easier in some way or another. I tried to clean them up as
much as necessary prior to putting here, so it should be easy to use for others as well.&lt;/p&gt;

&lt;h2&gt;Installation&lt;/h2&gt;

&lt;p&gt;You don&#39;t need anything special, just a working installation of Git and a UNIX system (tested
with Mac OS X and Linux). To install the git-utils into &lt;code&gt;/usr/local&lt;/code&gt; run&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; sudo make install&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;or just pick the scripts that you need and place them wherever you want.&lt;/p&gt;

&lt;h2&gt;Description&lt;/h2&gt;

&lt;h3&gt;git-copy&lt;/h3&gt;

&lt;p&gt;Copy file from source path to target path and add the target path to the Git index.&lt;/p&gt;

&lt;h3&gt;git-push-all&lt;/h3&gt;

&lt;p&gt;Invoke git-push for all configured remote repositories.&lt;/p&gt;
</content>
   
   <category term="git"/>
   
 </entry>
 
 <entry>
   <title type="html">A Step-indexed Semantic Model of Types for the Call-by-Name Lambda Calculus</title>
   <link href="http://benediktmeurer.de/2011/05/10/a-step-indexed-semantic-model-of-types-for-the-call-by-name-lambda-calculus"/>
   <updated>2011-05-10T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2011/05/10/a-step-indexed-semantic-model-of-types-for-the-call-by-name-lambda-calculus</id>
   <content type="html">&lt;p&gt;Step-indexed semantic models of types were proposed as an alternative to purely syntactic safety proofs using subject-reduction. Building upon the work by Appel and others, we introduce a generalized step-indexed model for the call-by-name lambda calculus. We also show how to prove type safety of general recursion in our call-by-name model.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://arxiv.org/abs/1105.1985&quot;&gt;http://arxiv.org/abs/1105.1985&lt;/a&gt;&lt;/p&gt;
</content>
   
   <category term="semantics"/>
   
   <category term="types"/>
   
   <category term="lambda calculus"/>
   
   <category term="step-indexing"/>
   
 </entry>
 
 <entry>
   <title type="html">OCamlJIT2 vs. OCamlJIT</title>
   <link href="http://benediktmeurer.de/2010/11/30/ocamljit2-vs-ocamljit"/>
   <updated>2010-11-30T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2010/11/30/ocamljit2-vs-ocamljit</id>
   <content type="html">&lt;p&gt;I did some final work on &lt;a href=&quot;/2010/11/16/ocamljit-20&quot;&gt;OCamlJIT2&lt;/a&gt;, and compared the result to OCamlJIT. The performance measures are presented in the following tech report (skip straight to section 4 for the performance results):&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://arxiv.org/abs/1011.6223&quot;&gt;http://arxiv.org/abs/1011.6223&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In short: Performance measured on a P4 &quot;Northwood&quot; (no long mode, plain x86) 2.4GHz. OCamlJIT2 beats OCamlJIT by a factor of 1.1 to 2.0 in every benchmark, and - rather surprising - was even able to beat &lt;code&gt;ocamlopt&lt;/code&gt; in the number crunching benchmark (probably an issue with the x86 backend of &lt;code&gt;ocamlopt&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;As mentioned by Xavier Leroy and others previously, we probably went as far as we could go in the direction of JITting the byte-code virtual machine, while preserving its general stack-based nature and instruction set. Moving even further means translating the byte-code to some intermediate form suitable for use with standard compilation techniques; but as we saw earlier, in an LLVM-based prototype, the compilation overhead increases dramatically and the benefit of JIT compilation vanishes.&lt;/p&gt;

&lt;p&gt;Therefore, as suggested earlier, I&#39;ll try to get my hands on the native top-level now (already contacted Alain for the emitter code). Additionally, the linear scan register allocation will be implemented by a student as part of his diploma thesis.&lt;/p&gt;

&lt;h3&gt;Update&lt;/h3&gt;

&lt;p&gt;See the &lt;a href=&quot;http://caml.inria.fr/pub/ml-archives/caml-list/2010/11/7363093c6ecec4e7fea18ccdfcf3366b.en.html&quot;&gt;discussion&lt;/a&gt; on the &lt;a href=&quot;http://caml.inria.fr/pub/ml-archives/caml-list/index.en.html&quot;&gt;Caml mailing list&lt;/a&gt;.&lt;/p&gt;
</content>
   
   <category term="ocaml"/>
   
   <category term="jit"/>
   
   <category term="research"/>
   
 </entry>
 
 <entry>
   <title type="html">OCamlJIT 2.0</title>
   <link href="http://benediktmeurer.de/2010/11/16/ocamljit-20"/>
   <updated>2010-11-16T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2010/11/16/ocamljit-20</id>
   <content type="html">&lt;p&gt;OCamlJit 2.0 is a new Just-In-Time engine for Objective Caml 3.12.0 on desktop processors
(x86/x86-64). It translates the OCaml byte-code used by the interpreter (&lt;code&gt;ocamlrun&lt;/code&gt; and &lt;code&gt;ocaml&lt;/code&gt;)
to x86/x86-64 native code on-demand and runs the generated native code instead of interpreting
the byte-code. It is designed to run with minimal compilation overhead (translating only what
is being executed, avoiding costly code generation and optimization techniques), while being
100% compatible with the byte-code runtime (including serialization and hashing of closures,
etc.).&lt;/p&gt;

&lt;p&gt;OCamlJit 2.0 was specifically designed for desktop processors and is not really portable to
anything else in its current shape, because the target audience are people using the interactive
top-level and the byte-code interpreter for rapid prototyping/development (which is unlikely to
happen on anything else but x86/x86-64). The implementation currently requires a system that
adheres to the SysV ABI, which includes Linux, BSD, OS X, but excludes Win32/Win64
(patches/ideas are welcome). It was tested on Linux/x86 (Debian), Linux/amd64 (CentOS) and Mac
OS X 10.6 (64bit). The x86 implementation requires SSE2 capable processors (otherwise it falls
back to the byte-code interpreter), so it won&#39;t speedup your OCaml programs running on
486 CPUs. :-)&lt;/p&gt;

&lt;p&gt;OCamlJit 2.0 runs most benchmarks at 2-6 times faster than the byte-code interpreter. The
interactive top-level benefits twice when used with the JIT engine:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;the compiler stages are JIT compiled and&lt;/li&gt;
&lt;li&gt;the generated byte-code is JIT compiled.&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;A tech report describing a slightly earlier prototype and including performance measures of
OCamlJit 2.0 on Mac OS X (64bit) is available at:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://arxiv.org/abs/1011.1783&quot;&gt;http://arxiv.org/abs/1011.1783&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The source code is available from the Git repository (master branch) at:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://gitorious.org/ocamljit2/ocamljit2&quot;&gt;http://gitorious.org/ocamljit2/ocamljit2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://github.com/bmeurer/ocamljit2&quot;&gt;http://github.com/bmeurer/ocamljit2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Installation is similar to installation of Objective Caml, just run&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; ./configure -prefix /path/to/ocamljit2 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;options&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;followed by&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; make world opt
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; make install&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;This will install a fully working Objective Caml 3.12.0 to &lt;code&gt;/path/to/ocamljit2&lt;/code&gt;, where
&lt;code&gt;/path/to/ocamljit2/bin/ocamlrun&lt;/code&gt; and &lt;code&gt;/path/to/ocamljit2/lib/libcamlrun_shared.so&lt;/code&gt; include
the JIT engine in addition to the byte-code interpreter (fallback to the byte-code interpreter
is necessary for debugging with &lt;code&gt;ocamldebug&lt;/code&gt;). The &lt;code&gt;configure&lt;/code&gt; script prints a line indicating
whether the JIT engine is enabled or not (if not, it&#39;ll be just a regular OCaml 3.12
installation).&lt;/p&gt;

&lt;h3&gt;Update&lt;/h3&gt;

&lt;p&gt;See the &lt;a href=&quot;http://caml.inria.fr/pub/ml-archives/caml-list/2010/11/7d46cc65289d9b9def4f7ff4e2e6258a.en.html&quot;&gt;discussion&lt;/a&gt; on the &lt;a href=&quot;http://caml.inria.fr/pub/ml-archives/caml-list/index.en.html&quot;&gt;Caml mailing list&lt;/a&gt;, and the more &lt;a href=&quot;/2010/11/30/ocamljit2-vs-ocamljit&quot;&gt;recent work&lt;/a&gt; on OCamlJIT2.&lt;/p&gt;
</content>
   
   <category term="ocaml"/>
   
   <category term="jit"/>
   
   <category term="research"/>
   
 </entry>
 
 <entry>
   <title type="html">git-hooks - Generic Git hooks</title>
   <link href="http://benediktmeurer.de/2009/11/23/git-hooks"/>
   <updated>2009-11-23T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2009/11/23/git-hooks</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://github.com/bmeurer/git-hooks&quot;&gt;Git Hooks&lt;/a&gt; provides a simple mechanism to manage hooks
for several &lt;a href=&quot;http://git-scm.com&quot;&gt;Git&lt;/a&gt; repositories in a unified and simple way. It allows you
to install hook scripts in a central location and use them for your Git repositories.&lt;/p&gt;

&lt;h2&gt;Installation&lt;/h2&gt;

&lt;p&gt;You need &lt;a href=&quot;http://www.cmake.org&quot;&gt;CMake&lt;/a&gt; and &lt;a href=&quot;http://gcc.gnu.org&quot;&gt;GCC&lt;/a&gt; in order to build and
install git-hooks. You will also need to have &lt;a href=&quot;http://git-scm.com&quot;&gt;Git&lt;/a&gt; and
&lt;a href=&quot;http://www.perl.org&quot;&gt;Perl&lt;/a&gt; installed for the hooks to work properly.  To build git-hooks run&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; cmake /path/to/git-hooks
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; make&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;in a new directory (preferably, tho you may also run it from the source
directory). Then, use&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; make install&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;to install git-hooks. This will install git-hooks to &lt;code&gt;/usr/local&lt;/code&gt;. You can
use ccmake to change the installation prefix. Below, we will assume that you installed
git-hooks to &lt;code&gt;/usr/local&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;Repository setup&lt;/h2&gt;

&lt;p&gt;To setup a repository using git-hooks, just use the repository template that ships with
git-hooks.&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; mkdir myrepo.git
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;myrepo.git
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; git --bare init --template&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/usr/local/share/git-hooks/template ...&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;This will setup the new repository &lt;code&gt;myrepo.git&lt;/code&gt; with git-hooks. Check the
sample config file that will be created for &lt;code&gt;myrepo.git&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;Repository migration&lt;/h2&gt;

&lt;p&gt;To migrate an existing repository to use git-hooks, you should first backup
your existing hook scripts. Then replace the hooks with the ones from
&lt;code&gt;/usr/local/share/git-hooks/template/hooks&lt;/code&gt;. Afterwards, you should migrate
your previous hook scripts to global hook scripts used by git-hooks.&lt;/p&gt;

&lt;h2&gt;Configuration&lt;/h2&gt;

&lt;p&gt;The git-hooks package includes several useful hooks, which can be configured
to your needs using git config settings in your repository (or even global
settings from &lt;code&gt;/etc/gitconfig&lt;/code&gt;). The
&lt;code&gt;/usr/local/share/git-hooks/template/config&lt;/code&gt; file provides a sample
configuration file.&lt;/p&gt;

&lt;p&gt;Please see the hook scripts in &lt;code&gt;/usr/local/share/git-hooks/*.d/&lt;/code&gt; for the
various supported config settings.&lt;/p&gt;
</content>
   
   <category term="git"/>
   
 </entry>
 
 <entry>
   <title type="html">Gitweb and HTTP transport for public repositories</title>
   <link href="http://benediktmeurer.de/2009/11/07/gitweb-and-http-transport-for-public-repositories"/>
   <updated>2009-11-07T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2009/11/07/gitweb-and-http-transport-for-public-repositories</id>
   <content type="html">&lt;p&gt;It took me some time to figure out how to get
&lt;a href=&quot;https://git.wiki.kernel.org/index.php/Gitweb&quot;&gt;gitweb&lt;/a&gt; and (readonly) HTTP
transport working for public Git repositories using the same URL. So here&#39;s my
Apache 2 configuration, it may save you some time. The configuration assumes
that your Git repositories are located under &lt;code&gt;/srv/git&lt;/code&gt; and the
gitweb files are installed in &lt;code&gt;/usr/share/gitweb&lt;/code&gt; with the
configuration file in &lt;code&gt;/etc/gitweb.conf&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-apache&quot; data-lang=&quot;apache&quot;&gt;&lt;span class=&quot;c&quot;&gt;# Dumb transport clone URLs for public repositories&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;AliasMatch&lt;/span&gt; ^/git(/.*\.git)/HEAD$ &lt;span class=&quot;sx&quot;&gt;/srv/git/&lt;/span&gt;$1/HEAD
&lt;span class=&quot;nb&quot;&gt;AliasMatch&lt;/span&gt; ^/git(/.*\.git)/info(/.*)? &lt;span class=&quot;sx&quot;&gt;/srv/git/&lt;/span&gt;$1/info$2
&lt;span class=&quot;nb&quot;&gt;AliasMatch&lt;/span&gt; ^/git(/.*\.git)/objects(/.*)? &lt;span class=&quot;sx&quot;&gt;/srv/git/&lt;/span&gt;$1/objects$2
&lt;span class=&quot;nb&quot;&gt;AliasMatch&lt;/span&gt; ^/git(/.*\.git)/refs(/.*)? &lt;span class=&quot;sx&quot;&gt;/srv/git/&lt;/span&gt;$1/refs$2
&lt;span class=&quot;nt&quot;&gt;&amp;lt;Directory&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;/srv/git/*.git&amp;quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nb&quot;&gt;AllowOverride&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;None&lt;/span&gt;
        &lt;span class=&quot;nb&quot;&gt;Options&lt;/span&gt; Indexes
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;Limit&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;GET POST OPTIONS&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
                &lt;span class=&quot;nb&quot;&gt;Order&lt;/span&gt; allow,deny
                &lt;span class=&quot;nb&quot;&gt;Allow&lt;/span&gt; from &lt;span class=&quot;k&quot;&gt;all&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;/Limit&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;LimitExcept&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;GET POST OPTIONS&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
                &lt;span class=&quot;nb&quot;&gt;Order&lt;/span&gt; deny,allow
                &lt;span class=&quot;nb&quot;&gt;Deny&lt;/span&gt; from &lt;span class=&quot;k&quot;&gt;all&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;/LimitExcept&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/Directory&amp;gt;&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# gitweb user interface&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;Alias&lt;/span&gt; &lt;span class=&quot;sx&quot;&gt;/git&lt;/span&gt; &lt;span class=&quot;sx&quot;&gt;/usr/share/gitweb&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;Directory&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;/usr/share/gitweb&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nb&quot;&gt;SetEnv&lt;/span&gt; GITWEB_CONFIG &lt;span class=&quot;sx&quot;&gt;/etc/gitweb.conf&lt;/span&gt;
        &lt;span class=&quot;nb&quot;&gt;Options&lt;/span&gt; +ExecCGI
        &lt;span class=&quot;nb&quot;&gt;AddHandler&lt;/span&gt; cgi-script .cgi
        &lt;span class=&quot;nb&quot;&gt;DirectoryIndex&lt;/span&gt; gitweb.cgi

        &lt;span class=&quot;nb&quot;&gt;RewriteEngine&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;on&lt;/span&gt;
        &lt;span class=&quot;nb&quot;&gt;RewriteCond&lt;/span&gt; %{REQUEST_FILENAME} !-f
        &lt;span class=&quot;nb&quot;&gt;RewriteCond&lt;/span&gt; %{REQUEST_FILENAME} !-d
        &lt;span class=&quot;nb&quot;&gt;RewriteRule&lt;/span&gt; ^.* &lt;span class=&quot;sx&quot;&gt;/git/gitweb.cgi/&lt;/span&gt;$0 [L,PT]
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/Directory&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



</content>
   
   <category term="git"/>
   
   <category term="gitweb"/>
   
   <category term="http"/>
   
   <category term="public"/>
   
   <category term="apache"/>
   
 </entry>
 
 <entry>
   <title type="html">Thunar 0.9.0, exo 0.3.4 and thunar-volman 0.2.0 releases</title>
   <link href="http://benediktmeurer.de/2007/02/12/thunar-090-exo-034-and-thunar-volman-020-releases"/>
   <updated>2007-02-12T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2007/02/12/thunar-090-exo-034-and-thunar-volman-020-releases</id>
   <content type="html">&lt;p&gt;I just released new versions of &lt;a href=&quot;http://thunar.xfce.org/&quot;&gt;Thunar&lt;/a&gt;, exo and &lt;a href=&quot;http://foo-projects.org/~benny/projects/thunar-volman/index.html&quot;&gt;thunar-volman&lt;/a&gt; with several bugfixes and new translations. They are part of Xfce 4.4.2, which will be released tomorrow.&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
   <category term="exo"/>
   
 </entry>
 
 <entry>
   <title type="html">Seminar Paper on Model Checking</title>
   <link href="http://benediktmeurer.de/2007/01/22/seminar-paper-on-model-checking"/>
   <updated>2007-01-22T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2007/01/22/seminar-paper-on-model-checking</id>
   <content type="html">&lt;p&gt;Just uploaded my seminar paper on &lt;a href=&quot;/files/modelchecking2007.pdf&quot;&gt;PLTL Model
Checking&lt;/a&gt; toghether with the
&lt;a href=&quot;/files/modelchecking2007-slides.pdf&quot;&gt;slides&lt;/a&gt;. The paper and the slides are
in german, and cover the basics of &lt;a href=&quot;http://en.wikipedia.org/wiki/Model_checking&quot;&gt;Model
Checking&lt;/a&gt; using Propositional
&lt;a href=&quot;http://en.wikipedia.org/wiki/Linear_temporal_logic&quot;&gt;Linear Temporal Logic&lt;/a&gt;
(PLTL).&lt;/p&gt;
</content>
   
   <category term="model checking"/>
   
   <category term="seminar"/>
   
 </entry>
 
 <entry>
   <title type="html">Thunar 0.8.0 and libexo 0.3.2 releases</title>
   <link href="http://benediktmeurer.de/2007/01/21/thunar-080-and-libexo-032-releases"/>
   <updated>2007-01-21T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2007/01/21/thunar-080-and-libexo-032-releases</id>
   <content type="html">&lt;p&gt;I just released Thunar 0.8.0 and exo 0.3.2 as part of the long awaited &lt;a href=&quot;http://www.xfce.org/&quot;&gt;Xfce 4.4.0&lt;/a&gt;, which will be released in a few hours. The separate tarballs are provided for users of Xfce 4.2.x refusing to upgrade to Xfce 4.4.x, and users of other desktop environments. This is the final release of Thunar, but since not all items from the roadmap were completed, it is not yet the 1.0.0 version.&lt;/p&gt;

&lt;p&gt;You will need at least libxfce4util 4.2.2, GTK+ 2.6.4, shared-mime-info 0.15 and desktop-file-utils 0.10 to build and run Thunar. In addition Gamin or FAM are highly recommended to enable file system monitoring in Thunar. For HAL support on Linux, the libhal-storage-devel package is required (0.5.0 or above). Furthermore if you want to use the trash panel applet, you will need the Xfce Panel 4.4BETA1 or above and D-Bus 0.34 or above. The &lt;code&gt;README&lt;/code&gt; file contains a complete list of dependencies and optional packages.&lt;/p&gt;

&lt;p&gt;The official announcement is available at: &lt;a href=&quot;http://thunar.xfce.org/news.html#2007-01-21&quot;&gt;http://thunar.xfce.org/news.html#2007-01-21&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Several screenshots are available at: &lt;a href=&quot;http://thunar.xfce.org/screenshots.html&quot;&gt;http://thunar.xfce.org/screenshots.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The source tarballs and the graphical installers can be downloaded from: &lt;a href=&quot;http://thunar.xfce.org/download.html#0.8.0&quot;&gt;http://thunar.xfce.org/download.html#0.8.0&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Installation instructions and documentation are available at: &lt;a href=&quot;http://thunar.xfce.org/pwiki/&quot;&gt;http://thunar.xfce.org/pwiki/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Please report bugs to the Xfce Bug Tracker (product &lt;em&gt;Thunar&lt;/em&gt;) at: &lt;a href=&quot;http://bugzilla.xfce.org/&quot;&gt;http://bugzilla.xfce.org/&lt;/a&gt;&lt;/p&gt;&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
   <category term="exo"/>
   
 </entry>
 
 <entry>
   <title type="html">A visual tour of Xfce 4.4.0</title>
   <link href="http://benediktmeurer.de/2007/01/21/a-visual-tour-of-xfce-440"/>
   <updated>2007-01-21T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2007/01/21/a-visual-tour-of-xfce-440</id>
   <content type="html">&lt;p&gt;As of today, the long awaited version 4.4.0 of the Xfce Desktop Environment is finally
available. I will try to highlight some of the new features which have been added since
the last stable release.&lt;/p&gt;

&lt;h2&gt;Desktop Icons&lt;/h2&gt;

&lt;p&gt;One of the most often requested features during the 4.0 and 4.2 was support for icons
on the desktop. Now, with Xfce 4.4.0, this feature was finally added to the desktop
manager &lt;b&gt;Xfdesktop&lt;/b&gt;.&lt;/p&gt;

&lt;center&gt;&lt;img src=&quot;/images/2007/xfce44-desktop-icons.png&quot; alt=&quot;Desktop Icons&quot; /&gt;&lt;/center&gt;


&lt;p&gt;The desktop manager utilizes &lt;b&gt;Thunar&lt;/b&gt;&#39;s libraries to handle application launchers
and regular files/folders on the desktop. The desktop manager is also able to display
icons for minimized windows on the desktop, which is quite a popular feature from the CDE
world. Of course, you can disable the desktop icons altogether if you prefer a clean
desktop.&lt;/p&gt;

&lt;center&gt;&lt;img src=&quot;/images/2007/xfce44-desktop-settings.png&quot; alt=&quot;Desktop Settings&quot; /&gt;&lt;/center&gt;


&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Xfdesktop&lt;/b&gt; also continues to provide access to the applications menu, as it did in
the previous Xfce releases.&lt;/p&gt;

&lt;h2&gt;File Manager&lt;/h2&gt;

&lt;p&gt;The desktop icon support goes hand in hand with the new file manager &lt;a
href=&quot;http://thunar.xfce.org/&quot;&gt;Thunar&lt;/a&gt; which replaces the previous file manager &lt;b&gt;Xffm&lt;/b&gt;.&lt;/p&gt;

&lt;center&gt;&lt;img src=&quot;/images/2007/xfce44-thunar.png&quot; alt=&quot;Thunar File Manager&quot; /&gt;&lt;/center&gt;


&lt;p&gt;&lt;b&gt;Thunar&lt;/b&gt; was written from scratch to provide an easy to use, but still very lightweight
file manager for Xfce. Its user interface was designed to look similar to the file chooser
which was introduced with GTK+ 2.4, and other file managers such as &lt;b&gt;Nautilus&lt;/b&gt; and
&lt;b&gt;pcmanfm&lt;/b&gt; already picked up that idea as well.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Thunar&lt;/b&gt; supports all the file management functionality which users will expect, and also
several advanced features. For example, a so-called &lt;i&gt;Bulk Renamer&lt;/i&gt; is included which allows
users to rename multiple files at once using a certain criterion.&lt;/p&gt;

&lt;center&gt;&lt;img src=&quot;/images/2007/xfce44-thunar-bulk-rename.png&quot; alt=&quot;Thunar Bulk Rename&quot; /&gt;&lt;/center&gt;


&lt;h2&gt;Removable Drives and Media&lt;/h2&gt;

&lt;p&gt;Xfce 4.4.0 provides easy access to data on removable drives and media. Just insert the media
into the drive or plug the new drive in to the computer and an icon representing the removable
volume will appear on the desktop and in &lt;b&gt;Thunar&lt;/b&gt;&#39;s side pane.&lt;/p&gt;

&lt;center&gt;&lt;img src=&quot;/images/2007/xfce44-removable-volumes.png&quot; alt=&quot;Removable Volumes&quot; /&gt;&lt;/center&gt;


&lt;p&gt;Click on the icon to automatically mount the volume. Right-click the icon to unmount the drive
or eject the media from the drive. Note however that this feature requires &lt;a
href=&quot;http://freedesktop.org/wiki/Software_2fhal&quot;&gt;HAL&lt;/a&gt; and is therefore only available for
Linux 2.6.x and FreeBSD 6.x and above at the time of this writing (there is limited removable
media support for FreeBSD 4.x and 5.x which does not require HAL).&lt;/p&gt;

&lt;h2&gt;Text Editor&lt;/h2&gt;

&lt;p&gt;The new text editor &lt;b&gt;MousePad&lt;/b&gt; is included with this release. &lt;b&gt;MousePad&lt;/b&gt; provides all
the basic editor functionality, nothing more, nothing less.&lt;/p&gt;

&lt;center&gt;&lt;img src=&quot;/images/2007/xfce44-mousepad.png&quot; alt=&quot;MousePad&quot; /&gt;&lt;/center&gt;


&lt;p&gt;You can think of &lt;b&gt;MousePad&lt;/b&gt; as the equivalent to &lt;b&gt;NotePad&lt;/b&gt; on Windows. It starts up
very fast, usually in less than one second, even on older systems.&lt;/p&gt;

&lt;h2&gt;Window Manager&lt;/h2&gt;

&lt;p&gt;&lt;b&gt;Xfwm4&lt;/b&gt; continues to be the window manager of the hearts.&lt;/p&gt;

&lt;center&gt;&lt;img src=&quot;/images/2007/xfce44-xfwm4-argb32.png&quot; alt=&quot;Xfwm4 ARGB32&quot; /&gt;&lt;/center&gt;


&lt;p&gt;This release features an enhanced compositor, supporting transparent ARGB windows, shadows,
window frame transparency and much more.&lt;/p&gt;

&lt;center&gt;&lt;img src=&quot;/images/2007/xfce44-xfwm4-switcher.png&quot; alt=&quot;Xfwm4 Switcher&quot; /&gt;&lt;/center&gt;


&lt;p&gt;&lt;b&gt;Xfwm4&lt;/b&gt; also includes a brand new application switcher, as shown in the screenshot above,
which displays all windows from the current workspace with icons and window titles.&lt;/p&gt;

&lt;center&gt;&lt;img src=&quot;/images/2007/xfce44-xfwm4-themes.png&quot; alt=&quot;Xfwm4 Themes&quot; /&gt;&lt;/center&gt;


&lt;p&gt;Further on support for multiple image formats for window decoration themes was added, including
&lt;code&gt;PNG&lt;/code&gt;, &lt;code&gt;GIF&lt;/code&gt; and &lt;code&gt;SVG&lt;/code&gt; images.&lt;/p&gt;

&lt;center&gt;&lt;img src=&quot;/images/2007/xfce44-xfwm4-tweaks.png&quot; alt=&quot;Xfwm4 Tweaks&quot; /&gt;&lt;/center&gt;


&lt;p&gt;Advanced controls for the window manager were also added, allowing thorough tweaking of window
behavior.&lt;/p&gt;

&lt;h2&gt;Panel&lt;/h2&gt;

&lt;p&gt;The &lt;b&gt;Xfce4-panel&lt;/b&gt; was completely rewritten for the Xfce 4.4 release. Multiple panels are
supported &lt;i&gt;out of the box&lt;/i&gt; now and can easily be configured using the new &lt;b&gt;Panel
Manager&lt;/b&gt; shown in the screenshot below.&lt;/p&gt;

&lt;center&gt;&lt;img src=&quot;/images/2007/xfce44-panel-manager.png&quot; alt=&quot;Panel Manager&quot; /&gt;&lt;/center&gt;


&lt;p&gt;One of the major problems in previous Xfce releases was that every plugin had to be run
in the same process as the panel, and hence every plugin was able to crash the whole
panel. To address this issue, support for external plugins was added to the panel.&lt;/p&gt;

&lt;center&gt;&lt;img src=&quot;/images/2007/xfce44-panel-additem.png&quot; alt=&quot;Panel Add Item Dialog&quot; /&gt;&lt;/center&gt;


&lt;p&gt;Developers of panel plugins can now decide whether the plugin should run as external
process or as part of the panel process, depending on the stability of the plugin.&lt;/p&gt;

&lt;center&gt;&lt;img src=&quot;/images/2007/xfce44-panel-iconbox.png&quot; alt=&quot;Panel Icon Box Plugin&quot; /&gt;&lt;/center&gt;


&lt;p&gt;Since there is now support for multiple panels, the separate &lt;b&gt;Xftaskbar4&lt;/b&gt; and
&lt;b&gt;Xfce4-iconbox&lt;/b&gt; utilities are no longer required. Instead, both the taskbar and
the iconbox are available as panel plugins now.&lt;/p&gt;

&lt;p&gt;Most of the additional panel plugins, available via the &lt;a href=&quot;http://goodies.xfce.org/&quot;&gt;Xfce
Goodies Project&lt;/a&gt;, have been updated for the new panel, and several new plugins were added.
For example, the brand new &lt;b&gt;xfce4-xfapplet-plugin&lt;/b&gt; allows users to add GNOME panel applets
to the Xfce panel.&lt;/p&gt;

&lt;h2&gt;Time Management&lt;/h2&gt;

&lt;p&gt;The new time management application &lt;b&gt;Orage&lt;/b&gt; replaces the &lt;b&gt;Xfcalendar&lt;/b&gt;, which was
introduced with Xfce 4.2.0. &lt;b&gt;Orage&lt;/b&gt; provides several features to efficiently manage
your time.&lt;/p&gt;

&lt;center&gt;&lt;img src=&quot;/images/2007/xfce44-orage.png&quot; alt=&quot;Orage&quot; /&gt;&lt;/center&gt;


&lt;p&gt;While &lt;b&gt;Orage&lt;/b&gt; is very lightweight and easy to use, it supports all the important features
found in larger calendar applications like &lt;b&gt;Outlook&lt;/b&gt; or &lt;b&gt;Evolution&lt;/b&gt;. While
&lt;b&gt;Xfcalendar&lt;/b&gt; used the custom &lt;code&gt;dbh&lt;/code&gt; format in the past to store your settings,
&lt;b&gt;Orage&lt;/b&gt; is based on &lt;code&gt;ical&lt;/code&gt; and therefore compatible with other calendar
applications.&lt;/p&gt;

&lt;h2&gt;Terminal Emulator&lt;/h2&gt;

&lt;p&gt;While &lt;b&gt;Terminal&lt;/b&gt; was already available during the 4.2 days, it was not mature enough at
that time to be part of the core. With this major release, it was moved into the core desktop.&lt;/p&gt;

&lt;center&gt;&lt;img src=&quot;/images/2007/xfce44-terminal.png&quot; alt=&quot;Terminal&quot; /&gt;&lt;/center&gt;


&lt;p&gt;Besides the basic features which you might expect from a terminal emulator, it includes some nice
additional features, like multiple tabs per window, customizable toolbars and the ability
to configure nearly every aspect of the application via &lt;i&gt;hidden options&lt;/i&gt;. As can be
seen in the screenshot above, this release also supports real transparency using &lt;b&gt;Xfwm4&lt;/b&gt;&#39;s
integrated composition manager.&lt;/p&gt;

&lt;h2&gt;Printing&lt;/h2&gt;

&lt;p&gt;&lt;b&gt;Xfprint&lt;/b&gt;, the Xfce printing management application, saw several small improvements with
this release. First, the &lt;code&gt;a2ps&lt;/code&gt; converter is not mandatory anymore, whilst still
recommended. Support for &lt;code&gt;CUPS&lt;/code&gt; 1.2 was added and &lt;b&gt;Xfprint&lt;/b&gt; is now able to
display the printer state with the &lt;code&gt;CUPS&lt;/code&gt;-backend.&lt;/p&gt;

&lt;center&gt;&lt;img src=&quot;/images/2007/xfce44-xfprint.png&quot; alt=&quot;Xfce Printing&quot; /&gt;&lt;/center&gt;


&lt;p&gt;&lt;b&gt;Xfprint&lt;/b&gt; also integrates with &lt;b&gt;MousePad&lt;/b&gt; to provide generic printing support for
different kinds of text documents using the &lt;code&gt;a2ps&lt;/code&gt; converter.&lt;/p&gt;

&lt;center&gt;&lt;img src=&quot;/images/2007/xfce44-xfprint-dialog.png&quot; alt=&quot;Xfce Print Dialog&quot; /&gt;&lt;/center&gt;


&lt;p&gt;As you can see the print dialog still looks relatively similar to that of Xfce 4.2, but the
internal workings of the printing support were improved, especially the &lt;code&gt;CUPS&lt;/code&gt;
support. Besides that, the printing management functionality was moved to a library, so other
applications can use the API to access the printer configuration.&lt;/p&gt;

&lt;h2&gt;Autostart&lt;/h2&gt;

&lt;p&gt;Xfce 4.4.0 implements the new &lt;a
href=&quot;http://freedesktop.org/wiki/Standards_2fautostart_2dspec&quot;&gt;Autostart Specification&lt;/a&gt; -
actually Xfce was the first desktop to implement said feature, but the others were faster to
release. ;-)&lt;/p&gt;

&lt;center&gt;&lt;img src=&quot;/images/2007/xfce44-autostart.png&quot; alt=&quot;Xfce Autostart Editor&quot; /&gt;&lt;/center&gt;


&lt;p&gt;The specification consists of two parts, the &lt;i&gt;Autostart of Applications During Startup&lt;/i&gt;,
which is implemented in &lt;b&gt;xfce4-session&lt;/b&gt; and the &lt;i&gt;Autostart Of Applications After
Mount&lt;/i&gt; which is implemented in &lt;a
href=&quot;http://foo-projects.org/~benny/projects/thunar-volman/index.html&quot;&gt;thunar-volman&lt;/a&gt;.
This release also includes the &lt;b&gt;xfce4-autostart-editor&lt;/b&gt;, shown in the screenshot above,
which allows users to easily add, remove or disable autostarted applications.&lt;/p&gt;

&lt;h2&gt;Settings&lt;/h2&gt;

&lt;p&gt;This release introduces new options to customize the desktop to your needs. Some examples of
new settings dialogs were already shown in the sections above.&lt;/p&gt;

&lt;center&gt;&lt;img src=&quot;/images/2007/xfce44-preferences-applications.png&quot; alt=&quot;Preferred Applications&quot; /&gt;&lt;/center&gt;


&lt;p&gt;The preferred applications framework, which was previously only available in &lt;b&gt;Terminal&lt;/b&gt;,
was imported into Xfce, so users no longer need to edit shell profiles to specify which browser
and terminal emulator should be used by Xfce applications. The goal was to make it as easy as
possible to change an application for a certain category (GNOME users may have already noticed
that GNOME adopted this approach, because it is so simple).&lt;/p&gt;

&lt;center&gt;&lt;img src=&quot;/images/2007/xfce44-preferences-keyboard.png&quot; alt=&quot;Keyboard Shortcuts&quot; /&gt;&lt;/center&gt;


&lt;p&gt;And then there was the problem with the keyboard shortcuts in Xfce 4.2... Xfce 4.2 limited
the number of freely available keyboard shortcuts, while people wanted to assign any number
of keyboard shortcuts. With Xfce 4.4 this limitation is history and the application shortcuts
are now separated from the window manager shortcuts.&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
   <category term="exo"/>
   
   <category term="terminal"/>
   
 </entry>
 
 <entry>
   <title type="html">thunar-volman 0.1.0</title>
   <link href="http://benediktmeurer.de/2007/01/15/thunar-volman-010"/>
   <updated>2007-01-15T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2007/01/15/thunar-volman-010</id>
   <content type="html">&lt;p&gt;I just released the first version of the Thunar Volume Manager. It adds automatic management of removable drives and media to Thunar, without adding another daemon to your desktop sessions. It requires Thunar 0.5.1svn or above, HAL 0.5.0 or above and D-BUS 0.32 or above.&lt;/p&gt;

&lt;p&gt;Website: &lt;a href=&quot;http://foo-projects.org/~benny/projects/thunar-volman/index.html&quot;&gt;http://foo-projects.org/~benny/projects/thunar-volman/index.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Documentation: &lt;a href=&quot;http://thunar.xfce.org/documentation/C/using-removable-media.html&quot;&gt;http://thunar.xfce.org/documentation/C/using-removable-media.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Release notes: &lt;a href=&quot;http://developer.berlios.de/project/shownotes.php?release_id=12027&quot;&gt;http://developer.berlios.de/project/shownotes.php?release_id=12027&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Download: &lt;a href=&quot;http://developer.berlios.de/project/showfiles.php?group_id=910&amp;release_id=12027&quot;&gt;http://developer.berlios.de/project/showfiles.php?group_id=910&amp;amp;release_id=12027&lt;/a&gt;&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
 </entry>
 
 <entry>
   <title type="html">Just another Xfce 4.4 review</title>
   <link href="http://benediktmeurer.de/2006/11/15/just-another-xfce-44-review"/>
   <updated>2006-11-15T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2006/11/15/just-another-xfce-44-review</id>
   <content type="html">&lt;p&gt;Another interesting &lt;a href=&quot;http://turkey.fvdh.net/~hanumizzle/xfce4-review/&quot;&gt;review&lt;/a&gt; of Xfce 4.4.&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
 </entry>
 
 <entry>
   <title type="html">Xfce 4.4 release candidate 2</title>
   <link href="http://benediktmeurer.de/2006/11/06/xfce-44-release-candiate-2"/>
   <updated>2006-11-06T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2006/11/06/xfce-44-release-candiate-2</id>
   <content type="html">&lt;p&gt;Hopefully the last &lt;a href=&quot;http://foo-projects.org/pipermail/xfce4-dev/2006-November/021666.html&quot;&gt;release candidate for 4.4.0&lt;/a&gt;...&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
 </entry>
 
 <entry>
   <title type="html">Thunar 0.5.0 and libexo 0.3.1.12 rc2 releases</title>
   <link href="http://benediktmeurer.de/2006/11/05/thunar-050-and-libexo-03112-rc2-releases"/>
   <updated>2006-11-05T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2006/11/05/thunar-050-and-libexo-03112-rc2-releases</id>
   <content type="html">&lt;p&gt;I just released Thunar-0.5.0rc2 and libexo-0.3.1.12rc2 as part of Xfce 4.4RC2, which will be released in a few hours. The separate tarballs are provided for users of Xfce 4.2.x that don&#39;t want to upgrade yet, and users of other desktop environments. It is planned to be the last release candidate before the final release, so please help with testing so we can locate and elimate the leftover bugs for the final release.&lt;/p&gt;

&lt;p&gt;You will need atleast libxfce4util 4.2.2, GTK+ 2.6.4, shared-mime-info 0.15 and desktop-file-utils 0.10 to build and run Thunar. In addition Gamin or FAM are highly recommended to enable file system monitoring in Thunar. For HAL support on Linux, the libhal-storage-devel package is required (0.5.0 or above). Furthermore if you want to use the trash panel applet, you will need the Xfce Panel 4.4BETA1 or above and D-Bus 0.34 or above. The &lt;code&gt;README&lt;/code&gt; file contains a complete list of dependencies and optional packages.&lt;/p&gt;

&lt;p&gt;The official announcement is available at: &lt;a href=&quot;http://thunar.xfce.org/news.html#2006-11-05&quot;&gt;http://thunar.xfce.org/news.html#2006-11-05&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Several screenshots are available at: &lt;a href=&quot;http://thunar.xfce.org/screenshots.html&quot;&gt;http://thunar.xfce.org/screenshots.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The source tarballs and the graphical installer can be downloaded from: &lt;a href=&quot;http://thunar.xfce.org/download.html#0.5.0&quot;&gt;http://thunar.xfce.org/download.html#0.5.0&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Installation instructions and documentation are available at: &lt;a href=&quot;http://thunar.xfce.org/pwiki/&quot;&gt;http://thunar.xfce.org/pwiki/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Please report bugs to the Xfce Bug Tracker (product &lt;em&gt;Thunar&lt;/em&gt;) at: &lt;a href=&quot;http://bugzilla.xfce.org/&quot;&gt;http://bugzilla.xfce.org/&lt;/a&gt;&lt;/p&gt;&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
   <category term="exo"/>
   
 </entry>
 
 <entry>
   <title type="html">thunar-archive-plugin 0.2.2</title>
   <link href="http://benediktmeurer.de/2006/11/04/thunar-archive-plugin-022"/>
   <updated>2006-11-04T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2006/11/04/thunar-archive-plugin-022</id>
   <content type="html">&lt;p&gt;This is a minor release, which adds support for the new Drag&#39;n&#39;Drop menu in Thunar 0.5.0 and tangoified icons, as well as several new and updated translations.&lt;/p&gt;

&lt;p&gt;Download: &lt;a href=&quot;http://developer.berlios.de/project/showfiles.php?group_id=910&amp;release_id=11557&quot;&gt;http://developer.berlios.de/project/showfiles.php?group_id=910&amp;amp;release_id=11557&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Release notes: &lt;a href=&quot;http://developer.berlios.de/project/shownotes.php?release_id=11557&quot;&gt;http://developer.berlios.de/project/shownotes.php?release_id=11557&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Website (with screenshots): &lt;a href=&quot;http://foo-projects.org/~benny/projects/thunar-archive-plugin/index.html&quot;&gt;http://foo-projects.org/~benny/projects/thunar-archive-plugin/index.html&lt;/a&gt;&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
 </entry>
 
 <entry>
   <title type="html">Xfld 0.3 release</title>
   <link href="http://benediktmeurer.de/2006/11/01/xfld-03-release"/>
   <updated>2006-11-01T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2006/11/01/xfld-03-release</id>
   <content type="html">&lt;p&gt;Unfortunately I have the flu and so I&#39;m somewhat late with posting old news here... Anyway, &lt;a href=&quot;http://www.xfld.org/&quot;&gt;Xfld 0.3&lt;/a&gt; is finally available for download. This time it&#39;s based on Xubuntu. And as usual it is the perfect LiveCD for nearly every use case. ;-)&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="oscillation"/>
   
 </entry>
 
 <entry>
   <title type="html">Xfce 4.4 release candidate 1</title>
   <link href="http://benediktmeurer.de/2006/09/03/xfce-44-release-candidate-1"/>
   <updated>2006-09-03T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2006/09/03/xfce-44-release-candidate-1</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://foo-projects.org/pipermail/xfce-announce/2006-September/000033.html&quot;&gt;Another step&lt;/a&gt; forward to 4.4.0. Get it while it&#39;s hot!&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
 </entry>
 
 <entry>
   <title type="html">Thunar 0.4.0 and libexo 0.3.1.10 rc1 releases</title>
   <link href="http://benediktmeurer.de/2006/09/03/thunar-040-and-libexo-03110-rc1-releases"/>
   <updated>2006-09-03T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2006/09/03/thunar-040-and-libexo-03110-rc1-releases</id>
   <content type="html">&lt;p&gt;I just released Thunar-0.4.0rc1 and libexo-0.3.1.10rc1 as part of &lt;a href=&quot;http://www.xfce.org/&quot;&gt;Xfce&lt;/a&gt; 4.4RC1. The separate tarballs are provided for users of Xfce 4.2.x that don&#39;t want to upgrade yet, and users of other desktop environments. As suggested by the name it is not yet a final release, but is considered to be somewhat stable.&lt;/p&gt;

&lt;p&gt;You will need atleast libxfce4util 4.2.2, GTK+ 2.6.4, shared-mime-info 0.15 and desktop-file-utils 0.10 to build and run Thunar. In addition Gamin or FAM are highly recommended to enable file system monitoring in Thunar. For HAL support on Linux, the libhal-storage-devel package is required (0.5.0 or above). Furthermore if you want to use the trash panel applet, you will need the Xfce Panel 4.4BETA1 or above and D-Bus 0.34 or above. The &lt;code&gt;README&lt;/code&gt; file contains a complete list of dependencies and optional packages.&lt;/p&gt;

&lt;p&gt;The official announcement is available at: &lt;a href=&quot;http://thunar.xfce.org/news.html#2006-09-03&quot;&gt;http://thunar.xfce.org/news.html#2006-09-03&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Additional (updated) screenshots are available at: &lt;a href=&quot;http://thunar.xfce.org/screenshots.html&quot;&gt;http://thunar.xfce.org/screenshots.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The source tarballs and the graphical installer can be downloaded from: &lt;a href=&quot;http://thunar.xfce.org/download.html#0.4.0&quot;&gt;http://thunar.xfce.org/download.html#0.4.0&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Installation instructions and documentation are available at: &lt;a href=&quot;http://thunar.xfce.org/pwiki/&quot;&gt;http://thunar.xfce.org/pwiki/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Please report bugs to the Xfce Bug Tracker (product &lt;em&gt;Thunar&lt;/em&gt;) at: &lt;a href=&quot;http://bugzilla.xfce.org/&quot;&gt;http://bugzilla.xfce.org/&lt;/a&gt;&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
   <category term="exo"/>
   
 </entry>
 
 <entry>
   <title type="html">New features in Thunar 0.4.0rc1</title>
   <link href="http://benediktmeurer.de/2006/08/09/new-features-in-thunar-040rc1"/>
   <updated>2006-08-09T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2006/08/09/new-features-in-thunar-040rc1</id>
   <content type="html">&lt;p&gt;About a month ago &lt;a href=&quot;http://thunar.xfce.org/news.html#2006-07-09&quot;&gt;Thunar 0.3.2beta2&lt;/a&gt;
was released as part of &lt;a href=&quot;http://www.xfce.org/&quot;&gt;Xfce&lt;/a&gt;. Much has happened since that
time, and we&#39;re nearly ready for the first release candidate of Xfce 4.4.0 now, which should
be available in two or three weeks. So, it&#39;s time to sit down and check what we have in the
pipe for Thunar 0.4.0rc1.&lt;/p&gt;

&lt;p&gt;Below is the list of features - focussing on the three most visible changes (to users) - that
are already available in the development version and will definitely be part of the first
release candidate. This list will hopefully be extended with some additional features if time
permits, but most probably not in time for 0.4.0rc1. The most interesting pending feature here
is network support for Thunar, which will include atleast browsing Samba shares and connecting
Samba shares (and probably other network file services as well) via smbfs or FUSE.&lt;/p&gt;

&lt;h2&gt;Trash&lt;/h2&gt;

&lt;p&gt;Probably the most notable change when starting Thunar after upgrading will be the addition (or
better &lt;i&gt;re-addition&lt;/i&gt;) of the trash support, which implements the &lt;a
href=&quot;http://freedesktop.org/wiki/Standards_2ftrash_2dspec&quot;&gt;Desktop Trash Can Specification&lt;/a&gt;
(but is currently limited to the home trash).&lt;/p&gt;

&lt;center&gt;&lt;img alt&quot;Trash Support&quot; src=&quot;/images/2006/preview-0.4.0rc1/trash.png&quot; /&gt;&lt;/center&gt;


&lt;p&gt;So when you delete files now, they will not be lost forever, but instead will be moved to your
trash can, and can be recovered easily by right-clicking on the file or folder and selecting
&lt;b&gt;&lt;u&gt;R&lt;/u&gt;estore&lt;/b&gt; from the context menu.  If the location from where the file or folder was
moved to the trash is no longer present you&#39;ll be ask whether to recreate the required folders
in order to be able to restore the trashed resource.&lt;/p&gt;

&lt;p&gt;If you want to permanently delete a file, you can either move it to the trash and then delete
the file in the trash, or hold down the &lt;b&gt;Shift&lt;/b&gt; key while pressing &lt;b&gt;Del&lt;/b&gt; or selecting
&lt;b&gt;&lt;u&gt;D&lt;/u&gt;elete&lt;/b&gt; from the menu. You&#39;ll still need to confirm the permanent removal of files,
so you don&#39;t accidently remove an important file without any notice.&lt;/p&gt;

&lt;center&gt;&lt;img alt=&quot;Trash Panel Applet&quot; src=&quot;/images/2006/preview-0.4.0rc1/trash-panel-applet.png&quot; /&gt;&lt;/center&gt;


&lt;p&gt;You can also move files or folders to the trash by dropping them onto the trash can in the
shortcuts or tree pane, or by dropping them onto the trash panel applet, shown in the screenshot
above. The panel applet displays the current status of the trash can and allows you to empty the
trash can from the context menu. You will need to build Thunar with &lt;a
href=&quot;http://freedesktop.org/wiki/Software_2fdbus&quot;&gt;D-Bus&lt;/a&gt; support in order to be able to use
the panel applet, because the applet does not monitor and manage the trash itself (to avoid any
additional overhead), but instead uses the new &lt;code&gt;org.xfce.Trash&lt;/code&gt; interface to talk to
Thunar and lets Thunar do all the hard work.&lt;/p&gt;

&lt;p&gt;It is expected that &lt;code&gt;xfdesktop&lt;/code&gt; will also get a trash can for 4.4.0rc1, using the
&lt;code&gt;org.xfce.Trash&lt;/code&gt; interface as well. But that is still work in progress.&lt;/p&gt;

&lt;h2&gt;Rubberband Selection&lt;/h2&gt;

&lt;p&gt;With the addition of rubberband selection to &lt;code&gt;GtkTreeView&lt;/code&gt; in GTK+ 2.10 it is finally
possible to use rubberband selection in Thunar&#39;s detailed view.&lt;/p&gt;

&lt;center&gt;&lt;img alt=&quot;Rubberband Selection&quot; src=&quot;/images/2006/preview-0.4.0rc1/rubberbanding.png&quot; /&gt;&lt;/center&gt;


&lt;p&gt;Unfortunately that didn&#39;t work as smooth as it should, so there was some additional work put
into &lt;code&gt;ExoTreeView&lt;/code&gt; to be able to really use the rubberband selection with GTKs own
Drag&#39;n&#39;Drop mechanism! With the work-arounds in place you can now start a rubberband selection
in the detailed list view by pressing the left mouse button on a not selected row (it still not
possible to start the rubberband selection in an empty area of the detailed list view and there&#39;s
unfortunately no way to work-around this &lt;code&gt;GtkTreeView&lt;/code&gt; bug, but hopefully this will
be fixed in one of the next GTK+ releases).&lt;/p&gt;

&lt;h2&gt;Creating Launchers the Easy Way&lt;/h2&gt;

&lt;p&gt;With exo 0.3.1.10rc1 it will be even easier to create launchers for applications on your system,
that are registered via the &lt;a
href=&quot;http://freedesktop.org/wiki/Standards_2fmenu_2dspec&quot;&gt;freedesktop.org menu system&lt;/a&gt;. No
need to look up the name of the binary for the application and search through large icon
directories to locate the appropriate icon for the application anymore. Just start typing the
name of the application or the applications purpose in the &lt;b&gt;&lt;u&gt;N&lt;/u&gt;ame&lt;/b&gt; box and a list of
possible applications with that name or purpose will appear.&lt;/p&gt;

&lt;center&gt;&lt;img alt=&quot;Creating Launchers&quot; src=&quot;/images/2006/preview-0.4.0rc1/easy-launcher-creation.png&quot; /&gt;&lt;/center&gt;


&lt;p&gt;Select the application you are looking for from the list of matching applications and all the
required values are filled with the applications settings.&lt;/p&gt;

&lt;h2&gt;Bugfixes and Improvements&lt;/h2&gt;

&lt;p&gt;Of course this release will also include a bunch of bugfixes and improvements. For example when
selecting an image file in Thunar, the statustext will also include the dimensions of that image,
so you don&#39;t need to fire up the properties dialog to find out the width and height of the image.&lt;/p&gt;

&lt;p&gt;The dependency of the &lt;code&gt;thunar-vfs&lt;/code&gt; library on GConf is gone and startup time was
thereby improved (actually not the startup that much, but the time when the first thumbnail is
loaded). The GNOME thumbnail generators (i.e. Evince for PDF, Totem for video, etc.) are now
collected by an external utility and stored into an &lt;code&gt;mmap()&lt;/code&gt;able cache file.&lt;/p&gt;

&lt;p&gt;File dates - the time of the last access and modification - are now displayed in a more human
readable format. The overall memory usage was again decreased by using the new slice allocator
in GLib 2.10 and above where appropriate.&lt;/p&gt;

&lt;h2&gt;How to contribute?&lt;/h2&gt;

&lt;p&gt;Thunar - and other Xfce components as well - is still looking for contributions, may it be
knowledge, time or money. If you feel like donating any of this to Thunar, visit the &lt;a
href=&quot;http://thunar.xfce.org/contribute.html&quot;&gt;Contribute to Thunar&lt;/a&gt; page and be sure to
subscribe to the &lt;a href=&quot;http://foo-projects.org/mailman/listinfo/thunar-dev&quot;&gt;thunar-dev&lt;/a&gt;
mailinglist.&lt;/p&gt;

&lt;h2&gt;Feedback&lt;/h2&gt;

&lt;p&gt;Please send your feedback to the &lt;a
href=&quot;http://foo-projects.org/mailman/listinfo/thunar-dev&quot;&gt;thunar-dev&lt;/a&gt; mailinglist.&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
   <category term="exo"/>
   
   <category term="gtk"/>
   
 </entry>
 
 <entry>
   <title type="html">Trash, Bugs, Wasted Time</title>
   <link href="http://benediktmeurer.de/2006/07/28/trash-bugs-wasted-time"/>
   <updated>2006-07-28T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2006/07/28/trash-bugs-wasted-time</id>
   <content type="html">&lt;p&gt;So, the trash framework finally made its way into Xfce SVN. Still a bit rough around the edges, but that&#39;s mostly cosmetic fixes.&lt;/p&gt;

&lt;p&gt;In other news, I wasted four hours hunting down &lt;a href=&quot;http://bugzilla.gnome.org/show_bug.cgi?id=348953&quot;&gt;a bug/incompatible change&lt;/a&gt; in GTK+ 2.10, where the GtkTreeModelFilter doesn&#39;t behave properly anymore, which means that people using Thunar with GTK+ 2.10 and the tree pane will most probably not be able to run Thunar. The suggested solution for now is to switch to the shortcuts pane instead (or downgrade to GTK+ 2.8).&lt;/p&gt;

&lt;h3&gt;Update&lt;/h3&gt;

&lt;p&gt;According to the responsible GTK+ maintainer that was an intentional break in the expected behavior of a &lt;code&gt;GtkTreeModel&lt;/code&gt;. Of course, in a perfect world, toolkit maintainers would let application developers know of such breakage instead of waiting for other applications to crash... Thunar is now switched to the new behavior and will therefore work with GTK+ 2.10 again. Now we&#39;ll wait for the next crash. Maybe its worth the time porting Xfce to Qt; not that Qt is perfect, but atleast (if you have commercial support) you get useful comments about breakage in Qt that may cause trouble in applications.&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
   <category term="gtk"/>
   
 </entry>
 
 <entry>
   <title type="html">Trash is back</title>
   <link href="http://benediktmeurer.de/2006/07/21/trash-is-back"/>
   <updated>2006-07-21T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2006/07/21/trash-is-back</id>
   <content type="html">&lt;p&gt;Because this feature was requested quite often, and it somewhat makes sense for a file manager, I&#39;ll add trash support (based on the &lt;a href=&quot;http://freedesktop.org/wiki/Standards_2ftrash_2dspec&quot;&gt;trash specification&lt;/a&gt;) for the next release (most probably RC1).&lt;/p&gt;

&lt;center&gt;&lt;a href=&quot;/images/2006/thunar-trash-experimental.png&quot;&gt;&lt;img width=&quot;430&quot; src=&quot;/images/2006/thunar-trash-experimental.png&quot; /&gt;&lt;/a&gt;&lt;/center&gt;


&lt;p&gt;Trash support will be transparently available to all applications using thunar-vfs (no API/ABI breakage, just a few special methods added), and it should be easy to develop a panel plugin that displays the trash can or add a trash can to xfdesktop.&lt;/p&gt;

&lt;p&gt;Unfortunately the problem of interoperability of &lt;code&gt;trash:&lt;/code&gt;-URIs remains, but that should be a minor problem as long as people don&#39;t try to use the trash as primary storage for their documents.&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
 </entry>
 
 <entry>
   <title type="html">Xfce 4.4 beta2 released</title>
   <link href="http://benediktmeurer.de/2006/07/10/xfce-44-beta2-released"/>
   <updated>2006-07-10T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2006/07/10/xfce-44-beta2-released</id>
   <content type="html">&lt;p&gt;And so &lt;a href=&quot;http://foo-projects.org/pipermail/xfce-announce/2006-July/000030.html&quot;&gt;it&#39;s done&lt;/a&gt;. Another huge step forward to Xfce 4.4.0.&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
 </entry>
 
 <entry>
   <title type="html">Thunar 0.3.2 and libexo 0.3.1.8 beta2 releases</title>
   <link href="http://benediktmeurer.de/2006/07/09/thunar-032-and-libexo-0318-beta2-releases"/>
   <updated>2006-07-09T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2006/07/09/thunar-032-and-libexo-0318-beta2-releases</id>
   <content type="html">&lt;p&gt;I just released Thunar-0.3.2beta2 and libexo-0.3.1.2beta2 as part of &lt;a href=&quot;http://www.xfce.org/&quot;&gt;Xfce&lt;/a&gt; 4.4BETA2, which will be released tomorrow. Separate tarballs are provided for users of Xfce 4.2.x that don&#39;t want to upgrade yet, and users of other desktop environments. As suggested by the name, it is still a beta release and it is thereby considered to be more or less stable in what it does, but it is not yet a final version.&lt;/p&gt;

&lt;p&gt;You will need atleast libxfce4util 4.2.2, GTK+ 2.6.4, shared-mime-info 0.15 and desktop-file-utils 0.10 to build and run Thunar. In addition Gamin or FAM are highly recommended to enable file system monitoring in Thunar. For HAL support on Linux, the libhal-storage-devel package is required (0.5.0 or above). The &lt;code&gt;README&lt;/code&gt; file contains a complete list of dependencies and optional packages.&lt;/p&gt;

&lt;p&gt;The official announcement is available at: &lt;a href=&quot;http://thunar.xfce.org/news.html#2006-07-09&quot;&gt;http://thunar.xfce.org/news.html#2006-07-09&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Additional (updated) screenshots are available at: &lt;a href=&quot;http://thunar.xfce.org/screenshots.html&quot;&gt;http://thunar.xfce.org/screenshots.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;he source tarballs can be downloaded from: &lt;a href=&quot;http://thunar.xfce.org/download.html#0.3.2&quot;&gt;http://thunar.xfce.org/download.html#0.3.2&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Installation instructions and documentation are available at: &lt;a href=&quot;http://thunar.xfce.org/pwiki/&quot;&gt;http://thunar.xfce.org/pwiki/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Please report bugs to the Xfce Bug Tracker (product &lt;em&gt;Thunar&lt;/em&gt;) at: &lt;a href=&quot;http://bugzilla.xfce.org/&quot;&gt;http://bugzilla.xfce.org/&lt;/a&gt;&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
   <category term="exo"/>
   
 </entry>
 
 <entry>
   <title type="html">thunar-archive-plugin 0.2.0</title>
   <link href="http://benediktmeurer.de/2006/07/04/thunar-archive-plugin-020"/>
   <updated>2006-07-04T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2006/07/04/thunar-archive-plugin-020</id>
   <content type="html">&lt;p&gt;This is a major release, which introduces a generic scripting interface for archivers, so the plugin can now be used with basicly every archive manager that supports the required command line parameters. Support for File Roller (the GNOME archive manager) and Ark (the KDE archive manager) is builtin. &lt;a href=&quot;http://xarchiver.xfce.org/&quot;&gt;Xarchiver&lt;/a&gt; will include support for the archive plugin in the next release. It depends on &lt;a href=&quot;http://thunar.xfce.org/&quot;&gt;Thunar&lt;/a&gt; 0.2.2 or above.&lt;/p&gt;

&lt;p&gt;Download: &lt;a href=&quot;http://developer.berlios.de/project/showfiles.php?group_id=910&amp;amp;release_id=10461&quot;&gt;http://developer.berlios.de/project/showfiles.php?group_id=910&amp;amp;release_id=10461&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Release notes: &lt;a href=&quot;http://developer.berlios.de/project/shownotes.php?release_id=10461&quot;&gt;http://developer.berlios.de/project/shownotes.php?release_id=10461&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Website (with screenshots): &lt;a href=&quot;http://foo-projects.org/~benny/projects/thunar-archive-plugin/index.html&quot;&gt;http://foo-projects.org/~benny/projects/thunar-archive-plugin/index.html&lt;/a&gt;&lt;/p&gt;&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
 </entry>
 
 <entry>
   <title type="html">Another Xfce 4.4 BETA1 review</title>
   <link href="http://benediktmeurer.de/2006/05/11/anoter-xfce-44-beta1-review"/>
   <updated>2006-05-11T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2006/05/11/anoter-xfce-44-beta1-review</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://lwn.net/SubscriberLink/182966/ceff2d3d04e4caa1/&quot;&gt;What next for the Xfce Project?&lt;/a&gt; on &lt;a href=&quot;http://lwn.net/&quot;&gt;LWN.net&lt;/a&gt;.&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
 </entry>
 
 <entry>
   <title type="html">New Xfce Installer</title>
   <link href="http://benediktmeurer.de/2006/05/05/new-xfce-installer"/>
   <updated>2006-05-05T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2006/05/05/new-xfce-installer</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://dev.sten-net.de/&quot;&gt;Jannis&lt;/a&gt; just uploaded new screenshots demonstrating the &lt;a href=&quot;http://dev.sten-net.de/2006/05/05/installit-new-screenshots/&quot;&gt;next generation of the Xfce Installer&lt;/a&gt;, which will hopefully be available for BETA2.&lt;/p&gt;

&lt;center&gt;&lt;a href=&quot;http://lunar-linux.org/~jannis/screenshots/i2t/installit-main-window-20060504.png&quot;&gt;&lt;img src=&quot;http://lunar-linux.org/~jannis/screenshots/i2t/installit-main-window-20060504.png&quot;  width=&quot;200&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://lunar-linux.org/~jannis/screenshots/i2t/installit-download-20060504.png&quot;&gt;&lt;img src=&quot;http://lunar-linux.org/~jannis/screenshots/i2t/installit-download-20060504.png&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/center&gt;


&lt;p&gt;Be sure to have a look!&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
 </entry>
 
 <entry>
   <title type="html">Xfce 4.4 BETA1 review</title>
   <link href="http://benediktmeurer.de/2006/05/02/xfce-44-beta1-review"/>
   <updated>2006-05-02T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2006/05/02/xfce-44-beta1-review</id>
   <content type="html">&lt;p&gt;Tuxmachines.org has nice &lt;a href=&quot;http://www.tuxmachines.org/node/6448&quot;&gt;review of Xfce 4.4beta1&lt;/a&gt;, which provides a more detailed overview than my &lt;a href=&quot;/2006/04/18/major-changes-in-xfce-44-beta1&quot;&gt;brief list of major changes&lt;/a&gt;.&lt;/p&gt;

&lt;center&gt;&lt;a href=&quot;http://www.tuxmachines.org/gallery/xfce44b1/desktop3&quot;&gt;&lt;img src=&quot;http://www.tuxmachines.org/images/xfce44b1/desktop3_thumb.jpg&quot; /&gt;&lt;/a&gt;&lt;/center&gt;


&lt;p&gt;&lt;b&gt;Conclusion:&lt;/b&gt; &lt;i&gt;Things are only getting better with xfce4 4.4. Updated interface configurations, new options, and new applications make this release an exciting prospect. If you&#39;ve never tried xfce or haven&#39;t tried it recently, you owe it to yourself to test it out.&lt;/i&gt;&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
 </entry>
 
 <entry>
   <title type="html">Major changes in Xfce 4.4 BETA1</title>
   <link href="http://benediktmeurer.de/2006/04/18/major-changes-in-xfce-44-beta1"/>
   <updated>2006-04-18T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2006/04/18/major-changes-in-xfce-44-beta1</id>
   <content type="html">&lt;p&gt;As you might already know, Xfce 4.4BETA1 was released today, and it contains a lot of changes, that have been worked since the last major release. I&#39;m going to present an (incomplete!) list of the most important changes in BETA1. I will not include Thunar here, read the &lt;a href=&quot;http://thunar.xfce.org/news.html#2006-04-16&quot;&gt;Thunar 0.3.0 release notes&lt;/a&gt; for details about Thunar&lt;/p&gt;

&lt;h2&gt;Desktop Icons&lt;/h2&gt;

&lt;p&gt;One of the most often requested features during the Xfce 4.0/4.2 days was support for desktop icons. Xfce 4.4 finally includes support for icons on the desktop.&lt;/p&gt;

&lt;center&gt;&lt;a href=&quot;/images/2006/xfce-4.4beta1-changes/desktop-icons.png&quot;&gt;&lt;img src=&quot;/images/2006/xfce-4.4beta1-changes/desktop-icons-thumb.png&quot; /&gt;&lt;/a&gt;&lt;/center&gt;


&lt;p&gt;xfdesktop utilizes Thunar&#39;s libraries to handle application launchers and files/folders on the desktop, and it is also able to display icons for minimized windows on the desktop (a popular CDE feature), or to disable desktop icons all together.&lt;/p&gt;

&lt;h2&gt;Mousepad&lt;/h2&gt;

&lt;p&gt;Mousepad, a simple and lightweight text editor, was included as part of Xfce 4.4. Mousepad starts up very fast and provides all the basic text editing features, which makes it a perfect default editor for Xfce.&lt;/p&gt;

&lt;center&gt;&lt;a href=&quot;/images/2006/xfce-4.4beta1-changes/mousepad.png&quot;&gt;&lt;img src=&quot;/images/2006/xfce-4.4beta1-changes/mousepad-thumb.png&quot; /&gt;&lt;/a&gt;&lt;/center&gt;


&lt;h2&gt;Orage&lt;/h2&gt;

&lt;p&gt;Orage, the new calendar application based on xfcalendar, provides all the features one would expect from a time management application today, while it remains lightweight and easy to use.&lt;/p&gt;

&lt;center&gt;&lt;a href=&quot;/images/2006/xfce-4.4beta1-changes/orage.png&quot;&gt;&lt;img src=&quot;/images/2006/xfce-4.4beta1-changes/orage-thumb.png&quot; /&gt;&lt;/a&gt;&lt;/center&gt;


&lt;h2&gt;Panel&lt;/h2&gt;

&lt;p&gt;The Xfce Panel was completely rewritten for 4.4, and supports multiple panels and external plugins (running as separate applications and thereby improving the stability of the panel). xftaskbar4 and xfce4-iconbox were dropped from the release, as their functionality is completely provided by the new panel now.&lt;/p&gt;

&lt;center&gt;&lt;a href=&quot;/images/2006/xfce-4.4beta1-changes/panel-properties.png&quot;&gt;&lt;img src=&quot;/images/2006/xfce-4.4beta1-changes/panel-properties-thumb.png&quot; /&gt;&lt;/a&gt;&lt;/center&gt;


&lt;p&gt;The panel items can now be added and reordered using Drag&#39;n&#39;Drop, and the panel launcher properties dialog was redesigned to make it easier to create and manage launchers with attached menus (there is also support for &lt;a href=&quot;http://rox.sourceforge.net/desktop/node/269&quot;&gt;Zero Install&lt;/a&gt; now).&lt;/p&gt;

&lt;center&gt;&lt;a href=&quot;/images/2006/xfce-4.4beta1-changes/panel-launcher.png&quot;&gt;&lt;img src=&quot;/images/2006/xfce-4.4beta1-changes/panel-launcher-thumb.png&quot; /&gt;&lt;/a&gt;&lt;/center&gt;


&lt;p&gt;Most of the panel plugins, available via the &lt;a href=&quot;http://xfce-goodies.berlios.de/&quot;&gt;Xfce Goodies&lt;/a&gt; project, have been updated for the new panel, and the new &lt;code&gt;xfce4-xfapplet-plugin&lt;/code&gt; allows users to add GNOME panel applets to the Xfce panel.&lt;/p&gt;

&lt;h2&gt;Preferred Applications&lt;/h2&gt;

&lt;p&gt;A new preferred applications framework was imported into Xfce, so users no longer need to edit shell profiles to specify which browser and terminal emulator should be used by Xfce applications.&lt;/p&gt;

&lt;center&gt;&lt;a href=&quot;/images/2006/xfce-4.4beta1-changes/preferred-applications.png&quot;&gt;&lt;img src=&quot;/images/2006/xfce-4.4beta1-changes/preferred-applications-thumb.png&quot; /&gt;&lt;/a&gt;&lt;/center&gt;


&lt;h2&gt;Window Manager Tweaks&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;xfwm4&lt;/code&gt;, the Xfce window manager, saw a lot of improvements. One of the most interesting user-visible changes is the inclusion of a window manager tweaks dialog, which allows users to tweak several advanced options of the window manager.&lt;/p&gt;

&lt;center&gt;&lt;a href=&quot;/images/2006/xfce-4.4beta1-changes/wmtweaks.png&quot;&gt;&lt;img src=&quot;/images/2006/xfce-4.4beta1-changes/wmtweaks-thumb.png&quot; /&gt;&lt;/a&gt;&lt;/center&gt;


&lt;p&gt;There is also support to tweak the builtin composition manager in the window manager settings if &lt;code&gt;xfwm4&lt;/code&gt; was built with support for the Xcomposite extension.&lt;/p&gt;

&lt;p&gt;This is just a very brief list of changes. A more complete review of Xfce 4.4BETA1 should be available during the next weeks.&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
   <category term="exo"/>
   
   <category term="terminal"/>
   
 </entry>
 
 <entry>
   <title type="html">Xfce 4.4 BETA1 released</title>
   <link href="http://benediktmeurer.de/2006/04/17/xfce-44-beta1-released"/>
   <updated>2006-04-17T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2006/04/17/xfce-44-beta1-released</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://foo-projects.org/pipermail/xfce4-dev/2006-April/019590.html&quot;&gt; Xfce 4.4beta1&lt;/a&gt; was finally released today with all the nice stuff (new panel, Mousepad, Orage, Thunar, ...). Be sure to grab your copy today!&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
 </entry>
 
 <entry>
   <title type="html">thunar-archive-plugin 0.1.2</title>
   <link href="http://benediktmeurer.de/2006/04/17/thunar-archive-plugin-012"/>
   <updated>2006-04-17T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2006/04/17/thunar-archive-plugin-012</id>
   <content type="html">&lt;p&gt;I just released the second version of the thunar-archive-plugin. It includes a bunch of new translations, and fixes the problem that the folder was not properly reloaded after creating or extracting an archive. It requires &lt;a href=&quot;http://thunar.xfce.org/&quot;&gt;Thunar&lt;/a&gt; 0.2.2alpha2 or above and &lt;a href=&quot;http://fileroller.sourceforget.net/&quot;&gt;File Roller&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Download: &lt;a href=&quot;http://developer.berlios.de/project/showfiles.php?group_id=910&amp;amp;release_id=9778&quot;&gt;http://developer.berlios.de/project/showfiles.php?group_id=910&amp;amp;release_id=9778&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Release notes: &lt;a href=&quot;http://developer.berlios.de/project/shownotes.php?release_id=9778&quot;&gt;http://developer.berlios.de/project/shownotes.php?release_id=9778&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Website (with screenshots): &lt;a href=&quot;http://foo-projects.org/~benny/projects/thunar-archive-plugin/index.html&quot;&gt;http://foo-projects.org/~benny/projects/thunar-archive-plugin/index.html&lt;/a&gt;&lt;/p&gt;&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
 </entry>
 
 <entry>
   <title type="html">Thunar 0.3.0 and libexo 0.3.1.6 releases</title>
   <link href="http://benediktmeurer.de/2006/04/17/thunar-030-and-libexo-0316-beta1-releases"/>
   <updated>2006-04-17T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2006/04/17/thunar-030-and-libexo-0316-beta1-releases</id>
   <content type="html">&lt;p&gt;I just released Thunar-0.3.0beta1 and libexo-0.3.1.6beta1 as part of &lt;a href=&quot;http://www.xfce.org/&quot;&gt;Xfce&lt;/a&gt; 4.4BETA1 (separate tarballs are provided for users of Xfce 4.2.x that don&#39;t want to upgrade yet, and users of other desktop environments). As suggested by the name, it is a beta release and it is thereby considered to be more or less stable in what it does, but it is still not a final version.&lt;/p&gt;

&lt;p&gt;You will need atleast libxfce4util 4.2.2, GTK+ 2.6.4, shared-mime-info 0.15 and desktop-file-utils 0.10 to build and run Thunar. In addition Gamin or FAM are highly recommended to enable file system monitoring in Thunar. For HAL support on Linux, the libhal-storage-devel package is required (0.5.0 or above). The &lt;code&gt;README&lt;/code&gt; file contains a complete list of dependencies and optional packages.&lt;/p&gt;

&lt;p&gt;The official announcement is available at: &lt;a href=&quot;http://thunar.xfce.org/news.html#2006-04-16&quot;&gt;http://thunar.xfce.org/news.html#2006-04-16&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Additional (updated) screenshots are available at: &lt;a href=&quot;http://thunar.xfce.org/screenshots.html&quot;&gt;http://thunar.xfce.org/screenshots.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The source tarballs can be downloaded from: &lt;a href=&quot;http://thunar.xfce.org/download.html#0.3.0&quot;&gt;http://thunar.xfce.org/download.html#0.3.0&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Installation instructions and documentation are available at: &lt;a href=&quot;http://thunar.xfce.org/pwiki/&quot;&gt;http://thunar.xfce.org/pwiki/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Please report bugs to the Xfce Bug Tracker (product &lt;em&gt;Thunar&lt;/em&gt;) at: &lt;a href=&quot;http://bugzilla.xfce.org/&quot;&gt;http://bugzilla.xfce.org/&lt;/a&gt;&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
   <category term="exo"/>
   
 </entry>
 
 <entry>
   <title type="html">New Thunar Wiki</title>
   <link href="http://benediktmeurer.de/2006/04/15/new-thunar-wiki"/>
   <updated>2006-04-15T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2006/04/15/new-thunar-wiki</id>
   <content type="html">&lt;p&gt;I set up a new &lt;a href=&quot;http://thunar.xfce.org/pwiki/&quot;&gt;Thunar Wiki&lt;/a&gt; today, which contains interesting information for users. The &lt;a href=&quot;http://thunar.xfce.org/wiki/&quot;&gt;old wiki&lt;/a&gt; with the development notes is still there and will continue as &lt;i&gt;dev wiki&lt;/i&gt;.&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
 </entry>
 
 <entry>
   <title type="html">Compact View</title>
   <link href="http://benediktmeurer.de/2006/04/14/compact-view"/>
   <updated>2006-04-14T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2006/04/14/compact-view</id>
   <content type="html">&lt;p&gt;Thanks to Matt McClinch, who worked out a patch for &lt;a href=&quot;http://thunar.xfce.org/&quot;&gt;Thunar&lt;/a&gt; and libexo, Thunar BETA1 will also include the often requested Windows Explorer-like &lt;i&gt;Compact View&lt;/i&gt;.&lt;/p&gt;

&lt;p&gt;&lt;center&gt;&lt;a href=&quot;/images/2006/thunar-compact-view.png&quot;&gt;&lt;img src=&quot;/images/2006/thunar-compact-view.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
   <category term="exo"/>
   
 </entry>
 
 <entry>
   <title type="html">Close to BETA1</title>
   <link href="http://benediktmeurer.de/2006/04/13/close-to-beta1"/>
   <updated>2006-04-13T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2006/04/13/close-to-beta1</id>
   <content type="html">&lt;p&gt;We&#39;re close to Thunar BETA1, hopefully this weekend. So, time to share a few screenshots. The BETA1 includes a full-featured tree pane...&lt;/p&gt;

&lt;center&gt;&lt;a href=&quot;http://www.foo-projects.org/~benny/tmp/thunar-tree-view.png&quot;&gt;&lt;img src=&quot;http://www.foo-projects.org/~benny/tmp/thunar-tree-view.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/center&gt;


&lt;p&gt;...allows to customize the columns in the detailed list view and provides a fixed column width mode, which does not only improve the usability for users used to the Window Explorer way, but also speeds up the display of the detailed list view by a factor of 10 for medium sized folders...&lt;/p&gt;

&lt;center&gt;&lt;a href=&quot;http://www.foo-projects.org/~benny/tmp/thunar-visible-columns.png&quot;&gt;&lt;img src=&quot;http://www.foo-projects.org/~benny/tmp/thunar-visible-columns.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/center&gt;


&lt;p&gt;...includes improved single-click navigation support with configurable hover selection...&lt;/p&gt;

&lt;center&gt;&lt;a href=&quot;http://www.foo-projects.org/~benny/tmp/thunar-hover-autoselection.png&quot;&gt;&lt;img src=&quot;http://www.foo-projects.org/~benny/tmp/thunar-hover-autoselection.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/center&gt;


&lt;p&gt;...and will work properly on Solaris out-of-the-box (with support for Solaris specific file types), though the Solaris volume management support will not be merged for the BETA1, as it&#39;s not ready for prime-time yet...&lt;/p&gt;

&lt;center&gt;&lt;a href=&quot;http://www.foo-projects.org/~benny/tmp/thunar-sunos-craig.png&quot;&gt;&lt;img src=&quot;http://www.foo-projects.org/~benny/tmp/thunar-sunos-craig.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/center&gt;


&lt;p&gt;...and as additional goodie, the bulk renamer was imported, which allows users to easily rename multiple files at once.&lt;/p&gt;

&lt;center&gt;&lt;a href=&quot;/images/2006/thunar-bulk-rename1.png&quot;&gt;&lt;img src=&quot;/images/2006/thunar-bulk-rename1.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/center&gt;


&lt;p&gt;Together with the additional &lt;a href=&quot;http://thunar.xfce.org/plugins.html&quot;&gt;plugins&lt;/a&gt;, and especially Jannis&#39; &lt;a href=&quot;http://thunar.xfce.org/plugins.html#thunar-media-tags-plugin&quot;&gt;thunar-media-tags-plugin&lt;/a&gt;, a lot of bugfixes and usability improvements, and other changes I forgot to mention, we&#39;re already very close to the first final release.&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
 </entry>
 
 <entry>
   <title type="html">Transparent Terminal Hack</title>
   <link href="http://benediktmeurer.de/2006/03/27/transparent-terminal-hack"/>
   <updated>2006-03-27T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2006/03/27/transparent-terminal-hack</id>
   <content type="html">&lt;p&gt;This one was requested quite often lately, so here&#39;s a quick&amp;amp;dirty hack to make the Terminal transparent. The Terminal-side changes are pretty easy, just use ARGB visuals if possible. The VTE patch is really just a hack for the Xft backend with a hardcoded alpha value of &lt;code&gt;0xaaaa&lt;/code&gt;. You need to run a composition manager for this to work (i.e. &lt;code&gt;xfwm4&lt;/code&gt; with &lt;code&gt;--compositor=on&lt;/code&gt;), and select solid background color in Terminal (as said, the VTE patch is just a really quick hack). The result is:&lt;/p&gt;

&lt;center&gt;&lt;a href=&quot;/images/2006/terminal-transparent.png&quot;&gt;&lt;img src=&quot;/images/2006/terminal-transparent.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/center&gt;




&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/files/patches/transparent-hack-Terminal.patch&quot;&gt;Patch for Terminal&lt;/a&gt;, works with latest SVN.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/files/patches/transparent-hack-VTE.patch&quot;&gt;Patch for VTE&lt;/a&gt;, created with 0.11.18, but should also work with newer versions.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Anybody willing to create a clean patch for VTE (requires quite a lot of changes, but doable)?&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="terminal"/>
   
 </entry>
 
 <entry>
   <title type="html">thunar-archive-plugin 0.1.0</title>
   <link href="http://benediktmeurer.de/2006/03/26/thunar-archive-plugin-010"/>
   <updated>2006-03-26T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2006/03/26/thunar-archive-plugin-010</id>
   <content type="html">&lt;p&gt;I uploaded a first release of the &lt;a href=&quot;http://foo-projects.org/~benny/projects/thunar-archive-plugin/&quot;&gt;thunar-archive-plugin&lt;/a&gt;, which currently integrates &lt;a href=&quot;http://fileroller.sourceforge.net/&quot;&gt;File Roller&lt;/a&gt; into &lt;a href=&quot;http://thunar.xfce.org/&quot;&gt;Thunar&lt;/a&gt; (support for &lt;a href=&quot;http://xarchiver.xfce.org/&quot;&gt;Xarchiver&lt;/a&gt; will be added once Xarchiver is ready). Check the &lt;a href=&quot;http://foo-projects.org/~benny/projects/thunar-archive-plugin/&quot;&gt;website&lt;/a&gt; for download locations and instructions.&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
 </entry>
 
 <entry>
   <title type="html">Thunar startup</title>
   <link href="http://benediktmeurer.de/2006/03/15/thunar-startup"/>
   <updated>2006-03-15T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2006/03/15/thunar-startup</id>
   <content type="html">&lt;p&gt;I decided to do some profiling on Thunar startup to find out why it takes 2-3 seconds to popup here using the Gtk+ 2.8 port (while it starts up faster with the full debug build of Gtk+ 2.9). Using &lt;a href=&quot;http://primates.ximian.com/~federico/news-2006-03.html#09&quot;&gt;Federicos simple access() trick&lt;/a&gt;, I found out that the majority of time was spent in &lt;code&gt;gtk_window_size_request()&lt;/code&gt; and &lt;code&gt;gtk_window_realize()&lt;/code&gt;.&lt;/p&gt;

&lt;center&gt;&lt;a href=&quot;http://www.foo-projects.org/~benny/tmp/thunar-profile-startup/thunar-profile-startup1.png&quot;&gt;&lt;img src=&quot;http://www.foo-projects.org/~benny/tmp/thunar-profile-startup/thunar-profile-startup1.png&quot; width=&quot;90%&quot; /&gt;&lt;/a&gt;&lt;/center&gt;


&lt;p&gt;Looking at the relevant parts of the &lt;a href=&quot;http://www.foo-projects.org/~benny/tmp/thunar-profile-startup/thunar-profile-startup1.truss.log&quot;&gt;truss output&lt;/a&gt; it was very easy to locate the cause of the problem. &lt;code&gt;gtk_window_realize()&lt;/code&gt; loaded the &lt;code&gt;GtkIconTheme&lt;/code&gt; instance for the default screen, which in turn tried to &lt;code&gt;stat()&lt;/code&gt; every icon in Tango and all inherited icon themes. Looking at the Gtk+ source, it shouldn&#39;t &lt;code&gt;stat()&lt;/code&gt; the icon files if an updated &lt;code&gt;icon-theme.cache&lt;/code&gt; file is found. Since I had updated &lt;code&gt;icon-theme.cache&lt;/code&gt; files for all relevant icon theme directories (the truss output also shows that after &lt;code&gt;stat()&lt;/code&gt;ing all icon files, the &lt;code&gt;icon-theme.cache&lt;/code&gt; file is finally used), it should not &lt;code&gt;stat()&lt;/code&gt; the icons, but only the icon directory (according to the Gtk+ source).&lt;/p&gt;

&lt;p&gt;So after some further research, I found &lt;a href=&quot;http://cvsup.pt.freebsd.org/cgi-bin/cvsweb/cvsweb.cgi/ports/x11-toolkits/gtk20/files/patch-gtk_gtkiconcache.c&quot;&gt;this patch&lt;/a&gt;, which gets applied to the &lt;code&gt;x11-toolkits/gtk20&lt;/code&gt; FreeBSD port. The patch basicly changes the icon cache loading to first &lt;code&gt;stat()&lt;/code&gt; all icon files in the theme and test if any of them is newer than the cache file. That does of course make the startup slow (the startup of &lt;b&gt;every&lt;/b&gt; Gtk+ application on FreeBSD). Whoever came up with that idea was definitely on crack.&lt;/p&gt;

&lt;p&gt;Ok, so removed that patch, rebuilt the port, and voila...&lt;/p&gt;

&lt;center&gt;&lt;a href=&quot;http://www.foo-projects.org/~benny/tmp/thunar-profile-startup/thunar-profile-startup2.png&quot;&gt;&lt;img src=&quot;http://www.foo-projects.org/~benny/tmp/thunar-profile-startup/thunar-profile-startup2.png&quot; width=&quot;90%&quot; /&gt;&lt;/a&gt;&lt;/center&gt;


&lt;p&gt;1/2 second from startup to &lt;code&gt;gtk_main()&lt;/code&gt;, that&#39;s quite ok. Now whats left over is the question why &lt;code&gt;gtk_window_size_request()&lt;/code&gt; takes that long on first call. Looking at the &lt;a href=&quot;http://www.foo-projects.org/~benny/tmp/thunar-profile-startup/thunar-profile-startup1.truss.log&quot;&gt;truss log&lt;/a&gt; again, it seems to be the Pango initialization. Have to check this later...&lt;/p&gt;

&lt;h3&gt;Update&lt;/h3&gt;

&lt;p&gt;For the sake of completeness, here&#39;s the time it takes to completely open and display (measured as &lt;i&gt;wait for the last expose event&lt;/i&gt;) a folder (the thunar source directory, 223 files and folders) in Thunar:&lt;/p&gt;

&lt;center&gt;&lt;a href=&quot;http://www.foo-projects.org/~benny/tmp/thunar-profile-startup/thunar-profile-startup3.png&quot;&gt;&lt;img src=&quot;http://www.foo-projects.org/~benny/tmp/thunar-profile-startup/thunar-profile-startup3.png&quot; width=&quot;90%&quot; /&gt;&lt;/a&gt;&lt;/center&gt;


&lt;p&gt;1.3 seconds isn&#39;t that bad for a first unoptimized release. Still room for improvement, tho.&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
 </entry>
 
 <entry>
   <title type="html">What&#39;s next?</title>
   <link href="http://benediktmeurer.de/2006/03/09/whats-next"/>
   <updated>2006-03-09T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2006/03/09/whats-next</id>
   <content type="html">&lt;p&gt;Thunar will enter beta phase soon, so I thought I&#39;d share two additional screenshots of what&#39;s to come soon.&lt;/p&gt;

&lt;p&gt;First, Thunar finally supports DnD to shortcuts (after crashing Thunar and Nautilus several times while testing, but finally remembered to remove &lt;code&gt;GTK_DEST_DEFAULT_ALL&lt;/code&gt;). &lt;a href=&quot;/images/2006/thunar-shortcuts-dnd.png&quot;&gt;Screenshot&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, I started work on the tree view. The basic tree view and tree model took less than a day, pretty easy using &lt;code&gt;GNode&lt;/code&gt;. But I guess it&#39;ll take another week to add all the small details. &lt;a href=&quot;/images/2006/thunar-tree-view.png&quot;&gt;Screenshot&lt;/a&gt;&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
 </entry>
 
 <entry>
   <title type="html">Thunar 0.2.2 and libexo 0.3.1.4 alpha2 releases</title>
   <link href="http://benediktmeurer.de/2006/03/05/thunar-022-and-libexo-0314-alpha2-releases"/>
   <updated>2006-03-05T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2006/03/05/thunar-022-and-libexo-0314-alpha2-releases</id>
   <content type="html">&lt;p&gt;I just released Thunar-0.2.2alpha2 and libexo-0.3.1.4alpha2. As suggested by the name, it is an alpha release and it is thereby considered to be more or less stable in what it does, but it is by no means a final version.&lt;/p&gt;

&lt;p&gt;You&#39;ll need atleast libxfce4util 4.2.2, Gtk+ 2.6.4, shared-mime-info 0.15 and desktop-file-utils 0.10 to build and run Thunar. In addition, Gamin or FAM are highly suggested to enable file system monitoring in Thunar. For HAL support on Linux, the libhal-storage devel package is required (0.5.0 or above). The &lt;code&gt;README&lt;/code&gt; file contains a complete list of dependencies and optional packages.&lt;/p&gt;

&lt;p&gt;The official announcement is available at: &lt;a href=&quot;http://thunar.xfce.org/news.html#2006-03-05&quot;&gt;http://thunar.xfce.org/news.html#2006-03-05&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Additional (updated) screenshots are available at: &lt;a href=&quot;http://thunar.xfce.org/screenshots.html&quot;&gt;http://thunar.xfce.org/screenshots.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The source tarballs can be downloaded from: &lt;a href=&quot;http://thunar.xfce.org/download.html#0.2.2&quot;&gt;http://thunar.xfce.org/download.html#0.2.2&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Please report bugs to the Xfce Bug Tracker (product &lt;i&gt;Thunar&lt;/i&gt;) at: &lt;a href=&quot;http://bugzilla.xfce.org/&quot;&gt;http://bugzilla.xfce.org/&lt;/a&gt;&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
   <category term="exo"/>
   
 </entry>
 
 <entry>
   <title type="html">Desktop actions</title>
   <link href="http://benediktmeurer.de/2006/02/06/desktop-actions"/>
   <updated>2006-02-06T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2006/02/06/desktop-actions</id>
   <content type="html">&lt;p&gt;I finally came around to fix some long standing issues with the internals of the file launching stuff in Thunar (to sum it up: it was a mess). Now it&#39;s cleaned up, and with the new classes it was actually too easy to add support for desktop actions (see the desktop file spec for details) to Thunar (Brian already added support to Xfmedia some time ago).&lt;/p&gt;

&lt;center&gt;&lt;a href=&quot;/images/2006/desktop-actions.png&quot;&gt;&lt;img src=&quot;/images/2006/desktop-actions.png&quot; width=&quot;310&quot; /&gt;&lt;/a&gt;&lt;/center&gt;


&lt;p&gt;In addition the &lt;i&gt;Open With&lt;/i&gt; actions are now also available if more than one file is selected.&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
 </entry>
 
 <entry>
   <title type="html">Thunar 0.2.0 and libexo 0.3.1.2 alpha releases</title>
   <link href="http://benediktmeurer.de/2006/01/22/thunar-020-and-libexo-0312-alpha-releases"/>
   <updated>2006-01-22T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2006/01/22/thunar-020-and-libexo-0312-alpha-releases</id>
   <content type="html">&lt;p&gt;I just released Thunar-0.2.0alpha and libexo-0.3.1.2alpha. As the name suggests, it&#39;s an alpha release and it is thereby considered to be more or less stable in what it does, but it&#39;s by no means a final version.&lt;/p&gt;

&lt;p&gt;You&#39;ll need atleast libxfce4util 4.2, Gtk+ 2.6, shared-mime-info 0.15 and desktop-file-utils 0.10 to build and run Thunar.&lt;/p&gt;

&lt;p&gt;The official announcement is available from:
&lt;a href=&quot;http://thunar.xfce.org/news.xhtml#2006-01-22&quot;&gt;http://thunar.xfce.org/news.xhtml&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The source tarballs are available from:
&lt;a href=&quot;http://thunar.xfce.org/download.xhtml#0.2.0&quot;&gt;http://thunar.xfce.org/download.xhtml&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Please report bugs to the Xfce Bug Tracker (product &lt;i&gt;Thunar&lt;/i&gt;) at:
&lt;a href=&quot;http://bugzilla.xfce.org/&quot;&gt;http://bugzilla.xfce.org/&lt;/a&gt;&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
   <category term="exo"/>
   
 </entry>
 
 <entry>
   <title type="html">Some more screenshots</title>
   <link href="http://benediktmeurer.de/2006/01/10/some-more-screenshots"/>
   <updated>2006-01-10T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2006/01/10/some-more-screenshots</id>
   <content type="html">&lt;p&gt;Long time no post. So, here&#39;s another bunch of random screenshots.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/2006/thunar-20060110-1.png&quot;&gt;&lt;img src=&quot;/images/2006/thunar-20060110-1.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/2006/thunar-20060110-2.png&quot;&gt;&lt;img src=&quot;/images/2006/thunar-20060110-2.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/2006/thunar-20060110-3.png&quot;&gt;&lt;img src=&quot;/images/2006/thunar-20060110-3.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/2006/thunar-20060110-4.png&quot;&gt;&lt;img src=&quot;/images/2006/thunar-20060110-4.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/2006/thunar-20060110-5.png&quot;&gt;&lt;img src=&quot;/images/2006/thunar-20060110-5.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/2006/thunar-20060110-6.png&quot;&gt;&lt;img src=&quot;/images/2006/thunar-20060110-6.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
 </entry>
 
 <entry>
   <title type="html">Just another screenshot</title>
   <link href="http://benediktmeurer.de/2005/11/15/just-another-screenshot"/>
   <updated>2005-11-15T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/11/15/just-another-screenshot</id>
   <content type="html">&lt;p&gt;Not much to say here, just more options available from the user interface:&lt;/p&gt;

&lt;center&gt;&lt;a href=&quot;/images/2005/thunar-traditional-style-20051115.png&quot;&gt;&lt;img src=&quot;/images/2005/thunar-traditional-style-20051115.png&quot; width=&quot;90%&quot; /&gt;&lt;/a&gt;&lt;/center&gt;



</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
 </entry>
 
 <entry>
   <title type="html">Thunar 0.1.4 and libexo 0.3.1.1 pre-alpha releases</title>
   <link href="http://benediktmeurer.de/2005/11/14/thunar-014-and-libexo-0311-pre-alpha-releases"/>
   <updated>2005-11-14T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/11/14/thunar-014-and-libexo-0311-pre-alpha-releases</id>
   <content type="html">&lt;p&gt;Checkout the &lt;a href=&quot;http://foo-projects.org/pipermail/thunar-dev/2005-November/001489.html&quot;&gt;announcement&lt;/a&gt; on thunar-dev.&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
   <category term="exo"/>
   
 </entry>
 
 <entry>
   <title type="html">New Thunar snapshot</title>
   <link href="http://benediktmeurer.de/2005/11/09/new-thunar-snapshot"/>
   <updated>2005-11-09T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/11/09/new-thunar-snapshot</id>
   <content type="html">&lt;p&gt;For the brave: I just uploaded a new &lt;a href=&quot;http://thunar.xfce.org/download/snapshots/devel/Thunar-0.1.3svn-r00136.tar.bz2&quot;&gt;Thunar snapshot&lt;/a&gt;, which will soon replace the (now) outdated version currently found in the Xfce SVN repository.&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
 </entry>
 
 <entry>
   <title type="html">Thunar application chooser</title>
   <link href="http://benediktmeurer.de/2005/09/22/thunar-application-chooser"/>
   <updated>2005-09-22T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/09/22/thunar-application-chooser</id>
   <content type="html">&lt;p&gt;Finally found the time to finish and commit the initial application chooser for Thunar. It&#39;s still a bit rough, but it works for now:&lt;/p&gt;

&lt;center&gt;&lt;a href=&quot;/images/2005/thunar-open-with-20050922.png&quot;&gt;&lt;img src=&quot;/images/2005/thunar-open-with-20050922.png&quot; /&gt;&lt;/a&gt;&lt;/center&gt;



</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
 </entry>
 
 <entry>
   <title type="html">(Mis)Use of icons in Gtk+/GNOME</title>
   <link href="http://benediktmeurer.de/2005/09/15/misuse-of-icons-in-gtk-gnome"/>
   <updated>2005-09-15T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/09/15/misuse-of-icons-in-gtk-gnome</id>
   <content type="html">&lt;p&gt;As seen on &lt;a href=&quot;http://planet.gnome.org/&quot;&gt;pgo&lt;/a&gt;: An interesting &lt;a href=&quot;http://www.tigert.com/archives/2005/09/15/ive-created-a-monster/&quot;&gt;blog entry&lt;/a&gt; from tigert about the use of icons in Gnome today (be sure to scroll down to Waldo Bastian&#39;s comment).&lt;/p&gt;
</content>
   
   <category term="gtk"/>
   
   <category term="gnome"/>
   
 </entry>
 
 <entry>
   <title type="html">Content Manager Ideas</title>
   <link href="http://benediktmeurer.de/2005/09/10/content-manager-ideas"/>
   <updated>2005-09-10T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/09/10/content-manager-ideas</id>
   <content type="html">&lt;p&gt;I&#39;ve been reading through the &lt;a href=&quot;http://appeal.kde.org/wiki/Appeal&quot;&gt;Appeal Wiki&lt;/a&gt; lately, and stumbled about the &lt;a href=&quot;http://appeal.kde.org/wiki/Content_Manager&quot;&gt;Content Manager&lt;/a&gt; page today. While the idea is not new, it&#39;s certainly one of the most interesting areas of Project Appeal.&lt;/p&gt;
</content>
   
   <category term="kde"/>
   
 </entry>
 
 <entry>
   <title type="html">New installer</title>
   <link href="http://benediktmeurer.de/2005/09/09/new-installer"/>
   <updated>2005-09-09T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/09/09/new-installer</id>
   <content type="html">&lt;p&gt;Just checked the new installer for Xfce 4.4 yesterday. Really nice work so far, &lt;a href=&quot;http://dev.sten-net.de/&quot;&gt;Jannis&lt;/a&gt;. The UI sure needs some work, but the fundamentals look good, and I think it&#39;s on the right track.&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
 </entry>
 
 <entry>
   <title type="html">Thumbnails</title>
   <link href="http://benediktmeurer.de/2005/09/03/thumbnails"/>
   <updated>2005-09-03T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/09/03/thumbnails</id>
   <content type="html">&lt;p&gt;It took quite some time and it wasn&#39;t very enjoyable, but now Thunar finally supports thumbnails (atleast loading):&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/2005/thunar-thumbnails-20050603.png&quot;&gt;&lt;img src=&quot;/images/2005/thunar-thumbnails-20050603.png&quot; width=&quot;90%&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It&#39;s not yet committed tho. Fortunately most desktop applications already store thumbnails today, so the file manager seldomly needs to generate a thumbnail itself. For the generation, we&#39;ll support whatever GdkPixbuf supports (we&#39;ll probably also include a fast jpeglib based generator), and optionally support the GNOME thumbnail generators. The GNOME thumbnails generators are just tools that write the final thumbnail to a file specified on the command line, which is good. Unfortunately the GNOME guys decided to store the generator list in GConf, which means that the GNOME thumbnailer support will depend on GConf, and thereby comes at a certain price.&lt;/p&gt;

&lt;p&gt;The thumbnail loading is quite fast, but nevertheless adds a little overhead (both memory and CPU time). Therefore we&#39;ll most probably include an option to disable thumbnailing completely. The good news is that Thunar is still very light on memory. A quick and dirty measurement (on a FreeBSD/i386 5.4-STABLE box with Gtk+ 2.6) shows, that Thunar&#39;s &lt;code&gt;VmData&lt;/code&gt; size is at &lt;code&gt;2228 kb&lt;/code&gt; after startup (displaying the first 12 items from my home dir). For example, Nautilus&#39; &lt;code&gt;VmData&lt;/code&gt; size is &lt;code&gt;4368 kB&lt;/code&gt; after startup displaying the same set of files (in browser mode and without the sidebar), while ROX is at &lt;code&gt;2988 kB&lt;/code&gt; and Xffm-iconview is at &lt;code&gt;2532 kB&lt;/code&gt;. Of course this is far from a serious benchmark, but it tells me that we&#39;re on the right way.&lt;/p&gt;

&lt;p&gt;What we really need with Thunar (or in a separate tool based on Thunar-VFS) is a way to cleanup dead thumbnails:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; ls -1 ~/.thumbnails/normal&lt;span class=&quot;p&quot;&gt;|&lt;/span&gt;wc -l
&lt;span class=&quot;go&quot;&gt;   5867&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;h3&gt;Update&lt;/h3&gt;

&lt;p&gt;For the sake of completeness: Konqueror&#39;s &lt;code&gt;VmData&lt;/code&gt; size is &lt;code&gt;4364 kB&lt;/code&gt; (KDE 3.4).&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
 </entry>
 
 <entry>
   <title type="html">Drag and Drop</title>
   <link href="http://benediktmeurer.de/2005/09/02/drag-and-drop"/>
   <updated>2005-09-02T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/09/02/drag-and-drop</id>
   <content type="html">&lt;p&gt;I finally committed the drop-site support for the current views in Thunar (the icon and details view). I stumbled over a few oddities in the GtkDnD code that I have never noticed before, and the current code in Thunar is not yet perfect, as some things don&#39;t work properly (or don&#39;t work as expected) right now. For example, you can drag a file in nautilus and drop it on a Thunar view, but you cannot drag a file in Thunar and drop it in a nautilus view, odd.&lt;/p&gt;

&lt;p&gt;In other news, we&#39;re close to hitting the current thread-length-record on &lt;a href=&quot;http://foo-projects.org/mailman/listinfo/thunar-dev&quot;&gt;thunar-dev&lt;/a&gt; with &lt;a href=&quot;http://foo-projects.org/pipermail/thunar-dev/2005-August/001041.html&quot;&gt;another&lt;/a&gt; &lt;a href=&quot;http://foo-projects.org/pipermail/thunar-dev/2005-September/001085.html&quot;&gt;website&lt;/a&gt; discussion. In short: &lt;a href=&quot;http://home.quicknet.nl/qn/prive/nickschermer/&quot;&gt;This&lt;/a&gt; is how the Thunar website will most probably look like.&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
 </entry>
 
 <entry>
   <title type="html">Debian packages for Thunar and libexo</title>
   <link href="http://benediktmeurer.de/2005/09/02/debian-packages-for-thunar-and-libexo"/>
   <updated>2005-09-02T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/09/02/debian-packages-for-thunar-and-libexo</id>
   <content type="html">&lt;p&gt;I just uploaded new Debian packages with Thunar and libexo snapshots to the &lt;a href=&quot;http://www.os-works.com/&quot;&gt;os-cillation repository&lt;/a&gt;, so Debian/Ubuntu users can test Thunar easily without having to build and install them manually.&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
   <category term="exo"/>
   
   <category term="debian"/>
   
   <category term="oscillation"/>
   
 </entry>
 
 <entry>
   <title type="html">Icon view</title>
   <link href="http://benediktmeurer.de/2005/08/19/icon-view"/>
   <updated>2005-08-19T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/08/19/icon-view</id>
   <content type="html">&lt;p&gt;Committed the new icon view code to libexo today, and updated Thunar to use it.&lt;/p&gt;

&lt;center&gt;&lt;a href=&quot;/images/2005/thunar-icon-view.png&quot;&gt;&lt;img src=&quot;/images/2005/thunar-icon-view.png&quot; width=&quot;90%&quot; /&gt;&lt;/a&gt;&lt;/center&gt;



</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
   <category term="exo"/>
   
 </entry>
 
 <entry>
   <title type="html">KDE Viewer</title>
   <link href="http://benediktmeurer.de/2005/08/05/kde-viewer"/>
   <updated>2005-08-05T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/08/05/kde-viewer</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://blog.xfce.org/index.php?p=85&quot;&gt;Jasper&lt;/a&gt;: I also read that articles, and they are indeed very good. Especially the number 8 on &lt;a href=&quot;http://www.icefox.net/articles/kdeosx.php&quot;&gt;Ben&#39;s list&lt;/a&gt; is really a very good idea. It&#39;d be just great to have something like Preview for Xfce/Gnome. Maybe Evince could turn into something like this.&lt;/p&gt;
</content>
   
   <category term="kde"/>
   
   <category term="xfce"/>
   
   <category term="gnome"/>
   
   <category term="osx"/>
   
 </entry>
 
 <entry>
   <title type="html">File alteration monitoring</title>
   <link href="http://benediktmeurer.de/2005/08/02/file-alteration-monitoring"/>
   <updated>2005-08-02T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/08/02/file-alteration-monitoring</id>
   <content type="html">&lt;p&gt;Just committed a change to get file alteration monitoring working again in Thunar. I had more or less carefully evaluated the possibilities of doing the monitoring within the Thunar process, using a combination of various &lt;i&gt;backends&lt;/i&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;kevent (this was already in the first prototypes)&lt;/li&gt;
&lt;li&gt;dnotify&lt;/li&gt;
&lt;li&gt;inotify&lt;/li&gt;
&lt;li&gt;regular stating in the main thread&lt;/li&gt;
&lt;li&gt;regular stating in a separate thread&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;But every solution I could think of would add way too much complexity to Thunar with no real gain. So the monitoring will now be done solely by FAM or Gamin. I strongly recommend Gamin, because it offers several advantages over FAM:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can utilize various modern operating system services like kevent and inotify.&lt;/li&gt;
&lt;li&gt;Allows its client to disable the sending of FAMExists events, which aren&#39;t used in Thunar (nor in any other FAM-based software I&#39;ve seen recently) and produce only unnecessary noise.&lt;/li&gt;
&lt;li&gt;Runs as user process rather than system service.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;On the other hand, if you use NFS mounted home directories, you should better stay with FAM for now.&lt;/p&gt;

&lt;p&gt;For people that don&#39;t like file monitoring, just disable FAM/Gamin (or just don&#39;t install it) and Thunar will run without monitoring. The Thunar-VFS jobs will provide feedback to the monitor whenever they perform an action on the filesystem, so you should be able to work with the file manager even if you don&#39;t have FAM/Gamin, without the need to reload the folder manually after copying/moving/deleting files. ;-)&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
 </entry>
 
 <entry>
   <title type="html">Thunar in Xfce SVN</title>
   <link href="http://benediktmeurer.de/2005/07/31/thunar-in-xfce-svn"/>
   <updated>2005-07-31T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/07/31/thunar-in-xfce-svn</id>
   <content type="html">&lt;p&gt;Thunar was finally imported into the Xfce Subversion repository today, and it&#39;s in quite good shape (although we&#39;re still not in time for Xfce 4.4).&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
 </entry>
 
 <entry>
   <title type="html">Transfering files</title>
   <link href="http://benediktmeurer.de/2005/07/26/transfering-files"/>
   <updated>2005-07-26T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/07/26/transfering-files</id>
   <content type="html">&lt;p&gt;One wouldn&#39;t imagine how difficult it can be to copy/move files around. You can come up with &lt;code&gt;cp&lt;/code&gt;/&lt;code&gt;mv&lt;/code&gt; hacks within a few minutes. But doing it right, with user interaction, trash support, percentage/EST calculation and all the good stuff (threaded of course, and esp. without risking data loss on the user&#39;s side), seems to be surprisingly difficult. I guess it&#39;s time to stand up from the computer and do something else.&lt;/p&gt;

&lt;p&gt;In other news, there&#39;s &lt;a href=&quot;http://www.xfce.org/~korbinus/&quot;&gt;Mickael&lt;/a&gt; posting about &lt;i&gt;Xfce is KDE done the right way&lt;/i&gt;, based on &lt;a href=&quot;http://www.loculus.nl/gallery/xfce/20050718_G&quot;&gt;one of Jaspers screenshots&lt;/a&gt;: I doubt that Xfce will ever attract the average KDE user. There ain&#39;t enough bells and whistles in Xfce, or - to quote a colleague - &lt;i&gt;Xfce just works&lt;/i&gt;. KDE users are a bit like Mac Classic users: It doesn&#39;t matter that much if something doesn&#39;t work properly (they&#39;ll figure out how to ignore the problem), but everything must be cute and cuddly. And personally, I wouldn&#39;t want to see Xfce turning into that direction.&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
 </entry>
 
 <entry>
   <title type="html">Time</title>
   <link href="http://benediktmeurer.de/2005/07/20/time"/>
   <updated>2005-07-20T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/07/20/time</id>
   <content type="html">&lt;p&gt;It&#39;s wednesday already. Managed to finish my last math exam successfully this week and now I&#39;m planning for my birthday party next saturday.&lt;/p&gt;

&lt;p&gt;There&#39;s not much to tell from the Thunar front. I hope to have a release version ready by the end of the month, which will be imported into the Xfce SVN repository then, but no promises. Not sure if we can really release 4.4.0 this year, atleast its questionable for Thunar. But on the other hand, that shouldn&#39;t be a problem, as long as we manage to release prior to 20060116. And dropping Thunar from Xfce 4.4.0 now that we told everybody that it will be included with 4.4 won&#39;t work.&lt;/p&gt;

&lt;p&gt;As always, whats needed the most is time.&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
 </entry>
 
 <entry>
   <title type="html">Slow media</title>
   <link href="http://benediktmeurer.de/2005/07/16/slow-media"/>
   <updated>2005-07-16T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/07/16/slow-media</id>
   <content type="html">&lt;p&gt;While testing some volume manager related stuff, I tried to load a large folder from a CD-ROM (the i386 folder from one of my more or less unused Windows 2000 install CDs, which contains about 4000 files) into the tree view and it took forever, even after the folder content was visible (I suspect this is GtkTreeView loading icon data for the invisible items, tho haven&#39;t checked yet). And of course, since currently everything runs in the main thread, the GUI was blocked.&lt;/p&gt;

&lt;p&gt;While I was aware of this problem, I decided to ignore it so far. On the solution side, we have basicly two possibilities: First we can do everything asynchronously or secondly we can do the fast stuff synchronously and add a &quot;media://&quot;-implementation, which does its work asynchronously (if somebody has a slow NFS-mount, he won&#39;t have fun with most probably every other program either, so we can safely ignore this case and focus on removable media). The first option is actually what I did for the very first prototypes and it turned out to be complex (I don&#39;t want to force everything into a limited low-level API like Gnome-VFS does, and so the high-level stuff would need to be thread-safe) and slow. The second option looks better to me, although it&#39;s still a lot of work to implement ThunarFolder and ThunarFile in a thread-safe way.&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
 </entry>
 
 <entry>
   <title type="html">Future of xfce4-toys</title>
   <link href="http://benediktmeurer.de/2005/07/15/future-of-xfce4-toys"/>
   <updated>2005-07-15T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/07/15/future-of-xfce4-toys</id>
   <content type="html">&lt;p&gt;I just removed xfce4-tips from the xfce4-toys package, since it&#39;s now included with xfce4-session. Now the question is: Where to move the eyes plugin to (which is the only component left in xfce4-toys)? We have basicly three options:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;Move it to xfce4-panel&lt;/li&gt;&lt;li&gt;Turn it into a separate goodie&lt;/li&gt;&lt;li&gt;Drop it (if Danny do not want to maintain it anymore)&lt;/li&gt;&lt;/ul&gt;



</content>
   
   <category term="xfce"/>
   
 </entry>
 
 <entry>
   <title type="html">Autostart editor</title>
   <link href="http://benediktmeurer.de/2005/07/15/autostart-editor"/>
   <updated>2005-07-15T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/07/15/autostart-editor</id>
   <content type="html">&lt;p&gt;Since we&#39;re now using desktop files instead of arbitrary scripts or symlinks, it is pretty easy to make the list of autostarted applications editable through a simple user interface. And so here&#39;s &lt;code&gt;xfce4-autostart-editor&lt;/code&gt;:&lt;/p&gt;

&lt;center&gt;&lt;a href=&quot;/images/2005/autostart-editor-20050715.png&quot;&gt;&lt;img src=&quot;/images/2005/autostart-editor-20050715.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/center&gt;


&lt;p&gt;&lt;code&gt;xfce4-autostart-editor&lt;/code&gt; is now part of &lt;code&gt;xfce4-session&lt;/code&gt; (trunk, rev 16232). I&#39;m looking for an icon - or atleast an idea about how such an icon could look like - for this tool (unfortunately Francois is away).&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
 </entry>
 
 <entry>
   <title type="html">New autostart mechanism in xfce4-session</title>
   <link href="http://benediktmeurer.de/2005/07/14/new-autostart-mechanism-in-xfce4-session"/>
   <updated>2005-07-14T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/07/14/new-autostart-mechanism-in-xfce4-session</id>
   <content type="html">&lt;p&gt;I just changed xfce4-session to use the new standard autostart mechanism, based on Waldos &lt;a href=&quot;/files/drafts/autostart-spec-0.5-draft2.html&quot;&gt;second draft&lt;/a&gt;. Your old autostart items from &lt;code&gt;~/Desktop/Autostart/&lt;/code&gt; will be migrated automatically on first run of the new session manager.&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
 </entry>
 
 <entry>
   <title type="html">Windows Explorer</title>
   <link href="http://benediktmeurer.de/2005/07/11/windows-explorer"/>
   <updated>2005-07-11T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/07/11/windows-explorer</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://elliottback.com/wp/wp-content/lh106wh.jpg&quot;&gt;Looks&lt;/a&gt; like Microsoft&#39;s Longhorn will include a GtkPathBar-like navigator for Windows Explorer. Else the &lt;a href=&quot;http://elliottback.com/wp/archives/2005/07/09/longhorn-5203-screenshots/&quot;&gt;screenshots&lt;/a&gt; look like a random mix of Aqua and the Windows XP UI, with no real concept. But I&#39;m sure they&#39;ll polish the stuff prior to the final version.&lt;/p&gt;
</content>
   
   <category term="windows"/>
   
   <category term="thunar"/>
   
 </entry>
 
 <entry>
   <title type="html">Menu merging</title>
   <link href="http://benediktmeurer.de/2005/07/11/menu-merging"/>
   <updated>2005-07-11T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/07/11/menu-merging</id>
   <content type="html">&lt;p&gt;I just added support for &lt;i&gt;menu-merging&lt;/i&gt; based on GtkUIManager to the ThunarView. This was the last step in the reordering of the view stuff. Now there are only a few other issues to address before Thunar can be imported into Xfce&#39;s SVN repository. Maybe we&#39;ll also release an early pre-alpha version as suggested by Botsie.&lt;/p&gt;

&lt;p&gt;Not many user-visible changes over the last weeks, but anyways, here&#39;s a new screenshot:&lt;/p&gt;

&lt;center&gt;&lt;a href=&quot;/images/2005/thunar-20050712.png&quot;&gt;&lt;img src=&quot;/images/2005/thunar-20050712.png&quot; width=&quot;90%&quot; /&gt;&lt;/a&gt;&lt;/center&gt;



</content>
   
   <category term="gtk"/>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
 </entry>
 
 <entry>
   <title type="html">Lemmings</title>
   <link href="http://benediktmeurer.de/2005/07/10/lemmings"/>
   <updated>2005-07-10T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/07/10/lemmings</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://193.151.73.87/games/lemmings/&quot;&gt;Lemmings&lt;/a&gt; is always fun to play.&lt;/p&gt;
</content>
   
   <category term="fun"/>
   
 </entry>
 
 <entry>
   <title type="html">Xfce Developer Tools 4.3.0</title>
   <link href="http://benediktmeurer.de/2005/07/09/xfce-developer-tools-430"/>
   <updated>2005-07-09T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/07/09/xfce-developer-tools-430</id>
   <content type="html">&lt;p&gt;I should have done this a long time ago already, but anyways, here&#39;s xfce4-dev-tools 4.3.0. Download locations and installation instructions are available at&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://xfce.org/~benny/projects/xfce4-dev-tools/index.html&quot;&gt;http://xfce.org/~benny/projects/xfce4-dev-tools/index.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The guide isn&#39;t finished yet, and therefore neither in SVN nor in the tarballs.&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
 </entry>
 
 <entry>
   <title type="html">A brief introduction to the Xfce Developer Tools</title>
   <link href="http://benediktmeurer.de/2005/07/09/a-brief-introduction-to-the-xfce-developer-tools"/>
   <updated>2005-07-09T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/07/09/a-brief-introduction-to-the-xfce-developer-tools</id>
   <content type="html">&lt;h2&gt;Overview&lt;/h2&gt;

&lt;p&gt;The Xfce Developer Tools - &lt;code&gt;xfce4-dev-tools&lt;/code&gt; for short - provide an
easy way to handle the setup and maintaince of a projects build framework. They
currently consist of a bunch of M4 macros for commonly used checks and the
&lt;code&gt;xdt-autogen&lt;/code&gt; script, which examines the projects &lt;code&gt;configure.ac&lt;/code&gt;
or &lt;code&gt;configure.in&lt;/code&gt; file(s) and calls the appropriate autotools in the
correct order.&lt;/p&gt;

&lt;p&gt;As the name suggests, the Xfce Developer Tools are mainly useful for application
developers to maintain their build environment. But users will also be required
to install them if they plan to build software straight from CVS or SVN checkouts.&lt;/p&gt;

&lt;h2&gt;Preparing the project&lt;/h2&gt;

&lt;p&gt;In this section I will describe how to use the developer tools with your project.
We will therefore examine a sample project and discuss the various steps. Our
sample project will contain only a single binary, which does nothing useful. The project
itself will be named &lt;code&gt;sample&lt;/code&gt;, and will depend on &lt;code&gt;libxfcegui4&lt;/code&gt;
and can optionally use D-BUS (this is only to demonstrate the usage of some of
the M4 macros). And our project will be translatable to other languages.&lt;/p&gt;

&lt;p&gt;We start off with the &lt;code&gt;Makefile.am&lt;/code&gt;&#39;s and the source code. First, we
create the projects directory layout:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; mkdir sample
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; mkdir sample/po
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; mkdir sample/sample&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Next the &lt;code&gt;sample/main.c&lt;/code&gt; source file:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-cpp&quot; data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;cp&quot;&gt;#ifdef HAVE_CONFIG_H&lt;/span&gt;
&lt;span class=&quot;cp&quot;&gt;#include &amp;lt;config.h&amp;gt;&lt;/span&gt;
&lt;span class=&quot;cp&quot;&gt;#endif&lt;/span&gt;

&lt;span class=&quot;cp&quot;&gt;#include &amp;lt;libxfcegui4/libxfcegui4.h&amp;gt;&lt;/span&gt;

&lt;span class=&quot;cp&quot;&gt;#ifdef HAVE_DBUS&lt;/span&gt;
&lt;span class=&quot;cp&quot;&gt;#include &amp;lt;dbus/dbus.h&amp;gt;&lt;/span&gt;
&lt;span class=&quot;cp&quot;&gt;#endif&lt;/span&gt;

&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;main&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;argc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;char&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;argv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;xfce_textdomain&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;GETTEXT_PACKAGE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;PACKAGE_LOCALE_DIR&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;UTF-8&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;g_print&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;Hello World!&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;As you can see, we conditionally include &lt;code&gt;dbus/dbus.h&lt;/code&gt; only if the
&lt;code&gt;HAVE_DBUS&lt;/code&gt; preprocessor macro is defined. The check for D-BUS is
made in the &lt;code&gt;configure.ac&lt;/code&gt; file, which is discussed below. Besides
that, the only thing we do here is to print the string &lt;code&gt;&quot;Hello World!&quot;&lt;/code&gt;
in a translatable manner, after setting up the proper textdomain for gettext.&lt;/p&gt;

&lt;p&gt;We continue with the &lt;code&gt;sample/Makefile.am&lt;/code&gt;, which contains instructions
about how to compile the &lt;code&gt;sample/main.c&lt;/code&gt; file:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-make&quot; data-lang=&quot;make&quot;&gt;&lt;span class=&quot;nv&quot;&gt;INCLUDES&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  -DDBUS_API_SUBJECT_TO_CHANGE &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  -DG_LOG_DOMAIN&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&amp;quot;&lt;/span&gt;sample&lt;span class=&quot;se&quot;&gt;\&amp;quot;&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  -DPACKAGE_LOCALE_DIR&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;$(&lt;/span&gt;localedir&lt;span class=&quot;k&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&amp;quot;&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  -I&lt;span class=&quot;k&quot;&gt;$(&lt;/span&gt;top_srcdir&lt;span class=&quot;k&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;nv&quot;&gt;bin_PROGRAMS&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  sample

&lt;span class=&quot;nv&quot;&gt;sample_SOURCES&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  main.c

&lt;span class=&quot;nv&quot;&gt;sample_CFLAGS&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;$(&lt;/span&gt;DBUS_CFLAGS&lt;span class=&quot;k&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;$(&lt;/span&gt;LIBXFCEGUI4_CFLAGS&lt;span class=&quot;k&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;nv&quot;&gt;sample_LDFLAGS&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;$(&lt;/span&gt;DBUS_LIBS&lt;span class=&quot;k&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;$(&lt;/span&gt;LIBXFCEGUI4_LIBS&lt;span class=&quot;k&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The &lt;code&gt;$(localedir)&lt;/code&gt; make variable is set by the &lt;code&gt;XDT_I18N()&lt;/code&gt;
macro and will point to the location where the translations are installed (e.g.
&lt;code&gt;/usr/local/share/locale&lt;/code&gt;). The &lt;code&gt;$(DBUS_CFLAGS)&lt;/code&gt;,
&lt;code&gt;$(DBUS_LIBS)&lt;/code&gt;, &lt;code&gt;$(LIBXFCEGUI4_CFLAGS)&lt;/code&gt; and
&lt;code&gt;$(LIBXFCEGUI4_LIBS)&lt;/code&gt; variables are set by the appropriate calls
to &lt;code&gt;XDT_CHECK_OPTIONAL_PACKAGE()&lt;/code&gt; and &lt;code&gt;XDT_CHECK_PACKAGE()&lt;/code&gt;,
which will be discussed below. Note that &lt;code&gt;$(DBUS_CFLAGS)&lt;/code&gt; and
&lt;code&gt;$(DBUS_LIBS)&lt;/code&gt; will be empty if D-BUS was not found or disabled
by the user.&lt;/p&gt;

&lt;p&gt;We also need to define &lt;code&gt;DBUS_API_SUBJECT_TO_CHANGE&lt;/code&gt; because the D-BUS
API is not yet frozen, but that&#39;s an unimportant detail in the context of this
article.&lt;/p&gt;

&lt;p&gt;Furthermore we will also need a toplevel &lt;code&gt;Makefile.am&lt;/code&gt;, which should
look like this:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-make&quot; data-lang=&quot;make&quot;&gt;&lt;span class=&quot;nv&quot;&gt;SUBDIRS&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  po &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  sample

&lt;span class=&quot;nv&quot;&gt;AUTOMAKE_OPTIONS&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  1.8 &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  dist-bzip2&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The &lt;code&gt;AUTOMAKE_OPTIONS&lt;/code&gt; variable is used by &lt;code&gt;automake&lt;/code&gt; to
enable or disable special behaviour. In this case, the &lt;code&gt;1.8&lt;/code&gt; tells
&lt;code&gt;automake&lt;/code&gt; that we need version 1.8 or better. And the &lt;code&gt;dist-bzip2&lt;/code&gt;
option tells &lt;code&gt;automake&lt;/code&gt; to generate a &lt;code&gt;dist&lt;/code&gt; target, which
will not only create the gzipped source tarball, but also a bzip2 compressed source
tarball.&lt;/p&gt;

&lt;p&gt;Now we are done with the &lt;code&gt;Makefile.am&lt;/code&gt;&#39;s. The next step is to take care
of the i18n setup. Therefore we need to create an empty &lt;code&gt;po/ChangeLog&lt;/code&gt;
file (the &lt;code&gt;po/Makefile.in.in&lt;/code&gt; generated by &lt;code&gt;glib-gettextize&lt;/code&gt;
requires this file)&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; touch po/ChangeLog&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;and afterwards create the &lt;code&gt;po/POTFILES.in&lt;/code&gt; file, which lists all source
files (and sometimes other files like &lt;code&gt;.desktop&lt;/code&gt; or &lt;code&gt;.xml&lt;/code&gt;
files as well) that contain translatable strings. In this case only the
&lt;code&gt;sample/main.c&lt;/code&gt; file contains a translatable string, so the file
looks like this:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;sample/main.c&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Note that all paths in &lt;code&gt;po/POTFILES.in&lt;/code&gt; must be relative to the projects
toplevel directory. One last step before we go on to the &lt;code&gt;configure.ac&lt;/code&gt;
file is to create four required files for GNU projects:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; touch AUTHORS ChangeLog NEWS README&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;You should of course add content to these files later on, but for now, we want to
concentrate on the important facts, the contents of &lt;code&gt;configure.ac&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;dnl Version information
m4_define&lt;span class=&quot;o&quot;&gt;([&lt;/span&gt;sample_version_major&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;, &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;0&lt;span class=&quot;o&quot;&gt;])&lt;/span&gt;
m4_define&lt;span class=&quot;o&quot;&gt;([&lt;/span&gt;sample_version_minor&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;, &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;0&lt;span class=&quot;o&quot;&gt;])&lt;/span&gt;
m4_define&lt;span class=&quot;o&quot;&gt;([&lt;/span&gt;sample_version_micro&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;, &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;1&lt;span class=&quot;o&quot;&gt;])&lt;/span&gt;
m4_define&lt;span class=&quot;o&quot;&gt;([&lt;/span&gt;sample_version&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;, &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;sample_version_major&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;.sample_version_minor&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;.sample_version_micro&lt;span class=&quot;o&quot;&gt;()])&lt;/span&gt;

dnl Initialize autoconf
AC_COPYRIGHT&lt;span class=&quot;o&quot;&gt;([&lt;/span&gt;Copyright &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;c&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; 2005
Benedikt Meurer &amp;lt;benny@xfce.org&amp;gt;&lt;span class=&quot;o&quot;&gt;])&lt;/span&gt;
AC_INIT&lt;span class=&quot;o&quot;&gt;([&lt;/span&gt;sample&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;, &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;sample_version&lt;span class=&quot;o&quot;&gt;()]&lt;/span&gt;, &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;benny@xfce.org&lt;span class=&quot;o&quot;&gt;])&lt;/span&gt;

dnl Initialize automake
AM_INIT_AUTOMAKE&lt;span class=&quot;o&quot;&gt;([&lt;/span&gt;AC_PACKAGE_TARNAME&lt;span class=&quot;o&quot;&gt;()]&lt;/span&gt;, &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;AC_PACKAGE_VERSION&lt;span class=&quot;o&quot;&gt;()])&lt;/span&gt;
AM_CONFIG_HEADER&lt;span class=&quot;o&quot;&gt;([&lt;/span&gt;config.h&lt;span class=&quot;o&quot;&gt;])&lt;/span&gt;
AM_MAINTAINER_MODE&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;

dnl check &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; basic programs
AC_PROG_CC&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;
AC_PROG_INSTALL&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;
AC_PROG_LIBTOOL&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt;

dnl Check &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; i18n support
XDT_I18N&lt;span class=&quot;o&quot;&gt;([&lt;/span&gt;de&lt;span class=&quot;o&quot;&gt;])&lt;/span&gt;

dnl Check &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; required packages
XDT_CHECK_PACKAGE&lt;span class=&quot;o&quot;&gt;([&lt;/span&gt;LIBXFCEGUI4&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;, &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;libxfcegui4-1.0&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;, &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;4.2.0&lt;span class=&quot;o&quot;&gt;])&lt;/span&gt;

dnl Check &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; optional packages
XDT_CHECK_OPTIONAL_PACKAGE&lt;span class=&quot;o&quot;&gt;([&lt;/span&gt;DBUS&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;, &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;dbus-1&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;, &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;0.22&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;, &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;dbus&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;, &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;D-BUS support&lt;span class=&quot;o&quot;&gt;])&lt;/span&gt;

AC_OUTPUT&lt;span class=&quot;o&quot;&gt;([&lt;/span&gt;
Makefile
po/Makefile.in
sample/Makefile
&lt;span class=&quot;o&quot;&gt;])&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;You should be familar with most of the above, therefore we will only discuss the
&lt;code&gt;XDT_I18N()&lt;/code&gt;, &lt;code&gt;XDT_CHECK_PACKAGE()&lt;/code&gt; and
&lt;code&gt;XDT_CHECK_OPTIONAL_PACKAGE()&lt;/code&gt;
macros here. If you are not familar with the basic autoconf and automake macros,
you should have a look at the &lt;a href=&quot;http://www.gnu.org/manual/manual.html&quot;&gt;GNU
manuals&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;XDT_I18N(LINGUAS [, PACKAGE])&lt;/h3&gt;

&lt;p&gt;This macro takes care of setting up everything for i18n support.&lt;/p&gt;

&lt;p&gt;If &lt;code&gt;PACKAGE&lt;/code&gt; isn&#39;t specified, it defaults to the package tarname; see
the description of &lt;code&gt;AC_INIT()&lt;/code&gt; for an explanation of what makes up
the package tarname. Normally, you don&#39;t need to specify &lt;code&gt;PACKAGE&lt;/code&gt;,
but you can stick with the default.&lt;/p&gt;

&lt;h3&gt;XDT_CHECK_PACKAGE(VARNAME, PACKAGE, VERSION [, ACTION-IF [, ACTION-IF-NOT]])&lt;/h3&gt;

&lt;p&gt;Checks if &lt;code&gt;PACKAGE&lt;/code&gt; &gt;= &lt;code&gt;VERSION&lt;/code&gt; is installed on the
target system, using the &lt;code&gt;pkg-config&lt;/code&gt; utility. If the
dependency is met, &lt;code&gt;VARNAME_CFLAGS&lt;/code&gt;, &lt;code&gt;VARNAME_LIBS&lt;/code&gt;,
&lt;code&gt;VARNAME_VERSION&lt;/code&gt; and &lt;code&gt;VARNAME_REQUIRED_VERSION&lt;/code&gt;
will be set and marked for substition. For example, if you specify &lt;code&gt;GTK&lt;/code&gt;
for the &lt;code&gt;VARNAME&lt;/code&gt; parameter, the variables &lt;code&gt;GTK_CFLAGS&lt;/code&gt;,
&lt;code&gt;GTK_LIBS&lt;/code&gt;, &lt;code&gt;GTK_VERSION&lt;/code&gt; and &lt;code&gt;GTK_REQUIRED_VERSION&lt;/code&gt;
will be set appropriately and substituted.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;VARNAME_REQUIRED_VERSION&lt;/code&gt; will be set to the value of
&lt;code&gt;VERSION&lt;/code&gt;. This is mostly useful to automatically
place the correct version information into the RPM &lt;code&gt;.spec&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;In addition, if the dependency is met, &lt;code&gt;ACTION-IF&lt;/code&gt; will
be executed if given.&lt;/p&gt;

&lt;p&gt;If the package check fails, &lt;code&gt;ACTION-IF-NOT&lt;/code&gt; will be
executed. If this parameter isn&#39;t specified, a diagnostic
message will be printed and the configure script will
be terminated with exit code 1.&lt;/p&gt;

&lt;h3&gt;XDT_CHECK_OPTIONAL_PACKAGE(VARNAME, PACKAGE, VERSION, OPTIONNAME, HELPSTRING [, DEFAULT])&lt;/h3&gt;

&lt;p&gt;Checks for an optional dependency on &lt;code&gt;PACKAGE&lt;/code&gt; &gt;= &lt;code&gt;VERSION&lt;/code&gt;.
&lt;code&gt;DEFAULT&lt;/code&gt; can be &lt;code&gt;&quot;yes&quot;&lt;/code&gt; or &lt;code&gt;&quot;no&quot;&lt;/code&gt; (defaults to
&lt;code&gt;&quot;yes&quot;&lt;/code&gt; if not specified) and controls whether configure should check this
dependency by default, or only if the user explicitly enables it using a command line switch.&lt;/p&gt;

&lt;p&gt;This macro automatically adds a commandline switch based on the &lt;code&gt;OPTIONNAME&lt;/code&gt;
parameter (&lt;code&gt;--enable-optionname&lt;/code&gt; and &lt;code&gt;--disable-optionname&lt;/code&gt;), which
allows the user to explicitly control whether this optional dependency should be
enabled or not. The &lt;code&gt;HELPSTRING&lt;/code&gt; parameter gives a brief(!) description
about this dependency.&lt;/p&gt;

&lt;p&gt;If the user chose to enable this dependency and the required package
was found, this macro defines the variable &lt;code&gt;VARNAME_FOUND&lt;/code&gt; and sets it
to the string &lt;code&gt;&quot;yes&quot;&lt;/code&gt;, in addition to the 4 variables set by
&lt;code&gt;XDT_CHECK_PACKAGE()&lt;/code&gt;.  But &lt;code&gt;VARNAME_FOUND&lt;/code&gt; will not be marked
for substition. Furthermore, a C preprocessor define &lt;code&gt;HAVE_VARNAME&lt;/code&gt; will be placed in
&lt;code&gt;config.h&lt;/code&gt; (or added to the cc command line, depending on your &lt;code&gt;configure.ac&lt;/code&gt;
content) and set to 1.&lt;/p&gt;

&lt;h2&gt;First run&lt;/h2&gt;

&lt;p&gt;Now that everything is in place we are ready for the first run. Therefore, go to the
toplevel directory of the project and execute the&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; xdt-autogen&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;command that comes with the developer tools. This will run all the required autotools (in our
case these are &lt;code&gt;glib-gettextize&lt;/code&gt;, &lt;code&gt;libtoolize&lt;/code&gt;, &lt;code&gt;aclocal&lt;/code&gt;,
&lt;code&gt;autoheader&lt;/code&gt;, &lt;code&gt;automake&lt;/code&gt; and &lt;code&gt;autoconf&lt;/code&gt;), and afterwards run
the generated &lt;code&gt;configure&lt;/code&gt; script.&lt;/p&gt;

&lt;p&gt;The next thing to do is to generate all language files specified with the &lt;code&gt;XDT_I18N()&lt;/code&gt;
macro (we&#39;ve only specified &lt;code&gt;de&lt;/code&gt; in our &lt;code&gt;configure.ac&lt;/code&gt;). Therefore execute
the following commands:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;po
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; make sample.pot
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; cp sample.pot de.po&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Now if you check &lt;code&gt;po/de.po&lt;/code&gt;, it will contain exactly one translatable string, the one
from &lt;code&gt;sample/main.c&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That&#39;s it, now you can simply run&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; make&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;in the projects toplevel directory in order to build your project for the first time.
Congratulations, you&#39;ve successfully completed the build framework setup.&lt;/p&gt;

&lt;p&gt;The source code for the sample project is available
&lt;a href=&quot;/files/source/xdt-introduction-sample.tar.gz&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For more details on the internal workings and the other available macros, check the M4 files
in the &lt;code&gt;m4macros/&lt;/code&gt; subdirectory of the Xfce Developer Tools distribution.&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
 </entry>
 
 <entry>
   <title type="html">No software patents in Europe</title>
   <link href="http://benediktmeurer.de/2005/07/06/no-software-patents-in-europe"/>
   <updated>2005-07-06T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/07/06/no-software-patents-in-europe</id>
   <content type="html">&lt;p&gt;Very good news. No software patents in the EU for now.&lt;/p&gt;
</content>
   
   <category term="software patents"/>
   
 </entry>
 
 <entry>
   <title type="html">Debian update</title>
   <link href="http://benediktmeurer.de/2005/07/06/debian-update"/>
   <updated>2005-07-06T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/07/06/debian-update</id>
   <content type="html">&lt;p&gt;Started to update the &lt;a href=&quot;http://os-works.com/&quot;&gt;os-cillation Debian packages&lt;/a&gt; to 4.2.2. Ubuntu guys should sync these once done. Unfortunately that takes a lot of time. Need to reevaluate the idea of a Xfce debian team, so others can help in maintaining the packages. Shouldn&#39;t be a problem now that we have SVN setup on espresso with fine-grained access control. Need to discuss with Auke.&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="oscillation"/>
   
   <category term="debian"/>
   
   <category term="ubuntu"/>
   
 </entry>
 
 <entry>
   <title type="html">4.2.2 done</title>
   <link href="http://benediktmeurer.de/2005/07/06/422-done"/>
   <updated>2005-07-06T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/07/06/422-done</id>
   <content type="html">&lt;p&gt;uhm, I shouldn&#39;t be awake. Nah, whatever. Updated all packages to 4.2.2. Not sure about the &lt;code&gt;xffm4&lt;/code&gt; package, I think Edscott changed something, but I&#39;m not in favour of figuring out what it was right now. The package looks ok in that &lt;code&gt;xffm&lt;/code&gt; still starts. Drop me a note if something broke. Also noticed that Erik released mousepad 0.2.2 some time ago - why did nobody tell me? - and the &lt;code&gt;mousepad&lt;/code&gt; package is also updated now. By the way, mousepad is really a very bad name. Try goggling for mousepad and you&#39;ll know why. ;-)&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="debian"/>
   
 </entry>
 
 <entry>
   <title type="html">Orage is better than Xfcalendar</title>
   <link href="http://benediktmeurer.de/2005/07/05/orage-is-better-than-xfcalendar"/>
   <updated>2005-07-05T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/07/05/orage-is-better-than-xfcalendar</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://www.xfce.org/~korbinus/index.php#id-200507051&quot;&gt;Mickael&lt;/a&gt;: Orage is a lot better than Xfcalendar. I never really liked that &lt;code&gt;xf&lt;/code&gt; prefix (it&#39;s ok and maybe even necessary for core desktop services, but not really nice for general applications).&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
 </entry>
 
 <entry>
   <title type="html">It just doesn&#39;t work(TM)</title>
   <link href="http://benediktmeurer.de/2005/07/05/it-just-doesnt-work"/>
   <updated>2005-07-05T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/07/05/it-just-doesnt-work</id>
   <content type="html">&lt;p&gt;I just spent some time reading through the recent &lt;i&gt;Why Linux won&#39;t work on the desktop&lt;/i&gt; and &lt;i&gt;The Linux desktop of the future&lt;/i&gt; stuff. &lt;b&gt;Just works(TM)&lt;/b&gt; seems to be the most important point today, and many projects claim to follow that idea. My experience is that most things &lt;b&gt;just work&lt;/b&gt; if &lt;i&gt;[long list of conditions skipped]&lt;/i&gt;.&lt;/p&gt;

&lt;p&gt;Playing the devils advocate, I think that things are even worse than before on the Unix/Linux desktop: While some time ago, a lot of stuff was very Linux specific and you had to port it yourself if you happen to run a Unix or a BSD system, today you have to run a specifc Linux distribution (at a specific version) to get a chance to have certain things running. So instead of being Linux specific, which is already not a good thing, stuff is now Linux distro vendor specific. A simple example: Try to get Mono into a usable state on a slightly out-of-date Debian system (yeah, I know, Debian is always a bit behind, but this is really just a bit behind the latest stable release for various reasons): It isn&#39;t trivial. It&#39;s just pain. Waste of time probably.&lt;/p&gt;

&lt;p&gt;And there are several other examples. HAL comes to mind here. The initial idea was very good. A platform independent hardware abstraction layer. But in it&#39;s current state you need to run a very specific version of the Linux kernel. No chance to get see this running on anything else in the not so far future (yeah, I know there&#39;s a &lt;code&gt;solaris/osspec.c&lt;/code&gt;, but if you look closely, it&#39;s just a dummy).&lt;/p&gt;

&lt;p&gt;I remember a time where the &lt;i&gt;vendor-independence&lt;/i&gt; was a big plus for the Unix/Linux desktop, and I remember a lot of people complaining about the dependency on Microsoft for the Windows products. Now, it looks like the &lt;i&gt;vendor-dependency&lt;/i&gt; is being ported from Windows to Linux.&lt;/p&gt;

&lt;p&gt;Sure you could say &lt;i&gt;&quot;The stuff will be ported at a later time&quot;&lt;/i&gt;, but let&#39;s be honest, Microsoft could tell exactly the same.&lt;/p&gt;

&lt;p&gt;I was very surprise to see that from the big two on the Unix/Linux desktop, KDE is far ahead of GNOME when you use it on a machine that doesn&#39;t run a product made by RedHat or Ximian/Novell. You get nearly 99.99% the same functionality with an old Linux/i386 system, a new Linux/i386 system, a Solaris/sparc and a FreeBSD/i386 machine. That&#39;s pretty amazing and very encouraging. It&#39;s nearly as platform-independent as Xfce. ;-) Although, to be fair, KDE provides a lot more services than Xfce, so you can say, the KDE people did a good job. With recent GNOME releases it&#39;s kinda frustrating, esp. if you just want to check something in Nautilus (e.g. to verify that Thunar will behave similar). For example, I don&#39;t see any removable devices on FreeBSD or on that older Linux machine, although Konqueror displays them. Even the Thunar prototype does that already in the BSD volume manager implementation, and it&#39;s really easy. Even CDE provides better volume management on Solaris than recent GNOME versions. Then the SMB module in GnomeVFS. I have no clue about SMB and CIFS, but even Xffm works way better than GNOME here. GNOME never sees the Windows machines during testing. And there are several other things that don&#39;t &lt;b&gt;just work&lt;/b&gt;.&lt;/p&gt;

&lt;p&gt;Now I&#39;m not a desktop user. I don&#39;t use a file manager. I mostly interact with applications running inside a terminal emulator. And of course, browser and mail reader. But I wasn&#39;t talking about myself. I was talking about the average user. And the average user won&#39;t be pleased to discover that &lt;b&gt;just works&lt;/b&gt; is bound to 100 conditions (atleast if his system does not fullfil 99 of these conditions).&lt;/p&gt;

&lt;p&gt;It may look like an advantage to Novell to ship something with their distribution, which doesn&#39;t easily run on other systems as well. But if you look back in time, that wasn&#39;t the way of the world so far. Imagine back in the days before the internet as you know it today, somebody would have come up with: &lt;i&gt;&quot;Hey, here&#39;s TCP/IP and there&#39;s the socket interface, which can be used to connect networks to form the internet. But, ehm, you&#39;ll need to run 4.2BSD to use it. You cannot get it to work on other systems. That&#39;s intentional. Everybody should run our beloved system.&quot;&lt;/i&gt; Doesn&#39;t sound like this would have worked, does it?&lt;/p&gt;

&lt;p&gt;It&#39;s more than ok if the first public version doesn&#39;t support all the operating systems out there. But it would be good if released software would run equally well on all supported systems. And in the case of GNOME: While the desktop is in reality just the core of C programs, most people also think of 3rd party stuff like Beagle, etc. as GNOME components, and it doesn&#39;t matter if you tell them that it&#39;s not part of the core and thereby not officially supported; they&#39;ll be disappointed to see that only half of &lt;i&gt;their GNOME&lt;/i&gt; works.&lt;/p&gt;

&lt;p&gt;To conclude (as usual, just my 2 cents, nothing that&#39;s neccesarily true): With the current direction, it is very doubtful that the Unix/Linux desktop can compete with Windows and OSX in the future. That&#39;s even independent of Microsoft and Apple. The problem is that people started to cut off their very own roots.&lt;/p&gt;
</content>
   
   <category term="linux"/>
   
   <category term="kde"/>
   
   <category term="gnome"/>
   
   <category term="xfce"/>
   
 </entry>
 
 <entry>
   <title type="html">Desktop notification (in reply to Chris)</title>
   <link href="http://benediktmeurer.de/2005/07/05/desktop-notification-in-reply-to-chris"/>
   <updated>2005-07-05T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/07/05/desktop-notification-in-reply-to-chris</id>
   <content type="html">&lt;p&gt;In reply to &lt;a href=&quot;http://www.chipx86.com/&quot;&gt;Christian&lt;/a&gt;&#39;s comment on my last blog entry:&lt;/p&gt;

&lt;p&gt;I read the &lt;a href=&quot;http://www.galago.info/specs/notification/0.6/t1.html&quot;&gt;spec&lt;/a&gt; right before writing the blog entry, and I basicly followed the discussion on xdg-list earlier.&lt;/p&gt;

&lt;p&gt;The spec covers some basics. But from my point of view, the focus of the &lt;i&gt;reference implementation&lt;/i&gt; and the spec is wrong.&lt;/p&gt;

&lt;p&gt;First of all, your reference implementation is the most important point for now, simply because that&#39;s what people see. You could write a perfect spec, people will always check your reference implementation first. So all oddities (really mainly the odds, not the bugs) will affect the acceptance of the spec. My feeling is that Galago is currently trying to catch people with those nice popup effects seen on other operating systems - but I don&#39;t follow that project very closely, so I may be wrong here. Still it is a problem for your project if developers (and users) see your project as &lt;i&gt;eye-candy&lt;/i&gt; only.&lt;/p&gt;

&lt;p&gt;Then, back on topic, the filtering issue. You really want to do filtering on the daemon side, because else if the client would filter events, those would never show up in the event log. And besides that, this is the only way to ensure that all the filter information is managed and stored in a single place. But to be able to allow useful and flexible filtering in the daemon, the client must provide as much data as possible. And in order to allow easy configuration, the client must also provide information about the &lt;i&gt;filter tags&lt;/i&gt;.&lt;/p&gt;

&lt;p&gt;The spec currently provides two tags for filtering: The notification type id and the urgency level (I&#39;d strongly suggest to provide more than 3 levels by default). The application name is pretty useless, as the spec explicitly states that this should be the formal name rather than a unique id. And formal names are not garantied to be unique and may change over time. The notification type id is a single string and thereby not suitable for non-trivial filtering. E.g. I can only say, that I&#39;d interested to know whenever an IM buddy goes online. I cannot say &lt;b&gt;Tell me when Harry goes online&lt;/b&gt; (sure, you could use something weird like &lt;code&gt;im.user.harry.online&lt;/code&gt;, but that&#39;s really only a work-around for a limitation in the system). Two criterions are simply not enough to perform useful filtering.&lt;/p&gt;

&lt;p&gt;Then, the configuration issue: If you want to do filtering in the daemon (and you really want to do this if you plan to support event logging), then there must be a way for clients to tell the daemon about the different &lt;i&gt;filter tags&lt;/i&gt; and the default settings, and at best also an interface to allow clients to change the settings easily. I proposed to use a simple XML file here, installed by every client that supports desktop notification, but that was just a suggestion, you could use any other file format. The file name would somehow include the application&#39;s unique id. You would also store thinks like the application icon and the sounds to play for a specific event and such within this file, which allows integration with desktop wide sound themes, etc.&lt;/p&gt;

&lt;p&gt;What really bugs me about the spec and the way this is started in GNOME currently is the fact that important issues like filtering get nearly no attention, but instead the focus is on minor details like the appearance (esp. since the spec explicitly states that &lt;i&gt;&quot;applications can generate passive popups&quot;&lt;/i&gt;, which somehow makes it less suitable for a general desktop notification spec). I&#39;d welcome if people would focus on the important parts first, and don&#39;t focus too much on details like how to display the messages (and there should be really more than one way to display notifications, atleast something non-disturbing like an icon in the systray).&lt;/p&gt;

&lt;p&gt;Note that these are just my 2 cents. I&#39;m not an expert in desktop notification, nor do I have any time or interested to work on the spec or the implementation (well, maybe an implementation for Xfce, once there&#39;s a usable spec, but not this year). So you may disregard my comments silently. But I really strongly recommend to revise the spec, because else I&#39;m pretty sure, this won&#39;t be the standard for a long time.&lt;/p&gt;
</content>
   
   <category term="gnome"/>
   
 </entry>
 
 <entry>
   <title type="html">Icon theme cache</title>
   <link href="http://benediktmeurer.de/2005/07/04/icon-theme-cache"/>
   <updated>2005-07-04T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/07/04/icon-theme-cache</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://blog.xfce.org/index.php?p=116&quot;&gt;Edscott&lt;/a&gt;, how about using the &lt;code&gt;icon-theme.cache&lt;/code&gt; generated by &lt;code&gt;gtk-update-icon-cache&lt;/code&gt; instead? There are several advantages: First - and foremost - the cache is shared by all Gtk+ apps and therefore it&#39;s likely that most parts of the cache are already loaded. Second, both the image data and meta-data is contained within the icon cache, and thereby safes you a lot of disk I/O in the common case. And last but  not least, there&#39;s already an implementation of the icon cache, namely &lt;code&gt;GtkIconTheme&lt;/code&gt;.&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
 </entry>
 
 <entry>
   <title type="html">Desktop notification</title>
   <link href="http://benediktmeurer.de/2005/07/04/desktop-notification"/>
   <updated>2005-07-04T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/07/04/desktop-notification</id>
   <content type="html">&lt;p&gt;Really, I don&#39;t get this. The &lt;a href=&quot;http://blogs.gnome.org/view/rodrigo/2005/07/04/0&quot;&gt;GNOME guys&lt;/a&gt; started the &lt;a href=&quot;http://svn.galago.info/trunk/libnotify/&quot;&gt;libnotify&lt;/a&gt; integration (once again?), which lead to controversial discussion.&lt;/p&gt;

&lt;p&gt;I wonder why things have to be that complicated all the time. Why not simply design a desktop notification system based on the ideas used in system notification - namely &lt;code&gt;syslog&lt;/code&gt;. Speaking from the flexibility&#39;s point-of-view. You have different, pre-defined levels of importance. And you have various services, like Thunderbird or the battery monitor, that want to present notifications. Now the user can choose based on the level and the service, how to present the notification (e.g. popup notification for events from the battery monitor, and simple, non-disturbing, systray notification for Thunderbird events). All events will be logged and it&#39;s possible for the user to access/clear this log. In addition, you could allow the services to &lt;i&gt;tag&lt;/i&gt; their messages using simple strings. For example with an instant messenger, if you&#39;re only interested about online/offline popup notifications about your friend Harry, you&#39;d add a rule to the notification server saying it should display a popup for notifications tagged with &lt;code&gt;&quot;online-state-changed&quot;, &quot;Harry&quot;&lt;/code&gt;. For easier usage, the notification server should allow its connected services to also modify certain settings. So, all the user would need to do is to right-click on Harry&#39;s buddy icon and toggle &lt;b&gt;Tell me when Harry is online/offline&lt;/b&gt;.&lt;/p&gt;

&lt;p&gt;Of course, sane defaults should be choosen for the different services. Services would need to install an XML (or whatever) file to tell the notification server what they do, which events they provide and whats the default way of notification.&lt;/p&gt;

&lt;p&gt;This way you&#39;ll have a very flexible, but yet easy to use system. The average user will probably just stay with the (sane) defaults, while the more advanced users will reconfigure certain aspects. And the logging of the events ensures that you don&#39;t miss events while you&#39;re away.&lt;/p&gt;

&lt;p&gt;Does KISS mean nothing in today&#39;s open source world?&lt;/p&gt;
</content>
   
   <category term="gnome"/>
   
 </entry>
 
 <entry>
   <title type="html">Where do you want to go, Gnome?</title>
   <link href="http://benediktmeurer.de/2005/07/02/where-do-you-want-to-go-gnome"/>
   <updated>2005-07-02T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/07/02/where-do-you-want-to-go-gnome</id>
   <content type="html">&lt;p&gt;Just discovered on the nautilus mailinglist:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.jamiemcc.pwp.blueyonder.co.uk/nautilus-places.png&quot;&gt;&lt;img src=&quot;http://www.jamiemcc.pwp.blueyonder.co.uk/nautilus-places.png&quot; border=&quot;0&quot; width=&quot;90%&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Looks familar, eh? The full thread is &lt;a href=&quot;http://mail.gnome.org/archives/nautilus-list/2005-June/msg00185.html&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
</content>
   
   <category term="gnome"/>
   
   <category term="thunar"/>
   
   <category term="nautilus"/>
   
 </entry>
 
 <entry>
   <title type="html">Freedom</title>
   <link href="http://benediktmeurer.de/2005/07/02/freedom"/>
   <updated>2005-07-02T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/07/02/freedom</id>
   <content type="html">&lt;p&gt;Just read &lt;a href=&quot;http://www.heise.de/tr/artikel/60752/&quot;&gt;this&lt;/a&gt; article (german). Wow. Best &lt;a href=&quot;http://www.heise.de/&quot;&gt;heise&lt;/a&gt; article I&#39;ve read so far.&lt;/p&gt;
</content>
   
   <category term="heise"/>
   
 </entry>
 
 <entry>
   <title type="html">Thunar Firefox-like location bar</title>
   <link href="http://benediktmeurer.de/2005/06/28/small-deb-update"/>
   <updated>2005-06-28T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/06/28/small-deb-update</id>
   <content type="html">&lt;p&gt;I decided to upgrade the currently available libexo debian package to revision 85, so Ubuntu/Debian users do not need to compile libexo themselves in order to run the Thunar mockups or the currently available snapshots. The API shouldn&#39;t break during the next weeks, so you&#39;re mostly safe to upgrade.&lt;/p&gt;

&lt;p&gt;And while I was at it, I also updated the Xfmedia package to the latest 0.9.0svn snapshot, so users of that package are now able to also enjoy the new jump-to-file thingy - which I still think is very annoying, esp. with large playlists, where the tree model switching causes ugly flickering, but Brian likes it that way currently, so you&#39;ll have to live with it or use another media player. ;-)&lt;/p&gt;

&lt;p&gt;I may update some of the Xfce core packages as well during the week. Most of the current trunk stuff is pretty stable. Maybe that stops people from sending me mails, asking when the packages will be updated next time. Nah, but seriously, with 4.2.1.1 in Ubuntu universe and 4.2.2 in Debian experimental, it&#39;s time to think about 4.3 now.&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
   <category term="exo"/>
   
   <category term="oscillation"/>
   
 </entry>
 
 <entry>
   <title type="html">Qt4</title>
   <link href="http://benediktmeurer.de/2005/06/28/qt4"/>
   <updated>2005-06-28T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/06/28/qt4</id>
   <content type="html">&lt;p&gt;So Trolltech finally released Qt4 today, and their servers are nearly unreachable all day. We&#39;ll most probably stay with Qt3 for a long time tho, as it would be too costly to upgrade to Qt4. Even trivial programs take a lot of time to migrate, and we have way too much non-trivial, partly plattform-dependent code. Nevertheless we checked the new Qt4 today. What makes me wonder is that in all the announcements and relnotes, there&#39;s not much mention of the new accessibility support of Qt4, which is IMHO the most important addition to Qt (besides the model/view separation).&lt;/p&gt;
</content>
   
   <category term="qt"/>
   
 </entry>
 
 <entry>
   <title type="html">Terminal day</title>
   <link href="http://benediktmeurer.de/2005/06/27/terminal-day"/>
   <updated>2005-06-27T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/06/27/terminal-day</id>
   <content type="html">&lt;p&gt;Finally came around to fix some long standing issues for Terminal. While profiling stuff I found out that VTE uses around 24M data memory to manage 13 VteTerminal widgets, which is really a &lt;b&gt;lot&lt;/b&gt; of memory.&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="terminal"/>
   
 </entry>
 
 <entry>
   <title type="html">And then there was trash...</title>
   <link href="http://benediktmeurer.de/2005/06/22/and-then-there-was-trash"/>
   <updated>2005-06-22T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/06/22/and-then-there-was-trash</id>
   <content type="html">&lt;p&gt;The &lt;code&gt;ThunarFile&lt;/code&gt; and &lt;code&gt;ThunarFolder&lt;/code&gt; interfaces are now completely independent of the specific implementation. This makes it possible to support various different &lt;i&gt;file systems&lt;/i&gt; with Thunar. As a first candidate, I implemented a first draft for the &lt;i&gt;Trash vfolder&lt;/i&gt; today, which means Thunar is now able to display the contents of the trash cans currently connected to your system - well, in theory it is, but the trash manager doesn&#39;t handle foreign trash cans currently, but it will soon. :-)&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/2005/thunar-trash-20050622.png&quot;&gt;&lt;img src=&quot;/images/2005/thunar-trash-20050622.png&quot; width=&quot;90%&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Diving into trashed directories isn&#39;t supported yet, but shouldn&#39;t be a problem with the current interfaces.&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
 </entry>
 
 <entry>
   <title type="html">Signals</title>
   <link href="http://benediktmeurer.de/2005/06/21/signals"/>
   <updated>2005-06-21T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/06/21/signals</id>
   <content type="html">&lt;p&gt;One thing missing from GObject and esp. the signal system is that there&#39;s no way to control the order in which signal handlers will be fired except the &lt;code&gt;after&lt;/code&gt; flag, which isn&#39;t very powerful either. Sure, 99.99% of all applications will never need to be able to have fine-grained control about the signal invocation order, but then there&#39;s always atleast one application, that needs this feature in order to avoid other weird work-arounds.&lt;/p&gt;

&lt;p&gt;Thunar is such an application and the use-case is pretty simple: We have a &lt;code&gt;ThunarIconFactory&lt;/code&gt; class in Thunar, which is used to load icons and perform some kind of caching on the icons, so you don&#39;t need to grab them from the disk everytime. Now if the currently selected icon theme changes, the icon cache must be cleared &lt;b&gt;before&lt;/b&gt; other modules get informed about the icon theme, as they&#39;ll immediatly perform an icon lookup. So, the order in which the signal handlers are invoked matters. Unfortunately you have don&#39;t necessarily have control about the modules, it can be code in Gtk+ or other libraries. Sure you could say, the icon factory is the first object I create and so it&#39;s signal handler will always be fired first, but that&#39;s really messy, as - according to murphy&#39;s law - somebody will forget about this condition at some time (no matter how much comments you add to that code) and you&#39;ll have a very, very hard to find bug, because you simply don&#39;t think about that condition in the first place.&lt;/p&gt;

&lt;p&gt;As a work-around, and that&#39;s what we&#39;re now used with Thunar, you can connect a signal emission hook to the &lt;code&gt;&quot;changed&quot;&lt;/code&gt; signal of the &lt;code&gt;GtkIconTheme&lt;/code&gt; class. Emission hooks are garantied to be run before any signal handler is fired (the default handler may run first, depending on the signal flags, but that&#39;s no problem for us). Ok, this sounds cool so far. Unfortunately emission hooks aren&#39;t bound to instances, but to types. And so whenever the &lt;code&gt;&quot;changed&quot;&lt;/code&gt; signal is run on &lt;b&gt;any&lt;/b&gt; instance of &lt;code&gt;GtkIconTheme&lt;/code&gt;, the emission hook will be fired. While in theory this looks like a bad thing, in practice with the icon theme class, this is not a big deal, as you only have one icon theme per screen (or maybe even only the global icon theme) and so the worst thing that can happen here is that you loose the icon cache for all screens if you change the icon theme (which is not really a common action).&lt;/p&gt;

&lt;p&gt;So, problem solved. But the solution is pretty hacky, tho no real need to break GObject. Just wondering...&lt;/p&gt;

&lt;p&gt;And just right now Gtk+ 2.7.0 was announced with lots of breakage - have fun fixing your custom widgets if you used to use Xlib directly. ;-)&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
 </entry>
 
 <entry>
   <title type="html">Hierarchical Spatial</title>
   <link href="http://benediktmeurer.de/2005/06/21/hierarchical-spatial"/>
   <updated>2005-06-21T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/06/21/hierarchical-spatial</id>
   <content type="html">&lt;p&gt;According to &lt;a href=&quot;http://www.murrayc.com/blog/tech/2005-06-21-15-40&quot;&gt;murrac&lt;/a&gt;, patches have been applied to Nautilus CVS to implement a tree view on a spatial view similar to what is possible with Aqua/Classic Finder.  Judging from the &lt;a href=&quot;http://www.gnome.org/~martink/2005/stuff/Screenshot-nautilus-hierarchical.png&quot;&gt;screenshot&lt;/a&gt; this looks very similar to what xffm (and xftree in the Xfce3 days) did and still does if started with &lt;code&gt;xffm&lt;/code&gt;. Sure the UI looks cleaner than the default xffm UI, but at the core its the same concept. So, if that&#39;s what is needed to stop people complaining about the spatial Nautilus, why didn&#39;t they use xffm instead (probably even sending some patches to edscott to polish the default UI)?&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
 </entry>
 
 <entry>
   <title type="html">Trash me, baby</title>
   <link href="http://benediktmeurer.de/2005/06/19/trash-me-baby"/>
   <updated>2005-06-19T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/06/19/trash-me-baby</id>
   <content type="html">&lt;p&gt;Postponed all work on the icon view for now, and been working on the volume manager and the trash implementation for the last 2 days. As initially planned, the &lt;code&gt;ThunarFile&lt;/code&gt; class is now an abstract base class and the &lt;code&gt;ThunarFolder&lt;/code&gt; class will be turned into an interface or an abstract base class as well. In addition, the &lt;code&gt;ThunarFile&lt;/code&gt; class won&#39;t export the associated &lt;code&gt;ThunarVfsInfo&lt;/code&gt; (which is now only associated with &lt;code&gt;ThunarLocalFile&lt;/code&gt; instances). This way we don&#39;t limit ourselves to file implementations, which are more or less based on &lt;code&gt;stat(2)&lt;/code&gt; directly. For example, there will be virtual files, like the trash can itself, and &lt;i&gt;forward&lt;/i&gt; files like the trashed files. You could even imagine another class that handles locations other than &lt;code&gt;file://&lt;/code&gt; and &lt;code&gt;trash://&lt;/code&gt; using GnomeVFS, to provide support for network file systems and such. But that is an optional gimmick and not important right now.&lt;/p&gt;

&lt;p&gt;While working on the trash classes, I was testing the basics when I realized that the far-from-being-complete implementation of the &lt;code&gt;ThunarTrashFile&lt;/code&gt; and the not yet adjusted &lt;code&gt;ThunarFolder&lt;/code&gt; class lead to an interesting effect:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/2005/thunar-trash-b0rked2.png&quot;&gt;&lt;img src=&quot;/images/2005/thunar-trash-b0rked2.png&quot; width=&quot;90%&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I was pretty confused to see this &lt;i&gt;working&lt;/i&gt; on first sight. My bet was that it would crash right away. But of course, it had to work that way. Anyway, not the expected behaviour from a user&#39;s point of view, but it looks just too weird to not post the screenshot here.&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
 </entry>
 
 <entry>
   <title type="html">Linux for losers</title>
   <link href="http://benediktmeurer.de/2005/06/18/linux-for-losers"/>
   <updated>2005-06-18T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/06/18/linux-for-losers</id>
   <content type="html">&lt;p&gt;A friend of mine pointed me to an interesting &lt;a href=&quot;http://www.forbes.com/intelligentinfrastructure/2005/06/16/linux-bsd-unix-cz_dl_0616theo.html&quot;&gt;article&lt;/a&gt; today, which on first sight looked like just another useless Linux vs. BSD article, esp. since it quotes Theo De Raadt, who was never known for being very objective.  But De Raadt points out some real problems with the Linux development model (everybody that has ever worked on the kernel or a non-trivial driver will be aware of these problems). Unfortunately, De Raadt&#39;s diction is very bad, as usual, and so it&#39;s unlikely that any of the Linux guys will pay much attention.&lt;/p&gt;

&lt;p&gt;But the problems with quality assurance is not limited to Linux in the open source world. Many OSS hackers still seem to believe, that &lt;i&gt;&quot;if it runs, it&#39;s good&quot;&lt;/i&gt;, which is obviously not the case.  There&#39;s a common misbelieve that the &lt;b&gt;crux&lt;/b&gt; in being part of the OSS world is knowledge about &lt;i&gt;coding&lt;/i&gt; (it&#39;d rather use the term &lt;i&gt;hacking&lt;/i&gt;). From my experience, &lt;i&gt;coding&lt;/i&gt; was always (and is still) the easiest part of the story. The &lt;b&gt;hard work&lt;/b&gt; is to figure out what to &lt;i&gt;code&lt;/i&gt;, and how to organize the various modules, to make it fit into the whole picture, and once the implementation is done, verify that the implementation covers all use cases and performs well. This is the shortest possible definition of my understanding of how to develop high-quality software.&lt;/p&gt;

&lt;p&gt;But in order to develop the way described above, you need to setup clear goals for your projects. And this is exactly the point where Linux and many other OSS projects lose. They concentrate too much on providing an &lt;i&gt;universal&lt;/i&gt; solution or on adding a new feature as soon as possible, and so improvements happens by fluke many times, not as a result of structured development and quality assurance. And even if they&#39;re pushed by big players like IBM at the moment, this kind of development won&#39;t work in the long run.&lt;/p&gt;

&lt;p&gt;I&#39;m not trying to blame Linux/OSS hackers, instead I strongly invite people to think about their development models and their understanding of open source. Take the chance to develop high quality software in your spare time; many of us will be forced to develop low quality software in our daily job anyways (yannow that money thing), so don&#39;t you think you could do better in your spare time? Of course it takes time and the feeling of success won&#39;t show up that early, but in the end you can be proud of your work.&lt;/p&gt;

&lt;p&gt;Of course I could also be completely wrong here, and my understanding of open source is simply escapist.&lt;/p&gt;
</content>
   
   <category term="linux"/>
   
   <category term="openbsd"/>
   
 </entry>
 
 <entry>
   <title type="html">All quiet on the western front...</title>
   <link href="http://benediktmeurer.de/2005/06/18/all-quiet-on-the-western-front"/>
   <updated>2005-06-18T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/06/18/all-quiet-on-the-western-front</id>
   <content type="html">&lt;p&gt;It&#39;s been very quiet in the Xfce community lately. The traffic on &lt;code&gt;thunar-dev&lt;/code&gt; and &lt;code&gt;xfce4-dev&lt;/code&gt; is amazingly low. I&#39;m currently the only one to work on Thunar, tho Alexander, Jean-Francois and Brian have expressly declared their interest to help earlier. In addition the Thunar website project seems to be fast asleep.&lt;/p&gt;

&lt;p&gt;Well, I&#39;m not in a hurry. I&#39;m wondering because 3-4 weeks ago, many people were offended at me for taking a break from the public. And now I&#39;m still working on it alone, like I did 3-4 weeks ago. Maybe the debate was just full of hot air.&lt;/p&gt;

&lt;p&gt;Concerning the Xfce Debian packages: We receive quite a lot of mails recently, asking for the status of the Xfce Debian packages. The Xfce 4.2 stable branch is now maintained by Ubuntu people. We will provide new packages once Xfce 4.4.0 enters ALPHA/BETA stage. People using plain Debian should consider upgrading to Ubuntu or using the so called &lt;i&gt;official&lt;/i&gt; Xfce Debian packages (dunno how up-to-date or usable they are, tho).&lt;/p&gt;

&lt;p&gt;You could also try the Xfce 4.2.2 packages for Debian, prepared by Mario Izquierdo, which are based on our Xfce 4.2.1.1 packages. His repository is available &lt;a href=&quot;http://idefix.eup.uva.es/xfce-4.2.2/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
 </entry>
 
 <entry>
   <title type="html">Testing GtkIconView 2.8</title>
   <link href="http://benediktmeurer.de/2005/06/16/testing-gtkiconview-28"/>
   <updated>2005-06-16T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/06/16/testing-gtkiconview-28</id>
   <content type="html">&lt;p&gt;I refactored the new GtkIconView into an ExoIconView implementation, added the required magic to ExoCellRendererEllipsizedText and did some testing. The result was disappointing: It is very slow for large models (1000 items and above), esp. in resizing and rubberbanding, even on a fast machine (with Render hw accel). I imagine that it would be frustrating to use Thunar with this icon view on a slightly slower machine. Besides that it contains some tricky rendering bugs (one of which looks pretty similar to a bug I&#39;ve also in my own experimental icon view, where the focus rect is not cleared properly sometimes).&lt;/p&gt;

&lt;p&gt;I&#39;m sure there&#39;s a lot of potential for optimization in the new GtkIconView, but since the source file contains about 9000 lines now and internals have changed quite a bit, this would waste a lot of time and energy. And so, I&#39;ll finish the work on the &lt;i&gt;old&lt;/i&gt; ExoIconView, which is reasonably fast already, even with very large models.&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
   <category term="exo"/>
   
 </entry>
 
 <entry>
   <title type="html">Icon view renderer</title>
   <link href="http://benediktmeurer.de/2005/06/16/icon-view-renderer"/>
   <updated>2005-06-16T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/06/16/icon-view-renderer</id>
   <content type="html">&lt;p&gt;I just updated my gtk+ sandbox and, wow, the new GtkIconView in gtk 2.8 does exactly what is required (atleast from a first look), without breaking the API, thanks to RedHat&#39;s Matthias Clasen. The new icon view uses cairo for rendering, which of course leads to flickering and rendering errors if combined with the &lt;i&gt;good old way&lt;/i&gt; of rendering things in GDK, since the cell renderers in a Gtk+ 2.4/2.6 installation still use plain Xlib functions (through the GDK wrappers). But this is more or less easy to fix, as we can use GDK functions instead of cairo functions (probably Xrender for the rubberband... tho, unfortunately the most interesting function in GDK here isn&#39;t public).&lt;/p&gt;

&lt;p&gt;In addition, there are some problems with the cell renderer text API in gtk 2.4/2.6, which doesn&#39;t include the &lt;code&gt;wrap-mode&lt;/code&gt; and &lt;code&gt;wrap-width&lt;/code&gt; properties. But these properties are required to layout the text properly. Again, not necessarily hard to work around; if everything else fails, the ExoCellRendererEllipsizedText class will be extended to support the text wrapping properties and will be used as default text renderer.&lt;/p&gt;

&lt;p&gt;The more important problem is that my performance patch for the old ExoIconView won&#39;t work with the new GtkIconView class, atleast not without major rework. The patch basicly replaces the GList-based item handling with a faster array based solution, which reduces both heap fragmentation and reduces time spend in malloc and time spend in loops looking up the item for a given index. The next step was to use a static item layout, which makes things like looking up the item for a position or determining the items within a rubberband selection very fast (tho, that was still work-in-progress and didn&#39;t really work). Well, I guess, I&#39;ll first import the new icon view and stuff into libexo and do some testing on it, and then we&#39;ll see how important it is to forward-port the performance patches.&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
   <category term="exo"/>
   
 </entry>
 
 <entry>
   <title type="html">Icon view item renderer</title>
   <link href="http://benediktmeurer.de/2005/06/15/icon-view-item-renderer"/>
   <updated>2005-06-15T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/06/15/icon-view-item-renderer</id>
   <content type="html">&lt;p&gt;One of the first things that perplexed me when I looked at GtkIconView (back in the gtk 2.5 days) was &lt;i&gt;&quot;why the hell is there no GtkIconViewItemRenderer?&quot;&lt;/i&gt;. I guess somebody was worried about performance and therefore the renderer was hardcoded into the first icon view implementations (which is of course not very flexible and can lead to weird work-arounds on the model side). Unfortunately, I hoped that over the time somebody else would notice the problem and magically fix it for the stable 2.6 icon view.&lt;/p&gt;

&lt;p&gt;Now, that was not the case. Gtk+ 2.6 API has stabelized and no &lt;i&gt;GtkIconViewItemRenderer&lt;/i&gt;. We&#39;ll have to implement our own renderer-based icon view with &lt;i&gt;ExoIconView&lt;/i&gt;, which means that once that is done, not only the icon view implementation in libexo will differ from gtk+ (there are some major performance improvements pending for libexo 0.3.1 or 0.3.2), but also will &lt;i&gt;ExoIconView&lt;/i&gt; provide the programmer with a completely different interface.&lt;/p&gt;

&lt;p&gt;We really need this flexibility for the icon view in thunar, in order to be able to render emblems, etc., in a simple and fast way. The alternatives would be either a full-featured canvas widget (like Nautilus does with EelCanvas) or to pre-generate pixbufs with the embedded emblems in the list model, which would mean unnecessarily creating and copying a lot of pixbuf stuff. Both alternatives are certainly not very well suited for a fast (and lightweight) file manager.&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
   <category term="exo"/>
   
 </entry>
 
 <entry>
   <title type="html">Volume Manager (2nd)</title>
   <link href="http://benediktmeurer.de/2005/06/14/volume-manager-2nd"/>
   <updated>2005-06-14T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/06/14/volume-manager-2nd</id>
   <content type="html">&lt;p&gt;I tried to come up with the basic requirements for the volume manager interface and did some prototyping with the BSD implementation. My mail to thunar-dev, which summarizes the results of my current research, is still pending - I guess I shouldn&#39;t attach source code to mails. :-)&lt;/p&gt;

&lt;p&gt;Anyways, I think I caught the basic requirements for Thunar 1.0:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/2005/ThunarVFS-volume-manager-requirements-20050613.png&quot;&gt;&lt;img src=&quot;/images/2005/ThunarVFS-volume-manager-requirements-20050613.png&quot; width=&quot;90%&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The question that remains is whether the volume manager should be implemented in the Thunar binary or as separate D-BUS system service. There are pros and contras for both solutions. If you feel like you have something to say about this topic, wait for my mail to arrive on thunar-dev. :-)&lt;/p&gt;

&lt;p&gt;The prototyping with the interface described by the requirements above was satisfactorily so far. I hacked up a simple interface to the volume manager for the favourites pane and it now shows all removable devices, whose medium status is active, like in the screenshot below:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/2005/thunar-volume-manager-20050613.png&quot;&gt;&lt;img src=&quot;/images/2005/thunar-volume-manager-20050613.png&quot; width=&quot;90%&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hopefully the discussion on the volume manager will come to a useful result soon and work on the trash system design can start.&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
   <category term="freebsd"/>
   
 </entry>
 
 <entry>
   <title type="html">Volume Manager</title>
   <link href="http://benediktmeurer.de/2005/06/12/volume-manager"/>
   <updated>2005-06-12T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/06/12/volume-manager</id>
   <content type="html">&lt;p&gt;After spending some time improving the ThunarVfsURI internals (handling schemes other than &lt;code&gt;file://&lt;/code&gt;, performance improvements and the like), I took the time to refine the basic requirements for the volume manager. The volume manager provides core functionality required for the trash system to work (esp. since my current plan for 1.0 excludes trashing to the &lt;em&gt;&quot;home trash&quot;&lt;/em&gt; as fallback).&lt;/p&gt;

&lt;p&gt;From the high-level view, the volume manager module looks pretty simple:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/2005/thunar-vfs-volumes-20050611.png&quot;&gt;&lt;img src=&quot;/images/2005/thunar-vfs-volumes-20050611.png&quot; width=&quot;90%&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The main goal is to provide a small interface, to support many different backends, but still includes all the functionality required for the upper layers. Back in 2003, I rewrote the core of the fstab plugin for xffm with support for many different platforms, so the basic code (which now also includes a few bugfixes) is there. We could also add HAL support later, but since HAL is only supported on Linux and isn&#39;t widely used currently, this has very low priority (maybe even a TODO item for Thunar 2.0).&lt;/p&gt;

&lt;p&gt;The important work for now is to define an interface to the volume manager, that allows the trash system to query the list of active trash cans (and also get notified once a new trash can is online) and the favourites view to display the list of removable devices. The favourites view also requires the ability to mount and umount/eject devices.&lt;/p&gt;

&lt;p&gt;By the way, I&#39;m looking for a term to describe the &quot;eject/umount&quot; action in the GUI. While &quot;eject&quot; is fine for CDs, it&#39;s simply wrong for other removable media types, such as floppies or usb sticks - imagine an USB slot with the ability to fire off usb sticks. ;-)&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
 </entry>
 
 <entry>
   <title type="html">Favourites</title>
   <link href="http://benediktmeurer.de/2005/06/11/favourites"/>
   <updated>2005-06-11T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/06/11/favourites</id>
   <content type="html">&lt;p&gt;I have a more or less working prototype for the ThunarFavourites module now (well, it currently works a little bit different from the shortcuts list in GtkFileChooser, but I&#39;m not going to care for that now). You can add favourites using DnD from every DragSource that supports &lt;code&gt;text/uri-list&lt;/code&gt; (e.g. from the location buttons or another file manager such as Nautilus), or reorder favourites internally. There&#39;s no way to remove favourites currently (except editing &lt;code&gt;~/.gtk-bookmarks&lt;/code&gt; manually of course), but that&#39;s not important for now.  All the low-level stuff in ThunarFavouritesModel is connected properly now. So the next step is to add some more stuff to the ThunarIconView GUI, and then I&#39;ll be ready to continue work on the low-level stuff, esp. the VFS Monitor and the trash system (unfortunately nobody volunteered to help with the trash system).&lt;/p&gt;

&lt;p&gt;Note that this doesn&#39;t mean, that the prototype can do anything useful now; it&#39;s just in a state where it can be used to test the underlying modules from the GUI, not only from automated test suites.&lt;/p&gt;

&lt;p&gt;On the usability front, Erik and David seem to be serious about the &lt;em&gt;usability team&lt;/em&gt; which will be a real win for Thunar - and probably for Xfce as well, tho it was a bit problematic in the past with usability suggestions, the last failed attempt from Eugenia comes to mind here. ;-)&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
 </entry>
 
 <entry>
   <title type="html">Perl guru wanted</title>
   <link href="http://benediktmeurer.de/2005/06/10/perl-guru-wanted"/>
   <updated>2005-06-10T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/06/10/perl-guru-wanted</id>
   <content type="html">&lt;p&gt;os-cillation is looking for a Perl guru to take part in a bigger project. So, in case you are looking for an interesting job and live in Siegen, Germany (or near to Siegen), send a mail to &lt;a href=&quot;mailto:info@os-cillation.com&quot;&gt;info@os-cillation.com&lt;/a&gt;.&lt;/p&gt;
</content>
   
   <category term="os-cillation"/>
   
 </entry>
 
 <entry>
   <title type="html">Another website mockup</title>
   <link href="http://benediktmeurer.de/2005/06/10/another-website-mockup"/>
   <updated>2005-06-10T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/06/10/another-website-mockup</id>
   <content type="html">&lt;p&gt;Benjamin Muskalla came up with another website mockup today.  It&#39;s clean and simple (the side pane is a bit busy probably, but that could be optimized). The mockup is available &lt;a href=&quot;http://thunar.xfce.org/mockups/benjamin.muskalla/thunar/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
 </entry>
 
 <entry>
   <title type="html">My window manager is faster than yours</title>
   <link href="http://benediktmeurer.de/2005/06/09/my-window-manager-is-faster-than-yours"/>
   <updated>2005-06-09T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/06/09/my-window-manager-is-faster-than-yours</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://enlightenment.org/&quot;&gt;Enlightenment&lt;/a&gt;&#39;s &lt;a href=&quot;http://www.rasterman/&quot;&gt;Carsten Haitzler&lt;/a&gt; (the &lt;em&gt;rasterman&lt;/em&gt;) came up with a benchmark about 2 weeks ago, that was meant to measure the performance of today&#39;s most popular window managers for X11. Surprise, suprise, E17 is on top of both lists.&lt;/p&gt;

&lt;p&gt;His &lt;em&gt;benchmark&lt;/em&gt; tool measures both the throughput of a window manager (mapping windows and testing the time taken by the window manager) and the response time (measuring the time between the XMapWindow request and the map to be done). The &lt;em&gt;benchmark&lt;/em&gt; itself is well done and ok. Unfortunately, the result tells nothing about the daily use of a window manager, tho.&lt;/p&gt;

&lt;p&gt;But it&#39;s good to know that there&#39;s E17, just in case I&#39;ll ever need a window manager that can handle 260 window mapping requests per second.&lt;/p&gt;

&lt;p&gt;The article itself is definitely a good marketing joke to make people aware of E17, but not a serious benchmark for common use-cases of a window manager. And indeed, it works pretty well: E17 will gain a lot of new clueless users thanks to this article (maybe even some smart users, who just came to know E17 by this article).&lt;/p&gt;
</content>
   
   <category term="e17"/>
   
 </entry>
 
 <entry>
   <title type="html">Location buttons</title>
   <link href="http://benediktmeurer.de/2005/06/08/location-buttons"/>
   <updated>2005-06-08T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/06/08/location-buttons</id>
   <content type="html">&lt;p&gt;People tend to prefer pictures, so screenshot first:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/2005/thunar-devel-20050608.png&quot;&gt;&lt;img src=&quot;/images/2005/thunar-devel-20050608.png&quot; width=&quot;90%&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On the informative side, I redefined the basic UI interfaces, and now all navigational UI elements in a ThunarWindow will implement the ThunarNavigator interface. In addition, there are separate interfaces for elements that can be placed in the side pane and for elements that provide a location bar. This makes support for plugins in this area very easy. The main view does not implement ThunarNavigator currently, because it needs special treatment to get proper error handling (e.g. if a user tries to enter a directory, which he&#39;s not allowed to enter, the window should display an error message and fallback to another directory, and this must be performed by exactly one module, the ThunarWindow, and so the ThunarWindow must perform the initial opendir on the folder). In addition, there must be async error support for the main view to properly support error handling with the ThunarVfsMonitor module.&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
 </entry>
 
 <entry>
   <title type="html">Website mockups</title>
   <link href="http://benediktmeurer.de/2005/06/05/website-mockups"/>
   <updated>2005-06-05T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/06/05/website-mockups</id>
   <content type="html">&lt;p&gt;Henrik Andersen and Nick Schermer came up with two mockups for a Thunar website: Henrik&#39;s mockup can be seen &lt;a href=&quot;http://www.freewebs.com/halol/thunar/index.html&quot;&gt;here&lt;/a&gt;, Nick&#39;s mockup is &lt;a href=&quot;http://home.quicknet.nl/qn/prive/nickschermer/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
 </entry>
 
 <entry>
   <title type="html">Just another screenshot</title>
   <link href="http://benediktmeurer.de/2005/06/05/just-another-screenshot"/>
   <updated>2005-06-05T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/06/05/just-another-screenshot</id>
   <content type="html">&lt;p&gt;Spent the day implementing additional parts of Thunar&#39;s core.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/2005/thunar-devel-20050605.png&quot;&gt;&lt;img src=&quot;/images/2005/thunar-devel-20050605.png&quot; width=&quot;90%&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
 </entry>
 
 <entry>
   <title type="html">Spatial Thunar</title>
   <link href="http://benediktmeurer.de/2005/06/04/spatial-thunar"/>
   <updated>2005-06-04T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/06/04/spatial-thunar</id>
   <content type="html">&lt;p&gt;I took the time and implemented parts of the core functionality for Thunar, as thunar-dev is pretty quiet when it comes to code-independent development. Below is a screenshot of the very first test application showing the some of the core classes in action - it&#39;s really spatial and it&#39;ll never be that spatial again. :-)&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/2005/thunar-first-code-20050604.png&quot;&gt;&lt;img src=&quot;/images/2005/thunar-first-code-20050604.png&quot; width=&quot;90%&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I decided to postpone my plans for a fully multi-threaded core. There&#39;s actually a lot of stuff to take care of in order to make it both right and fast. It&#39;s not necessary possible to completely hide the multi-threadedness within the ThunarFile and ThunarFolder classes, so people writing high level classes like ThunarListModel, ThunarTreeModel or ThunarDesktopView, would be presented with a more complex interface, which in turn can decrease the stability of the whole application.&lt;/p&gt;

&lt;p&gt;The approach taken now is faster for loading directories and it makes things way easier to handle, but it can make the UI feel unresponsive while loading large directories or loading from slow media.&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
 </entry>
 
 <entry>
   <title type="html">Progress again</title>
   <link href="http://benediktmeurer.de/2005/06/02/progress-again"/>
   <updated>2005-06-02T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/06/02/progress-again</id>
   <content type="html">&lt;p&gt;So, I&#39;d say the &lt;em&gt;&quot;Shame on you, Benny&quot;&lt;/em&gt;-debate is over and we&#39;re able to make progress again. Atleast, Jasper is requesting input. I&#39;m going to prepare a small collection of diagrams with the most important stuff I&#39;ve set up so far and that&#39;ll be the rough direction for the next weeks. While the lower-level stuff is mostly settled (the left-over stuff is mostly implementation specific), the high-level stuff is mostly undefined. E.g. somebody would have to work out a set of preferences that should be configurable for Thunar. For techies, there&#39;s the outstanding &lt;strong&gt;ThunarTrashFolder&lt;/strong&gt; and &lt;strong&gt;ThunarTrashFile&lt;/strong&gt; to define and implement (the latter is pretty simple, the most important thing here is to override the &lt;strong&gt;get_visible_name()&lt;/strong&gt; method using the name set when trashing the file, but the former is really complex and care must be taken so the implementation does not result in something completly unmaintainable). There are a few more open issues (bookmarks, treepane, removable devices, ...), so people that complained previously should be able to get their hands dirty really soon (but as a limitation, developing on Thunar is not firing up vi and starting to write code).&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
 </entry>
 
 <entry>
   <title type="html">Clearance</title>
   <link href="http://benediktmeurer.de/2005/06/01/clearance"/>
   <updated>2005-06-01T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/06/01/clearance</id>
   <content type="html">&lt;p&gt;I don&#39;t want to stop work on Thunar - with the &lt;a href=&quot;http://thunar.xfce.org/wiki/requirements:goals&quot;&gt;initial goals&lt;/a&gt;. I really like the idea of a simple file manager. The question is rather whether it fits with Xfce (or whether Xfce fits into the picture).&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
 </entry>
 
 <entry>
   <title type="html">Edscott about Thunar</title>
   <link href="http://benediktmeurer.de/2005/05/31/edscott-about-thunar"/>
   <updated>2005-05-31T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/05/31/edscott-about-thunar</id>
   <content type="html">&lt;p&gt;Edscott &lt;a href=&quot;http://foo-projects.org/pipermail/thunar-dev/2005-May/000593.html&quot;&gt;sent&lt;/a&gt; some comments about Thunar development to thunar-dev today, with similar contents like a mail he sent me previously some time ago. It&#39;s seldomly the case in conversation with Edscott, but with these mails there&#39;s really nothing I could say against or in addition. He&#39;ll most probably be either flamed or ignored for his mail, tho.&lt;/p&gt;

&lt;p&gt;In the meantime, I worked on some ideas for the backend code (I&#39;m still thinking to use GnomeVFS instead if this turns out to get too complicated, because there&#39;s no valid reason to reinvent a tricky wheel):&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/2005/ThunarVFS-usage-20050531.png&quot;&gt;&lt;img src=&quot;/images/2005/ThunarVFS-usage-20050531.png&quot; width=&quot;90%&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
 </entry>
 
 <entry>
   <title type="html">Development continues</title>
   <link href="http://benediktmeurer.de/2005/05/31/development-continues"/>
   <updated>2005-05-31T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/05/31/development-continues</id>
   <content type="html">&lt;p&gt;I decided that development on Thunar as part of Xfce will continue, but with some limitations, which will help to keep the fun with the project.&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
 </entry>
 
 <entry>
   <title type="html">Break</title>
   <link href="http://benediktmeurer.de/2005/05/30/break"/>
   <updated>2005-05-30T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/05/30/break</id>
   <content type="html">&lt;p&gt;Now that were two really busy months - april and may - for me (up to 300 hours each), and it was a necessary break from Xfce for me. Somehow I lost not only my interest in Xfce, but more important, it was no longer fun for me. To me it looked (and still looks) like Xfce development is going into the wrong direction. I&#39;m not yet sure if and how I will continue my contribution to Xfce. I started to do some long standing stuff for libexo/thunar yesterday. But reading the last suggestions on thunar-dev made me think that there&#39;s no need for a simple file manager in Xfce. Maybe Xfce people should extend &lt;a href=&quot;http://xffm.sourceforge.net/&quot;&gt;Xffm&lt;/a&gt; even more, rather than developing a second not-simple file manager.&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
 </entry>
 
 <entry>
   <title type="html">Too much work...</title>
   <link href="http://benediktmeurer.de/2005/04/01/too-much-work"/>
   <updated>2005-04-01T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/04/01/too-much-work</id>
   <content type="html">&lt;p&gt;So, CeBIT 2005 is over and - as usual - the result is: A lot of work. Very interesting work, tho. But it leaves me with no time for xfce (besides that, my energy level is near to zero when I return home). I don&#39;t even manage to read all my mail currently.&lt;/p&gt;

&lt;p&gt;Speaking from the recent mail subjects on the &lt;code&gt;xdg&lt;/code&gt; list, work is going on with D-VFS and there seems to be another attempt to standardize the icon names for icon themes, which is a very, very good thing.&lt;/p&gt;

&lt;p&gt;On the thunar front, there seems to be a lot of discussion concerning a different name (I haven&#39;t read all the mails, still 23 unread mails in &lt;code&gt;thunar-dev&lt;/code&gt;, but from those I read, I&#39;d say Thunar is still the best name), and Benjamin Cohen came up with a patch for auto-completion for the prototype, I&#39;ll look into this tomorrow.&lt;/p&gt;

&lt;p&gt;A quick look at the &lt;a href=&quot;http://www.osnews.com/story.php?news_id=10146&quot;&gt;OSNews&lt;/a&gt; poll tells me, that Thunar wins again with 11% (and 89 comments is quite a lot for an Xfce sub project, that did not release a single line of code). Besides that, when will people realize that it&#39;s &lt;b&gt;Xfce&lt;/b&gt; not &lt;b&gt;XFce&lt;/b&gt;? ;-)&lt;/p&gt;

&lt;p&gt;That&#39;s all for the day, my bed awaits me...&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
 </entry>
 
 <entry>
   <title type="html">Thunar - Name of the Beast?</title>
   <link href="http://benediktmeurer.de/2005/03/29/thunar-name-of-the-beast"/>
   <updated>2005-03-29T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/03/29/thunar-name-of-the-beast</id>
   <content type="html">&lt;p&gt;The name discussion started once again. Most popular seems to be:&lt;/p&gt;

&lt;ul&gt;   &lt;li&gt;    Secretary   &lt;/li&gt;   &lt;li&gt;    Nomad   &lt;/li&gt;   &lt;li&gt;PathFinder&lt;/li&gt;   &lt;li&gt;Digger
&lt;/li&gt; &lt;/ul&gt;


&lt;p&gt;for now. Personally, I still prefer Thunar for the reasons described in &lt;a href=&quot;http://foo-projects.org/pipermail/thunar-dev/2005-March/000450.html&quot;&gt;this mail&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;On a related note: Thunar was on &lt;a href=&quot;http://osnews.com/story.php?news_id=10046&quot;&gt;OSNews&lt;/a&gt; already (why did nobody tell me?), and people commented on the &lt;a href=&quot;/2005/03/20/thunar-suggestion-20050320&quot;&gt;Suggestion 20050320&lt;/a&gt;. I tried to get some useful information out of the comments, but it&#39;s hard to decide what&#39;s useful and what not (the slashdot syndrome). It&#39;d be better if people would suggest/comment stuff on &lt;a href=&quot;http://foo-projects.org/mailman/listinfo/thunar-dev&quot;&gt;thunar-dev&lt;/a&gt; instead.&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
 </entry>
 
 <entry>
   <title type="html">Caching MIME information</title>
   <link href="http://benediktmeurer.de/2005/03/29/caching-mime-information"/>
   <updated>2005-03-29T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/03/29/caching-mime-information</id>
   <content type="html">&lt;p&gt;RedHat&#39;s Matthias Clasen came up with the idea of caching the MIME information provided by the Shared MIME database (the list of MIME type aliases, subclass information, the glob patterns, the magic patterns and the XML namespaces) in a mmapable file &lt;a href=&quot;http://lists.freedesktop.org/archives/xdg/2005-March/006386.html&quot;&gt;today&lt;/a&gt;. With his attempt, there&#39;ll be one cache file (&lt;code&gt;mime.cache&lt;/code&gt;) per &lt;code&gt;mime&lt;/code&gt; directory, e.g. on most Linux systems, this will be&lt;/p&gt;

&lt;ul&gt;   &lt;li&gt;&lt;code&gt;/usr/local/share/mime/mime.cache&lt;/code&gt;&lt;/li&gt;   &lt;li&gt;&lt;code&gt;/usr/share/mime/mime.cache&lt;/code&gt;&lt;/li&gt;   &lt;li&gt;&lt;code&gt;~/.local/share/mime/mime.cache&lt;/code&gt;&lt;/li&gt; &lt;/ul&gt;


&lt;p&gt; while on for example FreeBSD, this will be&lt;/p&gt;

&lt;ul&gt;   &lt;li&gt;&lt;code&gt;/usr/X11R6/share/mime/mime.cache&lt;/code&gt;&lt;/li&gt;   &lt;li&gt;&lt;code&gt;/usr/local/share/mime/mime.cache&lt;/code&gt;&lt;/li&gt;   &lt;li&gt;&lt;code&gt;~/.local/share/mime/mime.cache&lt;/code&gt;&lt;/li&gt; &lt;/ul&gt;


&lt;p&gt; (both with default &lt;code&gt;$XDG_DATA_DIRS&lt;/code&gt; settings). He also provides patches for both &lt;code&gt;xdgmime&lt;/code&gt; (the MIME implementation used by &lt;code&gt;gtk+&lt;/code&gt; and &lt;code&gt;gnome-vfs&lt;/code&gt;) and &lt;code&gt;update-mime-database&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The general idea is good, and the implementation looks good too. We should consider using the cache for Thunar as well. My major concern about this currently is the bad data locality with &lt;b&gt;many&lt;/b&gt; &lt;code&gt;mime.cache&lt;/code&gt; files (which should only happen if the admin is on crack) and the probably reduced performance due to the big endian to little endian conversions (we need a benchmark here to decide if it&#39;s really worth to spend another thought on this conversion). If we&#39;d adopt this idea for Thunar, we could further reduce startup time, as the process would not need to parse the MIME database first, and it would reduce the memory overhead, tho this is less critical in case of Thunar, since all windows (and the desktop background) run in the same process space and thereby share the MIME database.&lt;/p&gt;

&lt;p&gt;Anyways, it&#39;s nice to see some useful activity on the &lt;code&gt;xdg&lt;/code&gt; mailinglist again, after all this &lt;i&gt;discuss it to death&lt;/i&gt;-threads about D-VFS and gconf.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Edit:&lt;/b&gt; Additional notes can be found in &lt;a href=&quot;http://foo-projects.org/pipermail/thunar-dev/2005-March/000468.html&quot;&gt;this mail&lt;/a&gt;.&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
 </entry>
 
 <entry>
   <title type="html">Thunar - No feedback</title>
   <link href="http://benediktmeurer.de/2005/03/27/thunar-no-feedback"/>
   <updated>2005-03-27T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/03/27/thunar-no-feedback</id>
   <content type="html">&lt;p&gt;Looks like Thunar does not attract software developers (yet), at least they did not respond to my last mail to thunar-dev. Somehow it looks like we got a bunch of users and hackers hanging around on the mailinglist and waiting for code or mockups to play with, which is fun of course; but we need more &lt;b&gt;dev&lt;/b&gt; activitity on the &lt;b&gt;dev&lt;/b&gt; mailinglist. ;-)&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
 </entry>
 
 <entry>
   <title type="html">Thunar Relations</title>
   <link href="http://benediktmeurer.de/2005/03/25/thunar-relations"/>
   <updated>2005-03-25T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/03/25/thunar-relations</id>
   <content type="html">&lt;p&gt;Some more thoughts on the Thunar architecture:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/2005/thunar-relations-20050325.png&quot;&gt;&lt;img src=&quot;/images/2005/thunar-relations-20050325.png&quot; width=&quot;99%&quot; hspace=&quot;2&quot; vspace=&quot;2&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This diagram illustrates the basic relations within the Thunar backend (and also includes a few entities from the frontent). The Thunar MIME applications/actions handling is pretty much undecided yet (both the backend and the frontend).&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
 </entry>
 
 <entry>
   <title type="html">Thunar Designing the architecture</title>
   <link href="http://benediktmeurer.de/2005/03/24/thunar-designing-the-architecture"/>
   <updated>2005-03-24T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/03/24/thunar-designing-the-architecture</id>
   <content type="html">&lt;p&gt;As the overall feedback on the Thunar suggestion was very positive, I think we are mostly settled with the user interface now. Only minor changes will happen on the user interface, no more major changes on the UI concept.&lt;/p&gt;

&lt;p&gt;So it&#39;s now the time to start to design the basic architecture for Thunar. Work on the MIME system was already started and a few bits and pieces can be found on the Wiki. The interesting part will be to design the ThunarView architecture, that is the way the main view will be designed and connected to the backend(s). My first idea here looked like this:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/2005/thunar-view-model-idea-20050324.png&quot;&gt;&lt;img src=&quot;/images/2005/thunar-view-model-idea-20050324.png&quot; width=&quot;99%&quot; hspace=&quot;2&quot; vspace=&quot;2&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The idea is to separate the user interface part from the data storage (where storage is the wrong term here, as the &lt;i&gt;data&lt;/i&gt; is already stored in the file system, a better term would be &lt;i&gt;data manager&lt;/i&gt;). The volume manager is required to properly implement the Trash specification and to list the removable devices in the sidebar (both the shortcuts and the tree). On Linux we may use HAL to implement the volume manager, but HAL won&#39;t be a requirement, esp. since it&#39;s not portable at all, which conflicts with Xfce&#39;s major goals.&lt;/p&gt;

&lt;p&gt;This design offers several advantages (yes, it looks obvious, but it&#39;s not; check other file managers and see for yourself): Adding different backends in the future or converting existing backends (e.g. move to D-VFS) will be very easy. Adding new views (like Column View or Tree View) will be very easy (version 1.0 should ship with List View and Icon View). The whole trash related functionality is implemented in one single place (except for the &lt;code&gt;trash_file()&lt;/code&gt; function, but this function is more or less easy), which is a very good thing, since the trash spec is tricky and scattering the functionality over the source tree would surely become a maintaince problem over time.&lt;/p&gt;

&lt;p&gt;More detailed information about this idea can be found on the &lt;a href=&quot;http://thunar.xfce.org/wiki/design:overview#the_main_view&quot;&gt;Thunar Wiki&lt;/a&gt;.&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
 </entry>
 
 <entry>
   <title type="html">Thunar Suggestion 20050320</title>
   <link href="http://benediktmeurer.de/2005/03/20/thunar-suggestion-20050320"/>
   <updated>2005-03-20T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/03/20/thunar-suggestion-20050320</id>
   <content type="html">&lt;p&gt;So, I decided that it&#39;s time to sum up the results of two/three weeks of Thunar UI discussion, and hacked it into a Wiki page:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://thunar.xfce.org/wiki/ui:suggestion-20050320&quot;&gt;http://thunar.xfce.org/wiki/ui:suggestion-20050320&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I think we can all agree on this suggestion, as it provides ease of use and simplicity with the default look (layout 1), but without limiting the user too much (something that has been complained about by Gnome users quite often lately), since the user is free to use a different look and feel (layout 2) or even customize the layout to fit his own needs. This is exactly the kind of flexibility we need for Xfce, and that&#39;s why people love Xfce: Put the user in control, but only to a certain degree. And of course, keep it lightweight and fast.&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
 </entry>
 
 <entry>
   <title type="html">Thunar location bar again</title>
   <link href="http://benediktmeurer.de/2005/03/20/thunar-location-bar-again"/>
   <updated>2005-03-20T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/03/20/thunar-location-bar-again</id>
   <content type="html">&lt;p&gt;I have tried to adjust the prototype to make both parties happy, the path bar guys and the location bar addicts:&lt;/p&gt;

&lt;p&gt;The path bar user interface looks as usual:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/2005/thunar-alternative-pathbar-20050320.png&quot;&gt;&lt;img src=&quot;/images/2005/thunar-alternative-pathbar-20050320.png&quot; width=&quot;99%&quot; hspace=&quot;2&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The location bar user interface is very similar, except that it has location entry widget instead of the path buttons:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/2005/thunar-alternative-locationbar-20050320.png&quot;&gt;&lt;img src=&quot;/images/2005/thunar-alternative-locationbar-20050320.png&quot; width=&quot;99%&quot; hspace=&quot;2&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And a third possibility, as suggested by Jeff, would be to disable the bar completely. This will make ROX users happy as well.&lt;/p&gt;

&lt;p&gt;A tarball of the prototype with the stuff mentioned above is available &lt;a href=&quot;/files/source/thunar-alternative-bar-20050320.tar.gz&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
 </entry>
 
 <entry>
   <title type="html">And the laugh of the day goes to...</title>
   <link href="http://benediktmeurer.de/2005/03/20/and-the-laugh-of-the-day-goes-to"/>
   <updated>2005-03-20T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/03/20/and-the-laugh-of-the-day-goes-to</id>
   <content type="html">&lt;p&gt;... my favourite Linux based operating system, &lt;a href=&quot;http://www.debian.org&quot;&gt;Debian&lt;/a&gt;. The mighty and outstanding Debian people finally came to the conclusion that it might be a good idea to release their software from time to time (sarge will become stable right after the Hurd 1.0 release). Oh, really. Why did noone think of this earlier?&lt;/p&gt;

&lt;p&gt;But seriously... we suck at releasing our stuff... but hey, we &lt;em&gt;do release&lt;/em&gt; it. And people like it - well except the few with the broken panel config. ;-)&lt;/p&gt;

&lt;p&gt;On a related note: I did an Ubuntu intall recently on one of our new servers (Fujitsu Siemens Primergy 200) at work; the installation went very smooth. Ubuntu just works. No need for endless googling about stupid problems. No need to compile a custom kernel, as the Ubuntu default kernels support even high-end hardware out of the box. Many people say &quot;Xfce is Gnome done right&quot;. I say &quot;Ubuntu is Debian done right&quot;.&lt;/p&gt;
</content>
   
   <category term="debian"/>
   
   <category term="ubuntu"/>
   
   <category term="xfce"/>
   
   <category term="gnome"/>
   
 </entry>
 
 <entry>
   <title type="html">Xfce splash screen crash course</title>
   <link href="http://benediktmeurer.de/2005/03/19/xfce-splash-screen-crash-course"/>
   <updated>2005-03-19T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/03/19/xfce-splash-screen-crash-course</id>
   <content type="html">&lt;p&gt;Here&#39;s a very brief introduction to the way splash screens work in Xfce 4.2.0 and above:&lt;/p&gt;

&lt;p&gt;The whole splash thingy is a bit complex atm. On the first level, there are splash engines (currently &lt;code&gt;mice&lt;/code&gt;, &lt;code&gt;simple&lt;/code&gt; and &lt;code&gt;balou&lt;/code&gt;); these are loadable modules. &lt;code&gt;mice&lt;/code&gt; isn&#39;t themable at all, everything&#39;s hardcoded. &lt;code&gt;simple&lt;/code&gt; is themeable from the configure dialog, and &lt;code&gt;balou&lt;/code&gt; is themable using a theme file.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;balou&lt;/code&gt; theming is pretty easy, its just a &lt;code&gt;themerc&lt;/code&gt; file and a logo image file. Check the &lt;code&gt;Default&lt;/code&gt; balou theme in the xfce4-session source to get an idea of the file format/content (it includes a few comments). To distribute a theme, create a directory layout like this:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;Name
Name/balou
Name/balou/themerc
Name/balou/logo.png&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;where &lt;code&gt;Name&lt;/code&gt; is the name of your theme. Then tar up the stuff like this:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; tar czvf Name.tar.gz Name&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Now users can simply install the theme by dragging the &lt;code&gt;.tar.gz&lt;/code&gt; file from  a file manager and dropping it to the &lt;code&gt;balou&lt;/code&gt; configure screen in the  settings manager.&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
 </entry>
 
 <entry>
   <title type="html">Thunar Firefox-like location bar (the 2nd skin)</title>
   <link href="http://benediktmeurer.de/2005/03/19/thunar-firefox-like-location-bar-the-2nd-skin"/>
   <updated>2005-03-19T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/03/19/thunar-firefox-like-location-bar-the-2nd-skin</id>
   <content type="html">&lt;p&gt;Just came up with a better idea for the location bar layout:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/2005/20050319-thunar_go3.png&quot;&gt;&lt;img src=&quot;/images/2005/20050319-thunar_go3.png&quot; width=&quot;99%&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It&#39;s now very similar to what Firefox does. The major difference is, that it&#39;s not associated with the statusbar as in Firefox, instead it&#39;s associated with the main view (icon/list view), which makes more sense.&lt;/p&gt;

&lt;p&gt;It&#39;s important to have a user-visible way to get rid of the location bar again, even if there&#39;s already Escape or &lt;code&gt;focus-out&lt;/code&gt;.&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
 </entry>
 
 <entry>
   <title type="html">Terminal 0.2.4 released</title>
   <link href="http://benediktmeurer.de/2005/03/19/terminal-024-released"/>
   <updated>2005-03-19T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/03/19/terminal-024-released</id>
   <content type="html">&lt;p&gt;So I finally released the next version of &lt;a href=&quot;http://terminal.os-cillation.com/&quot;&gt;Terminal&lt;/a&gt; after nearly 3 months since 0.2.2. And since everybody likes cute new features - as long as they don&#39;t blow up things too much - this new version finally includes support for helper applications (yes, that means clicking on URLs/email addresses is possible now):&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/2005/terminal-20050319.png&quot;&gt;&lt;img hspace=&quot;2&quot; src=&quot;/images/2005/terminal-20050319-thumb.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This was about the most often requested feature. Several other changes have been made to improve Terminal. See the &lt;a href=&quot;http://developer.berlios.de/project/shownotes.php?release_id=5079&quot;&gt;Release Notes&lt;/a&gt; for a complete list of user visible changes.&lt;/p&gt;

&lt;p&gt;With this new release we&#39;re close to a 1.0 release, I think there&#39;ll be 0.2.6 and 0.2.8/0.3.0 before we jump to 1.0 though, as we&#39;ve still some unresolved issues.&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="terminal"/>
   
 </entry>
 
 <entry>
   <title type="html">4.2.1(.1) is doomed</title>
   <link href="http://benediktmeurer.de/2005/03/19/4211-is-doomed"/>
   <updated>2005-03-19T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/03/19/4211-is-doomed</id>
   <content type="html">&lt;p&gt;I&#39;m the new &lt;em&gt;wimp of the day&lt;/em&gt;, as I accidently uploaded the wrong installer binary for 4.2.1.1 (I uploaded 4.2.1 &lt;em&gt;with&lt;/em&gt; the panel bug again). I updated the mirrors now (except for www.us.xfce.org, www.xfce.org redirects to this mirror so don&#39;t download from xfce.org now, which will be updated during the next 3-4 hours) with the correct 4.2.1.1 binary, and everybody who installed 4.2.1.1 from the installer should refetch the &lt;a href=&quot;http://os-cillation.de/download.php?file=xfce4-4.2.1.1-installer.bin&quot;&gt;binary&lt;/a&gt; and reinstall. Sorry for the inconvenience caused by this &lt;em&gt;doomed 4.2.1(.1) releases&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;Update&lt;/h3&gt;

&lt;p&gt;Brian&#39;s comment on this was:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;kelnos&amp;gt; we need a new motto
&amp;lt;kelnos&amp;gt; Xfce: Our software rocks, but we can&#39;t release it for shit
&lt;/code&gt;&lt;/pre&gt;
</content>
   
   <category term="xfce"/>
   
 </entry>
 
 <entry>
   <title type="html">Xfce 4.2.1.1 available</title>
   <link href="http://benediktmeurer.de/2005/03/18/xfce-4211-available"/>
   <updated>2005-03-18T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/03/18/xfce-4211-available</id>
   <content type="html">&lt;p&gt;Since 4.2.1 contained &lt;a href=&quot;/2005/03/17/critical-bug-in-xfce4-panel-421&quot;&gt;this critical panel bug&lt;/a&gt;, we did a quick 4.2.1.1 release yesterday, which fixes the panel issue.  All users of Xfce 4.2.1 should upgrade to 4.2.1.1. Updated installers are available from &lt;a href=&quot;http://xfce-installers.os-cillation.com/&quot;&gt;Xfce installers&lt;/a&gt; website.&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
 </entry>
 
 <entry>
   <title type="html">Thunar Firefox-like location bar</title>
   <link href="http://benediktmeurer.de/2005/03/18/thunar-firefox-like-location-bar"/>
   <updated>2005-03-18T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/03/18/thunar-firefox-like-location-bar</id>
   <content type="html">&lt;p&gt;So I added the firefox-like location bar to Thunar today (&lt;a href=&quot;/2005/03/17/thunar-open-location-ideas&quot;&gt;Brian Schott came up with that idea&lt;/a&gt; yesterday) and after playing around with it for some time, I&#39;m pretty sure that this is the solution to the location bar problem we&#39;ve been trying to find during the last weeks.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;/images/2005/20050318-thunar-open_location_bar.png&quot;&gt;Screenshot of the new Prototype&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;/files/source/20050318-thunar-open_location_bar.tar.gz&quot;&gt;Tarball with the new Prototype&lt;/a&gt;
 &lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;It&#39;s just great, you can navigate using the keyboard, but the location entry widget isn&#39;t visible until you need it. This is great for newbies and power users, as it combines the best of both worlds: Newbies will use the path bar and the shortcuts for mostly everything, while power users can easily enter paths if necessary.&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
 </entry>
 
 <entry>
   <title type="html">Thunar Open Location Ideas</title>
   <link href="http://benediktmeurer.de/2005/03/17/thunar-open-location-ideas"/>
   <updated>2005-03-17T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/03/17/thunar-open-location-ideas</id>
   <content type="html">&lt;p&gt;Brian Schott came up with a new - actually borrowed from ROX - idea for an Open Location control in the GtkFileChooser-like UI:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://members.cox.net/brian-schott/Rox-Like-Find.png&quot;&gt;&lt;img src=&quot;http://members.cox.net/brian-schott/Rox-Like-Find.png&quot; border=&quot;0&quot; width=&quot;99%&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here we&#39;d have a fast and easy way to jump to a different location wihout the need to popup a separate dialog.&lt;/p&gt;

&lt;p&gt;My original attempt (and that&#39;s how it&#39;s currently implemented in the prototype) was to have a separate Open Location dialog:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://members.cox.net/brian-schott/SeperateDialog.png&quot;&gt;&lt;img src=&quot;http://members.cox.net/brian-schott/SeperateDialog.png&quot; border=&quot;0&quot; width=&quot;99%&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;See the &lt;a href=&quot;http://foo-projects.org/pipermail/thunar-dev/2005-March/000266.html&quot;&gt;thread&lt;/a&gt; on the mailinglist for the discussion concerning these ideas.&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
 </entry>
 
 <entry>
   <title type="html">Releasing bugs...</title>
   <link href="http://benediktmeurer.de/2005/03/17/releasing-bugs"/>
   <updated>2005-03-17T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/03/17/releasing-bugs</id>
   <content type="html">&lt;p&gt;Funny, right after the 4.2.1 release is finally done - well, except for Olivier&#39;s &lt;code&gt;ChangeLog&lt;/code&gt;/&lt;code&gt;NEWS&lt;/code&gt; - somebody files a critical &lt;a href=&quot;http://bugzilla.xfce.org/show_bug.cgi?id=837&quot;&gt;bugreport&lt;/a&gt; against xfce4-session 4.2.0: xfce4-session - the simple and balou engines to be exact - crashes on startup with new freetype2 2.1.10cvs (well, not surprising that mice doesn&#39;t crash, as it doesn&#39;t render any text). Looks like a 4.2.2 release is not far away...&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
 </entry>
 
 <entry>
   <title type="html">New Panel Design</title>
   <link href="http://benediktmeurer.de/2005/03/17/new-panel-design"/>
   <updated>2005-03-17T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/03/17/new-panel-design</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://xfce.loculus.nl/&quot;&gt;Jasper&lt;/a&gt; decided to open the &lt;a href=&quot;http://www.myoo.de/xfce/index.php/Panel_Design&quot;&gt;design process&lt;/a&gt; for the new panel for general discussion. He&#39;s using the &lt;a href=&quot;http://www.myoo.de/xfce/index.php/Main_Page&quot;&gt;Xfce Wiki&lt;/a&gt; for this purpose. The most important part is the Panel Plugin API. So, in case you are a panel plugin writer or plan to write a plugin in the future, I suggest you enter the discussion.&lt;/p&gt;

&lt;p&gt;Jasper presented his ideas for the new Panel at FOSDEM 2005 (&lt;a href=&quot;http://xfce.loculus.nl/FOSDEM/&quot;&gt;slides available&lt;/a&gt;).&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
 </entry>
 
 <entry>
   <title type="html">Embedded Xfce</title>
   <link href="http://benediktmeurer.de/2005/03/17/embedded-xfce"/>
   <updated>2005-03-17T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/03/17/embedded-xfce</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://os-cillation.com/&quot;&gt;os-cillation&lt;/a&gt; now offers an &lt;a href=&quot;http://www.os-cillation.com/article.php?sid=50&quot;&gt;embedded linux platform&lt;/a&gt; with Xfce as graphical interface for control units, appliances and other embedded applications. The system boots from a flash file system, which can be customized to fit the customers needs. The system itself offers 4 RS232 ports, 4 USB ports, 1 IrDA port and up to 16 GPIO pins, which makes it well suited for system control in the industry.&lt;/p&gt;

&lt;p&gt;Once again Xfce demonstrates its power as all-around desktop, which also supports small setups, like embedded systems, very well.&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
 </entry>
 
 <entry>
   <title type="html">Debian packages for Xfce 4.2.1 and Xfmedia 0.7.0</title>
   <link href="http://benediktmeurer.de/2005/03/17/debian-packages-for-xfce-421-and-xfmedia-070"/>
   <updated>2005-03-17T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/03/17/debian-packages-for-xfce-421-and-xfmedia-070</id>
   <content type="html">&lt;p&gt;I just uploaded new Debian packages to the &lt;a href=&quot;http://os-works.com/view/debian/&quot;&gt;os-cillation repository&lt;/a&gt;, including the update to Xfce 4.2.1, the new Xfmedia 0.7.0 release and a few goodies. In addition the &lt;tt&gt;xfld-desktop&lt;/tt&gt; package does no longer depend on &lt;tt&gt;xnetcardconfig&lt;/tt&gt;, which enables Ubuntu users to easily install xfld-desktop now.&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="debian"/>
   
 </entry>
 
 <entry>
   <title type="html">Critical bug in xfce4-panel 4.2.1</title>
   <link href="http://benediktmeurer.de/2005/03/17/critical-bug-in-xfce4-panel-421"/>
   <updated>2005-03-17T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/03/17/critical-bug-in-xfce4-panel-421</id>
   <content type="html">&lt;p&gt;The xfce4-panel in the latest Xfce 4.2.1 release contains a bug: It does not save its configuration on session logout. The &lt;a href=&quot;http://os-works.com/view/debian/&quot;&gt;Xfce Debian package&lt;/a&gt; already contains a fix for this bug, so you don&#39;t need to worry about it. If you have installed from the graphical installer or plan to install from the &lt;a href=&quot;http://xfce-installer.os-cillation.com/&quot;&gt;graphical installer&lt;/a&gt;, follow these steps to fix the bug:&lt;/p&gt;

&lt;ol&gt;   &lt;li&gt;Download the &lt;a href=&quot;http://www.os-cillation.de/download.php?file=xfce4-4.2.1-installer.bin&quot;&gt;xfce4-4.2.1-installer.bin&lt;/a&gt; (if not already done)&lt;/li&gt;   &lt;li&gt;Mark the file executable using &lt;tt&gt;chmod +x xfce4-4.2.1-installer.bin&lt;/tt&gt;&lt;/li&gt;   &lt;li&gt;Download the file &lt;a href=&quot;/files/patches/xfce4-panel-4.2.1-store-config.patch&quot;&gt;xfce4-panel-4.2.1-store-config.patch&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Download the file &lt;a href=&quot;/files/patches/xfce4-session-4.2.1-mcs-manager-crash.patch&quot;&gt;xfce4-session-4.2.1-mcs-manager-crash.patch&lt;/a&gt;
&lt;/li&gt; &lt;li&gt;&lt;tt&gt;./xfce4-4.2.1-installer.bin --extract-only&lt;/tt&gt;&lt;/li&gt;   &lt;li&gt;&lt;tt&gt;cd /tmp/xfce4-4.2.1-installer/xfce4-panel&lt;/tt&gt;&lt;/li&gt;   &lt;li&gt;&lt;tt&gt;patch -Np1 &amp;lt; /path/to/xfce4-panel-4.2.1-store-config.patch&lt;/tt&gt;&lt;/li&gt;&lt;li&gt;&lt;tt&gt;cd ../xfce4-session&lt;/tt&gt;&lt;/li&gt;   &lt;li&gt;&lt;tt&gt;patch -Np0 &amp;lt; /path/to/xfce4-session-4.2.1-mcs-manager-crash.patch&lt;/tt&gt;&lt;/li&gt;   &lt;li&gt;&lt;tt&gt;cd ..
&lt;/tt&gt;&lt;/li&gt;   &lt;li&gt;&lt;tt&gt;./bootstrap.sh&lt;/tt&gt;&lt;/li&gt;   &lt;/ol&gt;


&lt;p&gt;This also fixes a possible crash in xfce4-session when testing a splash engine. Now follow the usual installation instructions from the &lt;a href=&quot;http://www.os-cillation.com/documentation/installers/xfce-installer/&quot;&gt;installer documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In case, you installed Xfce 4.2.1 from source, untar the &lt;tt&gt;xfce4-panel-4.2.1.tar.gz&lt;/tt&gt; file again, download the patch &lt;a href=&quot;/files/patches/xfce4-panel-4.2.1-store-config.patch&quot;&gt;xfce4-panel-4.2.1-store-config.patch&lt;/a&gt;, &lt;tt&gt;cd xfce4-panel-4.2.1&lt;/tt&gt;, &lt;tt&gt;patch -Np1 &amp;lt; /path/to/xfce4-panel-4.2.1-store-config.patch&lt;/tt&gt; and afterwards run configure, make and make install as usual.&lt;/p&gt;

&lt;h3&gt;Update:&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;/2005/03/18/xfce-4211-available&quot;&gt;Xfce 4.2.1.1 available&lt;/a&gt;.&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
 </entry>
 
 <entry>
   <title type="html">Xfcalendar improvements</title>
   <link href="http://benediktmeurer.de/2005/03/16/xfcalendar-improvements"/>
   <updated>2005-03-16T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/03/16/xfcalendar-improvements</id>
   <content type="html">&lt;p&gt;Mickael and Juha are doing a great job at improving xfcalendar recently. I&#39;m pretty sure that Xfce 4.4.0 will ship with a very nice and very useful calendar application. Xfcalendar can already schedule appointments (tho it&#39;s still very rough on the edges), it currently looks like this:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/2005/xfcalendar-20050316.png&quot;&gt;&lt;img src=&quot;/images/2005/xfcalendar-20050316-thumb.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once the technical part is done, the user interface should be revised, and xfcalendar should probably drop the dependency on the MCS manager. It would be so much easier (and better for the future when we drop MCS) to just store the 3 settings into a resource file (&lt;a href=&quot;http://xfce.org/documentation/api-4.2/libxfce4util/libxfce4util-Resource-Config-File-Support.html&quot;&gt;XfceRc&lt;/a&gt; is your friend). There&#39;ll only run one xfcalendar instance per session anyways, so no concurrent write access problems.&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
 </entry>
 
 <entry>
   <title type="html">Thunar Location Bar vs. Path Bar</title>
   <link href="http://benediktmeurer.de/2005/03/16/thunar-location-bar-vs-path-bar"/>
   <updated>2005-03-16T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/03/16/thunar-location-bar-vs-path-bar</id>
   <content type="html">&lt;p&gt;We are currently discussing the &lt;a href=&quot;http://thunar.xfce.org/&quot;&gt;Thunar&lt;/a&gt; User Interface:&lt;/p&gt;

&lt;p&gt;On the one hand, we have the traditional location bar approach, which looks pretty similar to navigational Nautilus:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/2005/20050316-thunar-locationbar.png&quot;&gt;&lt;img src=&quot;/images/2005/20050316-thunar-locationbar.png&quot; width=&quot;90%&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On the other hand, we have the new path bar approach, which looks pretty similar to the GtkFileChooser User Interface:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/images/2005/20050316-thunar-pathbar.png&quot;&gt;&lt;img src=&quot;/images/2005/20050316-thunar-pathbar.png&quot; width=&quot;90%&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I tend to prefer the path bar approach...&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="thunar"/>
   
 </entry>
 
 <entry>
   <title type="html">Premature Xfce 4.2.1 announcement</title>
   <link href="http://benediktmeurer.de/2005/03/16/premature-xfce-421-announcement"/>
   <updated>2005-03-16T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2005/03/16/premature-xfce-421-announcement</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://osnews.com/&quot;&gt;OSNews&lt;/a&gt; did it again today, but not only did they
&lt;a href=&quot;http://www.osnews.com/story.php?news_id=9989&quot;&gt;announce&lt;/a&gt; Xfce 4.2.1 before it was
officially released, this time they &lt;a href=&quot;http://www.osnews.com/story.php?news_id=9983&quot;&gt;did&lt;/a&gt;
the same for KDE&#39;s 3.4 release. Neither &lt;a href=&quot;http://xfce.org/&quot;&gt;xfce.org&lt;/a&gt; nor &lt;a
href=&quot;http://kde.org/&quot;&gt;kde.org&lt;/a&gt; contained any mention of a new release at the time the
announcements where published on OSNews. In today&#39;s open source world, the most difficult part
of release engineering seems to be preventing news sites from announcing releases before they
actually happen, in order to get a smooth release. This worked amazingly well with the Xfce
4.2.0 release, but not before I mailed several news sites that they should not post anything
until they get an official notice.&lt;/p&gt;
</content>
   
   <category term="xfce"/>
   
   <category term="kde"/>
   
 </entry>
 
 <entry>
   <title type="html">Enigmail works</title>
   <link href="http://benediktmeurer.de/2004/12/04/enigmail-works"/>
   <updated>2004-12-04T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2004/12/04/enigmail-works</id>
   <content type="html">&lt;p&gt;I finally got &lt;a href=&quot;http://enigmail.mozdev.org&quot;&gt;EnigMail&lt;/a&gt; working with native Mozilla on
NetBSD/i386 -current (latest Mozilla 1.5.1 from &lt;a href=&quot;http://www.pkgsrc.org&quot;&gt;pkgsrc&lt;/a&gt; with
enigmail 0.82.2). I uploaded the XPI files &lt;a
href=&quot;ftp://ftp.unix-ag.org/user/bmeurer/NetBSD/Mozilla-1.5.1/Enigmail/&quot;&gt;here&lt;/a&gt;.
To install the XPI files, run Mozilla as root, open the directory that
contains the three XPI files in the browser and click on the files to
install them, in the following order: The IPC module, the enigmime
package and finally the enigmail package. Finally start Mozilla and
configure enigmail as mentioned on the &lt;a href=&quot;http://enigmail.mozdev.org&quot;&gt;EnigMail&lt;/a&gt; website.&lt;/p&gt;
</content>
   
   <category term="netbsd"/>
   
   <category term="enigmail"/>
   
   <category term="mozilla"/>
   
   <category term="gnupg"/>
   
 </entry>
 
 <entry>
   <title type="html">What to put in /etc/mk.conf</title>
   <link href="http://benediktmeurer.de/2003/05/01/what-to-put-in-etcmkconf"/>
   <updated>2003-05-01T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2003/05/01/what-to-put-in-etcmkconf</id>
   <content type="html">&lt;p&gt; 
  In order to get a sane build environment and to build sane packages out of your environment, you should consider overriding some default
  values in your &lt;code&gt;/etc/mk.conf&lt;/code&gt;. For example, if you are running NetBSD/alpha, you shouldn&#39;t use any optimizations to &lt;a
  href=&quot;http://www.tac.eu.org/cgi-bin/man-cgi?cc+1+NetBSD-current&quot;&gt;cc(1)&lt;/a&gt;, because
  gcc is still buggy on Alpha. And in general you should think twice before setting the optimization level above 2, because this might cause
  several programs to segfault frequently or not run at all. Here are some lines from my &lt;code&gt;mk.conf&lt;/code&gt;, which might help you
  (they will honor all default values but -O*):
&lt;/p&gt; 

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bsdmake&quot; data-lang=&quot;bsdmake&quot;&gt;&lt;span class=&quot;nv&quot;&gt;COMMONCFLAGS&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;?=&lt;/span&gt;-O2 -pipe
&lt;span class=&quot;nv&quot;&gt;COPTS&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;COMMONCFLAGS&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;COPTS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;/-O[0-9]*//g&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;CFLAGS&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;COMMONCFLAGS&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;CFLAGS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;/-O[0-9]*//g&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;CXXFLAGS&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;COMMONCFLAGS&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;CXXFLAGS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;/-O[0-9]*//g&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  
&lt;p&gt; 
  When trying to fix bugs in packages, it is helpful to append &lt;code&gt;-Wall -Werror&lt;/code&gt; to &lt;code&gt;COMMONCFLAGS&lt;/code&gt;, but beware: This might
  break a lot of configure scripts (so, you have the chance to fix them too ;-). Another needful thing to have in your &lt;code&gt;mk.conf&lt;/code&gt; is support
  for &lt;a href=&quot;ftp://ftp.netbsd.org/pub/NetBSD-current/pkgsrc/security/sudo/README.html&quot;&gt;sudo&lt;/a&gt; instead of the default &lt;a 
  href=&quot;http://www.tac.eu.org/cgi-bin/man-cgi?su+1+NetBSD-current&quot;&gt;su(1)&lt;/a&gt;, so you may need not to type the root password everytime you install a
  package as a user. Here are the lines from my &lt;code&gt;mk.conf&lt;/code&gt;:
&lt;/p&gt; 

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bsdmake&quot; data-lang=&quot;bsdmake&quot;&gt;&lt;span class=&quot;cp&quot;&gt;.if exists(/usr/pkg/bin/sudo)&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;SU_CMD&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/usr/pkg/bin/sudo /bin/sh -c
&lt;span class=&quot;cp&quot;&gt;.endif&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  
&lt;p&gt; 
  Another helpful thing to do, is to override the default &lt;code&gt;MASTER_SITE&lt;/code&gt; with faster (local) mirrors. E.g. I have a local NetBSD mirror
  (thats the &lt;code&gt;tatooine.kosmos.all&lt;/code&gt; line, so don&#39;t simply copy&amp;amp;paste to your &lt;code&gt;mk.conf&lt;/code&gt; :-),
  from where pkgsrc should try to fetch the needed distfiles first and after that fails, it will try several other mirrors, and only if a distfile cannot
  be found there, it&#39;ll try to fetch it from the &lt;code&gt;MASTER_SITE&lt;/code&gt;s specified for the package. Here are the lines from my &lt;code&gt;mk.conf&lt;/code&gt;:
&lt;/p&gt; 

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bsdmake&quot; data-lang=&quot;bsdmake&quot;&gt;&lt;span class=&quot;nv&quot;&gt;MASTER_SITE_OVERRIDE&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  ftp://tatooine.kosmos.all/pub/NetBSD/packages/distfiles/ &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  ftp://ftp.de.netbsd.org/pub/NetBSD/packages/distfiles/ &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  ftp://ftp2.de.netbsd.org/pub/NetBSD/packages/distfiles/ &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  ftp://ftp.at.netbsd.org/pub/NetBSD/packages/distfiles/ &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  ftp://ftp.netbsd.org/pub/NetBSD/packages/distfiles/&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


</content>
   
   <category term="netbsd"/>
   
 </entry>
 
 <entry>
   <title type="html">How to get NetBSD running on your Sega Dreamcast game console</title>
   <link href="http://benediktmeurer.de/2003/02/02/how-to-get-netbsd-running-on-your-sega-dreamcast-game-console"/>
   <updated>2003-02-02T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2003/02/02/how-to-get-netbsd-running-on-your-sega-dreamcast-game-console</id>
   <content type="html">&lt;p&gt; 
  Josh Tolbert &amp;lt;&lt;a href=&quot;mailto:hemi@puresimplicity.net&quot;&gt;hemi at puresimplicity dot net&lt;/a&gt;&amp;gt; recently put together a lot of
  stuff related to the &lt;a href=&quot;http://www.netbsd.org/Ports/dreamcast/&quot;&gt;NetBSD/dreamcast&lt;/a&gt; port and created an easy to install
  NetBSD Dreamcast system along with a short introduction on how to
  setup your Dreamcast and what need to be done to increase
  the usuability of the NetBSD/dreamcast port (for now, focus on
  &lt;a href=&quot;http://www.tac.eu.org/cgi-bin/man-cgi?wscons+4+NetBSD-current&quot;&gt;wscons(4)&lt;/a&gt; 
  support for the Dreamcast framebuffer and getting POSIX threads to
  work). Josh&#39;s How-To and all stuff needed to get NetBSD working on
  your Dreamcast can found
  &lt;a href=&quot;http://www.puresimplicity.net/~hemi/dreamcast/&quot;&gt;here&lt;/a&gt;.
&lt;/p&gt; 

</content>
   
   <category term="netbsd"/>
   
 </entry>
 
 <entry>
   <title type="html">NetBSD 1.6 book</title>
   <link href="http://benediktmeurer.de/2003/01/30/netbsd-16-book"/>
   <updated>2003-01-30T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2003/01/30/netbsd-16-book</id>
   <content type="html">&lt;p&gt;As mentioned on &lt;a href=&quot;http://www.netbsd.org&quot;&gt;www.netbsd.org&lt;/a&gt; the german publisher C&amp;amp;L
has made available a &lt;a href=&quot;http://www.cul.de/netbsd.html&quot;&gt;book on NetBSD 1.6&lt;/a&gt;. The book
covers NetBSD installation (i386, macppc and others), user administration, updating
the system, kernel tuning, configuring the &lt;code&gt;rc.d&lt;/code&gt; startup system, package
management using &lt;code&gt;pkg_install&lt;/code&gt; and the &lt;code&gt;pkgsrc&lt;/code&gt; tree, configuring the X window system
and using NetBSD in a networked environment (IPv4/6, DNS, NFS/NIS, FTP, Samba and the like).&lt;/p&gt;
</content>
   
   <category term="netbsd"/>
   
 </entry>
 
 <entry>
   <title type="html">Introduction to NetBSD loadable kernel modules</title>
   <link href="http://benediktmeurer.de/2002/11/27/introduction-to-netbsd-loadable-kernel-modules"/>
   <updated>2002-11-27T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2002/11/27/introduction-to-netbsd-loadable-kernel-modules</id>
   <content type="html">&lt;h2&gt;Introduction&lt;/h2&gt;

&lt;p&gt;Loadable kernel modules (LKMs) are quite popular on most modern operating systems such as
&lt;a href=&quot;http://www.kernel.org&quot;&gt;GNU/Linux&lt;/a&gt;, &lt;a href=&quot;http://www.freebsd.org&quot;&gt;FreeBSD&lt;/a&gt; and of course
Microsoft Windows, just to name a few. They offer you the possibility to extend the kernel&#39;s
functionality at runtime without recompiling or even rebooting the system. For example nearly
every Linux device driver is available - or can be made available - as a loadable kernel module,
that can be loaded at runtime to get support for a particular device (or even a pseudo-device).&lt;/p&gt;

&lt;p&gt;With &lt;a href=&quot;http://www.netbsd.org&quot;&gt;NetBSD&lt;/a&gt;, LKMs are not that popular yet. At the time of this writing
only a few drivers are available as loadable modules (mostly filesystem and compat drivers, and
a few others such as the &lt;code&gt;linuxrtc&lt;/code&gt; emulation). This might change in near future.&lt;/p&gt;

&lt;p&gt;The loadable kernel module interface was originally designed to be similar in functionality to the
loadable kernel modules facility provided by SunOS. The &lt;a href=&quot;http://netbsd.gw.com/cgi-bin/man-cgi?lkm+4+NetBSD-1.6&quot;&gt;lkm(4)&lt;/a&gt;
facility is controlled by performing &lt;a href=&quot;http://netbsd.gw.com/cgi-bin/man-cgi?ioctl+2+NetBSD-1.6&quot;&gt;ioctl(2)&lt;/a&gt;
calls on the &lt;code&gt;/dev/lkm&lt;/code&gt; device, but since all operations are handled by the
&lt;a href=&quot;http://netbsd.gw.com/cgi-bin/man-cgi?modload+8+NetBSD-1.6&quot;&gt;modload(8)&lt;/a&gt;,
&lt;a href=&quot;http://netbsd.gw.com/cgi-bin/man-cgi?modunload+8+NetBSD-1.6&quot;&gt;modunload(8)&lt;/a&gt; and
&lt;a href=&quot;http://netbsd.gw.com/cgi-bin/man-cgi?modstat+8+NetBSD-1.6&quot;&gt;modstat(8)&lt;/a&gt; programs, you should never
have to interact with &lt;code&gt;/dev/lkm&lt;/code&gt; directly. Note, that you need to run a kernel compiled
with the &lt;a href=&quot;http://netbsd.gw.com/cgi-bin/man-cgi?lkm+4+NetBSD-1.6&quot;&gt;LKM&lt;/a&gt; option in order to make use of LKMs.&lt;/p&gt;

&lt;h2&gt;Writing the module&lt;/h2&gt;

&lt;p&gt;I&#39;d like to show you how to write a simple character device driver that does nothing but the simple job of
calculating the &lt;a href=&quot;http://en.wikipedia.org/wiki/Fibonacci_number&quot;&gt;Fibonacci numbers&lt;/a&gt; (I&#39;ll therefore name
the module &lt;code&gt;fibo.o&lt;/code&gt; and let all the function&#39;s names begin with &lt;code&gt;fibo_&lt;/code&gt;). The driver
will provide 8 minor devices &lt;code&gt;/dev/fibo0&lt;/code&gt; to &lt;code&gt;/dev/fibo7&lt;/code&gt;.
Each minor device offers the following functions:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-cpp&quot; data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;fibo_open&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;dev_t&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;proc&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;fibo_close&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;dev_t&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;proc&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;fibo_read&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;dev_t&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dev&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;uio&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;You can open and close a device provided by this driver and you&#39;ll be able to read from it (we&#39;ll have
a closer look at the parameters later, when we discuss the actual functions). Now we need to tell the
kernel that we provide a character device with the 3 functions listed above. Therefore we need to fill
in a &lt;code&gt;struct cdevsw&lt;/code&gt; (&lt;em&gt;cdevsw&lt;/em&gt; means &lt;em&gt;character device switch&lt;/em&gt; and the &lt;code&gt;struct cdevsw&lt;/code&gt;
is defined in &lt;code&gt;sys/conf.h&lt;/code&gt;).&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-cpp&quot; data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cdevsw&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fibo_dev&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;fibo_open&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;fibo_close&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;fibo_read&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dev_type_write&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;enodev&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dev_type_ioctl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;enodev&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dev_type_stop&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;enodev&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dev_type_poll&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;enodev&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dev_type_mmap&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;enodev&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;code&gt;enodev&lt;/code&gt; is a generic function that simply returns the
&lt;a href=&quot;http://netbsd.gw.com/cgi-bin/man-cgi?errno+2+NetBSD-1.6&quot;&gt;errno(2)&lt;/a&gt; &lt;code&gt;ENODEV&lt;/code&gt;
(&lt;em&gt;Operation not supported by device&lt;/em&gt;) which says that we does not support any operations besides
open, close and read. So, for example, whenever you try to write to the device, the
&lt;a href=&quot;http://netbsd.gw.com/cgi-bin/man-cgi?write+2+NetBSD-1.6&quot;&gt;write(2)&lt;/a&gt; will fail with &lt;code&gt;ENODEV&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Furtheron we need to tell the kernel how the module is named and where to find information about
operations provided by the module. This is a quite simple task with the lkm interface: We use the
preprocessor macro &lt;code&gt;MOD_DEV&lt;/code&gt;, which is defined in &lt;code&gt;sys/lkm.h&lt;/code&gt; to hand the
information over. The &lt;code&gt;MOD_DEV&lt;/code&gt; macro was changed in NetBSD-current, therefore we use
the following construct to get things working with both NetBSD 1.6 and earlier and NetBSD 1.6H and
later (thanks to &lt;a href=&quot;mailto:anil_public@yahoo.com&quot;&gt;Anil Gopinath&lt;/a&gt; for the hint).&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-cpp&quot; data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;cp&quot;&gt;#if (__NetBSD_Version__ &amp;gt;= 106080000)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;MOD_DEV&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;fibo&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;fibo&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;NULL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fibo_dev&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;cp&quot;&gt;#else&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;MOD_DEV&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;fibo&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;LM_DT_CHAR&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fibo_dev&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;cp&quot;&gt;#endif&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;This means that our module is named &lt;code&gt;fibo&lt;/code&gt;, we&#39;ll provide a character device (minor devices
are handled by the module itself, so they doesn&#39;t matter for now), we want to retrieve a dynamic major
device number from the kernel (if you want to use a specific major device number you&#39;ll need to specify
that instead of the &lt;code&gt;-1&lt;/code&gt;, but beware of getting in conflict with other device drivers) and we
provide the information about the supported operations in &lt;code&gt;fibo_dev&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;In order to ensure proper unloading of the module we need to keep a global reference counter of opened
minor devices.&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-cpp&quot; data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fibo_refcnt&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;And furtheron we need to keep a bunch of information about each minor device.&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-cpp&quot; data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fibo_softc&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;       &lt;span class=&quot;n&quot;&gt;sc_refcnt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;kt&quot;&gt;u_int32_t&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sc_current&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;kt&quot;&gt;u_int32_t&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sc_previous&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
 
&lt;span class=&quot;cp&quot;&gt;#define MAXFIBODEVS 8&lt;/span&gt;
 
&lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fibo_softc&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fibo_scs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;MAXFIBODEVS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;As mentioned above our driver will provide 8 minor devices. Each minor device stores information about
how often it was opened (in our example each minor device can only be opened once to keep things simple),
the current number and the previous number for calculating the Fibonacci numbers. If you don&#39;t know how
to calculate the Fibonacci numbers, you should have a look on a book about algorithms, as explaining this
is beyond the scope of this article.&lt;/p&gt;

&lt;p&gt;Each kernel module needs to have an entry point which is passed to
&lt;a href=&quot;http://netbsd.gw.com/cgi-bin/man-cgi?ld+1+NetBSD-1.6&quot;&gt;ld(1)&lt;/a&gt; by modload when the module is linked. The
default module entry point is named &lt;code&gt;xxxinit&lt;/code&gt;. If &lt;code&gt;xxxinit&lt;/code&gt; cannot be found, an
attempt to use &lt;code&gt;&lt;i&gt;modulename&lt;/i&gt;_lkmentry&lt;/code&gt; will be made, where &lt;code&gt;&lt;i&gt;modulename&lt;/i&gt;&lt;/code&gt;
is the filename of the module being loaded without the &lt;code&gt;.o&lt;/code&gt;. In general the entry function will
consist entirely of a single &lt;code&gt;DISPATCH&lt;/code&gt; line, with &lt;code&gt;DISPATCH&lt;/code&gt; being a preprocessor
macro defined in &lt;code&gt;sys/lkm.h&lt;/code&gt; to handle loading, unloading and stating for us. So our
&lt;code&gt;fibo_lkmentry&lt;/code&gt; function will look like this:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-cpp&quot; data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;fibo_lkmentry&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lkm_table&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;lkmtp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cmd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;nt&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ver&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;DISPATCH&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;lkmtp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cmd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ver&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fibo_handle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fibo_handle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fibo_handle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Now we need a handler function for our module to do module specific tasks when loading, unloading or stating
the module. The name of this handler function is passed to &lt;code&gt;DISPATCH&lt;/code&gt; (see above) to tell the
kernel which function it has to call when doing such things. A pointer to the module entry in the LKM table
and an integer representing the desired command (&lt;code&gt;LKM_E_LOAD&lt;/code&gt;, &lt;code&gt;LKM_E_UNLOAD&lt;/code&gt; or
&lt;code&gt;LKM_E_STAT&lt;/code&gt;) are passed to the handler function. The handler is called after the module is
linked and loaded into the kernel with the &lt;code&gt;LKM_E_LOAD&lt;/code&gt; command. Then we need to check whether
the module was already loaded into the kernel and initialize our data structures. When unloading the module,
the handler is called with the &lt;code&gt;LKM_E_UNLOAD&lt;/code&gt; command and we need to check if the module is not
required any more (e.g. check if all devices are closed for char/block driver modules) before confirming the
unload command.&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-cpp&quot; data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;fibo_handle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lkm_table&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;lkmtp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cmd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;switch&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cmd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;LKM_E_LOAD&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;cm&quot;&gt;/* check if module was already loaded */&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;lkmexists&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;lkmtp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
      &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;EEXIST&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
      
    &lt;span class=&quot;cm&quot;&gt;/* initialize minor device structures */&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;bzero&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fibo_scs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;sizeof&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fibo_scs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;printf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;fibo: FIBONACCI driver loaded successfully&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;break&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    
  &lt;span class=&quot;k&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;LKM_E_UNLOAD&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;cm&quot;&gt;/* check if a minor device is opened */&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fibo_refcnt&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;EBUSY&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;break&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    
  &lt;span class=&quot;k&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;LKM_E_STAT&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;break&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    
  &lt;span class=&quot;k&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;EIO&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  
  &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The open function is quite simple as most of the hard stuff is already handled by the NetBSD kernel
(e.g. the kernel will automatically allocate a &lt;a href=&quot;http://netbsd.gw.com/cgi-bin/man-cgi?vnode+9+NetBSD-1.6&quot;&gt;vnode(9)&lt;/a&gt;
for you). The parameters for the open function are the major and minor device numbers (use the &lt;code&gt;major&lt;/code&gt;
and &lt;code&gt;minor&lt;/code&gt; macros), the &lt;code&gt;flag&lt;/code&gt; and &lt;code&gt;mode&lt;/code&gt; arguments as described in
&lt;a href=&quot;http://netbsd.gw.com/cgi-bin/man-cgi?open+2+NetBSD-1.6&quot;&gt;open(2)&lt;/a&gt; and a pointer to the &lt;code&gt;struct proc&lt;/code&gt;
of the process that did the open system call.&lt;/p&gt;

&lt;p&gt;So the first thing to do is to check if the minor device number we got when the device was opened is not out of
range, and if the minor device is not already opened. You should always keep in mind that the minor device
handling is completely up to you and that this is a never ending source of mistakes! Then we need to initialize
the minor device data (the Fibonacci starting numbers 1, 0 + 1 = 1, 1 + 1 = 2, 1 + 2 = 3, ...) and increase the
minor device and the global module reference counter.&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-cpp&quot; data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;fibo_open&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;dev_t&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dev&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;flag&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;proc&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fibo_softc&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fibosc&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fibo_scs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;minor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dev&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;
  
  &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;minor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dev&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;MAXFIBODEVS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ENODEV&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    
  &lt;span class=&quot;cm&quot;&gt;/* check if device already open */&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fibosc&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sc_refcnt&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;EBUSY&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    
  &lt;span class=&quot;n&quot;&gt;fibosc&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sc_current&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;fibosc&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sc_previous&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
 
  &lt;span class=&quot;cm&quot;&gt;/* increase device reference counter */&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;fibosc&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sc_refcnt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  
  &lt;span class=&quot;cm&quot;&gt;/* increase module reference counter */&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;fibo_refcnt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  
  &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The close function has the same parameters with the same meanings as the open function described above. It
is used to free the internal data structures of a minor device opened before. You do not need to worry whether
the device was opened before or to do things like releasing the vnode associated with the device, all you need
to do is to cleanup the module specific stuff. In our example this means decreasing the minor device and the
global module reference counters and so that our close function is quite simple.&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-cpp&quot; data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;fibo_close&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;dev_t&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dev&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;flag&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;mode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;proc&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fibo_softc&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fibosc&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fibo_scs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;minor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dev&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;
  
  &lt;span class=&quot;cm&quot;&gt;/* decrease device reference counter */&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;fibosc&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sc_refcnt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  
  &lt;span class=&quot;cm&quot;&gt;/* decrease module reference counter */&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;fibo_refcnt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  
  &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Last but not least the read function. This function has 3 parameters: the device major and minor numbers like
in the open and close functions, a &lt;code&gt;flag&lt;/code&gt; field indicating for example whether the read should be
done in a non-blocking fashion or such things and a pointer to a &lt;code&gt;struct uio&lt;/code&gt; defined in
&lt;code&gt;sys/uio.h&lt;/code&gt;. A &lt;code&gt;struct uio&lt;/code&gt; typically describes data in motion, in case of a
&lt;a href=&quot;http://netbsd.gw.com/cgi-bin/man-cgi?read+2+NetBSD-1.6&quot;&gt;read(2)&lt;/a&gt; system call data moved from kernel-space
to user-space. This may look a bit strange if you already did device driver progamming on GNU/Linux, but the
uio concept used by the NetBSD kernel simplifies a lot of things and provides a generic and consistent interface
for kernel-space to user-space and kernel-space to kernel-space data moving. See
&lt;a href=&quot;http://netbsd.gw.com/cgi-bin/man-cgi?uiomove+9+NetBSD-1.6&quot;&gt;uiomove(9)&lt;/a&gt; for more information.&lt;/p&gt;

&lt;p&gt;Back on stage, we should first have a look at the read function and discuss the details afterwards.&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-cpp&quot; data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;fibo_read&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;dev_t&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dev&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;uio&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;uio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;flag&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fibo_softc&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fibosc&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fibo_scs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;minor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dev&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;
  
  &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;uio&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;uio_resid&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;sizeof&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;u_int32_t&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;EINVAL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    
  &lt;span class=&quot;k&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;uio&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;uio_resid&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;sizeof&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;u_int32_t&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    
    &lt;span class=&quot;cm&quot;&gt;/* copy to user space */&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;error&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;uiomove&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fibosc&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sc_current&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
                &lt;span class=&quot;k&quot;&gt;sizeof&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fibosc&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sc_current&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;uio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    
    &lt;span class=&quot;cm&quot;&gt;/* prevent overflow */&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fibosc&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sc_current&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;MAXFIBONUM&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;fibosc&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sc_current&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;fibosc&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sc_previous&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;k&quot;&gt;continue&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    
    &lt;span class=&quot;cm&quot;&gt;/* calculate */&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;kt&quot;&gt;u_int32_t&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tmp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
      
      &lt;span class=&quot;n&quot;&gt;tmp&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fibosc&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sc_current&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;fibosc&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sc_current&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fibosc&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sc_previous&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;n&quot;&gt;fibosc&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sc_previous&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tmp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  
  &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;So the first thing we do, is to check whether the process requests less than &lt;code&gt;sizeof(u_int32_t)&lt;/code&gt;
bytes (actually 4 bytes). Our read function always reads a bunch of 4-byte blocks and to keep it simple
and easy to understand we disallow reading less than 4 bytes at a time (&lt;code&gt;uio-&gt;uio_resid&lt;/code&gt; holds
the number of remaining bytes to move to user-space, automatically decreased by &lt;code&gt;uiomove&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;The function copies the current Fibonacci number into the user-space buffer, checks for a possible overflow
(only the first 42 Fibonacci numbers fit into &lt;code&gt;u_int32_t&lt;/code&gt;) and calculates the next Fibonacci
number. If there is enough space left in the user-space buffer, the function loops and restarts the process
of moving, checking and calculating until the buffer is filled up to the possible maximum or
&lt;a href=&quot;http://netbsd.gw.com/cgi-bin/man-cgi?uiomove+9+NetBSD-1.6&quot;&gt;uiomove(9)&lt;/a&gt; returns an error. Note, that a
&lt;a href=&quot;http://netbsd.gw.com/cgi-bin/man-cgi?read+2+NetBSD-1.6&quot;&gt;read(2)&lt;/a&gt; system call on this device will never
return 0, and so it will never reach an end-of-file (EOF), so the device will generate Fibonacci numbers
forever.&lt;/p&gt;

&lt;p&gt;If you&#39;re familar with GNU/Linux device driver programming you might have noticed that we do not return
&lt;code&gt;-&lt;i&gt;ERRNO&lt;/i&gt;&lt;/code&gt; on failure, and in case of the read system call the number of bytes read, but
instead we return &lt;code&gt;0&lt;/code&gt; on success and the positive errno value on failure. Everything else is
handled by the NetBSD kernel itself, so we do not need to care about.&lt;/p&gt;

&lt;h2&gt;Loading the module&lt;/h2&gt;

&lt;p&gt;Now that our device driver module is completed, we need a shell script that will be executed when the module
is successfully loaded to create the required device nodes in &lt;code&gt;/dev&lt;/code&gt;. This shell script (or program)
is always passed three arguments: the module id (in decimal), the module type (in hexadecimal) and the character
major device number (this differs for other types of LKMs such as system call modules). So our script is pretty
simple:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$# &lt;/span&gt;-ne &lt;span class=&quot;m&quot;&gt;3&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;then&lt;/span&gt;
  &lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;$0 should only be called from modload(8) with 3 args&amp;quot;&lt;/span&gt;
  &lt;span class=&quot;nb&quot;&gt;exit &lt;/span&gt;1
&lt;span class=&quot;k&quot;&gt;fi&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;First check whether all three command line arguments are present and exit with error code if not.&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; i in &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;3&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;4&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;5&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;6&lt;/span&gt; 7&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
  rm -f /dev/fibo&lt;span class=&quot;nv&quot;&gt;$i&lt;/span&gt;
  mknod /dev/fibo&lt;span class=&quot;nv&quot;&gt;$i&lt;/span&gt; c &lt;span class=&quot;nv&quot;&gt;$3&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$i&lt;/span&gt;
  chmod &lt;span class=&quot;m&quot;&gt;666&lt;/span&gt; /dev/fibo&lt;span class=&quot;nv&quot;&gt;$i&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;done&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;exit &lt;/span&gt;0&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;And finally (re)create the required special device nodes. Now we are ready to give our module a first test run.
Compile the module and load the module with the following command (this needs to be run as superuser):&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;modload -e fibo_lkmentry -p fibo_post.sh fibo.o&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;If everything went well, the &lt;a href=&quot;http://netbsd.gw.com/cgi-bin/man-cgi?modstat+8+NetBSD-1.6&quot;&gt;modstat(8)&lt;/a&gt; program
should present you output similar to this:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;Type    Id  Off Loadaddr Size Info     Rev Module Name
DEV      0   29 dca4f000 0004 dca4f260   1 fibo&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;h2&gt;Testing the module&lt;/h2&gt;

&lt;p&gt;In order to test your new kernel module, we need a small test program that does nothing more than reading a
32bit unsigned integer value from &lt;code&gt;/dev/fibo0&lt;/code&gt; and outputs the value to standard output. See the
sample program below:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-cpp&quot; data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;cp&quot;&gt;#define DEVICE &amp;quot;/dev/fibo0&amp;quot;&lt;/span&gt;
 
&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;argc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;char&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;argv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;kt&quot;&gt;u_int32_t&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;val&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ret&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  
  &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fd&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DEVICE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;O_RDONLY&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;unable to open &amp;quot;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DEVICE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    
  &lt;span class=&quot;k&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ret&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;read&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;val&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;sizeof&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;val&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;sizeof&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;val&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;printf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;%u&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;val&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    
  &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ret&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;read(&amp;quot;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DEVICE&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&amp;quot;)&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    
  &lt;span class=&quot;n&quot;&gt;close&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;When you run this sample test program, it will output Fibonacci numbers below 2971215074 until you interrupt
or kill the program. To unload the kernel module, you need to run the following command (as superuser):&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;modunload -n fibo&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The complete sources for the example above, including a &lt;code&gt;Makefile&lt;/code&gt;, are available online at:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/bmeurer/fibo_drv&quot;&gt;https://github.com/bmeurer/fibo_drv&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;A &lt;code&gt;tar&lt;/code&gt; archive with the sources can be found
&lt;a href=&quot;https://github.com/bmeurer/fibo_drv/tarball/master&quot;&gt;here&lt;/a&gt;.
I hope you like this small introduction to the NetBSD lkm system. If you have any questions or if you
would like to give me some feedback, feel free to contact &lt;a href=&quot;/about&quot;&gt;me&lt;/a&gt;.&lt;/p&gt;
</content>
   
   <category term="netbsd"/>
   
 </entry>
 
 <entry>
   <title type="html">Setting up KDE 3 on NetBSD</title>
   <link href="http://benediktmeurer.de/2002/10/28/setting-up-kde3-on-netbsd"/>
   <updated>2002-10-28T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2002/10/28/setting-up-kde3-on-netbsd</id>
   <content type="html">&lt;h2&gt;Introduction&lt;/h2&gt;

&lt;p&gt;Like most other Unix(TM)-like operating systems, the &lt;a href=&quot;http://www.kde.org/&quot;&gt;K Desktop
Environment (KDE)&lt;/a&gt; is also available for NetBSD. KDE is a powerful graphical desktop
environment based upon &lt;a href=&quot;http://trolltech.com/&quot;&gt;Trolltech&lt;/a&gt;&#39;s &lt;a
href=&quot;http://www.trolltech.com/products/qt/index.html&quot;&gt;QT&lt;/a&gt; library, and is similar to other
desktop environments available for Unix(TM) workstations, such as the Common Desktop Environment
(CDE) or &lt;a href=&quot;http://www.gnome.org/&quot;&gt;GNOME&lt;/a&gt;. It tries to combine ease of use, contemporary
functionality, and outstanding graphical design with the technological superiority of the Unix
operating system. Like NetBSD itself, KDE is also an Internet project and is licensed under the
GNU General Public License (GPL), and is therefore open source software.&lt;/p&gt;

&lt;h2&gt;Installation&lt;/h2&gt;

&lt;p&gt;It is quite easy to install the latest KDE 3 on a NetBSD system using either binary packages or
building it from &lt;a href=&quot;http://www.pkgsrc.org/&quot;&gt;pkgsrc&lt;/a&gt;.  As I wrote this, there were no
official KDE 3 binary packages available on the ftp servers and I didn&#39;t have the space and
bandwidth to put my packages online :-(. It would be nice, if someone could provide me with a
few 100MB of web/ftp space to put my packages on, so that everyone reading this could use these
packages.&lt;/p&gt;

&lt;p&gt;If you are not lucky to fetch some binary packages for KDE 3, then you should fetch a recent
pkgsrc from NetBSD-current (must be a post 20020830) and start building KDE from scratch.
Therefore you should change to the directory &lt;code&gt;x11/kde3&lt;/code&gt; in your pkgsrc tree and
start by typing &lt;code&gt;make install&lt;/code&gt;. &lt;b&gt;NOTE:&lt;/b&gt; Before starting to install KDE 3, you
should remove any installed KDE package and the installed QT packages (if they&#39;re older
than 3.0.5), and do a &lt;code&gt;make clean&lt;/code&gt; on your pkgsrc tree, else the installation might
fail. After starting the installation process, you&#39;ll need to wait up to 3 days, until the
installation is complete, depending on the hardware of your machine. You might want to speed
up the installation process by mounting the filesystem that contains the pkgsrc tree with the
&lt;code&gt;async&lt;/code&gt; option; e.g. type &lt;code&gt;mount -u -o async /usr/pkgsrc&lt;/code&gt;, but beware,
that mounting a filesystem asyncronous may have a bad effect on your data if the computer
crashes. So, you have been warned, use this option at &lt;b&gt;your own risk&lt;/b&gt;.&lt;/p&gt;

&lt;h2&gt;Postinstallation&lt;/h2&gt;

&lt;p&gt;Now, that KDE 3 is installed properly, all you need to do, is setup your X session to start
KDE 3. Therefore edit (maybe create) the file &lt;code&gt;.xsession&lt;/code&gt; in your home directory
and put in the following lines:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span class=&quot;c&quot;&gt;#!/bin/sh&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;PATH&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;/bin:/sbin:/usr/bin:/usr/sbin:/usr/pkg/bin:/usr/pkg/sbin:/usr/local/bin:/usr/local/sbin:/usr/X11R6/bin
&lt;span class=&quot;nb&quot;&gt;exec&lt;/span&gt; /usr/X11R6/bin/startkde&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Then mark the file executable by typing &lt;code&gt;chmod +x $HOME/.xsession&lt;/code&gt;, login as usual
with xdm and feel happy about your new and fancy KDE desktop :-).&lt;/p&gt;

&lt;p&gt;If you&#39;re using &lt;code&gt;startx&lt;/code&gt; instead of &lt;code&gt;xdm&lt;/code&gt;, you need to edit the file
&lt;code&gt;.xinitrc&lt;/code&gt; in your home directory instead.&lt;/p&gt;

&lt;h2&gt;Using antialiased fonts&lt;/h2&gt;

&lt;p&gt;You might also want to get KDE rendering those nice fonts you saw on all those screenshots all
over the web. Therefore you&#39;ll need to have &lt;a href=&quot;http://www.xfree86.org/&quot;&gt;XFree86&lt;/a&gt; version
4.x installed (this is the default for NetBSD 1.6 and above). Then you need to install some nice
looking TrueType or Type1 fonts, therefore you can use the freely available webfonts provided by
Microsoft, simply install the &lt;a
href=&quot;ftp://ftp.netbsd.org/pub/NetBSD-current/pkgsrc/fonts/ms-ttf/README.html&quot;&gt;fonts/ms-ttf&lt;/a&gt;
package and the &lt;a
href=&quot;ftp://ftp.netbsd.org/pub/NetBSD-current/pkgsrc/fonts/ttmkfdir/README.html&quot;&gt;fonts/ttmkfdir&lt;/a&gt; package.
Then goto &lt;code&gt;/usr/X11R6/lib/X11/fonts/TrueType&lt;/code&gt; and type:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; ttmkfdir &amp;gt; fonts.scale
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; mkfontdir&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;After that add the following line to your &lt;code&gt;/usr/X11R6/lib/X11/XF86Config-4&lt;/code&gt;
in the &lt;code&gt;Files&lt;/code&gt; section&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;FontPath &lt;span class=&quot;s2&quot;&gt;&amp;quot;/usr/X11R6/lib/X11/fonts/TrueType/&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;and&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;dir &lt;span class=&quot;s2&quot;&gt;&amp;quot;/usr/X11R6/lib/X11/fonts/TrueType&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;to your &lt;code&gt;/usr/X11R6/lib/X11/XftConfig&lt;/code&gt;. Logout from your X session and restart your
X server by hitting &lt;code&gt;CTRL-ALT-BACKSPACE&lt;/code&gt; at your xdm login prompt. Relogin to your
KDE desktop and enable &quot;Use Anti-Aliasing for fonts&quot; in the KDE control center; logout again and
relogin, and choose some nice antialiased fonts (the ones with the &lt;code&gt;[Xft]&lt;/code&gt; in the
name) for your desktop. Enjoy! ;-).&lt;/p&gt;

&lt;h2&gt;Feedback&lt;/h2&gt;

&lt;p&gt;I hope you liked my little KDE 3 HowTo and I would be pleased to
get some good (or even bad ;-) feedback from you. If you
have any problems or questions on this topic, I&#39;ll try to help you
getting things to work.&lt;/p&gt;
</content>
   
   <category term="netbsd"/>
   
   <category term="kde"/>
   
 </entry>
 
 <entry>
   <title type="html">How to use hardware monitors with NetBSD</title>
   <link href="http://benediktmeurer.de/2002/10/19/how-to-use-hardware-monitors-with-netbsd"/>
   <updated>2002-10-19T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2002/10/19/how-to-use-hardware-monitors-with-netbsd</id>
   <content type="html">&lt;p&gt; 
  Today, there are various environmental sensor ICs available on modern mainboards, which are able of monitoring fan speed,
  cpu and system temperature, and voltage for example. NetBSD currently supports the National Semiconductor LM78, LM79 and compatible 
  hardware monitors (the &lt;a href=&quot;http://www.tac.eu.org/cgi-bin/man-cgi?lm+4+NetBSD-current&quot;&gt;lm(4)&lt;/a&gt; device), the VIA VT82C686A hardware
  monitor (the &lt;a href=&quot;http://www.tac.eu.org/cgi-bin/man-cgi?viaenv+4+NetBSD-current&quot;&gt;viaenv(4)&lt;/a&gt; device) and ACPI aware hardware
  monitors (the &lt;a href=&quot;http://www.tac.eu.org/cgi-bin/man-cgi?acpi+4+NetBSD-current&quot;&gt;acpi(4)&lt;/a&gt; subsystem) through its &lt;a
  href=&quot;http://www.tac.eu.org/cgi-bin/man-cgi?envsys+4+NetBSD-current&quot;&gt;Environmental Systems API&lt;/a&gt;. These devices are not enabled
  by default, you need to &lt;a href=&quot;http://www.mclink.it/personal/MG2508/nbsdeng/chap-kernel.html&quot;&gt;recompile your kernel&lt;/a&gt; with the
  following additional lines in your kernel config file:
&lt;/p&gt; 
  
&lt;p&gt; 
  For the National Semiconductor LM78, LM79 and compatible monitors (you may need to adjust the I/O port settings):
&lt;/p&gt; 

&lt;pre&gt; 
lm0 at isa? port 0x290
&lt;/pre&gt; 

&lt;p&gt; 
  For the VIA VT82C686A hardware monitor:
&lt;/p&gt; 
  
&lt;pre&gt; 
viapm* at pci? dev ? function ?
viaenv* at viapm?
&lt;/pre&gt; 

&lt;p&gt; 
  For ACPI enabled monitors (thanks to &lt;a href=&quot;mailto:joel@carnat.net&quot;&gt;Joel Carnat&lt;/a&gt; for the hint):
&lt;/p&gt; 

&lt;pre&gt; 
options MPACPI
acpi0 at mainbus0
acpiacad at acpi?
acpibat* at acpi?
acpibut* at acpi?
acpiec* at acpi?
acpilid* at acpi?
acpitz* at acpi?
&lt;/pre&gt; 
  
&lt;p&gt; 
  After booting your new kernel, you can access your hardware sensors, using the &lt;a
  href=&quot;http://www.tac.eu.org/cgi-bin/man-cgi?envstat+8+NetBSD-current&quot;&gt;envstat(8)&lt;/a&gt; command. For example, to display
  all supported sensors, type &lt;code&gt;envstat -l&lt;/code&gt;, and to actually read the environmental sensors, simply type
  &lt;code&gt;envstat&lt;/code&gt;. For more information about using the &lt;a href=&quot;http://www.tac.eu.org/cgi-bin/man-cgi?envstat+8+NetBSD-current&quot;&gt;envstat(8)&lt;/a&gt; 
  tool, refer to the manpage.
&lt;/p&gt; 

</content>
   
   <category term="netbsd"/>
   
 </entry>
 
 <entry>
   <title type="html">Why NetBSD?</title>
   <link href="http://benediktmeurer.de/2002/10/02/why-netbsd"/>
   <updated>2002-10-02T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2002/10/02/why-netbsd</id>
   <content type="html">&lt;p&gt;During the last years, I used to install a lot of different operating systems, looking for the
system that fits my needs best. For example, I tried Microsoft Windows NT (3.51, 4.0 and 5.0
and had a quick look at 5.1), several Linux distributions (e.g.
&lt;a href=&quot;http://www.suse.com&quot;&gt;SuSE Linux&lt;/a&gt;, &lt;a href=&quot;http://www.redhat.com&quot;&gt;RedHat Linux&lt;/a&gt;,
&lt;a href=&quot;http://www.debian.org&quot;&gt;Debian GNU/Linux&lt;/a&gt; and &lt;a href=&quot;http://www.mandrake.com&quot;&gt;Mandrake Linux&lt;/a&gt;),
&lt;a href=&quot;http://www.freebsd.org&quot;&gt;FreeBSD&lt;/a&gt; and &lt;a href=&quot;http://www.openbsd.org&quot;&gt;OpenBSD&lt;/a&gt;. We also tried to write
our own operating system (we named it &quot;Socratix&quot;), but soon we noticed, that it was an
impossible task for us to write a whole operating system (from scratch).&lt;/p&gt;

&lt;p&gt;All those systems I tried have their particular advantages, but of course they all have their
&lt;em&gt;native&lt;/em&gt; disadvantages. And not allowing me to fix these disadvantages (e.g. the Debian Policy
is such a disadvantage, I think), makes me become very frustrated of open source software (and
the philosophy behind it). So after all, I decided to give &lt;a href=&quot;http://www.netbsd.org&quot;&gt;NetBSD&lt;/a&gt;
another try (I had installed NetBSD several times before, for testing reasons, but never
get really close to it). After reading &lt;a href=&quot;http://www.mclink.it/personal/MG2508&quot;&gt;Federico Lupi&lt;/a&gt;&#39;s
excellent &lt;a href=&quot;http://www.mclink.it/personal/MG2508/nbsdeng/netbsd.html&quot;&gt;NetBSD Guide&lt;/a&gt; I fetched
the NetBSD distribution, created an iso image out of it and burned it onto a cd. Starting off
the very straight-forward installation procedure, I was very pleased with NetBSD. It allows to
me to do exactly what I want to do, nothing more, and nothing less. The base system is very
clean and includes only the main parts of the system, so soon I decided to fetch a recent
&lt;code&gt;pkgsrc.tar.gz&lt;/code&gt; and installed some packages (I cannot live without perl ;-). The only
thing I&#39;m still missing about pkgsrc is a tool like portupgrade; it is currently been worked on,
and e.g. &lt;code&gt;pkg_hack&lt;/code&gt; does nearly everything portupgrade does, but you know
&lt;a href=&quot;http://www.netbsd.org/Goals/system.html&quot;&gt;&lt;i&gt;It doesn&#39;t work &lt;b&gt;unless&lt;/b&gt; it&#39;s
right&lt;/i&gt;&lt;/a&gt; :-).&lt;/p&gt;

&lt;p&gt;After all, I think the main reason for using NetBSD is its clean design and clean development
model. The problem with the mainstream operating systems such as GNU/Linux is that people always
want to have the newest features, and so the main goal is to get this features implemented as
soon as possible, without the need to get a clean implementation. With NetBSD, you may get this
features up to one or two years later, after somebody worked out a clean and stable
implementation and a lot of testing was done on it. And when you get it, you can be sure, it
works! So, now you know, why I prefer NetBSD, and what about you? Are you still loosing time
getting your &lt;a href=&quot;http://www.kernel.org/&quot;&gt;Linux&lt;/a&gt; distribution to work? Tired of
fixing Debian package dependencies everytime you type &lt;code&gt;apt-get dist-upgrade&lt;/code&gt;? So,
maybe you should give NetBSD a try, but beware of making the wrong decision: NetBSD is
&lt;b&gt;no&lt;/b&gt; mainstream operating system, so if you always want to get the latest (unstable)
features, you&#39;re better off not choosing NetBSD to run your computer!&lt;/p&gt;

&lt;p&gt;And last but not least: &lt;a href=&quot;http://srom.zgp.org/&quot;&gt;NetBSD rules&lt;/a&gt; :-).&lt;/p&gt;
</content>
   
   <category term="netbsd"/>
   
 </entry>
 
 <entry>
   <title type="html">What BSD gives to the world</title>
   <link href="http://benediktmeurer.de/2002/09/28/what-bsd-gives-to-the-world"/>
   <updated>2002-09-28T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2002/09/28/what-bsd-gives-to-the-world</id>
   <content type="html">&lt;p&gt;Today I read an interesting article on BSD and what it gave
(and still gives) to the world, you can find it &lt;a
href=&quot;http://www.extremetech.com/print_article/0,3998,a=31573,00.asp&quot;&gt;here&lt;/a&gt;,
this is probably the best article about BSD, Unix and Linux, I ever
read. Also the changes to &lt;a
href=&quot;http://netbsd.gw.com/cgi-bin/man-cgi?du+1+NetBSD-current&quot;&gt;du(1)&lt;/a&gt;
have been commited to NetBSD-current, so we&#39;ll get the long awaited feature with 1.7 ;-).&lt;/p&gt;
</content>
   
   <category term="netbsd"/>
   
   <category term="freebsd"/>
   
   <category term="openbsd"/>
   
 </entry>
 
 <entry>
   <title type="html">NetBSD 1.6</title>
   <link href="http://benediktmeurer.de/2002/09/09/netbsd-16"/>
   <updated>2002-09-09T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2002/09/09/netbsd-16</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://www.netbsd.org&quot;&gt;NetBSD&lt;/a&gt; 1.6 is finally at RELEASE.&lt;/p&gt;
</content>
   
   <category term="netbsd"/>
   
 </entry>
 
 <entry>
   <title type="html">BSD multimedia</title>
   <link href="http://benediktmeurer.de/2002/09/06/bsd-multimedia"/>
   <updated>2002-09-06T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2002/09/06/bsd-multimedia</id>
   <content type="html">&lt;p&gt;Today I read a very interesting article on how to &lt;a href=&quot;http://www.onlamp.com/pub/a/bsd/2002/09/05/FreeBSD_Basics.html&quot;&gt;turn your BSD box into a powerful multimedia
workstation&lt;/a&gt;. Although it was
written with FreeBSD in mind, it might also be useful to read for a NetBSD user interested in
enjoying multimedia on its NetBSD machine.&lt;/p&gt;

&lt;p&gt;The &lt;a href=&quot;http://ezine.daemonnews.org/200209/&quot;&gt;September Issue of Daemon News on-line E-zine&lt;/a&gt; includes
a small Q&amp;amp;A guide on &lt;a href=&quot;http://ezine.daemonnews.org/200209/diskpartnbsd.html&quot;&gt;how to properly partition a disk for
NetBSD&lt;/a&gt; written by Grey Wolf.&lt;/p&gt;
</content>
   
   <category term="netbsd"/>
   
   <category term="freebsd"/>
   
 </entry>
 
 <entry>
   <title type="html">NetBSD 1.6RC3</title>
   <link href="http://benediktmeurer.de/2002/09/04/netbsd-16rc3"/>
   <updated>2002-09-04T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2002/09/04/netbsd-16rc3</id>
   <content type="html">&lt;p&gt;&lt;a href=&quot;http://www.netbsd.org/Releases/formal-1.6/&quot;&gt;NetBSD 1.6 Release Candidate 3&lt;/a&gt;
available. Interesting article at &lt;a href=&quot;http://www.bsdnewsletter.com&quot;&gt;BSDnewsletter.com&lt;/a&gt;:
&lt;a href=&quot;http://www.bsdnewsletter.com/2002/09/Features39.html&quot;&gt;Taking MicroBSD for a test run&lt;/a&gt;
(&lt;a href=&quot;http://www.microbsd.org&quot;&gt;MicroBSD&lt;/a&gt; aims to be a hardened OpenBSD derivate). And finally
agc &lt;a href=&quot;http://www.bsdforums.org/forums/showthread.php?threadid=2899&quot;&gt;explaining&lt;/a&gt; changes to
&lt;a href=&quot;http://www.pkgsrc.org&quot;&gt;pkgsrc&lt;/a&gt; in August 2002.&lt;/p&gt;
</content>
   
   <category term="netbsd"/>
   
 </entry>
 
 <entry>
   <title type="html">Setting up sendmail with Milter support on NetBSD</title>
   <link href="http://benediktmeurer.de/2002/08/31/setting-up-sendmail-with-milter-support-on-netbsd"/>
   <updated>2002-08-31T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2002/08/31/setting-up-sendmail-with-milter-support-on-netbsd</id>
   <content type="html">&lt;p&gt; 
  &lt;i&gt; 
    Note that if you are using NetBSD 1.6T or better, the
    system sendmail already supports the Milter library. And pkgsrc
    supports sendmail installation (for 8.12.x, 8.12.9 at this
    moment) linked with Milter library. See mail/libmilter and
    mail/sendmail (use &lt;code&gt;make USE_MILTER=yes&lt;/code&gt; command to
    build the last one).
  &lt;/i&gt; 

  &lt;br /&gt; 
  
  &lt;small&gt;(Thanks to Mishka for pointing this out)&lt;/small&gt; 
&lt;/p&gt; 

&lt;p&gt; 
  This is a posting from &lt;a href=&quot;mailto:mishka@batraq.anything3d.com&quot;&gt;Mishka&lt;/a&gt;
  to comp.unix.bsd.netbsd.misc on getting sendmail to work with libmilter using the &lt;a
  href=&quot;ftp://ftp.netbsd.org/pub/NetBSD/NetBSD-current/pkgsrc/devel/pth/README.html&quot;&gt;devel/pth&lt;/a&gt; 
  package:
&lt;/p&gt; 

&lt;pre&gt; 
From: Mishka &amp;lt;mishka@batraq.anything3d.com&amp;gt;
Newsgroups: comp.unix.bsd.netbsd.misc
Subject: NetBSD + Milter = friendship :)
Date: Fri, 30 Aug 2002 18:12:49 +0300
Organization: PACOnet ISP
Message-ID: &amp;lt;3D6F8B71.4050807@batraq.anything3d.com&amp;gt;
X-Complaints-To: abuse@paco.net
NNTP-Posting-Date: Fri, 30 Aug 2002 15:13:42 +0000 (UTC)
User-Agent: Mozilla/5.0 (X11; U; NetBSD i386; en-US; rv:1.0.0) Gecko/20020816
X-Accept-Language: en-us, ru
X-NNTP-Posting-Host: batraq.anything3d.com
 
Hello!
 
I found that built-in sendmail (8.11.6 for NetBSD 1.6E) compiled without
Milter support. Next, in pkgsrc collection sendmail have the same version,
and have not Milter support also. It seems to be due to absence of POSIX
threads in system.
 
Anobody knows rightest way to enable Milter functionality in Sendmail?
It would be great if we can solve this problem without install other
version of sendmail, but use built-in one.
 
Having installed pth-1.4.1 before, I tried the following:
 
1) Add the following files and dir to /usr/src/gnu/usr.sbin/sendmail:
  libmilter/
  libmilter/Makefile
  libmilter/Makefile.milter
 
    With following contents:
  ---- libmilter/Makefile.milter BEGIN ----
  # $NetBSD$
 
  .if _FFR_MILTER
  PTH_CFLAGS!=    pth-config --cflags
  PTH_LDFLAGS!=   pth-config --ldflags
  PTH_LIBS!=      pth-config --libs
 
  CPPFLAGS+=      -D_FFR_MILTER
  CPPFLAGS+=      ${PTH_CFLAGS}
  LDADD+=         ${PTH_LDFLAGS} ${PTH_LIBS}
  .endif
  ---- libmilter/Makefile.milter END ----
 
  ---- libmilter/Makefile BEGIN (derived from libsmutil/Makefile) ----
  #       $NetBSD: Makefile,v 1.4 2001/12/12 12:24:21 lukem Exp $
 
  NOSHARE=        # defined
  NOPIC=          # defined
  NOPROFILE=      # defined
 
  .include &amp;lt;bsd.own.mk&amp;gt;
  .include &quot;Makefile.milter&quot;
 
  DIST=           ${.CURDIR}/../../../dist
  .PATH: ${DIST}/sendmail/libmilter
 
  LIB=            milter
 
  CPPFLAGS+=      -DNOT_SENDMAIL
 
  SRCS=           comm.c engine.c handler.c listener.c
  SRCS+=          main.c signal.c sm_gethost.c smfi.c
 
  libinstall::
 
  .include &amp;lt;bsd.lib.mk&amp;gt;
  ---- libmilter/Makefile BEGIN ----
 
    And have added the following line to Makefile:
 
  .include &quot;libmilter/Makefile.milter&quot;
 
2) Next, having installed libmilter/Makefile.milter I do:
 
  # pwd
  /usr/src/gnu/usr.sbin/sendmail
  # make clean
  ...
  # make -f Makefile -D_FFR_MILTER
  ...
  . at this stage i seen that libsmutil and other is compiled
  . with _FFR_MILTER flags and linked with -lpth
  ...
  # make install
  ...
  # ldd /usr/libexec/sendmail/sendmail
  /usr/libexec/sendmail/sendmail:
           -lwrap.0 =&amp;gt; /usr/lib/libwrap.so.0
           -lutil.6 =&amp;gt; /usr/lib/libutil.so.6
           -lssl.2 =&amp;gt; /usr/lib/libssl.so.2
           -lcrypto.1 =&amp;gt; /usr/lib/libcrypto.so.1
           -lpth.14 =&amp;gt; /usr/pkg/lib/libpth.so.14     &amp;lt;--- look here
           -lc.12 =&amp;gt; /usr/lib/libc.so.12
  # cd libmilter &amp;amp;&amp;amp; make -D_FFR_MILTER
  ...
  # cp libmilter.a /usr/lib
  # ns -s /usr/lib/libmilter.asmfi_getpriv in smfi.o
  smfi_addrcpt in smfi.o
  smfi_addheader in smfi.o
  smfi_getsymval in smfi.o
  ... and so on ...
 
3) After two ones below, I have sucessfully compiled sample mail filter
    which uses libmilter library.
 
4) After all, I have added following lines to /etc/mail/sendmail.rc:
 
  O InputMailFilters=drweb-filter
  Xdrweb-filter,  S=inet:3001@localhost,  T=S:10m;R:10m;E:1h
 
    And errors for this moment wasn&#39;t detected :)
 
But i have ask you once more: is there exists more easiest way to do this,
and anybody know what we will do if some package uses Milter functionality?
(maybe syspkg ;)
 
Thanks in advance.
 
--
Mishka.
&lt;/pre&gt; 

</content>
   
   <category term="netbsd"/>
   
   <category term="sendmail"/>
   
   <category term="milter"/>
   
 </entry>
 
 <entry>
   <title type="html">IRIX Binary Compatibility</title>
   <link href="http://benediktmeurer.de/2002/08/02/irix-binary-compatibility"/>
   <updated>2002-08-02T00:00:00+00:00</updated>
   <id>http://benediktmeurer.de/2002/08/02/irix-binary-compatibility</id>
   <content type="html">&lt;p&gt;Emmanuel Dreyfus published the second part of &lt;a href=&quot;http://www.onlamp.com/pub/a/bsd/2002/08/29/irix.html&quot;&gt;IRIX Binary
Compatibility&lt;/a&gt; with NetBSD.&lt;/p&gt;
</content>
   
   <category term="netbsd"/>
   
 </entry>
 

</feed>
