<?xml version="1.0" encoding="utf-8"?>
<!-- If you are running a bot please visit this policy page outlining rules you must respect. http://www.livejournal.com/bots/ -->
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:lj="http://www.livejournal.com">
  <id>urn:lj:livejournal.com:atom1:cgwalters</id>
  <title>cgwalters</title>
  <subtitle>cgwalters</subtitle>
  <author>
    <name>cgwalters</name>
  </author>
  <link rel="alternate" type="text/html" href="http://cgwalters.livejournal.com/"/>
  <link rel="self" type="text/xml" href="http://cgwalters.livejournal.com/data/atom"/>
  <updated>2009-12-07T16:07:45Z</updated>
  <lj:journal userid="12647998" username="cgwalters" type="personal"/>
  <link rel="service.feed" type="application/x.atom+xml" href="http://cgwalters.livejournal.com/data/atom" title="cgwalters"/>
  <link rel="hub" href="http://pubsubhubbub.appspot.com/"/>
  <entry>
    <id>urn:lj:livejournal.com:atom1:cgwalters:26561</id>
    <link rel="alternate" type="text/html" href="http://cgwalters.livejournal.com/26561.html"/>
    <link rel="self" type="text/xml" href="http://cgwalters.livejournal.com/data/atom/?itemid=26561"/>
    <title>FUDCon Toronto, on the bus</title>
    <published>2009-12-07T16:06:19Z</published>
    <updated>2009-12-07T16:07:45Z</updated>
    <category term="fudcon gnome javascript"/>
    <content type="html">&lt;p&gt;At FUDCon Toronto 2009, finally got a reliable connection at the hack room to give an update.  On the bus from Westford to Toronto, I spent some time optimizing the GNOME Shell JavaScript engine &lt;a href="http://live.gnome.org/Gjs"&gt;Gjs&lt;/a&gt;, specifically how we do invocations from JavaScript into our C core.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;As always, &lt;a href="http://www.daimi.au.dk/~sandmann/sysprof/"&gt;sysprof&lt;/a&gt; is an a great tool, and revealed we had some relatively low-hanging fruit.  (Side note - in Fedora 12, sysprof no longer requires an external kernel module, which is awesome).  Said fruit was partly in Gjs, partly in the GObject Introspection layer.  We could clearly be doing more caching in the latter, but Gjs was also using the basically toy/demo invocation function &lt;tt&gt;g_function_info_invoke&lt;/tt&gt;.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;I've now got it so the invoker can take a bunch of JavaScript &lt;tt&gt;jsval&lt;/tt&gt; pointers, and schlep them more directly into &lt;tt&gt;libffi&lt;/tt&gt; argument types.  The end result is currently a 25% speedup on my benchmark, which is fairly good as far as 5 hours in performance work goes.  I'm now looking at some other bits, and I think I'll be able to squeeze out another 7-10% at least with just another hour or two of work.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Now, in the the farther future, I could imagine teaching &lt;a href="https://developer.mozilla.org/en/SpiderMonkey"&gt;SpiderMonkey&lt;/a&gt;'s JIT compiler about how to invoke directly from JS to C (and the reverse); the amount of generic work we still do to take say a single &lt;tt&gt;double&lt;/tt&gt; across is fairly high, but the JIT could know about the platform ABI, and be able to trace right up until a native method, which would be a large speedup.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;And for now, I'll leave you with a picture of a tasty waffle from this morning:&lt;br /&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/RY6zs3UzfSIIgcRG7vrewA?feat=embedwebsite"&gt;&lt;img src="http://lh3.ggpht.com/_nzsN_mJBCjk/Sx0jG3umi2I/AAAAAAAAB6k/USc1ecqlSlQ/s400/2009-12-07%2008.03.20.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family:arial,sans-serif; font-size:11px; text-align:right"&gt;From &lt;a href="http://picasaweb.google.com/cgwalters/FUDConToronto2009?feat=embedwebsite"&gt;FUDCon Toronto 2009&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:cgwalters:26125</id>
    <link rel="alternate" type="text/html" href="http://cgwalters.livejournal.com/26125.html"/>
    <link rel="self" type="text/xml" href="http://cgwalters.livejournal.com/data/atom/?itemid=26125"/>
    <title>Netbook in the coal mine</title>
    <published>2009-12-02T21:52:37Z</published>
    <updated>2009-12-02T22:10:24Z</updated>
    <category term="gnome"/>
    <category term="gnome-shell"/>
    <content type="html">&lt;p&gt;For a long time my primary workstation was a (now 3 year old) &lt;a href="http://www.pcworld.com/reviews/product/28299/review/inspiron_e1705.html"&gt;Dell Inspiron E1705&lt;/a&gt;, or "bricktop" as &lt;a href="http://ajaxxx.livejournal.com/"&gt;ajax&lt;/a&gt; liked to call it.  However the hinge broke a while ago when I closed my car door while the bag was too close, and when the laptop started to fall apart I decided to get a new machine.  Actually, I got two.  The first thing I did was get a serious desktop computer, a &lt;a href="http://reviews.cnet.com/Dell_XPS_630/4505-3118_7-32865535.html"&gt;Dell XPS 630&lt;/a&gt;.  It's quite a beast, especially since I got 8GB of RAM with it.  I pretty typically have over 2GB of memory used purely for &lt;a href="http://en.wikipedia.org/wiki/Page_cache"&gt;page cache&lt;/a&gt;, which is probably my entire working set of files.  It's hooked up to a nice 24" Dell 1920x1200 monitor.  This computer is named &lt;b&gt;megatron&lt;/b&gt;.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Needless to say, the machine is fast and nice to use.  However, it's rather unrepresentative of the general personal computing space.  So I wanted another machine that was mobile, and also closer to what "most" people use.  So I picked up a &lt;a href="http://www.laptopmag.com/review/laptops/msi-wind-u123.aspx"&gt;MSI Wind U123&lt;/a&gt;, known as &lt;b&gt;pocket&lt;/b&gt;.  It has just 1GB of RAM, which is probably the realistic minimum we want to support going forward (ideally we'd be workable with 512MB, and we probably are if you're just running one application or one or two websites, but...).  The machine also has an &lt;a href="http://www.intel.com/products/desktop/chipsets/945g/945g-overview.htm"&gt;Intel 945&lt;/a&gt; video, which is also near the lowest end graphics card we'll be supporting for &lt;a href="http://live.gnome.org/GnomeShell"&gt;GNOME Shell&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The difference between the two computers is rather extreme, but I use the netbook very often, and working on it has forced me to optimize some things in the shell.  It serves a similar role for performance issues that &lt;a href="http://en.wikipedia.org/wiki/Animal_sentinels#Canaries_in_coal_mines"&gt;canaries used to do in coal mines&lt;/a&gt; (hence the title of this post). Specifically, I've been working on &lt;a href="https://bugzilla.gnome.org/show_bug.cgi?id=603523"&gt;search performance&lt;/a&gt;, with fairly good results.  We had a few sillies in the old search system like creating lots and lots of &lt;a href="http://clutter-project.org/docs/clutter/stable/ClutterActor.html"&gt;ClutterActor&lt;/a&gt;s we'd never display, not caching lowercased strings, etc. (the other goal by the way of my search work is to move us closer to the current &lt;a href="http://www.gnome.org/~mccann/shell/mockups/20091114/shell-mockup-overview-search.png"&gt;search mockup&lt;/a&gt;, which should be cool).&lt;/p&gt;&lt;br /&gt;&lt;p&gt;But the biggest performance problem I've been running into so far is &lt;i&gt;synchronous I/O&lt;/i&gt;.  A lot of GNOME libraries like &lt;a href="http://git.gnome.org/cgit/gnome-menus"&gt;gnome-menus&lt;/a&gt; were designed for &lt;tt&gt;gnome-panel&lt;/tt&gt;, which typically you don't interact with often, and so it's not a big deal if the process is blocked.  However if the shell is blocked, because we're acting as a compositor, we won't repaint the desktop or process input, which is a serious user experience problem.  An example of this was that we would synchronously &lt;tt&gt;stat&lt;/tt&gt; (check for existence) of recent documents; this could easily take several hundred milliseconds if the data isn't currently in the kernel cache.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;I've been reworking our docs handling specifically to be smarter; we use &lt;a href="http://library.gnome.org/devel/gio/unstable/GFile.html#g-file-query-info-async"&gt;async I/O&lt;/a&gt; now, and only &lt;tt&gt;stat&lt;/tt&gt; ones we're actually going to show in the UI.  We could be smarter still, but this has helped a lot.  GIO has really nice APIs for this kind of thing.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;I mention this for two reasons; first, just because you might be interested in a status update on Shell work.  The second is because I'm hoping to Real Soon Now land my &lt;a href="https://bugzilla.gnome.org/show_bug.cgi?id=599661"&gt;extension system patch&lt;/a&gt;, so if you &lt;a href="http://live.gnome.org/GnomeShell/Extensions"&gt;create an extension&lt;/a&gt; using it, for a good user experience, you'll need to be very careful about I/O too =)&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:cgwalters:26057</id>
    <link rel="alternate" type="text/html" href="http://cgwalters.livejournal.com/26057.html"/>
    <link rel="self" type="text/xml" href="http://cgwalters.livejournal.com/data/atom/?itemid=26057"/>
    <title>It's coming</title>
    <published>2009-10-13T03:36:59Z</published>
    <updated>2009-10-13T03:37:37Z</updated>
    <content type="html">&lt;p&gt;GNOME Summit went really well, and I had a great time.  One thing that I was really heartened to see is that we've agreed on a &lt;a href="http://jasondclinton.livejournal.com/76020.html"&gt;GLib/dbus&lt;/a&gt; plan, and this will enable a number of cool things.  First, dbus-glib is just not very good, and we've needed a better story.  I hadn't realized before just how much nicer GVariant can make doing DBus calls. But beyond that, having DBus underneath the GTK+ stack will better unlock things like &lt;tt&gt;GApplication&lt;/tt&gt; which will in turn let us do nifty things like exporting &lt;a href="http://library.gnome.org/devel/gtk/unstable/GtkAction.html"&gt;GtkAction&lt;/a&gt; over the bus.  If that's still a bit abstract, look at say Stuart Langridge's post on &lt;a href="http://www.kryogenix.org/days/2009/02/08/linglish-or-some-thoughts-on-a-scripting-language-for-the-linux-desktop"&gt;Linglish&lt;/a&gt;.&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:cgwalters:25818</id>
    <link rel="alternate" type="text/html" href="http://cgwalters.livejournal.com/25818.html"/>
    <link rel="self" type="text/xml" href="http://cgwalters.livejournal.com/data/atom/?itemid=25818"/>
    <title>Pay no attention to the processes and X Windows behind the curtain...</title>
    <published>2009-09-02T00:06:46Z</published>
    <updated>2009-09-03T14:29:28Z</updated>
    <category term="gnome"/>
    <category term="gnome-shell"/>
    <content type="html">&lt;p&gt;A major change we're trying in the GNOME 3 Shell is to be application-based instead of window-based.  In this we'll be in good company with newer releases of other operating systems, but it's still a major change.  What I want to explain in this blog entry is what that means from a user perspective.  For the developer perspective, see &lt;a href="http://live.gnome.org/GnomeShell/ApplicationBased"&gt;this wiki page&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Let's first look at one of the most venerable (and yet apparently still obligatory) applications, the Calculator.  In GNOME 2, launching the calculator looks like this:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;center&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/qSo4NvYa53zFoB4_eAcoPQ?feat=embedwebsite"&gt;&lt;img src="http://lh6.ggpht.com/_nzsN_mJBCjk/Sp10lxPVCPI/AAAAAAAAB08/bYCpl446p_w/s800/gnome2-calculator-launching.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family:arial,sans-serif; font-size:11px; text-align:right"&gt;From &lt;a href="http://picasaweb.google.com/cgwalters/GNOMEShell?feat=embedwebsite"&gt;GNOME Shell&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br&gt;&lt;i&gt;Launching Calculator&lt;/i&gt;&lt;/center&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;When we click on that menu entry, the application is started (for more details about under the hood, see the linked wiki page above).  The visual result is this:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;center&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/g97XQDscvWFApNQ0kGJ3Dg?feat=embedwebsite"&gt;&lt;img src="http://lh5.ggpht.com/_nzsN_mJBCjk/Sp10mGqbMII/AAAAAAAAB1A/hI-vBiEKSxc/s800/gnome2-calculator-running.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family:arial,sans-serif; font-size:11px; text-align:right"&gt;From &lt;a href="http://picasaweb.google.com/cgwalters/GNOMEShell?feat=embedwebsite"&gt;GNOME Shell&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br&gt;&lt;i&gt;Calculator and the window list entry&lt;/i&gt;&lt;/center&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;There's a window for the application, and a task list entry.  Now in GNOME 2, if we go to the menu and choose Calculator again, we get this:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;center&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/fcx5Io5ynPUYlsNPPI9ztg?feat=embedwebsite"&gt;&lt;img src="http://lh3.ggpht.com/_nzsN_mJBCjk/Sp10mUDg1pI/AAAAAAAAB1E/s71xwQadpjo/s800/gnome2-calculator-running-2.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family:arial,sans-serif; font-size:11px; text-align:right"&gt;From &lt;a href="http://picasaweb.google.com/cgwalters/GNOMEShell?feat=embedwebsite"&gt;GNOME Shell&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br&gt;&lt;i&gt;Two calculators&lt;/i&gt;&lt;/center&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Technical people will know that under the covers, there are two &lt;tt&gt;gcalctool&lt;/tt&gt; processes, each of which is creating one window.  What this example emphasizes is that in GNOME 2, the bottom panel has a list of &lt;i&gt;windows&lt;/i&gt; (or tasks), not applications.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Moving on to GNOME Shell, the "window list" and "menus" part are merged into the overview.  Let's take a look at the application well when Calculator is not launched:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;center&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/fupCq2JRIPvNbl_-mKAHSA?feat=embedwebsite"&gt;&lt;img src="http://lh6.ggpht.com/_nzsN_mJBCjk/Sp2vcE7AvKI/AAAAAAAAB14/TCNGKDZJInE/s800/gnome3-calculator-launching.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family:arial,sans-serif; font-size:11px; text-align:right"&gt;From &lt;a href="http://picasaweb.google.com/cgwalters/GNOMEShell?feat=embedwebsite"&gt;GNOME Shell&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br&gt;&lt;i&gt;GNOME Shell overview application well&lt;/i&gt;&lt;/center&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Here I've added Calculator to my favorites, so it always shows up.  It's not running yet.  When I click on it, the active application at the top immediately changes to show that (GNOME techies: this replaces startup notification), and then the widow appears:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;center&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/PfH_6NVXFPlC8kzbNcij_w?feat=embedwebsite"&gt;&lt;img src="http://lh6.ggpht.com/_nzsN_mJBCjk/Sp2vcG7ooBI/AAAAAAAAB18/oLZtdfsRa78/s800/gnome3-calculator-launched.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family:arial,sans-serif; font-size:11px; text-align:right"&gt;From &lt;a href="http://picasaweb.google.com/cgwalters/GNOMEShell?feat=embedwebsite"&gt;GNOME Shell&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br&gt;&lt;i&gt;Running Calculator in GNOME Shell&lt;/i&gt;&lt;/center&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;So now that Calculator is running, let's go back to the overview and see what changed there.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;center&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/ZxmI35zaHSz_pW438trtRA?feat=embedwebsite"&gt;&lt;img src="http://lh4.ggpht.com/_nzsN_mJBCjk/Sp2wvgz040I/AAAAAAAAB2A/g0TAIFiyf2c/s800/gnome3-calculator-launched-overview.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family:arial,sans-serif; font-size:11px; text-align:right"&gt;From &lt;a href="http://picasaweb.google.com/cgwalters/GNOMEShell?feat=embedwebsite"&gt;GNOME Shell&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br&gt;&lt;i&gt;Application well, with Calculator running&lt;/i&gt;&lt;/center&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;You can see that the Calculator gained a glowing status indication, like the other applications I had running already.  When I click on that icon again, I am switched to the running calculator window:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;center&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/PfH_6NVXFPlC8kzbNcij_w?feat=embedwebsite"&gt;&lt;img src="http://lh6.ggpht.com/_nzsN_mJBCjk/Sp2vcG7ooBI/AAAAAAAAB18/oLZtdfsRa78/s800/gnome3-calculator-launched.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family:arial,sans-serif; font-size:11px; text-align:right"&gt;From &lt;a href="http://picasaweb.google.com/cgwalters/GNOMEShell?feat=embedwebsite"&gt;GNOME Shell&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br&gt;&lt;i&gt;Looks exactly the same!&lt;/i&gt;&lt;/center&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;In other words, it looks exactly the same, it just shows you the window again.  (Under the hood, the program is not re-executed, there won't be multiple &lt;tt&gt;gcalctool&lt;/tt&gt; processes, etc.)&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Ok you say, but Calculator is a pretty boring application and you don't use it anyways.  How am I making your life better?  Well, there are two major things.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;One of them is that many programs fail in some obvious and other times less than obvious ways if you click the menu entry twice in GNOME 2 (technically, by default this will start two processes).  They'll overwrite each other's data, etc.  For very few instances does it make sense to have multiple if the app is not &lt;i&gt;explicitly&lt;/i&gt; designed for it, and this will avoid you accidentally launching two.  Personally I get annoyed when I accidentally launch two &lt;tt&gt;xchat-gnome&lt;/tt&gt; instances and appear on IRC twice.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The second improvement here will come when we get a bit better application integration; the mockup we'd like to implement for say Firefox and multiple windows looks like this:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;center&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/b7w-p4iOLUxBHgXfCOmh3w?feat=embedwebsite"&gt;&lt;img src="http://lh4.ggpht.com/_nzsN_mJBCjk/Sp10mkisHcI/AAAAAAAAB1M/DGEKUkNuEa4/s800/gnome3-mockup-launching.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family:arial,sans-serif; font-size:11px; text-align:right"&gt;From &lt;a href="http://picasaweb.google.com/cgwalters/GNOMEShell?feat=embedwebsite"&gt;GNOME Shell&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/center&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;This needs application-specific work though.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;As a brief unrelated aside, I think recent Chromium builds with the tabs-in-window borders (technically, client side decorations) looks cool fullscreen in GNOME Shell with the application menu:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;center&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/JQrdPYTlBRfkM9R5pjJl3w?feat=embedwebsite"&gt;&lt;img src="http://lh4.ggpht.com/_nzsN_mJBCjk/Sp20KpXQghI/AAAAAAAAB2E/orZUucOSA6s/s288/Chromium-fullscreen.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family:arial,sans-serif; font-size:11px; text-align:right"&gt;From &lt;a href="http://picasaweb.google.com/cgwalters/GNOMEShell?feat=embedwebsite"&gt;GNOME Shell&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;i&gt;Chromium in GNOME Shell&lt;/i&gt;&lt;/center&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Next post I'll talk about how GNOME Shell will save you time and get you back into your applications faster.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a rel="license" href="http://creativecommons.org/licenses/by/3.0/us/"&gt;&lt;img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by/3.0/us/88x31.png" /&gt;&lt;/a&gt;&lt;br /&gt;This work is licensed under a &lt;a rel="license" href="http://creativecommons.org/licenses/by/3.0/us/"&gt;Creative Commons Attribution 3.0 United States License&lt;/a&gt;.&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:cgwalters:25584</id>
    <link rel="alternate" type="text/html" href="http://cgwalters.livejournal.com/25584.html"/>
    <link rel="self" type="text/xml" href="http://cgwalters.livejournal.com/data/atom/?itemid=25584"/>
    <title>Just when you think you have a good idea...</title>
    <published>2009-08-14T17:42:40Z</published>
    <updated>2009-08-14T17:49:47Z</updated>
    <content type="html">&lt;p&gt;...it turns out someone on the Interwebs &lt;a href="http://www.djangosnippets.org/snippets/1048/"&gt;already did it&lt;/a&gt;.  Curse you interwebs for how easily you crush one's brief pretensions to originality.  Anyways, in GNOME Shell we finally got &lt;a href="http://bugzilla.gnome.org/show_bug.cgi?id=589652"&gt;bug 589652&lt;/a&gt; in which means we're ready for translations!  We don't have a lot of strings, but it'd be good to get the ones we have translated for 2.28.  Ready, set, go!  I've given French a leg up with a translation for Activites as a test case.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Along the way it took a bit of &lt;a href="http://live.gnome.org/Gjs"&gt;gjs&lt;/a&gt; hacking to make it easier to create native modules; if you found yourself embedding Spidermonkey but yearning for &lt;tt&gt;PyArg_ParseTuple&lt;/tt&gt;, &lt;tt&gt;gjs_parse_args&lt;/tt&gt; is your friend.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Speaking of programmer stuff, the built-in console mentioned in my &lt;a href="http://cgwalters.livejournal.com/25311.html"&gt;previous post&lt;/a&gt; gained a parent-list inspector and property inspector which bring it very slightly closer to Firebug-like real, ultimate power.  True story, I originally called it &lt;tt&gt;lookingGlass.js&lt;/tt&gt; completely forgetting about Sun's &lt;a href="http://www.sun.com/software/looking_glass/"&gt;project&lt;/a&gt; ironically also about 3D-based desktops.  Anyways, since that doesn't seem to be actively developed anymore, and it's a &lt;i&gt;really&lt;/i&gt; great name, I think I'll just...if you don't mind....(yoink!) claim that name.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;There have been a lot of other user-visible changes recently, in visual terms I really like the result of both Sander's &lt;i&gt;excellent&lt;/i&gt; work in &lt;a href="http://bugzilla.gnome.org/show_bug.cgi?id=584609"&gt;bug 584609&lt;/a&gt; in combination with the progress recently on moving visually to the  &lt;a href="http://blogs.gnome.org/mccann/2009/08/08/whatchamacallit"&gt;mockup Jon referenced here&lt;/a&gt;.  Another promising change is our start on the application menu area.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Which gets me to the subject of the next blog post; one the major changes in GNOME 3 from both a user experience point of view and application developer view is that we're application based, not task based.  Work continues in this area - in the next post I'll talk about how this affects the experience.&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:cgwalters:25311</id>
    <link rel="alternate" type="text/html" href="http://cgwalters.livejournal.com/25311.html"/>
    <link rel="self" type="text/xml" href="http://cgwalters.livejournal.com/data/atom/?itemid=25311"/>
    <title>It's hot</title>
    <published>2009-08-02T11:58:03Z</published>
    <updated>2009-08-02T11:58:03Z</updated>
    <content type="html">&lt;p&gt;It's hot and humid in Boston, and I've been finding it a bit hard to sleep sometimes.  I keep telling myself I'm going to get an air conditioner, but, well, laziness and money.  Anyways tonight around 3am I just gave up, and from then till now-ish I was working on this cool little hack for &lt;a href="http://live.gnome.org/GnomeShell"&gt;Gnome Shell&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;So here's the problem.  I have almost no visual skills personally, and in a freeform environment like Clutter or HTML I have a really tough time making things I code look good without basically being handed the pixels directly by a visual designer.  But one thing I have noticed though is we have some people in the GNOME community with awesome visual skills.  So I wanted to lower the barrier to entry a bit for them.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;My inspiration was &lt;a href="http://getfirebug.com/"&gt;Firebug&lt;/a&gt; (which again if you have to do HTML and haven't tried, do so immediately); I wanted to make something where you could interactively edit and debug the visual layout.  So the result of the hacking landed in &lt;a href="http://bugzilla.gnome.org/show_bug.cgi?id=590515"&gt;bug 590515&lt;/a&gt;.  But since you're unlikely to do a git pull and git bz apply, I used Owen's cool builtin facility for making .ogg recordings of the shell.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Note however that at least parts of the shell aren't redrawing correctly in the beginning, and I gave up debugging that for now.  The top chrome will appear in the middle of the video.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;video src="http://cdn.verbum.org/shell-20090802-1.ogg"&gt;Ok, you don't have the video tag, try the &lt;a href="http://cdn.verbum.org/shell-20090802-1.ogg"&gt;direct link&lt;/a&gt;.&lt;/video&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Being able to hack something like this up in a short span of time is really neat I think, and definitely is one of the high points of having one's app scripted with JavaScript.  You can go in and play around, even monkey patch things.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;To actually make this useful for artists there's a lot more to do; a Firebug style properties display/layout debugger probably wouldn't be too hard, and would help you get past the problem of even knowing what properties there are.  But besides this tool, in the big picture we really need to switch to CSS, but that's coming.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;One question you may have is why when I moused over the window area, we didn't see different boxes for the windows?  Well, that comes down to the fact that there's a transparent input-only box over the windows.  A nice future enhancement for this tool would be to be able to skip layers; then you could type in a bit of code and animate/color etc. your windows.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Another thing that would be neat from a code perspective to make this more useful for hackers is to allow JavaScript subclassing GObject; the problem is most of the shell there's no good way to get the JavaScript framework from a given actor.  If only I had a time machine to go back to when Brendan was typing in code for prototypes, and hand him an &lt;tt&gt;extends&lt;/tt&gt; keyword.  But, speaking of dreaming...it's 8am now.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;There's more going on in the shell land, among other things we're taskbar-less now.  Yay for less visual chrome, though we have to work through the details.  More on this later.&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:cgwalters:25021</id>
    <link rel="alternate" type="text/html" href="http://cgwalters.livejournal.com/25021.html"/>
    <link rel="self" type="text/xml" href="http://cgwalters.livejournal.com/data/atom/?itemid=25021"/>
    <title>git-un-diff-whitespace</title>
    <published>2009-07-21T20:21:12Z</published>
    <updated>2009-07-21T20:21:12Z</updated>
    <content type="html">&lt;p&gt;So among the major burning problems we have in Free Software, one of the biggest is trailing whitespace in source files.  If you too have a project where people really care about this, you may be interested in my quickly hacked up &lt;a href="http://cdn.verbum.org/git-un-diff-whitespace"&gt;git-un-diff-whitespace&lt;/a&gt; script.  It removes trailing whitespace *only* in areas modified by "git diff" (i.e. it won't pollute your diffs with lots of spurious whitespace changes). I briefly tried to find something like this elsewhere on the interwebs but failed.  Oh, and if someone fixes it to handle new files I'd be happy.&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:cgwalters:24767</id>
    <link rel="alternate" type="text/html" href="http://cgwalters.livejournal.com/24767.html"/>
    <link rel="self" type="text/xml" href="http://cgwalters.livejournal.com/data/atom/?itemid=24767"/>
    <title>Full experience</title>
    <published>2009-07-20T15:09:40Z</published>
    <updated>2009-07-20T15:11:10Z</updated>
    <content type="html">&lt;p&gt;One of the things I wanted to talk about more was what I think does matter about the desktop, which is the &lt;b&gt;total&lt;/b&gt; experience and how it relates to branding.  People with extensive computer experience have a significantly better understanding of the individual components in a system (though they can and often are wrong of course about details), but the problem is that this leads to a different experience than someone without that understanding.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;A specific example I'm thinking of here is the Java updater on Windows.  I overheard one Java developer expressing surprise that someone they knew without much computer experience thought Java was a pop up.  Now you may laugh, but really, they're not wrong.  The pop up is their total experience.  People with the computer knowledge know they need it to play some online game, or they don't.  They know it's from a different company, and added on by the hardware vendor, or that the pop up is a tiny piece of a much larger system.  It ends up being a very different brand.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Speaking of hardware vendors and brands, this brings me to Windows itself.  I've kept around a Windows install on my PC for various reasons, among them that I like to keep up to date on what's happening in Windows land and be able to carry on an intelligent discussion about operating systems in general (not that you can tell from some coffee-fueled rambling blog posts), and also because I'll probably have to work on porting GObject Introspection to Windows (pure pain) at some point.  So here's the problem with the Windows brand, and I think Microsoft is catching on to this - you're carpet bombed with it in your interaction with the system, and it's associated with very good things, very bad things, and everything between.  Some things that are Microsoft's fault, and some things that aren't.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;I was browsing the menu one day and came upon a &lt;a href="http://www.microsoft.com/windowsxp/downloads/desktop/dancers.mspx"&gt;Windows Dancer&lt;/a&gt; menu item.  Microsoft made this, associated it with the Windows brand, and shipped it.  It boggles my mind.  Did you know that &lt;a href="http://digg.com/microsoft/29_of_Windows_Vista_crashes_caused_by_NVIDIA_drivers"&gt;29% of Windows kernel crashes&lt;/a&gt; are caused by NVidia?  Except here's the problem - it just says "Windows crashed".  So the user is going to associate that crash with the Windows brand, even though it it's really not Microsoft's fault.  By far my favorite though is the &lt;a href="http://www.delldock.com/"&gt;Dell Dock&lt;/a&gt;.  Definitely a lesson there in letting hardware vendors do arbitrary things to one's OS.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The point here is that the design and experience of Microsoft's core system (or any operating system) in a vacuum are far less relevant than the total experience of someone who just gets a computer.  And this I think is actually a strength of the free software operating system, for a few reasons. Following the "rough consensus and working code" approach inherently avoids the worst things.  If someone proposed a &lt;a href="http://www.driverheaven.net/reviews/mx510/pictures/message%20alert.jpg"&gt;Message from your mouse vendor pop up&lt;/a&gt; in GNOME, we'd just laugh.  Second, because we're fundamentally cooperative, there's less tension about replacing higher level things that people try to add on top.  If memory serves correctly, for years Windows didn't ship with an unzip utility in the core OS, presumably because of concerns about undercutting Winzip.  We'll never have that problem.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;A bit more on this later, and how it relates to a feature I'd like to work on for the shell.&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:cgwalters:24320</id>
    <link rel="alternate" type="text/html" href="http://cgwalters.livejournal.com/24320.html"/>
    <link rel="self" type="text/xml" href="http://cgwalters.livejournal.com/data/atom/?itemid=24320"/>
    <title>Uncanny valley?  I don't think so.</title>
    <published>2009-07-18T21:44:05Z</published>
    <updated>2009-07-18T22:03:51Z</updated>
    <content type="html">&lt;p&gt;So &lt;a href="http://bergie.iki.fi/blog/the_uncanny_valley_of_free_desktops/"&gt;Henri Bergius&lt;/a&gt; discussed &lt;a href="http://daringfireball.net/2009/07/chrome_os_context"&gt;John Gruber&lt;/a&gt;'s claim that the free desktops are in an &lt;a href="http://en.wikipedia.org/wiki/Uncanny_valley"&gt;uncanny valley&lt;/a&gt;.  Let's leave aside the obvious bits that 1) desktops are absolutely nothing like robots trying to be people, and 2) clearly the fundamental basis of the uncanny valley is the "Pathogen avoidance/mate selection", since in the tenth of a second it takes for your reaction to form, you obviously don't have any time to ponder "Western constructions of human identity".  Given that people don't get pathogens from their computer (unless you're using a public internet terminal) nor attempt to mate with them (no comment), the uncanny valley isn't very useful as an analogy.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;That said, it's amazing to me that John managed to go on for so long about operating systems in general (not just desktops) without mentioning the most important point about them.  Actually, really &lt;b&gt;the&lt;/b&gt; point, which dwarfs all others.  That is:&lt;/p&gt;&lt;br /&gt;&lt;center&gt;&lt;h1&gt;&lt;b&gt;To run the applications you want&lt;/b&gt;&lt;/h1&gt;&lt;/center&gt;&lt;br /&gt;&lt;p&gt;Now, don't get me wrong.  There's a lot of details about desktop operating systems that &lt;i&gt;are&lt;/i&gt; important; more on this in a minute.  Obviously, a web browser is essential, but that's a commodity.  Now, I don't want to get into a debate about exactly what percentage of people can be fully served by solely a web browser, but let me just note that for a lot of people, especially ones with overseas families, Skype is still a killer app.  And you can't write Skype in the default web security model (which is the relevant bit here, not a missing-the-point debate about AJAX versus platform widgets).&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Continuing on the subject of the uncanny valley, &lt;a href="http://planet.gnome.org/clarkbw"&gt;clarkbw&lt;/a&gt; told me a while ago there's been HCI research to the effect that people are not generally too troubled by visual differences.  Consider for example the evolution of the &lt;a href="http://en.wikipedia.org/wiki/Start_menu"&gt;Start menu&lt;/a&gt;; it looks &lt;i&gt;really&lt;/i&gt; different between each of Windows 2000, XP, and Vista, but generally people don't have a problem with that. However what they do &lt;i&gt;&lt;/i&gt; have trouble with is something that looks similar, but does something completely different.  A good example here is how in the default GNOME panel configuration, we ship the "make all your windows go away" button in the bottom left.  Kind of a bad idea, one that will go away with the shell design.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;But in general, I don't think the problem has anything to do with an "uncanny valley".  If we're talking about the consumer space, basically people just use the operating system that came with their computer, until it's time to replace the computer.  Overcoming this is I think largely a business problem, not a desktop interface problem.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;So on the subject of looking like Windows in the context of GNOME, my take is that it is important to look good and be functional, and having a distinct visual identity is important - but - keep in mind:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;center&gt;&lt;a href="http://www.nytimes.com/2009/07/09/technology/internet/09google.html?_r=2&amp;amp;partner=rss&amp;amp;emc=rss"&gt;&lt;img src="http://graphics8.nytimes.com/images/2009/07/08/technology/09google.grafic.jpg"&gt;&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Given that data, considering that our target market is, like Windows, general purpose computing, it makes a significant amount of sense to consider issues that occur during transition and what the expected target audience needs.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;What did I mean by "general purpose computing"?  Well, it's a big world.  Think of scientists and engineers using &lt;a href="http://www.scilab.org/"&gt;Scilab&lt;/a&gt;, or all of those fixed-function registers that currently run Windows.  OLPC-type projects.  Content creators who need to edit video.  System administrators and developers (count me as a skeptic of &lt;a href="http://labs.mozilla.com/projects/bespin/"&gt;editor as a service&lt;/a&gt;).&lt;/p&gt;&lt;br /&gt;&lt;p&gt;What about targeted "netbook" operating systems?  There is definitely a large number of people who only need a lightweight computer.  I think the core desktop should adapt automatically to those kinds of conditions; for example, you should be able to drop bits of GNOME you're not using (say Evolution), and the panel should adjust Ubuntu Netbook Remix style.  There's definitely a place for &lt;a href="http://moblin.org/"&gt;Moblin&lt;/a&gt; type specialized interfaces, and as long as they're generally compatible with the general purpose OS.  Concretely, if say Skype has to rewrite or do significant work to adapt their app, there's a problem.  But regardless, if Moblin achieves its goal of being shipped by hardware vendors on netbook hardware regardless, it'll be a huge step forward.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Now, different people have different visions of where the GNOME Shell should go, and that's healthy and fine.  To an extent these different visions can be accomodated by different means.  Ideally of course, we fix the problem in the default design.  But failing that, it might work as a Firefox-style extension mechanism that we want to add, a separate project that builds upon shared infrastructure, or automatic interface adjustments like the netbook screen size one I mentioned above.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;But you can count me as believing that it makes sense to be sure that the apps you use today continue to work, while achieving the goals of making GNOME look nicer and more interactive than two grey bars, and fixing the obvious problems like poor access to your recent files, no application search, etc.  Some of this we've done already, but there's a lot more to do.  If you're interested and able, it's pretty easy to &lt;a href="http://live.gnome.org/GnomeShell"&gt;dive in&lt;/a&gt; to the project!&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:cgwalters:24146</id>
    <link rel="alternate" type="text/html" href="http://cgwalters.livejournal.com/24146.html"/>
    <link rel="self" type="text/xml" href="http://cgwalters.livejournal.com/data/atom/?itemid=24146"/>
    <title>Words to keep in mind</title>
    <published>2009-03-19T19:20:11Z</published>
    <updated>2009-03-19T19:20:11Z</updated>
    <content type="html">&lt;blockquote&gt;&lt;br /&gt;We reject: kings, presidents and voting.&lt;br /&gt;We believe in: rough consensus and running code.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;p&gt;From &lt;a href="http://en.wikipedia.org/wiki/David_D._Clark"&gt;David D Clark&lt;/a&gt;.&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:cgwalters:23852</id>
    <link rel="alternate" type="text/html" href="http://cgwalters.livejournal.com/23852.html"/>
    <link rel="self" type="text/xml" href="http://cgwalters.livejournal.com/data/atom/?itemid=23852"/>
    <title>Further awesome</title>
    <published>2009-02-02T23:17:14Z</published>
    <updated>2009-02-02T23:17:14Z</updated>
    <content type="html">&lt;p&gt;So earlier I raved about how &lt;a href="http://cgwalters.livejournal.com/6027.html"&gt;Firebug is made of awesome&lt;/a&gt;.  One of those Free Software projects that just saves you massive amounts of time as a developer, and really raises the quality bar you expect from tools.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;There's one other project I should have mentioned earlier in this category, which is &lt;a href="http://valgrind.org/"&gt;Valgrind&lt;/a&gt;.  I'm sure nearly all Planet Fedora/GNOME developer readers know if it (though I was surprised there were still people not using Firebug), but Valgrind almost makes you feel like if it was a bit smarter it could write the code itself, and you could kick back on the beach and watch it.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;But besides praising Firebug and Valgrind, I wanted to link to &lt;a href="http://www.antlr.org/"&gt;ANTLR&lt;/a&gt; as also raising the Free Software quality bar.  Now, probably a lot fewer programmers have the need for a parser generator than need to debug HTML/JS or C, but I have to say - if you need a parser, ANTLR is also made of awesome.  It's not just that the parser generator is powerful, documented etc.  What definitely takes ANTLR a notch up is that it actually comes with &lt;a href="http://www.antlr.org/works/index.html"&gt;a custom IDE&lt;/a&gt; for writing and interactively debugging your grammar.  All Free Software, and pretty sexy too (Though sadly the screenshots are on a Mac).  I also started using another nice Terrence library, &lt;a href="http://www.stringtemplate.org/"&gt;StringTemplate&lt;/a&gt; in a project recently, which is what motivated this blog post.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Are there any indispensible tools or libraries that have really impressed &lt;i&gt;you&lt;/i&gt; lately?</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:cgwalters:23634</id>
    <link rel="alternate" type="text/html" href="http://cgwalters.livejournal.com/23634.html"/>
    <link rel="self" type="text/xml" href="http://cgwalters.livejournal.com/data/atom/?itemid=23634"/>
    <title>Not in DOS anymore</title>
    <published>2009-01-30T20:02:32Z</published>
    <updated>2009-01-30T20:02:32Z</updated>
    <content type="html">&lt;p&gt;I have to say, &lt;a href="http://spin.atomicobject.com/2009/01/30/ruby-for-desktop-applications-yes-we-can"&gt;this app&lt;/a&gt; makes quite a jump from their old DOS-based UI.  I would have no idea how to use it, but I'm sure it makes sense after you get training.  Good to know one fewer company's custom app is not tied to MSDN and Windows anymore, moving on to Free Software.  I wish I could make applications look at that good.&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:cgwalters:23514</id>
    <link rel="alternate" type="text/html" href="http://cgwalters.livejournal.com/23514.html"/>
    <link rel="self" type="text/xml" href="http://cgwalters.livejournal.com/data/atom/?itemid=23514"/>
    <title>And life gets a little better</title>
    <published>2009-01-27T17:50:40Z</published>
    <updated>2009-01-27T21:02:09Z</updated>
    <content type="html">&lt;p&gt;You know the feeling.  You're happily sitting there, coding away at some graphics or other code in C+GObject, and then comes the point where you need to add a signal to your object.  But your object doesn't have any signals yet, so you have to go find and copy the boilerplate.  Ok, not a big deal, you say to yourself, it only takes a minute or two.  Then you notice your signal takes multiple parameters, and thus you need to generate &lt;a href="http://library.gnome.org/devel/gobject/unstable/glib-genmarshal.html"&gt;a marshaler&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;At that point you go to add one to your &lt;tt&gt;foo-marshal.list&lt;/tt&gt; file, only to realize you don't have one yet!  Now you need to copy a chunk Automake boilerplate, and apparently if you want to do it really correctly it involves three times as much boilerplate involving &lt;a href="http://svn.gnome.org/svn/gtk+/trunk/gtk/Makefile.am"&gt;stamp files&lt;/a&gt; and other monsters.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;It's around this point you're probably thinking that finding medieval torture devices and using them on yourself on live television would be a less painful remunerative occupation than programming.  But there is hope - the awesome jdahlin wrote &lt;a href="http://bugzilla.gnome.org/show_bug.cgi?id=401080"&gt;a patch&lt;/a&gt;.  The problem - it's not in GLib yet, and it's unclear when it will be.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;So maybe you don't buy into the the pitch about polyglot applications yet, but the new &lt;a href="http://mail.gnome.org/archives/gnome-announce-list/2009-January/msg00069.html"&gt;GObject Introspection release&lt;/a&gt;, because it already depends on &lt;a href="http://sourceware.org/libffi/"&gt;libffi&lt;/a&gt;, contains a slightly tweaked version of jdahlin's patch, known as &lt;b&gt;gi_cclosure_marshal_generic&lt;/b&gt;.  Depend on introspection, and never deal with marshalers and other torture devices again!</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:cgwalters:23179</id>
    <link rel="alternate" type="text/html" href="http://cgwalters.livejournal.com/23179.html"/>
    <link rel="self" type="text/xml" href="http://cgwalters.livejournal.com/data/atom/?itemid=23179"/>
    <title>A few releases in brief</title>
    <published>2009-01-15T15:42:59Z</published>
    <updated>2009-01-15T17:01:02Z</updated>
    <content type="html">&lt;p&gt;&lt;a href="http://dbus.freedesktop.org/"&gt;DBus 1.2.12 and 1.2.4.4permissive&lt;/a&gt; are out; this release has a good number of virtues, among them that it has &lt;a href="https://bugs.freedesktop.org/show_bug.cgi?id=18064"&gt;significantly faster&lt;/a&gt; transmission of fixed array types; see the announcement for details.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Guido Günther is now maintaining, and has released a &lt;a href="http://mail.gnome.org/archives/gnome-announce-list/2009-January/msg00045.html"&gt;new version of krb5-auth-dialog&lt;/a&gt;.  Thanks Guido!&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:cgwalters:22945</id>
    <link rel="alternate" type="text/html" href="http://cgwalters.livejournal.com/22945.html"/>
    <link rel="self" type="text/xml" href="http://cgwalters.livejournal.com/data/atom/?itemid=22945"/>
    <title>From Here To There</title>
    <published>2009-01-14T22:01:40Z</published>
    <updated>2009-01-14T22:01:40Z</updated>
    <content type="html">&lt;p&gt;&lt;a href="http://live.gnome.org/GObjectIntrospection/FromHereToThere"&gt;From Here To There&lt;/a&gt; is a quick introductory tutorial for people interested in building multi-level applications using the GObject stack, and having your own application be split between C and your choice of runtime.  This tutorial uses Clutter and JavaScript, as we're using for &lt;a href="http://live.gnome.org/Boston2008/GUIHackfest/WindowManagementAndMore"&gt;gnome-shell&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;I've been working for a while now on two applications using the system (gnome-shell, and a personal project not yet ready for announcement), and while there is still a fair bit more introspection system work to do, so far I'm pretty happy with how it's worked out for both projects.  My personal project is actually a mashup of C for some graphics and system stuff, &lt;a href="http://live.gnome.org/JGIR"&gt;Java (JGIR)&lt;/a&gt; for the core application logic, and &lt;a href="http://groovy.codehaus.org/"&gt;Groovy&lt;/a&gt; for some scripting and extensions.  It's quite polyglot; I'm practicing what I &lt;a href="http://cgwalters.livejournal.com/17292.html"&gt;preach&lt;/a&gt;.&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:cgwalters:22705</id>
    <link rel="alternate" type="text/html" href="http://cgwalters.livejournal.com/22705.html"/>
    <link rel="self" type="text/xml" href="http://cgwalters.livejournal.com/data/atom/?itemid=22705"/>
    <title>DBus 1.2.10 and DBus 1.2.4.2permissive</title>
    <published>2008-12-19T20:57:08Z</published>
    <updated>2008-12-19T20:58:45Z</updated>
    <content type="html">&lt;p&gt;Freedesktop.org vendors, please get the new &lt;a href="http://lists.freedesktop.org/archives/dbus/2008-December/010769.html"&gt;DBus 1.2.4.2permissive&lt;/a&gt; release into your development stream as soon as possible, so DBus service developers and testers can help cooperate on fixing the &lt;a href="http://bugs.freedesktop.org/show_bug.cgi?id=18980"&gt;broken services&lt;/a&gt;.  Thanks!&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;b&gt;Note&lt;/b&gt;: On my Fedora 10 system I got a lot of spam due to NetworkManager talking to HAL without &lt;a href="http://bugs.freedesktop.org/show_bug.cgi?id=18985"&gt;this patch&lt;/a&gt; - so you likely want to get that one in at the same time.&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:cgwalters:22508</id>
    <link rel="alternate" type="text/html" href="http://cgwalters.livejournal.com/22508.html"/>
    <link rel="self" type="text/xml" href="http://cgwalters.livejournal.com/data/atom/?itemid=22508"/>
    <title>HotSSH 0.2.6: Now with less reason for your sysadmin to come after you with an axe</title>
    <published>2008-12-19T04:11:50Z</published>
    <updated>2008-12-19T04:11:50Z</updated>
    <content type="html">&lt;p&gt;&lt;a href="http://projects.gnome.org/hotssh/"&gt;HotSSH&lt;/a&gt; 0.2.6 is &lt;a href="http://ftp.gnome.org/pub/GNOME/sources/hotssh/0.2/"&gt;released&lt;/a&gt;.  It fixes a number of bugs, probably most important is one where we could repeatedly try (and fail) to make a new connection every 3 seconds.  System administrators tend to get antsy about stuff in their log files, so if they were threatening to bodily harm etc., well, HotSSH 0.2.6 is the ssh client you were looking for!&lt;br /&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:cgwalters:22189</id>
    <link rel="alternate" type="text/html" href="http://cgwalters.livejournal.com/22189.html"/>
    <link rel="self" type="text/xml" href="http://cgwalters.livejournal.com/data/atom/?itemid=22189"/>
    <title>If pain exists to teach one a lesson...</title>
    <published>2008-12-07T22:08:14Z</published>
    <updated>2008-12-07T22:08:14Z</updated>
    <content type="html">&lt;p&gt;...then I feel there must be a lot to learn from &lt;a href="http://lists.freedesktop.org/archives/dbus/2008-December/010702.html"&gt;this painful bug&lt;/a&gt;.  So far I've learned to always delay pushes into the Fedora queue, even for security updates.  Anyways, apologies for the trouble; this is really an awful bug.  We'll probably be turning up cases where developers had relied on the erroneous permission for some time.&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:cgwalters:21907</id>
    <link rel="alternate" type="text/html" href="http://cgwalters.livejournal.com/21907.html"/>
    <link rel="self" type="text/xml" href="http://cgwalters.livejournal.com/data/atom/?itemid=21907"/>
    <title>Tomorrow</title>
    <published>2008-11-05T19:39:20Z</published>
    <updated>2008-11-05T19:39:20Z</updated>
    <content type="html">&lt;p&gt;While traveling post-GUADEC in Turkey, I ended up after dinner one night walking next to a man speaking English to his wife, and like most people in a foreign country I was interested to talk to someone of similar culture.  It turned out though he was Iranian, now living in Dubai with his American wife.  He was a very intelligent person, a businessman of some sort and we had a discussion about world affairs as we walked back to our respective hotels.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;He obviously had a broad world view and experience, so it was a good conversation.  Of course the presidental run came up, and when I mentioned I supported Obama, he shook his head and I remember he said to me confidently and with some cynicism, "John McCain will be your next president". I had felt so sure that America would warm to this eloquent, charismatic scholar of constitutional law, but at that moment I experienced some lingering doubt which stayed for a week at least.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Not that he's likely to be reading this blog, but I'd just like to say - told you so!&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:cgwalters:21617</id>
    <link rel="alternate" type="text/html" href="http://cgwalters.livejournal.com/21617.html"/>
    <link rel="self" type="text/xml" href="http://cgwalters.livejournal.com/data/atom/?itemid=21617"/>
    <title>Today</title>
    <published>2008-11-05T00:37:08Z</published>
    <updated>2008-11-05T00:37:08Z</updated>
    <content type="html">&lt;p&gt;A rare nontechnical blog entry from me today; I have had some technical ones queued up in the back of my mind for a bit, but it was hard to spend today thinking about technology.  Or, at least other than as a delivery mechanism for election results.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Before Obama decided to run for president, I read an article about possible presidential contenders which included him. The article linked to &lt;a href="http://www.youtube.com/watch?v=OmWlrtpqp40"&gt;this YouTube video&lt;/a&gt; of Obama.  I was struck by his charisma and, doing a bit more research, his extraordinary intelligence and hopeful message.  This guy didn't get into an ivy league school via the &lt;a href="http://en.wikipedia.org/wiki/Old_boy_network"&gt;old boy network&lt;/a&gt; like Bush did.  I decided within that hour that if he did run, I would contribute to his campaign, the first time I'd ever really done anything approaching active participation in politics beyond voting.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;I have a feeling that's true for a lot of Americans right now.  Anyways, I planned to keep this blog short.  I just had to write something though - it's an immensely inspiring day today.&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:cgwalters:21421</id>
    <link rel="alternate" type="text/html" href="http://cgwalters.livejournal.com/21421.html"/>
    <link rel="self" type="text/xml" href="http://cgwalters.livejournal.com/data/atom/?itemid=21421"/>
    <title>finding algorithms</title>
    <published>2008-10-07T02:24:54Z</published>
    <updated>2008-10-07T02:24:54Z</updated>
    <content type="html">&lt;p&gt;Dear lazyweb, I recently found myself having a set of Unicode strings (in main memory) and the desire to search all of them for a particular prefix (&lt;i&gt;not substring&lt;/i&gt;).  For bonus points, let's say I want to do it in parallel (seems like an easily parallelizable problem, although at worst you can divide-and-conquer for a given number N of processors).  The constraints are that the set of strings can change, but not very often usually.  I don't want &lt;i&gt;too&lt;/i&gt; large of a hit to compute tables and the like though.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The real question is - how do &lt;b&gt;you&lt;/b&gt; find papers (and implementations thereof) for computer science problems like this?  My first instinct was to get an ACM subscription, which I did.  Their search turns out to be mediocre, and then I discovered Wikipedia has &lt;a href="http://en.wikipedia.org/wiki/String_searching_algorithm"&gt;useful pages&lt;/a&gt; on these kinds of things.  Wikipedia also has the winning feature of linking to &lt;a href="http://johannburkard.de/software/stringsearch/"&gt;quality free software implementations&lt;/a&gt; thereof.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;On this particular problem, a lot of the literature is around substring matching which isn't what I want, at least not directly.  Still looking.&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:cgwalters:21209</id>
    <link rel="alternate" type="text/html" href="http://cgwalters.livejournal.com/21209.html"/>
    <link rel="self" type="text/xml" href="http://cgwalters.livejournal.com/data/atom/?itemid=21209"/>
    <title>Dear GObject/C library authors</title>
    <published>2008-10-06T20:21:12Z</published>
    <updated>2008-10-06T20:26:22Z</updated>
    <content type="html">&lt;p&gt;Get ready - it's coming.  At the &lt;a href="http://live.gnome.org/Boston2008"&gt;GNOME Summit&lt;/a&gt; this weekend we're having a hackfest on &lt;a href="http://live.gnome.org/GObjectIntrospection/"&gt;introspection&lt;/a&gt;.   As a programmer working on a GObject library, here's what you need to understand:&lt;/p&gt;&lt;br /&gt;&lt;h3&gt;Using gtk-doc annotations&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;Just parsing the C code isn't enough - we sometimes need additional metadata.   Here's an example:&lt;br /&gt;&lt;pre&gt;
/**
 * gtk_list_store_set_column_types: 
 * @store: a #GtkListStore
 * @n_columns:
 * @types: &amp;lt;array,length=n_columns&amp;gt;: List of types
 */
void
gtk_list_store_set_column_types (GtkListStore *list_store,
                                 gint          n_columns,
                                 GType        *types);
&lt;/pre&gt;&lt;br /&gt;There are &lt;a href="http://live.gnome.org/GObjectIntrospection/Annotations"&gt;more examples here&lt;/a&gt;.  This syntax hasn't really seen much bikeshedding yet, and to be honest it's grown rather organically.  So things could change.  But the goal is for the annotations to be concise, fit in with gtk-doc, and support a variety of attributes; we don't want to require a totally different IDL format.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;h3&gt;Add your library to gir-repository and check it&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;The current thought on deploying introspection is to have two phases.  In the first "unstable" phase, we will also have two separate modules: &lt;a href="http://svn.gnome.org/svn/gobject-introspection/trunk"&gt;gobject-introspection&lt;/a&gt; and &lt;a href="http://svn.gnome.org/svn/gir-repository/trunk"&gt;gir-repository&lt;/a&gt;.  It's unclear yet whether the former will remain separate from glib or not in the long term, but expect it to exist separately for now.  For &lt;tt&gt;gir-repository&lt;/tt&gt;, the long term plan is to integrate everything into the relevant modules themselves, but for the next 6 months or so while we're finalizing bits, we will keep annotations and code to invoke the scanner inside this centralized module.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;So for now, you can add your library (if it isn't there already) to gir-repository by filing a patch in &lt;a href="http://bugzilla.gnome.org/"&gt;Bugzilla&lt;/a&gt; (glib/introspection), or pastebin on &lt;tt&gt;irc.gimp.org:#introspection&lt;/tt&gt;.  After you have your library successfully parsed by the scanner, the first task is to inspect the generated &lt;tt&gt;.gir&lt;/tt&gt; file.  This XML file describes the parsed API.  Try searching in particular for any APIs you think are tricky.&lt;/p&gt;&lt;br /&gt;&lt;h3&gt;Try out your library in a binding&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;After inspecting the &lt;tt&gt;.gir&lt;/tt&gt; file, you can try out your API from one of the bindings such as &lt;a href="http://live.gnome.org/PyBank"&gt;PyBank&lt;/a&gt; or &lt;a href="http://live.gnome.org/JGIR"&gt;JGIR&lt;/a&gt;, with more coming.  We expect to do some PyBank hacking in particular at the summit, and hopefully get the Spidermonkey and Mono bindings further along.  There is a lot to do for all the bindings, but I hope that introspection can be a strong focus point for collaboration between the bindings.&lt;/p&gt;&lt;br /&gt;&lt;h3&gt;Writing bindable APIs&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;I've started a wiki page about how you can keep your C code &lt;a href="http://live.gnome.org/GObjectIntrospection/WritingBindingableAPIs"&gt;easily bindable&lt;/a&gt;.  More content appreciated!  This page will likely be a bit fluid as we determine both what is supported in the introspection core, and how its concepts map to languages.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;That's it for now - remember if you're in the Boston to come to the summit!&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:cgwalters:20763</id>
    <link rel="alternate" type="text/html" href="http://cgwalters.livejournal.com/20763.html"/>
    <link rel="self" type="text/xml" href="http://cgwalters.livejournal.com/data/atom/?itemid=20763"/>
    <title>Cambridge (US), 6pm today</title>
    <published>2008-09-29T16:53:23Z</published>
    <updated>2008-09-29T16:53:23Z</updated>
    <content type="html">&lt;p&gt;If you're interested in programming languages and you're in Cambridge, you should come to &lt;a href="http://common-lisp.net/pipermail/boston-lisp/2008-September/000077.html"&gt;this Boston Lispers&lt;/a&gt; meeting.  The author of Clojure, Rich Hickey, reportedly gave a &lt;a href="http://groups.google.com/group/clojure/browse_thread/thread/4c4a4e6500d06f8f"&gt;great talk&lt;/a&gt; at the &lt;a href="http://openjdk.java.net/projects/mlvm/jvmlangsummit/"&gt;JVM languages summit&lt;/a&gt; which hopefully he'll reprise here!&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:cgwalters:20625</id>
    <link rel="alternate" type="text/html" href="http://cgwalters.livejournal.com/20625.html"/>
    <link rel="self" type="text/xml" href="http://cgwalters.livejournal.com/data/atom/?itemid=20625"/>
    <title>"Linux distribution"</title>
    <published>2008-09-18T18:47:02Z</published>
    <updated>2008-09-18T18:47:02Z</updated>
    <content type="html">&lt;p&gt;At the &lt;a href="http://linuxplumbersconf.org/"&gt;plumber's conference&lt;/a&gt; right now, just finished watching Arjan and Auke's &lt;a href="http://linuxplumbersconf.org/program/speakers/getspeaker.php?speaker=avandeven.txt"&gt;5 second boot time&lt;/a&gt; talk.  Very very impressive talk.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;They drove a lot of changes into the entire stack, from how the kernel works to fixing HAL and X.org bugs, filesystem tweaks in order to get to 5 seconds.  Of course they cut out some things too - since the netbook targets are mobile single user machines, they don't use GDM, I'm pretty sure they aren't starting CUPS, etc.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;But this talk led me to only feel more strongly about something that I've been feeling increasingly more lately - that we have been far too complacent about accepting "Linux distribution" as a concept.  This is the idea that you can take the Linux kernel and a variety of tarballs found on the Internet, compile them and put it in some variant of tar, and you have an operating system.  It turns out it's not that simple.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;To create a compelling system, first, you need to make decisions about how things work and how things fit together.  The "Linux distribution" mindset is an excuse for having different vendors make different decisions and we end up sharing very little.  We need people like Arjan's team, the Ubuntu team, the Fedora team, the OpenSuSE team to share far more than we do now.   I think a lot of vendors ("distributions") tend to have an insular mindset where they think they are the center of the universe and why doesn't everyone just join their project anyways?&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Five or six years ago I think there was more of a mindset that Linux and the Free Desktop was going to take over from Windows ("year of the Linux desktop" and all that) and each vendor thought they were going to take over the world and consequently were less interested in collaboration.  Personally I don't think we're going to see that &lt;a href="http://cgwalters.livejournal.com/18327.html"&gt;sudden takeover any time soon&lt;/a&gt;, but at the same time if we do things right there is a lot of opportunity.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;It's easy to say distributions are bad of course - far harder to actually collaborate better.  How do we do that?  Here's an idea:&lt;/p&gt;&lt;br /&gt;&lt;h3&gt;Share a core OS &lt;b&gt;image&lt;/b&gt; built at freedesktop.org&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;We're not going to unify all the different packaging tools tomorrow.  However, there's no reason that the core OS build tools and image (kernel, dbus, HAL, X.org) couldn't be shared.  So "distributions" could keep their favorite variant of tar and wget (.deb and apt, rpm and zypper, rpm and yum) for everything outside of the image.  In other words you could still do "apt-get install epiphany" or "yum install httpd" whatever other app on top of the image and that would still work in a normal "packaging" way, but the core OS image would be rsync'd outside of that.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Each vendor would still control all of the code - each component of the image could have a "vendor" branch where vendors can add kernel drivers and the like.  Image update policy would still be controlled by vendors.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;There of of course other things that it's &lt;b&gt;completely stupid&lt;/b&gt; to fork like bug trackers and more importantly the bug reports.  We need to do a much better job of sharing bugs in the right place - the upstream project.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;In a sentence, take projects like freedesktop.org and gnome.org as more than just tarball sources and turn them into real collaboration points where things get tied together, sharing actual infrastructure.  It wouldn't be easy but really, we need to stop thinking that it's acceptable to have 5+ major forks of the core OS infrastructure.&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>urn:lj:livejournal.com:atom1:cgwalters:20363</id>
    <link rel="alternate" type="text/html" href="http://cgwalters.livejournal.com/20363.html"/>
    <link rel="self" type="text/xml" href="http://cgwalters.livejournal.com/data/atom/?itemid=20363"/>
    <title>How to unbreak Emacs somewhat</title>
    <published>2008-08-09T18:17:37Z</published>
    <updated>2008-08-09T18:17:37Z</updated>
    <content type="html">&lt;p&gt;I'm back to using &lt;a href="http://www.gnu.org/software/emacs/"&gt;Emacs&lt;/a&gt; for editing C and Python code for now.  There are various reasons for this, but mainly it comes down to the fact that I need an editor and not an IDE; creating projects just to edit a bit of code is too much overhead, at least in the IDEs I have tried.  Now, one major problem Emacs has had forever is that people (including me) have implemented new modules for it that "unbreak" various parts, but the maintainer has been very conservative about changing anything.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;For this reason, here's what I consider the "minimal unbreak Emacs &lt;tt&gt;.emacs&lt;/tt&gt;" file:&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;
;;; Minimal Unbreak Emacs
; Waste of display space if you can't click on it
(if (not window-system) (menu-bar-mode nil))
; Really.
(iswitchb-mode t)
; Assuming you didn't use Emacs from before when the concept of
; selecting a single region of text interactively was not supported.
(transient-mark-mode t)
; This one is actually fixed in Emacs 22; http://www.emacswiki.org/cgi-bin/wiki/CopyAndPaste
(setq x-select-enable-clipboard t)
; The default for "uniquifying" buffer names sucks
(require 'uniquify)
(setq uniquify-buffer-name-style 'post-forward-angle-brackets)
; Slightly more debatable
(global-set-key (kbd "C-x C-b") 'ibuffer)

(set-scroll-bar-mode 'right)

; Custom keybindings
(global-set-key (kbd "C-c i") 'imenu)
&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Technically I shouldn't be giving you a &lt;tt&gt;C-c&lt;/tt&gt; prefixed function, but I don't know of another good place for it.  Anyways, enjoy.  Someday Emacs will come out of the box unbroken; it's happening, just very slowly.&lt;/p&gt;</content>
  </entry>
</feed>
