<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Federico Mena-Quintero - Activity Log</title>
    <link>http://www.gnome.org/~federico/news.html</link>
    <description>Boring news about Federico</description>

    <copyright>2013 Federico Mena-Quintero</copyright>
    <managingEditor>federico@gnome.org</managingEditor>
    <webMaster>federico@gnome.org</webMaster>
    <language>en</language>
    <lastBuildDate>Tue, 14 May 2013 23:09:30 CDT</lastBuildDate>

    <item>
      <title>Tue 2013/May/14</title>
      <link>http://www.gnome.org/~federico/news-2013-05.html#14</link>
      <guid isPermaLink="true">http://www.gnome.org/~federico/news-2013-05.html#14</guid>
      <pubDate>Tue, 14 May 2013 23:02:00 CDT</pubDate>
      <description><![CDATA[
	<ul>
	  <li id="emacs-ibus">
	    <p>
	      <a href="http://www.gnome.org/~federico/news-2013-05.html#emacs-ibus""><strong>Emacs, C-SPC, dead keys, and ibus</strong></a>
	    </p>

	    <p>
	      Some time before or during the GTK+ hackfest, Emacs on
	      my laptop started acting strange.  C-SPC wasn't working
	      (a <strong>major</strong> catastrophe), and when using a
	      Latin American keymap, it was spewing nonsense like
	      <tt>&lt;dead-acute&gt; is undefined</tt>.
	    </p>

	    <p>
	      Today I finally figured it out, but just by comparing
	      things between my machine-where-emacs-works and my
	      laptop.  It turns out that <tt>ibus</tt> had gotten
	      installed on my laptop, and it was screwing things up.
	    </p>

	    <p>
	      <strong>TL;DR</strong> Emacs stopped handling C-SPC and
	      dead keys; I uninstalled the <tt>ibus</tt> package and
	      everything works again.
	    </p>

	    <p>
	      I have no idea of how Emacs users manage to live when they
	      actually need to use ibus for input methods.
	    </p>
	  </li>
	</ul>
]]></description>
    </item>

    <item>
      <title>Wed 2013/May/08</title>
      <link>http://www.gnome.org/~federico/news-2013-05.html#08</link>
      <guid isPermaLink="true">http://www.gnome.org/~federico/news-2013-05.html#08</guid>
      <pubDate>Wed, 08 May 2013 20:02:00 CDT</pubDate>
      <description><![CDATA[
	<ul>
	  <li>
	    <p>
	      <a
	      href="http://en.wikipedia.org/wiki/Wikipedia:Articles_for_deletion/Federico_Mena">This
	      is amusing and bitter at the same time</a>.
	    </p>
	  </li>
	</ul>
]]></description>
    </item>

    <item>
      <title>Tue 2013/Apr/30</title>
      <link>http://www.gnome.org/~federico/news-2013-04.html#30</link>
      <guid isPermaLink="true">http://www.gnome.org/~federico/news-2013-04.html#30</guid>
      <pubDate>Tue, 30 Apr 2013 18:05:00 CDT</pubDate>
      <description><![CDATA[
	<ul>
	  <li>
	    <p>
	      <a href="http://www.gnome.org/~federico/news-2013-04.html#gtk-hackfest"><strong>Report from the GTK+ Hackfest</strong></a>
	    </p>

	    <p>
	      Last week we had the <a
		href="https://live.gnome.org/Hackfests/GTK2013">GTK+ Hackfest</a> in
	      the OLPC office in Cambridge.
	    </p>

	    <p>
	      My intentions for the hackfest were to finish the merge of <a
		href="https://git.gnome.org/browse/gtk+/tree/gtk/gtkplacessidebar.h">GtkPlacesSidebar</a> into the master master branch &mdash; it's a
	      new public widget that will show up in GTK+&nbsp;3.10.
	    </p>

	    <p>
	      <a href="http://www.gnome.org/~federico/misc/gtkplacessidebar-20121026.png"><img src="http://www.gnome.org/~federico/misc/gtkplacessidebar-20121026-thumb.png" alt="GtkPlacesSidebar" width="560" height="354" class="photo"></a>
	    </p>

	    <p>
	      Over the past months I have worked on finishing the details of the
	      sidebar:  merging all the code from Nautilus, polishing the API with
	      the help of the GTK+ team, writing reference documentation.  During
	      the hackfest I worked on some of the last user-visible details in the
	      sidebar, particularly the way drag-and-drop feedback
	      gets shown.
	    </p>

	    <p>
	      After I pushed the merge into GTK+, <a
		href="http://blogs.gnome.org/cosimoc/">Cosimo</a> gave me the green
	      light for merging this into Nautilus, and so the thing is done now!
	      It feels good to have shared code between Nautilus and GtkFileChooser
	      at last.
	    </p>

	    <p>
	      Some things are pending:
	    </p>

	    <ul>
	      <li>
		<p>
		  In the file chooser, when you click on the Trash item in the sidebar,
		  you get an error message saying that "trash:/// is not a local file
		  system".  Even though files in the trash live in your normal Unix file
		  system, GIO says that trash:/// is not native and doesn't have a local
		  path associated to it.  We have to see how to get GIO/GVFS to mount
		  the trash into a FUSE mount automatically.
		</p>
	      </li>
	      <li>
		<p>
		  There is still an ugly <tt>gtk_places_sidebar_set_show_desktop()</tt>
		  API.  I'll remove it and turn that into a GtkSetting, so that the
		  sidebar can automatically adjust to the surrounding
		  environment's policy about whether to show the Desktop folder or not
		  (e.g. show it for XFCE, don't show it for Gnome).
		</p>
	      </li>
	      <li>
		<p>
		  Add a GtkSetting for showing XDG directories (Music, Photos, etc.) or
		  not.  XDG doesn't want to show them by default, and prefers to let
		  users bookmark those folders directly; Gnome does.
		</p>
	      </li>
	      <li>
		<p>
		  Once GTK+ gets an API for <a href="http://www.gnome.org/~federico/">notifications</a>, the places
		  sidebar should be able to notify you when a volume is being mounted
		  (and is taking a long time to do so).  Right now that code is
		  disabled; it came from Nautilus, and it pretty much uses libnotify
		  directly.
		</p>
	      </li>
	    </ul>

	    <h2>Meanwhile in Cambridge</h2>

	    <p>
	      For me going to the Boston area is a treat.  It's a
	      lovely city, with good public transportation, good
	      restaurants, and with a manageable size.
	    </p>

	    <p>
	      I had a chance to meet Steve&nbsp;Branam, of the fantastic <a
	      href="http://www.closegrain.com/">Close Grain</a> blog
	      &mdash; a fellow woodworker and software developer.
	      Steve started a hand-tool woodworking school a while
	      ago, so if you are in the Boston area and are
	      interested in learning, shoot him an email.
	    </p>

	    <p>
	      <img src="http://www.gnome.org/~federico/news-photos/2013-04-closegrain.jpg" alt="Steve
	      Branam and Federico" width="640" height="480"
	      class="photo">
	    </p>

	    <p>
	      Also, thanks to my friends <a
	      href="http://alan.aspuru.com/">Alán</a> and Dori, for
	      letting me crash at their house and keeping me well fed
	      :)
	    </p>
	  </li>
	</ul>
]]></description>
    </item>

    <item>
      <title>Wed 2013/Apr/17</title>
      <link>http://www.gnome.org/~federico/news-2013-04.html#17</link>
      <guid isPermaLink="true">http://www.gnome.org/~federico/news-2013-04.html#17</guid>
      <pubDate>Wed, 17 Apr 2013 17:49:00 CDT</pubDate>
      <description><![CDATA[
	<ul>
	  <li>
	    <p>
	      <a
		href="http://cluborlov.blogspot.com/2013/04/understanding-organizational-stupidity.html">Dmitry
		Orlov summarizes</a> Mats Alvesson and André Spicer's <a
		href="https://dl.dropbox.com/u/8650451/Alvesson%20and%20Spicer%2012%20JMS.pdf"><em>A
		  Stupidity-Based Theory of Organizations</em></a>.  A good
	      afternoon read with lots of food for thought.
	    </p>

	    <blockquote cite="http://cluborlov.blogspot.com/2013/04/understanding-organizational-stupidity.html">
	      Functional stupidity is organizationally-supported lack of
	      reflexivity, substantive reasoning, and justification. It entails
	      a refusal to use intellectual resources outside a narrow and “safe” terrain. It
	      can provide a sense of certainty that allows organizations to function
	      smoothly. This can save the organization and its members from the frictions
	      provoked by doubt and reflection. Functional stupidity contributes to
	      maintaining and strengthening organizational order. It can also motivate
	      people, help them to cultivate their careers, and subordinate them to socially
	      acceptable forms of management and leadership. Such positive outcomes can
	      further reinforce functional stupidity.
	    </blockquote>
	  </li>

	  <li>
	    <p>
	      Have you donated to <a
	      href="http://www.indiegogo.com/projects/geary-a-beautiful-modern-open-source-email-client">Yorba's
	      crowdfunding campaign</a> to develop Geary, a new, free
	      software email client?  I have.
	    </p>

	    <p>
	      As the Yorba people explained in their last keynote at
	      GUADEC, they have been working on experimenting with
	      funding models for free software.  This crowdfunding
	      campaign is the latest experiment, and I urge you to
	      participate.  Give them a little money.  You just can't
	      have people writing software full-time without them also
	      having a way to make a living, and this crowdfunding
	      campaign is the way they intend to make their living
	      while they write the first versions of Geary.
	    </p>

	    <p>
	      Is this undermining <a
	      href="https://live.gnome.org/Evolution">Evolution</a>?
	      I don't think so.  Evolution is relatively old software.
	      It is really good, and also pretty bad at times &mdash;
	      the results of lots of technical debt.  Normally I would
	      say, Yorba is crazy for writing an email client from
	      scratch, and they should just give their love to
	      Evolution.  But they have proven themselves to be
	      competent to write something like <a
	      href="http://www.yorba.org/projects/shotwell/">Shotwell</a>,
	      the photo manager I use every day, so this is good
	      evidence that they can write Geary.
	    </p>

	    <p>
	      So, go to <a
	      href="http://www.indiegogo.com/projects/geary-a-beautiful-modern-open-source-email-client">Yorba's
	      crowdfunding campaign page</a> and donate to Geary!
	    </p>
	  </li>
	</ul>
]]></description>
    </item>

    <item>
      <title>Wed 2013/Mar/13</title>
      <link>http://www.gnome.org/~federico/news-2013-03.html#13</link>
      <guid isPermaLink="true">http://www.gnome.org/~federico/news-2013-03.html#13</guid>
      <pubDate>Wed, 13 Mar 2013 20:12:00 CST</pubDate>
      <description><![CDATA[
	<ul>
	  <li id="gtkfilechooserbutton-tests">
	    <p>
	      <a href="http://www.gnome.org/~federico/news-2013-03.html#filechooserbutton-tests"><strong>How I added a test suite for GtkFileChooserButton</strong></a>
	    </p>

	    <p>
	      <a href="https://developer.gnome.org/gtk3/unstable/GtkFileChooserButton.html">GtkFileChooserButton</a>
	      is a quirky little beast.  It is the widget you use when you
	      have something like a dialog box to configure options, and you
	      need a way to ask the user for a file or a folder.
	    </p>

	    <p>
	      <a href="https://developer.gnome.org/gtk3/unstable/GtkFileChooserButton.html"><img src="https://developer.gnome.org/gtk3/unstable/file-button.png"
												 alt="GtkFileChooserButton"></a>
	    </p>

	    <p>
	      Jim Cape wrote the original version of GtkFileChooserButton a
	      long time ago, as a reasonably simple wrapper around
	      GtkFileChooserDialog.  You clicked on something like a GtkButton,
	      which would bring up a GtkFileChooserDialog, and when the dialog
	      was dismissed by the user, the button would then show the name of
	      the selected file.  Simple.
	    </p>

	    <p>
	      And then, things got more complicated.  The underlying file
	      chooser dialog became asynchronous.  We replaced Gnome-VFS with
	      GIO.  GTK3 happened.
	    </p>

	    <p>
	      While I've kept GtkFileChooserDialog mostly in check (a debatable
	      statement, given the number of bugs it has...), I've never really
	      paid much attention to GtkFileChooserButton.  It's a wrapper, so
	      it should just keep working, I thought.  But bugs appeared as the
	      underlying infrastructure changed, and every time I fixed one,
	      other new bugs would appear.
	    </p>

	    <p>
	      I never did a good job of testing all the subtleties of
	      GtkFileChooserButton.  So, this happened:
	    </p>

	    <p>
	      <a href="http://devopsreactions.tumblr.com/post/44444575875/when-we-dont-write-a-test-for-that-special-corner-case"><img src="http://www.gnome.org/~federico/misc/shark-missing-a-test.gif"
																       alt="Shark eats airplane"
																       width="314"
																       height="195"
																       class="photo"></a>
	    </p>

	    <h2>Resurrecting the tests</h2>

	    <p>
	      A long time ago I had a litle, ad-hoc, automated test suite for
	      GtkFileChooserDialog in general.  This was before <a href="https://developer.gnome.org/glib/unstable/glib-Testing.html">GTestUtils</a>
	      got included in GLib.  The code for the file chooser's tests got
	      adapted to use GTestUtils as a testing framework, but since the
	      tests failed, that code was left in the gtk+ source tree but
	      never built.
	    </p>

	    <p>
	      A few weeks ago, when <strike>I felt shark teeth in my
		buttocks</strike> the extent of the brokenness of
	      GtkFileChooserButton started to become clear, I started
	      resurrecting <a href="https://git.gnome.org/browse/gtk+/tree/gtk/tests/filechooser.c">the
		old tests</a>.
	    </p>

	    <p>
	      My home-grown testing program initially looked like this:
	    </p>

	    <pre class="code-example">
static gboolean
test_filechooser_open (void)
{
    ...
    return passed;
}

static gboolean
test_filechooser_save (void)
{
    ...
    return passed;
}

static gboolean
test_filechooser (void)
{
    passed = test_file_chooser_open ();
    passed = passed && test_file_chooser_save ();
    passed = passed && test_file_chooser_select_folder ();
    passed = passed && ...;

    return passed;
}

int
main (int argc, char **argv)
{
    gtk_init (&argc, &argv);

    if (test_filechooser ())
        return 0;
    else
        return 1;
}
	    </pre>

	    <p>
	      This had several shortcomings.  First, since the tests were
	      hardcoded as a chain of "&&" operations, all the tests had to be
	      run every time.  You couldn't select each test individually.
	      It was hard to see which test failed when one did.
	    </p>

	    <p>
	      When the tests were intially converted to use GTestUtils, it
	      looked more or less like this:
	    </p>

	    <pre class="code-example">
static void
test_filechooser_open (void)
{
    ...
    g_assert (passed);
}

static void
test_filechooser_save (void)
{
    ...
    g_assert (passed);
}

int
main (int argc, char **argv)
{
    gtk_test_init (&argc, &argv);
    ...
    g_test_add_func ("/GtkFileChooser/open", test_filechooser_open);
    g_test_add_func ("/GtkFileChooser/save", test_filechooser_save);
    ...
}
	    </pre>

	    <p>
	      So, all the "<tt>return&nbsp;passed</tt>" became
	      "<tt>g_assert&nbsp;(passed)</tt>" and each test got a
	      human-readable name.  With this you can pass an argument like
	      "<tt>-p /GtkFileChooser/save</tt>" to the test program, and
	      GTestUtils will just run that test.  Also, when a test fails, you
	      get its name printed on the console.  GTestUtils <a href="https://mail.gnome.org/archives/gtk-devel-list/2013-February/msg00090.html">is not the
	      nicest testing framework out there</a>, but it's much better than
	      my old setup.
	    </p>

	    <h2>Tests for GtkFileChooserButton</h2>

	    <p>
	      My original tests weren't very useful for GtkFileChooserButton,
	      so I added new ones.  After writing some tests by hand with
	      similar code between each other, I figured
	      out that they are all a slightly different subset of
	      these:
	    </p>

	    <ol>
	      <li>Create a GtkFileChooserButton in either OPEN or SELECT_FOLDER
		mode.</li>
	      <li>Set a starting filename or folder.</li>
	      <li>Invoke the underlying GtkFileChooserDialog.</li>
	      <li>Change the filename or folder of the GtkFileChooserButton
		while the dialog is active.</li>
	      <li>Confirm the dialog or cancel it.</li>
	      <li>Look at the final state of the button.</li>
	    </ol>

	    <p>
	      I replaced the hand-written tests with a generic "test everything" function, that checks
	      the externally-visible state of GtkFileChooserButton after
	      each of those key stages.  The tests run many variations of the
	      steps above.  Some don't set up a starting filename, and others
	      do.  Some use the underlying dialog, some don't.  Some confirm
	      the dialog as if you pressed "OK"; some cancel the dialog,
	      and thus GtkFileChooserButton needs to go back to its
	      initial state.
	    </p>

	    <p>
	      The tests failed at first, of course, due to bugs in
	      GtkFileChooserButton.  But it was having the tests that
	      <em>forced me</em> to understand exactly why the widget was
	      failing in subtle ways.  Having a way to test each assumption and
	      every change made me get a deep understanding of how
	      GtkFileChooserButton works very quickly.  I now regret not having
	      written those tests since the beginning.
	    </p>

	    <h2>What was hard to test</h2>

	    <p>
	      GtkFileChooserButton can work in two modes:  one for
	      GTK_FILE_CHOOSER_ACTION_OPEN, where it lets you select a single
	      file, and one for GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, where it
	      lets you select a single folder.
	    </p>

	    <p>
	      In OPEN mode, the button looks like an actual GtkButton that
	      shows the basename of the currently-selected file.  When
	      clicked, it brings up a proper GtkFileChooserDialog.  When the
	      user dismisses the dialog, the button updates its contents to
	      show the newly-selected filename.
	    </p>

	    <p>
	      However, in SELECT_FOLDER mode, the button actually uses a
	      GtkComboBox.  When clicked, it brings up a combo-box menu of
	      Places (standard folders plus bookmarks).  The menu also has an
	      "Other..." item, which you can select to get a proper
	      GtkFileChooserDialog to select an arbitrary folder.  When the
	      user dismisses the dialog, the combo box must be updated to show
	      the newly-selected folder.
	    </p>

	    <p>
	      I wanted to test some things:
	    </p>

	    <ul>
	      <li>
		<p>
		  When you call GtkFileChooser's methods, for example to select a
		  file, does the GUI update accordingly?  While you can easily
		  call <tt>gtk_file_chooser_select_file()</tt>, there is no direct way
		  of asking, "what text is displayed in this widget?".
		</p>
	      </li>

	      <li>
		<p>
		  When the user presses on the button in OPEN mode, or in the
		  combo box in SELECT_FOLDER mode, does the selection change
		  accordingly?  Testing the selection is a simple matter of
		  calling <tt>gtk_file_chooser_get_filename()</tt>, but the
		  first part of the question requires digging in the widget
		  hierarchy and telling widgets to do things as if the user
		  were driving them.
		</p>
	      </li>
	    </ul>

	    <p>
	      GUI testing projects like <a href="http://ldtp.freedesktop.org/wiki">LDTP</a> can more or
	      less simulate a user driving the GUI by using
	      accessibility interfaces.  When a test wants to ask, "what text is this widget displaying?",
	      it wants just to get the string, without caring whether the
	      widget in question is a button, a combo box, an entry, or a
	      label &mdash; and the a11y interfaces make this easy.  Similarly,
	      they make it easy to say, "activate this combo box, and select
	      the Nth item", something which would be really cumbersome (and
	      fragile) to do by simulating mouse clicks and grabs.
	    </p>

	    <p>
	      Since I had never used the accessibility interfaces to do
	      anything, I ran <a href="https://live.gnome.org/Accerciser">Accerciser</a> to see
	      <em>how</em> to do operations on the GUI "by hand" with the accessibility
	      APIs.  For example, once you have a
	      widget you want to query, you can get its accessible
	      representation with <tt>gtk_widget_get_accessible()</tt> and then
	      do <tt>atk_object_get_name()</tt> to see the text that the widget is
	      displaying.  Bingo!  There is no need to see if the widget in
	      question is a GtkButton, or a GtkLabel, or anything else.
	    </p>

	    <p>
	      <a href="http://www.gnome.org/~federico/misc/accerciser.png"><img src="http://www.gnome.org/~federico/misc/accerciser-thumb.png"
						 alt="Accerciser in action"
						 width="640" height="254"
						 class="photo"></a>
	    </p>

	    <p>
	      So, currently, the tests for GtkFileChooserButton call ATK by
	      hand and are written in C, as is the rest of the GTK+ source tree.  I'd much rather have something
	      higher-level like LDTP in place, which already has utilities to
	      dig for widgets and activate them and dig for strings, all in
	      various high-level languages.
	    </p>

	    <h2>Advancing tests based on catching signals instead of sleeping</h2> 

	    <p>
	      The file chooser in GTK+ is highly asynchronous.  When you call
	      gtk_file_chooser_select_file(), that function will return quickly
	      and the file chooser will start selecting that file
	      asynchronously:  it will load the directory, select the file,
	      figure out its icon...
	    </p>

	    <p>
	      Regretfully, one anti-pattern in the file chooser's API is that while it is
	      easy to know when an async operation starts, it is <a href="http://www.gnome.org/~federico/docs/2007-02-FOSDEM/html/img33.html">hard to know
	      when it actually finishes</a>.  Although internally GIO has the
	      right kind of async API (you start the async operation, you pass
	      a callback to be called when the operation finishes, the callback
	      gets called with a success or error value, you can cancel a
	      running operation), the file chooser was originally not designed
	      to be async.  It had a synchronous, blocking API.  When it was
	      converted to be async, the original signals like
	      <tt>selection-changed</tt> remained there, but we made no
	      provision for those signals to return error values ("the file you
	      wanted to select was not found"), or for operations to be
	      cancelled.
	    </p>

	    <p>
	      Normally this is not a problem, and you can consider
	      gtk_file_chooser_select_file() to be fire-and-forget &mdash; you
	      call it when you are initializing your file chooser, and you only
	      query the final filename when the user closes the file chooser.
	      You never query it in between, and if the file chooser was not
	      able to select the file your program wanted, it's not a big deal.
	    </p>

	    <p>
	      However, querying things in between is exactly what
	      GtkFileChooserButton's test suite wants to do.  Since my testing
	      code could not know when the various operations were finished, it
	      just had things like a <tt>sleep_in_main_loop()</tt>
	      function that would wait for a fraction of a second before
	      continuing.  In theory, this would let the file chooser catch up.  This is
	      both fragile and slow:  it is fragile if the tests are being run
	      on a slow machine (or a slow VM), and it is slow because there is
	      so much sleeping being done in dozens of tests.
	    </p>

	    <p>
	      To compound that, GtkFileChooserButton wasn't always proxying the
	      correct signals from the underlying GtkFileChooserDialog.  So,
	      after doing an operation in the test code, all the code could do
	      was wait for a bit before continuing.
	    </p>

	    <p>
	      I replaced the "sleep here" functions with a few others that
	      actually check if certain signals have been emitted by the
	      GtkFileChooserButton &mdash; signals that indicate that the file
	      chooser has <em>really</em> loaded the file in question and that
	      the async operations are finished.  In the tests, there are calls
	      to a function like
	      <tt>signal_watcher_expect&nbsp;(watcher,&nbsp;"selection-changed")</tt>.
	      The signal watcher notices if the signal has been emitted yet,
	      and if not, waits for up to a predefined maximum amount of time
	      before deciding that the signal is just not being emitted at all.
	    </p>

	    <p>
	      After doing that all the tests failed, of course &mdash; the
	      signals weren't being emitted at the right times!  So I set to
	      fixing that.  This made me re-understand the code of
	      GtkFileChooserButton, and let me clean it up substantially.
	    </p>

	    <p>
	      After fixing things, the tests are able to run as fast as the file chooser
	      button can confirm that things have happened.  There is no
	      sleeping anymore.
	    </p>

	    <p>
	      The tests took 71 seconds with the sleeps; they take only 21
	      seconds with signals only.  Big win!  And now
	      GtkFileChooserButton's signals are actually reliable, and tests
	      can be reliably run on any kind of machine.  I hope.
	    </p>

	    <h2>Postscript, and help wanted</h2>

	    <p>
	      Finally, I would like to apologize to the people for whom
	      GtkFileChooserButton has been so broken in the past.  I hope that
	      the tests will help keep things in check from now on.
	    </p>

	    <p>
	      The tests run out of the box in "<tt>make&nbsp;check</tt>" in
	      GTK+ master, because accessibility is always on in Gnome 3.  However, the test code does not work at all in the
	      <tt>gtk-2-24</tt> branch.  I don't know how to enable a11y for
	      the test program, or even to enable it for all GTK2 apps running
	      in the desktop.  If anyone knows how to do this, I would be very
	      thankful to know.
	    </p>
	  </li>
	</ul>
]]></description>
    </item>

    <item>
      <title>Mon 2013/Mar/04</title>
      <link>http://www.gnome.org/~federico/news-2013-03.html#04</link>
      <guid isPermaLink="true">http://www.gnome.org/~federico/news-2013-03.html#04</guid>
      <pubDate>Mon, 04 Mar 2013 18:41:00 CST</pubDate>
      <description><![CDATA[
	<ul>
	  <li id="gnome-emacs-utils-news-04">
	    <p>
	      <a href="http://www.gnome.org/~federico/news-2013-03.html#gnome-emacs-utils-news-04"><strong>Gnome-emacs-utils news</strong></a>
	    </p>

	    <p>
	      Dirk-Jan C. Binnema sent a couple of items to let <a href="http://emacswiki.org/emacs/Yasnippet">Yasnippet</a> (<a href="https://www.youtube.com/watch?v=vOj7btx3ATg">screencast</a>)
	      expand <tt>g_return_*_if_fail()</tt> when you type.
	    </p>

	    <p>
	      Alex Murray <a href="https://github.com/federicomenaquintero/gnome-emacs-utils/issues/2">pointed
		out</a> that DevHelp ships <a href="http://git.gnome.org/browse/devhelp/tree/misc/devhelp.el"><tt>devhelp.el</tt></a>,
	      by Richard Hult, to let you open the reference docs for a library function with a single
	      keystroke.
	    </p>

	    <p>
	      Thanks, and keep the ideas coming, people!
	    </p>

	    <p>
	      <tt>git clone https://github.com/federicomenaquintero/gnome-emacs-utils</tt>
	    </p>
	  </li>
	</ul>
]]></description>
    </item>

    <item>
      <title>Thu 2013/Feb/28</title>
      <link>http://www.gnome.org/~federico/news-2013-02.html#28</link>
      <guid isPermaLink="true">http://www.gnome.org/~federico/news-2013-02.html#28</guid>
      <pubDate>Thu, 28 Feb 2013 14:16:00 CST</pubDate>
      <description><![CDATA[
	<ul>
	  <li id="gnome-emacs-utils">
	    <p>
	      <a href="http://www.gnome.org/~federico/news-2013-02.html#gnome-emacs-utils"><strong>Introducing Gnome-emacs-utils</strong></a>
	    </p>

	    <p>
	      Today I was working on the <a
		href="http://developer.gnome.org/platform-overview/unstable/">Overview
		of the Gnome Platform</a>, which is written in <a
		href="http://projectmallard.org/">Mallard</a>.  I am a die-hard
	      Emacs user, but a lazy one, and so I haven't kept up with all the
	      relatively new things in Emacs:  nxml-mode, the incredible <a
		href="http://www.emacswiki.org">Emacs Wiki</a>, elisp package systems...
	    </p>

	    <p>
	      I became tired of Mallard documents opening up in plain
	      nxml-mode, with no schema.  So I learned how to teach nxml-mode
	      about Mallard files and its RELAX NG schema.  And I got to
	      thinking why we don't have a well-known set of Elisp utilities
	      for Gnome developers.
	    </p>

	    <p>
	      Back in the Gnome 1.x days, we had a wonderful little snippet of
	      Elisp by Michael Zucchi, which would let you press a hotkey to
	      add inline documentation comments for gtk-doc.  If you had code
	      like this and the point was at <tt>[*]</tt>:
	    </p>

	    <pre class="code-example">GtkSandwich *
gtk_foo_make_me_a_sandwich (GtkFoo *foo, GList *ingredients, GError **error)
{
    [*]</pre>

	    <p>
	      Then you could hit the hotkey and this would be inserted before
	      the function's prototype:
	    </p>

	    <pre class="code-example">/**
 * gtk_foo_make_me_a_sandwich:
 * foo: 
 * ingredients:
 * error:
 *
 * Put the description here.
 *
 * Return value: 
 **/
GtkSandwich *
gtk_foo_make_me_a_sandwich (GtkFoo *foo, GList *ingredients, GError **error)
{</pre>

	    <p>
	      This elisp doesn't work anymore, sadly.
	    </p>

	    <p>
	      And so, I've started a little collection of Emacs stuff for Gnome
	      developers.  Let's tweak it to perfection.
	    </p>

	    <p>
	      <tt>git clone https://github.com/federicomenaquintero/gnome-emacs-utils</tt>
	    </p>
	  </li>
	</ul>
]]></description>
    </item>

    <item>
      <title>Thu 2013/Feb/21</title>
      <link>http://www.gnome.org/~federico/news-2013-02.html#21</link>
      <guid isPermaLink="true">http://www.gnome.org/~federico/news-2013-02.html#21</guid>
      <pubDate>Thu, 21 Feb 2013 19:48:00 CST</pubDate>
      <description><![CDATA[
	<ul>
	  <li>
	    <p>
	      For the software-development-as-urbanism crowd:  "<a href="http://nextcity.org/informalcity/entry/when-tokyo-was-a-slum"><cite>When
		Tokyo was a slum</cite></a>" is an excellent article.  It doesn't talk
	      about software, but the <em>process</em> of construction of cities on
	      a piecemeal basis is very illuminating.
	    </p>

	    <blockquote cite="http://nextcity.org/informalcity/entry/when-tokyo-was-a-slum">
	      <p>
		When the war ended, Tokyo’s municipal government, bankrupt and
		in crisis mode, was in no condition to launch a citywide
		reconstruction effort. So, without ever stating it explicitly,
		it nevertheless made one thing clear: The citizens would
		rebuild the city. Government would provide the infrastructure,
		but beyond that, the residents would be free to build what they
		needed on the footprint of the city that once was, neighborhood
		by neighborhood.
	      </p>

	      <p>
		[...]
	      </p>

	      <p>
		The central part of the city is the historical core of Edo,
		which became Tokyo in the late 19th century. But the periphery
		grew largely without planning. Tokyo swallowed up the
		surrounding villages as it sprawled outward [...].
	      </p>

	      <p>
		[...]
	      </p>

	      <p>
		Throughout the 20th century, as surrounding villages were
		absorbed into the expanding city and rural villages became
		urban neighborhoods, their inhabitants preserved some of their
		customs and social organization. But the central government
		never saw the autonomy of these neighborhoods as a threat.
	      </p>
	    </blockquote>

	    <p>
	      Does Gnome operate somewhat like that, and if so, what can we
	      learn from the process?  Is the center (the core
	      desktop) traditionally the "capital", and has it swallowed little
	      villages in the periphery (apps and libraries that became part of
	      the core, or otherwise became tightly integrated with the core)?
	      How much autonomy (let them be) vs. how much central planning
	      (let's tackle horizontal issues)?
	    </p>

	    <p>
	      <strong>How do we remain civil as the city grows, when it is no longer
	      possible to know everyone who lives there in person?</strong>
	    </p>

	    <p>
	      Jane Jacobs, in <cite>The Death and Life of Great American
		Cities</cite>, makes a point that one virtue of a great city is
	      that it allows complete strangers to live very close to each
	      other.  A great city gets made through explicitly allowing and
	      nourishing <em>diversity</em>:  diversity of uses, so you don't
	      have business neighborhoods which go dead at night; diversity of
	      people, so any minority's needs don't go unmet; diversity of age
	      in buildings, so people can afford a cheap shop or apartment if
	      they need one, or a big and new building if they can.
	    </p>

	    <p>
	      Jacobs also talks about the "self-destruction of diversity":
	    </p>

	    <blockquote>
	      <p>
		[...] the tendency for outstandingly sucessful diversity in
		cities to destroy itself; the tendency for massive single
		elements in cities (many of which are necessary and otherwise
		desirable) to cast a deadening influence; the tendency for
		population instability to counter the growth of diversity; and
		the tendency for both public and private money either to glut
		or to starve development and change.
	      </p>

	      <p>
		[...]
	      </p>

	      <p>
		The purpose of recognizing and understanding [these forces] is
		to try to combat them or &mdash; better yet &mdash; convert
		them into constructive forces.  Besides influencing the growth
		of diversity itself, these forces also sometimes affect the
		ease or difficulty with which the basic conditions for
		generating diversity can be introduced.  Leaving them out of
		account, even the best planning for vitality would fall a step
		back for every two steps forward.
	      </p>
	    </blockquote>

	    <p>
	      There is a lot of food for thought in all of this.  See also, <a
		href="http://www.theverge.com/2013/2/13/3959868/photoshop-is-a-city-for-everyone-how-adobe-endlessly-rebuilds-its"><cite>Photoshop
		  is a city for everyone: how Adobe endlessly rebuilds its
		  classic app</cite></a> for a tangible example of a large, old
	      software project, that everyone seems to love and hate.  This
	      article also portrays its subject as a world-class city!
	    </p>
	  </li>

	  <li>
	    <p>
	      <a href="http://theproducesavant.blogspot.com">The Produce
		Savant</a>, a wonderful blog about what to do with "unpopular"
	      vegetables.  By Sally of the amazing <a href="http://www.toolsforworkingwood.com/">Tools for Working Wood</a>.
	    </p>
	  </li>
	</ul>
]]></description>
    </item>

    <item>
      <title>Fri 2013/Feb/08</title>
      <link>http://www.gnome.org/~federico/news-2013-02.html#08</link>
      <guid isPermaLink="true">http://www.gnome.org/~federico/news-2013-02.html#08</guid>
      <pubDate>Fri, 08 Feb 2013 14:52:00 CST</pubDate>
      <description><![CDATA[
	<ul>
	  <li id="dx-hackfest">
	    <p>
	      <strong><a href="http://www.gnome.org/~federico/news-2013-02.html#dx-hackfest">2013 Developer Experience Hackfest, Brussels</a></strong>
	    </p>

	    <p>
	      I'm late to the blogging party about the <a href="https://live.gnome.org/DeveloperExperience/Hackfest2013">Developer Experience
	      Hackfest</a>, which happened right before <a href="http://www.fosdem.org">FOSDEM</a>, but here it goes!
	    </p>

	    <h2>The Hackfest</h2>

	    <p>
	      We split into four teams:  tooling and IDEs, application bundling
	      and sandboxing, development platform, and documentation.  I was
	      part of the <a href="https://live.gnome.org/DeveloperExperience/Hackfest2013/Documentation">documentation team</a>.
	    </p>

	    <p>
	      In the docs team, Allan focused on <a
		href="http://developer.gnome.org">developer.gnome.org</a>, our
	      main web site for developers, while Meg worked on an introduction
	      to the Gnome libraries.  Fred, Thomas, Aleksander, and Jasper
	      worked on documentation tools &mdash; DevHelp and documentation
	      generation.  I worked on updating our historic <a
		href="http://developer.gnome.org/platform-overview/unstable/">Overview of the Gnome Platform</a> document, based on
	      Tuğçe&nbsp;Şirin's analysis of what it lacks or what could be
	      made more clear in it.
	    </p>

	    <p>
	      That document has a little history that is worth noting.  Shaun
	      McCance wrote it on comission from the Gnome Foundation in 2006.
	      It is, to the best of my knowledge, the first time that the Foundation
	      contracted someone for pay to do something related to development
	      of Gnome.  Shaun did an excellent job of summarizing the
	      libraries we had available as part of the core development
	      platform.
	    </p>

	    <p>
	      Over time, however, that document has gotten a bit outdated.  People
	      have kept it mostly up-to-date with respect to the libraries, but
	      the document suffered from a bit too technical language at times,
	      and from being a catalog of stuff rather than an introduction on
	      how things work together.
	    </p>

	    <p>
	      I've been making some changes to the <a
		href="http://developer.gnome.org/platform-overview/unstable/">Overview of the Gnome Platform</a> to add
	      the missing platform libraries, to make the descriptions easier
	      to understand, and to add a bit of a better structure to the
	      document.
	    </p>

	    <h2>JavaScript</h2>

	    <p>
	      Practically any high-level, garbage-collected language is much better than plain C, in terms of productivity, once you
	      get used to the idiosyncrasies of the bindings to the Gnome libraries.
	    </p>

	    <p>
	      So, I'm very happy that we have a <em>high-level language</em>
	      accepted as officially supported for Gnome.  I was kind of
	      surprised that Python, our de-facto and historically "best supported binding"
	      wasn't chosen, but if this means that another high-level language
	      can get as much work put into it, then all the better.
	    </p>

	    <p>
	      Also, for JavaScript we have outstanding tutorials in <a
		href="http://developer.gnome.org/gnome-devel-demos/3.7/js.html.en">Gnome
		Developer Platform Demos</a> mega-document.  Taryn&nbsp;Fox,
	      Tiffany&nbsp;Antopolski, and other people who have worked on this
	      have done an excellent job.  See also the coordination for this
	      in the wiki page for the <a
		href="https://live.gnome.org/AppGuide">Gnome Application Developer's Guide</a>.
	    </p>

	    <p>
	      My hope is that we will get good tutorials for beginners, and
	      that people will later take care of making sure that the examples
	      are available in all our "good" language bindings, and that the
	      text makes sense regardless of programming language.  Gnome is a
	      polyglot project, fortunately, and people will program in
	      whatever language they find the most conveninent &mdash; which is
	      perfectly okay.
	    </p>

	    <h2>Brussels in winter</h2>

	    <p>
	      Cold.  Wind.  Rain.  Wind.  Rain, and cold.  The streets are
	      littered with the corpses of umbrellas.  My own didn't last
	      <em>one minute</em> after taking it out of the backpack.
	    </p>

	    <p>
	      <a href="http://www.gnome.org/~federico/news-photos/2013-02-0827-umbrella.jpg"><img src="http://www.gnome.org/~federico/news-photos/thumb/2013-02-0827-umbrella.jpg"
		alt="Umbrella in the trash" width="321" height="480"
		class="photo"></a>
	      <a href="http://www.gnome.org/~federico/news-photos/2013-02-0851-organ.jpg"><img src="http://www.gnome.org/~federico/news-photos/thumb/2013-02-0851-organ.jpg"
		alt="Pipe organ at the Brussels cathedral" width="480" height="321"
		class="photo"></a>
	    </p>

	    <p>
	      Still, it's worth it once you get to the pretty architecture,
	      which permeates the center of the city.  And a waffle warms you
	      up.  This is Juan&nbsp;Pablo&nbsp;Ugarte, from the Glade / IDEs team, a
	      marvelous guide and conversation partner from Argentina,
	      recharging his batteries.
	    </p>

	    <p>
	      <a href="http://www.gnome.org/~federico/news-photos/2013-02-0841-waffles.jpg"><img src="http://www.gnome.org/~federico/news-photos/thumb/2013-02-0841-waffles.jpg"
		alt="Juan Pablo eating waffles" width="480" height="321"
		class="photo"></a>
	      <a href="http://www.gnome.org/~federico/news-photos/2013-02-0842-churros.jpg"><img src="http://www.gnome.org/~federico/news-photos/thumb/2013-02-0842-churros.jpg"
		alt="Overpriced churros" width="321" height="480"
		class="photo"></a>
	    </p>

	    <p>
	      Also, <em>churros</em> in Brussels?  For 5€?  What is this how
	      can they I don't even.
	    </p>

	    <h2>Thanks</h2>

	    <p>
	      <a href="http://coworking.betagroup.be/"><img src="http://www.gnome.org/~federico/misc/logo_betagroup.png"
		  alt="Betagroup Coworking Space" width="340" height="100"></a>
	    </p>

	    <p>
	      The hackfest took place at the <a
		href="http://coworking.betagroup.be/">Betagroup Coworking
		Space</a>.  This is a nice place!  They have desks and chairs,
	      coffee for which you pay based on an honor system, a kitchen,
	      good networking, beanbag chairs, and it all leads to a very nice
	      atmosphere.  This is the first time I visit a coworking space,
	      and it was very nice.
	    </p>

	    <p>
	      <a href="https://live.gnome.org/Travel"><img
		  src="http://www.gnome.org/~federico/misc/sponsored-badge-shadow.png" alt="Sponsored by the
		  Gnome Foundation" width="230" height="230"></a>
	    </p>

	    <p>
	      Thanks to the Gnome Foundation for sponsoring my flight/hotel!
	  </li>
	</ul>
]]></description>
    </item>

    <item>
      <title>Tue 2013/Jan/15</title>
      <link>http://www.gnome.org/~federico/news-2013-01.html#15</link>
      <guid isPermaLink="true">http://www.gnome.org/~federico/news-2013-01.html#15</guid>
      <pubDate>Tue, 15 Jan 2013 17:43:00 CST</pubDate>
      <description><![CDATA[
	<ul>
	  <li>
	    <p>
	      Composting is awesome.
	    </p>

	    <p>
	      Humanure is awesome.
	    </p>

	    <p>
	      Community projects for composting are awesome.
	    </p>

	    <p>
	      But to <a
		href="http://www.kickstarter.com/projects/1569583232/the-ladies-of-manure-2013-calendar?ref=live">fundraise
		on Kickstarter</a> for a <a
		href="http://www.fertileearth.org/_blog/Miami_Worm_Farm/post/Women_of_Manure_Miami_2/">calendar
		with "Ladies of Manure 2012"</a> is completely tasteless.
	    </p>
	  </li>
	</ul>
]]></description>
    </item>

    <item>
      <title>Thu 2012/Dec/27</title>
      <link>http://www.gnome.org/~federico/news-2012-12.html#27</link>
      <guid isPermaLink="true">http://www.gnome.org/~federico/news-2012-12.html#27</guid>
      <pubDate>Thu, 27 Dec 2012 17:35:00 CST</pubDate>
      <description><![CDATA[
	<ul>
	  <li>
	    <p>
	      After a long delay, I've finished adding my speaker's notes to
	      my talk from GUADEC, "<a href="http://www.gnome.org/~federico/docs/2012-GUADEC/html/index.html">Gnome and the Systems
		of Free Infrastructure</a>".  You can also <a href="http://www.gnome.org/~federico/docs/2012-GUADEC/gnome-and-the-systems-of-free-infrastructure.odp">download
		the ODP file</a>.
	    </p>

	    <p>
	      <a href="http://www.gnome.org/~federico/docs/2012-GUADEC/html/index.html"><img src="http://www.gnome.org/~federico/docs/2012-GUADEC/html/img0.jpg" alt="Gnome and the
	      Systems of Free Infrastructure"></a>
	    </p>
	  </li>
	</ul>
]]></description>
    </item>

    <item>
      <title>Mon 2012/Dec/17</title>
      <link>http://www.gnome.org/~federico/news-2012-12.html#17</link>
      <guid isPermaLink="true">http://www.gnome.org/~federico/news-2012-12.html#17</guid>
      <pubDate>Mon, 17 Dec 2012 16:12:00 CST</pubDate>
      <description><![CDATA[
	<ul>
	  <li>
	    <p>
	      <a href="http://www.amazon.com/Battle-Life-Beauty-Earth-World-Systems/dp/0199898073/ref=lh_ni_t">The Battle for the Life and Beauty of the Earth: A
		Struggle Between Two World-Systems</a>, Christopher&nbsp;Alexander's
	      newest book, is just out.  It describes the process of planning,
	      designing, and building the Eishin School campus in Tokyo, while
	      dealing with the Real World.  I'm eagerly awaiting my copy of the book.
	    </p>
	  </li>
	</ul>
]]></description>
    </item>

    <item>
      <title>Tue 2012/Dec/11</title>
      <link>http://www.gnome.org/~federico/news-2012-12.html#11</link>
      <guid isPermaLink="true">http://www.gnome.org/~federico/news-2012-12.html#11</guid>
      <pubDate>Tue, 11 Dec 2012 13:41:00 CST</pubDate>
      <description><![CDATA[
	<ul>
	  <li>
	    <p>
	      From the veritable "<a href="http://www.cryptonomicon.com/beginning.html">In the beginning was the command line</a>":
	    </p>

	    <p>
	      <em>Applications create possibilities for millions of credulous
		users, whereas OSes impose limitations on thousands of grumpy
		coders, and so OS-makers will forever be on the shit-list of
		anyone who counts for anything in the high-tech world.</em>
	    </p>

	    <p>
	      And that was written in 1999.  Plus ça change, plus c'est la même chose.
	    </p>
	  </li>
	</ul>
]]></description>
    </item>

  </channel>
</rss>
