<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5268847417417953349</id><updated>2011-12-21T20:20:22.912-05:00</updated><category term='Travelling'/><category term='Rants'/><category term='Javascript'/><category term='Curling'/><category term='C'/><category term='Software'/><category term='Me Me Me'/><category term='Photography'/><category term='Hacking'/><category term='Fun'/><category term='GLib'/><category term='Programming'/><category term='GNOME'/><category term='Politics'/><title type='text'>inactivity log for davidz</title><subtitle type='html'>What's that? Chicken?</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default?start-index=101&amp;max-results=100'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>120</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-2441280772082417031</id><published>2011-09-22T16:44:00.004-04:00</published><updated>2011-09-22T16:59:52.537-04:00</updated><title type='text'>New D-Bus features in GLib 2.30</title><content type='html'>For the upcoming &lt;a href="http://en.wikipedia.org/wiki/GLib"&gt;GLib&lt;/a&gt; 2.30 release, there's a couple of new features to make it even easier to use &lt;a href="http://en.wikipedia.org/wiki/D-Bus"&gt;D-Bus&lt;/a&gt;.&lt;br /&gt;&lt;h1&gt;C Code Generator&lt;/h1&gt;GLib 2.30 ships with a command called &lt;a href="http://developer.gnome.org/gio/unstable/gdbus-codegen.html"&gt;gdbus-codegen(1)&lt;/a&gt;&amp;nbsp;which can be used to generate C code. The command is similar in spirit to the &lt;a href="http://dbus.freedesktop.org/doc/dbus-glib/dbus-binding-tool.html"&gt;dbus-binding-tool(1)&lt;/a&gt; command but it targets the D-Bus implementation added to GLib 2.26 (often informally referred to as GDBus). The command's manual page and &lt;a href="http://developer.gnome.org/gio/unstable/ch29.html"&gt;migration documentation&lt;/a&gt;&amp;nbsp;is the authoritative source of documentation, but from a 50,000 feet view what the tool does is simply to map a D-Bus interface (described by XML) to a couple of&amp;nbsp;&lt;a href="http://developer.gnome.org/gobject/unstable/gobject-The-Base-Object-Type.html"&gt;GObject&lt;/a&gt;-based types (including all D-Bus methods, signals and properties). It of course supports the &lt;a href="http://dbus.freedesktop.org/doc/dbus-specification.html#standard-interfaces-properties"&gt;PropertiesChanged signal&lt;/a&gt; added in D-Bus spec 0.14.&lt;br /&gt;&lt;br /&gt;Even though the tool is targeting C programmers (most higher-level languages are a lot more dynamic than C so objects can be exported via e.g. language meta-data such as &lt;a href="http://en.wikipedia.org/wiki/Java_annotation"&gt;annotations&lt;/a&gt;), it's useful to note that the generated code is 100% annotated so it can be used from e.g. JavaScript through &lt;a href="https://live.gnome.org/GObjectIntrospection"&gt;GObject Introspection&lt;/a&gt; - for example the&amp;nbsp;&lt;a href="https://live.gnome.org/Design/Apps/Documents"&gt;GNOME Documents&lt;/a&gt;&amp;nbsp;application (written in JavaScript) is consuming the &lt;a href="http://people.freedesktop.org/~david/goa-20110512/"&gt;GNOME Online Accounts&lt;/a&gt;&amp;nbsp;client-library which is 99% generated by the gdbus-codegen(1) command.&lt;br /&gt;&lt;br /&gt;In addition to just generating code, the gdbus-codegen(1) command can also generate very nice Docbook documentation (&lt;a href="http://people.freedesktop.org/~david/goa-20110512/ch02.html"&gt;example 1&lt;/a&gt;, &lt;a href="http://people.freedesktop.org/~david/udisks2-20110719/ch02.html"&gt;example 2&lt;/a&gt;) for D-Bus interfaces - in this respect it's useful even for non-GNOME applications in the same way a lot of libraries like libblkid and libudev are already using &lt;a href="https://live.gnome.org/DocumentationProject/GtkDoc"&gt;gtk-doc&lt;/a&gt; for their C library documentation.&lt;br /&gt;&lt;br /&gt;&lt;h1&gt;Object Manager&lt;/h1&gt;Another part of GLib 2.30 is support for the &lt;a href="http://dbus.freedesktop.org/doc/dbus-specification.html#standard-interfaces-objectmanager"&gt;org.freedesktop.DBus.ObjectManager&lt;/a&gt;&amp;nbsp;D-Bus interface - in fact, the implementation in GLib, that is, the newly added&amp;nbsp;&lt;a href="http://developer.gnome.org/gio/unstable/GDBusObject.html"&gt;GDBusObject&lt;/a&gt;{&lt;a href="http://developer.gnome.org/gio/unstable/GDBusObjectProxy.html"&gt;Proxy&lt;/a&gt;,&lt;a href="http://developer.gnome.org/gio/unstable/GDBusObjectSkeleton.html"&gt;Skeleton&lt;/a&gt;}and&amp;nbsp;&lt;a href="http://developer.gnome.org/gio/unstable/GDBusObjectManager.html"&gt;GDBusObjectManager&lt;/a&gt;{&lt;a href="http://developer.gnome.org/gio/unstable/GDBusObjectManagerClient.html"&gt;Client&lt;/a&gt;,&lt;a href="http://developer.gnome.org/gio/unstable/GDBusObjectManagerServer.html"&gt;Server&lt;/a&gt;} types, is actually what drove me to &lt;a href="https://bugs.freedesktop.org/show_bug.cgi?id=34869"&gt;propose this&lt;/a&gt;&amp;nbsp;as a standard interface instead of just doing a GLib-only thing (with shoutouts to my homeboys &lt;a href="http://smcv.pseudorandom.co.uk/"&gt;smcv&lt;/a&gt; and &lt;a href="http://blog.verbum.org/"&gt;walters&lt;/a&gt; for excellent review and feedback).&lt;br /&gt;&lt;br /&gt;In a nutshell, the org.freedesktop.DBus.ObjectManager interface is basically a formalization of what each and every non-trivial D-Bus service is already doing: offering some kind of GetAll() method (to return all objects) and signals ::Foo{Added,Removed} (to convey changes) on its Manager interface in its own special way (&lt;a href="http://projects.gnome.org/NetworkManager/developers/api/09/spec.html#org.freedesktop.NetworkManager"&gt;example 1&lt;/a&gt;, &lt;a href="http://hal.freedesktop.org/docs/udisks/UDisks.html"&gt;example 2&lt;/a&gt;). It first sounds weird to standardize such a simple thing as object enumeration and change signals but if you think about all the possible&amp;nbsp;&lt;a href="http://developer.gnome.org/gio/unstable/GDBusObjectManagerClient.html#GDBusObjectManagerClient.description"&gt;edge cases and race-conditions&lt;/a&gt;&amp;nbsp;then using a well-tested implementation just makes everything so much easier. Additionally, with the way the interface is defined and the &lt;a href="https://bugs.freedesktop.org/show_bug.cgi?id=34870"&gt;newly added path_namespace match rule&lt;/a&gt;, two method invocations and a single round-trip is all it takes for a client to grab the state from the service - this is a huge win compared to existing services that typically first retrieve a list of object paths and then gets properties for each object path (and only if you are lucky it does the latter in parallel).&lt;br /&gt;&lt;br /&gt;When combined with the gdbus-codegen(1) command (which can also generate specialized GDBusObject types for use with GDBusObjectManager) you can start writing service-specific code &lt;b&gt;right away&lt;/b&gt;&amp;nbsp;and not worry about horrible implementation details like marshaling, too many round trips or race conditions. It just works out of the box as you'd expect it to.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-2441280772082417031?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/2441280772082417031/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2011/09/new-d-bus-features-in-glib-230.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/2441280772082417031'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/2441280772082417031'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2011/09/new-d-bus-features-in-glib-230.html' title='New D-Bus features in GLib 2.30'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-2242261722919872834</id><published>2011-07-06T12:58:00.008-04:00</published><updated>2011-07-06T17:33:56.084-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C'/><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='GLib'/><title type='text'>Writing a C library, intro, conclusion and errata</title><content type='html'>&lt;i&gt;This is a series of blog-posts about best practices for writing C libraries. See below for each part and the topics covered.&lt;/i&gt;&lt;br /&gt;&lt;h1&gt;Table of contents&lt;/h1&gt;The entire series about best practices for writing C libraries covered 15 topics and was written over five parts posted over the course of approximately one week. Feel free to hotlink directly to each topic but please keep in mind that the content (like any other content on this blog) is copyrighted by its author and may not be reproduced without his consent (if you are friendly towards free software, like e.g. &lt;a href="http://lwn.net/"&gt;LWN&lt;/a&gt;, just ask and I will probably give you permission):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://davidz25.blogspot.com/2011/06/writing-c-library-part-1.html"&gt;Part one&lt;/a&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://davidz25.blogspot.com/2011/06/writing-c-library-part-1.html#base-libraries"&gt;Base libraries&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://davidz25.blogspot.com/2011/06/writing-c-library-part-1.html#library-init"&gt;Library initialization and shutdown&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://davidz25.blogspot.com/2011/06/writing-c-library-part-1.html#memory-mgmt"&gt;Memory management&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://davidz25.blogspot.com/2011/06/writing-c-library-part-1.html#multiple-threads-and-processes"&gt;Multiple threads and processes&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://davidz25.blogspot.com/2011/06/writing-c-library-part-2.html"&gt;Part two&lt;/a&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://davidz25.blogspot.com/2011/06/writing-c-library-part-2.html#event-handling"&gt;Event handling and the main loop&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://davidz25.blogspot.com/2011/06/writing-c-library-part-2.html#io"&gt;Synchronous and asynchronous I/O&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://davidz25.blogspot.com/2011/06/writing-c-library-part-3.html#modularity"&gt;Modularity and namespaces&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://davidz25.blogspot.com/2011/06/writing-c-library-part-3.html"&gt;Part three&lt;/a&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://davidz25.blogspot.com/2011/06/writing-c-library-part-3.html#error-handling"&gt;Error handling&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://davidz25.blogspot.com/2011/06/writing-c-library-part-3.html#encapsulation-and-oo"&gt;Encapsulation and OO design&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://davidz25.blogspot.com/2011/07/writing-c-library-part-4.html"&gt;Part four&lt;/a&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://davidz25.blogspot.com/2011/07/writing-c-library-part-4.html#helpers-and-daemons"&gt;Helpers and daemons&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://davidz25.blogspot.com/2011/07/writing-c-library-part-4.html#testing"&gt;Testing&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://davidz25.blogspot.com/2011/07/writing-c-library-part-5.html"&gt;Part five&lt;/a&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://davidz25.blogspot.com/2011/07/writing-c-library-part-5.html#api-design"&gt;API design&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://davidz25.blogspot.com/2011/07/writing-c-library-part-5.html#documentation"&gt;Documentation&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://davidz25.blogspot.com/2011/07/writing-c-library-part-5.html#language-bindings"&gt;Language bindings&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://davidz25.blogspot.com/2011/07/writing-c-library-part-5.html#abi-api-versioning"&gt;ABI, API and versioning&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;h1&gt;Topics not covered&lt;/h1&gt;Some topics relevant for writing a C library isn't (yet?) covered in this series either because I'm not an expert on the topic, the topic is still in development or for other reasons:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Networking&lt;/b&gt;&lt;br /&gt;You would think IP networking is easy but it's really not and the low-level APIs that are part of &lt;a href="http://en.wikipedia.org/wiki/POSIX"&gt;POSIX&lt;/a&gt;&amp;nbsp;(e.g. &lt;a href="http://en.wikipedia.org/wiki/Berkeley_sockets"&gt;BSD Sockets&lt;/a&gt;) are not really that helpful since they only do part of what you need. Difficult things here include &lt;a href="http://en.wikipedia.org/wiki/Domain_Name_System"&gt;name resolution&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/SRV_record"&gt;service resolution&lt;/a&gt;,&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Proxy_server"&gt;proxy server handling&lt;/a&gt;, &lt;a href="http://blogs.gnome.org/dcbw/2011/06/14/networkmanager-and-dual-stack-addressing/"&gt;dual-stack addressing&lt;/a&gt;&amp;nbsp;and &lt;a href="http://en.wikipedia.org/wiki/Transport_Layer_Security"&gt;transport security&lt;/a&gt;&amp;nbsp;(including handling &lt;a href="http://en.wikipedia.org/wiki/Digital_certificate"&gt;certificates&lt;/a&gt;&amp;nbsp;for authentication).&lt;br /&gt;&lt;br /&gt;If you are using modern GLib networking primitives (such as&amp;nbsp;&lt;a href="http://developer.gnome.org/gio/unstable/GSocketClient.html"&gt;GSocketClient&lt;/a&gt;&amp;nbsp;or &lt;a href="http://developer.gnome.org/gio/unstable/GSocketService.html"&gt;GSocketService&lt;/a&gt;) all of these problems are taken care of for you without you having to do much work; if not, well, talking to people (or at least, read the blogs) such as &lt;a href="http://danw.mysterion.org/"&gt;Dan Winship&lt;/a&gt;, &lt;a href="http://blogs.gnome.org/dcbw/"&gt;Dan Williams&lt;/a&gt; or &lt;a href="http://0pointer.de/blog"&gt;Lennart Poettering&lt;/a&gt;&amp;nbsp;is probably your best bet.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Build systems&lt;/b&gt;&lt;br /&gt;This is a topic that continues to make me sad so I decided to not really cover it in the series because the best guidance I can give is to just copy/paste whatever other projects are doing - see e.g. the GLib source tree for how to nicely integrate unit testing (see Makefile.decl) and documentation (see docs/reference sub-directories) into the build system (&lt;a href="http://git.gnome.org/browse/glib/tree/"&gt;link&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Ideally we would have a single great IDE for developing Linux libraries and applications (integrating testing, documentation, distribution, package building and so on - see e.g. Sami's&amp;nbsp;&lt;a href="http://wagiaalla.com/2011/05/17/devhelp-support-in-eclipse-through-libhover/"&gt;libhover video&lt;/a&gt;) but even if we did, most existing Linux programmers probably wouldn't use it because they are so used to e.g. emacs or vi (&lt;a href="http://en.wikipedia.org/wiki/If_you_build_it,_they_will_come"&gt;if you build it, they will come&lt;/a&gt;?). There's a couple of initiatives in this area including &lt;a href="http://www.eclipse.org/cdt/"&gt;Eclipse CDT&lt;/a&gt;, &lt;a href="http://www.anjuta.org/"&gt;Anjuta&lt;/a&gt;, &lt;a href="http://kdevelop.org/"&gt;KDevelop&lt;/a&gt; and &lt;a href="http://monodevelop.com/"&gt;MonoDevelop&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Bundling libraries/resources&lt;/b&gt;&lt;br /&gt;The traditional way of distributing applications on Linux is through so-called &lt;a href="http://en.wikipedia.org/wiki/Linux_distribution"&gt;Linux distributions&lt;/a&gt;&amp;nbsp;- the four most well-known being &lt;a href="http://www.debian.org/"&gt;Debian&lt;/a&gt;,&amp;nbsp;&lt;a href="http://fedoraproject.org/"&gt;Fedora&lt;/a&gt;,&amp;nbsp;&lt;a href="http://www.opensuse.org/en/"&gt;openSUSE&lt;/a&gt;&amp;nbsp;and&amp;nbsp;&lt;a href="http://www.ubuntu.com/"&gt;Ubuntu&lt;/a&gt;&amp;nbsp;(in alphabetical order!).&amp;nbsp;These guys, basically, take your source code, compile it against some version of other software it depends on (usually a different version than you, the developer, used), and then ship binary packages to users using dynamic linking.&lt;br /&gt;&lt;br /&gt;There's a couple of problems with this legacy model of distributing software (this list is not exhaustive): &lt;b&gt;a) &lt;/b&gt;it can take up to one or two distribution release cycles (6-12 months) before your software is available to end users; and &lt;b&gt;b)&lt;/b&gt;&amp;nbsp;user X can't give a copy of the software to user Y - he can only tell him where to get it (it might not be available on user Y's distro); and &lt;b&gt;c) &lt;/b&gt;it's all a &lt;a href="http://en.wiktionary.org/wiki/hodgepodge"&gt;hodgepodge&lt;/a&gt; of version skew e.g. the final product that your users are using is, most likely, using different versions of different libraries so who knows if it works; and &lt;b&gt;d) &lt;/b&gt;the software is sometimes changed in ways that you, the original author, wasn't expecting or does not approve of (for example, by removing credits); and &lt;b&gt;e)&lt;/b&gt;&amp;nbsp;the distribution might not forward you bug reports or may forward you bug reports that is caused by downstream patches; and &lt;b&gt;f)&lt;/b&gt;&amp;nbsp;there's a &lt;a href="http://en.wikipedia.org/wiki/Peer_pressure"&gt;peer pressure&lt;/a&gt; to not depend on too new libraries because distributions want to ship your software in old versions of their OS - for example, &lt;a href="http://www.getfirefox.net/"&gt;Mozilla&lt;/a&gt; wants to be able to run on a system with just GTK+ 2.8 installed (and hence won't use features in GTK+ 2.10 or later except for using &lt;a href="http://www.kernel.org/doc/man-pages/online/pages/man3/dlsym.3.html"&gt;dlopen()&lt;/a&gt;-techniques), similar for e.g. &lt;a href="http://www.google.com/chrome/"&gt;Google Chrome&lt;/a&gt;&amp;nbsp;(maybe with a newer GTK+ version though).&amp;nbsp;These problems are virtually unknown to developers on other platforms such as &lt;a href="http://en.wikipedia.org/wiki/Microsoft_Windows"&gt;Microsoft Windows&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Mac_OS_X"&gt;Mac OS X&lt;/a&gt; or even some of the smartphone platforms such as &lt;a href="http://en.wikipedia.org/wiki/IOS_(Apple)"&gt;iOS&lt;/a&gt; or &lt;a href="http://en.wikipedia.org/wiki/Android_(operating_system)"&gt;Android&lt;/a&gt;&amp;nbsp;- they all have fancy tools that bundles things up nicely so the developers won't have to worry about such things.&lt;br /&gt;&lt;br /&gt;There's a couple of interesting initiatives in this area see e.g. &lt;a href="https://github.com/rubenv/bockbuild#readme"&gt;bockbuild&lt;/a&gt;, &lt;a href="http://blogs.gnome.org/alexl/2007/08/07/experiments-with-runtime-less-app-bundles/"&gt;glick&lt;/a&gt;&amp;nbsp;and the proposal to add a &lt;a href="http://mail.gnome.org/archives/gtk-devel-list/2011-April/msg00079.html"&gt;resource-system&lt;/a&gt; to GLib. Note that it's very very hard to do this properly since it depends not only on fixing a lot of libraries so they are &lt;a href="https://bugzilla.gnome.org/show_bug.cgi?id=615903"&gt;relocatable&lt;/a&gt;, it also depends on identifying exactly what kind of run-time requirements each library in question has. The latter includes the &lt;a href="http://en.wikipedia.org/wiki/Kernel_(computing)"&gt;kernel&lt;/a&gt;/&lt;a href="http://en.wikipedia.org/wiki/Udev"&gt;udev&lt;/a&gt; version, the &lt;a href="http://en.wikipedia.org/wiki/C_standard_library"&gt;libc&lt;/a&gt; version (unless bundled or statically linked), the &lt;a href="http://en.wikipedia.org/wiki/X_Window_System"&gt;X11 server&lt;/a&gt;&amp;nbsp;version (and its extensions such as e.g. &lt;a href="http://en.wikipedia.org/wiki/XRender"&gt;RENDER&lt;/a&gt;) version, the presence of one or more&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/D-Bus"&gt;message buses&lt;/a&gt;&amp;nbsp;and so on. With modern&amp;nbsp;techniques&amp;nbsp;such as&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Direct_Rendering_Infrastructure"&gt;direct rendering&lt;/a&gt;&amp;nbsp;this becomes even harder if you want to take advantage of hardware&amp;nbsp;acceleration&amp;nbsp;since you must assume that the host OS is providing recent enough versions of e.g.&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/OpenGL"&gt;OpenGL&lt;/a&gt; or &lt;a href="http://en.wikipedia.org/wiki/Cairo_(graphics)"&gt;cairo&lt;/a&gt; libraries (since you don't want to bundle hardware drivers). And even after all this, you still need to deal with how each distribution patches core components. In some circumstances it might end up being easier to just ship a &lt;a href="http://en.wikipedia.org/wiki/Just_enough_operating_system"&gt;kernel+runtime&lt;/a&gt; along with the application, &lt;a href="http://en.wikipedia.org/wiki/Virtualization"&gt;virtualized&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;The way the series is set up is so it can be extended at a later point - so if there is a demand for one or more popular topics about writing a C library, I might write another blog entry and add it to this page as it's considered the canonical location for the entire series.&lt;br /&gt;&lt;h1&gt;Errata&lt;/h1&gt;Please send me feedback and I will fix up the section in question and credit you here (I already have a couple of corrections lined up that I will add later).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-2242261722919872834?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/2242261722919872834/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2011/07/writing-c-library-intro-conclusion-and.html#comment-form' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/2242261722919872834'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/2242261722919872834'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2011/07/writing-c-library-intro-conclusion-and.html' title='Writing a C library, intro, conclusion and errata'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-6659481320170201891</id><published>2011-07-05T15:31:00.006-04:00</published><updated>2011-07-06T13:00:26.512-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C'/><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='GLib'/><title type='text'>Writing a C library, part 5</title><content type='html'>&lt;i&gt;This is part five in a &lt;a href="http://davidz25.blogspot.com/2011/07/writing-c-library-intro-conclusion-and.html"&gt;series of blog-posts&lt;/a&gt; about best practices for writing C libraries. Previous installments: &lt;a href="http://davidz25.blogspot.com/2011/06/writing-c-library-part-1.html"&gt;part one&lt;/a&gt;, &lt;a href="http://davidz25.blogspot.com/2011/06/writing-c-library-part-2.html"&gt;part two&lt;/a&gt;, &lt;a href="http://davidz25.blogspot.com/2011/06/writing-c-library-part-3.html"&gt;part three&lt;/a&gt;, &lt;a href="http://davidz25.blogspot.com/2011/07/writing-c-library-part-4.html"&gt;part four&lt;/a&gt;.&lt;/i&gt;&lt;br /&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=5268847417417953349&amp;amp;postID=6659481320170201891" name="api-design"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h1&gt;API design&lt;/h1&gt;A C library is, almost by definition, something that offers an &lt;a href="http://en.wikipedia.org/wiki/Application_programming_interface"&gt;API&lt;/a&gt; that is used in applications. Often an API can't be changed in incompatible ways (it can, however, be extended) so it is usually important to get right the first time because if you don't, you and your users will have to live with your mistakes for a long time.&lt;br /&gt;&lt;br /&gt;This section is not a a full-blown guide to API design as there's a lot of&amp;nbsp;literature, courses and presentations available on the subject - see e.g. &lt;a href="http://cworth.org/~cworth/papers/guadec_2006/"&gt;Designing a library that's easy to use&lt;/a&gt;&amp;nbsp;-&amp;nbsp;but we will mention the most important principles and a couple of examples of good and bad API design.&lt;br /&gt;&lt;br /&gt;The main goals when it comes to API design is, of course, to make the API easy to use - this include&amp;nbsp;&lt;a href="http://stackoverflow.com/questions/143701/what-is-the-worst-class-variable-function-name-you-have-ever-encountered"&gt;choosing good names&lt;/a&gt; for types, functions and constants. Be careful of abbreviations - &lt;a href="http://www.kernel.org/doc/man-pages/online/pages/man3/atof.3.html"&gt;atof&lt;/a&gt;&amp;nbsp;might be quick to type but it's not exactly clear that the function parses a C string and returns a double (no, not a float as the name suggests). Typically &lt;a href="http://en.wikipedia.org/wiki/Noun"&gt;nouns&lt;/a&gt; are used for types and while &lt;a href="http://en.wikipedia.org/wiki/Verb"&gt;verbs&lt;/a&gt; are used for methods.&lt;br /&gt;&lt;br /&gt;Another thing to keep in mind is the number of function arguments - ideally each function should take only a few arguments so it's easy to remember how to use it. For example, no-one probably ever remembers exactly what arguments to pass to &lt;a href="http://developer.gnome.org/glib/unstable/glib-Spawning-Processes.html#g-spawn-async-with-pipes"&gt;g_spawn_async_with_pipes()&lt;/a&gt;&amp;nbsp;so programmers end up looking up the docs,&amp;nbsp;&lt;a href="http://www.codinghorror.com/blog/2006/09/the-multi-tasking-myth.html"&gt;breaking the rhythm&lt;/a&gt;. A better approach (which is yet to be implemented in GLib), would be to create a new type, &lt;a href="https://bugzilla.gnome.org/show_bug.cgi?id=646635#c96"&gt;let's call it GProcess&lt;/a&gt;,&amp;nbsp;with methods to set what you'd otherwise pass as arguments and then a method to spawn the actual program. Not only is this easier to use, it is also extensible as adding a method to a type doesn't break API while adding an argument to an existing function/method does. An example of such an API is libudev's &lt;a href="http://www.kernel.org/pub/linux/utils/kernel/hotplug/libudev/libudev-udev-enumerate.html"&gt;udev_enumerate&lt;/a&gt; API - for example, at the time udev starting dealing with &lt;a href="http://en.wikipedia.org/wiki/Tag_(metadata)"&gt;device tags&lt;/a&gt;, the &lt;a href="http://www.kernel.org/pub/linux/utils/kernel/hotplug/libudev/libudev-udev-enumerate.html"&gt;udev_enumerate&lt;/a&gt; type gained the &lt;a href="http://www.kernel.org/pub/linux/utils/kernel/hotplug/libudev/libudev-udev-enumerate.html#udev-enumerate-add-match-tag"&gt;add_match_tag()&lt;/a&gt; method.&lt;br /&gt;&lt;br /&gt;If using constants, it is often useful to use the &lt;a href="http://en.wikipedia.org/wiki/Enumerated_type"&gt;C enum type&lt;/a&gt;&amp;nbsp;since the compiler can warn if a switch statement isn't handling all cases. Generally avoid boolean types in functions and use &lt;a href="http://en.wikipedia.org/wiki/Flag_(computing)"&gt;flag enumerations&lt;/a&gt; instead - this has two advantages: first of all, it's sometimes easier to read foo_do_stuff(foo, FOO_FLAGS_FROBNICATOR) than foo_do_stuff(foo, TRUE) since the reader does not have to expend mental energy on remembering if TRUE translates into whether the frobnicator is to be used or not. Second, it means that several booleans arguments can be passed in one parameter so hard-to-use&amp;nbsp;functions like e.g. &lt;a href="http://developer.gnome.org/gtk3/unstable/GtkBox.html#gtk-box-pack-start"&gt;gtk_box_pack_start()&lt;/a&gt; can be avoided (most programmers can't remember if the &lt;i&gt;expand&lt;/i&gt; or &lt;i&gt;fill&lt;/i&gt; boolean comes first). Additionally, this technique allows adding new flags without breaking API.&lt;br /&gt;&lt;br /&gt;Often the compiler can help - for example, C functions can be annotated with all kinds of &lt;a href="http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html"&gt;gcc-specific annotations&lt;/a&gt; that will cause warnings if the user is not using the function correctly. If using, GLib, some of these annotations are available as macros prefixed with G_GNUC, the most important ones being &lt;a href="http://developer.gnome.org/glib/unstable/glib-Miscellaneous-Macros.html#G-GNUC-CONST:CAPS"&gt;G_GNUC_CONST&lt;/a&gt;, &lt;a href="http://developer.gnome.org/glib/unstable/glib-Miscellaneous-Macros.html#G-GNUC-PURE:CAPS"&gt;G_GNUC_PURE&lt;/a&gt;, &lt;a href="http://developer.gnome.org/glib/unstable/glib-Miscellaneous-Macros.html#G-GNUC-MALLOC:CAPS"&gt;G_GNUC_MALLOC&lt;/a&gt;, &lt;a href="http://developer.gnome.org/glib/unstable/glib-Miscellaneous-Macros.html#G-GNUC-DEPRECATED-FOR:CAPS"&gt;G_GNUC_DEPRECATED_FOR&lt;/a&gt;,&amp;nbsp;&lt;a href="http://developer.gnome.org/glib/unstable/glib-Miscellaneous-Macros.html#G-GNUC-PRINTF:CAPS"&gt;G_GNUC_PRINTF&lt;/a&gt;&amp;nbsp;and &lt;a href="http://developer.gnome.org/glib/unstable/glib-Miscellaneous-Macros.html#G-GNUC-NULL-TERMINATED:CAPS"&gt;G_GNUC_NULL_TERMINATED&lt;/a&gt;.&lt;br /&gt;&lt;h2&gt;Checklist&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Choose good type and function names (favor expressiveness over length).&lt;/li&gt;&lt;li&gt;Keep the number of arguments to functions down (consider introducing helper types).&lt;/li&gt;&lt;li&gt;Use the type system / compiler to your advantage instead of fighting it (enums, flags, compiler annotations).&lt;/li&gt;&lt;/ul&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=5268847417417953349&amp;amp;postID=6659481320170201891" name="documentation"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h1&gt;Documentation&lt;/h1&gt;If your library is very simple, the best documentation might just be a nicely formatted C header file with inline comments. Often it's not that simple and people using your library might expect richer and cross-referenced documentation complete with code samples.&lt;br /&gt;&lt;br /&gt;Many C libraries, including those in GLib and GNOME itself, use inline documentation tags that can be read by tools such as&amp;nbsp;&lt;a href="http://www.gtk.org/gtk-doc/"&gt;gtk-doc&lt;/a&gt;&amp;nbsp;or &lt;a href="http://en.wikipedia.org/wiki/Doxygen"&gt;Doxygen&lt;/a&gt;. Note that gtk-doc works just fine even on low-level non-GLib-using libraries - see e.g. &lt;a href="http://www.kernel.org/pub/linux/utils/kernel/hotplug/libudev/"&gt;libudev&lt;/a&gt; and &lt;a href="http://www.kernel.org/pub/linux/utils/util-linux/libblkid-docs/"&gt;libblkid&lt;/a&gt;&amp;nbsp;API documentation.&lt;br /&gt;&lt;br /&gt;If used with a GLib library, gtk-doc uses the GLib type system to &lt;a href="http://developer.gnome.org/gio/unstable/gio-hierarchy.html"&gt;draw type hierarchies&lt;/a&gt; and show type-specific things like &lt;a href="http://developer.gnome.org/gtk3/unstable/GtkWidget.html#GtkWidget.properties"&gt;properties&lt;/a&gt; and &lt;a href="http://developer.gnome.org/gtk3/unstable/GtkWidget.html#GtkWidget.signals"&gt;signals&lt;/a&gt;. gtk-doc can also easily integrate with any tool producing &lt;a href="http://docbook.org/"&gt;Docbook&lt;/a&gt; documentation such as &lt;a href="http://en.wikipedia.org/wiki/Man_page"&gt;manual pages&lt;/a&gt; or e.g. &lt;a href="http://developer.gnome.org/gio/unstable/gdbus-codegen.html"&gt;gdbus-codegen(1)&lt;/a&gt; when used to generate docs describing D-Bus interfaces (&lt;a href="http://people.freedesktop.org/~david/udisks2-20110628/"&gt;example with C API docs, D-Bus docs and man pages&lt;/a&gt;).&lt;br /&gt;&lt;h2&gt;Checklist&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Decide what level of documentation is needed (HTML, pdf, man pages, etc.).&lt;/li&gt;&lt;li&gt;Try to use standard tools such as Doxygen or gtk-doc.&lt;/li&gt;&lt;li&gt;If shipping commands/daemons/helpers (e.g. anything showing up in &lt;a href="http://en.wikipedia.org/wiki/Ps_(Unix)"&gt;ps(1)&lt;/a&gt; output), consider shipping man pages for those as well.&lt;/li&gt;&lt;/ul&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=5268847417417953349&amp;amp;postID=6659481320170201891" name="language-bindings"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h1&gt;Language bindings&lt;/h1&gt;C libraries are increasingly used from higher-level languages such as &lt;a href="http://en.wikipedia.org/wiki/Python_(programming_language)"&gt;Python&lt;/a&gt; or &lt;a href="http://en.wikipedia.org/wiki/JavaScript"&gt;JavaScript&lt;/a&gt;&amp;nbsp;through a so-called &lt;a href="http://en.wikipedia.org/wiki/Language_binding"&gt;language binding&lt;/a&gt;&amp;nbsp;- for example, this is what allows the &lt;a href="https://live.gnome.org/GnomeShell/"&gt;Desktop Shell&lt;/a&gt; in &lt;a href="http://www.gnome.org/"&gt;GNOME 3&lt;/a&gt; to be written entirely in JavaScript while still using C libraries such as &lt;a href="http://en.wikipedia.org/wiki/GLib"&gt;GLib&lt;/a&gt;, &lt;a href="http://www.clutter-project.org/"&gt;Clutter&lt;/a&gt; and &lt;a href="http://git.gnome.org/browse/mutter/"&gt;Mutter&lt;/a&gt; underneath.&lt;br /&gt;&lt;br /&gt;It's outside the scope of this article to go into detail on language bindings (however a lot of the advice given in this series does apply - see also:&amp;nbsp;&lt;a href="https://live.gnome.org/GObjectIntrospection/WritingBindingableAPIs"&gt;Writing Bindable APIs&lt;/a&gt;) but it's worth pointing out that the goal of the &lt;a href="https://live.gnome.org/GObjectIntrospection"&gt;GObject Introspection&lt;/a&gt; project (which is what is used in GNOME's Shell) is aiming for 100% coverage of GLib libraries assuming the library is properly &lt;a href="https://live.gnome.org/GObjectIntrospection/Annotations"&gt;annotated&lt;/a&gt;.&amp;nbsp;For example, this applies to the &lt;a href="http://www.kernel.org/pub/linux/utils/kernel/hotplug/gudev/"&gt;GUdev library&lt;/a&gt; (a thin wrapper on top of the &lt;a href="http://www.kernel.org/pub/linux/utils/kernel/hotplug/libudev/"&gt;libudev library&lt;/a&gt;) can be used from any language that supports GObject Introspection (&lt;a href="http://git.kernel.org/?p=linux/hotplug/udev.git;a=blob;f=extras/gudev/gjs-example.js;h=5586fd6a61fcd8cfcadd7dc79e25be3e8b210cce;hb=4c748b05a3bd0c36245e71b24dc45e2884f80376"&gt;JS example&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;GObject Intropspection is interesting because if someone adds GObject Introspection support to a new language, X, then the GNOME platform (and a lot of the underlying Linux plumbing as well cf. GUdev) is now suddenly available from that language without any work.&lt;br /&gt;&lt;h2&gt;Checklist&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Make sure your API is easily bindable (avoid C-isms such as&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Variadic_function"&gt;variadic functions&lt;/a&gt;).&lt;/li&gt;&lt;li&gt;If using GLib, set up GObject Introspection and ship GIR/typelibs (&lt;a href="http://blog.verbum.org/2008/10/06/dear-gobjectc-library-authors/"&gt;notes&lt;/a&gt;).&lt;/li&gt;&lt;li&gt;If writing a complicated application, consider writing parts of it in C and parts of it in a higher-level language.&lt;/li&gt;&lt;/ul&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=5268847417417953349&amp;amp;postID=6659481320170201891" name="abi-api-versioning"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h1&gt;ABI, API and versioning&lt;/h1&gt;While the API of a library describes how the programmer use it, the &lt;a href="http://en.wikipedia.org/wiki/Application_binary_interface"&gt;ABI&lt;/a&gt; describes how the API is mapped onto the target machine the library is running on. Roughly, a (shared) library is said to be compatible with a previous version if a recompile is not needed. The ABI involves a lot of factors including &lt;a href="http://en.wikipedia.org/wiki/Data_structure_alignment"&gt;data alignment rules&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Calling_convention"&gt;calling conventions&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Executable_and_Linkable_Format"&gt;file formats&lt;/a&gt; and other things that are not suitable to cover in this series; the important thing to know about when writing C libraries is how (and if) the ABI changes when the API changes. Specifically, since some changes (such as adding a new function) are backwards compatible, the interesting question is what kind of API changes result in non-backwards-compatible ABI changes.&lt;br /&gt;&lt;br /&gt;Assuming all other factors like calling convention are constant, the rule of thumb about compatibility on the ABI level basically boils down to a very short list of allowed API changes:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;you may add new C functions; and&lt;/li&gt;&lt;li&gt;you may add parameters to a function only if it doesn't cause a memory/resource leak; and&lt;/li&gt;&lt;li&gt;you may add a return value to a function returning &lt;a href="http://en.wikipedia.org/wiki/Void_type"&gt;void&lt;/a&gt; only if it doesn't cause a memory leak; and&lt;/li&gt;&lt;li&gt;modifiers such as &lt;a href="http://en.wikipedia.org/wiki/Const-correctness"&gt;const&lt;/a&gt; may be added / removed at will since they are not part of the ABI in C&lt;/li&gt;&lt;/ul&gt;The latter is an example of a change that breaks the API (causing compiler warnings when compiling existing programs that used to compile without warnings) but preserve the ABI (still allowing any previously compiled program to run) - see e.g. &lt;a href="http://git.gnome.org/browse/glib/commit/?id=cdd04f36cac838f92826cbf415868100a4007741"&gt;this GLib commit&lt;/a&gt; for a concrete example (note that this can't be done in C++ because of how &lt;a href="http://en.wikipedia.org/wiki/Name_mangling"&gt;name mangling&lt;/a&gt;&amp;nbsp;work).&lt;br /&gt;&lt;br /&gt;In general, you may not extend C structs that the user can allocate on the stack or embed in another C structure which is why &lt;a href="http://en.wikipedia.org/wiki/Opaque_data_type"&gt;opaque data types&lt;/a&gt; are often used since they can be extended without the user knowing. In case the data type is not opaque, an often used technique is to add padding to structs (&lt;a href="http://git.gnome.org/browse/glib/tree/gio/gvolumemonitor.h?id=2.29.10#n123"&gt;example&lt;/a&gt;) and use it when adding a new virtual method or signal function pointer&amp;nbsp;(&lt;a href="http://git.gnome.org/browse/glib/commit/?id=7a5a2be92b0502deb171830020124bc6c4b9f65e"&gt;example&lt;/a&gt;). Other types, such as enumeration types, may normally be extended with new constants but existing constants may not be changed unless explicitly allowed.&lt;br /&gt;&lt;br /&gt;The semantics of a function, e.g. its &lt;a href="http://en.wikipedia.org/wiki/Side_effect_(computer_science)"&gt;side effect&lt;/a&gt;, is usually considered part of the ABI. For example, if the purpose of a function is to print diagnostics on &lt;a href="http://en.wikipedia.org/wiki/Standard_output"&gt;standard output&lt;/a&gt; and it stops doing it in a later version of the library, one could argue it's an ABI break even when existing programs are able to call the function and return to the caller just fine possibly even returning the same value.&lt;br /&gt;&lt;br /&gt;On Linux, &lt;a href="http://en.wikipedia.org/wiki/Shared_library#Shared_libraries"&gt;shared libraries&lt;/a&gt;&amp;nbsp;(similar to &lt;a href="http://en.wikipedia.org/wiki/Dynamic-link_library"&gt;DLL&lt;/a&gt;s on Windows) use the so-called&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Soname"&gt;soname&lt;/a&gt; to maintain and provide backwards-compatibility as well as allowing having multiple incompatible run-time versions installed at the same time. The latter is achieved by increasing the major version number of a library every time a backwards-incompatible change is made. Additionally, other fields of the soname have other (complex) rules associated (&lt;a href="http://sourceware.org/autobook/autobook/autobook_91.html#SEC91"&gt;more info&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;One solution to managing non-backwards-compatible ABI changes without bumping the so-number is&amp;nbsp;&lt;a href="http://www.akkadia.org/drepper/symbol-versioning"&gt;symbol versioning&lt;/a&gt;&amp;nbsp;- however, apart from being hard to use, it only applies to functions and not e.g. higher-level run-time data structures like e.g. signals, properties and types registered with the GLib type-system.&lt;br /&gt;&lt;br /&gt;It is often desirable to have multiple incompatible versions of libraries and their associated development tools installed at the same time (and in the same prefix) - for example, both version 2 and 3 of &lt;a href="http://www.gtk.org/"&gt;GTK+&lt;/a&gt;. To easily achieve this, many libraries (including GLib and up) include the major version number (which is what is bumped exactly when non-backwards-compatible changes are made) in the library name as well as names of tools and so on - see the &lt;a href="http://ometer.com/parallel.html"&gt;Parallel Installation&lt;/a&gt; essay for more information.&lt;br /&gt;&lt;br /&gt;Some libraries, especially when they are in their early stages of development, specifically gives no ABI guarantees (and thus, does not manage their soname when incompatible changes are made). Often, to better manage expectations, such unstable libraries require that the user defines a macro&amp;nbsp;acknowledging&amp;nbsp;this (&lt;a href="http://git.gnome.org/browse/gnome-online-accounts/tree/src/goa/goa.h?id=3.1.1#n26"&gt;example&lt;/a&gt;). Once the library is baked, this requirement is then removed and normal ABI stability rules starts applying (&lt;a href="http://cgit.freedesktop.org/dbus/dbus/commit/?id=a947713c354462d1235e6ef3d8d3929bf9f080d4"&gt;example&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Related to versioning, it's important to mention that in order for your library to be easy to use, it is absolutely crucial that it includes pkg-config files along with the header files and other development files (&lt;a href="http://www.freedesktop.org/wiki/Software/pkg-config"&gt;more information&lt;/a&gt;).&lt;br /&gt;&lt;h2&gt;Checklist&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Decide what ABI guarantees to give if any (and when)&lt;/li&gt;&lt;li&gt;Make sure your users understand the ABI guarantees (being explicit is good)&lt;/li&gt;&lt;li&gt;If possible, make it possible to have multiple incompatible versions of your library and tools installed at the same time (e.g. include the major version number in the library name)&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-6659481320170201891?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/6659481320170201891/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2011/07/writing-c-library-part-5.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/6659481320170201891'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/6659481320170201891'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2011/07/writing-c-library-part-5.html' title='Writing a C library, part 5'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-8381501082849290290</id><published>2011-07-01T15:19:00.002-04:00</published><updated>2011-07-06T13:00:11.981-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C'/><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='GLib'/><title type='text'>Writing a C library, part 4</title><content type='html'>&lt;i&gt;This is part four in a &lt;a href="http://davidz25.blogspot.com/2011/07/writing-c-library-intro-conclusion-and.html"&gt;series of blog-posts&lt;/a&gt; about best practices for writing C libraries. Previous installments: &lt;a href="http://davidz25.blogspot.com/2011/06/writing-c-library-part-1.html"&gt;part one&lt;/a&gt;, &lt;a href="http://davidz25.blogspot.com/2011/06/writing-c-library-part-2.html"&gt;part two&lt;/a&gt;, &lt;a href="http://davidz25.blogspot.com/2011/06/writing-c-library-part-3.html"&gt;part three&lt;/a&gt;.&lt;/i&gt;&lt;br /&gt;&lt;a href="" name="helpers-and-daemons"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h1&gt;Helpers and daemons&lt;/h1&gt;Occasionally it's useful for a program or library to call upon an external process to do its bidding. There are many reasons for doing this - for example, the code you want to use&lt;br /&gt;&lt;ul&gt;&lt;li&gt;might not be easily used from C - it could be written in say, &lt;a href="http://en.wikipedia.org/wiki/Python_(programming_language)"&gt;python&lt;/a&gt; or, gosh, &lt;a href="http://en.wikipedia.org/wiki/Bash_(Unix_shell)"&gt;bash&lt;/a&gt;; or&lt;/li&gt;&lt;li&gt;could mess with &lt;a href="http://www.kernel.org/doc/man-pages/online/pages/man7/signal.7.html"&gt;signal handlers&lt;/a&gt;&amp;nbsp;or other global process state; or&lt;/li&gt;&lt;li&gt;is not thread-safe or leaking or just bloated; or&lt;/li&gt;&lt;li&gt;its error handling is incompatible with how your library does things; or&lt;/li&gt;&lt;li&gt;the code needs elevated privileges; or&lt;/li&gt;&lt;li&gt;you have a bad feeling about the library&amp;nbsp;but it's not worth (or (politically) feasible) to re-implement the functionality yourself.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;There are three main ways of doing this.&lt;br /&gt;&lt;br /&gt;The first one is to just call &lt;a href="http://www.kernel.org/doc/man-pages/online/pages/man2/fork.2.html"&gt;fork(2)&lt;/a&gt; and start using the new library in the child process - this usually doesn't work because chances are that you are already using libraries that cannot be reliably used after the fork() call as discussed in &lt;a href="http://davidz25.blogspot.com/2011/06/writing-c-library-part-1.html"&gt;previously&lt;/a&gt;&amp;nbsp;(additionally, a lot of unnecessary &lt;a href="http://en.wikipedia.org/wiki/Copy-on-write"&gt;COW&lt;/a&gt; might be happen if the parent process has a lot of writable pages mapped). If portability to Windows is a concern, this is also a non-starter as Windows does not have fork() or any meaningful equivalent that is as efficient.&lt;br /&gt;&lt;br /&gt;The second way is to write a small helper program and distribute the helper along with your library. This also uses fork() but the difference is that one of the &lt;a href="http://www.kernel.org/doc/man-pages/online/pages/man3/exec.3.html"&gt;exec(3)&lt;/a&gt; functions is called immediately in the child process so all previous process state is cleaned up when the process image is replaced&amp;nbsp;(except for file descriptors as they are inherited across exec() so be wary of undesired leaks). If using GLib, there's a couple of (portable) useful&amp;nbsp;&lt;a href="http://developer.gnome.org/glib/unstable/glib-Spawning-Processes.html"&gt;utility functions&lt;/a&gt; to do this (including support for&amp;nbsp;&lt;a href="http://developer.gnome.org/glib/unstable/glib-Spawning-Processes.html#GSpawnFlags"&gt;automatically closing file descriptors&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;The third way is to have your process &lt;a href="http://en.wikipedia.org/wiki/Inter-process_communication"&gt;communicate&lt;/a&gt; with a long-lived helper process (a socalled &lt;a href="http://en.wikipedia.org/wiki/Daemon_(computing)"&gt;daemon&lt;/a&gt;&amp;nbsp;or background process). The helper daemon can be launched either by&amp;nbsp;&lt;a href="http://dbus.freedesktop.org/doc/dbus-daemon.1.html"&gt;dbus-daemon(1)&lt;/a&gt;&amp;nbsp;(if you are using &lt;a href="http://en.wikipedia.org/wiki/D-Bus"&gt;D-Bus&lt;/a&gt; as the IPC mechanism),&amp;nbsp;&lt;a href="http://www.freedesktop.org/wiki/Software/systemd"&gt;systemd&lt;/a&gt;&amp;nbsp;if you are using e.g. &lt;a href="http://www.kernel.org/doc/man-pages/online/pages/man7/unix.7.html"&gt;Unix domain sockets&lt;/a&gt;, an init script (&lt;a href="http://linux.die.net/man/8/uuidd"&gt;uuidd(8)&lt;/a&gt; used to do this - wasteful if your library is not going to get used)&amp;nbsp;or by the library itself.&lt;br /&gt;&lt;br /&gt;Helper daemons usually serve multiple instances of library users, however it is sometimes desirable to have a helper daemon instance per library user instance. Note that having a&amp;nbsp;library spawn a long-lived process by itself is usually a bad idea because the environment and other inherited process state might be wrong (or even insecure) - see &lt;a href="http://0pointer.de/blog/projects/systemd.html"&gt;Rethinking PID 1&lt;/a&gt; for more details on why a good, known, minimal and secure working environment is desirable. Another thing that is horribly difficult to get right (or, rather, horribly easy to get wrong) is &lt;a href="http://en.wikipedia.org/wiki/Singleton_pattern"&gt;uniqueness&lt;/a&gt; - e.g. you want at most one instance of your helper daemon - see &lt;a href="http://blog.verbum.org/2008/04/26/how-to-share-state-with-applications-for-free-unix-based-desktops/"&gt;Colin's notes for details and how D-Bus can be used&lt;/a&gt;&amp;nbsp;and note that things like &lt;a href="http://developer.gnome.org/gio/unstable/GApplication.html#GApplication.description"&gt;GApplication&lt;/a&gt; has built-in support for uniqueness. Also, in a system-level daemon, note that you might need to set things like the &lt;a href="http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob;f=include/linux/sched.h;h=781abd13767302cce2ba08db01a211e3178de0d9;hb=61c4f2c81c61f73549928dfd9f3e8f26aa36a8cf#l1374"&gt;loginuid&lt;/a&gt;&amp;nbsp;(&lt;a href="http://cgit.freedesktop.org/accountsservice/commit/?id=224b7e93a27a1ab5cf2eec2f56bc3adafd02e7af"&gt;example of how to do this&lt;/a&gt;)&amp;nbsp;so things like&amp;nbsp;&lt;a href="http://people.redhat.com/sgrubb/audit/"&gt;auditing&lt;/a&gt; work when rendering service for a client (this is related to the Windows concept known as &lt;a href="http://technet.microsoft.com/en-us/library/cc961980.aspx"&gt;impersonation&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;As an example, GLib's &lt;a href="http://code.google.com/p/libproxy/"&gt;libproxy&lt;/a&gt;-based &lt;a href="http://developer.gnome.org/gio/unstable/GProxy.html"&gt;GProxy&lt;/a&gt; implementation uses a helper daemon&amp;nbsp;because dealing with &lt;a href="http://en.wikipedia.org/wiki/Proxy_server"&gt;proxy servers&lt;/a&gt; involves a interpreting &lt;a href="http://en.wikipedia.org/wiki/JavaScript"&gt;JavaScript&lt;/a&gt;&amp;nbsp;(!) and initializing a JS interpreter from every process wanting to make a connection is too much overhead not to mention the pollution caused (&lt;a href="http://git.gnome.org/browse/glib-networking/tree/proxy/libproxy/glibpacrunner.c?id=2.28.7#n128"&gt;source&lt;/a&gt;, &lt;a href="http://git.gnome.org/browse/glib-networking/tree/proxy/libproxy/org.gtk.GLib.PACRunner.service.in?id=2.28.7"&gt;D-Bus activation file&lt;/a&gt;&amp;nbsp;-&amp;nbsp;also note &lt;a href="http://git.gnome.org/browse/glib-networking/tree/proxy/gnome/gproxyresolvergnome.c?id=2.28.7#n310"&gt;how the helper daemon is activated&lt;/a&gt; by simply creating a &lt;a href="http://developer.gnome.org/gio/unstable/GDBusProxy.html#GDBusProxy.description"&gt;D-Bus proxy&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;If the helper needs to run with elevated privileges, a framework like &lt;a href="http://hal.freedesktop.org/docs/polkit/polkit.8.html"&gt;PolicyKit&lt;/a&gt; is convenient to use (for checking whether the process using your library is authorized) since it nicely integrates with the &lt;a href="http://davidz25.blogspot.com/2011/02/gnome-3-authorization.html"&gt;desktop shell&lt;/a&gt;&amp;nbsp;(and also&amp;nbsp;&lt;a href="http://davidz25.blogspot.com/2011/02/policykit-textual-authentication.html"&gt;console/ssh logins&lt;/a&gt;). If your library is just using a short-lived helper program, it's even simpler: just use the &lt;a href="http://hal.freedesktop.org/docs/polkit/pkexec.1.html"&gt;pkexec(1)&lt;/a&gt; command to launch your helper (&lt;a href="http://git.gnome.org/browse/gnome-power-manager/tree/src/gpm-backlight-helper.c?id=GNOME_POWER_MANAGER_3_0_2#n138"&gt;example&lt;/a&gt;, &lt;a href="http://git.gnome.org/browse/gnome-power-manager/tree/policy/org.gnome.power.policy.in2?id=GNOME_POWER_MANAGER_3_0_2"&gt;policy file&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;As an aside (since this write-up is about C libraries, not &lt;a href="http://en.wikipedia.org/wiki/Software_architecture"&gt;software architecture&lt;/a&gt;), many subsystems in today's Linux desktop are implemented as a system-level daemons (often running &lt;a href="http://en.wikipedia.org/wiki/Superuser"&gt;privileged&lt;/a&gt;) with the primary API being a D-Bus API (&lt;a href="http://people.freedesktop.org/~david/udisks2-20110628/ref-dbus.html"&gt;example&lt;/a&gt;) and a C library to access the functionality either not existing at all (applications then use generic D-Bus libraries or tools like &lt;a href="http://developer.gnome.org/gio/unstable/gdbus.html"&gt;gdbus(1)&lt;/a&gt; or &lt;a href="http://dbus.freedesktop.org/doc/dbus-send.1.html"&gt;dbus-send(1)&lt;/a&gt;) or mostly &lt;a href="http://developer.gnome.org/gio/unstable/gdbus-codegen.html"&gt;generated&lt;/a&gt; from the &lt;a href="http://en.wikipedia.org/wiki/Interface_description_language"&gt;IDL&lt;/a&gt;-like &lt;a href="http://cgit.freedesktop.org/udisks/tree/data/org.freedesktop.UDisks2.xml?h=gdbus-port&amp;amp;id=9363381604e807a3b4d2c57b7940cb785c259dcb"&gt;D-Bus XML&lt;/a&gt; definition files (&lt;a href="http://people.freedesktop.org/~david/udisks2-20110628/ref-library.html"&gt;example&lt;/a&gt;). It's useful to contrast this approach to libraries using helpers since one is more or less upside down compared to the other.&lt;br /&gt;&lt;h2&gt;Checklist&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Identify when a helper program or helper daemon is needed&lt;/li&gt;&lt;li&gt;If possible, use &lt;a href="http://www.freedesktop.org/wiki/Software/dbus"&gt;D-Bus&lt;/a&gt; (or similar) for activation / uniqueness of helper daemons.&lt;/li&gt;&lt;li&gt;Communicating with a helper via the D-Bus protocol (instead of using a custom binary protocol) adds a layer of safety because message contents are checked.&lt;/li&gt;&lt;li&gt;Using D-Bus through a &lt;a href="http://dbus.freedesktop.org/doc/dbus-specification.html#message-bus"&gt;message bus&lt;/a&gt;&amp;nbsp;router (instead of peer-to-peer connections) adds yet another layer of safety since the two processes are connected through an intermediate router process (a &lt;a href="http://dbus.freedesktop.org/doc/dbus-daemon.1.html"&gt;dbus-daemon(1)&lt;/a&gt; instance) which will also validate messages and disconnects processes sending garbage.&lt;/li&gt;&lt;li&gt;Hence, if the helper is privileged (meaning that it must &lt;b&gt;a)&lt;/b&gt; treat the unprivileged application/library using it as untrusted and potentially compromised; and &lt;b&gt;b)&lt;/b&gt; validate all data to it - see &lt;a href="http://www.dwheeler.com/secure-programs/"&gt;Wheeler's Secure Programming notes&lt;/a&gt;&amp;nbsp;for details), activating a helper daemon on the D-Bus system bus is often a better idea than using a&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Setuid"&gt;setuid root&lt;/a&gt; helper program spawned yourself.&lt;/li&gt;&lt;li&gt;If possible, in particular if you are writing code that is used on the Linux desktop, use &lt;a href="http://hal.freedesktop.org/docs/polkit/polkit.8.html"&gt;PolicyKit&lt;/a&gt; (or similar) in privileged code to check if unprivileged code is authorized to carry out the requested operation.&lt;/li&gt;&lt;/ul&gt;&lt;a href="" name="testing"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h1&gt;Testing&lt;/h1&gt;A sign of maturity is when a library or application comes with a&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Test_suite"&gt;test suite&lt;/a&gt;; a good test suite is also incredible useful for ensuring mostly bug-free releases and, more importantly, ensuring that the maintainer is comfortable putting releases out without loosing too much sleep or sanity. Discussing specifics of testing is out of the scope for a series on writing C libraries, but it's worth pointing to the &lt;a href="http://developer.gnome.org/glib/unstable/glib-Testing.html#glib-Testing.description"&gt;GLib test framework&lt;/a&gt;, how it's used&amp;nbsp;(&lt;a href="http://git.gnome.org/browse/glib/tree/glib/tests/gvariant.c?id=2.29.8#n4040"&gt;example&lt;/a&gt;, &lt;a href="http://git.gnome.org/browse/glib/tree/gio/tests/gdbus-connection.c?id=2.29.8#n120"&gt;example&lt;/a&gt; and &lt;a href="http://git.gnome.org/browse/glib/tree/glib/tests/bitlock.c?id=2.29.8"&gt;example&lt;/a&gt;) and how this is used by e.g. the &lt;a href="http://build.gnome.org/"&gt;GNOME buildbots&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;One metric for measuring how good a test suite is (or at least how &lt;i&gt;extensive&lt;/i&gt; it is), is determining how much of the code it covers - for this, the&amp;nbsp;&lt;a href="http://gcc.gnu.org/onlinedocs/gcc/Gcov.html"&gt;gcov&lt;/a&gt; tool can be used - see &lt;a href="http://people.redhat.com/berrange/dbus-coverage/"&gt;notes on how this is used in D-Bus&lt;/a&gt;. Specifically, if the test suite does not cover some edge case, the code paths for handling said edge case will appear as never being executed. Or if the code base handles &lt;a href="http://en.wikipedia.org/wiki/Out_of_memory"&gt;OOM&lt;/a&gt; but the test suite isn't set up to handle it (for example, &lt;a href="http://cgit.freedesktop.org/dbus/dbus/tree/dbus/dbus-internals.c?id=dbus-1.5.2#n952"&gt;by failing each allocation&lt;/a&gt;) the code-paths for handling OOM should appear as untested.&lt;br /&gt;&lt;br /&gt;Innovative approaches to testing can often help - for example, &lt;a href="http://www.mozilla.org/"&gt;Mozilla&lt;/a&gt; employ a technique known as &lt;a href="http://weblogs.mozillazine.org/roc/archives/2008/12/reftests.html"&gt;reftests&lt;/a&gt; (see also:&amp;nbsp;&lt;a href="http://mail.gnome.org/archives/gtk-devel-list/2011-May/msg00003.html"&gt;notes on GTK+ reftests&lt;/a&gt;) while the&amp;nbsp;&lt;a href="http://fedoraproject.org/wiki/Dracut"&gt;Dracut&lt;/a&gt;&amp;nbsp;&lt;a href="http://git.kernel.org/?p=boot/dracut/dracut.git;a=tree;f=test;h=11e80f7337f55aebd0e0c85ebb853c2e85f090e8;hb=829c2585547d86c84cbb3113c73b5dd7fcb7b30d"&gt;test suite&lt;/a&gt;&amp;nbsp;employs &lt;a href="http://en.wikipedia.org/wiki/Virtual_machine"&gt;VMs&lt;/a&gt; for both &lt;a href="http://en.wikipedia.org/wiki/SCSI_initiator_and_target"&gt;client and server&lt;/a&gt; to&amp;nbsp;&lt;a href="http://git.kernel.org/?p=boot/dracut/dracut.git;a=blob;f=test/TEST-30-ISCSI/test.sh;h=32c0d5772cbbbaa91f00478d3ff6383710978923;hb=829c2585547d86c84cbb3113c73b5dd7fcb7b30d"&gt;test that&lt;/a&gt; booting from &lt;a href="http://en.wikipedia.org/wiki/ISCSI"&gt;iSCSI&lt;/a&gt; work.&lt;br /&gt;&lt;h2&gt;Checklist&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Start writing a test suite as early as possible.&lt;/li&gt;&lt;li&gt;Use tools like gcov to ascertain how good the test suite is.&lt;/li&gt;&lt;li&gt;Run the test suite often - ideally integrate it into the build system ('make check'), release procedures, version control etc.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-8381501082849290290?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/8381501082849290290/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2011/07/writing-c-library-part-4.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/8381501082849290290'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/8381501082849290290'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2011/07/writing-c-library-part-4.html' title='Writing a C library, part 4'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-962958701966019286</id><published>2011-06-29T18:12:00.003-04:00</published><updated>2011-07-06T12:59:54.931-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C'/><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='GLib'/><title type='text'>Writing a C library, part 3</title><content type='html'>&lt;i&gt;This is part three in a &lt;a href="http://davidz25.blogspot.com/2011/07/writing-c-library-intro-conclusion-and.html"&gt;series of blog-posts&lt;/a&gt; about best practices for writing C libraries. Previous installments: &lt;a href="http://davidz25.blogspot.com/2011/06/writing-c-library-part-1.html"&gt;part one&lt;/a&gt;, &lt;a href="http://davidz25.blogspot.com/2011/06/writing-c-library-part-2.html"&gt;part two&lt;/a&gt;.&lt;/i&gt;&lt;br /&gt;&lt;a href="" name="modularity"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h1&gt;Modularity and namespaces&lt;/h1&gt;The C programming language does not support the concept of &lt;a href="http://en.wikipedia.org/wiki/Namespace_(computer_science)"&gt;namespaces&lt;/a&gt;&amp;nbsp;(as used in e.g. C++ or Python) so it is usually emulated simply by using naming conventions. The main reason of namespaces is to avoid&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Naming_collision"&gt;naming collisions&lt;/a&gt;&amp;nbsp;- consider both libwoot and libkool providing a function called get_all_objects() - which one should be used if a program links to both libraries? Namespacing is an important part of a naming strategy and applies to variables, function names, type names (including structs, unions, enums and typedefs) and macros.&lt;br /&gt;&lt;br /&gt;The standard convention is to use a short identifier, e.g. for &lt;a href="http://projects.gnome.org/NetworkManager/developers/libnm-glib/09/index.html"&gt;libnm-glib&lt;/a&gt; you will see nm_ and NM being used, for &lt;a href="http://docs.clutter-project.org/docs/clutter/unstable/"&gt;Clutter&lt;/a&gt; it's clutter and Clutter and for &lt;a href="http://hal.freedesktop.org/docs/polkit/ref-authentication-agent-api.html"&gt;libpolkit-agent-1&lt;/a&gt;, it's polkit_agent and PolkitAgent. For libraries that don't use &lt;a href="http://en.wikipedia.org/wiki/CamelCase"&gt;CamelCase&lt;/a&gt; for its types, the same prefix is normally used for functions and types - for example,&amp;nbsp;&lt;a href="http://www.kernel.org/pub/linux/utils/kernel/hotplug/libudev/"&gt;libudev&lt;/a&gt; the prefix used is simply udev.&lt;br /&gt;&lt;br /&gt;Code that isn't using namespaces properly is not only hard to integrate into other libraries and applications (the chance of symbol collisions is high), there's also a chance that it will collide with future additions to the standard C library or POSIX standards.&lt;br /&gt;&lt;br /&gt;One benefit of using namespaces in C (one that ironically is not present in a language with proper support for namespaces), is that it's a lot easier to pinpoint what the code is doing by just looking at a fragment of the source code - e.g. when you see an item being added to a container, you are usually not in doubt whether the programmer meant to invoke GtkContainer's &lt;a href="http://developer.gnome.org/gtk3/unstable/GtkContainer.html#gtk-container-add"&gt;add()&lt;/a&gt; method or ClutterContainer's &lt;a href="http://docs.clutter-project.org/docs/clutter/unstable/ClutterContainer.html#clutter-container-add"&gt;add()&lt;/a&gt; method because of how C namespacing forces the programmer to be explicit, for better or worse.&lt;br /&gt;&lt;br /&gt;In addition to choosing a good naming strategy, note that the visibility of what symbols (typically variables and functions) a library export can be fine-tuned, see &lt;a href="http://gcc.gnu.org/wiki/Visibility"&gt;these notes&lt;/a&gt; for why this is desirable.&lt;br /&gt;&lt;br /&gt;On the topic of naming, it is usually a good idea to avoid C++ keywords (such as "class") for variable names, at least in header files that you except C++ code to include using e.g. &lt;a href="http://en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B#Linking_C_and_C.2B.2B_code"&gt;extern "C"&lt;/a&gt;. Additionally, generally avoid names of functions in the C standard library / POSIX for variable names such as "interface" or "index" because these functions can (and on Linux, actually is) be defined as macros.&lt;br /&gt;&lt;h2&gt;Checklist&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Choose a naming convention - and stick to it.&lt;/li&gt;&lt;li&gt;Do not export symbols that are not public API.&lt;/li&gt;&lt;/ul&gt;&lt;a href="" name="error-handling"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h1&gt;Error handling&lt;/h1&gt;If there's one statement that adequately describes error handling in the C programming language, it's perhaps that it's something that people rarely agree on. Most programmers, however, would agree that errors can be broken down into two categories &lt;b&gt;1) &lt;/b&gt;programmer errors; &lt;b&gt;2)&lt;/b&gt;&amp;nbsp;run-time errors.&lt;br /&gt;&lt;br /&gt;A &lt;i&gt;programmer error&lt;/i&gt; is when the programmer isn't using a function correctly&amp;nbsp;- e.g. passing a non-&lt;a href="http://en.wikipedia.org/wiki/UTF-8"&gt;UTF-8&lt;/a&gt; string to a function expecting a valid UTF-8 string such as &lt;a href="http://developer.gnome.org/glib/unstable/glib-GVariant.html#g-variant-new-string"&gt;g_variant_new_string()&lt;/a&gt;&amp;nbsp;(if unsure, validate with &lt;a href="http://developer.gnome.org/glib/unstable/glib-Unicode-Manipulation.html#g-utf8-validate"&gt;g_utf8_validate()&lt;/a&gt; before calling the function) or passing an invalid D-Bus name to &lt;a href="http://developer.gnome.org/gio/unstable/gio-Owning-Bus-Names.html#g-bus-own-name"&gt;g_bus_own_name()&lt;/a&gt;&amp;nbsp;(if unsure, validate with &lt;a href="http://developer.gnome.org/gio/unstable/gio-D-Bus-Utilities.html#g-dbus-is-name"&gt;g_dbus_is_name()&lt;/a&gt; and &lt;a href="http://developer.gnome.org/gio/unstable/gio-D-Bus-Utilities.html#g-dbus-is-unique-name"&gt;g_dbus_is_unique_name()&lt;/a&gt;&amp;nbsp;before calling).&lt;br /&gt;&lt;br /&gt;Most libraries have undefined behavior in the presence of being used incorrectly - in the GLib case the macros &lt;a href="http://developer.gnome.org/glib/unstable/glib-Warnings-and-Assertions.html#g-return-if-fail"&gt;g_return_if_fail()&lt;/a&gt; / &lt;a href="http://developer.gnome.org/glib/unstable/glib-Warnings-and-Assertions.html#g-return-val-if-fail"&gt;g_return_val_if_fail()&lt;/a&gt; are used, see e.g. the&amp;nbsp;&lt;a href="http://git.gnome.org/browse/glib/tree/glib/gvariant.c?id=2.29.8#n1116"&gt;checks in g_variant_new_string()&lt;/a&gt;&amp;nbsp;and the &lt;a href="http://git.gnome.org/browse/glib/tree/gio/gdbusnameowning.c?id=2.29.8#n596"&gt;checks in g_dbus_own_name()&lt;/a&gt;. &amp;nbsp;Additionally, for performance, these checks can be disabled by defining the macro G_DISABLE_CHECKS when building either GLib itself or applications using GLib (but usually aren't). Not all parameters may be checked, however, and the check might not cover all cases because checks can be expensive. Combined with the G_DEBUG flag, it's even easy to trap this in debugger by running the program in an environment where &lt;a href="http://developer.gnome.org/glib/unstable/glib-running.html"&gt;G_DEBUG=fatal-warnings&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Having g_return_if_fail()-style checks is usually a trade-off - for example, GLib didn't initially have the UTF-8 check in g_variant_new_string() - it was only added when it became apparent that a considerable amount of users passed non-UTF-8 data which caused errors in unrelated code that was extremely hard to track down - see the &lt;a href="http://git.gnome.org/browse/glib/commit/glib/gvariant.c?id=5e6f762d61db1a5c64bd1d33e5ba112755106581"&gt;commit message&lt;/a&gt; for details. If this cost is unacceptable, the programmer can easily use the&amp;nbsp;&lt;a href="http://developer.gnome.org/glib/unstable/glib-GVariant.html#g-variant-new-from-data"&gt;g_variant_new_from_data()&lt;/a&gt;&amp;nbsp;function passing TRUE as the &lt;i&gt;trusted&lt;/i&gt;&amp;nbsp;parameter.&lt;br /&gt;&lt;br /&gt;Even with a library doing proper parameter validation (to catch programmer errors early on), if you pass garbage to a function you usually end up with&amp;nbsp;&lt;a href="http://blog.llvm.org/2011/05/what-every-c-programmer-should-know.html"&gt;undefined behavior&lt;/a&gt;&amp;nbsp;and undefined behavior can mean&amp;nbsp;&lt;i&gt;anything&lt;/i&gt;&amp;nbsp;including formatting your hard disk or evaporating all booze in a five-mile radius (oh noz). That's why some libraries simply calls&amp;nbsp;&lt;a href="http://www.kernel.org/doc/man-pages/online/pages/man3/abort.3.html"&gt;abort()&lt;/a&gt;&amp;nbsp;instead of carrying on pretending nothing happened. In general, a C library can &lt;b&gt;never&lt;/b&gt;&amp;nbsp;guarantee that it won't blow up no matter what data is passed - for example the user may pass a pointer to invalid data and, boom, &lt;a href="http://en.wikipedia.org/wiki/SIGSEGV"&gt;SIGSEGV&lt;/a&gt; is raised when the library tries to accesses it. Of course the library &lt;i&gt;could&lt;/i&gt;&amp;nbsp;try to recover, &lt;a href="http://www.kernel.org/doc/man-pages/online/pages/man3/longjmp.3.html"&gt;longjmp(3)&lt;/a&gt; style, but since it's a library it can't mess around with process-wide state like signal handlers. Unfortunately, even smart people sometime&amp;nbsp;&lt;a href="http://lwn.net/Articles/449517/"&gt;fail to realize that the caller has a responsibility&lt;/a&gt;&amp;nbsp;and instead blames the library instead of its user (for the record, libdbus-1 is fine which is why&amp;nbsp;&lt;a href="http://www.freedesktop.org/wiki/Software/systemd"&gt;process 1&lt;/a&gt;&amp;nbsp;is able to use it without any problems). In most cases, problems like these are solved by just throwing documentation at the problem.&lt;br /&gt;&lt;br /&gt;To conclude, when it comes to programmer errors, one key take away is that it's a good idea to document exactly what kind of input a function accepts. As the saying goes, &lt;a href="http://cs.nyu.edu/~dodis/quotes.html"&gt;"trust is good, control is better"&lt;/a&gt;, it is also a good idea to verify that the programmer gets it right by using g_return_if_fail() style checks (and possibly provide API that does no such checks). Also, if your code does any kinds of checks, make sure that the functions used for checking (if non-trivial) are public so e.g. language bindings have a chance to validate input before calling the function (see also: &lt;a href="http://lists.freedesktop.org/archives/dbus/2007-October/008679.html"&gt;notes on errors in libdbus&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;A &lt;i&gt;run-time&lt;/i&gt;&amp;nbsp;error is e.g. if &lt;a href="http://www.kernel.org/doc/man-pages/online/pages/man3/fopen.3.html"&gt;fopen(3)&lt;/a&gt; returns NULL (for example the file to be opened does not exist or the calling process is not privileged to open it),&amp;nbsp;&lt;a href="http://developer.gnome.org/gio/unstable/GSocketClient.html#g-socket-client-connect"&gt;g_socket_client_connect()&lt;/a&gt; returns FALSE (the network might not be up) or &lt;a href="http://developer.gnome.org/glib/unstable/glib-Memory-Allocation.html#g-try-malloc"&gt;g_try_malloc()&lt;/a&gt; returns NULL (might not have enough address space for a 8GiB array). By definition, run-time errors are recoverable although the code you are using might treat some (like &lt;a href="http://www.kernel.org/doc/man-pages/online/pages/man3/malloc.3.html"&gt;malloc(3)&lt;/a&gt; failing) as irrecoverable&amp;nbsp;because handling some run-time errors (such as &lt;a href="http://en.wikipedia.org/wiki/Out_of_memory"&gt;OOM)&lt;/a&gt; would complicate the API not only on the function level (possibly by taking an error parameter), but also by requiring &lt;a href="http://en.wikipedia.org/wiki/Atomicity_(database_systems)"&gt;transactional semantics&lt;/a&gt;&amp;nbsp;(e.g. rollback) on most data types&amp;nbsp;(see also:&amp;nbsp;&lt;a href="http://blog.ometer.com/2008/02/04/out-of-memory-handling-d-bus-experience/"&gt;write-up on why handling OOM is hard&lt;/a&gt;&amp;nbsp;and a&amp;nbsp;&lt;a href="http://lwn.net/Articles/449481/"&gt;good explanation of Linux's overcommit feature&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;For simple libraries just using &lt;a href="http://en.wikipedia.org/wiki/Errno"&gt;libc's errno&lt;/a&gt; is often simplest approach to handling run-time errors (since it's thread-safe and every C programmer knows it) but note that some functions including &lt;a href="http://www.kernel.org/doc/man-pages/online/pages/man3/asprintf.3.html"&gt;asprintf(3)&lt;/a&gt;&amp;nbsp;does not set errno to ENOMEM if e.g. failing to allocate memory. If you are basing your code on a library like GLib, use its native error type, e.g. &lt;a href="http://developer.gnome.org/glib/unstable/glib-Error-Reporting.html#glib-Error-Reporting.description"&gt;GError&lt;/a&gt;, for run-time errors. An interesting approach to handling errors &lt;a href="http://www.cairographics.org/manual/cairo-Error-handling.html"&gt;is the one&lt;/a&gt; used by the &lt;a href="http://www.cairographics.org/"&gt;cairo 2D graphics library&lt;/a&gt;&amp;nbsp;where (non-trivial) object instances&amp;nbsp;track the error state&amp;nbsp;(see e.g. &lt;a href="http://www.cairographics.org/manual/cairo-cairo-t.html#cairo-status"&gt;cairo_status()&lt;/a&gt; and &lt;a href="http://www.cairographics.org/manual/cairo-cairo-device-t.html#cairo-device-status"&gt;cairo_device_status()&lt;/a&gt;). There are many many other ways to convey run-time errors - as always, the important thing when writing a C library is to be consistent.&lt;br /&gt;&lt;h2&gt;Checklist&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Document valid and invalid value ranges for parameters (if any) and provide facilities to validate parameters (unless trivial) for programmers and language bindings&lt;/li&gt;&lt;li&gt;Try to validate incoming parameters at public API boundaries&lt;/li&gt;&lt;li&gt;Establish a policy on how to deal with programmer errors (e.g. undefined behavior or abort()).&lt;/li&gt;&lt;li&gt;Establish a policy on how to deal with run-time errors (e.g. use errno or GError)&lt;/li&gt;&lt;li&gt;Ensure the way you handle run-time errors map to common &lt;a href="http://en.wikipedia.org/wiki/Exception_handling"&gt;exception handling&lt;/a&gt; systems.&lt;/li&gt;&lt;/ul&gt;&lt;a href="" name="encapsulation-and-oo"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h1&gt;Encapsulation and OO design&lt;/h1&gt;While C as programming language does not have built-in support for&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Object-oriented_programming"&gt;object-oriented programming&lt;/a&gt;&amp;nbsp;lots of C programmers use C that way - in many ways it's almost hard &lt;i&gt;not&lt;/i&gt;&amp;nbsp;to. In fact, many C programmers regard the simplicity of C (compared to, say, &lt;a href="http://en.wikipedia.org/wiki/C%2B%2B"&gt;C++&lt;/a&gt;) as a feature insofar that you are not bound to any one &lt;a href="http://en.wikipedia.org/wiki/Object_model"&gt;object model&lt;/a&gt;&amp;nbsp;- for example, the kernel uses &lt;a href="http://lwn.net/Articles/444910/"&gt;various&lt;/a&gt; &lt;a href="http://lwn.net/Articles/446317/"&gt;OO techniques&lt;/a&gt;&amp;nbsp;and the GLib/GTK+ stack has its own dynamic type system called&amp;nbsp;&lt;a href="http://developer.gnome.org/gobject/unstable/pt01.html"&gt;GType&lt;/a&gt;&amp;nbsp;on which the&amp;nbsp;&lt;a href="http://developer.gnome.org/gobject/unstable/gobject-The-Base-Object-Type.html#gobject-The-Base-Object-Type.description"&gt;GObject base class&lt;/a&gt;&amp;nbsp;(that many classes are derived from) is built.&lt;br /&gt;&lt;br /&gt;There's of course a price to pay for defining your own object model - it typically involves more typing (identifiers are longer) and, especially for GObject, involves actual function calls to &lt;a href="http://developer.gnome.org/gobject/unstable/gobject-The-Base-Object-Type.html#g-object-class-install-property"&gt;register properties&lt;/a&gt;, &lt;a href="http://developer.gnome.org/gobject/unstable/gobject-Type-Information.html#g-type-class-add-private"&gt;add private instance data&lt;/a&gt; and so on (&lt;a href="http://git.gnome.org/browse/clutter/tree/clutter/clutter-actor.c?id=1.7.2#n3786"&gt;example&lt;/a&gt;). On the other hand, such a dynamic type system often offer some level of&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Reflection_(computer_programming)"&gt;type introspection&lt;/a&gt;&amp;nbsp;so it's possible to easy link the property for &lt;a href="http://developer.gnome.org/gtk3/unstable/GtkToggleButton.html#GtkToggleButton--active"&gt;whether a check-button widget is active&lt;/a&gt; with &lt;a href="http://developer.gnome.org/gtk3/unstable/GtkEntry.html#GtkEntry--visibility"&gt;whether an text-entry widget should use password mode&lt;/a&gt; using the&amp;nbsp;&lt;a href="http://developer.gnome.org/gobject/unstable/GBinding.html#g-object-bind-property"&gt;g_object_bind_property()&lt;/a&gt; function (&lt;a href="http://people.freedesktop.org/~david/palimpsest-entry-checkbutton-binding.png"&gt;screenshot&lt;/a&gt;).&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Polymorphism_in_object-oriented_programming"&gt;Polymorphism&lt;/a&gt;&amp;nbsp;in GObject is provided by embedding a&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Vtable"&gt;virtual method table&lt;/a&gt;&amp;nbsp;in the class struct (&lt;a href="http://git.gnome.org/browse/gnome-online-accounts/tree/src/goabackend/goaprovider.h?id=3.1.0#n57"&gt;example&lt;/a&gt;) and providing a C functions that uses the function pointer (&lt;a href="http://git.gnome.org/browse/gnome-online-accounts/tree/src/goabackend/goaprovider.c?id=3.1.0#n313"&gt;example&lt;/a&gt;) - note that derived types can access the class struct to chain up (&lt;a href="http://git.gnome.org/browse/gnome-online-accounts/tree/src/goabackend/goagoogleprovider.c?id=3.1.0#n245"&gt;example&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;One important feature of object-oriented design in C is that it usually promotes &lt;a href="http://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming)"&gt;encapsulation&lt;/a&gt;&amp;nbsp;and data hiding through the use of&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Opaque_data_type"&gt;opaque data types&lt;/a&gt;&amp;nbsp;- this is desirable as it allows extending the data type (e.g. adding more properties or methods) without breaking or requiring a recompile existing programs using the library (a future installment will discuss &lt;a href="http://en.wikipedia.org/wiki/Application_programming_interface"&gt;API&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Application_binary_interface"&gt;ABI&lt;/a&gt;&amp;nbsp;and what it means wrt. API design). In an opaque data type, fields that would usually be in the &lt;a href="http://en.wikipedia.org/wiki/Struct_(C_programming_language)"&gt;C struct&lt;/a&gt; are hidden from the user and instead are made available via a getter (&lt;a href="http://developer.gnome.org/gio/unstable/GApplication.html#g-application-get-flags"&gt;example&lt;/a&gt;) and/or setter (&lt;a href="http://developer.gnome.org/gio/unstable/GApplication.html#g-application-set-flags"&gt;example&lt;/a&gt;) - additionally, if the object model support properties, the member may also be made available as a property (&lt;a href="http://developer.gnome.org/gio/unstable/GApplication.html#GApplication--flags"&gt;example&lt;/a&gt;) - for example, this is useful for &lt;a href="http://developer.gnome.org/gobject/unstable/gobject-The-Base-Object-Type.html#GObject-notify"&gt;notifying when the property changes&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Of course, not every single data structure need to be a full-blown GObject - for example, in some cases data hiding might not be desirable (sometimes it's awkward to use a C getter function) or maybe it's too slow to do from an inner loop (direct struct access is without a doubt faster). Also, for simple data structures it is sometimes desirable to initialize struct instances directly in the code.&lt;br /&gt;&lt;br /&gt;Even when a full-blown object model (like GType and GObject) isn't used, it's never a bad idea to use opaque data structures and getters/setters. As an interesting alternative to this, note that some libraries explicitly &lt;a href="http://git.0pointer.de/?p=libatasmart.git;a=blob;f=atasmart.h;h=aa4e339cb4bfa882c7d1b5608663d000d0166ba0;hb=HEAD#l106"&gt;allows extending a C structure without considering it an ABI change&lt;/a&gt; - while there's no easy way to enforce this (the user may allocate the structure on the stack), at least the library author can always tell the programmer that he shouldn't have done so (which may or may not be useful).&lt;br /&gt;&lt;h2&gt;Checklist&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Establish an object model for your library (if applicable).&lt;/li&gt;&lt;li&gt;Hide as many implementation details as is practical without impacting performance&lt;/li&gt;&lt;li&gt;Ensure that you can extend your library and types without breaking API or ABI.&lt;/li&gt;&lt;li&gt;If possible, build on top of an established and well-understood object system (such as the GLib one)&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-962958701966019286?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/962958701966019286/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2011/06/writing-c-library-part-3.html#comment-form' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/962958701966019286'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/962958701966019286'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2011/06/writing-c-library-part-3.html' title='Writing a C library, part 3'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-7806945138700399040</id><published>2011-06-28T16:15:00.003-04:00</published><updated>2011-07-06T12:59:38.510-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C'/><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='GLib'/><title type='text'>Writing a C library, part 2</title><content type='html'>&lt;i&gt;This is part two in a &lt;a href="http://davidz25.blogspot.com/2011/07/writing-c-library-intro-conclusion-and.html"&gt;series of blog-posts&lt;/a&gt; about best practices for writing C libraries. Previous installments: &lt;a href="http://davidz25.blogspot.com/2011/06/writing-c-library-part-1.html"&gt;part one&lt;/a&gt;.&lt;/i&gt;&lt;br /&gt;&lt;a href="" name="event-handling"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h1&gt;Event handling and the main loop&lt;/h1&gt;Event-driven applications, especially &lt;a href="http://en.wikipedia.org/wiki/Graphical_user_interface"&gt;GUI&lt;/a&gt; applications, are often built around the idea of a "main loop" that intercepts and dispatches all sorts of events such as key/button presses, incoming &lt;a href="http://en.wikipedia.org/wiki/Inter-process_communication"&gt;IPC&lt;/a&gt; calls, mouse movements, timers and file/socket I/O and so on. The main loop typically "call back" into the application whenever an event happens.&lt;br /&gt;&lt;br /&gt;For example, the GLib/Gtk+ library stack is built around the &lt;a href="http://developer.gnome.org/glib/unstable/glib-The-Main-Event-Loop.html#glib-The-Main-Event-Loop.description"&gt;GMainContext, GMainLoop and GSource&lt;/a&gt; types and other library stacks provide similar abstractions. Many kernel and systems-level programmers often look funny at GUI programmers when they utter the word "main loop" - much the same way GUI programmers stare confused at kernel programmers when they say &lt;a href="http://www.win.tue.nl/~aeb/linux/lk/lk-13.html#ss13.2"&gt;put() or get()&lt;/a&gt; something. The truth is that a main-loop is really a well-known concept with a different name: it's basically an abstraction of OS primitives such as &lt;a href="http://www.kernel.org/doc/man-pages/online/pages/man2/select.2.html"&gt;select(2)&lt;/a&gt;, &lt;a href="http://www.kernel.org/doc/man-pages/online/pages/man2/poll.2.html"&gt;poll(2)&lt;/a&gt; or equivalent on e.g. &lt;a href="http://en.wikipedia.org/wiki/Windows_API"&gt;Windows&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;It is important to note that a multi-threaded application may run different main loops in different threads to ensure that callbacks happen in the right threads - in GLib this is achieved by using the &lt;a href="http://developer.gnome.org/glib/unstable/glib-The-Main-Event-Loop.html#g-main-context-push-thread-default"&gt;g_main_context_push_thread_default()&lt;/a&gt; function which records the main loop for the current thread in &lt;a href="http://en.wikipedia.org/wiki/Thread-local_storage"&gt;thread-local storage&lt;/a&gt;. This variable is in turn read when starting an asynchronous operation (such as &lt;a href="http://developer.gnome.org/gio/unstable/GDBusConnection.html#g-dbus-connection-call"&gt;g_dbus_connection_call()&lt;/a&gt; or &lt;a href="http://developer.gnome.org/gio/unstable/GInputStream.html#g-input-stream-read-async"&gt;g_input_stream_read_async()&lt;/a&gt;)&amp;nbsp;to ensure that the passed callback function is invoked in a thread running a main loop for the context set with g_main_context_push_thread_default() earlier.&lt;br /&gt;&lt;br /&gt;Some main loops, for example the GLib one, allows creating recursive main loops and this is used to implement GtkDialog's &lt;a href="http://developer.gnome.org/gtk3/unstable/GtkDialog.html#gtk-dialog-run"&gt;run() method&lt;/a&gt;. While this indeed appears to block the calling thread, it is important to note that events are &lt;i&gt;still&lt;/i&gt; being processed (to e.g. process input events and redraw animations). Specifically, this means that the functions (plural since applies to everything in the call stack) that brought up the dialog might end getting called again (from a callback). Thus, when using functions like gtk_dialog_run() you need to ensure that your functions are either &lt;a href="http://en.wikipedia.org/wiki/Reentrant_(subroutine)"&gt;re-entrant&lt;/a&gt; or that they are guaranteed to not get called when the dialog is showing (typically achieved by making the dialog &lt;a href="http://en.wikipedia.org/wiki/Modal_dialog"&gt;modal&lt;/a&gt; so the UI action triggering the display of the dialog can't be accessed). Because of pitfalls like this, you &lt;b&gt;must&lt;/b&gt; clearly document&amp;nbsp;if a function is using a recursive main loop.&lt;br /&gt;&lt;br /&gt;Note that main loops are not a GUI-only concept - a lot of &lt;a href="http://en.wikipedia.org/wiki/Daemon_(computing)"&gt;daemons&lt;/a&gt; (e.g. background process without any GUI) are built around this concept since it nicely integrates events from any source whether they are file descriptor based or synthetic such as timers or logging events. In fact, a considerable part of the system-level software on a modern Linux system is built on top of GLib and uses its main event loop abstraction to dispatch events - most of the time such daemons sit idle in one or more main loops and wait for &lt;a href="http://en.wikipedia.org/wiki/D-Bus"&gt;D-Bus&lt;/a&gt;&amp;nbsp;&lt;a href="http://developer.gnome.org/gio/unstable/GDBusConnection.html#g-dbus-connection-register-object"&gt;messages to arrive&lt;/a&gt;&amp;nbsp;(to service a client), a &lt;a href="http://developer.gnome.org/glib/unstable/glib-The-Main-Event-Loop.html#g-timeout-add"&gt;timeout to fire&lt;/a&gt;&amp;nbsp;(maybe to kick off periodic house-keeping tasks)&amp;nbsp;or &lt;a href="http://developer.gnome.org/glib/unstable/glib-The-Main-Event-Loop.html#g-child-watch-add"&gt;a child process to terminate&lt;/a&gt;&amp;nbsp;(when using a helper program or process to do work).&lt;br /&gt;&lt;br /&gt;Now that we've explained what a main loop is (or rather, what the &lt;i&gt;idea&lt;/i&gt; of a main loop is), let's look at why this matters if you a writing a C library. First of all, if your library doesn't need to deliver events to users, you don't need to worry about main loops. Most libraries, however, are not that simple - for example, &lt;a href="http://www.kernel.org/pub/linux/utils/kernel/hotplug/libudev/"&gt;libudev&lt;/a&gt; delivers events when devices are plugged or changed, &lt;a href="http://live.gnome.org/NetworkManager"&gt;NetworkManager&lt;/a&gt; wants to inform of changes in networking and so on.&lt;br /&gt;&lt;br /&gt;If your library is using GLib, it is often suitable to just require that the user runs the GLib main loop (if the application is using another main loop, it can either integrate the GLib main loop (&lt;a href="http://labs.qt.nokia.com/2006/02/24/qt-and-glib/"&gt;like Qt does&lt;/a&gt;) or run it in a separate thread) and use &lt;a href="http://developer.gnome.org/glib/unstable/glib-The-Main-Event-Loop.html#g-main-context-get-thread-default"&gt;g_main_context_get_thread_default()&lt;/a&gt; when setting up a callback. This is the way many GObject-based libraries, such as &lt;a href="http://hal.freedesktop.org/docs/polkit/"&gt;libpolkit-gobject-1&lt;/a&gt;,&amp;nbsp;&lt;a href="http://projects.gnome.org/NetworkManager/developers/libnm-glib/09/index.html"&gt;libnm-glib&lt;/a&gt;&amp;nbsp;or &lt;a href="http://www.kernel.org/pub/linux/utils/kernel/hotplug/gudev/"&gt;libgudev&lt;/a&gt;&amp;nbsp;work - for example, callbacks connected to the &lt;a href="http://www.kernel.org/pub/linux/utils/kernel/hotplug/gudev/GUdevClient.html#GUdevClient-uevent"&gt;GUdevClient::uevent&lt;/a&gt; signal will be called in what was the &lt;a href="http://developer.gnome.org/glib/unstable/glib-The-Main-Event-Loop.html#g-main-context-push-thread-default"&gt;thread-default main loop&lt;/a&gt; when the object was constructed. For a shared resource, such as a &lt;a href="http://developer.gnome.org/gio/unstable/GDBusConnection.html#g-bus-get-sync"&gt;message bus connection&lt;/a&gt;, a good policy is that callbacks happen in what was the the thread-default main loop when the method was called (see e.g. &lt;a href="http://developer.gnome.org/gio/unstable/GDBusConnection.html#g-dbus-connection-signal-subscribe"&gt;g_dbus_connection_signal_subscribe()&lt;/a&gt;&amp;nbsp;where this is the case) since applications or libraries have no absolute control of when the shared object was created. In any case, functions dealing with callbacks &lt;b&gt;must&lt;/b&gt;&amp;nbsp;always document in what context the callback happens in.&lt;br /&gt;&lt;br /&gt;On the other hand, if your library is not using GLib, a good way to provide notification is simply to &lt;b&gt;a)&lt;/b&gt; provide a file descriptor that e.g. turns readable when there are events to process; and &lt;b&gt;b)&lt;/b&gt; provide a function that processes events (and possibly invoke callback functions registered by the user). A good example of this is libudev's &lt;a href="http://www.kernel.org/pub/linux/utils/kernel/hotplug/libudev/libudev-udev-monitor.html#udev-monitor-get-fd"&gt;udev_monitor_get_fd()&lt;/a&gt; and &lt;a href="http://www.kernel.org/pub/linux/utils/kernel/hotplug/libudev/libudev-udev-monitor.html#udev-monitor-receive-device"&gt;udev_monitor_receive_device()&lt;/a&gt;&amp;nbsp;functions.&amp;nbsp;This way the application (or the library using your library) can easily control what thread the event is handled in. As an example of how libudev is integrated into the GLib main loop, see &lt;a href="http://git.kernel.org/?p=linux/hotplug/udev.git;a=blob;f=extras/gudev/gudevclient.c;h=97b951adcd421e559c4a2d7b3b822eb95dd01f1d;hb=HEAD#l228"&gt;here&lt;/a&gt; and &lt;a href="http://git.kernel.org/?p=linux/hotplug/udev.git;a=blob;f=extras/gudev/gudevclient.c;h=97b951adcd421e559c4a2d7b3b822eb95dd01f1d;hb=HEAD#l88"&gt;here&lt;/a&gt;. In the libudev case, the returned file descriptor is the underlying &lt;a href="http://en.wikipedia.org/wiki/Netlink"&gt;netlink socket&lt;/a&gt; used to receive the event from &lt;a href="http://www.kernel.org/pub/linux/utils/kernel/hotplug/udev/udevd.html"&gt;udevd&lt;/a&gt; (via the kernel); in the case that there are no natural file descriptor (could be the event is only happening in response to a certain entry in, say, a log file), your library could use &lt;a href="http://www.kernel.org/doc/man-pages/online/pages/man2/pipe.2.html"&gt;pipe(2)&lt;/a&gt;&amp;nbsp;(or&amp;nbsp;&lt;a href="http://www.kernel.org/doc/man-pages/online/pages/man2/eventfd.2.html"&gt;eventfd(2)&lt;/a&gt;&amp;nbsp;if on Linux) and use a private worker thread to signal the other end.&lt;br /&gt;&lt;br /&gt;If your library provide callback functions, make sure they take &lt;i&gt;user_data&lt;/i&gt; arguments so the user can easily associate callbacks with other objects and data. If the scope of your callback is undefined (e.g. may fire more than once or if there is no way to disconnect the callback), also provide a way to free the &lt;i&gt;user_data&lt;/i&gt; pointer when it is no longer needed - otherwise the application will leak data that needs to be freed later. See &lt;a href="http://developer.gnome.org/gio/unstable/gio-Watching-Bus-Names.html#g-bus-watch-name"&gt;g_bus_watch_name()&lt;/a&gt;&amp;nbsp;and &amp;nbsp;for an example.&lt;br /&gt;&lt;h2&gt;Checklist&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Provide APIs for main loop integration&lt;/li&gt;&lt;li&gt;Make sure callback functions take &lt;i&gt;user_data&lt;/i&gt; arguments (possibly with free an accompanying free function)&lt;/li&gt;&lt;/ul&gt;&lt;a href="" name="io"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h1&gt;Synchronous and Asynchronous I/O&lt;/h1&gt;It is important for users of a library to know if calling a function involves doing &lt;a href="http://en.wikipedia.org/wiki/Asynchronous_I/O"&gt;synchronous I/O&lt;/a&gt; (also called blocking I/O). For example, an application with an user interface need to be responsive to user input and may even need to update the user interface &lt;a href="http://en.wikipedia.org/wiki/Vertical_blanking_interval"&gt;every frame&lt;/a&gt; for smooth animations (e.g. 60 times a second). To avoid unresponsive applications and jerky animations, its UI thread must &lt;b&gt;never&lt;/b&gt; call any functions that does any synchronous I/O.&lt;br /&gt;&lt;br /&gt;Note that even loading a file from local disk may block for a very long amount of time - sometimes tens of seconds. For example the file may not be in the page cache and the hard disk with the file system may be powered down - or the file may be in the users home directory which could be on a network filesystem such as &lt;a href="http://en.wikipedia.org/wiki/Network_File_System_(protocol)"&gt;NFS&lt;/a&gt;. Other examples of blocking IO includes local IPC such as &lt;a href="http://en.wikipedia.org/wiki/D-Bus"&gt;D-Bus&lt;/a&gt; or &lt;a href="http://en.wikipedia.org/wiki/Unix_domain_socket"&gt;Unix domain sockets&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;If an operation is known to take a long time to complete (synchronous or otherwise), it is often nice if it is possible to easily cancel the it (perhaps from another thread). For example, see the &lt;a href="http://developer.gnome.org/gio/unstable/GCancellable.html#GCancellable.description"&gt;GCancellable&lt;/a&gt; type in the GLib stack. Another nicety (although easily implemented via the GCancellable type) is a way to set a timeout for potentially long-running operations - see e.g. &lt;a href="http://developer.gnome.org/gio/unstable/GDBusConnection.html#g-dbus-connection-send-message-with-reply"&gt;g_dbus_connection_send_message_with_reply()&lt;/a&gt;&amp;nbsp;and &lt;a href="http://developer.gnome.org/gio/unstable/GDBusProxy.html#g-dbus-proxy-call"&gt;g_dbus_proxy_call()&lt;/a&gt;&amp;nbsp;and note how the latter has an object-wide timeout so the timeout only has to be set once.&lt;br /&gt;&lt;br /&gt;Some libraries provide both synchronous and asynchronous versions of a function where the former blocks the calling thread and the latter doesn't. Typically asynchronous I/O is implemented using worker threads (where the worker thread is doing synchronous I/O) but it could also involve communicating with another process via IPC (e.g. D-Bus) or even TCP/IP. For example, in the &lt;a href="http://developer.gnome.org/gio/unstable/"&gt;libgio-2.0&lt;/a&gt;&amp;nbsp;case asynchronous file I/O is implemented via synchronous IO (e.g. basically&amp;nbsp;&lt;a href="http://www.kernel.org/doc/man-pages/online/pages/man2/read.2.html"&gt;read(2)&lt;/a&gt; and &lt;a href="http://www.kernel.org/doc/man-pages/online/pages/man2/write.2.html"&gt;write(2)&lt;/a&gt; calls) in worker threads (using a &lt;a href="http://developer.gnome.org/glib/unstable/glib-Thread-Pools.html"&gt;GThreadPool&lt;/a&gt;) simply because the Linux kernel does not (yet?) provide an adequate way to do asynchronous I/O suitable for libraries (see also:&amp;nbsp;&lt;a href="http://davmac.org/davpage/linux/async-io.html"&gt;colorful notes about Asynchronous I/O&lt;/a&gt;). On the upside, this is mostly an implementation detail and the libgio-2.0 implementation can migrate to a non-threaded approach should such a mechanism be made available in the future.&lt;br /&gt;&lt;br /&gt;Asynchronous I/O typically involves callbacks (or at least some kind of event notification) and thus involves a main loop. If a library provides functions for this, it should clearly state what thread the callback will happen in, and whether it requires the application to run a (specific kind of) main loop - see the previous section about main loops for details.&lt;br /&gt;&lt;br /&gt;If a library is thread-safe, it is often easier for the application itself to just use the synchronous version of a function in a worker-thread - if using GLib, &lt;a href="http://developer.gnome.org/gio/unstable/gio-GIOScheduler.html#g-io-scheduler-push-job"&gt;g_io_scheduler_push_job()&lt;/a&gt; is the right way to do that.&lt;br /&gt;&lt;br /&gt;In some cases synchronous I/O is implemented by using a recursive main loop (typically by using the asynchronous form of the function) - this should be avoided as it typically causes all kinds of problems because of reentrancy and events being processed while waiting for the supposedly synchronous operation to complete. As always, clearly document what your code is doing.&lt;br /&gt;&lt;br /&gt;Some libraries, such as those in the GLib stack, use a &lt;a href="http://developer.gnome.org/gio/unstable/GSimpleAsyncResult.html#GSimpleAsyncResult.description"&gt;consistent pattern&lt;/a&gt; for asynchronous I/O for all of its functions involving the &lt;a href="http://developer.gnome.org/gio/unstable/GAsyncResult.html"&gt;GAsyncResult&lt;/a&gt;&amp;nbsp;/ &lt;a href="http://developer.gnome.org/gio/unstable/GSimpleAsyncResult.html"&gt;GSimpleAsyncResult&lt;/a&gt;, &lt;a href="http://developer.gnome.org/gio/unstable/GAsyncResult.html#GAsyncReadyCallback"&gt;GAsyncReadyCallback&lt;/a&gt; and &lt;a href="http://developer.gnome.org/gio/unstable/GCancellable.html"&gt;GCancellable&lt;/a&gt; types - this makes it a lot easier both for programmers and for higher-level language bindings especially since important things like life-cycles are part of this model (for example, you are guaranteed that the callback will always happen, even on cancellation, timeout or error).&lt;br /&gt;&lt;h2&gt;Checklist&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Clearly document if a function does any synchronous I/O&lt;/li&gt;&lt;li&gt;Ideally suffix synchronous functions it with _sync() so it's easy to inspect large code-trees using e.g.&amp;nbsp;&lt;a href="http://www.gnu.org/software/grep/manual/grep.html"&gt;grep(1)&lt;/a&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;Consider if an operation needs to be available in synchronous or asychronous form or both.&lt;/li&gt;&lt;li&gt;Point to both synchronous and asynchronous functions in your API documentation.&lt;/li&gt;&lt;li&gt;If possible, use an established model (such as the &lt;a href="http://developer.gnome.org/gio/unstable/GSimpleAsyncResult.html#GSimpleAsyncResult.description"&gt;GIO model&lt;/a&gt;) for I/O instead of rolling your own&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-7806945138700399040?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/7806945138700399040/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2011/06/writing-c-library-part-2.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/7806945138700399040'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/7806945138700399040'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2011/06/writing-c-library-part-2.html' title='Writing a C library, part 2'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-5649784287947814262</id><published>2011-06-27T15:49:00.008-04:00</published><updated>2011-07-06T12:59:19.542-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C'/><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='GLib'/><title type='text'>Writing a C library, part 1</title><content type='html'>&lt;i&gt;This is part one in a &lt;a href="http://davidz25.blogspot.com/2011/07/writing-c-library-intro-conclusion-and.html"&gt;series of blog-posts&lt;/a&gt; about best practices for writing C libraries.&lt;/i&gt;&lt;br /&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=5268847417417953349&amp;amp;postID=5649784287947814262" name="base-libraries"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h1&gt;Base libraries&lt;/h1&gt;Since &lt;a href="http://en.wikipedia.org/wiki/C_library"&gt;libc&lt;/a&gt; is a fairly low-level set of libraries, there exists higher-level libraries to make C programming a more pleasant experience including libraries in the &lt;a href="http://en.wikipedia.org/wiki/GLib"&gt;GLib&lt;/a&gt; and and &lt;a href="http://en.wikipedia.org/wiki/GTK%2B"&gt;GTK+&lt;/a&gt; stack. Even while the following is going to be somewhat GLib- and GTK+-centric, these notes are written to be useful for any C code whether it's based on libc, GLib or other libraries such as &lt;a href="http://en.wikipedia.org/wiki/NSPR"&gt;NSPR&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Apache_Portable_Runtime"&gt;APR&lt;/a&gt; or &lt;a href="http://talloc.samba.org/talloc/doc/html/index.html"&gt;some of the Samba libraries&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Most programmers would agree that it's usually a bad idea to implement basic data-types such as string handling, memory allocation, lists, arrays, hash-tables or queues yourself just because you &lt;i&gt;can&lt;/i&gt; - it only makes code harder to read and harder to maintain by others. This is where C libraries such as GLib and GTK+ come into play - these libraries provides much of this out of the box. Plus, when you end up needing non-trivial utility functions (and chances are you will) for, say, &lt;a href="http://developer.gnome.org/glib/unstable/glib-Unicode-Manipulation.html"&gt;Unicode manipulation&lt;/a&gt;, &lt;a href="http://developer.gnome.org/pango/stable/pango-Scripts-and-Languages.html"&gt;rendering complex scripts&lt;/a&gt;, &lt;a href="http://developer.gnome.org/gio/unstable/GDBusConnection.html"&gt;D-Bus support&lt;/a&gt; or &lt;a href="http://developer.gnome.org/glib/unstable/glib-Data-Checksums.html#glib-Data-Checksums.description"&gt;calculating checksums&lt;/a&gt;, ask yourself (or worse: wait until your manager or peers ask you)  if the decision to avoid a well-tested and well-maintained library was a good decision.&lt;br /&gt;&lt;br /&gt;In particular, for things like &lt;a href="http://en.wikipedia.org/wiki/Cryptography"&gt;cryptography&lt;/a&gt;, it is usually a &lt;a href="http://stackoverflow.com/questions/1914257/when-can-you-trust-yourself-to-implement-cryptography-based-solutions"&gt;bad idea&lt;/a&gt; to implement it yourself (however &lt;a href="http://diovo.com/2009/02/wrote-your-own-encryption-algorithm-duh/"&gt;inventing your own algorithm&lt;/a&gt; is worse); instead, it is better to use an existing well-tested library such as &lt;a href="http://en.wikipedia.org/wiki/Network_Security_Services"&gt;NSS&lt;/a&gt; (and even if you do, &lt;a href="http://www.codinghorror.com/blog/2009/05/why-isnt-my-encryption-encrypting.html"&gt;be careful of using the library correctly&lt;/a&gt;). Specifically, said library may even be &lt;a href="http://en.wikipedia.org/wiki/FIPS_140"&gt;FIPS-140&lt;/a&gt; certified which is a requirement if you want to do business with the &lt;a href="http://en.wikipedia.org/wiki/US_federal_government"&gt;US government&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Similarly, while it’s more efficient to use e.g. &lt;a href="http://www.kernel.org/doc/man-pages/online/pages/man4/epoll.4.html"&gt;epoll &lt;/a&gt;than &lt;a href="http://www.kernel.org/doc/man-pages/online/pages/man2/poll.2.html"&gt;poll&lt;/a&gt; for event notification, maybe it doesn't matter if your application or library is only handling on the order of ten file descriptors. On the other hand, if you know that you are going to handle thousands of file descriptors, you can still use e.g. GLib for the bulk of your library or application - just use epoll from dedicated threads. Ditto, if you need O(1) removal from a list, maybe don’t use a &lt;a href="http://developer.gnome.org/glib/unstable/glib-Doubly-Linked-Lists.html"&gt;GList&lt;/a&gt; - use an &lt;a href="http://git.ozlabs.org/?p=ccan;a=tree;f=ccan/list"&gt;embedded list &lt;/a&gt;instead.&lt;br /&gt;&lt;br /&gt;Above all, no matter what libraries or code you end up using, make sure you have at least a rudimentary understanding of the relevant data-types, concepts and implementation details. For example, with GLib it is very easy to use high-level constructs such as &lt;a href="http://developer.gnome.org/glib/unstable/glib-Hash-Tables.html"&gt;GHashTable&lt;/a&gt;, &lt;a href="http://developer.gnome.org/glib/unstable/glib-The-Main-Event-Loop.html#g-timeout-add"&gt;g_timeout_add()&lt;/a&gt; or &lt;a href="http://developer.gnome.org/glib/unstable/glib-File-Utilities.html#g-file-set-contents"&gt;g_file_set_contents()&lt;/a&gt; without knowing how things are implemented or what a file descriptor really is. For example, when saving data, you want to do so atomically (to avoid data-loss) and just knowing that g_file_set_contents() Does The Right Thing(tm) is often enough (often just reading the API docs will tell you what you need to know). Additionally make sure you understand both the &lt;a href="http://en.wikipedia.org/wiki/Algorithmic_complexity"&gt;algorithmic complexity&lt;/a&gt; of the data-types you end up using and how they &lt;a href="http://www.futurechips.org/tips-for-power-coders/modern-programmers-learn-hardware.html"&gt;work on modern hardware&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Finally, try not to get caught up in religious discussions about “bloated” libraries with &lt;a href="http://xkcd.com/386/"&gt;random people on the Internet&lt;/a&gt; - it’s usually not a good a use of time and resources.&lt;br /&gt;&lt;h2&gt;Checklist&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Don’t reinvent basic data-types (unless performance is a concern).&lt;/li&gt;&lt;li&gt;Don’t avoid standard libraries just because they are portable.&lt;/li&gt;&lt;li&gt;Be wary of using multiple libraries with overlapping functionality.&lt;/li&gt;&lt;li&gt;To the extent where it’s possible, keep library usage as a private implementation detail.&lt;/li&gt;&lt;li&gt;Use the right tool for the right job - don’t waste time on religious discussions.&lt;/li&gt;&lt;/ul&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=5268847417417953349&amp;amp;postID=5649784287947814262" name="library-init"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h1&gt;Library initialization and shutdown&lt;/h1&gt;Some libraries requires that an function, typically called foo_init(), is called before other functions in the library is called - this function typically initializes global variables and data structures used by the library. Additionally, libraries may also offer a shutdown function, typically called foo_shutdown() (forms such as foo_cleanup(), foo_fini(),  foo_exit() and the grammatically dubious foo_deinit() have also been observed in the wild), to release all resources used by the library. The main reason for having a shutdown() function is to play nicer with &lt;a href="http://en.wikipedia.org/wiki/Valgrind"&gt;Valgrind&lt;/a&gt; (for finding memory leaks) or to release all resources when using &lt;a href="http://www.kernel.org/doc/man-pages/online/pages/man3/dlsym.3.html"&gt;dlopen() and friends&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;In general, library initialization and shutdown routines should be avoided since they might cause interference between two unrelated libraries in the dependency chain of an application; e.g. if you don’t call them from where they are used, you are possible forcing the application to call a init() function in main(), just because some library deep down in the dependency chain is using the library without initializing it.&lt;br /&gt;&lt;br /&gt;However, without a library initialization routine, every function in the library would have to call the (internal) initialization routine which is not always practical and may also be a performance concern. In reality, the check only has to be done in a couple of functions since most functions in a library depends on an object or struct obtained from e.g. other functions in the library. So in reality, the check only has to be done in _new() functions and functions not operating on an object.&lt;br /&gt;&lt;br /&gt;For example, every program using the GLib type system &lt;a href="https://bugzilla.gnome.org/show_bug.cgi?id=628041"&gt;has to call g_type_init()&lt;/a&gt; and this includes libraries based on libgobject-2.0 such as &lt;a href="http://hal.freedesktop.org/docs/polkit/"&gt;libpolkit-gobject-1&lt;/a&gt; - e.g. if you don’t call &lt;a href="http://developer.gnome.org/gobject/unstable/gobject-Type-Information.html#g-type-init"&gt;g_type_init()&lt;/a&gt; prior to calling &lt;a href="http://hal.freedesktop.org/docs/polkit/PolkitAuthority.html#polkit-authority-get-sync"&gt;polkit_authority_get_sync()&lt;/a&gt; then your program will probably segfault. Naturally this is something most people new to the GLib stack gets wrong and you can’t really blame them - if anything, g_type_init() is a great poster-child of why init() functions should be avoided if possible.&lt;br /&gt;&lt;br /&gt;One reason for library initialization routine has to do with library configuration, either app-specific configuration (e.g. the application using the library might want to force a specific behavior) or end-user specific (by manipulating argc and argv) - for example, see &lt;a href="http://developer.gnome.org/gtk3/unstable/gtk3-General.html#gtk-init"&gt;gtk_init()&lt;/a&gt;. The best solution to this problem is of course to avoid configuration, but in the cases where it’s not possible it is often better to use e.g. environment variables to control behavior - see e.g. the &lt;a href="http://developer.gnome.org/gtk3/unstable/gtk-running.html"&gt;environment variables supported by libgtk-3.0&lt;/a&gt; and the &lt;a href="http://developer.gnome.org/gio/unstable/ch03.html"&gt;environment variables supported by libgio-2.0&lt;/a&gt; for examples.&lt;br /&gt;&lt;br /&gt;If your library does have an initialization routine, do make sure that it is idempotent and thread-safe, e.g. that it can be called multiple times and from multiple threads at the same time. If your library also has a shutdown routine, make sure that some kind of “initialization count” is used so the library is only shutdown once all users of it have called its shutdown() routine. Also, if possible, ensure that your library init/shutdown routines calls the init/shutdown routines for libraries that it depends on.&lt;br /&gt;&lt;br /&gt;Often, a library's init() and shutdown() functions can be removed by introducing a &lt;i&gt;context object&lt;/i&gt; - this also fixes the problem of global state (which is undesirable and often break multiple library users in the same process), locking (which can then be per context instance) and callbacks / notification (which can call back / post events to separate threads). For example, see &lt;a href="http://www.kernel.org/pub/linux/utils/kernel/hotplug/libudev/"&gt;libudev's&lt;/a&gt; &lt;a href="http://www.kernel.org/pub/linux/utils/kernel/hotplug/libudev/libudev-udev-monitor.html"&gt;struct udev_monitor&lt;/a&gt;.&lt;br /&gt;&lt;h2&gt;Checklist&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Avoid init() / shutdown() routines - if you can’t avoid them, do make sure they are idempotent, thread-safe and reference-counted.&lt;/li&gt;&lt;li&gt;Use environment variables for library initialization parameters, not argc and argv.&lt;/li&gt;&lt;li&gt;You can easily have two unrelated library users in the same process - often without the main application knowing about the library at all. Make sure your library can handle that.&lt;/li&gt;&lt;li&gt;Avoid &lt;a href="http://stackoverflow.com/questions/6082232/c-doing-something-when-the-program-exits"&gt;unsafe API like atexit(3)&lt;/a&gt; and, if portability is a concern, unportable constructs like library constructors and destructors (e.g. gcc’s __attribute__ ((constructor)) and __attribute__ ((destructor))).&lt;/li&gt;&lt;/ul&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=5268847417417953349&amp;amp;postID=5649784287947814262" name="memory-mgmt"&gt;&lt;/a&gt;&lt;br /&gt;&lt;h1&gt;Memory management&lt;/h1&gt;It is good practice to provide a matching free() function or each kind of allocated object that your API returns. If your library uses reference counting, it is often more appropriate to use the suffix _unref instead of _free. An example of this in the GLib/GTK+ stack the functions used are &lt;a href="http://developer.gnome.org/gobject/unstable/gobject-The-Base-Object-Type.html#g-object-new"&gt;g_object_new()&lt;/a&gt;, &lt;a href="http://developer.gnome.org/gobject/unstable/gobject-The-Base-Object-Type.html#g-object-ref"&gt;g_object_ref()&lt;/a&gt; and &lt;a href="http://developer.gnome.org/gobject/unstable/gobject-The-Base-Object-Type.html#g-object-unref"&gt;g_object_unref()&lt;/a&gt; that operate on instances of the &lt;a href="http://developer.gnome.org/gobject/unstable/gobject-The-Base-Object-Type.html"&gt;GObject type&lt;/a&gt; (including derived types). Similarly, for the &lt;a href="http://developer.gnome.org/gtk3/unstable/GtkTextIter.html"&gt;GtkTextIter&lt;/a&gt; type, the relevant functions are &lt;a href="http://developer.gnome.org/gtk3/unstable/GtkTextIter.html#gtk-text-iter-copy"&gt;gtk_text_iter_copy()&lt;/a&gt; and &lt;a href="http://developer.gnome.org/gtk3/unstable/GtkTextIter.html#gtk-text-iter-free"&gt;gtk_text_iter_free()&lt;/a&gt;. Also, note that some objects may be &lt;a href="http://en.wikipedia.org/wiki/Stack_allocation"&gt;stack-allocated&lt;/a&gt; (such as GtkTextIter) while others (such as GObject) can only be &lt;a href="http://en.wikipedia.org/wiki/Dynamic_memory_allocation"&gt;heap-allocated&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Note that some object-oriented libraries with the concept of derived types may require the app to use the unref() method from a base type - for example, an instance of a &lt;a href="http://developer.gnome.org/gtk3/unstable/GtkButton.html"&gt;GtkButton&lt;/a&gt; must be released with g_object_unref() because GtkButton is also a GObject. Additionally, some libraries have the concept of floating references (see e.g. &lt;a href="http://developer.gnome.org/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned"&gt;GInitiallyUnowned&lt;/a&gt;, &lt;a href="http://developer.gnome.org/gtk3/unstable/GtkWidget.html#GtkWidget.object-hierarchy"&gt;GtkWidget&lt;/a&gt; and &lt;a href="http://developer.gnome.org/glib/unstable/glib-GVariant.html"&gt;GVariant&lt;/a&gt;) - this can make it more more convenient to use the type system from C since it e.g. allows using the g_variant_new() constructor in place of a parameter like in the example code for &lt;a href="http://developer.gnome.org/gio/unstable/GDBusProxy.html#g-dbus-proxy-call-sync"&gt;g_dbus_proxy_call_sync()&lt;/a&gt; without leaking any references.&lt;br /&gt;&lt;br /&gt;Unless it’s self-evident, all functions should have documentation explaining how parameters are managed. It is often a good idea to try to force some kind of consistency on the API. For example, in the GLib stack the general rule is that the caller owns parameters passed to a function (so the function need to take a reference or make a copy if the parameter is used after the function returns) and that the callee owns the returned parameters (so the caller needs to make a copy or increase the reference count) unless the function can be called from multiple threads (in which case the caller needs to free the returned object).&lt;br /&gt;&lt;br /&gt;Note that thread-safety often dictates what the API looks like - for example, for a thread-safe object pool, the lookup() function (returning an object) must return a reference (that the caller must unref()) because the returned object could be removed from another thread just after lookup() returns - one such example is &lt;a href="http://developer.gnome.org/gio/unstable/GDBusObjectManager.html#g-dbus-object-manager-get-object"&gt;g_dbus_object_manager_get_object()&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;If you implement reference counting for an object or struct, make sure it is using &lt;a href="http://en.wikipedia.org/wiki/Atomic_operation"&gt;atomic operations&lt;/a&gt; or otherwise protect the reference count from being modified simultaneously by multiple threads.&lt;br /&gt;&lt;br /&gt;If a function is returning a pointer to memory that the caller isn’t supposed to free or unref, it is often necessary to document for how long the pointer is valid - for example the documentation for the &lt;a href="http://www.kernel.org/doc/man-pages/online/pages/man3/getenv.3.html"&gt;getenv()&lt;/a&gt; C library function says “The string pointed to by the return value of getenv() may be statically allocated, and can be modified by a subsequent call to getenv(), putenv(3), setenv(3), or unsetenv(3).”. This is useful information because it shows that care should be taken if the result from getenv() is used by multiple threads; also this kind of API can never work in a multi-threaded application and the only reason it works is that applications or libraries normally don’t modify the environment.&lt;br /&gt;&lt;br /&gt;It is often advantageous for an application to not worry about out-of-memory conditions and instead just call &lt;a href="http://www.kernel.org/doc/man-pages/online/pages/man3/abort.3.html"&gt;abort()&lt;/a&gt; if the underlying allocator signals an out-of-memory condition. This holds true for most libraries as well since it allows a simpler and better API and huge code-footprint reductions. If you do decide to worry about OOM in your library, do make sure that you test all code-paths or your effort will very likely have been in vain. On the other hand, if you know your library is going to be used in e.g. process 1 (the init process) or other critical processes, then not handling OOM is not an option.&lt;br /&gt;&lt;h2&gt;Checklist&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Provide a free() or unref() function for each type your library introduces.&lt;/li&gt;&lt;li&gt;Ensure that memory handling consistent across your library.&lt;/li&gt;&lt;li&gt;Note that multi-threading may impose certain kinds of API.&lt;/li&gt;&lt;li&gt;Make sure the documentation is clear on how memory is managed.&lt;/li&gt;&lt;li&gt;Abort on OOM unless there are very good reasons for handling OOM.&lt;/li&gt;&lt;/ul&gt;&lt;h1&gt;Multiple Threads and Processes&lt;/h1&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=5268847417417953349&amp;amp;postID=5649784287947814262" name="multiple-threads-and-processes"&gt;&lt;/a&gt;&lt;br /&gt;A library should clearly document if and how it can be used from multiple threads. There are often multiple levels of thread-safety involved - if the library has a concept of objects and a pool of objects (as most libraries do), the enumeration and management of the pool might be thread safe while applications are supposed to provide their own locking when operating on a single object from multiple threads, concurrently.&lt;br /&gt;&lt;br /&gt;If you are providing a function performing synchronous I/O, it is often a good idea to make it thread-safe so an application can safely use it from a helper thread&lt;br /&gt;&lt;br /&gt;If your library is using threads internally, be wary of manipulating process-wide state, such as the current directory, locale, etc. Doing so from your private worker thread will have unexpected consequences for the application using your library.&lt;br /&gt;&lt;br /&gt;A library should always use thread-safe functions (e.g. &lt;a href="http://www.kernel.org/doc/man-pages/online/pages/man3/getpwnam.3.html"&gt;getpwnam_r()&lt;/a&gt; rather than getpwnam()) and avoid libraries and code that is not thread-safe. If you can’t do this, clearly state that your library isn’t thread-safe so applications can use it from a dedicated helper process instead if they need thread-safety.&lt;br /&gt;&lt;br /&gt;It is also important to document if your library is using threads internally, e.g. for a pool of worker threads. Even though you think of the thread as a private implementation detail, its existence can affect users of your library; e.g. &lt;a href="http://www.kernel.org/doc/man-pages/online/pages/man7/signal.7.html"&gt;Unix signals&lt;/a&gt; might need to be handled differently in the the presence of threads, and there are extra complications when forking a threaded application.&lt;br /&gt;&lt;br /&gt;If your library has interfaces involving resources that can be inherited over &lt;a href="http://www.kernel.org/doc/man-pages/online/pages/man2/fork.2.html"&gt;fork()&lt;/a&gt;, such as file descriptors, locks, memory obtained from &lt;a href="http://www.kernel.org/doc/man-pages/online/pages/man2/mmap.2.html"&gt;mmap()&lt;/a&gt;, etc, you should try to establish a clear policy for how an application can use your library before/after a fork. Often, the simplest policy is the best: start using nontrivial libraries only after the fork, or offer a way to reinitialize the library in the forked process. For file descriptors, using &lt;a href="http://www.kernel.org/doc/man-pages/online/pages/man2/fcntl.2.html"&gt;FD_CLOEXEC&lt;/a&gt; is a good idea. In reality most libraries have undefined behavior after the fork() call, so the only safe thing to do is to call the &lt;a href="http://www.kernel.org/doc/man-pages/online/pages/man3/exec.3.html"&gt;exec()&lt;/a&gt; function.&lt;br /&gt;&lt;h2&gt;Checklist&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Document if and how the library can be used from multiple threads.&lt;/li&gt;&lt;li&gt;Document what steps need to be taken after fork() or if the library is now unusable.&lt;/li&gt;&lt;li&gt;Document if the library is creating private worker threads.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-5649784287947814262?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/5649784287947814262/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2011/06/writing-c-library-part-1.html#comment-form' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/5649784287947814262'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/5649784287947814262'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2011/06/writing-c-library-part-1.html' title='Writing a C library, part 1'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-1231910082333053184</id><published>2011-04-27T11:52:00.001-04:00</published><updated>2011-04-27T11:54:48.974-04:00</updated><title type='text'>GNOME Online Accounts</title><content type='html'>The past couple of weeks I've been looking into how to make &lt;a href="http://www.gnome.org"&gt;GNOME&lt;/a&gt; work with online accounts. I sent &lt;a href="http://mail.gnome.org/archives/desktop-devel-list/2011-April/msg00107.html"&gt;some notes&lt;/a&gt; about to d-d-l about this last week. I'm now at a point where I have working code. And with working code, I of course mean a working screencast (&lt;a href="http://youtu.be/Y1ZTdRB5ZII?hd=1"&gt;Youtube Video&lt;/a&gt;):&lt;iframe title="YouTube video player" width="960" height="750" src="http://www.youtube.com/embed/Y1ZTdRB5ZII?hd=1" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;OK, I mentioned working code and I wasn't kidding — it's stashed in &lt;a href="http://cgit.freedesktop.org/~david/goa/"&gt;this git repo&lt;/a&gt; for now. I expect to move it to &lt;a href="http://git.gnome.org/browse"&gt;git.gnome.org&lt;/a&gt; assuming we decide to use this in GNOME. More importantly, I've uploaded &lt;a href="http://people.freedesktop.org/~david/goa-20110427/"&gt;the docs&lt;/a&gt; here. Oh, and to build this, you will need GLib from the &lt;a href="http://git.gnome.org/browse/glib/log/?h=gdbus-codegen"&gt;gdbus-codegen branch&lt;/a&gt; — fear not, this will be &lt;a href="https://bugzilla.gnome.org/show_bug.cgi?id=647577"&gt;merged to mainline&lt;/a&gt; soon!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-1231910082333053184?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/1231910082333053184/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2011/04/gnome-online-accounts.html#comment-form' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/1231910082333053184'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/1231910082333053184'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2011/04/gnome-online-accounts.html' title='GNOME Online Accounts'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/Y1ZTdRB5ZII/default.jpg' height='72' width='72'/><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-7592613052395569085</id><published>2011-04-06T17:46:00.000-04:00</published><updated>2011-04-06T17:46:25.733-04:00</updated><title type='text'>GNOME 3.0 is out</title><content type='html'>Yay, yay, yay, &lt;a href="http://www.gnome.org/"&gt;GNOME&lt;/a&gt; 3.0 is out!&lt;p&gt;I'm especially proud of being part of this release, as I was involved in coding up two very user-visible pieces - the &lt;a href="http://davidz25.blogspot.com/2011/02/gnome-3-authorization.html"&gt;Authorization Dialog&lt;/a&gt; and the &lt;a href="http://davidz25.blogspot.com/2011/01/gnome-3-calendar.html"&gt;Calendar Drop-down&lt;/a&gt;. Not only is the shell super-duper hot looking (making GNOME 2.x vintage desktops look like Windows 95 more than ever), it is a true pleasure to use. One that grows on you. One that makes you never go back.&lt;p&gt;The best part about this release is probably how re-energized everyone working on GNOME 3 is. It is important to realize that 3.0 is only the beginning and that we have tons of stuff lined up for &lt;a href="http://mail.gnome.org/archives/gnome-shell-list/2011-April/msg00073.html"&gt;3.0.x&lt;/a&gt;, &lt;a href="http://mail.gnome.org/archives/desktop-devel-list/2011-March/msg00109.html"&gt;3.2&lt;/a&gt; and beyond. I'm especially psyched about the prospect of making the desktop shell &lt;a href="http://mail.gnome.org/archives/desktop-devel-list/2011-March/msg00117.html"&gt;integrate nicely&lt;/a&gt; with the many &lt;a href="http://en.wikipedia.org/wiki/Web_application"&gt;Web Applications&lt;/a&gt; that are in use today. Myself? I'm already busy working on improvements for 3.2 - for the authorization dialog we want to present better strings to the user (e.g. including name of app in the dialog and what object the authorization is about) and for the calendar we want &lt;a href="https://live.gnome.org/GnomeShell/Design/Whiteboards/DateNTime"&gt;Locations (and possibly weather too)&lt;/a&gt; in the drop-down. And ideally an easier way to make the shell show e.g. your Google Calendars if that is your calendar application of choice.&lt;p&gt;&lt;center&gt;&lt;a title="Help promote GNOME 3!" href="https://live.gnome.org/ThreePointZero/Promote"&gt;&lt;img border="0" alt="I am GNOME" src="http://www.gnome.org/wp-content/uploads/2011/04/iamgnome.png"/&gt;&lt;/a&gt;&lt;/center&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-7592613052395569085?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/7592613052395569085/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2011/04/gnome-30-is-out.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/7592613052395569085'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/7592613052395569085'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2011/04/gnome-30-is-out.html' title='GNOME 3.0 is out'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-752041246923848916</id><published>2011-02-22T12:52:00.000-05:00</published><updated>2011-02-22T12:52:12.301-05:00</updated><title type='text'>PolicyKit textual authentication</title><content type='html'>Related to yesterday's &lt;a href="http://davidz25.blogspot.com/2011/02/gnome-3-authorization.html"&gt;bling post&lt;/a&gt;, I wanted to mention that PolicyKit also has a textual authentication agent (&lt;a href="http://www.youtube.com/watch?v=7riJd5DpwUA"&gt;video&lt;/a&gt;):&lt;p&gt;&lt;iframe title="YouTube video player" width="480" height="375" src="http://www.youtube.com/embed/7riJd5DpwUA?rel=0&amp;amp;hd=1" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;p&gt;This is useful in &lt;a href="http://hal.freedesktop.org/docs/polkit/polkit-apps.html"&gt;PolicyKit applications&lt;/a&gt; running in a non-graphical environment. It's simple to use: simply use &lt;a href="http://hal.freedesktop.org/docs/polkit/PolkitAgentTextListener.html"&gt;PolkitAgentTextListener&lt;/a&gt; if the &lt;a href="http://hal.freedesktop.org/docs/polkit/PolkitAuthorizationResult.html"&gt;response from PolicyKit&lt;/a&gt; indicates that authorization can be obtained &lt;a href="http://hal.freedesktop.org/docs/polkit/PolkitAuthorizationResult.html#polkit-authorization-result-get-is-challenge"&gt;if more information is provided&lt;/a&gt;. &lt;a href="http://cgit.freedesktop.org/PolicyKit/diff/src/programs/pkexec.c?id=42177383585e1e01cd6150f891176afcd4538a82"&gt;Here&lt;/a&gt; are the changes that was needed for &lt;a href="http://hal.freedesktop.org/docs/polkit/pkexec.1.html"&gt;pkexec(1)&lt;/a&gt; command. An obvious candidate for this would be the &lt;a href="http://linux.die.net/man/1/pkcon"&gt;pkcon(1)&lt;/a&gt; command.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-752041246923848916?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/752041246923848916/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2011/02/policykit-textual-authentication.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/752041246923848916'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/752041246923848916'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2011/02/policykit-textual-authentication.html' title='PolicyKit textual authentication'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/7riJd5DpwUA/default.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-4878541598616377537</id><published>2011-02-21T15:20:00.001-05:00</published><updated>2011-02-21T15:32:17.604-05:00</updated><title type='text'>GNOME 3 Authorization</title><content type='html'>The past couple of days I've been working on implementing the GNOME 3 &lt;a href="https://live.gnome.org/GnomeShell/Design/Whiteboards/AuthorizationDialog"&gt;Authorization Dialog&lt;/a&gt;. The implementation uses &lt;a href="http://hal.freedesktop.org/docs/polkit/polkit.8.html"&gt;PolicyKit&lt;/a&gt; to achieve this and is conceptually very simple: the Shell process itself just implements the &lt;a href="http://hal.freedesktop.org/docs/polkit/eggdbus-interface-org.freedesktop.PolicyKit1.AuthenticationAgent.html"&gt;org.freedesktop.PolicyKit1.AuthenticationAgent&lt;/a&gt; interface to handle authentication requests from the system-wide authority (&lt;a href="http://www.youtube.com/watch?v=AaCxqhHpqFk"&gt;video&lt;/a&gt;).&lt;p&gt;&lt;iframe title="YouTube video player" width="480" height="375" src="http://www.youtube.com/embed/AaCxqhHpqFk?rel=0&amp;amp;hd=1" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;p&gt;For authentication, the Shell is using the &lt;a href="http://hal.freedesktop.org/docs/polkit/PolkitAgentSession.html"&gt;existing code&lt;/a&gt; that in turn uses &lt;a href="http://en.wikipedia.org/wiki/Pluggable_Authentication_Modules"&gt;PAM&lt;/a&gt;. This means that the Authorization Dialog will work out-of-the-box with e.g. &lt;a href="http://reactivated.net/fprint/wiki/Main_Page"&gt;fingerprint readers&lt;/a&gt;, provided, of course, that the PAM stack has been set up correctly (&lt;a href="http://www.youtube.com/watch?v=1IvDf0YSQVk"&gt;video&lt;/a&gt;).&lt;p&gt;&lt;iframe title="YouTube video player" width="480" height="375" src="http://www.youtube.com/embed/1IvDf0YSQVk?rel=0&amp;amp;hd=1" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;p&gt;Additionally, the code has been tested with &lt;a href="http://linux.die.net/man/8/pam_rps"&gt;pam_rps&lt;/a&gt; - a PAM module whereby you authenticate by proving that you are smart enough to win in &lt;a href="http://en.wikipedia.org/wiki/Rock_paper_scissors"&gt;Rock-paper-scissors&lt;/a&gt;. The idea is that if your application works with pam_rps, then there's a good chance that it will work with any PAM module (&lt;a href="http://www.youtube.com/watch?v=pBX5mrReHYQ"&gt;video&lt;/a&gt;).&lt;p&gt;&lt;iframe title="YouTube video player" width="480" height="375" src="http://www.youtube.com/embed/pBX5mrReHYQ?rel=0&amp;amp;hd=1" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;p&gt;One major difference - &lt;a href="https://bugzilla.gnome.org/show_bug.cgi?id=596260#c4"&gt;and something I've been wanting to do for a while&lt;/a&gt; - is that the dialogs are now system-modal. In addition to fixing a lot of focus problems, this also makes the dialogs &lt;i&gt;look&lt;/i&gt; more &lt;a href="http://en.wiktionary.org/wiki/trustworthy"&gt;trustworthy&lt;/a&gt; since they are part of the actual shell. They're also way prettier.&lt;p&gt;(Bonus chatter: Of course, there's an emphasis on &lt;i&gt;look&lt;/i&gt; in the above paragraph because any random app can still go full-screen to fool the user to give them their password. To do this in a more secure way, we need to use the &lt;a href="http://en.wikipedia.org/wiki/Secure_attention_key"&gt;Secure Attention Key&lt;/a&gt; and run the dialog in another security context etc. It's an open question whether it's even worth it to do this. But I digress.)&lt;p&gt;You can find the current code drop in &lt;a href="https://bugzilla.gnome.org/show_bug.cgi?id=642886"&gt;this bug&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-4878541598616377537?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/4878541598616377537/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2011/02/gnome-3-authorization.html#comment-form' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/4878541598616377537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/4878541598616377537'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2011/02/gnome-3-authorization.html' title='GNOME 3 Authorization'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/AaCxqhHpqFk/default.jpg' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-8033759171351451201</id><published>2011-01-31T13:01:00.000-05:00</published><updated>2011-01-31T13:01:49.428-05:00</updated><title type='text'>GNOME 3 Calendar</title><content type='html'>From &lt;a href="https://live.gnome.org/GnomeShell/Design/Whiteboards/DateNTime"&gt;design&lt;/a&gt; through &lt;a href="https://bugzilla.gnome.org/show_bug.cgi?id=632109"&gt;review&lt;/a&gt; to &lt;a href="http://git.gnome.org/browse/gnome-shell/commit/?id=885b6ffaef055291f01c139837e73b81a26fedde"&gt;code&lt;/a&gt;, I am proud to present the new GNOME calendar panel:&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://people.freedesktop.org/~david/calendar.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="196" width="400" src="http://people.freedesktop.org/~david/calendar-thumb.png"/&gt;&lt;/a&gt;&lt;/div&gt;Thanks to everyone involved!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-8033759171351451201?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/8033759171351451201/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2011/01/gnome-3-calendar.html#comment-form' title='18 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/8033759171351451201'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/8033759171351451201'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2011/01/gnome-3-calendar.html' title='GNOME 3 Calendar'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>18</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-8156064730410007578</id><published>2010-11-30T15:03:00.003-05:00</published><updated>2010-11-30T17:12:26.321-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='GNOME'/><category scheme='http://www.blogger.com/atom/ns#' term='Hacking'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>GNOME 3 Calendar Integration</title><content type='html'>I'm actually not supposed to be working this week (the first screenshot contains a subtle hint why), but here's a couple of screenshots of the upcoming calendar integration for the next major GNOME release:&lt;p&gt;&lt;center&gt;&lt;a href="http://people.freedesktop.org/~david/gnome3-calendar-shell-1.png"&gt;&lt;img alt="Today" border="0" src="http://people.freedesktop.org/~david/gnome3-calendar-shell-1-thumb.png" /&gt;&lt;/a&gt; &lt;br&gt;&lt;i&gt;Click to embiggen&lt;/i&gt;&lt;/center&gt;&lt;p&gt;Working in Javascript is really weird compared to C. But so far I think it's weird in a good way.&lt;p&gt;&lt;center&gt;&lt;a href="http://people.freedesktop.org/~david/gnome3-calendar-shell-2.png"&gt;&lt;img alt="Today" border="0" src="http://people.freedesktop.org/~david/gnome3-calendar-shell-2-thumb.png" /&gt;&lt;/a&gt; &lt;br&gt;&lt;i&gt;Click to embiggen&lt;/i&gt;&lt;/center&gt;&lt;p&gt;Here's the &lt;a href="http://git.gnome.org/browse/gnome-shell/log/?h=datetime"&gt;git branch&lt;/a&gt; with this code and here's the &lt;a href="https://bugzilla.gnome.org/show_bug.cgi?id=632109"&gt;bug&lt;/a&gt;. There's still some work left to make the code look and act like the &lt;a href="http://live.gnome.org/GnomeShell/Design/Whiteboards/DateNTime"&gt;mockups&lt;/a&gt;. I'm really hoping we can land the bulk of this code before Christmas - the biggest blocker right now is getting events from Evolution which is stressing the capabilities of the &lt;a href="http://live.gnome.org/Gjs"&gt;gjs runtime&lt;/a&gt; and &lt;a href="http://live.gnome.org/GObjectIntrospection"&gt;GObject Introspection&lt;/a&gt;. To make forward progress on the UI side, I had to switch to a in-process event source with fake events.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-8156064730410007578?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/8156064730410007578/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2010/11/gnome-3-calendar-integration.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/8156064730410007578'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/8156064730410007578'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2010/11/gnome-3-calendar-integration.html' title='GNOME 3 Calendar Integration'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-2390793032733427589</id><published>2010-08-18T17:58:00.000-04:00</published><updated>2010-08-18T17:58:33.673-04:00</updated><title type='text'>gdbus(1) bash completion</title><content type='html'>It seems to be a well-kept secret that the new &lt;a href="http://library.gnome.org/devel/gio/unstable/gdbus.html"&gt;gdbus(1)&lt;/a&gt; command available in the latest GLib releases does bash completion. So here's a quick screencast demonstrating this very useful feature!&lt;br /&gt;&lt;br /&gt;&lt;iframe class="youtube-player" type="text/html" width="480" height="385" src="http://www.youtube.com/embed/uByoaLM-Bro?hl=en_US" frameborder="0"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-2390793032733427589?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/2390793032733427589/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2010/08/gdbus1-bash-completion.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/2390793032733427589'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/2390793032733427589'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2010/08/gdbus1-bash-completion.html' title='gdbus(1) bash completion'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/uByoaLM-Bro/default.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-1074169605629048576</id><published>2010-05-19T00:07:00.001-04:00</published><updated>2010-05-19T00:09:18.073-04:00</updated><title type='text'>This blog has moved...</title><content type='html'>I'm no longer running my own server (good riddance!) so &lt;a href="http://blog.fubar.dk/"&gt;http://blog.fubar.dk&lt;/a&gt; does not work anymore (except it being a CNAME to here but I'm not sure how well that works). If you're seeing this, you're in the &lt;a href="http://davidz25.blogspot.com/"&gt;right place&lt;/a&gt;. The new setup has comments enabled (an often requested feature) and it looks like it's easier to use and stuff. Hopefully it'll make me blog some more. We'll see!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-1074169605629048576?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/1074169605629048576/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2010/05/this-blog-has-moved.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/1074169605629048576'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/1074169605629048576'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2010/05/this-blog-has-moved.html' title='This blog has moved...'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-463407117565128413</id><published>2009-12-16T11:16:00.000-05:00</published><updated>2010-04-19T20:21:58.161-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>udisks and gnome-disk-utility - past, present and future</title><content type='html'>&lt;p&gt;The past year or so I&amp;#8217;ve been working a lot on &lt;a href="http://git.gnome.org/cgit/gnome-disk-utility"&gt;gnome-disk-utility&lt;/a&gt; and DeviceKit-disks^W&lt;a href="http://cgit.freedesktop.org/DeviceKit/DeviceKit-disks/"&gt;udisks&lt;/a&gt; and I haven&amp;#8217;t really blogged anything about it. Time to fix that!&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;First of all, given that the main &lt;a href="http://cgit.freedesktop.org/DeviceKit/DeviceKit/"&gt;DeviceKit daemon&lt;/a&gt; was killed by &lt;a href="http://www.kernel.org/pub/linux/utils/kernel/hotplug/libudev/"&gt;libudev&lt;/a&gt; (if you are using GLib you want &lt;a href="http://www.kernel.org/pub/linux/utils/kernel/hotplug/gudev/"&gt;GUdev&lt;/a&gt; instead!), we (that is, myself and other contributors) decided to &lt;a href="http://lists.freedesktop.org/archives/devkit-devel/2009-December/000567.html"&gt;rename the project&lt;/a&gt; - most people were cool with that; see &lt;a href="http://lists.freedesktop.org/archives/devkit-devel/2009-December/000644.html"&gt;this message&lt;/a&gt; for more reasons. One improvement in this area is that we&amp;#8217;re committing to limited &lt;a href="http://cgit.freedesktop.org/DeviceKit/DeviceKit-disks/tree/README#n17"&gt;ABI stability&lt;/a&gt; - hopefully this will make things easier on distributors.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Most of the work in the udisks project been triggered by features we want in the Palimpsest Disk Utility - which is the most prominent part of gnome-disk-utility - the other part includes &lt;a href="http://people.freedesktop.org/~david/blog-entry-20091216/computer.png"&gt;various&lt;/a&gt; &lt;a href="http://people.freedesktop.org/~david/blog-entry-20091216/gdu-format.png"&gt;desktop&lt;/a&gt; &lt;a href="http://people.freedesktop.org/~david/blog-entry-20091216/gdu-luks-unlock.png"&gt;shell&lt;/a&gt; &lt;a href="http://people.freedesktop.org/~david/blog-entry-20091216/gnome-ata-smart-fail.png"&gt;integration&lt;/a&gt; &lt;a href="http://people.freedesktop.org/~david/blog-entry-20091216/nautilus-mdraid-2.png"&gt;bits&lt;/a&gt; that I don&amp;#8217;t have room to cover in this post.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;On the Disk Utility side, we&amp;#8217;re now using an user interface that scales better with many disks - in the &lt;a href="http://people.freedesktop.org/~david/blog-entry-20091216/old-ui.png"&gt;old user interface&lt;/a&gt;, we used to show all partitions as children of each disk in the tree view. In the new user interface, we&amp;#8217;re using a grid to convey the partitioning:&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;a href="http://people.freedesktop.org/~david/blog-entry-20091216/partitioning.png"&gt;&lt;img src="http://people.freedesktop.org/~david/blog-entry-20091216/partitioning-thumb.png"&gt;&lt;/a&gt; &lt;br /&gt; &lt;i&gt;Also see &lt;a href="http://bugzilla.gnome.org/show_bug.cgi?id=579211"&gt;bgo #579211&lt;/a&gt;&lt;/i&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;While this interface isn&amp;#8217;t optimal for the laptop or the machine-with-only-a-single-disk cases, it works a lot better for machines with many disks&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;a href="http://people.freedesktop.org/~david/blog-entry-20091216/palimpsest1.png"&gt;&lt;img src="http://people.freedesktop.org/~david/blog-entry-20091216/palimpsest1-thumb.png"&gt;&lt;/a&gt; &lt;br /&gt; &lt;i&gt;Bunch of disks&lt;/i&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;The Disk Utility also have somewhat complete support for &lt;a href="http://en.wikipedia.org/wiki/Mdadm"&gt;MD RAID&lt;/a&gt; (aka Software RAID on Linux) - we&amp;#8217;ll show you &lt;a href="http://people.freedesktop.org/~david/blog-entry-20091216/raid1.png"&gt;running arrays&lt;/a&gt; and also arrays &lt;a href="http://people.freedesktop.org/~david/blog-entry-20091216/raid2.png"&gt;not yet running&lt;/a&gt;. There&amp;#8217;s a way to &lt;a href="http://people.freedesktop.org/~david/blog-entry-20091216/raid3.png"&gt;add/remove&lt;/a&gt; components and currently I&amp;#8217;m working on creating the UI for Online Capacity Expansion (e.g. dynamically expand a RAID-5 array from 4 to 8 drives).&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;The &lt;a href="http://en.wikipedia.org/wiki/S.M.A.R.T."&gt;SMART&lt;/a&gt; stuff has been revamped and there is now &lt;a href="http://people.freedesktop.org/~david/blog-entry-20091216/smart1.png"&gt;a way&lt;/a&gt; to turn off the desktop shell notifications. As it turns out a lot of our current users are like &amp;#8220;I&amp;#8217;m fine with using a disk that is about to fail&amp;#8221; - kinda shocking but there you go. Another change is that we don&amp;#8217;t consider a disk to be failing if there&amp;#8217;s only a couple of bad sectors - the disk will have to have &lt;a href="http://git.0pointer.de/?p=libatasmart.git;a=commitdiff;h=b7f3834654cb05f5a8aae6b2381d548f49d72987"&gt;many bad sectors&lt;/a&gt; to be considered failing. This helps with all the &lt;i&gt;false positives&lt;/i&gt; the SMART warnings generated in e.g. Fedora 11. Anyway, it seems like the desktop notifications are useful - more than a handful of people have pinged me on IRC thanking me and &lt;a href="http://0pointer.de/"&gt;Lennart&lt;/a&gt; for this feature. Woot!&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;We also now have rudimentary support for showing the &lt;a href="http://en.wikipedia.org/wiki/Serial_attached_SCSI"&gt;SAS&lt;/a&gt; topology - this is really useful since machines with many disks typically use dedicated &lt;a href="http://images.google.com/images?hl=en&amp;#38;um=1&amp;#38;sa=1&amp;#38;q=rack-mount+disk+enclosure&amp;#38;aq=f&amp;#38;oq=&amp;#38;aqi=&amp;#38;start=0"&gt;disk enclosure shelves&lt;/a&gt;.  Currently we only show &lt;a href="http://en.wikipedia.org/wiki/Serial_attached_SCSI#SAS_Expanders"&gt;SAS Expanders&lt;/a&gt; but the plan is to peek (and poke!) &lt;a href="http://en.wikipedia.org/wiki/SES-2_Enclosure_Management"&gt;SES-2 Enclosures&lt;/a&gt; (and in the future also &lt;a href="http://en.wikipedia.org/wiki/SGPIO"&gt;SGPIO&lt;/a&gt; ones) to get information about bay numbering and to toggle the FAILURE and LOCATE leds. Ideally we want to turn on the FAILURE led if a member of a RAID array is kicked or if SMART status indicates that the disk is about to fail. Ideally, we also want to do (sensible!) things like starting a RAID rebuild if a kicked RAID member is replaced by a uninitialized and same-size disk. As always, we have to be really careful about automatically doing policy things like this - especially on Linux where it is hard to make any assumptions on how the system is used.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;The goal of the udisks effort is to be useful to users. For example, if you do video editing or a lot of photography, you care about IO performance. So I added a way to easily benchmark drives and RAID arrays:&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;a href="http://people.freedesktop.org/~david/blog-entry-20091216/benchmark2.png"&gt;&lt;img src="http://people.freedesktop.org/~david/blog-entry-20091216/benchmark2-thumb.png"&gt;&lt;/a&gt; &lt;br /&gt; &lt;i&gt;RAID-6 FTW!&lt;/i&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;This feature was inspired by various similar Windows programs (a pastime on &lt;i&gt;big storage&lt;/i&gt; forums such as &lt;a href="http://www.hardforum.com/forumdisplay.php?f=29"&gt;this one&lt;/a&gt; involves trading benchmark screenshots) and the &lt;a href="http://www.coker.com.au/bonnie++/zcav/"&gt;zcav&lt;/a&gt; program. It&amp;#8217;s pretty cute, actually; I learned that my Intel 80GB G1 SSD &lt;a href="http://people.freedesktop.org/~david/Screenshot-80%20GB%20Solid-State%20Disk%20(ATA%20INTEL%20SSDSA2MH080G1GC)%20–%20Benchmark.png"&gt;only gives me 140MB/s&lt;/a&gt; on my Lenovo Thinkpad X61 while I get a &lt;a href="http://people.freedesktop.org/~david/benchmark-early-ui/benchmark-ssd.png"&gt;full 270MB/s&lt;/a&gt; on my workstation (connected via SAS). Looks like the X61 is only using SATA 150 MB/s - a search on the tubes confirmed this. Gee! This feature is also useful when experimenting with RAID setups - for example, a 10K 36.7GB SAS disk &lt;a href="http://people.freedesktop.org/~david/blog-entry-20091216/benchmark3.png"&gt;benchmarks like this&lt;/a&gt; but when you put three of them together in Software RAID-5 it turns that &lt;a href="http://people.freedesktop.org/~david/blog-entry-20091216/benchmark-raid5-oh-my-why-is-writing-so-slow.png"&gt;writing is really slow&lt;/a&gt;. I know it&amp;#8217;s supposed to be slow when writing to software RAID&amp;#8230; but, really, this slow? Maybe I need to tweak some kernel tunables (which would be bad - we should be fast out of the box etc etc).&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Finally, I did a really cute hack a few weeks ago - I made Palimpsest use &lt;a href="http://en.wikipedia.org/wiki/D-Bus"&gt;D-Bus&lt;/a&gt; over &lt;a href="http://en.wikipedia.org/wiki/Internet_Protocol_Suite"&gt;TCP/IP&lt;/a&gt; over &lt;a href="http://en.wikipedia.org/wiki/Secure_Shell"&gt;SSH&lt;/a&gt; to speak to udisks:&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;a href="http://people.freedesktop.org/~david/blog-entry-20091216/gdu-multiple-servers.png"&gt;&lt;img src="http://people.freedesktop.org/~david/blog-entry-20091216/gdu-multiple-servers-thumb.png"&gt;&lt;/a&gt; &lt;br /&gt; &lt;i&gt;Bunch of servers&lt;/i&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;With the &lt;a href="http://git.gnome.org/cgit/gnome-disk-utility/tree/src/gdu/gdu-ssh-bridge.c#n41"&gt;way this works&lt;/a&gt; we leverage SSH for authentication and &lt;a href="http://avahi.org/"&gt;Avahi&lt;/a&gt; for &lt;a href="http://en.wikipedia.org/wiki/DNS-SD"&gt;Service Discovery&lt;/a&gt;. The feature is still a bit rough - it needs some UI additions (such as a disconnect button) and we probably want to replace the &lt;a href="http://people.freedesktop.org/~david/blog-entry-20091216/gdu-remote-server-openssh-auth-wtf.png"&gt;stock OpenSSH dialog&lt;/a&gt; with something, uhm, less scary. There&amp;#8217;s also the question of authorization - right now you have to connect as &lt;a href="http://en.wikipedia.org/wiki/Superuser"&gt;root&lt;/a&gt; in order to modify things (udisks uses &lt;a href="http://cgit.freedesktop.org/PolicyKit"&gt;polkit&lt;/a&gt; for authorization) - we need to figure out how we want this to work. Right now I&amp;#8217;m thinking udisks will ship some polkit configuration bits (a &lt;tt&gt;.pkla&lt;/tt&gt; file) and a &lt;tt&gt;udisks-admin&lt;/tt&gt; group that administrators can add users to. We&amp;#8217;ll see.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;I&amp;#8217;m kinda excited about the remote connectivity bits - it means that the Disk Utility is now very useful for headless server setups and said servers won&amp;#8217;t have to run any graphical UI in order to be managed through the Disk Utility. We probably want to make the Disk Utility (e.g. Palimpsest) run on Win32 and OS X too (for users not running Linux on the desktop) for remote connectivity to e.g. Linux boxes running udisks. It shouldn&amp;#8217;t be too hard to do this as we mainly depend on &lt;a href="http://www.gtk.org/"&gt;GTK+&lt;/a&gt; and D-Bus.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;There&amp;#8217;s a bunch of plans for both udisks and Palimpsest. We want to add support (meaning: udisks API and Palimpsest User Interface bits) for the following things: &lt;a href="http://en.wikipedia.org/wiki/Logical_Volume_Manager_(Linux)"&gt;LVM&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/ISCSI"&gt;iSCSI&lt;/a&gt; (both target and initiator), Enclosure Management (as mentioned above), Event logging (e.g. &amp;#8220;raid5:md2: read error corrected&amp;#8221;), &lt;a href="http://en.wikipedia.org/wiki/Multipath_I/O"&gt;Multi-path&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Btrfs"&gt;Btrfs&lt;/a&gt; and many other useful storage technologies. There&amp;#8217;s also a few rough edges and missing features (e.g. file system resizing) but we&amp;#8217;ll get to that in due time.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;FWIW, it&amp;#8217;s important to realize that udisks and the Disk Utility complements, &lt;i&gt;but does not replace&lt;/i&gt;, existing command-line tools. This means that you can go ahead and keep using your command line tools and scripts and the udisks/GNOME/Palimpsest/etc. stack will react to changes. For example, you can start/stop RAID arrays using &lt;tt&gt;mdadm(8)&lt;/tt&gt;, partition your disks using &lt;tt&gt;parted(8)&lt;/tt&gt;, create filesystems using &lt;tt&gt;mkfs(8)&lt;/tt&gt;, mount/umount filesystems and so on - the UI is kept up to date. While it&amp;#8217;s approximately ten times harder (&lt;a href="http://www.btinternet.com/~se16/hgb/statjoke.htm"&gt;with the 10x figure being 65% accurate&lt;/a&gt;) to write software this way, it&amp;#8217;s really the only way to do things on something like Linux where our set of users is as diverse as it is.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-463407117565128413?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/463407117565128413/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2009/12/udisks-and-gnome-disk-utility-past.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/463407117565128413'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/463407117565128413'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2009/12/udisks-and-gnome-disk-utility-past.html' title='udisks and gnome-disk-utility - past, present and future'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-673857896444537699</id><published>2009-09-29T11:34:00.000-04:00</published><updated>2010-04-19T20:21:58.148-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Travelling'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>Plumbers 2009</title><content type='html'>&lt;p&gt;Had a great time at &lt;a href="http://linuxplumbersconf.org/2009/"&gt;Plumbers Conference&lt;/a&gt; last week in lovely Portland, OR. On the Friday on the conference, &lt;a href="http://vrfy.org/"&gt;Kay&lt;/a&gt; and I gave a talk, aptly named &amp;#8220;Replugging the Modern Desktop&amp;#8221;. The talk covered most of the &lt;a href="https://wiki.ubuntu.com/Halsectomy"&gt;hal-ectomy&lt;/a&gt; that has been happening and included a couple of demos. The slides are &lt;a href="http://people.freedesktop.org/~david/talks/Plumbers-2009-Sievers-Zeuthen-Replugging-The-Modern-Desktop.pdf"&gt;here&lt;/a&gt;. &lt;b&gt;UPDATE:&lt;/b&gt; People on IRC are telling me that the fd.o servers are not reachable, I&amp;#8217;ve put up another copy of the slides &lt;a href="http://people.redhat.com/~davidz/Plumbers-2009-Sievers-Zeuthen-Replugging-The-Modern-Desktop.pdf"&gt;here&lt;/a&gt;.&lt;br/&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-673857896444537699?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/673857896444537699/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2009/09/plumbers-2009.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/673857896444537699'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/673857896444537699'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2009/09/plumbers-2009.html' title='Plumbers 2009'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-2504497638117840873</id><published>2009-06-01T14:02:00.000-04:00</published><updated>2010-04-19T20:21:58.139-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>GUdev, gobject-introspection</title><content type='html'>&lt;p&gt;I just committed &lt;a href="http://git.kernel.org/?p=linux/hotplug/udev-extras.git;a=commit;h=28f6667f07ce429cc7b5e9796d5490ec9d4748e2"&gt;gudev-1.0&lt;/a&gt; to &lt;a href="http://git.kernel.org/?p=linux/hotplug/udev-extras.git;a=summary"&gt;udev-extras&lt;/a&gt;. GUdev isn&amp;#8217;t a particulary big library, it&amp;#8217;s just a &lt;a href="http://people.freedesktop.org/~david/gudev/"&gt;thin wrapper&lt;/a&gt; around libudev with integration bits for the GLib main loop and support for &lt;a href="http://live.gnome.org/GObjectIntrospection/"&gt;GObject Introspection&lt;/a&gt;.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;While GObject introspection is very neat, see this &lt;a href="http://git.kernel.org/?p=linux/hotplug/udev-extras.git;a=blob;f=gudev/example.js;h=93aa118e1af2361e62e06d52a02b2b8be4ff5e90;hb=HEAD"&gt;GUdev example&lt;/a&gt; using &lt;a href="http://live.gnome.org/Seed/"&gt;Seed&lt;/a&gt;, I must admit the whole thing feels&amp;#8230; half-finished?&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;For example, we seem to be doing &lt;a href="http://bugzilla.gnome.org/show_bug.cgi?id=584453"&gt;the wrong thing&lt;/a&gt; for default annotations in some cases. Another example is the fact that &lt;a href="http://live.gnome.org/Gjs/"&gt;gjs&lt;/a&gt; &lt;a href="http://bugzilla.gnome.org/show_bug.cgi?id=584558"&gt;lacks a print() function&lt;/a&gt;, Seed &lt;a href="http://bugzilla.gnome.org/show_bug.cgi?id=584321"&gt;can&amp;#8217;t handle GStrv&lt;/a&gt; properties (works in gjs), &lt;a href="http://bugzilla.gnome.org/show_bug.cgi?id=560567"&gt;lack of support for string arrays&lt;/a&gt; in gjs (works in Seed), neither Seed nor gjs supports &lt;a href="http://en.wikipedia.org/wiki/Shebang_%28Unix%29"&gt;Shebang&lt;/a&gt; support (&lt;a href="http://bugzilla.gnome.org/show_bug.cgi?id=584560"&gt;gjs bug&lt;/a&gt;, &lt;a href="http://bugzilla.gnome.org/show_bug.cgi?id=584561"&gt;Seed bug&lt;/a&gt;).&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;So all in all, trying to make my new small library introspectable.. was kinda.. much more work than I expected.. and most of the time was spent with the Seed and gjs runtimes trying to figure out what was wrong. &lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Anyway, I don&amp;#8217;t want to sound all negative.. with all the work going on in this area, it looks like it&amp;#8217;s going to rock once corner cases like mentioned above are ironed out. Rock on!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-2504497638117840873?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/2504497638117840873/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2009/06/gudev-gobject-introspection.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/2504497638117840873'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/2504497638117840873'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2009/06/gudev-gobject-introspection.html' title='GUdev, gobject-introspection'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-5194747183239155930</id><published>2009-05-04T05:40:00.000-04:00</published><updated>2010-04-19T20:21:58.123-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>Storage handling in GNOME</title><content type='html'>&lt;p&gt;The GNOME 2.26 release in Fedora 11 will ship with a completely different stack for handling storage devices. The plan is to land all this work in the upstream GNOME 2.28 release and most of that work is done &lt;a href="http://mail.gnome.org/archives/desktop-devel-list/2009-May/msg00007.html"&gt;already&lt;/a&gt;.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Basically, we&amp;#8217;ve switched away from &lt;a href="http://www.freedesktop.org/wiki/Software/hal"&gt;one&lt;/a&gt; daemon to &lt;a href="http://hal.freedesktop.org/docs/DeviceKit-disks/"&gt;another&lt;/a&gt; and in the process we gained a few new features.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://people.freedesktop.org/~david/gdu-ata-smart-notification.png"&gt; &lt;img border="0" src="http://people.freedesktop.org/~david/gdu-ata-smart-notification-thumb.png" /&gt; &lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;i&gt;OMG, the disk is dying - using &lt;a href="http://0pointer.de/blog/projects/being-smart.html"&gt;libatasmart&lt;/a&gt;&lt;/i&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;including letting the user &lt;a href="http://people.freedesktop.org/~david/gdu-smart.png"&gt;inspect&lt;/a&gt; what his disk is trying to tell him. Kudos goes to &lt;a href="http://0pointer.de/lennart/"&gt;Lennart&lt;/a&gt; for adding USB support, fixing issues with false positives in libatasmart and just for providing a really good library. And it looks like it&amp;#8217;s &lt;a href="https://www.redhat.com/archives/fedora-test-list/2009-April/msg01648.html"&gt;working&lt;/a&gt;.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;To really make this 100% useful, we probably want some kind of directory where system vendors shipping GNOME can drop an XML file and then the user can click a button &amp;#8220;Order new disk&amp;#8221; and get on with their life. Of course, then we need to handle the much harder problem of &lt;a href="http://en.wikipedia.org/wiki/Backup"&gt;backup&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Data_migration"&gt;data migration&lt;/a&gt;, but, hey, we want to solve that anyway.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;So I also wrote this Palimpsest Disk Utility application&lt;br/&gt;&lt;br/&gt;&lt;a href="http://people.freedesktop.org/~david/gdu-unmount-dialog.png"&gt; &lt;img border="0" src="http://people.freedesktop.org/~david/gdu-unmount-dialog-thumb.png" /&gt; &lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;i&gt;Kitchen sink of disk information&lt;/i&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;which also handles things like &lt;a href="http://people.freedesktop.org/~david/gdu-raid5.png"&gt;RAID devices&lt;/a&gt; and support for managing things like &lt;a href="http://en.wikipedia.org/wiki/Logical_Volume_Manager_%28Linux%29"&gt;LVM&lt;/a&gt; and &lt;a href="http://btrfs.wiki.kernel.org/index.php/Main_Page"&gt;btrfs&lt;/a&gt; is planned as well. We&amp;#8217;re also looking at &lt;a href="http://bugzilla.gnome.org/show_bug.cgi?id=579211"&gt;changing&lt;/a&gt; the UI to be a bit more sane - something like this perhaps&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://people.freedesktop.org/~david/grid-3.png"&gt; &lt;img border="0" src="http://people.freedesktop.org/~david/grid-3-thumb.png" /&gt; &lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;i&gt;Clean, leaner, simpler? Tell us in &lt;a href="http://bugzilla.gnome.org/show_bug.cgi?id=579211"&gt;bug #579211&lt;/a&gt;!&lt;/i&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Tomas, Matthias and I also worked on a simple formatting tool suitable for replacing the venerable &lt;a href="http://library.gnome.org/users/gfloppy/stable/usage.html.en"&gt;gfloppy&lt;/a&gt; tool&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://people.freedesktop.org/~david/gdu-format-tool-3.png"&gt; &lt;img border="0" src="http://people.freedesktop.org/~david/gdu-format-tool-3-thumb.png" /&gt; &lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;i&gt;Formatting tool&lt;/i&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;you &lt;a href="http://people.freedesktop.org/~david/gdu-format-tool-1.png"&gt;can&lt;/a&gt; &lt;a href="http://people.freedesktop.org/~david/gdu-format-tool-2.png"&gt;see&lt;/a&gt; &lt;a href="http://people.freedesktop.org/~david/gdu-format-tool-3.png"&gt;the&lt;/a&gt; &lt;a href="http://people.freedesktop.org/~david/gdu-format-tool-4.png"&gt;whole&lt;/a&gt; &lt;a href="http://people.freedesktop.org/~david/gdu-format-tool-5.png"&gt;series&lt;/a&gt; &lt;a href="http://people.freedesktop.org/~david/gdu-format-tool-6.png"&gt;of&lt;/a&gt; screenshots to see how the user interaction is supposed to be like.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Finally, I just merged a series of patches to GVfs for using this new machinery&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://people.freedesktop.org/~david/dkd-gdu-gvfs.png"&gt; &lt;img border="0" src="http://people.freedesktop.org/~david/dkd-gdu-gvfs-thumb.png" /&gt; &lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;i&gt;OMG, pretty RAID icon!&lt;/i&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Building this on top of a modern storage daemon, as opposed to HAL, means that your file manager (and any other app using GIO), is instantly updated as you repartition or reformat your disks. It even works if you are using command-line tools, etc. &lt;tt&gt;fdisk&lt;/tt&gt;(8) or &lt;tt&gt;mkfs&lt;/tt&gt;(8) - geek comfort FTW!&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;We might want some extensions to GIO to make working with RAID and encrypted devices (and in the future LVM) easier (such as unlock/lock/start/stop buttons in the file manager sidepane) or maybe we&amp;#8217;re just going to rely on the system auto-assembling such things and leave it in Palimpsest. Decisions, decisions.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Another geek-comfort I added, is the ability to show user mountable fstab entries, that&amp;#8217;s &lt;a href="http://bugzilla.gnome.org/show_bug.cgi?id=536292"&gt;bug #536292&lt;/a&gt;. I was a bit reluctant to do this, I think instead we want native support in GVfs for &lt;tt&gt;nfs://&lt;/tt&gt; yet still use the kernel filesystem driver though some kind of setuid helper. Then we&amp;#8217;d also fix NFS servers to publish the fact they exist using &lt;a href="http://avahi.org/"&gt;Avahi&lt;/a&gt; and then people can discover it in Nautilus&amp;#8217; &lt;tt&gt;computer://&lt;/tt&gt; window. Just cleaner and easier, I think. Combined with support for &lt;a href="http://bugzilla.gnome.org/show_bug.cgi?id=556040"&gt;bookmarks on the GIO level&lt;/a&gt;, this should be a dream come true for people deplying systems in the enterprise.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Most of this work is part of the bigger HAL-ectomy - my good friend Kay has a good post &lt;a href="http://lists.freedesktop.org/archives/devkit-devel/2009-April/000140.html"&gt;outlining the plans&lt;/a&gt; for this.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-5194747183239155930?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/5194747183239155930/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2009/05/storage-handling-in-gnome.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/5194747183239155930'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/5194747183239155930'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2009/05/storage-handling-in-gnome.html' title='Storage handling in GNOME'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-1148040876087242446</id><published>2008-10-01T12:24:00.000-04:00</published><updated>2010-04-19T20:21:58.115-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>Getting GVfs and FUSE right</title><content type='html'>&lt;p&gt;One of the cool things about the new &lt;a href="http://library.gnome.org/devel/gio/unstable/"&gt;IO library (GIO)&lt;/a&gt; in the &lt;a href="http://www.gnome.org/"&gt;GNOME&lt;/a&gt; stack is that it&amp;#8217;s &lt;a href="http://library.gnome.org/devel/gio/unstable/extending.html"&gt;extensible&lt;/a&gt;. One set of extensions for GIO is provided by the &lt;a href="http://en.wikipedia.org/wiki/GVFS"&gt;GVfs&lt;/a&gt; package. The main (but not only) purpose of GVfs is to provide access to &lt;a href="http://en.wikipedia.org/wiki/Virtual_file_system"&gt;Virtual File Systems&lt;/a&gt; by having the file system backend (e.g. file system driver) running in a separate daemon process in user space - sort of similar to what the &lt;a href="http://en.wikipedia.org/wiki/Filesystem_in_Userspace"&gt;Filesystems in Userspace (FUSE)&lt;/a&gt; framework provides on Linux and, nowadays, most UNIX operating systems. GVfs currently includes backends for &lt;a href="http://en.wikipedia.org/wiki/SSH_file_transfer_protocol"&gt;SFTP&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Ftp"&gt;FTP&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/OBEX"&gt;OBEX for Bluetooth&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Gphoto2"&gt;Digital cameras and MTP devices (through libgphoto2)&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Compact_Disc_Digital_Audio"&gt;Compact Disc Audio&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Webdav"&gt;Webdav&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Http"&gt;HTTP&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Archive_file"&gt;archive files (through libarchive)&lt;/a&gt; to name the most important ones.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;One key difference between FUSE and GVfs, is that GVfs file system drivers are not constrained by the rather old-fashioned, limited and &lt;a href="http://en.wikipedia.org/wiki/Design_by_committee"&gt;design-by-committee&lt;/a&gt; POSIX API. Instead, GIO provides (and &lt;a href="http://svn.gnome.org/viewvc/gvfs/trunk/daemon/gvfsbackend.h?revision=1922&amp;#38;view=markup"&gt;exposes&lt;/a&gt; for implementation to file system drivers) a modern and powerful API that provides &lt;a href="http://library.gnome.org/devel/gio/unstable/GFile.html#g-file-load-contents-async"&gt;asynchronous IO&lt;/a&gt;, &lt;a href="http://library.gnome.org/devel/gio/unstable/GFile.html#g-file-monitor"&gt;file monitoring (like inotify)&lt;/a&gt; and &lt;a href="http://library.gnome.org/devel/gio/unstable/GFile.html#g-file-replace-contents"&gt;high-level&lt;/a&gt; &lt;a href="http://library.gnome.org/devel/gio/unstable/GFile.html#g-file-move"&gt;operations&lt;/a&gt; as part of the standard API. The GIO API is at the right level of the stack, it&amp;#8217;s part of the &lt;a href="http://en.wikipedia.org/wiki/Glib"&gt;GLib&lt;/a&gt; tarball. This means that any application that today uses &lt;a href="http://en.wikipedia.org/wiki/GTK+"&gt;GTK+&lt;/a&gt; has access to GIO. This is a pretty big deal, if you depend on GTK+ 2.14 on newer, you&amp;#8217;ll also depend on GIO.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;However, since it&amp;#8217;s rather naive (not to mention arrogant) to think that people are going to be using only GTK+ applications, GVfs also ships with a FUSE daemon. This daemon provides a POSIX interface to the virtual file systems provided by GVfs. All the fancy high-level operations available when using GIO won&amp;#8217;t be available (there&amp;#8217;s no POSIX equivalent function to map to) of course, but the basic POSIX stuff (e.g. open(2), read(2) etc.) will work just fine. The way it works is that the GVfs FUSE daemon provides a mount in &lt;tt&gt;$HOME/.gvfs&lt;/tt&gt; where each top-level directory represents a GVfs mount:&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;code&gt;&lt;br/&gt;$ ls -1 $HOME/.gvfs&lt;br/&gt;gphoto2 mount on usb%3A004,002&lt;br/&gt;sftp on people.freedesktop.org&lt;br/&gt;sftp on quad.local&lt;br/&gt;&lt;/code&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;For example, this means all the good old command line tools still work&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;code&gt;&lt;br/&gt;$ stat /home/davidz/.gvfs/sftp\ on\ quad.local/home/davidz/.bashrc&lt;br/&gt;  File: `/home/davidz/.gvfs/sftp on quad.local/home/davidz/.bashrc'&lt;br/&gt;  Size: 313       	Blocks: 0          IO Block: 4096   regular file&lt;br/&gt;Device: 14h/20d	Inode: 44          Links: 1&lt;br/&gt;Access: (0600/-rw-------)  Uid: (  500/  davidz)   Gid: (  500/  davidz)&lt;br/&gt;Access: 2008-10-01 14:35:28.000000000 -0400&lt;br/&gt;Modify: 2008-04-25 11:55:02.000000000 -0400&lt;br/&gt;Change: 2008-04-25 11:55:02.000000000 -0400&lt;br/&gt;&lt;/code&gt;&lt;br/&gt;&lt;code&gt;&lt;br/&gt;$ convert /home/davidz/.gvfs/gphoto2\ mount\ on\ usb%3A004\,002/DCIM/100NIKON/DSCN0001.JPG -dither out.jpg&lt;br/&gt;&lt;/code&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;and so forth. Lots of &lt;a href="http://en.wikipedia.org/wiki/Command-line_interface"&gt;command-line&lt;/a&gt; people like this, at least they always like to complain when we didn&amp;#8217;t have this back in the &lt;a href="http://en.wikipedia.org/wiki/GnomeVFS"&gt;GnomeVFS&lt;/a&gt; days.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;But it gets better. Today I committed a &lt;a href="http://bugzilla.gnome.org/show_bug.cgi?id=528670"&gt;patch to GIO&lt;/a&gt; to ensure that GIO applications launching applications (such as the &lt;a href="http://en.wikipedia.org/wiki/Nautilus_(file_manager)"&gt;Nautilus file manager&lt;/a&gt; or the &lt;a href="http://en.wikipedia.org/wiki/Evolution_(software)"&gt;Evolution mailer&lt;/a&gt;) will always pass a FUSE path instead of the GIO URI. One implication of this is that if you launch a non-GIO application (such as &lt;a href="http://en.wikipedia.org/wiki/Mplayer"&gt;mplayer&lt;/a&gt; or a &lt;a href="http://en.wikipedia.org/wiki/KDE"&gt;KDE&lt;/a&gt; application) from Nautilus, that application will Just Work(tm) even if the file lives on a GVfs share.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;I think this is a pretty big deal; now it &lt;b&gt;just doesn&amp;#8217;t matter&lt;/b&gt; what VFS system of the week is used in the application, it&amp;#8217;s all POSIX as far as applications are concerned. Sure, there&amp;#8217;s a small performance hit by having to go through the GVfs FUSE daemon (a couple of extra context switches) but for run-of-the-mill desktop applications this is insignificant. Also, as explained &lt;a href="http://bugzilla.gnome.org/show_bug.cgi?id=530654#c8"&gt;here&lt;/a&gt; it&amp;#8217;s currently not a very smart idea to pass an URI to an application; there&amp;#8217;s the problem we don&amp;#8217;t have proper &lt;a href="http://en.wikipedia.org/wiki/Request_for_Comments"&gt;standards&lt;/a&gt; defining the URI&amp;#8217;s we use; there&amp;#8217;s also the problem of &lt;a href="http://en.wikipedia.org/wiki/Single_sign_on"&gt;having to authenticate over and over again&lt;/a&gt;.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Finally, if the application itself is using GIO, &lt;a href="http://bugzilla.gnome.org/show_bug.cgi?id=530654"&gt;this patch&lt;/a&gt; ensures we map back to a GIO URI and, thus, we bypass the FUSE daemon. This is best illustrated by the following screenshot:&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://people.freedesktop.org/~david/hadess-as-a-gvfs-example.png"&gt;&lt;br/&gt;&lt;img src="http://people.freedesktop.org/~david/hadess-as-a-gvfs-example-thumb.png" alt="Bastien in VFS heaven"&gt;&lt;/a&gt;&lt;br/&gt;&lt;br /&gt;&lt;i&gt;Bastien in VFS heaven&lt;/i&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;As you can see from the terminal window, &lt;a href="http://en.wikipedia.org/wiki/Eye_of_gnome"&gt;Eye of GNOME&lt;/a&gt; is being passed a FUSE path from Nautilus. But thanks to the aforementioned patch, this is getting mapped back to a GIO URI as shown in the properties dialog.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;This feature won&amp;#8217;t be available in GNOME until 2.26 (and GLib 2.20) - we&amp;#8217;re concerned some broken applications might be examining the URI before it&amp;#8217;s &lt;a href="http://svn.gnome.org/viewvc/glib/trunk/gio/gappinfo.c?r1=7554&amp;#38;r2=7566&amp;#38;view=patch"&gt;mapped back&lt;/a&gt; so we&amp;#8217;re &lt;a href="http://bugzilla.gnome.org/show_bug.cgi?id=528670#c20"&gt;reluctant&lt;/a&gt; to provide it in GLib 2.18 / GNOME 2.24 for now. FWIW, we&amp;#8217;ve been shipping patches for this feature since &lt;a href="http://en.wikipedia.org/wiki/Fedora_(operating_system)"&gt;Fedora 9&lt;/a&gt; and the feature will be in Fedora 10 as well. Other vendors are encouraged to ship these patches as well.&lt;br/&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-1148040876087242446?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/1148040876087242446/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2008/10/getting-gvfs-and-fuse-right.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/1148040876087242446'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/1148040876087242446'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2008/10/getting-gvfs-and-fuse-right.html' title='Getting GVfs and FUSE right'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-3756471404798036410</id><published>2008-08-19T08:32:00.000-04:00</published><updated>2010-04-19T20:21:58.109-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Me Me Me'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>DeviceKit presentations</title><content type='html'>&lt;p&gt;Earlier today &lt;a href="http://blogs.gnome.org/hughsie/"&gt;Richard&lt;/a&gt; and I did a DeviceKit (the set of projects replacing HAL) presentation for some other group here at &lt;a href="http://www.redhat.com"&gt;Red Hat&lt;/a&gt;. You can see the slides &lt;a href="http://lists.freedesktop.org/archives/devkit-devel/2008-August/000040.html"&gt;here&lt;/a&gt; and &lt;a href="http://lists.freedesktop.org/archives/devkit-devel/2008-August/000041.html"&gt;here&lt;/a&gt;. &lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Perhaps of interest to the &lt;a href="http://www.gnome.org"&gt;GNOME&lt;/a&gt; community, there&amp;#8217;s also screenshots of Palimpsest, an upcoming Disk Utility library and application for GNOME. Most of this is already available in Fedora&amp;#8217;s development branch, dubbed Rawhide, but won&amp;#8217;t be installed by default in Fedora 10. Right now I&amp;#8217;m busy with &lt;a href="http://www.freedesktop.org/wiki/Software/PolicyKit"&gt;PolicyKit&lt;/a&gt; stuff but the plan is definitely to get a gnome-disk-utility mailing list going soon and get this stuff integrated throughout GNOME (I&amp;#8217;ve already made sure it&amp;#8217;s easy to plug into &lt;a href="http://en.wikipedia.org/wiki/GVFS"&gt;gvfs&lt;/a&gt; for example). &lt;/p&gt;&lt;br/&gt;	&lt;p&gt;For example, I learned the other day that my disk &lt;a href="http://people.freedesktop.org/~david/palimpsest-my-disk-is-failing.png"&gt;is&lt;/a&gt; &lt;a href="http://people.freedesktop.org/~david/palimpsest-fail-2.png"&gt;failing&lt;/a&gt; (actually, as &lt;a href="http://mjg59.livejournal.com/"&gt;mjg59&lt;/a&gt; pointed out, it&amp;#8217;s wrong to use the word FAILING since it&amp;#8217;s Old-Age. Easily fixed.). Now, it would definitely be useful to have a notification bubble indicating this. This is pretty trivial to write using the &lt;a href="http://hal.freedesktop.org/docs/DeviceKit-disks/"&gt;DeviceKit-disks API&lt;/a&gt;; just monitor the &lt;a href="http://hal.freedesktop.org/docs/DeviceKit-disks/Device.html#Device:drive-smart-is-failing"&gt;org.freedesktop.DeviceKit.Disks.Device:drive-smart-is-failing&lt;/a&gt; property. Of course the gnome-disk-utility libraries (there&amp;#8217;s one at the &lt;a href="http://en.wikipedia.org/wiki/GLib"&gt;GLib&lt;/a&gt; level and one at the &lt;a href="http://en.wikipedia.org/wiki/GTK+"&gt;GTK+&lt;/a&gt; level) wraps this nicely. In fact the gnome-disk-utility library at the GTK+ level should probably provide the code for doing this status icon. Something to discuss. Hence why a mailing list and more community involvement in the gnome-disk-utility project is needed.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Anyway, the goal is to port the most of the Fedora desktop to use DeviceKit instead of HAL for the Fedora 11 time frame.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-3756471404798036410?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/3756471404798036410/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2008/08/devicekit-presentations.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/3756471404798036410'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/3756471404798036410'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2008/08/devicekit-presentations.html' title='DeviceKit presentations'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-6872170154699405629</id><published>2008-08-06T13:50:00.000-04:00</published><updated>2010-04-19T20:21:58.103-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>Resolution Independent GTK+</title><content type='html'>&lt;p&gt;Got one of them big laptops where you feel tempted to use a looking glass because the pixels are so tiny? Ever feel cheated when you adjust the font size but the rest of the UI looks like crap in comparison? Or maybe ever felt dirty when hard coding pixel values in your application?&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://people.freedesktop.org/~david/file-chooser-em20.png"&gt;&lt;br/&gt;&lt;img&gt;&lt;br/&gt;&lt;/a&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;i&gt;there&amp;#8217;s also a &lt;a href="http://people.freedesktop.org/~david/file-chooser-em5.png"&gt;tiny&lt;/a&gt; and a &lt;a href="http://people.freedesktop.org/~david/file-chooser-em10.png"&gt;normal&lt;/a&gt; version&amp;#8230;&lt;br/&gt;&lt;/i&gt;&lt;/p&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Today I &lt;a href="http://mail.gnome.org/archives/gtk-devel-list/2008-August/msg00044.html"&gt;sent&lt;/a&gt; a patch to &lt;a href="http://mail.gnome.org/mailman/listinfo/gtk-devel-list"&gt;gtk-devel-list&lt;/a&gt; adding &lt;a href="http://en.wikipedia.org/wiki/Resolution_independence"&gt;Resolution Independence&lt;/a&gt; to the &lt;a href="http://en.wikipedia.org/wiki/GTK+"&gt;GTK+&lt;/a&gt; toolkit. Let&amp;#8217;s see how that goes.&lt;br/&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-6872170154699405629?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/6872170154699405629/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2008/08/resolution-independent-gtk.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/6872170154699405629'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/6872170154699405629'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2008/08/resolution-independent-gtk.html' title='Resolution Independent GTK+'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-2308750964137548227</id><published>2008-07-30T21:36:00.000-04:00</published><updated>2010-04-19T20:21:58.096-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Fun'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>D-Bus introspection</title><content type='html'>&lt;p&gt;Sure, there&amp;#8217;s already &lt;a href="http://www.j5live.com/?p=445"&gt;d-feet&lt;/a&gt; and a similar Qt tool but for people who hate using the mouse or are allergic to X, I&amp;#8217;ve put together this &lt;a href="http://people.freedesktop.org/~david/dbus-bash-completion.ogg"&gt;cute little hack&lt;/a&gt; that provides bash completion to &lt;a href="http://dbus.freedesktop.org/doc/dbus-send.1.html"&gt;dbus-send(1)&lt;/a&gt;. Unfortunately it depends on the XML introspection parser from dbus-glib so it&amp;#8217;s not straightforward to add to mainline D-Bus. Could easily go in dbus-glib though. Then again, it would be nice if libdbus included an XML introspection parser. Decisions, decisions.&lt;br/&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-2308750964137548227?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/2308750964137548227/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2008/07/d-bus-introspection.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/2308750964137548227'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/2308750964137548227'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2008/07/d-bus-introspection.html' title='D-Bus introspection'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-5323611082018635308</id><published>2008-07-23T09:46:00.000-04:00</published><updated>2010-04-19T20:21:58.078-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Travelling'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>Linux Plumbers Conference CFP extended!</title><content type='html'>&lt;p&gt;I rarely blog these days, doing the &lt;a href="http://twitter.com/davidz25"&gt;Twitter&lt;/a&gt; thing instead and all. Anyway. The &lt;a href="http://www.linuxplumbersconf.org/cfp/"&gt;Call for Papers&lt;/a&gt; for the &lt;a href="http://www.linuxplumbersconf.org/"&gt;Linux Plumbers Conference&lt;/a&gt; in September in lovely &lt;a href="http://en.wikipedia.org/wiki/Portland%2C_Oregon"&gt;Portland, Oregon&lt;/a&gt; &lt;a href="http://lwn.net/Articles/291189/"&gt;has been extended&lt;/a&gt; until &lt;b&gt;July 31st 2008&lt;/b&gt;. It&amp;#8217;s a conference about the core infrastructure of Linux systems: the part of the system where userspace and the kernel interface. It&amp;#8217;s the first conference where the focus is specifically on getting together the kernel people who work on the userspace interfaces and the userspace people who have to deal with kernel interfaces. It&amp;#8217;s supposed to be a place where all the people doing infrastructure work sit down and talk, so that each other understands better what the requirements and needs of the other are, and where we can work towards fixing the major problems we currently have with our lower-level APIs.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;I&amp;#8217;m running the &amp;#8220;Desktop Integration&amp;#8221; microconf at Plumbers. I have two goals for the microconf. One is to be informative about what&amp;#8217;s going on in the dusty hallways between the &lt;a href="http://kernel.org"&gt;Kernel&lt;/a&gt; and the &lt;a href="http://www.freedesktop.org"&gt;Free Desktop&lt;/a&gt;. Which I think is important at a place like Plumbers where we&amp;#8217;re going to a lot of people working on similar problems present. The other goal is to actually try and make some headway on actual problems that require people from multiple communities working together. Such as some of the work &lt;a href="http://blogs.gnome.org/mccann"&gt;Jon&lt;/a&gt; is focusing on, e.g. how to make fast-user-switching, multi-seat and terminal services Just Work(tm).&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;The conference is expected to sell out pretty quickly so it&amp;#8217;s a good idea to go ahead and &lt;a href="http://linuxplumbersconf.org/register/"&gt;register for Plumbers Conference&lt;/a&gt; instead of &lt;a href="http://en.wikipedia.org/wiki/Procrastinate"&gt;procrastinating&lt;/a&gt; about doing it!&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;a href="http://www.linuxplumbersconf.org/"&gt;&lt;img src="http://www.linuxplumbersconf.org/images/banner.png" alt="Linux Plumbers Conference" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;See you in Portland!&lt;br/&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-5323611082018635308?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/5323611082018635308/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2008/07/linux-plumbers-conference-cfp-extended.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/5323611082018635308'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/5323611082018635308'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2008/07/linux-plumbers-conference-cfp-extended.html' title='Linux Plumbers Conference CFP extended!'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-3749435320158080051</id><published>2008-01-28T18:48:00.000-05:00</published><updated>2010-04-19T20:21:58.067-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Travelling'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>gnome.conf.au 2008</title><content type='html'>&lt;p&gt;Am in Melbourne, VIC, Australia for linux.conf.au 2008; just gave a talk on PolicyKit, the slides are &lt;a href="http://people.freedesktop.org/~david/talks/gnome-conf-au-polkit-davidz-jan-2008.pdf"&gt;here&lt;/a&gt;. Only had 20 minutes so the whole thing felt a bit rushed and I didn&amp;#8217;t get to go into much detail. Hopefully it made some sense though, otherwise checkout the &lt;a href="http://hal.freedesktop.org/docs/PolicyKit/"&gt;design and API docs&lt;/a&gt;.&lt;br/&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-3749435320158080051?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/3749435320158080051/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2008/01/gnomeconfau-2008.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/3749435320158080051'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/3749435320158080051'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2008/01/gnomeconfau-2008.html' title='gnome.conf.au 2008'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-2456181385989873110</id><published>2007-11-26T10:32:00.000-05:00</published><updated>2010-04-19T20:21:58.059-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><category scheme='http://www.blogger.com/atom/ns#' term='Politics'/><category scheme='http://www.blogger.com/atom/ns#' term='Rants'/><title type='text'>Politics. Mudslinging. Chocolate.</title><content type='html'>&lt;p&gt;Whether Murray is right or not, I think his &lt;a href="http://www.murrayc.com/blog/permalink/2007/11/26/gnome-board-2007-candidates-the-bad/"&gt;recent rant&lt;/a&gt; is rather tasteless and &lt;a href="http://blogs.gnome.org/mortenw/2007/11/26/murray-a-retraction-is-in-order/"&gt;I agree some kind of retraction/apology&lt;/a&gt; is needed. &lt;/p&gt;&lt;br/&gt;	&lt;p&gt;FWIW, Murray&amp;#8217;s post certainly don&amp;#8217;t reflect what I&amp;#8217;ve experienced when I started participating in the GNOME project 2003-2004ish. That said, I acknowledge it may reflect what others have experienced. I don&amp;#8217;t know. Also, I tend to stay out of politics&amp;#8230; at least politics on that level. That said, I do appreciate others doing all this work; for a project of GNOME&amp;#8217;s size we do need people in the foundation and some board, we need people spreading the word around GNOME, we do need to participate in standard organizations etc.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Either way, this kind of mudslinging is very unproductive for the project and everyone involved should know better. An old &lt;a href="http://maz.spork.dk/"&gt;friend&lt;/a&gt; of mine once said &amp;#8220;Can&amp;#8217;t we just focus on the chocolate?&amp;#8221;. This was in reaction to stupid in-company fighting and also a pun on a tv commercial from some chocolate company. The commercial involved three chocolate makers. They were making chocolate. Or rather, two of them were ranting about all sorts of non-sense and as a result they didn&amp;#8217;t make much chocolate. At some point the third guy just had enough and he started whining. Much like me in this post.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Guys, can we &lt;b&gt;please&lt;/b&gt; focus on the &lt;a href="http://www.gnome.org/"&gt;chocolate&lt;/a&gt; instead of all this non-sense?&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Frustrated&amp;#8230;&lt;br/&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-2456181385989873110?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/2456181385989873110/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2007/11/politics-mudslinging-chocolate.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/2456181385989873110'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/2456181385989873110'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2007/11/politics-mudslinging-chocolate.html' title='Politics. Mudslinging. Chocolate.'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-4310805812328150114</id><published>2007-11-18T16:34:00.000-05:00</published><updated>2010-04-19T20:21:58.050-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><category scheme='http://www.blogger.com/atom/ns#' term='Rants'/><title type='text'>On Xguest, Access Control and Desktop</title><content type='html'>&lt;p&gt;&lt;a href="http://danwalsh.livejournal.com/14778.html"&gt;Dan&lt;/a&gt;, I think the &lt;a href="http://danwalsh.livejournal.com/13376.html"&gt;ideas&lt;/a&gt; behind Xguest are nice. But your ideas about using SELinux to implement access control for users leaves much to be desired. If you think that a brutal approach of denying individual users to even access services like &lt;a href="http://www.freedesktop.org/wiki/Software/hal"&gt;HAL&lt;/a&gt;, &lt;a href="http://www.gnome.org/projects/NetworkManager/"&gt;NetworkManager&lt;/a&gt; and &lt;a href="http://www.bluez.org/"&gt;Bluez&lt;/a&gt; is good, then please think again. Please realize that if you do this, the desktop experience will suddenly change. Things like networking and bluetooth applets will cease to work. The file manager will fall back to relying on &lt;tt&gt;/etc/mtab&lt;/tt&gt; and &lt;tt&gt;/etc/fstab&lt;/tt&gt;. I&amp;#8217;m not sure &lt;a href="http://www.pulseaudio.org/"&gt;PulseAudio&lt;/a&gt; will start.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;The problem is that your approach is not fine grained; it&amp;#8217;s all or nothing. And this is not really useful. For example, for NetworkManager what you want is to lock down the machine so the user can only connect to trusted networks. With e.g. trusted networks being defined as something that is defined in a file in &lt;tt&gt;/etc&lt;/tt&gt; that only uid 0 can change.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;I&amp;#8217;m not sure if it&amp;#8217;s a surprise to you, but over the past year or so I&amp;#8217;ve been working on and off on an application-level access control mechanism (similar to various RBAC implementations but with a few innovations on top) called &lt;a href="http://hal.freedesktop.org/docs/PolicyKit/"&gt;PolicyKit&lt;/a&gt; that does all this. It&amp;#8217;s specifically designed and optimized for desktop applications but &lt;a href="http://gitweb.freedesktop.org/?p=PolicyKit.git;a=commit;h=a712e78e69220b43695463e00983e9316a646d32"&gt;can also be useful&lt;/a&gt; for legacy UNIX command line apps. It puts the administrator and users back in control since it provides a way for them to &lt;a href="http://people.freedesktop.org/~david/polkit-admin-auth-1.png"&gt;gain&lt;/a&gt; authorizations by authenticating and also supports systems like Ubuntu that has &lt;a href="http://hal.freedesktop.org/docs/PolicyKit-gnome/ref-auth-daemon.html"&gt;no root password&lt;/a&gt;. It provides a &lt;a href="http://people.freedesktop.org/~david/polkitg-auth-1.png"&gt;nice&lt;/a&gt; &lt;a href="http://people.freedesktop.org/~david/polkitg-auth-2.png"&gt;user&lt;/a&gt; &lt;a href="http://people.freedesktop.org/~david/polkitg-auth-3.png"&gt;interface&lt;/a&gt; for human beings to manage authorizations. There&amp;#8217;s &lt;a href="http://hal.freedesktop.org/docs/PolicyKit-gnome/"&gt;GTK+ widgets&lt;/a&gt; to make it &lt;a href="http://bugzilla.gnome.org/show_bug.cgi?id=491462"&gt;really&lt;/a&gt; &lt;a href="http://hal.freedesktop.org/docs/PolicyKit-gnome/polkit-gnome-example-screenshot.png"&gt;simple&lt;/a&gt; to integrate into existing applications (and &lt;a href="http://lists.freedesktop.org/archives/dbus/2007-November/008882.html"&gt;KDE support&lt;/a&gt; is underway).  The &lt;a href="http://packagekit.org/"&gt;list&lt;/a&gt; &lt;a href="http://freshmeat.net/projects/gnome-system-monitor/"&gt;of&lt;/a&gt; &lt;a href="http://www.pulseaudio.org/"&gt;applications&lt;/a&gt; &lt;a href="http://blog.fubar.dk/?p=94"&gt;that&lt;/a&gt; are PolicyKit enabled is growing rapidly. It&amp;#8217;s in all the major distributions. It encourages &lt;a href="http://www.gtk.org/setuid.html"&gt;least privilege&lt;/a&gt;, e.g &lt;a href="http://hal.freedesktop.org/docs/PolicyKit/diagram-interaction.png"&gt;splitting&lt;/a&gt; a program into privileged and non-privileged bits.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;It&amp;#8217;s not that I hate SELinux because I don&amp;#8217;t. I think SELinux is already very useful, just look at &lt;a href="http://www.awe.com/mark/blog/200706201137.html"&gt;how&lt;/a&gt; &lt;a href="http://www.awe.com/mark/blog/200703181400.html"&gt;useful&lt;/a&gt; &lt;a href="http://www.awe.com/mark/blog/200701041544.html"&gt;SELinux&lt;/a&gt; is in confining network-facing and privileged services. I also have SELinux support in PolicyKit &lt;a href="http://hal.freedesktop.org/docs/PolicyKit/polkit-polkit-caller.html#polkit-caller-get-selinux-context"&gt;already&lt;/a&gt; and I plan (with your help) to make &lt;a href="http://svn.gnome.org/viewvc/gnome-user-share/trunk/NEWS?revision=150&amp;#38;view=markup"&gt;gnome-user-share&lt;/a&gt;  run in a dedicated SELinux context so it is authorized to &lt;a href="http://people.freedesktop.org/~david/polkit-conf-screenshot.png"&gt;punch holes in the firewall&lt;/a&gt; without any configuration whatsoever (today it&amp;#8217;s totally broken since g-u-s picks a random high port number to listen on). But, Dan, frankly, I think your use of SELinux to lock down access on the desktop is misguided. It&amp;#8217;s a bit like if all you have is a hammer, then everything looks like a nail. I feel that it&amp;#8217;s a bit sad that that two developers, working for the same company, in the same office are trying to solve the same problems. We really ought to do better.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;(Disclaimer: this post does not necessarily represent the views of my employer, &lt;a href="http://www.redhat.com"&gt;Red Hat, Inc.&lt;/a&gt;)&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;b&gt;Update:&lt;/b&gt; A few people pointed out that I sounded too confrontational in this post and maybe they&amp;#8217;re right. As I tried (and probably failed at) to explain it&amp;#8217;s not either/or. Surely, there&amp;#8217;s a ton of value in using SELinux to lock down privileged mechanisms like HAL, NM, Bluez and so on. Having PolicyKit and SELinux work well together is in everyone&amp;#8217;s best interest.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-4310805812328150114?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/4310805812328150114/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2007/11/on-xguest-access-control-and-desktop.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/4310805812328150114'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/4310805812328150114'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2007/11/on-xguest-access-control-and-desktop.html' title='On Xguest, Access Control and Desktop'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-8119000582668640760</id><published>2007-11-12T06:56:00.000-05:00</published><updated>2010-04-19T20:21:58.042-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Me Me Me'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>Coverage</title><content type='html'>&lt;p&gt;Andy Oram wrote a &lt;a href="http://www.oreillynet.com/onlamp/blog/2007/11/policykit_looser_limitations_t.html"&gt;nice piece&lt;/a&gt; on PolicyKit detailing what it is and some of the plans for the future. I also did a short walk-through recently on one of our staff meetings here at Red Hat, there are some &lt;a href="http://people.freedesktop.org/~david/polkit-tour.html"&gt;pseudo slides here&lt;/a&gt;. On the topic of coverage I&amp;#8217;ve recently add unit tests to all the library sources and &lt;a href="http://gcc.gnu.org/onlinedocs/gcc/Gcov.html"&gt;gcov&lt;/a&gt; tells me we&amp;#8217;re at 59%. Not too shabby.&lt;br/&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-8119000582668640760?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/8119000582668640760/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2007/11/coverage.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/8119000582668640760'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/8119000582668640760'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2007/11/coverage.html' title='Coverage'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-6620244153782541471</id><published>2007-09-20T14:08:00.000-04:00</published><updated>2010-04-19T20:21:58.030-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>Policy, Mechanism and Time zones</title><content type='html'>&lt;p&gt;In my last &lt;a href="http://blog.fubar.dk/?p=93"&gt;post&lt;/a&gt; I looked at D-Bus system bus activation and provided a step-by-step guide on how to use this. In this installment we&amp;#8217;re going to look at a specific application of system bus activation; namely how it can be used from a desktop application to do a privileged operation: setting the timezone. This example will also feature usage of &lt;a href="http://hal.freedesktop.org/docs/PolicyKit/"&gt;PolicyKit&lt;/a&gt; for lock down.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;When dealing with programs that needs to do privileged operations, the first thing that one needs to do is to separate the mechanism (the piece of code actually doing the privileged bits) into a separate process from the rest of the program. The main program will then simply launch a small privileged helper whenever something privileged needs to happen. This is a good idea because it&amp;#8217;s a lot easier to review a tiny privileged helper with minimal dependencies rather than a huge program that pulls in things like GTK+, Python, image loaders and what not. Typically, the privileged helper is written in a way such that it trusts no-one; it verifies all the incoming parameters and also checks whether the program that calls it should be allowed to do so. The latter part is where PolicyKit comes in - PolicyKit is an application-level toolkit that allows a mechanism to ask &amp;#8220;is $USER allowed to do $ACTION?&amp;#8221;. As such, PolicyKit comes with a set of data structures to help model these constructs.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Anyway, enough boring theory; the user experience we want is that the user can click on his predefined list of time zones to set it; something like this&lt;br/&gt;&lt;br/&gt;&lt;img src="http://people.freedesktop.org/~david/timezone/intlclock2.png" alt="modified intlclock" /&gt;&lt;br/&gt;&lt;br/&gt;If the user is not privileged to do this action, we may show a dialog like this&lt;br/&gt;&lt;br/&gt;&lt;img src="http://people.freedesktop.org/~david/timezone/intlclock3.png" alt="stock PolicyKit-gnome dialog" /&gt;&lt;br/&gt;&lt;br/&gt;that may (or may not) feature buttons to make the system &lt;i&gt;remember&lt;/i&gt; that setting the time zone is OK. Such that the system won&amp;#8217;t ask for authentication in the future. In other words, this is a &lt;i&gt;one-time-pain&lt;/i&gt; dialog. &lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Let&amp;#8217;s go through the code and see how all this works. First, we need to write a mechanism. This will need to run as uid 0 (e.g. root) and we choose D-Bus as the interface for using the mechanism. We choose a unique name for the service, &lt;tt&gt;org.gnome.ClockApplet.Mechanism&lt;/tt&gt; and since we&amp;#8217;d like to write it in C using dbus-glib, we need to write some XML to define the objects and interfaces that this service will expose. This is defined &lt;a href="http://people.freedesktop.org/~david/timezone/gnome-clock-applet-mechanism.xml"&gt;in this file&lt;/a&gt;. As evident, this service exposes a single object, &lt;tt&gt;/&lt;/tt&gt;, that exposes a single interface &lt;tt&gt;org.gnome.ClockApplet.Mechanism&lt;/tt&gt; that currently exposes a single method &lt;tt&gt;SetTimezone(string zonefile)&lt;/tt&gt; where the argument to that function is a path to what time zone we want to use. The mechanism itself consists of two C files, available &lt;a href="http://people.freedesktop.org/~david/timezone/main.c"&gt;here&lt;/a&gt; and &lt;a href="http://people.freedesktop.org/~david/timezone/gnome-clock-applet-mechanism.c"&gt;here&lt;/a&gt; and a single C header file, available &lt;a href="http://people.freedesktop.org/~david/timezone/gnome-clock-applet-mechanism.h"&gt;here&lt;/a&gt;. &lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Then, exactly as in the &lt;a href="http://blog.fubar.dk/?p=93"&gt;last post&lt;/a&gt; we need a &lt;a href="http://people.freedesktop.org/~david/timezone/org.gnome.ClockApplet.Mechanism.conf"&gt;D-Bus configuration file&lt;/a&gt; and a &lt;a href="http://people.freedesktop.org/~david/timezone/org.gnome.ClockApplet.Mechanism.service"&gt;D-Bus service file&lt;/a&gt;. There&amp;#8217;s also a cheesy &lt;a href="http://people.freedesktop.org/~david/timezone/Makefile"&gt;Makefile&lt;/a&gt; to tie it all together.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Now, with this mechanism in place, we can poke it via D-Bus&lt;br/&gt;&lt;code&gt;&lt;br/&gt;$ dbus-send --system --print-reply --dest=org.gnome.ClockApplet.Mechanism / org.gnome.ClockApplet.Mechanism.SetTimezone string:/usr/share/zoneinfo/Europe/Copenhagen&lt;br/&gt;method return sender=:1.346 -&amp;gt; dest=:1.345 reply_serial=2&lt;br/&gt;&lt;/code&gt;&lt;br/&gt;The usage of PolicyKit deserves some explanation. First of all, as stated in the &lt;a href="http://hal.freedesktop.org/docs/PolicyKit/polkit-conf.html#id2732691"&gt;docs&lt;/a&gt;, we need to declare one or more actions for our mechanism. As we only export a single action right now (setting the time zone), we declare only that one action via the PolicyKit .policy file &lt;a href="http://people.freedesktop.org/~david/timezone/gnome-clock-applet-mechanism.policy"&gt;here&lt;/a&gt;. When we extend the mechanism to e.g. provide functionality to set the time as well (via e.g. a &lt;tt&gt;SetTime(int64 secs_since_epoch)&lt;/tt&gt; method) we can declare an action &lt;tt&gt;org.gnome.clockapplet.mechanism.settime&lt;/tt&gt; in addition to our &lt;tt&gt;org.gnome.clockapplet.mechanism.settimezone&lt;/tt&gt; one.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Now, whenever someone calls into the mechanism, we simply use &lt;i&gt;libpolkit&lt;/i&gt; to query whether the caller is allowed to do the specific action:&lt;br/&gt;&lt;code&gt;&lt;br/&gt;sender = dbus_g_method_get_sender (context);&lt;br/&gt;pk_caller = polkit_caller_new_from_dbus_name (system_bus_connection, sender,  &amp;#38;dbus_error);&lt;br/&gt;pk_action = polkit_action_new ();&lt;br/&gt;polkit_action_set_action_id (pk_action, "org.gnome.clockapplet.mechanism.settimezone");&lt;br/&gt;pk_result = polkit_context_can_caller_do_action (pk_context, pk_action, pk_caller);&lt;br/&gt;polkit_caller_unref (pk_caller);&lt;br/&gt;polkit_action_unref (pk_action);&lt;br/&gt;if (pk_result != POLKIT_RESULT_YES) { /* bail out */ }&lt;br/&gt;&lt;/code&gt;&lt;br/&gt;The system administrator can control, using the &lt;tt&gt;&lt;a href="http://hal.freedesktop.org/docs/PolicyKit/rn05re18.html"&gt;/etc/PolicyKit/PolicyKit.conf&lt;/a&gt;&lt;/tt&gt; configuration file, exactly what users are allowed to do this and whether they are allowed to keep the privilege to do the action on a forever- or per-session basis. This shouldn&amp;#8217;t be necessary since it&amp;#8217;s possible to specify the default &lt;a href="http://hal.freedesktop.org/docs/PolicyKit/polkit-polkit-result.html"&gt;result&lt;/a&gt; for a given &lt;a href="http://people.freedesktop.org/~david/timezone/gnome-clock-applet-mechanism.policy"&gt;action&lt;/a&gt;. Distributors can tweak the &lt;tt&gt;.policy&lt;/tt&gt; as they see fit; for example consumer-oriented distributions might want to patch this to make the defaults always be &amp;#8220;yes&amp;#8221; (to avoid the auth dialog entirely) and workstation-oriented distributions might want the defaults to be &amp;#8220;auth_admin&amp;#8221; (to require the system administrator password and not give a chance to remember the privilege). Finally, sites can override this using the system-wide configuration file, e.g. if I&amp;#8217;m a huge site I can distribute a PolicyKit.conf file that allows certain users to always do an action, certain other users never to do an action, and finally a third set of users for whom I want them to enter their own (or the root) password. Again, see the &lt;tt&gt;&lt;a href="http://hal.freedesktop.org/docs/PolicyKit/rn05re18.html"&gt;/etc/PolicyKit/PolicyKit.conf&lt;/a&gt;&lt;/tt&gt; configuration file for details.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;The screenshots above show integration with the intlclock applet; that&amp;#8217;s thanks to Matthias Clasen. I simply handed Matthias the mechanism code including a simple GTK demo application available &lt;a href="http://people.freedesktop.org/~david/timezone/demo.c"&gt;here&lt;/a&gt;. This application simply attempts to call into the mechanism and if the mechanism throws the &lt;tt&gt;org.gnome.ClockApplet.Mechanism.NotPrivileged&lt;/tt&gt; exception it uses PolicyKit-gnome (via the session bus) to prompt the user for authentication if applicable.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;The PolicyKit stuff is mostly done; at least the &lt;i&gt;plumbing&lt;/i&gt; is there. What I like to see is some more GNOME-ish &lt;i&gt;porcelain&lt;/i&gt; to make this stuff even easier to use. First, it&amp;#8217;s simply way too complicated to write dbus-glib D-Bus servers. There&amp;#8217;s just way too much code; compare to the Python server in the &lt;a href="http://blog.fubar.dk/?p=93"&gt;last post&lt;/a&gt;. Second, I&amp;#8217;d like to provide a small library with a subclassed &lt;a href="http://library.gnome.org/devel/gtk/unstable/GtkButton.html"&gt;GtkButton&lt;/a&gt;, e.g. PolicyKitGtkButton such that all the magic happens there and it shows e.g. a lock only if authentication will be needed. I&amp;#8217;m also planning to do a &lt;a href="http://live.gnome.org/Boston2007/SessionProposals"&gt;song and dance&lt;/a&gt; at the Boston Summit about this. The list of users of PolicyKit right now includes only HAL. However, &lt;a href="http://packagekit.org/wiki/index.php/Main_Page"&gt;PackageKit&lt;/a&gt;, &lt;a href="http://live.gnome.org/dconf"&gt;dconf&lt;/a&gt; and &lt;a href="http://virt-manager.et.redhat.com/"&gt;virt-manager&lt;/a&gt; are all in the process of picking it up. I&amp;#8217;m also hoping &lt;a href="http://www.gnome.org/projects/NetworkManager/"&gt;NetworkManager&lt;/a&gt; and things like gnome-system-monitor will pick it up (for the process killing bits instead of falling back to &lt;a href="http://mail.gnome.org/archives/desktop-devel-list/2007-May/msg00093.html"&gt;running the entire UI as uid 0&lt;/a&gt; just for this). With time, and not too much time, I&amp;#8217;m hoping for PolicyKit to be a blessed dependency in GNOME and banish the idea of su/sudo wrappers to enable running X11 applications as uid 0.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-6620244153782541471?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/6620244153782541471/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2007/09/policy-mechanism-and-time-zones.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/6620244153782541471'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/6620244153782541471'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2007/09/policy-mechanism-and-time-zones.html' title='Policy, Mechanism and Time zones'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-7406410966384771657</id><published>2007-08-01T22:00:00.000-04:00</published><updated>2010-04-19T20:21:58.020-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Photography'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>System Bus Activation hits Fedora Rawhide</title><content type='html'>&lt;p&gt;.. well, almost. Anyway, you can get packages &lt;a href="http://koji.fedoraproject.org/koji/taskinfo?taskID=85520"&gt;here&lt;/a&gt; or wait until &lt;a href="http://en.wikipedia.org/wiki/Rawhide_%28computing%29"&gt;Rawhide&lt;/a&gt; opens again (it&amp;#8217;s currently frozen for F8t1). Credit goes to &lt;a href="http://hughsient.livejournal.com/31169.html"&gt;Richard&lt;/a&gt; for finishing this work and getting it past &lt;a href="http://ometer.com/"&gt;Havoc&lt;/a&gt;. This is a really huge thing; it opens up a lot of possibilities for better desktop/OS integration.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://www.flickr.com/photos/davidz/860592853/" title="Photo Sharing"&gt;&lt;img src="http://farm2.static.flickr.com/1275/860592853_2668cdbe32.jpg" width="500" height="182" alt="Lots of pretty colors" border="0" /&gt;&lt;/a&gt; &lt;br/&gt;&lt;i&gt;Lots of pretty colors&lt;/i&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;To actually test the packages I wrote a simple test program and thought it might be useful to &lt;a href="http://people.freedesktop.org/~david/dbus-sysbus-test/"&gt;share it&lt;/a&gt;. First, you need a program that claims a name on the system bus. I just copied the &lt;a href="http://gitweb.freedesktop.org/?p=dbus/dbus-python.git;a=blob;hb=HEAD;f=examples/example-service.py"&gt;one&lt;/a&gt; from the &lt;a href="http://gitweb.freedesktop.org/?p=dbus/dbus-python.git"&gt;dbus-python&lt;/a&gt; repository and modified it slightly. You can see it &lt;a href="http://people.freedesktop.org/~david/dbus-sysbus-test/dbus-sysbus-test.py"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Second, as with any service on the &lt;strong&gt;system&lt;/strong&gt; message bus (as opposed to the session bus which has different security characteristics) you need a file in &lt;code&gt;/etc/dbus-1/system.d&lt;/code&gt;. Mine is named &lt;code&gt;dk.fubar.Test.conf&lt;/code&gt; (but note that any unique file name ending in &lt;code&gt;.conf&lt;/code&gt; will do) and is pretty much run-of-the-mill standard stuff and shouldn&amp;#8217;t be a surprise if you&amp;#8217;re familiar with services on the system bus. It looks like &lt;a href="http://people.freedesktop.org/~david/dbus-sysbus-test/dk.fubar.Test.conf"&gt;this&lt;/a&gt;.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Finally, for system bus activation to work you simply need to put a service file in &lt;code&gt;/usr/share/dbus-1/system-services&lt;/code&gt;. Mine is named &lt;code&gt;dk.fubar.Test.service&lt;/code&gt; (again, any unique name ending in &lt;code&gt;.service&lt;/code&gt; will do) and looks like &lt;a href="http://people.freedesktop.org/~david/dbus-sysbus-test/dk.fubar.Test.service"&gt;this&lt;/a&gt;:&lt;br/&gt;&lt;code&gt;&lt;br/&gt;[D-BUS Service]&lt;br/&gt;Name=dk.fubar.Test&lt;br/&gt;Exec=/usr/sbin/dbus-sysbus-test.py&lt;br/&gt;User=root&lt;br/&gt;&lt;/code&gt;&lt;br/&gt;and that&amp;#8217;s it! Provided you installed everything correctly (there&amp;#8217;s a cheesy &lt;a href="http://people.freedesktop.org/~david/dbus-sysbus-test/Makefile"&gt;Makefile&lt;/a&gt; to do this) things should Just Work(tm) and the following command should print&lt;br/&gt;&lt;code&gt;&lt;br/&gt;$ dbus-send --system --print-reply --dest=dk.fubar.Test /SomeObject dk.fubar.Test.SampleInterface.HelloWorld string:foo&lt;br/&gt;method return sender=:1.517 -&amp;gt; dest=:1.516 reply_serial=2&lt;br/&gt;   array [&lt;br/&gt;      string "Hello"&lt;br/&gt;      string " from example-service.py"&lt;br/&gt;      string "with unique name"&lt;br/&gt;      string ":1.517"&lt;br/&gt;   ]&lt;br/&gt;&lt;/code&gt;&lt;br/&gt;If your service is capable of operating correctly when running as an unprivileged system user (e.g. &lt;code&gt;ftp&lt;/code&gt; or whatever) instead of &lt;code&gt;root&lt;/code&gt; (think least privilege), simply change the user mentioned in both the &lt;code&gt;.service&lt;/code&gt; and &lt;code&gt;.conf&lt;/code&gt; files.&lt;br/&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-7406410966384771657?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/7406410966384771657/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2007/08/system-bus-activation-hits-fedora.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/7406410966384771657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/7406410966384771657'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2007/08/system-bus-activation-hits-fedora.html' title='System Bus Activation hits Fedora Rawhide'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm2.static.flickr.com/1275/860592853_2668cdbe32_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-7981474809200754506</id><published>2007-07-19T12:57:00.000-04:00</published><updated>2010-04-19T20:21:58.011-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Photography'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>No more polling</title><content type='html'>&lt;p&gt;I just committed code to &lt;a href="http://gitweb.freedesktop.org/?p=hal.git;a=summary"&gt;hal&lt;/a&gt; to take advantage of asynchronous change notification events originating from &lt;a href="http://en.wikipedia.org/wiki/Serial_ATA"&gt;SATA&lt;/a&gt; AN capable drives. This means we can avoid polling the drive and this should result in fewer wakeups in &lt;a href="http://linux-ata.org/"&gt;libata&lt;/a&gt;. This also opens the opportunity for the drive itself to go into a deeper sleep state when it&amp;#8217;s not used. So all in all this should improve laptop battery life. I haven&amp;#8217;t tried this on a laptop just yet, but when I find a suitable one I&amp;#8217;m sure &lt;a href="http://www.linuxpowertop.org/"&gt;PowerTOP&lt;/a&gt; will tell me.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://www.flickr.com/photos/davidz/840964615/" title="Mural at the back of 1369"&gt;&lt;img src="http://farm2.static.flickr.com/1100/840964615_b49f3fa923.jpg" border="0" width="500" height="333" alt="Mural at the back of 1369" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;i&gt;I took this while testing this &lt;a href="http://www.dpreview.com/news/0608/06080202sonygpscs1.asp"&gt;GPS receiver&lt;/a&gt;. Click to see where to get good coffee.&lt;/i&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Credit goes to Kristen Carlson Accardi from Intel. She did the kernel bits, sent me a SATA AN capable drive and pointed me in the right direction. To try this out, you will need a recent kernel and also some patches not yet in Linus&amp;#8217; tree. See &lt;a href="https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=halpolling"&gt;RH #204969&lt;/a&gt; for details. I&amp;#8217;m hoping this will make it into Fedora 8; the hal bits will for sure; for the kernel bits I suppose asking &lt;a href="http://kernelslacker.livejournal.com/"&gt;davej&lt;/a&gt; is in order.&lt;br/&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-7981474809200754506?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/7981474809200754506/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2007/07/no-more-polling.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/7981474809200754506'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/7981474809200754506'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2007/07/no-more-polling.html' title='No more polling'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm2.static.flickr.com/1100/840964615_b49f3fa923_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-3138183478041368889</id><published>2007-06-20T09:04:00.000-04:00</published><updated>2010-04-19T20:21:58.005-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>PolicyKit release</title><content type='html'>&lt;p&gt;Late last night I finally made a &lt;a href="http://lists.freedesktop.org/archives/hal/2007-June/008815.html"&gt;PolicyKit release&lt;/a&gt;. It&amp;#8217;s almost ready for prime time; wait a month for 0.4 to get out and I should be able to maintain a stable API.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://people.freedesktop.org/~david/PolicyKit-0.3.png"&gt;&lt;img width="500" height="327" border="0" src="http://people.freedesktop.org/~david/Polkit-0.3-thumb.png" alt="PolicyKit" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;i&gt;PolicyKit in action&lt;/i&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;With Richard&amp;#8217;s great work on &lt;a href="http://lists.freedesktop.org/archives/dbus/2007-June/007874.html"&gt;D-Bus system bus activation&lt;/a&gt; it looks like we&amp;#8217;re soon going to have nice upstream frameworks for enabling the desktop to do privileged operations in a hopefully sane way. Instead of having each and every distribution on the planet write their own configuration tools. I, for one, really wants to see some effort of merging such things into upstream GNOME and KDE as far as possible.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-3138183478041368889?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/3138183478041368889/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2007/06/policykit-release.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/3138183478041368889'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/3138183478041368889'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2007/06/policykit-release.html' title='PolicyKit release'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-4203244057649653298</id><published>2007-06-05T16:58:00.000-04:00</published><updated>2010-04-19T20:21:57.997-04:00</updated><title type='text'>Interwebs</title><content type='html'>&lt;p&gt;Normally I&amp;#8217;m not opposed to what our new web overlords are serving us; you know; &lt;a href="http://en.wikipedia.org/wiki/Social_networks"&gt;social networks&lt;/a&gt; and the ability to see what past and present, uh, peers are up to&amp;#8230; but sometimes it&amp;#8217;s just &lt;a href="http://en.wikipedia.org/wiki/Slang"&gt;TMI&lt;/a&gt; - Maybe I just need to use the Interwebs less &lt;img src='http://blog.fubar.dk/wp-images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&gt;&lt;br/&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-4203244057649653298?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/4203244057649653298/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2007/06/interwebs.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/4203244057649653298'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/4203244057649653298'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2007/06/interwebs.html' title='Interwebs'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-2794425022003004653</id><published>2007-05-07T12:30:00.000-04:00</published><updated>2010-04-19T20:21:57.984-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Travelling'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>i’m in ur RAID, striping ur disks all the way to CA</title><content type='html'>&lt;p&gt;Recently I acquired a pair of &lt;a href="http://www.wdc.com/en/products/Products.asp?DriveID=232"&gt;500GB USB2&lt;/a&gt; hard disks that I use in a &lt;a href="http://en.wikipedia.org/wiki/RAID#Standard_RAID_levels"&gt;RAID-1&lt;/a&gt; configuration (on two different host controllers!); you know, to store my photos and other important, uh, stuff. I had some spare time this weekend to look at &lt;a href="http://bugs.freedesktop.org/show_bug.cgi?id=6427"&gt;fd.o #6426&lt;/a&gt; so I wrote a &lt;a href="http://gitweb.freedesktop.org/?p=hal.git;a=commit;h=c53f3e46e53204bb1d1910b7fbbd81edaf61c29b"&gt;small patch&lt;/a&gt; to teach HAL about Linux software RAID. &lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://www.flickr.com/photos/davidz/488722220/" title="Photo Sharing"&gt;&lt;img border="0" src="http://farm1.static.flickr.com/206/488722220_60a80f4b3e.jpg" width="500" height="366" alt="gnome-device-manager showing Software RAID drive" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;i&gt;RAID rebuilding&lt;/i&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;I also whipped up &lt;a href="http://gitweb.freedesktop.org/?p=users/david/gnome-device-manager.git;a=commit;h=153c3da9560f3ada9b2e85263f6dea6df167a952"&gt;patch&lt;/a&gt; to &lt;a href="http://mail.gnome.org/archives/utopia-list/2007-April/msg00000.html"&gt;gnome-device-manager&lt;/a&gt; such as to show the new properties introduced including whether an array is running in degraded mode or is being rebuilt. It&amp;#8217;s pretty spiffy.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;All that this code is doing right now is basically just listening to kernel events (via udev and &lt;a href="http://www.issociate.de/board/post/28768/%5BPATCH_md_0_of_2%5D_Introduction.html"&gt;priority data on /proc/mdstat&lt;/a&gt;) and then representing the RAID arrays as HAL &lt;a href="http://people.freedesktop.org/~david/hal-spec/hal-spec.html#interface-device-storage"&gt;drives&lt;/a&gt; and &lt;a href="http://people.freedesktop.org/~david/hal-spec/hal-spec.html#interface-device-volume"&gt;volumes&lt;/a&gt;. It&amp;#8217;s spiffy because the RAID drive inherits things like &lt;a href="http://people.freedesktop.org/~david/hal-spec/hal-spec.html#device-properties-storage"&gt;storage.hotpluggable&lt;/a&gt;  from the physical components (e.g. the two USB hard disks) so in my case the RAID array simply appears in &lt;a href="http://www.gnome.org/projects/nautilus/"&gt;Nautilus&lt;/a&gt; and is totally mountable just like a regular external drive. Works out of the box. Desktop integration++. However, we can do a bit better so for GNOME 2.20 I&amp;#8217;ll be writing some patches to &lt;a href="http://en.wikipedia.org/wiki/GNOME_VFS"&gt;gnome-vfs&lt;/a&gt; and &lt;a href="http://mail.gnome.org/archives/gtk-devel-list/2007-February/msg00062.html"&gt;gvfs&lt;/a&gt;. You know, to use the new HAL properties to choose some helpful icons and icon captions.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Going forward, there needs to be some way of assembling and disassembling RAID arrays; hot-adding components to degraded arrays and so on and so on. Probably neither Nautilus nor gnome-device-manager is the right approach here. And there will probably be some sort of auto-assembly happening at the system-wide level &lt;i&gt;anyway&lt;/i&gt;, need to sort that out with Kay (the &lt;a href="http://en.wikipedia.org/wiki/Udev"&gt;udev&lt;/a&gt; maintainer) and also talk to various distro maintainers too. It&amp;#8217;s also probably also time to revive my never properly announced &lt;a href="http://people.freedesktop.org/~david/gdu-4.png"&gt;GNOME&lt;/a&gt; &lt;a href="http://people.freedesktop.org/~david/gdu-5.png"&gt;Disk&lt;/a&gt; &lt;a href="http://people.freedesktop.org/~david/gdu-6.png"&gt;Utility&lt;/a&gt; project. Actually, that&amp;#8217;s one reason &lt;a href="http://gitweb.freedesktop.org/?p=users/david/gnome-device-manager.git;a=commit;h=0185df1af8b57a951beabd82bc08703f7a3c7321"&gt;that I split&lt;/a&gt; the Device Manager into a shell and library component; right now the shell is around 1200 lines (compared to 4000+ for the library) and there&amp;#8217;s no reason that the Disk Utility shell would be a lot bigger. Plus it&amp;#8217;s always awesome to put pretty UI on top of useful infrastructure.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Tomorrow I&amp;#8217;m leaving for &lt;a href="http://en.wikipedia.org/wiki/California"&gt;The Golden State&lt;/a&gt; to go the &lt;a href="http://www.redhat.com/promo/summit/"&gt;Red Hat summit&lt;/a&gt;, then hang out with &lt;a href="http://vrfy.org/"&gt;Kay Sievers&lt;/a&gt; and finish off the west-coast invasion with &lt;a href="http://freedomhec.pbwiki.com/"&gt;FreedomHEC&lt;/a&gt;. The next two weeks are going to be busy.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-2794425022003004653?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/2794425022003004653/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2007/05/im-in-ur-raid-striping-ur-disks-all-way.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/2794425022003004653'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/2794425022003004653'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2007/05/im-in-ur-raid-striping-ur-disks-all-way.html' title='i’m in ur RAID, striping ur disks all the way to CA'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm1.static.flickr.com/206/488722220_60a80f4b3e_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-3940705925188897840</id><published>2007-04-28T09:24:00.000-04:00</published><updated>2010-04-19T20:21:57.972-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><category scheme='http://www.blogger.com/atom/ns#' term='Politics'/><title type='text'>Battery Recall^WExchange</title><content type='html'>&lt;p&gt;Just found, via the interwebs, that the battery in my 15&amp;#8243; Macbook Pro &lt;a href="https://support.apple.com/macbookpro15/batteryexchange/"&gt;was recalled^Weligible for exchange&lt;/a&gt; almost a year ago although not for safety risks, merely because &amp;#8220;&amp;#8230; batteries supplied to Apple do not meet our high standards for battery performance.&amp;#8221; [sic]. So that&amp;#8217;s something. Anyway, since this is useful information, I wanted to add information to &lt;a href="http://gitweb.freedesktop.org/?p=hal-info.git"&gt;hal-info&lt;/a&gt; such that other Macbook Pro users would benefit as well. By getting spammed with a popup like this&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;img src="http://people.freedesktop.org/~david/apple-battery-recall.png"&gt;&lt;br/&gt;&lt;i&gt;Useful &lt;a href="http://hughsient.livejournal.com/8391.html"&gt;feature&lt;/a&gt; in &lt;a href="http://www.gnome.org/projects/gnome-power-manager/"&gt;g-p-m&lt;/a&gt;&lt;/i&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;But as it turns out this data is not easily available&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;code&gt;&lt;br/&gt;$ cat /proc/acpi/battery/BAT0/info&lt;br/&gt;present:                 yes&lt;br/&gt;design capacity:         55000 mWh&lt;br/&gt;last full capacity:      47150 mWh&lt;br/&gt;battery technology:      rechargeable&lt;br/&gt;design voltage:          10800 mV&lt;br/&gt;design capacity warning: 250 mWh&lt;br/&gt;design capacity low:     100 mWh&lt;br/&gt;capacity granularity 1:  10 mWh&lt;br/&gt;capacity granularity 2:  10 mWh&lt;br/&gt;model number:            ASMB012&lt;br/&gt;serial number:&lt;br/&gt;battery type:            LION012&lt;br/&gt;OEM info:                SMPN012&lt;br/&gt;&lt;/code&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;meaning it&amp;#8217;s hard to match on anything sensible from the fdi file. Maybe this is because it&amp;#8217;s a &lt;a href="http://en.wikipedia.org/wiki/Smart_Battery"&gt;Smart Battery&lt;/a&gt;? FWIW, I can see that the &lt;a href="http://www.linuxfront.com/labs/linux-sbs/"&gt;sbs&lt;/a&gt; driver is loaded. Lazyweb, please help &lt;img src='http://blog.fubar.dk/wp-images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&gt;  - as comments on my blog are busted, please provide answers personally to &lt;a href="mailto:david@fubar.dk"&gt;me&lt;/a&gt; or, preferably, the &lt;a href="http://lists.freedesktop.org/mailman/listinfo/hal"&gt;hal list&lt;/a&gt; (requires subscription).  &lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Btw, I couldn&amp;#8217;t find this information by poking around in Mac OS X either&amp;#8230; but it must be there; I mean, normal non-smart batteries record make, model and serial numbers just fine via ACPI. That&amp;#8217;s what we use to tag other &lt;a href="http://gitweb.freedesktop.org/?p=hal-info.git;a=blob;hb=HEAD;f=fdi/information/10freedesktop/10-recall-battery-ibm.fdi"&gt;recalled battery units&lt;/a&gt;. So I&amp;#8217;m sure it&amp;#8217;s possible to get at. And if Apple wanted, they could easily have similar mechanisms for displaying notifications similar to the ones we have in &lt;a href="http://www.gnome.org/"&gt;GNOME&lt;/a&gt;. But I can understand it would hurt their bottom line. I guess.. this is one interesting aspect of getting your OS from the same vendor as where you get your hardware.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Anyway, I filled out the form and a new battery is on it&amp;#8217;s way. I guess, uh, thanks &lt;a href="http://www.apple.com/"&gt;Apple&lt;/a&gt;. Just wish you had notified me earlier and I wouldn&amp;#8217;t have to find out this way &lt;img src='http://blog.fubar.dk/wp-images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /&gt; .&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; I suppose this isn&amp;#8217;t technically a &lt;em&gt;&lt;a href="http://en.wikipedia.org/wiki/Product_recall"&gt;Product Recall&lt;/a&gt;&lt;/em&gt;; Apple specifically uses the word &lt;em&gt;Exchange&lt;/em&gt; instead. I guess, from a legal point of view at least, there&amp;#8217;s a difference. To me, as a consumer, it&amp;#8217;s doesn&amp;#8217;t make huge difference however&amp;#8230; hmm.. maybe we need to add a new property info.is_eligible_for_exchange to the &lt;a href="http://people.freedesktop.org/~david/hal-spec/hal-spec.html#device-properties-info"&gt;HAL spec&lt;/a&gt; to avoid using the word &amp;#8220;recall&amp;#8221; at all in such situations. I mean, to, uh, cover our collective asses from angry hardware vendors.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-3940705925188897840?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/3940705925188897840/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2007/04/battery-recallwexchange.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/3940705925188897840'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/3940705925188897840'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2007/04/battery-recallwexchange.html' title='Battery Recall^WExchange'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-2128695405085782138</id><published>2007-04-27T13:19:00.000-04:00</published><updated>2010-04-19T20:21:57.963-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Me Me Me'/><category scheme='http://www.blogger.com/atom/ns#' term='Rants'/><title type='text'>Native languages and poisonous people</title><content type='html'>&lt;p&gt;I think, over the past 3.5 years I&amp;#8217;ve been working on free software, I have sent more than 5,000 mails, all in &lt;a href="http://en.wikipedia.org/wiki/English_language"&gt;English&lt;/a&gt;, to various mailing lists, most of them with more than a few hundred subscribers. It&amp;#8217;s always a bit weird (even after living in Massachusetts for more than 2.5 years) to use your second language and I believe it will stay that way the rest of my life. Which is fine and all.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://www.flickr.com/photos/davidz/468714000/" title="Photo Sharing"&gt;&lt;img src="http://farm1.static.flickr.com/183/468714000_19bada8b47.jpg" width="500" height="333" border="0" alt="_mg_8275.jpg" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;i&gt;Sketchy Dane&lt;/i&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;In general, I&amp;#8217;ve found that native English speakers are very nice to non-native English speakers. In stark contrast, for example, are natives of my own country Denmark; whenever a foreigner attempts to speak &lt;a href="http://en.wikipedia.org/wiki/Danish_language"&gt;Danish&lt;/a&gt; everything becomes a bit weird. One common thing is that the native Danes try to switch to conversation to English because it makes them less uncomfortable. I guess there are many reasons for this difference of behavior; first, Danish is a small, insignificant (and dying) language, most people speak English anyway and not a lot of native English speakers have a second language at all. But it&amp;#8217;s also a cultural thing. In particular, I find that it&amp;#8217;s very easy to live among the Americans; they&amp;#8217;re friendly (actually, I jokingly tend to say &amp;#8220;it&amp;#8217;s like living with the smurfs&amp;#8221;; many, not all though, people here are just more optimistic about the future than in Denmark and the EU.).  The fact that English is a second language have never been an issue for me at all.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://www.flickr.com/photos/davidz/468722559/" title="Photo Sharing"&gt;&lt;img src="http://farm1.static.flickr.com/218/468722559_f07a49a7c7.jpg" width="500" height="333" border="0" alt="_mg_8276.jpg" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;i&gt;Sketchy German&lt;/i&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Until today. I guess there&amp;#8217;s a first time for everything,  &lt;a href="https://www.redhat.com/archives/fedora-livecd-list/2007-April/msg00153.html"&gt;the topic of my native language&lt;/a&gt; came up on the Fedora live cd mailing list just recently.  Response &lt;a href="https://www.redhat.com/archives/fedora-livecd-list/2007-April/msg00154.html"&gt;here&lt;/a&gt;. Time to watch &lt;a href="http://video.google.com/videoplay?docid=-4216011961522818645&amp;#38;q=poisonous+people"&gt;How Open Source Projects Survive Poisonous People (And You Can Too)&lt;/a&gt; again I suppose.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;The whole thing just makes me a little sad inside.&lt;br/&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-2128695405085782138?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/2128695405085782138/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2007/04/native-languages-and-poisonous-people.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/2128695405085782138'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/2128695405085782138'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2007/04/native-languages-and-poisonous-people.html' title='Native languages and poisonous people'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm1.static.flickr.com/183/468714000_19bada8b47_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-7389954272530078980</id><published>2007-04-02T21:47:00.000-04:00</published><updated>2010-04-19T20:21:57.957-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>hal 0.5.9</title><content type='html'>&lt;p&gt;I just released &lt;a href="http://lists.freedesktop.org/archives/hal/2007-April/007923.html"&gt;hal 0.5.9&lt;/a&gt;. Lots of changes including dramatically reduced resource usage, Solaris and FreeBSD support, ACL management, ConsoleKit support and many other things. Get it while it&amp;#8217;s, uhm, hot. Hopefully the next release won&amp;#8217;t take seven months&amp;#8230;&lt;br/&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-7389954272530078980?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/7389954272530078980/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2007/04/hal-059.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/7389954272530078980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/7389954272530078980'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2007/04/hal-059.html' title='hal 0.5.9'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-8866271715924902241</id><published>2007-04-02T11:29:00.000-04:00</published><updated>2010-04-19T20:21:57.947-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Travelling'/><category scheme='http://www.blogger.com/atom/ns#' term='Me Me Me'/><title type='text'>Stupid meme</title><content type='html'>&lt;div style="width:550px;position:relative;"&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;	&lt;br/&gt;	&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;	&lt;div style="background-color:#372060;text-align:center;width:549px;border-left:1px solid #372060;"&gt;&lt;br/&gt;&lt;a href="http://www.travbuddy.com/widget_map.php"&gt;&lt;img src="http://www.travbuddy.com/images/widget_map_promote.gif"&gt;&lt;/a&gt;&lt;br/&gt;&lt;/div&gt;&lt;br/&gt;	&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-8866271715924902241?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/8866271715924902241/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2007/04/stupid-meme.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/8866271715924902241'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/8866271715924902241'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2007/04/stupid-meme.html' title='Stupid meme'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-7755141886683213678</id><published>2007-03-12T13:45:00.000-04:00</published><updated>2010-04-19T20:21:57.940-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rants'/><title type='text'>Gah!</title><content type='html'>&lt;p&gt;Just received this in the mail today from &lt;a href="http://www.europcar.com.au/"&gt;Europcar Australia&lt;/a&gt;:&lt;/p&gt;&lt;br/&gt;	&lt;blockquote&gt;&lt;p&gt;&lt;br/&gt;As the registered owner of the vehicle stated below we have received a Speeding Infringement Notice and, upon searching our records, we can confirm that the infringement was incurred during your rental period.&lt;br/&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;br/&gt;	&lt;p&gt;Guess I should have looked out for &lt;a href="http://en.wikipedia.org/wiki/Speed_cameras_in_Australia"&gt;speed cameras&lt;/a&gt;. &lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://www.flickr.com/photos/davidz/384581263/" title="Photo Sharing"&gt;&lt;img border="0" src="http://farm1.static.flickr.com/165/384581263_baa7bf8418.jpg" width="500" height="333" alt="_MG_7215.JPG" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;i&gt;Random photo plug: &lt;a href="http://en.wikipedia.org/wiki/Darling_Harbour"&gt;Darling Harbour&lt;/a&gt; in January&lt;/i&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;I&amp;#8217;m slowly losing my patience with the gods regarding distribution of luck and fortune.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-7755141886683213678?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/7755141886683213678/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2007/03/gah.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/7755141886683213678'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/7755141886683213678'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2007/03/gah.html' title='Gah!'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm1.static.flickr.com/165/384581263_baa7bf8418_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-7063187760046318923</id><published>2007-02-24T16:16:00.000-05:00</published><updated>2010-04-19T20:21:57.932-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Politics'/><title type='text'>Who Killed The Electric Car?</title><content type='html'>&lt;p&gt;Yay, just found out that &lt;a href="http://imdb.com/title/tt0489037/"&gt;Who Killed The Electric Car?&lt;/a&gt; is available on-demand on Comcast. It&amp;#8217;s pretty awesome so far. Update: favorite quote &lt;i&gt;“they’ll make me drive a small car, make me be cold in my own home… in other words, make me live like a European.”&lt;/i&gt;. My gods, that&amp;#8217;s awesome &lt;img src='http://blog.fubar.dk/wp-images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&gt; .&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://www.flickr.com/photos/davidz/384516852/" title="Photo Sharing"&gt;&lt;img src="http://farm1.static.flickr.com/141/384516852_f2256ff0da.jpg" width="500" height="333" border="0" alt="_MG_7461.JPG" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;i&gt;I miss the summer (photo from Sydney, January 2007)&lt;/i&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Weather here in MA continues to suck although my relatives in Denmark says it&amp;#8217;s much worse there.&lt;br/&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-7063187760046318923?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/7063187760046318923/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2007/02/who-killed-electric-car.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/7063187760046318923'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/7063187760046318923'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2007/02/who-killed-electric-car.html' title='Who Killed The Electric Car?'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm1.static.flickr.com/141/384516852_f2256ff0da_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-741936870729504143</id><published>2007-01-13T14:44:00.000-05:00</published><updated>2010-04-19T20:21:57.925-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Photography'/><category scheme='http://www.blogger.com/atom/ns#' term='Travelling'/><category scheme='http://www.blogger.com/atom/ns#' term='Me Me Me'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>Sydney</title><content type='html'>&lt;p&gt;Barely back in Boston (UTC -0500) after the xmas break in Denmark (UTC +0100), I&amp;#8217;m now in Sydney (UTC +1100) for &lt;a href="http://lca2007.linux.org.au/"&gt;linux.conf.au 2007&lt;/a&gt;. I don&amp;#8217;t feel jetlagged though.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://www.flickr.com/photos/davidz/356203167/" title="Photo Sharing"&gt;&lt;img src="http://farm1.static.flickr.com/131/356203167_d1633758bd.jpg" width="500" height="333" alt="_MG_6484.JPG" border="0" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;i&gt;&lt;a href="http://en.wikipedia.org/wiki/Coogee%2C_New_South_Wales"&gt;Coogee, NSW, Australia&lt;/a&gt; (not my bottles)&lt;/i&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Managed to sleep a lot on my 24-hour journey; I was fortunate enough to be traveling with &lt;a href="http://www.0xdeadbeef.com/weblog/"&gt;blizzard&lt;/a&gt;. We even got picked up at the airport; I suppose Chris&amp;#8217; description of us to the organizers was somewhat accurate &lt;img src='http://blog.fubar.dk/wp-images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&gt; &lt;/p&gt;&lt;br/&gt;	&lt;blockquote&gt;&lt;p&gt;&lt;i&gt;&lt;br/&gt;Just look for crazy man and fisheye boy:&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;a href="http://www.flickr.com/photos/christopherblizzard/306028359/"&gt;http://www.flickr.com/photos/christopherblizzard/306028359/&lt;/a&gt;&lt;br/&gt;&lt;a href="http://www.flickr.com/photos/davidz/235769935/"&gt;http://www.flickr.com/photos/davidz/235769935/&lt;/a&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;(Together, we fight crime!)&lt;br/&gt;&lt;/i&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;br/&gt;	&lt;p&gt;Now to check out of my hotel and find the campus of &lt;a href="http://www.google.com/search?hl=en&amp;#38;q=university+nsw&amp;#38;btnG=Google+Search"&gt;UNSW&lt;/a&gt;. Times are good.&lt;br/&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-741936870729504143?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/741936870729504143/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2007/01/sydney.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/741936870729504143'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/741936870729504143'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2007/01/sydney.html' title='Sydney'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm1.static.flickr.com/131/356203167_d1633758bd_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-8507369573971786757</id><published>2006-11-17T09:50:00.000-05:00</published><updated>2010-04-19T20:21:57.917-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Photography'/><category scheme='http://www.blogger.com/atom/ns#' term='Travelling'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>Fast User Switching</title><content type='html'>&lt;p&gt;I&amp;#8217;ve just put up &lt;a href="http://fedoraproject.org/wiki/Desktop/FastUserSwitching"&gt;some notes&lt;/a&gt; about &lt;a href="http://en.wikipedia.org/wiki/Fast_User_Switching"&gt;Fast User Switching&lt;/a&gt; and how we plan to integrate this into &lt;a href="http://fedoraproject.org/wiki/"&gt;Fedora&lt;/a&gt; for our next release. &lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Most of this work builds upon &lt;a href="http://gitweb.freedesktop.org/?p=ConsoleKit.git"&gt;ConsoleKit&lt;/a&gt; by the ever-so-awesome &lt;a href="http://flickr.com/photos/davidz/180698424/in/set-72157594186094257/"&gt;Jon McCann&lt;/a&gt; of gnome-screensaver fame. It&amp;#8217;s not very Fedora centric so hopefully other Linux distributions (and other free UNIX-like systems like OpenSolaris and FreeBSD) will pick it up too. I&amp;#8217;m excited, in particular, about the fact that, with infrastructure like this, we&amp;#8217;ll be able to enhance applications to behave intelligently when f-u-s is used, e.g. pause media playback, go to away mode for IM etc.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://www.flickr.com/photos/davidz/299543908/" title="Photo Sharing"&gt;&lt;img border="0" src="http://static.flickr.com/101/299543908_2381458a8f.jpg" width="500" height="333" alt="pjones, campd and J5 at Charlies" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;i&gt;Don&amp;#8217;t forget the &lt;a href="http://campd.org/?p=27"&gt;beer&lt;/a&gt; tonight&lt;/i&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Going to pick up &lt;a href="http://vrfy.org/"&gt;Kay&lt;/a&gt; later in the PM, he&amp;#8217;s flying in from &lt;a href="http://en.wikipedia.org/wiki/Hamburg"&gt;Hamburg&lt;/a&gt;. We&amp;#8217;ll most likely end up at Flat Top&amp;#8217;s later tonight for &lt;a href="http://campd.org/"&gt;Dave&amp;#8217;s&lt;/a&gt; shindig!&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;A few days ago Artem &lt;a href="http://gitweb.freedesktop.org/?p=hal.git;a=commit;h=49abf2145106009fe92a4efd82ff510a5c945d45"&gt;merged&lt;/a&gt; the Solaris backend for HAL. Awesome. The FreeBSD backend is going to be merged real soon now as well, the &lt;a href="http://lists.freedesktop.org/archives/hal/2006-November/006486.html"&gt;patch&lt;/a&gt; is already on the list.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-8507369573971786757?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/8507369573971786757/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2006/11/fast-user-switching.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/8507369573971786757'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/8507369573971786757'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2006/11/fast-user-switching.html' title='Fast User Switching'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-4132659836467437442</id><published>2006-11-16T09:39:00.000-05:00</published><updated>2010-04-19T20:21:57.910-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Photography'/><category scheme='http://www.blogger.com/atom/ns#' term='Fun'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>D-Bus 1.0 release party</title><content type='html'>&lt;p&gt;&lt;br/&gt;&lt;a href="http://www.flickr.com/photos/davidz/298877584/" title="Photo Sharing"&gt;&lt;img border="0" src="http://static.flickr.com/117/298877584_3acd3816a1.jpg" width="500" height="333" alt="D-Bus 1.0 release party" /&gt;&lt;/a&gt; &lt;br/&gt;&lt;i&gt;Taken at the &lt;a href="http://www.j5live.com/?p=280"&gt;D-Bus 1.0 release party&lt;/a&gt;&lt;/i&gt;&lt;br/&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-4132659836467437442?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/4132659836467437442/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2006/11/d-bus-10-release-party.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/4132659836467437442'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/4132659836467437442'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2006/11/d-bus-10-release-party.html' title='D-Bus 1.0 release party'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-3621893857885329853</id><published>2006-11-09T22:23:00.000-05:00</published><updated>2010-04-19T20:21:57.902-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><category scheme='http://www.blogger.com/atom/ns#' term='Politics'/><title type='text'>Trying to be Constructive</title><content type='html'>&lt;p&gt;&lt;a href="http://www.fooishbar.org/blog/tech/ubuntu/fedora-2006-11-10-02-57.html"&gt;Daniel&lt;/a&gt;, actually I wasn&amp;#8217;t referring to binary drivers per se in that &lt;a href="http://blog.fubar.dk/?p=76"&gt;particulary obnoxious post&lt;/a&gt; of mine; what I had in mind was primarily out-of-tree drivers / features including ones that &lt;a href="http://kernelslacker.livejournal.com/57802.html?thread=178378#t178378"&gt;explicitly disable rootkit prevention&lt;/a&gt; features for example. Using the word &lt;i&gt;damaging to the free software community&lt;/i&gt; however was perhaps over the top, sorry it upset you and probably others, but I just don&amp;#8217;t think including a bunch of not-so-heavily-audited code (e.g. a driver that is not in mainline) or code that disables security features is doing your users service. Most users of course don&amp;#8217;t care, but developers like you and I should. In particular, OS vendors needs to care.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;It seems you and I don&amp;#8217;t disagree on Linux based distributions including proprietary drivers but I think that one thing you might not realize is how damaging it is when a popular distro starts doing this&amp;#8230; years of work in dealing with certain vendors to open up code is undone in a jiffy. I don&amp;#8217;t want to be all moody here, trying to be constructive (could use much stronger words but that would serve no purpose), but it&amp;#8217;s flat out depressing when stuff like this happens.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;With regards to you commenting on the Fedora community, most of your points, I think, are well understood by the &lt;a href="http://fedoraproject.org/wiki/"&gt;community&lt;/a&gt; and some are &lt;a href="https://www.redhat.com/archives/fedora-advisory-board/2006-November/msg00094.html"&gt;being dealt with&lt;/a&gt;. For the record (and this should be clear to anyone involved in the areas I also participate in), I think of myself much more as an &lt;i&gt;upstream guy&lt;/i&gt; rather than a &lt;i&gt;Fedora guy&lt;/i&gt; as I think it&amp;#8217;s silly we have all thesse differences between distributions - just do the work upstream (swim upstream dammit &lt;img src='http://blog.fubar.dk/wp-images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&gt; ) instead of adding distro-specific non-sense unless it&amp;#8217;s absolutely necessary (things like branding, defauls etc. all fall under this). I think you know this already, so please don&amp;#8217;t tag me as a &lt;i&gt;Fedora guy&lt;/i&gt; just because I&amp;#8217;m ranting about other distributions on my personal blog space. I happen to use Fedora because it&amp;#8217;s aligned with my personal views about free software, because it&amp;#8217;s a first class distro with cutting edge features&amp;#8230; and also, of course, because I&amp;#8217;m paid to work on the software by my employer.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://www.flickr.com/photos/davidz/117087935/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/54/117087935_d785702caf.jpg" width="500" height="333" alt="_MG_1630.CR2"&gt;&lt;/a&gt;&lt;br/&gt;&lt;i&gt;introspection, bridges and people driving by&lt;/i&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;The larger problem, in my view, is really that we have some work left in building bridges between the various communities that participate in writing code for the GNU/Linux system. Heck, even inside a company like the one I work for it&amp;#8217;s sometimes difficult to coordinate features between kernel, base os and desktop teams, sometimes even more difficult that dealing with other downstreams. However with collaboration zones like &lt;a href="http://freedesktop.org"&gt;freedesktop.org&lt;/a&gt; we&amp;#8217;re slowly getting there and things do look a bit better than they did just two years ago - next up, for example, is &lt;a href="http://lists.freedesktop.org/mailman/listinfo/pm-utils"&gt;pm-utils&lt;/a&gt; so distros can &lt;a href="http://hughsient.livejournal.com/2591.html"&gt;start sharing quirks and infrastructure&lt;/a&gt; to improve the power mangement mess.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;I hope this clarifies. &lt;/p&gt;&lt;br/&gt;	&lt;p&gt;(Disclaimer: I am employed by &lt;a href="http://www.redhat.com"&gt;Red Hat&lt;/a&gt; and am paid to work on (among other things) &lt;a href="http://www.fedoraproject.org"&gt;Fedora&lt;/a&gt; but my views are strictly my own.)&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;(Oh, and I also think it&amp;#8217;s called &amp;#8220;The New Pink&amp;#8221; instead of &amp;#8220;The New Black&amp;#8221; but, uh, maybe saying that just reveals I&amp;#8217;m eligible for membership in the &lt;a href="http://www.google.com/search?hl=en&amp;#38;q=gnome+old+farts+club&amp;#38;btnG=Google+Search"&gt;GNOME old farts club&lt;/a&gt;.)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-3621893857885329853?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/3621893857885329853/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2006/11/trying-to-be-constructive.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/3621893857885329853'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/3621893857885329853'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2006/11/trying-to-be-constructive.html' title='Trying to be Constructive'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-8287073935290281014</id><published>2006-11-09T11:48:00.000-05:00</published><updated>2010-04-19T20:21:57.894-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><category scheme='http://www.blogger.com/atom/ns#' term='Rants'/><title type='text'>Software Freedom and Dealing with Resume Failures</title><content type='html'>&lt;ul&gt;&lt;br/&gt;	&lt;li&gt;Go read &lt;a href="http://kernelslacker.livejournal.com/"&gt;davej&lt;/a&gt;&amp;#8217;s thoughts on &lt;a href="http://kernelslacker.livejournal.com/62413.html"&gt;Why Fedora isn&amp;#8217;t Ubuntu&lt;/a&gt;. Required reading for people who believe in free software and thinks shipping insecure drivers is a bad idea. Choice quote: &lt;i&gt;Maybe we can get a spaceman with lots of money to pay for the subsequent legal costs too.&lt;/i&gt;&lt;br/&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt; Someone here at &lt;a href="http://www.redhat.com"&gt;Red Hat&lt;/a&gt; was unhappy about a review of early RHEL5 code where &lt;a href="http://en.wikipedia.org/wiki/Advanced_Configuration_and_Power_Interface"&gt;Suspend to RAM&lt;/a&gt; didn&amp;#8217;t work for the reviewer. Though I&amp;#8217;m of the firm opinion that the root problem should just be fixed, reality is that it won&amp;#8217;t get fixed anytime soon. So I ended up hacking up something so if suspend/hibernate fails&amp;#8230; the user is presented with this on his next login:&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://people.freedesktop.org/~david/resume-failed.png"&gt;&lt;img src="http://people.freedesktop.org/~david/resume-failed-small.png" alt="Problem resuming, buddy!" border="0" width="500" height="400" /&gt; &lt;/a&gt;&lt;br/&gt;&lt;i&gt;Problem resuming, buddy!&lt;/i&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;	&lt;/li&gt;&lt;br/&gt;	&lt;li&gt; This (somewhat useless) dialog is just the beginning; the long term upstream &lt;a href="http://lists.freedesktop.org/archives/hal/2006-November/006468.html"&gt;plan&lt;/a&gt; is to hook this up to &lt;a href="http://www.gnome.org/~bmsmith/bug-buddy3.png"&gt;Bug Buddy&lt;/a&gt;. Determining when to show this dialog is actually really difficult because the most common problem is that the system resumes just fine but the video isn&amp;#8217;t turned on. And there is no chance of detecting such a failure programmatically, hence we need to be smart about it; find patches and more information &lt;a href="http://lists.freedesktop.org/archives/hal/2006-November/006517.html"&gt;here&lt;/a&gt;. I expect this to land in Rawhide pretty soon.&lt;br/&gt;	&lt;/li&gt;&lt;br/&gt;	&lt;li&gt; Am still in RHEL5 bug fixing mode; at least there&amp;#8217;s light at the end of the tunnel so I can return to doing upstream work.&lt;br/&gt;&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-8287073935290281014?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/8287073935290281014/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2006/11/software-freedom-and-dealing-with.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/8287073935290281014'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/8287073935290281014'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2006/11/software-freedom-and-dealing-with.html' title='Software Freedom and Dealing with Resume Failures'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-603119125441748350</id><published>2006-11-04T07:49:00.000-05:00</published><updated>2010-04-19T20:21:57.888-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Politics'/><title type='text'>Can Mr. Smith Get to Washington Anymore?</title><content type='html'>&lt;p&gt;Saw &lt;a href="http://www.imdb.com/title/tt0818659/"&gt;Can Mr. Smith Get to Washington Anymore?&lt;/a&gt; at the &lt;a href="http://www.landmarktheatres.com/Market/Boston/Boston_Frameset.htm"&gt;Kendall Square Cinema&lt;/a&gt; last night (review &lt;a href="http://www.boston.com/movies/display?display=movie&amp;#38;id=9729"&gt;here&lt;/a&gt;). Movie itself was good. What was pretty awesome was that after the movie there was a Q and A session featuring &lt;a href="http://www.jeffsmith2006.com/"&gt;Jeff Smith himself&lt;/a&gt; where we could ask questions about both the movie, the grass root stuff and his current political engagement.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;If you have the chance run, don&amp;#8217;t walk, down to the cinema and see the movie.&lt;br/&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-603119125441748350?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/603119125441748350/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2006/11/can-mr-smith-get-to-washington-anymore.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/603119125441748350'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/603119125441748350'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2006/11/can-mr-smith-get-to-washington-anymore.html' title='Can Mr. Smith Get to Washington Anymore?'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-2368716893867926669</id><published>2006-10-20T14:06:00.000-04:00</published><updated>2010-04-19T20:21:57.880-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Photography'/><category scheme='http://www.blogger.com/atom/ns#' term='Travelling'/><category scheme='http://www.blogger.com/atom/ns#' term='Me Me Me'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><category scheme='http://www.blogger.com/atom/ns#' term='Rants'/><title type='text'>Random Stuff and Random Flames</title><content type='html'>&lt;p&gt;&lt;br/&gt;&lt;a href="http://www.flickr.com/photos/davidz/274869206/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/85/274869206_4de301df23.jpg" width="500" height="333" alt="Looking at myself" border="0" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;i&gt;Looking at myself or looking at you?&lt;/i&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;	&lt;ul&gt;&lt;br/&gt;	&lt;li&gt; Just booked tickets for &lt;a href="http://lca2007.linux.org.au/"&gt;LCA 2007&lt;/a&gt; in Sydney, Australia in January 2007. Am also taking some vacation to bum around .au the week following the conference. Am also planning to submit a proposal for the &lt;a href="http://live.gnome.org/Sydney2007"&gt;GNOME miniconf&lt;/a&gt;.&lt;br/&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt; Sad to see yet another &lt;a href="http://hughsient.livejournal.com/5889.html"&gt;defector&lt;/a&gt;.  Here&amp;#8217;s a &lt;a href="http://hughsient.livejournal.com/5889.html?thread=50689#t50689"&gt;very insightful&lt;/a&gt; comment from &lt;a href="http://kernelslacker.livejournal.com/"&gt;davej&lt;/a&gt; about some of the damage done to the free software community.&lt;br/&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt; Less-than-insightful &lt;a href="http://dkukawka.blogspot.com/2006/10/kpowersave-development-for-next-stable.html"&gt;rant about &amp;#8220;crappy HAL&amp;#8221;&lt;/a&gt; that frankly pisses me off.&lt;br/&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt; Spent around 3-4 days &lt;a href="http://lists.freedesktop.org/archives/hal/2006-October/006384.html"&gt;optimizing HAL&lt;/a&gt; for CPU and memory consumption, here are the &lt;a href="http://lists.freedesktop.org/archives/hal/2006-October/006421.html"&gt;difference it makes on the 770&lt;/a&gt;, courtesy of Rob Taylor&lt;br/&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt; Am almost done with a huge freakin patch for &lt;a href="http://lists.freedesktop.org/archives/dbus/2006-October/006034.html"&gt;activation on the system message bus&lt;/a&gt;. Will need to write down how this relates to some of the init replacement projects out there; here are &lt;a href="http://lists.netsplit.com/pipermail/upstart-devel/2006-October/000712.html"&gt;some thoughts&lt;/a&gt; about that for now, but it really deserves a full blog entry.&lt;br/&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt; With the D-Bus bits (system bus activation) in place, I can move forward and do some PolicyKit stuff that requires the D-Bus bits in order to be useful.&lt;br/&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt; Trying to spend lots of time on work-stuff since personal life is a bit busted at the moment.&lt;br/&gt;&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-2368716893867926669?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/2368716893867926669/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2006/10/random-stuff-and-random-flames.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/2368716893867926669'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/2368716893867926669'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2006/10/random-stuff-and-random-flames.html' title='Random Stuff and Random Flames'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-189968266947631081</id><published>2006-10-06T07:06:00.000-04:00</published><updated>2010-04-19T20:21:57.874-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Photography'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>Embedded</title><content type='html'>&lt;p&gt;&lt;br/&gt;&lt;a href="http://www.flickr.com/photos/davidz/262256153/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/113/262256153_56099a4bf0.jpg" width="500" height="333" alt="Embedded Summit at MIT's Media Lab" border="0" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;i&gt;At the Embedded summit at &lt;a href="http://media.mit.edu/"&gt;MIT Media Lab&lt;/a&gt;&lt;/i&gt;&lt;br/&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-189968266947631081?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/189968266947631081/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2006/10/embedded.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/189968266947631081'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/189968266947631081'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2006/10/embedded.html' title='Embedded'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-5954995339265834170</id><published>2006-09-11T18:44:00.000-04:00</published><updated>2010-04-19T20:21:57.869-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Photography'/><category scheme='http://www.blogger.com/atom/ns#' term='Travelling'/><category scheme='http://www.blogger.com/atom/ns#' term='Me Me Me'/><category scheme='http://www.blogger.com/atom/ns#' term='Fun'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>Drinks, Software and Gambling</title><content type='html'>&lt;table align="center" border="1" cellspacing="0" cellpadding="4" width="200px"&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td bgcolor="#ffcccc" align="center"&gt;&lt;font&gt;How to make a David Zeuthen&lt;/font&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;	&lt;tr&gt;&lt;br/&gt;&lt;td bgcolor="white"&gt;&lt;font&gt;&lt;b&gt;Ingredients:&lt;/b&gt;&lt;br/&gt;5 parts friendliness&lt;br/&gt;1 part humour&lt;br/&gt;5 parts energy&lt;/font&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;	&lt;tr&gt;&lt;br/&gt;&lt;td bgcolor="#ffffcc"&gt;&lt;font&gt;&lt;b&gt;Method:&lt;/b&gt;&lt;br /&gt;Add to a cocktail shaker and mix vigorously. Add a little fitness if desired!&lt;/font&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;/table&gt;&lt;br/&gt;	&lt;div align="center"&gt;&lt;br/&gt;&lt;br/&gt;Username:&lt;br /&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://www.go-quiz.com/cocktail/cocktail.php"&gt;Personality cocktail&lt;/a&gt;&lt;br /&gt;From &lt;a href="http://www.go-quiz.com"&gt;Go-Quiz.com&lt;/a&gt;&lt;/p&gt;&lt;br/&gt;	&lt;div align="left"&gt;&lt;br/&gt;	&lt;p&gt;In other news I just released &lt;a href="http://lists.freedesktop.org/archives/hal/2006-September/006110.html"&gt;HAL 0.5.8 &amp;#8220;The Skynet Funding Bill is passed.&amp;#8221;&lt;/a&gt;. Get it while it&amp;#8217;s hot!&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://www.flickr.com/photos/davidz/235803530/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/81/235803530_da453a9b25.jpg" width="500" height="333" alt="Luxor Hotel in Vegas"&gt;&lt;/a&gt;&lt;br/&gt;&lt;i&gt;Only in Vegas!&lt;br/&gt;&lt;/i&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;The &lt;a href="http://fuzzyfish.tripod.com/blog/"&gt;girl&lt;/a&gt; and I went to Vegas over the Labour day weekend. I&amp;#8217;ve uploaded some photos &lt;a href="http://flickr.com/photos/davidz/sets/72157594280347200/"&gt;here&lt;/a&gt;. I was lucky at the roulette table too (put some $15 at my age, yeay!), got home with $700 more in the pocket.&lt;/p&gt;&lt;br/&gt;	&lt;/div&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-5954995339265834170?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/5954995339265834170/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2006/09/drinks-software-and-gambling.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/5954995339265834170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/5954995339265834170'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2006/09/drinks-software-and-gambling.html' title='Drinks, Software and Gambling'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-4612107599203548724</id><published>2006-07-26T11:56:00.000-04:00</published><updated>2010-04-19T20:21:57.862-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Photography'/><category scheme='http://www.blogger.com/atom/ns#' term='Me Me Me'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>Sweet Irony</title><content type='html'>&lt;p&gt;I&amp;#8217;ve just released &lt;a href="http://lists.freedesktop.org/archives/hal/2006-July/005689.html"&gt;HAL 0.5.7.1 &amp;#8220;Unmaintained piece of crap&amp;#8221;&lt;/a&gt; and all vendors should upgrade as Linux kernels later than 2.6.17 will break HAL 0.5.7 (e.g. HAL will break in hardware detection, not the kernel). It should be a smooth upgrade and credit goes to &lt;a href="http://vrfy.org"&gt;Kay Sievers&lt;/a&gt; for the patches.  &lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://www.flickr.com/photos/davidz/168187814/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/67/168187814_42d7f0d625.jpg" width="500" height="333" alt="Reflection" border="0" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;i&gt;Introspection&lt;/i&gt;&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Just a few hours after my &lt;a href="http://blog.fubar.dk/?p=72"&gt;last entry&lt;/a&gt;, Jonathan Corbet of &lt;a href="http://lwn.net/"&gt;LWN&lt;/a&gt; found me at OLS and said it wasn&amp;#8217;t LWN badmouthing HAL, he was just reporting what was going on at the kernel summit. So, sorry if I made it sound like it was LWN&amp;#8217;s fault, it wasn&amp;#8217;t, I do believe in free press and LWN is just an awesome resource. Oh, I just find the whole &amp;#8220;unmaintained piece of crap&amp;#8221; thing slightly amusing (hence the release name for 0.5.7.1) - the community around HAL is alive and well even though I&amp;#8217;m not presently around doing HAL stuff as much as I like.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-4612107599203548724?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/4612107599203548724/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2006/07/sweet-irony.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/4612107599203548724'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/4612107599203548724'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2006/07/sweet-irony.html' title='Sweet Irony'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-3108884914445146070</id><published>2006-07-20T09:48:00.000-04:00</published><updated>2010-04-19T20:21:57.855-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Photography'/><category scheme='http://www.blogger.com/atom/ns#' term='Travelling'/><category scheme='http://www.blogger.com/atom/ns#' term='Me Me Me'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>Linux Symposium</title><content type='html'>&lt;p&gt;I appear to be in Ontario, Canada. More specifically I&amp;#8217;m in Ottawa though hours last night was spent at a bar in Quebec. &lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://www.flickr.com/photos/davidz/194088905/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/68/194088905_b4dea31341.jpg" width="500" height="333" alt="In Logan's terminal 3" border="0" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;i&gt;In Logan&amp;#8217;s terminal 3 enroute to &lt;a href="http://www.linuxsymposium.org/"&gt;OLS&lt;/a&gt;&lt;/i&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Yesterday, &lt;a href="http://www.vrfy.org/"&gt;Kay&lt;/a&gt; and I gave a talk on &lt;a href="http://www.linuxsymposium.org/2006/view_abstract.php?content_key=121"&gt;Dynamic Device Handling on the Modern Desktop&lt;/a&gt; and I think it was well received. Yeay!&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Oh, and I&amp;#8217;ve even got to say that hal-device-manager (the small python GTK+ app for viewing the hal device objects and their properties) was an &amp;#8220;unmaintained piece of crap&amp;#8221; alluding in a funny way to the recent &lt;a href="http://lwn.net/"&gt;LWN&lt;/a&gt; article badmouthing HAL. Some people in the audience laughed. Lots of excellent questions too. Good times.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;I&amp;#8217;ve uploaded the slides from mine and Kay&amp;#8217;s talk &lt;a href="http://people.freedesktop.org/~david/talks/dynamic-device-handling-OLS-2006.pdf"&gt;here&lt;/a&gt;. Enjoy.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-3108884914445146070?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/3108884914445146070/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2006/07/linux-symposium.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/3108884914445146070'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/3108884914445146070'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2006/07/linux-symposium.html' title='Linux Symposium'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-1105455745668097383</id><published>2006-07-13T08:59:00.000-04:00</published><updated>2010-04-19T20:21:57.847-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Photography'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>PulseAudio and GNOME</title><content type='html'>&lt;p&gt;Talked briefly to &lt;a href="http://www.advogato.org/person/xiphmont/"&gt;Monty&lt;/a&gt; yesterday about &lt;a href="http://pulseaudio.org/"&gt;PulseAudio&lt;/a&gt; and how it would fit into GNOME. Here are some notes, I may be way off, but I thought it would be good to blog them anyway.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://www.flickr.com/photos/davidz/180714986/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/71/180714986_52cc11e0e0.jpg" width="500" height="333" alt="Monty!"&gt;&lt;/a&gt;&lt;br/&gt;&lt;i&gt;Monty making an elaborate point about mixing stuff&lt;/i&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;	&lt;ul&gt;&lt;br/&gt;	&lt;li&gt; &lt;b&gt;Multiple Soundcard Configuration:&lt;/b&gt; The gstreamer sink for PulseAudio should use the same gconf settings as for the gstreamer-hal-gconf sink as discussed &lt;a href="http://bugzilla.gnome.org/show_bug.cgi?id=329112"&gt;here&lt;/a&gt;. Then we would be able to reuse the same &lt;a href="http://bugzilla.gnome.org/attachment.cgi?id=58344&amp;#38;action=view"&gt;dialog&lt;/a&gt; which would be nice. I have no idea whether this is feasible, desirable or possible in the context of PulseAudio.. But I thought I&amp;#8217;d mentioned it anyway, it makes sense to me and&amp;#8230; IIRC, a number of applications such as &lt;a href="http://gnome.org/projects/totem"&gt;Totem&lt;/a&gt; and &lt;a href="http://ekiga.org/"&gt;Ekiga&lt;/a&gt; is moving to selecting outputs (using gstreamer) based on whether they output &amp;#8220;Sound Events&amp;#8221;, &amp;#8220;Music or Movies&amp;#8221; or &amp;#8220;Audio/Video conferencing&amp;#8221;.&lt;br/&gt;	&lt;p&gt;&lt;li&gt; &lt;b&gt;Power Savings:&lt;/b&gt; To be honest, I&amp;#8217;m not sure whether PulseAudio runs as a system daemon or in the desktop session or whether it&amp;#8217;s configurable (sorry, haven&amp;#8217;t done my homework). But surely, to me, it needs to run in the desktop session. It should talk to &lt;a href="http://www.gnome.org/projects/gnome-power-manager/"&gt;gnome-power-manager&lt;/a&gt;, via D-BUS, and keep track of whether the user &amp;#8220;prefers power savings over performance&amp;#8221; (yes, this is a &lt;a href="http://people.freedesktop.org/~david/g-p-m-prefer-power-savings.png"&gt;user preference&lt;/a&gt; which defaults to on when running on battery and off when on AC).&lt;br/&gt;So if &amp;#8220;prefers power savings over performance&amp;#8221; is enabled as a desktop session wide setting (or if it changes state - it&amp;#8217;s a live variable so need to listen to D-BUS signals from g-p-m), PulseAudio should close the file descriptor to files in /dev/audio when there is silence so the kernel drivers can put the sound card(s) to sleep. Not only that, if the sound card is used only for output it should open with O_RDONLY so parts of the sound card can be powered down. Specifically for projects such as &lt;a href="http://laptop.org"&gt;OLPC&lt;/a&gt; this is important and &lt;a href="http://highlycomposite2.blogspot.com/"&gt;Jaya Kumar&lt;/a&gt; already done the &lt;a href="http://highlycomposite2.blogspot.com/2006/06/aggressive-power-management-for-ac97.html"&gt;kernel side&lt;/a&gt; of this.&lt;br/&gt;Sure, when the sound card is turned on again there is a slight pop, but users for which this is the end of the world&amp;#8230; they can tweak the setting in g-p-m or perhaps use a specific PulseAudio setting to override. But by default, PulseAudio should ask g-p-m so we can suspend sound cards on battery when not used. It&amp;#8217;s about saving energy.. think of the kids, &lt;a&gt;Der Grüne Punkt,  &lt;a href="http://www.energystar.gov/"&gt;EnergyStar&lt;/a&gt; and all that! &lt;img src='http://blog.fubar.dk/wp-images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&gt;&lt;br/&gt;&lt;/li&gt;&lt;br/&gt;&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;br/&gt;	&lt;p&gt;In other news, &lt;a href="http://fuzzyfish.tripod.com/blog/"&gt;Mitra&lt;/a&gt; got a Macbook and she seems thrilled about it so far. Also, I didn&amp;#8217;t know that Mitra&amp;#8217;s &lt;a href="http://fuzzyfish.tripod.com/blog/index.blog?entry_id=1519604"&gt;mom have been in outer space&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-1105455745668097383?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/1105455745668097383/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2006/07/pulseaudio-and-gnome.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/1105455745668097383'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/1105455745668097383'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2006/07/pulseaudio-and-gnome.html' title='PulseAudio and GNOME'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-1161020655462984132</id><published>2006-07-06T12:46:00.000-04:00</published><updated>2010-04-19T20:21:57.840-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Photography'/><category scheme='http://www.blogger.com/atom/ns#' term='Travelling'/><category scheme='http://www.blogger.com/atom/ns#' term='Me Me Me'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>GUADEC recap</title><content type='html'>&lt;p&gt;Got back from &lt;a href="http://guadec.org"&gt;GUADEC&lt;/a&gt; and Spain on Sunday. Nice conference; I liked the touch with seven days instead of three even though it was a bit exhausting in the end. I&amp;#8217;ve also got sick around Saturday so spent that day in bed in my hotel room before traveling back Sunday. As a result of all this, I&amp;#8217;m way behind on mail so to those who I owe a reply, hang in there, I&amp;#8217;ll get back to you eventually.  &lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://www.flickr.com/photos/davidz/180713866/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/62/180713866_dcaad8388a.jpg" width="500" height="333" border="0" alt="Robert and Joey in what could be a movie poster" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;p&gt;&lt;br/&gt;&lt;i&gt;&lt;a href="http://rlove.org/"&gt;Robert&lt;/a&gt; and &lt;a href="http://joeshaw.org/"&gt;Joey&lt;/a&gt; as batshit insane movie stars? &lt;/i&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;I&amp;#8217;ve now uploaded the slides from my talk (&lt;a href="http://people.freedesktop.org/~david/talks/system-integration-and-gnome-guadec2006-davidz.odp"&gt;ODP&lt;/a&gt;, &lt;a href="http://people.freedesktop.org/~david/talks/system-integration-and-gnome-guadec2006-davidz.pdf"&gt;PDF&lt;/a&gt;).&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://www.flickr.com/photos/davidz/180702643/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/56/180702643_dfe84ecc23.jpg" width="500" height="333" border="0" alt="Bummed out" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;i&gt;Taking a break from the action at the &lt;a href="http://www.fluendo.com/"&gt;Fluendo&lt;/a&gt; party&lt;/i&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;I enjoyed the 4th of July fireworks from my balcony in Somerville, MA overlooking Boston&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://www.flickr.com/photos/davidz/182738711/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/60/182738711_d4a67dd0cb.jpg" width="500" height="333" border="0" alt="Zeppelin?" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;i&gt;Zeppelin just after dropping it&amp;#8217;s payload on Boston, MA?&lt;/i&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;All my GUADEC pictures are available &lt;a href="http://flickr.com/photos/davidz/sets/72157594186094257/"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-1161020655462984132?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/1161020655462984132/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2006/07/guadec-recap.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/1161020655462984132'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/1161020655462984132'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2006/07/guadec-recap.html' title='GUADEC recap'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-5220697512941257173</id><published>2006-06-26T04:27:00.000-04:00</published><updated>2010-04-19T20:21:57.833-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Photography'/><category scheme='http://www.blogger.com/atom/ns#' term='Me Me Me'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>At GUADEC</title><content type='html'>&lt;p&gt;Made it to Spain on Friday, surprisingly Delta brought me there at 7:45am as scheduled. Spent Friday walking around Barcelona with &lt;a href="http://vrfy.org/log/"&gt;Kay&lt;/a&gt; and his girlfriend. Nice but a bit exhausting given we were out until 8pm. Made it to Vilanova late Friday night and, hours later, was surrounded by nice people and cold beer. Good times. Fell asleep around 1-2am.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;I can&amp;#8217;t believe noone else at GUADEC blogged about this guy at the registration desk:&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://www.flickr.com/photos/davidz/175381283/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/53/175381283_b56f42bdf1.jpg" width="500" height="333" border="0" alt="GUADEC registration desk" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;p&gt;&lt;br/&gt;&lt;i&gt;&amp;#8220;Pick me up&amp;#8221;&lt;/i&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;I haven&amp;#8217;t blogged for quite some time, should get back in the game. Despite that lots of things have happened in work, HAL, PolicyKit and also RL that I will need to report at some time. Now to get some lunch and see some talks!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-5220697512941257173?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/5220697512941257173/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2006/06/at-guadec.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/5220697512941257173'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/5220697512941257173'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2006/06/at-guadec.html' title='At GUADEC'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-4155852470526227271</id><published>2006-04-02T22:10:00.000-04:00</published><updated>2010-04-19T20:21:57.826-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Photography'/><category scheme='http://www.blogger.com/atom/ns#' term='Curling'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><category scheme='http://www.blogger.com/atom/ns#' term='Rants'/><title type='text'>System Configuration</title><content type='html'>&lt;p&gt;So once again the topic of system configuration and &lt;a href="http://www.libelektra.org/Main_Page"&gt;Elektra&lt;/a&gt; (aka LinuxRegistry) has come up on &lt;a href="https://www.redhat.com/mailman/listinfo/fedora-devel-list"&gt;fedora-devel-list&lt;/a&gt; and since I know most people even on the list don&amp;#8217;t keep up because of the sheer volume, I&amp;#8217;m going to use my blog to link to &lt;a href="https://www.redhat.com/archives/fedora-devel-list/2006-April/msg00120.html"&gt;my response&lt;/a&gt;.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://www.flickr.com/photos/davidz/122335814/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/42/122335814_ec862dd167.jpg" width="500" height="333" alt="WCC2006-20060401-032" border="0" /&gt;&lt;/a&gt; &lt;br/&gt;&lt;i&gt;Denmark vs. Japan at &lt;a href="http://www.wcc2006.org"&gt;WCC 2006&lt;/a&gt; - EOS 20D and 70-200mm f/2.8 lens @ ISO  400&lt;/i&gt; &lt;br/&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;It shouldn&amp;#8217;t be a surprise to people knowing me that I consider myself a UNIX hater. In fact, this whole thread on f-d-l made me realize that the with regards to system configuration you really only want two things: session-wide and site-wide configuration. Maybe it&amp;#8217;s time to open a &lt;a href="http://www.cafepress.com/"&gt;CafePress&lt;/a&gt; store and pimp shirts and stickers with the mottos a&amp;#8217;la &lt;tt&gt;# rm -rf /etc&lt;/tt&gt;. Seriously.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Received my &lt;a href="http://www.apple.com/macbookpro/"&gt;MacBook Pro&lt;/a&gt; last week and I&amp;#8217;m psyched. Now to get &lt;a href="http://fedoraproject.org/wiki/"&gt;Fedora&lt;/a&gt; installed &lt;img src='http://blog.fubar.dk/wp-images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&gt; .&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-4155852470526227271?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/4155852470526227271/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2006/04/system-configuration.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/4155852470526227271'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/4155852470526227271'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2006/04/system-configuration.html' title='System Configuration'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-1286217080159807193</id><published>2006-03-07T22:50:00.000-05:00</published><updated>2010-04-19T20:21:57.817-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Photography'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><category scheme='http://www.blogger.com/atom/ns#' term='Rants'/><title type='text'>System-wide Lockdown and Usability</title><content type='html'>&lt;p&gt;I wrote &lt;a href="http://blog.fubar.dk/?p=63"&gt;some time ago&lt;/a&gt; about how most modern Linux distributions deals with with granting unprivileged users additional privileges when they are logged in at the console. Stuff like allowing them to access removable disks, power down the system and so forth - &lt;a href="http://wiki.linuxquestions.org/wiki/Project_Utopia"&gt;Project Utopia&lt;/a&gt; stuff, that whole story.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;While this is great for the home user, stuff &lt;em&gt;Just Works&lt;/em&gt;, it&amp;#8217;s not always ideal in more controlled environments such as call centers, university settings, Internet Cafes or print kiosks. Also, working for a &lt;a href="http://www.redhat.com"&gt;distributor&lt;/a&gt; I&amp;#8217;m also sometimes personally on the receiving end of &lt;a href="https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=177177#c7"&gt;rude&lt;/a&gt; people who wants this too. I don&amp;#8217;t disagree much really. Yes, it makes sense to easily lock down what the operating system allows a user in front of it to do. Even to the point where it is totally unusable. Notably this is required for &lt;a href="http://en.wikipedia.org/wiki/Evaluation_Assurance_Level"&gt;EAL&lt;/a&gt; style certifications of systems. Yes, &lt;a href="http://en.wikipedia.org/wiki/Sarbanes-Oxley"&gt;Sarbanes-Oxley&lt;/a&gt; requires it too, and yes, &lt;a href="http://www.pbs.org/cringely/pulpit/pulpit20040916.html"&gt;some companies&lt;/a&gt; (search for the word &amp;#8216;epoxy&amp;#8217; in that link) disable the USB ports of their employees computers.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://www.flickr.com/photos/davidz/77348161/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/42/77348161_b9bbd1328c.jpg" border="0" width="500" height="333" alt="Boat on reflecting water" /&gt;&lt;/a&gt; &lt;br/&gt;&lt;i&gt;Copenhagen, Denmark - December 2005&lt;/i&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;I wrote some notes about how to &lt;a href="http://lists.freedesktop.org/archives/hal/2006-January/004377.html"&gt;fix this&lt;/a&gt; in what I consider a sane way. Sane here includes allowing a system administrator or home user to override this in a way that just works, e.g. pop up a dialog asking for auth to gain privileges to carry out the operation. Mocking around with configuration files in &lt;code&gt;/etc&lt;/code&gt; does not qualify - &lt;em&gt;do not pass start, do not collect $200&lt;/em&gt; - put up a GUI dialog instead; it&amp;#8217;s 2006 for crying out loud &lt;img src='http://blog.fubar.dk/wp-images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&gt; &lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Anyho, so I did this policy library and started to &lt;a href="http://freedesktop.org/~david/perm-override/gnome-mount-perm-override-1.png"&gt;integrate&lt;/a&gt; &lt;a href="http://freedesktop.org/~david/perm-override/gnome-mount-perm-override-2.png"&gt;it&lt;/a&gt; with gnome-mount. Sure, this example is kinda lame and the UI is still totally wrong. But it illustrates the point well. The sysadmin didn&amp;#8217;t allow the user to override file system permissions on an advanced file system and we give the user the ability to correct it - there are lots of more interesting use-cases than this. And we need do need lockdown, otherwise all the &lt;a href="https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=177177#c19"&gt;Michal Jaegermann and Alan Cox&amp;#8217;s&lt;/a&gt; of the world won&amp;#8217;t let us put it in a general purpose operating system. Which is fair enough. Oh, before someone cries &lt;em&gt;the root password is evil&lt;/em&gt;; whether we ask for the super user password, users own password or something different for auth should just be up to the OS vendor. It&amp;#8217;s a boring implementation detail. It&amp;#8217;s also fine by me to have a gconf key to hide these dialogs; that might be sometime a sysadmin in an enterprise setting would do. I think &lt;a href="http://www.gnome.org/~clarkbw/blog/"&gt;Clark&lt;/a&gt; even suggested once to put a button &amp;#8220;Send request to sysadmin to enable feature&amp;#8221; too. Whatever &lt;img src='http://blog.fubar.dk/wp-images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&gt; &lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://www.flickr.com/photos/davidz/83372130/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/36/83372130_268c868c4b.jpg" width="500" height="333" border="0" alt="Eiffel Portal" /&gt;&lt;/a&gt; &lt;br/&gt;&lt;i&gt;Paris, France - January 2006&lt;/i&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Whilst implementing this I researched &lt;a href="http://members.chello.nl/~h.lai/libgnomesu/"&gt;various&lt;/a&gt; &lt;a href="http://www.nongnu.org/gksu/"&gt;graphical&lt;/a&gt; su helpers including &lt;a href="http://linuxcommand.org/man_pages/consolehelper8.html"&gt;consolehelper / usermode&lt;/a&gt; that we ship in Fedora. They all suffer from the &lt;a href="http://lists.freedesktop.org/archives/hal/2006-March/004770.html"&gt;same set of problems&lt;/a&gt; most notably that they allow to run X applications as root. So, I guess for &lt;a href="http://freedesktop.org/wiki/Software_2fhal"&gt;HAL&lt;/a&gt; I&amp;#8217;ll be rolling my own just like everyone else &lt;img src='http://blog.fubar.dk/wp-images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&gt; . Read on please.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;No, seriously, I strongly believe the idea of even allowing X applications to run as root is a dead end from day one. With the su helper I plan for PolicyKit (which is a project I&amp;#8217;ve spun off HAL containing said policy bits), your application will at most be elevated to an unprivileged &amp;#8220;system user&amp;#8221;. The trick here is that HAL allows this unprivileged user to invoke D-BUS methods normal unprivileged console users wouldn&amp;#8217;t be allowed to invoke. To get to this &amp;#8220;system user&amp;#8221;, the desktop user will have to auth (root password, own password, whatever) and will thus be presented with a &lt;a href="http://freedesktop.org/~david/perm-override/gnome-mount-perm-override-2.png"&gt;dialog&lt;/a&gt;  even (optionally) offering the one-time-pain option by granting this privilege to the desktop and/or other users forever (or until the sysadmin changes it).&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://www.flickr.com/photos/davidz/72583751/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/34/72583751_8384e393ca.jpg" width="333" height="500" border="0" alt="Looks like a wall of gold" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;i&gt; Boston, MA - December 2005 &lt;/i&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;The reason I&amp;#8217;m spinning it off HAL is that it makes sense for the rest of the desktop bits (not only GNOME) to adopt the same architectural pattern; for example gnome-system-monitor could use this to renice processes.. g-s-m will simply provide a service on the system bus that runs as root and exports a method called Renice(). A PolicyKit policy file provides a list of &lt;code&gt;uid&lt;/code&gt; and &lt;code&gt;gid&lt;/code&gt; for who is allowed for this. Now, g-s-m will try to invoke Renice() but might get the &lt;code&gt;PermissionDeniedByPolicy&lt;/code&gt; exception back. If this is the case, simply bring up said dialog, enter password, optionally grant this privilege to one or more users and, bingo, you&amp;#8217;re done.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;I plan to provide a PolicyKit-gnome library for these &lt;a href="http://lists.freedesktop.org/archives/hal/2006-January/004377.html"&gt;dialogs&lt;/a&gt;, e.g. password prompting and policy editing. Mostly because this is what I need for the HAL (and Fedora I guess), but I think it makes sense for GNOME too to consider this architectural pattern.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Yea yea, long boring blog post about admin stuff and it&amp;#8217;s not even about &lt;a href="http://www.0xdeadbeef.com/weblog/?p=181"&gt;cool bling stuff!&lt;/a&gt;. I hope at least that the admins love me &lt;img src='http://blog.fubar.dk/wp-images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&gt;&lt;br/&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-1286217080159807193?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/1286217080159807193/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2006/03/system-wide-lockdown-and-usability.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/1286217080159807193'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/1286217080159807193'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2006/03/system-wide-lockdown-and-usability.html' title='System-wide Lockdown and Usability'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-1627674595438802016</id><published>2006-02-28T22:19:00.000-05:00</published><updated>2010-04-19T20:21:57.810-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>Secretary plugged hairdryer into UPS</title><content type='html'>&lt;p&gt;Yay! My &lt;a href="http://blog.fubar.dk/?p=64"&gt;LUKS integration bits&lt;/a&gt; landed in Rawhide and will be in Fedora Core 5. In other news, the latest &lt;a href="http://www.gnome.org/projects/gnome-power-manager/"&gt;gnome-power-manager&lt;/a&gt; in Rawhide works really nicely with non-portable batteries e.g. &lt;a href="http://en.wikipedia.org/wiki/Uninterruptible_power_supply"&gt;Uninterruptible Power Supplies&lt;/a&gt; that supports the USB HID protocol.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;img border="0"&gt;&lt;br/&gt;&lt;em&gt;New and l33t &lt;a href="http://bugzilla.gnome.org/show_bug.cgi?id=331117"&gt;icons&lt;/a&gt;&lt;/em&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Richard been kicking ass on gnome-power-manager recently - note how he even &lt;a href="http://bugzilla.gnome.org/show_bug.cgi?id=329027"&gt;fixed&lt;/a&gt; my somehow pedantic requests to even make this work when hotplugging the UPS.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-1627674595438802016?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/1627674595438802016/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2006/02/secretary-plugged-hairdryer-into-ups.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/1627674595438802016'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/1627674595438802016'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2006/02/secretary-plugged-hairdryer-into-ups.html' title='Secretary plugged hairdryer into UPS'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-4452464309548171986</id><published>2006-02-21T13:33:00.000-05:00</published><updated>2010-04-19T20:21:57.802-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><category scheme='http://www.blogger.com/atom/ns#' term='Politics'/><title type='text'>There is no security on this earth, there is only opportunity</title><content type='html'>&lt;p&gt;I&amp;#8217;ve been hacking on and off with &lt;a href="http://www.flyn.org/index.html"&gt;W. Michael Petullo&lt;/a&gt; on integrating &lt;a href="http://luks.endorphin.org/"&gt;LUKS&lt;/a&gt; into the &lt;a href="http://www.gnome.org"&gt;GNOME desktop&lt;/a&gt; via &lt;a href="http://freedesktop.org/wiki/Software_2fhal"&gt;HAL&lt;/a&gt; and patches are now upstream.. I think it rocks. I&amp;#8217;ve prepared a small screencast:&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://freedesktop.org/~david/crypto/"&gt;&lt;img border="0" src="http://freedesktop.org/~david/gnome-luks-integration-thumb.png" width="500" height="375"&gt;&lt;/a&gt;&lt;br/&gt;&lt;em&gt;Screencast of LUKS integration into GNOME&lt;/em&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Hopefully we can get these bits into FC5; the &lt;a href="http://mail.gnome.org/archives/utopia-list/2006-February/msg00005.html"&gt;patches&lt;/a&gt; &lt;a href="http://mail.gnome.org/archives/utopia-list/2006-February/msg00008.html"&gt;themselves&lt;/a&gt; are pretty simple but you also need HAL and gnome-mount from CVS. I&amp;#8217;ll do releases of the latter two later this week.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;We still need some UI for setting up volumes; this should probably be integrated with gfloppy or maybe an entirely new UI for partitioning and formatting media. Fortunately, however, someone is already working on &lt;a href="http://lists.freedesktop.org/archives/hal/2006-January/004281.html"&gt;this&lt;/a&gt; but to do this securely we need to formalize privileges in HAL and I think there is consensus about &lt;a href="http://lists.freedesktop.org/archives/hal/2006-January/004377.html"&gt;how we want to do that&lt;/a&gt;.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;In other news, &lt;a href="http://news.yahoo.com/s/ap/20060216/ap_on_re_mi_ea/iran_danish_pastries"&gt;danish are renamed&lt;/a&gt; in Iran. Some times, the world is so silly that it&amp;#8217;s sad.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-4452464309548171986?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/4452464309548171986/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2006/02/there-is-no-security-on-this-earth.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/4452464309548171986'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/4452464309548171986'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2006/02/there-is-no-security-on-this-earth.html' title='There is no security on this earth, there is only opportunity'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-8992044582177714413</id><published>2006-01-09T21:10:00.000-05:00</published><updated>2010-04-19T20:21:57.792-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Photography'/><category scheme='http://www.blogger.com/atom/ns#' term='Travelling'/><category scheme='http://www.blogger.com/atom/ns#' term='Me Me Me'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>New year and Policy Daemons</title><content type='html'>&lt;h3&gt;&lt;strong&gt;New Year, Same Old&lt;/strong&gt;&lt;/h3&gt;&lt;br/&gt;	&lt;p&gt;It&amp;#8217;s a new year and I returned late last week from Europe - nice with relaxation but maybe a bit too much travelling&amp;#8230; Anyway, &lt;a href="http://flickr.com/photos/davidz/sets/1798584/"&gt; pictures&lt;/a&gt; speak much more than a thousand words, or something, so nuff&amp;#8217; said. I&amp;#8217;m not sure I like 2006 yet, maybe things will change.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://www.flickr.com/photos/davidz/77328410/" title="Photo Sharing"&gt;&lt;img border="0" src="http://static.flickr.com/40/77328410_9b4f9491a1.jpg" width="500" height="333" alt="From lunch of the day of christmas eve" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;em&gt;Danish food&lt;/em&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;For new years I went to Hamburg, Germany to visit my good friend &lt;a href="http://vrfy.org/log/"&gt;Kay Sievers&lt;/a&gt; - awesome to see Kay again. With Kay working for &lt;a href="http://www.novell.com/"&gt;Novell&lt;/a&gt; and me working for &lt;a href="http://www.redhat.com/"&gt;Red Hat&lt;/a&gt; we talked a lot about the current state of our various distributions and how we can work closer together in the trenches. Specifically we discussed how to manage policy enforcing daemons and below are some of my thoughts on that.&lt;/p&gt;&lt;br/&gt;	&lt;h3&gt;&lt;strong&gt;On Enforcing Policy&lt;/strong&gt;&lt;/h3&gt;&lt;br/&gt;	&lt;p&gt;&lt;strong&gt;Background&lt;/strong&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Starting with Fedora Core 1, Red Hat started shipping the system-wide bus (&lt;a href="http://www.freedesktop.org/Software/dbus"&gt;D-BUS&lt;/a&gt;) in Fedora Core, but it wasn&amp;#8217;t until Fedora Core 3 with the advent of &lt;a href="http://www.freedesktop.org/Software/hal"&gt;HAL&lt;/a&gt; and &lt;a href="http://www.gnome.org/projects/NetworkManager/"&gt;NetworkManager&lt;/a&gt; that the bus started to see extensive use.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Today, in what will become Fedora Core 5, unpriviliged applications running in a desktop session on the console can invoke methods for putting the system to sleep, configure display brightness on laptops, configure networking and mounting storage devices. With time, more and more methods will be available for configuring the hardware and/or system. All such method invocation happens in a secure way through the (unprivileged) system bus daemon that checks, validates and passes messages between the sender and receiver. Additional lock-down via e.g. &lt;a href="http://www.nsa.gov/selinux/"&gt;SELinux&lt;/a&gt; security contexts are possible too but I&amp;#8217;ve yet not seen anything use it.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;strong&gt;Configuration&lt;/strong&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Back in the day, &lt;a href="http://www.faqs.org/docs/artu/"&gt;the traditional UNIX way&lt;/a&gt; for system-wide daemons prescribed using a textual configuration file somewhere in &lt;code&gt;/etc&lt;/code&gt; - &lt;a href="http://acpid.sourceforge.net/"&gt;acpid&lt;/a&gt; and networking scripts comes to mind. With this, users had to resort to using a text editor and learn about the configuration file format; very educating and &lt;em&gt;l33t&lt;/em&gt; for the geek hacker, but not ideal for ordinary users; not ideal for grandma. When available, UI tools simply rewrote the configuration file which most people agree is error prone and just plain wrong.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Allowing applications in the desktop session to enforce policy makes a lot of sense from a configuration point of view. Today, in the development tree of Fedora we now ship &lt;a href="http://www.gnome.org/projects/gnome-power-manager/"&gt;gnome-power-manager&lt;/a&gt;. Settings are read from &lt;a href="http://www.gnome.org/projects/gconf/"&gt;gconf&lt;/a&gt; at &lt;code&gt;/apps/gnome-power-manager&lt;/code&gt;. We have a nice, not horrible at least, user interface (Desktop -&amp;gt; Preferences -&amp;gt; Power Management) for configuring the policy. It is per-user, and since it uses gconf it&amp;#8217;s possible to configure both default and mandatory settings (for lock-down), these days this can even nicely be achieved with e.g. &lt;a href="http://www.gnome.org/projects/sabayon/"&gt;Sabayon&lt;/a&gt;. In almost every way possible way it&amp;#8217;s superior to textual configuration files. &lt;a href="http://www.martianrock.com/"&gt;John&lt;/a&gt; has &lt;a href="http://www.martianrock.com/?p=185"&gt;some good stuff&lt;/a&gt; about gconf here.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Also, gnome-power-manager sports a notification icon along with a menu for performing actions such as putting the system to sleep or hibernation. These days, when the kernel is in a good mood, power management just works. It&amp;#8217;s like using my Mac.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;However, there are two obvious downsides to running policy enforcing daemons in the desktop session, namely&lt;/p&gt;&lt;br/&gt;	&lt;ol&gt;&lt;br/&gt;	&lt;li&gt;&lt;br/&gt;when no user is logged in, no copy of gnome-power-manager is ever running; hence no policy is maintained; hence your laptop won&amp;#8217;t suspend after e.g. 15 minutes of inactivity when at the login screen.&lt;br/&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;&lt;br/&gt;when multiple users are logged in (either via &lt;a href="http://ignore-your.tv/fusa/"&gt;fast-user-switching&lt;/a&gt; or via multiple physical consoles) multiple copies of gnome-power-manager are running. This is bad as e.g. inactivity on one console might trigger e.g. a system suspend.&lt;br/&gt;&lt;/li&gt;&lt;br/&gt;	&lt;/ol&gt;&lt;br/&gt;	&lt;p&gt;Exactly the same problems apply for the screen saver (&lt;a href="http://live.gnome.org/GnomeScreensaver"&gt;gnome-screen-saver&lt;/a&gt;), networking (nm-applet), storage management (gnome-volume-manager) and probably other things too. Wonder why there is no screen saver on the login screen? Wonder why your wireless network isn&amp;#8217;t configured before login? That&amp;#8217;s why.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://www.flickr.com/photos/davidz/77346850/" title="Photo Sharing"&gt;&lt;img border="0" src="http://static.flickr.com/43/77346850_95db2b90d8.jpg" width="500" height="333" alt="Opera house and the Canal" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;em&gt;The Opera House in Copenhagen, Denmark&lt;/em&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;strong&gt;A framework&lt;/strong&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;To solve problems 1) and 2) above we first need some infrastructure for tracking what sessions are at the consoles attached to the system. Remember that several users can be logged in at the same console through fast user switching (even multiple sessions from the same user on one console) so we need a notion of who and what is active at each console.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;The proposal is a simple D-BUS service on the system bus; in quick and dirty pseudo code it would look like this&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;code&gt;&lt;br/&gt; service org.freedesktop.DBus.ConsoleTracker {&lt;br/&gt; methods:&lt;br/&gt;     array{tupple{string sessionId,int console, bool isActive}} GetSessions();&lt;br/&gt;     int GetNumberOfConsoles();&lt;br/&gt;     int GetUnixUidFromSessionID(string sessionId);&lt;br/&gt; signals:&lt;br/&gt;     SessionBegin(string sessionId, int console);&lt;br/&gt;     SessionEnd(string sessionId, int console);&lt;br/&gt;     SessionActivityChanged(string sessionId, int console, bool isActive);&lt;br/&gt;     NumberOfConsolesChanged(int numConsoles);&lt;br/&gt; }&lt;br/&gt;&lt;/code&gt;&lt;br/&gt;The &lt;code&gt;sessionId&lt;/code&gt; is simply a unique identifier maintained by the &lt;code&gt;ConsoleTracker&lt;/code&gt; service - most likely this is the X11 display number though &lt;code&gt;ConsoleTracker&lt;/code&gt; shouldn&amp;#8217;t rely on a certain windowing system. The &lt;code&gt;isActive&lt;/code&gt; boolean denotes where the session is currently visible on the console. Along the way the &lt;code&gt;ConsoleTracker&lt;/code&gt; service may also provide methods such as &lt;code&gt;GetSessionBusAddress(string sessionId)&lt;/code&gt;, it might provide properties to tell what kind of session is running (GNOME, KDE, &amp;#8230;) but that is beyond the scope of this write-up.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;A service like this (I&amp;#8217;m sure the choice of names and methods / signals can be much improved) simply tracks sessions and, as such users logging in and out. Ideally this service is shipped with the D-BUS tarball and ideally we&amp;#8217;d make the system bus dependent on this service insofar that we can introduce policy directives such as &amp;#8220;at_active_console&amp;#8221; etc. in addition to the &amp;#8220;at_console&amp;#8221; directive we already have. &lt;/p&gt;&lt;br/&gt;	&lt;p&gt;The &lt;code&gt;ConsoleTracker&lt;/code&gt; service should also be possible to implement without &lt;code&gt;pam_console&lt;/code&gt; which means that we can get rid of the optional pam_console dependency in D-BUS. This also means that e.g. HAL and NetworkManager can ship D-BUS configuration files with &amp;#8220;at_console&amp;#8221; without the Debian people having to patch things out and only users logged in at the console may invoke methods like e.g. &lt;code&gt;Suspend()&lt;/code&gt; to put the system to sleep. Of course, the Debian people may still change the policy because they think group membership is more correct. It&amp;#8217;s their OS distribution after all.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://www.flickr.com/photos/davidz/81386978/" title="Photo Sharing"&gt;&lt;img border="0" src="http://static.flickr.com/43/81386978_d47cd5969f.jpg" width="333" height="500" alt="Sketchy Rupert" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;em&gt;Rupert spotted in Germany&lt;/em&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Now, with the ability to track logged in users and sessions, it becomes almost trivial to write the next system-wide service, let&amp;#8217;s call it &lt;code&gt;org.freedesktop.PolicyManager&lt;/code&gt;. This is a daemon that reads configuration files in &lt;code&gt;/etc/PolicyManager.d/&lt;/code&gt; (only programs will dump files here, not people)&lt;br/&gt;&lt;code&gt;&lt;br/&gt; /etc/PolicyManager.d/power-management.conf&lt;br/&gt;                      storage-management.conf&lt;br/&gt;                      ...&lt;br/&gt;&lt;/code&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;where e.g. power-management.conf contains&lt;br/&gt;&lt;code&gt;&lt;br/&gt; [policy-service]&lt;br/&gt; exec=/usr/bin/my-power-manager-when-no-one-is-logged-in&lt;br/&gt; id=PowerManagement&lt;br/&gt; per_console=false&lt;br/&gt;&lt;/code&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;which simply states that the &lt;code&gt;PolicyManager&lt;/code&gt; daemon should run the program &lt;code&gt;/usr/bin/my-power-manager-when-no-one-is-logged-in&lt;/code&gt; when no user is logged in (the console number is passed in the environment). This configuration file also provides a unique identifier for the kind of policy service it is, in this case power management. Part of the &amp;#8220;specification&amp;#8221; for the PolicyManager daemon contains a list of well-defined policy services, e.g. &lt;code&gt;PowerManagement&lt;/code&gt;, &lt;code&gt;StorageManagement&lt;/code&gt;, &lt;code&gt;ScreenSaver&lt;/code&gt;, &lt;code&gt;NetworkManagement&lt;/code&gt; and so forth. &lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://www.flickr.com/photos/davidz/81201249/" title="Photo Sharing"&gt;&lt;img border="0" src="http://static.flickr.com/43/81201249_36ae52795e.jpg" width="500" height="333" alt="Conny the killer pony!" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;em&gt;My sister has a Pony called Conny&lt;/em&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;The &lt;code&gt;per_console&lt;/code&gt; field requires further discussion, but let us first take a look at the D-BUS interface offered by the &lt;code&gt;PolicyManager&lt;/code&gt; daemon:&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;code&gt;&lt;br/&gt; service org.freedesktop.PolicyManager {&lt;br/&gt; methods:&lt;br/&gt;     bool ClaimPolicyService(string id);&lt;br/&gt;     bool ReleasePolicyService(string id);&lt;br/&gt; signal:&lt;br/&gt;     PolicyServiceClaimed(string id, string sessionId, int console);&lt;br/&gt;     PolicyServiceReleased(string id, string sessionId, int console);&lt;br/&gt; }&lt;br/&gt;&lt;/code&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;The thinking here is that when I login to the GNOME desktop, then gnome-power-manager is started and it invokes &lt;code&gt;ClaimPolicyService("PowerManagement")&lt;/code&gt; on the &lt;code&gt;PolicyManager&lt;/code&gt; system service. Since D-BUS now sports the &lt;code&gt;ConsoleTracker&lt;/code&gt; service, the &lt;code&gt;PolicyManager&lt;/code&gt; can determine what console, if any, the method call from the gnome-power-manager instance stems from. Specifically, if the method invocation stems from a process not at the console it is denied.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;The &lt;code&gt;PolicyManager&lt;/code&gt; service now kills the existing process responsible for power management, e.g. &lt;code&gt;/usr/bin/my-power-manager-when-no-one-is-logged-in&lt;/code&gt;, and returns TRUE which means that our copy of gnome-power-manager is set to go. This daemon starts enforcing policy, e.g. suspends my laptop after inactivity and so forth.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Whenever my copy of gnome-power-manager terminates (normally when logging out), then the &lt;code&gt;PolicyManager&lt;/code&gt; is notified through a signal on the system message bus (already part of the system bus) and starts up &lt;code&gt;/usr/bin/my-power-manager-when-no-one-is-logged-in&lt;/code&gt; to enforce policy. Also, at any point my gnome-power-manager copy may invoke &lt;code&gt;ReleasePolicyService("PowerManagement")&lt;/code&gt; if the user e.g. manually disables it (though it is unlikely why g-p-m would provide such functionality).&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Suppose that user A is logged in at console 0, it&amp;#8217;s session &lt;code&gt;"s100"&lt;/code&gt;, and has a copy of gnome-power-manager runnning. Now suppose that user B logs in via fast user switching at console 0, session &lt;code&gt;"s101"&lt;/code&gt;. The following happens. &lt;/p&gt;&lt;br/&gt;	&lt;p&gt;First, the &lt;code&gt;ConsoleTracker&lt;/code&gt; service emits a signal telling that session &lt;code&gt;"s100"&lt;/code&gt; is no longer active, &lt;code&gt;SessionActivityChanged("s100", 0, FALSE)&lt;/code&gt;, and the gnome-power-manager copy in session &lt;code&gt;"s100"&lt;/code&gt; receives this signal and stops enforcing policy (it doesn&amp;#8217;t invoke &lt;code&gt;ReleasePolicyService()&lt;/code&gt; though). Now another copy of gnome-power-manager for user B starts up in session &lt;code&gt;"s101"&lt;/code&gt;. It also invokes &lt;code&gt;ClaimPolicyService("PowerManagement")&lt;/code&gt; on &lt;code&gt;PolicyManager&lt;/code&gt; and it recieves &lt;code&gt;TRUE&lt;/code&gt; and this copy starts enforcing policy. &lt;/p&gt;&lt;br/&gt;	&lt;p&gt;When switching back to session &lt;code&gt;"s100"&lt;/code&gt;, the g-p-m copy in session &lt;code&gt;"s101"&lt;/code&gt; stops enforcing policy, due to &lt;code&gt;SessionActivityChanged("s101", 0, FALSE)&lt;/code&gt;, and the g-p-m copy for session &lt;code&gt;"s100"&lt;/code&gt; starts enforcing policy in response to the &lt;code&gt;SessionActivityChanged("s100", 0, TRUE)&lt;/code&gt; signal.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://www.flickr.com/photos/davidz/81349531/" title="Photo Sharing"&gt;&lt;img border="0" src="http://static.flickr.com/43/81349531_7fc2b570b5.jpg" width="500" height="333" alt="Dark skies and white snow" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;em&gt;Frightening Sky&lt;/em&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;The &lt;code&gt;per_console&lt;/code&gt; field, which is &lt;code&gt;FALSE&lt;/code&gt; in the power management example, defines whether the policy enforcing daemon is per console or per system.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;For example, consider a system with two consoles, 0 and 1. Since per_console is &lt;code&gt;FALSE&lt;/code&gt; for power management only one copy of &lt;code&gt;/usr/bin/my-power-manager-when-no-one-is-logged-in&lt;/code&gt; is launched. When there are two user sessions, one on each console, only one of them get to enforce policy, e.g. &lt;code&gt;ClaimPolicyService("PowerManagement")&lt;/code&gt; will fail for one of the two copies of gnome-power-manager. The loser will probably revert to only showing battery information, not enforcing policy, and it is up to the two copies to negotiate when to suspend the system. This may be done in a number of ways.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;So when is &lt;code&gt;per_console=TRUE&lt;/code&gt; useful? It&amp;#8217;s useful for policy enforcing pieces like the screen saver or the storage manager. In general, it&amp;#8217;s useful when you want a copy running for each console. For example, when &lt;code&gt;PolicyManager&lt;/code&gt; starts up on a system with two consoles, it will launch two copies of the &lt;code&gt;/usr/bin/my-screen-saver-when-no-one-is-logged-in&lt;/code&gt; (how it gets access to the X display is another matter though). Specifically, for storage management, e.g. gnome-volume-manager, one also wants to ensure that policy is only enforced for drives local to the console, e.g. only mount USB storage for the USB ports local to the console. How this is determined is beyond the scope of this write-up for &lt;code&gt;ConsoleTracker&lt;/code&gt; and &lt;code&gt;PolicyManager&lt;/code&gt; but it&amp;#8217;s not difficult to imagine that this information could come from HAL.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;strong&gt;Reusing desktop policy daemons for system use&lt;/strong&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;One problem remains to be solved. How do you configure the policy for the policy daemon when no user is logged in? Also, why would you want to maintain two code bases; one for desktop case and one for the case when no use is logged in? The answer here is simply to reuse the desktop policy daemon. For instance, for power management we get&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;code&gt;&lt;br/&gt; [policy-service]&lt;br/&gt; exec=/usr/bin/gnome-power-manager --no-one-is-logged-in&lt;br/&gt; id=PowerManagement&lt;br/&gt; per_console=false&lt;br/&gt;&lt;/code&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;and gnome-power-manager simply don&amp;#8217;t provide any UI (or maybe it paints the UI on top of the login screen, e.g. &lt;a href="http://www.gnome.org/projects/gdm/"&gt;gdm&lt;/a&gt;). Since this copy of gnome-power-manager is invoked by the &lt;code&gt;PolicyManager&lt;/code&gt; daemon it runs as &lt;code&gt;nobody&lt;/code&gt; or some other unprivileged system user. It still reads it&amp;#8217;s setting from gconf but since this is not a real user it will get the default settings. &lt;/p&gt;&lt;br/&gt;	&lt;p&gt;With this approach the UI for gnome-power-manager may include a button &lt;em&gt;&amp;#8220;Set as system default&amp;#8221;&lt;/em&gt; that simply copies the settings from the logged in users gconf schema to the system default ones in &lt;code&gt;/etc/gconf/gconf.xml.defaults&lt;/code&gt;. This of course requires administrative privileges and we may even hide this button if we can detect whether the user is an admin or not. Notably this will also work for other policy enforcing daemons, e.g. NetworkManager&amp;#8217;s nm-applet, the GNOME screen saver and so forth.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://www.flickr.com/photos/davidz/81393822/" title="Photo Sharing"&gt;&lt;img border="0" src="http://static.flickr.com/42/81393822_32c5952257.jpg" width="500" height="333" alt="Confetti is everywhere" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;em&gt;Confetti is Everywhere&lt;/em&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;strong&gt;Not tied to one desktop&lt;/strong&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;I&amp;#8217;ve used GNOME as an example above, mostly because I&amp;#8217;m a GNOME user and developer myself, but nothing prevents KDE or XFCE to do the same. Indeed, if there is agreement on all desktops using the &lt;code&gt;ConsoleTracker&lt;/code&gt; and &lt;code&gt;PolicyManager&lt;/code&gt; things will &amp;#8220;just work&amp;#8221;. Of course, someone will have to write this stuff &lt;img src='http://blog.fubar.dk/wp-images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&gt; , I&amp;#8217;m just rambling about one possible framework.&lt;br/&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-8992044582177714413?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/8992044582177714413/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2006/01/new-year-and-policy-daemons.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/8992044582177714413'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/8992044582177714413'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2006/01/new-year-and-policy-daemons.html' title='New year and Policy Daemons'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-3561558889865253728</id><published>2005-12-09T13:23:00.000-05:00</published><updated>2010-04-19T20:21:57.786-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Photography'/><title type='text'>This here’s a recipe for unpleasantness</title><content type='html'>&lt;p&gt;&lt;br/&gt;&lt;a href="http://www.flickr.com/photos/davidz/71877618/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/20/71877618_bd97c47a1f.jpg" width="500" height="333" alt="Snow, Dec 2005" border="0" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;i&gt;We had snow today - good thing I was working from home&lt;/i&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://www.flickr.com/photos/davidz/71878447/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/20/71878447_08005e47eb.jpg" width="500" height="333" alt="The world is upside down" border="0" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;i&gt;How the world really is&lt;/i&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://www.flickr.com/photos/davidz/71880531/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/20/71880531_e0b4764458.jpg" width="500" height="333" alt="The world is out-of-focus" border="0" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;i&gt;Sunset&lt;/i&gt;&lt;br/&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-3561558889865253728?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/3561558889865253728/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2005/12/this-heres-recipe-for-unpleasantness.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/3561558889865253728'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/3561558889865253728'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2005/12/this-heres-recipe-for-unpleasantness.html' title='This here’s a recipe for unpleasantness'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-8801151685480440702</id><published>2005-12-04T18:12:00.000-05:00</published><updated>2010-04-19T20:21:57.779-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Photography'/><category scheme='http://www.blogger.com/atom/ns#' term='Me Me Me'/><category scheme='http://www.blogger.com/atom/ns#' term='Fun'/><title type='text'>I fought the mountain and the mountain won</title><content type='html'>&lt;p&gt;Today, &lt;a href="http://bitplanet.net/"&gt;Kristian&lt;/a&gt; and I drove up to &lt;a href="http://www.killington.com/"&gt;Killington, VT&lt;/a&gt; to go skiing. It was my first time out on sloped terrain, let alone the first time in 15-20 years wearing a set of skiis.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://www.flickr.com/photos/davidz/70295015/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/20/70295015_a16bf1559f.jpg" width="500" height="333" border="0" alt="I fought the mountain and the mountain won" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt; &lt;i&gt;I fought the mountain and the mountain won&lt;/i&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;After some moderate success on the learning slope, Kristian convinced me to try the green slope pictured above (or was it blue? Supposed to be an easy one either way). I was told that I looked rather freaked out after safely returning to the base camp but that it was somewhat decent attempt; go go go! Heh, things take time I guess.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Either way, it was awesome and I&amp;#8217;m definitely going to go again soon. Especially as I shelled out quite an amount of money for skiing clothes but ended up renting the skiis, boots and other stuff.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://www.flickr.com/photos/davidz/70295325/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/20/70295325_283eb061f0.jpg" width="333" height="500" border="0" alt="Snowboards" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt; &lt;i&gt;Bokeh Galore&lt;/i&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;I also brought my camera and a set of lenses (the 10-22, 24-70, 70-200 and 2x extender) though, since the weather was quite bad, I only used my recently acquired 50mm f/1.4 - the &lt;a href="http://en.wikipedia.org/wiki/Bokeh"&gt;bokeh&lt;/a&gt; on that one is awesome, though it&amp;#8217;s a bit difficult to focus correctly although that is a &lt;a href="http://www.fredmiranda.com/reviews/showproduct.php?product=29&amp;#38;sort=7&amp;#38;cat=2&amp;#38;page=1"&gt;known issue&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-8801151685480440702?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/8801151685480440702/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2005/12/i-fought-mountain-and-mountain-won.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/8801151685480440702'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/8801151685480440702'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2005/12/i-fought-mountain-and-mountain-won.html' title='I fought the mountain and the mountain won'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-3107799670876966367</id><published>2005-09-21T19:58:00.000-04:00</published><updated>2010-04-19T20:21:57.772-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Photography'/><category scheme='http://www.blogger.com/atom/ns#' term='Travelling'/><category scheme='http://www.blogger.com/atom/ns#' term='Me Me Me'/><category scheme='http://www.blogger.com/atom/ns#' term='Fun'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>Last few months in review</title><content type='html'>&lt;p&gt;I realized today that I haven&amp;#8217;t blogged in almost three months.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;strong&gt;Conferences&lt;/strong&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;In July, I went to the &lt;a href="http://www.desktopcon.org/2005/"&gt;Desktop Developers Conference&lt;/a&gt; and then the &lt;a href="http://www.linuxsymposium.org/2005/"&gt;Ottawa Linux Symposium&lt;/a&gt; after that. One busy week where I shared a room with &lt;a href="http://vrfy.org/log/"&gt;Kay Sievers&lt;/a&gt;, good pal and now proud maintainer of &lt;a href="http://www.kernel.org/pub/linux/utils/kernel/hotplug/udev.html"&gt;udev&lt;/a&gt; (congrats Kay!). It was my first time going to one of the DDC and OLS conferences, and it was good to meet both old and new friends. Pictures &lt;a href="http://flickr.com/photos/davidz/sets/645946/"&gt;here&lt;/a&gt;. Next up is the &lt;a href="http://live.gnome.org/Boston2005"&gt;GNOME Boston Summit&lt;/a&gt;.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://www.flickr.com/photos/davidz/28645120/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/22/28645120_a9cc3e9157.jpg" width="500" height="333" alt="Alan Coopersmith, krh, DV and cworth" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;i&gt;Hackers&lt;/i&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;strong&gt;Visit&lt;/strong&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;An old friend Søren, from Denmark, was in California so he stopped over in Boston for a visit in the start of September. We drove down to NYC, had a good Saturday night out clubbing with friends, hung out in the city on the Sunday. Labour-day Monday, we headed south for Washington DC for another 2.5 days. Pictures &lt;a href="http://flickr.com/photos/davidz/sets/947561/"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://www.flickr.com/photos/davidz/42425409/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/26/42425409_99b5d21a48.jpg" width="500" height="333" alt="NYC, DC Roadtrip" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;i&gt;At the corner of 33th street and 7nd Ave&lt;/i&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;strong&gt;Photography&lt;/strong&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;I&amp;#8217;ve upgraded to the &lt;a href="http://www.fredmiranda.com/reviews/showproduct.php?product=220"&gt;Canon 20D&lt;/a&gt; and also acquired my first L lens, the &lt;a href="http://www.fredmiranda.com/reviews/showproduct.php?product=13&amp;#38;sort=7&amp;#38;cat=27&amp;#38;page=1"&gt;70-200 f/2.8L&lt;/a&gt; zoom lens. It&amp;#8217;s awesome. Coupled with the &lt;a href="http://www.fredmiranda.com/reviews/showproduct.php?product=119&amp;#38;sort=7&amp;#38;cat=31&amp;#38;page=1"&gt;2x II&lt;/a&gt; extender I grabbed a picture of a full moon the day before yesterday, see below. For candid shots and low-light-photography (good for capturing &lt;a href="http://flickr.com/photos/davidz/33845376/"&gt;people&lt;/a&gt; that has issues with fire alarms) I still swear to my copy of the &lt;a href="http://www.fredmiranda.com/reviews/showproduct.php?product=127&amp;#38;sort=7&amp;#38;cat=38&amp;#38;page=1"&gt;Sigma 28mm f1.8&lt;/a&gt;, it&amp;#8217;s pretty good, though I do admit that I miss a zoom and eventually I&amp;#8217;d like something like &lt;a href="http://www.fredmiranda.com/reviews/showproduct.php?product=5&amp;#38;sort=7&amp;#38;cat=27&amp;#38;page=1"&gt;this&lt;/a&gt; instead &lt;img src='http://blog.fubar.dk/wp-images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&gt; .&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://www.flickr.com/photos/davidz/44907753/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/24/44907753_6ea30f85ef.jpg" width="500" height="375" alt="Moon September 19, 2005"&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;i&gt;Full moon&lt;/i&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;strong&gt;Mass Drivers License&lt;/strong&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;I passed the written test last week and the road test yesterday, so now I&amp;#8217;m licensed to drive here in the &lt;a href="http://www.mass.gov/massgov2/index.html"&gt;Commonwealth of Massachusetts&lt;/a&gt; and, for that matter, in the rest of the US. Compared to the tests I had to take in Denmark, some 11.5 years ago, this was a piece of cake. It is pretty fortunate that I finally got this done, as after one year in the US my Danish license will stop working and that is nine days from now. Btw, thanks a million to &lt;a href="http://martianrock.com/"&gt;J5&lt;/a&gt; for being my sponsor.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;strong&gt;Work&lt;/strong&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Been busy with new projects. I feel a little bit sad that this means that I&amp;#8217;ve been slow to reply on mail on the &lt;a href="http://lists.freedesktop.org/archives/hal/"&gt;HAL list&lt;/a&gt;, but this is also because life have been somewhat busy and trying lately. Fortunately Danny Kukawka and Richard Hughes have been helpful looking after the project. Also happy to see that &lt;a href="http://gnome-power.sourceforge.net/"&gt;GNOME Power Manager&lt;/a&gt; will soon enter Rawhide. I&amp;#8217;ve been using g-p-m for the past few weeks and it makes the whole laptop experience better.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-3107799670876966367?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/3107799670876966367/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2005/09/last-few-months-in-review.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/3107799670876966367'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/3107799670876966367'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2005/09/last-few-months-in-review.html' title='Last few months in review'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-770276572043934330</id><published>2005-07-06T19:39:00.000-04:00</published><updated>2010-04-19T20:21:57.765-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Photography'/><category scheme='http://www.blogger.com/atom/ns#' term='Travelling'/><category scheme='http://www.blogger.com/atom/ns#' term='Me Me Me'/><title type='text'>This is where mechanical excellence and one-thousand four-hundred
horsepower pays off</title><content type='html'>&lt;p&gt;&lt;strong&gt;California&lt;/strong&gt;&lt;br/&gt;Impulse struck me last week and Wednesday I booked a quick getaway on &lt;a href="http://www.site59.com/"&gt;site59.com&lt;/a&gt; - a site that &lt;a href="http://www.gnome.org/~seth/blog/"&gt;Seth&lt;/a&gt; told me about. I got an awesome deal; highly recommended.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;a href="http://www.flickr.com/photos/davidz/24154068/" title="Photo Sharing"&gt;&lt;img src="http://photos18.flickr.com/24154068_5fb6cbedec.jpg" width="500" height="333" alt="Roads" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;i&gt;California Route One&lt;/i&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;I left for sunny California (wasn&amp;#8217;t that sunny though) very early Saturday and arrived back in rainy Boston (very rainy when we landed) very early Wednesday. I didn&amp;#8217;t really have any specific plans for the trip so things just happened along the way which happened to work out very well. Spent Saturday night in San Francisco (notably at the &lt;a href="http://www.theirishbank.com/"&gt;Irish Bank&lt;/a&gt; and &lt;a href="http://www.sanfranciscoblues.net/Swig.html"&gt;The Swig&lt;/a&gt;) where I met and chatted with a bunch of different people including one &lt;a href="http://www.photo-now.com/"&gt;professional photographer&lt;/a&gt; (which was interesting as I like to think of photography as a new hobby for me). Sunday I left for &lt;a href="http://www.monterey.org/"&gt;Monterey&lt;/a&gt; and stayed there until Tuesday.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;The most amazing part of the trip was probably driving on the very amazing 90 mile stretch of Route 1 from &lt;a href="http://www.carmel-california.com/"&gt;Carmel&lt;/a&gt; to &lt;a href="http://www.sansimeonsbest.com/"&gt;San Simeon&lt;/a&gt;. Well, &lt;a href="http://flickr.com/photos/davidz/sets/553166/"&gt;pictures&lt;/a&gt; speak more than a thousand words.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Spent most of Wednesday catching up on mail and on meetings / IRC; still got lots of mail and issues to attend to though.&lt;br/&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-770276572043934330?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/770276572043934330/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2005/07/this-is-where-mechanical-excellence-and.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/770276572043934330'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/770276572043934330'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2005/07/this-is-where-mechanical-excellence-and.html' title='This is where mechanical excellence and one-thousand four-hundred&#xA;horsepower pays off'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-3631232884385134627</id><published>2005-06-26T18:33:00.000-04:00</published><updated>2010-04-19T20:21:57.759-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Photography'/><category scheme='http://www.blogger.com/atom/ns#' term='Fun'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>Frankly, my dear, I don’t give a damn</title><content type='html'>&lt;p&gt;&lt;strong&gt;Zoo&lt;/strong&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Went out to &lt;a href="http://www.zoonewengland.com/"&gt;Franklin Park Zoo&lt;/a&gt; this morning and took a bunch of pictures.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;a href="http://www.flickr.com/photos/davidz/21719103/" title="Photo Sharing"&gt;&lt;img src="http://photos17.flickr.com/21719103_d5f35a3163.jpg" width="500" height="333" alt="Waterfall"&gt;&lt;/a&gt;&lt;br/&gt;&lt;i&gt;Waterfall in the Tropical Forest&lt;/i&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Most of them ended up pretty bad due to lack of light (thanks to the somewhat hazy weather here in Boston). I&amp;#8217;ve uploaded some of the better ones &lt;a href="http://flickr.com/photos/davidz/sets/504633/"&gt;in this gallery&lt;/a&gt;.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;strong&gt;Volume handling&lt;/strong&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Been spending quite some time on a rather large gnome-vfs patch (it&amp;#8217;s about 80k now) that enables &lt;tt&gt;gnome-vfs-daemon&lt;/tt&gt; to recognize drives without having them in the &lt;tt&gt;/etc/fstab&lt;/tt&gt; file.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;a href="http://blog.fubar.dk/archives/gnome-vfs-hacking-1.png"&gt;&lt;img alt="gnome-vfs-hacking-1.png" src="http://blog.fubar.dk/archives/gnome-vfs-hacking-1-thumb.png" width="500" height="375"&gt;&lt;/a&gt;&lt;br/&gt;&lt;i&gt;Look mom! No &lt;tt&gt;/etc/fstab&lt;/tt&gt; entries!&lt;/i&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;There&amp;#8217;s a bunch of other benefits including the fact that we actually show drive icons even when no media is in the drive and, of course, that we stop using &lt;tt&gt;/usr/sbin/fstab-sync&lt;/tt&gt; in Fedora and instead use &lt;tt&gt;mount/umount/eject&lt;/tt&gt; programs that can integrate nicely with the GNOME desktop. The latter is quite important, actually the point of this whole exercise. &lt;/p&gt;&lt;br/&gt;	&lt;p&gt;The main benefit is that we can move all policy into the desktop - this means that we can write a GNOME-based &lt;tt&gt;mount&lt;/tt&gt; wrapper that queries your settings from &lt;tt&gt;gconf&lt;/tt&gt; about where to mount volumes (the mount point) and what mount options to use (e.g. &lt;tt&gt;iocharset&lt;/tt&gt; comes mind). Of course, we have to be extremely careful in what options and mounts point we&amp;#8217;ll allow. It will be almost trivial to write a Nautilus extension so this can be edited in a tab per drive/volume. This is planned too. While this sounds like a super-31337 geek feature it&amp;#8217;s actually something that both Fedora and upstream &lt;tt&gt;HAL&lt;/tt&gt; has gotten a lot of bug reports about. Another benefit is that we can actually put up meaningful dialogs if the &lt;tt&gt;mount/umount/eject&lt;/tt&gt; fails. For instance, we may put up a dialog with a list of the applications that is blocking the unmount (of course, applications like these needs to be fixed so maybe not worth the effort). &lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Finally, we&amp;#8217;ll be able to do lock-down much more effectively - for instance, administrators should be able to say &lt;i&gt;&amp;#8220;Require root password to mount external storage device read/write&amp;#8221;&lt;/i&gt; (which is done by setting a mandatory gconf key) and we pop a dialog telling the user that we can only mount read-only unless the user authenticates (using the root password or other mechanishms is another discussion). While this sounds like a stupid feature check &lt;a href="http://devers.homeip.net:8080/cringe/pulpit20040916.html"&gt;this out&lt;/a&gt; (search for &amp;#8220;solder&amp;#8221;) and also take a look at some of the discussion regarding what &lt;a href="http://en.wikipedia.org/wiki/Sarbanes-Oxley"&gt;Sarbanes-Oxley&lt;/a&gt; is requiring from businesses.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Implementation-wise, I&amp;#8217;m planning to use &lt;tt&gt;pmount&lt;/tt&gt; as the backend for the GNOME-specific &lt;tt&gt;mount/umount/eject&lt;/tt&gt; wrapper but right now I&amp;#8217;m running into some issues with the privileged parts (that should trust nobody) insofar that they have to check things in &lt;tt&gt;gconf&lt;/tt&gt; / &lt;tt&gt;HAL&lt;/tt&gt;. Have to think a bit more about that and also email &lt;a href="http://martin.piware.de/"&gt;Martin&lt;/a&gt;.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;strong&gt;Chopsticks&lt;/strong&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;So, this female Asian coworker (who has requested anonymity when I told her I was going to blog this, so can&amp;#8217;t be specific &lt;img src='http://blog.fubar.dk/wp-images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&gt;  gave me a set of chopsticks last week. They&amp;#8217;re supposed to be easier to use than what they give you at restaurants.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;a href="http://www.flickr.com/photos/davidz/21796776/" title="Photo Sharing"&gt;&lt;img src="http://photos17.flickr.com/21796776_0cf6441c0d.jpg" width="500" height="333" alt="Chopsticks"&gt;&lt;/a&gt;&lt;br/&gt;&lt;i&gt;Chopsticks. In orange. They even match my sleeping sofa.&lt;/i&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;I&amp;#8217;m still undecided whether it&amp;#8217;s something I should bring to a fancy restaurant, so I carry them around with me until that matter is resolved &lt;img src='http://blog.fubar.dk/wp-images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&gt;&lt;br/&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-3631232884385134627?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/3631232884385134627/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2005/06/frankly-my-dear-i-dont-give-damn.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/3631232884385134627'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/3631232884385134627'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2005/06/frankly-my-dear-i-dont-give-damn.html' title='Frankly, my dear, I don’t give a damn'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-533679934494866290</id><published>2005-06-15T18:44:00.000-04:00</published><updated>2010-04-19T20:21:57.752-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Photography'/><category scheme='http://www.blogger.com/atom/ns#' term='Fun'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>Size does matter</title><content type='html'>&lt;p&gt;&lt;strong&gt;New lens&lt;/strong&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Went to the &lt;a href="http://www.cambridgesidegalleria.com/"&gt;Cambridgeside Galleria&lt;/a&gt; tonight and picked up the &lt;a href="http://consumer.usa.canon.com/ir/controller?act=ModelDetailAct&amp;#38;fcategoryid=150&amp;#38;modelid=7445"&gt;EF 75-300mm f/4-5.6 III Telephoto Zoom Lens&lt;/a&gt;. It&amp;#8217;s awesome. Can&amp;#8217;t wait for the sun to get up as it requires a bit more light than the standard 18-55mm lens that came with my &lt;a href="http://consumer.usa.canon.com/ir/controller?act=ModelDetailAct&amp;#38;fcategoryid=139&amp;#38;modelid=11154"&gt;Digital Rebel XT&lt;/a&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://www.flickr.com/photos/davidz/19622235/" title="Photo Sharing"&gt;&lt;img src="http://photos16.flickr.com/19622235_67bb910f45.jpg" width="500" height="375" alt="Size does matter"&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;i&gt;Size does matter&lt;/i&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Now to start thinking about a quick weekend get-away to try out this beast.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;strong&gt;D-BUS&lt;/strong&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Been spending some time on D-BUS the past few days, got a patch for &lt;a href="http://lists.freedesktop.org/archives/dbus/2005-June/002784.html"&gt;automatically reloading policy&lt;/a&gt; in and also some bitching about &lt;a href="http://lists.freedesktop.org/archives/dbus/2005-June/002793.html"&gt;not breaking the ABI&lt;/a&gt;. &lt;a href="http://www.martianrock.com/"&gt;John&lt;/a&gt; put out the &lt;a href="http://lists.freedesktop.org/archives/dbus/2005-June/002807.html"&gt;0.34 release&lt;/a&gt; that also includes &lt;a href="http://gtk.org/"&gt;glib/gobject&lt;/a&gt; goodness from &lt;a href="http://verbum.org/blog/"&gt;Colin&lt;/a&gt; and &lt;a href="http://www.burtonini.com/"&gt;Ross&lt;/a&gt;. Sweet.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;strong&gt;Playing in the band&lt;/strong&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Friday, me, &lt;a href="http://bitplanet.net/"&gt;Kristian&lt;/a&gt;, &lt;a href="http://christopher.aillon.org/blog/"&gt;Chris&lt;/a&gt;, &lt;a href="http://www.daimi.au.dk/~sandmann/"&gt;Søren&lt;/a&gt;, &lt;a href="http://www.martianrock.com/"&gt;John&lt;/a&gt; and &lt;a href="http://c133.org/?curdir=blog"&gt;clee&lt;/a&gt; went to &lt;a href="http://www.sallyobriensbar.com/home.htm"&gt;this Somerville bar&lt;/a&gt; since it was country/southern rock night. It was pretty cool. So, I was standing out smoking, casual and minding my own stuff you know, and this old timer who reminded me of &lt;a href="http://www.johnnycash.com/"&gt;Johnny Cash&lt;/a&gt; came up and asked if I was part of the band. I had to say no but he insisted that I looked like a natural-born guitar player and gave me several addresses where to buy a guitar and encouraged me to start playing. I contemplated starting singing to get him on better thoughts &lt;img src='http://blog.fubar.dk/wp-images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&gt; &lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;strong&gt;Fedora Core 4&lt;/strong&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;a href="http://www.redhat.com/archives/fedora-announce-list/2005-June/msg00010.html"&gt;The Amazing Fedora Core 4!&lt;/a&gt; is out. Go get it.&lt;br/&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-533679934494866290?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/533679934494866290/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2005/06/size-does-matter.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/533679934494866290'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/533679934494866290'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2005/06/size-does-matter.html' title='Size does matter'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-7606156399635836277</id><published>2005-06-12T13:35:00.000-04:00</published><updated>2010-04-19T20:21:57.745-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Travelling'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>A man who doesn’t spend time with his family can never be a real man</title><content type='html'>&lt;p&gt;&lt;strong&gt;NetworkManager&lt;/strong&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;So, I finally got round to finishing up and committing my NetworkManager VPN patch; here are &lt;a href="http://mail.gnome.org/archives/networkmanager-list/2005-June/msg00034.html"&gt;the details&lt;/a&gt;. Also, since all the cool kids do it, I made a &lt;a href="http://en.wikipedia.org/wiki/Screencast"&gt;screencast&lt;/a&gt; to show how it works. Peruse it by clicking the picture below.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://people.redhat.com/davidz/nm-vpn/nm-vpn.html"&gt;&lt;img border="0" src="http://people.redhat.com/davidz/nm-vpn/nm-vpn.png" width="400" height="300" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;i&gt;davidz does screencasting&lt;/i&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;The next step is to add support for more VPN software, not at least so we can finalise the extension points (interfaces really) for how to integrate VPN software with NetworkManager. Things like &lt;a href="http://openvpn.net/"&gt;OpenVPN&lt;/a&gt; and &lt;a href="http://www.openswan.org/"&gt;Openswan&lt;/a&gt; comes to mind. When that is done, we&amp;#8217;re probably going to lock down the interface and keep it stable. You know, even so proprietary software vendors may integrate their VPN software with NetworkManager.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;strong&gt;Denmark&lt;/strong&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;I had a very very nice time in Denmark; arrived on Wednesday the 1st of June, spent the evening at my moms new house in &lt;a href="http://en.wikipedia.org/wiki/S%F8ller%F8d"&gt;Trørød&lt;/a&gt; with my mom, my sister Maria and her husband and two kids. On Thursday my mom and I embarked on a journey to &lt;a href="http://en.wikipedia.org/wiki/Funen"&gt;Fyn&lt;/a&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://blog.fubar.dk/archives/img_3056.jpg"&gt;&lt;img border="0" src="http://blog.fubar.dk/archives/img_3056_thumb.jpg" width="400" height="267" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;i&gt;the uncle and the nephew - who&amp;#8217;s who?&lt;/i&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;to visit my sister Birgitte and family. It was awesome, Birgitte and co. lives on an old farm and there was a ton of motives which meant that I put good use to my new camera. I need to upload those pictures soon now that I got an account at &lt;a href="http://www.flickr.com/photos/davidz/"&gt;flickr&lt;/a&gt; (again, like all the cool kids &lt;img src='http://blog.fubar.dk/wp-images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&gt; .&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;I returned to Copenhagen on Friday and met with a lot of friends at &lt;a href="http://da.wikipedia.org/wiki/Vesterbro_Torv_(K%F8benhavn)"&gt;Vesterbro Torv&lt;/a&gt; - I think we were 10-11 or so. It was very nice to see so many of my old pals and it got very late until I returned home (in more than one sense). It was totally awesome.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;strong&gt;Beantown&lt;/strong&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;When I got back to Boston about a week ago the weather had changed. It used to be cool. How did that happen? Now it&amp;#8217;s about 90F (32C) and extremely humid. We have already had two thunderstorms IIRC. Thank god for AC - except that the one in my car is broken and the one in my apartment is extremely noisy. Oh well, can&amp;#8217;t win them all &lt;img src='http://blog.fubar.dk/wp-images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&gt;&lt;br/&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-7606156399635836277?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/7606156399635836277/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2005/06/man-who-doesnt-spend-time-with-his.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/7606156399635836277'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/7606156399635836277'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2005/06/man-who-doesnt-spend-time-with-his.html' title='A man who doesn’t spend time with his family can never be a real man'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-6744516999828629700</id><published>2005-05-31T01:55:00.000-04:00</published><updated>2010-04-19T20:21:57.739-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Travelling'/><category scheme='http://www.blogger.com/atom/ns#' term='Fun'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>Stuttgart</title><content type='html'>&lt;p&gt;&lt;strong&gt;GUADEC&lt;/strong&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://blog.fubar.dk/archives/img_2836.jpg"&gt;&lt;img alt="img_2836.jpg" border="0" src="http://blog.fubar.dk/archives/img_2836_thumb.jpg" width="400" height="600" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;i&gt;Hanging with &lt;a href="http://vrfy.org"&gt;Kay Sievers&lt;/a&gt; in the Bier Garten&lt;/i&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://blog.fubar.dk/archives/img_2850.jpg"&gt;&lt;img alt="img_2850.jpg" border="0" src="http://blog.fubar.dk/archives/img_2850_thumb.jpg" width="400" height="267" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;i&gt;&lt;a href="http://www.gnome.org/~jdub/blog/2005/05/30/"&gt;Jeff rocked&lt;/a&gt;&lt;/i&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://blog.fubar.dk/archives/img_2894.jpg"&gt;&lt;img alt="img_2894.jpg" border="0" src="http://blog.fubar.dk/archives/img_2894_thumb.jpg" width="400" height="267" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;i&gt;Stuttgart is rather nice&lt;/i&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;strong&gt;Copenhagen&lt;/strong&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;I&amp;#8217;m going to Copenhagen tomorrow. As mentioned &lt;a href="http://blog.fubar.dk/archives/2005/05/live_free_or_di.html"&gt;here&lt;/a&gt; I&amp;#8217;m up for beer but we moved it to Friday from Thursday. Send me mail!&lt;br/&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-6744516999828629700?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/6744516999828629700/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2005/05/stuttgart.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/6744516999828629700'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/6744516999828629700'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2005/05/stuttgart.html' title='Stuttgart'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-8144839140858956750</id><published>2005-05-24T15:32:00.000-04:00</published><updated>2010-04-19T20:21:57.732-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Fun'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>Live Free or Die</title><content type='html'>&lt;p&gt;&lt;strong&gt;Hacking&lt;/strong&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;I posted my patch for a small &lt;a href="http://people.redhat.com/dcbw/NetworkManager/"&gt;NetworkManager&lt;/a&gt; feature. There&amp;#8217;s still some work left. Details &lt;a href="http://mail.gnome.org/archives/networkmanager-list/2005-May/msg00116.html"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://blog.fubar.dk/archives/nm-vpn-properties-2.png"&gt;&lt;img alt="nm-vpn-properties-2.png" border="0" src="http://blog.fubar.dk/archives/nm-vpn-properties-2-thumb.png" width="400" height="300" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;i&gt;&lt;/i&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Also, &lt;a href="http://www.hadess.net/"&gt;Bastien&lt;/a&gt; proposed to integrate his small tool for importing .PCF files from the Cisco VPN Client. So, today I added a button for this.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;img alt="nm-vpnc.png" src="http://blog.fubar.dk/archives/nm-vpnc.png" width="358" height="586" /&gt;&lt;br/&gt;&lt;br/&gt;&lt;i&gt;K-rad settings&lt;/i&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;strong&gt;Visit&lt;/strong&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Yesterday, &lt;a href="http://blijdorp.org/"&gt;Marco&lt;/a&gt; arrived:&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://blog.fubar.dk/archives/marco.jpg"&gt;&lt;img alt="nm-vpn-properties-2.png" border="0" src="http://blog.fubar.dk/archives/marco-thumb.jpg" width="400" height="267" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;i&gt;As you can tell, Marco is dutch &lt;img src='http://blog.fubar.dk/wp-images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&gt; &lt;/i&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;strong&gt;Cigs&lt;/strong&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Not that it&amp;#8217;s really anyones business but mine &lt;img src='http://blog.fubar.dk/wp-images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&gt; , but due to various, uhm, personal reasons I succumbed and started smoking again. I only smoke at nights though, not at work. Some day I will really stop but now just isn&amp;#8217;t the right time&amp;#8230; I did go about 13-14 days with a single cigarette. Bah.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;strong&gt;Copenhagen&lt;/strong&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;I&amp;#8217;m planning on meeting up with friends on the evening of Thursday the 2nd of June in Copenhagen somewhere at &lt;a href="http://da.wikipedia.org/wiki/Vesterbro_Torv_(K%F8benhavn)"&gt;Vesterbro Torv&lt;/a&gt;. Drop me a mail if you feel like having a beer and hanging out! Hope to see a bunch of people! We should probably start at around 7 or 8pm at Obelix. Send me mail!&lt;br/&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-8144839140858956750?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/8144839140858956750/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2005/05/live-free-or-die.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/8144839140858956750'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/8144839140858956750'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2005/05/live-free-or-die.html' title='Live Free or Die'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-7728652858211894643</id><published>2005-05-16T18:10:00.000-04:00</published><updated>2010-04-19T20:21:57.725-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Photography'/><category scheme='http://www.blogger.com/atom/ns#' term='Travelling'/><title type='text'>Refined Travel Plans</title><content type='html'>&lt;p&gt;As &lt;a href="http://blog.fubar.dk/archives/2005/05/good_times.html"&gt;mentioned earlier&lt;/a&gt; I&amp;#8217;ll be travelling to Europe for &lt;a href="http://2005.guadec.org/"&gt;GUADEC&lt;/a&gt; in less than a fortnight. &lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://blog.fubar.dk/archives/revere-beach-20050513-1.jpg"&gt;&lt;img border="0" alt="new-camera-boston.jpg" src="http://blog.fubar.dk/archives/revere-beach-20050513-1-thumb.jpg" width="400" height="600" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;i&gt;Friday night I felt like spontaneously visiting &lt;a href="http://maps.google.com/maps?q=revere+beach,+ma&amp;#38;ll=42.407731,-70.990820&amp;#38;spn=0.004689,0.007049&amp;#38;t=k&amp;#38;hl=en"&gt;Revere Beach, MA&lt;/a&gt;&lt;/i&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Tonight I just spent some airline miles so after spending $51 for taxes etc. I got this in the mail&lt;br/&gt;&lt;tt&gt;&lt;br/&gt;OUTWARD FLIGHT:  SK658, SCANDINAVIAN AIRLINES&lt;br/&gt;01 June, 10:40, Stuttgart Stuttgart Apt  Terminal 1&lt;br/&gt;01 June, 12:20, Copenhagen  Copenhagen Apt  Terminal 3&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;RETURN FLIGHT:  SK655, SCANDINAVIAN AIRLINES&lt;br/&gt;04 June, 15:15, Copenhagen Copenhagen Apt  Terminal 3&lt;br/&gt;04 June, 16:45, Stuttgart Stuttgart Apt&lt;br/&gt;&lt;/tt&gt;&lt;br/&gt;which leaves the Saturday night in Stuttgart before I return to Boston on June 5. &lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://blog.fubar.dk/archives/revere-beach-20050513-2.jpg"&gt;&lt;img border="0" alt="new-camera-boston.jpg" src="http://blog.fubar.dk/archives/revere-beach-20050513-2-thumb.jpg" width="400" height="600" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;i&gt;Time: To measure, as in music or harmony. 1913 Webster&lt;/i&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;I hope to see all my buddies and family in Denmark! Even &lt;a href="http://www.kbhguide.com"&gt;LKL&lt;/a&gt; despite he haven&amp;#8217;t responded to mail for the past month. &lt;a href="http://dict.die.net/slacker/"&gt;Slacker&lt;/a&gt; &lt;img src='http://blog.fubar.dk/wp-images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&gt;&lt;br/&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-7728652858211894643?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/7728652858211894643/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2005/05/refined-travel-plans.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/7728652858211894643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/7728652858211894643'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2005/05/refined-travel-plans.html' title='Refined Travel Plans'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-731467343195030865</id><published>2005-05-16T07:52:00.000-04:00</published><updated>2010-04-19T20:21:57.716-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Fun'/><title type='text'>OMG!</title><content type='html'>&lt;p&gt;&lt;br/&gt;&lt;a href="http://blog.fubar.dk/archives/do-not-mess-with-davidz.jpg"&gt;&lt;img border="0" alt="do-not-mess-with-davidz.jpg" src="http://blog.fubar.dk/archives/do-not-mess-with-davidz-thumb.jpg" width="400" height="300" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;i&gt;OMG!&lt;/i&gt;&lt;br/&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-731467343195030865?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/731467343195030865/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2005/05/omg.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/731467343195030865'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/731467343195030865'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2005/05/omg.html' title='OMG!'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-2494611195062276933</id><published>2005-05-10T16:41:00.000-04:00</published><updated>2010-04-19T20:21:57.705-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Photography'/><category scheme='http://www.blogger.com/atom/ns#' term='Fun'/><title type='text'>No Cigarettes</title><content type='html'>&lt;p&gt;So, for some reason I decided to stop smoking last week. It was Tuesday morning on my way to work. I haven&amp;#8217;t touched tobacco since and this is more than a week ago now.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://blog.fubar.dk/archives/new-cam-1.jpg"&gt;&lt;img alt="new-cam-1.jpg" border="0" src="http://blog.fubar.dk/archives/new-cam-1-thumb.jpg" width="400" height="267" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;i&gt;The Two Towers: &lt;a href="http://www.galinsky.com/buildings/hancockboston/"&gt;John Hancock&lt;/a&gt; and &lt;a href="http://www.emporis.com/en/wm/bu/?id=119268"&gt;Prudential&lt;/a&gt;&lt;/i&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;The funny thing, however, is that it&amp;#8217;s not completely clear to me why I want to stop. I&amp;#8217;ve got a multitude of small reasons but not really any big ones. Part of my brain is trying to convince the other part about only smoking at night / at parties. I&amp;#8217;m still clean though.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;An interesting side effect of this whole ordeal is that my senses have improved. &lt;a href="http://www.ci.somerville.ma.us/"&gt;Somerville&lt;/a&gt; really does stink when the wind isn&amp;#8217;t right &lt;img src='http://blog.fubar.dk/wp-images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&gt; &lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://blog.fubar.dk/archives/new-cam-2.jpg"&gt;&lt;img alt="new-cam-2.jpg" border="0" src="http://blog.fubar.dk/archives/new-cam-2-thumb.jpg" width="400"&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;i&gt;View from my study: &lt;a href="http://www.emporis.com/en/wm/ci/?id=101045"&gt;City of Boston&lt;/a&gt;&lt;/i&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;It&amp;#8217;s probably been helpful that while living in my new apartment, I&amp;#8217;ve only smoked outside on the balcony and for the past 7-8 months I&amp;#8217;ve not smoked more than about fifteen a day. To compensate and be nice to myself, I picked up a copy of &lt;a href="http://www.apple.com/macosx/"&gt;Tiger&lt;/a&gt; which is installing on my good old Powerbook 12&amp;#8243;. I&amp;#8217;ve also got myself a mini tripod for the new camera which I used for capturing the (long-exposure) images above (click the pictures to view the full 3456&amp;#215;2304 images).&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Now.. I&amp;#8217;m guessing that all you people now think &lt;i&gt;&amp;#8220;It will be interesting to see how this continues&amp;#8221;&lt;/i&gt;. I know I do..&lt;br/&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-2494611195062276933?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/2494611195062276933/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2005/05/no-cigarettes.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/2494611195062276933'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/2494611195062276933'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2005/05/no-cigarettes.html' title='No Cigarettes'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-6216630487110881806</id><published>2005-05-02T13:14:00.000-04:00</published><updated>2010-04-19T20:21:57.699-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Fun'/><title type='text'>Following the crowd</title><content type='html'>&lt;p&gt;Seems to be &lt;a href="http://www.planearium2.de/flash/sp-studio-e.html"&gt;sign of the times&lt;/a&gt; at &lt;a href="http://planet.freedesktop.org/"&gt;planet fd.o&lt;/a&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;img alt="davidz-south-path.png" border="0" src="http://blog.fubar.dk/archives/davidz-south-path.png" width="383" height="383" /&gt;&lt;br/&gt;&lt;br/&gt;&lt;i&gt;I like beer&lt;/i&gt;&lt;br/&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-6216630487110881806?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/6216630487110881806/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2005/05/following-crowd.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/6216630487110881806'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/6216630487110881806'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2005/05/following-crowd.html' title='Following the crowd'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-1056809029188921118</id><published>2005-05-01T17:44:00.000-04:00</published><updated>2010-04-19T20:21:57.692-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Photography'/><category scheme='http://www.blogger.com/atom/ns#' term='Travelling'/><category scheme='http://www.blogger.com/atom/ns#' term='Fun'/><title type='text'>Good times</title><content type='html'>&lt;p&gt;&lt;b&gt;M&amp;#38;M visit&lt;/b&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;My mom and older sister, Maria, visited last week; we went to Niagara Falls (on a two day trip), Cape Cod and did other tourist things here in Boston. &lt;/p&gt;&lt;br/&gt;	&lt;p&gt; &lt;br/&gt; &lt;a href="http://blog.fubar.dk/archives/nfalls1.jpg"&gt;&lt;img alt="nfalls1.jpg" border="0" src="http://blog.fubar.dk/archives/nfalls1-thumb.jpg" width="400" height="300" /&gt;&lt;/a&gt;&lt;br/&gt; &lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;i&gt;Visiting &lt;a href="http://maps.google.com/maps?q=niagara+falls,+ny&amp;#38;ll=43.076534,-79.078732&amp;#38;spn=0.037851,0.056391&amp;#38;t=k&amp;#38;hl=en"&gt;Niagara Falls, NY&lt;/a&gt; early Sunday&lt;/i&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;It was absolutely great to have the girls visiting and everything panned out very nicely. Also, now I&amp;#8217;ve also got the right gear in the kitchen to cook food (my mom remarked that it&amp;#8217;s an useful asset in order to pick up a girlfriend)&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://blog.fubar.dk/archives/nfalls2.jpg"&gt;&lt;img alt="nfalls2.jpg" border="0" src="http://blog.fubar.dk/archives/nfalls2-thumb.jpg" width="400" height="300" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;i&gt;The Falls!&lt;/i&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;b&gt;Visitors&lt;/b&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Given I&amp;#8217;ve lived here for about 7 months, I&amp;#8217;ve been quite fortunate with friends/family visiting me; &lt;a href="http://schafroth.com/"&gt;Dennis&lt;/a&gt; was here in December, &lt;a href="http://maz.spork.dk/"&gt;Maz&lt;/a&gt; dropped by in January, the girls in April and it looks like &lt;a href="http://blijdorp.org/"&gt;Marco&lt;/a&gt; and &lt;a href="http://www.kbhguide.com/"&gt;Lars&lt;/a&gt; is coming in May. Yay!&lt;/p&gt;&lt;br/&gt;	&lt;p&gt; &lt;br/&gt;&lt;a href="http://blog.fubar.dk/archives/capecod.jpg"&gt;&lt;img border="0" alt="capecod.jpg" src="http://blog.fubar.dk/archives/capecod-thumb.jpg" width="400" height="300" /&gt;&lt;/a&gt;&lt;br/&gt; &lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;i&gt;Visiting &lt;a href="http://maps.google.com/maps?q=provincetown,+ma&amp;#38;ll=41.931641,-70.188030&amp;#38;spn=1.211243,1.804504&amp;#38;t=k&amp;#38;hl=en"&gt;Race Beach&lt;/a&gt; near Provincetown on Cape Cod&lt;/i&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;b&gt;New camera&lt;/b&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;I&amp;#8217;ve finally bought a new camera, the &lt;a href="http://consumer.usa.canon.com/ir/controller?act=ModelDetailAct&amp;#38;fcategoryid=139&amp;#38;modelid=11154"&gt;Canon Digital Rebel XT&lt;/a&gt; which is a very nice 8M pixel SLR camera. It nicely complements my (nowadays, rather old) &lt;a href="http://www.dpreview.com/reviews/canondigitalixusv/"&gt;Canon Digital Ixus V&lt;/a&gt; - one for serious pictures, and one for fun.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://blog.fubar.dk/archives/new-camera-boston.jpg"&gt;&lt;img border="0" alt="new-camera-boston.jpg" src="http://blog.fubar.dk/archives/new-camera-boston-thumb.jpg" width="400" height="266" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;i&gt;My view of Beantown through the new camera&lt;/i&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;b&gt;Conferences / Travel&lt;/b&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;I will be at &lt;a href="http://2005.guadec.org/"&gt;6UADEC&lt;/a&gt; in Stuttgart, Germany and will also spend five days after that probably travelling around Europe (returning June 5). Also, I&amp;#8217;m going to &lt;a href="http://www.linuxsymposium.org/2005/"&gt;OLS&lt;/a&gt; in July and will probably fly up there with &lt;a href="http://www.0xdeadbeef.com"&gt;Blizzard&lt;/a&gt; in his small plane &lt;img src='http://blog.fubar.dk/wp-images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&gt; . Also, &lt;a href="http://vrfy.org/log/"&gt;Kay&lt;/a&gt; is talking about visiting Boston just before OLS.&lt;br/&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-1056809029188921118?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/1056809029188921118/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2005/05/good-times.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/1056809029188921118'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/1056809029188921118'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2005/05/good-times.html' title='Good times'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-203474511385755125</id><published>2005-04-15T14:50:00.000-04:00</published><updated>2010-04-19T20:21:57.686-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Fun'/><title type='text'>Optimistic</title><content type='html'>&lt;p&gt;Had my car at the dealership for service; the headlights, horn and wipers got fixed. Cost me nearly $500, yikes. All this is part of the vast array of preparations for the M&amp;#38;M visit (Mom and Maria) who arrives on Thursday; looking much forward to that. Took off the top of the car for the 30 mile (50 km) ride back:&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://blog.fubar.dk/archives/davidz-freezing.jpg"&gt;&lt;img alt="davidz-freezing.jpg" src="http://blog.fubar.dk/archives/davidz-freezing-thumb.jpg" width="300" height="225" border="0" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;i&gt;It&amp;#8217;s the lighting that makes my chin looks fat. It isn&amp;#8217;t fat really &lt;img src='http://blog.fubar.dk/wp-images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&gt; &lt;/i&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Note to self: Never ever again ride with the top down at 75 mph (120 km/h) when it&amp;#8217;s 45F (7C) outside. It&amp;#8217;s fucking cold.&lt;br/&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-203474511385755125?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/203474511385755125/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2005/04/optimistic.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/203474511385755125'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/203474511385755125'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2005/04/optimistic.html' title='Optimistic'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-4475725829365559195</id><published>2005-04-09T13:33:00.000-04:00</published><updated>2010-04-19T20:21:57.680-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Fun'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>I like art</title><content type='html'>&lt;p&gt;Played around with &lt;a href="http://camorama.fixedgear.org/"&gt;Camorama&lt;/a&gt; today; this software got some wicked filters, check my piece of art. &lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://blog.fubar.dk/archives/webcam-20050409.png"&gt;&lt;img alt="webcam-20050409.jpg" src="http://blog.fubar.dk/archives/webcam-20050409-thumb.jpg" border="0" width="400" height="300" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;i&gt;Check out the new haircut&lt;/i&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;It would be cool if &lt;a href="http://www.vanheusden.com/setpwc/"&gt;setpwc&lt;/a&gt; was integrated into the capture tool so I could control my &lt;a href="http://www.logitech.com/index.cfm/products/details/US/EN,CRID=2204,CONTENTID=7172"&gt;Quickcam Orbit&lt;/a&gt;. Maybe we need an integrated video capture widget in GNOME, maybe there is one already?&lt;br/&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-4475725829365559195?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/4475725829365559195/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2005/04/i-like-art.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/4475725829365559195'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/4475725829365559195'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2005/04/i-like-art.html' title='I like art'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-3283453000141491992</id><published>2005-04-04T22:18:00.000-04:00</published><updated>2010-04-19T20:21:57.672-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>Power Management</title><content type='html'>&lt;p&gt;I&amp;#8217;ve consolidated my thinking on &lt;a href="http://mail.gnome.org/archives/utopia-list/2005-April/msg00002.html"&gt;Power Management in GNOME&lt;/a&gt;. I hope people like it.&lt;br/&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-3283453000141491992?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/3283453000141491992/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2005/04/power-management.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/3283453000141491992'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/3283453000141491992'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2005/04/power-management.html' title='Power Management'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-738744600586291698</id><published>2005-04-04T18:12:00.000-04:00</published><updated>2010-04-19T20:21:57.664-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Fun'/><title type='text'>Taxes</title><content type='html'>&lt;p&gt;Inspired by &lt;a href="http://www.livejournal.com/users/kernelslacker/1228.html"&gt;the other Dave&lt;/a&gt; I sorted out my taxes tonight. Unlike Dave, I couldn&amp;#8217;t really get &lt;a href="http://hrblock.com/"&gt;H&amp;#38;R Block&lt;/a&gt; to work (since it determined I was in a special situation being a &lt;a href="http://uscis.gov/graphics/howdoi/h1b.htm"&gt;H1B alien&lt;/a&gt; and all), but after surfing a bit on &lt;a href="http://www.irs.gov/"&gt;IRS.gov&lt;/a&gt; I found a link to &lt;a href="http://turbotax.com/"&gt;Turbo Tax&lt;/a&gt; which rocked. I can wholeheartedly recommend it.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;After about 60 minutes of my time and the parting of $29.95, I had electronically submitted my federal tax papers and printed a copy of my Massachusetts tax papers for snailmail submission (for some reason, the Mass papers couldn&amp;#8217;t be submitted electronically).&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;One really funny question during filling out forms and answering questions in Turbotax (btw, the UI wasn&amp;#8217;t that bad actually), was whether I wanted to pay &lt;a href="http://www.massdor.com/help/guides/abate_amend/Personal/issues/optionaltaxrate.htm"&gt;the optional 5.85%&lt;/a&gt; instead of the ordinary 5.3% Massachusetts income tax. TurboTax said that it was unclear why one would want to do that (go figure), so I opted for no. I later found some &lt;a href="http://www.mwilliams.info/archives/004242.php"&gt;rather funny commentary&lt;/a&gt; on the subject &lt;img src='http://blog.fubar.dk/wp-images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&gt; . Anyway, the bottom line is that I&amp;#8217;m getting about 70% of my US taxes paid in 2004 back. w00t!&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Now to look into sorting out my Danish tax filings. Not so w00t!&lt;br/&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-738744600586291698?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/738744600586291698/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2005/04/taxes.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/738744600586291698'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/738744600586291698'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2005/04/taxes.html' title='Taxes'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-8863828640654213156</id><published>2005-03-29T16:57:00.000-05:00</published><updated>2010-04-19T20:21:57.656-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Fun'/><title type='text'>The Office, American style (!)</title><content type='html'>&lt;p&gt;I was just channel surfing and ended up on NBC and found an &lt;a href="http://www.nbc.com/The_Office/"&gt;American remake&lt;/a&gt; of the &lt;a href="http://www.bbc.co.uk/comedy/theoffice/"&gt;totally rad BBC original&lt;/a&gt;.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;I didn&amp;#8217;t like it much and &lt;a href="http://entertainmentcomplex.blognation.us/blog/_archives/2005/3/24/476993.html"&gt;neither did this guy&lt;/a&gt;; in fact, to get this out of my system, I had to put one of my BBC Office DVD&amp;#8217;s on &lt;img src='http://blog.fubar.dk/wp-images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&gt;&lt;br/&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-8863828640654213156?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/8863828640654213156/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2005/03/office-american-style.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/8863828640654213156'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/8863828640654213156'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2005/03/office-american-style.html' title='The Office, American style (!)'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-4445794876178284808</id><published>2005-03-28T11:58:00.000-05:00</published><updated>2010-04-19T20:21:57.646-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Fun'/><title type='text'>DOOM3</title><content type='html'>&lt;p&gt;Had Friday off, so I picked up a copy of &lt;a href="http://www.doom3.com/"&gt;DOOM3&lt;/a&gt;. On Sunday evening I completed it after about 25 hours of playing (with almost no cheating). DOOM3 rocks. That is all.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;In other news I wondered this morning what the proper Danish translation of &amp;#8220;Denial of Service&amp;#8221; is. &lt;a href="http://bitplanet.net"&gt;krh&lt;/a&gt; proposed the word &lt;i&gt;Betjeningsstop&lt;/i&gt; which sounds a bit too funny to me - I&amp;#8217;m sure my good old collegue Martin Koch knows what it is (email me, Martin!).&lt;br/&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-4445794876178284808?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/4445794876178284808/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2005/03/doom3.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/4445794876178284808'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/4445794876178284808'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2005/03/doom3.html' title='DOOM3'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-1483936243492604705</id><published>2005-03-18T11:19:00.000-05:00</published><updated>2010-04-19T20:21:57.639-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>Build System 1 - davidz 0</title><content type='html'>&lt;p&gt;Today most of my time was spent fighting the &lt;a href="https://www.redhat.com/archives/fedora-devel-list/2004-July/msg00729.html"&gt;Build System&lt;/a&gt; and right now it looks like I&amp;#8217;m loosing.&lt;br/&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-1483936243492604705?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/1483936243492604705/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2005/03/build-system-1-davidz-0.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/1483936243492604705'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/1483936243492604705'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2005/03/build-system-1-davidz-0.html' title='Build System 1 - davidz 0'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-3760732876799595219</id><published>2005-03-14T11:35:00.000-05:00</published><updated>2010-04-19T20:21:57.633-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Fun'/><title type='text'>Hot New Stuff</title><content type='html'>&lt;p&gt;Got it delivered today from &lt;a href="http://dwr.com"&gt;Design Within Reach&lt;/a&gt; - they got lots of great stuff&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://blog.fubar.dk/archives/31137_desk.jpg"&gt;&lt;img border="0" alt="31137_desk.jpg" src="http://blog.fubar.dk/archives/31137_desk-thumb.jpg" width="400" height="300" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://blog.fubar.dk/archives/31117_bed.jpg"&gt;&lt;img border="0" alt="31117_bed.jpg" src="http://blog.fubar.dk/archives/31117_bed-thumb.jpg" width="400" height="300" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Next time I&amp;#8217;ll carefully read the details when it says &lt;i&gt;some assembly required&lt;/i&gt; - my hands are all worn out (from the assembly, that is :-8).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-3760732876799595219?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/3760732876799595219/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2005/03/hot-new-stuff.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/3760732876799595219'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/3760732876799595219'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2005/03/hot-new-stuff.html' title='Hot New Stuff'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-5944112582424625256</id><published>2005-03-08T15:52:00.000-05:00</published><updated>2010-04-19T20:21:57.626-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Politics'/><title type='text'>More Banana Republic coverage</title><content type='html'>&lt;p&gt;Here is &lt;a href="http://img125.exs.cx/img125/771/luxembourg9cu.jpg"&gt;a less sober take&lt;/a&gt; on the recent democratic developments in Europe. &lt;/p&gt;&lt;br/&gt;	&lt;p&gt;However. I&amp;#8217;m not happy about this development at all. People should care more about freedom  and the fundamental values of our society instead of just caring about themselves and the next reality show on the telly (that&amp;#8217;s one for you Joey Punchclock!). Because, before they know it, they&amp;#8217;ll have to pay a tax to some big corporation in the northwestern part of the United States to even watch TV.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Just like they do today to be able to exchange documents with the rest of the world.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Someone please explain how this is freedom.&lt;br/&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-5944112582424625256?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/5944112582424625256/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2005/03/more-banana-republic-coverage.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/5944112582424625256'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/5944112582424625256'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2005/03/more-banana-republic-coverage.html' title='More Banana Republic coverage'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-1959920557359601649</id><published>2005-03-07T17:26:00.000-05:00</published><updated>2010-04-19T20:21:57.618-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Politics'/><title type='text'>Banana Republic</title><content type='html'>&lt;p&gt;We Europeans should be ashamed of ourselves. &lt;br/&gt;&lt;br/&gt;&lt;a href="http://demo.ffii.org/"&gt;&lt;img src="http://demo.ffii.org/cons0503/banners/Banner1-500x112.jpg" width="500" height="112" border="0" /&gt;&lt;/a&gt;&lt;br/&gt; &lt;br/&gt;Sod it.&lt;br/&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-1959920557359601649?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/1959920557359601649/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2005/03/banana-republic.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/1959920557359601649'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/1959920557359601649'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2005/03/banana-republic.html' title='Banana Republic'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-2788549500352636389</id><published>2005-03-06T12:34:00.000-05:00</published><updated>2010-04-19T20:21:57.608-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Fun'/><title type='text'>Earthquake</title><content type='html'>&lt;p&gt;I could actually feel the &lt;a href="http://www.news24.com/News24/World/News/0,,2-10-1462_1672252,00.html"&gt;Quebec earthquake&lt;/a&gt; last night down here in Massachusetts. It was about 1.30am and like someone was knocking on the closet door and the train was driving by. I couldn&amp;#8217;t hear any train noise and there was nothing in my closet except for a suitcase leaning against the door. Scary. When I checked the news today it all started to make sense.&lt;br/&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-2788549500352636389?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/2788549500352636389/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2005/03/earthquake.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/2788549500352636389'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/2788549500352636389'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2005/03/earthquake.html' title='Earthquake'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-4789851614984087945</id><published>2005-02-27T07:27:00.000-05:00</published><updated>2010-04-19T20:21:57.593-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>Native Eclipse</title><content type='html'>&lt;p&gt;I just got the 100% native eclipse from &lt;a href="https://www.redhat.com/archives/fedora-test-list/2005-January/msg00481.html"&gt;Rawhide&lt;/a&gt; up and running. It&amp;#8217;s using &lt;a href="http://gcc.gnu.org/java/"&gt;gcj4&lt;/a&gt;, a 100% free and open source software stack which means that it can actually be shipped with Fedora since all other viable &lt;a href="http://en.wikipedia.org/wiki/Java_platform"&gt;Java platforms&lt;/a&gt; are &lt;a href="http://www.gnu.org/philosophy/java-trap.html"&gt;non-free&lt;/a&gt;.&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://blog.fubar.dk/archives/100-percent-native-eclipse-1.png"&gt;&lt;img alt="100-percent-native-eclipse-1.png" src="http://blog.fubar.dk/archives/100-percent-native-eclipse-1-thumb.png" width="400" height="300" /&gt;&lt;/a&gt;&lt;br/&gt; &lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;br/&gt;&lt;i&gt;Writing a GNOME application in Java&lt;/i&gt;&lt;br/&gt; &lt;/p&gt;&lt;br/&gt;	&lt;p&gt;The Eclipse RPM&amp;#8217;s themselves are compiled natively to i386 code so it feels very snappy since there is no bytecode interpreter in place. However, gcj does provide both a bytecode compiler as well as a bytecode interpreter - it&amp;#8217;s a full Java 1.4.2 platform. I&amp;#8217;m using the 3.1.0 M5 RPM&amp;#8217;s from &lt;a href="http://overholt.ca/"&gt;Andrew Overholt&lt;/a&gt; - he told me last week at FUDCon that the &lt;a href="http://www.eclipse.org/cdt/"&gt;CDT (C/C++ Development Tools)&lt;/a&gt; would hit Rawhide soon. Also check out Andrew&amp;#8217;s &lt;a href="http://overholt.ca/wp/index.php?p=11"&gt;Java-GNOME/Eclipse demo&lt;/a&gt; - it&amp;#8217;s totally sweet (requires Flash).&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://blog.fubar.dk/archives/100-percent-native-eclipse-2.png"&gt;&lt;img alt="100-percent-native-eclipse-2.png" src="http://blog.fubar.dk/archives/100-percent-native-eclipse-2-thumb.png" width="400" height="300" /&gt;&lt;/a&gt;&lt;br/&gt; &lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;br/&gt;&lt;i&gt;GTK 2.6 provides excellent platform integration&lt;/i&gt;&lt;br/&gt; &lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Free Java has come a long way.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-4789851614984087945?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/4789851614984087945/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2005/02/native-eclipse.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/4789851614984087945'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/4789851614984087945'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2005/02/native-eclipse.html' title='Native Eclipse'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-5898643030052641422</id><published>2005-02-25T07:06:00.000-05:00</published><updated>2010-04-19T20:21:57.585-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Fun'/><title type='text'>Gejsten, Hunter S. Thompson and Nirvana</title><content type='html'>&lt;p&gt;I&amp;#8217;m happy to see that &lt;a href="http://gejsten.dk/mt/index.html"&gt;GEJSTEN.DK&lt;/a&gt; is back online - if you understand Danish you don&amp;#8217;t want to miss this. In other news, is it just my brain playing with me or does the radios play a lot more &lt;a href="http://www.nirvana-music.com/"&gt;Nirvana&lt;/a&gt; now that &lt;a href="http://edition.cnn.com/2005/SHOWBIZ/books/02/21/thompson.obit/"&gt;Hunter S. Thompson&lt;/a&gt; also shot himself in the head? I&amp;#8217;ve heard like three Nirvana tracks on the radio this week. Maybe it&amp;#8217;s just inside my head though.&lt;br/&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-5898643030052641422?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/5898643030052641422/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2005/02/gejsten-hunter-s-thompson-and-nirvana.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/5898643030052641422'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/5898643030052641422'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2005/02/gejsten-hunter-s-thompson-and-nirvana.html' title='Gejsten, Hunter S. Thompson and Nirvana'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-3973244555533558113</id><published>2005-02-20T17:38:00.000-05:00</published><updated>2010-04-19T20:21:57.579-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Fun'/><title type='text'>Busy week and finger prints</title><content type='html'>&lt;p&gt;Had a busy schedule last week; went to &lt;a href="http://www.linuxworldexpo.com/live/12/events/12BOS05A"&gt;Linux World&lt;/a&gt; here in Beantown on Tuesday and then &lt;a href="http://fedoraproject.org/fudcon/"&gt;FUDCON&lt;/a&gt; at Boston University on Friday. Got pretty well wasted with the desktop crew at a bar in Boston Friday evening. Neat.&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;img alt="not-a-fingerprint.png" src="http://blog.fubar.dk/archives/not-a-fingerprint.png" width="128" height="128" /&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;i&gt;Captured with my shiny new driver&lt;/i&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Spent most of today hacking on a driver for the &lt;a href="http://www.apc.com/resource/include/techspec_index.cfm?base_sku=BIOPOD"&gt;APC Biopod&lt;/a&gt; that I &lt;a href="http://blog.fubar.dk/archives/2004/10/a_night_out_in.html"&gt;mentioned earlier&lt;/a&gt;. I actually managed to find &lt;a href="http://www.authentec.com/products/docs/2089-12-AES4000ProdSpec.pdf"&gt;detailed specs&lt;/a&gt; and, with some help from &lt;a href="http://usbsnoop.sourceforge.net/"&gt;usbsnoop&lt;/a&gt;, I wrote a quick one-off user space driver using &lt;a href="http://libusb.sourceforge.net/"&gt;libusb&lt;/a&gt;. Happy about that; been wanting to get this device to work for a long time and now I just need to clean things up.. and decide whether it should be a kernel or user mode driver. Then to find some good finger print verification software; &lt;a href="http://ffpis.sourceforge.net/"&gt;this&lt;/a&gt; looks like a good starting point. I&amp;#8217;m afraid getting all the pieces done in a nice way (e.g. integration with &lt;a href="http://live.gnome.org/GnomeLove_2fGnomeKeyringManager"&gt;GNOME Keyring&lt;/a&gt;) will require major work (finger enrollment, UI, &lt;a href="http://www.kernel.org/pub/linux/libs/pam/"&gt;PAM stuff&lt;/a&gt; etc.). Still, sounds like a fun project to do on the side. And it would be awesome to have this in Fedora.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-3973244555533558113?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/3973244555533558113/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2005/02/busy-week-and-finger-prints.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/3973244555533558113'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/3973244555533558113'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2005/02/busy-week-and-finger-prints.html' title='Busy week and finger prints'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-519747457511209506</id><published>2005-02-16T17:49:00.000-05:00</published><updated>2010-04-19T20:21:57.574-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Fun'/><category scheme='http://www.blogger.com/atom/ns#' term='Politics'/><title type='text'>World Map</title><content type='html'>&lt;p&gt;Heh, even after a little more than four months &lt;a href="http://www.ci.somerville.ma.us/"&gt;over here&lt;/a&gt;, I found &lt;a href="http://www.cousinsofthemoose.ca/places/canuckthings/world%20map.gif"&gt;this&lt;/a&gt; quite amusing &lt;img src='http://blog.fubar.dk/wp-images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&gt;&lt;br/&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-519747457511209506?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/519747457511209506/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2005/02/world-map.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/519747457511209506'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/519747457511209506'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2005/02/world-map.html' title='World Map'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-5383357762674217024</id><published>2005-02-13T08:42:00.000-05:00</published><updated>2010-04-19T20:21:57.568-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Fun'/><title type='text'>New Car Stereo</title><content type='html'>&lt;p&gt;I got off my ass today, to buy a new car stereo.&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://blog.fubar.dk/archives/sony-cdx-f700.jpg"&gt;&lt;img alt="sony-cdx-f700.jpg" src="http://blog.fubar.dk/archives/sony-cdx-f700-thumb.jpg" width="300" height="92" /&gt;&lt;/a&gt; &lt;br/&gt;&lt;i&gt;Cracktastic, isn&amp;#8217;t it?&lt;/i&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;It&amp;#8217;s a &lt;a href="http://www.crutchfield.com/S-XkkGa5I2QZy/cgi-bin/ProdView.asp?g=62700&amp;#38;id=essential_info&amp;#38;i=158F7700"&gt;Sony CDX-F700&lt;/a&gt;. It passes the davidz checklist:&lt;/p&gt;&lt;br/&gt;	&lt;ul&gt;&lt;br/&gt;	&lt;li&gt;Detachable front to deter &lt;a href="http://blog.fubar.dk/archives/2004/11/sod_it.html"&gt;stupid pricks from breaking into my car&lt;/a&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;Ability to hook-up my &lt;a href="http://www.usatoday.com/tech/columnist/edwardbaig/2004-03-10-baig_x.htm"&gt;ohh-so-stylish iPod Mini&lt;/a&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;Plays MP3 CD/CD-R/CD-RW. Maybe even regular Audio CD&amp;#8217;s as well..&lt;/li&gt;&lt;br/&gt;	&lt;/ul&gt;&lt;br/&gt;	&lt;p&gt;It also got a lot of cracktastic features like a remote control (uhm, right, so &lt;a href="http://onyx.he.net/~hotmoves/LIC/rap"&gt;the girlfriend in the trunk&lt;/a&gt; can change the tunes) and other stuff I&amp;#8217;m almost certain that I wont need. &lt;/p&gt;&lt;br/&gt;	&lt;p&gt;It&amp;#8217;s getting installed on Tuesday night, so I&amp;#8217;m a happy man.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-5383357762674217024?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/5383357762674217024/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2005/02/new-car-stereo.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/5383357762674217024'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/5383357762674217024'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2005/02/new-car-stereo.html' title='New Car Stereo'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-7019640683273501990</id><published>2005-02-08T15:10:00.000-05:00</published><updated>2010-04-19T20:21:57.562-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>Google does it again</title><content type='html'>&lt;p&gt;&lt;a href="http://maps.google.com"&gt;Google Maps&lt;/a&gt; &lt;i&gt;Just Works™&lt;/i&gt;.&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://maps.google.com/maps?q=25%20webster%20ave%2C%2002143&amp;#38;ll=42.269409%2C-71.054249&amp;#38;spn=0.037781%2C0.058375"&gt;&lt;img alt="google-maps.png" src="http://blog.fubar.dk/archives/google-maps-thumb.png" width="400" height="300" /&gt;&lt;/a&gt;  &lt;br/&gt;&lt;i&gt;davidz&amp;#8217;s place - click to go to Google Maps&lt;/i&gt; &lt;/p&gt;&lt;br/&gt;	&lt;p&gt;That is all.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-7019640683273501990?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/7019640683273501990/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2005/02/google-does-it-again.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/7019640683273501990'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/7019640683273501990'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2005/02/google-does-it-again.html' title='Google does it again'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-5519640882282497669</id><published>2005-02-06T11:12:00.000-05:00</published><updated>2010-04-19T20:21:57.554-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Fun'/><title type='text'>Superbowl</title><content type='html'>&lt;p&gt;&lt;a href="http://www.gnome.org/~clarkbw/blog/Fun/Super_Bowl"&gt;Bryan&lt;/a&gt;: We got some beer &lt;img src='http://blog.fubar.dk/wp-images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&gt;  &lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://blog.fubar.dk/archives/ready-for-superbowl.jpg"&gt;&lt;img alt="ready-for-superbowl.jpg" src="http://blog.fubar.dk/archives/ready-for-superbowl-thumb.jpg" width="400" height="300" /&gt;&lt;/a&gt; &lt;br/&gt;&lt;i&gt;&lt;b&gt;beer&lt;/b&gt; : n : fermented alcoholic beverage brewed from malt and hops [syn: suds]&lt;/i&gt; &lt;br/&gt; &lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Seems that &lt;a href="http://bitplanet.net/"&gt;krh&lt;/a&gt; is already all excited: &lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://blog.fubar.dk/archives/krh-hacks.jpg"&gt;&lt;img alt="krh-hacks.jpg" src="http://blog.fubar.dk/archives/krh-hacks-thumb.jpg" width="400" height="300" /&gt;&lt;/a&gt; &lt;br/&gt;&lt;i&gt;krh digs &lt;a href="http://xprint.mozdev.org/"&gt;Xprint&lt;/a&gt;&lt;/i&gt; &lt;br/&gt; &lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Now, GO &lt;a href="http://www.patriots.com/"&gt;PATS&lt;/a&gt;.&lt;br/&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-5519640882282497669?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/5519640882282497669/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2005/02/superbowl.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/5519640882282497669'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/5519640882282497669'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2005/02/superbowl.html' title='Superbowl'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-507859868926497052</id><published>2005-01-23T10:51:00.000-05:00</published><updated>2010-04-19T20:21:57.547-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Fun'/><title type='text'>Blizzard Warning</title><content type='html'>&lt;p&gt;It&amp;#8217;s been snowing and then some&lt;/p&gt;&lt;br/&gt;	&lt;p&gt; &lt;br/&gt;&lt;a href="http://blog.fubar.dk/archives/lots-of-snow.jpg"&gt;&lt;img alt="lots-of-snow.jpg" src="http://blog.fubar.dk/archives/lots-of-snow-thumb.jpg" width="400" height="533" /&gt;&lt;/a&gt; &lt;br/&gt;&lt;i&gt;Right now there&amp;#8217;s a pause but it ain&amp;#8217;t over till the fat lady sings&lt;/i&gt;&lt;br/&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Check also the blog entries from &lt;a href="http://nat.org/2005/january/#23-January-2005"&gt;Nat&lt;/a&gt; and &lt;a href="http://joeshaw.org/#20050125"&gt;Joe&lt;/a&gt; for more action packed pictures.&lt;br/&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-507859868926497052?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/507859868926497052/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2005/01/blizzard-warning.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/507859868926497052'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/507859868926497052'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2005/01/blizzard-warning.html' title='Blizzard Warning'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-1149229999417379592</id><published>2005-01-22T20:50:00.000-05:00</published><updated>2010-04-19T20:21:57.522-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>Re: Applications instead of Commands</title><content type='html'>&lt;p&gt;&lt;a href="http://www.gnome.org/~fherrera/blog/"&gt;Fernando&lt;/a&gt; writes &lt;a href="http://www.gnome.org/~fherrera/blog//Applications_instead_of_commands"&gt;about&lt;/a&gt; improving the &lt;tt&gt;gnome-volume-manager&lt;/tt&gt; capplet interface and I think everyone agrees that it&amp;#8217;s needed - the current behaviour with asking for a command line is a bug. A severe one indeed. What I don&amp;#8217;t like, however, is the suggestion of mixing MIME types into the picture.&lt;br/&gt;	&lt;p&gt;When you look at it, what &lt;tt&gt;g-v-m&lt;/tt&gt; provides is really a way to configure what your desktop does when certain system-wide events happen, while a MIME type is used to describe content, be that a message, file or whatever (sure, some of the heads on &lt;a href="http://lists.freedesktop.org/mailman/listinfo/xdg"&gt;xdg@fd.o&lt;/a&gt; will disagree and say that MIME can used for anything). Whatever.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;In the future I&amp;#8217;m pretty sure we want to expand on what actions to take when system-wide events happen; for instance there should be some way of saying &amp;#8220;Start Rhythmbox&amp;#8221; or &amp;#8220;Start JuK&amp;#8221; when a music player is attached and I&amp;#8217;m pretty sure we don&amp;#8217;t want to invent a MIME type &lt;tt&gt;device/audio-player&lt;/tt&gt;.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;There&amp;#8217;s also the &amp;#8220;action&amp;#8221; aspect involved; you want to do different things when a device is attached versus removed.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;It looks to me like the best solution for this involves extending the fd.o &lt;a href="http://standards.freedesktop.org/desktop-entry-spec/desktop-entry-spec-0.9.4.html"&gt;desktop entry specification&lt;/a&gt;. One way of doing this would be to add appropriate sections&lt;/p&gt;&lt;br/&gt;	&lt;pre&gt;&lt;br/&gt;[System Action MediaAudioDiscInserted]&lt;br/&gt;Exec=gnome-cd %f&lt;br/&gt;&lt;br/&gt;[System Action MediaDVDDiscInserted]&lt;br/&gt;Exec=totem %f&lt;br/&gt;&lt;br/&gt;[System Action MediaPhotoMediaInserted]&lt;br/&gt;Exec=nautilus %f&lt;br/&gt;&lt;br/&gt;[System Action DeviceCameraInserted]&lt;br/&gt;Exec=gthumb %h&lt;br/&gt;&lt;/pre&gt;&lt;br/&gt;	&lt;p&gt;Note that the %h parameter is the HAL UDI which is a unique ID representing the device; this is not needed for the &lt;tt&gt;Media*&lt;/tt&gt; system actions. To get rid of the HAL dependency and provide interoperability with software not ported to HAL, this could be extended to&lt;/p&gt;&lt;br/&gt;	&lt;pre&gt;&lt;br/&gt;[System Action DeviceFooInserted]&lt;br/&gt;ExecHAL=my-app --hal-udi %h&lt;br/&gt;ExecDeviceFile=my-app --device-file %d&lt;br/&gt;ExecPath=my-app --fs-path %f&lt;br/&gt;&lt;/pre&gt;&lt;br/&gt;	&lt;p&gt;and the launcher (e.g. &lt;tt&gt;g-v-m&lt;/tt&gt;) would select the appropriate one. The order of the Exec lines would matter if more than one parameter is available.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-1149229999417379592?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/1149229999417379592/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2005/01/re-applications-instead-of-commands.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/1149229999417379592'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/1149229999417379592'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2005/01/re-applications-instead-of-commands.html' title='Re: Applications instead of Commands'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-2918798532409648389</id><published>2005-01-22T06:40:00.000-05:00</published><updated>2010-04-19T20:21:57.515-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>KDE 3.4 with HAL backend</title><content type='html'>&lt;p&gt;I might have been the last person to notice this, but it seems that KDE 3.4 will have a &lt;a href="http://www.archivum.info/kde-core-devel@kde.org/2004-12/msg00290.html"&gt;HAL backend&lt;/a&gt; for discovery of storage device much like the patch I got into GNOME VFS last year. Rock on.&lt;br/&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-2918798532409648389?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/2918798532409648389/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2005/01/kde-34-with-hal-backend.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/2918798532409648389'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/2918798532409648389'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2005/01/kde-34-with-hal-backend.html' title='KDE 3.4 with HAL backend'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-6020021422932728880</id><published>2005-01-20T18:18:00.000-05:00</published><updated>2010-04-19T20:21:57.502-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>Shameless Plug + Happy Bday</title><content type='html'>&lt;p&gt;If you&amp;#8217;re wondering what I&amp;#8217;m working on, &lt;a href="http://www.redhat.com/magazine/003jan05/features/hal/"&gt;here&lt;/a&gt; is an article I wrote for &lt;a href="http://www.redhat.com/magazine/"&gt;Red Hat Magazine&lt;/a&gt;. Also check out the other goodies in that issue.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;On another note: Happy Birthday, mom!&lt;br/&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-6020021422932728880?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/6020021422932728880/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2005/01/shameless-plug-happy-bday.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/6020021422932728880'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/6020021422932728880'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2005/01/shameless-plug-happy-bday.html' title='Shameless Plug + Happy Bday'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-5996751235451151897</id><published>2005-01-12T09:39:00.000-05:00</published><updated>2010-04-19T20:21:57.496-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Fun'/><title type='text'>64-bit Living Room</title><content type='html'>&lt;p&gt;Got my furniture today! &lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://blog.fubar.dk/archives/living_room_1.jpg"&gt;&lt;img alt="living_room_1.jpg" src="http://blog.fubar.dk/archives/living_room_1-thumb.jpg" width="400" height="300" /&gt;&lt;/a&gt; &lt;br /&gt; &lt;i&gt;Yay!&lt;/i&gt; &lt;br/&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://blog.fubar.dk/archives/living_room_2.jpg"&gt;&lt;img alt="living_room_2.jpg" src="http://blog.fubar.dk/archives/living_room_2-thumb.jpg" width="400" height="300" /&gt;&lt;/a&gt; &lt;br /&gt; &lt;i&gt;Check out the foot rest - that&amp;#8217;s also on the Love Seat&lt;/i&gt; &lt;br/&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://blog.fubar.dk/archives/living_room_3.jpg"&gt;&lt;img alt="living_room_3.jpg" src="http://blog.fubar.dk/archives/living_room_3-thumb.jpg" width="400" height="300" /&gt;&lt;/a&gt; &lt;br /&gt; &lt;i&gt;The glass table I blogged about earlier&lt;/i&gt; &lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;On Sunday, I also picked up a new 64-bit system. It&amp;#8217;s a &lt;a href="http://www.shopping.hp.com/webapp/shopping/computer_series.do?series_name=m1050e_series&amp;#38;catLevel=2&amp;#38;category=desktops/media_center&amp;#38;storeName=computer_store"&gt;HP Media Center Photosmart PC&lt;/a&gt;. &lt;/p&gt;&lt;br/&gt;	&lt;p&gt;&lt;br/&gt;&lt;a href="http://blog.fubar.dk/archives/64_bit.jpg"&gt;&lt;img alt="living_room_1.jpg" src="http://blog.fubar.dk/archives/64_bit-thumb.jpg" width="400" height="300" /&gt;&lt;/a&gt; &lt;br/&gt;&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;It came with &lt;a href="http://www.microsoft.com/windowsxp/mediacenter/default.mspx"&gt;Windows XP Media Center Edition 2005&lt;/a&gt; which is kind of cute (spiffy and smooth animations) and a boatload of OEM software. If people think that most usable Linux distros are like &lt;i&gt;Frankenstein&lt;/i&gt;, e.g. various different UI pieces thrown together in a hurry, try this - it&amp;#8217;s so craptastic; will post a screenshot later. Ended up installed the &lt;tt&gt;x86_64&lt;/tt&gt; version of Fedora Core 3 to have a real 64-bit operating system.&lt;br/&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-5996751235451151897?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/5996751235451151897/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2005/01/64-bit-living-room.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/5996751235451151897'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/5996751235451151897'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2005/01/64-bit-living-room.html' title='64-bit Living Room'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-1024360788449892180</id><published>2005-01-08T13:48:00.000-05:00</published><updated>2010-04-19T20:21:57.488-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Fun'/><title type='text'>Snow and Furniture</title><content type='html'>&lt;p&gt;Went up to &lt;a href="http://www.ci.nashua.nh.us/"&gt;Nashua, NH&lt;/a&gt; today. Just after I left it started snowing which meant that it took 80 minutes rather than 45 minutes to get there. Driving conditions were terrible, I saw at least four cars parked on the shoulder, all out of commision.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Went to Furniture World and spent around $1700 on a &lt;a href="http://www.dict.org/bin/Dict?Form=Dict2&amp;#38;Database=*&amp;#38;Query=love+seat"&gt;Love Seat&lt;/a&gt; and a matching &lt;a href="http://www.dict.org/bin/Dict?Form=Dict2&amp;#38;Database=*&amp;#38;Query=recliner"&gt;Recliner&lt;/a&gt;. Both in a contemporary green/grey colour (or at least that what&amp;#8217;s the nice girl in the store said). Man, a European has to get to used to the American language. Also picked up a cocktail table in glass with a &lt;i&gt;fossil stone base&lt;/i&gt; (sic) -   the table is a bit &amp;#8220;I don&amp;#8217;t know&amp;#8221;, not sure yet it that was a good purchase though I&amp;#8217;m sure &lt;a href="http://www.crazymofo.com/mofos/archives/000461.shtml"&gt;Pat Bateman&lt;/a&gt; would approve &lt;img src='http://blog.fubar.dk/wp-images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&gt; . We&amp;#8217;ll see.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;The Goods are being delivered on Wednesday, I can&amp;#8217;t wait, it&amp;#8217;s beginning to get kind of creepy not having any furniture (except for the &lt;a href="http://www.westinghousedigital.com/products/prod-30dvi.shtml"&gt;telly&lt;/a&gt; and the &lt;a href="http://www.us.playstation.com/consoles.aspx?id=3"&gt;slim PS2&lt;/a&gt; that I got within a week of moving in - good for a man to have his priorities straight). That brings my short list of furniture yet to acquire down to: Futon, Desk, Bed, Dining table, AMD64 Shuttle, Misc Items. Oh well, the AMD64 Shuttle isn&amp;#8217;t exactly furniture but, hey, it&amp;#8217;s all the same budget &lt;img src='http://blog.fubar.dk/wp-images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /&gt; &lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Off to dinner at the &lt;a href="http://www.mideastclub.com/"&gt;Middle East&lt;/a&gt; (very good food, been there once before) and then some Karaoke later on.&lt;br/&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-1024360788449892180?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/1024360788449892180/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2005/01/snow-and-furniture.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/1024360788449892180'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/1024360788449892180'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2005/01/snow-and-furniture.html' title='Snow and Furniture'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-1482661625023031493</id><published>2005-01-01T14:51:00.000-05:00</published><updated>2010-04-19T20:21:57.481-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Travelling'/><title type='text'>Back in Beantown</title><content type='html'>&lt;p&gt;After 8 days of vacation in the &lt;a href="http://www.cia.gov/cia/publications/factbook/geos/da.html"&gt;old country&lt;/a&gt;, I&amp;#8217;m now safely back in lovely &lt;a href="http://www.ci.somerville.ma.us/"&gt;Somerville&lt;/a&gt;. Refreshed and ready for a smashing 2005, hope it will be less disruptive than 2004.&lt;/p&gt;&lt;br/&gt;	&lt;p&gt;Happy new year to everyone!&lt;br/&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-1482661625023031493?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/1482661625023031493/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2005/01/back-in-beantown.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/1482661625023031493'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/1482661625023031493'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2005/01/back-in-beantown.html' title='Back in Beantown'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-5904228848833143382</id><published>2004-12-20T16:26:00.000-05:00</published><updated>2010-04-19T20:21:57.475-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Fun'/><title type='text'>I’m portable</title><content type='html'>&lt;p&gt;&lt;br/&gt;&amp;lt;img src=&amp;quot;http://www.bbspot.com/Images/News_Features/2004/10/file_extensions/pdf.jpg&amp;quot; width=&amp;quot;300&amp;quot; height=&amp;quot;90&amp;quot;&lt;br/&gt;border="0" alt="You are .pdf  No matter where you go you look the same.  You are an acrobat.  Nothing is more important to you than the printed word."/&amp;gt;&lt;br/&gt;&lt;br /&gt;&lt;a href="http://www.bbspot.com/News/2004/10/extension_quiz.php"&gt;&lt;br/&gt;Which File Extension are You?&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-5904228848833143382?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/5904228848833143382/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2004/12/im-portable.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/5904228848833143382'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/5904228848833143382'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2004/12/im-portable.html' title='I’m portable'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5268847417417953349.post-7148588189936744933</id><published>2004-12-20T12:06:00.000-05:00</published><updated>2010-04-19T20:21:57.467-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>The Almighty Buck</title><content type='html'>&lt;p&gt;&lt;a href="http://www.computerworld.dk/Default.asp?Mode=2&amp;#38;ArticleID=26457"&gt;Østerbro-firma udvikler spil til tv-imperium&lt;/a&gt; (in danish)&lt;br/&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5268847417417953349-7148588189936744933?l=davidz25.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davidz25.blogspot.com/feeds/7148588189936744933/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://davidz25.blogspot.com/2004/12/almighty-buck.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/7148588189936744933'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5268847417417953349/posts/default/7148588189936744933'/><link rel='alternate' type='text/html' href='http://davidz25.blogspot.com/2004/12/almighty-buck.html' title='The Almighty Buck'/><author><name>davidz</name><uri>http://www.blogger.com/profile/18166813552495508964</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://4.bp.blogspot.com/_3wiFwuY-7mw/S8z_mkP3rhI/AAAAAAAAAAM/VrLItKGNVyY/s1600-R/4389248388_585d330125_o_d.jpg'/></author><thr:total>0</thr:total></entry></feed>
