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

  <title>Planet Debian</title>
  <link rel="self" href="http://planet.debian.org/atom.xml"/>
  <link href="http://planet.debian.org/"/>
  <id>http://planet.debian.org/atom.xml</id>
  <updated>2012-02-13T22:38:24+00:00</updated>
  <generator uri="http://intertwingly.net/code/venus/">http://intertwingly.net/code/venus/</generator>


  <entry xml:lang="en">
	<title type="html" xml:lang="en">Mini-sendmail... in bash</title>
	<link href="http://blog.beuc.net/posts/Mini-sendmail..._in_bash/"/>
	<id>http://blog.beuc.net/posts/Mini-sendmail..._in_bash/</id>
	<updated>2012-02-13T22:19:22+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;I recently faced an environment where there is no MTA.&lt;/p&gt;

&lt;p&gt;WTF? The reason is that people who work there get security audits on a regular basis, and the security people are usually mo...deratly skilled guys that blindly run a set of scripts, e.g. by ordering to disable Apache modules that &quot;where seen enabled in /etc/apache2/mods-available/&quot;...&lt;/p&gt;

&lt;p&gt;To avoid spending days arguing with them and nitpicking with non-technical managers, the system is trimmed to the minimum - and there no MTA.
No MTA, so no cron output, so difficulty to understand why last night&#39;s cron job failed miserably.&lt;/p&gt;

&lt;p&gt;Since it was not my role to reshape the whole business unit, I decided to hack a super-light, but functional way to get my cron output:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;cat &amp;lt;&amp;lt;&#39;EOF&#39; &amp;gt; /usr/sbin/sendmail
#!/bin/bash
(
    echo &quot;From me  $(LANG=C date)&quot;
    cat
    echo
) &amp;gt;&amp;gt; /var/mail/all
chmod 755 /usr/sbin/sendmail
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It works! &lt;img src=&quot;http://blog.beuc.net/tags/planet_debian/../../smileys/smile.png&quot; alt=&quot;:)&quot; /&gt;&lt;/p&gt;

&lt;p&gt;There is a companion logrotate script, to avoid filling the file system:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;cat &amp;lt;&amp;lt;&#39;EOF&#39; &amp;gt; /etc/logrotate.d/mail-all
/var/mail/all {
  daily
  rotate 10
  compress
  delaycompress
  notifempty
  create 722 root mail
}
EOF
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Bootstrap with:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;touch /var/mail/all
logrotate -f /var/mail/all
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You now can check your sys-mails with:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;mutt -f /var/mail/all
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;img src=&quot;http://blog.beuc.net/tags/planet_debian/../../smileys/smile4.png&quot; alt=&quot;;)&quot; /&gt;&lt;/p&gt;</content>
	<author>
	  <name>Beuc's Blog</name>
	   <uri>http://blog.beuc.net/tags/planet_debian/</uri> 
	</author>
	<source>
	  <title type="html">pages tagged planet debian</title>
	  <subtitle type="html">Beuc&#39;s Blog</subtitle>
	  <link rel="self" href="http://blog.beuc.net/tags/planet_debian/index.atom"/>
	  <id>http://blog.beuc.net/tags/planet_debian/</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">Quasi-Private Resources</title>
	<link href="http://mako.cc/copyrighteous/20120213-00"/>
	<id>http://mako.cc/copyrighteous/20120213-00</id>
	<updated>2012-02-13T17:37:32+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;&lt;a href=&quot;https://public.resource.org/&quot; class=&quot;reference external&quot;&gt;Public Resource&lt;/a&gt; republishes many court documents. Although these
documents are all part of the public record and PR will not take them
down because someone finds their publication uncomfortable, PR &lt;a href=&quot;https://public.resource.org/court_cases.html&quot; class=&quot;reference external&quot;&gt;will
evaluate and honor some requests&lt;/a&gt; to remove documents from search
engine results. Public Resources does so using a &lt;a href=&quot;http://www.robotstxt.org/robotstxt.html&quot; class=&quot;reference external&quot;&gt;robots.txt&lt;/a&gt; file
or &quot;robot exclusion protocol&quot; which websites use to, among other
things, tell search engine&#39;s web crawling &quot;robots&quot; which pages they do
not want to be indexed and included in search results.  Originally,
the files were mostly used to keep robots from abusing server
resources by walking through infinite lists of automatically generated
pages or to block search engines from including user-contributed
content that might include spam.&lt;/p&gt;
&lt;p&gt;The result for Public Resource, however, is that PR is now publishing,
in the form of &lt;a href=&quot;http://bulk.resource.org/robots.txt&quot; class=&quot;reference external&quot;&gt;its robots.txt&lt;/a&gt;, a list of all of the cases that
people have successfully requested to be made less visible!&lt;/p&gt;
&lt;p&gt;In Public Resource&#39;s case, this is is the result of a careful
decision; PR makes the arrangement clear in &lt;a href=&quot;https://public.resource.org/court_cases.html&quot; class=&quot;reference external&quot;&gt;on their website&lt;/a&gt;.  The
&lt;a href=&quot;http://www.robotstxt.org/robotstxt.html&quot; class=&quot;reference external&quot;&gt;robots.txt home page&lt;/a&gt; also explains the situation saying, &quot;the
/robots.txt file is a publicly available file. Anyone can see what
sections of your server you don&#39;t want robots to use,&quot;, and &quot;don&#39;t try
to use /robots.txt to hide information.&quot;&lt;/p&gt;
&lt;p&gt;That said, I&#39;ve looked at a bunch of robots.txt files on websites I
have visited recently and, sadly, I&#39;ve found many sites that use
robots.txt as a form of weak security. This is very dangerous.&lt;/p&gt;
&lt;p&gt;Some poorly designed robots simply ignore the robots.txt file. But one
can also imagine an evil search engine that uses a web-crawler that
does the opposite of what it&#39;s told and &lt;em&gt;only&lt;/em&gt; indexes these &quot;hidden&quot;
pages.  This evil crawler might look for particular keywords or use
existing search engine data to check for incoming links in order to
construct a list of pages whose existence is only made public through
a file meant to keep people away.&lt;/p&gt;
&lt;p&gt;Check your own robots.txt and ask yourself what it might reveal. By
advertising the existence and locations of your secrets, the act of
&quot;hiding&quot; might make your data even less private.&lt;/p&gt;</content>
	<author>
	  <name>Benjamin Mako Hill</name>
	   <uri>http://mako.cc/copyrighteous</uri> 
	</author>
	<source>
	  <title type="html">Copyrighteous</title>
	  
	  <link rel="self" href="http://mako.cc/copyrighteous/?flav=rss"/>
	  <id>http://mako.cc/copyrighteous</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">eSpeak GUI 0.4 is out!</title>
	<link href="http://bloc.eurion.net/archives/2012/espeak-gui-0-4/"/>
	<id>http://bloc.eurion.net/?p=1907</id>
	<updated>2012-02-13T15:29:56+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;A few of you may remember &lt;a href=&quot;https://launchpad.net/espeak-gui&quot;&gt;espeak-gui&lt;/a&gt;, a graphical user interface for eSpeak I did &lt;a href=&quot;http://bloc.eurion.net/archives/2010/introducing-espeak-gui/&quot;&gt;release two years ago&lt;/a&gt;. While I haven’t been dedicating much time to it, it’s still alive and I’m happy to announce its fourth release!&lt;/p&gt;
&lt;p&gt;This new release introduced automatic language guessing, a feature I’ve &lt;a href=&quot;http://bloc.eurion.net/archives/2010/language-identification-and-free-software/&quot;&gt;wanted for a while&lt;/a&gt;, as well as spell checking (contributed by Joe Burmeister).&lt;/p&gt;
&lt;p&gt;Version 0.3, released a year ago and which I didn’t announce here, did also introduce Undo/Redo, pausing, file history logging, a bunch of translations and some voice options. It’s sister project, &lt;a href=&quot;https://launchpad.net/python-espeak&quot;&gt;python-espeak&lt;/a&gt;, did also get some bug fixes since its first release.&lt;/p&gt;
&lt;p&gt;As usual, &lt;a href=&quot;https://launchpad.net/~rainct/+archive/voice/+packages&quot;&gt;packages for both espeak-gui and python-espeak&lt;/a&gt; are available in &lt;a href=&quot;https://launchpad.net/~rainct/+archive/voice/&quot;&gt;my PPA&lt;/a&gt;, and since last month in &lt;a href=&quot;http://packages.debian.org/sid/espeak-gui&quot;&gt;Debian unstable&lt;/a&gt;. Make sure you also install &lt;strong&gt;libtextcat0&lt;/strong&gt; (version 2.2-8 or newer) to get the language identification support.&lt;/p&gt;
&lt;p&gt;Related posts:&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;http://bloc.eurion.net/archives/2010/espeak-gui-0-2/&quot; rel=&quot;bookmark&quot; title=&quot;espeak-gui 0.2&quot;&gt;espeak-gui 0.2&lt;/a&gt; &lt;small&gt;Yesterday I did a first release of espeak-gui, so while...&lt;/small&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://bloc.eurion.net/archives/2010/introducing-espeak-gui/&quot; rel=&quot;bookmark&quot; title=&quot;Introducing espeak-gui&quot;&gt;Introducing espeak-gui&lt;/a&gt; &lt;small&gt;I’m joining the hype of presenting little new projects there...&lt;/small&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://bloc.eurion.net/archives/2009/here-is-zeitgeist-0-2-1/&quot; rel=&quot;bookmark&quot; title=&quot;Here is Zeitgeist 0.2.1!&quot;&gt;Here is Zeitgeist 0.2.1!&lt;/a&gt; &lt;small&gt;One month after the first Zeitgeist release (0.2), here is...&lt;/small&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://bloc.eurion.net/?flattrss_redirect&amp;amp;id=1907&amp;amp;md5=6b69a56c96bd250264af0b2944094f77&quot; target=&quot;_blank&quot; title=&quot;Flattr&quot;&gt;&lt;img src=&quot;http://bloc.eurion.net/wp-content/plugins/flattr/img/flattr-badge-large.png&quot; alt=&quot;flattr this!&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content>
	<author>
	  <name>RainCT</name>
	   <uri>http://bloc.eurion.net</uri> 
	</author>
	<source>
	  <title type="html">Eurion · RainCT's Blog » Planet Debian</title>
	  <subtitle type="html">I would love to change the world, but they won&#39;t give me the source code...</subtitle>
	  <link rel="self" href="http://bloc.eurion.net/archives/category/debian-planet/feed/"/>
	  <id>http://bloc.eurion.net</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en-us">phpMyAdmin translations status</title>
	<link href="http://blog.cihar.com/archives/2012/02/13/phpmyadmin-translations-status/?utm_source=rss2"/>
	<id>http://blog.cihar.com/archives/2012/02/13/phpmyadmin-translations-status/?utm_source=rss2</id>
	<updated>2012-02-13T11:00:00+00:00</updated>
	<summary type="html" xml:lang="en-us"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;As &lt;a href=&quot;http://www.phpmyadmin.net/&quot;&gt;phpMyAdmin&lt;/a&gt; is approaching to 3.5 release, it has come time to share about &lt;a href=&quot;https://l10n.cihar.com/projects/phpmyadmin/&quot;&gt;translations&lt;/a&gt; status. Here comes third round of translation status update.&lt;/p&gt;
&lt;p&gt;Since last update we have one new translation at 100%, but one has dropped from the list:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Czech&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;English (Great Britain)&lt;/li&gt;
&lt;li&gt;Russian&lt;/li&gt;
&lt;li&gt;Slovenian&lt;/li&gt;
&lt;li&gt;Spanish&lt;/li&gt;
&lt;li&gt;Swedish&lt;/li&gt;
&lt;li&gt;Turkish&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There are few which are really close to 100% and I hope they will get there soon:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;French&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Danish&lt;/li&gt;
&lt;li&gt;Japanese&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Polish&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As you can see, traveling around FOSDEM was really useful for Czech translation, which I&#39;ve managed to complete during that weekend (+ Monday when I traveled to Nuremberg).&lt;/p&gt;
&lt;p&gt;There was great amount of work done on Polish translation, so hopefully it will be on 100% in next report. Also Rouslan is progressing quite well on Italian, but there is still fair amount of work to be done.&lt;/p&gt;
&lt;p&gt;Was your language not mentioned? It&#39;s now perfect time to &lt;a href=&quot;http://www.phpmyadmin.net/home_page/improve.php#translate&quot;&gt;contribute to it&lt;/a&gt;.&lt;/p&gt;

&lt;p style=&quot;font-size: smaller;&quot;&gt;
Filed under: 


&lt;a href=&quot;http://blog.cihar.com/archives/english/&quot;&gt;English&lt;/a&gt;

&lt;a href=&quot;http://blog.cihar.com/archives/phpmyadmin/&quot;&gt;Phpmyadmin&lt;/a&gt;

|

&lt;a href=&quot;http://blog.cihar.com/archives/2012/02/13/phpmyadmin-translations-status/#comments&quot;&gt;0 comments&lt;/a&gt;
|
&lt;a href=&quot;http://flattr.com/thing/59773/Michal-Cihars-Weblog&quot;&gt;Flattr this!&lt;/a&gt;
&lt;/p&gt;</content>
	<author>
	  <name>Michal Čihař</name>
	   <email>michal@cihar.com</email> 
	</author>
	<source>
	  <title type="html">Michal Čihař's Weblog, posts tagged by English</title>
	  <subtitle type="html">Random thoughts about everything tagged by English</subtitle>
	  <link rel="self" href="http://blog.cihar.com/archives/english/index-rss.xml"/>
	  <id>http://blog.cihar.com/archives/english/</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">Debian Wheezy: US$19 Billion. Your price… FREE!</title>
	<link href="http://blog.james.rcpt.to/2012/02/13/debian-wheezy-us19-billion-your-price-free/"/>
	<id>http://blog.james.rcpt.to/?p=446</id>
	<updated>2012-02-13T06:27:50+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;As many would know, &lt;a href=&quot;http://www.debian.org/&quot; target=&quot;_blank&quot;&gt;Debian GNU/Linux&lt;/a&gt; is one of the oldest, and the largest Linux distributions that is available for free. Since it was first released in 1993, several people have analysed the size and produced cost estimates for the project.&lt;/p&gt;
&lt;p&gt;In 2001, Jesús M. González-Barahona et al produced an article entitled “&lt;a href=&quot;http://web.archive.org/web/20080503001817/http://people.debian.org/~jgb/debian-counting/counting-potatoes/&quot; target=&quot;_blank&quot;&gt;Counting Potatoes&lt;/a&gt;“, an analysis of Debian 2.2 (code named &lt;em&gt;Potato&lt;/em&gt;). When Potato was released in June 2003, it contained 2,800 source packages of software, totalling around &lt;strong&gt;55 million lines of source code&lt;/strong&gt;. When using David A. Wheeler’s &lt;a href=&quot;http://www.dwheeler.com/sloccount/&quot; target=&quot;_blank&quot;&gt;sloccount&lt;/a&gt; tool to apply the &lt;a href=&quot;http://en.wikipedia.org/wiki/COCOMO&quot; target=&quot;_blank&quot;&gt;COCOMO &lt;/a&gt;model of development, and an average developer salary of US$56,000, the projected development cost that González-Barahona calculated to start-from-scratch and build Debian 2.2 in 2003 &lt;strong&gt;was US$1.9 billion&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;In 2007 an analysis entitled ‘&lt;a href=&quot;http://www.springerlink.com/content/c516h8t6l16251l5/&quot;&gt;Macro-level software evolution: a case study of a large software compilation&lt;/a&gt;‘ by Jesús M. González-Barahona, Gregorio Robles, Martin Michlmayr, Juan José Amor and Daniel M. German was released. It found that Debian 4.0 (codename &lt;em&gt;Etch&lt;/em&gt; released April 2007) had just over 10,000 source packages of software and &lt;strong&gt;288 million lines of source code&lt;/strong&gt;. This analysis also delved into the dependencies of software packages, and the update flow between Debian release (not all packages are updated with each release).&lt;/p&gt;
&lt;p&gt;Today (February 2012) the current development version of Debian, codenamed Wheezy, contains some 17,141 source packages of software, but as it’s still in development this number may change over the coming months.&lt;/p&gt;
&lt;p&gt;I analysied the source code in Wheezy, looking at the content from the “original” software that Debian distributes from its upstream authors without including the additional patches that Debian Developers apply to this software, or the package management scripts (used to install, configure and de-install packages). One might argue that these patches and configuration scripts are the added value of Debian, however the in my analysis I only examined the ‘pristine’ upstream source code.&lt;/p&gt;
&lt;p&gt;By using David A Wheeler’s sloccount tool and average wage of a developer of US$72,533 (using median estimates from Salary.com and PayScale.com for 2011) I summed the individual results to find a total of &lt;strong&gt;419,776,604&lt;/strong&gt; source lines of code for the ‘pristine’ upstream sources, in 31 programming languages — including 429 lines of Cobol and 1933 lines of Modula3!&lt;/p&gt;
&lt;p&gt;In my analysis the projected cost of producing &lt;strong&gt;Debian Wheezy in February 2012 is US$19,070,177,727 (AU$17.7B, EUR€14.4B, GBP£12.11B)&lt;/strong&gt;, making each package’s upstream source code wrth an average of &lt;strong&gt;US$1,112,547.56 (AU$837K)&lt;/strong&gt; to produce. Impressively, this is all free (of &lt;em&gt;cost&lt;/em&gt;).&lt;/p&gt;
&lt;h2&gt;Zooming in on the Linux “Kernel”&lt;/h2&gt;
&lt;p&gt;In 2004 David A. Wheeler did a &lt;a href=&quot;http://www.dwheeler.com/essays/linux-kernel-cost.html&quot; target=&quot;_blank&quot;&gt;cost analysis of the Linux Kernel&lt;/a&gt; project by itself. He found 4,000,000 source lines of code (&lt;strong&gt;&lt;em&gt;SLOC&lt;/em&gt;&lt;/strong&gt;), and a projected cost between &lt;strong&gt;US$175M and US$611M&lt;/strong&gt; depending on the complexity rating of the software. Within my analysis above, I used the ‘standard’ (default) complexity with the adjusted salary for 2011 (US$72K), and deducted that Kernel version 3.1.8 with almost 10,000,000 lines of source code would be worth US$540M at standard complexity, or US$1,877M when rated as ‘complex’.&lt;/p&gt;
&lt;p&gt;Another &lt;a href=&quot;http://linuxcost.blogspot.com.au/2011/03/cost-of-linux.html&quot;&gt;Kernel Costing&lt;/a&gt; in 2011 put this figure at US$3 billion, so perhaps there’s some more variance in here to play with.&lt;/p&gt;
&lt;h2&gt;Individual Projects&lt;/h2&gt;
&lt;p&gt;Other highlights by project included:&lt;/p&gt;
&lt;table style=&quot;text-align: center;&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align: center;&quot;&gt;Project&lt;/th&gt;
&lt;th style=&quot;text-align: center;&quot;&gt;Version&lt;/th&gt;
&lt;th style=&quot;text-align: center;&quot;&gt;Thousands&lt;br /&gt;
of &lt;abbr title=&quot;Source Lines of Code&quot;&gt;SLOC&lt;/abbr&gt;&lt;/th&gt;
&lt;th style=&quot;text-align: center;&quot;&gt;Projected cost&lt;br /&gt;
at US$72,533/developer/year&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Samba&lt;/td&gt;
&lt;td&gt;3.6.1&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;2,000&lt;/td&gt;
&lt;td style=&quot;text-align: center; color: green;&quot;&gt;US$101 (AU$93M)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Apache&lt;/td&gt;
&lt;td&gt;2.2.9&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;693&lt;/td&gt;
&lt;td style=&quot;text-align: center; color: green;&quot;&gt;US$33.5M (AU$31M)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MySQL&lt;/td&gt;
&lt;td&gt;5.5.17&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;1,200&lt;/td&gt;
&lt;td style=&quot;text-align: center; color: green;&quot;&gt;US$64.2M (AU$59.7M)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Perl&lt;/td&gt;
&lt;td&gt;5.14.2&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;669&lt;/td&gt;
&lt;td style=&quot;text-align: center; color: green;&quot;&gt;US$32.3M (AU$30M)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PHP&lt;/td&gt;
&lt;td&gt;5.3.9&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;693&lt;/td&gt;
&lt;td style=&quot;text-align: center; color: green;&quot;&gt;US$33.5M (AU$31.1M)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bind&lt;/td&gt;
&lt;td&gt;9.7.3&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;319&lt;/td&gt;
&lt;td style=&quot;text-align: center; color: green;&quot;&gt;US$14.8M (AU$13.8M)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Moodle&lt;/td&gt;
&lt;td&gt;1.9.9&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;396&lt;/td&gt;
&lt;td style=&quot;text-align: center; color: green;&quot;&gt;US$18.6M (AU$17.3M)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dasher&lt;/td&gt;
&lt;td&gt;4.11&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;109&lt;/td&gt;
&lt;td style=&quot;text-align: center; color: green;&quot;&gt;US$4.8M (AU$4.4M)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DVSwitch&lt;/td&gt;
&lt;td&gt;0.8.3.6&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;6&lt;/td&gt;
&lt;td style=&quot;text-align: center; color: green;&quot;&gt;US$250K (AU$232K)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Debian Wheezy by Programming Language&lt;/h2&gt;
&lt;p&gt;The upstream code that Debian distributes is written in many different languages. ANSI C with 168,536,758 is the dominant language (40% of all lines), followed by C++ at 83,187,329 (20%) and Java with 34,698,990 (8%).&lt;/p&gt;
&lt;div style=&quot;width: 740px;&quot; id=&quot;attachment_447&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;a href=&quot;http://blog.james.rcpt.to/wp-uploads/2012/02/Languages-of-Debian-Wheezy-2012-02-09.jpg&quot;&gt;&lt;img src=&quot;http://blog.james.rcpt.to/wp-uploads/2012/02/Languages-of-Debian-Wheezy-2012-02-09.jpg&quot; title=&quot;Languages of Debian Wheezy&quot; height=&quot;490&quot; width=&quot;730&quot; alt=&quot;Line chart&quot; class=&quot;size-full wp-image-447&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Break down of Wheezy by Language&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;If you are intersted in finding the line count and cost projections for any of the 17,000+ projects, you will find them in the &lt;a href=&quot;http://www.james.rcpt.to/2012/Counting-Debian/Debian-Wheezy-20120209-SLOC-Cost.csv.gz&quot;&gt;raw data CSV&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Other Tools and Comparisons&lt;/h2&gt;
&lt;p&gt;Ohcount is another source code cost analysis tool. In March 2011 Ohcount was run across Debian Sid: &lt;a href=&quot;http://qa.debian.org/daca/ohcount/sid/&quot;&gt;its results are here&lt;/a&gt;. In comparison, its results  appear much lower than the sloccount tool. There’s also the &lt;a href=&quot;http://www.ohloh.net/p/debian/estimated_cost&quot;&gt;Ohloh.net Debian Estimate&lt;/a&gt; which only finds 55 Million source lines of code and a projected cost of US$1B. However Ohloh uses Ohcount for its estimates, and seems to be to be around 370 million SLOC missing compared to my recent analysis.&lt;/p&gt;
&lt;h2&gt;Summary&lt;/h2&gt;
&lt;p&gt;Over the last 10 years the cost to develop Debian has increased ten-fold. It’s intersting to know that US$19 billion of software is available to use, review, extend, and share, for the bargain price of &lt;strong&gt;$0&lt;/strong&gt;. If we were to add in Debian patches and install scripts then this projected figure would increase. If only more organisations would realise the potential they have before them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Need help with Linux (including Debian), Perl, or AWS? See &lt;a href=&quot;http://www.jamesbromberger.com/&quot;&gt;www.jamesbromberger.com&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;</content>
	<author>
	  <name>james</name>
	   <uri>http://blog.james.rcpt.to</uri> 
	</author>
	<source>
	  <title type="html">JEB's Blog » Linux</title>
	  <subtitle type="html">Scribblings of a Techie</subtitle>
	  <link rel="self" href="http://blog.james.rcpt.to/category/computing/linux/feed/"/>
	  <id>http://blog.james.rcpt.to</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">Mexico City Metro project</title>
	<link href="http://gwolf.org/blog/mexico-city-metro-project"/>
	<id>http://gwolf.org/3142 at http://gwolf.org</id>
	<updated>2012-02-13T05:13:39+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;Some days ago, reading my local &lt;a href=&quot;http://couchsurfing.org/&quot;&gt;Couchsurfing groups&lt;/a&gt;, I stumbled across an &lt;a href=&quot;http://www.couchsurfing.org/group_read.html?gid=1872&amp;amp;post=11230470&quot;&gt;announcement by Australian Peter Davies&lt;/a&gt; to go to each of the 148 stations in the Mexico City Metro system, take some photos of the environment, and document on his impressions.&lt;/p&gt;
&lt;p&gt;I have followed and enjoyed the &lt;a href=&quot;http://mexicocitymetro.wordpress.com/&quot;&gt;Mexico City Metro blog&lt;/a&gt; since I learnt of it, and have grown used to looking forward to the daily post-or-two. Peter writes each of his entries both in English and Spanish (you can tell it&#39;s not a native Spanish, but it&#39;s a good effort). He has been doing the stations in a very well distributed order (I cannot say it&#39;s completely random, but it&#39;s surely not lineal or methodical).&lt;/p&gt;
&lt;p&gt;I connected wiht his project as I love discovering the city more or less the same way, but with a different system: I try to have at least one long bike ride every two weeks (being &quot;long&quot; something over 40Km). I usually go either to the North or to downtown and to the East by the good old route I always take, and on my way back, at some point I decide just to turn right or left and discover yet another village slurped by the city. I don&#39;t usually take pictures, as I&#39;m too much into the cycling thrill, left-right-left-right... But cycling has led me to appropriate my city (I don&#39;t know if that&#39;s proper English), to make my city really mine, to get to know parts of it I&#39;d never otherwise go to.&lt;/p&gt;
&lt;p&gt;Anyway, Peter&#39;s is a great way to document urban life. I&#39;m in love with my city, and with expressions of urban appropriation. I loved his project, and if you are interested by what I say, go take a look at his wanderings in the city. I have suggested him two bits to check, but the work is very much an artist&#39;s — He accepts my input, but quite probably he will do whatever he pleases ;-) In case any of you is interested in contacting him, I can tell you for a fact he replies :-)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;[*]&lt;/b&gt; And what is CouchSurfing? Oh, a great community where you can offer a space to crash at your house for unknown people from all around the world. I have never requested a couch, as the Free Software community is much more tightly knit, but I have offered it to several interesting people.&lt;/p&gt;</content>
	<author>
	  <name>gwolf</name>
	   <uri>http://gwolf.org</uri> 
	</author>
	<source>
	  <title type="html">Gunnar Wolf</title>
	  
	  <link rel="self" href="http://gwolf.org/rss.xml"/>
	  <id>http://gwolf.org</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">Cooling a Thinkpad</title>
	<link href="http://etbe.coker.com.au/2012/02/13/cooling-thinkpad/"/>
	<id>http://etbe.coker.com.au/?p=3182</id>
	<updated>2012-02-13T04:14:06+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;Late last year I wrote about &lt;a href=&quot;http://etbe.coker.com.au/2011/09/09/modern-laptops-suck/&quot;&gt;the way that modern laptops suck [1]&lt;/a&gt;. One of the problems that inspired that post was the excessive heat generated by my Thinkpad T61.&lt;/p&gt;
&lt;p&gt;There is a partial solution to this, &lt;a href=&quot;http://foolcontrol.org/?p=1511&quot;&gt;Fool Control explains how the kernel option &lt;b&gt;pcie_aspm=force&lt;/b&gt; can be used on kernels from 2.6.38 onwards to solve a heat regression problem [2]&lt;/a&gt;. I applied this to my Thinkpad T61 and the result was that on a cool evening (ambient temperature about 24C) the temperature changed from 85C to 66C on the NVidia video card, and for the “virtual devices” it changed from 80C and 78C to 60C and 61C. I’m not sure exactly what each of those measurements refers to, but it seems that the change was somewhere between 17C and 20C.&lt;/p&gt;
&lt;p&gt;This changes the system from being almost unbearable to use to being merely annoyingly warm.&lt;/p&gt;
&lt;p&gt;I’m not going to make my laptop be my primary computing device again though, &lt;a href=&quot;http://etbe.coker.com.au/2011/09/08/laptop-to-cloud-lifestyle/&quot;&gt;the combination of a desktop system with a 27″ monitor and an Android phone is working quite well for me [3]&lt;/a&gt;. But I haven’t yet got version control systems working for all my software. Also Wouter suggested using NBD which is something I haven’t got working yet and probably won’t until I can swap on it and therefore have a diskless workstation. Finally I still haven’t got the “Chrome to Phone” browser extension working such that a page I’m viewing at home can be loaded on my phone.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;[1]&lt;a href=&quot;http://etbe.coker.com.au/2011/09/09/modern-laptops-suck/&quot;&gt; http://etbe.coker.com.au/2011/09/09/modern-laptops-suck/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[2]&lt;a href=&quot;http://foolcontrol.org/?p=1511&quot;&gt; http://foolcontrol.org/?p=1511&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[3]&lt;a href=&quot;http://etbe.coker.com.au/2011/09/08/laptop-to-cloud-lifestyle/&quot;&gt; http://etbe.coker.com.au/2011/09/08/laptop-to-cloud-lifestyle/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Related posts:&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;http://etbe.coker.com.au/2010/01/19/taking-thinkpad-apart/&quot; rel=&quot;bookmark&quot; title=&quot;Taking my Thinkpad Apart and Cooling Problems&quot;&gt;Taking my Thinkpad Apart and Cooling Problems&lt;/a&gt; &lt;small&gt;I’ve been having some cooling problems with my Thinkpad recently....&lt;/small&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://etbe.coker.com.au/2007/03/22/thinkpad-back-from-repair/&quot; rel=&quot;bookmark&quot; title=&quot;thinkpad back from repair&quot;&gt;thinkpad back from repair&lt;/a&gt; &lt;small&gt;On Tuesday my Thinkpad was taken for service to fix...&lt;/small&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://etbe.coker.com.au/2010/02/15/new-thinkpad-lenovo-web-site-sucks/&quot; rel=&quot;bookmark&quot; title=&quot;I Just Bought a new Thinkpad and the Lenovo Web Site Sucks&quot;&gt;I Just Bought a new Thinkpad and the Lenovo Web Site Sucks&lt;/a&gt; &lt;small&gt;I’ve just bought a Thinkpad T61 at auction for $AU796....&lt;/small&gt;&lt;/li&gt;
&lt;/ol&gt;</content>
	<author>
	  <name>etbe</name>
	   <uri>http://etbe.coker.com.au</uri> 
	</author>
	<source>
	  <title type="html">etbe - Russell Coker</title>
	  <subtitle type="html">Linux, politics, and other interesting things</subtitle>
	  <link rel="self" href="http://etbe.coker.com.au/feed/"/>
	  <id>http://etbe.coker.com.au</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">Dear fellows of the SJCARS</title>
	<link href="http://wp.colliertech.org/cj/?p=1165"/>
	<id>http://wp.colliertech.org/cj/?p=1165</id>
	<updated>2012-02-13T01:16:08+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;I’ve got a project I could use some help with.  If you’ve got some tuits to spare, I’d love to talk with you about the plan.  Perhaps I’ll post something to the blog…&lt;/p&gt;
&lt;p&gt;[edit 20120212T2025]&lt;br /&gt;
blogged.  &lt;a href=&quot;http://sjcars.org/blog/2012/02/12/hardware-what-wants-deploying&quot;&gt;http://sjcars.org/blog/2012/02/12/hardware-what-wants-deploying&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[Edit 20120213T0026]&lt;br /&gt;
&lt;a alt=&quot;image&quot; href=&quot;http://wp.colliertech.org/cj/wp-content/uploads/2012/02/wpid-IMG_20120212_2036521.jpg&quot;&gt;&lt;img src=&quot;http://wp.colliertech.org/cj/wp-content/uploads/2012/02/wpid-IMG_20120212_203652.jpg&quot; alt=&quot;image&quot; class=&quot;alignnone&quot; title=&quot;IMG_20120212_203652.jpg&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;img /&gt;&lt;br /&gt;
&lt;img /&gt;&lt;br /&gt;
&lt;img /&gt;&lt;/p&gt;</content>
	<author>
	  <name>C.J. Adams-Collier</name>
	   <uri>http://wp.colliertech.org/cj</uri> 
	</author>
	<source>
	  <title type="html">The Pædantic Programmer » debian</title>
	  <subtitle type="html">If you can&#39;t find the time to do it right the first time, where are you going to find the time to do it over?</subtitle>
	  <link rel="self" href="http://wp.colliertech.org/cj/?cat=17&amp;feed=rss2"/>
	  <id>http://wp.colliertech.org/cj</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">Branching FreeGLUT SVN with Git</title>
	<link href="http://blog.beuc.net/posts/Branching_FreeGLUT_SVN_with_Git/"/>
	<id>http://blog.beuc.net/posts/Branching_FreeGLUT_SVN_with_Git/</id>
	<updated>2012-02-12T22:43:13+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;I&#39;m working on porting FreeGLUT to Android!&lt;/p&gt;

&lt;p&gt;Since I don&#39;t have access so the repository (I&#39;m not a regular contributor), and since it will be a BIG patch, I thought I&#39;d try a git-svn branch. So this won&#39;t be a post on OpenGL for once &lt;img src=&quot;http://blog.beuc.net/tags/planet_debian/../../smileys/smile4.png&quot; alt=&quot;;)&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I&#39;m not an expert at managing Git branch but here&#39;s how I set it up.&lt;/p&gt;

&lt;p&gt;In this case, let&#39;s forget about importing tags: they don&#39;t have the same directory branch point in the hierarchy (sometimes the freeglut/ module, sometimes the parent directory), and git-svn only correctly supports set of sane tags that track the same initial directory.&lt;/p&gt;

&lt;p&gt;SVN is SLOW, especially remotely. I suggest you make a rsync copy of the repository first, it will greatly speed up the import :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;rsync -avHSP freeglut.svn.sourceforge.net::svn/freeglut/ freeglut.svn/
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Then start the import with git-svn :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;git svn clone --trunk=trunk/freeglut/freeglut file://$(pwd)/freeglut.svn/ freeglut-git/
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And edit &lt;code&gt;.git/config&lt;/code&gt; to point to https://freeglut.svn.sourceforge.net/svnroot/freeglut :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[svn-remote &quot;svn&quot;]
    url = https://freeglut.svn.sourceforge.net/svnroot/freeglut
    fetch = trunk/freeglut/freeglut:refs/remotes/trunk
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I work with 2 branches:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;master : the SVN on-going sync - may be rebased to push with &lt;code&gt;git svn dcommit&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;android : my feature branch - not rebased and hence trackable by contributors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here&#39;s how I synchronize the upstream repository and merge it regularly with my feature branch:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;git svn fetch
git checkout master
git merge remotes/trunk

git checkout android  # my feature branch
git merge master
# if conflict
git add .../sthing.c
git commit -m &quot;Merge master&quot;
git push
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Any better way?&lt;/p&gt;

&lt;p&gt;The ongoing work is available at &lt;a href=&quot;https://gitorious.org/freeglut/android&quot;&gt;https://gitorious.org/freeglut/android&lt;/a&gt; &lt;img src=&quot;http://blog.beuc.net/tags/planet_debian/../../smileys/smile.png&quot; alt=&quot;:)&quot; /&gt;&lt;/p&gt;</content>
	<author>
	  <name>Beuc's Blog</name>
	   <uri>http://blog.beuc.net/tags/planet_debian/</uri> 
	</author>
	<source>
	  <title type="html">pages tagged planet debian</title>
	  <subtitle type="html">Beuc&#39;s Blog</subtitle>
	  <link rel="self" href="http://blog.beuc.net/tags/planet_debian/index.atom"/>
	  <id>http://blog.beuc.net/tags/planet_debian/</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">Playing with the Trim-Slice</title>
	<link href="http://blog.sesse.net/blog/tech/2012-02-12-21-43_playing_with_the_trim_slice.html"/>
	<id>http://blog.sesse.net/blog/tech/2012-02-12-21-43_playing_with_the_trim_slice.html</id>
	<updated>2012-02-12T20:43:00+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;There seems to be a lot of buzz around the &lt;a href=&quot;http://www.raspberrypi.org/&quot;&gt;Raspberry Pi&lt;/a&gt;
these days, and I can sort of understand it—a cheap, pretty hackable
machine with HDMI out and 1080p video playback for $25. (Somehow I doubt
&lt;a href=&quot;http://en.wikipedia.org/wiki/BBC_BASIC&quot;&gt;BBC BASIC&lt;/a&gt; is what makes people enthusiastic.)&lt;/p&gt;

&lt;p&gt;What I find especially interesting about it is that together with Windows on
ARM, we are starting to get into a situation where desktop computers again
run on multiple architectures; x86 remains dominant, but this time, ARM is
what makes its entrance on the desktop/HTPC stage. (Unfortunately, Windows on
ARM is shaping up to be as locked as the iPad, but that&#39;s a different story.)&lt;/p&gt;

&lt;p&gt;The device hasn&#39;t started shipping yet, so it&#39;s hard to know what to expect,
but the last few days, I&#39;ve had access to a
&lt;a href=&quot;http://trimslice.com/web/&quot;&gt;Trim-Slice&lt;/a&gt; for reasons of some ARM optimization,
so I&#39;ve also spent the opportunity to evaluate it briefly as a replacement
for my aging first-generation ION system (single core Atom); although it&#39;s
not the same device, it&#39;s probably indicative of what you can expect from the
Pi. It&#39;s by no means a thorough test, so take it more a personal opinion.&lt;/p&gt;

&lt;p&gt;(Why do I want to replace my ION? There are two simple reasons: First, if
I can have something that takes 5 W instead of 40 W or whatever the ION
takes, I can go fanless, and the the CPU fan is actually a bit annoynig,
especially with the ball bearings having problems. The second is that I&#39;d
love some more CPU power when compiling things and so on. Having a faster
GPU wouldn&#39;t really hurt either.)&lt;/p&gt;

&lt;p&gt;The Trim-Slice is more intended as end-user machine than the Raspberry Pi
is; for one, it comes in a pretty sleek case, has more storage,
and costs ten times as much. However, CompuLab (the company
that manufactures the Trim-Slice) is pretty clear that it&#39;s not ready for
anyone but developers yet, and this is my summary too:
&lt;em&gt;It&#39;s too young, but it&#39;s not the CPU&#39;s fault.&lt;/em&gt; The difference is, though,
whether I think the current model will ever be ready.&lt;/p&gt;

&lt;p&gt;Let&#39;s start with the CPU: The Trim-Slice comes with a dual-core Cortex-A9
clocked at 1GHz. ARM has this confusing thing about naming (like, ARM11
is based on the ARMv6 architecture), but the general summary is that
it&#39;s pretty much the fastest ARM you can get out there in an end-user
package right now, but you &lt;em&gt;can&lt;/em&gt; get quad-core versions. (Cortex-A15 systems
will be arriving in 6–12 months or so, I&#39;ve been told.) The Cortex-A9
has an FPU, but unfortunately the model included does not have NEON
(roughly ARM&#39;s equivalent to Intel&#39;s SSE). Software availability is
generally not an issue at all unless you desperately need Flash;
the machine ships with an ARM port of Ubuntu, and since volunteers have
spent thousands of hours throughout the history of Debian/Ubuntu to make
things cross-compile, the experience of using one is pretty much identical
to using an x86.&lt;/p&gt;

&lt;p&gt;The Cortex-A9 is an out-of-order-core, compared to the in-order Atom.
It appears to be at least roughly clock-for-clock as fast as the Atom,
maybe faster (but the Atom has more memory bandwidth, being clocked higher).
It certainly does not feel sluggish in normal daily use. (Also, it has 1 GB
of RAM, which is not half-bad for a low-end system like this.) Note that the
Raspberry Pi will have a much weaker CPU, a single ARM11 at 700 Mhz.&lt;/p&gt;

&lt;p&gt;What &lt;em&gt;does&lt;/em&gt; feel sluggish, however, is the graphics. The Trim-Slice is
based around the Tegra2 design, which is one of nVidia&#39;s standard
tablet designs, and it&#39;s really sized for driving a 720p screen, tops,
not 1080p. The drivers are not the same as nVidia&#39;s usual Windows drivers;
even out-of-the-box, writing stuff in an xterm gives you weak display
corruption, menus in GNOME need time to open, etc.. Also, the fill rate
of the GPU is something like 1/10th of even the quite low-end GPU in
my ION box, which becomes a problem when things like XBMC likes to draw
its menu graphics using flashy shaders.&lt;/p&gt;

&lt;p&gt;The GPU supports GLES, not regular OpenGL, but XBMC supports that;
it doesn&#39;t support the GLES texture compression format, though, which probably
doesn&#39;t help the fill rate. The drivers are sort of ad-hoc, and GLES
development doesn&#39;t really work (a lot of people have problems with 
it simply dropping to software mode). CompuLab has promised this will
get better real soon (there&#39;s a software update coming in a few days),
but fundamentally they&#39;re really at nVidia&#39;s mercy here, and it&#39;s
unknown to me to what degree nVidia will care about Tegra2 now that
Tegra3 (with quad-core Cortex-A9 and a somewhat stronger GPU) is out.&lt;/p&gt;

&lt;p&gt;There are a lot of people who think this will be better with Raspberry
Pi, but note that the only real source saying that the Pi&#39;s GPU will
be awesome is a Broadcom exec praising his own product&#39;s ability to
win synthetic benchmarks, and there&#39;s no real indication that it will
be the best thing since sliced bread; it&#39;s probably faster than the
one in Tegra2, but not by a mile.&lt;/p&gt;

&lt;p&gt;Another interesting point is the video acceleration; there&#39;s no way
this thing is going to decode 1080p in software. The Tegra2&#39;s chip
supports hardware 1080p decode, but it doesn&#39;t support the VDPAU/VAAPI
APIs that are now customary on Linux—instead, it supports
a GLES standard called &lt;a href=&quot;http://www.khronos.org/openmax/&quot;&gt;OpenMAX&lt;/a&gt;,
which is also relatively common on Android today. (The Tegra2 is
pretty much geared as a chipset for Android tablets, so this is not
a big surprise.) Unfortunately, OpenMAX is not very standardized with
regards to header placement and so on, and there are lots of 
implementation-specific quirks. Even worse, the Tegra2 can only do
H.264 Main Profile, and almost all the HD material you&#39;ll find out
there uses H.264 High Profile. Oops. This basically renders the
Trim-Slice useless as a HTPC.&lt;/p&gt;

&lt;p&gt;There are other quirks as well; for instance, I went with the model
that has a 32GB SSD from SanDisk (the other alternatives are a 4GB
memory card, and a 2,5&quot; SATA drive of your choice), and it&#39;s hooked
up internally by USB. Unfortunately the included kernel has some
USB issues, causing slow transfers and frequent bus resets, which
makes I/O in general pretty painful. (This is another thing that
will be fixed pretty soon, as I understand it.) Fortunately, if
you&#39;re willing to cobble together patches from support forums and
the likes, it doesn&#39;t seem impossible to compile your own kernel;
the custom kernel has a git repository (and mainline has basic
support for the machine from 2.6.39), and the Trim-Slice wiki
has good information on how to cross-compile and install new kernels.
(Even though the Cortex-A9 is prett usable, compiling on my 8-way Xeon
machine is, strangely enough, a lot more comfortable still :-) )
I needed to do this because, incredibly enough, mutexes were broken,
causing XBMC to segfault.&lt;/p&gt;

&lt;p&gt;Again, it&#39;s one of these things that you need to expect when buying something
as young as this, but maybe the Raspberry Pi community will be big enough 
that most of these kinks will be ironed out. The list of small things goes
on: Power saving doesn&#39;t appear to be fully implemented yet, so the device
gets really hot (even at 5 W max!). It doesn&#39;t show anything on boot before
X starts, except through the included serial port. The DVI port has problems
with high resolutions (the HDMI port works fine, and in recent versions also
with audio and DTS passthrough and all, although the ALSA device names
confuse XBMC). The Wi-Fi driver is unstable. And so on. All of these are
things I can live with, really.&lt;/p&gt;

&lt;p&gt;So, the conclusion? Really, if it had more workable graphics support
(faster GPU, less problematic display drivers, H.264 High Profile support),
I&#39;d buy one as my HTPC; despite its shortcomings, it&#39;s a pretty neat thing,
and at $325 for the SSD model, it&#39;s not all that expensive either.
(It&#39;s sort of ironic that a device so heavily based on something from nVidia,
a GPU company, would have graphics as its weakest point.)
But no, I won&#39;t buy one, and I probably won&#39;t buy a Raspberry Pi—but
in maybe a year, there will be Cortex-A15 designs out, and hopefully one
with better graphics, and then I&#39;ll seriously consider buying one.
If I can&#39;t find a next-generation fanless ION before that, that is. :-)&lt;/p&gt;</content>
	<author>
	  <name>Steinar H. Gunderson</name>
	   <uri>http://blog.sesse.net/</uri> 
	</author>
	<source>
	  <title type="html">Steinar H. Gunderson</title>
	  <subtitle type="html">sesse&#39;s blog</subtitle>
	  <link rel="self" href="http://blog.sesse.net/blog/tech/?flav=rss"/>
	  <id>http://blog.sesse.net/</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">Some things you may have heard about Secure Boot which aren&#39;t entirely true</title>
	<link href="http://mjg59.dreamwidth.org/10971.html"/>
	<id>http://mjg59.dreamwidth.org/10971.html</id>
	<updated>2012-02-12T19:55:01+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">Talking about Secure Boot again, I&#39;m afraid. One of the things that&#39;s made discussion of this difficult is that, while the specification isn&#39;t overly complicated, some of the outcomes aren&#39;t obvious at all until you spend a long time thinking about it. So here&#39;s some clarification on a few points. &lt;br /&gt;&lt;h2&gt;Secure Boot provides no additional security&lt;/h2&gt;Untrue. Attacks against the pre-boot environment are real and increasingly common - &lt;a href=&quot;http://arstechnica.com/business/news/2011/11/security-researcher-defeats-windows-8-secure-boot.ars&quot;&gt;this&lt;/a&gt; is a recent proof of concept, and &lt;a href=&quot;http://www.eset.eu/press-computer-worldwide-targetted-by-MBR-Worm&quot;&gt;this&lt;/a&gt; has been seen in the wild. Once something has got into the MBR, all bets are off. It can modify your bootloader or kernel, inserting its own code to return valid results whenever any kind of malware checker scans for it. The only way to reliably identify it is to either move the disk to another system or to cold boot off verified media. By restricting pre-OS code to something that&#39;s been signed, Secure Boot does provide enhanced security.&lt;br /&gt;&lt;h2&gt;Secure Boot is just another name for Trusted Boot&lt;/h2&gt;Untrue. Trusted Boot requires the ability to measure the entire boot process, which gives the OS the ability to figure out everything that&#39;s been run before OS startup. The root of trust is in the hardware and a TPM is required. Secure Boot is simply a way to limit the applications that are run before the OS. Once booted, there is no way for the OS to identify what was previously booted, or even if the system was booted securely.&lt;br /&gt;&lt;h2&gt;Microsoft are just requiring that vendors implement the specification&lt;/h2&gt;Untrue. Quoting from the Windows 8 Hardware Certification Requirements:&lt;br /&gt;&lt;br /&gt;&lt;cite&gt;MANDATORY: No in-line mechanism is provided whereby a user can bypass Secure Boot failures and boot anyway Signature verification override during boot when Secure Boot is enabled is not allowed. A physically present user override is not permitted for UEFI images that fail signature verification during boot. If a user wants to boot an image that does not pass signature verification, they must explicitly disable Secure Boot on the target system.&lt;/cite&gt;&lt;br /&gt;&lt;br /&gt;Section 27.7.3.3 of version 2.3.1A of the UEFI spec explicitly permits implementations to provide a physically present user override. Whether this is a good thing or not is obviously open to argument, but the fact remains that Microsoft forbid behaviour that the specification permits.&lt;br /&gt;&lt;h2&gt;Secure Boot can be used to implement DRM&lt;/h2&gt;Untrue. The argument here is that Secure Boot can be used to restrict the software that a machine can run, and so can limit a system to running code that implements effective copy protection mechanisms. This isn&#39;t the case. For that to be true, there would need to be a mechanism for the OS to identify which code had been run in the pre-OS environment. There isn&#39;t. The only communication channel between the firmware and the OS is via a single UEFI variable called &quot;SecureBoot&quot;, which may be either &quot;1&quot; or &quot;0&quot;. Additionally, the firmware may provide a table to the OS containing a list of UEFI executables that failed to authenticate. It is not required to provide any information about the executables that authenticated correctly.&lt;br /&gt;&lt;br /&gt;In both these cases, the OS is required to trust the firmware. If the firmware has been compromised in any way (such as the user turning off Secure Boot), the data provided by the firmware can be trivially modified and the OS told that everything is fine. As long as machines exist where users are permitted to disable Secure Boot, Secure Boot is not any kind of DRM scheme.&lt;br /&gt;&lt;h2&gt;Secure Boot provides physical security&lt;/h2&gt;Untrue. Secure Boot does not in any way claim to improve security against attackers who have physical access, for the same reasons as the DRM case. The OS has no way to determine that the firmware&#39;s behaviour has been modified. A physically-present attacker can simply disable Secure Boot and install a piece of malware that lies to the OS about platform security. The &quot;Evil Maid&quot; attack still exists.&lt;br /&gt;&lt;h2&gt;Secure Boot only defines the interaction between the firmware and the bootloader. It doesn&#39;t specify any higher policy&lt;/h2&gt;Misleading. It&#39;s true that Secure Boot only specifies the authentication of pre-OS code. However, if you implement Secure Boot it&#39;s because you want to ensure that only authenticated code has run before your OS. If there is any way for unauthenticated code to touch the hardware before your OS starts, you can&#39;t ensure that. If an authenticated Linux kernel is booted and then loads an unsigned driver, that unsigned driver can fabricate a fake UEFI environment and then launch Windows from it. Windows would falsely believe that it has booted securely. If that authenticated Linux kernel were widely distributed, attackers could use it as an attack vector for Windows. The logical response from Microsoft would be to blacklist that kernel.&lt;br /&gt;&lt;br /&gt;The inevitable outcome of implementing Secure Boot is that every component that can touch hardware must be signed. Anyone who implements Secure Boot without requiring that is adding no additional security whatsoever.&lt;br /&gt;&lt;h2&gt;Only machines that want to boot Windows need to carry Microsoft&#39;s keys&lt;/h2&gt;Again, misleading. Microsoft only require one signing key to be installed, and the Windows bootloader will be signed with a key that chains back to this one. However, the bootloader is not the only component that must be signed. Any drivers that are carried on ROMs on plug-in cards must also be signed. One approach here would have been for all hardware vendors to have their own keys. This would have been unscalable - any shipped machine would have to carry keys for every vendor who produces PCI cards. If a machine carried an nvidia key but not an AMD one, swapping a geforce for a radeon would have resulted in the firmware graphics driver failing to load. Instead, Microsoft are providing a signing service. Vendors will be able to sign up for WHQL membership and have their UEFI drivers signed by Microsoft.&lt;br /&gt;&lt;br /&gt;This leads to the problem. The Authenticode format used for signing UEFI objects only allows for a single signature. If a driver is signed by Microsoft, it can&#39;t be signed by anybody else. Therefore, if a system vendor wants to support off-the-shelf PCI devices with Microsoft-signed drivers, the system must carry Microsoft&#39;s key. If the same key is used as the root of trust for the driver signing and for the bootloader signing, that also means that the system will boot Windows.&lt;br /&gt;&lt;h2&gt;This is only a problem for clients, not servers&lt;/h2&gt;Not strictly true. While Microsoft&#39;s current requirements don&#39;t mandate the presence of Secure Boot on server hardware, if present it must be enabled and locked down as it is for clients. It&#39;s not valid for servers to ship with disabled Secure Boot support, or for it to be shipped in a mode allowing users to make automated policy modifications at OS install time.&lt;br /&gt;&lt;h2&gt;Secure Boot is required by NIST&lt;/h2&gt;This is one that I&#39;ve heard from multiple people working on Secure Boot. It&#39;s amazingly untrue. The document they&#39;re referring to is &lt;a href=&quot;http://csrc.nist.gov/publications/nistpubs/800-147/NIST-SP800-147-April2011.pdf&quot;&gt;NIST SP800-147&lt;/a&gt;, which is a document that describes guidelines for &lt;em&gt;firmware&lt;/em&gt; security - that is, what has to be done to ensure that the firmware itself is secure. This includes making sure that the OS can&#39;t overwrite the firmware and that firmware updates must be signed. It says absolutely nothing about the firmware only running signed software. Secure Boot depends upon the firmware being trusted, so these guidelines are effectively a required part of Secure Boot. But Secure Boot is not within the scope of SP800-147 at all.&lt;br /&gt;&lt;h2&gt;It&#39;s easy for Linux to implement Secure Boot&lt;/h2&gt;Misleading. From a technical perspective, sure. From a practical perspective, not at all. I wrote about the details &lt;a href=&quot;http://mjg59.dreamwidth.org/9844.html&quot;&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;h2&gt;It&#39;s only a problem for hobbyist Linux, not the real Linux market&lt;/h2&gt;Untrue. It&#39;s unclear whether even the significant Linux vendors can implement Secure Boot in a way that meets the needs of their customers and still allows them to boot on commodity hardware. A naive implementation removes many of the benefits of Linux for enterprise customers, such as the ability to use local modifications to micro-optimise systems for specific workloads. One of the key selling points of Linux is the ability to make use of local expertise when adapting the product for your needs. Secure Boot makes that more difficult.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;Much reporting on the issues surrounding Secure Boot so far has been inaccurate, leading to misunderstandings about the (genuine) benefits and the (genuine) drawbacks. Any useful discussion must be based around an accurate understanding of the specification rather than statements from analysts with no real understanding of the Linux market or security.&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://www.dreamwidth.org/tools/commentcount?user=mjg59&amp;amp;ditemid=10971&quot; alt=&quot;comment count unavailable&quot; height=&quot;12&quot; style=&quot;vertical-align: middle;&quot; width=&quot;30&quot; /&gt; comments</content>
	<author>
	  <name>Matthew Garrett</name>
	   <uri>http://mjg59.dreamwidth.org/</uri> 
	</author>
	<source>
	  <title type="html">Matthew Garrett</title>
	  <subtitle type="html">Matthew Garrett - Dreamwidth Studios</subtitle>
	  <link rel="self" href="http://mjg59.dreamwidth.org/data/rss"/>
	  <id>http://mjg59.dreamwidth.org/</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">I’ve been away from Windows for more than a decade but …</title>
	<link href="http://yoush.homelinux.org:8079/tech/ive-been-away-from-windows-for-more-than-a-decade-but"/>
	<id>http://yoush.homelinux.org:8079/?p=507</id>
	<updated>2012-02-12T18:30:16+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;… but I’ve already forseen the unwanted meet for some time &lt;img src=&quot;http://yoush.homelinux.org:8079/wp-includes/images/smilies/icon_sad.gif&quot; alt=&quot;:(&quot; class=&quot;wp-smiley&quot; /&gt; .&lt;/p&gt;
&lt;p&gt;My elder daughter does need to run educational software from school. And my wife wants to run education software for our younger son. And making all that running under different emulation environments does eat my time, and result is not always good. And also children start to want games…&lt;/p&gt;
&lt;p&gt;Issue 1. Need hardware to run more or less modern windows on.&lt;/p&gt;
&lt;p&gt;For last 6 years, my home network consists of a more or less powerful headless server, and 3 terminals to access that. Terminals are definitely too weak for windows. And server is needed in 24/7 mode so sorry no windows there.&lt;/p&gt;
&lt;p&gt;Likely solution for this is – one of 3 terminals is actually dying (it is doing so already for months but still works, just hangs sometimes) and needs a replacement, so I can just replace it now and use more powerful hardware.&lt;/p&gt;
&lt;p&gt;Issue 2. Windows host or windows VM?&lt;/p&gt;
&lt;p&gt;While windows VM feels preferable for a such a deep-linux person as myself, I tend to think that dual-boot host is better here. If the very reason of allowing windows into this house is – make it easy to install and run random windows software, then doing so in VM environment is explicitly against the goal.&lt;/p&gt;
&lt;p&gt;Issue 3. Use unlicensed windows or buy a license?&lt;/p&gt;
&lt;p&gt;Although absolute majority of windows users here is Russia use unlicensed windows, it is somewhat unfair to promote free software and use unlicensed windows at the same time. And windows home basic license is not that expensive after all.&lt;/p&gt;
&lt;p&gt;The setup that makes me less uncomfortable than others is:&lt;br /&gt;
- obtain powerful enough hardware, and install that instead of failing terminal,&lt;br /&gt;
- obtain windows 7 home basic license&lt;br /&gt;
- install dual boot linux + windows, and under linux install windows VM&lt;br /&gt;
- when needed, try windows VM first, and in case of any issues, immediately reboot into windows host.&lt;/p&gt;
&lt;p&gt;What I can’t find out for some time already is – does microsoft retail license allow to have both host and VM installation on the same computer? These will be physically different installations, but on the same computer, and will never run at the same time. License wording does not give exact answer on this.&lt;/p&gt;
&lt;p&gt;I wanted to ask on Microsoft’s support forum but failed to register there. After asking me quite a few things it claimed that there is some temporary problem and suggested to retry later. I retried later and got the same.&lt;/p&gt;
&lt;p&gt;I then asked &lt;a href=&quot;http://superuser.com/questions/388972/dual-boot-linux-windows-7-window-7-virtual-machine-under-linux-licensing&quot;&gt;here&lt;/a&gt; but looks like nobody knows.&lt;/p&gt;
&lt;p&gt;At least I want to know, what will happen if I will try to activate windows in VM after I’ve activated windows (with the same key) on host. Will this render both installations “non-genuine”?&lt;/p&gt;
&lt;p&gt;Also I’d appreciate any comments on the whole situation &lt;img src=&quot;http://yoush.homelinux.org:8079/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;</content>
	<author>
	  <name>nikita</name>
	   <uri>http://yoush.homelinux.org:8079/</uri> 
	</author>
	<source>
	  <title type="html">yoush.homelinux.org » Tech</title>
	  <subtitle type="html">Nikita Youshchenko&#39;s web space</subtitle>
	  <link rel="self" href="http://yoush.homelinux.org/category/tech/feed"/>
	  <id>http://yoush.homelinux.org:8079/</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">perf stats for doing nothing</title>
	<link href="http://k1024.org/~iusty/blog/entry/perf-null/"/>
	<id>http://k1024.org/~iusty/blog/entry/perf-null/</id>
	<updated>2012-02-12T16:28:30+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;h1&gt;Perf stats for &quot;doing nothing&quot;&lt;/h1&gt;

&lt;p&gt;I&#39;ve recently discovered the &lt;code&gt;perf&lt;/code&gt; Linux tool. I heard that oprofile
was deprecated and that there is a new tool, and I noted down to try
it sometime.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Updated&lt;/strong&gt;: more languages, fixed typos, more details, some
graphs. Apologies if this shows twice in your feed.&lt;/p&gt;

&lt;p&gt;The problem with perf stats is that I &lt;em&gt;hate&lt;/em&gt; bloat, or even perceived
bloat. Even when it doesn&#39;t affect me in any way, the concept of
wasted cycles makes me really sad.&lt;/p&gt;

&lt;p&gt;You probably can guess where this is going… I said, well, let&#39;s see
what perf says about a simple &quot;null&quot; program. Surely doing nothing
should be just a small number of instructions, right?&lt;/p&gt;

&lt;p&gt;Note: I think that perf also records kernel-side code, because the
lowest I could get was about ~50K instructions for starting a null
program in assembler that doesn&#39;t use libc and just executes the
&lt;code&gt;syscall&lt;/code&gt; asm instruction. However, these ~50K instructions are noise
the moment you start to use more high-level languages. Yes, this is
expected, but the I was still shocked. And there&#39;s lots of delta
between languages I&#39;d expected to behave somewhat identical.&lt;/p&gt;

&lt;p&gt;Again, this is not important in the real world. At all. They are just
numbers, and probably the noise (due to short runtime) has lots of
influence on the resulting numbers. And I might have screwed up the
measurements somehow.&lt;/p&gt;

&lt;h2&gt;Test setup&lt;/h2&gt;

&lt;p&gt;Each program was the equivalent of &#39;exit 0&#39; in the appropriate form
for the language. During the measurements, the machine was as much as
possible idle (single-user mode, measurements run at real-time
priority, etc.). For compiled languages, &lt;code&gt;-O2&lt;/code&gt; was used. For scripts,
a simple &lt;code&gt;#!/path/to/interpreter&lt;/code&gt; (without options, except in the case
of Python, see below) was used. Each program/script was run 500 times
(perf&#39;s &lt;code&gt;-r 500&lt;/code&gt;) and I&#39;ve checked that the variations were small
(±0.80% on the metrics I used).&lt;/p&gt;

&lt;p&gt;You can find all the programs I&#39;ve used at
&lt;a href=&quot;http://git.k1024.org/perf-null.git/&quot;&gt;http://git.k1024.org/perf-null.git/&lt;/a&gt;, the current tests are for the
tag version &lt;em&gt;perf-null-0.1&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;The raw data for the below tables/graphs is at
&lt;a href=&quot;http://k1024.org/~iusty/blog/./data/perf-null/log-4&quot;&gt;log-4&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Results&lt;/h2&gt;

&lt;h3&gt;Compiled languages&lt;/h3&gt;

&lt;table class=&quot;numerics&quot;&gt;
    &lt;thead&gt;
        &lt;tr&gt;
            &lt;th&gt;Language&lt;/th&gt;
            &lt;th&gt;Cycles&lt;/th&gt;
            &lt;th&gt;Instructions&lt;/th&gt;
        &lt;/tr&gt;
    &lt;/thead&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td&gt;asm&lt;/td&gt;
            &lt;td&gt;63K&lt;/td&gt;
            &lt;td&gt;51K&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;c-dietlibc&lt;/td&gt;
            &lt;td&gt;74K&lt;/td&gt;
            &lt;td&gt;57K&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;c-libc-static&lt;/td&gt;
            &lt;td&gt;177K&lt;/td&gt;
            &lt;td&gt;107K&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;c-libc-shared&lt;/td&gt;
            &lt;td&gt;506K&lt;/td&gt;
            &lt;td&gt;300K&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;c++-static&lt;/td&gt;
            &lt;td&gt;178K&lt;/td&gt;
            &lt;td&gt;107K&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;c++-dynamic&lt;/td&gt;
            &lt;td&gt;1,750K&lt;/td&gt;
            &lt;td&gt;1,675K&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;haskell-single&lt;/td&gt;
            &lt;td&gt;2,229K&lt;/td&gt;
            &lt;td&gt;1,338K&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;haskell-threaded&lt;/td&gt;
            &lt;td&gt;2,629K&lt;/td&gt;
            &lt;td&gt;1,522K&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;ocaml-bytecode&lt;/td&gt;
            &lt;td&gt;3,271K&lt;/td&gt;
            &lt;td&gt;2,741K&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;ocaml-native&lt;/td&gt;
            &lt;td&gt;1,042K&lt;/td&gt;
            &lt;td&gt;666K&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Going from dietlibc to glibc doubles the number of instructions, and
for libc going from static to dynamic linking again roughly doubles
it. I didn&#39;t manage to compile a program dynamically-linked against
dietlibc.&lt;/p&gt;

&lt;p&gt;C++ is interesting. Linked statically, it is in the same ballpark as
C, but when linked dynamically, it executes an order of magnitude &lt;img src=&quot;http://k1024.org/~iusty/smileys/idea.png&quot; alt=&quot;(!)&quot; /&gt;
more instructions. I would guess that the initialisation of the
standard C++ library is complex?&lt;/p&gt;

&lt;p&gt;Haskell, which has a GC and quite a complex runtime, executes slightly
less instructions than C++, but uses more cycles. Not bad, given the
capabilities of the runtime. The two versions of the Haskell program
are with the single-threaded runtime and with the multi-threaded one;
not much difference. A fully statically-linked Haskell binary (not
recommended usually) goes below 1M instructions, but not by much.&lt;/p&gt;

&lt;p&gt;OCaml is a very nice surprise. The bytecode runtime is a bit slow to
startup, but the (native) compiled version is quite fast to start:
only 2× number of instructions and cycles compared to C, for an
advanced language. And twice as fast as Haskell ☺. Nice!&lt;/p&gt;

&lt;h3&gt;Shells&lt;/h3&gt;

&lt;table class=&quot;numerics&quot;&gt;
    &lt;thead&gt;
        &lt;tr&gt;
            &lt;th&gt;Language&lt;/th&gt;
            &lt;th&gt;Cycles&lt;/th&gt;
            &lt;th&gt;Instructions&lt;/th&gt;
        &lt;/tr&gt;
    &lt;/thead&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td&gt;dash&lt;/td&gt;
            &lt;td&gt;766K&lt;/td&gt;
            &lt;td&gt;469K&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;bash&lt;/td&gt;
            &lt;td&gt;1,680K&lt;/td&gt;
            &lt;td&gt;1,044K&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;mksh&lt;/td&gt;
            &lt;td&gt;1,258K&lt;/td&gt;
            &lt;td&gt;942K&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;mksh-static&lt;/td&gt;
            &lt;td&gt;504K&lt;/td&gt;
            &lt;td&gt;322K&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;So, dash takes ~470K instructions to start, which is way below the C++
count and a bit higher than the C one. Hence, I&#39;d guess that dash is
implemented in C ☺.&lt;/p&gt;

&lt;p&gt;Next, bash is indeed slower on startup than dash, and by slightly more
than 2× (both instructions and cycles). So yes, switching &lt;code&gt;/bin/sh&lt;/code&gt;
from bash to dash makes sense.&lt;/p&gt;

&lt;p&gt;I wasn&#39;t aware of &lt;code&gt;mksh&lt;/code&gt;, so thanks for the comments. It is, in the
static variant, more efficient that dash, by about 1.5×. However, the
dynamically linked version doesn&#39;t look too great (dash is also
dynamically linked; I would guess a statically-linked dash &quot;beats&quot;
mksh-static).&lt;/p&gt;

&lt;h3&gt;Text processing&lt;/h3&gt;

&lt;p&gt;I&#39;ve added perl here (even though it&#39;s a &#39;full&#39; language) just for
comparison; it&#39;s also in the next section.&lt;/p&gt;

&lt;table class=&quot;numerics&quot;&gt;
    &lt;thead&gt;
        &lt;tr&gt;
            &lt;th&gt;Language&lt;/th&gt;
            &lt;th&gt;Cycles&lt;/th&gt;
            &lt;th&gt;Instructions&lt;/th&gt;
        &lt;/tr&gt;
    &lt;/thead&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td&gt;mawk&lt;/td&gt;
            &lt;td&gt;849K&lt;/td&gt;
            &lt;td&gt;514K&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;gawk&lt;/td&gt;
            &lt;td&gt;1,363K&lt;/td&gt;
            &lt;td&gt;980K&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;perl&lt;/td&gt;
            &lt;td&gt;2,946K&lt;/td&gt;
            &lt;td&gt;2,213K&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;A normal spread. I knew the reason why mawk is &lt;code&gt;Priority: required&lt;/code&gt; is
that it&#39;s faster than gawk, but I wouldn&#39;t have guessed it&#39;s almost
twice as fast.&lt;/p&gt;

&lt;h3&gt;Interpreted languages&lt;/h3&gt;

&lt;p&gt;Here is where the fun starts…&lt;/p&gt;

&lt;table class=&quot;numerics&quot;&gt;
    &lt;thead&gt;
        &lt;tr&gt;
            &lt;th&gt;Language&lt;/th&gt;
            &lt;th&gt;Cycles&lt;/th&gt;
            &lt;th&gt;Instructions&lt;/th&gt;
        &lt;/tr&gt;
    &lt;/thead&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td&gt;lua 5.1&lt;/td&gt;
            &lt;td&gt;1,947K&lt;/td&gt;
            &lt;td&gt;1,485K&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;lua 5.2&lt;/td&gt;
            &lt;td&gt;1,724K&lt;/td&gt;
            &lt;td&gt;1,335K&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;lua jit&lt;/td&gt;
            &lt;td&gt;1,209K&lt;/td&gt;
            &lt;td&gt;803K&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;perl&lt;/td&gt;
            &lt;td&gt;2,946K&lt;/td&gt;
            &lt;td&gt;2,213K&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;tcl 8.4&lt;/td&gt;
            &lt;td&gt;5,011K&lt;/td&gt;
            &lt;td&gt;4,552K&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;tcl 8.5&lt;/td&gt;
            &lt;td&gt;6,888K&lt;/td&gt;
            &lt;td&gt;6,022K&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;tcl 8.6&lt;/td&gt;
            &lt;td&gt;8,196K&lt;/td&gt;
            &lt;td&gt;7,236K&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;ruby 1.8&lt;/td&gt;
            &lt;td&gt;7,013K&lt;/td&gt;
            &lt;td&gt;6,128K&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;ruby 1.9.3&lt;/td&gt;
            &lt;td&gt;35,870K&lt;/td&gt;
            &lt;td&gt;35,022K&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;python 2.6 -S&lt;/td&gt;
            &lt;td&gt;11,752K&lt;/td&gt;
            &lt;td&gt;10,247K&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;python 2.7 -S&lt;/td&gt;
            &lt;td&gt;11,438K&lt;/td&gt;
            &lt;td&gt;10,198K&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;python 3.2 -S&lt;/td&gt;
            &lt;td&gt;29,003K&lt;/td&gt;
            &lt;td&gt;27,409K&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;pypy -S&lt;/td&gt;
            &lt;td&gt;21,106K&lt;/td&gt;
            &lt;td&gt;10,036K&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;python 2.6&lt;/td&gt;
            &lt;td&gt;25,143K&lt;/td&gt;
            &lt;td&gt;21,989K&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;python 2.7&lt;/td&gt;
            &lt;td&gt;47,325K&lt;/td&gt;
            &lt;td&gt;50,217K&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;python 2.7 -O&lt;/td&gt;
            &lt;td&gt;47,341K&lt;/td&gt;
            &lt;td&gt;50,185K&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;python 3.2&lt;/td&gt;
            &lt;td&gt;113,567K&lt;/td&gt;
            &lt;td&gt;124,133K&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;python 3.2 -O&lt;/td&gt;
            &lt;td&gt;113,424K&lt;/td&gt;
            &lt;td&gt;124,133K&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;pypy&lt;/td&gt;
            &lt;td&gt;90,779K&lt;/td&gt;
            &lt;td&gt;68,455K&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;The numbers here are not quite what I expected. There&#39;s a huge delta
between the fastest (hi Lua!) and the slowest (bye Python!).&lt;/p&gt;

&lt;p&gt;I wasn&#39;t familiar with Lua, so I tested it thanks to the comments. It
is, I think, the only language which actually improves from one
version to the next (bonus points), and where the JIT version also
make is faster. In context, lua jit starts faster than C++.&lt;/p&gt;

&lt;p&gt;Perl is the one that goes above C++&#39;s instructions count, but not by
much. From the point of view of the system, a Perl &#39;hello world&#39; is
only about 1.3×-1.6x slower than a C++ one. Not bad, not bad.&lt;/p&gt;

&lt;p&gt;Next category is composed of TCL and Ruby, both of which had older
versions 2-3× slower than Perl, but whose most recent versions are
even more slower. TCL has an almost constant slowdown across versions
(5M, 6.9M, 8.2M cycles), but Ruby seems to have taken a significant
step backwards: 1.9.3 is 5× slower than 1.8. I wonder why? As for TCL,
I didn&#39;t expect it to be slower to startup than Perl; good to know.&lt;/p&gt;

&lt;p&gt;Last category is Python. Oh my. If you run &lt;code&gt;perf stat python -c
&#39;pass&#39;&lt;/code&gt; you get some unbelievable numbers, like 50M instructions to
do, well, nothing. Yes, it has a GC, yes, it does import modules at
runtime, but still… On closer investigation, the &lt;code&gt;site&lt;/code&gt; module and the
imports it does do eat a lot of time. Running a simpler &lt;code&gt;python -S&lt;/code&gt;
brings it back to a more reasonable 10M instructions, which is in-line
with the other interpreted languages.&lt;/p&gt;

&lt;p&gt;However, even with the -S taken into account, Python also slows down
across versions: a tiny improvement from 2.6 to 2.7, but (like Ruby) a
3× slowdown from 2.7 to 3.2. Trying the “optimised” version (&lt;code&gt;-O&lt;/code&gt;)
doesn&#39;t help at all. Trying pypy, which was based on Python 2.7, makes
it around 2× slower to startup (both with and without &lt;code&gt;-S&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;So in the interpreted languages, it seems only Lua is trying to
improve, the rest of the languages are piling up bloat with every
version. Note: I should have tried multiple perl versions too.&lt;/p&gt;

&lt;h3&gt;Java&lt;/h3&gt;

&lt;p&gt;Java is in its own category; you guess why ☺, right?&lt;/p&gt;

&lt;p&gt;GCJ was version 4.6, whereas by &lt;code&gt;java&lt;/code&gt; below I mean &lt;code&gt;OpenJDK Runtime
Environment (IcedTea6 1.11) (6b24-1.11-4)&lt;/code&gt;.&lt;/p&gt;

&lt;table class=&quot;numerics&quot;&gt;
    &lt;thead&gt;
        &lt;tr&gt;
            &lt;th&gt;Language&lt;/th&gt;
            &lt;th&gt;Cycles&lt;/th&gt;
            &lt;th&gt;Instructions&lt;/th&gt;
        &lt;/tr&gt;
    &lt;/thead&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td&gt;null-gcj&lt;/td&gt;
            &lt;td&gt;97,156K&lt;/td&gt;
            &lt;td&gt;74,576K&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;java -jamvm&lt;/td&gt;
            &lt;td&gt;85,535K&lt;/td&gt;
            &lt;td&gt;80,102K&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;java -server&lt;/td&gt;
            &lt;td&gt;147,174K&lt;/td&gt;
            &lt;td&gt;136,803K&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;java -zero&lt;/td&gt;
            &lt;td&gt;132,967K&lt;/td&gt;
            &lt;td&gt;124,977K&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;java -cacao&lt;/td&gt;
            &lt;td&gt;229,799K&lt;/td&gt;
            &lt;td&gt;205,312K&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Using gcj to compile to “native code” (not sure whether that&#39;s
native-native or something else) results in a binary that uses less
than 100M cycles to start, but the jamvm VM is faster than that (85M
cycles). Not bad for java! Python 3.2 is slower to startup—yes, I
think the world has gone crazy.&lt;/p&gt;

&lt;p&gt;However, the other VMs are a few times slower: server (the default
one) is ~150M cycles, and cacao is ~230M cycles. Wow.&lt;/p&gt;

&lt;p&gt;The other thing about java is that it was the only one that couldn&#39;t
be put nicely in a file that you just ‘exec’ (there is &lt;code&gt;binfmt_misc&lt;/code&gt;
indeed, but that doesn&#39;t allow different Java classes to use different
Java VMs, so I don&#39;t count this), as opposed to every single other
thing I tested here. Someone didn&#39;t grow on Unix?&lt;/p&gt;

&lt;h2&gt;Comparative analysis&lt;/h2&gt;

&lt;p&gt;Since there are almost 4 orders of magnitude difference between all
the things tested here, a graph of cycles or instructions is not
really useful. However, cycles/instruction, branches percentage and
branches miss-predicted percentage can be. Hence first the
cycles/instructions:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://k1024.org/~iusty/blog/./pics/perf-null/cycles_ins.png&quot;&gt;&lt;img src=&quot;http://k1024.org/~iusty/blog/pics/perf-null/cycles_ins.png&quot; alt=&quot;Cycles/instruction&quot; height=&quot;399&quot; class=&quot;img&quot; width=&quot;800&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pypy is jumping out of the graph here, with the top value of over 2
cycles/instruction. Lua JIT is also bigger than Lua non-JIT, so maybe
there&#39;s something to this (mostly joking, two data points don&#39;t make a
series). On the other hand, Python wins as best cycles/instruction
(0.91). Lots of ILP, to get below 1?&lt;/p&gt;

&lt;p&gt;Java gets, irrespective of VM, consistently near 1.0-1.1. C++ gets
very different numbers between static linking (1.666) and dynamic
linking (1.045), whereas C has basically identical numbers. mksh also
has a difference between dynamic and static linking. Hmm…&lt;/p&gt;

&lt;p&gt;Ruby, TCL and Python have consistent values across versions.&lt;/p&gt;

&lt;p&gt;And that&#39;s about what I can see from that graph. Next up, percentage
of branches out of total instructions and percentage of branches
missed:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://k1024.org/~iusty/blog/./pics/perf-null/branches.png&quot;&gt;&lt;img src=&quot;http://k1024.org/~iusty/blog/pics/perf-null/branches.png&quot; alt=&quot;Branch statistics&quot; height=&quot;399&quot; class=&quot;img&quot; width=&quot;799&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note that the two lines shouldn&#39;t really be on the same graph; for the
branch %, the 100% is the total instructions count, but for the branch
miss %, the 100% is the total branch count. Anyway.&lt;/p&gt;

&lt;p&gt;There are two low-value outliers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;dynamically-linked C++ has a low branch percentage (17.46%) and a
very low branch miss percentage (only 4.32%)&lt;/li&gt;
&lt;li&gt;gcj-compiled java has a &lt;strong&gt;very&lt;/strong&gt; low branch miss percentage (only
2.82%!!!), even though is has a “regular” branch percentage (20.85%)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So it seems the gcj libraries are well optimised? I&#39;m not familiar
enough with this topic, but on the graph it does indeed stand out.&lt;/p&gt;

&lt;p&gt;On the other end, mksh-static has a high branch miss percentage:
11.60%, which jumps clearly ahead of all the others; this might be why
it has a high cycles/instruction count, due to all the stalls in
misprediction; one has to wonder why it confuses the branch predictor?&lt;/p&gt;

&lt;p&gt;I find it interesting that the overall branch count is very similar
across languages, both when most of the cost is in the kernel
(e.g. asm) and when the user-space cost heavily over-weighs the kernel
(e.g. Java). The average is 20.85%, minimum is 17.46%, max 22.93%,
standard deviation (if I used gnumeric correctly) is just 0.01. This
seems a bit suspicious to me ☺. On the other hand, the mispredicted
branches percentage varies much more: from a measly 2.82% to 11.60%
(5x difference).&lt;/p&gt;

&lt;h2&gt;Summary&lt;/h2&gt;

&lt;p&gt;So to recap, counting just instructions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;going from dietlibc to glibc: 2× increase&lt;/li&gt;
&lt;li&gt;going from statically-linked libc to dynamically-linked libc: doubles
it again&lt;/li&gt;
&lt;li&gt;going from C to C++: 5× increase&lt;/li&gt;
&lt;li&gt;C++ to Perl: 1.3×&lt;/li&gt;
&lt;li&gt;Perl to Ruby: 3×&lt;/li&gt;
&lt;li&gt;Ruby to Python (-S): 1.6x&lt;/li&gt;
&lt;li&gt;Python -S to regular Python: 5x&lt;/li&gt;
&lt;li&gt;Python to Java: 1×-2×, depending on version/runtime&lt;/li&gt;
&lt;li&gt;branch percentage (per total instructions) is quite consistent
across all of the programs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Overall, you get roughly three orders of magnitude slower startup
between a plain C program using dietlibc and Python. And all, to do
basically nothing.&lt;/p&gt;

&lt;p&gt;On the other hand, I learned some interesting things while doing it,
so it wasn&#39;t quite for nothing ☺.&lt;/p&gt;</content>
	<author>
	  <name>Iustin Pop</name>
	   <uri>http://k1024.org/~iusty/blog/</uri> 
	</author>
	<source>
	  <title type="html">blog</title>
	  <subtitle type="html">Iustin Pop</subtitle>
	  <link rel="self" href="http://k1024.org/~iusty/blog/index.atom"/>
	  <id>http://k1024.org/~iusty/blog/</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en-us">RC bugs 2012/05-06</title>
	<link href="http://info.comodo.priv.at/blog/archives/2012/02/#e2012-02-12T15_47_40.txt"/>
	<id>http://info.comodo.priv.at/blog/archives/2012/02/#e2012-02-12T15_47_40.txt</id>
	<updated>2012-02-12T14:47:40+00:00</updated>
	<summary type="html" xml:lang="en-us"></summary>
	<content type="html" xml:lang="en">I was at FOSDEM over the last weekend, so here&#39;s my report for two weeks
now:
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://bugs.debian.org/445842&quot;&gt;&lt;del&gt;#445842&lt;/del&gt;&lt;/a&gt; – rmagic: &quot;rmagic: fails with current libgd&quot;&lt;br /&gt;add patch from Andreas Beckmann, upload to DELAYED/2&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://bugs.debian.org/610332&quot;&gt;&lt;del&gt;#610332&lt;/del&gt;&lt;/a&gt; – aiccu: &quot;/etc/pm/sleep.d/60aiccu hook may cause unacceptable resume delays&quot;&lt;br /&gt;improve pm-utils hook script, upload to DELAYED/2, then moved to 0-day on maintainer&#39;s request&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://bugs.debian.org/628305&quot;&gt;&lt;del&gt;#628305&lt;/del&gt;&lt;/a&gt; – src:gpa: &quot;gpa: FTBFS: checking LIBASSUAN API version... does not match. want=1 got=2.&quot;&lt;br /&gt;apply upstream patch, upload to DELAYED/2&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://bugs.debian.org/629693&quot;&gt;&lt;del&gt;#629693&lt;/del&gt;&lt;/a&gt; – src:spim: &quot;spim: FTBFS: ../CPU/spim-utils.c:117:7: error: invalid use of void expression&quot;&lt;br /&gt;add patch from Ubuntu / Matthias Klose, upload to DELAYED/2&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://bugs.debian.org/629747&quot;&gt;&lt;del&gt;#629747&lt;/del&gt;&lt;/a&gt; – src:fso-abyss: &quot;fso-abyss: FTBFS: build-dependency not installable: libvala-dev (&amp;gt;= 0.8.1)&quot;&lt;br /&gt;switch to vala-0.10, inspired by the patch from Ubuntu / Barry Warsaw, upload to DELAYED/2&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://bugs.debian.org/629782&quot;&gt;&lt;del&gt;#629782&lt;/del&gt;&lt;/a&gt; – src:fso-misc-vapi: &quot;fso-misc-vapi: FTBFS: build-dependency not installable: libvala-dev&quot;&lt;br /&gt;switch to vala-0.10, inspired by the patch from Ubuntu / Barry Warsaw, upload to DELAYED/2&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://bugs.debian.org/635550&quot;&gt;&lt;del&gt;#635550&lt;/del&gt;&lt;/a&gt; – pmw: &quot;pmw: piuparts: fails to install (update-gsfontmap again)&quot;&lt;br /&gt;send patch to the BTS, fixed by maintainer later&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://bugs.debian.org/642375&quot;&gt;#642375&lt;/a&gt; – cardstories: &quot;cardstories: ftbfs on i386 due to test value &amp;gt; sys.maxint&quot;&lt;br /&gt;add patch from Ubuntu / Barry Warsaw, upload to DELAYED/3&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://bugs.debian.org/642566&quot;&gt;&lt;del&gt;#642566&lt;/del&gt;&lt;/a&gt; – python-saga: &quot;python-saga: doesn&#39;t depend on python&quot;&lt;br /&gt;apply missing part of Jakub Wilk&#39;s patch, upload to DELAYED/2, later integrated in maintainer upload&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://bugs.debian.org/650800&quot;&gt;&lt;del&gt;#650800&lt;/del&gt;&lt;/a&gt; – src:hiredis: &quot;hiredis: FTBFS on mipsel: rm: cannot remove `/tmp/redis.sock&#39;: No such file or directory&quot;&lt;br /&gt;sponsor maintainer upload&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://bugs.debian.org/652182&quot;&gt;#652182&lt;/a&gt; – src:cardstories: &quot;cardstories: FTBFS: TypeError: &#39;NoneType&#39; object has no attribute &#39;__getitem__&#39;&quot;&lt;br /&gt;drop &quot;X-Python-Version: all&quot;, upload to DELAYED/3&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://bugs.debian.org/652231&quot;&gt;&lt;del&gt;#652231&lt;/del&gt;&lt;/a&gt; – src:brickos: &quot;brickos: FTBFS: semop(2): encountered an error: Invalid argument&quot;&lt;br /&gt;close as unreproducible&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://bugs.debian.org/656153&quot;&gt;#656153&lt;/a&gt; – jspwiki: &quot;jspwiki: postinst failure: chown: invalid user: `tomcat6&#39;&quot;&lt;br /&gt;add thoughts in the BTS&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://bugs.debian.org/656178&quot;&gt;&lt;del&gt;#656178&lt;/del&gt;&lt;/a&gt; – mandos: &quot;mandos FTBFS on buildds&quot;&lt;br /&gt;add build dependency and set locale for manpage building, upload to DELAYED/2&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://bugs.debian.org/657478&quot;&gt;#657478&lt;/a&gt; – biomaj-watcher: &quot;biomaj-watcher: doesn&#39;t use invoke-rc.d&quot;&lt;br /&gt;use invoke-rc.d in postinst (and quote variable in config), upload to DELAYED/2, later cancelled on maintainer&#39;s request&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://bugs.debian.org/657746&quot;&gt;&lt;del&gt;#657746&lt;/del&gt;&lt;/a&gt; – prolix: &quot;prolix: under- and wrongly-documented, not working interactively at all&quot;&lt;br /&gt;upload new upstream release (pkg-perl)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://bugs.debian.org/658394&quot;&gt;&lt;del&gt;#658394&lt;/del&gt;&lt;/a&gt; – src:libio-socket-socks-perl: &quot;libio-socket-socks-perl: FTBFS - test failures without network (was: [Bug 924169] [NEW] libio-socket-socks-perl fails to build without a network connection)&quot;&lt;br /&gt;upload package prepared by Jonathan Yu (pkg-perl)&lt;/li&gt;
&lt;/ul&gt;</content>
	<author>
	  <name>gregoa</name>
	   <uri>http://info.comodo.priv.at/blog/archives/cat_5/</uri> 
	</author>
	<source>
	  <title type="html">gregoa's blog</title>
	  <subtitle type="html">random musings about guitars, computers, and
everything</subtitle>
	  <link rel="self" href="http://info.comodo.priv.at/blog/archives/cat_5/index-rss.xml"/>
	  <id>http://info.comodo.priv.at/blog/archives/cat_5/</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">Multi-Arch progress</title>
	<link href="http://www.linux.codehelp.co.uk/serendipity/index.php?/archives/232-Multi-Arch-progress.html"/>
	<id>http://www.linux.codehelp.co.uk/serendipity/index.php?/archives/232-guid.html</id>
	<updated>2012-02-12T13:14:29+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">With dpkg from experimental and the new zlib upload in unstable, I&#39;ve now got a partial Multi-Arch install. There are more packages necessary, particularly related to how -dev packages can exist and how a cross compiler gets built/installed in Multi-Arch world.  One bug &lt;a href=&quot;http://bugs.debian.org/659588&quot;&gt;#659588&lt;/a&gt; in libglib2.0-0 so far but that&#39;s quite good seeing as it&#39;s been all but impossible to test the Multi-Arch changes in existing packages until now.&lt;br /&gt;
&lt;pre&gt;$ dpkg --print-foreign-architectures&lt;br /&gt;
armel&lt;br /&gt;
i386&lt;br /&gt;
&lt;/pre&gt;&lt;br /&gt;
&lt;pre&gt;$ dpkg -l | cut -c -80 | grep armel|grep -v cross&lt;br /&gt;
ii  gcc-4.6-base:armel                   4.6.2-14                     &lt;br /&gt;
ii  libc6:armel                          2.13-26                    &lt;br /&gt;
ii  libdatrie1:armel                     0.2.5-3                &lt;br /&gt;
ii  libffi5:armel                        3.0.10-3                 &lt;br /&gt;
ii  libgcc1:armel                        1:4.6.2-14                 &lt;br /&gt;
ii  libgmp10:armel                       2:5.0.4+dfsg-1         &lt;br /&gt;
ii  libgmpxx4ldbl:armel                  2:5.0.4+dfsg-1        &lt;br /&gt;
ii  libgomp1:armel                       4.6.2-14         &lt;br /&gt;
ii  libmpc-dev:armel                     0.9-4              &lt;br /&gt;
ii  libmpc2:armel                        0.9-4          &lt;br /&gt;
ii  libmpfr-dev:armel                    3.1.0-3         &lt;br /&gt;
ii  libmpfr4:armel                       3.1.0-3       &lt;br /&gt;
ii  libpcre3:armel                       8.12-4                &lt;br /&gt;
ii  libpixman-1-0:armel                  0.24.4-1    &lt;br /&gt;
ii  libpng12-0:armel                     1.2.46-4     &lt;br /&gt;
ii  libpopt0:armel                       1.16-3        &lt;br /&gt;
ii  libpwl5:armel                        0.11.2-6    &lt;br /&gt;
ii  libselinux1:armel                    2.1.0-4.1      &lt;br /&gt;
ii  libstdc++6:armel                     4.6.2-14       &lt;br /&gt;
ii  libthai0:armel                       0.1.16-3     &lt;br /&gt;
ii  linux-libc-dev:armel                 3.2.4-1         &lt;br /&gt;
ii  zlib1g:armel                         1:1.2.6.dfsg-1   &lt;br /&gt;
&lt;/pre&gt;&lt;br /&gt;
There are more packages which can be installed on amd64 for i386 as #659588 only affects Multi-Arch versions which cannot execute compiled binaries from the foreign architecture.&lt;br /&gt;
&lt;br /&gt;
Further progress, inside a test chroot, involves using &lt;a href=&quot;http://packages.qa.debian.org/gcc-4.7&quot;&gt;gcc-4.7&lt;/a&gt; from experimental but even then, &lt;b&gt;libc6-dev&lt;/b&gt; is not installable as a Multi-Arch package. That&#39;s the current blocker for toolchain stuff.&lt;br /&gt;
&lt;pre&gt;&lt;br /&gt;
ii  gcc-4.7-base:i386               4.7-20120210-1&lt;br /&gt;
ii  libgcc1:i386                    1:4.7-20120210-1&lt;br /&gt;
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
Once we have &lt;b&gt;libc6-dev:armel&lt;/b&gt; installable on i386 and amd64, work on cross-building Emdebian can be considered again. It&#39;s been a &lt;i&gt;long&lt;/i&gt; time.&lt;br /&gt;</content>
	<author>
	  <name>Neil Williams</name>
	   <email>nospam@example.com</email> 
	</author>
	<source>
	  <title type="html">Codehelp blog</title>
	  <subtitle type="html">Powered by Debian</subtitle>
	  <link rel="self" href="http://www.linux.codehelp.co.uk/serendipity/index.php?/feeds/index.rss1"/>
	  <id>http://www.linux.codehelp.co.uk/serendipity/</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">FACTA</title>
	<link href="http://richardhartmann.de/blog/posts/2012/02/FACTA/"/>
	<id>http://richardhartmann.de/blog/posts/2012/02/FACTA/</id>
	<updated>2012-02-12T11:49:49+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;You know ACTA and related topics have reached the mainstream
when &lt;strong&gt;the&lt;/strong&gt; &lt;a href=&quot;http://www.tagesschau.de&quot;&gt;German
news show&lt;/a&gt; devotes a segment of several minutes(!) to ACTA,
complete with background information about the sleazy backroom
dealings, and the various political sunday talk shows debate
controversially about it, as well. In a round of five 60-plus aged
people, only one defenced ACTA; the rest was sceptic or dead
against it.&lt;/p&gt;
&lt;p&gt;The several tens of thousands of people who walked the streets
of Germany yesterday (I couldn&#39;t; I am ill) really managed to stir
up Germany&#39;s political landscape. This. is. awesome.&lt;/p&gt;
&lt;p&gt;Now if only the population at large would understand the
inherent differences between physical counterfeiting, physical
theft, and copyright infrigement.&lt;/p&gt;
&lt;p&gt;That&#39;s where we all come in: Inform people about the background
and actual issues. Now, more than ever, there&#39;s a chance that they
will be willing to listen.&lt;/p&gt;</content>
	<author>
	  <name>Richard 'RichiH' Hartmann</name>
	   <uri>http://richardhartmann.de/blog/</uri> 
	</author>
	<source>
	  <title type="html">blog</title>
	  <subtitle type="html">richardhartmann.de</subtitle>
	  <link rel="self" href="http://richardhartmann.de/blog/index.atom"/>
	  <id>http://richardhartmann.de/blog/</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="fr">2012 update 9 for Debian Installer localization</title>
	<link href="http://www.perrier.eu.org/weblog/2012/02/12#di-l10n-update-2012-09"/>
	<id>http://www.perrier.eu.org/weblog/bubulle/planet-debian/di-l10n-update-2012-09</id>
	<updated>2012-02-12T06:00:00+00:00</updated>
	<summary type="html" xml:lang="fr"></summary>
	<content type="html" xml:lang="en">&lt;ul&gt;
&lt;li&gt;Indonesian completes level 1 and 3 and is now 100% everywhere
&lt;/li&gt;&lt;li&gt;Turkish completes level 1 and is now 100% everywhere
&lt;/li&gt;&lt;/ul&gt;
Status for D-I level 1 (core D-I files):
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;34&lt;/b&gt; languages 100%: ar ast bg bs cs de el eo es fa fr gu hi &lt;b&gt;id&lt;/b&gt; it ja kk km kn ko mr nb nl pl pt ru sk sr sv ta th &lt;b&gt;tr&lt;/b&gt; uk zh_CN
&lt;/li&gt;&lt;li&gt;2 languages 99%: si te
&lt;/li&gt;&lt;li&gt;1 language 97%: eu
&lt;/li&gt;&lt;li&gt;2 languages 96%: be he
&lt;/li&gt;&lt;li&gt;5 languages 95%: bn dz et ro zh_TW
&lt;/li&gt;&lt;li&gt;2 languages 94%: da ga
&lt;/li&gt;&lt;li&gt;3 languages 93%: hu is lo
&lt;/li&gt;&lt;li&gt;1 language 92%: sl
&lt;/li&gt;&lt;li&gt;2 languages 91%: pa vi
&lt;/li&gt;&lt;li&gt;others are 90% or below
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;
Status for D-I level 2 (packages that have localized material that may
appear during default installs, such as iso-codes, tasksel, etc.):
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;23 languages 100%: bg cs da de eo es fa fr he id is it ja kk nl pl pt ru si sk tr uk zh_CN
&lt;/li&gt;&lt;li&gt;4 languages 99%: be sl sv th
&lt;/li&gt;&lt;li&gt;6 languages 98%: ast dz ca eu pt_BR ro
&lt;/li&gt;&lt;li&gt;1 language 96%: nb
&lt;/li&gt;&lt;li&gt;2 langauges 95%: el fi
&lt;/li&gt;&lt;li&gt;5 languages 94%: ar gl hr vi zh_TW
&lt;/li&gt;&lt;li&gt;6 languages 92%: bn bs hu ko ne sr
&lt;/li&gt;&lt;li&gt;9 languages 91%: ga gu ka km lt mk mr ta te
&lt;/li&gt;&lt;li&gt;others are 90% or below
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;
Status for D-I level 3 (packages that have localized material that may
appear during non-default installs, such as win32-loader)
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;b&gt;31&lt;/b&gt; languages 100%:  be bg bs ca cs de el eo es fa fi fr ga gl he &lt;b&gt;id&lt;/b&gt; is it ja kk nb nl pl pt ru sk sr sv th tr zh_CN
&lt;/li&gt;&lt;li&gt;2 languages 98%:  hu uk
&lt;/li&gt;&lt;li&gt;others are 90% or below
&lt;/li&gt;&lt;/ul&gt;
Full 100% completeness (hall of fame) for &lt;b&gt;18&lt;/b&gt; languages:
Bulgarian, Czech, German, Esperanto, Spanish, Persian, French,
&lt;b&gt;Indonesian&lt;/b&gt;, Italian,
Japanese, Kazakh, Dutch, &lt;b&gt;Polish&lt;/b&gt;, Portuguese, Russian, Slovak, &lt;b&gt;Turkish&lt;/b&gt;
Simplified Chinese</content>
	<author>
	  <name>Christian Perrier</name>
	   <uri>http://www.perrier.eu.org/weblog/bubulle/planet-debian</uri> 
	</author>
	<source>
	  <title type="html">Bubulle's weblog</title>
	  <subtitle type="html">Random bits from Christian Perrier</subtitle>
	  <link rel="self" href="http://www.perrier.eu.org/weblog/bubulle/planet-debian/index.rss"/>
	  <id>http://www.perrier.eu.org/weblog/bubulle/planet-debian</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">XMPP for Children</title>
	<link href="http://changelog.complete.org/archives/7414-xmpp-for-children"/>
	<id>http://changelog.complete.org/?p=7414</id>
	<updated>2012-02-12T05:02:43+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;When Jacob was just born, I wondered how I might introduce them to computing.  I thought over various things, but that wasn’t really the most pressing thing right then.&lt;/p&gt;
&lt;p&gt;I don’t suppose that I could have predicted installing an XMPP IM server (&lt;a href=&quot;http://prosody.im/&quot;&gt;Prosody&lt;/a&gt;) for the boys.  And I certainly couldn’t have predicted creating accounts named: jacob, oliver, butterfly, bear.  Because, as Jacob pointed out to me, if (Jacob’s favorite toy) butterfly is typing with his wings, then he shouldn’t be logged in as Jacob.  I admire my 5-year-old’s security consciousness…&lt;/p&gt;
&lt;p&gt;Anyhow, as I &lt;a href=&quot;http://changelog.complete.org/archives/7401-shell-scripts-for-preschoolers&quot;&gt;mentioned yesterday&lt;/a&gt;, Jacob and Oliver enjoy “their” computer, which I recently put on the LAN.  The firewall does not pass any of its traffic to the Internet, though, with very limited exceptions.&lt;/p&gt;
&lt;p&gt;Jacob can read, and is starting to enjoy typing as well.  So I thought he would enjoy sending IMs to me.  As his computer has no GUI, I needed a text-mode client.  Something with an IRC-like interface that could be scripted to open up a window with me directly sounded perfect.  Initially I tried irssi’s XMPP plugin, but it proved to be too buggy (wanting to always latch on to a particular resource on the remote end, not having very predictable window behavior, etc.)  So I switched to &lt;a href=&quot;http://mcabber.com/&quot;&gt;mcabber&lt;/a&gt;.  With a couple of quick configuration bits to get him automatically logged in, remove superflous windows, and connect him directly to a chat with me, it was set.  And well-loved.  He sent me a mix of real words and random things he created by replacing letters in “Jacob” or by holding down keys.&lt;/p&gt;
&lt;p&gt;In the mcabberrc, besides the obvious setting of username and password, there is:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;br /&gt;
set log_win_height = 1&lt;br /&gt;
set hook-post-connect = source ~/.mcabber/post-connect.rc&lt;br /&gt;
&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The hook is simply:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;br /&gt;
roster search Dad&lt;br /&gt;
roster hide&lt;br /&gt;
&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;After awhile, Jacob wanted to switch computers.  He wanted to use my laptop, and me use his computer.  He refused to switch back.  I asked him why.  “Because on your computer, my name is red.”  I should have known.  I set it to bright white on his computer, but I think tomorrow we may need to upgrade him to the color monitor I’ve been saving for just such an occasion…  It will be a whole new set of discoveries, I’m sure.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Update&lt;/b&gt;: I also tried out freetalk, which looked like it would meet my goals nicely.  The problem was it didn’t have a dedicated “everything typed goes to this person” mode.  It did have a mode where it put the person’s JID on the command line by default, but excessive use of backspace key by a 5-year-old could wipe that out and leave it in a state where he’d be confused.&lt;/p&gt;</content>
	<author>
	  <name>John Goerzen</name>
	   <uri>http://changelog.complete.org</uri> 
	</author>
	<source>
	  <title type="html">The Changelog</title>
	  <subtitle type="html">Viewpoints on technology, society, and government</subtitle>
	  <link rel="self" href="http://changelog.complete.org/feed"/>
	  <id>http://changelog.complete.org</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">Express Sessions with connect-redis + Socket.IO in CoffeeScript</title>
	<link href="http://ghostbar.ath.cx/2012/02/11/express-sessions-with-connect-redis-socket-io-in-coffeescript/"/>
	<id>http://ghostbar.ath.cx/?p=629</id>
	<updated>2012-02-12T02:14:01+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;If you are working with &lt;a href=&quot;http://socket.io/&quot;&gt;Socket.IO&lt;/a&gt; and &lt;a href=&quot;http://expressjs.com/&quot;&gt;Express Framework&lt;/a&gt; while developing your applications you must know they work together so Socket.IO will listen on the same port that your HTTP/S server and will serve the requests by that way, but Socket.IO doesn’t works on the same paradigm where you pass a middleware to the route and you could get authentication on this manner. Instead, you must configure Socket.IO with a global authorization method or a handshake authorization manner.&lt;/p&gt;
&lt;p&gt;Since in my applications I serve cookies already where I save session info and this is already stored in Redis with help of the module connect-redis then I should be able to get this info onto Socket.IO authorization method and with this allow only to authorized users to get info from my websockets.&lt;/p&gt;
&lt;p&gt;I found &lt;a href=&quot;http://www.danielbaulig.de/socket-ioexpress/&quot;&gt;how to do it with the default session-store in-memory from Express&lt;/a&gt;, and adapted that so it could work with Redis.&lt;/p&gt;
&lt;p&gt;Here’s the snippet:&lt;/p&gt;
&lt;p&gt;&amp;lt;script src=&quot;https://gist.github.com/1805743.js&quot;&amp;gt; &amp;lt;/script&amp;gt;&amp;lt;noscript&amp;gt;You don’t have JavaScript enabled, check it out &lt;a href=&quot;https://gist.github.com/1805743&quot;&gt;at gist.github.com »&lt;/a&gt;&amp;lt;/noscript&amp;gt;&lt;/p&gt;
&lt;p&gt;Hope anyone can found it useful!&lt;/p&gt;</content>
	<author>
	  <name>ghostbar</name>
	   <uri>http://ghostbar.ath.cx</uri> 
	</author>
	<source>
	  <title type="html">ghostbar » Planet Debian</title>
	  
	  <link rel="self" href="http://ghostbar.ath.cx/tag/planet-debian/feed/"/>
	  <id>http://ghostbar.ath.cx</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">On arranging meetings</title>
	<link href="http://www.earth.li/~noodles/blog/2012/02/on-arranging-meetings.html"/>
	<id>http://www.earth.li/~noodles/blog/2012/02/on-arranging-meetings.html</id>
	<updated>2012-02-11T23:44:31+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;I&#39;ve been spending a lot more time recently in meetings. Mostly things I
should actually be at. And in general if it&#39;s something I think is
reasonable I&#39;ll try to be there. In an effort to help with this I
actually keep my work calendar up to date. Given that I&#39;m running Linux
on my laptop and the corporate standard is Exchange this requires a
little bit of effort on my part (the &lt;a href=&quot;https://addons.mozilla.org/en-us/thunderbird/addon/provider-for-microsoft-exchang/&quot;&gt;Thunderbird Provider for Microsoft
Exchange&lt;/a&gt;
and Android support for talking to Exchange are helpful with this).&lt;/p&gt;

&lt;p&gt;Sometimes it seems like I shouldn&#39;t bother. I spent this week at a
conference, and marked my calendar to indicate I was out of the office.
I think I had at least 3 meeting requests, all for things that would
actually have been appropriate for me to go to. Last week I managed to
be booked for 7 hours of meetings from 7am until noon. That included a
30 minute window where I was triple booked.&lt;/p&gt;

&lt;p&gt;The thing is, I&#39;m really not that busy in terms of meetings - you can
usually find a spot when I&#39;m free on any given day unless I&#39;m actually
not in the office. If you bother to check my calendar, that is.&lt;/p&gt;

&lt;p&gt;Another problem I have is the times people like to book meetings at.
Booking a technical meeting at 9am isn&#39;t going to get me at my best.
Equally doing so at 5pm is likely to have me clock watching to make sure
I don&#39;t miss my bus and/or train. Also I seem to work with far too many
people who don&#39;t eat lunch and book hour long meetings at midday or 1pm.&lt;/p&gt;

&lt;p&gt;I understand sometimes that&#39;s the only time you can get everyone into a
room together, but at least bloody ask and explain the need rather than
just sending out a meeting invite.&lt;/p&gt;

&lt;p&gt;Finally, book meetings of a realistic length. There are some people who
invite me to things and cause me to add another 30 minutes on the end,
because I know it always overruns.&lt;/p&gt;

&lt;p&gt;It&#39;s not all bad. I have a VP who &lt;em&gt;always&lt;/em&gt; runs a meeting to time, and
never seems to call one for spurious reasons. I&#39;ve also worked with a
program manager who will organize the meeting so that if you&#39;re only
there for one point on the agenda that&#39;ll get dealt with near the
beginning so it doesn&#39;t take up more of your time that it needs to.
Funnily enough I&#39;m much more likely to go to things both of these people
arrange.&lt;/p&gt;

&lt;p&gt;Disclaimer: In the unlikely event anyone I work with who invites me to
meetings is reading this, I might be talking about you, but everything I
mention has been done by more than one person, so I&#39;m not thinking about
anyone in particular for each point.&lt;/p&gt;</content>
	<author>
	  <name>Jonathan McDowell</name>
	   <uri>http://www.earth.li/~noodles/blog/</uri> 
	</author>
	<source>
	  <title type="html">Noodles' Emptiness</title>
	  <subtitle type="html">Dude! Sweet!</subtitle>
	  <link rel="self" href="http://www.earth.li/~noodles/blog/index.rss"/>
	  <id>http://www.earth.li/~noodles/blog/</id>  <rights type="html">Copyright 2012</rights>
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">multiarch (and) hacks</title>
	<link href="http://jackyf.livejournal.com/118415.html"/>
	<id>http://jackyf.livejournal.com/118415.html</id>
	<updated>2012-02-11T16:19:02+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">I experienced situations of writing substantial amounts of code (feature branches) for hours, days and even weeks only to find later that the written code can be thrown to the bin, either because of hidden design problem(s) or too much negative implications outweighting the positive implications of the change.&lt;br /&gt;&lt;br /&gt;After reading some recent multiarch threads on debian-devel@ and seeing what hacks are seriously being proposed to implement only to keep the thing going, I now think that the low-level part of the Debian multiarch implementation proposal is no less broken than its high-level part, and the whole proposal is a one big hack which requires and will require more subhacks. Some will benefit from the added functionality, but all, both maintainers and users will suffer from drawbacks.&lt;br /&gt;&lt;br /&gt;How two paragraphs above are related? We still have the time to revert the changes and say &quot;sorry, it was a nice idea but the software world isn&#39;t ready&quot;.</content>
	<author>
	  <name>Eugene V. Lyubimkin</name>
	   <uri>http://jackyf.livejournal.com/</uri> 
	</author>
	<source>
	  <title type="html">JackYF's blog</title>
	  <subtitle type="html">JackYF&#39;s blog - LiveJournal.com</subtitle>
	  <link rel="self" href="http://jackyf.livejournal.com/data/rss?tag=debian-en"/>
	  <id>http://jackyf.livejournal.com/</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">mutt-notmuch 0.2</title>
	<link href="http://upsilon.cc/~zack/blog/posts/2012/02/mutt-notmuch_0.2/"/>
	<id>http://upsilon.cc/~zack/blog/posts/2012/02/mutt-notmuch_0.2/</id>
	<updated>2012-02-11T14:15:20+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;My &lt;a href=&quot;http://upsilon.cc/~zack/blog/planet-debian/../posts/2011/01/how_to_use_Notmuch_with_Mutt/&quot;&gt;mutt-notmuch
hack&lt;/a&gt; seems to be a quite popular way to integrate &lt;a href=&quot;http://www.mutt.org/&quot;&gt;Mutt&lt;/a&gt; with &lt;a href=&quot;http://notmuchmail.org/&quot;&gt;notmuch&lt;/a&gt;. As a nice consequence, my
(indexed!) inbox attracts patches from mutt-notmuch users eager to
improve it. Collecting some of them, I&#39;ve just tagged &lt;a href=&quot;https://gitorious.org/mutt-notmuch/mutt-notmuch/trees/0.2&quot;&gt;mutt-notmuch
0.2&lt;/a&gt; with the following changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;readline support and query history&lt;/li&gt;
&lt;li&gt;support for spaces in mailboxes (use case:
gmail+offlineimap)&lt;/li&gt;
&lt;li&gt;a new &quot;tag&quot; action&lt;/li&gt;
&lt;li&gt;normalization of &lt;code&gt;=names&lt;/code&gt; to support mutt macros
that pass folder names&lt;/li&gt;
&lt;li&gt;do not treat &lt;code&gt;+opt&lt;/code&gt; as a valid cmdline option (to
ease tagging)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Many thanks to Scott Barker, Christine Spang, David Newgas, and
Ryan Kavanagh for the above patches.&lt;/p&gt;
&lt;p&gt;While I was at it, I&#39;ve also moved mutt-notmuch repository
&lt;a href=&quot;https://gitorious.org/mutt-notmuch/&quot;&gt;to Gitorious&lt;/a&gt;. Git
self-hosting is nice, but either you move to something like
gitolite (which I didn&#39;t have time to setup and tune ATM) or you&#39;re
stuck without merge requests which are quite nice. &lt;small&gt;(Why not
Github? &lt;a href=&quot;http://mako.cc/writing/hill-free_tools.html&quot;&gt;Because.&lt;/a&gt;)&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;If you&#39;re using mutt-notmuch you might also be interested in the
discussion of &lt;a href=&quot;http://thread.gmane.org/gmane.mail.notmuch.general/7310&quot;&gt;libnotmuch
support in mutt&lt;/a&gt;. I&#39;d love to see that landing in mutt and be
able to throw away mutt-notmuch entirely, but that seems a bit
premature as of yet.&lt;/p&gt;</content>
	<author>
	  <name>Stefano Zacchiroli</name>
	   <uri>http://upsilon.cc/~zack/blog/planet-debian/</uri> 
	</author>
	<source>
	  <title type="html">blog/planet-debian</title>
	  <subtitle type="html">I&#39;m in a Hurry - Zack&#39;s Blog (on Planet Debian)</subtitle>
	  <link rel="self" href="http://upsilon.cc/~zack/blog/planet-debian/index.rss"/>
	  <id>http://upsilon.cc/~zack/blog/planet-debian/</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">It hurts…</title>
	<link href="http://fenski.pl/2012/02/it-hurts/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=it-hurts"/>
	<id>http://fenski.pl/?p=224</id>
	<updated>2012-02-11T08:58:19+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;…when you find caution *after* being sufferer of some known problem.&lt;/p&gt;
&lt;p&gt;Caution marked red at the beginning of &lt;a href=&quot;http://forum.notebookreview.com/asus/174395-bios-update-guide-asus-notebooks.html&quot; title=&quot;BIOS update&quot;&gt;this article&lt;/a&gt; is the way I bricked my laptop.&lt;/p&gt;
&lt;p&gt;Maybe they should change the name of that option from EasyFlash to EasyBrick.&lt;/p&gt;</content>
	<author>
	  <name>fEnIo</name>
	   <uri>http://fenski.pl</uri> 
	</author>
	<source>
	  <title type="html">fenski.pl » fenski.pl</title>
	  <subtitle type="html">If anything can go wrong, it will</subtitle>
	  <link rel="self" href="http://fenski.pl/category/debian/feed/"/>
	  <id>http://fenski.pl</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">Useful changelog…</title>
	<link href="http://fenski.pl/2012/02/useful-changelog/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=useful-changelog"/>
	<id>http://fenski.pl/?p=220</id>
	<updated>2012-02-11T08:49:36+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;Here it goes:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://fenski.pl/wp-content/uploads/2012/02/bios.jpg&quot; alt=&quot;BIOS changelog&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Tell me if I should upgrade it or not…&lt;/p&gt;</content>
	<author>
	  <name>fEnIo</name>
	   <uri>http://fenski.pl</uri> 
	</author>
	<source>
	  <title type="html">fenski.pl » fenski.pl</title>
	  <subtitle type="html">If anything can go wrong, it will</subtitle>
	  <link rel="self" href="http://fenski.pl/category/debian/feed/"/>
	  <id>http://fenski.pl</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">Magic entries for BTRFS and Software RAID</title>
	<link href="http://etbe.coker.com.au/2012/02/11/magic-btrfs-raid/"/>
	<id>http://etbe.coker.com.au/?p=3179</id>
	<updated>2012-02-11T07:21:07+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;I’ve just discovered that the magic database for the file(1) command in Debian/Unstable has no support for Linux Software RAID and that it’s support for BTRFS is lacking (no reporting of space used, number of devices, or the UUID). Below is my first draft of a change to fix these problems. I would appreciate it if someone with a big-endian system could test these out and let me know how they go, I suspect that I will have to change the “lelong” types to “long” but I’m not sure.&lt;/p&gt;
&lt;p&gt;4096 lelong 0xa92b4efc Linux Software RAID&lt;br /&gt;
&amp;gt;4100 lelong x version 1.2 (%d)&lt;br /&gt;
&amp;gt;4112 belong x UUID=%8x:&lt;br /&gt;
&amp;gt;4116 belong x \b%8x:&lt;br /&gt;
&amp;gt;4120 belong x \b%8x:&lt;br /&gt;
&amp;gt;4124 belong x \b%8x&lt;br /&gt;
&amp;gt;4128 string x name=%s&lt;br /&gt;
&amp;gt;4168 lelong x level=%d&lt;br /&gt;
&amp;gt;4188 lelong x disks=%d&lt;/p&gt;
&lt;p&gt;0 lelong 0xa92b4efc Linux Software RAID&lt;br /&gt;
&amp;gt;4 lelong x version 1.1 (%d)&lt;br /&gt;
&amp;gt;16 belong x UUID=%8x:&lt;br /&gt;
&amp;gt;20 belong x \b%8x:&lt;br /&gt;
&amp;gt;24 belong x \b%8x:&lt;br /&gt;
&amp;gt;28 belong x \b%8x&lt;br /&gt;
&amp;gt;32 string x name=%s&lt;br /&gt;
&amp;gt;72 lelong x level=%d&lt;br /&gt;
&amp;gt;92 lelong x disks=%d&lt;/p&gt;
&lt;p&gt;# BTRFS&lt;br /&gt;
0×10040 string _BHRfS_M BTRFS Filesystem&lt;br /&gt;
&amp;gt;0x1012b string &amp;gt;\0 label &quot;%s&quot;,&lt;br /&gt;
&amp;gt;0×10090 lelong x sectorsize %d,&lt;br /&gt;
&amp;gt;0×10094 lelong x nodesize %d,&lt;br /&gt;
&amp;gt;0×10098 lelong x leafsize %d,&lt;br /&gt;
&amp;gt;0×10020 belong x UUID=%8x-&lt;br /&gt;
&amp;gt;0×10024 beshort x \b%4x-&lt;br /&gt;
&amp;gt;0×10026 beshort x \b%4x-&lt;br /&gt;
&amp;gt;0×10028 beshort x \b%4x-&lt;br /&gt;
&amp;gt;0x1002a beshort x \b%4x&lt;br /&gt;
&amp;gt;0x1002c belong x \b%8x,&lt;br /&gt;
&amp;gt;0×10078 lequad x %lld/&lt;br /&gt;
&amp;gt;0×10070 lequad x \b%lld bytes used,&lt;br /&gt;
&amp;gt;0×10088 lequad x %lld devices&lt;/p&gt;
&lt;p&gt;Related posts:&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;http://etbe.coker.com.au/2008/07/08/label-vs-uuid-vs-device/&quot; rel=&quot;bookmark&quot; title=&quot;Label vs UUID vs Device&quot;&gt;Label vs UUID vs Device&lt;/a&gt; &lt;small&gt;Someone asked on a mailing list about the issues related...&lt;/small&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://etbe.coker.com.au/2012/02/10/starting-with-btrfs/&quot; rel=&quot;bookmark&quot; title=&quot;Starting with BTRFS&quot;&gt;Starting with BTRFS&lt;/a&gt; &lt;small&gt;Based on my investigation of RAID reliability [1] I have...&lt;/small&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://etbe.coker.com.au/2007/11/16/software-vs-hardware-raid/&quot; rel=&quot;bookmark&quot; title=&quot;Software vs Hardware RAID&quot;&gt;Software vs Hardware RAID&lt;/a&gt; &lt;small&gt;Should you use software or hardware RAID? Many people claim...&lt;/small&gt;&lt;/li&gt;
&lt;/ol&gt;</content>
	<author>
	  <name>etbe</name>
	   <uri>http://etbe.coker.com.au</uri> 
	</author>
	<source>
	  <title type="html">etbe - Russell Coker</title>
	  <subtitle type="html">Linux, politics, and other interesting things</subtitle>
	  <link rel="self" href="http://etbe.coker.com.au/feed/"/>
	  <id>http://etbe.coker.com.au</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">Shell Scripts For Preschoolers</title>
	<link href="http://changelog.complete.org/archives/7401-shell-scripts-for-preschoolers"/>
	<id>http://changelog.complete.org/?p=7401</id>
	<updated>2012-02-11T04:19:13+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;It probably comes as no surprise to anybody that Jacob has &lt;a href=&quot;http://changelog.complete.org/archives/1448-introducing-the-command-line-at-3-years&quot;&gt;had a computer since he was 3&lt;/a&gt;. Jacob and I built it from spare parts, together.&lt;/p&gt;
&lt;p&gt;It may come as something of a surprise that it has no graphical interface, and &lt;a href=&quot;http://changelog.complete.org/archives/1448-introducing-the-command-line-at-3-years&quot;&gt;Jacob uses the command line&lt;/a&gt; and &lt;a href=&quot;http://changelog.complete.org/archives/1451-jacob-has-a-new-computer-and-a-favorite-shell&quot;&gt;loves it&lt;/a&gt; — and did even before he could really read.&lt;/p&gt;
&lt;p&gt;A few months ago, I &lt;a href=&quot;http://changelog.complete.org/archives/6915-a-4-year-old-linux-command-line-and-microphone&quot;&gt;wrote about the fun Jacob had with speakers and a microphone&lt;/a&gt;, and posted a copy of the cheat sheet he has with his computer. Lately, Jacob has really enjoyed playing with the speech synthesizer — both trying to make it say real words and nonsense words. Sometimes he does that for an hour.&lt;/p&gt;
&lt;p&gt;I was asked for a copy of the scripts I wrote. They are really simple. I gave them names that would be easy for a preschooler to remember and spell, even if they conflicted with existing Unix/Linux commands. I put them in /usr/local/bin, which occurs first on the PATH, so it doesn’t matter if they conflict.&lt;/p&gt;
&lt;p&gt;First, for speech systhesis, /usr/local/bin/talk:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
echo &quot;Press Ctrl-C to stop.&quot;&lt;br /&gt;
espeak -v en-us -s 150&lt;br /&gt;
&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;espeak comes from the espeak package. It seemed to give the most consistenly useful response.&lt;/p&gt;
&lt;p&gt;Now, on to the sound-related programs. Here’s /usr/local/bin/ssl, the “sound steam locomotive”. It starts playing a train sound if one isn’t already playing:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
pgrep mpg321 &amp;gt; /dev/null || mpg321 -q /usr/local/trainsounds/main.mp3 &amp;amp;&lt;br /&gt;
sl &quot;$@&quot;&lt;br /&gt;
&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;And then there’s /usr/local/bin/record:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
cd $HOME/recordings&lt;br /&gt;
echo &quot;Now recording. Press Ctrl-C to stop.&quot;&lt;br /&gt;
DATE=`date +%Y-%m-%dT%H-%M-%S`&lt;br /&gt;
FILENAME=&quot;$DATE-$$.wav&quot;&lt;br /&gt;
chmod a-w *.wav&lt;br /&gt;
exec arecord -c 1 -f S16_LE -c 1 -r 44100 &quot;$FILENAME&quot;&lt;br /&gt;
&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This simply records in a timestamped file. Then, its companion, /usr/local/bin/play.  Sorry about the indentation; for whatever reason, it is being destroyed by the blog, but you get the idea.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
case &quot;$1&quot; in&lt;br /&gt;
train)&lt;br /&gt;
mpg321 /usr/local/trainsounds/main.mp3&lt;br /&gt;
;;&lt;br /&gt;
song)&lt;br /&gt;
/usr/bin/play /usr/local/trainsounds/traindreams.flac&lt;br /&gt;
;;&lt;br /&gt;
*)&lt;br /&gt;
cd $HOME/recordings&lt;br /&gt;
exec aplay `ls -tr| tail -n 1`&lt;br /&gt;
;;&lt;br /&gt;
esac&lt;br /&gt;
&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;So, Jacob can run just “play”, which will play back his most recent recording. As something of a bonus, the history of recordings is saved for us to listen to later. If he types “play train”, there is the sound of a train passing. And, finally, “play song” plays &lt;a href=&quot;https://www.youtube.com/watch?v=9pAZ-4XhKuI&quot;&gt;Always a Train in My Dreams&lt;/a&gt; by Steve Gillette (I heard it on the radio once and bought the CD).&lt;/p&gt;
&lt;p&gt;Some of these commands kick off sound playing in the background, so here is /usr/local/bin/bequiet:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
killall mpg321 &amp;amp;&amp;gt; /dev/null&lt;br /&gt;
killall play &amp;amp;&amp;gt; /dev/null&lt;br /&gt;
killall aplay &amp;amp;&amp;gt; /dev/null&lt;br /&gt;
killall cw &amp;amp;&amp;gt; /dev/null&lt;br /&gt;
&lt;/code&gt;&lt;/p&gt;</content>
	<author>
	  <name>John Goerzen</name>
	   <uri>http://changelog.complete.org</uri> 
	</author>
	<source>
	  <title type="html">The Changelog</title>
	  <subtitle type="html">Viewpoints on technology, society, and government</subtitle>
	  <link rel="self" href="http://changelog.complete.org/feed"/>
	  <id>http://changelog.complete.org</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">Livin’ on the edge</title>
	<link href="http://fenski.pl/2012/02/livin-on-the-edge/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=livin-on-the-edge"/>
	<id>http://fenski.pl/?p=216</id>
	<updated>2012-02-10T18:26:15+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;zenbook ~ # uname -r&lt;br /&gt;
3.3.0-rc3-fenio&lt;br /&gt;
zenbook ~ # &lt;/p&gt;
&lt;p&gt;Let’s see how many sudden shutdowns will be on that kernel &lt;img src=&quot;http://fenski.pl/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;</content>
	<author>
	  <name>fEnIo</name>
	   <uri>http://fenski.pl</uri> 
	</author>
	<source>
	  <title type="html">fenski.pl » fenski.pl</title>
	  <subtitle type="html">If anything can go wrong, it will</subtitle>
	  <link rel="self" href="http://fenski.pl/category/debian/feed/"/>
	  <id>http://fenski.pl</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">Rant: Your custom rounding code is wrong</title>
	<link href="http://blog.sesse.net/blog/tech/2012-02-10-19-20_rant_your_custom_rounding_code_is_wrong.html"/>
	<id>http://blog.sesse.net/blog/tech/2012-02-10-19-20_rant_your_custom_rounding_code_is_wrong.html</id>
	<updated>2012-02-10T18:20:00+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;Maxims (or “TL;DR” if you want):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Any time you write your own rounding code, it&#39;s most likely wrong.&lt;/li&gt;
&lt;li&gt;Any time you think your rounding code is faster than what the standard
library can give you, you&#39;re most likely wrong. (This one has exceptions,
though.)&lt;/li&gt;
&lt;li&gt;Any time your rounding code involves the constant 0.5, it&#39;s almost
certainly wrong.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why?&lt;/p&gt;

&lt;p&gt;So, let&#39;s start off by assuming you have a float and you want to convert that
to an int. (Or maybe you have five million of them.) I&#39;ll assume a more or less
x86/Linux environment, although of course, the real world is a bit more
complex.&lt;/p&gt;

&lt;p&gt;OK, so you&#39;ve decided to write your own rounding function.&lt;/p&gt;

&lt;p&gt;Anyway, first of all, what are you going to do about the floating-point numbers
that don&#39;t represent real numbers? Positive and negative infinity? NaN? OK,
maybe only floating-point buffs ever care about those. (I&#39;m not one of them.)
Maybe it would be nice to have some sort of consistent behavior for, say, the
value 2^48, but maybe you also don&#39;t care, since you have a certain amount of
control as of where these numbers come from anyway. Sure.&lt;/p&gt;

&lt;p&gt;So, you write your function. Most likely, someone taught you somewhere that you
can do proper rounding in Excel by adding 0.5, so you write:&lt;/p&gt;

&lt;pre&gt;return (int)(x + 0.5f);
&lt;/pre&gt;

&lt;p&gt;Now, of course, the (int) cast is a rounding in itself, in truncation mode
(this is, by the way, my single least favorite decision by K&amp;amp;R). If you&#39;re
unlucky enough to be on 32-bit, this makes the compiler spew out tons of stuff
for changing the rounding mode, so you pretty much lost. Perhaps you write
something similar using inline assembler and the x87 FISTP instruction; now you
just made sure that on 64-bit, all your floats have to round-trip from SSE to
x87 just to get to ints. (Or maybe you use some dodgy trick you learned from a
web forum at some point and thought were exceedingly cool and elegant, which
destroys your range. Who knows.)&lt;/p&gt;

&lt;p&gt;OK, so maybe you can get the int-truncate step fast and correct. After all,
eventually CPUs started to get their own instructions for
convert-to-int-with-truncate, since C has made that so common. So your function
converts 0.4f to 0, and 0.5f to 1. Fine. Now, what do you do with negative
values? -0.5f becomes 0, which means you just violated that round(-x) =
-round(x). (Even worse, -0.6f becomes 0.) OK. Maybe you don&#39;t care about that (in fact, maybe you think,
correctly or not, that this is exactly what you want). Maybe you change your
inline assembler to test if the number is negative or not, and add -0.5f
instead, in which case you just incurred a (costly) branch. But OK, let&#39;s say
you&#39;re happy about the behavior with negative numbers.&lt;/p&gt;

&lt;p&gt;Maybe you also don&#39;t worry that this introduces a bias towards rounding up,
both for positive and negative numbers; slightly more floats will be rounded up
than down. After all, you&#39;re most likely not in the hair-splitting business. It
should be noted, though, that IEEE has a solution for this, called
“round-to-nearest-even”, where numbers ending in .5 are rounded up and down
every other time to avoid just this issue (-1.5f → -2, -0.5f → 0, 0.5f → 0,
1.5f → 2, and so on).&lt;/p&gt;

&lt;p&gt;OK, but even if you&#39;re happy with your behavior with numbers ending in about
0.5, at least it should round the right way for things between 0.0 and less and
0.5, right? Here comes another maxim: &lt;em&gt;Rounding twice is doomed to fail.&lt;/em&gt; This
might seem intuitive, but not everybody understands this; when I was ten, I had
a maths teacher that insisted that 1.46 could be rounded to 2 (“I wouldn&#39;t
grade that as an error”, in her own words), because you could round 1.46 → 1.5
→ 2.0. But whenever you do an add, you also do a round, so you do get rounding
twice. The case in point is ~0.4999999701976776123046875, the largest floating-point number
below 0.5. If you had 0.5 to this, you&#39;ll end up with 0.999999975, except that
you don&#39;t have enough mantissa bits to represent this exactly, so it gets
rounded off to 1.0, so now your function yields round(0.49999997) = 1! Oops.&lt;/p&gt;

&lt;p&gt;OK. So maybe you don&#39;t care that your function rounds the wrong way every now
and then. (And if you think this won&#39;t ever happen; I&#39;ve seen it happen in real
code. For doubles.) Sometimes speed is more important than correctness. But now
you&#39;ve basically said that you &lt;em&gt;do not care&lt;/em&gt;, so allow me to suggest just calling
lrintf(), the standard library&#39;s method for converting floats to ints. The
implementation looks like this:&lt;/p&gt;

&lt;pre&gt;cvtss2si %xmm0, %eax
ret
&lt;/pre&gt;

&lt;p&gt;If you run with -fno-math-errno (implied by -ffast-math), it will even get
inlined to this single instruction! ¹ Do you really think you can beat that? It
will even follow whatever rounding mode you&#39;ve set, which is most likely the
default, sane, bias-free round-to-even, with no issues with 0.499999975 or
similar madness. The inlined version will take you all of three cycles (at
least two of which can be overlapped with other stuff), and there&#39;s no way on
Earth you can beat that for speed. (I mean, your CPU has special circuitry for
doing this. If adding 0.5 were the fastest way, maybe it would just do that
internally.) You&#39;d think people actually noticed this and didn&#39;t write their
own functions that are slower than what the standard library gives, but a)
maybe the code was written ten years ago on an entirely different platform
where this was not the case, and b) people generally don&#39;t measure their code;
a profiler seems to be a completely unheard of tool for most developers, even
if they write performance-critical code, so they miss the fact that 70% of
their time is spent in their brilliant inlined rounding function.&lt;/p&gt;

&lt;p&gt;Granted, this is the most dodgy part of my assertions; for instance, if you&#39;re
on ARM, lrintf() is vastly more complex, and the compiler matters here. (I did
take a reservation. :-) ) But even if so, the other maxims really come into
play; if you really care about speed, the right thing to do here on ARM is to
do a single round-to-int instruction (VCVTR), not to add 0.5 as a fudge factor.&lt;/p&gt;

&lt;p&gt;¹ Unfortunately GCC won&#39;t output this sequence without -fno-math-errno, due to
language-lawyering reasons — basically it seemingly is not allowed to make a
conversion that doesn&#39;t set errno on overflow, even though glibc is, since it
has communicated it to the program through other means.&lt;/p&gt;

&lt;p&gt;Update: Sam pointed out that the constant in question is not 0.499999975,
but slightly larger.&lt;/p&gt;</content>
	<author>
	  <name>Steinar H. Gunderson</name>
	   <uri>http://blog.sesse.net/</uri> 
	</author>
	<source>
	  <title type="html">Steinar H. Gunderson</title>
	  <subtitle type="html">sesse&#39;s blog</subtitle>
	  <link rel="self" href="http://blog.sesse.net/blog/tech/?flav=rss"/>
	  <id>http://blog.sesse.net/</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">kvm and product_uuid</title>
	<link href="http://www.outflux.net/blog/archives/2012/02/10/kvm-and-product_uuid/"/>
	<id>http://www.outflux.net/blog/?p=584</id>
	<updated>2012-02-10T18:08:17+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;While looking for something to use as a system-unique fall-back when a TPM is not available, I looked at &lt;code&gt;/sys/devices/virtual/dmi/id/product_uuid&lt;/code&gt; (same as &lt;code&gt;dmidecode&lt;/code&gt;‘s “System Information / UUID”), but was disappointed when, under KVM, the file was missing (and running &lt;code&gt;dmidecode&lt;/code&gt; crashes KVM *cough*). However, after a quick check, I noticed that KVM supports the “&lt;code&gt;-uuid&lt;/code&gt;” option to set the value of &lt;code&gt;/sys/devices/virtual/dmi/id/product_uuid&lt;/code&gt;. Looks like libvirt &lt;a href=&quot;http://libvirt.org/guide/html/Application_Development_Guide-Connections-Capability_Info.html&quot;&gt;supports this&lt;/a&gt; under &lt;code&gt;capabilities / host / uuid&lt;/code&gt; in the XML, too.&lt;/p&gt;
&lt;pre class=&quot;brush:shell&quot;&gt;host# kvm -uuid 12345678-ABCD-1234-ABCD-1234567890AB ...
host# ssh localhost ...
...
guest# cat /sys/devices/virtual/dmi/id/product_uuid
12345678-ABCD-1234-ABCD-1234567890AB
&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot;&gt;© 2012, &lt;a href=&quot;http://www.outflux.net/blog/&quot;&gt;Kees Cook&lt;/a&gt;. This work is licensed under a &lt;a href=&quot;http://creativecommons.org/licenses/by-sa/3.0/us/&quot; rel=&quot;license&quot;&gt;Creative Commons Attribution-ShareAlike 3.0 License&lt;/a&gt;.&lt;br /&gt;&lt;a href=&quot;http://creativecommons.org/licenses/by-sa/3.0/us/&quot; rel=&quot;license&quot;&gt;&lt;img src=&quot;http://i.creativecommons.org/l/by-sa/3.0/us/88x31.png&quot; alt=&quot;Creative Commons License&quot; style=&quot;border-width: 0;&quot; /&gt;&lt;/a&gt; &lt;/p&gt;</content>
	<author>
	  <name>kees</name>
	   <uri>http://www.outflux.net/blog</uri> 
	</author>
	<source>
	  <title type="html">codeblog » Debian</title>
	  <subtitle type="html">code is freedom -- patching my itch</subtitle>
	  <link rel="self" href="http://www.outflux.net/blog/archives/category/debian/feed/"/>
	  <id>http://www.outflux.net/blog</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">People behind Debian: Ana Beatriz Guerrero López, member of the Debian KDE team</title>
	<link href="http://raphaelhertzog.com/2012/02/10/people-behind-debian-ana-beatriz-guerrero-lopez-member-of-the-debian-kde-team/"/>
	<id>http://raphaelhertzog.com/?p=2528</id>
	<updated>2012-02-10T18:00:00+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/tiagovaz/3756824136/in/set-72157621707723876/&quot;&gt;&lt;img src=&quot;http://raphaelhertzog.com/files/2012/02/ana.jpg&quot; title=&quot;Ana Guerrero López&quot; height=&quot;300&quot; width=&quot;220&quot; alt=&quot;&quot; class=&quot;alignleft size-full wp-image-2585&quot; /&gt;&lt;/a&gt; If you met Ana, you’ll easily remember her. She has a great and pronounced Spanish accent… &lt;img src=&quot;http://raphaelhertzog.com/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:-)&quot; class=&quot;wp-smiley&quot; /&gt;  I’m glad that the existence of the Debian Women project helped her to join Debian because she has been doing a great job.&lt;/p&gt;
&lt;p&gt;From KDE packaging to publicity/marketing work, her interests shifted over the years but this allowed her to stay very involved. As she explains it very well, Debian is big enough so that you can stop doing something which is no longer fun for you, and still find something new to do in another part of Debian!&lt;/p&gt;
&lt;p&gt;Read on to learn more about Ana, the KDE team, Debian’s participation to the Google Summer of Code, and more.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Raphael: Who are you?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ana: I’m Ana Guerrero López and I’m in my early 30s. I was born and raised in the wonderful city of Sevilla, Spain and I live in Lyon, France. I share my life with another Debian Developer and my paid work is doing Debian support and integration, so you won’t be surprised to read that Debian is a big part of my life.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Raphael: How did you start contributing to Debian?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ana: Although I knew about the existence of Linux since 1997 or so, I didn’t really start using Linux until the summer 2001 when I finally got a computer on my own and an Internet link at home. In the beginning, I was using Mandrake in a dual boot with Windows and later around 2003, I happily moved to only using Debian and ditching the Windows partition. Once settled as a Debian user, I knew anybody could help improve the distribution but I hesitated to join mostly due to two reasons, my perception of Debian was the one of a very elitist and aggressive club and who wants to join this kind of cult^wproject? And even if I wanted to join, I did not know how to get started.&lt;/p&gt;
&lt;p&gt;By the summer of 2004, the Debian Women project started, it made me seeing Debian as a more welcoming project, and I started maintaining my first packages. The following summer 2005, I attended akademy 2005 (the annual KDE conference) where I had the pleasure to meet there some of the people from the KDE team and this really made a difference for me. Christopher Martin and Adeodato Simó, with the help of other people, have started the maintenance of KDE as a team a few months before and by that time most of the KDE modules where under the maintenance umbrella of the team. This was a very good move since it allowed easily to share the KDE maintenance in a more coordinated way and also eased having non-DDs, like me at that time, to join in and help.&lt;/p&gt;
&lt;blockquote class=&quot;highlight&quot;&gt;&lt;p&gt;The Debian Women project started, it made me seeing Debian as a more welcoming project.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Raphael: You’re part of the &lt;a href=&quot;http://pkg-kde.alioth.debian.org&quot;&gt;Debian KDE team&lt;/a&gt;. What’s your role in the team and what are your plans for Wheezy?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ana: Nowadays, I am not as active in the KDE team as I used to be in the past. The KDE 3 to KDE 4 transition was quite tiring and changes on the KDE side like the successive marketing renames, the shorter 6 months schedule (it used to be at least 9) or the uncoordinated KDE releases mostly burnt me out. Currently, I am mostly working in helping others to get started within the team, some small fixes here and there, and helping with the uploads: an upload of the full KDE suite to the archive requires some building power and upload bandwidth not everybody have.&lt;/p&gt;
&lt;p&gt;For Wheezy, with the tentative freeze date in June, the plan is to try to ship the latest possible point release of the KDE 4.8 series. The first release of the series, 4.8.0 was released a couple of weeks ago and while writing these lines, the packaging work for 4.8 hasn’t started yet. The next move for the team is &lt;a href=&quot;http://bugs.debian.org/653919&quot;&gt;getting 4.7.4 in unstable&lt;/a&gt;, currently sitting in experimental.&lt;/p&gt;
&lt;blockquote class=&quot;highlight&quot;&gt;&lt;p&gt;For Wheezy, […] the plan is to try to ship the latest possible point release of the KDE 4.8 series.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Besides the KDE packages, there is some software which users perceive as KDE, such as amarok, digikam, etc., which are not part of KDE but fall under its umbrella. These other programs have their own maintainers and their updates depend greatly in the availability of them. For the KDE office suite, we have right now KOffice in the archive. KOffice got a fork some time ago named Calligra and we should replace KOffice by Calligra in the archive before the release of Wheezy. Sadly there isn’t yet a final release of Calligra to use.&lt;/p&gt;
&lt;p&gt;My personal goal for Wheezy was to finish the removal of all the remaining packages depending on KDE 3 and Qt 3 that Squeeze still contained. The removal of the KDE 3 libraries and all the packages using them was quickly achieved after the release of Squeeze. The removal of Qt 3 soon showed that it was task harder than expected since some popular packages (sometimes not in the Debian archive, e.g. third-party scientific software) depend on it, and also Qt 3 is a requirement for LSB compatibility. Right now, Qt 3 has been &lt;a href=&quot;http://lists.debian.org/debian-devel/2011/05/msg00056.html&quot;&gt;orphaned for 9 months&lt;/a&gt; and &lt;a href=&quot;http://bugs.debian.org/625502&quot;&gt;nobody has shown any interest in adopting it&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Raphael: KDE, much like GNOME, has been forked by people who were unhappy by the direction that the project has taken since version 4 (cf &lt;a href=&quot;http://www.trinitydesktop.org/&quot;&gt;Trinity&lt;/a&gt;). What’s your personal opinion on KDE 4.x and what’s the position of the Debian KDE team concerning this fork?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ana: I use KDE 4 on my laptop and I think it is a solid desktop environment and platform. However I am finding it less and less attractive for me. On one side, my usage of the computer has been slightly changing and on the other side, I do not like how the new developments in KDE are evolving, things like plasmoids or activities are not attractive for me. I have switched my other 2 systems to &lt;a href=&quot;http://awesome.naquadah.org/&quot;&gt;awesome&lt;/a&gt; although I continue to use mainly a bunch of KDE applications: dolphin, konsole, kate, juk, kmix, etc. So you might say my desktop environment is an awesome KDE.&lt;/p&gt;
&lt;p&gt;Regarding the Trinity project, a lot of users complained very loudly when KDE 3 got replaced by KDE 4 in testing/unstable, so I find quite laudable the decision of some users to act instead and try to continue with a forked development of KDE 3. However the Trinity team seems to be about 3 persons (funny for a project named Trinity &lt;img src=&quot;http://raphaelhertzog.com/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:)&quot; class=&quot;wp-smiley&quot; /&gt; ) while KDE 3 is big. In perspective, it does not look that big because KDE 4 is even larger, but it is still too much for such small team. In addition those developers need to maintain Qt3 that has been end-of-lifed years ago by Nokia/Trolltech¹. So my guess is that sooner or later the project will fade away.&lt;/p&gt;
&lt;p&gt;Nobody from the KDE team is interested in Trinity and in case someone wants to package it for Debian, they would have to make a new team. For the reasons mentioned above: Qt3 maintenance and reduced upstream group, this would be a bad idea.&lt;/p&gt;
&lt;p&gt;My advice if you do not like KDE 4 and you miss KDE 3, would be taking a look at &lt;a href=&quot;http://razor-qt.org/&quot;&gt;razor-qt&lt;/a&gt; based on Qt4 and quite similar to KDE 3.&lt;/p&gt;
&lt;p&gt;¹ I read they have plans to port it to Qt4, but frankly that could take some years… same it took to the KDE project for KDE 4.0.0 &lt;img src=&quot;http://raphaelhertzog.com/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;-)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Raphael: You used to maintain &lt;a href=&quot;http://news.debian.net/&quot;&gt;news.debian.net&lt;/a&gt;, a WordPress blog dedicated to Debian, but you stopped a while ago. A few months later you started to maintain a &lt;a href=&quot;https://plus.google.com/111711190057359692089&quot;&gt;Debian page on Google+&lt;/a&gt;. Why did you stop the blog and what’s your goal with the Google+ page?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ana: I &lt;a href=&quot;http://ekaia.org/blog/2009/08/03/introducing-http-news-debian-net/&quot;&gt;blogged about the reasons I started news.debian.net&lt;/a&gt;. In short, I thought Debian needed a better system to publish news, something like a blog. I first tried to suggest the idea to the press/publicity team but they weren’t interested, so I started the project alone. IMHO the blog worked quite well and I was feeling like it should be made official. I talked about this with some people but at the time I wasn’t pushing it because I had other priorities and I knew pushing it to become official would need some extra time and energy.&lt;/p&gt;
&lt;p&gt;Stefano decided to start the discussion about making news.debian.net official (that’s moving it to a debian.org domain) in its own initiative. After the public discussion and some private exchange of emails with DSA, the situation became frustrating and I decided to close news.debian.net after the release of Squeeze.&lt;/p&gt;
&lt;p&gt;Later, during DebConf, an officer from the press team announced they were launching a blog and I asked Stefano if he could try to have a discussion about this to see if it could still somehow fit my ideas, and maybe contributing myself, but nobody from the press team answered Stefano’s email and the blog hasn’t started yet either.&lt;/p&gt;
&lt;p&gt;Irony that communication didn’t work when wanting to improve communication.&lt;/p&gt;
&lt;p&gt;About the Google+ page, everyday I follow what is going in Debian and quite often I find things I want to share. I do not want to clutter my own profiles with Debian stuff or have people following me because of that, so I decided to create the Debian page when Google+ made them available. I like the fact that people can follow that without having an account in Google+ although they can not comment anonymously. I am not happy about the fact that Google+ is a closed platform but hopefully the data will become easier to export in the near future. Right now, there are some services that provides RSS feeds of Google+ pages if you want to follow the page and you are not in Google+ (or I could setup one if several people ask me).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Raphael: Last year you helped to manage Debian’s participation to the Google Summer of Code. How did it went? Is there something that you can improve for this year?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ana: I think last year we managed to have people in Debian more aware about what the students were doing. That also helped students to get more feedback and therefore get to know more people in the project and get more integrated. Students were sending periodic public reports available to everybody interested in the status of the projects and some of them also held their own sessions in DebConf.&lt;/p&gt;
&lt;p&gt;We still failed to start looking for mentors early enough and to give them information about how the GSoC worked and how they could have a successful project. Having good projects in Debian is harder than in other projects because the GSoC mostly promotes having students started in Open Source *coding* for a project, while Debian is more a project about integrating software and we overall do not have so many parts that has to be coded.&lt;/p&gt;
&lt;p&gt;My personal goal for this year is to try getting the projects earlier to attract good students from the very beginning, even if that means we have less projects than in other years.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Raphael: What motivates you to continue to contribute year after year?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ana: Three things. I like improving the OS I use, I like the friends I have made while working in Debian through the years and because I have fun.&lt;/p&gt;
&lt;p&gt;Also Debian is quite a big project, so if you become tired or burn out working in some area, you always can easily find interesting things to do somewhere else.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Raphael: Is there someone in Debian that you admire for their contributions?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ana: Adeodato Simó, he is now in a long leave from the project, but it is one of those persons who made a difference in the project in his job in the release team some years ago. Aurélien Jarno because of his tireless work in (e)glibc and porting of several architectures.&lt;/p&gt;
&lt;p&gt;I also have special admiration for all those people who have been very active in the project for more than 7-8 years because I know it is not always easy to combine it with real life.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Thank you to Ana for the time spent answering my questions. I hope you enjoyed reading her answers as I did. Note that older interviews are indexed on &lt;a href=&quot;http://wiki.debian.org/PeopleBehindDebian&quot;&gt;wiki.debian.org/PeopleBehindDebian&lt;/a&gt;.&lt;/p&gt;
&lt;p class=&quot;action-call&quot;&gt;&lt;a href=&quot;http://raphaelhertzog.com/email-newsletter/&quot;&gt;Subscribe to my newsletter&lt;/a&gt; to get my monthly summary of the Debian/Ubuntu news and to not miss further interviews. You can also follow along on &lt;a href=&quot;http://identi.ca/raphaelhertzog&quot;&gt;Identi.ca&lt;/a&gt;, &lt;a href=&quot;https://plus.google.com/111785500145924152411/&quot;&gt;Google+&lt;/a&gt;, &lt;a href=&quot;http://twitter.com/raphaelhertzog&quot;&gt;Twitter&lt;/a&gt; and &lt;a href=&quot;http://www.facebook.com/HertzogRaphael&quot;&gt;Facebook&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;p style=&quot;font-size: smaller;&quot;&gt;&lt;a href=&quot;http://raphaelhertzog.com/2012/02/10/people-behind-debian-ana-beatriz-guerrero-lopez-member-of-the-debian-kde-team/#comments&quot;&gt;4 comments&lt;/a&gt; | Liked this article? &lt;a href=&quot;http://raphaelhertzog.com/support-my-work/&quot;&gt;Click here&lt;/a&gt;. | My blog is &lt;a href=&quot;http://flattr.com/thing/26545/apt-get-install-debian-wizard&quot;&gt;Flattr-enabled&lt;/a&gt;.&lt;/p&gt;
&lt;p class=&quot;wp-flattr-button&quot;&gt;&lt;/p&gt;</content>
	<author>
	  <name>Raphaël Hertzog</name>
	   <uri>http://raphaelhertzog.com</uri> 
	</author>
	<source>
	  <title type="html">apt-get install debian-wizard</title>
	  <subtitle type="html">Insider infos, master your Debian/Ubuntu distribution</subtitle>
	  <link rel="self" href="http://raphaelhertzog.com/feed/planets/"/>
	  <id>http://raphaelhertzog.com</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">Dpkg: edit debian/control description without worrying about leading ‘.’ and ‘ ‘</title>
	<link href="http://ddumont.wordpress.com/2012/02/10/dpkg-edit-debiancontrol-description-without-worrying-about-leading-and/"/>
	<id>http://ddumont.wordpress.com/?p=408</id>
	<updated>2012-02-10T13:24:36+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;Hello&lt;/p&gt;
&lt;p&gt;In Debian package, the debian/control file has a &lt;a href=&quot;http://www.debian.org/doc/debian-policy/ch-controlfields.html&quot;&gt;specific syntax&lt;/a&gt; where each line must begin with a space and paragraphs are separated by a single ‘.’. If you want to follow DEP-5 syntax for debian/copyright files, you have a similar problem when comes the time to fill the license text for creative-common license: it’s easy to miss a space or a dot.&lt;/p&gt;
&lt;p&gt;Let’s say I want to add a new section in the description of my package. Here’s the current description:&lt;/p&gt;
&lt;pre&gt;Description: module to automate definition of a DBIx::Class::Schema
 DBIx::Class::Schema::Loader is an extension to DBIx::Class that automates the
 definition of a DBIx::Class::Schema by scanning table schemas and setting up
 columns and primary keys appropriately. It supports MySQL, PostgreSQL, SQLite
 and DB2.
 .
 Bare table definitions are fairly straightforward, but relationship creation
 is somewhat heuristic, especially with respect to choosing relationship types
 and names, as well as join types. The relationships generated by this module
 will probably never be as well-defined as hand-generated ones.
&lt;/pre&gt;
&lt;p&gt;I want to add “This package is awesome” but I don’t want to be bothered by leading dots and white spaces.&lt;/p&gt;
&lt;p&gt;First, I go in the package directory, then check the syntax with &lt;code&gt;cme&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;$ cme check dpkg
&lt;/pre&gt;
&lt;p&gt;Then create a loop directory, where the dpkg content will be mapped to a fuse directory:&lt;/p&gt;
&lt;pre&gt;$ mkdir loop
$ cme fusefs dpkg -fuse-dir loop/
Mounting config on loop/ in background.
Use command &#39;fusermount -u loop/&#39; to unmount
$ cat loop/control/binary/libdbix-class-schema-loader-perl/Description
DBIx::Class::Schema::Loader is an extension to DBIx::Class that automates the
definition of a DBIx::Class::Schema by scanning table schemas and setting up
columns and primary keys appropriately. It supports MySQL, PostgreSQL, SQLite
and DB2.

Bare table definitions are fairly straightforward, but relationship creation
is somewhat heuristic, especially with respect to choosing relationship types
and names, as well as join types. The relationships generated by this module
will probably never be as well-defined as hand-generated ones.
&lt;/pre&gt;
&lt;p&gt;Then edit &lt;code&gt;loop/control/binary/libdbix-class-schema-loader-perl/Description&lt;/code&gt; with your favorite editor.&lt;/p&gt;
&lt;p&gt;For the sake of this blog, I will use &lt;code&gt;echo&lt;/code&gt; to edit this file:&lt;/p&gt;
&lt;pre&gt;$ echo -e &quot;\nThis module is awesome&quot; &amp;gt;&amp;gt; loop/control/binary/libdbix-class-schema-loader-perl/Description
&lt;/pre&gt;
&lt;p&gt;Now umount the loop (note that the actual debian/control is not changed before this step):&lt;/p&gt;
&lt;pre&gt;fusermount -u loop
&lt;/pre&gt;
&lt;p&gt;Now the result:&lt;/p&gt;
&lt;pre&gt;$ cat debian/control
[...]
Description: module to automate definition of a DBIx::Class::Schema
 DBIx::Class::Schema::Loader is an extension to DBIx::Class that automates the
 definition of a DBIx::Class::Schema by scanning table schemas and setting up
 columns and primary keys appropriately. It supports MySQL, PostgreSQL, SQLite
 and DB2.
 .
 Bare table definitions are fairly straightforward, but relationship creation
 is somewhat heuristic, especially with respect to choosing relationship types
 and names, as well as join types. The relationships generated by this module
 will probably never be as well-defined as hand-generated ones.
 .
 This module is awesome
&lt;/pre&gt;
&lt;p&gt;Here’s another example to fill the license text for a license while respecting &lt;a href=&quot;http://dep.debian.net/deps/dep5/&quot;&gt;DEP-5 syntax&lt;/a&gt;, (done after the cme command):&lt;/p&gt;
&lt;pre&gt;# creating this dir will create a new DEP-5
# standalone license section with name CC-BY-30
mkdir loop/copyright/License/CC-BY-30
# fill the text part of the  license
wget http://creativecommons.org/licenses/by/3.0/legalcode -O - \
 | html2text -style pretty &amp;gt; loop/copyright/License/CC-BY-30/text
$ fusermount -u loop
$ cat debian/copyright
[...]
License: CC-BY-30
 .
 .
 .
                                Creative_Commons
 .
 .
 Creative Commons Legal Code
 .
 .
 Attribution 3.0 Unported
[...]
&lt;/pre&gt;
&lt;p&gt;And that’s it. (note that cme command is new and is available only from version 2.004 of Config::Model)&lt;/p&gt;
&lt;p&gt;Of course, there’s more than a awy to do it: you can also run &lt;code&gt;cme edit dpkg&lt;/code&gt; and add or edit license text in the GUI (or in an editor launched by the GUI). &lt;code&gt;cme&lt;/code&gt; will take care of the syntax details.&lt;/p&gt;
&lt;p&gt;All the best &lt;/p&gt;
&lt;br /&gt;  &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/ddumont.wordpress.com/408/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/comments/ddumont.wordpress.com/408/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godelicious/ddumont.wordpress.com/408/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/delicious/ddumont.wordpress.com/408/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gofacebook/ddumont.wordpress.com/408/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/facebook/ddumont.wordpress.com/408/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gotwitter/ddumont.wordpress.com/408/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/twitter/ddumont.wordpress.com/408/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gostumble/ddumont.wordpress.com/408/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/stumble/ddumont.wordpress.com/408/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godigg/ddumont.wordpress.com/408/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/digg/ddumont.wordpress.com/408/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/goreddit/ddumont.wordpress.com/408/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/reddit/ddumont.wordpress.com/408/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;http://stats.wordpress.com/b.gif?host=ddumont.wordpress.com&amp;amp;blog=9917469&amp;amp;post=408&amp;amp;subd=ddumont&amp;amp;ref=&amp;amp;feed=1&quot; alt=&quot;&quot; height=&quot;1&quot; border=&quot;0&quot; width=&quot;1&quot; /&gt;</content>
	<author>
	  <name>dod</name>
	   <uri>http://ddumont.wordpress.com</uri> 
	</author>
	<source>
	  <title type="html">Ddumont's Blog</title>
	  <subtitle type="html">Thoughts about computing and other stuff</subtitle>
	  <link rel="self" href="http://ddumont.wordpress.com/feed/"/>
	  <id>http://ddumont.wordpress.com</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">Release Critical Bug report for Week 06</title>
	<link href="http://blog.schmehl.info/Debian/rc-stats/7.0-wheezy/2012-06"/>
	<id>http://blog.schmehl.info/Debian/rc-stats/7.0-wheezy/2012-06</id>
	<updated>2012-02-10T12:01:00+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">The &lt;a href=&quot;http://udd.debian.org/bugs.cgi&quot;&gt;bug webinterface of the
Ultimate Debian Database&lt;/a&gt;
currently knows about the following release critical bugs:&lt;p&gt;&lt;/p&gt;

&lt;table&gt;
  &lt;tbody&gt;&lt;tr&gt;&lt;th&gt;In Total:&lt;/th&gt;&lt;td&gt;&lt;a href=&quot;http://udd.debian.org/bugs.cgi?release=any&amp;amp;patch=&amp;amp;pending=&amp;amp;security=&amp;amp;wontfix=&amp;amp;upstream=&amp;amp;unreproducible=&amp;amp;forwarded=&amp;amp;claimed=&amp;amp;deferred=&amp;amp;notmain=&amp;amp;notwheezy=&amp;amp;base=&amp;amp;standard=&amp;amp;merged=&amp;amp;done=&amp;amp;outdatedwheezy=&amp;amp;outdatedsid=&amp;amp;needmig=&amp;amp;newerubuntu=&amp;amp;fnewer=&amp;amp;fnewerval=7&amp;amp;rc=1&amp;amp;sortby=source&amp;amp;sorto=asc&amp;amp;cpopcon=1&amp;amp;cseverity=1&amp;amp;ctags=1&quot;&gt;1340&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;th&gt;Affecting Wheezy:&lt;/th&gt;&lt;td&gt;&lt;a href=&quot;http://udd.debian.org/bugs.cgi?release=wheezy&amp;amp;patch=&amp;amp;pending=&amp;amp;security=&amp;amp;wontfix=&amp;amp;upstream=&amp;amp;unreproducible=&amp;amp;forwarded=&amp;amp;claimed=&amp;amp;deferred=&amp;amp;notmain=&amp;amp;notwheezy=&amp;amp;base=&amp;amp;standard=&amp;amp;merged=&amp;amp;done=&amp;amp;outdatedwheezy=&amp;amp;outdatedsid=&amp;amp;needmig=&amp;amp;newerubuntu=&amp;amp;fnewer=&amp;amp;fnewerval=7&amp;amp;rc=1&amp;amp;sortby=source&amp;amp;sorto=asc&amp;amp;cpopcon=1&amp;amp;cseverity=1&amp;amp;ctags=1&quot;&gt;777&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;th&gt;Wheezy only:&lt;/th&gt;&lt;td&gt;&lt;a href=&quot;http://udd.debian.org/bugs.cgi?release=wheezy_not_sid&amp;amp;patch=&amp;amp;pending=&amp;amp;security=&amp;amp;wontfix=&amp;amp;upstream=&amp;amp;unreproducible=&amp;amp;forwarded=&amp;amp;claimed=&amp;amp;deferred=&amp;amp;notmain=&amp;amp;notwheezy=&amp;amp;base=&amp;amp;standard=&amp;amp;merged=&amp;amp;done=&amp;amp;outdatedwheezy=&amp;amp;outdatedsid=&amp;amp;needmig=&amp;amp;newerubuntu=&amp;amp;fnewer=&amp;amp;fnewerval=7&amp;amp;rc=1&amp;amp;sortby=source&amp;amp;sorto=asc&amp;amp;cpopcon=1&amp;amp;cseverity=1&amp;amp;ctags=1&quot;&gt;122&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;th&gt;Remaining to be fixed in Wheezy:&lt;/th&gt;&lt;td&gt;&lt;a href=&quot;http://udd.debian.org/bugs.cgi?release=wheezy_and_sid&amp;amp;patch=&amp;amp;pending=&amp;amp;security=&amp;amp;wontfix=&amp;amp;upstream=&amp;amp;unreproducible=&amp;amp;forwarded=&amp;amp;claimed=&amp;amp;deferred=&amp;amp;notmain=&amp;amp;notwheezy=&amp;amp;base=&amp;amp;standard=&amp;amp;merged=&amp;amp;done=&amp;amp;outdatedwheezy=&amp;amp;outdatedsid=&amp;amp;needmig=&amp;amp;newerubuntu=&amp;amp;fnewer=&amp;amp;fnewerval=7&amp;amp;rc=1&amp;amp;sortby=source&amp;amp;sorto=asc&amp;amp;cpopcon=1&amp;amp;cseverity=1&amp;amp;ctags=1&quot;&gt;&lt;b&gt;655&lt;/b&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;

&lt;p&gt;Of these &lt;b&gt;&lt;a href=&quot;http://udd.debian.org/bugs.cgi?release=wheezy_and_sid&amp;amp;patch=&amp;amp;pending=&amp;amp;security=&amp;amp;wontfix=&amp;amp;upstream=&amp;amp;unreproducible=&amp;amp;forwarded=&amp;amp;claimed=&amp;amp;deferred=&amp;amp;notmain=&amp;amp;notwheezy=&amp;amp;base=&amp;amp;standard=&amp;amp;merged=&amp;amp;done=&amp;amp;outdatedwheezy=&amp;amp;outdatedsid=&amp;amp;needmig=&amp;amp;newerubuntu=&amp;amp;fnewer=&amp;amp;fnewerval=7&amp;amp;rc=1&amp;amp;sortby=source&amp;amp;sorto=asc&amp;amp;cpopcon=1&amp;amp;cseverity=1&amp;amp;ctags=1&quot;&gt;655&lt;/a&gt;&lt;/b&gt; bugs, the following tags are set:&lt;/p&gt;

&lt;table&gt;
  &lt;tbody&gt;&lt;tr&gt;&lt;th&gt;Pending in Wheezy:&lt;/th&gt;&lt;td&gt;&lt;a href=&quot;http://udd.debian.org/bugs.cgi?release=wheezy_and_sid&amp;amp;patch=&amp;amp;pending=only&amp;amp;security=&amp;amp;wontfix=&amp;amp;upstream=&amp;amp;unreproducible=&amp;amp;forwarded=&amp;amp;claimed=&amp;amp;deferred=&amp;amp;notmain=&amp;amp;notwheezy=&amp;amp;base=&amp;amp;standard=&amp;amp;merged=&amp;amp;done=&amp;amp;outdatedwheezy=&amp;amp;outdatedsid=&amp;amp;needmig=&amp;amp;newerubuntu=&amp;amp;fnewer=&amp;amp;fnewerval=7&amp;amp;rc=1&amp;amp;sortby=source&amp;amp;sorto=asc&amp;amp;cpopcon=1&amp;amp;cseverity=1&amp;amp;ctags=1&quot;&gt;41&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;th&gt;Patched in Wheezy:&lt;/th&gt;&lt;td&gt;&lt;a href=&quot;http://udd.debian.org/bugs.cgi?release=wheezy_and_sid&amp;amp;patch=only&amp;amp;pending=&amp;amp;security=&amp;amp;wontfix=&amp;amp;upstream=&amp;amp;unreproducible=&amp;amp;forwarded=&amp;amp;claimed=&amp;amp;deferred=&amp;amp;notmain=&amp;amp;notwheezy=&amp;amp;base=&amp;amp;standard=&amp;amp;merged=&amp;amp;done=&amp;amp;outdatedwheezy=&amp;amp;outdatedsid=&amp;amp;needmig=&amp;amp;newerubuntu=&amp;amp;fnewer=&amp;amp;fnewerval=7&amp;amp;rc=1&amp;amp;sortby=source&amp;amp;sorto=asc&amp;amp;cpopcon=1&amp;amp;cseverity=1&amp;amp;ctags=1&quot;&gt;86&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;th&gt;Duplicates in Wheezy:&lt;/th&gt;&lt;td&gt;&lt;a href=&quot;http://udd.debian.org/bugs.cgi?release=wheezy_and_sid&amp;amp;patch=&amp;amp;pending=&amp;amp;security=&amp;amp;wontfix=&amp;amp;upstream=&amp;amp;unreproducible=&amp;amp;forwarded=&amp;amp;claimed=&amp;amp;deferred=&amp;amp;notmain=&amp;amp;notwheezy=&amp;amp;base=&amp;amp;standard=&amp;amp;merged=only&amp;amp;done=&amp;amp;outdatedwheezy=&amp;amp;outdatedsid=&amp;amp;needmig=&amp;amp;newerubuntu=&amp;amp;fnewer=&amp;amp;fnewerval=7&amp;amp;rc=1&amp;amp;sortby=source&amp;amp;sorto=asc&amp;amp;cpopcon=1&amp;amp;cseverity=1&amp;amp;ctags=1&quot;&gt;45&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;th&gt;Can be fixed in a security Update:&lt;/th&gt;&lt;td&gt;&lt;a href=&quot;http://udd.debian.org/bugs.cgi?release=wheezy_and_sid&amp;amp;patch=&amp;amp;pending=&amp;amp;security=only&amp;amp;wontfix=&amp;amp;upstream=&amp;amp;unreproducible=&amp;amp;forwarded=&amp;amp;claimed=&amp;amp;deferred=&amp;amp;notmain=&amp;amp;notwheezy=&amp;amp;base=&amp;amp;standard=&amp;amp;merged=&amp;amp;done=&amp;amp;outdatedwheezy=&amp;amp;outdatedsid=&amp;amp;needmig=&amp;amp;newerubuntu=&amp;amp;fnewer=&amp;amp;fnewerval=7&amp;amp;rc=1&amp;amp;sortby=source&amp;amp;sorto=asc&amp;amp;cpopcon=1&amp;amp;cseverity=1&amp;amp;ctags=1&quot;&gt;21&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;th&gt;Contrib or non-free in Wheezy:&lt;/th&gt;&lt;td&gt;&lt;a href=&quot;http://udd.debian.org/bugs.cgi?release=wheezy_and_sid&amp;amp;patch=&amp;amp;pending=&amp;amp;security=&amp;amp;wontfix=&amp;amp;upstream=&amp;amp;unreproducible=&amp;amp;forwarded=&amp;amp;claimed=&amp;amp;deferred=&amp;amp;notmain=only&amp;amp;notwheezy=&amp;amp;base=&amp;amp;standard=&amp;amp;merged=&amp;amp;done=&amp;amp;outdatedwheezy=&amp;amp;outdatedsid=&amp;amp;needmig=&amp;amp;newerubuntu=&amp;amp;fnewer=&amp;amp;fnewerval=7&amp;amp;rc=1&amp;amp;sortby=source&amp;amp;sorto=asc&amp;amp;cpopcon=1&amp;amp;cseverity=1&amp;amp;ctags=1&quot;&gt;16&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;th&gt;Claimed in Wheezy:&lt;/th&gt;&lt;td&gt;&lt;a href=&quot;http://udd.debian.org/bugs.cgi?release=wheezy_and_sid&amp;amp;patch=&amp;amp;pending=&amp;amp;security=&amp;amp;wontfix=&amp;amp;upstream=&amp;amp;unreproducible=&amp;amp;forwarded=&amp;amp;claimed=only&amp;amp;deferred=&amp;amp;notmain=&amp;amp;notwheezy=&amp;amp;base=&amp;amp;standard=&amp;amp;merged=&amp;amp;done=&amp;amp;outdatedwheezy=&amp;amp;outdatedsid=&amp;amp;needmig=&amp;amp;newerubuntu=&amp;amp;fnewer=&amp;amp;fnewerval=7&amp;amp;rc=1&amp;amp;sortby=source&amp;amp;sorto=asc&amp;amp;cpopcon=1&amp;amp;cseverity=1&amp;amp;ctags=1&quot;&gt;0&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;th&gt;Delayed in Wheezy:&lt;/th&gt;&lt;td&gt;&lt;a href=&quot;http://udd.debian.org/bugs.cgi?release=wheezy_and_sid&amp;amp;patch=&amp;amp;pending=&amp;amp;security=&amp;amp;wontfix=&amp;amp;upstream=&amp;amp;unreproducible=&amp;amp;forwarded=&amp;amp;claimed=&amp;amp;deferred=only&amp;amp;notmain=&amp;amp;notwheezy=&amp;amp;base=&amp;amp;standard=&amp;amp;merged=&amp;amp;done=&amp;amp;outdatedwheezy=&amp;amp;outdatedsid=&amp;amp;needmig=&amp;amp;newerubuntu=&amp;amp;fnewer=&amp;amp;fnewerval=7&amp;amp;rc=1&amp;amp;sortby=source&amp;amp;sorto=asc&amp;amp;cpopcon=1&amp;amp;cseverity=1&amp;amp;ctags=1&quot;&gt;6&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;th&gt;Otherwise fixed in Wheezy:&lt;/th&gt;&lt;td&gt;&lt;a href=&quot;http://udd.debian.org/bugs.cgi?release=wheezy_and_sid&amp;amp;patch=&amp;amp;pending=&amp;amp;security=&amp;amp;wontfix=&amp;amp;upstream=&amp;amp;unreproducible=&amp;amp;forwarded=&amp;amp;claimed=&amp;amp;deferred=&amp;amp;notmain=&amp;amp;notwheezy=&amp;amp;base=&amp;amp;standard=&amp;amp;merged=&amp;amp;done=only&amp;amp;outdatedwheezy=&amp;amp;outdatedsid=&amp;amp;needmig=&amp;amp;newerubuntu=&amp;amp;fnewer=&amp;amp;fnewerval=7&amp;amp;rc=1&amp;amp;sortby=source&amp;amp;sorto=asc&amp;amp;cpopcon=1&amp;amp;cseverity=1&amp;amp;ctags=1&quot;&gt;49&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;

&lt;p&gt;Ignoring all the above (multiple tags possible) &lt;a href=&quot;http://udd.debian.org/bugs.cgi?release=wheezy_and_sid&amp;amp;patch=ign&amp;amp;pending=ign&amp;amp;security=ign&amp;amp;wontfix=&amp;amp;upstream=&amp;amp;unreproducible=&amp;amp;forwarded=&amp;amp;claimed=ign&amp;amp;deferred=ign&amp;amp;notmain=ign&amp;amp;notwheezy=&amp;amp;base=&amp;amp;standard=&amp;amp;merged=ign&amp;amp;done=ign&amp;amp;outdatedwheezy=&amp;amp;outdatedsid=&amp;amp;needmig=&amp;amp;newerubuntu=&amp;amp;fnewer=&amp;amp;fnewerval=7&amp;amp;rc=1&amp;amp;sortby=source&amp;amp;sorto=asc&amp;amp;cpopcon=1&amp;amp;cseverity=1&amp;amp;ctags=1&quot;&gt;&lt;b&gt;447&lt;/b&gt;&lt;/a&gt;
bugs need to be fixed by Debian Contributors to get Debian 7.0 &lt;q&gt;Wheezy&lt;/q&gt; released.&lt;/p&gt;

&lt;p&gt;However, with the view of the Release Managers, 
&lt;a href=&quot;http://udd.debian.org/bugs.cgi?release=wheezy&amp;amp;patch=&amp;amp;pending=&amp;amp;security=ign&amp;amp;wontfix=&amp;amp;upstream=&amp;amp;unreproducible=&amp;amp;forwarded=&amp;amp;claimed=&amp;amp;deferred=&amp;amp;notmain=ign&amp;amp;notwheezy=ign&amp;amp;base=&amp;amp;standard=&amp;amp;merged=ign&amp;amp;done=&amp;amp;outdatedwheezy=&amp;amp;outdatedsid=&amp;amp;needmig=&amp;amp;newerubuntu=&amp;amp;fnewer=&amp;amp;fnewerval=7&amp;amp;rc=1&amp;amp;sortby=source&amp;amp;sorto=asc&amp;amp;cpopcon=1&amp;amp;cseverity=1&amp;amp;ctags=1&quot;&gt;&lt;b&gt;687&lt;/b&gt;&lt;/a&gt;
need to be dealt with for the release to happen.&lt;/p&gt;

&lt;p&gt;Please see &lt;q&gt;&lt;a href=&quot;http://wiki.debian.org/ProjectNews/RC-Stats&quot;&gt;Interpreting the
release critical bug statistics&lt;/a&gt;&lt;/q&gt; for an explanation of the different numbers.&lt;/p&gt;</content>
	<author>
	  <name>Alexander Reichle-Schmehl</name>
	   <email>alexander@schmehl.info</email> 
	</author>
	<source>
	  <title type="html">Tolimar's blog</title>
	  <subtitle type="html">Alexander &lt;q&gt;Tolimar&lt;/q&gt; Reichle-Schmehl lives in Hildesheim / Germany.  He&#39;s an official Debian Developer.  Beside maintaining various &lt;a href=&quot;http://qa.debian.org/developer.php?login=tolimar@debian.org&quot;&gt;packages&lt;/a&gt;, his main task is being spokesman and event organizer of the Debian project.</subtitle>
	  <link rel="self" href="http://blog.schmehl.info/Debian/index.rss"/>
	  <id>http://blog.schmehl.info</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en-us">Book about phpMyAdmin 3.4</title>
	<link href="http://blog.cihar.com/archives/2012/02/10/book-about-phpmyadmin-34/?utm_source=rss2"/>
	<id>http://blog.cihar.com/archives/2012/02/10/book-about-phpmyadmin-34/?utm_source=rss2</id>
	<updated>2012-02-10T11:00:00+00:00</updated>
	<summary type="html" xml:lang="en-us"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;With quite usual delay after release, book &lt;a href=&quot;http://www.packtpub.com/mastering-phpmyadmin-3-4-for-effective-mysql-management/book&quot;&gt;Mastering phpMyAdmin 3.4 for Effective MySQL Management&lt;/a&gt; has been published.&lt;/p&gt;
&lt;p&gt;Unlike the previous edition, I was not doing technical review here, but it is anyway special book for me - the cover photo is coming from me, what is actually for the very first time this has happened.&lt;/p&gt;
&lt;p&gt;As usual with Packt opensource books, &lt;a href=&quot;http://www.phpmyadmin.net/&quot;&gt;phpMyAdmin project&lt;/a&gt; receives some money for each sold copy of the book, so you&#39;re welcome to buy it :-).&lt;/p&gt;

&lt;p style=&quot;font-size: smaller;&quot;&gt;
Filed under: 


&lt;a href=&quot;http://blog.cihar.com/archives/english/&quot;&gt;English&lt;/a&gt;

&lt;a href=&quot;http://blog.cihar.com/archives/phpmyadmin/&quot;&gt;Phpmyadmin&lt;/a&gt;

|

&lt;a href=&quot;http://blog.cihar.com/archives/2012/02/10/book-about-phpmyadmin-34/#comments&quot;&gt;2 comments&lt;/a&gt;
|
&lt;a href=&quot;http://flattr.com/thing/59773/Michal-Cihars-Weblog&quot;&gt;Flattr this!&lt;/a&gt;
&lt;/p&gt;</content>
	<author>
	  <name>Michal Čihař</name>
	   <email>michal@cihar.com</email> 
	</author>
	<source>
	  <title type="html">Michal Čihař's Weblog, posts tagged by English</title>
	  <subtitle type="html">Random thoughts about everything tagged by English</subtitle>
	  <link rel="self" href="http://blog.cihar.com/archives/english/index-rss.xml"/>
	  <id>http://blog.cihar.com/archives/english/</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">Starting with BTRFS</title>
	<link href="http://etbe.coker.com.au/2012/02/10/starting-with-btrfs/"/>
	<id>http://etbe.coker.com.au/?p=3172</id>
	<updated>2012-02-10T09:52:16+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;Based on &lt;a href=&quot;http://etbe.coker.com.au/2012/02/06/reliability-raid/&quot;&gt;my investigation of RAID reliability [1]&lt;/a&gt; I have determined that &lt;a href=&quot;http://en.wikipedia.org/wiki/Btrfs&quot;&gt;BTRFS [2]&lt;/a&gt; is the Linux storage technology that has the best potential to increase data integrity without costing a lot of money. Basically a BTRFS internal RAID-1 should offer equal or greater data protection than RAID-6.&lt;/p&gt;
&lt;p&gt;As BTRFS is so important and so very different to any prior technology for Linux it’s not something that can be easily deployed in the same way as other filesystems. It is possible to easily switch between filesystems such as Ext4 and XFS because they work in much the same way, you have a single block device which the filesystem uses to create a single mount-point. While BTRFS supports internal RAID so it may have multiple block devices and it may offer multiple mountable filesystems and snapshots. Much of the functionality of Linux Software RAID and LVM is covered by BTRFS. So the sensible way to deploy BTRFS is to give it all your storage and not make use of any other RAID or LVM.&lt;/p&gt;
&lt;p&gt;So I decided to do a test installation. I started with a Debian install CD that was made shortly before the release of Squeeze (it was first to hand) and installed with BTRFS for the root filesystem, I then upgraded to Debian/Unstable to get the latest kernel as BTRFS is developing rapidly. The system failed on the first boot after upgrading to Unstable because the /etc/fstab entry for the root filesystem had the FSCK pass number set to 1 – which wasn’t going to work as no FSCK program has been written. I changed that number to 0 and it then worked.&lt;/p&gt;
&lt;p&gt;The initial install was on a desktop system that had a single IDE drive and a CD-ROM drive. For /boot I used a degraded RAID-1 and then after completing the installation I removed the CD-ROM drive and installed a second hard drive, after that it was easy to add the other device to the RAID-1. Then I tried to add a new device to the BTRFS group with the command “&lt;b&gt;btrfs device add /dev/sdb2 /dev/sda2&lt;/b&gt;” and was informed that it can’t do that to a mounted filesystem! That will decrease the possibilities for using BTRFS on systems with hot-swap drives, I hope that the developers regard it as a bug.&lt;/p&gt;
&lt;p&gt;Then I booted with an ext3 filesystem for root and tried the “&lt;b&gt;btrfs device add /dev/sdb2 /dev/sda2&lt;/b&gt;” again but got the error message “&lt;b&gt;btrfs: sending ioctl 5000940a to a partition!&lt;/b&gt;” which is not even found by Google.&lt;/p&gt;
&lt;p&gt;The next thing that I wanted to do was to put a swap file on BTRFS, the benefits for having redundancy and checksums on swap space seem obvious – and other BTRFS features such as compression might give a benefit too. So I created a file by using dd to take take from /dev/zero, ran mkswap on it and then tried to run swapon. But I was told that the file has holes and can’t be used. Automatically making zero blocks into holes is a useful feature in many situations, but not in this case.&lt;/p&gt;
&lt;p&gt;So far my experience with BTRFS is that all the basic things work (IE storing files, directories, etc). But the advanced functions I wanted from BTRFS (mirroring and making a reliable swap space) failed. This is a bit disappointing, but BTRFS isn’t described as being ready for production yet.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;[1]&lt;a href=&quot;http://etbe.coker.com.au/2012/02/06/reliability-raid/&quot;&gt; http://etbe.coker.com.au/2012/02/06/reliability-raid/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[2]&lt;a href=&quot;http://en.wikipedia.org/wiki/Btrfs&quot;&gt; http://en.wikipedia.org/wiki/Btrfs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Related posts:&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;http://etbe.coker.com.au/2010/01/25/discovering-os-bugs-and-using-snapshots/&quot; rel=&quot;bookmark&quot; title=&quot;Discovering OS Bugs and Using Snapshots&quot;&gt;Discovering OS Bugs and Using Snapshots&lt;/a&gt; &lt;small&gt;I’m running Debian/Unstable on an EeePC 701, I’ve got an...&lt;/small&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://etbe.coker.com.au/2012/02/06/reliability-raid/&quot; rel=&quot;bookmark&quot; title=&quot;Reliability of RAID&quot;&gt;Reliability of RAID&lt;/a&gt; &lt;small&gt;ZDNet has an insightful article by Robin Harris predicting the...&lt;/small&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://etbe.coker.com.au/2008/01/24/how-i-partition-disks/&quot; rel=&quot;bookmark&quot; title=&quot;How I Partition Disks&quot;&gt;How I Partition Disks&lt;/a&gt; &lt;small&gt;Having had a number of hard drives fail over the...&lt;/small&gt;&lt;/li&gt;
&lt;/ol&gt;</content>
	<author>
	  <name>etbe</name>
	   <uri>http://etbe.coker.com.au</uri> 
	</author>
	<source>
	  <title type="html">etbe - Russell Coker</title>
	  <subtitle type="html">Linux, politics, and other interesting things</subtitle>
	  <link rel="self" href="http://etbe.coker.com.au/feed/"/>
	  <id>http://etbe.coker.com.au</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">NIST::NVD::Store::SQLite3</title>
	<link href="http://wp.colliertech.org/cj/?p=1153"/>
	<id>http://wp.colliertech.org/cj/?p=1153</id>
	<updated>2012-02-10T06:54:55+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;I published an SQLite3 storage back-end to NIST::NVD on the CPAN.  It’s pretty quick.  About as fast as the DB_File one, but without the down side of being tied to DB_File.  It shouldn’t be too difficult to re-factor this code to any DBI-based database.  MariaDB anyone?&lt;/p&gt;
&lt;p&gt;I know it works on Debian.  The nightly CPAN test results should come back shortly and I’ll find out how well it works on other platforms.&lt;/p&gt;</content>
	<author>
	  <name>C.J. Adams-Collier</name>
	   <uri>http://wp.colliertech.org/cj</uri> 
	</author>
	<source>
	  <title type="html">The Pædantic Programmer » debian</title>
	  <subtitle type="html">If you can&#39;t find the time to do it right the first time, where are you going to find the time to do it over?</subtitle>
	  <link rel="self" href="http://wp.colliertech.org/cj/?cat=17&amp;feed=rss2"/>
	  <id>http://wp.colliertech.org/cj</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">Daffodils</title>
	<link href="http://phython.blogspot.com/2012/02/daffodils.html"/>
	<id>tag:blogger.com,1999:blog-6893636.post-9090251592445884801</id>
	<updated>2012-02-10T05:57:38+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">Dear Lazyweb,&lt;br /&gt;&lt;br /&gt;  I&#39;d like a video of the 90s commercial &quot;That&#39;s what daffodils do&quot;.  If you do that, I&#39;ll release a basic library for the iPhone to use SPDY[1].&lt;br /&gt;&lt;br /&gt;[1] I said basic!&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/6893636-9090251592445884801?l=phython.blogspot.com&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt;</content>
	<author>
	  <name>James A. Morrison</name>
	   <email>noreply@blogger.com</email> 
	</author>
	<source>
	  <title type="html">Sasquach wears a yellow hat</title>
	  <subtitle type="html">My adventures though this world, and perhaps the next.</subtitle>
	  <link rel="self" href="http://www.blogger.com/feeds/6893636/posts/default"/>
	  <id>tag:blogger.com,1999:blog-6893636</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">Comments with OpenID</title>
	<link href="http://www.news.software.coop/comments-with-openid/1271/"/>
	<id>http://www.news.software.coop/comments-with-openid/1271/</id>
	<updated>2012-02-10T01:08:10+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;Readers who look at our blog itself (rather than one of the lovely sites that reprint our articles) may have noticed that you can now comment in either the usual WordPress way (Name/Email/Link) or by logging in with a social media profile from one of a large range of providers, including WordPress, Livejournal, Yahoo, Google and many more.&lt;/p&gt;
&lt;p&gt;This uses &lt;a href=&quot;http://openid.net/get-an-openid/what-is-openid/&quot;&gt;the broadly-cooperative openID system&lt;/a&gt;. If you run a website that accepts reader contributions, you should allow &lt;a href=&quot;http://www.news.software.coop/comments-with-openid/1271/&quot; title=&quot;comments with openid&quot;&gt;comments with openid&lt;/a&gt; because it helps people to use their existing social media membership without you having to surrender any control to facebook, twitter, or anyone else (unless you choose to). You also don’t have to ask your readers to weaken their security settings like with disqus (which requires javascript and third-party cookies).&lt;/p&gt;
&lt;p&gt;The comment form on our site is powered by &lt;a href=&quot;http://wordpress.org/extend/plugins/openid&quot;&gt;the openid plugin&lt;/a&gt;, together with &lt;a href=&quot;http://www.software.coop/&quot; title=&quot;our co-op&quot;&gt;our co-op&lt;/a&gt;’s version of &lt;a href=&quot;http://wordpress.org/extend/plugins/comments-with-openid&quot;&gt;the comments-with-openid plugin&lt;/a&gt; which can be &lt;a href=&quot;http://www.software.coop/source/&quot;&gt;downloaded from our site&lt;/a&gt;. Please download them if you’d find them useful for your WordPress site. (I’d love to adopt the official comments-with-openid at wordpress.org because the previous maintainer doesn’t answer – anyone know how to do that? I’m surprised it’s not in the FAQ.)&lt;/p&gt;
&lt;p&gt;Do you use some other platform? What tools have let you add openid logins to it? For example, &lt;a href=&quot;http://www.news.software.coop/categories/tech/drupal/&quot; title=&quot;Drupal&quot;&gt;Drupal&lt;/a&gt; has some openID support in its core distribution: what else is out there?&lt;/p&gt;</content>
	<author>
	  <name>mjr</name>
	   <uri>http://www.news.software.coop</uri> 
	</author>
	<source>
	  <title type="html">Software Cooperative News » mjr</title>
	  <subtitle type="html">What software.coop is doing and contemplating</subtitle>
	  <link rel="self" href="http://mjr.towers.org.uk/blog/all.rss"/>
	  <id>http://www.news.software.coop</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">2012-02-09: Thursday</title>
	<link href="http://retout.co.uk/blog/2012/02/09/2012-02-09"/>
	<id>http://retout.co.uk/blog/2012/02/09/2012-02-09</id>
	<updated>2012-02-09T22:57:00+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;ul&gt;
&lt;li&gt;Michael Meeks gave awesome talks at FOSDEM, so Kate was inspired
to hack on LibreOffice.  I was inspired to write this blog entry in a
list.  She probably wins.&lt;/li&gt;
&lt;li&gt;Building LibreOffice master on Debian stable failed for her with a
segmentation fault in GNU Make. A bit of searching threw up &lt;a href=&quot;http://savannah.gnu.org/bugs/?20033&quot;&gt;Savannah bug #20033&lt;/a&gt;,
which is hitting everyone on the upstream mailing list.&lt;/li&gt;
&lt;li&gt;Bumped severity and offered to NMU &lt;a href=&quot;http://bugs.debian.org/622644&quot;&gt;Debian bug #622644&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Then actually tried building make-dfsg in cowbuilder, and aclocal
fails in the clean environment because /usr/share/aclocal does not
exist. I think it&#39;s related to &lt;a href=&quot;http://bugs.debian.org/565663&quot;&gt;Debian bug #565663&lt;/a&gt;, but I&#39;m
still poking it.&lt;/li&gt;
&lt;/ul&gt;</content>
	<author>
	  <name>Tim Retout</name>
	   <uri>http://retout.co.uk/</uri> 
	</author>
	<source>
	  <title type="html">Tim Retout's blog</title>
	  
	  <link rel="self" href="http://retout.co.uk/blog/index.atom"/>
	  <id>http://retout.co.uk/blog/index.atom</id>  <rights type="html">Copyright (C) 2007-2011 Tim Retout</rights>
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">Is GPL usage really declining?</title>
	<link href="http://mjg59.dreamwidth.org/10696.html"/>
	<id>http://mjg59.dreamwidth.org/10696.html</id>
	<updated>2012-02-09T22:33:55+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">Matthew Aslett wrote about how &lt;a href=&quot;http://blogs.the451group.com/opensource/2011/12/15/on-the-continuing-decline-of-the-gpl/&quot;&gt;the proportion of projects released under GPL-like licenses appears to be declining&lt;/a&gt;, at least as far as various sets of figures go. But what does that actually mean? In absolute terms, GPL use has increased - any change isn&#39;t down to GPL projects transitioning over to liberal licenses. But an increasing number of new projects are being released under liberal licenses. Why is that?&lt;br /&gt;&lt;br /&gt;The figures from &lt;a href=&quot;http://osrc.blackducksoftware.com/data/licenses/&quot;&gt;Black Duck&lt;/a&gt; aren&#39;t a great help here, because they tell us very little about the software they&#39;re looking at. &lt;a href=&quot;http://flossmole.org&quot;&gt;FLOSSmole&lt;/a&gt; is rather more interesting. I pulled the license figures from a few sites and found the following proportion of GPLed projects:&lt;br /&gt;&lt;br /&gt;RubyForge: ~30%&lt;br /&gt;Google Code: ~50%&lt;br /&gt;Launchpad: ~70%&lt;br /&gt;&lt;br /&gt;I&#39;ve left the numbers rough because there&#39;s various uncertainties - should proprietary licenses be included in the numbers, is CC Sharealike enough like the GPL to count it there, that kind of thing. But what&#39;s clear is that these three sites have massively different levels of GPL use, and it&#39;s not hard to imagine why. They all attract different types of developer. The RubyForge figures are obviously going to be heavily influenced by Ruby developers, and that (handwavily) implies more of a bias towards web developers than the general developer population. Launchpad, on the other hand, is going to have a closer association with people with an Ubuntu background - it&#39;s probably more representative of Linux developers. Google Code? The 50% figure is the closest to the 56.8% figure that Black Duck give, so it&#39;s probably representative of the more general development community.&lt;br /&gt;&lt;br /&gt;The impression gained from this is that the probability of you using one of the GPL licenses is influenced by the community that you&#39;re part of. And it&#39;s not a huge leap to believe that an increasing number of developers are targeting the web, and the web development community has never been especially attached to the GPL. It&#39;s not hard to see why - the benefits of the GPL vanish pretty much entirely when you&#39;re never actually obliged to distribute the code, and while Affero attempts to compensate from that it also constrains your UI and deployment model. No matter how strong a believer in Copyleft you are, the web makes it difficult for users to take any advantage of the freedoms you&#39;d want to offer. It&#39;s as easy not to bother.&lt;br /&gt;So it&#39;s pretty unsurprising that an increase in web development would be associated with a decrease in the proportion of projects licensed under the GPL.&lt;br /&gt;&lt;br /&gt;This obviously isn&#39;t a rigorous analysis. I have very little hard evidence to back up my assumptions. But nor does anyone who claims that the change is because the FSF alienated the community during GPLv3 development. I&#39;d be fascinated to see someone spend some time comparing project type with license use and trying to come up with a more convincing argument.&lt;br /&gt;&lt;br /&gt;(Raw data from FLOSSmole: Howison, J., Conklin, M., &amp;amp; Crowston, K. (2006). FLOSSmole: A collaborative repository for FLOSS research data and analyses. International Journal of Information Technology and Web Engineering, 1(3), 17–26.)&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://www.dreamwidth.org/tools/commentcount?user=mjg59&amp;amp;ditemid=10696&quot; alt=&quot;comment count unavailable&quot; height=&quot;12&quot; style=&quot;vertical-align: middle;&quot; width=&quot;30&quot; /&gt; comments</content>
	<author>
	  <name>Matthew Garrett</name>
	   <uri>http://mjg59.dreamwidth.org/</uri> 
	</author>
	<source>
	  <title type="html">Matthew Garrett</title>
	  <subtitle type="html">Matthew Garrett - Dreamwidth Studios</subtitle>
	  <link rel="self" href="http://mjg59.dreamwidth.org/data/rss"/>
	  <id>http://mjg59.dreamwidth.org/</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">Debian packaging for beginners @ FOSDEM</title>
	<link href="http://liorkaplan.wordpress.com/2012/02/09/debian-packaging-for-beginners-fosdem/"/>
	<id>http://liorkaplan.wordpress.com/?p=423</id>
	<updated>2012-02-09T18:31:11+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;After not attending FOSDEM for a few years, this year I decided to attend and also give a talk about “Debian packaging for beginners”, a replay of a talk given by Gergely Nagy in Debconf11 (&lt;a href=&quot;http://meetings-archive.debian.net/pub/debian-meetings/2011/debconf11/high/836_Packaging_for_beginners.ogv&quot;&gt;video&lt;/a&gt;). As the per distribution devrooms were replaced a few years ago with the cross-distributions rooms, I thought it might be a good chance to have this kind of introduction talk to help people started contributing to Debian (or derived distributions).&lt;/p&gt;
&lt;p&gt;The talk wasn’t meant to replace reading the  documentation (new maintainer’s guide, developer’s references and the debian policy), but it’s a good start for those who want some hands-on experience. The idea is to start with a just the upstream directory and progress trough the various errors and warnings we get during the build process using dpkg-buildpackage. The outcome is of course very basic, but enough to get people ready to do things on their own, including various QA tests on the package (e.g. lintian and debdiff).&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;http://people.debian.org/~kaplan/debian%20packaging%20for%20beginners.pdf&quot;&gt;presentation&lt;/a&gt; covers the important points of the 3 main files in the debian directory: control, changelog and rules. It addition it holds some information about the various tools one can used to test the packages. I hope to make another version of the presentation to be more standalone than just having the main points during the talk itself.&lt;/p&gt;
&lt;br /&gt;Filed under: &lt;a href=&quot;http://liorkaplan.wordpress.com/category/debian-gnulinux/&quot;&gt;Debian GNU/Linux&lt;/a&gt;, &lt;a href=&quot;http://liorkaplan.wordpress.com/category/fosdem/&quot;&gt;FOSDEM&lt;/a&gt;  &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/liorkaplan.wordpress.com/423/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/comments/liorkaplan.wordpress.com/423/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godelicious/liorkaplan.wordpress.com/423/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/delicious/liorkaplan.wordpress.com/423/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gofacebook/liorkaplan.wordpress.com/423/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/facebook/liorkaplan.wordpress.com/423/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gotwitter/liorkaplan.wordpress.com/423/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/twitter/liorkaplan.wordpress.com/423/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gostumble/liorkaplan.wordpress.com/423/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/stumble/liorkaplan.wordpress.com/423/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godigg/liorkaplan.wordpress.com/423/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/digg/liorkaplan.wordpress.com/423/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/goreddit/liorkaplan.wordpress.com/423/&quot; rel=&quot;nofollow&quot;&gt;&lt;img src=&quot;http://feeds.wordpress.com/1.0/reddit/liorkaplan.wordpress.com/423/&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;img src=&quot;http://stats.wordpress.com/b.gif?host=liorkaplan.wordpress.com&amp;amp;blog=1397551&amp;amp;post=423&amp;amp;subd=liorkaplan&amp;amp;ref=&amp;amp;feed=1&quot; alt=&quot;&quot; height=&quot;1&quot; border=&quot;0&quot; width=&quot;1&quot; /&gt;</content>
	<author>
	  <name>Lior Kaplan</name>
	   <uri>http://liorkaplan.wordpress.com</uri> 
	</author>
	<source>
	  <title type="html">Free Software Universe</title>
	  <subtitle type="html">The experience of a free software community member</subtitle>
	  <link rel="self" href="http://liorkaplan.wordpress.com/feed/"/>
	  <id>http://liorkaplan.wordpress.com</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">Recipes for extending Net-SNMP</title>
	<link href="http://vincent.bernat.im/en/blog/2012-extending-netsnmp.html"/>
	<id>http://www.luffy.cx/en/blog/2012-extending-netsnmp.html</id>
	<updated>2012-02-09T18:30:35+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;&lt;abbr title=&quot;Simple Network Management Protocol&quot;&gt;&lt;span class=&quot;caps&quot;&gt;SNMP&lt;/span&gt;&lt;/abbr&gt; stands for &lt;a href=&quot;http://en.wikipedia.org/wiki/Simple_Network_Management_Protocol&quot; title=&quot;SNMP on Wikipedia&quot;&gt;Simple Network Management Protocol&lt;/a&gt;. It allows
a &lt;em&gt;manager&lt;/em&gt; to query information from an &lt;em&gt;agent&lt;/em&gt;. A popular use of
&lt;abbr title=&quot;Simple Network Management Protocol&quot;&gt;&lt;span class=&quot;caps&quot;&gt;SNMP&lt;/span&gt;&lt;/abbr&gt; is to retrieve network interface counters to plot a bandwidth
graph. While the “S” in &lt;abbr title=&quot;Simple Network Management Protocol&quot;&gt;&lt;span class=&quot;caps&quot;&gt;SNMP&lt;/span&gt;&lt;/abbr&gt; stands for &lt;em&gt;simple&lt;/em&gt;, &lt;abbr title=&quot;Simple Network Management Protocol&quot;&gt;&lt;span class=&quot;caps&quot;&gt;SNMP&lt;/span&gt;&lt;/abbr&gt; can be quite
difficult to deal with. However, it is still the &lt;em&gt;de facto&lt;/em&gt; standard
for retrieving metrics in an heterogeneous
environment. &lt;a href=&quot;http://www.net-snmp.org/&quot; title=&quot;Net-SNMP, a suite of applications for SNMP&quot;&gt;Net-&lt;abbr title=&quot;Simple Network Management Protocol&quot;&gt;&lt;abbr title=&quot;Simple Network Management Protocol&quot;&gt;&lt;span class=&quot;caps&quot;&gt;SNMP&lt;/span&gt;&lt;/abbr&gt;&lt;/abbr&gt;&lt;/a&gt; is a suite of &lt;abbr title=&quot;Simple Network Management Protocol&quot;&gt;&lt;span class=&quot;caps&quot;&gt;SNMP&lt;/span&gt;&lt;/abbr&gt; applications
including an agent. Out of the box, this agent exports a lot of
information but if something is missing, there are several ways to
extend it. Which ones?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;tl;dr&lt;/strong&gt;: in my opinion, extending Net-&lt;abbr title=&quot;Simple Network Management Protocol&quot;&gt;&lt;span class=&quot;caps&quot;&gt;SNMP&lt;/span&gt;&lt;/abbr&gt; should be done with
either of those methods:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;using &lt;code&gt;extend&lt;/code&gt; directive;&lt;/li&gt;
&lt;li&gt;using &lt;code&gt;pass_persist&lt;/code&gt; directive;&lt;/li&gt;
&lt;li&gt;using AgentX protocol.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;toc&quot;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://vincent.bernat.im/en/blog/atom.xml#snmp-in-a-nutshell&quot;&gt;&lt;span class=&quot;caps&quot;&gt;SNMP&lt;/span&gt; in a nutshell&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://vincent.bernat.im/en/blog/atom.xml#extending-net-snmp&quot;&gt;Extending Net-&lt;span class=&quot;caps&quot;&gt;SNMP&lt;/span&gt;&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://vincent.bernat.im/en/blog/atom.xml#with-arbitrary-commands&quot;&gt;With arbitrary commands&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://vincent.bernat.im/en/blog/atom.xml#with-pass-through-scripts&quot;&gt;With pass-through scripts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://vincent.bernat.im/en/blog/atom.xml#with-agentx-protocol&quot;&gt;With AgentX protocol&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://vincent.bernat.im/en/blog/atom.xml#perl-and-python&quot;&gt;Perl and Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://vincent.bernat.im/en/blog/atom.xml#c-with-new-api&quot;&gt;C with “new” &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://vincent.bernat.im/en/blog/atom.xml#c-with-traditional-api&quot;&gt;C with “traditional” &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://vincent.bernat.im/en/blog/atom.xml#other-solutions&quot;&gt;Other solutions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h1 id=&quot;snmp-in-a-nutshell&quot;&gt;&lt;abbr title=&quot;Simple Network Management Protocol&quot;&gt;&lt;span class=&quot;caps&quot;&gt;SNMP&lt;/span&gt;&lt;/abbr&gt; in a nutshell&lt;/h1&gt;
&lt;p&gt;The &lt;em&gt;variables&lt;/em&gt; accessible with &lt;abbr title=&quot;Simple Network Management Protocol&quot;&gt;&lt;span class=&quot;caps&quot;&gt;SNMP&lt;/span&gt;&lt;/abbr&gt; through the agent are organized
in a tree. Each variable is typed and associated to an &lt;em&gt;object
identifier&lt;/em&gt; (or &lt;abbr title=&quot;Object IDentifier&quot;&gt;&lt;span class=&quot;caps&quot;&gt;OID&lt;/span&gt;&lt;/abbr&gt;). For example, &lt;code&gt;.1.3.6.1.2.1.31.1.1.1.1.2&lt;/code&gt; is the
&lt;abbr title=&quot;Object IDentifier&quot;&gt;&lt;span class=&quot;caps&quot;&gt;OID&lt;/span&gt;&lt;/abbr&gt; of the name of the second network card.&lt;/p&gt;
&lt;p&gt;Usually, &lt;abbr title=&quot;Simple Network Management Protocol&quot;&gt;&lt;span class=&quot;caps&quot;&gt;SNMP&lt;/span&gt;&lt;/abbr&gt; is operated over &lt;span class=&quot;caps&quot;&gt;UDP&lt;/span&gt;, port 161. For the purpose of this
article, we consider a manager can issue three kinds of requests:&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;span class=&quot;caps&quot;&gt;GET&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;retrieve a variable.&lt;/dd&gt;
&lt;dt&gt;&lt;span class=&quot;caps&quot;&gt;GETNEXT&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;retrieve the next variable, in lexical order of their &lt;abbr title=&quot;Object IDentifier&quot;&gt;&lt;span class=&quot;caps&quot;&gt;OID&lt;/span&gt;&lt;/abbr&gt;. This
  operation enables an &lt;abbr title=&quot;Simple Network Management Protocol&quot;&gt;&lt;span class=&quot;caps&quot;&gt;SNMP&lt;/span&gt;&lt;/abbr&gt; manager to &lt;em&gt;walk&lt;/em&gt; through all available
  variables, for example to discover the list of interfaces of an
  agent. This operation is what makes an &lt;abbr title=&quot;Simple Network Management Protocol&quot;&gt;&lt;span class=&quot;caps&quot;&gt;SNMP&lt;/span&gt;&lt;/abbr&gt; agent difficult to
  implement but this is also a critical feature.&lt;/dd&gt;
&lt;dt&gt;&lt;span class=&quot;caps&quot;&gt;SET&lt;/span&gt;&lt;/dt&gt;
&lt;dd&gt;request the modification of a variable.&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;Since such an &lt;abbr title=&quot;Object IDentifier&quot;&gt;&lt;span class=&quot;caps&quot;&gt;OID&lt;/span&gt;&lt;/abbr&gt; may be difficult to handle by humans, available
variables are described by a &lt;a href=&quot;http://en.wikipedia.org/wiki/Management_information_base&quot; title=&quot;MIB on Wikipedia&quot;&gt;&lt;abbr title=&quot;Management Information Base&quot;&gt;&lt;abbr title=&quot;Management Information Base&quot;&gt;&lt;span class=&quot;caps&quot;&gt;MIB&lt;/span&gt;&lt;/abbr&gt;&lt;/abbr&gt;&lt;/a&gt; module which is a file that
should be parsed to get a mapping between &lt;abbr title=&quot;Object IDentifier&quot;&gt;&lt;span class=&quot;caps&quot;&gt;OID&lt;/span&gt;&lt;/abbr&gt; and variable names and
types. For example, the above &lt;abbr title=&quot;Object IDentifier&quot;&gt;&lt;span class=&quot;caps&quot;&gt;OID&lt;/span&gt;&lt;/abbr&gt; can also be referred as
&lt;code&gt;IF-MIB::ifName.2&lt;/code&gt;. Those &lt;abbr title=&quot;Management Information Base&quot;&gt;&lt;span class=&quot;caps&quot;&gt;MIB&lt;/span&gt;&lt;/abbr&gt; modules are described using a subset of
&lt;a href=&quot;http://en.wikipedia.org/wiki/Abstract_Syntax_Notation_One&quot; title=&quot;ASN.1 syntax on Wikipedia&quot;&gt;&lt;span class=&quot;caps&quot;&gt;ASN&lt;/span&gt;.1&lt;/a&gt; defined in &lt;a href=&quot;http://tools.ietf.org/html/rfc2578&quot; title=&quot;RFC 2578: SMIv2&quot;&gt;&lt;span class=&quot;caps&quot;&gt;RFC&lt;/span&gt; 2578&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A &lt;abbr title=&quot;Management Information Base&quot;&gt;&lt;span class=&quot;caps&quot;&gt;MIB&lt;/span&gt;&lt;/abbr&gt; module allows to group several variables into a conceptual
table. For example, &lt;code&gt;IF-MIB::ifDescr&lt;/code&gt;, &lt;code&gt;IF-MIB::ifType&lt;/code&gt;,
&lt;code&gt;IF-MIB::ifSpeed&lt;/code&gt; are columns of &lt;code&gt;IF-MIB::ifTable&lt;/code&gt;. Each row is
associated to an index. In the case of &lt;code&gt;IF-MIB::ifTable&lt;/code&gt;, it is the
interface index. Net-&lt;abbr title=&quot;Simple Network Management Protocol&quot;&gt;&lt;span class=&quot;caps&quot;&gt;SNMP&lt;/span&gt;&lt;/abbr&gt; includes &lt;code&gt;snmptable&lt;/code&gt; allowing one to display
such a table in a natural manner&lt;sup id=&quot;fnref:snmpconf&quot;&gt;&lt;a href=&quot;http://vincent.bernat.im/en/blog/atom.xml#fn:snmpconf&quot; rel=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;:&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; snmptable localhost &lt;span class=&quot;caps&quot;&gt;IF&lt;/span&gt;-&lt;span class=&quot;caps&quot;&gt;MIB&lt;/span&gt;::ifTable
&lt;span class=&quot;go&quot;&gt;&lt;span class=&quot;caps&quot;&gt;SNMP&lt;/span&gt; table: &lt;span class=&quot;caps&quot;&gt;IF&lt;/span&gt;-&lt;span class=&quot;caps&quot;&gt;MIB&lt;/span&gt;::ifTable&lt;/span&gt;

&lt;span class=&quot;go&quot;&gt; ifIndex ifDescr           ifType ifMtu   ifSpeed&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;       1      lo softwareLoopback 16436  10000000&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;       2    eth0   ethernetCsmacd  1500 100000000&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;       3    eth1   ethernetCsmacd  1500  10000000&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;       4     br0   ethernetCsmacd  1500         0&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Variables inside a table are called &lt;em&gt;columnar objects&lt;/em&gt; while those
outside are &lt;em&gt;scalar objects&lt;/em&gt;. &lt;abbr title=&quot;Simple Network Management Protocol&quot;&gt;&lt;span class=&quot;caps&quot;&gt;SNMP&lt;/span&gt;&lt;/abbr&gt;, as a protocol, does not care of
this distinction since it does not know the concept of &lt;abbr title=&quot;Management Information Base&quot;&gt;&lt;span class=&quot;caps&quot;&gt;MIB&lt;/span&gt;&lt;/abbr&gt; modules.&lt;/p&gt;
&lt;p&gt;Other useful tools from Net-&lt;abbr title=&quot;Simple Network Management Protocol&quot;&gt;&lt;span class=&quot;caps&quot;&gt;SNMP&lt;/span&gt;&lt;/abbr&gt; includes &lt;code&gt;snmpget&lt;/code&gt; to get a specific
variable, &lt;code&gt;snmpwalk&lt;/code&gt; to discover available variables (with &lt;em&gt;&lt;span class=&quot;caps&quot;&gt;GETNEXT&lt;/span&gt;&lt;/em&gt;
operation) from an &lt;abbr title=&quot;Object IDentifier&quot;&gt;&lt;span class=&quot;caps&quot;&gt;OID&lt;/span&gt;&lt;/abbr&gt; and &lt;code&gt;snmptranslate&lt;/code&gt; to translate between object
names and &lt;abbr title=&quot;Object IDentifier&quot;&gt;&lt;span class=&quot;caps&quot;&gt;OID&lt;/span&gt;&lt;/abbr&gt;.&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; snmpget localhost &lt;span class=&quot;caps&quot;&gt;IF&lt;/span&gt;-&lt;span class=&quot;caps&quot;&gt;MIB&lt;/span&gt;::ifDescr.2
&lt;span class=&quot;go&quot;&gt;&lt;span class=&quot;caps&quot;&gt;IF&lt;/span&gt;-&lt;span class=&quot;caps&quot;&gt;MIB&lt;/span&gt;::ifDescr.2 = &lt;span class=&quot;caps&quot;&gt;STRING&lt;/span&gt;: eth0&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; snmpwalk localhost &lt;span class=&quot;caps&quot;&gt;IF&lt;/span&gt;-&lt;span class=&quot;caps&quot;&gt;MIB&lt;/span&gt;::ifDescr
&lt;span class=&quot;go&quot;&gt;&lt;span class=&quot;caps&quot;&gt;IF&lt;/span&gt;-&lt;span class=&quot;caps&quot;&gt;MIB&lt;/span&gt;::ifDescr.1 = &lt;span class=&quot;caps&quot;&gt;STRING&lt;/span&gt;: lo&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;&lt;span class=&quot;caps&quot;&gt;IF&lt;/span&gt;-&lt;span class=&quot;caps&quot;&gt;MIB&lt;/span&gt;::ifDescr.2 = &lt;span class=&quot;caps&quot;&gt;STRING&lt;/span&gt;: eth0&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;&lt;span class=&quot;caps&quot;&gt;IF&lt;/span&gt;-&lt;span class=&quot;caps&quot;&gt;MIB&lt;/span&gt;::ifDescr.3 = &lt;span class=&quot;caps&quot;&gt;STRING&lt;/span&gt;: eth1&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;&lt;span class=&quot;caps&quot;&gt;IF&lt;/span&gt;-&lt;span class=&quot;caps&quot;&gt;MIB&lt;/span&gt;::ifDescr.4 = &lt;span class=&quot;caps&quot;&gt;STRING&lt;/span&gt;: br0&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; snmpwalk -On public localhost .1.3.6.1.2.1.2.2.1.2
&lt;span class=&quot;go&quot;&gt;.1.3.6.1.2.1.2.2.1.2.1 = &lt;span class=&quot;caps&quot;&gt;STRING&lt;/span&gt;: lo&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;.1.3.6.1.2.1.2.2.1.2.2 = &lt;span class=&quot;caps&quot;&gt;STRING&lt;/span&gt;: eth0&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;.1.3.6.1.2.1.2.2.1.2.3 = &lt;span class=&quot;caps&quot;&gt;STRING&lt;/span&gt;: eth1&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;.1.3.6.1.2.1.2.2.1.2.4 = &lt;span class=&quot;caps&quot;&gt;STRING&lt;/span&gt;: br0&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; snmptranslate -On &lt;span class=&quot;caps&quot;&gt;IF&lt;/span&gt;-&lt;span class=&quot;caps&quot;&gt;MIB&lt;/span&gt;::ifDescr.3
&lt;span class=&quot;go&quot;&gt;.1.3.6.1.2.1.2.2.1.2.3&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h1 id=&quot;extending-net-snmp&quot;&gt;Extending Net-&lt;abbr title=&quot;Simple Network Management Protocol&quot;&gt;&lt;span class=&quot;caps&quot;&gt;SNMP&lt;/span&gt;&lt;/abbr&gt;&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;ethtool -S&lt;/code&gt; allows us to access various statistics from a network
card, like the number of octets received and transmitted or the number
of collisions. While some of those statistics are defined in
&lt;a href=&quot;http://tools.ietf.org/html/rfc2233&quot; title=&quot;RFC 2233: The Interfaces Group MIB using SMIv2&quot;&gt;&lt;span class=&quot;caps&quot;&gt;IF&lt;/span&gt;-&lt;abbr title=&quot;Management Information Base&quot;&gt;&lt;abbr title=&quot;Management Information Base&quot;&gt;&lt;span class=&quot;caps&quot;&gt;MIB&lt;/span&gt;&lt;/abbr&gt;&lt;/abbr&gt;&lt;/a&gt;, in &lt;a href=&quot;http://tools.ietf.org/html/rfc1757&quot; title=&quot;RFC 1757: RMON&quot;&gt;&lt;span class=&quot;caps&quot;&gt;RMON&lt;/span&gt;-&lt;abbr title=&quot;Management Information Base&quot;&gt;&lt;abbr title=&quot;Management Information Base&quot;&gt;&lt;span class=&quot;caps&quot;&gt;MIB&lt;/span&gt;&lt;/abbr&gt;&lt;/abbr&gt;&lt;/a&gt; and in
&lt;a href=&quot;http://tools.ietf.org/html/rfc3635&quot; title=&quot;RFC 3635: Ethernet-like Interface Types&quot;&gt;EtherLike-&lt;abbr title=&quot;Management Information Base&quot;&gt;&lt;abbr title=&quot;Management Information Base&quot;&gt;&lt;span class=&quot;caps&quot;&gt;MIB&lt;/span&gt;&lt;/abbr&gt;&lt;/abbr&gt;&lt;/a&gt;, some of them are not available and very
specific. Therefore, we would like to export those statistics,
unmodified, through &lt;abbr title=&quot;Simple Network Management Protocol&quot;&gt;&lt;span class=&quot;caps&quot;&gt;SNMP&lt;/span&gt;&lt;/abbr&gt;.&lt;/p&gt;
&lt;p&gt;To the best of my knowledge, no &lt;abbr title=&quot;Management Information Base&quot;&gt;&lt;span class=&quot;caps&quot;&gt;MIB&lt;/span&gt;&lt;/abbr&gt; module exists for such an
usage. The first task is to write one. It can be called
&lt;a href=&quot;https://github.com/vincentbernat/extend-netsnmp/blob/master/ETHTOOL-MIB&quot; title=&quot;ETHTOOL-MIB&quot;&gt;&lt;span class=&quot;caps&quot;&gt;ETHTOOL&lt;/span&gt;-&lt;abbr title=&quot;Management Information Base&quot;&gt;&lt;abbr title=&quot;Management Information Base&quot;&gt;&lt;span class=&quot;caps&quot;&gt;MIB&lt;/span&gt;&lt;/abbr&gt;&lt;/abbr&gt;&lt;/a&gt;. It only contains one table indexed by the
interface index and the name of the statistic. Here is the expected output:&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; snmpwalk localhost &lt;span class=&quot;caps&quot;&gt;ETHTOOL&lt;/span&gt;-&lt;span class=&quot;caps&quot;&gt;MIB&lt;/span&gt;::ethtoolStat.2
&lt;span class=&quot;go&quot;&gt;ethtoolStat.2.&#39;align_errors&#39; = Counter64: 0&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;ethtoolStat.2.&#39;broadcast&#39; = Counter64: 25&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;ethtoolStat.2.&#39;multicast&#39; = Counter64: 345&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;ethtoolStat.2.&#39;rx_errors&#39; = Counter64: 0&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;ethtoolStat.2.&#39;rx_missed&#39; = Counter64: 0&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;ethtoolStat.2.&#39;rx_packets&#39; = Counter64: 262011&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;ethtoolStat.2.&#39;tx_aborted&#39; = Counter64: 0&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;ethtoolStat.2.&#39;tx_errors&#39; = Counter64: 0&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;ethtoolStat.2.&#39;tx_multi_collisions&#39; = Counter64: 0&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;ethtoolStat.2.&#39;tx_packets&#39; = Counter64: 296170&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;ethtoolStat.2.&#39;tx_single_collisions&#39; = Counter64: 0&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;ethtoolStat.2.&#39;tx_underrun&#39; = Counter64: 0&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;ethtoolStat.2.&#39;unicast&#39; = Counter64: 261641&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;I have coded various implementations of this &lt;abbr title=&quot;Management Information Base&quot;&gt;&lt;span class=&quot;caps&quot;&gt;MIB&lt;/span&gt;&lt;/abbr&gt; module and made them
available in a &lt;a href=&quot;https://github.com/vincentbernat/extend-netsnmp/&quot; title=&quot;Various examples on how to extend Net-SNMP&quot;&gt;GitHub repository&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;with-arbitrary-commands&quot;&gt;With arbitrary commands&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;extend&lt;/code&gt; directive allows the agent to execute an arbitrary
command and to provide its output and status through
&lt;code&gt;NET-SNMP-EXTEND-MIB&lt;/code&gt; module. If we want to export the statistics for
&lt;code&gt;eth0&lt;/code&gt;, we could add something like this in &lt;code&gt;snmpd.conf&lt;/code&gt;, using a
&lt;a href=&quot;https://github.com/vincentbernat/extend-netsnmp/blob/master/net-snmp-extend/ethtool-stats&quot; title=&quot;Simple script to format the output of ethtool&quot;&gt;custom script&lt;/a&gt; to format the output of &lt;code&gt;ethtool -S&lt;/code&gt; in
a way that is more suitable for our use:&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span class=&quot;c1&quot;&gt;# Export eth0 statistics&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;extend&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;eth0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;names&lt;/span&gt;  &lt;span class=&quot;sr&quot;&gt;/full/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;sr&quot;&gt;/to/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ethtool&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;stats&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;eth0&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;names&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;extend&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;eth0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;values&lt;/span&gt; &lt;span class=&quot;sr&quot;&gt;/full/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;sr&quot;&gt;/to/&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ethtool&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;stats&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;eth0&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;values&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The result can be retrieved through
&lt;code&gt;NET-SNMP-EXTEND-MIB::‌nsExtendOutput2Table&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; snmpwalk localhost &lt;span class=&quot;caps&quot;&gt;NET&lt;/span&gt;-&lt;span class=&quot;caps&quot;&gt;SNMP&lt;/span&gt;-&lt;span class=&quot;caps&quot;&gt;EXTEND&lt;/span&gt;-&lt;span class=&quot;caps&quot;&gt;MIB&lt;/span&gt;::nsExtendOutput2Table
&lt;span class=&quot;go&quot;&gt;nsExtendOutLine.&quot;eth0-names&quot;.1 = &lt;span class=&quot;caps&quot;&gt;STRING&lt;/span&gt;: tx_packets&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;nsExtendOutLine.&quot;eth0-names&quot;.2 = &lt;span class=&quot;caps&quot;&gt;STRING&lt;/span&gt;: rx_packets&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;nsExtendOutLine.&quot;eth0-names&quot;.3 = &lt;span class=&quot;caps&quot;&gt;STRING&lt;/span&gt;: tx_errors&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;nsExtendOutLine.&quot;eth0-names&quot;.4 = &lt;span class=&quot;caps&quot;&gt;STRING&lt;/span&gt;: rx_errors&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;nsExtendOutLine.&quot;eth0-names&quot;.5 = &lt;span class=&quot;caps&quot;&gt;STRING&lt;/span&gt;: rx_missed&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;nsExtendOutLine.&quot;eth0-names&quot;.6 = &lt;span class=&quot;caps&quot;&gt;STRING&lt;/span&gt;: align_errors&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;nsExtendOutLine.&quot;eth0-names&quot;.7 = &lt;span class=&quot;caps&quot;&gt;STRING&lt;/span&gt;: tx_single_collisions&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;nsExtendOutLine.&quot;eth0-names&quot;.8 = &lt;span class=&quot;caps&quot;&gt;STRING&lt;/span&gt;: tx_multi_collisions&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;nsExtendOutLine.&quot;eth0-values&quot;.1 = &lt;span class=&quot;caps&quot;&gt;STRING&lt;/span&gt;: 246309&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;nsExtendOutLine.&quot;eth0-values&quot;.2 = &lt;span class=&quot;caps&quot;&gt;STRING&lt;/span&gt;: 223941&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;nsExtendOutLine.&quot;eth0-values&quot;.3 = &lt;span class=&quot;caps&quot;&gt;STRING&lt;/span&gt;: 0&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;nsExtendOutLine.&quot;eth0-values&quot;.4 = &lt;span class=&quot;caps&quot;&gt;STRING&lt;/span&gt;: 0&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;nsExtendOutLine.&quot;eth0-values&quot;.5 = &lt;span class=&quot;caps&quot;&gt;STRING&lt;/span&gt;: 0&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;nsExtendOutLine.&quot;eth0-values&quot;.6 = &lt;span class=&quot;caps&quot;&gt;STRING&lt;/span&gt;: 0&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;nsExtendOutLine.&quot;eth0-values&quot;.7 = &lt;span class=&quot;caps&quot;&gt;STRING&lt;/span&gt;: 0&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;nsExtendOutLine.&quot;eth0-values&quot;.8 = &lt;span class=&quot;caps&quot;&gt;STRING&lt;/span&gt;: 0&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;It is also possible to configure such a command using &lt;em&gt;&lt;span class=&quot;caps&quot;&gt;SET&lt;/span&gt;&lt;/em&gt;
requests. For example, if we want to add statistics for &lt;code&gt;eth2&lt;/code&gt;, we
could issue the following command:&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; snmpset -m +&lt;span class=&quot;caps&quot;&gt;NET&lt;/span&gt;-&lt;span class=&quot;caps&quot;&gt;SNMP&lt;/span&gt;-&lt;span class=&quot;caps&quot;&gt;EXTEND&lt;/span&gt;-&lt;span class=&quot;caps&quot;&gt;MIB&lt;/span&gt; localhost &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&lt;/span&gt;    &lt;span class=&quot;s1&quot;&gt;&#39;nsExtendStatus.&quot;eth2-names&quot;&#39;&lt;/span&gt;  &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; createAndGo &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&lt;/span&gt;    &lt;span class=&quot;s1&quot;&gt;&#39;nsExtendCommand.&quot;eth2-names&quot;&#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; /full/path/to/ethtool-stats &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&lt;/span&gt;    &lt;span class=&quot;s1&quot;&gt;&#39;nsExtendArgs.&quot;eth2-names&quot;&#39;&lt;/span&gt;    &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;eth2 names&#39;&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&lt;/span&gt;    &lt;span class=&quot;s1&quot;&gt;&#39;nsExtendStatus.&quot;eth2-values&quot;&#39;&lt;/span&gt;  &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; createAndGo &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&lt;/span&gt;    &lt;span class=&quot;s1&quot;&gt;&#39;nsExtendCommand.&quot;eth2-values&quot;&#39;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; /full/path/to/ethtool-stats &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&lt;/span&gt;    &lt;span class=&quot;s1&quot;&gt;&#39;nsExtendArgs.&quot;eth2-values&quot;&#39;&lt;/span&gt;    &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&#39;eth2 values&#39;&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;nsExtendStatus.&quot;eth2-names&quot; = &lt;span class=&quot;caps&quot;&gt;INTEGER&lt;/span&gt;: createAndGo(4)&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;nsExtendCommand.&quot;eth2-names&quot; = &lt;span class=&quot;caps&quot;&gt;STRING&lt;/span&gt;: /full/path/to/ethtool-stats&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;nsExtendArgs.&quot;eth2-names&quot; = &lt;span class=&quot;caps&quot;&gt;STRING&lt;/span&gt;: eth2 names&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;nsExtendStatus.&quot;eth2-values&quot; = &lt;span class=&quot;caps&quot;&gt;INTEGER&lt;/span&gt;: createAndGo(4)&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;nsExtendCommand.&quot;eth2-values&quot; = &lt;span class=&quot;caps&quot;&gt;STRING&lt;/span&gt;: /full/path/to/ethtool-stats&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;nsExtendArgs.&quot;eth2-values&quot; = &lt;span class=&quot;caps&quot;&gt;STRING&lt;/span&gt;: eth2 values&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; snmpgetnext -m +&lt;span class=&quot;caps&quot;&gt;NET&lt;/span&gt;-&lt;span class=&quot;caps&quot;&gt;SNMP&lt;/span&gt;-&lt;span class=&quot;caps&quot;&gt;EXTEND&lt;/span&gt;-&lt;span class=&quot;caps&quot;&gt;MIB&lt;/span&gt; localhost &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&lt;/span&gt;    &lt;span class=&quot;s1&quot;&gt;&#39;nsExtendOutLine.&quot;eth2-names&quot;&#39;&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;nsExtendOutLine.&quot;eth2-names&quot;.1 = &lt;span class=&quot;caps&quot;&gt;STRING&lt;/span&gt;: tx_packets&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;This can be very convenient but also a huge security risk. You should
disable this functionality or
&lt;a href=&quot;https://github.com/vincentbernat/extend-netsnmp/blob/master/net-snmp-extend/snmpd.conf&quot; title=&quot;snmpd.conf disabling the ability to configure NET-SNMP-EXTEND-MIB except for a super admin&quot;&gt;enable it only for some SNMPv3 user&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Using &lt;code&gt;extend&lt;/code&gt; does not allow to implement an arbitrary &lt;abbr title=&quot;Management Information Base&quot;&gt;&lt;span class=&quot;caps&quot;&gt;MIB&lt;/span&gt;&lt;/abbr&gt; module. If
the cache is not disabled, &lt;code&gt;extend&lt;/code&gt; is a good solution for various
simple needs, like providing the content of a one-line file or the
output of some Nagios plugin. However, exporting anything tabular,
like interface statistics, is not a good fit.&lt;/p&gt;
&lt;h2 id=&quot;with-pass-through-scripts&quot;&gt;With pass-through scripts&lt;/h2&gt;
&lt;p&gt;Net-&lt;abbr title=&quot;Simple Network Management Protocol&quot;&gt;&lt;span class=&quot;caps&quot;&gt;SNMP&lt;/span&gt;&lt;/abbr&gt; allows one to extend the agent by delegating some sub-tree to
a script defined by the &lt;code&gt;pass_persist&lt;/code&gt; directive. Such a script will
receive requests on its standard input with a very simple
line-oriented protocol described in the
&lt;a href=&quot;http://linux.die.net/man/5/snmpd.conf&quot; title=&quot;Manual page of snmpd.conf&quot;&gt;manual page of snmpd.conf&lt;/a&gt;. Here is an example of interaction:&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;→  PING
←  PONG
→  get
→  .1.3.6.1.4.1.39178.100.1.1.1.2.2.109.117.108.116.105.99.97.115.116
←  .1.3.6.1.4.1.39178.100.1.1.1.2.2.109.117.108.116.105.99.97.115.116
←  counter64
←  223941
→  getnext
→  .1.3.6.1.4.1.39178.100.1.1.1.2.2
←  .1.3.6.1.4.1.39178.100.1.1.1.2.2.97.108.105.103.110.95.101.114
←  counter64
←  0
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The protocol is simple enough to implement it from scratch in any
scripting language. However, in Perl, you may prefer to use
&lt;a href=&quot;http://search.cpan.org/~saper/SNMP-Extension-PassPersist-0.06/lib/SNMP/Extension/PassPersist.pm&quot; title=&quot;SNMP::Extension::PassPersist extension for Perl&quot;&gt;&lt;abbr title=&quot;Simple Network Management Protocol&quot;&gt;&lt;abbr title=&quot;Simple Network Management Protocol&quot;&gt;&lt;span class=&quot;caps&quot;&gt;SNMP&lt;/span&gt;&lt;/abbr&gt;&lt;/abbr&gt;::‌ExtensionSNMP::‌PassPersist&lt;/a&gt; extension from Sébastien
Aperghis-Tramoni. You can find the
&lt;a href=&quot;https://github.com/vincentbernat/extend-netsnmp/blob/master/passpersist-perl/ethtool-stats.pl&quot; title=&quot;Export ethtool statistics using pass_persist in Perl&quot;&gt;complete example on Github&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;&lt;span class=&quot;caps&quot;&gt;SNMP&lt;/span&gt;::Extension::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;PassPersist&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;my&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$extsnmp&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;&lt;span class=&quot;caps&quot;&gt;SNMP&lt;/span&gt;::Extension::&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;PassPersist&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;backend_collect&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;\&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;update_tree&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$extsnmp&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;sub &lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;update_tree&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;my&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;@interfaces&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;sr&quot;&gt;&amp;lt;/sys/class/net/*&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;foreach&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;my&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$interface&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;@interfaces&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nv&quot;&gt;$interface&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=~&lt;/span&gt; &lt;span class=&quot;sr&quot;&gt;s/^.*\///&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;nb&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;&lt;span class=&quot;caps&quot;&gt;ETHTOOL&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;ethtool -S $interface 2&amp;gt;/dev/null |&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;or&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sr&quot;&gt;&amp;lt;&lt;span class=&quot;caps&quot;&gt;ETHTOOL&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;sr&quot;&gt;/^\s+(\w+): (\d+)$/&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;or&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;my&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$name&lt;/span&gt;  &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;my&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$value&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;my&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$oid&lt;/span&gt;   &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;oid_compute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$interface&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
            &lt;span class=&quot;nv&quot;&gt;$extsnmp&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;add_oid_entry&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$oid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;counter&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;nb&quot;&gt;close&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;&lt;span class=&quot;caps&quot;&gt;ETHTOOL&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;With Python, &lt;a href=&quot;http://pypi.python.org/pypi/snmp-passpersist&quot; title=&quot;snmp-passpersist module for Python&quot;&gt;snmp-passpersist&lt;/a&gt; module, from Nicolas
Agius, provides a similar interface. Look at the
&lt;a href=&quot;https://github.com/vincentbernat/extend-netsnmp/blob/master/passpersist-python/ethtool-stats.py&quot; title=&quot;Export ethtool statistics using pass_persist in Python&quot;&gt;complete example on GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;pass_persist&lt;/code&gt; allows you to implement an arbitrary &lt;abbr title=&quot;Management Information Base&quot;&gt;&lt;span class=&quot;caps&quot;&gt;MIB&lt;/span&gt;&lt;/abbr&gt; module with
honest performances. Here are some important things to know about this directive:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Unless you have a recent version of Net-&lt;abbr title=&quot;Simple Network Management Protocol&quot;&gt;&lt;span class=&quot;caps&quot;&gt;SNMP&lt;/span&gt;&lt;/abbr&gt;, 64bit types are
   converted to 32bit equivalents. The counters may overflow quickly.&lt;/li&gt;
&lt;li&gt;While handling a request, you are not allowed to pause (for
   example, to fetch a remote information): the agent would become
   unresponsive. If you need slow-to-get data or data from the agent,
   grab them in a separate thread and ensure you have them beforehand.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;with-agentx-protocol&quot;&gt;With AgentX protocol&lt;/h2&gt;
&lt;p&gt;AgentX is a protocol defined in &lt;a href=&quot;http://tools.ietf.org/html/rfc2741&quot; title=&quot;RFC 2741: Ethernet-like Interface Types&quot;&gt;&lt;span class=&quot;caps&quot;&gt;RFC&lt;/span&gt; 2741&lt;/a&gt; allowing a &lt;em&gt;master
agent&lt;/em&gt; to be extended by independent &lt;em&gt;sub-agents&lt;/em&gt;. For &lt;code&gt;snmpd&lt;/code&gt; to
become a master agent, you just need to add &lt;code&gt;master agentx&lt;/code&gt; in
&lt;code&gt;snmpd.conf&lt;/code&gt;. Here are some of the benefits of an AgentX sub-agent over
&lt;code&gt;pass_persist&lt;/code&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;No configuration is needed for the master agent to accept an
    additional sub-agent. A sub-agent registers to the master agent
    the &lt;abbr title=&quot;Management Information Base&quot;&gt;&lt;span class=&quot;caps&quot;&gt;MIB&lt;/span&gt;&lt;/abbr&gt; modules (or part of them) it wants to take care of.&lt;/li&gt;
&lt;li&gt;A sub-agent is decoupled from the master agent. It can run with a
    different identity or be integrated into another daemon to export
    its internal metrics, send traps or allow remote configuration
    through &lt;abbr title=&quot;Simple Network Management Protocol&quot;&gt;&lt;span class=&quot;caps&quot;&gt;SNMP&lt;/span&gt;&lt;/abbr&gt;.&lt;/li&gt;
&lt;li&gt;AgentX protocol can be carried over &lt;span class=&quot;caps&quot;&gt;TCP&lt;/span&gt;. Sub-agents can therefore
    run on a foreign host or in a jailed environment.&lt;/li&gt;
&lt;li&gt;64bit types are fully supported. Traps are also supported.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;perl-and-python&quot;&gt;Perl and Python&lt;/h3&gt;
&lt;p&gt;Net-&lt;abbr title=&quot;Simple Network Management Protocol&quot;&gt;&lt;span class=&quot;caps&quot;&gt;SNMP&lt;/span&gt;&lt;/abbr&gt; provides a Perl module, &lt;code&gt;NetSNMP::agent&lt;/code&gt;, to write a sub-agent
using AgentX protocol. This module is not as convenient as the module
for &lt;code&gt;pass_persist&lt;/code&gt; described above since it does not provide a
convenient layer to put required information into some
datastore. Basically, it mimics the available C &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;. Here are a few
examples of its use:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An &lt;a href=&quot;https://github.com/vincentbernat/extend-netsnmp/blob/master/agentx-perl/ethtool-stats.pl&quot; title=&quot;Export ethtool statistics using AgentX in Perl&quot;&gt;implementation of &lt;span class=&quot;caps&quot;&gt;ETHTOOL&lt;/span&gt;-&lt;abbr title=&quot;Management Information Base&quot;&gt;&lt;abbr title=&quot;Management Information Base&quot;&gt;&lt;span class=&quot;caps&quot;&gt;MIB&lt;/span&gt;&lt;/abbr&gt;&lt;/abbr&gt;&lt;/a&gt; I have
   done in the same way as the &lt;code&gt;pass_persist&lt;/code&gt; version. My Perl skills
   are a bit rusty and the code has many rough edges.&lt;/li&gt;
&lt;li&gt;An &lt;a href=&quot;https://github.com/masterzen/redis-snmp/blob/master/redis-snmp&quot; title=&quot;SNMP subagent for Redis servers&quot;&gt;implementation of a sub-agent for Redis servers&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;An &lt;a href=&quot;http://net-snmp.git.sourceforge.net/git/gitweb.cgi?p=net-snmp/net-snmp;a=blob;f=local/snmp-bridge-mib;hb=171e8d48d4af04013cff8fd28f5341a2aef21d88&quot; title=&quot;An implementation of BRIDGE-MIB as a Perl AgentX subagent&quot;&gt;implementation of &lt;span class=&quot;caps&quot;&gt;BRIDGE&lt;/span&gt;-&lt;abbr title=&quot;Management Information Base&quot;&gt;&lt;abbr title=&quot;Management Information Base&quot;&gt;&lt;span class=&quot;caps&quot;&gt;MIB&lt;/span&gt;&lt;/abbr&gt;&lt;/abbr&gt;&lt;/a&gt; shipped with Net-&lt;abbr title=&quot;Simple Network Management Protocol&quot;&gt;&lt;span class=&quot;caps&quot;&gt;SNMP&lt;/span&gt;&lt;/abbr&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There is no similar binding for Python but there is an
&lt;a href=&quot;https://sourceforge.net/projects/python-agentx/&quot; title=&quot;AgentX module for Python&quot;&gt;agentx extension&lt;/a&gt; using &lt;code&gt;ctypes&lt;/code&gt;. It provides a more
high-level view. I did not write an example for this one but you can
look at the &lt;a href=&quot;http://python-agentx.svn.sourceforge.net/viewvc/python-agentx/example.py?revision=8&amp;amp;view=markup&quot; title=&quot;Example of Python agentx module&quot;&gt;example provided by the author&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;c-with-new-api&quot;&gt;C with “new” &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;To write a sub-agent in C, you have to choose between two &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;the &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; inherited from &lt;span class=&quot;caps&quot;&gt;UCD&lt;/span&gt;-&lt;abbr title=&quot;Simple Network Management Protocol&quot;&gt;&lt;span class=&quot;caps&quot;&gt;SNMP&lt;/span&gt;&lt;/abbr&gt; also known as the “traditional” &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;;&lt;/li&gt;
&lt;li&gt;the new &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; developed for Net-&lt;abbr title=&quot;Simple Network Management Protocol&quot;&gt;&lt;span class=&quot;caps&quot;&gt;SNMP&lt;/span&gt;&lt;/abbr&gt; 5.x.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;With both &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;, an handler is registered to take care of one or several
sub-trees. With the traditional &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;, the handler is invoked with very
little information. It is then up to you to locate the appropriate
variable by mapping the index part of the &lt;abbr title=&quot;Object IDentifier&quot;&gt;&lt;span class=&quot;caps&quot;&gt;OID&lt;/span&gt;&lt;/abbr&gt; to the objects you want
to export. It is quite simple for scalar objects but columnar objects
with complex indexes are a pain with such an &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;The new &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; provides various helpers. Some of them allow you to copy
objects into an array or a list and let Net-&lt;abbr title=&quot;Simple Network Management Protocol&quot;&gt;&lt;span class=&quot;caps&quot;&gt;SNMP&lt;/span&gt;&lt;/abbr&gt; library do the hard
work of serving them. Another helper will provide methods to serve
objects without putting them in a special structure but by providing
an iterator. Some of those helpers can also help you to cache some variables.&lt;/p&gt;
&lt;p&gt;On top of this new &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;, Net-&lt;abbr title=&quot;Simple Network Management Protocol&quot;&gt;&lt;span class=&quot;caps&quot;&gt;SNMP&lt;/span&gt;&lt;/abbr&gt; comes with &lt;code&gt;mib2c&lt;/code&gt;, a tool that will
help you convert a &lt;abbr title=&quot;Management Information Base&quot;&gt;&lt;span class=&quot;caps&quot;&gt;MIB&lt;/span&gt;&lt;/abbr&gt; module into C code: after a few questions, you
will get a skeleton C code you will have to complete with the logic to
retrieve real objects. A generated file also provides directions on
what to do (with some magic command to have a step-by-step cookbook).&lt;/p&gt;
&lt;p&gt;I was able to implement &lt;code&gt;ETHTOOL-MIB&lt;/code&gt; by just running it through
&lt;code&gt;mib2c&lt;/code&gt;, choosing the table container helper with cache and adding
some code in &lt;code&gt;ethtoolStatTable_data_access.c&lt;/code&gt;. You can look at the
&lt;a href=&quot;https://github.com/vincentbernat/extend-netsnmp/blob/master/agentx-c-mib2c/&quot; title=&quot;Implementation of ETHTOOL-MIB with mib2c&quot;&gt;result on Github&lt;/a&gt;. Here is a stripped-down
version&lt;sup id=&quot;fnref:strip&quot;&gt;&lt;a href=&quot;http://vincent.bernat.im/en/blog/atom.xml#fn:strip&quot; rel=&quot;footnote&quot;&gt;2&lt;/a&gt;&lt;/sup&gt; of what has been modified:&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span class=&quot;cm&quot;&gt;/* Socket for ioctl */&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;skfd&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;socket&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;AF_INET&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SOCK_DGRAM&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;cm&quot;&gt;/* Iterate through all interfaces */&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;getifaddrs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ifap&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ifa&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ifap&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ifa&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;&lt;span class=&quot;caps&quot;&gt;NULL&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ifa&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ifa&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ifa_next&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;cm&quot;&gt;/* Grab statistics name and values */&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;strcpy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ifr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ifr_name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ifa&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ifa_name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;drvinfo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cmd&lt;/span&gt;         &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ETHTOOL_GDRVINFO&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;ifr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ifr_data&lt;/span&gt;        &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;caddr_t&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;drvinfo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;ioctl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;skfd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;&lt;span class=&quot;caps&quot;&gt;SIOCETHTOOL&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ifr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;n_stats&lt;/span&gt;             &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;drvinfo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;n_stats&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;strings&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cmd&lt;/span&gt;        &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ETHTOOL_GSTRINGS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;strings&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;string_set&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ETH_SS_STATS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;strings&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;len&lt;/span&gt;        &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n_stats&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;ifr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ifr_data&lt;/span&gt;        &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;caddr_t&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;strings&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;ioctl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;skfd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;&lt;span class=&quot;caps&quot;&gt;SIOCETHTOOL&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ifr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;stats&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cmd&lt;/span&gt;          &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ETHTOOL_GSTATS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;stats&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;n_stats&lt;/span&gt;      &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n_stats&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;ifr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ifr_data&lt;/span&gt;        &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;caddr_t&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;stats&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;ioctl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;skfd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;&lt;span class=&quot;caps&quot;&gt;SIOCETHTOOL&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ifr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;ifIndex&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;if_nametoindex&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ifa&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ifa_name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

    &lt;span class=&quot;cm&quot;&gt;/* Iterate through statistics */&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;n_stats&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;

        &lt;span class=&quot;cm&quot;&gt;/* Declare the appropriate index */&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;strncpy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ethtoolStatName&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;char&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;strings&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ETH_GSTRING_LEN&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;ETH_GSTRING_LEN&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;ethtoolStatName&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;sizeof&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ethtoolStatName&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;sc&quot;&gt;&#39;\0&#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;ethtoolStatName_len&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;strlen&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ethtoolStatName&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

        &lt;span class=&quot;cm&quot;&gt;/* Append this new variable to the container. */&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;rowreq_ctx&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ethtoolStatTable_allocate_rowreq_ctx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;ethtoolStatTable_indexes_set&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rowreq_ctx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;ifIndex&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;ethtoolStatName&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ethtoolStatName_len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;rowreq_ctx&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ethtoolStat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;high&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;stats&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;32&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;rowreq_ctx&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ethtoolStat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;low&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;uint32_t&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;stats&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;

        &lt;span class=&quot;n&quot;&gt;CONTAINER_INSERT&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;container&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;rowreq_ctx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;See? It is pretty easy. I have only enumerated all the objects I
wanted to expose. I didn’t even have to convert statistics names to an
&lt;abbr title=&quot;Object IDentifier&quot;&gt;&lt;span class=&quot;caps&quot;&gt;OID&lt;/span&gt;&lt;/abbr&gt;, &lt;code&gt;mib2c&lt;/code&gt; built a &lt;code&gt;ethtoolStatTable_indexes_set()&lt;/code&gt; for this
purpose. OpenHPI project provides an
&lt;a href=&quot;http://openhpi.sourceforge.net/subagent-manual/&quot; title=&quot;Net-SNMP subagent development manual&quot;&gt;extensive documentation to write a sub-agent&lt;/a&gt; this way.&lt;/p&gt;
&lt;p&gt;Now, on the downside, to implement a &lt;strong&gt;single table&lt;/strong&gt;, I have &lt;strong&gt;14
generated files&lt;/strong&gt; whose code style is usually unfit to integrate
into an existing project : some people, me included, do not like
automatically generated code, all the more when it is so verbose. The
solution would be to use the new &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; without &lt;code&gt;mib2c&lt;/code&gt;; unfortunately,
while the &lt;a href=&quot;http://www.net-snmp.org/dev/agent/group__handler.html&quot; title=&quot;Documentation of Net-SNMP 5.x API&quot;&gt;documentation exists&lt;/a&gt;, all provided examples
rely exclusively on &lt;code&gt;mib2c&lt;/code&gt; tool. Unless you are able to grasp the new
&lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; without it, I would restrict its use to two cases:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Writing a new module for inclusion into Net-&lt;abbr title=&quot;Simple Network Management Protocol&quot;&gt;&lt;span class=&quot;caps&quot;&gt;SNMP&lt;/span&gt;&lt;/abbr&gt;. Since most
   modules are now written with the help of &lt;code&gt;mib2c&lt;/code&gt;, there is no
   coding style problem.&lt;/li&gt;
&lt;li&gt;Writing a standalone sub-agent for some &lt;abbr title=&quot;Management Information Base&quot;&gt;&lt;span class=&quot;caps&quot;&gt;MIB&lt;/span&gt;&lt;/abbr&gt;. As a standalone
   project, you won’t run into coding style problems either.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For other uses, let’s have a look at the traditional &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;.&lt;/p&gt;
&lt;h3 id=&quot;c-with-traditional-api&quot;&gt;C with “traditional” &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;The traditional &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; is way simpler and even if it is quite old, it is
easier to find associated examples. Here is how to initialize the
agent, again, in a stripped-down version (the
&lt;a href=&quot;https://github.com/vincentbernat/ethtool-snmpd&quot; title=&quot;Implementation of ETHTOOL-MIB with UCD-SNMP API&quot;&gt;complete version is on GitHub&lt;/a&gt;):&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;oid&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ethtool_oid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;39178&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;variable3&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ethtool_vars&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ASN_COUNTER64&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;&lt;span class=&quot;caps&quot;&gt;RONLY&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ethtool_stat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;

&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;netsnmp_enable_subagent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;snmp_disable_log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;snmp_enable_stderrlog&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;init_agent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;ethtoolAgent&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;REGISTER_MIB&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;ethtoolStatTable&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ethtool_vars&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
               &lt;span class=&quot;n&quot;&gt;variable3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ethtool_oid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;init_snmp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;ethtoolAgent&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;agent_check_and_process&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The &lt;code&gt;REGISTER_MIB()&lt;/code&gt; macro is used to register the provided root &lt;abbr title=&quot;Object IDentifier&quot;&gt;&lt;span class=&quot;caps&quot;&gt;OID&lt;/span&gt;&lt;/abbr&gt;
(&lt;code&gt;ethtool_oid&lt;/code&gt;) to the master agent. It also registers handlers
associated to various sub-&lt;abbr title=&quot;Object IDentifier&quot;&gt;&lt;span class=&quot;caps&quot;&gt;OID&lt;/span&gt;&lt;/abbr&gt; through the &lt;code&gt;ethtool_vars[]&lt;/code&gt; array. Each
member of this array features the following fields:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;magic&lt;/code&gt; is an integer allowing one to discriminate &lt;abbr title=&quot;Object IDentifier&quot;&gt;&lt;span class=&quot;caps&quot;&gt;OID&lt;/span&gt;&lt;/abbr&gt; handled by
   the same handler. For a table, this allows to handle several
   columns with the same handler since they share a common index.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;type&lt;/code&gt; is the type of the variable that will be returned.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;acl&lt;/code&gt; tells if the object is read-only (&lt;code&gt;RONLY&lt;/code&gt;) or read-write
   (&lt;code&gt;RWRITE&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;findVar&lt;/code&gt; is the handler associated to the object. Its task will be
   to find the appropriate object and return its value.&lt;/li&gt;
&lt;li&gt;The two last fields are the relative &lt;abbr title=&quot;Object IDentifier&quot;&gt;&lt;span class=&quot;caps&quot;&gt;OID&lt;/span&gt;&lt;/abbr&gt; this entry is responsible
   for along with its length.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The prototype of &lt;code&gt;ethtool_stat()&lt;/code&gt; handler function is the following:&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;u_char&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;ethtool_stat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;variable&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;vp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;oid&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;size_t&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;length&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
             &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;exact&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;size_t&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;var_len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;WriteMethod&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;write_method&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;This function should return the value of the requested variable or
&lt;code&gt;NULL&lt;/code&gt; if no appropriate object was found. The value can be statically
stored since it will be copied. Here is the description of the arguments:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;struct variable *vp&lt;/code&gt; is the structure the handle was associated
   with, except that &lt;code&gt;vp-&amp;gt;name&lt;/code&gt; is now a full &lt;abbr title=&quot;Object IDentifier&quot;&gt;&lt;span class=&quot;caps&quot;&gt;OID&lt;/span&gt;&lt;/abbr&gt;, not a relative
   one. You can access &lt;code&gt;vp-&amp;gt;magic&lt;/code&gt; to determine which column or which
   scalar to handle if this handler is common to several objects.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;oid *name&lt;/code&gt; and &lt;code&gt;size_t *length&lt;/code&gt; describe the &lt;abbr title=&quot;Object IDentifier&quot;&gt;&lt;span class=&quot;caps&quot;&gt;OID&lt;/span&gt;&lt;/abbr&gt; requested. If you
   want to return another &lt;abbr title=&quot;Object IDentifier&quot;&gt;&lt;span class=&quot;caps&quot;&gt;OID&lt;/span&gt;&lt;/abbr&gt; (for a &lt;em&gt;&lt;span class=&quot;caps&quot;&gt;GETNEXT&lt;/span&gt;&lt;/em&gt; request for example), you
   can modify them. &lt;code&gt;name&lt;/code&gt; points to an &lt;abbr title=&quot;Object IDentifier&quot;&gt;&lt;span class=&quot;caps&quot;&gt;OID&lt;/span&gt;&lt;/abbr&gt; array large enough to fit
   any &lt;abbr title=&quot;Object IDentifier&quot;&gt;&lt;span class=&quot;caps&quot;&gt;OID&lt;/span&gt;&lt;/abbr&gt; you want to return.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;int exact&lt;/code&gt; tells if the requested &lt;abbr title=&quot;Object IDentifier&quot;&gt;&lt;span class=&quot;caps&quot;&gt;OID&lt;/span&gt;&lt;/abbr&gt; should be exactly matched
   (case of &lt;em&gt;&lt;span class=&quot;caps&quot;&gt;GET&lt;/span&gt;&lt;/em&gt; or &lt;em&gt;&lt;span class=&quot;caps&quot;&gt;SET&lt;/span&gt;&lt;/em&gt;) or not (&lt;em&gt;&lt;span class=&quot;caps&quot;&gt;GETNEXT&lt;/span&gt;&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;size_t *var_len&lt;/code&gt; is used to tell the size of the returned object.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;WriteMethod **write_method&lt;/code&gt; is only used if the variable is
   modifiable. When a &lt;em&gt;&lt;span class=&quot;caps&quot;&gt;SET&lt;/span&gt;&lt;/em&gt; request is received, the &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; will call the
   handler with &lt;code&gt;exact&lt;/code&gt; set to 1 and expects to get a pointer to the
   function that will handle the write operation&lt;sup id=&quot;fnref:write&quot;&gt;&lt;a href=&quot;http://vincent.bernat.im/en/blog/atom.xml#fn:write&quot; rel=&quot;footnote&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To implement this function, you are on your own. When relying on
externally fetched data, you need to handle a cache yourself. I have
used a red-black tree for this purpose (with code stolen from
OpenBSD). This also enables an easy implementation of the &lt;em&gt;&lt;span class=&quot;caps&quot;&gt;GETNEXT&lt;/span&gt;&lt;/em&gt; operation.&lt;/p&gt;
&lt;p&gt;Here are three projects using this &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; to provide &lt;abbr title=&quot;Simple Network Management Protocol&quot;&gt;&lt;span class=&quot;caps&quot;&gt;SNMP&lt;/span&gt;&lt;/abbr&gt; support:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.keepalived.org/&quot; title=&quot;Keepalived: healthchecking for LVS and high-availability&quot;&gt;Keepalived&lt;/a&gt; is a &lt;span class=&quot;caps&quot;&gt;VRRP&lt;/span&gt; daemon and a monitoring daemon
   for &lt;span class=&quot;caps&quot;&gt;LVS&lt;/span&gt; clusters. I have
   &lt;a href=&quot;http://vincent.bernat.im/en/blog/2011-keepalived-snmp-ipv6.html&quot; title=&quot;SNMP support for Keepalived&quot;&gt;added a complete &lt;abbr title=&quot;Simple Network Management Protocol&quot;&gt;&lt;abbr title=&quot;Simple Network Management Protocol&quot;&gt;&lt;span class=&quot;caps&quot;&gt;SNMP&lt;/span&gt;&lt;/abbr&gt;&lt;/abbr&gt; support&lt;/a&gt;. The most
   interesting files are &lt;a href=&quot;https://github.com/vincentbernat/keepalived/blob/snmp-1.2.0/keepalived/core/snmp.c&quot; title=&quot;SNMP support for Keepalived: core/snmp.c&quot;&gt;core/snmp.c&lt;/a&gt;,
   &lt;a href=&quot;https://github.com/vincentbernat/keepalived/blob/snmp-1.2.0/keepalived/check/check_snmp.c&quot; title=&quot;SNMP support for Keepalived: check/check_snmp.c&quot;&gt;check/check_snmp.c&lt;/a&gt; and
   &lt;a href=&quot;https://github.com/vincentbernat/keepalived/blob/snmp-1.2.0/keepalived/vrrp/vrrp_snmp.c&quot; title=&quot;SNMP support for Keepalived: vrrp/vrrp_snmp.c&quot;&gt;vrrp/vrrp_snmp.c&lt;/a&gt;. It features a tight
   integration into Keepalived event loop that should be reusable by
   other projects. It includes read-only support of all data
   structures (configuration, state and statistics), ability to send
   traps on events and a write support for some values.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vincentbernat/lldpd/wiki&quot; title=&quot;lldpd, implementation of IEEE 802.1ab (LLDP)&quot;&gt;lldpd&lt;/a&gt; is an implementation of 802.&lt;span class=&quot;caps&quot;&gt;1AB&lt;/span&gt; (&lt;span class=&quot;caps&quot;&gt;LLDP&lt;/span&gt;) which is a
   protocol allowing an equipment to advertise itself to its neighbors
   on Ethernet level. 802.&lt;span class=&quot;caps&quot;&gt;1AB&lt;/span&gt; comes with a huge &lt;abbr title=&quot;Management Information Base&quot;&gt;&lt;span class=&quot;caps&quot;&gt;MIB&lt;/span&gt;&lt;/abbr&gt; module and many
   extensions. &lt;em&gt;lldpd&lt;/em&gt; provides a fairly complete read-only
   implementation of this &lt;abbr title=&quot;Management Information Base&quot;&gt;&lt;span class=&quot;caps&quot;&gt;MIB&lt;/span&gt;&lt;/abbr&gt; module. Some tables have complex
   indexes. Have a look at &lt;a href=&quot;https://github.com/vincentbernat/lldpd/blob/master/src/agent.c&quot; title=&quot;lldpd, SNMP support: agent.c&quot;&gt;agent.c&lt;/a&gt;. There is currently
   no write support and no traps but &lt;em&gt;lldpd&lt;/em&gt; features privilege
   separation and some code allows it to still use an Unix socket to
   speak with the master agent.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.asterisk.org/&quot; title=&quot;Asterisk, Open Source Private Branch Exchange&quot;&gt;Asterisk&lt;/a&gt;, an open source &lt;abbr title=&quot;Private Branch Exchange&quot;&gt;&lt;span class=&quot;caps&quot;&gt;PBX&lt;/span&gt;&lt;/abbr&gt;, includes an AgentX
   sub-agent allowing one to grab some metrics. Look at
   &lt;a href=&quot;http://svnview.digium.com/svn/asterisk/trunk/res/snmp/agent.c?revision=352957&amp;amp;view=markup&quot; title=&quot;SNMP support for Asterisk, agent.c&quot;&gt;res/snmp/agent.c&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;other-solutions&quot;&gt;Other solutions&lt;/h2&gt;
&lt;p&gt;The manual page for &lt;a href=&quot;http://linux.die.net/man/5/snmpd.conf&quot; title=&quot;Manual page of snmpd.conf&quot;&gt;snmpd.conf&lt;/a&gt; explores other ways to
extend Net-&lt;abbr title=&quot;Simple Network Management Protocol&quot;&gt;&lt;span class=&quot;caps&quot;&gt;SNMP&lt;/span&gt;&lt;/abbr&gt; agent under the section “&lt;em&gt;Extending agent
functionality&lt;/em&gt;“:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;exec&lt;/code&gt; and &lt;code&gt;sh&lt;/code&gt; are deprecated. Use &lt;code&gt;extend&lt;/code&gt; instead.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pass&lt;/code&gt; is a bit simpler than &lt;code&gt;pass_persist&lt;/code&gt;. The command is run
   once for each request. Such a command can easily be turned into a
   &lt;code&gt;pass_persist&lt;/code&gt; script. Moreover, Net-&lt;abbr title=&quot;Simple Network Management Protocol&quot;&gt;&lt;span class=&quot;caps&quot;&gt;SNMP&lt;/span&gt;&lt;/abbr&gt; will not answer any
   request while a &lt;code&gt;pass&lt;/code&gt; command is running.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;proxy&lt;/code&gt; redirects requests to another &lt;abbr title=&quot;Simple Network Management Protocol&quot;&gt;&lt;span class=&quot;caps&quot;&gt;SNMP&lt;/span&gt;&lt;/abbr&gt; agent. Unless you have
   some code that can only act as a complete &lt;abbr title=&quot;Simple Network Management Protocol&quot;&gt;&lt;span class=&quot;caps&quot;&gt;SNMP&lt;/span&gt;&lt;/abbr&gt; agent, it is better
   to use AgentX instead. For programs using Net-&lt;abbr title=&quot;Simple Network Management Protocol&quot;&gt;&lt;span class=&quot;caps&quot;&gt;SNMP&lt;/span&gt;&lt;/abbr&gt; &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;, turning an
   agent into an AgentX sub-agent is just one line of code. Since a
   sub-agent involves less code than a complete agent, it is more
   efficient and more reliable.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;smux&lt;/code&gt; has been superseeded by AgentX.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;perl&lt;/code&gt; and &lt;code&gt;dlmod&lt;/code&gt; allow one to load and execute external code
   inside the running agent. Unless you have important performance
   requirements, it is better to use a sub-agent instead: if some bug
   happens, only the sub-agent will be affected, not the master
   agent. A sub-agent sticks more closely to the Unix philosophy:
   “write programs that do one thing and do it well”. However,
   &lt;a href=&quot;http://www.net-snmp.org/docs/FAQ.html#What_is_the_purpose_of__dlmod__&quot; title=&quot;Net-SNMP FAQ about dlmod&quot;&gt;Net-&lt;abbr title=&quot;Simple Network Management Protocol&quot;&gt;&lt;abbr title=&quot;Simple Network Management Protocol&quot;&gt;&lt;span class=&quot;caps&quot;&gt;SNMP&lt;/span&gt;&lt;/abbr&gt;&lt;/abbr&gt; &lt;span class=&quot;caps&quot;&gt;FAQ&lt;/span&gt;&lt;/a&gt; says:&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Implementing the module in C within the main agent (directly or via
&lt;code&gt;dlmod&lt;/code&gt;) is probably the most efficient and reliable, closely followed
by embedded perl (or python) extensions.  These have the advantage
of minimal overheads between the code implementing the &lt;abbr title=&quot;Management Information Base&quot;&gt;&lt;span class=&quot;caps&quot;&gt;MIB&lt;/span&gt;&lt;/abbr&gt; module,
and the agent framework, and no inter-process communication issues.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;footnote&quot;&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id=&quot;fn:snmpconf&quot;&gt;
&lt;p&gt;Additional arguments for &lt;code&gt;snmp*&lt;/code&gt; are usually required to
         specify a version and a community (for SNMPv1 and
         SNMPv2c) or a user (for SNMPv3). In all examples, I do
         not specify anything. I assume that &lt;code&gt;~/.snmp/snmp.conf&lt;/code&gt;
         contains the appropriate bits. Moreover, some outputs are
         truncated. &lt;a href=&quot;http://vincent.bernat.im/en/blog/atom.xml#fnref:snmpconf&quot; rev=&quot;footnote&quot; title=&quot;Jump back to footnote 1 in the text&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn:strip&quot;&gt;
&lt;p&gt;No allocations, no variable declarations and no error
      checkings. Do not do this at home! &lt;a href=&quot;http://vincent.bernat.im/en/blog/atom.xml#fnref:strip&quot; rev=&quot;footnote&quot; title=&quot;Jump back to footnote 2 in the text&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn:write&quot;&gt;
&lt;p&gt;If you want to look at an example of how to handle a &lt;em&gt;&lt;span class=&quot;caps&quot;&gt;SET&lt;/span&gt;&lt;/em&gt;
      request, look at the
    &lt;br /&gt;
&lt;a href=&quot;https://github.com/vincentbernat/keepalived/blob/snmp-1.2.0/keepalived/vrrp/vrrp_snmp.c&quot; title=&quot;SNMP support for Keepalived: vrrp/vrrp_snmp.c&quot;&gt;&lt;abbr title=&quot;Simple Network Management Protocol&quot;&gt;&lt;abbr title=&quot;Simple Network Management Protocol&quot;&gt;&lt;abbr title=&quot;Simple Network Management Protocol&quot;&gt;&lt;span class=&quot;caps&quot;&gt;SNMP&lt;/span&gt;&lt;/abbr&gt;&lt;/abbr&gt;&lt;/abbr&gt; support for Keepalived&lt;/a&gt;. A &lt;em&gt;&lt;span class=&quot;caps&quot;&gt;SET&lt;/span&gt;&lt;/em&gt;
      operation is more complex because &lt;abbr title=&quot;Simple Network Management Protocol&quot;&gt;&lt;abbr title=&quot;Simple Network Management Protocol&quot;&gt;&lt;abbr title=&quot;Simple Network Management Protocol&quot;&gt;&lt;span class=&quot;caps&quot;&gt;SNMP&lt;/span&gt;&lt;/abbr&gt;&lt;/abbr&gt;&lt;/abbr&gt; ensures that the
    &lt;br /&gt;
&lt;em&gt;&lt;span class=&quot;caps&quot;&gt;SET&lt;/span&gt;&lt;/em&gt; operation is atomic across all provided variables. It
      uses a three-staged commit. The traditional &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; is very
      inefficient for this kind of operation because the object
      has to be located again for each step. &lt;a href=&quot;http://vincent.bernat.im/en/blog/atom.xml#fnref:write&quot; rev=&quot;footnote&quot; title=&quot;Jump back to footnote 3 in the text&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</content>
	<author>
	  <name>Vincent Bernat</name>
	   <uri>http://vincent.bernat.im/en</uri> 
	</author>
	<source>
	  <title type="html">Disruptive Ninja | Vincent Bernat</title>
	  
	  <link rel="self" href="http://vincent.bernat.im/en/blog/atom.xml"/>
	  <id>http://www.luffy.cx/en/blog/atom.xml/</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en-us">ColorHug with non English locales</title>
	<link href="http://blog.cihar.com/archives/2012/02/09/colorhug-non-english-locales/?utm_source=rss2"/>
	<id>http://blog.cihar.com/archives/2012/02/09/colorhug-non-english-locales/?utm_source=rss2</id>
	<updated>2012-02-09T11:00:00+00:00</updated>
	<summary type="html" xml:lang="en-us"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;Since &lt;a href=&quot;http://www.hughsie.com/faq.html#erase-factory-cal&quot;&gt;infamous erasing of factory calibration&lt;/a&gt; in my ColorHug device and restoring calibration matrix, I noticed it did screen calibration wrong. However I did not find time to properly investigate the issue. Yesterdays &lt;a href=&quot;http://groups.google.com/group/colorhug-users/browse_thread/thread/451fffa85a3f9a0e&quot;&gt;mail from Richard&lt;/a&gt; was actually trigger for me so I&#39;ve opened up this topic.&lt;/p&gt;
&lt;p&gt;In the end it turned out to be caused by &lt;a href=&quot;http://www.littlecms.com/&quot;&gt;Little CMS&lt;/a&gt; wrongly parsing CCMX in case you are using locales which use something else than . as decimal point.&lt;/p&gt;
&lt;p&gt;After lot of googling, I&#39;ve realized there is probably no good way of parsing floats independent on current locales, so I used one of hacks I found and I think it&#39;s less intrusive - get current decimal point by printing float string using printf and then convert the string to it. I know it looks ugly, but including own implementation of strtod is also not nice and playing with locales is definitely something not thread safe to do within widely used library.&lt;/p&gt;
&lt;p&gt;Anyway I&#39;ve asked upstream to &lt;a href=&quot;https://github.com/mm2/Little-CMS/pull/3&quot;&gt;merge my patches&lt;/a&gt;, so let&#39;s see what they think of it.&lt;/p&gt;

&lt;p style=&quot;font-size: smaller;&quot;&gt;
Filed under: 


&lt;a href=&quot;http://blog.cihar.com/archives/debian/&quot;&gt;Debian&lt;/a&gt;

&lt;a href=&quot;http://blog.cihar.com/archives/english/&quot;&gt;English&lt;/a&gt;

&lt;a href=&quot;http://blog.cihar.com/archives/linux/&quot;&gt;Linux&lt;/a&gt;

&lt;a href=&quot;http://blog.cihar.com/archives/photography/&quot;&gt;Photography&lt;/a&gt;

&lt;a href=&quot;http://blog.cihar.com/archives/suse/&quot;&gt;Suse&lt;/a&gt;

|

&lt;a href=&quot;http://blog.cihar.com/archives/2012/02/09/colorhug-non-english-locales/#comments&quot;&gt;8 comments&lt;/a&gt;
|
&lt;a href=&quot;http://flattr.com/thing/59773/Michal-Cihars-Weblog&quot;&gt;Flattr this!&lt;/a&gt;
&lt;/p&gt;</content>
	<author>
	  <name>Michal Čihař</name>
	   <email>michal@cihar.com</email> 
	</author>
	<source>
	  <title type="html">Michal Čihař's Weblog, posts tagged by English</title>
	  <subtitle type="html">Random thoughts about everything tagged by English</subtitle>
	  <link rel="self" href="http://blog.cihar.com/archives/english/index-rss.xml"/>
	  <id>http://blog.cihar.com/archives/english/</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">Can aptitude show older versions of packages if available in /var/cache/apt/archives?</title>
	<link href="http://blog.venthur.de/index.php/2012/02/can-aptitude-show-older-versions-of-packages-if-available-in-varcacheaptarchives/"/>
	<id>http://blog.venthur.de/?p=220</id>
	<updated>2012-02-09T10:10:24+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;Dear Lazyweb,&lt;/p&gt;
&lt;p&gt;is it possible to tell aptitude to show older versions of a package next to the currently available one if it is still present in &lt;code&gt;/var/cache/apt/archives&lt;/code&gt;? Like it does when you use unstable and experimental side by side? I know that aptitude does not really support downgrades of packages,  but showing those packages directly in aptitude if available in the cache is a lot easier than searching them in the file system and installing them manually, especially if you don’t know where they hide.&lt;/p&gt;</content>
	<author>
	  <name>Bastian</name>
	   <uri>http://blog.venthur.de</uri> 
	</author>
	<source>
	  <title type="html">still don't have a title</title>
	  <subtitle type="html">and no tagline either</subtitle>
	  <link rel="self" href="http://blog.venthur.de/index.php/feed/"/>
	  <id>http://blog.venthur.de</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">SPI Feb 2012</title>
	<link href="http://www.news.software.coop/spi-feb-2012/1236/"/>
	<id>http://www.news.software.coop/spi-feb-2012/1236/</id>
	<updated>2012-02-09T01:47:32+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;&lt;a href=&quot;http://www.spi-inc.org/&quot;&gt;Software in the Public Interest&lt;/a&gt;, the mass-membership association that supports some great Free and Open Source Software projects, will hold a public board of directors meeting today, Thursday 9th February 2012 at 21:00 UTC. The day and time of SPI meetings has changed recently, so maybe different people can get to them now.&lt;/p&gt;
&lt;p&gt;They’re held online, on irc.spi-inc.org (&lt;a href=&quot;http://www.oftc.net/&quot;&gt;the OFTC network&lt;/a&gt;). The agenda for the meeting is open and available at &lt;a href=&quot;http://www.spi-inc.org/meetings/agendas/2012/2012-02-09/&quot;&gt;http://www.spi-inc.org/meetings/agendas/2012/2012-02-09/&lt;/a&gt; and there’s been a bit of &lt;a href=&quot;http://comments.gmane.org/gmane.org.spi.general/1134&quot;&gt;discussion of back office support&lt;/a&gt; on the SPI email list.&lt;/p&gt;
&lt;p&gt;I’ll link to a meeting summary from the comments in this blog post after it happens.&lt;/p&gt;</content>
	<author>
	  <name>mjr</name>
	   <uri>http://www.news.software.coop</uri> 
	</author>
	<source>
	  <title type="html">Software Cooperative News » mjr</title>
	  <subtitle type="html">What software.coop is doing and contemplating</subtitle>
	  <link rel="self" href="http://mjr.towers.org.uk/blog/all.rss"/>
	  <id>http://www.news.software.coop</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">[life/americania] On making parking easier</title>
	<link href="http://blog.andrew.net.au/2012/02/08#fastrak_for_parking"/>
	<id>http://blog.andrew.net.au/2012/02/08#fastrak_for_parking</id>
	<updated>2012-02-08T22:21:00+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;
Paul Wayper writes about the &lt;a href=&quot;http://www.mabula.net/tbfw/blosxom.cgi/2012/02/08#2012-02-05-making-parking-easy&quot;&gt;merits
of using toll transponders to pay for parking&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
I can report that I&#39;m able to use my &lt;a href=&quot;http://www.bayareafastrak.org/&quot;&gt;FasTrak&lt;/a&gt; tag to &lt;a href=&quot;http://www.bayareafastrak.org/static/about/faq_sfo.shtml&quot;&gt;pay for
parking at San Francisco International Airport&lt;/a&gt;, and it does indeed rock.
&lt;/p&gt;
&lt;p&gt;
I&#39;m unaware of anywhere else accepting it as a form of payment though.
&lt;/p&gt;</content>
	<author>
	  <name>Andrew Pollock</name>
	   <uri>http://blog.andrew.net.au</uri> 
	</author>
	<source>
	  <title type="html">Diary of a geek</title>
	  <subtitle type="html">Andrew Pollock&#39;s blog.</subtitle>
	  <link rel="self" href="http://blog.andrew.net.au/planetdebian/index.rss"/>
	  <id>http://blog.andrew.net.au</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">SELinux on Wheezy</title>
	<link href="http://wp.colliertech.org/cj/?p=1141"/>
	<id>http://wp.colliertech.org/cj/?p=1141</id>
	<updated>2012-02-08T17:35:01+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;So, Collier Technologies LLC needs to pass annual audits to operate a certification authority recognized by the SoS.  To this end, I’m working with the fine &lt;a href=&quot;http://www.nsa.gov/research/selinux/&quot;&gt;group&lt;/a&gt; of developers who maintain &lt;a href=&quot;http://selinuxproject.org/page/Main_Page&quot;&gt;SELinux&lt;/a&gt;.  It seems that the configuration of Xorg that I’m using while typing this here blog post does not have a policy set up for it in the Debian packages.  Or if it does, I don’t know enough about it to figure it out.&lt;/p&gt;
&lt;p&gt;I’ve been keeping logs and publishing them here:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.colliertech.org/federal/nsa/&quot;&gt;http://www.colliertech.org/federal/nsa/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I’ll update this post as progress is made.&lt;/p&gt;
&lt;p&gt;[edit 20120608T1042]&lt;/p&gt;
&lt;p&gt;It looks like loading all .pp files (except alsa) makes X run:&lt;/p&gt;
&lt;pre&gt;cjac@foxtrot:/usr/share/selinux/default$ time sudo \
semodule -i `ls *.pp | grep -v -e &#39;base.pp&#39; -e &#39;alsa.pp&#39;`

real	0m24.148s
user	0m23.249s
sys	0m0.628s
&lt;/pre&gt;
&lt;p&gt;I had to boot into single user mode and load the policies before switching to runlevel 2.  To get the kernel args added to the grub command line, I modified /etc/default/grub to include this line:&lt;/p&gt;
&lt;pre&gt;cjac@foxtrot:/usr/share/selinux/default$ grep -i selinux /etc/default/grub
GRUB_CMDLINE_LINUX=&quot; selinux=1 security=selinux&quot;
&lt;/pre&gt;
&lt;p&gt;Next steps:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a style=&quot;text-decoration: line-through;&quot; href=&quot;http://wp.colliertech.org/cj/?cat=17&amp;amp;feed=rss2#20120208T1346&quot;&gt;get the policies loaded at boot time&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;get &lt;a href=&quot;http://oss.tresys.com/projects/setools&quot;&gt;seinfo&lt;/a&gt; working&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;[edit 20120208T1305]&lt;/p&gt;
&lt;p&gt;It looks like the seinfo package has not been updated in the last 18 months.&lt;/p&gt;
&lt;pre&gt;cjac@foxtrot:/usr/src/git/debian/setools$ grep url .git/config
	url = git://git.debian.org/git/users/srivasta/debian/setools.git
cjac@foxtrot:/usr/src/git/debian/setools$ git log | head -4
commit 22a5d3e451d8a1e60a3c746466c865e63089a92a
Merge: fa238f0 149e283
Author: Manoj Srivastava &amp;lt;srivasta&amp;gt;
Date:   Tue Jul 20 23:10:06 2010 -0700
&lt;/pre&gt;
&lt;p&gt;&lt;a name=&quot;20120208T1346&quot;&gt;[edit 20120208T1346]&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Stephen tells me that the modules are persistent across re-boots.&lt;/p&gt;
&lt;pre&gt;&amp;gt; What&#39;s the best way to do this at boot?

You just do it once and it remains until/unless you remove it with
semodule -r.  No need to do it on each boot.  Normally it is done when
you install the policy package, but since your policy package apparently
didn&#39;t install all modules, I&#39;m suggesting that you do so manually.
&lt;/pre&gt;</content>
	<author>
	  <name>C.J. Adams-Collier</name>
	   <uri>http://wp.colliertech.org/cj</uri> 
	</author>
	<source>
	  <title type="html">The Pædantic Programmer » debian</title>
	  <subtitle type="html">If you can&#39;t find the time to do it right the first time, where are you going to find the time to do it over?</subtitle>
	  <link rel="self" href="http://wp.colliertech.org/cj/?cat=17&amp;feed=rss2"/>
	  <id>http://wp.colliertech.org/cj</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">More DRBD Performance tests</title>
	<link href="http://etbe.coker.com.au/2012/02/08/more-drbd-performance-tests/"/>
	<id>http://etbe.coker.com.au/?p=3130</id>
	<updated>2012-02-08T13:24:03+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;I’ve previously written &lt;a href=&quot;http://etbe.coker.com.au/2011/12/17/drbd-notes/&quot;&gt;Some Notes on DRBD [1]&lt;/a&gt; and a post about &lt;a href=&quot;http://etbe.coker.com.au/2012/01/05/drbd-benchmarking/&quot;&gt;DRBD Benchmarking [2]&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Previously I had determined that replication protocol C gives the best performance for DRBD, that the batch-time parameters for Ext4 aren’t worth touching for a single IDE disk, that barrier=0 gives a massive performance boost, and that DRBD gives a significant performance hit even when the secondary is not connected. Below are the results of some more tests of delivering mail from my Postal benchmark to my LMTP server which uses the Dovecot delivery agent to write it to disk, the rates are in messages per minute where each message is an average of 70K in size. The ext4 filesystem is used for all tests and the filesystem features list is “&lt;b&gt;has_journal ext_attr resize_inode dir_index filetype extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize&lt;/b&gt;“.&lt;/p&gt;
&lt;table&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;p4-2.8&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Default Ext4&lt;/td&gt;
&lt;td&gt;1663&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;barrier=0&lt;/td&gt;
&lt;td&gt;2875&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DRBD no secondary al-extents=7&lt;/td&gt;
&lt;td&gt;645&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DRBD no secondary default&lt;/td&gt;
&lt;td&gt;2409&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DRBD no secondary al-extents=1024&lt;/td&gt;
&lt;td&gt;2513&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DRBD no secondary al-extents=3389&lt;/td&gt;
&lt;td&gt;2650&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DRBD connected&lt;/td&gt;
&lt;td&gt;1575&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DRBD connected al-extents=1024&lt;/td&gt;
&lt;td&gt;1560&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DRBD connected al-extents=1024 Gig-E&lt;/td&gt;
&lt;td&gt;1544&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The &lt;b&gt;al-extents&lt;/b&gt; option determines the size of the dirty areas that need to be resynced when a failed node rejoins the cluster. The default is 127 extents of 4M each for a block size of 508MB to be synchronised. The maximum is 3389 for a synchronisation block size of just over 13G. Even with fast disks and gigabit Ethernet it’s going to take a while to synchronise things if dirty zones are 13GB in size. In my tests using the maximum size of al-extents gives a 10% performance benefit in disconnected mode while a size of 1024 gives a 4% performance boost. Changing the al-extents size seems to make no significant difference for a connected DRBD device.&lt;/p&gt;
&lt;p&gt;All the tests on connected DRBD devices were done with 100baseT apart from the last one which was a separate Gigabit Ethernet cable connecting the two systems.&lt;/p&gt;
&lt;h3&gt;Conclusions&lt;/h3&gt;
&lt;p&gt;For the level of traffic that I’m using it seems that Gigabit Ethernet provides no performance benefit, the fact that it gave a slightly lower result is not relevant as the difference is within the margin of error.&lt;/p&gt;
&lt;p&gt;Increasing the &lt;b&gt;al-extents&lt;/b&gt; value helps with disconnected performance, a value of 1024 gives a 4% performance boost. I’m not sure that a value of 3389 is a good idea though.&lt;/p&gt;
&lt;p&gt;The ext4 barriers are disabled by DRBD so a disconnected DRBD device gives performance that is closer to a &lt;b&gt;barrier=0&lt;/b&gt; mount than a regular ext4 mount. With the significant performance difference between connected and disconnected modes it seems possible that for some usage scenarios it could be useful to disable the DRBD secondary at times of peak load – it depends on whether DRBD is used as a really current backup or a strict mirror.&lt;/p&gt;
&lt;h3&gt;Future Tests&lt;/h3&gt;
&lt;p&gt;I plan to do some tests of DRBD over Linux software RAID-1 and tests to compare RAID-1 with and without bitmap support. I also plan to do some tests with the BTRFS filesystem, I know it’s not ready for production but it would still be nice to know what the performance is like.&lt;/p&gt;
&lt;p&gt;But I won’t use the same systems, they don’t have enough CPU power. In my previous tests I established that a 1.5GHz P4 isn’t capable of driving the 20G IDE disk to it’s maximum capacity and I’m not sure that the 2.8GHz P4 is capable of running a RAID to it’s capacity. So I will use a dual-core 64bit system with a pair of SATA disks for future tests. The difference in performance between 20G IDE disks and 160G SATA disks should be a lot less than the performance difference between a 2.8GHz P4 and a dual-core 64bit CPU.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;[1]&lt;a href=&quot;http://etbe.coker.com.au/2011/12/17/drbd-notes/&quot;&gt; http://etbe.coker.com.au/2011/12/17/drbd-notes/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[2]&lt;a href=&quot;http://etbe.coker.com.au/2012/01/05/drbd-benchmarking/&quot;&gt; http://etbe.coker.com.au/2012/01/05/drbd-benchmarking/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Related posts:&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;http://etbe.coker.com.au/2012/01/05/drbd-benchmarking/&quot; rel=&quot;bookmark&quot; title=&quot;DRBD Benchmarking&quot;&gt;DRBD Benchmarking&lt;/a&gt; &lt;small&gt;I’ve got some performance problems with a mail server that’s...&lt;/small&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://etbe.coker.com.au/2011/12/17/drbd-notes/&quot; rel=&quot;bookmark&quot; title=&quot;Some Notes on DRBD&quot;&gt;Some Notes on DRBD&lt;/a&gt; &lt;small&gt;DRBD is a system for replicating a block device across...&lt;/small&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://etbe.coker.com.au/2006/09/25/ethernet-bonding/&quot; rel=&quot;bookmark&quot; title=&quot;Ethernet bonding&quot;&gt;Ethernet bonding&lt;/a&gt; &lt;small&gt;Bonding is one of the terms used to describe multiple...&lt;/small&gt;&lt;/li&gt;
&lt;/ol&gt;</content>
	<author>
	  <name>etbe</name>
	   <uri>http://etbe.coker.com.au</uri> 
	</author>
	<source>
	  <title type="html">etbe - Russell Coker</title>
	  <subtitle type="html">Linux, politics, and other interesting things</subtitle>
	  <link rel="self" href="http://etbe.coker.com.au/feed/"/>
	  <id>http://etbe.coker.com.au</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en-us">Migrating code to github</title>
	<link href="http://blog.cihar.com/archives/2012/02/08/migrating-code-github/?utm_source=rss2"/>
	<id>http://blog.cihar.com/archives/2012/02/08/migrating-code-github/?utm_source=rss2</id>
	<updated>2012-02-08T11:00:00+00:00</updated>
	<summary type="html" xml:lang="en-us"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;As you might have noticed from my previous posts, we&#39;ve moved  &lt;a href=&quot;http://www.phpmyadmin.net/&quot;&gt;phpMyAdmin&lt;/a&gt; code to &lt;a href=&quot;http://github.com/phpmyadmin/&quot;&gt;github&lt;/a&gt;. Now I&#39;m going to describe some things which might be useful for you if you are about do to similar switch.&lt;/p&gt;
&lt;p&gt;While using git, moving to another hosting provider should be pretty straightforward. Just add another remote, push code there and it should be done. On the other side you probably have dozens of things in your infrastructure which you need to adjust. So the first thing to do is write down what all services are connected to your current git repositories. Let me name some which might be worth checking:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;continuous integration server&lt;/li&gt;
&lt;li&gt;snapshots generating&lt;/li&gt;
&lt;li&gt;demo server (in case you&#39;re providing something like we do)&lt;/li&gt;
&lt;li&gt;commit notifications&lt;/li&gt;
&lt;li&gt;various statistics services such as cia.vc&lt;/li&gt;
&lt;li&gt;website generating&lt;/li&gt;
&lt;li&gt;references in wiki, website and documetation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once you think you have remembered all important things (the less important will probably show up anyway, but majority of things should work), you&#39;re ready to make the move.&lt;/p&gt;
&lt;p&gt;I&#39;ve decided to make the move in few steps. First push all data to new location, what can take some time. I&#39;ll get in more details to that later. In the same time I asked all contributors to give me their login information, so that I can allow them access to new repositories. Once all recently active developers were migrated, it was time to push all remaining commits to new git repositories and make the switch for real.&lt;/p&gt;
&lt;p&gt;Pushing git repo to another location, should be pretty easy. On the other side if you have many branches, it get&#39;s slightly more complex, I&#39;ve ended up with following shell snippet (pushing all branches present in origin to github remote):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git branch -r | grep origin/ | grep -v HEAD | sed &#39;s@.*/@@&#39; | while read b ; do git checkout $b ; git push github $b:$b ; done
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Please ensure that you check output of this, because you may hit network problems somewhere in the middle and you end up with few branches than you expect. As the code is pretty much idempotent, you can safely run it several times until there is nothing to push. You should also push all tags to new location:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git push --tags github
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Okay, we&#39;ve all data on right place, so let&#39;s switch all our users to new location:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git remote set-url origin git@github.com:phpmyadmin/phpmyadmin.git # read/write
git remote set-url origin git://github.com/phpmyadmin/phpmyadmin.git # read only
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Of course everybody has to do this manually.&lt;/p&gt;
&lt;p&gt;Next good thing is to let people know when they are using wrong repo (which will stay there for some time). Unfortunately there is AFAIK no way to warn them on pull, so let&#39;s warn at least on push:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ cat &amp;gt; hooks/update
#!/bin/sh
echo &quot;phpMyAdmin git repositories have moved to https://github.com/phpmyadmin&quot;
exit 1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I think this is pretty much all. You can find some more bits in our &lt;a href=&quot;http://wiki.phpmyadmin.net/pma/Git_migration&quot;&gt;Git migration wiki page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;PS: Thanks to github for offering us hosting and sorry for breaking their branch displaying page by too many divergent branches.&lt;/p&gt;

&lt;p style=&quot;font-size: smaller;&quot;&gt;
Filed under: 


&lt;a href=&quot;http://blog.cihar.com/archives/coding/&quot;&gt;Coding&lt;/a&gt;

&lt;a href=&quot;http://blog.cihar.com/archives/english/&quot;&gt;English&lt;/a&gt;

&lt;a href=&quot;http://blog.cihar.com/archives/phpmyadmin/&quot;&gt;Phpmyadmin&lt;/a&gt;

|

&lt;a href=&quot;http://blog.cihar.com/archives/2012/02/08/migrating-code-github/#comments&quot;&gt;4 comments&lt;/a&gt;
|
&lt;a href=&quot;http://flattr.com/thing/59773/Michal-Cihars-Weblog&quot;&gt;Flattr this!&lt;/a&gt;
&lt;/p&gt;</content>
	<author>
	  <name>Michal Čihař</name>
	   <email>michal@cihar.com</email> 
	</author>
	<source>
	  <title type="html">Michal Čihař's Weblog, posts tagged by English</title>
	  <subtitle type="html">Random thoughts about everything tagged by English</subtitle>
	  <link rel="self" href="http://blog.cihar.com/archives/english/index-rss.xml"/>
	  <id>http://blog.cihar.com/archives/english/</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">Dependency order matters !</title>
	<link href="http://mancoosi.org/~abate/dependency-order-matters"/>
	<id>http://mancoosi.org/395 at http://mancoosi.org/~abate</id>
	<updated>2012-02-08T10:34:36+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;Recently I&#39;ve discovered a subtle consequence of how the order in which dependencies are specified in debian actually matters. While re-factoring the code of dose3, I changed the order in which dependencies are considered by our sat solver (of edos-fame) . I witnessed a twofold performance loss just by randomizing how variables were presented to our sat solver. This highlights, on one hand, how our solver is strongly dependent on the structure of the problem and, on the other hand the standard practice of debian maintainers to assign an implicit priority in the disjunctive dependencies where the first is the most preferred packages (and maybe the most tested, at least dependency-wise).&lt;/p&gt;

&lt;p&gt;The basic idea of distcheck is to encode the dependencies information contained in a Packages file in CNF format and then to feed them to a sat solver to find out if a package has broken dependencies or if its dependencies are such that no matter what, it would be impossible to install this package on a user machine.&lt;/p&gt;

&lt;p&gt;Conflicts are encoded as binary clauses. So if package A conflicts with package B, I add a constraint they says &quot;not (A and B)&quot; , that is A and B cannot be considered together. The dependencies encoding associates to each disjunction of the depends field a clause that says &quot;A implies B&quot;. If a package foo depends on A,B | C,D , I&#39;ll add &quot;foo implies A and B&quot;  &amp;amp; &quot;foo implies C and D&quot; . This encoding is pretty standard and it is easy to understand.&lt;/p&gt;

&lt;p&gt;The problem is how the sat solver will search for a solution to the problem &quot;Is is possible to install package foo in an empty repository&quot;. The solver we use is very efficient and can easily deal with 100K packages or more. But in general is not very good at dealing with random CNF instances. The reason because edos-debcheck is so efficient lies in the way it exploits the structure of the sat problems.&lt;/p&gt;

&lt;p&gt;The goal of a sat solver is to find a model (that is a variable assignment list) that is compatible with the given set of constraints. So if my encoding of the debian repository is a set of constraints R, the installability problem boils down to add an additional constraint to R imposing that the variable associated to the package foo must be true, and then ask the solver to find a model to make this possible. This installation, in sat terms, would be just an array of variables that must be true in order to satisfy the given set of constraints.&lt;/p&gt;

&lt;p&gt;If you look at the logic problem as a truth table, the idea is to find a row in this table. This is the solution of your problem. Brute force of course is not an option and modern sat solvers use a number of strategies and heuristic to guide the search in the most intelligent way possible. Some of them try to learn from previous attempts, some of them, when they are lost try to pick a random variable to proceed.&lt;/p&gt;

&lt;p&gt;If we consider problems that have a lot of structure, award winning sat solver do not back track very much. By exploiting the structure of the problem, their algorithm allows them to considerably narrow down the search only to those variables that are really important to find a solution.&lt;/p&gt;

&lt;p&gt;All this long introduction was to talk about the solver that is currently used in edos-debcheck and distcheck (that is a rewrite of the edos-debcheck).&lt;/p&gt;

&lt;p&gt;So why dependency order matters ? If we consider any package, even if the policy does not specify any order in the dependencies, it&#39;s common practice to write disjunctive dependencies specifying the most probable and tested alternative first and all other, more esoteric choices later. Moreover real packages are considered *before* virtual packages. Since every developer seems be doing the same, some kind of structure might be hidden in the order in which dependencies are specified.&lt;/p&gt;

&lt;p&gt;Part of the efficiency of the the solver used in our tools is actually due to the fact that its search strategy is strongly dependent on the order in which literal are specified in each clause. Saying the package foo depends on A and B is &quot;different&quot; then saying it depends on B and A, even if semantically equivalent.&lt;/p&gt;

&lt;p&gt;In my tests, I found about a twofold performance loss if the order of literals is either randomized or inverted. This is clearly a specific problem related to our solvers, while other solvers might not be susceptible to such small structural changes. Sat competitions often employs some form of obfuscation strategies of well known problems with well known structures in order to make useless to encode a search strategy that exploits the specific structure of a problem.&lt;/p&gt;

&lt;p&gt;Since here we&#39;re not trying to win a sat competition, but to provide tool to solve a specific problem, we are of course very happy to exploit this structure.&lt;/p&gt;</content>
	<author>
	  <name>abate</name>
	   <uri>http://mancoosi.org/~abate/tags/debian/feed</uri> 
	</author>
	<source>
	  <title type="html">Pietro Abate homepage - debian</title>
	  
	  <link rel="self" href="http://mancoosi.org/~abate/taxonomy/term/8/0/feed"/>
	  <id>http://mancoosi.org/~abate/tags/debian/feed</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">Squeeze RCs&#39;s Squashing 2012 #2</title>
	<link href="http://rhonda.deb.at/blog/2012/02/08#squeeze-RCs-2012-2"/>
	<id>http://rhonda.deb.at/blog/2012/02/08#squeeze-RCs-2012-2</id>
	<updated>2012-02-08T09:18:00+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;This is the second entry in my series about squeeze release critical bug squashing. In response to my last blog post it was asked whether this is proper release critical bug squashing. Indeed there haven&#39;t been any patches or upload involved in this, only &lt;acronym title=&quot;Bug Tracking System&quot;&gt;BTS&lt;/acronym&gt; handling, but this doesn&#39;t mean that these bugs weren&#39;t considered to be affecting squeeze. You can see this effort currently as weeding out the &quot;wrong&quot; bugs so that the list gets more useful and actually be able to ask maintainers to address the real issues.&lt;/p&gt;

&lt;p&gt;You can at least see in &lt;a href=&quot;http://bugs.debian.org/release-critical/&quot;&gt;this graph&lt;/a&gt; that the blue line is going down constantly since the year change instead of rising up like before. And I hope I will be able to keep it below the green line for a while still. Also thanks to the release-team and ftpmasters that it was possible to keep the massbugs about waf binary blob not being preferred source for modification out of affecting squeeze and ignore it for the current stable release—the required changes for those would rather be a fair bit intrusive for a stable update.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://bugs.debian.org/637213&quot;&gt;637213&lt;/a&gt;: doesn&#39;t fail in squeeze&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://bugs.debian.org/648989&quot;&gt;648989&lt;/a&gt;: doesn&#39;t fail in squeeze&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://bugs.debian.org/584568&quot;&gt;584568&lt;/a&gt;: most stuff (BTS, PTS, ...) use maintainer information from unstable only&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://bugs.debian.org/624464&quot;&gt;624464&lt;/a&gt;: most stuff (BTS, PTS, ...) use maintainer information from unstable only&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://bugs.debian.org/632106&quot;&gt;632106&lt;/a&gt;: most stuff (BTS, PTS, ...) use maintainer information from unstable only&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://bugs.debian.org/632108&quot;&gt;632108&lt;/a&gt;: most stuff (BTS, PTS, ...) use maintainer information from unstable only&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://bugs.debian.org/632262&quot;&gt;632262&lt;/a&gt;: most stuff (BTS, PTS, ...) use maintainer information from unstable only&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://bugs.debian.org/632264&quot;&gt;632264&lt;/a&gt;: most stuff (BTS, PTS, ...) use maintainer information from unstable only&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://bugs.debian.org/632265&quot;&gt;632265&lt;/a&gt;: most stuff (BTS, PTS, ...) use maintainer information from unstable only&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://bugs.debian.org/632266&quot;&gt;632266&lt;/a&gt;: most stuff (BTS, PTS, ...) use maintainer information from unstable only&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://bugs.debian.org/595298&quot;&gt;595298&lt;/a&gt;: squeeze has linux 2.6.32&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://bugs.debian.org/613732&quot;&gt;613732&lt;/a&gt;: doesn&#39;t fail in squeeze&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://bugs.debian.org/616694&quot;&gt;616694&lt;/a&gt;: doesn&#39;t fail in squeeze&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://bugs.debian.org/620264&quot;&gt;620264&lt;/a&gt;: doesn&#39;t fail in squeeze&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://bugs.debian.org/620573&quot;&gt;620573&lt;/a&gt;: doesn&#39;t fail in squeeze&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://bugs.debian.org/621440&quot;&gt;621440&lt;/a&gt;: libdb4.8 not obsolete in squeeze&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://bugs.debian.org/624593&quot;&gt;624593&lt;/a&gt;: doesn&#39;t fail in squeeze&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://bugs.debian.org/626868&quot;&gt;626868&lt;/a&gt;: doesn&#39;t fail in squeeze&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://bugs.debian.org/628475&quot;&gt;628475&lt;/a&gt;: libdb4.8 not obsolete in squeeze&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://bugs.debian.org/629838&quot;&gt;629838&lt;/a&gt;: boost1.46 not in squeeze&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://bugs.debian.org/628475&quot;&gt;628475&lt;/a&gt;: boost1.46 not in squeeze&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://bugs.debian.org/631623&quot;&gt;631623&lt;/a&gt;: doesn&#39;t fail in squeeze&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://bugs.debian.org/639990&quot;&gt;639990&lt;/a&gt;: doesn&#39;t fail in squeeze&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://bugs.debian.org/632763&quot;&gt;632763&lt;/a&gt;: no libevent 2.0 in squeeze&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://bugs.debian.org/627000&quot;&gt;627000&lt;/a&gt;: not affecting squeeze&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://bugs.debian.org/658216&quot;&gt;658216&lt;/a&gt;: doesn&#39;t fail in squeeze&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://bugs.debian.org/654870&quot;&gt;654870&lt;/a&gt;: doesn&#39;t fail in squeeze&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://bugs.debian.org/655115&quot;&gt;655115&lt;/a&gt;: this is explicitly about testing&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://bugs.debian.org/657092&quot;&gt;657092&lt;/a&gt;: working in squeeze&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://bugs.debian.org/655710&quot;&gt;655710&lt;/a&gt;: doesn&#39;t fail in squeeze&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://bugs.debian.org/644691&quot;&gt;644691&lt;/a&gt;: no nautilus 3 in squeeze&lt;/li&gt;
&lt;/ul&gt;
  
&lt;p&gt;I am glad that I managed to keep it up and even have a nice margin in case I can&#39;t put any effort into it some day but still have more bugs squashed than days there are in the year so far. Currently I am at 60 bugs in 39 days. This gives a warm feeling. :)&lt;/p&gt;

&lt;p&gt;Enjoy!&lt;/p&gt;

&lt;p align=&quot;right&quot;&gt;
  &lt;i&gt;&lt;a href=&quot;http://rhonda.deb.at/blog/debian&quot;&gt;/debian&lt;/a&gt; | 
    &lt;a href=&quot;http://rhonda.deb.at/blog/debian/squeeze-RCs-2012-2.html&quot;&gt;permanent link&lt;/a&gt; |
    &lt;a href=&quot;http://rhonda.deb.at/blog/debian/squeeze-RCs-2012-2.html&quot;&gt;Comments: 3&lt;/a&gt; |
    &lt;a href=&quot;http://flattr.com/thing/46312/Rhondas-Blog&quot; target=&quot;_blank&quot;&gt;Flattr this&lt;/a&gt;&lt;/i&gt;
&lt;/p&gt;</content>
	<author>
	  <name>Rhonda</name>
	   <uri>http://rhonda.deb.at/blog/</uri> 
	</author>
	<source>
	  <title type="html">Rhonda's Blog</title>
	  <subtitle type="html">Mainly about her Debian work, but also other (uninteresting) informations of her life...</subtitle>
	  <link rel="self" href="http://rhonda.deb.at/blog/index.planet"/>
	  <id>http://rhonda.deb.at/blog/</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">Python and --prefix</title>
	<link href="http://www.technovelty.org/code/python/python-prefix.html"/>
	<id>http://feeds.feedburner.com/code/python/python-prefix.html</id>
	<updated>2012-02-08T05:16:00+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;Something interesting I discovered about Python and
&lt;tt&gt;--prefix&lt;/tt&gt; that I can&#39;t see a lot of documentation on...&lt;/p&gt;

&lt;p&gt;When you build Python you can use the standard &lt;tt&gt;--prefix&lt;/tt&gt;
flag to &lt;tt&gt;configure&lt;/tt&gt; to home the installation as you require.
You might expect that this would hard-code the location to look for
the support libraries to the value you gave; however in reality it
doesn&#39;t quite work like that.&lt;/p&gt;

&lt;p&gt;Python will only look in the directory specified by &lt;tt&gt;prefix&lt;/tt&gt;
&lt;i&gt;after&lt;/i&gt; it first searches relative to the path of the executing
binary.  Specifically, it looks at &lt;tt&gt;argv[0]&lt;/tt&gt; and works through
a few steps — is &lt;tt&gt;argv[0]&lt;/tt&gt; a symlink?  then dereference
it.  Does &lt;tt&gt;argv[0]&lt;/tt&gt; have any slashes in it?  if not, then
search the &lt;tt&gt;$PATH&lt;/tt&gt; for the binary.  After this, it starts
searching for &lt;tt&gt;dirname(argv[0])/lib/pythonX.Y/os.py&lt;/tt&gt;, then
&lt;tt&gt;dirname(argv[0])/../lib&lt;/tt&gt; and so on, until it reaches the root.
Only after these searches fail does the interpreter then fall back to
the hard-coded path specified in the &lt;tt&gt;--prefix&lt;/tt&gt; when
configured.&lt;/p&gt;

&lt;p&gt;What is the practical implications? It means you can move around a
python installation tree and have it all &quot;just work&quot;, which is nice.
In my situation, I noticed this because we have a completely
self-encapsulated build toolchain, but we wish to ship the same
interpreter on the thing that we&#39;re building (during the build, we run
the interpreter to create &lt;tt&gt;.pyc&lt;/tt&gt; files for distribution, and we
need to be sure that when we did this we didn&#39;t accidentally pick up
any of the build hosts python; only the toolchain python).&lt;/p&gt;

&lt;p&gt;The &lt;tt&gt;PYTHONHOME&lt;/tt&gt; environment variable does override this
behaviour; if it is set then the search stops there.  Another
interesting thing is that &lt;tt&gt;sys.prefix&lt;/tt&gt; is therefore &lt;b&gt;not&lt;/b&gt;
the value passed in by &lt;tt&gt;--prefix&lt;/tt&gt; during configure, but the
value of the current dynamically determined prefix value.&lt;/p&gt;

&lt;p&gt;If you run an &lt;tt&gt;strace&lt;/tt&gt;, you can see this in operation.&lt;/p&gt;

&lt;div class=&quot;codebox&quot;&gt;
&lt;pre&gt;readlink(&quot;/usr/bin/python&quot;, &quot;python2.7&quot;, 4096) = 9
readlink(&quot;/usr/bin/python2.7&quot;, 0xbf8b014c, 4096) = -1 EINVAL (Invalid argument)
stat64(&quot;/usr/bin/Modules/Setup&quot;, 0xbf8af0a0) = -1 ENOENT (No such file or directory)
stat64(&quot;/usr/bin/lib/python2.7/os.py&quot;, 0xbf8af090) = -1 ENOENT (No such file or directory)
stat64(&quot;/usr/bin/lib/python2.7/os.pyc&quot;, 0xbf8af090) = -1 ENOENT (No such file or directory)
stat64(&quot;/usr/lib/python2.7/os.py&quot;, {st_mode=S_IFREG|0644, st_size=26300, ...}) = 0
stat64(&quot;/usr/bin/Modules/Setup&quot;, 0xbf8af0a0) = -1 ENOENT (No such file or directory)
stat64(&quot;/usr/bin/lib/python2.7/lib-dynload&quot;, 0xbf8af0a0) = -1 ENOENT (No such file or directory)
stat64(&quot;/usr/lib/python2.7/lib-dynload&quot;, {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Firstly it dereferences symlinks.  Then it looks for
&lt;tt&gt;Modules/Setup&lt;/tt&gt; to see if it is running out of the build tree.
Then it starts looking for &lt;tt&gt;os.py&lt;/tt&gt;, walking its way upwards.
One interesting thing that may either be a bug or a feature, I haven&#39;t
decided, is that if you set the prefix to &lt;tt&gt;/&lt;/tt&gt; then the
interpreter will not go back to the root and then look in
&lt;tt&gt;/lib&lt;/tt&gt;.  This is probably pretty obscure usage though!&lt;/p&gt;

&lt;p&gt;All this is implemented in &lt;a href=&quot;http://svn.python.org/projects/python/trunk/Modules/getpath.c&quot;&gt;Modules/getpath.c&lt;/a&gt;
which has a nice big comment at the top explaining the rules in
detail.&lt;/p&gt;</content>
	<author>
	  <name>Ian Wienand</name>
	   <uri>http://www.technovelty.org</uri> 
	</author>
	<source>
	  <title type="html">technovelty</title>
	  <subtitle type="html">From the keyboard of Ian Wienand</subtitle>
	  <link rel="self" href="http://feeds.feedburner.com/technovelty"/>
	  <id>http://www.technovelty.org</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">FOSDEM 2012, the aftermath</title>
	<link href="http://richardhartmann.de/blog/posts/2012/02/fosdem-2012-the-aftermath/"/>
	<id>http://richardhartmann.de/blog/posts/2012/02/fosdem-2012-the-aftermath/</id>
	<updated>2012-02-07T22:20:24+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;FOSDEM 2012 was very nice, as expected.&lt;/p&gt;
&lt;p&gt;This year, I decided to stop consuming only and getting more
involved. I helped staff the token sale and held two Lightning
Talks. This turned out to be an awesome experience.&lt;/p&gt;
&lt;p&gt;During the beer event, we sold 4600 beer tokens (FOSDEM does not
earn anything from this; all proceeds go to Cafe Delirium). The
sale was staffed with one to three people at all times which made
for a constant but mostly bearable workload. While the others made
good-natured fun of me and my German efficiency, I like to think
that I helped make things run a tad more smoothly. Along those
lines, we will have a sign asking people for exact change and/or to
buy stacks that can be paid in bills if possible, next year; that
should help streamline the whole thing even more. All in all, it
turned out to be quite stressful, but tons of fun. I am looking
forward to chuck in again next year.&lt;/p&gt;
&lt;p&gt;The two Lighting Talks (&lt;a href=&quot;http://fosdem.org/2012/schedule/event/vcsh&quot;&gt;vcsh&lt;/a&gt; on Saturday
and &lt;a href=&quot;http://fosdem.org/2012/schedule/event/gitannex&quot;&gt;git-annex&lt;/a&gt; on
Sunday) I held very rather well received. Feedback after the talks
and online was very positive which is always nice. There&#39;s been a
slight increase in help requests and generic questions, so I assume
people are trying vcsh and git-annex as a consequence of those
talks, which is even nicer.&lt;/p&gt;
&lt;p&gt;Also, I met a &lt;em&gt;lot&lt;/em&gt; of people. Most of the meetings were
pre-arranged, some by chance. Carrying a name tag at all times, I
was approached by several people who knew me online but didn&#39;t know
my face. I will try to always carry a name tag on conferences now
and I suggest others do the same.&lt;/p&gt;
&lt;p&gt;Finally, a huge thank you to everyone who helped make FOSDEM
happen; you rock!&lt;/p&gt;</content>
	<author>
	  <name>Richard 'RichiH' Hartmann</name>
	   <uri>http://richardhartmann.de/blog/</uri> 
	</author>
	<source>
	  <title type="html">blog</title>
	  <subtitle type="html">richardhartmann.de</subtitle>
	  <link rel="self" href="http://richardhartmann.de/blog/index.atom"/>
	  <id>http://richardhartmann.de/blog/</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">Make sure glue isn&#39;t stripped</title>
	<link href="http://blog.beuc.net/posts/Make_sure_glue_isn__39__t_stripped/"/>
	<id>http://blog.beuc.net/posts/Make_sure_glue_isn__39__t_stripped/</id>
	<updated>2012-02-07T21:38:48+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;If you ever get this cryptic error when loading an Android native app:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo{org.wikibooks.OpenGL/android.app.NativeActivity}: java.lang.IllegalArgumentException: Unable to load native library: /data/data/org.wikibooks.OpenGL/lib/libnative-activity.so
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1768)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1784)
       at android.app.ActivityThread.access$1500(ActivityThread.java:123)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:939)
       at android.os.Handler.dispatchMessage(Handler.java:99)
       at android.os.Looper.loop(Looper.java:130)
       at android.app.ActivityThread.main(ActivityThread.java:3835)
       at java.lang.reflect.Method.invokeNative(Native Method)
       at java.lang.reflect.Method.invoke(Method.java:507)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
       at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.IllegalArgumentException: Unable to load native library: /data/data/org.wikibooks.OpenGL/lib/libnative-activity.so
       at android.app.NativeActivity.onCreate(NativeActivity.java:199)
       at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1722)
       ... 11 more
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This may mean that Java couldn&#39;t find the &lt;code&gt;ANativeActivity_onCreate&lt;/code&gt; function in your code, because it was stripped by the compiler.&lt;/p&gt;

&lt;p&gt;If you use the &lt;code&gt;native_app_glue&lt;/code&gt; NDK module, you may have noticed this strange code:&lt;/p&gt;

&lt;pre class=&quot;hl&quot;&gt;    &lt;span class=&quot;hl slc&quot;&gt;// Make sure glue isn&#39;t stripped.&lt;/span&gt;
    &lt;span class=&quot;hl kwd&quot;&gt;app_dummy&lt;/span&gt;&lt;span class=&quot;hl sym&quot;&gt;();&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;Let&#39;s experiment what happens with and without this line:&lt;/p&gt;

&lt;p&gt;Calling app_dummy:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ arm-linux-androideabi-objdump -T libs/armeabi/libnative-activity.so  | grep ANativeActivity_onCreate
000067fc g    DF .text  000000f8 ANativeActivity_onCreate
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Not calling app_dummy :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ arm-linux-androideabi-objdump -T libs/armeabi/libnative-activity.so | grep ANativeActivity_onCreate
$   # nothing
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;code&gt;native_app_glue&lt;/code&gt; mainly defines Android callbacks.  Since none of them are called directly by your code, the compiler strips the &lt;code&gt;android_native_app_glue.o&lt;/code&gt; module entirely.  If you use &lt;code&gt;app_dummy&lt;/code&gt; however, it embeds it.  Fortunately the compiler cannot strip the module on a per-function basis &lt;img src=&quot;http://blog.beuc.net/tags/planet_debian/../../smileys/smile4.png&quot; alt=&quot;;)&quot; /&gt;&lt;/p&gt;

&lt;p&gt;That&#39;s why you need to call &lt;code&gt;app_dummy&lt;/code&gt; when using the &lt;code&gt;native_app_glue&lt;/code&gt; NDK module.&lt;/p&gt;

&lt;p&gt;This looks like a ugly work-around though - isn&#39;t there a cleaner way?&lt;/p&gt;</content>
	<author>
	  <name>Beuc's Blog</name>
	   <uri>http://blog.beuc.net/tags/planet_debian/</uri> 
	</author>
	<source>
	  <title type="html">pages tagged planet debian</title>
	  <subtitle type="html">Beuc&#39;s Blog</subtitle>
	  <link rel="self" href="http://blog.beuc.net/tags/planet_debian/index.atom"/>
	  <id>http://blog.beuc.net/tags/planet_debian/</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">fatrace: report system wide file access events</title>
	<link href="http://www.piware.de/2012/02/fatrace-report-system-wide-file-access-events/"/>
	<id>http://www.piware.de/?p=594</id>
	<updated>2012-02-07T19:53:05+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;Part of our &lt;a href=&quot;https://blueprints.launchpad.net/ubuntu/+spec/desktop-p-power-consumption&quot;&gt;efforts to reduce power consumption&lt;/a&gt; is to identify processes which keep waking up the disk even when the computer is idle. This already resulted in a few &lt;a href=&quot;https://bugs.launchpad.net/ubuntu-power-consumption&quot;&gt;bug reports&lt;/a&gt; (and some fixes, too), but we only really just began with this.&lt;/p&gt;
&lt;p&gt;Unfortunately there is no really good tool to trace file access events system-wide. &lt;a href=&quot;http://www.lesswatts.org/projects/powertop/&quot;&gt;powertop&lt;/a&gt; claims to, but its output is both very incomplete, and also wrong (e. g. it claims that read accesses are writes). &lt;a href=&quot;http://manpages.ubuntu.com/strace&quot;&gt;strace&lt;/a&gt; gives you everything you do and don’t want to know about what’s going on, but is per-process, and attaching strace to all running and new processes is cumbersome. &lt;a href=&quot;http://www.cse.unsw.edu.au/~aaronc/iosched/doc/blktrace.html&quot;&gt;blktrace&lt;/a&gt; is system-wide, but operates at a way too low level for this task: its output has nothing to do any more with files or even inodes, just raw block numbers which are impossible to convert back to an inode and file path.&lt;/p&gt;
&lt;p&gt;So I created a little tool called &lt;a href=&quot;https://launchpad.net/fatrace&quot;&gt;fatrace&lt;/a&gt; (“file access trace”, not “fat race” &lt;img src=&quot;http://www.piware.de/wp/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:-)&quot; class=&quot;wp-smiley&quot; /&gt;  ) which uses &lt;a href=&quot;http://lwn.net/Articles/360955/&quot;&gt;fanotify&lt;/a&gt;, a couple of &lt;code&gt;/proc&lt;/code&gt; lookups and some glue to provide this. By default it monitors the whole system, i. e. all mounts (except the virtual ones like /proc, tmpfs, etc.), but you can also tell it to just consider the mount of the current directory. You can write the log into a file (stdout by default), and run it for a specified number of seconds. Optional time stamps and PID filters are also provided.&lt;/p&gt;
&lt;pre&gt;$ sudo fatrace
rsyslogd(967): W /var/log/auth.log
notify-osd(2264): O /usr/share/pixmaps/weechat.xpm
compiz(2001): R device 8:2 inode 658203
[...]
&lt;/pre&gt;
&lt;p&gt;It shows the process name and pid, the event type (&lt;strong&gt;R&lt;/strong&gt;read, &lt;strong&gt;W&lt;/strong&gt;rite, &lt;strong&gt;O&lt;/strong&gt;pen, or &lt;strong&gt;C&lt;/strong&gt;lose), and the path. Sometimes its’ not possible to determine a path (usually because it’s a temporary file which already got deleted, and I suspect mmaps as well), in that case it shows the device and inode number; such programs then need closer inspection with strace.&lt;/p&gt;
&lt;p&gt;If you run this in gnome-terminal, there is an annoying feedback loop, as gnome-terminal causes a disk access with each output line, which then causes another output line, ad infinitum. To fix this, you can either redirect output to a file (&lt;code&gt;-o /tmp/trace&lt;/code&gt;) or ignore the PID of gnome-terminal (&lt;code&gt;-p `pidof gnome-terminal`&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;So to investigate which programs are keeping your disk spinning, run something like&lt;/p&gt;
&lt;pre&gt;  $ sudo fatrace -o /tmp/trace -s 60
&lt;/pre&gt;
&lt;p&gt;and then do nothing until it finishes.&lt;/p&gt;
&lt;p&gt;My next task will be to write an integration program which calls fatrace and powertop, and creates a nice little report out of that raw data, sorted by number of accesses and process name, and all that. But it might already help some folks as it is right now.&lt;/p&gt;
&lt;p&gt;The code lives in &lt;code&gt;bzr branch lp:fatrace&lt;/code&gt; (&lt;a href=&quot;http://bazaar.launchpad.net/~pitti/fatrace/trunk&quot;&gt;web view&lt;/a&gt;), you can just run &lt;code&gt;make&lt;/code&gt; and &lt;code&gt;sudo ./fatrace&lt;/code&gt;. I also uploaded a package to Ubuntu Precise, but it still needs to go through the NEW queue. I also made a 0.1 release, so you can just grab the &lt;a href=&quot;https://launchpad.net/fatrace/+download&quot;&gt;release tarball&lt;/a&gt; if you prefer. Have a look at the manpage and &lt;code&gt;--help&lt;/code&gt;, it should be pretty self-explanatory.&lt;/p&gt;</content>
	<author>
	  <name>pitti</name>
	   <uri>http://www.piware.de</uri> 
	</author>
	<source>
	  <title type="html">Martin Pitt » debian</title>
	  <subtitle type="html">addicted to Ubuntu development</subtitle>
	  <link rel="self" href="http://www.piware.de/category/debian/feed/atom/"/>
	  <id>http://www.piware.de/feed/atom/</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en-us">phpMyAdmin is now at github</title>
	<link href="http://blog.cihar.com/archives/2012/02/07/phpmyadmin-now-github/?utm_source=rss2"/>
	<id>http://blog.cihar.com/archives/2012/02/07/phpmyadmin-now-github/?utm_source=rss2</id>
	<updated>2012-02-07T14:04:22+00:00</updated>
	<summary type="html" xml:lang="en-us"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;I&#39;ve just updated &lt;a href=&quot;http://www.phpmyadmin.net/&quot;&gt;phpMyAdmin&lt;/a&gt; repos on github and enabled notifications hooks
there, so the &lt;a href=&quot;http://blog.cihar.com/archives/2012/02/05/phpmyadmin-goes-github/&quot;&gt;earlier announced switch to github&lt;/a&gt; is done.&lt;/p&gt;
&lt;p&gt;All you need to do is point your repositories to pull/push to github,
for main repository it can be done using:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git remote set-url origin git@github.com:phpmyadmin/phpmyadmin.git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you are using just read only access then use following:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git remote set-url origin git://github.com/phpmyadmin/phpmyadmin.git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For other repositories just replace last part of the URL with
repository name (they have not changed).&lt;/p&gt;
&lt;p&gt;Everything should work as before, pushes should be now faster, because
all notifications are done in background on github and they don&#39;t block
pushing.&lt;/p&gt;

&lt;p style=&quot;font-size: smaller;&quot;&gt;
Filed under: 


&lt;a href=&quot;http://blog.cihar.com/archives/english/&quot;&gt;English&lt;/a&gt;

&lt;a href=&quot;http://blog.cihar.com/archives/phpmyadmin/&quot;&gt;Phpmyadmin&lt;/a&gt;

|

&lt;a href=&quot;http://blog.cihar.com/archives/2012/02/07/phpmyadmin-now-github/#comments&quot;&gt;2 comments&lt;/a&gt;
|
&lt;a href=&quot;http://flattr.com/thing/59773/Michal-Cihars-Weblog&quot;&gt;Flattr this!&lt;/a&gt;
&lt;/p&gt;</content>
	<author>
	  <name>Michal Čihař</name>
	   <email>michal@cihar.com</email> 
	</author>
	<source>
	  <title type="html">Michal Čihař's Weblog, posts tagged by English</title>
	  <subtitle type="html">Random thoughts about everything tagged by English</subtitle>
	  <link rel="self" href="http://blog.cihar.com/archives/english/index-rss.xml"/>
	  <id>http://blog.cihar.com/archives/english/</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">Video at FOSDEM 2012</title>
	<link href="http://grep.be/blog/en/life/fosdem/2012_video"/>
	<id>http://grep.be/blog/en/life/fosdem/2012_video</id>
	<updated>2012-02-07T13:17:28+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;A year ago, during FOSDEM 2011, I walked up to the &lt;a href=&quot;http://www.namurlug.org&quot;&gt;NamurLUG&lt;/a&gt; folks who&#39;d been doing video
coverage of FOSDEM for years, and suggested that this year, maybe they
should consider using &lt;a href=&quot;http://dvswitch.alioth.debian.org&quot;&gt;dvswitch&lt;/a&gt; for video
coverage. While they seemed agreeable to this idea, they simply had not
had the time to look at it in detail, and were therefore not using it.
Since I&#39;ve used dvswitch in the past, both as part of the &lt;a href=&quot;http://www.debconf.org/&quot;&gt;DebConf video team&lt;/a&gt; and for my own
concert recordings, I reasoned this a problem that could be solved by
joining the video team.&lt;/p&gt;
&lt;p&gt;However, when it came to be time to start preparing for FOSDEM 2012,
we found that many of the NamurLUG people were not going to have as much
time to prepare for video coverage as they had during past years, and
therefore responsibility of FOSDEM video coverage fell entirely to
me. This was fairly unexpected, though not too daunting.&lt;/p&gt;
&lt;p&gt;For those of you who don&#39;t know dvswitch very well: a typical
dvswitch installation for coverage of a talk requires:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Two cameras; one to capture the speaker, one to capture audience
members asking questions.&lt;/li&gt;
&lt;li&gt;A &lt;a href=&quot;http://www.grassvalley.com/products/twinpact100&quot;&gt;twinpact
100&lt;/a&gt;, used to convert a VGA output into a DV stream that we can load
into dvswitch&lt;/li&gt;
&lt;li&gt;Three laptops: one for the audience camera, one for the twinpact,
and one for the speaker camera and the dvswitch installation&lt;/li&gt;
&lt;li&gt;A GigE network between the three laptops, with an uplink to do
streaming&lt;/li&gt;
&lt;li&gt;A large amount of diskspace to store the recordings on. Since
dvswitch records in raw DV, you require approximately 13GB per hour of
recorded video.&lt;/li&gt;
&lt;li&gt;Some powerful systems to do transcoding from DV to a streaming
format such as Ogg Theora or WebM
&lt;/li&gt;&lt;li&gt;A fairly extensive audio setup: one wireless headset microphone for
the speaker, one or two wireless handheld microphones for people in the
audience, and a number of microphones at select positions in the room to
pick up ambient noise (which for obvious reasons you don&#39;t want to
overdo on, but which if done well makes the audio on your recording
sound much more natural). This also requires a mixing console.&lt;/li&gt;
&lt;li&gt;And last but not least a (network of) streaming server(s) to do the
streaming to people watching from home.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is a rather large amount of work, and therefore it is not too
unexpected that for DebConf, the DebConf video team takes a week to
properly set up two rooms so that they can be used for recording.
However, for FOSDEM we only have &lt;em&gt;less than a day&lt;/em&gt; on-site to set
up things, and we were going to cover &lt;em&gt;five&lt;/em&gt; rooms. So, I tried
to cut corners as much as possible:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;We were going to work with one camera per room, rather than two. Not
only would this reduce the number of required volunteers (of which I
wasn&#39;t sure yet at that point how I&#39;d find them), it would also reduce
the amount of preparation needing to be done, and it would reduce the
number of things that could go wrong.&lt;/li&gt;
&lt;li&gt;We were going to have the network team do our network, rather than
try to do it ourselves. The result was that we were not going to have to
lay out cables, cut them, crimp connectors on them, test them, etc, and
would only need to worry about using the network, instead of building
it.&lt;/li&gt;
&lt;li&gt;Since I&#39;d read &lt;a href=&quot;http://thomas.apestaart.org/log/?p=1329&quot;&gt;Thomas&#39; announcement&lt;/a&gt;
about an &#39;&#39;&lt;em&gt;offer I cannot refuse&lt;/em&gt;&#39;&#39;, I contacted him to see
about that offer and get it all set up for FOSDEM. This way, I wouldn&#39;t
have to worry about streaming servers etc, instead just about getting a
stream on the network, into a flumotion server running somewhere; and
after that, it would no longer be my problem.&lt;/li&gt;
&lt;li&gt;I decided to simplify the audio setup somewhat, and not use ambient
mics. These are nice, but not essential, so we could do without
them, and that would be (at least) two microphones per room that the
team wouldn&#39;t have to rent, place, wire up, and tune.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So in the end, I would need to take care of ten firewire-capable
laptops, five cameras, five mixing consoles, several microphones, a
number of transcoding machines, and shitloads of cabling (power,
firewire, and audio). And about a week or two before the conference, as
the massiveness of what we were about to do started to sink in, I was
starting to have bad dreams of what would happen, wondering what I&#39;d
gotten myself into this time.&lt;/p&gt;
&lt;p&gt;Now, one day after FOSDEM, I have to say it all turned out okay, but
there are some things where there&#39;s still room for improvement. So that
I don&#39;t forget, I thought I&#39;d make a list of things that went well, and
one of things that didn&#39;t go well. And since that might be interesting
for other people, I thought I&#39;d do it here, rather than in a private
file.&lt;/p&gt;
&lt;p&gt;First, things that did not go so well:&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;Set-up for some rooms took more time than we had, and as such
some rooms did not get properly streamed or recorded for their first few
talks. This was due to the fact that there was some confused
communication between some members of the team, which meant that we lost
a day that we&#39;d planned for preparation, and as such we couldn&#39;t test
as much as we&#39;d hoped. We need to improve on that next year. Ideally, we
should run the full set-up somewhere, with all cameras and all laptops
running, and making sure that everything is ready to be set up and that
we have every cable we need, before dividing everything over a number of
boxes (one per room) and bringing it to the conference.&lt;/li&gt;
&lt;li&gt;While some of our cameras were semi-professional Panasonic cameras
that had a balanced XLR audio input, others were much lower-level
camcorder-style cameras that did not have such a thing. When a camera
has a good audio input, it&#39;s fairly easy to set up a link from the
mixing console to the camera and get the audio into the stream that way.
When a camera does not have such a thing, the set-up gets much more
complex. Since we had so much to worry about, we did not notice that in
one room, on saturday, something went wrong with audio. To combat this,
we should improve on our audio set-up for next year, and also verify the
streams every once in a while (I did the latter on sunday, so everything
should be fine there).&lt;/li&gt;
&lt;li&gt;Inherent to an ad-hoc network, there were some network-related
issues. For instance, on sunday evening, during the last session in that
room, &lt;a href=&quot;http://womble.decadent.org.uk/blog&quot;&gt;Ben&lt;/a&gt; informed me
that the link to room H.1301 had gone down. As we were investigating, we
easily found the source of the problem:&lt;br /&gt;
&lt;a href=&quot;http://www.flickr.com/photos/wouterverhelst/6823856173/&quot; title=&quot;Cable issue, on Flickr&quot;&gt;&lt;img src=&quot;http://farm8.staticflickr.com/7031/6823856173_39e30bf37e.jpg&quot; alt=&quot;IMAG0103&quot; height=&quot;299&quot; width=&quot;500&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
The cable had been put under a door, and had been &#39;protected&#39; with loads
and loads of duct tape, but apparently that wasn&#39;t enough. This wasn&#39;t
something we wanted to fix anymore, at that point; instead, we just let
the cable be and focused on other things.&lt;/li&gt;
&lt;li&gt;Storage. None of the systems used for the recordings were my own;
instead, some were owned by IRILL and some were rented. If I want to
do anything with my recordings, that means I have to copy the data off.
The system I chose was to bring a USB3 hard disk and copy everything
over; but for saturday, this took an hour and thirty minutes. On sunday,
my USB3 disk was fairly full, so I had to revert to a USB2 one, which
increased the time by &lt;em&gt;much&lt;/em&gt;. In the end, we had to abort copying
files, and we&#39;ll now have to be a bit creative to get them.&lt;/li&gt;
&lt;li&gt;Volunteer management. I originally set up a &lt;a href=&quot;http://wiki.debconf.org/wiki/FOSDEM/2012&quot;&gt;wiki page&lt;/a&gt; to allow
people to sign up for talks that they wanted to help out with.
Unfortunately, that didn&#39;t work so well as it did for DebConf; there
were several talks that did not have enough people, resulting in the
volunteers from the previous talk remaining on post and finishing their
talk. Also, there were some people that signed up without contacting me,
or without telling me what name they used on the wiki page, which made
it somewhat harder to know who to talk to. I lost count of who had
signed up to help out. On Sunday, I decided to set up an IRC channel
instead, through which volunteers could communicate more directly and
just &lt;em&gt;ask&lt;/em&gt; for people to take over, instead of registering for a
talk first and then hoping nobody would forget. Also, since I&#39;m terribly
bad with faces and video volunteers did not have anything that made them
stand out from the rest, I couldn&#39;t just walk around until I would see
someone involved with video work and ask them to take over in a room.
Having a separate &#39;video team&#39; t-shirt could help there.&lt;p&gt;&lt;/p&gt;
&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;After the bad news, here&#39;s the list of things that did go well:&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;Streaming. Even though choosing flumotion rather than icecast
(as we&#39;d done for streaming in the past) involved extra work for me
before the conference (I had to write some code so that I could stream
from dvswitch into flumotion, which wasn&#39;t possible out of the box), the
guys at Flumotion decided to send over one of their support engineers.
As such, I simply did not have to worry about streaming servers crashing
or failing to do what they were supposed to do. While I have no reason
to think any of the Flumotion servers were having issues, even if they
were I wouldn&#39;t have known about it, since Francesc took care of it all
and never ever required my involvement about something on the flumotion
side. This was extremely valuable.&lt;/li&gt;
&lt;li&gt;Training right before the welcome talk. Explaining to people in a
few words how dvswitch works, and then immediately following that up
with a live demonstration, isn&#39;t a bad way for them to understand.&lt;/li&gt;
&lt;li&gt;Despite all the problems we did have, once everything had been set
up and all the gear was more or less manned, actually recording and
streaming did go fairly well. The feedback I received so far was mostly
positive, which makes me very happy.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In the end, while there certainly is still room for improvement and
things did not go as smoothly as I&#39;d hoped, they have gone much better
than my worst fears. There&#39;s still some work to do, which I&#39;ll be doing
with the NamurLUG people this week, but all in all, it&#39;s gone pretty
good.&lt;/p&gt;
&lt;p&gt;As to the usage of the streams, I asked Flumotion for some
statistics. Since I was fairly late in asking, they could only provide
me with statistics about sunday:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Number of clients connecting:&lt;br /&gt;&lt;img src=&quot;http://barbershop.grep.be/blogdata/fosdem_stats.png&quot; /&gt;&lt;/li&gt;
&lt;li&gt;Traffic:&lt;br /&gt;
&lt;img src=&quot;http://barbershop.grep.be/blogdata/fosdem_traf.png&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;</content>
	<author>
	  <name>Wouter Verhelst</name>
	   <email>w@uter.be</email> 
	</author>
	<source>
	  <title type="html">WEBlog -- Wouter's Eclectic Blog</title>
	  <subtitle type="html">Wouter Verhelst</subtitle>
	  <link rel="self" href="http://www.grep.be/blog/en/index.myrss"/>
	  <id>http://grep.be/blog/en</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">Games Screenshot Party</title>
	<link href="http://rhonda.deb.at/blog/2012/02/07#games-screenshot-party"/>
	<id>http://rhonda.deb.at/blog/2012/02/07#games-screenshot-party</id>
	<updated>2012-02-07T10:36:00+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;The following announce is lazily copied from &lt;a href=&quot;http://bonedaddy.net/pabs3/log/2012/02/03/debian-ubuntu-games-screenshot-party/&quot;&gt;Paul Wise&#39;s announce&lt;/a&gt;. There is only one thing I like to add: the screenshots that are submitted and collected on &lt;a href=&quot;http://screenshots.debian.net/&quot;&gt;screenshots.debian.net&lt;/a&gt; are visible on the packages websites (both &lt;a href=&quot;http://packages.debian.org/index&quot;&gt;Debian&lt;/a&gt; and &lt;a href=&quot;http://packages.ubuntu.com/&quot;&gt;Ubuntu&lt;/a&gt;) and are also used by the &lt;a href=&quot;http://packages.debian.org/software-center&quot;&gt;software-center&lt;/a&gt; package, so they help people to get a first impression of the package they might want to install.&lt;/p&gt;

&lt;p&gt;Have you ever wondered how to start getting involved in Debian/Ubuntu? Do you enjoy discovering new games and playing them? You might want to come to the &lt;a href=&quot;http://deb.li/gamesparty&quot;&gt;games screenshot party&lt;/a&gt;! We hope that the party will be a fun, easy, low-commitment way to get involved.&lt;/p&gt;

&lt;p&gt;The &lt;a href=&quot;http://wiki.debian.org/Games/Team&quot;&gt;Debian/Ubuntu Games Team&lt;/a&gt; is organizing a half-day &lt;a href=&quot;http://wiki.debian.org/Games/Parties/Screenshots&quot;&gt;screenshots&lt;/a&gt; &lt;a href=&quot;http://wiki.debian.org/Games/Parties&quot;&gt;party&lt;/a&gt; on the weekend of 25th-26th February for creating screenshots for all the games that are available in Debian/Ubuntu.&lt;/p&gt;

&lt;p&gt;If you are interested in attending, please add your availability to the poll linked from the &lt;a href=&quot;http://deb.li/gamesparty&quot;&gt;announcement&lt;/a&gt; so that we can get some idea of attendance and when is a good time for the people who are interested.&lt;/p&gt;

&lt;p&gt;Look forward to lots of game playing, screenshots and merry time, hope to see you all there!&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;

&lt;p align=&quot;right&quot;&gt;
  &lt;i&gt;&lt;a href=&quot;http://rhonda.deb.at/blog/debian&quot;&gt;/debian&lt;/a&gt; | 
    &lt;a href=&quot;http://rhonda.deb.at/blog/debian/games-screenshot-party.html&quot;&gt;permanent link&lt;/a&gt; |
    &lt;a href=&quot;http://rhonda.deb.at/blog/debian/games-screenshot-party.html&quot;&gt;Comments: 0&lt;/a&gt; |
    &lt;a href=&quot;http://flattr.com/thing/46312/Rhondas-Blog&quot; target=&quot;_blank&quot;&gt;Flattr this&lt;/a&gt;&lt;/i&gt;
&lt;/p&gt;</content>
	<author>
	  <name>Rhonda</name>
	   <uri>http://rhonda.deb.at/blog/</uri> 
	</author>
	<source>
	  <title type="html">Rhonda's Blog</title>
	  <subtitle type="html">Mainly about her Debian work, but also other (uninteresting) informations of her life...</subtitle>
	  <link rel="self" href="http://rhonda.deb.at/blog/index.planet"/>
	  <id>http://rhonda.deb.at/blog/</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">Stop ACTA</title>
	<link href="http://madduck.net/blog/2012.02.07:stop-acta/"/>
	<id>http://madduck.net/blog/2012.02.07:stop-acta/</id>
	<updated>2012-02-07T10:26:26+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;I hope by now you have heard of &lt;a href=&quot;http://en.wikipedia.org/wiki/ACTA&quot;&gt;ACTA&lt;/a&gt;. In any case, here is
a &lt;a href=&quot;http://www.youtube.com/watch?v=og426HP0s_U&quot;&gt;nice 6:30
minute video giving a good overview&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Please help stop ACTA. Our freedom is at risk. Whether you tell
people about it, write about it, use services like &lt;a href=&quot;http://twitter.com&quot;&gt;Twitter&lt;/a&gt; to tell the world about
&lt;code&gt;#StopACTA&lt;/code&gt;, or whether you take the time to &lt;a href=&quot;http://www.news.software.coop/stop-acta-marches-map/1267/&quot;&gt;march
against&lt;/a&gt; what corporate entities are lobbying politicians to do
against their people — please help protect the Internet as we know
it.&lt;/p&gt;
&lt;p&gt;NP: &lt;a href=&quot;http://www.allmusic.com/cg/amg.dll?SQL=God%20is%20an%20Astronaut&amp;amp;P=amg&amp;amp;OPT1=1&quot;&gt;
God is an Astronaut&lt;/a&gt;: &lt;em&gt;Moment of Stillness&lt;/em&gt;&lt;/p&gt;</content>
	<author>
	  <name>Martin F. Krafft</name>
	   <uri>http://madduck.net/blog/feeds/planet-debian/</uri> 
	</author>
	<source>
	  <title type="html">madduck's Planet Debian posts</title>
	  <subtitle type="html">madduck&#39;s blog entries for
Planet Debian</subtitle>
	  <link rel="self" href="http://madduck.net/blog/feeds/planet-debian/index.rss"/>
	  <id>http://madduck.net/blog/feeds/planet-debian/</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">Dpkg with multiarch support available in Debian experimental</title>
	<link href="http://raphaelhertzog.com/2012/02/07/dpkg-with-multiarch-support-available-in-debian-experimental/"/>
	<id>http://raphaelhertzog.com/?p=2576</id>
	<updated>2012-02-07T08:29:23+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;&lt;img src=&quot;http://raphaelhertzog.com/files/2011/07/modify-package-e1309263139826.jpg&quot; title=&quot;Packaging internals&quot; height=&quot;270&quot; width=&quot;270&quot; alt=&quot;&quot; class=&quot;alignleft size-full wp-image-1985&quot; /&gt;As I &lt;a href=&quot;http://lists.debian.org/debian-devel/2012/02/msg00184.html&quot;&gt;announced on debian-devel&lt;/a&gt;, Guillem Jover &lt;a href=&quot;http://lists.debian.org/debian-experimental-changes/2012/02/msg00025.html&quot;&gt;uploaded a snapshot&lt;/a&gt; of dpkg’s multiarch branch to experimental (version 1.16.2~wipmultiarch). Beware: There will&lt;br /&gt;
likely be some small “interface” changes between this version and the version that will be released later in unstable (possibly in the output of &lt;code&gt;dpkg --get-selections&lt;/code&gt;, &lt;code&gt;dpkg --list&lt;/code&gt;, maybe other commands).&lt;/p&gt;
&lt;p&gt;multiarch allows you to install packages from different architectures on the same machine. This can be useful if your computer can run programs from 2 architectures (eg. x86 CPU supporting i386 and amd64), or if you often need to cross-compile software and thus need the libraries of your target architecture.&lt;/p&gt;
&lt;h3&gt;Test dpkg with multiarch support&lt;/h3&gt;
&lt;p&gt;If you want to test multiarch support in dpkg, install the package from experimental (&lt;code&gt;apt-get install dpkg/experimental&lt;/code&gt; assuming you have experimental in your sources.list).&lt;/p&gt;
&lt;p&gt;Then you can add a supplementary architecture to your system by doing &lt;code&gt;sudo dpkg --add-architecture &amp;lt;arch&amp;gt;&lt;/code&gt; (e.g. i386 if you are on amd64, and vice-versa). APT will automatically pick up the new architecture and start downloading the Packages file for the new architecture (it uses &lt;code&gt;dpkg --print-foreign-architectures&lt;/code&gt; to know about them).&lt;/p&gt;
&lt;p&gt;From there on you can install packages from the “foreign” architectures with “&lt;code&gt;apt-get install foo:&amp;lt;arch&amp;gt;&lt;/code&gt;“. Many packages will not be installable because some of their dependencies have not yet been updated to work with in a multiarch world (libraries must be installed in a multiarch-compliant path so as to be co-installable, and then marked “&lt;code&gt;Multi-Arch: same&lt;/code&gt;“). Other dependencies might need to be marked “&lt;code&gt;Multi-Arch: foreign&lt;/code&gt;“. See &lt;a href=&quot;http://wiki.debian.org/Multiarch/Implementation&quot;&gt;wiki.debian.org/Multiarch/Implementation&lt;/a&gt; for more HOWTO-like explanations.&lt;/p&gt;
&lt;p&gt;Now is a good time to see if you can install the foreign packages that you could need in such a setup and to help to convert the required libraries.&lt;/p&gt;
&lt;p&gt;You can also read &lt;a href=&quot;http://blog.mraw.org/2012/02/01/dpkg_with_multiarch/&quot;&gt;Cyril Brulebois’ article&lt;/a&gt; which quickly shows how to hunt for the problematic packages which have not been converted to multiarch (in his sample, “ucf” is not ready. Since it’s an “&lt;code&gt;Architecture: all&lt;/code&gt;” package which can run on any architecture, it means that it’s lacking a “&lt;code&gt;Multi-Arch: foreign&lt;/code&gt;” field).&lt;/p&gt;
&lt;h3&gt;Report bugs&lt;/h3&gt;
&lt;p&gt;If you discover any bug in dpkg’s multiarch implementation, please report it to the Bug Tracking System (against “dpkg” with the version “1.16.2~wipmultiarch”).&lt;/p&gt;
&lt;p&gt;If you notice important libraries or packages which are not yet multiarch ready, please open wishlist bug reports requesting the conversion and point the maintainers towards the wiki page linked above. Even better, prepare patches and submit those with your bug reports.&lt;/p&gt;
&lt;p&gt;Again, you can follow the &lt;a href=&quot;http://blog.mraw.org/2012/02/06/dpkg_with_multiarch_redux/&quot;&gt;lead of Cyril Brulebois&lt;/a&gt; who filed 6 bugs!&lt;/p&gt;
&lt;h3&gt;Review the multiarch implementation&lt;/h3&gt;
&lt;p&gt;If you’re a C programmer and have some good knowledge of dpkg (or are willing to learn more of it), we would certainly benefit from more eyes reviewing the multiarch branch. If you want to discuss some design issues of the multiarch implementation in dpkg (or have questions related to your review), please get in touch via &lt;a href=&quot;mailto:debian-dpkg@lists.debian.org&quot;&gt;debian-dpkg@lists.debian.org&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The latest version of the branch is pu/multiarch/master in &lt;a href=&quot;http://git.hadrons.org/?p=debian/dpkg.git;a=shortlog;h=refs/heads/pu/multiarch/master&quot;&gt;Guillem’s personal repository&lt;/a&gt;.  I have my own version of the branch (&lt;a href=&quot;http://anonscm.debian.org/gitweb/?p=users/hertzog/dpkg.git;a=shortlog;h=refs/heads/pu/multiarch/full&quot;&gt;pu/multiarch/full&lt;/a&gt;) which is usually a snapshot of Guillem’s branch with my own submitted fixes.&lt;/p&gt;
&lt;pre&gt;$ git clone git://git.debian.org/dpkg/dpkg.git
$ cd dpkg
$ git remote add guillem git://git.hadrons.org/git/debian/dpkg/dpkg.git
$ git remote add buxy git://git.debian.org/~hertzog/dpkg.git
$ git fetch guillem &amp;amp;&amp;amp; git fetch buxy
&lt;/pre&gt;
&lt;p&gt;If you followed the instructions above, the relevant branches are thus guillem/pu/multiarch/master and buxy/pu/multiarch/full. Both branches are regularly rebased on top of master where Guillem merges progressively the commits from the multi-arch branch as his review progresses.&lt;/p&gt;
&lt;p&gt;Thank you in advance for your help bringing multiarch in shape for Debian Wheezy, &lt;/p&gt;
&lt;p style=&quot;font-size: smaller;&quot;&gt;&lt;a href=&quot;http://raphaelhertzog.com/2012/02/07/dpkg-with-multiarch-support-available-in-debian-experimental/#comments&quot;&gt;6 comments&lt;/a&gt; | Liked this article? &lt;a href=&quot;http://raphaelhertzog.com/support-my-work/&quot;&gt;Click here&lt;/a&gt;. | My blog is &lt;a href=&quot;http://flattr.com/thing/26545/apt-get-install-debian-wizard&quot;&gt;Flattr-enabled&lt;/a&gt;.&lt;/p&gt;
&lt;p class=&quot;wp-flattr-button&quot;&gt;&lt;/p&gt;</content>
	<author>
	  <name>Raphaël Hertzog</name>
	   <uri>http://raphaelhertzog.com</uri> 
	</author>
	<source>
	  <title type="html">apt-get install debian-wizard</title>
	  <subtitle type="html">Insider infos, master your Debian/Ubuntu distribution</subtitle>
	  <link rel="self" href="http://raphaelhertzog.com/feed/planets/"/>
	  <id>http://raphaelhertzog.com</id>  
	</source>
  </entry>
  
  <entry xml:lang="en">
	<title type="html" xml:lang="en">5 Principles of Backup Software</title>
	<link href="http://etbe.coker.com.au/2012/02/07/5-principles-backup/"/>
	<id>http://etbe.coker.com.au/?p=3154</id>
	<updated>2012-02-07T07:26:04+00:00</updated>
	<summary type="html" xml:lang="en"></summary>
	<content type="html" xml:lang="en">&lt;p&gt;Everyone agrees that backups are generally a good thing. But it seems that there is a lot less agreement about how backups should work. Here is a list of 5 principles of backup software that seem to get ignored most of the time:&lt;/p&gt;
&lt;h3&gt;(1/5) Backups should not be Application Specific&lt;/h3&gt;
&lt;p&gt;It’s quite reasonable for people to want to extract data from a backup on a different platform. Maybe someone will want to extract data a few decades after the platform becomes obsolete. I believe that vendors of backup software have an ethical obligation to make it possible for customers to get their data out with minimal effort regardless of the circumstances.&lt;/p&gt;
&lt;p&gt;Often when writing a backup application there will be good reasons for not using the existing formats for data storage (tar, cpio, zip, etc). But ideally any data store which involves something conceptually similar to a collection of files in one larger file will use one of those formats. There have been backward compatible extensions to tar and zip for SE Linux contexts and for OS/2 EAs – the possibility of extending archive file formats with no consequence other than warnings on extraction with an unpatched utility has been demonstrated.&lt;/p&gt;
&lt;p&gt;For a backup which doesn’t involve source files (EG the contents of some sort of database) then it should be in a format that can be easily understood and parsed. Well designed XML is generally a reasonable option. Generally the format should involve plain text that is readable and easy to understand which is optionally compressed with a common compression utility (pkzip is a reasonable choice).&lt;/p&gt;
&lt;h3&gt;(2/5) Data Store Formats should be Published&lt;/h3&gt;
&lt;p&gt;For every data store there should be public documentation about it’s format to allow future developers to write support for it. It really isn’t difficult to release some commented header files so that people can easily determine the data structures. This includes all data stores including databases and filesystems. If I suddenly find myself with a 15yo image of a NTFS filesystem containing a proprietary database I should be able to find official header files for the version of NTFS and the database server in question so I can decode the data if it’s important enough.&lt;/p&gt;
&lt;p&gt;When an application vendor hides the data formats it gives the risk of substantial data loss at some future time. Imposing such risk on customers to try and prevent them from migrating to a rival product is unethical.&lt;/p&gt;
&lt;h3&gt;(3/5) Backups should be forward and backward compatible&lt;/h3&gt;
&lt;p&gt;It is entirely unreasonable for a vendor to demand that all their users install the latest versions of their software. There are lots of good reasons for not upgrading which includes hardware not supporting new versions of the OS, lack of Internet access to perform the upgrade, application compatibility, and just liking the way the old version works. Even for the case of a critical security fix it should be possible to restore data without applying the fix.&lt;/p&gt;
&lt;p&gt;For any pair of versions of software that are only separated by a few versions it should be possible to backup data from one and restore to the other. Even if the data can’t be used directly (EG a backup of AMD64 programs that is restored on an i386 system) it should still be accessible. If a new version of the software doesn’t support the ancient file formats then it should be possible for the users to get a slightly older version which talks to both the old and new versions.&lt;/p&gt;
&lt;p&gt;Backups made on 64bit systems running the latest development version of Linux and on 10yo 32bit proprietary Unix systems are interchangeable. Admittedly Unix is really good at preserving file format compatibility, but there is no technical reason why other systems can’t do the same. Source code to cpio, tar, and gnuzip, is freely available!&lt;/p&gt;
&lt;p&gt;Apple TimeMachine fails badly in this regard, even a slightly older version of Mac OS can’t do a restore. It is however nice that most of the TimeMachine data is a tree of files which could be just copied to another system.&lt;/p&gt;
&lt;h3&gt;(4/5) Backup Software should not be Dropped&lt;/h3&gt;
&lt;p&gt;Sony Ericsson has made me hate them even more by putting the following message on their update web site:&lt;/p&gt;
&lt;p&gt;&lt;b&gt;The Backup and Restore app will be overwritten and cannot be used to restore data. Check out Android Market for alternative apps to back up and restore your data, such as MyBackup.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;So if you own a Sony Ericsson phone and it is lost, stolen, or completely destroyed and all you have is a backup made by the Sony Ericsson tool then the one thing you absolutely can’t do is to buy a new Sony Ericsson phone to restore the data.&lt;/p&gt;
&lt;p&gt;I believe that anyone who releases backup software has an ethical obligation to support restoring to all equivalent systems. How difficult would it be to put a new free app in the Google Market that has as it’s sole purpose recovering old Sony Ericsson backups onto newer phones? It really can’t be that difficult, so even if they don’t want to waste critical ROM space by putting the feature in all new phones they can make it available to everyone who needs it. When compared to the cost of developing a new Android release for a series of phones the cost of writing such a restore program would be almost nothing.&lt;/p&gt;
&lt;p&gt;It is simply mind-boggling that Sony Ericsson go against their own commercial interests in this regard. Surely it would make good business sense to be able to sell replacements for all the lost and broken Sony Ericsson phones, but instead customers who get burned by broken backups are given an incentive to buy a product from any other vendor.&lt;/p&gt;
&lt;h3&gt;(5/5) The greater the control over data the greater the obligation for protecting it&lt;/h3&gt;
&lt;p&gt;If you have data stored in a simple and standard manner (EG the /DCIM directory containing MP4 and JPEG files that is on the USB accessible storage in every modern phone) then IMHO it’s quite OK to leave customers to their own devices in terms of backups. Typical users can work out that if they don’t backup their pictures then they risk losing them, and they can work out how to do it.&lt;/p&gt;
&lt;p&gt;My Sony Ericsson phones have data stored under /data (settings for Android applications) which is apparently only accessible as root. Sony Ericsson have denied me root access which prevents me running backup programs such as Titanium Backup, therefore I believe that they have a great obligation to provide a way of making a backup of this data and restoring it on a new phone or a phone that has been updated. To just provide phone upgrade instructions which tell me that my phone will be entirely wiped and that I should search the App Market for backup programs is unacceptable.&lt;/p&gt;
&lt;p&gt;I believe that there are two ethical options available to Sony Ericsson at this time, one is to make it easy to root phones so that Titanium Backup and similar programs can be used, and the other option is to release a suitable backup program for older phones. Based on experience I don’t expect Sony Ericsson to choose either option.&lt;/p&gt;
&lt;p&gt;Now it is also a bad thing for the Android application developers to make it difficult or impossible to backup their data. For example the Wiki for one Android game gives instructions for moving the saved game files to a new phone which starts with “root your phone”. The developers of that game should have read the Wiki, realised that rooting a phone for the mundane task of transferring saved game files is totally unreasonable, and developed a better alternative.&lt;/p&gt;
&lt;p&gt;The best thing for developers to do is to allow the users to access their own data in the most convenient manner. Then it becomes the user’s responsibility to manage it and they can concentrate on improving their application.&lt;/p&gt;
&lt;h3&gt;Why Freedom is Important&lt;/h3&gt;
&lt;p&gt;Installing CyanogenMod on my Galaxy S was painful, but having root access so I can do anything I want is a great benefit. If phone vendors would do the right thing then I could recommend that other people use the vendor release, but it seems that vendors can be expected to act unethically. So I can’t recommend that anyone use an un-modded Android phone at any time. I also can’t recommend ever buying a Sony Ericsson product, not even when it’s really cheap.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.dataliberation.org/&quot;&gt;Google have done a great thing with their Data Liberation Front [1]&lt;/a&gt;. Not only are they providing access to the data they store on our behalf (which is a good thing) but they have a mission statement that demands the same behavior from other companies – they make it an issue of competitive advantage! So while Sony Ericsson and other companies might not see a benefit in making people like me stop hating them, failing to be as effective in marketing as Google is a real issue. Data Liberation is something that should be discussed at board elections of IT companies.&lt;/p&gt;
&lt;p&gt;Keep in mind the fact that ethics are not just about doing nice things, they are about establishing expectations of conduct that will be used by people who deal with you in future. Sony Ericsson has shown that I should expect that they will treat the integrity of my data with contempt and I will keep this in mind every time I decline an opportunity to purchase their products. Google has shown that they consider the protection of my data as an important issue and therefore I can be confident when using and recommending their services that I won’t get stuck with data that is locked away.&lt;/p&gt;
&lt;p&gt;While Google has demonstrated that corporations can do the right thing, the vast majority of evidence suggests that we should never trust a corporation with anything that we might want to retrieve when it’s not immediately profitable for the corporation. Therefore avoiding commercial services for storing important data is the sensible thing to do.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;[1]&lt;a href=&quot;http://www.dataliberation.org/&quot;&gt; http://www.dataliberation.org/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Related posts:&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;http://etbe.coker.com.au/2011/11/21/galaxy-xperia-android-network/&quot; rel=&quot;bookmark&quot; title=&quot;Galaxy S vs Xperia X10 and Android Network Access&quot;&gt;Galaxy S vs Xperia X10 and Android Network Access&lt;/a&gt; &lt;small&gt;Galaxy S Review I’ve just been given an indefinite loan...&lt;/small&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://etbe.coker.com.au/2012/01/04/standardising-android/&quot; rel=&quot;bookmark&quot; title=&quot;Standardising Android&quot;&gt;Standardising Android&lt;/a&gt; &lt;small&gt;Don Marti wrote an amusing post about the lack of...&lt;/small&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://etbe.coker.com.au/2011/02/19/on-burning-platforms/&quot; rel=&quot;bookmark&quot; title=&quot;On Burning Platforms&quot;&gt;On Burning Platforms&lt;/a&gt; &lt;small&gt;Nokia is in the news for it’s CEO announcing that...&lt;/small&gt;&lt;/li&gt;
&lt;/ol&gt;</content>
	<author>
	  <name>etbe</name>
	   <uri>http://etbe.coker.com.au</uri> 
	</author>
	<source>
	  <title type="html">etbe - Russell Coker</title>
	  <subtitle type="html">Linux, politics, and other interesting things</subtitle>
	  <link rel="self" href="http://etbe.coker.com.au/feed/"/>
	  <id>http://etbe.coker.com.au</id>  
	</source>
  </entry>
  
</feed>

