<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<feed xmlns="http://www.w3.org/2005/Atom">

	<title>Planet GStreamer</title>
	<link rel="self" href="http://gstreamer.freedesktop.org/atom.xml"/>
	<link href="http://gstreamer.freedesktop.org/"/>
	<id>http://gstreamer.freedesktop.org/atom.xml</id>
	<updated>2012-05-22T21:47:25+00:00</updated>
	<generator uri="http://www.planetplanet.org/">Planet/2.0 +http://www.planetplanet.org</generator>

	<entry xml:lang="en">
		<title type="html">Break the kettles and sink the boats</title>
		<link href="http://jeff.ecchi.ca/blog/2012/05/19/break-the-kettles-and-sink-the-boats/"/>
		<id>http://jeff.ecchi.ca/blog/?p=2134</id>
		<updated>2012-05-19T18:22:32+00:00</updated>
		<content type="html">&lt;p&gt;&lt;img class=&quot;alignnone size-full wp-image-2135&quot; title=&quot;break the kettles and sink the boats&quot; src=&quot;http://jeff.ecchi.ca/blog/wp-content/uploads/break-the-kettles-and-sink-the-boats.jpg&quot; alt=&quot;&quot; width=&quot;535&quot; height=&quot;374&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-2134&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This is it&lt;/strong&gt;.  The &amp;#8220;ges&amp;#8221; branch of &lt;a href=&quot;http://pitivi.org&quot;&gt;Pitivi&lt;/a&gt; has been merged to &amp;#8220;master&amp;#8221;.&lt;/p&gt;
&lt;p&gt;The changes that have been merged are quite significant: over four hundred commits, 175 files changed, 13943 insertions and 30341 deletions (net result: &lt;strong&gt;more than 16 thousand lines of code removed while&lt;/strong&gt; at the same time&lt;strong&gt; &lt;em&gt;adding&lt;/em&gt; features and solving longstanding bugs&lt;/strong&gt;).&lt;/p&gt;
&lt;p&gt;While &amp;#8220;master&amp;#8221; is certainly far from bug-free, it is now a decent base to build upon. Perfect is the enemy of the good. Let us now move ahead resolutely and without fear to achieve victory: 0.16 will be a superb release and I am thrilled by what&amp;#8217;s going to happen this summer with the GSoC projects.&lt;/p&gt;
&lt;p&gt;See &lt;a href=&quot;http://wiki.pitivi.org/wiki/Building_with_GES&quot;&gt;this page&lt;/a&gt; for build instructions, including a script that automates the process.&lt;/p&gt;
&lt;p&gt;By the way, if you happen to be around, I will be presenting in Hong Kong at &lt;a href=&quot;http://gnome.asia&quot;&gt;GNOME.Asia&lt;/a&gt; next month.&lt;/p&gt;</content>
		<author>
			<name>Jean-François Fortin Tam</name>
			<uri>http://jeff.ecchi.ca/blog/</uri>
		</author>
		<source>
			<title type="html">Nekohayo !</title>
			<subtitle type="html">La vie personnelle du chat</subtitle>
			<link rel="self" href="http://jeff.ecchi.ca/blog/feed/"/>
			<id>http://jeff.ecchi.ca/blog/feed/</id>
			<updated>2012-05-19T22:17:22+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Notes on Apple IR remotes reverse-engineering</title>
		<link href="http://www.hadess.net/2012/05/notes-on-apple-ir-remotes-reverse.html"/>
		<id>tag:blogger.com,1999:blog-977684764667858073.post-6564777503892653666</id>
		<updated>2012-05-18T17:47:05+00:00</updated>
		<content type="html">In 2009, I &lt;a href=&quot;http://pkgs.fedoraproject.org/gitweb/?p=kernel.git;a=blob;f=add-appleir-usb-driver.patch;h=0ab0ed6f4a1f8592978939e7bff940d88f66cd86;hb=526b8c386ed73775fccc7dc2159b6ab0cabe9c12&quot;&gt;wrote a driver&lt;/a&gt; to make &lt;a href=&quot;http://en.wikipedia.org/wiki/Apple_Remote&quot;&gt;the infra-red remote&lt;/a&gt; on my original MacBookAir work out-of-the-box on Linux. The driver was rejected upstream on the basis that the device would soon be supported through more generic means. In the meanwhile, it lived in Fedora's kernel tree, and I took some notes about &lt;a href=&quot;http://support.apple.com/kb/HT1619&quot;&gt;implementing pairing&lt;/a&gt;, so that only your remote would work with your computer.&lt;br /&gt;&lt;br /&gt;I'm posting this now because I wanted to poke at a MacOS X application today, and couldn't for the life of me remember the name of &lt;a href=&quot;https://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man1/fs_usage.1.html&quot;&gt;the program to monitor disk-activity&lt;/a&gt;. Hope this finds its way to a search engine near you.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Launched the System Preferences, Security, and unlock the panel.&lt;/li&gt;&lt;li&gt;In a terminal:&amp;nbsp;&lt;span&gt;sudo fs_usage -f filesys -w&amp;nbsp;&lt;/span&gt;and check the output when enabling/disabling the remote.&lt;/li&gt;&lt;li&gt;We can see the modified file is&amp;nbsp;&lt;span&gt;/Library/Preferences/com.apple.driver.AppleIRController.plist&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Installed &lt;a href=&quot;http://www.apple.com/downloads/macosx/development_tools/plisteditpro.html&quot;&gt;PlistEditPro&lt;/a&gt;&amp;nbsp;and opened the file up.&lt;/li&gt;&lt;li&gt;Now try to pair a remote (menu and next together)&lt;/li&gt;&lt;li&gt;You can see the UID value changing in the file. I named the remotes I had available to me:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/File:Apple_Remote_2009.jpg&quot;&gt;New remote&lt;/a&gt;:&amp;nbsp;UID = 145&amp;nbsp;&lt;/li&gt;&lt;li&gt;Old clean remote:&amp;nbsp;UID = 24&lt;/li&gt;&lt;li&gt;Old dirty remote:&amp;nbsp;UID = 227&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;After adding some debug to the aforementioned appleir driver, in Linux, I got:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;New remote:&amp;nbsp;&lt;span&gt;appleir: received (5 bytes) 25 87 e0 91 02&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Old clean remote:&amp;nbsp;&lt;span&gt;appleir: received (5 bytes) 25 87 e0 18 03&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Old dirty remote:&amp;nbsp;&lt;span&gt;appleir: received (5 bytes) 25 87 e0 e3 02&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;So the 4th byte is the remote's UID.&lt;/li&gt;&lt;/ul&gt;Now one could implement remote pairing using a sysfs attribute, a udev helper to apply the pairing across reboots, and PolicyKit helper to set and save the paired UID.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This will be left as an exercise to the reader :)&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/977684764667858073-6564777503892653666?l=www.hadess.net&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>hadess</name>
			<email>noreply@blogger.com</email>
			<uri>http://hadess.net/</uri>
		</author>
		<source>
			<title type="html">/bɑs ˈtjɛ̃ no ˈse ʁɑ/  (hadess) | News</title>
			<link rel="self" href="http://www.hadess.net/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-977684764667858073</id>
			<updated>2012-05-22T19:17:05+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Those Funny Funguloids</title>
		<link href="http://blog.mikeasoft.com/2012/05/16/those-funny-funguloids/"/>
		<id>http://blog.mikeasoft.com/?p=375</id>
		<updated>2012-05-16T12:23:37+00:00</updated>
		<content type="html">&lt;p&gt;&lt;/p&gt;
&lt;h3&gt;Overview&lt;/h3&gt;
&lt;p&gt; Recently I&amp;#8217;ve spent a little time getting the &lt;a href=&quot;http://www.ogre3d.org&quot;&gt;Ogre3D engine&lt;/a&gt; into a state where it&amp;#8217;ll work on the &lt;a href=&quot;http://swipe.nokia.com&quot;&gt;Nokia N9 and N950&lt;/a&gt; MeeGo phones.&lt;/p&gt;
&lt;p&gt; To test the port out a bit more extensively I decided it&amp;#8217;d be a good idea to try porting an existing game, at which point &lt;a href=&quot;http://rzr.online.fr&quot;&gt;rzr&lt;/a&gt; suggested &lt;a href=&quot;http://funguloids.sf.net&quot;&gt;Those Funny Funguloids&lt;/a&gt;. So after a fair amount of hacking to make it compatible with my version of Ogre and to make the controls work reasonably on a touch screen device I have a playable version.&lt;/p&gt;
&lt;p&gt; The aim of the game is to collect mushrooms (&amp;#8230;&lt;b&gt;IN SPACE&lt;/b&gt;), and bring them back to your base without running into any asteroids. Only mushrooms of the same colour as your base are added to your score and your base changes colour each level (but you can hang on to mushrooms between levels and score them later). The controls are fairly simple, touch the left side of the screen to turn left, the right side to turn right and the middle to start moving.&lt;/p&gt;
&lt;p&gt; When I have a bit more time I&amp;#8217;ll see about writing a little tutorial on making use of my modified version of Ogre3D to create 3D applications and games in a way that&amp;#8217;s easy to distribute.&lt;/p&gt;
&lt;h3&gt;Screenshots&lt;/h3&gt;
&lt;p&gt;&lt;center&gt;&lt;br /&gt;
&lt;a href=&quot;http://mikeasoft.com/~mike/funguloids-n9-title.png&quot;&gt;&lt;img alt=&quot;Funguloids menu screen&quot; src=&quot;http://mikeasoft.com/~mike/funguloids-n9-title-small.png&quot; title=&quot;Funguloids Title&quot; class=&quot;alignnone&quot; width=&quot;320&quot; height=&quot;180&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://mikeasoft.com/~mike/funguloids-n9-start.png&quot;&gt;&lt;img alt=&quot;Funguloids menu screen&quot; src=&quot;http://mikeasoft.com/~mike/funguloids-n9-start-small.png&quot; title=&quot;Funguloids Title&quot; class=&quot;alignnone&quot; width=&quot;320&quot; height=&quot;180&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/center&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;h3&gt;Video&lt;/h3&gt;
&lt;p&gt;&lt;center&gt;&lt;br /&gt;
&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=erWj_Q6LEcY&quot;&gt;Video of gameplay&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;h3&gt;Download&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://mikeasoft.com/~mike/funguloids_1.0.6-3_armel.deb&quot;&gt;funguloids_1.0.6-3_armel.deb&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Source&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://mikeasoft.com/~mike/funguloids-1.06-meego.tar.gz&quot;&gt;Modified version of Funguloids 1.06&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://mikeasoft.com/~mike/ogre-1.7.4-meego.tar.gz&quot;&gt;Modified version of Ogre 1.7.4&lt;/a&gt;&lt;/p&gt;</content>
		<author>
			<name>Michael Sheldon</name>
			<uri>http://blog.mikeasoft.com/</uri>
		</author>
		<source>
			<title type="html">Michael Sheldon's Stuff</title>
			<link rel="self" href="http://blog.mikeasoft.com/feed/"/>
			<id>http://blog.mikeasoft.com/feed/</id>
			<updated>2012-05-19T12:47:16+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">stranger in these parts</title>
		<link href="http://wingolog.org/archives/2012/05/16/stranger-in-these-parts"/>
		<id>http://wingolog.org/2012/05/16/stranger-in-these-parts</id>
		<updated>2012-05-16T11:35:25+00:00</updated>
		<content type="html">&lt;div&gt;&lt;p&gt;My &lt;a href=&quot;http://2012.jsconf.us/&quot;&gt;JSConf 2012&lt;/a&gt; video is out!  Check it out:&lt;/p&gt;&lt;p&gt; &lt;a href=&quot;http://blip.tv/jsconf/jsconf2012-andy-wingo-6139109&quot;&gt;Visit blip.tv to watch in your browser&lt;/a&gt; &lt;/p&gt;&lt;p&gt;The talk is called &quot;Stranger in these parts: A hired gun in the JS corral&quot;, and in it I talk about my experiences as a Schemer in the implementation world, with a focus on JavaScriptCore, the JS implementation of the WebKit project.&lt;/p&gt;&lt;p&gt;If you want, you can fetch the &lt;a href=&quot;http://wingolog.org/pub/jsconf-2012-slides.pdf&quot;&gt;slides&lt;/a&gt; or the &lt;a href=&quot;http://wingolog.org/pub/jsconf-2012-notes.pdf&quot;&gt;notes&lt;/a&gt;.  If you were unable to play the video in the browser, you can &lt;a href=&quot;http://wingolog.org/pub/jsconf-2012-stranger-in-these-parts.mp4&quot;&gt;download it&lt;/a&gt; directly (25 minutes, ~80 MB, CC-BY-SA).&lt;/p&gt;&lt;p&gt;Special thanks to the A/V team for the fine recording.  My talk was the first one that used the wireless mics, and it turned out there was some intermittent interference.  They corrected this in later talks by double-miking the speakers.  In my case, it was fortunate that they recorded the room as well, and with (I would imagine) a fair amount of post-processing the sound is perfectly intelligible.  Cheers!&lt;/p&gt;&lt;p&gt;Finally, there were a number of other interesting talks whose &lt;a href=&quot;http://blip.tv/jsconf&quot;&gt;recordings&lt;/a&gt; are starting to come out.  I especially liked &lt;a href=&quot;http://blip.tv/jsconf/jsconf2012-david-nolen-6141386&quot;&gt;David Nolen's funhouse of ClojureScript and logic programming&lt;/a&gt;.  It was pleasantly strange to see him mention Peter Norvig's 1992 book, &lt;i&gt;Paradigms of Artificial Intelligence Programming&lt;/i&gt;, because I did too, and I think someone else did as well.  Three people mentioning a somewhat obscure 20-year-old book, what are the odds?&lt;/p&gt;&lt;p&gt;I also liked Vyacheslav's &lt;a href=&quot;http://blip.tv/jsconf/jsconf2012-vyacheslav-egorov-6141593&quot;&gt;amusing talk on V8's optimizing compiler&lt;/a&gt;.  He actually showed some assembler!  Folks that read this webrag might find it interesting.  Dan Ingalls' talk was fun too.  The ending scene was pretty surreal; be sure to watch all the way through.&lt;/p&gt;&lt;p&gt;Thanks again to the JSConf organizers for the invitation to speak.  It was a pleasure to get to hang around the lively and energetic JS community.  Happy hacking, all!&lt;/p&gt;&lt;/div&gt;</content>
		<author>
			<name>Andy Wingo</name>
			<uri>http://wingolog.org/</uri>
		</author>
		<source>
			<title type="html">wingolog</title>
			<subtitle type="html">A mostly dorky weblog by Andy Wingo</subtitle>
			<link rel="self" href="http://wingolog.org/feed/atom/"/>
			<id>http://wingolog.org/feed/atom</id>
			<updated>2012-05-22T10:47:17+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">doing it wrong: cse in guile</title>
		<link href="http://wingolog.org/archives/2012/05/14/doing-it-wrong-cse-in-guile"/>
		<id>http://wingolog.org/2012/05/14/doing-it-wrong-cse-in-guile</id>
		<updated>2012-05-14T17:07:14+00:00</updated>
		<content type="html">&lt;div&gt;&lt;p&gt;Greetings, readers!  It's been a little while, but not because I haven't been doing anything, or nothing worth writing about.  No, the reason I haven't written recently is because the perceived range of my ignorance has been growing faster than the domain of my expertise.  &lt;/p&gt;&lt;p&gt;Knowledge may well be something one can dominate, but ignorance must forever be a range, stretching off to a hazy horizon.  Climbing the hill of JavaScript implementations has let me see farther out on that plain.  I think it's only the existence of the &lt;a href=&quot;http://en.wikipedia.org/wiki/There_are_known_knowns&quot;&gt;unknown unknowns&lt;/a&gt; that can let one muster up the arrogance to write at all.&lt;/p&gt;&lt;p&gt;But back to domains and dominators later.  To begin, I note that there is very little in the way of correct, current, and universal folk wisdom as to how to implement a programming language.  Compiler hackers are priests of their languages, yes, but their temples are in reality more or less isolated cults, in which the values of one's Gods may be unknown or abhorrent to those of others.  Witness the attention paid to loop optimizations in some languages, compared to garbage collection in others, or closures in still others.&lt;/p&gt;&lt;p&gt;In my ecumenical capacity as abbot of Guile and adjunct deacon of JavaScriptCore, sometimes I'm tempted to mix rites: to sprinkle the holy water of lexical scope optimizations on JS, and, apropos of this article, to exorcise common subexpressions in Scheme.&lt;/p&gt;&lt;p&gt;As one might well imagine, the rites of one cult must be adapted to circumstances.  I implemented CSE for Guile, but I don't know if it was actually a win.  In this article I'll go into what CSE is, how it works in Guile, why it probably won't survive in its present form.&lt;/p&gt;&lt;p&gt;&lt;b&gt;cse: common subexpression elimination&lt;/b&gt;&lt;/p&gt;&lt;p&gt;I implemented a source-to-source optimization pass in &lt;a href=&quot;http://gnu.org/s/guile/&quot;&gt;Guile&lt;/a&gt; that eliminates common subexpressions.  It actually does both more and less than that: it propagates predicates and eliminates effect-free statements as well, and these latter optimizations are why I implemented the pass in the first place.&lt;/p&gt;&lt;p&gt;Let me give an example.  Let's imagine we implement a binary tree in Guile, using the &lt;a href=&quot;http://www.gnu.org/software/guile/manual/html_node/SRFI_002d9.html&quot;&gt;records facility&lt;/a&gt;.&lt;/p&gt;&lt;pre&gt;
(use-modules (srfi srfi-9))

(define-record-type btree
  (make-btree elt left right)
  btree?
  (elt btree-elt)
  (left btree-left)
  (right btree-right))

(define *btree-null* #f)

(define (btree-cons head tail)
  (if (btree? tail)
      (let ((elt (btree-elt tail)))
        (if (&amp;lt; elt head)
            (make-btree elt
                        (btree-left tail)
                        (btree-cons head (btree-right tail)))
            (make-btree elt
                        (btree-cons head (btree-left tail))
                        (btree-right tail))))
      (make-btree head
                  *btree-null*
                  *btree-null*)))
&lt;/pre&gt;&lt;p&gt;That's enough to illustrate my point, I think.  We have the data type, the base case, and a constructor.  Of course in Haskell or something with better data types it would be much cleaner, but hey, let's roll with this.&lt;/p&gt;&lt;p&gt;If you look at &lt;tt&gt;btree-cons&lt;/tt&gt;, it doesn't seem to be amenable in its current form to classic common subexpression elimination.  People don't tend to write duplicated code.  You see that I bound the temporary &lt;var&gt;elt&lt;/var&gt; instead of typing &lt;tt&gt;(btree-elt btree)&lt;/tt&gt; each time, and that was partly because of typing, and partly out of some inner efficiency puritan, telling me I shouldn't write duplicate expressions.  (Cult behavior, again!)&lt;/p&gt;&lt;p&gt;But, note that all of these record abstractions will probably inline, instead of calling out to procedures.  (They are implemented as &lt;a href=&quot;http://www.gnu.org/software/guile/manual/html_node/Inlinable-Procedures.html&quot;&gt;inlinable procedures&lt;/a&gt;.  Yes, it would be better to have cross-module inlining, but we don't, so this is what we do.)  In general, syntactic abstraction in Scheme can lead to duplicate code.  Apologies in advance for this eyeball-rending torrent, but here's a listing of what &lt;tt&gt;btree-cons&lt;/tt&gt; reduces to, after expansion and partial evaluation:&lt;/p&gt;&lt;pre&gt;
(define (btree-cons head tail)
  (if (and (struct? tail)
           (eq? (struct-vtable tail) btree))
      (let ((elt (if (eq? (struct-vtable tail) btree)
                     (struct-ref tail 0)
                     (throw 'wrong-type-arg
                            'btree-elt
                            &quot;Wrong type argument: ~S&quot;
                            (list tail)
                            (list tail)))))
        (if (&amp;lt; elt head)
            (let ((left (if (eq? (struct-vtable tail) btree)
                            (struct-ref tail 1)
                            (throw 'wrong-type-arg
                                   'btree-left
                                   &quot;Wrong type argument: ~S&quot;
                                   (list tail)
                                   (list tail))))
                  (right (btree-cons
                           head
                           (if (eq? (struct-vtable tail) btree)
                               (struct-ref tail 2)
                               (throw 'wrong-type-arg
                                      'btree-right
                                      &quot;Wrong type argument: ~S&quot;
                                      (list tail)
                                      (list tail))))))
              (make-struct/no-tail btree elt left right))
            (let ((left (btree-cons
                          head
                          (if (eq? (struct-vtable tail) btree)
                              (struct-ref tail 1)
                              (throw 'wrong-type-arg
                                     'btree-left
                                     &quot;Wrong type argument: ~S&quot;
                                     (list tail)
                                     (list tail)))))
                  (right (if (eq? (struct-vtable tail) btree)
                             (struct-ref tail 2)
                             (throw 'wrong-type-arg
                                    'btree-right
                                    &quot;Wrong type argument: ~S&quot;
                                    (list tail)
                                    (list tail)))))
              (make-struct/no-tail btree elt left right))))
      (let ((left *btree-null*) (right *btree-null*))
        (make-struct/no-tail btree head left right))))
&lt;/pre&gt;&lt;p&gt;Again, I'm really sorry about that, and it's not just for your eyes:  it's also because that's a crapload of code for what should be a simple operation.  It's also redundant!  There are 6 checks that &lt;var&gt;btree&lt;/var&gt; is in fact a btree, when only one is needed semantically.  (Note that the null case is not a btree, of course.)&lt;/p&gt;&lt;p&gt;Furthermore, all of the checks in the first arm of the &lt;tt&gt;if&lt;/tt&gt; are redundant.  The code above is what the optimizer produces -- which is, you know, turrible.&lt;/p&gt;&lt;p&gt;So, I thought, we could run a pass over the source that tries to propagate predicates, and then tries to fold predicates whose boolean value we already know.&lt;/p&gt;&lt;p&gt;And that's what I did.  Here's what Guile's optimizer does with the function, including the CSE pass:&lt;/p&gt;&lt;pre&gt;
(define (btree-cons head tail)
  (if (and (struct? tail)
           (eq? (struct-vtable tail) btree))
      (let ((elt (struct-ref tail 0)))
        (if (&amp;lt; elt head)
            (let ((left (struct-ref tail 1))
                  (right (btree-cons head (struct-ref tail 2))))
              (make-struct/no-tail btree elt left right))
            (let ((left (btree-cons head (struct-ref tail 1)))
                  (right (struct-ref tail 2)))
              (make-struct/no-tail btree elt left right))))
      (let ((left *btree-null*) (right *btree-null*))
        (make-struct/no-tail btree head left right))))
&lt;/pre&gt;&lt;p&gt;This is much better.  It's quite close to the source program, except the symbolic references like &lt;tt&gt;btree-elt&lt;/tt&gt; have been replaced with indexed references.  The type check in the predicate of the &lt;tt&gt;if&lt;/tt&gt; expression propagated to all the other type checks, causing those nested &lt;tt&gt;if&lt;/tt&gt; expressions to fold.&lt;/p&gt;&lt;p&gt;Of course, CSE can also propagate bound lexicals:&lt;/p&gt;&lt;pre&gt;
(let ((y (car x)))
  (car x))
=&amp;gt; (let ((y (car x)))
     y)
&lt;/pre&gt;&lt;p&gt;This is the classic definition of CSE.&lt;/p&gt;&lt;p&gt;&lt;b&gt;but is it a win?&lt;/b&gt;&lt;/p&gt;&lt;p&gt;I should be quite pleased with the results, except that CSE makes Guile's compiler approximately twice as slow.  Granted, in the long run, this should be acceptable: code is usually run many more times than it is compiled.  But this is a fairly expensive pass, and yet at the same time it's not as good as it could be.&lt;/p&gt;&lt;p&gt;In order to get to the heart of the matter, I need to explain a little about the implementation.  CSE is a post-pass, that runs after &lt;a href=&quot;http://wingolog.org/archives/2011/10/11/partial-evaluation-in-guile&quot;&gt;partial evaluation&lt;/a&gt; (peval).  I tried to make it a part of peval, as the two optimizations are synergistic -- oh yes, let's revel in that word -- are you feeling it? -- but it was too complicated in the end.  The reason is that in functions like this:&lt;/p&gt;&lt;pre&gt;
(define (explode btree)
  (unless (btree? btree)
    (error &quot;not a btree&quot; btree))
  (values (btree-head btree)
          (btree-left btree)
          (btree-right btree)))
&lt;/pre&gt;&lt;p&gt;Here we have a sequence of two expressions.  Since the first one bails out if the predicate is false, we should propagate a true predicate past the first expression.  This means that running CSE on an expression returns two values: the rewritten expression, given the predicates already seen; and a new set of predicates that the expression asserts.  We should be able to use these new assertions to elide the type checks in the second expression.  And indeed, Guile can do this.&lt;/p&gt;&lt;p&gt;Perhaps you can see the size of the problem now.  CSE is a pass that runs over all code, building up an ordered set of expressions that were evaluated, and in what context.  When it sees a new expression in a test context -- as the predicate in an &lt;tt&gt;if&lt;/tt&gt; -- it checks to see if the set contains that expression (or its negation) already, in test context, and if so tries to fold the expression to true or false.  Already doing this set lookup and traversal is expensive -- at least N log N in the total size of the program, with some quadratic components in the case an expression is found, and also with high constant factors due to the need for custom hash and equality predicates.&lt;/p&gt;&lt;p&gt;The quadratic factor comes in when walking the set to see if the elimination is valid.  Consider:&lt;/p&gt;&lt;pre&gt;
(if (car x)
    (if (car x) 10 20)
    30)
&lt;/pre&gt;&lt;p&gt;Here, we should be able to eliminate the second &lt;tt&gt;(car x)&lt;/tt&gt;, folding to &lt;tt&gt;(if (car x) 10 30)&lt;/tt&gt;.  However, in this one:&lt;/p&gt;&lt;pre&gt;
(if (car x)
    (begin
      (y)
      (if (car x) 10 20))
    30)
&lt;/pre&gt;&lt;p&gt;If we don't know what &lt;tt&gt;(y)&lt;/tt&gt; does, then we can't fold the second test, because perhaps &lt;tt&gt;(y)&lt;/tt&gt; will change the contents of the pair, &lt;tt&gt;x&lt;/tt&gt;.  The information that allows us to make these decisions is &lt;i&gt;effects analysis&lt;/i&gt;.  For the purposes of Guile's optimizer, &lt;tt&gt;(car x)&lt;/tt&gt; has two dependencies and can cause two effects: it depends on the contents of a mutable value, and on the value of a toplevel (&lt;tt&gt;x&lt;/tt&gt;), and can cause the effect of an unbound variable error when resolving the toplevel, or a type error when accessing its car.  Two expressions commute if neither depends on effects that the other causes.&lt;/p&gt;&lt;p&gt;I stole the idea of doing a coarse effects analysis, and representing it as bits in a small integer, from V8.  Guile's version is here: &lt;a href=&quot;http://git.savannah.gnu.org/gitweb/?p=guile.git;a=blob;f=module/language/tree-il/effects.scm&quot;&gt;effects.scm&lt;/a&gt;.  The ordered set is a form of global value numbering.  See the CSE pass here: &lt;a href=&quot;http://git.savannah.gnu.org/gitweb/?p=guile.git;a=blob;f=module/language/tree-il/cse.scm&quot;&gt;cse.scm&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;The commute test is fairly cheap, but the set traversal is currently a bit expensive.&lt;/p&gt;&lt;p&gt;&lt;b&gt;and for what?&lt;/b&gt;&lt;/p&gt;&lt;p&gt;As I have indicated, the pass does do something useful on real programs, as in the binary tree example.  But it does not do all it could, and it's difficult to fix that, for a few reasons.&lt;/p&gt;&lt;p&gt;Unlike traditional CSE, Guile's version of it is interprocedural.  Instead of operating on just one basic block or one function, it operates across nested functions as well.  However, only some dependencies can commute across a function boundary.  For example:&lt;/p&gt;&lt;pre&gt;
(lambda (x)
  (if (pair? x)
      (let ((y (car x)))
        (lambda ()
          (and (pair? x) (car x))))))
&lt;/pre&gt;&lt;p&gt;Can the first &lt;tt&gt;pair?&lt;/tt&gt; test propagate to the second expression?  It can, because &lt;tt&gt;pair?&lt;/tt&gt; does not depend on the values of mutable data, or indeed on any effect.  If it's true once, it will always be true.&lt;/p&gt;&lt;p&gt;But can we replace the second &lt;tt&gt;(car x)&lt;/tt&gt; with &lt;tt&gt;y&lt;/tt&gt;?  No, because &lt;tt&gt;(car x)&lt;/tt&gt; has a dependency on mutable data, and because we don't do escape analysis on the closure, we don't let those dependencies commute across a procedure boundary.  (In this case, even if we did escape analysis, we'd have the same conclusion.)&lt;/p&gt;&lt;p&gt;However, not all &lt;tt&gt;lambda&lt;/tt&gt; abstractions are closures.  Some of them might end up being compiled to labels in the function.  Scheme uses syntactically recursive procedures to implement loops, after all.  But Guile's CSE does poorly for &lt;tt&gt;lambda&lt;/tt&gt; expressions that are actually labels.  The reason is that &lt;i&gt;lexical scope is not a dominator tree&lt;/i&gt;.&lt;/p&gt;&lt;p&gt;MLton hacker Stephen Weeks says it better than I do:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Thinking of it another way, both CPS and SSA require that variable definitions dominate uses.  The difference is that using CPS as an IL requires that all transformations provide a proof of dominance in the form of the nesting, while SSA doesn't.  Now, if a CPS transformation doesn't do too much rewriting, then the partial dominance information that it had from the input tree is sufficient for the output tree.  Hence tree splicing works fine.  However, sometimes it is not sufficient.&lt;/p&gt;&lt;p&gt;As a concrete example, consider common-subexpression elimination.  Suppose we have a common subexpression &lt;tt&gt;x = e&lt;/tt&gt; that dominates an expression &lt;tt&gt;y = e&lt;/tt&gt; in a function.  In CPS, if &lt;tt&gt;y = e&lt;/tt&gt; happens to be within the scope of &lt;tt&gt;x = e&lt;/tt&gt;, then we are fine and can rewrite it to &lt;tt&gt;y = x&lt;/tt&gt;.  If however, &lt;tt&gt;y = e&lt;/tt&gt; is not within the scope of &lt;tt&gt;x&lt;/tt&gt;, then either we have to do massive tree rewriting (essentially making the syntax tree closer to the dominator tree) or skip the optimization.  Another way out is to simply use the syntax tree as an approximation to the dominator tree for common-subexpression elimination, but then you miss some optimization opportunities.  On the other hand, with SSA, you simply compute the dominator tree, and can always replace &lt;tt&gt;y = e&lt;/tt&gt; with &lt;tt&gt;y = x&lt;/tt&gt;, without having to worry about providing a proof in the output that &lt;tt&gt;x&lt;/tt&gt; dominates &lt;tt&gt;y&lt;/tt&gt;. (i.e. without putting &lt;tt&gt;y&lt;/tt&gt; in the scope of &lt;tt&gt;x&lt;/tt&gt;)&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://mlton.org/pipermail/mlton/2003-January/023054.html&quot;&gt;[MLton-devel] CPS vs SSA&lt;/a&gt; &lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;See my &lt;a href=&quot;http://wingolog.org/archives/2011/07/12/static-single-assignment-for-functional-programmers&quot;&gt;article on SSA and CPS&lt;/a&gt; for more context.&lt;/p&gt;&lt;p&gt;So that's one large source of lost CSE opportunities, especially in loops.&lt;/p&gt;&lt;p&gt;Another large source of lost opportunities is that the Tree-IL language, which is basically a macro-expanded Scheme, has the same property that Scheme does, that the order of evaluation of operands is unspecified.&lt;/p&gt;&lt;p&gt;Consider the base-case clause of my &lt;tt&gt;btree-cons&lt;/tt&gt; above:&lt;/p&gt;&lt;pre&gt;
(let ((left *btree-null*) (right *btree-null*))
  (make-struct/no-tail btree head left right))
&lt;/pre&gt;&lt;p&gt;Now, &lt;tt&gt;*btree-null*&lt;/tt&gt; is a toplevel lookup, that might have an unbound-variable effect.  We should be able to eliminate one of them, though.  Why doesn't the CSE pass do it?  Because in Tree-IL, the order of evaluation of the right-hand-sides of &lt;var&gt;left&lt;/var&gt; and &lt;var&gt;right&lt;/var&gt; is unspecified.  This gives Guile some useful freedoms, but little information for CSE.&lt;/p&gt;&lt;p&gt;This is an instance of a more general problem, that Tree-IL might be too high-level to be useful for CSE.  For example, at runtime, not all lexical references are the same -- some are local, and some reference free variables.  For mutated free variables, the variable is itself in a box, so to reference it you would load the box into a local and then dereference the box.  CSE should allow you to eliminate duplicate loads of the box, even in the case that it can't eliminate duplicate references into the box.&lt;/p&gt;&lt;p&gt;&lt;b&gt;conclusion&lt;/b&gt;&lt;/p&gt;&lt;p&gt;It is nice to be able to eliminate the duplicate checks, but not at any price.  Currently the bootstrapping time cost is a bit irritating.  I have other ideas on how to fix that, but ultimately we probably need to re-implement CSE at some lower level.  More on that in a future post.  Until then, happy hacking.&lt;/p&gt;&lt;/div&gt;</content>
		<author>
			<name>Andy Wingo</name>
			<uri>http://wingolog.org/</uri>
		</author>
		<source>
			<title type="html">wingolog</title>
			<subtitle type="html">A mostly dorky weblog by Andy Wingo</subtitle>
			<link rel="self" href="http://wingolog.org/feed/atom/"/>
			<id>http://wingolog.org/feed/atom</id>
			<updated>2012-05-22T10:47:17+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">GStreamer Core 0.11.91, Base Plugins 0.11.91, Good Plugins 0.11.91, Bad
      Plugins 0.11.91, Ugly Plugins 0.11.91, libav Plugins 0.11.91 unstable release</title>
		<link href="http://gstreamer.freedesktop.org/news/#2012-05-13T17:06:00Z"/>
		<id>http://gstreamer.freedesktop.org/news/#2012-05-13T17:06:00Z</id>
		<updated>2012-05-13T15:17:31+00:00</updated>
		<content type="html">&lt;p&gt;
The GStreamer team announces a new release of the GStreamer core,
Base/Good/Bad/Ugly/libav modules for the 0.11 GStreamer unstable release series.
&lt;/p&gt;&lt;p&gt;
This is the second release candidate of the upcoming 1.0 release. It
is intended for developers and people wanting to port their plugins and
applications to the new series. Only minor or absolutely necessary
changes to the core/base API/ABI will happen between this release and
the final 1.0.0 release.
&lt;/p&gt;&lt;p&gt;
Check out release notes for
&lt;a href=&quot;http://gstreamer.freedesktop.org/releases/gstreamer/0.11.91.html&quot;&gt;gstreamer core&lt;/a&gt; or
&lt;a href=&quot;http://gstreamer.freedesktop.org/releases/gst-plugins-base/0.11.91.html&quot;&gt;gst-plugins-base&lt;/a&gt;,
&lt;a href=&quot;http://gstreamer.freedesktop.org/releases/gst-plugins-good/0.11.91.html&quot;&gt;gst-plugins-good&lt;/a&gt;,
&lt;a href=&quot;http://gstreamer.freedesktop.org/releases/gst-plugins-bad/0.11.91.html&quot;&gt;gst-plugins-bad&lt;/a&gt;,
&lt;a href=&quot;http://gstreamer.freedesktop.org/releases/gst-plugins-ugly/0.11.91.html&quot;&gt;gst-plugins-ugly&lt;/a&gt;,
&lt;a href=&quot;http://gstreamer.freedesktop.org/releases/gst-libav/0.11.91.html&quot;&gt;gst-libav&lt;/a&gt;,
or download tarballs for
&lt;a href=&quot;http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.11.91.tar.xz&quot;&gt;gstreamer&lt;/a&gt; or
&lt;a href=&quot;http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.11.91.tar.xz&quot;&gt;gst-plugins-base&lt;/a&gt;,
&lt;a href=&quot;http://gstreamer.freedesktop.org/src/gst-plugins-good/gst-plugins-good-0.11.91.tar.xz&quot;&gt;gst-plugins-good&lt;/a&gt;,
&lt;a href=&quot;http://gstreamer.freedesktop.org/src/gst-plugins-bad/gst-plugins-bad-0.11.91.tar.xz&quot;&gt;gst-plugins-bad&lt;/a&gt;,
&lt;a href=&quot;http://gstreamer.freedesktop.org/src/gst-plugins-ugly/gst-plugins-ugly-0.11.91.tar.xz&quot;&gt;gst-plugins-ugly&lt;/a&gt;,
&lt;a href=&quot;http://gstreamer.freedesktop.org/src/gst-libav/gst-libav-0.11.91.tar.xz&quot;&gt;gst-libav&lt;/a&gt;,
    &lt;/p&gt;</content>
		<author>
			<name>GStreamer</name>
			<uri>http://gstreamer.freedesktop.org/news/</uri>
		</author>
		<source>
			<title type="html">GStreamer News</title>
			<subtitle type="html">Latest news from the GStreamer project</subtitle>
			<link rel="self" href="http://gstreamer.freedesktop.org/news/rss-1.0.xml"/>
			<id>http://gstreamer.freedesktop.org/news/rss-1.0.xml</id>
			<updated>2012-05-13T15:17:31+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">PulseAudio 2.0: Twice The Goodness!</title>
		<link href="http://arunraghavan.net/2012/05/pulseaudio-2-0-twice-the-goodness/"/>
		<id>http://arunraghavan.net/?p=1333</id>
		<updated>2012-05-12T10:50:34+00:00</updated>
		<content type="html">&lt;p&gt;That&amp;#8217;s right, it&amp;#8217;s finally out! Thanks go out to all our contributors for the great work (there&amp;#8217;s too many &amp;#8212; see the shortlog!). The highlights of the release follow. Head over to the &lt;a href=&quot;http://lists.freedesktop.org/archives/pulseaudio-discuss/2012-May/013538.html&quot;&gt;announcement&lt;/a&gt; or &lt;a href=&quot;http://www.freedesktop.org/wiki/Software/PulseAudio/Notes/2.0&quot;&gt;release notes&lt;/a&gt; for more details.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Dynamic sample rate switching by Pierre-Louis Bossart: This makes PulseAudio even more power efficient.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Jack detection by David Henningsson: Separate volumes for your laptop speakers and headphones, and more stuff coming soon.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Major echo canceller improvements by me: Based on the &lt;tt&gt;WebRTC.org&lt;/tt&gt; audio processing library, we now do better echo cancellation, remove the need to fiddle with the mic volume knob and have fixed &lt;acronym title=&quot;Acoustic Echo Cancellation&quot;&gt;AEC&lt;/acronym&gt; between laptop speakers and a USB webcam mic.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A virtual surround module by Niels Ole Salscheider: Try it out for some virtual surround sound shininess!&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Support for Xen guests by Giorgos Boutsiouki: Should make audio virtualisation in guests more efficient.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href=&quot;http://arunraghavan.net/wp-content/uploads/pa-releases.jpg&quot;&gt;&lt;img src=&quot;http://arunraghavan.net/wp-content/uploads/pa-releases-239x300.jpg&quot; alt=&quot;We don't always make a release, but when we do, it's awesome&quot; title=&quot;pa-releases&quot; width=&quot;239&quot; height=&quot;300&quot; class=&quot;aligncenter size-medium wp-image-1334&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Special thanks from me to &lt;a href=&quot;http://www.collabora.com/projects/pulseaudio/&quot;&gt;Collabora&lt;/a&gt; for giving me some time for upstream work.&lt;/p&gt;

&lt;p&gt;Packages are available on Gentoo, Arch, and probably soon on other distributions if they&amp;#8217;re not already there.&lt;/p&gt;</content>
		<author>
			<name>Arun Raghavan</name>
			<uri>http://arunraghavan.net/</uri>
		</author>
		<source>
			<title type="html">Arun Raghavan</title>
			<subtitle type="html">Extremely pithy tagline here</subtitle>
			<link rel="self" href="http://arunraghavan.net/feed/"/>
			<id>http://arunraghavan.net/feed/</id>
			<updated>2012-05-12T11:17:17+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">PyGObject 3.2.1 released</title>
		<link href="http://k-d-w.org/node/93"/>
		<id>http://k-d-w.org/93 at http://k-d-w.org</id>
		<updated>2012-05-10T19:10:52+00:00</updated>
		<content type="html">&lt;div class=&quot;field field-name-body field-type-text-with-summary field-label-hidden&quot;&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;p&gt;I am pleased to announce version 3.2.1 of the Python bindings for&lt;br /&gt;
GObject. This is a maintenance release for the stable branch bringing&lt;br /&gt;
you a couple of bug fixes.&lt;/p&gt;
&lt;h2&gt;Download&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;http://download.gnome.org/sources/pygobject/3.2/pygobject-3.2.1.tar.xz&quot;&gt;http://download.gnome.org/sources/pygobject/3.2/pygobject-3.2.1.tar.xz&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;sha256sum:
0f07401289fa33e8caee7a9342f5c838bb44cd0a386cb99093505edb5e42817a&lt;/pre&gt;&lt;!--break--&gt;&lt;h2&gt;Highlights&lt;/h2&gt;
&lt;ul&gt;&lt;li&gt;Add missing override for TreeModel.iter_previous() (Martin Pitt)&lt;/li&gt;
&lt;li&gt;GSettings: allow extra keyword arguments (Giovanni Campagna)&lt;/li&gt;
&lt;li&gt;pygtkcompat: Correct Userlist module use (Jose Rostagno)&lt;/li&gt;
&lt;li&gt;GTK overrides: Add missing keyword arguments (Martin Pitt)&lt;/li&gt;
&lt;li&gt;pygi-convert.py: Drop obsolete drag method conversions (Martin Pitt)&lt;/li&gt;
&lt;li&gt;Fix len_arg_index for array arguments (Bastian Winkler)&lt;/li&gt;
&lt;li&gt;Add missing GObject.TYPE_GTYPE (Martin Pitt)&lt;/li&gt;
&lt;li&gt;Add GtkComboBoxEntry compatibility (Paolo Borelli)&lt;/li&gt;
&lt;/ul&gt;&lt;h2&gt;Changes&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;http://download.gnome.org/sources/pygobject/3.2/pygobject-3.2.1.changes&quot;&gt;http://download.gnome.org/sources/pygobject/3.2/pygobject-3.2.1.changes&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;About PyGObject&lt;/h2&gt;
&lt;p&gt;GObject is a object system used by GTK+, GStreamer and other libraries.&lt;/p&gt;
&lt;p&gt;PyGObject provides a convenient wrapper for use in Python programs when&lt;br /&gt;
accessing GObject libraries.&lt;/p&gt;
&lt;p&gt;Like the GObject library itself PyGObject is licensed under the GNU&lt;br /&gt;
LGPL, so is suitable for use in both free software and proprietary&lt;br /&gt;
applications. It is already in use in many applications ranging from&lt;br /&gt;
small single purpose scripts up to large full featured applications.&lt;/p&gt;
&lt;p&gt;PyGObject now dynamically accesses any GObject libraries that uses&lt;br /&gt;
GObject Introspection. It replaces the need for separate modules such as&lt;br /&gt;
PyGTK, GIO and python-gnome to build a full GNOME 3.0 application. Once&lt;br /&gt;
new functionality is added to gobject library it is instantly available&lt;br /&gt;
as a Python API without the need for intermediate Python glue.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</content>
		<author>
			<name>Sebastian Pölsterl</name>
			<uri>http://k-d-w.org</uri>
		</author>
		<source>
			<title type="html">Sebastian Pölsterl's blog</title>
			<link rel="self" href="http://k-d-w.org/rss.xml"/>
			<id>http://k-d-w.org/rss.xml</id>
			<updated>2012-05-22T21:47:13+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Quart de siècle</title>
		<link href="http://jeff.ecchi.ca/blog/2012/05/10/quart-de-siecle/"/>
		<id>http://jeff.ecchi.ca/blog/?p=2131</id>
		<updated>2012-05-10T04:17:47+00:00</updated>
		<content type="html">&lt;p&gt;Today, I am turning 25 years old. &lt;em&gt;Holy carp&lt;/em&gt;. A quarter of a century old. At this rate, how the heck can I solve the massive amount of bugs remaining in GNOME and GStreamer in only a hundred years?&lt;/p&gt;</content>
		<author>
			<name>Jean-François Fortin Tam</name>
			<uri>http://jeff.ecchi.ca/blog/</uri>
		</author>
		<source>
			<title type="html">Nekohayo !</title>
			<subtitle type="html">La vie personnelle du chat</subtitle>
			<link rel="self" href="http://jeff.ecchi.ca/blog/feed/"/>
			<id>http://jeff.ecchi.ca/blog/feed/</id>
			<updated>2012-05-19T22:17:22+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Video decoding in a sandbox</title>
		<link href="http://guij.emont.org/blog/2012/05/08/video-decoding-in-a-sandbox/"/>
		<id>http://guij.emont.org/blog/?p=272</id>
		<updated>2012-05-08T09:01:45+00:00</updated>
		<content type="html">&lt;p&gt;
&lt;p&gt;I would like to explain a bit the stuff I've been working on recently at
&lt;a href=&quot;http://www.igalia.com/&quot;&gt;Igalia&lt;/a&gt;. It is about playing with GStreamer and a sandboxing system to try
and make the playback of untrusted media more secure. Hopefully writing this
will be an occasion for me to get more distance and understand things better,
and for others to give me feedback and ideas. Particularly, even though that is
for me a field of interest, I do not claim to have any real expertise in
security, therefore comments by people who know better would be gladly welcome.&lt;/p&gt;
&lt;p&gt;This story started when I decided to have a look at &lt;a href=&quot;http://www.chromium.org/Home&quot;&gt;chromium&lt;/a&gt; and its
internals. It turns out that one very specific aspect of this application is
its sandboxing system. In a nutshell, a &lt;a href=&quot;http://en.wikipedia.org/wiki/Sandbox_(computer_security)&quot;&gt;sandbox&lt;/a&gt; is a virtual container in
which untrusted programs can be safely run. In the real world, sandboxes are
rarely perfect, but they are a significant security improvement over not using
one. Chromium uses a sandbox to run its rendering engine (&lt;a href=&quot;http://www.webkit.org/&quot;&gt;WebKit&lt;/a&gt;), which
is basically the part that transforms the code of a web page into the graphical
representation of it that you see on your screen. The rationale for running
WebKit in a sandbox is not that it is untrusted code in itself, but rather that
it is a big and complex project that is bound to have bugs, like all big and
complex projects. On top of that, the input given to it is quite often data
from untrusted sources, which could potentially be forged so that it exploits
security bugs to do bad things to your computer and your beloved files. Now,
with WebKit running in a sandbox, if a web page has been forged by an attacker
to exploit a vulnerability in WebKit, the attacker will only have access to the
sandbox environment, which means that it won't be able to do things like access
the data on your computer, install software or connect to remote hosts.&lt;/p&gt;
&lt;p&gt;As you might know, I like to play with multimedia things, and have hacked quite
a bit on or around &lt;a href=&quot;http://gstreamer.freedesktop.org/&quot;&gt;GStreamer&lt;/a&gt;. Therefore, I quite automatically thought of
something else that might be worth running in a sandbox: demuxers and decoders.
They are relatively big and complex pieces of software to which we regularly
pass a whole bunch of untrusted data, would it be in a web context or a more
traditional desktop or mobile context.&lt;/p&gt;
&lt;p&gt;Fortunately, &lt;a href=&quot;https://www.cr0.org/&quot;&gt;Julien Tinnes&lt;/a&gt;, a developer of the chromium sandbox for
GNU/Linux made a stand alone version of it called &lt;a href=&quot;http://code.google.com/p/setuid-sandbox/&quot;&gt;setuid-sandbox&lt;/a&gt;, which
can be used by other projects to easily sandbox any process.&lt;/p&gt;
&lt;div id=&quot;architecture&quot;&gt;
&lt;h3&gt;Architecture&lt;/h3&gt;
&lt;p&gt;The way setuid-sandbox works is rather straightforward: there is a
&lt;tt&gt;sandboxme&lt;/tt&gt; command that needs to be installed setuid root. You run
&lt;tt&gt;sandboxme my_command&lt;/tt&gt; and then from inside &lt;tt&gt;my_command&lt;/tt&gt;, you first set up
the file descriptors that you will need (being careful not to put there
anything that could allow to escape the sandbox, more on that later), and then
you call the provided &lt;tt&gt;chrootme()&lt;/tt&gt; function, which will tell the
&lt;tt&gt;sandboxme&lt;/tt&gt; process to restrict the privileges that &lt;tt&gt;my_command&lt;/tt&gt; has (e.g.
it can still read and write on the fds that it has open, but it cannot open new
ones).&lt;/p&gt;
&lt;p&gt;Here is how I organised my integration of setuid-sandbox into GStreamer. What
I want to do for now is to put what I think are the &amp;quot;most dangerous&amp;quot; parts
(demuxing and decoding) in the sandbox, while letting the other components
(mainly source and sinks) outside of the sandbox (for now at least). I decided
to create a small program (called &lt;tt&gt;&lt;span&gt;gst-decoder&lt;/span&gt;&lt;/tt&gt;) that receives the original
muxed and encoded video stream and outputs the decoded video and audio buffers.
&lt;tt&gt;&lt;span&gt;gst-decoder&lt;/span&gt;&lt;/tt&gt; needs 3 channels of communication with the &amp;quot;controlling&amp;quot;
process outside the sandbox (which is called the &lt;em&gt;broker&lt;/em&gt;):&lt;/p&gt;
&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;one to pass the original stream from the source element in the broker to
&lt;tt&gt;&lt;span&gt;gst-decoder&lt;/span&gt;&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;one to pass the video buffers from &lt;tt&gt;&lt;span&gt;gst-decoder&lt;/span&gt;&lt;/tt&gt; to the video sink element
in the broker&lt;/li&gt;
&lt;li&gt;one to pass the audio buffers from &lt;tt&gt;&lt;span&gt;gst-decoder&lt;/span&gt;&lt;/tt&gt; to the audio sink element
in the broker&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;In the future, more channels for subtitle support or other features could be
desirable.&lt;/p&gt;
&lt;p&gt;Since I am lazy, I wanted to use off the shelf GStreamer elements to handle
these communication channels. For the cases explained above, that would be:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;the &lt;tt&gt;fdsink&lt;/tt&gt; element on the broker side, and the &lt;tt&gt;fdsrc&lt;/tt&gt; element in the
sandbox&lt;/li&gt;
&lt;li&gt;&lt;tt&gt;shmsink&lt;/tt&gt; (in &lt;tt&gt;&lt;span&gt;gst-decoder&lt;/span&gt;&lt;/tt&gt;) and &lt;tt&gt;shmsrc&lt;/tt&gt; (in the broker)&lt;/li&gt;
&lt;li&gt;same elements as above&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;Since I expect other people to be equally lazy^W^W^Wwant their life to be made
easier, my goal is to try and have this reasonably integrated in GStreamer, and
easy to integrate in applications. For that, my best idea so far was to make a
&lt;tt&gt;sandboxedecodebin&lt;/tt&gt; element that, from the outside, works like &lt;tt&gt;decodebin&lt;/tt&gt;
or &lt;tt&gt;decodebin2&lt;/tt&gt;, at least for simple cases: it has a sink pad that can take
any format you would throw at &lt;tt&gt;decodebin&lt;/tt&gt;, and it has an audio and a video
source pads that output the decoded result. In the future, it might or might
not be a good idea to try to integrate the &amp;quot;sandboxed&amp;quot; functionality in
&lt;tt&gt;decodebin&lt;/tt&gt; directly.&lt;/p&gt;
&lt;p&gt;I implemented &lt;tt&gt;sandboxeddecodebin&lt;/tt&gt; as a subclass of &lt;a href=&quot;http://gstreamer.freedesktop.org/data/doc/gstreamer/0.10.36/gstreamer/html/GstBin.html&quot;&gt;GstBin&lt;/a&gt;, and it has
the following flow inside it:&lt;/p&gt;
&lt;pre&gt;
fdsink -&amp;gt; [gst-decoder] | -&amp;gt; shmsrc (video) -&amp;gt; gdpdepay
                        | -&amp;gt; shmsrc (audio) -&amp;gt; gdpdepay
&lt;/pre&gt;
&lt;p&gt;Note that &lt;tt&gt;&lt;span&gt;gst-decoder&lt;/span&gt;&lt;/tt&gt; is an external (sandboxed) process, and not a GStreamer
element like the other entities of this data flow graph.
The sink pad of &lt;tt&gt;fdsink&lt;/tt&gt; and the source pads of the two &lt;tt&gt;gdpdepay&lt;/tt&gt; elements
are exported by &lt;tt&gt;sandboxeddecodebin&lt;/tt&gt; through ghost pads, which provides a
&lt;tt&gt;decodebin&lt;/tt&gt;-like interface.&lt;/p&gt;
&lt;p&gt;The &lt;tt&gt;&lt;span&gt;gst-decoder&lt;/span&gt;&lt;/tt&gt; program basically runs a pipeline that looks like that:&lt;/p&gt;
&lt;pre&gt;
fdsrc ! decodebin2 name=decoder
decoder. ! video/x-raw-yuv;video/x-raw-rgb ! gdppay ! shmsink (video)
decoder. ! audio/x-raw-int;audio/x-raw-float ! gdppay ! shmsink (audio)
&lt;/pre&gt;
&lt;p&gt;and it also makes sure to get the privilege dropped at the right time, which is
discussed below.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;when-to-drop-privileges&quot;&gt;
&lt;h3&gt;When to drop privileges?&lt;/h3&gt;
&lt;p&gt;The ordering of operations needs to be thought carefully to combine GStreamer,
and these elements in particular, with setuid-sandbox. Each of them brings its
own set of conditions.&lt;/p&gt;
&lt;p&gt;For setuid-sandbox, inside the sandbox (in &lt;tt&gt;&lt;span&gt;gst-decoder&lt;/span&gt;&lt;/tt&gt;):&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;before we call &lt;tt&gt;chrootme()&lt;/tt&gt;: we can open new fds and do a lot of nice
initialisation, and we don't want to parse any untrusted data&lt;/li&gt;
&lt;li&gt;after we call &lt;tt&gt;chrootme()&lt;/tt&gt;: we can't open new fds any more, or do similar
initialisation tasks, but we can work on the data we received.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;GStreamer has several states in which an element can be, with some rules on
what should be done in which state. From the &lt;a href=&quot;http://cgit.freedesktop.org/gstreamer/gstreamer/tree/docs/design/part-states.txt&quot;&gt;design documentation&lt;/a&gt;, the
states are defined as follow:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;NULL: This is the initial state of an element.&lt;/li&gt;
&lt;li&gt;READY: The element should be prepared to go to PAUSED.&lt;/li&gt;
&lt;li&gt;PAUSED: The element should be ready to accept and process data. Sink
elements however only accept one buffer and then block.&lt;/li&gt;
&lt;li&gt;PLAYING: The same as PAUSED except for live sources and sinks. Sinks accept
and rendering data. Live sources produce data.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;In particular, the elements that interest us here behave in the following way:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;tt&gt;shmsink&lt;/tt&gt; is responsible for the creation and destruction of the shared memory
object and the associated control socket and creates them when going from
NULL to READY and destroys them when going from READY to NULL. Since
&lt;tt&gt;shmsink&lt;/tt&gt; is used from inside the sandbox, this means that the state
change NULL to READY needs to happen before &lt;tt&gt;chrootme()&lt;/tt&gt;. This also means
that it won't be able to clean up properly the shared memory object and the
control socket.&lt;/li&gt;
&lt;li&gt;&lt;tt&gt;fdsrc&lt;/tt&gt; doesn't create nor destroy the fd it uses, so that can be done
separately. Moreover, in the case of stdin, we leave that responsibility to
the system.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;And quite obviously, we want &lt;tt&gt;&lt;span&gt;gst-decoder&lt;/span&gt;&lt;/tt&gt; to handle buffers only after it
has called &lt;tt&gt;chrootme()&lt;/tt&gt;, so that it is ready to run potentially unsafe
operations.&lt;/p&gt;
&lt;p&gt;This is relatively easy: all we have to do is, in &lt;tt&gt;&lt;span&gt;gst-decoder&lt;/span&gt;&lt;/tt&gt;, to call
&lt;tt&gt;chrootme()&lt;/tt&gt; once we are in the READY state and before going to PAUSED.&lt;/p&gt;
&lt;p&gt;Another issue with the privilege drop is that we use &lt;tt&gt;decodebin2&lt;/tt&gt; (things
would be the same with &lt;tt&gt;decodebin&lt;/tt&gt;), and it only loads the plugins it needs
once it knows what kind of data it will have to decode. That is, it needs to
load plugins after it has started to analyse potentially unsafe data. My
solution to that is to preload &lt;em&gt;all&lt;/em&gt; the installed plugins when &lt;tt&gt;&lt;span&gt;gst-decoder&lt;/span&gt;&lt;/tt&gt;
starts, so that &lt;tt&gt;decodebin2&lt;/tt&gt; doesn't need any privilege to have access to the
plugins it wants (they are already in memory).&lt;/p&gt;
&lt;p&gt;This is obviously suboptimal in memory consumption. I can think of two ways to
improve that:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;use a white/black list of plugins to avoid loading plugins we are not likely
to need (there are many things we're pretty sure not to need in &lt;tt&gt;&lt;span&gt;gst-decoder&lt;/span&gt;&lt;/tt&gt;,
such as all sources and sinks or gnonlin)&lt;/li&gt;
&lt;li&gt;use a separate typefinding sandboxed process that will determine what
plugins are needed, then have &lt;tt&gt;&lt;span&gt;gst-decoder&lt;/span&gt;&lt;/tt&gt; take as argument the plugins that
it needs to load before dropping privileges&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div id=&quot;synchronising-broker-and-sandbox&quot;&gt;
&lt;h3&gt;Synchronising broker and sandbox&lt;/h3&gt;
&lt;p&gt;Another synchronisation issue is that the broker has to wait for the sandboxed
process to be ready before interacting with it. As seen before, we have 3
channels through which they interact, and they are of two different types:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;the pipe to which the broker writes, which points to stdin in the sandboxed
process&lt;/li&gt;
&lt;li&gt;the shared memory areas, and their associated control sockets created by the
two shmsink&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;The first one is easy to synchronise: as long as the sandboxed process is not
ready, it won't read on the pipe, and &lt;tt&gt;fdsink&lt;/tt&gt; on the broker will just wait
until it can write.&lt;/p&gt;
&lt;p&gt;The second one is more complex: the shared memory areas are announced over the
control socket when they are ready, so this part gets done correctly for free
by &lt;tt&gt;shmsrc&lt;/tt&gt;. But the control sockets need to exist when &lt;tt&gt;shmsrc&lt;/tt&gt; tries to
connect to them (this happens when going from READY to PAUSED). For now, my
workaround is to &lt;tt&gt;sleep()&lt;/tt&gt; for 2 seconds when &lt;tt&gt;sandboxeddecodebin&lt;/tt&gt; goes
from NULL to READY, after launching the subprocess. With this, the control
sockets are very likely to be created when &lt;tt&gt;shmsrc&lt;/tt&gt; goes from READY to
PAUSED.&lt;/p&gt;
&lt;p&gt;This is obviously very hackish , and I think I would prefer to use
&lt;a href=&quot;http://developer.gnome.org/gio/2.32/GFileMonitor.html&quot;&gt;GFileMonitors&lt;/a&gt; to check when the sockets are created. Also, I don't know if
it's better to do that in &lt;tt&gt;sandboxeddecodebin&lt;/tt&gt; (blocking the switch to READY,
but using that file monitoring instead of a &lt;tt&gt;sleep()&lt;/tt&gt;, or going to READY
asynchronously if that's possible?) or in &lt;tt&gt;shmsrc&lt;/tt&gt; (in which case I think it
should be optional and probably make &lt;tt&gt;shmsrc&lt;/tt&gt; go to PAUSED asynchronously).&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;making-preroll-work&quot;&gt;
&lt;h3&gt;Making Preroll work&lt;/h3&gt;
&lt;p&gt;On the broker side, we have another tricky situation. We typically run a
pipeline that contains all of this (the parts between angle brackets are
outside of &lt;tt&gt;sandboxeddecodebin&lt;/tt&gt; and given as examples):&lt;/p&gt;
&lt;pre&gt;
&amp;lt;filesrc&amp;gt; ! fdsink (passes data to gst-decoder)
shmsrc (gets data from gst-decoder) ! gdpdepay ! &amp;lt;autoaudiosink&amp;gt;
shmsrc (gets data from gst-decoder) ! gdpdepay ! &amp;lt;autovideosink&amp;gt;
&lt;/pre&gt;
&lt;p&gt;This pipeline is atypical in that it has a sink that is not really at the
downstream end of it (&lt;tt&gt;fdsink&lt;/tt&gt;, which &lt;tt&gt;sandboxeddecodebin&lt;/tt&gt; uses to pass
data to &lt;tt&gt;&lt;span&gt;gst-decoder&lt;/span&gt;&lt;/tt&gt;). Data would go through it, then through
&lt;tt&gt;&lt;span&gt;gst-decoder&lt;/span&gt;&lt;/tt&gt; and its own pipeline, and then emerge back in the broker's
pipeline in the &lt;tt&gt;shmsrc&lt;/tt&gt; elements.&lt;/p&gt;
&lt;p&gt;This is a problem at the &lt;a href=&quot;http://cgit.freedesktop.org/gstreamer/gstreamer/tree/docs/design/part-preroll.txt&quot;&gt;preroll&lt;/a&gt; phase. Preroll is what usually happens
when going to PAUSED: the sinks wait until they have a buffer to render before
committing the state to PAUSED. The issue with our pipeline, is that the &amp;quot;real&amp;quot;
sinks will only get the data they need to commit to the PAUSED state if &lt;tt&gt;fdsink&lt;/tt&gt;
lets the data through, but &lt;tt&gt;fdsink&lt;/tt&gt; only passes data once it is in PLAYING state
(apart maybe from one initial buffer). On top of that &lt;tt&gt;sandboxeddecodebin&lt;/tt&gt;
is a subclass of &lt;tt&gt;GstBin&lt;/tt&gt;. By default, &lt;tt&gt;GstBin&lt;/tt&gt; only changes to the next
state (e.g.  PLAYING) once all its elements have reached the previous one (e.g.
PAUSED). This gives us a nice deadlock: the final (downstream) sinks are
waiting for data to come to them to commit their change to PAUSED, &lt;tt&gt;GstBin&lt;/tt&gt;
is waiting for all its elements (including final sinks) to finish their
transition to PAUSED before asking them to go to PLAYING, and &lt;tt&gt;fdsink&lt;/tt&gt; is
waiting to be asked to switch to PLAYING before it lets the data through (that
the final sinks are waiting on). My workaround to solve this deadlock is to
manually request &lt;tt&gt;fdsink&lt;/tt&gt; to go to PLAYING when &lt;tt&gt;sandboxeddecodebin&lt;/tt&gt; is
switching to PAUSED. That way, &lt;tt&gt;fdsink&lt;/tt&gt; is &amp;quot;one state ahead&amp;quot; of the rest, and
lets the data go through. I haven't decided yet if it's a very ugly way of
solving that issue or if it's an awesome clever hack. If you have an idea of a
cleaner solution, feel free to suggest it in the comments!&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;analysis-of-open-file-descriptors&quot;&gt;
&lt;h3&gt;Analysis of open file descriptors&lt;/h3&gt;
&lt;p&gt;Once the privileges have been dropped, the sandboxed process is very limited in
what it can do, but it still can use all the fds that it has open, which might
be a way for it to escape the limitations we want to put on it. For instance,
imagine that the sandboxed process has an open fd on the device that contains
your home directory (say, &lt;tt&gt;/dev/sda&lt;/tt&gt;). By reading it, it can access all your
data, even though the sandbox is designed not to let it open more files.&lt;/p&gt;
&lt;p&gt;This precise example is very unlikely to happen in our case, but some less
obvious fds could lead to ways to escape the sandbox. That is why I think it is
necessary to analyse the file descriptors that are open in the sandboxed
process and to try to understand the risks they bring.&lt;/p&gt;
&lt;p&gt;I took a &amp;quot;snapshot&amp;quot; of the open fds of &lt;tt&gt;&lt;span&gt;gst-decoder&lt;/span&gt;&lt;/tt&gt; while it was decoding a video,
and here is what it looks like:&lt;/p&gt;
&lt;pre&gt;
guijemont&amp;#64;thirtytwo:~$ ls -lv /proc/5860/fd
total 0
lr-x------ 1 guijemont guijemont 64 2012-04-18 18:17 0 -&amp;gt; pipe:[8348338]
lrwx------ 1 guijemont guijemont 64 2012-04-18 18:17 1 -&amp;gt; /dev/pts/5
lrwx------ 1 guijemont guijemont 64 2012-04-18 18:17 2 -&amp;gt; /dev/pts/5
lrwx------ 1 guijemont guijemont 64 2012-04-18 18:17 3 -&amp;gt; anon_inode:[eventfd]
lr-x------ 1 guijemont guijemont 64 2012-04-18 18:17 4 -&amp;gt; pipe:[8348342]
l-wx------ 1 guijemont guijemont 64 2012-04-18 18:17 5 -&amp;gt; pipe:[8348342]
lrwx------ 1 guijemont guijemont 64 2012-04-18 18:17 6 -&amp;gt; socket:[8358884]
lr-x------ 1 guijemont guijemont 64 2012-04-18 18:17 7 -&amp;gt; pipe:[8359036]
l-wx------ 1 guijemont guijemont 64 2012-04-18 18:17 8 -&amp;gt; pipe:[8359036]
lrwx------ 1 guijemont guijemont 64 2012-04-18 18:17 9 -&amp;gt; anon_inode:[timerfd]
lrwx------ 1 guijemont guijemont 64 2012-04-18 18:17 10 -&amp;gt; /run/shm/shmpipe. 5860.    0
lrwx------ 1 guijemont guijemont 64 2012-04-18 18:17 11 -&amp;gt; socket:[8358886]
lrwx------ 1 guijemont guijemont 64 2012-04-18 18:17 12 -&amp;gt; socket:[8358887]
lrwx------ 1 guijemont guijemont 64 2012-04-18 18:17 13 -&amp;gt; socket:[8358888]
lrwx------ 1 guijemont guijemont 64 2012-04-18 18:17 14 -&amp;gt; /run/shm/shmpipe. 5860.    1
lrwx------ 1 guijemont guijemont 64 2012-04-18 18:17 15 -&amp;gt; socket:[8358890]
lrwx------ 1 guijemont guijemont 64 2012-04-18 18:17 16 -&amp;gt; socket:[8358891]
lrwx------ 1 guijemont guijemont 64 2012-04-18 18:17 17 -&amp;gt; socket:[8358892]
lrwx------ 1 guijemont guijemont 64 2012-04-18 18:17 18 -&amp;gt; socket:[8358893]
lrwx------ 1 guijemont guijemont 64 2012-04-18 18:17 19 -&amp;gt; socket:[8358894]
lrwx------ 1 guijemont guijemont 64 2012-04-18 18:17 20 -&amp;gt; socket:[8358895]
lrwx------ 1 guijemont guijemont 64 2012-04-18 18:17 21 -&amp;gt; socket:[8348346]
lrwx------ 1 guijemont guijemont 64 2012-04-18 18:17 22 -&amp;gt; socket:[8348347]
&lt;/pre&gt;
&lt;p&gt;I used the &amp;quot;usual suspects&amp;quot; (strace and gdb) to look further into this and
understand where each fd comes from, and try to get an idea of how necessary it
is and of how much of a risk it brings.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;O: that is &lt;tt&gt;stdin&lt;/tt&gt;, and it is the pipe I create when starting &lt;tt&gt;sandboxme
&lt;span&gt;gst-decoder&lt;/span&gt;&lt;/tt&gt;. Also, it is read only. I don't think an attacker could do much
with this, and we need it anyway.&lt;/li&gt;
&lt;li&gt;1 and 2: &lt;tt&gt;stdout&lt;/tt&gt; and &lt;tt&gt;stderr&lt;/tt&gt;, plugged to the pseudo tty where my test
&lt;tt&gt;&lt;span&gt;gst-launch&lt;/span&gt;&lt;/tt&gt; command was running. This is clearly not necessary, and could
be exploited for privilege escalation if there's a bad bug somewhere in
devpts.  I modified the code to make &lt;tt&gt;stdout&lt;/tt&gt; and &lt;tt&gt;stderr&lt;/tt&gt; point to
&lt;tt&gt;/dev/null&lt;/tt&gt; instead when &lt;tt&gt;&lt;span&gt;gst-decoder&lt;/span&gt;&lt;/tt&gt; is launched. There is an
environment variable that can prevent that from happening when one wants to
see the debug messages that are output by &lt;tt&gt;&lt;span&gt;gst-decoder&lt;/span&gt;&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;3: This is an event fd used by the &lt;a href=&quot;http://developer.gnome.org/glib/2.32/glib-The-Main-Event-Loop.html#GMainContext&quot;&gt;GMainContext&lt;/a&gt;. I suspect that at least a
few of the components we run to decode our stuff needs a &lt;a href=&quot;http://developer.gnome.org/glib/2.32/glib-The-Main-Event-Loop.html#GMainLoop&quot;&gt;GMainLoop&lt;/a&gt;, and
therefore a &lt;tt&gt;GMainContext&lt;/tt&gt;. And I don't think this is very dangerous,
though I don't know much about the complexity and safety of the event system.&lt;/li&gt;
&lt;li&gt;4 and 5: this is a pipe used by the GLib unix signal code. Both ends of the
pipe are inside the sandbox, so I don't think this would be much of a
problem.&lt;/li&gt;
&lt;li&gt;6 and 21: shm area control socket for audio. There is one fd created by
&lt;tt&gt;socket()&lt;/tt&gt; that is bound to the right temporary file, then another fd is
created by &lt;tt&gt;accept()&lt;/tt&gt; when the broker connects. We definitely need that if
we want to use shm, which I think we do for performance reasons (I did not
run benchmarks though).&lt;/li&gt;
&lt;li&gt;7 and 8: pipe open by some code in &lt;tt&gt;&lt;span&gt;/usr/lib/frei0r-1/facedetect.so&lt;/span&gt;&lt;/tt&gt; when
it is &lt;tt&gt;g_module_open()&lt;/tt&gt;'ed. I don't think we need that at all, and it might
be a good motivation to try and not load all plugins. A limited risk though,
since both ends of the pipe are inside the sandbox.&lt;/li&gt;
&lt;li&gt;9: a timer fd opened in the same conditions as the pipe of fds 7 and 8 (by
frei0r's facedetect). This one definitely looks like an unnecessary risk,
though I don't know how much of a risk it actually is.&lt;/li&gt;
&lt;li&gt;10 and 14: these are the shared memory areas (one for audio, one for video),
so I think we definitely want them. The alternative would be to use regular
sockets instead to pass the buffers, but I fear it might cost us much in
performances for little added security, though this issue could deserve more
investigation.&lt;/li&gt;
&lt;li&gt;11, 12, 15, 16, 17, 18, 19 and 20: these 8 fds are actually 4 socket pairs,
with each time both ends inside the sandbox. They are all created by
&lt;tt&gt;gst_poll_new()&lt;/tt&gt;, by the following pieces of code:&lt;ul&gt;
&lt;li&gt;&lt;tt&gt;shmsink&lt;/tt&gt; in &lt;tt&gt;gst_shm_sink_start()&lt;/tt&gt;. It does that twice: once for
audio, once for video.&lt;/li&gt;
&lt;li&gt;&lt;tt&gt;fdsrc&lt;/tt&gt; in &lt;tt&gt;gst_fd_src_start()&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;the system clock (in &lt;tt&gt;gst_system_clock_init()&lt;/tt&gt;, via
&lt;tt&gt;gst_poll_new_timer()&lt;/tt&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;13 and 22: shm area control socket for video. There is one fd created by
&lt;tt&gt;socket()&lt;/tt&gt; that is bound to the right temporary file, then another fd is
created by &lt;tt&gt;accept()&lt;/tt&gt; when the broker connects. We definitely need that if
we want to use shm, which I think we do for performance reasons (I did not
run benchmarks though).&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div id=&quot;play-with-it&quot;&gt;
&lt;h3&gt;Play with it!&lt;/h3&gt;
&lt;p&gt;You can check out the code from its &lt;a href=&quot;https://github.com/guijemont/Sandboxed-Player&quot;&gt;github repository&lt;/a&gt;, instructions are
available &lt;a href=&quot;https://github.com/guijemont/Sandboxed-Player/blob/master/README.rst&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/p&gt;</content>
		<author>
			<name>Guillaume Emont</name>
			<uri>http://guij.emont.org/blog/category/geekeries/</uri>
		</author>
		<source>
			<title type="html">Le coin à Guij » Geekeries</title>
			<link rel="self" href="http://guij.emont.org/blog/category/geekeries/feed/"/>
			<id>http://guij.emont.org/blog/category/geekeries/feed/</id>
			<updated>2012-05-22T01:17:24+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">GStreamer Conference 2012 Announced</title>
		<link href="http://gstreamer.freedesktop.org/news/#2012-05-02T15:31:00Z"/>
		<id>http://gstreamer.freedesktop.org/news/#2012-05-02T15:31:00Z</id>
		<updated>2012-05-02T15:31:00+00:00</updated>
		<content type="html">&lt;p&gt;
The popular GStreamer user and developers Conference is back for the third year, this year going to San Diego in the USA. The conference will take place on August 27th and August 28th. Check
out our &lt;a href=&quot;http://gstreamer.freedesktop.org/conference&quot;&gt;conference page&lt;/a&gt; for details and the Call for Papers and mark the dates in your calendar. See you in San Diego!
         &lt;/p&gt;</content>
		<author>
			<name>GStreamer</name>
			<uri>http://gstreamer.freedesktop.org/news/</uri>
		</author>
		<source>
			<title type="html">GStreamer News</title>
			<subtitle type="html">Latest news from the GStreamer project</subtitle>
			<link rel="self" href="http://gstreamer.freedesktop.org/news/rss-1.0.xml"/>
			<id>http://gstreamer.freedesktop.org/news/rss-1.0.xml</id>
			<updated>2012-05-13T15:17:31+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Androidifying your autotools build the easy way</title>
		<link href="http://arunraghavan.net/2012/05/androidifying-your-autotools-build-the-easy-way/"/>
		<id>http://arunraghavan.net/?p=1329</id>
		<updated>2012-05-01T19:48:15+00:00</updated>
		<content type="html">&lt;p&gt;&lt;a href=&quot;http://derekforeman.blogspot.ca/&quot;&gt;Derek Foreman&lt;/a&gt; has finally written up a nice blog post about his &lt;a href=&quot;http://cgit.collabora.com/git/android/androgenizer.git/tree/README.txt&quot;&gt;Androgenizer&lt;/a&gt; tool, which we&amp;#8217;ve used for porting PulseAudio, GStreamer, Wayland, Telepathy and most of their dependencies to Android.&lt;/p&gt;

&lt;p&gt;If you&amp;#8217;ve got an autotools-based project that you&amp;#8217;d like to build on Android, whether on the NDK or system-wide this is &lt;em&gt;really&lt;/em&gt; useful.&lt;/p&gt;</content>
		<author>
			<name>Arun Raghavan</name>
			<uri>http://arunraghavan.net/</uri>
		</author>
		<source>
			<title type="html">Arun Raghavan</title>
			<subtitle type="html">Extremely pithy tagline here</subtitle>
			<link rel="self" href="http://arunraghavan.net/feed/"/>
			<id>http://arunraghavan.net/feed/</id>
			<updated>2012-05-12T11:17:17+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Flumotion Transcoder 0.11.1 &quot;Habushu&quot; released</title>
		<link href="http://www.flumotion.net/news/#2012-1-23 T7:00:00Z"/>
		<id>http://www.flumotion.net/news/#2012-1-23 T7:00:00Z</id>
		<updated>2012-05-01T01:00:00+00:00</updated>
		<content type="html">&lt;p&gt;
The Flumotion team announces
a new release of the development 0.11 branch
of the Flumotion Transcoding Platform.
   &lt;/p&gt;&lt;p&gt;
    &lt;a href=&quot;http://www.flumotion.net/releases/flumotion-transcoder/0.11.1.html&quot;&gt;0.11.1 release notes&lt;/a&gt; for more details.
   &lt;/p&gt;</content>
		<author>
			<name>Flumotion</name>
			<uri>http://www.flumotion.net/news/</uri>
		</author>
		<source>
			<title type="html">GStreamer News</title>
			<subtitle type="html">Latest news from the GStreamer project</subtitle>
			<link rel="self" href="http://www.flumotion.net/news/rss-1.0.xml"/>
			<id>http://www.flumotion.net/news/rss-1.0.xml</id>
			<updated>2012-05-22T21:47:20+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">PulseAudio on Android: Part 2</title>
		<link href="http://arunraghavan.net/2012/04/pulseaudio-on-android-part-2/"/>
		<id>http://arunraghavan.net/?p=1300</id>
		<updated>2012-04-30T10:35:27+00:00</updated>
		<content type="html">&lt;p&gt;Some of you might&amp;#8217;ve noticed that there has been a bunch of work happening here at &lt;a href=&quot;http://www.collabora.com/services/android/&quot;&gt;Collabora&lt;/a&gt; on making cool open source technologies such as &lt;a href=&quot;http://gstreamer.freedesktop.org/modules/gst-android.html&quot;&gt;GStreamer&lt;/a&gt;, Telepathy, &lt;a href=&quot;http://ppaalanen.blogspot.in/2012/04/first-light-from-weston-on-android.html&quot;&gt;Wayland&lt;/a&gt; and of course, &lt;a href=&quot;http://arunraghavan.net/2012/01/pulseaudio-vs-audioflinger-fight/&quot;&gt;PulseAudio&lt;/a&gt; available on Android.&lt;/p&gt;

&lt;p&gt;Since my last blog post on this subject, I got some time to start looking at replacing AudioFlinger (recap: that&amp;#8217;s Android&amp;#8217;s native audio subsystem) with PulseAudio (recap: that&amp;#8217;s the awesome Linux audio subsystem). This work can be broken up into 3 parts: playback, capture, and policy. The roles of playback and capture are obvious. For those who aren&amp;#8217;t aware of system internals, the policy bits take care of audio routing, volumes, and other such things. For example, audio should play out of your headphones if they&amp;#8217;re plugged in, off Bluetooth if you&amp;#8217;ve got a headset paired, or the speakers if nothing&amp;#8217;s plugged in. Also, depending on the device, the output volume might change based on the current output path.&lt;/p&gt;

&lt;p&gt;I started by looking at solving the playback problem first. I&amp;#8217;ve got the first 80% of this done (as we all know, the second 80% takes at least as long ;) ). This is done by replacing the native &lt;tt&gt;AudioTrack&lt;/tt&gt; playback API with a simple wrapper that translates into the &lt;tt&gt;libpulse&lt;/tt&gt; PulseAudio client API. There&amp;#8217;s bits of the API that seem to be rarely used(loops and markers, primarily), and I&amp;#8217;ve not gotten around to those yet. Basic playback works quite well, and here&amp;#8217;s a video showing this. (&lt;em&gt;Note: this and the next video will be served with yummy HTML5 goodness if you enabled the &lt;a href=&quot;http://youtube.com/html5&quot;&gt;YouTube HTML5 beta&lt;/a&gt;&lt;/em&gt;).&lt;/p&gt;



&lt;p&gt;(if the video doesn&amp;#8217;t appear, you can &lt;a href=&quot;http://www.youtube.com/watch?v=h9fxmOaW2Bw&quot;&gt;watch it on YouTube&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Users of PulseAudio might have spotted that this now frees us up to do some fairly nifty things. One such thing is getting remote playback for free. For a long time now, there has been support for streaming audio between devices running PulseAudio. I wrote up a quick app to show this working on the Galaxy Nexus as well. Again, seeing this working is a lot more impressive than me describing it here, so here&amp;#8217;s another video:&lt;/p&gt;



&lt;p&gt;(if the video doesn&amp;#8217;t appear, you can &lt;a href=&quot;http://www.youtube.com/watch?v=o5-phFVfZnQ&quot;&gt;watch it on YouTube&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;This is all clearly work in progress, but you can find the code for the AudioTrack wrapper as &lt;a href=&quot;http://people.collabora.com/~arun/android/frameworks-base-0001-First-stab-at-a-libpulse-based-AudioTrack-API.patch&quot;&gt;a patch&lt;/a&gt; for now. This will be a properly integrated tree that you can just pull and easily integrate into your Android build when it&amp;#8217;s done. The PA Output Switcher app code is also available in &lt;a href=&quot;http://cgit.collabora.com/git/user/arun/pa-output-switcher.git&quot;&gt;a git repository&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;m hoping to be able to continue hacking on the capture and policy bits. The latter, especially, promises to be involved, since there isn&amp;#8217;t always a 1:1 mapping between AudioFlinger and PulseAudio concepts. Nothing insurmountable, though. :) Watch this space for more updates as I wade through the next bit.&lt;/p&gt;</content>
		<author>
			<name>Arun Raghavan</name>
			<uri>http://arunraghavan.net/</uri>
		</author>
		<source>
			<title type="html">Arun Raghavan</title>
			<subtitle type="html">Extremely pithy tagline here</subtitle>
			<link rel="self" href="http://arunraghavan.net/feed/"/>
			<id>http://arunraghavan.net/feed/</id>
			<updated>2012-05-12T11:17:17+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">GStreamer backend for video in Firefox</title>
		<link href="http://schleef.org/2012/04/29/gstreamer-backend-for-video-in-firefox/"/>
		<id>http://schleef.org/?p=144</id>
		<updated>2012-04-29T22:19:34+00:00</updated>
		<content type="html">&lt;p&gt;Good news to hear that the GStreamer backend for video playback in Firefox has &lt;a title=&quot;GStreamer backend bug report&quot; href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=422540&quot;&gt;landed&lt;/a&gt;, due to a flurry of work by &lt;a href=&quot;https://twitter.com/#!/alessandrod&quot;&gt;Alessandro Decina&lt;/a&gt; in the last few months.  Of course, this isn&amp;#8217;t part of the standard Firefox build (but maybe some day?), but it&amp;#8217;s very useful for putting Firefox on mobile and embedded platforms, since GStreamer has a well-established ecosystem of vendor-provided plugins for hardware decoding.&lt;/p&gt;</content>
		<author>
			<name>David Schleef</name>
			<uri>http://schleef.org</uri>
		</author>
		<source>
			<title type="html">Passing on the Left</title>
			<subtitle type="html">Just another WordPress weblog</subtitle>
			<link rel="self" href="http://schleef.org/feed/"/>
			<id>http://schleef.org/feed/</id>
			<updated>2012-05-22T21:47:12+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Seagull Strike</title>
		<link href="http://blog.mikeasoft.com/2012/04/27/seagull-strike/"/>
		<id>http://blog.mikeasoft.com/?p=346</id>
		<updated>2012-04-27T17:58:01+00:00</updated>
		<content type="html">&lt;p&gt;&lt;/p&gt;
&lt;h3&gt;Overview&lt;/h3&gt;
&lt;p&gt;A while back a wrote a little game for the Nokia N9 and N950, mostly as a way to explore the &lt;a href=&quot;https://gitorious.org/qml-box2d&quot;&gt;QML Box2D bindings&lt;/a&gt;. However, whilst packaging up my &lt;a href=&quot;http://blog.mikeasoft.com/tag/statusnet-meego&quot;&gt;StatusNet client&lt;/a&gt; I thought I might as well release this as well since it can be a fairly enjoyable distraction. Below is a short video demonstrating how it works, and at the end of the post you can find details on where to get hold of it.&lt;/p&gt;
&lt;p&gt;&lt;center&gt;&lt;br /&gt;
&lt;a href=&quot;http://mikeasoft.com/~mike/seagullstrike.webm&quot;&gt;Video&lt;/a&gt;&lt;/center&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;h3&gt;Download&lt;/h3&gt;
&lt;p&gt;You can either download it via &lt;a href=&quot;http://apps.formeego.org&quot;&gt;Apps for Meego&lt;/a&gt;, or get hold of the package directly here: &lt;a href=&quot;http://mikeasoft.com/~mike/seagullstrike_0.1-2_armel.deb&quot;&gt;http://mikeasoft.com/~mike/seagullstrike_0.1-2_armel.deb&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Source&lt;/h3&gt;
&lt;p&gt;License: &lt;a href=&quot;http://www.gnu.org/copyleft/gpl.html&quot;&gt;GPL version 3.0 or later&lt;/a&gt;&lt;br /&gt;
Gitorious repository: &lt;a href=&quot;https://gitorious.org/seagull-strike&quot;&gt;https://gitorious.org/seagull-strike&lt;/a&gt;&lt;br /&gt;
Ohloh project page: &lt;a href=&quot;https://www.ohloh.net/p/seagull-strike&quot;&gt;https://www.ohloh.net/p/seagull-strike&lt;/a&gt;&lt;/p&gt;</content>
		<author>
			<name>Michael Sheldon</name>
			<uri>http://blog.mikeasoft.com/</uri>
		</author>
		<source>
			<title type="html">Michael Sheldon's Stuff</title>
			<link rel="self" href="http://blog.mikeasoft.com/feed/"/>
			<id>http://blog.mikeasoft.com/feed/</id>
			<updated>2012-05-19T12:47:16+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">StatusNet for MeeGo 0.2.1</title>
		<link href="http://blog.mikeasoft.com/2012/04/26/statusnet-for-meego-0-2-1/"/>
		<id>http://blog.mikeasoft.com/?p=335</id>
		<updated>2012-04-26T00:57:58+00:00</updated>
		<content type="html">&lt;p&gt;&lt;img alt=&quot;StatusNet for MeeGo displaying clickable links&quot; src=&quot;http://mikeasoft.com/~mike/statusnet_meego_links.png&quot; title=&quot;StatusNet for MeeGo displaying clickable links&quot; class=&quot;alignright&quot; width=&quot;480&quot; height=&quot;145&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Overview&lt;/h3&gt;
&lt;p&gt;StatusNet for MeeGo makes it possible for Nokia N9, N950 and similar phones to connect to &lt;a href=&quot;http://status.net&quot;&gt;StatusNet&lt;/a&gt; compatible microblogging services such as &lt;a href=&quot;http://identi.ca&quot;&gt;Identi.ca&lt;/a&gt;. It supports viewing statuses in the phone’s event feed alongside Twitter and Facebook updates, viewing conversations, posting new status updates and replying to other people.&lt;/p&gt;
&lt;h3&gt;New Features&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Support for followings links in posts.&lt;/li&gt;
&lt;li&gt;Links to groups, tags, and users.&lt;/li&gt;
&lt;li&gt;Support for posting messages using UTF-8 characters.&lt;/li&gt;
&lt;li&gt;Slight improvements to the clarity of the login screen.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Download&lt;/h3&gt;
&lt;p&gt;Ovi Store: &lt;a href=&quot;http://store.ovi.com/content/271186&quot;&gt;StatusNet for MeeGo&lt;/a&gt;&lt;br /&gt;
Direct download: &lt;a href=&quot;http://mikeasoft.com/~mike/statusnet-meego_0.2.1-1_armel.deb&quot;&gt;statusnet-meego_0.2.1-1_armel.deb&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Source&lt;/h3&gt;
&lt;p&gt;License: &lt;a href=&quot;http://www.gnu.org/copyleft/gpl.html&quot;&gt;GPL version 3.0 or later&lt;/a&gt;&lt;br /&gt;
Gitorious repository: &lt;a href=&quot;https://gitorious.org/statusnet-meego-plugin&quot;&gt;https://gitorious.org/statusnet-meego-plugin&lt;/a&gt;&lt;br /&gt;
Ohloh project page: &lt;a href=&quot;https://www.ohloh.net/p/statusnet-meego&quot;&gt;https://www.ohloh.net/p/statusnet-meego&lt;/a&gt;&lt;/p&gt;</content>
		<author>
			<name>Michael Sheldon</name>
			<uri>http://blog.mikeasoft.com/</uri>
		</author>
		<source>
			<title type="html">Michael Sheldon's Stuff</title>
			<link rel="self" href="http://blog.mikeasoft.com/feed/"/>
			<id>http://blog.mikeasoft.com/feed/</id>
			<updated>2012-05-19T12:47:16+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Starting a new chapter</title>
		<link href="http://blogs.gnome.org/uraeus/2012/04/25/starting-a-new-chapter/"/>
		<id>http://blogs.gnome.org/uraeus/?p=1849</id>
		<updated>2012-04-25T17:48:29+00:00</updated>
		<content type="html">&lt;p&gt;Having signed and sent of my contract I think the time has come to let the every one know that I am starting to work for what I think is a very cool company in just two Months, &lt;a href=&quot;http://www.redhat.com&quot;&gt;Red Hat&lt;/a&gt;. I have been a Red Hat and later Fedora user ever since I first tried Linux back in the late 90ties (by installing either 4.1 or 4.2 of Red Hat Linux), so it does feel like a bit of a homecoming for me. And in my opinion Red Hat is still what they where back then, the biggest driving force behind pushing linux and open source forward. And this is what I hope to be a part of by joining Red Hat, to play my part in continuing to push new innovations into the operating system and through that make it an even better choice for more and more users and organisations out there.&lt;/p&gt;
&lt;p&gt;It is still with a bit of melancholy that I leave &lt;a href=&quot;http://www.collabora.com&quot;&gt;Collabora&lt;/a&gt; behind as I am very proud of the team we built there over the last five years. The amount of features and maturity we managed to put into &lt;a href=&quot;http://gstreamer.freedesktop.org&quot;&gt;GStreamer&lt;/a&gt; over those years and all the new usecases we managed to cover is quite amazing. But with Rob and Philippe at the helm I am sure the company will continue to prosper even without me.&lt;br /&gt;
I will of course continue to be a part of the GStreamer community and will be working with both Collabora and the GStreamer community for instance on organizing this years GStreamer Conference (hope to have the GStreamer Conference 2012 page up in a few days). So while I am now moving onto a new challenge I do not plan on leaving all the great people and friends I made behind, in fact since my new role at Red Hat will be as part of the Desktop team I will continue to haunt a lot of the same conferences and gatherings in the years to come &lt;img src=&quot;http://blogs.gnome.org/uraeus/wp-content/mu-plugins/tango-smilies/tango/face-smile.png&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; .&lt;/p&gt;
&lt;p&gt;Also as part of this new job I will be moving to Brno in the Czech Republic, joining the 400 strong Red Hat team there. For me, the best thing about living in Brno, in addition to being a very nice city, is that it will allow me to put even more pressure on Jimmac to create a new icon for &lt;a href=&quot;http://www.linuxrising.org&quot;&gt;Transmageddon&lt;/a&gt;, as he will be living only a few hours away by car &lt;img src=&quot;http://blogs.gnome.org/uraeus/wp-content/mu-plugins/tango-smilies/tango/face-smile.png&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;</content>
		<author>
			<name>Christian Schaller</name>
			<uri>http://blogs.gnome.org/uraeus</uri>
		</author>
		<source>
			<title type="html">Christian Schaller</title>
			<subtitle type="html">GStreamer news and more</subtitle>
			<link rel="self" href="http://blogs.gnome.org/uraeus/feed/"/>
			<id>http://blogs.gnome.org/uraeus/feed/</id>
			<updated>2012-05-22T21:47:03+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Thumbnails are back</title>
		<link href="http://jeff.ecchi.ca/blog/2012/04/23/thumbnails-are-back/"/>
		<id>http://jeff.ecchi.ca/blog/?p=2121</id>
		<updated>2012-04-23T17:00:21+00:00</updated>
		<content type="html">&lt;p&gt;&lt;img class=&quot;alignnone size-full wp-image-2122&quot; title=&quot;pitivi thumbnailer is back&quot; src=&quot;http://jeff.ecchi.ca/blog/wp-content/uploads/pitivi-thumbnailer-is-back.jpg&quot; alt=&quot;&quot; width=&quot;600&quot; height=&quot;338&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-2121&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;#8230;it&amp;#8217;s back. And it will not stop until it has accomplished its mission.&lt;/p&gt;
&lt;p&gt;This week,&lt;strong&gt; Daniel Thul&lt;/strong&gt; fixed and reactivated the clip thumbnailing code for Pitivi&amp;#8217;s timeline. But he didn&amp;#8217;t just stop there. No sir. He implemented &lt;a href=&quot;https://bugzilla.gnome.org/show_bug.cgi?id=633643&quot;&gt;caching&lt;/a&gt; too, and &lt;em&gt;that&lt;/em&gt; made my week.&lt;/p&gt;
&lt;p&gt;We don&amp;#8217;t just process thumbnails on-demand anymore, we now save them to disk for reuse. Notice the length of the clip below? It is two hours long. And its &lt;strong&gt;thumbnails load &lt;em&gt;instantly&lt;/em&gt;&lt;/strong&gt; at startup.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://jeff.ecchi.ca/blog/wp-content/uploads/2012-04-22.png&quot;&gt;&lt;img class=&quot;alignnone size-large wp-image-2123&quot; title=&quot;2012 04 22&quot; src=&quot;http://jeff.ecchi.ca/blog/wp-content/uploads/2012-04-22-1024x172.png&quot; alt=&quot;&quot; width=&quot;584&quot; height=&quot;98&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;That&amp;#8217;s not all. The thumbnails you see above were using &amp;#8220;nearest neighbor&amp;#8221; scaling. If you are using GStreamer 0.10.36 or newer, you get better thumbnail quality, because we now use multitap Lanczos image scaling:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://jeff.ecchi.ca/blog/wp-content/uploads/2012-04-23.png&quot;&gt;&lt;img class=&quot;alignnone size-large wp-image-2126&quot; title=&quot;2012-04-23&quot; src=&quot;http://jeff.ecchi.ca/blog/wp-content/uploads/2012-04-23-1024x169.png&quot; alt=&quot;&quot; width=&quot;584&quot; height=&quot;96&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Update: Daniel also &lt;a href=&quot;http://8na.de/?p=91&quot;&gt;blogged about his findings&lt;/a&gt;.&lt;/p&gt;</content>
		<author>
			<name>Jean-François Fortin Tam</name>
			<uri>http://jeff.ecchi.ca/blog/</uri>
		</author>
		<source>
			<title type="html">Nekohayo !</title>
			<subtitle type="html">La vie personnelle du chat</subtitle>
			<link rel="self" href="http://jeff.ecchi.ca/blog/feed/"/>
			<id>http://jeff.ecchi.ca/blog/feed/</id>
			<updated>2012-05-19T22:17:22+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">La pression sociale</title>
		<link href="http://jeff.ecchi.ca/blog/2012/04/22/la-pression-sociale/"/>
		<id>http://jeff.ecchi.ca/blog/?p=2107</id>
		<updated>2012-04-22T21:05:02+00:00</updated>
		<content type="html">&lt;p&gt;Voici quelques pensées générales sur la responsabilité, le déterminisme et sur la société dans laquelle nous vivons.&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-2107&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Je vais à contre-courant sur une poignée de choses dans la vie:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Je refuse d&amp;#8217;utiliser Facebook pour gérer mes relations avec mes véritables amis (en d&amp;#8217;autres termes, les « relations privées »), pour les raisons &lt;a title=&quot;Pourquoi j’ai quitté Facebook: des précisions&quot; href=&quot;http://jeff.ecchi.ca/blog/2012/03/17/pourquoi-jai-quitte-facebook-des-precisions/&quot;&gt;énumérées précédemment&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Je n&amp;#8217;utiliserai plus jamais Windows comme mon système d&amp;#8217;opération, ou, en fait, n&amp;#8217;importe quel système d&amp;#8217;opération propriétaire. Avec les années, j&amp;#8217;ai vu des choses, dans l&amp;#8217;industrie, que certains auraient peine à croire. Pour quelque chose d&amp;#8217;aussi crucial (pour mon travail et ma vie personnelle) que mon ordinateur, je ne peux aucunement faire confiance à autre chose qu&amp;#8217;un système open-source. Ce n&amp;#8217;est pas juste une question philosophique, c&amp;#8217;est également une question de pragmatisme, pérénité et sécurité. Mais ça, c&amp;#8217;est une autre discussion.&lt;/li&gt;
&lt;li&gt;Je n&amp;#8217;ai pas et n&amp;#8217;aurai pas d&amp;#8217;abonnement de téléphone cellulaire, tant que les forfaits ne correspondront pas à ce que je recherche en termes de fonctionnalités et de prix, ou à moins qu&amp;#8217;on me &lt;em&gt;paie&lt;/em&gt; pour l&amp;#8217;utiliser. D&amp;#8217;ici là, j&amp;#8217;ai un système combinant ligne fixe et VoIP avec boîte vocale qui fonctionne parfaitement bien et je ne manque les appels que dans trois situations: quand je suis sur la route, lorsque je ne veux pas déranger ou interrompre mon entourage ou quand je dors.&lt;/li&gt;
&lt;li&gt;Je refuse également d&amp;#8217;avoir une carte de crédit.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pourtant, quand on dévie de la norme sur les points que j&amp;#8217;ai énoncés plus tôt, on passe pour un hippie venu de Pluton. Les hippies de Pluton devraient-ils être ostracisés parce que notre société valorise plus que jamais l&amp;#8217;hédonisme, la pensée à court terme et le matérialisme?&lt;/p&gt;
&lt;p&gt;On fait tous des choix dans la vie. Certains de mes choix font d&amp;#8217;ailleurs en sorte que je suis libre de dettes. Par exemple, ne pas fumer (et résister pendant des années aux pressions sociales en ce sens), rester plus longtemps chez mes parents plutôt que de me précipiter à vivre en appartement, ne pas posséder de voiture et tous les coûts que ça implique, ne pas être à la dernière mode (je porte encore des t-shirts qui datent de 1997), aller à la bibliothèque au lieu d&amp;#8217;acheter mes livres (incluant les manuels obligatoires de cours), utiliser des ordinateurs usagés, ne pas avoir d&amp;#8217;iPhone/iPad dernier cri, éviter de manger au restaurant (en faveur de l&amp;#8217;expérimentation culinaire à la maison!), choisir de terminer mes jeux de PS1 et PS2 avant de considérer l&amp;#8217;idée d&amp;#8217;une nouvelle console, etc.&lt;/p&gt;
&lt;p&gt;Mon mode de vie vous semble peut-être frugal, et pourtant je suis probablement parmi les gens les plus heureux qui soient.&lt;/p&gt;
&lt;p&gt;La stimulation socio-technologique constante &lt;em&gt;à la Facebook&lt;/em&gt; n&amp;#8217;est qu&amp;#8217;une « amélioration de la solitude », et ce n&amp;#8217;est qu&amp;#8217;illusion: on est toujours connectés les uns aux autres par ces moyens technologiques, mais ces contacts sont fragmentés et perdent leur sens; on est connectés mais on ne ressent rien, parce que c&amp;#8217;est un simulacre.&lt;/p&gt;</content>
		<author>
			<name>Jean-François Fortin Tam</name>
			<uri>http://jeff.ecchi.ca/blog/</uri>
		</author>
		<source>
			<title type="html">Nekohayo !</title>
			<subtitle type="html">La vie personnelle du chat</subtitle>
			<link rel="self" href="http://jeff.ecchi.ca/blog/feed/"/>
			<id>http://jeff.ecchi.ca/blog/feed/</id>
			<updated>2012-05-19T22:17:22+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Surviving Git</title>
		<link href="http://jeff.ecchi.ca/blog/2012/04/13/surviving-git/"/>
		<id>http://jeff.ecchi.ca/blog/?p=2118</id>
		<updated>2012-04-13T16:14:21+00:00</updated>
		<content type="html">&lt;p&gt;Git can feel &lt;em&gt;extremely&lt;/em&gt; unnatural to those who came from Bazaar. Only after a lot of advice from friends, the right tools and a few months of intensive usage did I feel confident enough to use it without fear. Many are probably in the same boat as me though, so I took a couple of hours to clean up my personal notes and make a proper &amp;#8220;crash course&amp;#8221; &lt;a href=&quot;http://wiki.pitivi.org/wiki/Git&quot;&gt;tutorial for Git in the Pitivi context&lt;/a&gt;. I have also made a nice &lt;a href=&quot;http://youtube.com/watch?v=6WU4jKti_vo&quot;&gt;video on how to use interactive rebase&lt;/a&gt;, if you&amp;#8217;re interested.&lt;/p&gt;</content>
		<author>
			<name>Jean-François Fortin Tam</name>
			<uri>http://jeff.ecchi.ca/blog/</uri>
		</author>
		<source>
			<title type="html">Nekohayo !</title>
			<subtitle type="html">La vie personnelle du chat</subtitle>
			<link rel="self" href="http://jeff.ecchi.ca/blog/feed/"/>
			<id>http://jeff.ecchi.ca/blog/feed/</id>
			<updated>2012-05-19T22:17:22+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">GStreamer Core 0.11.90, Base Plugins 0.11.90, Good Plugins 0.11.90, Bad
      Plugins 0.11.90, Ugly Plugins 0.11.90, libav Plugins 0.11.90 unstable release</title>
		<link href="http://gstreamer.freedesktop.org/news/#2012-04-13T09:33:00Z"/>
		<id>http://gstreamer.freedesktop.org/news/#2012-04-13T09:33:00Z</id>
		<updated>2012-04-13T09:33:00+00:00</updated>
		<content type="html">&lt;p&gt;
The GStreamer team announces a new release of the GStreamer core,
Base/Good/Bad/Ugly/libav modules for the 0.11 GStreamer unstable release series.
&lt;/p&gt;&lt;p&gt;
This is the first release candidate of the upcoming 1.0 release. It
is intended for developers and people wanting to port their plugins and
applications to the new series. Only minor or absolutely necessary
changes to the core/base API/ABI will happen between this release and
the final 1.0.0 release.
&lt;/p&gt;&lt;p&gt;
Check out release notes for
&lt;a href=&quot;http://gstreamer.freedesktop.org/releases/gstreamer/0.11.90.html&quot;&gt;gstreamer core&lt;/a&gt; or
&lt;a href=&quot;http://gstreamer.freedesktop.org/releases/gst-plugins-base/0.11.90.html&quot;&gt;gst-plugins-base&lt;/a&gt;,
&lt;a href=&quot;http://gstreamer.freedesktop.org/releases/gst-plugins-good/0.11.90.html&quot;&gt;gst-plugins-good&lt;/a&gt;,
&lt;a href=&quot;http://gstreamer.freedesktop.org/releases/gst-plugins-bad/0.11.90.html&quot;&gt;gst-plugins-bad&lt;/a&gt;,
&lt;a href=&quot;http://gstreamer.freedesktop.org/releases/gst-plugins-ugly/0.11.90.html&quot;&gt;gst-plugins-ugly&lt;/a&gt;,
&lt;a href=&quot;http://gstreamer.freedesktop.org/releases/gst-libav/0.11.90.html&quot;&gt;gst-libav&lt;/a&gt;,
or download tarballs for
&lt;a href=&quot;http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.11.90.tar.bz2&quot;&gt;gstreamer&lt;/a&gt; or
&lt;a href=&quot;http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.11.90.tar.bz2&quot;&gt;gst-plugins-base&lt;/a&gt;,
&lt;a href=&quot;http://gstreamer.freedesktop.org/src/gst-plugins-good/gst-plugins-good-0.11.90.tar.bz2&quot;&gt;gst-plugins-good&lt;/a&gt;,
&lt;a href=&quot;http://gstreamer.freedesktop.org/src/gst-plugins-bad/gst-plugins-bad-0.11.90.tar.bz2&quot;&gt;gst-plugins-bad&lt;/a&gt;,
&lt;a href=&quot;http://gstreamer.freedesktop.org/src/gst-plugins-ugly/gst-plugins-ugly-0.11.90.tar.bz2&quot;&gt;gst-plugins-ugly&lt;/a&gt;,
&lt;a href=&quot;http://gstreamer.freedesktop.org/src/gst-libav/gst-libav-0.11.90.tar.bz2&quot;&gt;gst-libav&lt;/a&gt;,
    &lt;/p&gt;</content>
		<author>
			<name>GStreamer</name>
			<uri>http://gstreamer.freedesktop.org/news/</uri>
		</author>
		<source>
			<title type="html">GStreamer News</title>
			<subtitle type="html">Latest news from the GStreamer project</subtitle>
			<link rel="self" href="http://gstreamer.freedesktop.org/news/rss-1.0.xml"/>
			<id>http://gstreamer.freedesktop.org/news/rss-1.0.xml</id>
			<updated>2012-05-13T15:17:31+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Plotting the future of Transmageddon</title>
		<link href="http://blogs.gnome.org/uraeus/2012/04/07/plotting-the-future-of-transmageddon/"/>
		<id>http://blogs.gnome.org/uraeus/?p=1844</id>
		<updated>2012-04-07T10:42:52+00:00</updated>
		<content type="html">&lt;p&gt;After a long period of very slow development of &lt;a href=&quot;http://www.linuxrising.org&quot;&gt;Transmageddon&lt;/a&gt; where most work has been in debugging issues with GStreamer 0.11 and porting existing features to GTK3 and GStreamer 0.11, I decided it was time to start thinking about where to go forward again. That said, there are still some issues with the new GTK3 and GStreamer 0.11 version, but I needed a break from just tedious porting/re-implementation work and instead start looking at some new ideas and features.&lt;/p&gt;
&lt;p&gt;There are two major items I am thinking of. The first is what to do with the usecase of people just wanting to create a manual transcode. The goal of Transmageddon is to make transcoding simple, but the problem is that I am trying to simplify something that is inherently quite complex. The current user interface doesn&amp;#8217;t really let you set a lot of things and I know that sometimes that will create files that doesn&amp;#8217;t conform to the needs of the user, for instance a lot of settings are just kept from the original output file, like number of audio channels or bitrate used and so on. And many others just rely on the default values of the GStreamer elements used. I don&amp;#8217;t want to try to support tweaking all of them through the user interface as there is no way of doing so without making the user interface either cluttered or filled with what will be for most people just gibberish. It is the problem I feel for instance Handbrake is suffering from, that yes it does let you set everything you could ever need, so it can create files that will be useable in some cases where the default user interface of Transmageddon falls short, but it also becomes a hard to navigate jungle for people. My answer to the need for that level of settings is and will continue to be the device profiles option, which I also have some plans for. That said there are a couple of features I do think would be useful to enable from the non-preset interface, like being able to resize the video, choose if you want deinterlacing or not and to allow you to choose stereo output for the audio and finally I want to allow the creation of transcoding queues, so you don&amp;#8217;t have to wait until one transcode is finished before configuring another one.&lt;/p&gt;
&lt;p&gt;The one special feature I already got in there, the ability to rotate the video, so that if your video for instance was shot with a camera held sideways, also felt rather arbitrary (it was put in there due to a very early bug request) to have exposed in the userinterface.&lt;/p&gt;
&lt;p&gt;So what I have been experimenting with is as user interface which has an Advanced menu option in which you can set certain things and also enable certain extra options in the user interface.&lt;br /&gt;
&lt;div class=&quot;wp-caption alignnone&quot;&gt;&lt;a href=&quot;http://www.linuxrising.org/screenshots/prototypes/advancedmenu.png&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://www.linuxrising.org/screenshots/prototypes/advancedmenu.png&quot; width=&quot;531&quot; height=&quot;513&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Idea around adding an Advanced option in Transmageddon&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;
So as you see in the screenshot above there are certain options which you just turn on/off and certain options which when enabled will add extra elements to the userinterface as shown below.&lt;br /&gt;
If I go down this route the question of course comes what options to put into this Advanced menu and also if I should make the settings persistent accross runs of Transmageddon or if I should let Transmageddon return to its default settings every time you start it.&lt;/p&gt;
&lt;div class=&quot;wp-caption alignnone&quot;&gt;&lt;a href=&quot;http://www.linuxrising.org/screenshots/prototypes/alloptionsenabled.png&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://www.linuxrising.org/screenshots/prototypes/alloptionsenabled.png&quot; width=&quot;523&quot; height=&quot;644&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Transmageddon with all advanced options enabled&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;&lt;b&gt;The Transmageddon editor&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Of course the Advanced menu will never become the solution to all transcoding challenges, the device profiles will still be that. But I realized that editing textfiles is not for everyone and it also makes creating advanced profiles a task for even fewer people than there needs to be. I don&amp;#8217;t know how many people out there have made their own profiles, but the only one I ever got submitted was from Stefan Kost who made one for the N900. That is probably mostly due to lack of documentation of how to create profiles and where to put them, a problem I have been planning to remedy. That said I realized that maybe creating some kind of editor would be an even better solution, as it could provide a lot of helpful tools for profile creation and thus making it accessible to a lot more people. Which is why I been trying to prototype what such an user interface could look like.&lt;br /&gt;
&lt;div class=&quot;wp-caption alignnone&quot;&gt;&lt;a href=&quot;http://www.linuxrising.org/screenshots/prototypes/transmageddoneditor.png&quot;&gt;&lt;img alt=&quot;Profile Editor image&quot; src=&quot;http://www.linuxrising.org/screenshots/prototypes/transmageddoneditor.png&quot; width=&quot;557&quot; height=&quot;782&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Screenshot of prototype for Transmageddon profile editor&lt;/p&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;The interface above is what I got so far, and it is just a glorified profile viewer atm, but my hope is to make it fully functional and hopefully useful to people. One feature I really want to do is to allow you to take an existing video, have the profile editor analyze it and create a new profile that will allow you to replicate the settings of that file. So when you get a new phone or device the manufacturer most likely put a sample file on it, you can then load that sample into the editor and the editor will create a profile that matches it. This will enable you to transcode other files to that profile and thus make them work on your device.&lt;/p&gt;
&lt;p&gt;That said this will be a major task creating this editor, because I want to to contain a lot of clever logic, so that it doesn&amp;#8217;t just end up being a glorified text editor, but I will need to test and experiement to figure out what that logic will be and how to expose it in the user interface.&lt;/p&gt;
&lt;p&gt;Anyway, I am hoping to hear back from the community on these two new things and playing with to hear what you think, both from a usability standpoint and of course ideas for how the features could work or should not work, and what you would need to make Transmageddon suit your needs.&lt;/p&gt;</content>
		<author>
			<name>Christian Schaller</name>
			<uri>http://blogs.gnome.org/uraeus</uri>
		</author>
		<source>
			<title type="html">Christian Schaller</title>
			<subtitle type="html">GStreamer news and more</subtitle>
			<link rel="self" href="http://blogs.gnome.org/uraeus/feed/"/>
			<id>http://blogs.gnome.org/uraeus/feed/</id>
			<updated>2012-05-22T21:47:03+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">StatusNet for MeeGo 0.2</title>
		<link href="http://blog.mikeasoft.com/2012/04/07/statusnet-for-meego-0-2/"/>
		<id>http://blog.mikeasoft.com/?p=311</id>
		<updated>2012-04-07T00:45:47+00:00</updated>
		<content type="html">&lt;p&gt;&lt;a href=&quot;http://mikeasoft.com/~mike/statusnet-meego-posting.png&quot;&gt;&lt;img alt=&quot;StatusNet for MeeGo sending messages and replies&quot; src=&quot;http://mikeasoft.com/~mike/statusnet-meego-posting-small.png&quot; title=&quot;StatusNet for MeeGo sending messages and replies &quot; class=&quot;alignright&quot; width=&quot;303&quot; height=&quot;539&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Overview&lt;/h3&gt;
&lt;p&gt;StatusNet for MeeGo makes it possible for Nokia N9, N950 and similar phones to connect to &lt;a href=&quot;http://status.net&quot;&gt;StatusNet&lt;/a&gt; compatible microblogging services such as &lt;a href=&quot;http://identi.ca&quot;&gt;Identi.ca&lt;/a&gt;. It supports viewing statuses in the phone&amp;#8217;s event feed alongside Twitter and Facebook updates, viewing conversations, posting new status updates and replying to other people.&lt;/p&gt;
&lt;p&gt;Assuming no issues are encountered by testers I plan on submitting this version to the &lt;a href=&quot;http://apps.formeego.org/&quot;&gt;Apps For MeeGo&lt;/a&gt; repository, and later also the Nokia Ovi Store.&lt;/p&gt;
&lt;p&gt;You&amp;#8217;ll need to restart your phone before statuses start appearing in the events feed, although you&amp;#8217;ll be able to use the main app straight away. Because of some changes in the dbus services its also necessary to restart your phone even if you&amp;#8217;ve already installed version 0.1 (this won&amp;#8217;t be needed after future updates though).&lt;/p&gt;
&lt;h3&gt;New features&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Posting updates.&lt;/li&gt;
&lt;li&gt;Posting replies.&lt;/li&gt;
&lt;li&gt;Viewing messages in the application.&lt;/li&gt;
&lt;li&gt;Display full conversations.&lt;/li&gt;
&lt;li&gt;Load additional statuses from earlier in time.&lt;/li&gt;
&lt;li&gt;Splash screen while connecting.&lt;/li&gt;
&lt;li&gt;Improved dbus handling.&lt;/li&gt;
&lt;li&gt;Asynchronous message loading and posting.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Planned features&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Support for displaying rich content (pictures, videos, etc.)&lt;/li&gt;
&lt;li&gt;Ability to mark statuses as being &amp;#8220;favourites&amp;#8221;.&lt;/li&gt;
&lt;li&gt;Option to subscribe to new users in the app.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Download&lt;/h3&gt;
&lt;p&gt;Ovi Store: &lt;a href=&quot;http://store.ovi.com/content/271186&quot;&gt;StatusNet for MeeGo&lt;/a&gt;&lt;br /&gt;
Direct download: &lt;a href=&quot;http://mikeasoft.com/~mike/statusnet-meego_0.2-4_armel.deb&quot;&gt;statusnet-meego_0.2-4_armel.deb&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Source&lt;/h3&gt;
&lt;p&gt;License: &lt;a href=&quot;http://www.gnu.org/copyleft/gpl.html&quot;&gt;GPL version 3.0 or later&lt;/a&gt;&lt;br /&gt;
Gitorious repository: &lt;a href=&quot;https://gitorious.org/statusnet-meego-plugin&quot;&gt;https://gitorious.org/statusnet-meego-plugin&lt;/a&gt;&lt;br /&gt;
Ohloh project page: &lt;a href=&quot;https://www.ohloh.net/p/statusnet-meego&quot;&gt;https://www.ohloh.net/p/statusnet-meego&lt;/a&gt;&lt;/p&gt;</content>
		<author>
			<name>Michael Sheldon</name>
			<uri>http://blog.mikeasoft.com/</uri>
		</author>
		<source>
			<title type="html">Michael Sheldon's Stuff</title>
			<link rel="self" href="http://blog.mikeasoft.com/feed/"/>
			<id>http://blog.mikeasoft.com/feed/</id>
			<updated>2012-05-19T12:47:16+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">OggStreamer: audio capture and streaming device</title>
		<link href="http://schleef.org/2012/04/05/oggstreamer-audio-capture-and-streaming-device/"/>
		<id>http://schleef.org/?p=138</id>
		<updated>2012-04-06T00:30:39+00:00</updated>
		<content type="html">&lt;p&gt;Recently learned about a cool new open hardware project called &lt;a href=&quot;http://oggstreamer.wordpress.com/&quot;&gt;OggStreamer&lt;/a&gt;.  They&amp;#8217;re designing and making a small device that records an analog audio signal and streams it using Ogg/Vorbis.  It&amp;#8217;s an open hardware project, so all the schematics and PCB layout is provided.&lt;/p&gt;</content>
		<author>
			<name>David Schleef</name>
			<uri>http://schleef.org</uri>
		</author>
		<source>
			<title type="html">Passing on the Left</title>
			<subtitle type="html">Just another WordPress weblog</subtitle>
			<link rel="self" href="http://schleef.org/feed/"/>
			<id>http://schleef.org/feed/</id>
			<updated>2012-05-22T21:47:12+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">PulseAudio in Google Summer of Code 2012</title>
		<link href="http://arunraghavan.net/2012/04/pulseaudio-in-google-summer-of-code-2012/"/>
		<id>http://arunraghavan.net/?p=1297</id>
		<updated>2012-04-04T12:27:43+00:00</updated>
		<content type="html">&lt;p&gt;If you&amp;#8217;re a student participating in this year&amp;#8217;s edition of Google Summer of Code and want to get your hands dirty with some fun low-level hacking, here&amp;#8217;s a quick reminder that PulseAudio is a participating organisation for the first time, and we have some &lt;a href=&quot;http://www.freedesktop.org/wiki/Software/PulseAudio/GSoC2012&quot;&gt;nice ideas&lt;/a&gt; for you to hack on.&lt;/p&gt;

&lt;p&gt;The deadline for applications is 2 days away, so get those applications in soon! If you&amp;#8217;ve got questions, feel free to drop by #pulseaudio on the Freenode IRC network and ping us. (I&amp;#8217;m &lt;tt&gt;Ford_Prefect&lt;/tt&gt; there for those who don&amp;#8217;t know)&lt;/p&gt;</content>
		<author>
			<name>Arun Raghavan</name>
			<uri>http://arunraghavan.net/</uri>
		</author>
		<source>
			<title type="html">Arun Raghavan</title>
			<subtitle type="html">Extremely pithy tagline here</subtitle>
			<link rel="self" href="http://arunraghavan.net/feed/"/>
			<id>http://arunraghavan.net/feed/</id>
			<updated>2012-05-12T11:17:17+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-us">
		<title type="html">3 Apr 2012</title>
		<link href="http://www.advogato.org/person/ensonic/diary.html?start=128"/>
		<id>http://www.advogato.org/person/ensonic/diary.html?start=128</id>
		<updated>2012-04-03T19:40:09+00:00</updated>
		<content type="html">&lt;b&gt;Buzztard &amp;amp; Distro Versions&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
I started hacking on the transport settings. The idea here is to have a generic scheme for how to control playback (start, stop, seek) externally. This can be a midi-controller, but also qjackcontrol or a MPRIS applet. The setting now show the available modules and allow to enable master and slave mode as well as mode specific settings. I could remove the combobox from the toolbar again.&lt;br /&gt;
&lt;br /&gt;
As a next big thing I started to refactor a big chunk of duplicated code in core. Machines have global parameters, per voice parameters and per incoming wire parameters. Now we have a parameter-group class that deals with those.&lt;br /&gt;
&lt;br /&gt;
I spend the rest of the month cleaning up the test suite and the autofoo setup. On the latter I bumped the required versions. The policy now is to support the linux distributions from about the last two years. This allowed me to remove large chunks of conditional code. Unfortunately it is not easy to do that. The easy part is to check what versions we require, by looking at the pkg-config macros in configure.ac. Then we can also grep for conditional section in the code:&lt;br /&gt;
&lt;code&gt;find . \( -name &quot;*.c&quot; -o -name &quot;*.h&quot; \) -exec egrep -o &quot;[A-Z]*_CHECK_VERSION\(.*\)&quot; {} \; | sort | uniq&lt;/code&gt;&lt;br /&gt;
Now the tricky part is to figure what distributions ship. It is somewhat easier for debian/ubuntu as they have pages like:&lt;br /&gt;
&lt;code&gt;&lt;a href=&quot;http://packages.debian.org/search?suite=all&amp;arch=any&amp;searchon=names&amp;keywords=libgstreamer0.10-0&quot;&gt;http://packages.debian.org/search?suite=all&amp;amp;arch=any&amp;amp;searchon=names&amp;amp;keywords=libgstreamer0.10-0&lt;/a&gt;&lt;a href=&quot;http://packages.ubuntu.com/search?suite=all&amp;section=all&amp;arch=any&amp;searchon=names&amp;keywords=libgstreamer0.10&quot;&gt;http://packages.ubuntu.com/search?suite=all&amp;amp;section=all&amp;amp;arch=any&amp;amp;searchon=names&amp;amp;keywords=libgstreamer0.10&lt;/a&gt;&lt;/code&gt;&lt;br /&gt;
For fedora Company suggested to look at the spec files in git and iterate over the branch names&lt;br /&gt;
&lt;code&gt;&lt;a href=&quot;http://pkgs.fedoraproject.org/gitweb/?p=gstreamer.git;a=blob;f=gstreamer.spec;hb=f17&quot;&gt;http://pkgs.fedoraproject.org/gitweb/?p=gstreamer.git;a=blob;f=gstreamer.spec;hb=f17&lt;/a&gt;&lt;/code&gt;&lt;br /&gt;
For opensuse Vuntz suggested to use an osc query at which I failed misserably and in the end checked the packages in the repo and iterated over the versions:&lt;br /&gt;
&lt;code&gt;&lt;a href=&quot;http://download.opensuse.org/distribution/12.1/repo/oss/suse/i586/&quot;&gt;http://download.opensuse.org/distribution/12.1/repo/oss/suse/i586/&lt;/a&gt;&lt;/code&gt;&lt;br /&gt;
Anyone know better tricks? Please share them!&lt;br /&gt;
&lt;br /&gt;
One more motivation for doing this is upcomming gsoc. If I am lucky to get a student who will port buzztard to gstreamer 1.0. We'll release a 0.7 of buzztard before we switch to the new gstreamer api.&lt;br /&gt;
&lt;br /&gt;
212 files changed, 7954 insertions(+), 7778 deletions(-)</content>
		<author>
			<name>Stefan Kost</name>
			<uri>http://www.advogato.org/person/ensonic/</uri>
		</author>
		<source>
			<title type="html">Advogato blog for ensonic</title>
			<subtitle type="html">Advogato blog for ensonic</subtitle>
			<link rel="self" href="http://www.advogato.org/person/ensonic/rss.xml"/>
			<id>http://www.advogato.org/person/ensonic/rss.xml</id>
			<updated>2012-05-22T21:47:04+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">StatusNet client for the Nokia N9/N950</title>
		<link href="http://blog.mikeasoft.com/2012/04/03/statusnet-client-for-the-nokia-n9n950/"/>
		<id>http://blog.mikeasoft.com/?p=293</id>
		<updated>2012-04-03T15:58:04+00:00</updated>
		<content type="html">&lt;p&gt;&lt;a href=&quot;http://blog.mikeasoft.com/wp-content/uploads/2012/04/statusnet-meego.png&quot;&gt;&lt;img src=&quot;http://blog.mikeasoft.com/wp-content/uploads/2012/04/statusnet-meego.png&quot; alt=&quot;StatusNet messages in the MeeGo events feed&quot; title=&quot;StatusNet messages in the MeeGo events feed&quot; width=&quot;390&quot; height=&quot;693&quot; class=&quot;alignright size-full wp-image-294&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;There&amp;#8217;s one thing that my Nokia N950 has been lacking and that&amp;#8217;s a &lt;a href=&quot;http://status.net&quot;&gt;StatusNet&lt;/a&gt; client, so I set about hacking one together. I love the way that the N9/N950 events feed displays messages from Twitter and Facebook, so my main focus so far has been to integrate with this. I&amp;#8217;ve now got my client to a stage at which it covers most of my own needs so I thought I&amp;#8217;d make an early release for others to play with.&lt;/p&gt;
&lt;p&gt;Once I&amp;#8217;ve extended it a little further I plan on submitting it to both &lt;a href=&quot;http://apps.formeego.org/&quot;&gt;Apps For Meego&lt;/a&gt; and the general Nokia Ovi Store, but for now you can download the Debian package directly &lt;a href=&quot;http://blog.mikeasoft.com/feed/#download&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;One thing to note is that you will need to restart your phone before events will start to appear (this is due to a limitation in the way the SyncFW framework loads plugins).&lt;/p&gt;
&lt;p&gt;The client is written mostly in Python, with a little C++ for integrating with the events synchronisation framework. It makes use of the StatusNet module written for the command line StatusNet client &lt;a href=&quot;http://identicurse.net/&quot;&gt;IdentiCurse&lt;/a&gt; and the &lt;a href=&quot;http://thp.io/2011/eventfeed/&quot;&gt;python-eventfeed module&lt;/a&gt; written by &lt;a href=&quot;http://thp.io/&quot;&gt;Thomas Perl&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Features&lt;/h3&gt;
&lt;p&gt;* OAuth login for &lt;a href=&quot;http://identi.ca&quot;&gt;identi.ca&lt;/a&gt;.&lt;br /&gt;
* Standard login for any other StatusNet services.&lt;br /&gt;
* Shows messages in the events feed.&lt;br /&gt;
* Fetches (and caches) user avatars.&lt;br /&gt;
* Displays messages from the events feed in the browser when clicked.&lt;br /&gt;
* Automatically fetches new messages in the events feed based on your events feed preferences.&lt;br /&gt;
* Can manually fetch new messages via the events feed &amp;#8216;Refresh&amp;#8217; button.&lt;/p&gt;
&lt;h3&gt;Not yet implemented&lt;/h3&gt;
&lt;p&gt;* Posting messages.&lt;br /&gt;
* Displaying messages locally within the application.&lt;br /&gt;
* Displaying rich content (messages with multimedia attachments)&lt;/p&gt;
&lt;h3 id=&quot;download&quot;&gt;Download&lt;/h3&gt;
&lt;p&gt;Ovi Store: &lt;a href=&quot;http://store.ovi.com/content/271186&quot;&gt;StatusNet for MeeGo&lt;/a&gt;&lt;br /&gt;
Direct download: &lt;a href=&quot;http://mikeasoft.com/~mike/statusnet-meego_0.1-3_armel.deb&quot;&gt;statusnet-meego_0.1-3_armel.deb&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Source&lt;/h3&gt;
&lt;p&gt;License: &lt;a href=&quot;http://www.gnu.org/copyleft/gpl.html&quot;&gt;GPL version 3.0 or later&lt;/a&gt;&lt;br /&gt;
Gitorious repository: &lt;a href=&quot;https://gitorious.org/statusnet-meego-plugin&quot;&gt;https://gitorious.org/statusnet-meego-plugin&lt;/a&gt;&lt;br /&gt;
Ohloh project page: &lt;a href=&quot;https://www.ohloh.net/p/statusnet-meego&quot;&gt;https://www.ohloh.net/p/statusnet-meego&lt;/a&gt;&lt;/p&gt;</content>
		<author>
			<name>Michael Sheldon</name>
			<uri>http://blog.mikeasoft.com/</uri>
		</author>
		<source>
			<title type="html">Michael Sheldon's Stuff</title>
			<link rel="self" href="http://blog.mikeasoft.com/feed/"/>
			<id>http://blog.mikeasoft.com/feed/</id>
			<updated>2012-05-19T12:47:16+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Update on the GStreamer DeckLink Elements</title>
		<link href="http://schleef.org/2012/04/02/update-on-the-gstreamer-decklink-elements/"/>
		<id>http://schleef.org/?p=118</id>
		<updated>2012-04-03T04:56:50+00:00</updated>
		<content type="html">&lt;p&gt;A little more than a year ago, I &lt;a href=&quot;http://schleef.org/2011/03/24/gstreamer-sdi-capture-plugins/&quot;&gt;posted&lt;/a&gt; about &lt;a href=&quot;http://gstreamer.freedesktop.org/&quot;&gt;GStreamer&lt;/a&gt; support for SDI and HD-SDI using &lt;a href=&quot;http://www.blackmagic-design.com/products/decklink&quot;&gt;DeckLink&lt;/a&gt; hardware from BlackMagic Design.  In the meantime, the decklinksrc and decklinksink elements have grown up a bit, and work with most devices in the DeckLink and &lt;a href=&quot;http://www.blackmagic-design.com/products/intensity/&quot;&gt;Intensity&lt;/a&gt; line of hardware.  A laundry list of features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Multiple device support&lt;/li&gt;
&lt;li&gt;Multiple input and output support on a single device&lt;/li&gt;
&lt;li&gt;HDMI, component analog, and composite input and output with Intensity Pro&lt;/li&gt;
&lt;li&gt;Analog, AES/EBU, and embedded (HDMI/SDI) audio input&lt;/li&gt;
&lt;li&gt;SDI, HD-SDI, and Optical SDI input and output with DeckLink&lt;/li&gt;
&lt;li&gt;Works on Linux, OS/X (new), and Windows&lt;/li&gt;
&lt;li&gt;8-bit and 10-bit support for SDI/HD-SDI&lt;/li&gt;
&lt;li&gt;Supports most video modes in the DeckLink SDK&lt;/li&gt;
&lt;li&gt;Implements GstPropertyProbe interface for proper detection as a source element&lt;/li&gt;
&lt;li&gt;Lots of bug fixes from previous releases&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Kudos to Blake Tregre and Joshua Doe for submitting several of the patches implementing the above list.  There still a bunch of outstanding bug reports (some with patches) that need to be fixed.  Several of these relate to output, which is currently rather clumsy and broken.&lt;/p&gt;
&lt;p&gt;People have asked me about automatically detecting the video mode for input.  Some DeckLink hardware has this capability, but not any of the hardware I have to test with.  However, I&amp;#8217;ve had some success with cycling through the video modes at the application level, with a 200 ms timeout between modes, stopping when it finds a mode than generates output.  This works ok, except that it tends to confuse 60i and 30p modes (and 50i with 25p), which can be differentiated with a bit of processing on the images.  At some point I&amp;#8217;d like to integrate this functionality into decklinksrc, but wouldn&amp;#8217;t be upset if someone else did it first.&lt;/p&gt;</content>
		<author>
			<name>David Schleef</name>
			<uri>http://schleef.org</uri>
		</author>
		<source>
			<title type="html">Passing on the Left</title>
			<subtitle type="html">Just another WordPress weblog</subtitle>
			<link rel="self" href="http://schleef.org/feed/"/>
			<id>http://schleef.org/feed/</id>
			<updated>2012-05-22T21:47:12+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">PiTiVi GES spring sitrep</title>
		<link href="http://jeff.ecchi.ca/blog/2012/04/02/pitivi-ges-spring-sitrep/"/>
		<id>http://jeff.ecchi.ca/blog/?p=2110</id>
		<updated>2012-04-02T22:54:11+00:00</updated>
		<content type="html">&lt;p&gt;Now that the Internet is back to normal, here&amp;#8217;s a status update on what I&amp;#8217;ve been busy doing lately.&lt;/p&gt;
&lt;div id=&quot;attachment_2111&quot; class=&quot;wp-caption alignnone&quot;&gt;&lt;a href=&quot;http://jeff.ecchi.ca/blog/wp-content/uploads/2012-04-01.jpg&quot;&gt;&lt;img class=&quot;size-medium wp-image-2111 &quot; title=&quot;2012-04-01&quot; src=&quot;http://jeff.ecchi.ca/blog/wp-content/uploads/2012-04-01-500x303.jpg&quot; alt=&quot;&quot; width=&quot;500&quot; height=&quot;303&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;The new media library clip previewer, to see all the important details.&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;&lt;span id=&quot;more-2110&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;You may remember my initial &lt;a href=&quot;http://jeff.ecchi.ca/blog/2012/03/07/trim-like-a-professional-hair-stylist/&quot;&gt;donation experiment last month&lt;/a&gt; where I presented the new realtime trimming preview feature—I was not kidding. It&amp;#8217;s merged in the pitivi &amp;#8220;ges&amp;#8221; development branch now, with some additional improvements tacked on.&lt;/p&gt;
&lt;p&gt;Since my last blog post, I&amp;#8217;ve been spending a lot of spare time:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Preparing Pitivi &lt;a href=&quot;http://jeff.ecchi.ca/blog/2012/03/18/gsoc-2012-and-pitivi/&quot;&gt;for GSoC&lt;/a&gt; (and in general, every detail counts to make the lives of new contributors easier)&lt;/li&gt;
&lt;li&gt;Mentoring GSoC candidates&lt;/li&gt;
&lt;li&gt;Filing bugs and cleaning up my shared internal &amp;#8220;Pitivi GES TODO&amp;#8221;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://jeff.ecchi.ca/blog/2012/03/15/switching-pitivis-main-git-repository/&quot;&gt;Making GNOME git the official development repository&lt;/a&gt; for PiTiVi&lt;/li&gt;
&lt;li&gt;Reviewing and merging patches. One of the new visible features I&amp;#8217;m enthusiastic about is the ability to export standalone archives of your project (thanks to Paul Lange), which can come in handy for debugging!&lt;/li&gt;
&lt;li&gt;Documenting various things:&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://jeff.ecchi.ca/blog/2012/03/13/what-the-heck-is-this-ges-thing-anyway/&quot;&gt;What GES is&lt;/a&gt; and how important the port to GES is to us.&lt;/li&gt;
&lt;li&gt;Creating some new brainstorming pages &lt;a href=&quot;http://wiki.pitivi.org/wiki/Title_editor_design&quot;&gt;for the title editor&lt;/a&gt; and &lt;a href=&quot;http://wiki.pitivi.org/wiki/Grouping_and_nesting&quot;&gt;for grouping/nesting&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://jeff.ecchi.ca/blog/2012/02/28/y-u-no-gtk3-yet/&quot;&gt;The situation with GTK 3/GSt 1.0&lt;/a&gt; (hopefully, with some help we will resolve that quite soon, actually)&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Searching for creative ways to get people to contribute to GES and solve the bugs that prevent us from making a release right now.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you take a step back and compare to the latest stable release (0.15.1), on the pitivi side you have:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Clip thumbnails in the media library are not only much prettier: they load instantaneously too.&lt;/li&gt;
&lt;li&gt;An automated project &lt;a href=&quot;http://jeff.ecchi.ca/blog/2012/01/25/restoring-from-backups/&quot;&gt;backup/restore system&lt;/a&gt;. The new code for it is beautiful. I spent a crazy amount of time testing it (those of you who know me know that I&amp;#8217;m probably the most meticulous tester that can be), and as far as I can tell, it&amp;#8217;s bulletproof.&lt;/li&gt;
&lt;li&gt;Cleaned up menus and keyboard shortcuts&lt;/li&gt;
&lt;li&gt;The ability to export the current frame&lt;/li&gt;
&lt;li&gt;Sleep inhibition (thanks to Stephen Griffiths)&lt;/li&gt;
&lt;li&gt;An improved clip previewer that gives you more space to view the video, yet stays out of your way (pictured above)&lt;/li&gt;
&lt;li&gt;Better filename/paths handling&lt;/li&gt;
&lt;li&gt;Less CPU usage when idle&lt;/li&gt;
&lt;li&gt;Match GTK&amp;#8217;s appearance regarding button icons&lt;/li&gt;
&lt;li&gt;Various little UI fixes all over the place&lt;/li&gt;
&lt;li&gt;A huge code cleanup and refactoring all around, with a vastly simplified codebase and much simpler architecture&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That&amp;#8217;s just the surface. With GES, in addition to the simplified Pitivi codebase, we have some other niceties:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Playback performance back to the 0.13.1 levels (or better?). Want to play a 1080p clip? No problem. A 4K clip? Then you&amp;#8217;ll probably benefit from hardware decoding acceleration when we switch to GStreamer 1.0, if your video hardware and driver supports it—goodbye, CPU bottlenecks.&lt;/li&gt;
&lt;li&gt;Importing clips is blazing fast and asynchroneous (it won&amp;#8217;t block the UI).&lt;/li&gt;
&lt;li&gt;Loading a project timeline is instantaneous.&lt;/li&gt;
&lt;li&gt;Various backend bugs that plagued earlier releases are possibly a thing of the past.&lt;/li&gt;
&lt;li&gt;Faster application startup.&lt;/li&gt;
&lt;li&gt;Boundless possibilities&amp;#8230;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It&amp;#8217;s not ready just yet though. We need &lt;a href=&quot;http://pitivi.org/?go=contributing&quot;&gt;your help&lt;/a&gt; to be able to get 0.16 out of the door. There are some feature regressions (like drawing the clip thumbnails or waveforms on the timeline), but more importantly there are a handful of serious &lt;a href=&quot;https://bugzilla.gnome.org/buglist.cgi?short_desc=[pitivi];short_desc_type=allwordssubstr;component=gst-editing-services;product=GStreamer &quot;&gt;bugs in GES that are blocking us&lt;/a&gt; (they are not many, but they&amp;#8217;re hard to solve). If we can get help to fix these we might finally be able to get a release (or at least an alpha) out of the door.&lt;/p&gt;</content>
		<author>
			<name>Jean-François Fortin Tam</name>
			<uri>http://jeff.ecchi.ca/blog/</uri>
		</author>
		<source>
			<title type="html">Nekohayo !</title>
			<subtitle type="html">La vie personnelle du chat</subtitle>
			<link rel="self" href="http://jeff.ecchi.ca/blog/feed/"/>
			<id>http://jeff.ecchi.ca/blog/feed/</id>
			<updated>2012-05-19T22:17:22+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Evolution backup recovery</title>
		<link href="http://thomas.apestaart.org/log/?p=1464"/>
		<id>http://thomas.apestaart.org/log/?p=1464</id>
		<updated>2012-04-01T14:36:12+00:00</updated>
		<content type="html">&lt;p&gt;I pretty much never drink and hack, and last Friday&amp;#8217;s evening is a good reason why.  I was having a rare beer and managed to spill part of it on my keyboard and desk.  So I turned the keyboard around, started cleaning it as fast as I could, forgetting to actually unplug it.  I called it a night because nothing good was going to come from that night anymore.&lt;/p&gt;
&lt;p&gt;And on Saturday morning I noticed that my INBOX was gone.  Hm, is it really gone? Yep, gone from my laptop too.  Crap, must have deleted it on the server by accident while cleaning my keyboard&amp;#8230;&lt;/p&gt;
&lt;p&gt;And because my NAS is a little full lately, I haven&amp;#8217;t been as diligent with backups as I normally have been.  Hm, and the modest cache on my N900 isn&amp;#8217;t very useful either&amp;#8230;&lt;/p&gt;
&lt;p&gt;Luckily, evolution on my work machine was shut down for some reason, so yay, it has a reasonably fresh cache of my INBOX!&lt;/p&gt;
&lt;p&gt;Except that it&amp;#8217;s not all that straightforward to actually get this cache back into Evolution.  Just copying its contents to an existing or new folder doesn&amp;#8217;t do anything.  The files themselves are split up versions of the actual email, assumingly because the evo guys thought it would be faster to search header and body by splitting them off from the attachments and saving them separately, inventing their own caching format.  Which is fine, but makes it impossible to actually restore a backup with&amp;#8230;&lt;/p&gt;
&lt;p&gt;After lots of Googling, I stumbled upon &lt;a href=&quot;http://bzr.flogisoft.com/evolution-imap-cache-to-mbox/&quot;&gt;this tool&lt;/a&gt; that did the trick for me.  A lot of hours wasted over a bunch of emails&amp;#8230; But what would happen if I really lost my IMAP server mail ? Run this script by hand on all the folders ? Shudder&amp;#8230;&lt;/p&gt;</content>
		<author>
			<name>Thomas Vander Stichele</name>
			<uri>http://thomas.apestaart.org/log</uri>
		</author>
		<source>
			<title type="html">thomas.apestaart.org</title>
			<subtitle type="html">Present Perfect</subtitle>
			<link rel="self" href="http://thomas.apestaart.org/log/?feed=rss2"/>
			<id>http://thomas.apestaart.org/log/?feed=rss2</id>
			<updated>2012-04-01T14:47:34+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">git bash prompt</title>
		<link href="http://thomas.apestaart.org/log/?p=1462"/>
		<id>http://thomas.apestaart.org/log/?p=1462</id>
		<updated>2012-03-29T19:39:30+00:00</updated>
		<content type="html">&lt;p&gt;I&amp;#8217;ve been having fun recently on a new project where I put myself through all sorts of pain by nesting git submodules into team submodules into platform submodules and so on.  The goal here is to be able to tag a root repository and thus identify exact commit hashes of all the submodules to any level.  This was an idea &lt;a href=&quot;http://ylatuya.es/&quot;&gt;Andoni&lt;/a&gt; had when he was working on livetranscoding in response to a request of mine where I want to be able to use a single &amp;#8216;tag&amp;#8217; to identify a complete deployment.&lt;/p&gt;
&lt;p&gt;That&amp;#8217;s been working better than I expected, and I even hacked git-submodule-tools so that I can do git rlog and get a recursive git log between two root version tags, and get a list of every commit between the master and all submodules.  That&amp;#8217;s pretty neat for writing out release notes.&lt;/p&gt;
&lt;p&gt;However, the way I embedded submodules causes a bit of pain when going back and forth.  One of my hackers once gave me a PS1 bash prompt that includes info of which git branch you&amp;#8217;re on in your shell prompt.  So today I decided to extend that a little, and I now have this:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;(b:release-0.2.x d:deploy-pro-2012-03-29) [thomas@otto platform]$ ls&lt;br /&gt;
Makefile  platform  puppet  RELEASE-0.2.1&lt;br /&gt;
(b:release-0.2.x d:deploy-pro-2012-03-29) [thomas@otto platform]$ cd puppet/pro/&lt;br /&gt;
(s:puppet/pro b:release-0.2.x d:v0.2.1) [thomas@otto pro]$ &lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This is showing me submodule name, branch, and description of the current commit.&lt;/p&gt;
&lt;p&gt;If you want this for your prompting fun too, &lt;a href=&quot;https://github.com/thomasvs/bash-prompt-git&quot;&gt;here&amp;#8217;s the github repo&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In the near future, simple portknocking for fun and profit with bash!&lt;/p&gt;</content>
		<author>
			<name>Thomas Vander Stichele</name>
			<uri>http://thomas.apestaart.org/log</uri>
		</author>
		<source>
			<title type="html">thomas.apestaart.org</title>
			<subtitle type="html">Present Perfect</subtitle>
			<link rel="self" href="http://thomas.apestaart.org/log/?feed=rss2"/>
			<id>http://thomas.apestaart.org/log/?feed=rss2</id>
			<updated>2012-04-01T14:47:34+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">GStreamer Google Summer of Code</title>
		<link href="http://blogs.gnome.org/uraeus/2012/03/28/gstreamer-google-summer-of-code-3/"/>
		<id>http://blogs.gnome.org/uraeus/?p=1837</id>
		<updated>2012-03-28T11:47:37+00:00</updated>
		<content type="html">&lt;p&gt;You can now submit an application as a student to be part of this years Google Summer of Code. So if you want to do a GStreamer project be sure to ping us on IRC (#gstreamer, irc.freenode.net) or send an email to the &lt;a href=&quot;http://lists.freedesktop.org/archives/gstreamer-devel/&quot;&gt;gstreamer-devel mailing list&lt;/a&gt; and start discussing any project ideas you might have, or to ask questions about items from our &lt;a href=&quot;http://gstreamer.freedesktop.org/wiki/SocProjects&quot;&gt;SoC ideas page.&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Details on how to submit an application you can find our our &lt;a href=&quot;http://gstreamer.freedesktop.org/wiki/StudentInfo&quot;&gt;Student information page&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;Try to submit your application as soon as possible because if you wait until the day before the deadline of April the 6th, then the amount of time available for feedback and improvements will be small and thus decrease your chances of getting approved.&lt;/p&gt;</content>
		<author>
			<name>Christian Schaller</name>
			<uri>http://blogs.gnome.org/uraeus</uri>
		</author>
		<source>
			<title type="html">Christian Schaller</title>
			<subtitle type="html">GStreamer news and more</subtitle>
			<link rel="self" href="http://blogs.gnome.org/uraeus/feed/"/>
			<id>http://blogs.gnome.org/uraeus/feed/</id>
			<updated>2012-05-22T21:47:03+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Puppet pains</title>
		<link href="http://thomas.apestaart.org/log/?p=1457"/>
		<id>http://thomas.apestaart.org/log/?p=1457</id>
		<updated>2012-03-27T13:53:24+00:00</updated>
		<content type="html">&lt;p&gt;The jury is still out on puppet as far as I&amp;#8217;m concerned.&lt;/p&gt;
&lt;p&gt;On the one hand, of course I relish that feeling of ultimate power you are promised over all those machines&amp;#8230; I appreciate the incremental improvements it lets you make, and have it give you the feeling that anything will be possible.&lt;/p&gt;
&lt;p&gt;But sometimes, it is just so painful to deal with.  Agent runs are incredibly slow.  It really shouldn&amp;#8217;t take over a minute for a simple configuration with four machines.  Also, does it really need to be eating 400 MB of RAM while it does so ? And when running with the default included web server (is that webrick ?), I have to restart my puppetmaster for every single run because there is this one multiple definition that I can&amp;#8217;t figure out that simply goes away when you restart, but comes back after an agent run:&lt;br /&gt;
&lt;code&gt;err: Could not retrieve catalog from remote server: Error 400 on SERVER: Duplicate definition: Class[Firewall::Drop] is already defined; cannot redefine at /etc/puppet/environments/testing/modules/manifests/firewall/drop.pp:19 on node esp&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;And sometimes it&amp;#8217;s just painfully silly.  I just spent two hours trying to figure out why my production machine couldn&amp;#8217;t complete its puppet run.&lt;/p&gt;
&lt;p&gt;All it was telling me was&lt;br /&gt;
&lt;code&gt;Could not evaluate: 'test' is not executable&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;After a lot of googling, I stumbled on &lt;a href=&quot;http://projects.puppetlabs.com/issues/10908&quot;&gt;this ticket&lt;/a&gt;.  And indeed, I had a file called &amp;#8216;test&amp;#8217; in my /root directory.&lt;/p&gt;
&lt;p&gt;I couldn&amp;#8217;t agree with the reporter more:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;I find it incredibly un-pragmatic to have policies fail to run whenever someone creates a file in root which matches the name of an executable I am running.&lt;/p&gt;
&lt;/blockquote&gt;</content>
		<author>
			<name>Thomas Vander Stichele</name>
			<uri>http://thomas.apestaart.org/log</uri>
		</author>
		<source>
			<title type="html">thomas.apestaart.org</title>
			<subtitle type="html">Present Perfect</subtitle>
			<link rel="self" href="http://thomas.apestaart.org/log/?feed=rss2"/>
			<id>http://thomas.apestaart.org/log/?feed=rss2</id>
			<updated>2012-04-01T14:47:34+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">ac</title>
		<link href="http://codeanticode.wordpress.com/2012/03/26/opengl-in-processing-2-0-alpha-5/"/>
		<id>http://codeanticode.wordpress.com/?p=1485</id>
		<updated>2012-03-26T22:12:48+00:00</updated>
		<content type="html"></content>
		<author>
			<name>Gustavo Orrillo</name>
			<uri>http://codeanticode.wordpress.com/</uri>
		</author>
		<source>
			<title type="html">codeanticode</title>
			<link rel="self" href="http://codeanticode.wordpress.com/feed/"/>
			<id>http://codeanticode.wordpress.com/feed/</id>
			<updated>2012-05-10T18:47:08+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">HDTV Color Matrix</title>
		<link href="http://schleef.org/2012/03/23/hdtv-color-matrix/"/>
		<id>http://www.schleef.org/blog/?p=50</id>
		<updated>2012-03-24T03:07:09+00:00</updated>
		<content type="html">&lt;p&gt;Digital video is a time series of pictures, and each picture is comprised of an array of pixels, and each pixel is comprised of three numbers representing how brightly the red, green, and blue LCD dots (or CRT phosphors, if you&amp;#8217;re old school) glow.  The representation in memory, however, is not of RGB values, but of YCbCr values, which one calculates by multiplying a 3&amp;#215;3 matrix with the RGB values, and then adding/subtracting some offsets.  This converts the components into a gray value (Y, or luma) and Cb and Cr (chroma blue and chroma red). The reason for doing this is because the human visual system is more sensitive to variations in luma compared to variations in chroma (er, actually luminance and chrominance, see below).  Furthermore, for this reason, typically half or 3/4 of the chroma values are dropped and not stored &amp;#8212; the missing ones are interpolated when converting back to RGB for display.&lt;/p&gt;
&lt;p&gt;There are various theoretical reasons for choosing a particular matrix, and I&amp;#8217;ve recently become interested if these reasons are actually valid.  For historical reasons, early digital video copied analog precedent and used a matrix that is theoretically suboptimal.  This matrix is used in standard definition (SD) video, but was changed to the theoretically correct matrix for high-definition (HD) video.  There are other technical differences between SD and HD video, but this is the most significant for color accuracy.&lt;/p&gt;
&lt;p&gt;For some time, I&amp;#8217;ve been curious how much of a visual difference there is between the two matrices.  Here are two stills from Big Buck Bunny, the first is the original, correct image, and the second is the same picture converted to YCbCr with the HDTV matrix and then back to RGB with the SDTV matrix.  (To best see the differences, open the images in separate browser tabs and flip between them.)&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.schleef.org/wordpress/wp-content/uploads/2012/03/big_buck_bunny_00660.png&quot;&gt;&lt;img class=&quot;alignnone  wp-image-100&quot; title=&quot;Big Buck Bunny frame 660, original&quot; src=&quot;http://schleef.org/wordpress/wp-content/uploads/2012/03/big_buck_bunny_00660.png&quot; alt=&quot;Big Buck Bunny frame 660, original&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;http://www.schleef.org/blog/wp-content/uploads/2012/03/big_buck_bunny_00660-htdv-sdtv.png&quot;&gt;&lt;img class=&quot;alignnone  wp-image-101&quot; title=&quot;Big Buck Bunny frame 660, wrong matrix&quot; src=&quot;http://www.schleef.org/wordpress/wp-content/uploads/2012/03/big_buck_bunny_00660-htdv-sdtv.png&quot; alt=&quot;Big Buck Bunny frame 660, wrong matrix&quot; width=&quot;640&quot; height=&quot;360&quot; /&gt;&lt;/a&gt;If you are like me, you probably have trouble seeing the difference side by side, but flipping between them makes it fairly obvious.  I chose this image because it has relatively saturated green and greenish-yellow, which shows off some of the largest differences.&lt;/p&gt;
&lt;p&gt;The RGB values for the pixels that are used in computation are not proportional to the actual amount of power output by a monitor.  This is known as gamma correction, and is a clever byproduct of the fact that the response curve of television phosphors (the amount of light output for a given voltage) is approximately similar to the response curve of the eye (the perceived brightness based on the amount of light).  Thus voltage became synonymous with perceived brightness, televisions had fewer vacuum tubes, and we&amp;#8217;re left with that legacy.  But it&amp;#8217;s not a bad legacy, because just like dropping chroma values, it makes it easier to compress images.&lt;/p&gt;
&lt;p&gt;However, color comes along and messes with that simplicity a bit.  &lt;a href=&quot;http://en.wikipedia.org/wiki/Luminance_%28colorimetry%29&quot;&gt;Luminance&lt;/a&gt; in color theory is used to describe how the brain interprets the brightness of a particular pixel, which is proportional to the RGB values in linear light space, i.e., the amount of light emanating from a display.  Luma is proportional to the RGB values in gamma-corrected (actually, gamma-compressed) space.  This means that luma doesn&amp;#8217;t simply depend on luminance, and contains some variation due to color.  This messes with our idea that matrixing RGB values will separate variations in brightness from variations in color.  How visible is it?  I took the above picture and squashed the luma to one value, leaving chroma values the same (HD matrix):&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.schleef.org/blog/wp-content/uploads/2012/03/big_buck_bunny_00660-luma1281.png&quot;&gt;&lt;img class=&quot;alignnone  wp-image-103&quot; title=&quot;Big Buck Bunny, frame 660, luma squashed&quot; src=&quot;http://schleef.org/wordpress/wp-content/uploads/2012/03/big_buck_bunny_00660-luma1281.png&quot; alt=&quot;Big Buck Bunny, frame 660, luma squashed&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;What you see here is that saturated areas appear brighter than the grey areas.  This is chroma (i.e., the color values we use in calculations) feeding into luminance (i.e., the perception of brightness).&lt;/p&gt;
&lt;p&gt;How much does this matter for image and video compression efficiency?  It&amp;#8217;s a minor inefficiency of a subtle visual difference.  In other words, not very much.&lt;/p&gt;
&lt;p&gt;Earlier I mentioned that the HD matrix was theoretically more correct than the SD matrix.  What about in practice?  Here&amp;#8217;s the same luma-squashed image with the SD matrix.  Notice that there&amp;#8217;s a lot more leakage from chroma into luminance, especially in the green leaves:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.schleef.org/blog/wp-content/uploads/2012/03/big_buck_bunny_00660-luma128-sdtv.png&quot;&gt;&lt;img class=&quot;alignnone  wp-image-104&quot; title=&quot;Big Buck Bunny, frame 660, chroma squashed with SD matrix&quot; src=&quot;http://schleef.org/wordpress/wp-content/uploads/2012/03/big_buck_bunny_00660-luma128-sdtv.png&quot; alt=&quot;Big Buck Bunny, frame 660, chroma squashed with SD matrix&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content>
		<author>
			<name>David Schleef</name>
			<uri>http://schleef.org</uri>
		</author>
		<source>
			<title type="html">Passing on the Left</title>
			<subtitle type="html">Just another WordPress weblog</subtitle>
			<link rel="self" href="http://schleef.org/feed/"/>
			<id>http://schleef.org/feed/</id>
			<updated>2012-05-22T21:47:12+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">GStreamer Core 0.11.3, Base Plugins 0.11.3, Good Plugins 0.11.2, Bad
      Plugins 0.11.2, Ugly Plugins 0.11.2, FFmpeg Plugins 0.11.2 unstable release</title>
		<link href="http://gstreamer.freedesktop.org/news/#2012-03-22T15:58:00Z"/>
		<id>http://gstreamer.freedesktop.org/news/#2012-03-22T15:58:00Z</id>
		<updated>2012-03-22T15:58:00+00:00</updated>
		<content type="html">&lt;p&gt;
The GStreamer team announces a new release of the GStreamer core,
Base/Good/Bad/Ugly/FFmpeg modules for the 0.11 GStreamer unstable release series.
&lt;/p&gt;&lt;p&gt;
  This is hopefully the last release of the unstable 0.11 core and base series that will lead up
  to the next 1.0 stable series next.
&lt;/p&gt;&lt;p&gt;
Check out release notes for
&lt;a href=&quot;http://gstreamer.freedesktop.org/releases/gstreamer/0.11.3.html&quot;&gt;gstreamer core&lt;/a&gt; or
&lt;a href=&quot;http://gstreamer.freedesktop.org/releases/gst-plugins-base/0.11.3.html&quot;&gt;gst-plugins-base&lt;/a&gt;,
&lt;a href=&quot;http://gstreamer.freedesktop.org/releases/gst-plugins-good/0.11.2.html&quot;&gt;gst-plugins-good&lt;/a&gt;,
&lt;a href=&quot;http://gstreamer.freedesktop.org/releases/gst-plugins-bad/0.11.2.html&quot;&gt;gst-plugins-bad&lt;/a&gt;,
&lt;a href=&quot;http://gstreamer.freedesktop.org/releases/gst-plugins-ugly/0.11.2.html&quot;&gt;gst-plugins-ugly&lt;/a&gt;,
&lt;a href=&quot;http://gstreamer.freedesktop.org/releases/gst-ffmpeg/0.11.2.html&quot;&gt;gst-ffmpeg&lt;/a&gt;,
or download tarballs for
&lt;a href=&quot;http://gstreamer.freedesktop.org/src/gstreamer/gstreamer-0.11.3.tar.bz2&quot;&gt;gstreamer&lt;/a&gt; or
&lt;a href=&quot;http://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-0.11.3.tar.bz2&quot;&gt;gst-plugins-base&lt;/a&gt;,
&lt;a href=&quot;http://gstreamer.freedesktop.org/src/gst-plugins-good/gst-plugins-good-0.11.2.tar.bz2&quot;&gt;gst-plugins-good&lt;/a&gt;,
&lt;a href=&quot;http://gstreamer.freedesktop.org/src/gst-plugins-bad/gst-plugins-bad-0.11.2.tar.bz2&quot;&gt;gst-plugins-bad&lt;/a&gt;,
&lt;a href=&quot;http://gstreamer.freedesktop.org/src/gst-plugins-ugly/gst-plugins-ugly-0.11.2.tar.bz2&quot;&gt;gst-plugins-ugly&lt;/a&gt;,
&lt;a href=&quot;http://gstreamer.freedesktop.org/src/gst-ffmpeg/gst-ffmpeg-0.11.2.tar.bz2&quot;&gt;gst-ffmpeg&lt;/a&gt;,
    &lt;/p&gt;</content>
		<author>
			<name>GStreamer</name>
			<uri>http://gstreamer.freedesktop.org/news/</uri>
		</author>
		<source>
			<title type="html">GStreamer News</title>
			<subtitle type="html">Latest news from the GStreamer project</subtitle>
			<link rel="self" href="http://gstreamer.freedesktop.org/news/rss-1.0.xml"/>
			<id>http://gstreamer.freedesktop.org/news/rss-1.0.xml</id>
			<updated>2012-05-13T15:17:31+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">GStreamer Participating in Google Summer of Code 2012</title>
		<link href="http://gstreamer.freedesktop.org/news/#2012-03-21T13:00:00Z"/>
		<id>http://gstreamer.freedesktop.org/news/#2012-03-21T13:00:00Z</id>
		<updated>2012-03-21T13:00:00+00:00</updated>
		<content type="html">&lt;p&gt;
The GStreamer project is happy to announce that we are a mentoring organization in the 2012 &lt;a href=&quot;http://www.google-melange.com/gsoc/dashboard/google/gsoc2012&quot;&gt;Google Summer of Code&lt;/a&gt;. This means students from all over the world who are interested in open source and multimedia can apply to do a project related to GStreamer as their paid summer job this year. You can find more information about this and how to apply on the &lt;a href=&quot;http://gstreamer.freedesktop.org/wiki/TaskList&quot;&gt;GStreamer Google Summer of Code 2012 wiki page.&lt;/a&gt;. 
                  &lt;/p&gt;</content>
		<author>
			<name>GStreamer</name>
			<uri>http://gstreamer.freedesktop.org/news/</uri>
		</author>
		<source>
			<title type="html">GStreamer News</title>
			<subtitle type="html">Latest news from the GStreamer project</subtitle>
			<link rel="self" href="http://gstreamer.freedesktop.org/news/rss-1.0.xml"/>
			<id>http://gstreamer.freedesktop.org/news/rss-1.0.xml</id>
			<updated>2012-05-13T15:17:31+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">GStreamer and the Google Summer of Code 2012</title>
		<link href="http://blogs.gnome.org/uraeus/2012/03/21/gstreamer-and-the-google-summer-of-code-2012/"/>
		<id>http://blogs.gnome.org/uraeus/?p=1831</id>
		<updated>2012-03-21T12:37:01+00:00</updated>
		<content type="html">&lt;p&gt;A big thanks to Google for making &lt;a href=&quot;http://gstreamer.freedesktop.org&quot;&gt;GStreamer&lt;/a&gt; part of also this years &lt;a href=&quot;http://www.google-melange.com/gsoc/dashboard/google/gsoc2012&quot;&gt;Google Summer of Code&lt;/a&gt;. For those of you who might not know the Google Summer of Code it is basically a program that lets you do a summer internship with various leading open source projects and get paid for it (if you are a student).&lt;/p&gt;
&lt;p&gt;So if you always wanted to get involved with the GStreamer project and become a multimedia wizard, this is a great way to do so. The process is quite simply, you write a proposal for what you want to do (&lt;a href=&quot;http://gstreamer.freedesktop.org/wiki/TaskList&quot;&gt;some possible suggestions and info found here&lt;/a&gt;) and submit it to Google when the application period starts on the 26th of March. Before then you would do well to speak with us on IRC or email lists to discuss your project to maximise your chances of getting selected.&lt;/p&gt;
&lt;p&gt;We have a special &lt;a href=&quot;http://gstreamer.freedesktop.org/wiki/StudentInfo&quot;&gt;Google Summer of Code student information page&lt;/a&gt; with information on what the GStreamer project specifically expects of you and your proposal. So for those interested that should be a good starting point.&lt;/p&gt;
&lt;p&gt;Hope to see many great applications this year on either GStreamer itself or GStreamer using projects. And remember, you don&amp;#8217;t have to feel bound by our suggestion list, if you have a great idea for a project that involves GStreamer, then we are happy to mentor it, just be sure to talk to us as soon as possible so we can let you know if we think it is a suitable Summer of Code project.&lt;/p&gt;</content>
		<author>
			<name>Christian Schaller</name>
			<uri>http://blogs.gnome.org/uraeus</uri>
		</author>
		<source>
			<title type="html">Christian Schaller</title>
			<subtitle type="html">GStreamer news and more</subtitle>
			<link rel="self" href="http://blogs.gnome.org/uraeus/feed/"/>
			<id>http://blogs.gnome.org/uraeus/feed/</id>
			<updated>2012-05-22T21:47:03+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Picking your battles</title>
		<link href="http://arunraghavan.net/2012/03/picking-your-battles/"/>
		<id>http://arunraghavan.net/?p=1280</id>
		<updated>2012-03-20T02:52:16+00:00</updated>
		<content type="html">&lt;p&gt;Most of you have no doubt &lt;a href=&quot;http://blog.lizardwrangler.com/2012/03/18/video-user-experience-and-our-mission/&quot;&gt;already&lt;/a&gt; &lt;a href=&quot;https://hacks.mozilla.org/2012/03/video-mobile-and-the-open-web/&quot;&gt;seen&lt;/a&gt; that Mozilla will be changing their position on H.264 support for HTML5 video in future releases. This is an extremely important decision that I&amp;#8217;ve been hoping to see for a while now, and I am really glad this is being done.&lt;/p&gt;

&lt;p&gt;There is no doubt that we &lt;em&gt;need&lt;/em&gt; patent-unencumbered standards for web codecs (or as much as is possible given the dismal patent ecology today), and while much giddy anticipation followed Google/On2&amp;#8242;s release of VP8 into the open, I don&amp;#8217;t believe it ever made sense to expect the codec landscape to change drastically in the short timespan everyone expected. There&amp;#8217;s a lot of the hardware and software out there that needs to change (see any &lt;acronym title=&quot;Systems on Chip&quot;&gt;SoCs&lt;/acronym&gt; with VP8 support yet?), not to mention the interests of the MPEG-LA &lt;strike&gt;maf&lt;/strike&gt;consortium.&lt;/p&gt;

&lt;p&gt;I love Firefox, both as a product and what it means for an open web (for those of you that know me, this might be hard to believe given all my ranting, but it&amp;#8217;s true!). I&amp;#8217;m glad Mozilla chose to live to fight another day rather than go out in a blaze of glory and (or a flicker of irrelevance).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;p.s.: these are my views and do not necessarily represent those of my employer&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;p.p.s.: Alessandro&amp;#8217;s been doing some &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=422540&quot;&gt;great work&lt;/a&gt; to get the GStreamer multimedia backend going again (this makes so much more sense than going the &lt;acronym title=&quot;Not Invented Here&quot;&gt;NIH&lt;/acronym&gt; route!)&lt;/em&gt;&lt;/p&gt;</content>
		<author>
			<name>Arun Raghavan</name>
			<uri>http://arunraghavan.net/</uri>
		</author>
		<source>
			<title type="html">Arun Raghavan</title>
			<subtitle type="html">Extremely pithy tagline here</subtitle>
			<link rel="self" href="http://arunraghavan.net/feed/"/>
			<id>http://arunraghavan.net/feed/</id>
			<updated>2012-05-12T11:17:17+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">GSoC 2012 and PiTiVi</title>
		<link href="http://jeff.ecchi.ca/blog/2012/03/18/gsoc-2012-and-pitivi/"/>
		<id>http://jeff.ecchi.ca/blog/?p=2049</id>
		<updated>2012-03-18T20:50:53+00:00</updated>
		<content type="html">&lt;p&gt;Are you a student who wants to get involved in shaping the future of &lt;strong&gt;open source video editing&lt;/strong&gt;? Are you looking for a friendly project providing stimulating challenges and a well-established codebase and expertise? Then consider applying for the Summer of Code programme to work on&lt;a href=&quot;http://pitivi.org&quot;&gt; Pitivi&lt;/a&gt; or &lt;a href=&quot;http://wiki.pitivi.org/wiki/GES&quot;&gt;GES&lt;/a&gt;! See &lt;a href=&quot;http://wiki.pitivi.org/wiki/Google_Summer_of_Code&quot;&gt;this page&lt;/a&gt; for the list of ideas for Pitivi. Don&amp;#8217;t wait though: the deadline for applying is April 6th.&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-2049&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div id=&quot;attachment_2106&quot; class=&quot;wp-caption alignnone&quot;&gt;&lt;a href=&quot;http://jeff.ecchi.ca/blog/wp-content/uploads/2011-08-06-16.56.00.jpg&quot;&gt;&lt;img class=&quot;size-medium wp-image-2106 &quot; title=&quot;2011-08-06--16.56.00&quot; src=&quot;http://jeff.ecchi.ca/blog/wp-content/uploads/2011-08-06-16.56.00-500x281.jpg&quot; alt=&quot;&quot; width=&quot;500&quot; height=&quot;281&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Pitivi SoC students at the Desktop Summit last year. Important note: a moustache is NOT required to apply as a GSoC student!&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Not a programmer? You can help &lt;strong&gt;raise awareness&lt;/strong&gt; about this (and about Pitivi in general). Maybe you know a brilliant hacker friend/family member or a top-notch computer science student, who is just waiting for &lt;strong&gt;a chance to make a big difference in the world&lt;/strong&gt;. Tell that person about how cool and welcoming PiTiVi is and how getting involved is the best way to advance free, powerful and intuitive video editing for everyone!&lt;/p&gt;</content>
		<author>
			<name>Jean-François Fortin Tam</name>
			<uri>http://jeff.ecchi.ca/blog/</uri>
		</author>
		<source>
			<title type="html">Nekohayo !</title>
			<subtitle type="html">La vie personnelle du chat</subtitle>
			<link rel="self" href="http://jeff.ecchi.ca/blog/feed/"/>
			<id>http://jeff.ecchi.ca/blog/feed/</id>
			<updated>2012-05-19T22:17:22+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">DAD hacking</title>
		<link href="http://thomas.apestaart.org/log/?p=1454"/>
		<id>http://thomas.apestaart.org/log/?p=1454</id>
		<updated>2012-03-17T23:06:59+00:00</updated>
		<content type="html">&lt;p&gt;On the bad side of life, I was planning to go to an awesome Calcotada in Lleida today, but I spent last night awake until 4:30 with an upset stomach, so I had to cancel and stay home feeling like shit.&lt;/p&gt;
&lt;p&gt;On the good side of life, I really had no excuse left to not do a little long overdue hacking on Digital Audio Database.&lt;/p&gt;
&lt;p&gt;I still use it regularly to listen to music, but the GNonLin-based player is just really not very stable.  I should really just rewrite it using simply adder just like roughly ten years ago, but my brain won&amp;#8217;t be able to do that.  So instead I decided to clean up the web-based WebSockets using player I prototyped at OVC last year.&lt;/p&gt;
&lt;p&gt;I started with some refactoring, clearly defining model/view/controller base classes and adapting the player and playerview classes to them.&lt;/p&gt;
&lt;p&gt;WebSocket code seems to need an update every few months &amp;#8211; I pulled the latest revision of txWebsocket &lt;a href=&quot;https://github.com/thomasvs/txWebSocket&quot;&gt;on my fork&lt;/a&gt;, so my recent browsers actually play music again.&lt;/p&gt;
&lt;p&gt;Since the last time I hacked on this, I actually added my 1500+ freshly ripped cd&amp;#8217;s, in FLAC format &amp;#8211; which browsers don&amp;#8217;t actually support.&lt;/p&gt;
&lt;p&gt;So, first off, I added an option for the scheduler &amp;#8211; responsible for picking tracks, and picking audio files to represent them &amp;#8211; to filter by extension.  It&amp;#8217;s not ideal, but it will do for now, and I punched that filter through the levels of abstraction in DAD.  I now start it filtering on .mp3 and .oga, and so Chrome can play back all the tracks the scheduler throws at it.&lt;/p&gt;
&lt;p&gt;The web-based player just loads tracks and timing info from the scheduler relative to page load time.  I&amp;#8217;ve been wanting to make that absolute for a while, so I did just that &amp;#8211; the player server schedules tracks for epoch seconds now through websockets.&lt;/p&gt;
&lt;p&gt;I had an entertaining half hour listening to the awesome echo effects obtained by having three chrome pages simultaneously playing the jukebox schedule &amp;#8211; each page being slightly out of sync with the others.&lt;/p&gt;
&lt;p&gt;As I&amp;#8217;ll be wanting to use a smallish computer for music playback using a browser, I adapted the code to not use localhost any longer, but do everything with relative URL&amp;#8217;s.  Voila &amp;#8211; the laptop now plays music too, a little bit more out of sync, and of course through its own speakers, adding to the eerie effect.&lt;/p&gt;
&lt;p&gt;As an encore, I wanted to stumble my way through some jquery code, to which I&amp;#8217;m a certified newbie.  I want a nice background slideshow related to the current artist, and I pulled together &lt;a href=&quot;https://github.com/Rodeoclash/Echonest-jQuery-Plugin&quot;&gt;echonest&lt;/a&gt; and &lt;a href=&quot;http://www.ajaxblender.com/bgstretcher-2-jquery-stretch-background-plugin-updated.html&quot;&gt;bgstretcher-2&lt;/a&gt; as an experiment.&lt;/p&gt;
&lt;p&gt;That seems to work relatively well, except that the slideshow plugin doesn&amp;#8217;t let you reload a new set of images to cycle through.  And some of the other ones I tried instead after that seemed to have the same problem.&lt;/p&gt;
&lt;p&gt;Oh well, it&amp;#8217;s a start.  If anyone knows of a good jquery background slideshow plugin that lets me update the list of url&amp;#8217;s for images at any time, let me know!&lt;/p&gt;</content>
		<author>
			<name>Thomas Vander Stichele</name>
			<uri>http://thomas.apestaart.org/log</uri>
		</author>
		<source>
			<title type="html">thomas.apestaart.org</title>
			<subtitle type="html">Present Perfect</subtitle>
			<link rel="self" href="http://thomas.apestaart.org/log/?feed=rss2"/>
			<id>http://thomas.apestaart.org/log/?feed=rss2</id>
			<updated>2012-04-01T14:47:34+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Pourquoi j’ai quitté Facebook: des précisions</title>
		<link href="http://jeff.ecchi.ca/blog/2012/03/17/pourquoi-jai-quitte-facebook-des-precisions/"/>
		<id>http://jeff.ecchi.ca/blog/?p=2092</id>
		<updated>2012-03-17T16:45:44+00:00</updated>
		<content type="html">&lt;p&gt;Il y a deux ans je &lt;a title=&quot;Je quitte Facebook&quot; href=&quot;http://jeff.ecchi.ca/blog/2010/05/03/je-quitte-facebook/&quot;&gt;quittais définitivement Facebook&lt;/a&gt;. Depuis ce temps ma vie s&amp;#8217;en est trouvée significativement améliorée, mais on me questionne encore sur les raisons de cette décision. Chaque fois, on me regarde comme si j&amp;#8217;étais autiste. J&amp;#8217;ai pensé aujourd&amp;#8217;hui mettre à jour le billet que j&amp;#8217;avais posté jadis, mais comme l&amp;#8217;explication risque d&amp;#8217;être longue, autant faire un nouveau billet:&lt;span id=&quot;more-2092&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;J&amp;#8217;avais tendance à y revenir à tout bout de champ dans la journée, à y passer des heures et perdre mon temps à lire un flux ininterrompu de choses qui ne me concernent la plupart du temps pas, ou au contraire à «chercher des nouveautés» qui n&amp;#8217;existaient pas, créant alors un vague sentiment de vide et de déception.&lt;/li&gt;
&lt;li&gt;Facebook n&amp;#8217;est pas le produit/service. &lt;em&gt;Je&lt;/em&gt; suis le produit que Facebook vend. Google fait évidemment la même chose, mais au moins Google m&amp;#8217;est utile (pour GMail c&amp;#8217;est une autre histoire: je ne me fais tout simplement pas confiance à héberger ma propre infrastructure de courriels de manière compétente pour avoir un taux de disponibilité de 100% et une bonne résistance au spam).&lt;/li&gt;
&lt;li&gt;Si j&amp;#8217;utilise Twitter et G+, c&amp;#8217;est pour gérer les relations publiques de &lt;a href=&quot;http://pitivi.org&quot;&gt;Pitivi&lt;/a&gt;; si j&amp;#8217;utilise Facebook, c&amp;#8217;est supposément pour gérer mes relations privées&amp;#8230; et il n&amp;#8217;y a aucune raison pourquoi je ne pourrais pas gérer mes relations privées «dans le vrai monde» au lieu de confier ça à Zuckerberg. Et si je voulais gérer mes relations privées à travers un site web, il faudrait que ce soit une plateforme ouverte et décentralisée comme «DIASPORA*».&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://jeff.ecchi.ca/blog/wp-content/uploads/facebook-privacy-settings-are-your-friend.jpg&quot;&gt;&lt;img class=&quot;alignright size-thumbnail wp-image-2093&quot; title=&quot;facebook privacy settings are your friend&quot; src=&quot;http://jeff.ecchi.ca/blog/wp-content/uploads/facebook-privacy-settings-are-your-friend-150x150.jpg&quot; alt=&quot;&quot; width=&quot;150&quot; height=&quot;150&quot; /&gt;&lt;/a&gt;Facebook favorise l&amp;#8217;invasion passive de la vie privée et le mélodrame (non seulement dans les messages qui s&amp;#8217;y échangent, mais aussi dans la simple notion d&amp;#8217;accepter ou refuser des «amis»). Les gens se sentaient insultés quand je ne les rajoute pas à mon réseau social, et on ne rentre même pas encore dans l&amp;#8217;épineuse question des relations de travail ou des relations amoureuses. Toutes ces sphères de la vie d&amp;#8217;une personne entrent alors de force en collision, qu&amp;#8217;on le veuille ou non.&lt;/li&gt;
&lt;li&gt;Non seulement le modèle d&amp;#8217;affaires de Facebook est-il de creuser et revendre mes informations personnelles, mon «profil» socio-psychologique et mes habitudes de consommation (incluant qui sont mes amis et où j&amp;#8217;ai grandi et étudié)&amp;#8230; mais même si je ne fournis pas moi-même ces informations, par phénomène d&amp;#8217;aggrégation, &lt;em&gt;mes amis vont le faire&lt;/em&gt; pour moi, sans que je puisse faire quoi que ce soit pour empêcher le phénomène. Excepté boycotter Facebook entièrement (et encore).&lt;/li&gt;
&lt;li&gt;Facebook détruit à petit feu plusieurs fondements de l&amp;#8217;Internet et le retransforme en un AOL nouveau genre. Pourtant, je persiste à utiliser l&amp;#8217;Internet comme une collection décentralisée de sites ouverts, à utiliser le téléphone, la messagerie instantanée et le courriel (d&amp;#8217;ailleurs, je préfère nettement l&amp;#8217;ergonomie d&amp;#8217;un véritable logiciel de courriel comme Evolution ou Thunderbird à l&amp;#8217;inefficacité d&amp;#8217;une interface web, mais je suis certainement une espèce en voie de disparition sur ce point).&lt;/li&gt;
&lt;li&gt;Parce que Facebook ne se limite pas à Facebook, et tente de me suivre absolument partout sur Internet (comme je le craignais en 2010). Vous savez, il y a une bonne raison pourquoi, même après deux ans, Facebook est encore entièrement bloqué au niveau de mon routeur (sauf quand un invité me fait la demande de le débloquer temporairement durant son séjour. Je ne suis pas un monstre). Vous n&amp;#8217;avez pas idée de la quantité de scripts/frames cachés sont présents partout sur les sites que je visite (et on ne remarque pas leur présence avant de les avoir bloqués).&lt;/li&gt;
&lt;li&gt;Les «applications» et autres gadgets du genre (s&amp;#8217;ils existent encore sur Facebook) me font chier: ils sont «opt-out», insistants et «constamment dans ma face». Pire encore, ils constituent de sérieux risques de sécurité informatique et de vie privée (et des brèches de ce côté là, ça s&amp;#8217;est vu).&lt;/li&gt;
&lt;li&gt;Parce que Facebook est une tendance technologique qui peut aussi bien être remplacée (bien que, tristement, ce soit improbable). Il y a environ cinq ans, ça n&amp;#8217;existait pas et on vivait très bien. Qui sait ce que sera Facebook en 2015, si Facebook existera encore, ou s&amp;#8217;il sera remplacé par un autre dispositif orwellien à la mode?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Histoire de vous foutre un peu la chienne (comme on dirait en bon québécois): deux ans plus tard, je viens de faire le test et de recréer un compte, sous un faux nom, sans y entrer aucune information personnelle autre que mon adresse courriel, sans donner l&amp;#8217;autorisation à Facebook de fouiller dans mon compte courriel et sans ajouter aucun «ami»:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://jeff.ecchi.ca/blog/wp-content/uploads/facebook-profil.png&quot;&gt;&lt;img class=&quot;alignright size-large wp-image-2097&quot; title=&quot;facebook profil&quot; src=&quot;http://jeff.ecchi.ca/blog/wp-content/uploads/facebook-profil-1024x556.png&quot; alt=&quot;&quot; width=&quot;584&quot; height=&quot;317&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;#8230; et Facebook se souvient encore de tous mes amis, me suggérant qui ajouter. &lt;strong&gt;Même si j&amp;#8217;avais manuellement purgé mes données puis complètement supprimé mon compte&lt;/strong&gt; (pas juste désactivé)&lt;strong&gt; et même si Facebook m&amp;#8217;assurait du contraire, ils ont effectivement conservé toutes leurs données sur moi depuis deux ans.&lt;br /&gt;
&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://jeff.ecchi.ca/blog/wp-content/uploads/facebook-suggestions-damis-censuré.png&quot;&gt;&lt;img class=&quot;alignright size-large wp-image-2098&quot; title=&quot;facebook suggestions d'amis - censuré&quot; src=&quot;http://jeff.ecchi.ca/blog/wp-content/uploads/facebook-suggestions-damis-censuré-586x1024.png&quot; alt=&quot;&quot; width=&quot;584&quot; height=&quot;1020&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ce n&amp;#8217;est pas tout: Facebook ne se souvient pas seulement de mes amis, collaborateurs et collègues d&amp;#8217;antan&amp;#8230; Facebook m&amp;#8217;a même &lt;strong&gt;proposé d&amp;#8217;ajouter quelqu&amp;#8217;un que j&amp;#8217;ai rencontré dans un café il y a deux semaines&lt;/strong&gt;. Alors que je ne n&amp;#8217;avais pas de compte Facebook. Et dire qu&amp;#8217;il y en a qui trouvent que j&amp;#8217;exagère&amp;#8230;&lt;/p&gt;
&lt;p&gt;J&amp;#8217;ai ici uniquement énuméré quelques raisons pourquoi je refuse encore et toujours d&amp;#8217;utiliser Facebook, même si ça me vaut la marginalisation&amp;#8230; phénomène que je pourrais couvrir dans un prochain billet.&lt;/p&gt;</content>
		<author>
			<name>Jean-François Fortin Tam</name>
			<uri>http://jeff.ecchi.ca/blog/</uri>
		</author>
		<source>
			<title type="html">Nekohayo !</title>
			<subtitle type="html">La vie personnelle du chat</subtitle>
			<link rel="self" href="http://jeff.ecchi.ca/blog/feed/"/>
			<id>http://jeff.ecchi.ca/blog/feed/</id>
			<updated>2012-05-19T22:17:22+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Switching PiTiVi’s main git repository</title>
		<link href="http://jeff.ecchi.ca/blog/2012/03/15/switching-pitivis-main-git-repository/"/>
		<id>http://jeff.ecchi.ca/blog/?p=2087</id>
		<updated>2012-03-15T18:03:45+00:00</updated>
		<content type="html">&lt;p&gt;Due to public demand, the official main repository for PiTiVi is now &lt;a href=&quot;http://git.gnome.org/pitivi&quot;&gt;git.gnome.org/pitivi&lt;/a&gt; instead of git://git.pitivi.org/git/pitivi.git&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-2087&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;This has many advantages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It reduces confusion.&lt;/li&gt;
&lt;li&gt;It prevents potential contributors from thinking we&amp;#8217;re a dead project or something. We&amp;#8217;re a &lt;em&gt;killer&lt;/em&gt; project, that&amp;#8217;s completely different.&lt;/li&gt;
&lt;li&gt;No need to manage two &amp;#8220;official&amp;#8221; repositories (one for development and one for translations) anymore. No more strange merges to sync the repositories.&lt;/li&gt;
&lt;li&gt;Those who want email notifications can subscribe through GNOME&amp;#8217;s &amp;#8220;commits-list&amp;#8221;&lt;/li&gt;
&lt;li&gt;We don&amp;#8217;t have five times the word &amp;#8220;git&amp;#8221; when we do a clone of pitivi. You know, we were worried that people were not aware of the fact that they&amp;#8217;re using git, turns out that&amp;#8217;s not the case ;)&lt;/li&gt;
&lt;li&gt;People might stop thinking that this is some kind of French conspiracy. Well, many contributors are francophones and we do have plans for world domination, but that&amp;#8217;s entirely unrelated.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I updated all the relevant website and wiki pages accordingly. No more excuses now: ladies and gentlemen, start hacking (but make sure to do so on the &amp;#8220;ges&amp;#8221; branch).&lt;/p&gt;</content>
		<author>
			<name>Jean-François Fortin Tam</name>
			<uri>http://jeff.ecchi.ca/blog/</uri>
		</author>
		<source>
			<title type="html">Nekohayo !</title>
			<subtitle type="html">La vie personnelle du chat</subtitle>
			<link rel="self" href="http://jeff.ecchi.ca/blog/feed/"/>
			<id>http://jeff.ecchi.ca/blog/feed/</id>
			<updated>2012-05-19T22:17:22+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">What the heck is this GES thing anyway?</title>
		<link href="http://jeff.ecchi.ca/blog/2012/03/13/what-the-heck-is-this-ges-thing-anyway/"/>
		<id>http://jeff.ecchi.ca/blog/?p=2083</id>
		<updated>2012-03-14T02:56:32+00:00</updated>
		<content type="html">&lt;blockquote&gt;&lt;p&gt;&amp;#8220;GES. You keep using that word. I do not think it means what you think it means.&amp;#8221;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Unless you&amp;#8217;ve been following the PiTiVi&amp;#8217;s development very closely lately, it is often hard to imagine what GES does and how important it is to PiTiVi. I therefore wrote &lt;a href=&quot;http://wiki.pitivi.org/wiki/GES&quot;&gt;an explanatory page&lt;/a&gt; about it and updated the &lt;a href=&quot;http://wiki.pitivi.org/wiki/Architecture&quot;&gt;architecture&lt;/a&gt; overview on the wiki, in the hope of clearing things up. Let me know if something&amp;#8217;s missing or if you have suggestions to enhance those pages.&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-2083&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;alignnone&quot; title=&quot;The current state of the modules that Pitivi depends on&quot; src=&quot;http://wiki.pitivi.org/images/Architecture_2012.png&quot; alt=&quot;&quot; width=&quot;600&quot; height=&quot;374&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Also, a quick status update on my &lt;a title=&quot;Trim like a professional hair stylist&quot; href=&quot;http://jeff.ecchi.ca/blog/2012/03/07/trim-like-a-professional-hair-stylist/&quot;&gt;call for donations experiment&lt;/a&gt;: we now have a total of &lt;strong&gt;$121.50 CAD.&lt;/strong&gt; This is not enough for a hackfest, but certainly enough to pay a couple of beers to PiTiVi contributors at &lt;a href=&quot;http://guadec.org&quot;&gt;GUADEC&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I would like to extend my sincere thanks to the following people who kindly donated some money through Paypal: Felipe Almeida Lessa, Frederik Elwert, Garrett Gandy, Joseph Tennies, Leon Handreke, Pierre Bornancin, Stéphane Maniaci. I&amp;#8217;d also like to thank the dozen of people who &amp;#8220;flattr&amp;#8217;d&amp;#8221; us (but Flattr doesn&amp;#8217;t tell me the full list of names).&lt;/p&gt;</content>
		<author>
			<name>Jean-François Fortin Tam</name>
			<uri>http://jeff.ecchi.ca/blog/</uri>
		</author>
		<source>
			<title type="html">Nekohayo !</title>
			<subtitle type="html">La vie personnelle du chat</subtitle>
			<link rel="self" href="http://jeff.ecchi.ca/blog/feed/"/>
			<id>http://jeff.ecchi.ca/blog/feed/</id>
			<updated>2012-05-19T22:17:22+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">the merry month of ma</title>
		<link href="http://wingolog.org/archives/2012/03/12/the-merry-month-of-ma"/>
		<id>http://wingolog.org/2012/03/12/the-merry-month-of-ma</id>
		<updated>2012-03-12T20:27:53+00:00</updated>
		<content type="html">&lt;div&gt;&lt;p&gt;&lt;b&gt;or, from the department of self-inflicted injuries&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Recently I saw a bunch of errors in my server logs.  People were asking for pages on my web site, but only if they were newer than &lt;tt&gt;Thu, 08 Ma 2012 22:44:59 GMT&lt;/tt&gt;.  &quot;Ma&quot;?  What kind of a month is that?  The internets have so many crazy things.&lt;/p&gt;&lt;p&gt;On further investigation, it seemed this was just a case of garbage in, garbage out; &lt;a href=&quot;http://git.savannah.gnu.org/gitweb/?p=guile.git;a=commitdiff;h=89d45e850725e232ae685803ee476da5b046c2b0&quot;&gt;my intertube was busted&lt;/a&gt;.  I was the one returning a Last-Modified with that date.  It was invalid, but client software sent it back with the conditional request.&lt;/p&gt;&lt;p&gt;Thinking more on this, though, and on the &lt;a href=&quot;http://nikcub.appspot.com/posts/persistant-and-unblockable-cookies-using-http-headers&quot;&gt;well-known last-modified hack&lt;/a&gt; in which that field can be used as an unblockable cookie, I think I have to share some blame with the clients again.&lt;/p&gt;&lt;p&gt;So, clients using at least Apple-PubSub/65.28, BottomFeeder/4.1, NetNewsWire, SimplePie, Vienna, and Windows-RSS-Platform/2.0 should ask the people that implement their RSS software to only pass a Last-Modified date if it's really a valid date.  Implementors of the NetVibes and worio.com bots should also take a look at their HTTP stacks.  I don't guess that there's much that you can do with an etag though, for better or for worse.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://wingolog.org/archives/2012/02/21/for-love-and-&quot;&gt;Previously, in a related department.&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</content>
		<author>
			<name>Andy Wingo</name>
			<uri>http://wingolog.org/</uri>
		</author>
		<source>
			<title type="html">wingolog</title>
			<subtitle type="html">A mostly dorky weblog by Andy Wingo</subtitle>
			<link rel="self" href="http://wingolog.org/feed/atom/"/>
			<id>http://wingolog.org/feed/atom</id>
			<updated>2012-05-22T10:47:17+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Prévisualisation en temps réel du redimensionnement de séquences dans Pitivi</title>
		<link href="http://jeff.ecchi.ca/blog/2012/03/09/previsualisation-en-temps-reel-du-redimensionnement-de-sequences-dans-pitivi/"/>
		<id>http://jeff.ecchi.ca/blog/?p=2074</id>
		<updated>2012-03-10T03:10:00+00:00</updated>
		<content type="html">&lt;p&gt;Ceci est une traduction d&amp;#8217;un billet que j&amp;#8217;ai publié avant-hier sur &lt;a href=&quot;http://planet.gnome.org&quot;&gt;Planet GNOME&lt;/a&gt;. Je ne sais pas trop comment traduire « trimming », alors je me base sur le terme « redimensionnement » de la version française du manuel de &lt;a href=&quot;http://pitivi.org/?pk_campaign=fundraiser-2012-03&amp;pk_kwd=planet-libre&quot;&gt;PiTiVi&lt;/a&gt; (même si l&amp;#8217;usage du mot sonne étrange). La question du « financement de logiciels libres complexes n&amp;#8217;ayant pas de modèle d&amp;#8217;affaire clairement établi » est quelque chose qui m&amp;#8217;a toujours intrigué, vous trouverez donc quelque chose à ce sujet en deuxième partie de ce billet.&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-2074&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Dans mon temps libre cette semaine, j&amp;#8217;ai implanté une fonctionnalité manquante de PiTiVi qui me tient énormément à coeur: la &lt;strong&gt;prévisualisation en temps réel lorsque l&amp;#8217;on change le début ou la fin d&amp;#8217;une séquence&lt;/strong&gt;. Ceci permet enfin de faire de l&amp;#8217;édition avec une précision inégalée, sans essais-erreurs. De la productivité à l&amp;#8217;état pur, comme la vidéo ci-dessous le démontre:&lt;/p&gt;

  &lt;!-- Begin Video.js --&gt;
  
    
    
    
  
  &lt;!-- End Video.js --&gt;

&lt;p&gt;Cette implémentation est assez performante pour prévisualiser de manière fluide la version 2K de &lt;a href=&quot;http://sintel.org&quot;&gt;Sintel&lt;/a&gt; et pour rester raisonnablement rapide même avec des vidéos en résolution &lt;a href=&quot;http://en.wikipedia.org/wiki/4K_resolution&quot;&gt;4K&lt;/a&gt;. Ceci est sans même prendre en compte l&amp;#8217;accélération matérielle du décodage vidéo, qui sera disponible dans GStreamer 1.0 (j&amp;#8217;ai bien hâte de tester lorsque ce sera possible).&lt;/p&gt;
&lt;p&gt;La fonctionnalité dont je vous parle ici, je l&amp;#8217;avais en fait demandée à travers &lt;a href=&quot;https://bugzilla.gnome.org/show_bug.cgi?id=569980&quot;&gt;un rapport de bug&lt;/a&gt; il y a trois ans (dans la période où j&amp;#8217;avais ouvert plus d&amp;#8217;une centaine de rapports de bugs sur PiTiVi en l&amp;#8217;espace de trois mois). Pour ceux parmi vous qui doutaient de mon génie avant-gardiste, vous en avez maintenant la preuve 😃&lt;/p&gt;
&lt;p&gt;Je suis certain que les autres logiciels de montage vidéo libre vont se précipiter pour ripper mon élégantissime code et cloner cette fonctionnalité en l&amp;#8217;espace de quelques heures. Retenez toutefois ceci: &lt;strong&gt;PiTiVi l&amp;#8217;a fait le premier.&lt;/strong&gt; PiTiVi est le seul logiciel de montage vidéo libre qui possède cette fonctionnalité. Prenez ça dans vos dents, détracteurs de PiTiVi !&lt;/p&gt;
&lt;p&gt;Essayons maintenant une petite expérience sociologique. J&amp;#8217;ai toujours &lt;a href=&quot;https://bugzilla.gnome.org/show_bug.cgi?id=629924&quot;&gt;été curieux&lt;/a&gt; de savoir s&amp;#8217;il pourrait y avoir une demande significative pour « un PiTiVi solide comme le roc », un logiciel de montage vidéo libre à la fois intuitif et répondant aux besoins des usagers plus exigeants. Eh bien, &lt;strong&gt;vous avez maintenant l&amp;#8217;opportunité d&amp;#8217;effectuer une donation au projet&lt;/strong&gt;.&lt;/p&gt;
&lt;h1&gt;« QUOI? Sale cochon capitaliste! »&lt;/h1&gt;
&lt;p&gt;Ne vous méprenez pas: je ne suis pas en train de mendier ou de chercher à faire un tour de passe-passe financier. J&amp;#8217;ai un emploi bien rémunéré et j&amp;#8217;ai toujours contribué à PiTiVi par plaisir, par passion et sans motif financier. Ce que je désire faire ici, c&amp;#8217;est de jauger la possibilité de soutenir le projet PiTiVi à un point où il pourrait être développé plus rapidement, plus régulièrement et aboutir vers un logiciel à toute épreuve:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Si nous obtenons 100&lt;tt&gt;&lt;span&gt;€&lt;/span&gt;&lt;/tt&gt;, on pourrait payer quelques bières aux contributeurs PiTiVi à  &lt;a href=&quot;http://guadec.org&quot;&gt;GUADEC&lt;/a&gt; cet été.&lt;/li&gt;
&lt;li&gt;Si on obtient 10 000&lt;tt&gt;&lt;span&gt;€&lt;/span&gt;&lt;/tt&gt; par année, ça devient un peu plus sérieux: on pourrait organiser un ou deux &lt;a href=&quot;http://fr.wikipedia.org/wiki/Hackathon&quot;&gt;hackfests&lt;/a&gt; par année, comme &lt;a href=&quot;http://jeff.ecchi.ca/blog/2011/08/14/results-from-the-hackfest/&quot;&gt;celui-ci&lt;/a&gt; et &lt;a href=&quot;http://jeff.ecchi.ca/blog/2012/02/02/aventuras-en-malaga-y-ronda/&quot;&gt;celui-là&lt;/a&gt;. Avec ce montant on pourrait payer tout juste les frais de transport des développeurs.&lt;/li&gt;
&lt;li&gt;Si on obtient 100 000 à 500 000&lt;tt&gt;&lt;span&gt;€&lt;/span&gt;&lt;/tt&gt; par année (ouais, c&amp;#8217;est beau de rêver, sait-on jamais!)&amp;#8230; alors les choses changeraient de manière &lt;strong&gt;&lt;em&gt;drastique&lt;/em&gt;&lt;/strong&gt;. Ça voudrait dire qu&amp;#8217;on pourrait payer des experts de GStreamer pour travailler à plein temps sur PiTiVi pour en faire &lt;em&gt;le&lt;/em&gt; logiciel de montage vidéo professionnel que nous attendions depuis si longtemps. Ou bien on pourrait embaucher des ninjas pour infiltrer le quartier général de Avid, ou un truc du genre. Je ne dis pas ici que, pour le cas de cette expérimentation, il nous &lt;em&gt;faut&lt;/em&gt; des centaines de milliers d&amp;#8217;euros/dollars: avec un montant significativement élevé, je pourrais finalement faire la preuve de mon plan de bataille (ou plan de développement « durable », ou « plan d&amp;#8217;affaires », appelez ça comme vous voulez), et lancer les choses en grand. Cela pourrait surprendre certains d&amp;#8217;entre vous, mais je ne suis pas juste un de ces passionnés irréductibles du logiciel libre, je possède également des connaissances en création et gestion d&amp;#8217;entreprise.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On ne pourra jamais savoir avant d&amp;#8217;avoir essayé, n&amp;#8217;est-ce pas? Alors, maintenant, tentons l&amp;#8217;expérience. &lt;strong&gt;Vous pouvez faire votre déclaration d&amp;#8217;amour à travers Paypal ou Flattr.&lt;/strong&gt; Si vous pensez que je rigole, allez voir &lt;a href=&quot;http://pitivi.org/?pk_campaign=fundraiser-2012-03&amp;pk_kwd=planet-libre&quot;&gt;sur le site de PiTiVi&lt;/a&gt; et vous y trouverez lesdits boutons Flattr et Paypal (au bas de la page d&amp;#8217;accueil, ou bien sur la page « Contributing »). Voici le même bouton Flattr, s&amp;#8217;il y en a parmi vous qui êtes tellement excités qu&amp;#8217;il vous faut absolument un truc sur lequel cliquer &lt;em&gt;immédiatement:&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://flattr.com/thing/484849/PiTiVi&quot; target=&quot;_blank&quot;&gt;&lt;img title=&quot;Flattr this&quot; src=&quot;http://api.flattr.com/button/flattr-badge-large.png&quot; alt=&quot;Flattr this&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Je vais observer et étudier ce qui se passe à présent. Soyez assuré que &lt;strong&gt;je n&amp;#8217;utiliserai pas ces donations à titre personnel. Tout ira vers le projet PiTiVi&lt;/strong&gt;, il me faudra seulement résoudre les questions techniques/administrative de la chose. J&amp;#8217;ai discuté depuis plusieurs mois avec la fondation GNOME, et je voudrais pouvoir évaluer si la quantité de donations à laquelle nous faisons face pourrait justifier les complications qu&amp;#8217;une telle structure impliquerait.&lt;/p&gt;
&lt;p&gt;Soit dit en passant, &lt;strong&gt;j&amp;#8217;ai d&amp;#8217;autres améliorations/fonctionnalités dans mon sac à surprises&lt;/strong&gt;, mais elles ne sont pas encore prètes. Restez à l&amp;#8217;écoute (sur &lt;a href=&quot;http://www.pitivi.org/planet&quot;&gt;Planet PiTiVi&lt;/a&gt; ou &lt;a href=&quot;http://planet.gnome.org&quot;&gt;Planet GNOME&lt;/a&gt;)! En attendant, &lt;strong&gt;n&amp;#8217;hésitez pas à partager avec le reste du monde la grande étape que nous avons franchie&lt;/strong&gt; pour l&amp;#8217;édition efficace de séquences. Et si vous avez envie de faire l&amp;#8217;écho de mon appel aux donations, vous pouvez faire le lien vers mon billet de blog ou utiliser &lt;a href=&quot;http://pitivi.org/?pk_campaign=fundraiser-2012-03&amp;pk_kwd=planet-libre&quot;&gt;ce lien&lt;/a&gt; ou encore &lt;a href=&quot;http://pitivi.org/?go=contributing&amp;pk_campaign=fundraiser-2012-03&amp;pk_kwd=planet-libre&quot;&gt;ce lien&lt;/a&gt; (page « Contributing ») pour me faciliter le suivi.&lt;/p&gt;</content>
		<author>
			<name>Jean-François Fortin Tam</name>
			<uri>http://jeff.ecchi.ca/blog/</uri>
		</author>
		<source>
			<title type="html">Nekohayo !</title>
			<subtitle type="html">La vie personnelle du chat</subtitle>
			<link rel="self" href="http://jeff.ecchi.ca/blog/feed/"/>
			<id>http://jeff.ecchi.ca/blog/feed/</id>
			<updated>2012-05-19T22:17:22+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">an in-depth look at the performance of guile's web server</title>
		<link href="http://wingolog.org/archives/2012/03/08/an-in-depth-look-at-the-performance-of-guiles-web-server"/>
		<id>http://wingolog.org/2012/03/08/an-in-depth-look-at-the-performance-of-guiles-web-server</id>
		<updated>2012-03-08T22:44:59+00:00</updated>
		<content type="html">&lt;div&gt;&lt;p&gt;What ho, ladies!  And what ho, gentlemen!  The hack is on and apace.  Today, the topic is performance: of Guile and of its web server, in microseconds and kiloinstructions.  Brew up a pot of tea; this is a long article.&lt;/p&gt;&lt;p&gt;&lt;b&gt;the problem&lt;/b&gt;&lt;/p&gt;&lt;p&gt;I have been poking at Guile's web server recently.  To recap, &lt;a href=&quot;http://gnu.org/s/guile/&quot;&gt;Guile&lt;/a&gt; is an implementation of Scheme.  It is byte-compiled, and has a set of runtime libraries written in C and, increasingly, in Scheme itself.&lt;/p&gt;&lt;p&gt;Guile includes some modules for dealing with the &lt;a href=&quot;http://www.gnu.org/software/guile/manual/html_node/Web.html#Web&quot;&gt;web&lt;/a&gt;:  HTTP, clients, servers, and such.  It's all written in Scheme.  It runs this blog you're reading right now.&lt;/p&gt;&lt;p&gt;To be precise, this web log is served by &lt;a href=&quot;http://wingolog.org/software/tekuti/&quot;&gt;tekuti&lt;/a&gt;, an application written on top of &lt;a href=&quot;http://www.gnu.org/software/guile/manual/html_node/Web-Server.html#Web-Server&quot;&gt;Guile's web server&lt;/a&gt;; and actually, in this case there is Apache in front of everything right now, so you're not talking directly to Guile.  Perhaps that will change at some point.&lt;/p&gt;&lt;p&gt;But anyway, a few months ago, this blog was really slow to access.  That turned out to be mostly due to a bug in &lt;a href=&quot;http://wingolog.org/software/tekuti/&quot;&gt;tekuti&lt;/a&gt;, the blog application, in which generating the &quot;related links&quot; for a post would always end up invoking git.  (The database for the blog is implemented in git.)  Spawning another process was slow.  Fellow hacker and tekuti user &lt;a href=&quot;http://hacks-galore.org/aleix/&quot;&gt;Aleix Conchillo Flaqué&lt;/a&gt; fixed the problem a year ago, but it took a while for it me to finally review and &lt;a href=&quot;http://gitorious.org/tekuti/tekuti/commit/afec0daa992123035f4bf63c5365b09f2df1e1af&quot;&gt;merge&lt;/a&gt; it.&lt;/p&gt;&lt;p&gt;So then, at that point, things were tolerable, but I had already contracted the performance bug, so I went on to spend a couple months drilling down, optimizing Guile and its web server -- the layers below tekuti.&lt;/p&gt;&lt;p&gt;&lt;b&gt;10K requests per second: achievement unlocked!&lt;/b&gt;&lt;/p&gt;&lt;p&gt;After a lot of tweaking, to the compiler, runtime, HTTP libraries, and to the VM, Guile can now serve over 10000 requests per second on a simple &quot;Hello world&quot; benchmark.  This is out of the box, so to speak, if the master branch in git were a box.  You just check out Guile, build it using the normal &lt;tt&gt;autoreconf -vif &amp;amp; &amp;amp; ./configure &amp;amp;&amp;amp; make&lt;/tt&gt; dance, and then run the example uninstalled:&lt;/p&gt;&lt;pre&gt;
$ meta/guile examples/web/hello.scm
&lt;/pre&gt;&lt;p&gt;In another terminal, you can connect directly to the port to see what it does.  Paste the first paragraph of this and press return, and you should see the second part:&lt;/p&gt;&lt;pre&gt;
$ nc localhost 8080
GET / HTTP/1.0
Host: localhost:8080
User-Agent: ApacheBench/2.3
Accept: */*

HTTP/1.0 200 OK
Content-Length: 13
Content-Type: text/plain;charset=utf-8

Hello, World!
&lt;/pre&gt;&lt;p&gt;I should say a little more about what the server does, and what the test application is.  It reads the request, and parses all the headers to native &lt;a href=&quot;http://www.gnu.org/software/guile/manual/html_node/Types-and-the-Web.html#Types-and-the-Web&quot;&gt;Scheme&lt;/a&gt; &lt;a href=&quot;http://www.gnu.org/software/guile/manual/html_node/Requests.html#Requests&quot;&gt;data&lt;/a&gt; &lt;a href=&quot;http://www.gnu.org/software/guile/manual/html_node/HTTP-Headers.html#HTTP-Headers&quot;&gt;types&lt;/a&gt;.  This is strictly more work than is needed for a simple &quot;pong&quot; benchmark, but it's really useful for applications to have all of the headers parsed for you already.  It also filters out bad requests.&lt;/p&gt;&lt;p&gt;Guile then passes the request and request body to a handler, which returns the response and body.  This example's handler is very simple:&lt;/p&gt;&lt;pre&gt;
(define (handler request body)
  (values '((content-type . (text/plain)))
          &quot;Hello, World!&quot;))
&lt;/pre&gt;&lt;p&gt;It uses a shorthand, that instead of building a proper response object, it just returns an association-list of headers along with the body as a string, and relies on the web server's &lt;a href=&quot;http://www.gnu.org/software/guile/manual/html_node/Web-Server.html#index-sanitize_002dresponse-4089&quot;&gt;sanitize-response&lt;/a&gt; to produce a response object and encode the body as a bytevector.  Again, this is more work for the server, but it's a nice convenience.&lt;/p&gt;&lt;p&gt;Finally, the server writes the response and body to the client, and either closes the port, as in this case for HTTP/1.0 with no keep-alive, or moves the client back to the poll set if we have a persistent connection.  The reads and writes are synchronous (blocking), and the web server runs in one thread.  I'll discuss this a bit more later.&lt;/p&gt;&lt;p&gt;You can then use ApacheBench to test it out:&lt;/p&gt;&lt;pre&gt;
$ ab -n 100000 -c100 http://localhost:8080/
Server Software:        
Server Hostname:        localhost
Server Port:            8080

Document Path:          /
Document Length:        13 bytes

Concurrency Level:      100
Time taken for tests:   9.631 seconds
Complete requests:      100000
Failed requests:        0
Write errors:           0
Total transferred:      9200000 bytes
HTML transferred:       1300000 bytes
Requests per second:    &lt;b&gt;10383.03&lt;/b&gt; [#/sec] (mean)
Time per request:       9.631 [ms] (mean)
Time per request:       &lt;b&gt;0.096&lt;/b&gt; [ms] (mean, across all concurrent requests)
Transfer rate:          932.85 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.1      0       3
Processing:     1   10   1.7      9      20
Waiting:        1   10   1.7      9      20
Total:          3   10   1.7      9      20

Percentage of the requests served within a certain time (ms)
  50%      9
  66%      9
  75%     12
  80%     12
  90%     12
  95%     12
  98%     13
  99%     13
 100%     20 (longest request)
&lt;/pre&gt;&lt;p&gt;I give you the whole printout because I find it interesting.  There's no huge GC pause anywhere.  This laptop has an Intel i7-2620M 2.70GHz CPU.  It was bought last year, so it's recent but not fancy.  There are two cores, and so part of one core is being used by ApacheBench, and the whole other one used by Guile.&lt;/p&gt;&lt;p&gt;Of course, this is a flawed benchmark.  If you really care about this sort of thing, Mark Nottingham wrote a &lt;a href=&quot;http://www.mnot.net/blog/2011/05/18/http_benchmark_rules&quot;&gt;nice article on HTTP benchmarking&lt;/a&gt; last year that shows all the ways in which this test is wrong.&lt;/p&gt;&lt;p&gt;However, flawed though it is, this test serves my purposes: to understand the overhead that Guile and its web server imposes on a web application.&lt;/p&gt;&lt;p&gt;So in that light, I'd like to take apart this test and try to understand its performance.  I'll look at it from three directions:  bottom-up (using low-level profiling), top-down (using a Scheme profiler), and transverse (profiling the garbage collector).&lt;/p&gt;&lt;p&gt;&lt;b&gt;bottom-up: clock cycles, instructions retired&lt;/b&gt;&lt;/p&gt;&lt;p&gt;The best way to measure the performance of an application is with a statistical profiler.  Statistical profiling samples what's really happening, without perturbing the performance characteristics of your application.&lt;/p&gt;&lt;p&gt;On GNU/Linux systems, we have a few options.  None are really easy to use, however.  &lt;a href=&quot;https://perf.wiki.kernel.org/&quot;&gt;Perf&lt;/a&gt; comes the closest.  You just run &lt;tt&gt;perf record -g guile examples/web/hello.scm&lt;/tt&gt;, and it records its information.  Then you run &lt;tt&gt;perf report&lt;/tt&gt; and dive into the details through the mostly pleasant curses application.&lt;/p&gt;&lt;p&gt;However, for some reason &lt;tt&gt;perf&lt;/tt&gt; could not capture the call graphs, in my tests.  My machine is x86-64, which does not include frame pointers in its call frames, so perhaps it was a naive stack-walking algorithm.  The associated DWARF information does include the necessary stack-walking data.&lt;/p&gt;&lt;p&gt;Anyway, at least you can get a good handle on what individual functions are hot, and indeed what source lines and instructions take the most time.  These lowest-level statistical profilers typically sample based on number of clock cycles, so they correspond to real time very well.&lt;/p&gt;&lt;p&gt;So much for measurement.  For actually understanding and improving performance, I find &lt;a href=&quot;http://valgrind.org/&quot;&gt;valgrind&lt;/a&gt;'s &lt;a href=&quot;http://valgrind.org/docs/manual/cl-manual.html&quot;&gt;callgrind&lt;/a&gt; tool much more useful.  You run it like this:&lt;/p&gt;&lt;pre&gt;
valgrind --tool=callgrind --num-callers=20 /path/to/guile examples/web/http.scm
&lt;/pre&gt;&lt;p&gt;Valgrind can record the execution of your program as it runs, tracking every call and every instruction that is executed.  You can then explore the resulting log with the &lt;a href=&quot;http://kcachegrind.sourceforge.net/html/Home.html&quot;&gt;kcachegrind&lt;/a&gt; graphical tool.  It's the best thing there is for exploring low-level execution of your program.&lt;/p&gt;&lt;p&gt;Now, valgrind is not a statistical profiler.  It slows down and distorts the execution of your program, as you would imagine.  Beyond those caveats, though, you have to keep two things in mind:  firstly, that a count of instructions executed does not correspond directly to clock cycles spent.  There are memory latencies, cache misses, branch mispredictions, and a whole host of randomnesses that can affect your runtime.  Secondly, valgrind only records the user-space behavior of your program.  I'll have more to say on that later.&lt;/p&gt;&lt;p&gt;If I run the &quot;hello.scm&quot; benchmark under valgrind, and hit it with a hundred thousand connections, I can get a pretty good idea what the aggregate behavior of my program is.  But I can do better than big-picture, for this kind of test.  Given that this test does the same thing a hundred thousand times, I can use valgrind's accurate call and instruction counts to give me precise information on how much a single request takes.&lt;/p&gt;&lt;p&gt;So, looking at the total instruction and call counts, and dividing by the number of requests (100K), I see that when Guile handles one request, the algorithmic breakdown is as follows:&lt;/p&gt;&lt;table&gt;
&lt;tr&gt;&lt;th&gt;instructions per request&lt;/th&gt;&lt;th&gt;percentage of total&lt;/th&gt;&lt;th&gt;procedure&lt;/th&gt;&lt;th&gt;calls per request&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;250K&lt;/td&gt;&lt;td&gt;100&lt;/td&gt;&lt;td&gt;(total)&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;134K&lt;/td&gt;&lt;td&gt;52.5&lt;/td&gt;&lt;td&gt;bytecode interpretation&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;47K&lt;/td&gt;&lt;td&gt;18.5&lt;/td&gt;&lt;td&gt;port buffer allocation&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;18K&lt;/td&gt;&lt;td&gt;7.2&lt;/td&gt;&lt;td&gt;&lt;tt&gt;display&lt;/tt&gt;&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;7.6K&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;allocation within VM (closures, pairs, etc)&lt;/td&gt;&lt;td&gt;83&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;7.2K&lt;/td&gt;&lt;td&gt;2.84&lt;/td&gt;&lt;td&gt;&lt;tt&gt;read-line&lt;/tt&gt;&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;3.6K&lt;/td&gt;&lt;td&gt;1.40&lt;/td&gt;&lt;td&gt;&lt;tt&gt;substring-downcase&lt;/tt&gt;&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;3.2K&lt;/td&gt;&lt;td&gt;1.24&lt;/td&gt;&lt;td&gt;&lt;tt&gt;string-&amp;gt;symbol&lt;/tt&gt;&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;3.1K&lt;/td&gt;&lt;td&gt;1.23&lt;/td&gt;&lt;td&gt;&lt;tt&gt;accept&lt;/tt&gt;&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;2.7K&lt;/td&gt;&lt;td&gt;1.06&lt;/td&gt;&lt;td&gt;&lt;tt&gt;substring&lt;/tt&gt;&lt;/td&gt;&lt;td&gt;11&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;2.6K&lt;/td&gt;&lt;td&gt;1.03&lt;/td&gt;&lt;td&gt;&lt;tt&gt;string-index&lt;/tt&gt;&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;2.5K&lt;/td&gt;&lt;td&gt;1.00&lt;/td&gt;&lt;td&gt;&lt;tt&gt;hashq-ref&lt;/tt&gt;&lt;/td&gt;&lt;td&gt;14&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;23K&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;other primitives &amp;lt; 1% each&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;p&gt;Guile's ports can be buffered, like C's stdio &lt;tt&gt;FILE*&lt;/tt&gt; streams, and the web server does turn on buffering.  The 18.5% of the time spent allocating port buffers seems like a ripe place for optimization, but digging into it, almost all of the time within those routines is spent in the garbage collector, and most of that marking the heap.  Switching to a generational collector could help here, but I'm not sure how much, given that port buffers are probably 4 KB each for input and output, and thus might not fit into a young generation.  Marking from more threads at once could help -- more on that in some future essay.&lt;/p&gt;&lt;p&gt;There are some primitives that can be optimized as well, but with the VM taking up 52% of the runtime, and 23% for allocation and the garbage collector, &lt;a href=&quot;http://en.wikipedia.org/wiki/Amdahl's_law&quot;&gt;Amdahl's law&lt;/a&gt; is against us: making the primitives twice as fast would result only a 15% improvement in throughput.&lt;/p&gt;&lt;p&gt;Turning Amdahl's argument around, we can predict the effect of native compilation on throughput.  If Guile 2.2 comes out with native compilation, as it might, and that makes Scheme code run 5 times faster (say), then the 50% of the instructions that are currently in the VM might drop to 10% -- leading to an expected throughput improvement of 67%.&lt;/p&gt;&lt;p&gt;&lt;b&gt;top-down: scheme-level profiling with statprof&lt;/b&gt;&lt;/p&gt;&lt;p&gt;But what is going on in the VM?  For that, I need a Scheme profiler.  Fortunately, Guile comes with one, accessible at the REPL:&lt;/p&gt;&lt;pre&gt;
$ guile --no-debug
&amp;gt; ,profile (load &quot;examples/web/hello.scm&quot;)
%     cumulative   self             
time   seconds     seconds      name
 15.42      1.55      1.55  close-port
 11.61      1.17      1.17  %after-gc-thunk
  6.20      1.65      0.62  setvbuf
  4.29      0.43      0.43  display
  3.34      0.35      0.34  accept
  2.86      0.35      0.29  call-with-error-handling
  2.38      0.24      0.24  hashq-ref
  2.23      9.16      0.22  with-default-trap-handler
  2.07      0.67      0.21  build-response
  1.75      1.17      0.18  sanitize-response
...
Sample count: 629
Total time: 10.055736686 seconds (1.123272351 seconds in GC)
&lt;/pre&gt;&lt;p&gt;(I use the &lt;tt&gt;--no-debug&lt;/tt&gt; argument to avoid some per-VM-instruction overhead imposed by running Guile interactively; see &lt;a href=&quot;http://www.gnu.org/software/guile/manual/html_node/VM-Hooks.html#VM-Hooks&quot;&gt;VM Hooks&lt;/a&gt; for more.)&lt;/p&gt;&lt;p&gt;Here I get a really strange result.  How is &lt;tt&gt;close-port&lt;/tt&gt; taking all the time?  It's implemented as a primitive, not in Scheme, and Valgrind only thought it took 0.40% of the instructions.  How is that?&lt;/p&gt;&lt;p&gt;To answer this, we need to remember a couple things.  First of all, we recall that Guile's statistical profiler uses &lt;tt&gt;setitimer&lt;/tt&gt; to get signals delivered periodically, after some amount of time spent on the program's behalf, &lt;i&gt;including time spent in the kernel&lt;/i&gt;.  Valgrind doesn't account for system time.  So here we are seeing that &lt;tt&gt;close-port&lt;/tt&gt; is indeed taking time, specifically to flush out the buffered writes.  The time is really being spent in the &lt;tt&gt;write&lt;/tt&gt; system call.&lt;/p&gt;&lt;p&gt;So this is good!  We know now that we should perhaps look at tuning the kernel to buffer our writes better.&lt;/p&gt;&lt;p&gt;We can also use the profiling data counts to break down the time spent in serving one request from a high level.  For example, &lt;tt&gt;http-read&lt;/tt&gt; handles traversing the poll set and accepting connections, and tail-calls &lt;tt&gt;read-request&lt;/tt&gt; to actually read the request.  Looking at the cumulative times in the chart tells me that out of each request, the time spent breaks down like this:&lt;/p&gt;&lt;table&gt;
&lt;tr&gt;&lt;th&gt;microseconds per request&lt;/th&gt;&lt;th&gt;procedure&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;100&lt;/td&gt;&lt;td&gt;(total)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;29&lt;/td&gt;&lt;td&gt;poll and accept&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;16&lt;/td&gt;&lt;td&gt;reading request&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;request handler&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;12&lt;/td&gt;&lt;td&gt;sanitize-response&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;writing response headers&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;writing response body&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;15&lt;/td&gt;&lt;td&gt;close-port&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;20&lt;/td&gt;&lt;td&gt;other&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;&lt;p&gt;Of course, since this is statistical, there is some uncertainty about the whole thing.  Still, it seems sensible enough.&lt;/p&gt;&lt;p&gt;&lt;b&gt;transverse: who is doing all the allocating?&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Often when you go to optimize a Scheme program, you find that it's spending a fair amount of time in garbage collection.  How do you optimize that?  The rookie answer to this is to try to patch the collector to allocate faster, or less frequently, or something.  Veterans know that the solution to GC woes is usually just to allocate less.  But how do you know what is allocating?  GC is a fairly transverse cost, in that it can charge the good parts of your program for the expenses of the bad.&lt;/p&gt;&lt;p&gt;Guile uses the &lt;a href=&quot;http://www.hpl.hp.com/personal/Hans_Boehm/gc/&quot;&gt;Boehm-Demers-Weiser conservative collector&lt;/a&gt;.  For what it is, it's pretty good.  However its stock configuration does not provide very much insight into the allocation patterns of your program.  One approximation that can be made, though, is that the parts of the program that cause garbage collection to run are the parts that are allocating the most.&lt;/p&gt;&lt;p&gt;Based on this insight, Guile includes a statistical profiler that samples when the garbage collector runs.  One thing to consider is that GC probably doesn't run very often, so for gcprof tests, one might need to run the test for longer.  In this example, I increased the load to a million requests.&lt;/p&gt;&lt;pre&gt;
$ guile --no-debug
&amp;gt; (use-modules (statprof))
&amp;gt; (gcprof (lambda () (load &quot;examples/web/hello.scm&quot;)))
%     cumulative   self             
time   seconds     seconds      name
 86.55     82.75     82.75  setvbuf
  9.37      8.96      8.96  accept
  1.70      1.63      1.63  call-with-error-handling
  1.31      1.25      1.25  %read-line
  0.29      0.28      0.28  substring
  0.24      0.23      0.23  string-downcase
  0.10     91.80      0.09  http-read
  0.10      0.09      0.09  parse-param-list
  0.10      0.09      0.09  write-response
---
Sample count: 2059
Total time: 95.611532937 seconds (9.371730448 seconds in GC)
&lt;/pre&gt;&lt;p&gt;Here we confirm the result that we saw in the low-level profile: that the &lt;tt&gt;setvbuf&lt;/tt&gt; Scheme procedure, which can cause Guile to allocate buffers for ports, is the primary allocator in this test.&lt;/p&gt;&lt;p&gt;Another interesting question to answer is, &quot;how much are we allocating, anyway?&quot;  Using the &lt;tt&gt;statistics&lt;/tt&gt; &lt;a href=&quot;http://www.gnu.org/software/guile/manual/html_node/System-Commands.html#System-Commands&quot;&gt;REPL command&lt;/a&gt;, I can see that the 100K requests entailed a total allocation of about 1.35 GB, which divides out to 13.5 KB per request.  That sounds reasonable: about 4 KB each for the read and write buffers, and some 4 KB of various other allocation: strings, pairs, the final bytevector for output, etc.&lt;/p&gt;&lt;p&gt;The test incurred 220 stop-the-world garbage collections.  So, about 1 out of 450 (0.2%) of requests trigger a GC.  The average GC time seems to be about 5 ms (1100 ms / 220 times).  That squares fairly well with our last-percentile ApacheBench results.&lt;/p&gt;&lt;p&gt;The total heap size is modest: 14 megabytes.  It does not leak memory, thankfully.  If I run &lt;a href=&quot;http://wingolog.org/pub/mem_usage.py&quot;&gt;&lt;tt&gt;mem_usage.py&lt;/tt&gt;&lt;/a&gt; on it, I get:&lt;/p&gt;&lt;pre&gt;
Mapped memory:
               Shared            Private
           Clean    Dirty    Clean    Dirty
    r-xp    1236        0     1028        0  -- Code
    rw-p      24        0       28      160  -- Data
    r--p      60        0     1580      112  -- Read-only data
    ---p       0        0        0        0
    r--s      24        0        0        0
   total    1344        0     2636      272
Anonymous memory:
               Shared            Private
           Clean    Dirty    Clean    Dirty
    r-xp       4        0        0        0
    rw-p       0        0        0    11652  -- Data (malloc, mmap)
    ---p       0        0        0        0
   total       4        0        0    11652
   ----------------------------------------
   total    1348        0     2636    11924
&lt;/pre&gt;&lt;p&gt;Native ahead-of-time compilation would allow for more shareable, read-only memory.  Still, as it is, this seems acceptable.&lt;/p&gt;&lt;p&gt;&lt;b&gt;a quick look at more dynamic tests&lt;/b&gt;&lt;/p&gt;&lt;p&gt;That's all well and good, you say, but it's a fairly static test, right?&lt;/p&gt;&lt;p&gt;For that I have a couple of data points.  One is the simple SXML debugging test in &lt;a href=&quot;http://git.savannah.gnu.org/gitweb/?p=guile.git;a=blob;f=examples/web/debug-sxml.scm;h=724a9bd6cd3efdd03fcf7c6fa371f1725b62fbda;hb=HEAD&quot;&gt;&lt;tt&gt;examples/test/debug-sxml.scm&lt;/tt&gt;&lt;/a&gt;, which simply spits back the headers that it receives, wrapped in an HTML table.  The values are printed as the Scheme object that they parse to.  Currently, I have a &lt;a href=&quot;http://wingolog.org/debug&quot;&gt;version of this script&lt;/a&gt; running on my site.  (You can see the headers that Apache adds on, there.)&lt;/p&gt;&lt;p&gt;Testing it as before tells me that Guile can serve 6000 of these pages per second, on my laptop.  That's pretty respectable for an entirely dynamic page that hasn't been optimized at all.  You can search around the net for comparable tests in other languages; I think you'll find Guile's performance to be very good.&lt;/p&gt;&lt;p&gt;The other point to mention is Tekuti itself.  Tekuti includes a &lt;a href=&quot;http://gitorious.org/tekuti/tekuti/blobs/master/tekuti/cache.scm#line23&quot;&gt;caching layer&lt;/a&gt; in the application, so after the first request, it's not really a dynamic test.  It does check to make sure its caches are fresh on every round, though, by checking the value of the &lt;tt&gt;refs/heads/master&lt;/tt&gt; ref.  But still, it is a test of pushing a lot of data; for my test, the page is 50 KB, and Guile still reaches 5700 requests per second on this one core, serving 280 megabytes per second of... well, of my blather, really.  But it's a powerful blather-pipe!&lt;/p&gt;&lt;p&gt;&lt;b&gt;related &amp;amp; future work&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Here's a &lt;a href=&quot;http://nbonvin.wordpress.com/2011/03/24/serving-small-static-files-which-server-to-use/&quot;&gt;similarly flawed test&lt;/a&gt; from a year ago of static servers, serving small static files over localhost.  Flawed, but it's a lot like this &quot;hello world&quot; test in semantics.  We see that nginx gets up to about 20K requests per second, per core.  It also does so with a flat memory profile, which is nice.&lt;/p&gt;&lt;p&gt;Guile's bundled web server is currently single-threaded and blocking, which does not make it a good frontend server.  There's room for a project to build a proper web server on top of Guile, I think, but I probably won't do it myself.  In the meantime though, I do want to offer the possibility for the built-in web server to be multithreaded, with some number of I/O threads and some more limited number of compute threads.  I've been testing out some code in that direction -- in fact, this server is running that code -- but as yet Guile's synchronization primitives have too much overhead for it to be a real win.  There's more runtime and compiler work to do here.&lt;/p&gt;&lt;p&gt;As far as web servers written in safe languages, it would be remiss to not mention &lt;a href=&quot;http://www.yesodweb.com/blog/2011/03/preliminary-warp-cross-language-benchmarks&quot;&gt;Warp&lt;/a&gt;, a Haskell web server.  Again, their tests effectively utilize multiple cores, but it seems that 20K per core is the standard.&lt;/p&gt;&lt;p&gt;Unlike Haskell, Guile lacks a proper event manager.  I'm not sure whether to work on such a thing; &lt;a href=&quot;http://blog.ometer.com/2011/11/13/task-dispatch-and-nonblocking-io-in-scala/&quot;&gt;Havoc seems to think it's necessary&lt;/a&gt;, and who am I to argue.&lt;/p&gt;&lt;p&gt;Finally, I mention a &lt;a href=&quot;http://nichol.as/benchmark-of-python-web-servers&quot;&gt;benchmark of python WSGI servers&lt;/a&gt; from a couple years ago.  (Is March the month of benchmarks?)  The python performance is notably worse; hopefully PyPy has improved things in the meantime.  On the other hand, GEvent's use of greenlets is really nice, and makes me envious.&lt;/p&gt;&lt;p&gt;&lt;b&gt;conclusions&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Hey, you read the thing!  Congratulations to you!  Good thing you didn't just skip down to the end :)&lt;/p&gt;&lt;p&gt;If I have a message to send, it's this: that you should consider using Guile to be perfectly acceptable for implementing dynamic web applications with high performance requirements.&lt;/p&gt;&lt;p&gt;It's a modest point, I know.  There are all kinds of trade-offs here, but hey, Guile is plucky and still a little bit shy, but would love it if you to ask it to the hack.&lt;/p&gt;&lt;p&gt;If it works for you, boast about it to your colleagues!  And if it doesn't, let us know, over at the usual places (&lt;tt&gt;guile-user@gnu.org&lt;/tt&gt;, and &lt;tt&gt;#guile&lt;/tt&gt; on freenode).  Happy hacking!&lt;/p&gt;&lt;/div&gt;</content>
		<author>
			<name>Andy Wingo</name>
			<uri>http://wingolog.org/</uri>
		</author>
		<source>
			<title type="html">wingolog</title>
			<subtitle type="html">A mostly dorky weblog by Andy Wingo</subtitle>
			<link rel="self" href="http://wingolog.org/feed/atom/"/>
			<id>http://wingolog.org/feed/atom</id>
			<updated>2012-05-22T10:47:17+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Trim like a professional hair stylist</title>
		<link href="http://jeff.ecchi.ca/blog/2012/03/07/trim-like-a-professional-hair-stylist/"/>
		<id>http://jeff.ecchi.ca/blog/?p=2063</id>
		<updated>2012-03-08T04:59:21+00:00</updated>
		<content type="html">&lt;p&gt;In my spare time this week I implemented one of my favorite missing features in PiTiVi: a &lt;strong&gt;live preview of what you&amp;#8217;re trimming&lt;/strong&gt;. No more fuzzying around and moving the playhead all the time to figure out if you cut your scene right. No more trial and error. Just pure, unadulterated productivity. HTML5 video below:&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-2063&quot;&gt;&lt;/span&gt;&lt;/p&gt;

  &lt;!-- Begin Video.js --&gt;
  
    
    
    
  
  &lt;!-- End Video.js --&gt;

&lt;p&gt;It is fast enough to seek through the 2K version of &lt;a href=&quot;http://sintel.org&quot;&gt;Sintel&lt;/a&gt; like a breeze and to stay reasonably responsive with &lt;a href=&quot;http://en.wikipedia.org/wiki/4K_resolution&quot;&gt;4K&lt;/a&gt; videos. But that&amp;#8217;s &lt;em&gt;without&lt;/em&gt; hardware acceleration, mind you (I&amp;#8217;m looking forward to trying this again in GStreamer 1.0&amp;#8230;).&lt;/p&gt;
&lt;p&gt;I actually &lt;a href=&quot;https://bugzilla.gnome.org/show_bug.cgi?id=569980&quot;&gt;filed a bug&lt;/a&gt; about this feature three years ago (you know, when I filed a little over a hundred bug reports within the space of three months). You hadn&amp;#8217;t noticed how I am a visionary way ahead of my time? Well, now you&amp;#8217;ve got proof.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m sure that all the other open source video editors will rip my beautiful code and clone this feature within 12 hours. But mark my words: &lt;strong&gt;PiTiVi had it first.&lt;/strong&gt; Yes: PiTiVi is the only open source video editor that has this feature. Take &lt;em&gt;that&lt;/em&gt;, haters.&lt;/p&gt;
&lt;p&gt;When nekohayo starts touching your gst pipelines, you should be very afraid.&lt;/p&gt;
&lt;p&gt;Let&amp;#8217;s try a small social experiment here. I&amp;#8217;ve &lt;a href=&quot;https://bugzilla.gnome.org/show_bug.cgi?id=629924&quot;&gt;always been curious&lt;/a&gt; to see if there was a significant demand for a &amp;#8220;serious-business-I-kid-you-not pitivi&amp;#8221;. So &lt;strong&gt;now you have an opportunity to donate some money&lt;/strong&gt;.&lt;/p&gt;
&lt;h1&gt;&amp;#8220;WHAT? You capitalist pig!&amp;#8221;&lt;/h1&gt;
&lt;p&gt;Don&amp;#8217;t get me wrong: I&amp;#8217;m not begging for money here. I have a job and I&amp;#8217;ve always contributed to Pitivi without any financial motive. What I want to do here is to gauge the possibility of sustaining Pitivi to the point where it would be developed faster and be much more robust:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If I get 10$, I might be able to afford a sandwich.&lt;/li&gt;
&lt;li&gt;If we get 100$, we could pay a couple of beers for contributors at &lt;a href=&quot;http://guadec.org&quot;&gt;GUADEC&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;If we get 10 000$ per year, now we&amp;#8217;re starting to get serious enough to be able to organize one or two PiTiVi hackfests per year (still, that&amp;#8217;s just nearly enough to pay a port of travel fees for developers for a hackfest).&lt;/li&gt;
&lt;li&gt;If we get 100 000 to 500 000$ a year (yeah, right!)&amp;#8230; then things would change &lt;strong&gt;&lt;em&gt;very&lt;/em&gt;&lt;/strong&gt; drastically around here. Like actually contracting GStreamer hackers to make Pitivi &lt;em&gt;the&lt;/em&gt; professional-grade open-source video editing solution on Linux. Or hiring ninjas to infiltrate Avid&amp;#8217;s headquarters, that sort of thing. I&amp;#8217;m not saying we &lt;em&gt;need&lt;/em&gt; hundreds of thousands of dollars either: with a significant-enough amount, I could finally prove my case to some select folks I know, and get the ball rolling. It might come as a surprise, but I don&amp;#8217;t just have a crazy passion for Free Software, I also have some nice business skills.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You never know until you try, right? So, for now, let&amp;#8217;s do this initial experiment. &lt;strong&gt;You can send some love through Paypal or with Flattr&lt;/strong&gt;. I placed the Flattr and Paypal buttons on the &lt;a href=&quot;http://pitivi.org/?pk_campaign=fundraiser-2012-03&quot;&gt;pitivi.org&lt;/a&gt; website if you think I&amp;#8217;m joking (they are located at the bottom of the home page, or in the &amp;#8220;Contributing&amp;#8221; page). And here&amp;#8217;s the same Flattr button if you&amp;#8217;re so excited that you need a target to click &lt;em&gt;right now:&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://flattr.com/thing/484849/PiTiVi&quot; target=&quot;_blank&quot;&gt;&lt;img title=&quot;Flattr this&quot; src=&quot;http://api.flattr.com/button/flattr-badge-large.png&quot; alt=&quot;Flattr this&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ll just watch and study what happens. By the way, &lt;strong&gt;I won&amp;#8217;t be using the money for myself as an individual. It will go towards the project&lt;/strong&gt;, I just need to figure out the technicalities of doing so&lt;strong&gt;.&lt;/strong&gt; I&amp;#8217;ve been talking with the GNOME foundation in the past few months, and I&amp;#8217;d like to know if the amount of donations we&amp;#8217;re facing would warrant the additional overhead.&lt;/p&gt;
&lt;p&gt;Oh, and I have some &lt;strong&gt;more features in the cooker&lt;/strong&gt;, but they&amp;#8217;re not ready yet. Stay tuned. In the meantime, feel free to &lt;strong&gt;let the world know about the important milestone we&amp;#8217;ve reached today&lt;/strong&gt;. And if you want to spread the word about donations, you may use &lt;a href=&quot;http://pitivi.org/?pk_campaign=fundraiser-2012-03&quot;&gt;this URL&lt;/a&gt; or &lt;a href=&quot;http://pitivi.org/?go=contributing&amp;pk_campaign=fundraiser-2012-03&quot;&gt;this URL&lt;/a&gt; (&amp;#8220;contributing&amp;#8221; page) when linking to the pitivi website, to help me keep track of what&amp;#8217;s going on.&lt;/p&gt;</content>
		<author>
			<name>Jean-François Fortin Tam</name>
			<uri>http://jeff.ecchi.ca/blog/</uri>
		</author>
		<source>
			<title type="html">Nekohayo !</title>
			<subtitle type="html">La vie personnelle du chat</subtitle>
			<link rel="self" href="http://jeff.ecchi.ca/blog/feed/"/>
			<id>http://jeff.ecchi.ca/blog/feed/</id>
			<updated>2012-05-19T22:17:22+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Le SSD du pauvre</title>
		<link href="http://jeff.ecchi.ca/blog/2012/03/07/le-ssd-du-pauvre/"/>
		<id>http://jeff.ecchi.ca/blog/?p=2053</id>
		<updated>2012-03-08T03:33:34+00:00</updated>
		<content type="html">&lt;p&gt;Un de mes amis possède encore son netbook Dell Mini 9. Or, il y a un an ou deux, le SSD bon marché à l&amp;#8217;intérieur a rendu l&amp;#8217;âme (même le BIOS voit le disque dur comme étant de capacité 0 MB).&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-2053&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;alignnone size-full wp-image-2054&quot; title=&quot;stec ssd&quot; src=&quot;http://jeff.ecchi.ca/blog/wp-content/uploads/stec-ssd.jpg&quot; alt=&quot;&quot; width=&quot;600&quot; height=&quot;320&quot; /&gt;&lt;/p&gt;
&lt;p&gt;J&amp;#8217;avais entretenu l&amp;#8217;idée de ressusciter cet ordinateur pour un usage de serveur ou «media center» ou autre chose en live USB, mais ce n&amp;#8217;était qu&amp;#8217;une idée. Récemment, l&amp;#8217;ami en question a décidé de tenter la chose et s&amp;#8217;est procuré une clé USB, amenant le coût total de la réincarnation à environ 10 dollars.&lt;/p&gt;
&lt;p&gt;J&amp;#8217;ai d&amp;#8217;abord tenté de faire fonctionner le tout simplement en créant un live USB Fedora 16 «&lt;a href=&quot;http://fedoraproject.org/wiki/How_to_create_and_use_Live_USB&quot;&gt;persistant&lt;/a&gt;», malgré les limitations inhérentes de cette approche, comme le fait que l&amp;#8217;espace ne se libère &lt;em&gt;jamais &lt;/em&gt;même si on supprime les fichiers:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;One very important note about using the &amp;#8220;primary&amp;#8221; persistent overlay for system changes is that due to the way it&amp;#8217;s currently implemented (as a LVM copy-on-write snapshot), every single change to it (writes AND deletes) subtracts from its free space, so it will eventually be &amp;#8220;used up&amp;#8221; and your USB stick will no longer boot&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&amp;#8230; puis j&amp;#8217;ai rencontré une embûche qui avait échappé à ma planification: la carte sans fil était une Broadcom 4312 (donc nécessitant un module kernel non-libre).&lt;/p&gt;
&lt;p&gt;Utilisant mon téléphone android (acheté d&amp;#8217;occasion &lt;a title=&quot;Sipdroid et le Samsung Galaxy i7500&quot; href=&quot;http://jeff.ecchi.ca/blog/2011/06/03/sipdroid-et-le-samsung-galaxy-i7500/&quot;&gt;l&amp;#8217;été dernier&lt;/a&gt;) pour partager la connexion WiFi par USB, je tentai néanmoins d&amp;#8217;installer «akmod-wl» de rpmfusion (c&amp;#8217;est &lt;em&gt;le&lt;/em&gt; paquet pour faire marcher les chips Broadcom sous Fedora. Oubliez les kmod-wl). Cependant, une fausse manipulation mit l&amp;#8217;ordinateur en veille, et il ne voulait plus se réveiller correctement par la suite. Comme le barbare que je suis, j&amp;#8217;ai croisé les doigts, éteint de force et redémarré le système&amp;#8230; pour constater que le système de fichiers de la clé USB était corrompu.&lt;/p&gt;
&lt;p&gt;Après quelques minutes de réflexion pondérées de «FFFUUUU», j&amp;#8217;ai retourné le problème dans un sens moins conventionnel. &lt;em&gt;Le «live USB» n&amp;#8217;est pas la solution. &lt;strong&gt;«Installer vers la clé USB» est la solution&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Il nous faut donc utiliser deux clés USB:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;L&amp;#8217;une pour booter et lancer l&amp;#8217;installation&lt;/li&gt;
&lt;li&gt;L&amp;#8217;autre (une clé 16 GB vierge, sans aucune partition dessus) qui sert comme cible d&amp;#8217;installation. Il a fallu la partitionner comme suit: une partition de type «BIOS BOOT» de 2 MB, une partition swap de 50 MB (juste parce que Fedora insiste pour me faire croire qu&amp;#8217;il faut plus d&amp;#8217;un gigaoctet de mémoire pour installer&amp;#8230; donc à désactiver post-installation) et le reste en ext4.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;#8230; et ça marche. Après l&amp;#8217;installation, j&amp;#8217;ai effectué quelques hacks pour améliorer la performance et augmenter un peu (en théorie) la durée de vie de la clé USB:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Modifier /etc/fstab pour désactiver le swap et ajouter l&amp;#8217;option «noatime» à la partition /&lt;/li&gt;
&lt;li&gt;Désactiver presto dans /etc/yum/pluginconf.d/presto.conf&lt;/li&gt;
&lt;li&gt;Désactiver le firewall et selinux&lt;/li&gt;
&lt;li&gt;Supprimer abrt&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Après avoir fait fonctionner la carte sans-fil Broadcom, il ne restait qu&amp;#8217;à appliquer les ~400 mises à jour, rajouter LibreOffice et les plugins GStreamer. Heureusement que j&amp;#8217;avais désactivé presto et fait effectuer cette opération durant mon sommeil: le tout a nécessité un peu plus de six heures (processeur Atom N270 et lenteur de clé USB obligent)!&lt;/p&gt;
&lt;p&gt;L&amp;#8217;aspect intéressant de tout ça est que nous sommes maintenant en présence d&amp;#8217;un &lt;em&gt;véritable&lt;/em&gt; système d&amp;#8217;opération USB portable, sans les limitations d&amp;#8217;un live USB persistant conventionnel. Peu importe dans quel ordinateur on le branche. C&amp;#8217;est quand même pas mal moins cher qu&amp;#8217;un «Cotton Candy» quand on y pense.&lt;/p&gt;</content>
		<author>
			<name>Jean-François Fortin Tam</name>
			<uri>http://jeff.ecchi.ca/blog/</uri>
		</author>
		<source>
			<title type="html">Nekohayo !</title>
			<subtitle type="html">La vie personnelle du chat</subtitle>
			<link rel="self" href="http://jeff.ecchi.ca/blog/feed/"/>
			<id>http://jeff.ecchi.ca/blog/feed/</id>
			<updated>2012-05-19T22:17:22+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Those darn strings</title>
		<link href="http://k-d-w.org/node/92"/>
		<id>http://k-d-w.org/92 at http://k-d-w.org</id>
		<updated>2012-03-06T21:32:33+00:00</updated>
		<content type="html">&lt;div class=&quot;field field-name-body field-type-text-with-summary field-label-hidden&quot;&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;p&gt;It's long overdue, but I finally added the promised section about &quot;&lt;a href=&quot;http://readthedocs.org/docs/python-gtk-3-tutorial/en/latest/unicode.html&quot;&gt;How to deal with strings&lt;/a&gt;&quot; to the &lt;a href=&quot;http://python-gtk-3-tutorial.readthedocs.org&quot;&gt;Python GTK+3 Tutorial&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It all started with &lt;a href=&quot;https://bugzilla.gnome.org/show_bug.cgi?id=663610&quot;&gt;bug 663610&lt;/a&gt; which got me confused because with PyGObject for Python 2.x you can supply a &lt;em&gt;unicode&lt;/em&gt; instance to a method that expects a string, although GTK+ can only deal with UTF-8 encoded &lt;em&gt;8-bit strings&lt;/em&gt;. However, every GTK+ method that returns a string will always be in the form of a &lt;em&gt;str&lt;/em&gt; instance. This is not necessarily PyGObject's fault, it is exceptionally easy to do bad things in Python 2.x when mixing &lt;em&gt;unicode&lt;/em&gt; and &lt;em&gt;str&lt;/em&gt; (hello &lt;a href=&quot;http://www.google.com/search?q=UnicodeDecodeError&quot;&gt;UnicodeDecodeError&lt;/a&gt;). The lesson hear is that if you use PyGObject for Python 2.x, don't use &lt;em&gt;unicode&lt;/em&gt; and stick to &lt;em&gt;str&lt;/em&gt; all the time. If you instead use Python 3.x, you don't have to worry about this. A more detailed description and a little bit of background can be found in the &quot;&lt;a href=&quot;http://readthedocs.org/docs/python-gtk-3-tutorial/en/latest/unicode.html&quot;&gt;How to deal with strings&lt;/a&gt;&quot; section of the tutorial.&lt;/p&gt;
&lt;p&gt;I also want to thank everybody who helped to improve the tutorial as part of &lt;a href=&quot;http://code.google.com/gci&quot;&gt;Google Code-In&lt;/a&gt; 2011. Students wrote sections about &lt;a href=&quot;http://readthedocs.org/docs/python-gtk-3-tutorial/en/latest/drag_and_drop.html&quot;&gt;Drag and Drop&lt;/a&gt;, &lt;a href=&quot;http://readthedocs.org/docs/python-gtk-3-tutorial/en/latest/objects.html&quot;&gt;sub-classing GObject&lt;/a&gt;, &lt;a href=&quot;http://readthedocs.org/docs/python-gtk-3-tutorial/en/latest/builder.html&quot;&gt;Gtk.Builder&lt;/a&gt;, &lt;a href=&quot;http://readthedocs.org/docs/python-gtk-3-tutorial/en/latest/iconview.html&quot;&gt;Gtk.IconView&lt;/a&gt;, &lt;a href=&quot;http://readthedocs.org/docs/python-gtk-3-tutorial/en/latest/clipboard.html&quot;&gt;Gtk.Clipboard&lt;/a&gt;, and &lt;a href=&quot;http://readthedocs.org/docs/python-gtk-3-tutorial/en/latest/treeview.html#sorting&quot;&gt;Gtk.TreeSortable&lt;/a&gt;. They all did an outstanding job in improving the tutorial to enable others to learn GTK+ 3 in Python.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</content>
		<author>
			<name>Sebastian Pölsterl</name>
			<uri>http://k-d-w.org</uri>
		</author>
		<source>
			<title type="html">Sebastian Pölsterl's blog</title>
			<link rel="self" href="http://k-d-w.org/rss.xml"/>
			<id>http://k-d-w.org/rss.xml</id>
			<updated>2012-05-22T21:47:13+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">More adventures in puppet</title>
		<link href="http://thomas.apestaart.org/log/?p=1445"/>
		<id>http://thomas.apestaart.org/log/?p=1445</id>
		<updated>2012-03-04T22:32:31+00:00</updated>
		<content type="html">&lt;p&gt;After last week&amp;#8217;s &lt;a href=&quot;http://status.linode.com/2012/03/manager-security-incident.html&quot;&gt;Linode incident&lt;/a&gt; I was getting a bit more worried about security than usual.  That coincided with the fact that I found I couldn&amp;#8217;t run puppet on one of my linodes, and some digging turned up that it was because /tmp was owned by uid:gid 1000:1000.  Since I didn&amp;#8217;t know the details of the breakin (and I hadn&amp;#8217;t slept more than 4 hours for two nights, one of which involving a Flumotion DVB problem), I had no choice but to be paranoid about it.  And it took me a good half hour to realize that I had inflicted this problem on myself &amp;#8211; a botched rsync command (rsync arv . root@somehost:/tmp).&lt;/p&gt;
&lt;p&gt;So I wasn&amp;#8217;t hacked, but I still felt I needed to tighten security a bit.  So I thought I&amp;#8217;d go with something simple to deploy using puppet &amp;#8211; &lt;a href=&quot;http://en.wikipedia.org/wiki/Port_knocking&quot;&gt;port knocking&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Now, that would be pretty easy to do if I just deployed firewall rules in a single set.  But I started deploying firewall rules using &lt;a href=&quot;https://github.com/puppetlabs/puppetlabs-firewall&quot;&gt;the puppetlabs firewall module&lt;/a&gt;, which allows me to group rules per service.  So that&amp;#8217;s the direction I wanted to head off into.&lt;/p&gt;
&lt;p&gt;On saturday, I worked on remembering enough iptables to actually understand how port knocking works in a firewall.  Among other things, I realized that our current port knocking is not ideal &amp;#8211; it uses only two ports.  They&amp;#8217;re in descending order, so usually they would not be triggered by a normal port scan, but they would be triggered by one in reverse order.  That is probably why most sources recommend using three ports, where the third port is between the first two, so they&amp;#8217;re out of order.&lt;/p&gt;
&lt;p&gt;So I wanted to start by getting the rules right, and understanding them.  I started with &lt;a href=&quot;http://www.hostsvault.com/blog/howto-protect-services-like-ssh-against-brute-force-using-only-iptables-port-knocking/&quot;&gt;this post&lt;/a&gt;, and found a few problems in it that I managed to work out.  The fixed version is this:&lt;br /&gt;
&lt;code&gt;UPLINK=&quot;p21p1&quot;&lt;br /&gt;
#&lt;br /&gt;
# Comma seperated list of ports to protect with no spaces.&lt;br /&gt;
SERVICES=&quot;22,3306&quot;&lt;br /&gt;
#&lt;br /&gt;
# Location of iptables command&lt;br /&gt;
IPTABLES='/sbin/iptables'&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;# in stage1, connects on 3456 get added to knock2 list&lt;br /&gt;
${IPTABLES} -N stage1&lt;br /&gt;
${IPTABLES} -A stage1 -m recent --remove --name knock&lt;br /&gt;
${IPTABLES} -A stage1 -p tcp --dport 3456 -m recent --set --name knock2&lt;/p&gt;
&lt;p&gt;# in stage2, connects on 2345 get added to heaven list&lt;br /&gt;
${IPTABLES} -N stage2&lt;br /&gt;
${IPTABLES} -A stage2 -m recent --remove --name knock2&lt;br /&gt;
${IPTABLES} -A stage2 -p tcp --dport 2345 -m recent --set --name heaven&lt;/p&gt;
&lt;p&gt;# at the door:&lt;br /&gt;
# - jump to stage2 with a shot at heaven if you're on list knock2&lt;br /&gt;
# - jump to stage1 with a shot at knock2 if you're on list knock&lt;br /&gt;
# - get on knock list if connecting t0 1234&lt;br /&gt;
${IPTABLES} -N door&lt;br /&gt;
${IPTABLES} -A door -m recent --rcheck --seconds 5 --name knock2 -j stage2&lt;br /&gt;
${IPTABLES} -A door -m recent --rcheck --seconds 5 --name knock -j stage1&lt;br /&gt;
${IPTABLES} -A door -p tcp --dport 1234 -m recent --set --name knock&lt;/p&gt;
&lt;p&gt;${IPTABLES} -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT&lt;br /&gt;
${IPTABLES} -A INPUT -p tcp --match multiport --dport ${SERVICES}  -i ${UPLINK} -m recent --rcheck --seconds 5 --name heaven -j ACCEPT&lt;br /&gt;
${IPTABLES} -A INPUT -p tcp --syn -j door&lt;/p&gt;
&lt;p&gt;# close everything else&lt;br /&gt;
${IPTABLES} -A INPUT -j REJECT --reject-with icmp-port-unreachable&lt;/p&gt;
&lt;p&gt;And it gives me this iptables state:&lt;/p&gt;
&lt;div class=&quot;wpg2tag-image&quot;&gt;&lt;a href=&quot;http://thomas.apestaart.org/log/?page_id=862&amp;g2_itemId=71242&quot; title=&quot;knock&quot;&gt;&lt;img src=&quot;http://thomas.apestaart.org/gallery/main.php?g2_view=core.DownloadItem&amp;g2_itemId=71243&amp;g2_serialNumber=2&quot; width=&quot;150&quot; height=&quot;120&quot; id=&quot;IFid3&quot; class=&quot;ImageFrame_None&quot; alt=&quot;knock&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;So the next step was to reproduce these rules using puppet firewall rules.&lt;/p&gt;
&lt;p&gt;Immediately I ran into the first problem &amp;#8211; we need to add new chains, and there doesn&amp;#8217;t seem to be a way to do that in the firewall resource.  At the same time, it uses the recent iptables module, and none of that is implemented either. I spent a bunch of hours trying to add this, but since I don&amp;#8217;t really know Ruby and I&amp;#8217;ve only started using Puppet for real in the last two weeks, that wasn&amp;#8217;t working out well.  So then I thought, why not look in the &lt;a href=&quot;http://projects.puppetlabs.com/projects/modules&quot;&gt;bug tracker&lt;/a&gt; and see if anyone else tried to do this ? I ask my chains question on IRC, while I find a &lt;a href=&quot;http://projects.puppetlabs.com/issues/11100&quot;&gt;ticket about recent support&lt;/a&gt;.  A minute later danblack replies on IRC with a link to &lt;a href=&quot;https://github.com/grooverdan/puppetlabs-firewall/tree/ticket/10162-firewallchain_support_for_merge&quot;&gt;a branch&lt;/a&gt; that supports creating chains &amp;#8211; the same person that made the recent branch.&lt;/p&gt;
&lt;p&gt;This must be a sign &amp;#8211; the same person helping me with my problem in two different ways, with two branches? &lt;strong&gt;Today will be a git-merging to-the-death hacking session, fueled by the leftovers of yesterday&amp;#8217;s mexicaganza leftovers&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;I start with the branch that lets you create chains, which works well enough, bar some documentation issues.  I create a new branch and merge this one on, ending up in a clean rebase.&lt;/p&gt;
&lt;p&gt;Next is the recent branch.  I merge that one on.  I choose to merge in this case, because I hope it will be easier to make the fixes needed in both branches, but still pull everything together on my portknock branch, and merge in updates every time.&lt;/p&gt;
&lt;p&gt;This branch has more issues &amp;#8211; rake test doesn&amp;#8217;t even pass.  So I start digging through the failing testcases, adding print debugs and learning just enough ruby to be dangerous.&lt;/p&gt;
&lt;p&gt;I slowly get better at fixing bugs.  I create minimal .pp files in my /etc/puppet/manifests so I can test just one rule with e.g. puppet apply manifests/recent.pp&lt;/p&gt;
&lt;p&gt;The firewall module hinges around being able to convert a rule to a hash as expressed in puppet, and back again, so that puppet can know that a rule is already present and does not need to be executed.  I add a conversion unit test for each of the features that tests these basic operations, but I end up actually fixing the bugs by sprinkling print&amp;#8217;s and testing with a single apply.&lt;/p&gt;
&lt;p&gt;I learn to do service iptables restart; service iptables stop to reset my firewall and start cleanly.  It takes me a while to realize when I botched the firewall so that I can&amp;#8217;t even google (in my case, forgetting to have -A INPUT -m state &amp;#8211;state ESTABLISHED,RELATED -j ACCEPT&lt;br /&gt;
) &amp;#8211; not helped by the fact that for the last two weeks the network on my home desktop is really flaky, and simply stops working after some activity, forcing me to restart NetworkManager and reload network modules.&lt;/p&gt;
&lt;p&gt;I start getting an intuition for how puppet&amp;#8217;s basic resource model works.  For example, if a second puppet run produces output, something&amp;#8217;s wrong.  I end up fixing lots of parsing bugs because of that &amp;#8211; once I notice that a run tells me something like&lt;br /&gt;
&lt;code&gt;notice: /Firewall[999 drop all other requests]/chain: chain changed '-p' to 'INPUT'&lt;br /&gt;
notice: Firewall[999 drop all other requests](provider=iptables): Properties changed - updating rule&lt;/code&gt;&lt;br /&gt;
I know that, even though the result seems to work, I have some parsing bug, and I can attack that bug by adding another unit test and adding more prints for a simple rule.&lt;/p&gt;
&lt;p&gt;I learn that, even though the run may seem clean, if the module didn&amp;#8217;t figure out that it already had a rule (again, because of bogus parsing), it just adds the same rule again &amp;#8211; another thing we don&amp;#8217;t want.  That gets fixed on a few branches too.&lt;/p&gt;
&lt;p&gt;And then I get to the point where my puppet apply brings all the rules together &amp;#8211; except it still does not work.  And I notice one little missing rule: ${IPTABLES} -A INPUT -p tcp &amp;#8211;syn -j door&lt;/p&gt;
&lt;p&gt;And I learn about &amp;#8211;syn, and &amp;#8211;tcp-flags, and to my dismay, there is no support for tcp-flags anywhere.  There is a &lt;a href=&quot;http://projects.puppetlabs.com/issues/10025&quot;&gt;ticket for TCP flags matching support&lt;/a&gt;, but nobody worked on it.&lt;/p&gt;
&lt;p&gt;So I think, how hard can it be, with everything I&amp;#8217;ve learned today? And I get onto it.  It turns out it&amp;#8217;s harder than expected.  Before today, all firewall resource properties swallowed exactly one argument &amp;#8211; for example, -p (proto).  In the recent module, some properties are flags, and don&amp;#8217;t have an argument, so I had to support that with some hacks.&lt;/p&gt;
&lt;p&gt;The rule_to_hash function works by taking an iptables rule line, and stripping off the parameters from the back in reverse order one by one, but leaving the arguments there.  At the end, it has a list of keys it saw, and hopefully, a string of arguments that match the keys, but in reverse order.  (I would have done this by stripping the line of both parameter and argument(s) and putting those on a list, but that&amp;#8217;s just me)&lt;/p&gt;
&lt;p&gt;But the &amp;#8211;tcp-flags parameter takes two arguments &amp;#8211; a mask of flags, and a list of flags that needs to be set.  So I hack it in by adding double quotes around it, so it looks the same way a &amp;#8211;comment does (except &amp;#8211;comment is always quoted in iptables &amp;#8211;list-rules output), and handle it specially.  But after some fidgeting, that works too!&lt;/p&gt;
&lt;p&gt;And my final screenshot for the day:&lt;/p&gt;
&lt;div class=&quot;wpg2tag-image&quot;&gt;&lt;a href=&quot;http://thomas.apestaart.org/log/?page_id=862&amp;g2_itemId=71245&quot; title=&quot;knock-puppet&quot;&gt;&lt;img src=&quot;http://thomas.apestaart.org/gallery/main.php?g2_view=core.DownloadItem&amp;g2_itemId=71246&amp;g2_serialNumber=2&quot; width=&quot;150&quot; height=&quot;120&quot; id=&quot;IFid4&quot; class=&quot;ImageFrame_None&quot; alt=&quot;knock-puppet&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;So, today&amp;#8217;s result:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/thomasvs/puppetlabs-firewall/commits/grooverdan-ticket/11100-recent-iptables-module-support&quot;&gt;fixes for the recent module&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/thomasvs/puppetlabs-firewall/tree/ticket/10025-TCP-flags-matching-support&quot;&gt;an implementation of &amp;#8211;tcp-flags&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/thomasvs/puppetlabs-firewall/tree/grooverdan-ticket/10162-firewallchain_support_for_merge&quot;&gt;some small fixes for firewallchain&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/thomasvs/puppetlabs-firewall/tree/portknock&quot;&gt;A feature integration branch pulling all of these together&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now, I have a working node that implements port knocking:&lt;br /&gt;
&lt;code&gt;node 'ana' {&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;    $port1 = '1234'&lt;br /&gt;
    $port2 = '3456'&lt;br /&gt;
    $port3 = '2345'&lt;/p&gt;
&lt;p&gt;    $dports = [22, 3306]&lt;/p&gt;
&lt;p&gt;    $seconds = 5&lt;/p&gt;
&lt;p&gt;    firewall { &quot;000 accept all icmp requests&quot;:&lt;br /&gt;
      proto =&amp;gt; &quot;icmp&quot;,&lt;br /&gt;
      action =&amp;gt; &quot;accept&quot;,&lt;br /&gt;
    }&lt;/p&gt;
&lt;p&gt;    firewall { &quot;001 accept all established connections&quot;:&lt;br /&gt;
      proto =&amp;gt; &quot;all&quot;,&lt;br /&gt;
      state =&amp;gt; [&quot;RELATED&quot;, &quot;ESTABLISHED&quot;],&lt;br /&gt;
      action =&amp;gt; &quot;accept&quot;,&lt;br /&gt;
    }&lt;/p&gt;
&lt;p&gt;    firewall { &quot;999 drop all other requests&quot;:&lt;br /&gt;
      chain =&amp;gt; &quot;INPUT&quot;,&lt;br /&gt;
      proto =&amp;gt; &quot;tcp&quot;,&lt;br /&gt;
      action =&amp;gt; &quot;reject&quot;,&lt;br /&gt;
    }&lt;/p&gt;
&lt;p&gt;    firewallchain { [':stage1:', ':stage2:', ':door:']:&lt;br /&gt;
    }&lt;/p&gt;
&lt;p&gt;    # door&lt;br /&gt;
    firewall { &quot;098 knock2 goes to stage2&quot;:&lt;br /&gt;
      chain =&amp;gt; &quot;door&quot;,&lt;br /&gt;
      recent_command =&amp;gt; &quot;rcheck&quot;,&lt;br /&gt;
      recent_name =&amp;gt; &quot;knock2&quot;,&lt;br /&gt;
      recent_seconds =&amp;gt; $seconds,&lt;br /&gt;
      jump =&amp;gt; &quot;stage2&quot;,&lt;br /&gt;
      require =&amp;gt; [&lt;br /&gt;
	Firewallchain[':door:'],&lt;br /&gt;
	Firewallchain[':stage2:'],&lt;br /&gt;
      ]&lt;br /&gt;
    }&lt;/p&gt;
&lt;p&gt;    firewall { &quot;099 knock goes to stage1&quot;:&lt;br /&gt;
      chain =&amp;gt; &quot;door&quot;,&lt;br /&gt;
      recent_command =&amp;gt; &quot;rcheck&quot;,&lt;br /&gt;
      recent_name =&amp;gt; &quot;knock&quot;,&lt;br /&gt;
      recent_seconds =&amp;gt; $seconds,&lt;br /&gt;
      jump =&amp;gt; &quot;stage1&quot;,&lt;br /&gt;
      require =&amp;gt; [&lt;br /&gt;
	Firewallchain[':door:'],&lt;br /&gt;
	Firewallchain[':stage1:'],&lt;br /&gt;
      ]&lt;br /&gt;
    }&lt;/p&gt;
&lt;p&gt;    firewall { &quot;100 knock on port $port1 sets knock&quot;:&lt;br /&gt;
      chain =&amp;gt; &quot;door&quot;,&lt;br /&gt;
      proto =&amp;gt; 'tcp',&lt;br /&gt;
      recent_name =&amp;gt; 'knock',&lt;br /&gt;
      recent_command =&amp;gt; 'set',&lt;br /&gt;
      dport =&amp;gt; $port1,&lt;br /&gt;
      require =&amp;gt; [&lt;br /&gt;
	Firewallchain[':door:'],&lt;br /&gt;
      ]&lt;br /&gt;
    }&lt;/p&gt;
&lt;p&gt;    # stage 1&lt;br /&gt;
    firewall { &quot;101 stage1 remove knock&quot;:&lt;br /&gt;
      chain =&amp;gt; &quot;stage1&quot;,&lt;br /&gt;
      recent_name =&amp;gt; &quot;knock&quot;,&lt;br /&gt;
      recent_command =&amp;gt; &quot;remove&quot;,&lt;br /&gt;
      require =&amp;gt; Firewallchain[':stage1:'],&lt;br /&gt;
    }&lt;/p&gt;
&lt;p&gt;    firewall { &quot;102 stage1 set knock2 on $port2&quot;:&lt;br /&gt;
      chain =&amp;gt; &quot;stage1&quot;,&lt;br /&gt;
      recent_name =&amp;gt; &quot;knock2&quot;,&lt;br /&gt;
      recent_command =&amp;gt; &quot;set&quot;,&lt;br /&gt;
      proto =&amp;gt; &quot;tcp&quot;,&lt;br /&gt;
      dport =&amp;gt; $port2,&lt;br /&gt;
      require =&amp;gt; Firewallchain[':stage1:'],&lt;br /&gt;
    }&lt;/p&gt;
&lt;p&gt;    # stage 2&lt;br /&gt;
    firewall { &quot;103 stage2 remove knock&quot;:&lt;br /&gt;
      chain =&amp;gt; &quot;stage2&quot;,&lt;br /&gt;
      recent_name =&amp;gt; &quot;knock&quot;,&lt;br /&gt;
      recent_command =&amp;gt; &quot;remove&quot;,&lt;br /&gt;
      require =&amp;gt; Firewallchain[':stage2:'],&lt;br /&gt;
    }&lt;/p&gt;
&lt;p&gt;    firewall { &quot;104 stage2 set heaven on $port3&quot;:&lt;br /&gt;
      chain =&amp;gt; &quot;stage2&quot;,&lt;br /&gt;
      recent_name =&amp;gt; &quot;heaven&quot;,&lt;br /&gt;
      recent_command =&amp;gt; &quot;set&quot;,&lt;br /&gt;
      proto =&amp;gt; &quot;tcp&quot;,&lt;br /&gt;
      dport =&amp;gt; $port3,&lt;br /&gt;
      require =&amp;gt; Firewallchain[':stage2:'],&lt;br /&gt;
    }&lt;/p&gt;
&lt;p&gt;    # let people in heaven&lt;br /&gt;
    firewall { &quot;105 heaven let connections through&quot;:&lt;br /&gt;
      chain =&amp;gt; &quot;INPUT&quot;,&lt;br /&gt;
      proto =&amp;gt; &quot;tcp&quot;,&lt;br /&gt;
      recent_command =&amp;gt; &quot;rcheck&quot;,&lt;br /&gt;
      recent_name =&amp;gt; &quot;heaven&quot;,&lt;br /&gt;
      recent_seconds =&amp;gt; $seconds,&lt;br /&gt;
      dport =&amp;gt; $dports,&lt;br /&gt;
      action =&amp;gt; accept,&lt;br /&gt;
      require =&amp;gt; Firewallchain[':stage2:'],&lt;br /&gt;
    }&lt;/p&gt;
&lt;p&gt;    firewall { &quot;106 connection initiation to door&quot;:&lt;br /&gt;
# FIXME: specifying chain explicitly breaks insert_order !&lt;br /&gt;
      chain =&amp;gt; &quot;INPUT&quot;,&lt;br /&gt;
      proto =&amp;gt; &quot;tcp&quot;,&lt;br /&gt;
      tcp_flags =&amp;gt; &quot;FIN,SYN,RST,ACK SYN&quot;,&lt;br /&gt;
      jump =&amp;gt; &quot;door&quot;,&lt;br /&gt;
      require =&amp;gt; [&lt;br /&gt;
	Firewallchain[':door:'],&lt;br /&gt;
      ]&lt;br /&gt;
    }&lt;br /&gt;
}&lt;/p&gt;&lt;br /&gt;
and I can log in with&lt;br /&gt;
&lt;code&gt;nc -w 1 ana 1234; nc -w 1 ana 3456; nc -w 1 ana 2345; ssh -A ana&lt;/code&gt;
&lt;p&gt;Lessons learned today:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;watch iptables -nvL is an absolutely excellent way of learning more about your firewall &amp;#8211; you see your rules and the traffic on them in real time.  It made it really easy to see for example the first nc command triggering the knock.&lt;/li&gt;
&lt;li&gt;Puppet is reasonably hackable &amp;#8211; I was learning quickly as I progressed through test and bug after test and bug.&lt;/li&gt;
&lt;li&gt;I still don&amp;#8217;t like ruby, and we may never be friends, but at least it&amp;#8217;s something I&amp;#8217;m capable of learning.  Puppet might just end up being the trigger.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tomorrow, I need to clean up the firewall rules into something reusable, and deploy it on the platform.&lt;/p&gt;</content>
		<author>
			<name>Thomas Vander Stichele</name>
			<uri>http://thomas.apestaart.org/log</uri>
		</author>
		<source>
			<title type="html">thomas.apestaart.org</title>
			<subtitle type="html">Present Perfect</subtitle>
			<link rel="self" href="http://thomas.apestaart.org/log/?feed=rss2"/>
			<id>http://thomas.apestaart.org/log/?feed=rss2</id>
			<updated>2012-04-01T14:47:34+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-us">
		<title type="html">1 Mar 2012</title>
		<link href="http://www.advogato.org/person/ensonic/diary.html?start=127"/>
		<id>http://www.advogato.org/person/ensonic/diary.html?start=127</id>
		<updated>2012-03-01T20:52:00+00:00</updated>
		<content type="html">&lt;b&gt;GStreamer &amp;amp; Buzztard&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
As a big leftover promise from my talk at the GStreamer conference in 2011 I spend more time to understand latencies inside GStreamer. For plain playback the latencies are not an issue, but for anything interactive, be it entering notes or changing parameters while the song is playing, we want much lower latencies. For the talk I did some measurements by having a pipeline with two branches - src1 ! sink and src2 ! fx1 ! ... ! fxn ! sink. The fx elements where plain volume elements. The branches where panned hard left and right. For the experiment, I was pulling down the volume on the two sources down to 0 at the same time and recoding the audio on the sink. &lt;a href=&quot;http://files.buzztard.org/latencies/&quot; title=&quot;Looking at the wave&quot;&gt;Looking at the wave&lt;/a&gt;, one could see the delay in the signal that went through the effect-chain. The longer the effect-chain the larger becomes the delay. Don't misunderstand this, GStreamer is properly handling A/V sync. The buffers that get mixed in front of the sink have the same time stamps, the problem is that we have a lot more buffers traveling the the effect-branch. This is because of the queue elements. In buzztard one can freely link generators to effects, effects to effects and effects to sinks. This includes diamond shaped connections. Here we need queues to not stall processing on one branch. It is sufficient for the queues to keep only 1 buffer. Still even knowing the buffer duration, I could not tell a formula to explain the measured delays.&lt;br /&gt;
This month I looked at the issue with a new idea. I wrote a &lt;a href=&quot;http://buzztard.git.sourceforge.net/git/gitweb.cgi?p=buzztard/buzztard;a=blob;f=design/gst/latency.c;hb=HEAD&quot; title=&quot;small example&quot;&gt;small example&lt;/a&gt; that build pipelines close to what I have in buzztard, but stripped of many details. In this code I add buffer probed to all pads. The probe is comparing the time-stamp on the buffer to the pipeline clock. This tells how early the buffer is. Ideally we want buffers to be generated and processed as much in time as possible. When generating audio one needs to configure audio-buffer sizes on the source elements and two properties on the audio-sink - buffer-time and latency-time. A good scheme is to use buffer-time = 2 * latency-time. That configures the sink to have two audio-segments. Initially I also set the buffer sizes on the source elements to have a duration of latency-time. Now one problem with that is that we will have one buffer waiting on each queue. Thus if there are two queues the actual latency is (n-queues + 1) * latency-time. One way to improve that a bit is to half the buffer sizes on the sources, then the 2nd buffer is calculated when the first one is needed. As the first one won't be sufficient to fill the gap, the calculation of the 2nd buffer is scheduled right away. The disadvantage of this scheme is that one gets quite jittery latencies. In the end I settled on finishing the subtick timing in buzztard. Each tick will have n subticks, where n is setup so that we get down to the desired latency. So far I get nice low latency on all my machines (inlcuding a atom based netbook).&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://wiki.buzztard.org/images/e/e8/Bt-edit-0.7.0-01.png&quot;&gt;&lt;img src=&quot;http://wiki.buzztard.org/images/thumb/e/e8/Bt-edit-0.7.0-01.png/120px-Bt-edit-0.7.0-01.png&quot; align=&quot;left&quot; hspace=&quot;10&quot; vspace=&quot;5&quot; /&gt;&lt;/a&gt;We also ported more buzzmachines and have 49 machines right now. When porting we often also fix bugs as gcc is quite good at warnings these days. Finally, the machines now also install docs (where available).&lt;br /&gt;
&lt;br /&gt;
In the UI I got rid of the GtkRuler copy again. The analyzer window now has own code to draw the rulers. I think they look nice, a lot less noisy then the older rulers.&lt;br /&gt;
&lt;br /&gt;
62 files changed, 1957 insertions(+), 1844 deletions(-)</content>
		<author>
			<name>Stefan Kost</name>
			<uri>http://www.advogato.org/person/ensonic/</uri>
		</author>
		<source>
			<title type="html">Advogato blog for ensonic</title>
			<subtitle type="html">Advogato blog for ensonic</subtitle>
			<link rel="self" href="http://www.advogato.org/person/ensonic/rss.xml"/>
			<id>http://www.advogato.org/person/ensonic/rss.xml</id>
			<updated>2012-05-22T21:47:04+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Wacom tablets in GNOME 3.4 (part #2)</title>
		<link href="http://www.hadess.net/2012/02/wacom-tablets-in-gnome-34-part-2.html"/>
		<id>tag:blogger.com,1999:blog-977684764667858073.post-1036501374298607114</id>
		<updated>2012-02-29T16:36:01+00:00</updated>
		<content type="html">Since the &lt;a href=&quot;http://www.hadess.net/2012/01/wacom-tablets-in-gnome-34.html&quot;&gt;last report&lt;/a&gt;, &quot;mapping&quot; has been the order of the day. We now have support for:&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-IKg2ccb-7bo/T041c2mnDgI/AAAAAAAAAcc/X9e5LWc97Xo/s1600/wacom-display.png&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;245&quot; src=&quot;http://1.bp.blogspot.com/-IKg2ccb-7bo/T041c2mnDgI/AAAAAAAAAcc/X9e5LWc97Xo/s320/wacom-display.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;Display mapping&lt;/i&gt;&lt;/div&gt;&lt;br /&gt;Not as pretty as mocked up, but it's functional. We hope to have the nicer version done for the next development cycle.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;and&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-x1tYD0KlpbY/T041b0D_KQI/AAAAAAAAAcU/hnM68QxcDTY/s1600/wacom-buttons.png&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;241&quot; src=&quot;http://4.bp.blogspot.com/-x1tYD0KlpbY/T041b0D_KQI/AAAAAAAAAcU/hnM68QxcDTY/s320/wacom-buttons.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;Button mapping&lt;/i&gt;&lt;/div&gt;&lt;br /&gt;The button mapping will show you the actual keys, with translated names, for your device, instead of every possible combination of buttons which end up doing nothing.&lt;br /&gt;&lt;br /&gt;We've also made a big number of layout changes and fixes, which means that the main window isn't as awkward as it used to be.&lt;br /&gt;&lt;br /&gt;There are a number of features that unfortunately didn't make the cut, mostly due to the lack of support from the X.org drivers. Mode switching currently doesn't &lt;a href=&quot;https://bugzilla.gnome.org/show_bug.cgi?id=670905&quot;&gt;advertise the current mode by changing the LED&lt;/a&gt;, and the &lt;a href=&quot;https://bugzilla.gnome.org/show_bug.cgi?id=671072&quot;&gt;OLEDs that show the bindings for each key&lt;/a&gt; stand empty.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/977684764667858073-1036501374298607114?l=www.hadess.net&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>hadess</name>
			<email>noreply@blogger.com</email>
			<uri>http://hadess.net/</uri>
		</author>
		<source>
			<title type="html">/bɑs ˈtjɛ̃ no ˈse ʁɑ/  (hadess) | News</title>
			<link rel="self" href="http://www.hadess.net/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-977684764667858073</id>
			<updated>2012-05-22T19:17:05+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Y U NO GTK3 YET?</title>
		<link href="http://jeff.ecchi.ca/blog/2012/02/28/y-u-no-gtk3-yet/"/>
		<id>http://jeff.ecchi.ca/blog/?p=2046</id>
		<updated>2012-02-28T23:27:23+00:00</updated>
		<content type="html">&lt;p&gt;Some folks were probably wondering why PiTiVi is still using GTK2. Now you know:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://jeff.ecchi.ca/blog/wp-content/uploads/2012-02-28-12.42.44-levelled.jpg&quot;&gt;&lt;img class=&quot;alignnone size-medium wp-image-2047&quot; title=&quot;2012-02-28--12.42.44 - levelled&quot; src=&quot;http://jeff.ecchi.ca/blog/wp-content/uploads/2012-02-28-12.42.44-levelled-500x298.jpg&quot; alt=&quot;&quot; width=&quot;500&quot; height=&quot;298&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content>
		<author>
			<name>Jean-François Fortin Tam</name>
			<uri>http://jeff.ecchi.ca/blog/</uri>
		</author>
		<source>
			<title type="html">Nekohayo !</title>
			<subtitle type="html">La vie personnelle du chat</subtitle>
			<link rel="self" href="http://jeff.ecchi.ca/blog/feed/"/>
			<id>http://jeff.ecchi.ca/blog/feed/</id>
			<updated>2012-05-19T22:17:22+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Collabora and Fluendo collaborate fluently!</title>
		<link href="http://thomas.apestaart.org/log/?p=1443"/>
		<id>http://thomas.apestaart.org/log/?p=1443</id>
		<updated>2012-02-27T12:01:14+00:00</updated>
		<content type="html">&lt;p&gt;Well, this sure has been a long time in the making.  &lt;/p&gt;
&lt;p&gt;Fluendo and Collabora have a checkered past which I won&amp;#8217;t get into, but on paper it has always made sense for these two companies to collaborate and making GStreamer work commercially.  One company specializes in products, the other in consulting (I&amp;#8217;m sure you can figure out which is which), and complement each other perfectly to make GSstreamer more successful commercially.&lt;/p&gt;
&lt;p&gt;I personally have always believed that we need to get GStreamer to other platforms and make them as easy to use as possible.  Windows was an obvious target in the past, and now Android is another.  There is a big difference between a successful open source project, and a commercially successful one.  Flumotion&amp;#8217;s &lt;a href=&quot;http://www.ylatuya.es/&quot;&gt;Andoni Morales&lt;/a&gt; who came with me to the GStreamer 0.11 hackfest in Malaga is going to be working on this one SDK to rule them all.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://blogs.gnome.org/uraeus/2012/02/27/collabora-and-fluendo-partners-to-invest-in-gstreamer/&quot;&gt;Christian&lt;/a&gt; beat me to it in the blogosphere, but the word is now officially out! Feel free to read Fluendo&amp;#8217;s &lt;a href=&quot;http://www.fluendo.com/press/collabora-and-fluendo-invest-gstreamer-open-source-multimedia-framework/&quot;&gt;press release&lt;/a&gt;.&lt;/p&gt;</content>
		<author>
			<name>Thomas Vander Stichele</name>
			<uri>http://thomas.apestaart.org/log</uri>
		</author>
		<source>
			<title type="html">thomas.apestaart.org</title>
			<subtitle type="html">Present Perfect</subtitle>
			<link rel="self" href="http://thomas.apestaart.org/log/?feed=rss2"/>
			<id>http://thomas.apestaart.org/log/?feed=rss2</id>
			<updated>2012-04-01T14:47:34+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Collabora and Fluendo partners to invest in GStreamer</title>
		<link href="http://blogs.gnome.org/uraeus/2012/02/27/collabora-and-fluendo-partners-to-invest-in-gstreamer/"/>
		<id>http://blogs.gnome.org/uraeus/?p=1827</id>
		<updated>2012-02-27T10:54:24+00:00</updated>
		<content type="html">&lt;p&gt;So working up to MWC in Barcelona this week we just announced a great new effort by Collabora and Fluendo around the GStreamer project. The goal is to ease adoption of GStreamer by making sure that no matter what platform you are in, there are well tested and easy to install and use binaries of GStreamer available. This means that not matter if you are running Windows, MacOS X or Linux, you will have a GStreamer SDK available to use. Eventually we will also cover various embedded platforms with this SDK, making it easier than ever to use GStreamer to create great cross platform multimedia applications. You can find out more about this effort by checking out &lt;a href=&quot;http://www.collabora.com/press/2012/02/collabora-and-fluendo-invest-in-gstreamer-open-source-multimedia-framework.html&quot;&gt;the press release which have all the relevant details.&lt;/a&gt;&lt;/p&gt;</content>
		<author>
			<name>Christian Schaller</name>
			<uri>http://blogs.gnome.org/uraeus</uri>
		</author>
		<source>
			<title type="html">Christian Schaller</title>
			<subtitle type="html">GStreamer news and more</subtitle>
			<link rel="self" href="http://blogs.gnome.org/uraeus/feed/"/>
			<id>http://blogs.gnome.org/uraeus/feed/</id>
			<updated>2012-05-22T21:47:03+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Marché du travail</title>
		<link href="http://jeff.ecchi.ca/blog/2012/02/24/marche-du-travail/"/>
		<id>http://jeff.ecchi.ca/blog/?p=2044</id>
		<updated>2012-02-25T00:41:58+00:00</updated>
		<content type="html">&lt;p&gt;J&amp;#8217;ai terminé mes études en décembre dernier. J&amp;#8217;ai décroché un emploi comme testeur chez &lt;a href=&quot;http://collabora.com&quot;&gt;Collabora&lt;/a&gt; il y a environ une semaine. C&amp;#8217;est une nouvelle étape qui commence, on verra où ça me mènera :)&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-2044&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Note: ça n&amp;#8217;a rien à voir avec &lt;a href=&quot;http://pitivi.org&quot;&gt;PiTiVi&lt;/a&gt;, auquel je continue de contribuer par loisir.&lt;/p&gt;</content>
		<author>
			<name>Jean-François Fortin Tam</name>
			<uri>http://jeff.ecchi.ca/blog/</uri>
		</author>
		<source>
			<title type="html">Nekohayo !</title>
			<subtitle type="html">La vie personnelle du chat</subtitle>
			<link rel="self" href="http://jeff.ecchi.ca/blog/feed/"/>
			<id>http://jeff.ecchi.ca/blog/feed/</id>
			<updated>2012-05-19T22:17:22+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Export-macosx alt=</title>
		<link href="http://codeanticode.wordpress.com/2012/02/23/gsvideo-tips/"/>
		<id>http://codeanticode.wordpress.com/?p=1465</id>
		<updated>2012-02-24T02:10:38+00:00</updated>
		<content type="html"></content>
		<author>
			<name>Gustavo Orrillo</name>
			<uri>http://codeanticode.wordpress.com/</uri>
		</author>
		<source>
			<title type="html">codeanticode</title>
			<link rel="self" href="http://codeanticode.wordpress.com/feed/"/>
			<id>http://codeanticode.wordpress.com/feed/</id>
			<updated>2012-05-10T18:47:08+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Syphon Processing</title>
		<link href="http://codeanticode.wordpress.com/2012/02/21/syphon-client-working-in-processing/"/>
		<id>http://codeanticode.wordpress.com/?p=1449</id>
		<updated>2012-02-21T23:54:24+00:00</updated>
		<content type="html"></content>
		<author>
			<name>Gustavo Orrillo</name>
			<uri>http://codeanticode.wordpress.com/</uri>
		</author>
		<source>
			<title type="html">codeanticode</title>
			<link rel="self" href="http://codeanticode.wordpress.com/feed/"/>
			<id>http://codeanticode.wordpress.com/feed/</id>
			<updated>2012-05-10T18:47:08+00:00</updated>
		</source>
	</entry>

</feed>

