<?xml version="1.0"?>
<rss version="2.0">

<channel>
	<title>Planet Debian</title>
	<link>http://planet.debian.org/</link>
	<language>en</language>
	<description>Planet Debian - http://planet.debian.org/</description>


<item>
	<title>Iustin Pop: perf stats for doing nothing</title>
	<guid>http://k1024.org/~iusty/blog/entry/perf-null/</guid>
	<link>http://k1024.org/~iusty/blog/entry/perf-null/</link>
     <description>  &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; </description> 
	<pubDate>Sun, 12 Feb 2012 16:28:30 +0000</pubDate>

</item> 
<item>
	<title>Gregor Herrmann: RC bugs 2012/05-06</title>
	<guid>http://info.comodo.priv.at/blog/archives/2012/02/#e2012-02-12T15_47_40.txt</guid>
	<link>http://info.comodo.priv.at/blog/archives/2012/02/#e2012-02-12T15_47_40.txt</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/gregoa.png&quot; width=&quot;69&quot; height=&quot;85&quot; alt=&quot;&quot; align=&quot;right&quot; style=&quot;float: right;&quot;&gt;  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;#635550&lt;/a&gt; – pmw: &quot;pmw: piuparts: fails to install (update-gsfontmap again)&quot;&lt;br /&gt;send patch to the BTS&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; </description> 
	<pubDate>Sun, 12 Feb 2012 14:47:40 +0000</pubDate>

</item> 
<item>
	<title>Neil Williams: Multi-Arch progress</title>
	<guid>http://www.linux.codehelp.co.uk/serendipity/index.php?/archives/232-guid.html</guid>
	<link>http://www.linux.codehelp.co.uk/serendipity/index.php?/archives/232-Multi-Arch-progress.html</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/codehelp.png&quot; width=&quot;85&quot; height=&quot;113&quot; alt=&quot;&quot; align=&quot;right&quot; style=&quot;float: right;&quot;&gt;  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; </description> 
	<pubDate>Sun, 12 Feb 2012 13:14:29 +0000</pubDate>
  <author>nospam@example.com (Neil Williams)</author>  
</item> 
<item>
	<title>Richard Hartmann: FACTA</title>
	<guid>http://richardhartmann.de/blog/posts/2012/02/FACTA/</guid>
	<link>http://richardhartmann.de/blog/posts/2012/02/FACTA/</link>
     <description>  &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; </description> 
	<pubDate>Sun, 12 Feb 2012 11:49:49 +0000</pubDate>

</item> 
<item>
	<title>Christian Perrier: 2012 update 9 for Debian Installer localization</title>
	<guid>http://www.perrier.eu.org/weblog/bubulle/planet-debian/di-l10n-update-2012-09</guid>
	<link>http://www.perrier.eu.org/weblog/2012/02/12#di-l10n-update-2012-09</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/bubulle.png&quot; width=&quot;69&quot; height=&quot;100&quot; alt=&quot;&quot; align=&quot;right&quot; style=&quot;float: right;&quot;&gt;  &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 </description> 
	<pubDate>Sun, 12 Feb 2012 06:00:00 +0000</pubDate>

</item> 
<item>
	<title>John Goerzen: XMPP for Children</title>
	<guid>http://changelog.complete.org/?p=7414</guid>
	<link>http://changelog.complete.org/archives/7414-xmpp-for-children</link>
     <description>  &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; </description> 
	<pubDate>Sun, 12 Feb 2012 05:02:43 +0000</pubDate>

</item> 
<item>
	<title>Jose Luis Rivas Contreras: Express Sessions with connect-redis + Socket.IO in CoffeeScript</title>
	<guid>http://ghostbar.ath.cx/?p=629</guid>
	<link>http://ghostbar.ath.cx/2012/02/11/express-sessions-with-connect-redis-socket-io-in-coffeescript/</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/ghostbar.png&quot; width=&quot;66&quot; height=&quot;95&quot; alt=&quot;&quot; align=&quot;right&quot; style=&quot;float: right;&quot;&gt;  &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; </description> 
	<pubDate>Sun, 12 Feb 2012 02:14:01 +0000</pubDate>

</item> 
<item>
	<title>Jonathan McDowell: On arranging meetings</title>
	<guid>http://www.earth.li/~noodles/blog/2012/02/on-arranging-meetings.html</guid>
	<link>http://www.earth.li/~noodles/blog/2012/02/on-arranging-meetings.html</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/noodles.png&quot; width=&quot;110&quot; height=&quot;118&quot; alt=&quot;&quot; align=&quot;right&quot; style=&quot;float: right;&quot;&gt;  &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; </description> 
	<pubDate>Sat, 11 Feb 2012 23:44:31 +0000</pubDate>

</item> 
<item>
	<title>Eugene V. Lyubimkin: multiarch (and) hacks</title>
	<guid>http://jackyf.livejournal.com/118415.html</guid>
	<link>http://jackyf.livejournal.com/118415.html</link>
     <description>  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;. </description> 
	<pubDate>Sat, 11 Feb 2012 16:19:02 +0000</pubDate>

</item> 
<item>
	<title>Stefano Zacchiroli: mutt-notmuch 0.2</title>
	<guid>http://upsilon.cc/~zack/blog/posts/2012/02/mutt-notmuch_0.2/</guid>
	<link>http://upsilon.cc/~zack/blog/posts/2012/02/mutt-notmuch_0.2/</link>
     <description>  &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; </description> 
	<pubDate>Sat, 11 Feb 2012 14:15:20 +0000</pubDate>

</item> 
<item>
	<title>Bartosz Fe&amp;#324;ski: It hurts…</title>
	<guid>http://fenski.pl/?p=224</guid>
	<link>http://fenski.pl/2012/02/it-hurts/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=it-hurts</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/fenio.png&quot; width=&quot;94&quot; height=&quot;100&quot; alt=&quot;&quot; align=&quot;right&quot; style=&quot;float: right;&quot;&gt;  &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; </description> 
	<pubDate>Sat, 11 Feb 2012 08:58:19 +0000</pubDate>

</item> 
<item>
	<title>Bartosz Fe&amp;#324;ski: Useful changelog…</title>
	<guid>http://fenski.pl/?p=220</guid>
	<link>http://fenski.pl/2012/02/useful-changelog/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=useful-changelog</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/fenio.png&quot; width=&quot;94&quot; height=&quot;100&quot; alt=&quot;&quot; align=&quot;right&quot; style=&quot;float: right;&quot;&gt;  &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; </description> 
	<pubDate>Sat, 11 Feb 2012 08:49:36 +0000</pubDate>

</item> 
<item>
	<title>Russell Coker: Magic entries for BTRFS and Software RAID</title>
	<guid>http://etbe.coker.com.au/?p=3179</guid>
	<link>http://etbe.coker.com.au/2012/02/11/magic-btrfs-raid/</link>
     <description>  &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; </description> 
	<pubDate>Sat, 11 Feb 2012 07:21:07 +0000</pubDate>

</item> 
<item>
	<title>John Goerzen: Shell Scripts For Preschoolers</title>
	<guid>http://changelog.complete.org/?p=7401</guid>
	<link>http://changelog.complete.org/archives/7401-shell-scripts-for-preschoolers</link>
     <description>  &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; </description> 
	<pubDate>Sat, 11 Feb 2012 04:19:13 +0000</pubDate>

</item> 
<item>
	<title>Bartosz Fe&amp;#324;ski: Livin’ on the edge</title>
	<guid>http://fenski.pl/?p=216</guid>
	<link>http://fenski.pl/2012/02/livin-on-the-edge/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=livin-on-the-edge</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/fenio.png&quot; width=&quot;94&quot; height=&quot;100&quot; alt=&quot;&quot; align=&quot;right&quot; style=&quot;float: right;&quot;&gt;  &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; </description> 
	<pubDate>Fri, 10 Feb 2012 18:26:15 +0000</pubDate>

</item> 
<item>
	<title>Steinar H. Gunderson: Rant: Your custom rounding code is wrong</title>
	<guid>http://blog.sesse.net/blog/tech/2012-02-10-19-20_rant_your_custom_rounding_code_is_wrong.html</guid>
	<link>http://blog.sesse.net/blog/tech/2012-02-10-19-20_rant_your_custom_rounding_code_is_wrong.html</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/sesse.png&quot; width=&quot;74&quot; height=&quot;85&quot; alt=&quot;&quot; align=&quot;right&quot; style=&quot;float: right;&quot;&gt;  &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; </description> 
	<pubDate>Fri, 10 Feb 2012 18:20:00 +0000</pubDate>

</item> 
<item>
	<title>Kees Cook: kvm and product_uuid</title>
	<guid>http://www.outflux.net/blog/?p=584</guid>
	<link>http://www.outflux.net/blog/archives/2012/02/10/kvm-and-product_uuid/</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/kees.png&quot; width=&quot;92&quot; height=&quot;84&quot; alt=&quot;&quot; align=&quot;right&quot; style=&quot;float: right;&quot;&gt;  &lt;p&gt;Quick note: 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; </description> 
	<pubDate>Fri, 10 Feb 2012 18:08:17 +0000</pubDate>

</item> 
<item>
	<title>Rapha&amp;#235;l Hertzog: People behind Debian: Ana Beatriz Guerrero López, member of the Debian KDE team</title>
	<guid>http://raphaelhertzog.com/?p=2528</guid>
	<link>http://raphaelhertzog.com/2012/02/10/people-behind-debian-ana-beatriz-guerrero-lopez-member-of-the-debian-kde-team/</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/hertzog.png&quot; width=&quot;65&quot; height=&quot;93&quot; alt=&quot;&quot; align=&quot;right&quot; style=&quot;float: right;&quot;&gt;  &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;2 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; </description> 
	<pubDate>Fri, 10 Feb 2012 18:00:00 +0000</pubDate>

</item> 
<item>
	<title>Dominique Dumont: Dpkg: edit debian/control description without worrying about leading ‘.’ and ‘ ‘</title>
	<guid>http://ddumont.wordpress.com/?p=408</guid>
	<link>http://ddumont.wordpress.com/2012/02/10/dpkg-edit-debiancontrol-description-without-worrying-about-leading-and/</link>
     <description>  &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; </description> 
	<pubDate>Fri, 10 Feb 2012 13:24:36 +0000</pubDate>

</item> 
<item>
	<title>Alexander Reichle-Schmehl: Release Critical Bug report for Week 06</title>
	<guid>http://blog.schmehl.info/Debian/rc-stats/7.0-wheezy/2012-06</guid>
	<link>http://blog.schmehl.info/Debian/rc-stats/7.0-wheezy/2012-06</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/tolimar.png&quot; width=&quot;65&quot; height=&quot;85&quot; alt=&quot;&quot; align=&quot;right&quot; style=&quot;float: right;&quot;&gt;  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; </description> 
	<pubDate>Fri, 10 Feb 2012 12:01:00 +0000</pubDate>
  <author>alexander@schmehl.info (Alexander Reichle-Schmehl)</author>  
</item> 
<item>
	<title>Michal &amp;#268;iha&amp;#345;: Book about phpMyAdmin 3.4</title>
	<guid>http://blog.cihar.com/archives/2012/02/10/book-about-phpmyadmin-34/?utm_source=rss2</guid>
	<link>http://blog.cihar.com/archives/2012/02/10/book-about-phpmyadmin-34/?utm_source=rss2</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/nijel.png&quot; width=&quot;64&quot; height=&quot;67&quot; alt=&quot;&quot; align=&quot;right&quot; style=&quot;float: right;&quot;&gt;  &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; </description> 
	<pubDate>Fri, 10 Feb 2012 11:00:00 +0000</pubDate>
  <author>michal@cihar.com (Michal Čihař)</author>  
</item> 
<item>
	<title>Russell Coker: Starting with BTRFS</title>
	<guid>http://etbe.coker.com.au/?p=3172</guid>
	<link>http://etbe.coker.com.au/2012/02/10/starting-with-btrfs/</link>
     <description>  &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; </description> 
	<pubDate>Fri, 10 Feb 2012 09:52:16 +0000</pubDate>

</item> 
<item>
	<title>C.J. Adams-Collier: NIST::NVD::Store::SQLite3</title>
	<guid>http://wp.colliertech.org/cj/?p=1153</guid>
	<link>http://wp.colliertech.org/cj/?p=1153</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/cj.png&quot; width=&quot;65&quot; height=&quot;85&quot; alt=&quot;&quot; align=&quot;right&quot; style=&quot;float: right;&quot;&gt;  &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; </description> 
	<pubDate>Fri, 10 Feb 2012 06:54:55 +0000</pubDate>

</item> 
<item>
	<title>James Morrison: Daffodils</title>
	<guid>tag:blogger.com,1999:blog-6893636.post-9090251592445884801</guid>
	<link>http://phython.blogspot.com/2012/02/daffodils.html</link>
     <description>  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; </description> 
	<pubDate>Fri, 10 Feb 2012 05:57:38 +0000</pubDate>
  <author>noreply@blogger.com (James A. Morrison)</author>  
</item> 
<item>
	<title>MJ Ray: Comments with OpenID</title>
	<guid>http://www.news.software.coop/comments-with-openid/1271/</guid>
	<link>http://www.news.software.coop/comments-with-openid/1271/</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/mjray2.png&quot; width=&quot;65&quot; height=&quot;94&quot; alt=&quot;&quot; align=&quot;right&quot; style=&quot;float: right;&quot;&gt;  &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; </description> 
	<pubDate>Fri, 10 Feb 2012 01:08:10 +0000</pubDate>

</item> 
<item>
	<title>Tim Retout: 2012-02-09: Thursday</title>
	<guid>http://retout.co.uk/blog/2012/02/09/2012-02-09</guid>
	<link>http://retout.co.uk/blog/2012/02/09/2012-02-09</link>
     <description>  &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; </description> 
	<pubDate>Thu, 09 Feb 2012 22:57:00 +0000</pubDate>

</item> 
<item>
	<title>Matthew Garrett: Is GPL usage really declining?</title>
	<guid>http://mjg59.dreamwidth.org/10696.html</guid>
	<link>http://mjg59.dreamwidth.org/10696.html</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/mjg59.png&quot; width=&quot;69&quot; height=&quot;85&quot; alt=&quot;&quot; align=&quot;right&quot; style=&quot;float: right;&quot;&gt;  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 </description> 
	<pubDate>Thu, 09 Feb 2012 22:33:55 +0000</pubDate>

</item> 
<item>
	<title>Lior Kaplan: Debian packaging for beginners @ FOSDEM</title>
	<guid>http://liorkaplan.wordpress.com/?p=423</guid>
	<link>http://liorkaplan.wordpress.com/2012/02/09/debian-packaging-for-beginners-fosdem/</link>
     <description>  &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; </description> 
	<pubDate>Thu, 09 Feb 2012 18:31:11 +0000</pubDate>

</item> 
<item>
	<title>Vincent Bernat: Recipes for extending Net-SNMP</title>
	<guid>http://www.luffy.cx/en/blog/2012-extending-netsnmp.html</guid>
	<link>http://vincent.bernat.im/en/blog/2012-extending-netsnmp.html</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/bernat.png&quot; width=&quot;67&quot; height=&quot;82&quot; alt=&quot;&quot; align=&quot;right&quot; style=&quot;float: right;&quot;&gt;  &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; </description> 
	<pubDate>Thu, 09 Feb 2012 18:30:35 +0000</pubDate>

</item> 
<item>
	<title>Michal &amp;#268;iha&amp;#345;: ColorHug with non English locales</title>
	<guid>http://blog.cihar.com/archives/2012/02/09/colorhug-non-english-locales/?utm_source=rss2</guid>
	<link>http://blog.cihar.com/archives/2012/02/09/colorhug-non-english-locales/?utm_source=rss2</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/nijel.png&quot; width=&quot;64&quot; height=&quot;67&quot; alt=&quot;&quot; align=&quot;right&quot; style=&quot;float: right;&quot;&gt;  &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; </description> 
	<pubDate>Thu, 09 Feb 2012 11:00:00 +0000</pubDate>
  <author>michal@cihar.com (Michal Čihař)</author>  
</item> 
<item>
	<title>Bastian Venthur: Can aptitude show older versions of packages if available in /var/cache/apt/archives?</title>
	<guid>http://blog.venthur.de/?p=220</guid>
	<link>http://blog.venthur.de/index.php/2012/02/can-aptitude-show-older-versions-of-packages-if-available-in-varcacheaptarchives/</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/venthur.png&quot; width=&quot;85&quot; height=&quot;115&quot; alt=&quot;&quot; align=&quot;right&quot; style=&quot;float: right;&quot;&gt;  &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; </description> 
	<pubDate>Thu, 09 Feb 2012 10:10:24 +0000</pubDate>

</item> 
<item>
	<title>MJ Ray: SPI Feb 2012</title>
	<guid>http://www.news.software.coop/spi-feb-2012/1236/</guid>
	<link>http://www.news.software.coop/spi-feb-2012/1236/</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/mjray2.png&quot; width=&quot;65&quot; height=&quot;94&quot; alt=&quot;&quot; align=&quot;right&quot; style=&quot;float: right;&quot;&gt;  &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; </description> 
	<pubDate>Thu, 09 Feb 2012 01:47:32 +0000</pubDate>

</item> 
<item>
	<title>Andrew Pollock: [life/americania] On making parking easier</title>
	<guid>http://blog.andrew.net.au/2012/02/08#fastrak_for_parking</guid>
	<link>http://blog.andrew.net.au/2012/02/08#fastrak_for_parking</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/apollock.png&quot; width=&quot;88&quot; height=&quot;126&quot; alt=&quot;&quot; align=&quot;right&quot; style=&quot;float: right;&quot;&gt;  &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; </description> 
	<pubDate>Wed, 08 Feb 2012 22:21:00 +0000</pubDate>

</item> 
<item>
	<title>C.J. Adams-Collier: SELinux on Wheezy</title>
	<guid>http://wp.colliertech.org/cj/?p=1141</guid>
	<link>http://wp.colliertech.org/cj/?p=1141</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/cj.png&quot; width=&quot;65&quot; height=&quot;85&quot; alt=&quot;&quot; align=&quot;right&quot; style=&quot;float: right;&quot;&gt;  &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; </description> 
	<pubDate>Wed, 08 Feb 2012 17:35:01 +0000</pubDate>

</item> 
<item>
	<title>Russell Coker: More DRBD Performance tests</title>
	<guid>http://etbe.coker.com.au/?p=3130</guid>
	<link>http://etbe.coker.com.au/2012/02/08/more-drbd-performance-tests/</link>
     <description>  &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; </description> 
	<pubDate>Wed, 08 Feb 2012 13:24:03 +0000</pubDate>

</item> 
<item>
	<title>Michal &amp;#268;iha&amp;#345;: Migrating code to github</title>
	<guid>http://blog.cihar.com/archives/2012/02/08/migrating-code-github/?utm_source=rss2</guid>
	<link>http://blog.cihar.com/archives/2012/02/08/migrating-code-github/?utm_source=rss2</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/nijel.png&quot; width=&quot;64&quot; height=&quot;67&quot; alt=&quot;&quot; align=&quot;right&quot; style=&quot;float: right;&quot;&gt;  &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; </description> 
	<pubDate>Wed, 08 Feb 2012 11:00:00 +0000</pubDate>
  <author>michal@cihar.com (Michal Čihař)</author>  
</item> 
<item>
	<title>Pietro Abate: Dependency order matters !</title>
	<guid>http://mancoosi.org/395 at http://mancoosi.org/~abate</guid>
	<link>http://mancoosi.org/~abate/dependency-order-matters</link>
     <description>  &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; </description> 
	<pubDate>Wed, 08 Feb 2012 10:34:36 +0000</pubDate>

</item> 
<item>
	<title>Gerfried Fuchs: Squeeze RCs&#39;s Squashing 2012 #2</title>
	<guid>http://rhonda.deb.at/blog/2012/02/08#squeeze-RCs-2012-2</guid>
	<link>http://rhonda.deb.at/blog/2012/02/08#squeeze-RCs-2012-2</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/rhonda.png&quot; width=&quot;89&quot; height=&quot;84&quot; alt=&quot;&quot; align=&quot;right&quot; style=&quot;float: right;&quot;&gt;  &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; </description> 
	<pubDate>Wed, 08 Feb 2012 09:18:00 +0000</pubDate>

</item> 
<item>
	<title>Ian Wienand: Python and --prefix</title>
	<guid>http://feeds.feedburner.com/code/python/python-prefix.html</guid>
	<link>http://www.technovelty.org/code/python/python-prefix.html</link>
     <description>  &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; </description> 
	<pubDate>Wed, 08 Feb 2012 05:16:00 +0000</pubDate>

</item> 
<item>
	<title>Richard Hartmann: FOSDEM 2012, the aftermath</title>
	<guid>http://richardhartmann.de/blog/posts/2012/02/fosdem-2012-the-aftermath/</guid>
	<link>http://richardhartmann.de/blog/posts/2012/02/fosdem-2012-the-aftermath/</link>
     <description>  &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; </description> 
	<pubDate>Tue, 07 Feb 2012 22:20:24 +0000</pubDate>

</item> 
<item>
	<title>Sylvain Beucler: Make sure glue isn&#39;t stripped</title>
	<guid>http://blog.beuc.net/posts/Make_sure_glue_isn__39__t_stripped/</guid>
	<link>http://blog.beuc.net/posts/Make_sure_glue_isn__39__t_stripped/</link>
     <description>  &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; </description> 
	<pubDate>Tue, 07 Feb 2012 21:38:48 +0000</pubDate>

</item> 
<item>
	<title>Martin Pitt: fatrace: report system wide file access events</title>
	<guid>http://www.piware.de/?p=594</guid>
	<link>http://www.piware.de/2012/02/fatrace-report-system-wide-file-access-events/</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/pitti.png&quot; width=&quot;74&quot; height=&quot;98&quot; alt=&quot;&quot; align=&quot;right&quot; style=&quot;float: right;&quot;&gt;  &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; </description> 
	<pubDate>Tue, 07 Feb 2012 19:53:05 +0000</pubDate>

</item> 
<item>
	<title>Michal &amp;#268;iha&amp;#345;: phpMyAdmin is now at github</title>
	<guid>http://blog.cihar.com/archives/2012/02/07/phpmyadmin-now-github/?utm_source=rss2</guid>
	<link>http://blog.cihar.com/archives/2012/02/07/phpmyadmin-now-github/?utm_source=rss2</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/nijel.png&quot; width=&quot;64&quot; height=&quot;67&quot; alt=&quot;&quot; align=&quot;right&quot; style=&quot;float: right;&quot;&gt;  &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; </description> 
	<pubDate>Tue, 07 Feb 2012 14:04:22 +0000</pubDate>
  <author>michal@cihar.com (Michal Čihař)</author>  
</item> 
<item>
	<title>Wouter Verhelst: Video at FOSDEM 2012</title>
	<guid>http://grep.be/blog/en/life/fosdem/2012_video</guid>
	<link>http://grep.be/blog/en/life/fosdem/2012_video</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/wouter3.png&quot; width=&quot;85&quot; height=&quot;80&quot; alt=&quot;&quot; align=&quot;right&quot; style=&quot;float: right;&quot;&gt;  &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; </description> 
	<pubDate>Tue, 07 Feb 2012 13:17:28 +0000</pubDate>
  <author>w@uter.be (Wouter Verhelst)</author>  
</item> 
<item>
	<title>Gerfried Fuchs: Games Screenshot Party</title>
	<guid>http://rhonda.deb.at/blog/2012/02/07#games-screenshot-party</guid>
	<link>http://rhonda.deb.at/blog/2012/02/07#games-screenshot-party</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/rhonda.png&quot; width=&quot;89&quot; height=&quot;84&quot; alt=&quot;&quot; align=&quot;right&quot; style=&quot;float: right;&quot;&gt;  &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; </description> 
	<pubDate>Tue, 07 Feb 2012 10:36:00 +0000</pubDate>

</item> 
<item>
	<title>Martin F. Krafft: Stop ACTA</title>
	<guid>http://madduck.net/blog/2012.02.07:stop-acta/</guid>
	<link>http://madduck.net/blog/2012.02.07:stop-acta/</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/madduck-racingduck.png&quot; width=&quot;85&quot; height=&quot;83&quot; alt=&quot;&quot; align=&quot;right&quot; style=&quot;float: right;&quot;&gt;  &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; </description> 
	<pubDate>Tue, 07 Feb 2012 10:26:26 +0000</pubDate>

</item> 
<item>
	<title>Rapha&amp;#235;l Hertzog: Dpkg with multiarch support available in Debian experimental</title>
	<guid>http://raphaelhertzog.com/?p=2576</guid>
	<link>http://raphaelhertzog.com/2012/02/07/dpkg-with-multiarch-support-available-in-debian-experimental/</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/hertzog.png&quot; width=&quot;65&quot; height=&quot;93&quot; alt=&quot;&quot; align=&quot;right&quot; style=&quot;float: right;&quot;&gt;  &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; </description> 
	<pubDate>Tue, 07 Feb 2012 08:29:23 +0000</pubDate>

</item> 
<item>
	<title>Russell Coker: 5 Principles of Backup Software</title>
	<guid>http://etbe.coker.com.au/?p=3154</guid>
	<link>http://etbe.coker.com.au/2012/02/07/5-principles-backup/</link>
     <description>  &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; </description> 
	<pubDate>Tue, 07 Feb 2012 07:26:04 +0000</pubDate>

</item> 
<item>
	<title>Junichi Uekawa: qemu package is uninstallable in sid, and I think ipxe wants to replace it, not break it.</title>
	<guid>http://www.netfort.gr.jp/~dancer/diary/daily/2012-Feb-7.html.en#2012-Feb-7-11:40:11</guid>
	<link>http://www.netfort.gr.jp/~dancer/diary/daily/2012-Feb-7.html.en#2012-Feb-7-11:40:11</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/dancer.png&quot; width=&quot;75&quot; height=&quot;97&quot; alt=&quot;&quot; align=&quot;right&quot; style=&quot;float: right;&quot;&gt;  qemu package is uninstallable in sid, and I think ipxe wants to replace it, not break it.
	  Hmm.. I don&#39;t understand.
        &lt;p&gt;&lt;/p&gt; </description> 
	<pubDate>Tue, 07 Feb 2012 02:40:11 +0000</pubDate>

</item> 
<item>
	<title>MJ Ray: Stop ACTA Marches Map</title>
	<guid>http://www.news.software.coop/stop-acta-marches-map/1267/</guid>
	<link>http://www.news.software.coop/stop-acta-marches-map/1267/</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/mjray2.png&quot; width=&quot;65&quot; height=&quot;94&quot; alt=&quot;&quot; align=&quot;right&quot; style=&quot;float: right;&quot;&gt;  &lt;p&gt;Further to &lt;a href=&quot;http://www.news.software.coop/two-campaigns-one-spot/1262/&quot;&gt;last week’s blog post that mentioned this Saturday’s (11 Feb) London Stop ACTA march&lt;/a&gt;, there’s a &lt;a href=&quot;http://maps.google.com/maps/ms?msid=211607966723307503454.0004b82851b1992ecada4&amp;amp;msa=0&amp;amp;ll=51.519465%2C-0.135634&amp;amp;spn=0.007571%2C0.021136&quot;&gt;map of anti-ACTA marches&lt;/a&gt; on Google’s website (thanks to Martin Houston for the link).&lt;/p&gt;
&lt;p&gt;There’s also been a new &lt;a href=&quot;http://www.edri.org/ACTAfactsheet&quot;&gt;Anti-Counterfeiting Trade Agreement factsheet from European Digital RIghts (EDRI)&lt;/a&gt;, as apparently there are a lot of misconceptions about ACTA.  I don’t feel that has been helped by some spectacular misdirection from the European Commission in its latest “10 Myths” paper (linked from the EDRI factsheet) which is almost as interesting for what it doesn’t mention (like sneaking ACTA through the parliament fisheries committee), what it misunderstands (like the near-uselessness of a non-commercial exemption to Free and Open Source Software or Creative Commons users), and the way it fails to rebut the final point that ACTA was done this way to avoid the oversight of the World Trade Organisation!  I mean, if they can’t even get it past the usually very pro-enforcement WTO, surely that should tell you something?&lt;/p&gt;
&lt;p&gt;If you can, would you please go along and join your nearest march? Recent marchers seem to have been wearing stylised Guy Fawkes masks, but how would that be viewed in London?&lt;/p&gt; </description> 
	<pubDate>Tue, 07 Feb 2012 00:11:21 +0000</pubDate>

</item> 
<item>
	<title>Jon Dowland: Rip it Up and Start Again</title>
	<guid>http://jmtd.net/log/rip_it_up/</guid>
	<link>http://jmtd.net/log/rip_it_up/</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/jmtd.png&quot; width=&quot;65&quot; height=&quot;85&quot; alt=&quot;&quot; align=&quot;right&quot; style=&quot;float: right;&quot;&gt;  &lt;p&gt;I&#39;ve just — finally — finished reading Simon Reynold&#39;s dense &quot;Rip it Up and
Start Again&quot;: a history of post-punk music from 1978-1984.&lt;/p&gt;

&lt;p&gt;I often think of music journalism in the terms that Zappa famously phrased as
(roughly) &quot;people who can&#39;t write, writing for people who can&#39;t read&quot;. This
book sometimes suffers from that syndrome, of attempting to describe audio in
terms of other senses, which sometimes wanders deep into synesthesia territory,
but for the most part the book is coherent and enjoyable.&lt;/p&gt;

&lt;p&gt;It&#39;s also very &quot;dense&quot;: you leave each page with another half-dozen songs or
bands of music genres to go and investigate. I&#39;m surprised that there isn&#39;t a
commercially-released anthology counterpart to the book.  There are, however,
several playlists, many of which are locked away on Spotify, but via &lt;a href=&quot;http://the-music-snob.net/2009/02/rave-ups-rip-it-up-and-start-again-by-simon-reynolds/&quot;&gt;this
review&lt;/a&gt;
I found &lt;a href=&quot;http://the-music-snob.net/Playlists/PPP1/&quot;&gt;these&lt;/a&gt;
&lt;a href=&quot;http://the-music-snob.net/Playlists/PPP2/&quot;&gt;two&lt;/a&gt; which are web-based (powered
by &lt;a href=&quot;http://opentape.fm/&quot;&gt;opentape&lt;/a&gt;, an interesting piece of AGPL software).&lt;/p&gt;

&lt;p&gt;The book has helped me to discover a lot of music that I hadn&#39;t heard of before
and now love, which I will probably write about in different contexts over the
next few months.&lt;/p&gt; </description> 
	<pubDate>Mon, 06 Feb 2012 21:22:21 +0000</pubDate>

</item> 
<item>
	<title>Lars Wirzenius: FOSDEM 2012</title>
	<guid>http://blog.liw.fi/posts/fosdem-2012/</guid>
	<link>http://blog.liw.fi/posts/fosdem-2012/</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/lars.png&quot; width=&quot;85&quot; height=&quot;100&quot; alt=&quot;&quot; align=&quot;right&quot; style=&quot;float: right;&quot;&gt;  &lt;p&gt;FOSDEM is over. Was fun. Nobody booed too much during my
&lt;a href=&quot;http://liw.fi/rethinking-distro-dev/&quot;&gt;keynote&lt;/a&gt;. I am not putting
up my slides, since they&#39;re useless without the actual talk. However,
I&#39;ve put up the text I prepared for the talk, which is approximately
what I actually talked, in case anyone wants to read rather than
watch the video whenever it gets released.&lt;/p&gt; </description> 
	<pubDate>Mon, 06 Feb 2012 12:03:24 +0000</pubDate>

</item> 
<item>
	<title>Jon Dowland: I Shall Wear Midnight</title>
	<guid>http://jmtd.net/log/midnight/</guid>
	<link>http://jmtd.net/log/midnight/</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/jmtd.png&quot; width=&quot;65&quot; height=&quot;85&quot; alt=&quot;&quot; align=&quot;right&quot; style=&quot;float: right;&quot;&gt;  &lt;p&gt;&lt;em&gt;I Shall Wear Midnight&lt;/em&gt; is the 38th Discworld novel and the fourth following
the story of Tiffany Aching, young witch of the Chalk.&lt;/p&gt;

&lt;p&gt;Reading modern Pratchett, I&#39;m sadly, acutely (and morbidly) aware that, as he
succumbs to Alzheimer&#39;s disease, these are the likely to be some of the last
Discworld novels written. With the last few, this observation has been entirely
external to the novel.  With &lt;em&gt;Midnight&lt;/em&gt;, however, I got the impression that
the awful disease has finally started to affect the prose itself.&lt;/p&gt;

&lt;p&gt;I could just be jumping at shadows, but I got the impression that he repeated
himself a tad more often than usual. With such a long series of books, an
author has the difficult job of balancing new and established readers in the
same text: as such, as an established reader, you get used to having some
back-story with which you must be patient.  This necessary background could
have contributed to the impression of repetition, but I&#39;m fairly sure doesn&#39;t
explain all of it.&lt;/p&gt;

&lt;p&gt;An enjoyable story, and possibly the one to bring the Aching arc to a
conclusion. She stands on her own two feet, proving herself a a capable Witch.
There weren&#39;t any earth-shattering new concepts or new characters or unexplored
areas of the Disc for fans to map out with their minds; non-the-less it was
a satisfying read.&lt;/p&gt; </description> 
	<pubDate>Mon, 06 Feb 2012 11:19:08 +0000</pubDate>

</item> 
<item>
	<title>David Welton: BikeChatter.com for sale</title>
	<guid>urn:uuid:b53dff9c-bb18-4aaf-830d-eea3b9a36a13</guid>
	<link>http://journal.dedasys.com/2012/02/06/bikechatter-com-for-sale</link>
     <description>  &lt;p&gt;
	What with two kids, a new house, and &lt;a href=&quot;http://www.liberwriter.com&quot;&gt;LiberWriter&lt;/a&gt; getting some good traction, I&#39;ve been looking around for things to give to a good home so as to have less stuff to deal with.&lt;/p&gt;
&lt;p&gt;
	So, on the auction block goes &lt;a href=&quot;http://www.BikeChatter.com&quot;&gt;BikeChatter.com&lt;/a&gt; : &lt;a href=&quot;https://flippa.com/2696023-professional-cyclists-on-twitter-plus-2-years-of-history&quot;&gt;https://flippa.com/2696023-professional-cyclists-on-twitter-plus-2-years-of-history&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;margin-left: 40px;&quot;&gt;
	BikeChatter.com is the place to go on the web to follow professional cyclists on twitter.  With 500+ racers, and nearly half a million status updates from racers like Lance Armstrong, Alberto Contador, Mark Cavendish, and many, many more, this site is the best place to find out what&#39;s going on in the world of professional cycling, directly from the participants.&lt;/p&gt;
&lt;p&gt;
	Since I like following the site myself, I really want to see it go to people who will take it and make it even better.&lt;/p&gt; </description> 
	<pubDate>Mon, 06 Feb 2012 11:02:00 +0000</pubDate>

</item> 
<item>
	<title>Michal &amp;#268;iha&amp;#345;: Back from FOSDEM</title>
	<guid>http://blog.cihar.com/archives/2012/02/06/back-fosdem/?utm_source=rss2</guid>
	<link>http://blog.cihar.com/archives/2012/02/06/back-fosdem/?utm_source=rss2</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/nijel.png&quot; width=&quot;64&quot; height=&quot;67&quot; alt=&quot;&quot; align=&quot;right&quot; style=&quot;float: right;&quot;&gt;  &lt;p&gt;Yet another FOSDEM is behind us and I&#39;d like to thank all people organizing it. It was a great event as usual.&lt;/p&gt;
&lt;p&gt;This year there were some changes - the conference grew and there was an extra building. This is great, but on the other side, there were more tracks to follow and occasionally I wanted to be in four places at once, what is of course not manageable.&lt;/p&gt;
&lt;p&gt;Combined with quite freezing weather (well it was still much warmer than it is now in Prague), moving from one side of campus to another was not that comfortable as in last years, but there is not much man can do with that.&lt;/p&gt;
&lt;p&gt;And the biggest change for me - I did not manage beer event this year. We enjoyed great team dinner on Friday evening and while it ended, I was too lazy to move to crowded beer event and rather enjoyed bed in my hotel.&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/phpmyadmin/&quot;&gt;Phpmyadmin&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/06/back-fosdem/#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; </description> 
	<pubDate>Mon, 06 Feb 2012 07:45:15 +0000</pubDate>
  <author>michal@cihar.com (Michal Čihař)</author>  
</item> 
<item>
	<title>Cyril Brulebois: dpkg with multiarch, a new hope</title>
	<guid>http://blog.mraw.org/2012/02/06/dpkg_with_multiarch_redux/</guid>
	<link>http://blog.mraw.org/2012/02/06/dpkg_with_multiarch_redux/</link>
     <description>  &lt;p&gt;&lt;code&gt;dpkg&lt;/code&gt; was uploaded to &lt;code&gt;experimental&lt;/code&gt; a few times lately, let’s sum it
up quickly:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;It started with my
&lt;a href=&quot;http://packages.qa.debian.org/d/dpkg/news/20120131T204855Z.html&quot;&gt;NMU&lt;/a&gt;
on 2012-01-31, since I hadn’t received any reasons not to upload
(except “NACK”, which doesn’t count as such in my book).&lt;/li&gt;
&lt;li&gt;It got
&lt;a href=&quot;http://packages.qa.debian.org/d/dpkg/news/20120201T004745Z.html&quot;&gt;reverted&lt;/a&gt;
a few minutes after that.&lt;/li&gt;
&lt;li&gt;Since this was getting nowhere, the
&lt;a href=&quot;http://www.debian.org/devel/tech-ctte&quot;&gt;Debian Technical Committee&lt;/a&gt;
finally &lt;a href=&quot;http://bugs.debian.org/658341&quot;&gt;got involved&lt;/a&gt;, and voted in
a few days only (wow, thanks!) for an
&lt;a href=&quot;http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=658341#73&quot;&gt;“it’s time to experiment” decision&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;A new
&lt;a href=&quot;http://packages.qa.debian.org/d/dpkg/news/20120206T000222Z.html&quot;&gt;&lt;code&gt;dpkg&lt;/code&gt; upload to &lt;code&gt;experimental&lt;/code&gt;&lt;/a&gt;
finally happened. One shall note the prominent “&lt;strong&gt;This is a WIP
release, command line interfaces &lt;em&gt;will&lt;/em&gt; change.&lt;/strong&gt;” notice.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I’ve updated my previous
&lt;a href=&quot;http://blog.mraw.org/2012/02/01/dpkg_with_multiarch&quot;&gt;dpkg with multiarch&lt;/a&gt; page accordingly,
only keeping the interesting bits.&lt;/p&gt;

&lt;p&gt;Playing around with &lt;code&gt;grep-aptavail -F Multi-Arch $i -sPackage&lt;/code&gt; (with
&lt;code&gt;$i&lt;/code&gt; being &lt;code&gt;same&lt;/code&gt; or &lt;code&gt;foreign&lt;/code&gt;), I found some bugs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://bugs.debian.org/658792&quot;&gt;#658792&lt;/a&gt;: libstdc++6-4.6-dbg: libstdc++.so.6.0.16-gdb.py is not an ELF file&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://bugs.debian.org/658793&quot;&gt;#658793&lt;/a&gt;: libisl-dbg: libisl.so.8.0.0-gdb.py is not an ELF file&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Also, some wishlist bugs (keeping the prominent notice in mind):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://bugs.debian.org/658794&quot;&gt;#658794&lt;/a&gt;: apt-file: Please implement multiarch support&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://bugs.debian.org/658795&quot;&gt;#658795&lt;/a&gt;: reportbug: Please report foreign architectures&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Finally, one dpkg improvement and one possible dpkg bug:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://bugs.debian.org/658812&quot;&gt;#658812&lt;/a&gt;: dpkg: Please add a hint in arch_remove about installed foreign packages&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://bugs.debian.org/658814&quot;&gt;#658814&lt;/a&gt;: dpkg: Inconsistent installation state with buggy multiarchified packages?&lt;/li&gt;
&lt;/ul&gt; </description> 
	<pubDate>Mon, 06 Feb 2012 04:40:00 +0000</pubDate>

</item> 
<item>
	<title>Andrew Cater: Open Advice - Free book detailing lessons for FLOSS</title>
	<guid>tag:blogger.com,1999:blog-8085113335874848981.post-959905615819850030</guid>
	<link>http://flosslinuxblog.blogspot.com/2012/02/open-advice-free-book-detailing-lessons.html</link>
     <description>  A very useful little book from various developers and others: things they wish they&#39;d known before starting out. A very sensible contribution from Debian&#39;s own Evan Prodromou amongst other names I knew and recognised and some interesting folk I&#39;d not heard of.&lt;br /&gt;&lt;br /&gt;http://open-advice.org/Open-Advice.pdf is the downloadable PDF although source and so on is also available. There are likely to be forums for comments and improvements. &lt;br /&gt;&lt;br /&gt;[UPDATE - I&#39;ve just had a go at the training exercises listed at openhatch.org which are linked from the site. Not a bad revision on patching/SVN/git and generally using the tools needed initially to contribute to FLOSS. A good job well done]&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/tracker/8085113335874848981-959905615819850030?l=flosslinuxblog.blogspot.com&quot; alt=&quot;&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;&lt;/div&gt; </description> 
	<pubDate>Sun, 05 Feb 2012 21:31:20 +0000</pubDate>
  <author>noreply@blogger.com (Andrew Cater)</author>  
</item> 
<item>
	<title>Russell Coker: Reliability of RAID</title>
	<guid>http://etbe.coker.com.au/?p=3151</guid>
	<link>http://etbe.coker.com.au/2012/02/06/reliability-raid/</link>
     <description>  &lt;p&gt;&lt;a href=&quot;http://www.zdnet.com/blog/storage/why-raid-6-stops-working-in-2019/805&quot;&gt;ZDNet has an insightful article by Robin Harris predicting the demise of RAID-6 due to the probability of read errors [1]&lt;/a&gt;. Basically as drives get larger the probability of hitting a read error during reconstruction increases and therefore you need to have more redundancy to deal with this. He suggests that as of 2009 drives were too big for a reasonable person to rely on correct reads from all remaining drives after one drive failed (in the case of RAID-5) and that in 2019 there will be a similar issue with RAID-6.&lt;/p&gt;
&lt;p&gt;Of course most systems in the field aren’t using even RAID-6. All the most economical hosting options involve just RAID-1 and RAID-5 is still fairly popular with small servers. With RAID-1 and RAID-5 you have a serious problem when (not if) a disk returns random or outdated data and says that it is correct, you have no way of knowing which of the disks in the set has good data and which has bad data. For RAID-5 it will be theoretically possible to reconstruct the data in some situations by determining which disk should have it’s data discarded to give a result that passes higher level checks (EG fsck or application data consistency), but this is probably only viable in extreme cases (EG one disk returns only corrupt data for all reads).&lt;/p&gt;
&lt;p&gt;For the common case of a RAID-1 array if one disk returns a few bad sectors then probably most people will just hope that it doesn’t hit something important. The case of Linux software RAID-1 is of interest to me because that is used by many of my servers.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://storagemojo.com/2008/02/18/latent-sector-errors-in-disk-drives/&quot;&gt;Robin has also written about some NetApp research into the incidence of read errors which indicates that 8.5% of “consumer” disks had such errors during the 32 month study period [2]&lt;/a&gt;. This is a concern as I run enough RAID-1 systems with “consumer” disks that it is very improbable that I’m not getting such errors. So the question is, how can I discover such errors and fix them?&lt;/p&gt;
&lt;p&gt;In Debian the mdadm package does a monthly scan of all software RAID devices to try and find such inconsistencies, but it doesn’t send an email to alert the sysadmin! &lt;a href=&quot;http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=658701&quot;&gt;I have filed Debian bug #658701 with a patch to make mdadm send email about this&lt;/a&gt;. But this really isn’t going to help a lot as the email will be sent AFTER the kernel has synchronised the data with a 50% chance of overwriting the last copy of good data with the bad data! Also the kernel code doesn’t seem to tell userspace which disk had the wrong data in a 3-disk mirror (and presumably a RAID-6 works in the same way) so even if the data can be corrected I won’t know which disk is failing.&lt;/p&gt;
&lt;p&gt;Another problem with RAID checking is the fact that it will inherently take a long time and in practice can take a lot longer than necessary. For example I run some systems with LVM on RAID-1 on which only a fraction of the VG capacity is used, in one case the kernel will check 2.7TB of RAID even when there’s only 470G in use!&lt;/p&gt;
&lt;h3&gt;The BTRFS Filesystem&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://btrfs.ipv5.de/&quot;&gt;The btrfs Wiki is currently at btrfs.ipv5.de as the kernel.org wikis are apparently still read-only since the compromise [3]&lt;/a&gt;. BTRFS is noteworthy for doing checksums on data and metadata and for having internal support for RAID. So if two disks in a BTRFS RAID-1 disagree then the one with valid checksums will be taken as correct!&lt;/p&gt;
&lt;p&gt;I’ve just done a quick test of this. I created a filesystem with the command “&lt;b&gt;mkfs.btrfs -m raid1 -d raid1 /dev/vg0/raid?&lt;/b&gt;” and copied /dev/urandom to it until it was full. I then used dd to copy /dev/urandom to some parts of /dev/vg0/raidb while reading files from the mounted filesystem – that worked correctly although I was disappointed that it didn’t report any errors, I had hoped that it would read half the data from each device and fix some errors on the fly. Then I ran the command “&lt;b&gt;btrfs scrub start .&lt;/b&gt;” and it gave lots of verbose errors in the kernel message log telling me which device had errors and where the errors are. I was a little disappointed that the command “&lt;b&gt;btrfs scrub status .&lt;/b&gt;” just gave me a count of the corrected errors and didn’t mention which device had the errors.&lt;/p&gt;
&lt;p&gt;It seems to me that BTRFS is going to be a much better option than Linux software RAID once it is stable enough to use in production. I am considering upgrading one of my less important servers to Debian/Unstable to test out BTRFS in this configuration.&lt;/p&gt;
&lt;p&gt;BTRFS is rumored to have performance problems, I will test this but don’t have time to do so right now. Anyway I’m not always particularly concerned about performance, I have some systems where reliability is important enough to justify a performance loss.&lt;/p&gt;
&lt;h3&gt;BTRFS and Xen&lt;/h3&gt;
&lt;p&gt;The system with the 2.7TB RAID-1 is a Xen server and LVM volumes on that RAID are used for the block devices of the Xen DomUs. It seems obvious that I could create a single BTRFS filesystem for such a machine that uses both disks in a RAID-1 configuration and then use files on the BTRFS filesystem for Xen block devices. But that would give a lot of overhead of having a filesystem within a filesystem. So I am considering using two LVM volume groups, one for each disk. Then for each DomU which does anything disk intensive I can export two LVs, one from each physical disk and then run BTRFS inside the DomU. The down-side of this is that each DomU will need to scrub the devices and monitor the kernel log for checksum errors. Among other things I will have to back-port the BTRFS tools to CentOS 4.&lt;/p&gt;
&lt;p&gt;This will be more difficult to manage than just having an LVM VG running on a RAID-1 array and giving each DomU a couple of LVs for storage.&lt;/p&gt;
&lt;h3&gt;BTRFS and DRBD&lt;/h3&gt;
&lt;p&gt;The combination of BTRFS RAID-1 and DRBD is going to be a difficult one. The obvious way of doing it would be to run DRBD over loopback devices that use large files on a BTRFS filesystem. That gives the overhead of a filesystem in a filesystem as well as the DRBD overhead.&lt;/p&gt;
&lt;p&gt;It would be nice if BTRFS supported more than two copies of mirrored data. Then instead of DRBD over RAID-1 I could have two servers that each have two devices exported via NBD and BTRFS could store the data on all four devices. With that configuration I could lose an entire server and get a read error without losing any data!&lt;/p&gt;
&lt;h3&gt;Comparing Risks&lt;/h3&gt;
&lt;p&gt;I don’t want to use BTRFS in production now because of the risk of bugs. While it’s unlikely to have really serious bugs it’s theoretically possible that as bug could deny access to data until kernel code is fixed and it’s also possible (although less likely) that a bug could result in data being overwritten such that it can never be recovered. But for the current configuration (Ext4 on Linux software RAID-1) it’s almost certain that I will lose small amounts of data and it’s most probable that I have silently lost data on many occasions without realising.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;[1]&lt;a href=&quot;http://www.zdnet.com/blog/storage/why-raid-6-stops-working-in-2019/805&quot;&gt; http://www.zdnet.com/blog/storage/why-raid-6-stops-working-in-2019/805&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[2]&lt;a href=&quot;http://storagemojo.com/2008/02/18/latent-sector-errors-in-disk-drives/&quot;&gt; http://storagemojo.com/2008/02/18/latent-sector-errors-in-disk-drives/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[3]&lt;a href=&quot;http://btrfs.ipv5.de/&quot;&gt; http://btrfs.ipv5.de/&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/2008/10/14/some-raid-issues/&quot; rel=&quot;bookmark&quot; title=&quot;Some RAID Issues&quot;&gt;Some RAID Issues&lt;/a&gt; &lt;small&gt;I just read an interesting paper titled An Analysis of...&lt;/small&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://etbe.coker.com.au/2008/06/13/ecc-ram-vs-raid/&quot; rel=&quot;bookmark&quot; title=&quot;ECC RAM is more useful than RAID&quot;&gt;ECC RAM is more useful than RAID&lt;/a&gt; &lt;small&gt;A common myth in the computer industry seems to be...&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; </description> 
	<pubDate>Sun, 05 Feb 2012 14:46:36 +0000</pubDate>

</item> 
<item>
	<title>Steve Kemp: Some domains just don&#39;t learn</title>
	<guid>http://blog.steve.org.uk/some_domains_just_don_t_learn.html</guid>
	<link>http://blog.steve.org.uk/some_domains_just_don_t_learn.html</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/skx.png&quot; width=&quot;76&quot; height=&quot;105&quot; alt=&quot;&quot; align=&quot;right&quot; style=&quot;float: right;&quot;&gt;  &lt;p&gt;For the past few years the &lt;a href=&quot;http://www.steve.org.uk/Software/ms-lite/&quot;&gt;anti-spam system I run&lt;/a&gt; has been based on a simplified version of something I previously ran commercially.&lt;/p&gt;
&lt;p&gt;Although the code is similar in intent there were both explicit feature removals, and simplifications made.&lt;/p&gt;
&lt;p&gt;Last month I &lt;a href=&quot;http://repository.steve.org.uk/cgi-bin/hgwebdir.cgi/ms-lite/rev/d8f232f37d88&quot;&gt;re-implimented domain-blacklisting&lt;/a&gt; - because a single company keeps ignoring requests to remove me.&lt;/p&gt;
&lt;p&gt;So LinkedIn.com if you&#39;re reading this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I&#39;ve never had an account on your servers.&lt;/li&gt;
&lt;li&gt;I find your junk mail annoying.&lt;/li&gt;
&lt;li&gt;I suspect I&#39;ll join your site/service when hell freezes over.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&#39;ve also implemented TLD-blacklisting which has been useful.&lt;/p&gt;
&lt;blockquote&gt;
 &lt;p&gt;TLD-blacklisting in my world is not about blocking mail from foo@bar.ph (whether in the envelope sender, or the from: header), instead it is about matching the reverse DNS of the connecting client.&lt;/p&gt;
 &lt;p&gt;If I recieve a connection from 1.2.3.4 and the reverse DNS of that IP address matches, say, /\.sa$/i then I default to denying it.&lt;/p&gt;
 &lt;p&gt;My real list is longer, and handled via files:&lt;/p&gt;
&lt;pre&gt;steve@steve:~$ ls /srv/_global_/blacklisted/tld/ -C
ar  br  cn  eg  hr  in  kr  lv  mn  np  ph  ro  sg  tg  ua  ve  zw
aw  cc  cy  gm  hu  is  kz  ma  my  nu  pk  rs  sk  th  ug  vn
be  ch  cz  gr  id  it  lk  md  mz  nz  pl  ru  su  tr  uy  ws
bg  cl  ec  hk  il  ke  lt  mk  no  om  pt  sa  sy  tw  uz  za
&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;On average I&#39;m rejecting about 2500 messagse a day at SMTP-time, and 30 messages, or so, hit my SPAM folder after being filtered with CRM114 after being accepted for delivery.  (They are largely from @hotmail and @yahoo, along with random compromised machines.  The amount of times I see a single mail from a host with RDNS mysql.example.org is staggering.).&lt;/p&gt;
&lt;p&gt;(Still looking forward to the development of &lt;a href=&quot;https://github.com/baudehlo/Haraka&quot;&gt;Haraka&lt;/a&gt;, a node.js version of qpsmtpd.)&lt;/p&gt;
&lt;p&gt;ObQuote: &quot;Mr. Mystery Guest? Are you still there? &quot; - Die Hard&lt;/p&gt; </description> 
	<pubDate>Sun, 05 Feb 2012 13:24:44 +0000</pubDate>

</item> 
<item>
	<title>Petter Reinholdtsen: Saving power with Debian Edu / Skolelinux using shutdown-at-night</title>
	<guid>http://people.skolelinux.org/pere/blog/Saving_power_with_Debian_Edu___Skolelinux_using_shutdown_at_night.html</guid>
	<link>http://people.skolelinux.org/pere/blog/Saving_power_with_Debian_Edu___Skolelinux_using_shutdown_at_night.html</link>
     <description>  &lt;p&gt;Since the Lenny version of
&lt;a href=&quot;http://www.skolelinux.org/&quot;&gt;Debian Edu / Skolelinux&lt;/a&gt;, a
feature to save power have been included.  It is as simple as it is
practical: Shut down unused clients at night, and turn them on again
in the morning.  This is done using the
&lt;a href=&quot;http://packages.qa.debian.org/s/shutdown-at-night.html&quot;&gt;shutdown-at-night&lt;/a&gt; Debian package.&lt;/p&gt;

&lt;p&gt;To enable this feature on a client, the machine need to be added to
the netgroup shutdown-at-night-hosts.  For Debian Edu, this is done in
LDAP, and once this is in place, the machine in question will check
every hour from 16:00 until 06:00 to see if the machine is unused, and
shut it down if it is.  If the hardware in question is supported by
the
&lt;a href=&quot;http://packages.qa.debian.org/n/nvram-wakeup.html&quot;&gt;nvram-wakeup&lt;/a&gt;
package, the BIOS is told to turn the machine back on around 07:00 +-
10 minutes.  If this isn&#39;t working, one can configure wake-on-lan to
try to turn on the client.  The wake-on-lan option is only documented
and not enabled by default in Debian Edu.&lt;/p&gt;

&lt;p&gt;It is important to not turn all machines on at once, as this can
blow a fuse if several computers are connected to the same fuse like
the common setup for a classroom.  The nvram-wakeup method only work
for machines with a functioning hardware/BIOS clock.  I&#39;ve seen old
machines where the BIOS battery were dead and the hardware clock were
starting from 0 (or was it 1990?) every boot.  If you have one of
those, you have to turn on the computer manually.&lt;/p&gt;

&lt;p&gt;The shutdown-at-night package is completely self contained, and can
also be used outside the Debian Edu environment.  For those without a
central LDAP server with netgroups, one can instead touch the file
&lt;tt&gt;/etc/shutdown-at-night/shutdown-at-night&lt;/tt&gt; to enable it.
Perhaps you too can use it to save some power?&lt;/p&gt; </description> 
	<pubDate>Sun, 05 Feb 2012 08:45:00 +0000</pubDate>

</item> 
</channel>
</rss>

