<?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>Gregor Herrmann: RC bugs 2017/30-52</title>
	<guid>https://info.comodo.priv.at/blog/rc_bugs_2017_30_52.html</guid>
	<link>https://info.comodo.priv.at/blog/rc_bugs_2017_30_52.html</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;  &lt;p&gt;
for some reason I&#39;m still keeping track of the release-critical bugs I
touch, even though it&#39;s a long time since I systematically try to fix them.
&amp;amp; since I have the list, I thought I might as well post it here, for the
third (&amp;amp; last) time this year:
&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/720666&quot;&gt;&lt;del&gt;#720666&lt;/del&gt;&lt;/a&gt; – src:libxml-validate-perl: &quot;libxml-validate-perl: FTBFS: POD coverage test failure&quot;&lt;br /&gt;don&#39;t run POD tests (pkg-perl)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/810655&quot;&gt;&lt;del&gt;#810655&lt;/del&gt;&lt;/a&gt; – libembperl-perl: &quot;libembperl-perl: postinst fails when libapache2-mod-perl2 is not installed&quot;&lt;br /&gt;upload backported fix to jessie&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/825011&quot;&gt;&lt;del&gt;#825011&lt;/del&gt;&lt;/a&gt; – libdata-alias-perl: &quot;libdata-alias-perl: FTBFS with Perl 5.24: undefined symbol: LEAVESUB&quot;&lt;br /&gt;upload new upstream release (pkg-perl)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/826465&quot;&gt;&lt;del&gt;#826465&lt;/del&gt;&lt;/a&gt; – texlive-latex-recommended: &quot;texlive-latex-recommended: Unescaped left brace in regex is deprecated&quot;&lt;br /&gt;propose patch&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/851506&quot;&gt;&lt;del&gt;#851506&lt;/del&gt;&lt;/a&gt; – cpanminus: &quot;cpanminus: major parts of upstream sources with compressed white-space&quot;&lt;br /&gt;take tarball from github (pkg-perl)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/853490&quot;&gt;&lt;del&gt;#853490&lt;/del&gt;&lt;/a&gt; – src:libdomain-publicsuffix-perl: &quot;libdomain-publicsuffix-perl: ftbfs with GCC-7&quot;&lt;br /&gt;apply patch from ubuntu (pkg-perl)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/853499&quot;&gt;&lt;del&gt;#853499&lt;/del&gt;&lt;/a&gt; – src:libopengl-perl: &quot;libopengl-perl: ftbfs with GCC-7&quot;&lt;br /&gt;new upstream release (pkg-perl)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/867514&quot;&gt;&lt;del&gt;#867514&lt;/del&gt;&lt;/a&gt; – libsolv: &quot;libsolv: find_package called with invalid argument &quot;2.7.13+&quot;&quot;&lt;br /&gt;propose a patch, later upload to DELAYED/1, then patch included in a maintainer upload&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/869357&quot;&gt;&lt;del&gt;#869357&lt;/del&gt;&lt;/a&gt; – src:libdigest-whirlpool-perl: &quot;libdigest-whirlpool-perl FTBFS on s390x: test failure&quot;&lt;br /&gt;upload to DELAYED/5&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/869360&quot;&gt;&lt;del&gt;#869360&lt;/del&gt;&lt;/a&gt; – slic3r: &quot;slic3r: missing dependency on perlapi-*&quot;&lt;br /&gt;upload to DELAYED/5&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/869576&quot;&gt;&lt;del&gt;#869576&lt;/del&gt;&lt;/a&gt; – src:gimp-texturize: &quot;gimp-texturize: Local copy of intltool-* fails with perl 5.26&quot;&lt;br /&gt;add patch, QA upload&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/869578&quot;&gt;&lt;del&gt;#869578&lt;/del&gt;&lt;/a&gt; – src:gdmap: &quot;gdmap: Local copy of intltool-* fails with perl 5.26&quot;&lt;br /&gt;provide a patch&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/869579&quot;&gt;&lt;del&gt;#869579&lt;/del&gt;&lt;/a&gt; – src:granule: &quot;granule: Local copy of intltool-* fails with perl 5.26&quot;&lt;br /&gt;add patch, QA upload&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/869580&quot;&gt;&lt;del&gt;#869580&lt;/del&gt;&lt;/a&gt; – src:teg: &quot;teg: Local copy of intltool-* fails with perl 5.26&quot;&lt;br /&gt;provide a patch&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/869583&quot;&gt;&lt;del&gt;#869583&lt;/del&gt;&lt;/a&gt; – src:gnome-specimen: &quot;gnome-specimen: Local copy of intltool-* fails with perl 5.26&quot;&lt;br /&gt;provide a patch&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/869884&quot;&gt;&lt;del&gt;#869884&lt;/del&gt;&lt;/a&gt; – src:chemical-mime-data: &quot;chemical-mime-data: Local copy of intltool-* fails with perl 5.26&quot;&lt;br /&gt;provide a patch, upload to DELAYED/5 later&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/870213&quot;&gt;&lt;del&gt;#870213&lt;/del&gt;&lt;/a&gt; – src:pajeng: &quot;pajeng FTBFS with perl 5.26&quot;&lt;br /&gt;provide a patch, uploaded by maintainer&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/870821&quot;&gt;&lt;del&gt;#870821&lt;/del&gt;&lt;/a&gt; – src:esys-particle: &quot;esys-particle FTBFS with perl 5.26&quot;&lt;br /&gt;propose patch&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/870832&quot;&gt;&lt;del&gt;#870832&lt;/del&gt;&lt;/a&gt; – src:libmath-prime-util-gmp-perl: &quot;libmath-prime-util-gmp-perl FTBFS on big endian: Failed 2/31 test programs. 8/2885 subtests failed.&quot;&lt;br /&gt;upload new upstream release (pkg-perl)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/871059&quot;&gt;&lt;del&gt;#871059&lt;/del&gt;&lt;/a&gt; – src:fltk1.3: &quot;fltk1.3: FTBFS: Unescaped left brace in regex is illegal here in regex; marked by &amp;lt;-- HERE in m/(\${ &amp;lt;-- HERE _IMPORT_PREFIX}/lib)(?!/x86_64-linux-gnu)/ at debian/fix-fltk-targets-noconfig line 6, &amp;lt;&amp;gt; line 1.&quot;&lt;br /&gt;propose patch&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/871159&quot;&gt;&lt;del&gt;#871159&lt;/del&gt;&lt;/a&gt; – texlive-extra-utils: &quot;pstoedit: FTBFS: Unescaped left brace in regex is illegal here in regex; marked by &amp;lt;-- HERE in m/\\([a-zA-Z]+){([^}]*)}{ &amp;lt;-- HERE ([^}]*)}/ at /usr/bin/latex2man line 1327.&quot;&lt;br /&gt;propose patch&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/871307&quot;&gt;&lt;del&gt;#871307&lt;/del&gt;&lt;/a&gt; – libmimetic0v5: &quot;libmimetic0v5: requires rebuild against GCC 7 and symbols/shlibs bump&quot;&lt;br /&gt;implement reporter&#39;s recipe (thanks!)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/871335&quot;&gt;&lt;del&gt;#871335&lt;/del&gt;&lt;/a&gt; – src:smlnj: &quot;smlnj: FTBFS: Unescaped left brace in regex is illegal here in regex; marked by &amp;lt;-- HERE in m/~?\\begin{ &amp;lt;-- HERE (small|Bold|Italics|Emph|address|quotation|center|enumerate|itemize|description|boxit|Boxit|abstract|Figure)}/ at mltex2html line 1411, &amp;lt;DOCUMENT&amp;gt; line 1.&quot;&lt;br /&gt;extend existing patch, QA upload&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/871349&quot;&gt;&lt;del&gt;#871349&lt;/del&gt;&lt;/a&gt; – src:ispell-uk: &quot;ispell-uk: FTBFS: The encoding pragma is no longer supported at ../../bin/verb_reverse.pl line 12.&quot;&lt;br /&gt;propose patch&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/871357&quot;&gt;&lt;del&gt;#871357&lt;/del&gt;&lt;/a&gt; – src:packaging-tutorial: &quot;packaging-tutorial: FTBFS: Unescaped left brace in regex is illegal here in regex; marked by &amp;lt;-- HERE in m/\\end{ &amp;lt;-- HERE document}/ at /usr/share/perl5/Locale/Po4a/TransTractor.pm line 643.&quot;&lt;br /&gt;analyze and propose a possible patch&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/871367&quot;&gt;&lt;del&gt;#871367&lt;/del&gt;&lt;/a&gt; – src:fftw: &quot;fftw: FTBFS: Unescaped left brace in regex is deprecated here (and will be fatal in Perl 5.30), passed through in regex; marked by &amp;lt;-- HERE in m/\@(\w+){ &amp;lt;-- HERE ([^\{\}]+)}/ at texi2html line 1771.&quot;&lt;br /&gt;propose patch&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/871818&quot;&gt;&lt;del&gt;#871818&lt;/del&gt;&lt;/a&gt; – src:debian-zh-faq: &quot;debian-zh-faq FTBFS with perl 5.26&quot;&lt;br /&gt;propose patch&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/872275&quot;&gt;&lt;del&gt;#872275&lt;/del&gt;&lt;/a&gt; – slic3r-prusa: &quot;slic3r-prusa: Loadable library and perl binary mismatch&quot;&lt;br /&gt;propose patch&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/873697&quot;&gt;&lt;del&gt;#873697&lt;/del&gt;&lt;/a&gt; – src:libtext-bibtex-perl: &quot;libtext-bibtex-perl FTBFS on arm*/ppc64el: t/unlimited.t (Wstat: 11 Tests: 4 Failed: 0)&quot;&lt;br /&gt;upload new upstream release prepared by smash (pkg-perl)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/875627&quot;&gt;&lt;del&gt;#875627&lt;/del&gt;&lt;/a&gt; – libauthen-captcha-perl: &quot;libauthen-captcha-perl: Random failure due to bad images&quot;&lt;br /&gt;upload package with fixed ong prepared by xguimard (pkg-perl)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/877841&quot;&gt;&lt;del&gt;#877841&lt;/del&gt;&lt;/a&gt; – src:libxml-compile-wsdl11-perl: &quot;libxml-compile-wsdl11-perl: FTBFS Can&#39;t locate XML/Compile/Tester.pm in @INC&quot;&lt;br /&gt;add missing build dependency (pkg-perl)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/877842&quot;&gt;&lt;del&gt;#877842&lt;/del&gt;&lt;/a&gt; – src:libxml-compile-soap-perl: &quot;libxml-compile-soap-perl: FTBFS: Can&#39;t locate Test/Deep.pm in @INC&quot;&lt;br /&gt;add missing build dependencies (pkg-perl)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/880777&quot;&gt;&lt;del&gt;#880777&lt;/del&gt;&lt;/a&gt; – src:pdl: &quot;pdl build depends on removed libgd2*-dev provides&quot;&lt;br /&gt;update build dependency (pkg-perl)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/880787&quot;&gt;&lt;del&gt;#880787&lt;/del&gt;&lt;/a&gt; – src:libhtml-formatexternal-perl: &quot;libhtml-formatexternal-perl build depends on removed transitional package lynx-cur&quot;&lt;br /&gt;update build dependency (pkg-perl)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/880843&quot;&gt;&lt;del&gt;#880843&lt;/del&gt;&lt;/a&gt; – src:libperl-apireference-perl: &quot;libperl-apireference-perl FTBFS with perl 5.26.1&quot;&lt;br /&gt;change handling of 5.26.1 API (pkg-perl)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/881058&quot;&gt;&lt;del&gt;#881058&lt;/del&gt;&lt;/a&gt; – gwhois: &quot;gwhois: please switch Depends from lynx-cur to lynx&quot;&lt;br /&gt;update dependency, upload to DELAYED/15&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/882264&quot;&gt;&lt;del&gt;#882264&lt;/del&gt;&lt;/a&gt; – src:libtemplate-declare-perl: &quot;libtemplate-declare-perl FTBFS with libhtml-lint-perl 2.26+dfsg-1&quot;&lt;br /&gt;add patch for compatibility with newer HTML::Lint (pkg-perl)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/883673&quot;&gt;&lt;del&gt;#883673&lt;/del&gt;&lt;/a&gt; – src:libdevice-cdio-perl: &quot;fix build with libcdio 1.0&quot;&lt;br /&gt;add patch from doko (pkg-perl)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/885541&quot;&gt;&lt;del&gt;#885541&lt;/del&gt;&lt;/a&gt; – libtest2-suite-perl: &quot;libtest2-suite-perl: file conflicts with libtest2-asyncsubtest-perl and libtest2-workflow-perl&quot;&lt;br /&gt;add Breaks/Replaces/Provides (pkg-perl)&lt;/li&gt;
&lt;/ul&gt; </description> 
	<pubDate>Sun, 31 Dec 2017 01:04:00 +0000</pubDate>

</item> 
<item>
	<title>Chris Lamb: Favourite books of 2017</title>
	<guid>https://chris-lamb.co.uk/posts/favourite-books-of-2017</guid>
	<link>https://chris-lamb.co.uk/posts/favourite-books-of-2017</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/lamby.png&quot; width=&quot;70&quot; height=&quot;87&quot; alt=&quot;&quot; align=&quot;right&quot; style=&quot;float: right;&quot;&gt;  &lt;p&gt;Whilst I managed to read just over fifty books in 2017 (down from &lt;a class=&quot;reference external&quot; href=&quot;https://chris-lamb.co.uk/posts/favourite-books-of-2016&quot;&gt;sixty in
2016&lt;/a&gt;) here are ten
of my favourites, in no particular order.&lt;/p&gt;
&lt;p&gt;Disappointments this year included Doug Stanhope&#39;s &lt;a class=&quot;reference external&quot; href=&quot;https://chris-lamb.co.uk/azn/B072F16N6Z&quot;&gt;This Is Not Fame&lt;/a&gt;, a barely coherent collection of bar stories that felt
especially weak after &lt;a class=&quot;reference external&quot; href=&quot;https://chris-lamb.co.uk/azn/B01FGAEOQ4&quot;&gt;Digging Up Mother&lt;/a&gt;, but I might still
listen to the audiobook as I would enjoy his extemporisation on a phone book.
&lt;a class=&quot;reference external&quot; href=&quot;https://chris-lamb.co.uk/azn/B005CVWWJY&quot;&gt;Ready Player One&lt;/a&gt; left me feeling contemptuous, as did
Charles Stross&#39; &lt;a class=&quot;reference external&quot; href=&quot;https://chris-lamb.co.uk/azn/B00486U23M&quot;&gt;The Atrocity Archives&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The worst book I finished this year was Adam Mitzner&#39;s &lt;a class=&quot;reference external&quot; href=&quot;https://chris-lamb.co.uk/azn/B01M8PI4IG&quot;&gt;Dead Certain&lt;/a&gt;, beating Dan Brown&#39;s &lt;a class=&quot;reference external&quot; href=&quot;https://chris-lamb.co.uk/azn/B01LXCD7FU&quot;&gt;Origin&lt;/a&gt;, a poor Barcelona tourist guide at best.&lt;/p&gt;
&lt;div class=&quot;line-block&quot;&gt;
&lt;div class=&quot;line&quot;&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;line&quot;&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;line&quot;&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;line&quot;&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;line&quot;&gt;&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;a class=&quot;reference external image-reference&quot; href=&quot;https://chris-lamb.co.uk/azn/B005DI9SKW&quot;&gt;&lt;img alt=&quot;https://images-eu.ssl-images-amazon.com/images/P/B005DI9SKW.01._PC__.jpg&quot; class=&quot;align-right&quot; src=&quot;https://images-eu.ssl-images-amazon.com/images/P/B005DI9SKW.01._PC__.jpg&quot; /&gt;&lt;/a&gt;
&lt;p&gt;&lt;a class=&quot;reference external&quot; href=&quot;https://chris-lamb.co.uk/azn/B005DI9SKW&quot;&gt;&lt;strong&gt;Year of Wonders&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Geraldine Brooks&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Teased by Hilary Mantel&#39;s &lt;a class=&quot;reference external&quot; href=&quot;http://www.bbc.co.uk/programmes/p04rkn39&quot;&gt;BBC Reith Lecture appearances&lt;/a&gt; and not content with her
&lt;a class=&quot;reference external&quot; href=&quot;https://chris-lamb.co.uk/azn/B00JZBTR4K&quot;&gt;short story collection&lt;/a&gt;, I looked to others
for my fill of historical fiction whilst awaiting the &lt;a class=&quot;reference external&quot; href=&quot;https://en.wikipedia.org/wiki/The_Mirror_and_the_Light&quot;&gt;final chapter in the Wolf Hall trilogy&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This book, &lt;em&gt;Year of Wonders&lt;/em&gt;, subtitled &lt;em&gt;A Novel of the Plague&lt;/em&gt;, is written from point of
view of Anna Frith, recounting what she and her Derbyshire village experience
when they nobly quarantine themselves in order to prevent the disease from spreading
further.&lt;/p&gt;
&lt;p&gt;I found it initially difficult to get to grips with the artificially aged
vocabulary — and I hate to be &quot;that guy&quot; — but do persist until the chapter where
Anna takes over the village apothecary.&lt;/p&gt;
&lt;hr class=&quot;docutils&quot; /&gt;
&lt;a class=&quot;reference external image-reference&quot; href=&quot;https://chris-lamb.co.uk/azn/B072P185BN&quot;&gt;&lt;img alt=&quot;https://images-eu.ssl-images-amazon.com/images/P/B072P185BN.01._PC__.jpg&quot; class=&quot;align-right&quot; src=&quot;https://images-eu.ssl-images-amazon.com/images/P/B072P185BN.01._PC__.jpg&quot; /&gt;&lt;/a&gt;
&lt;p&gt;&lt;a class=&quot;reference external&quot; href=&quot;https://chris-lamb.co.uk/azn/B072P185BN&quot;&gt;&lt;strong&gt;The Second World Wars&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Victor Davis Hanson&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;If the pluralisation of &quot;Wars&quot; is an affectation, it
certainly is an accurate one: whilst we might consider the Second World War to be a
unified conflict today, Hanson reasonably points out that this is a &lt;em&gt;post hoc&lt;/em&gt;
simplification of different conflicts from the late-1910s through 1945.&lt;/p&gt;
&lt;p&gt;Unlike most books that attempt to cover the entirety of the war, this book is
organised by topic instead of chronology. For example, there are two or three
adjacent chapters comparing and contrasting naval strategy before moving onto
land armies, constrasting and comparing Germany&#39;s eastern and western fronts,
etc. This approach leads to a readable and surprisingly gripping book despite
its lengthy 720 pages.&lt;/p&gt;
&lt;p&gt;Particular attention is given to the interplay between the various armed
services and how this tended to lead to overall strategic victory. This, as
well as the economics of materiel, simple rates-of-replacement, combined with
the irrationality and caprice of the Axis would be an fair summary of the
author&#39;s general thesis — this is no &lt;a class=&quot;reference external&quot; href=&quot;https://www.youtube.com/watch?v=6F13PqNlP7c&quot;&gt;Churchill, Hitler &amp;amp; The Unnecessary War&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Hanson is not afraid to ask &quot;what if&quot; questions but only where they provide
meaningful explanation or provide deeper rationale rather than as an
indulgent flight of fancy. His answers to such questions are invariably that
some outcome would have come about.&lt;/p&gt;
&lt;p&gt;Whilst the author is a US citizen, he does not spare his homeland from
criticism, but where Hanson&#39;s background as classical-era historian lets him
down is in contrived comparisons to the &lt;a class=&quot;reference external&quot; href=&quot;https://en.wikipedia.org/wiki/Peloponnesian_War&quot;&gt;Peloponnesian War&lt;/a&gt; and other ancient
conflicts. His Napoleonic references do not feel as forced, especially due to
Hitler&#39;s own obsessions. Recommended.&lt;/p&gt;
&lt;hr class=&quot;docutils&quot; /&gt;
&lt;a class=&quot;reference external image-reference&quot; href=&quot;https://chris-lamb.co.uk/azn/B0711Y3BVG&quot;&gt;&lt;img alt=&quot;https://images-eu.ssl-images-amazon.com/images/P/B0711Y3BVG.01._PC__.jpg&quot; class=&quot;align-right&quot; src=&quot;https://images-eu.ssl-images-amazon.com/images/P/B0711Y3BVG.01._PC__.jpg&quot; /&gt;&lt;/a&gt;
&lt;p&gt;&lt;a class=&quot;reference external&quot; href=&quot;https://chris-lamb.co.uk/azn/B0711Y3BVG&quot;&gt;&lt;strong&gt;Everybody Lies&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Seth Stephens-Davidowitz&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Vying for the role as the &lt;a class=&quot;reference external&quot; href=&quot;https://chris-lamb.co.uk/azn/0141019018&quot;&gt;Freakonomics&lt;/a&gt; for the &quot;Big Data&quot;
generation, &lt;em&gt;Everybody Lies&lt;/em&gt; is essentially a compendium of counter-arguments, refuting
commonly-held beliefs about the internet and society in general based on
large-scale observations. For example:&lt;/p&gt;
&lt;blockquote&gt;
Google searches reflecting anxiety—such as &quot;anxiety symptoms&quot; or &quot;anxiety help&quot;—tend
to be higher in places with lower levels of education, lower median incomes
and where a larger portion of the population lives in rural areas. There are
higher search rates for anxiety in rural, upstate New York than in New York
City.&lt;/blockquote&gt;
&lt;p&gt;Or:&lt;/p&gt;
&lt;blockquote&gt;
On weekends with a popular violent movie when millions of Americans were
exposed to images of men killing other men, crime dropped. Significantly.&lt;/blockquote&gt;
&lt;p&gt;Some methodological anecdotes are included: a correlation was once noticed between
teens being adopted and the use of drugs and skipping school. Subsequent research
found this correlation was explained entirely by the 20% of the self-reported
adoptees not actually being adopted...&lt;/p&gt;
&lt;p&gt;Although replete with the kind of factoids that force you announce them out
loud to anyone &quot;lucky&quot; enough to be in the same room as you, &lt;em&gt;Everybody Lies&lt;/em&gt; is
let down by a chronic lack of structure — a final conclusion that is so
self-aware of its limitations that it ready and repeatedly admits to it is
still an weak conclusion.&lt;/p&gt;
&lt;hr class=&quot;docutils&quot; /&gt;
&lt;a class=&quot;reference external image-reference&quot; href=&quot;https://chris-lamb.co.uk/azn/B01LWAESYQ&quot;&gt;&lt;img alt=&quot;https://images-eu.ssl-images-amazon.com/images/P/B01LWAESYQ.01._PC__.jpg&quot; class=&quot;align-right&quot; src=&quot;https://images-eu.ssl-images-amazon.com/images/P/B01LWAESYQ.01._PC__.jpg&quot; /&gt;&lt;/a&gt;
&lt;a class=&quot;reference external image-reference&quot; href=&quot;https://chris-lamb.co.uk/azn/B0736185ZL&quot;&gt;&lt;img alt=&quot;https://images-eu.ssl-images-amazon.com/images/P/B0736185ZL.01._PC__.jpg&quot; class=&quot;align-right&quot; src=&quot;https://images-eu.ssl-images-amazon.com/images/P/B0736185ZL.01._PC__.jpg&quot; /&gt;&lt;/a&gt;
&lt;a class=&quot;reference external image-reference&quot; href=&quot;https://chris-lamb.co.uk/azn/B01MZI77C0&quot;&gt;&lt;img alt=&quot;https://images-eu.ssl-images-amazon.com/images/P/B01MZI77C0.01._PC__.jpg&quot; class=&quot;align-right&quot; src=&quot;https://images-eu.ssl-images-amazon.com/images/P/B01MZI77C0.01._PC__.jpg&quot; /&gt;&lt;/a&gt;
&lt;p&gt;&lt;a class=&quot;reference external&quot; href=&quot;https://chris-lamb.co.uk/azn/B01LWAESYQ&quot;&gt;&lt;strong&gt;The Bobiverse Trilogy&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Dennis Taylor&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I&#39;m really not a &quot;science fiction&quot; person, at least not in the sense of reading
books catalogued as such, with all their indulgent meta-references and
stereotypical cover art.&lt;/p&gt;
&lt;p&gt;However, I was really taken by the conceit and execution of the &lt;em&gt;Bobiverse&lt;/em&gt;
trilogy: Robert &quot;Bob&quot; Johansson perishes in an automobile accident the day
after agreeing to have his head cryogenically frozen upon death. 117 years
later he finds that he has been installed in a computer as an artificial
intelligence. He subsequently clones himself multiple times resulting in the
chapters being written from various &quot;Bob&#39;s&quot; locations, timelines and
perspectives around the galaxy.&lt;/p&gt;
&lt;p&gt;One particular thing I liked about the books was their complete disregard for a
film tie-in; &lt;a class=&quot;reference external&quot; href=&quot;https://chris-lamb.co.uk/azn/B005CVWWJY&quot;&gt;Ready Player One&lt;/a&gt; was almost cynically
written with this in mind, but the &lt;em&gt;Bobiverse&lt;/em&gt; cheerfully handicaps itself by
including Homer Simpson and other unlicensable characters.&lt;/p&gt;
&lt;p&gt;Whilst the opening world-building book is the most immediately rewarding, the
series kicks into gear after this — as the various &quot;Bob&#39;s&quot; unfold with
differing interests (exploration, warfare, pure science, anthropology, etc.) a
engrossing tapestry is woven together with a generous helping of humour and,
funnily enough, believability.&lt;/p&gt;
&lt;hr class=&quot;docutils&quot; /&gt;
&lt;a class=&quot;reference external image-reference&quot; href=&quot;https://chris-lamb.co.uk/azn/1784703931&quot;&gt;&lt;img alt=&quot;https://images-eu.ssl-images-amazon.com/images/P/1784703931.01._PC__.jpg&quot; class=&quot;align-right&quot; src=&quot;https://images-eu.ssl-images-amazon.com/images/P/1784703931.01._PC__.jpg&quot; /&gt;&lt;/a&gt;
&lt;a class=&quot;reference external image-reference&quot; href=&quot;https://chris-lamb.co.uk/azn/B00K7ED54M&quot;&gt;&lt;img alt=&quot;https://images-eu.ssl-images-amazon.com/images/P/B00K7ED54M.01._PC__.jpg&quot; class=&quot;align-right&quot; src=&quot;https://images-eu.ssl-images-amazon.com/images/P/B00K7ED54M.01._PC__.jpg&quot; /&gt;&lt;/a&gt;
&lt;p&gt;&lt;a class=&quot;reference external&quot; href=&quot;https://chris-lamb.co.uk/azn/1784703931&quot;&gt;&lt;strong&gt;Homo Deus: A Brief History of Tomorrow&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Yuval Noah Harari&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;After a number of strong recommendations I finally read &lt;a class=&quot;reference external&quot; href=&quot;https://chris-lamb.co.uk/azn/B00K7ED54M&quot;&gt;Sapiens&lt;/a&gt;, this book&#39;s prequel.&lt;/p&gt;
&lt;p&gt;I was gripped, especially given its revisionist insight into various stages of
Man. The idea that wheat domesticated us (and not the other way around) and
how adoption of this crop led to truncated and unhealthier lifespans
particularly intrigued me: we have an innate bias towards chronocentrism, so to
be reminded that progress isn&#39;t a linear progression from &quot;bad&quot; to &quot;better&quot; is
always useful.&lt;/p&gt;
&lt;p&gt;The sequel, &lt;em&gt;Homo Deus&lt;/em&gt;, continues this trend by discussing the future
potential of our species. I was surprised just how humourous the book was in
places. For example, here is Harari on the anthropocentric nature of religion:&lt;/p&gt;
&lt;blockquote&gt;
You could never convince a monkey to give you a banana by promising him
limitless bananas after death in monkey heaven.&lt;/blockquote&gt;
&lt;p&gt;Or even:&lt;/p&gt;
&lt;blockquote&gt;
You can&#39;t settle the Greek debt crisis by inviting Greek politicians and
German bankers to a fist fight or an orgy.&lt;/blockquote&gt;
&lt;p&gt;The chapters on AI and the inexpensive remarks about the impact of social media
did not score many points with me, but I certainly preferred the latter book in
that the author takes more risks with his own opinion so it&#39;s less dry and more
more thought-provoking, even if one disagrees.&lt;/p&gt;
&lt;hr class=&quot;docutils&quot; /&gt;
&lt;a class=&quot;reference external image-reference&quot; href=&quot;https://chris-lamb.co.uk/azn/0857535579&quot;&gt;&lt;img alt=&quot;https://images-eu.ssl-images-amazon.com/images/P/0857535579.01._PC__.jpg&quot; class=&quot;align-right&quot; src=&quot;https://images-eu.ssl-images-amazon.com/images/P/0857535579.01._PC__.jpg&quot; /&gt;&lt;/a&gt;
&lt;a class=&quot;reference external image-reference&quot; href=&quot;https://chris-lamb.co.uk/azn/B01N5URPMC&quot;&gt;&lt;img alt=&quot;https://images-eu.ssl-images-amazon.com/images/P/B01N5URPMC.01._PC__.jpg&quot; class=&quot;align-right&quot; src=&quot;https://images-eu.ssl-images-amazon.com/images/P/B01N5URPMC.01._PC__.jpg&quot; /&gt;&lt;/a&gt;
&lt;p&gt;&lt;a class=&quot;reference external&quot; href=&quot;https://chris-lamb.co.uk/azn/B01N5URPMC&quot;&gt;&lt;strong&gt;La Belle Sauvage: The Book of Dust Volume One&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Philip Pullman&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I have extremely fond memories of reading (and re-reading, etc.) the author&#39;s &lt;a class=&quot;reference external&quot; href=&quot;https://chris-lamb.co.uk/azn/B017TP5J6I&quot;&gt;Dark
Materials&lt;/a&gt; as a teenager despite being started on the second book by a
&quot;supply&quot; English teacher.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;La Belle Sauvage&lt;/em&gt; is a prequel to this original trilogy and the first of
another trio. Ms Lyra Belacqua is present as a baby but the protagonist here is
Malcolm Polstead who is very much part of the Oxford &quot;town&quot; rather than &quot;gown&quot;.&lt;/p&gt;
&lt;p&gt;Alas, Pullman didn&#39;t make a study of &lt;em&gt;Star Wars&lt;/em&gt; and thus relies a little too
much on the existing canon, wary to add new, original features. This results in
an excess of Magesterium and Mrs Coulter (a superior &lt;a class=&quot;reference external&quot; href=&quot;https://en.wikipedia.org/wiki/Ministry_of_Magic#Dolores_Umbridge&quot;&gt;Delores Umbridge&lt;/a&gt;, by the way),
and the protagonist is a little too redolent of Will...&lt;/p&gt;
&lt;p&gt;There is also an very out-of-character chapter where the magical rules of the novel
temporarily multiply resulting in a confusion that was almost certainly not the
author&#39;s intention. You&#39;ll spot it when you get to it, which you should.&lt;/p&gt;
&lt;p&gt;(I also enjoyed the slender &lt;a class=&quot;reference external&quot; href=&quot;https://chris-lamb.co.uk/azn/0857535579&quot;&gt;Lyra&#39;s Oxford&lt;/a&gt;, essentially a
short story set just a few years after &lt;em&gt;The Amber Spyglass&lt;/em&gt;.)&lt;/p&gt;
&lt;hr class=&quot;docutils&quot; /&gt;
&lt;a class=&quot;reference external image-reference&quot; href=&quot;https://chris-lamb.co.uk/azn/B002VYJYR8&quot;&gt;&lt;img alt=&quot;https://images-eu.ssl-images-amazon.com/images/P/B002VYJYR8.01._PC__.jpg&quot; class=&quot;align-right&quot; src=&quot;https://images-eu.ssl-images-amazon.com/images/P/B002VYJYR8.01._PC__.jpg&quot; /&gt;&lt;/a&gt;
&lt;p&gt;&lt;a class=&quot;reference external&quot; href=&quot;https://chris-lamb.co.uk/azn/B002VYJYR8&quot;&gt;&lt;strong&gt;Open: An Autobiography&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Andre Agassi&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Sporting personalities certainly exist, but they are rarely revealed by their
&quot;authors&quot; so upon friends&#39; enquiries to what I was reading I frequently caught
myself qualifying my response with «It&#39;s a sports autobiography, but...».&lt;/p&gt;
&lt;p&gt;It&#39;s naturally difficult to know what we can credit to Agassi or his (truly
excellent) ghostwriter but this book is a real pleasure to read. This is no
lost Nabokov or Proust, but the level of wordsmithing went beyond
supererogatory. For example:&lt;/p&gt;
&lt;blockquote&gt;
For a man with so many fleeting identities, it&#39;s shocking, and symbolic, that
my initials are A. K. A.&lt;/blockquote&gt;
&lt;p&gt;Or:&lt;/p&gt;
&lt;blockquote&gt;
I understand that there&#39;s a tax on everything in America. Now, I discover
that this is the tax on success in sports: fifteen seconds of time for every
fan.&lt;/blockquote&gt;
&lt;p&gt;Like all good books that revolve around a subject, readers do not need to
know or have any real interest in the topic at hand, so even non-tennis fans
will find this an engrossing read. Dark themes abound — Agassi is deeply
haunted by his father, a topic I wish he went into more, but perhaps he has not
done the &quot;work&quot; himself yet.&lt;/p&gt;
&lt;hr class=&quot;docutils&quot; /&gt;
&lt;a class=&quot;reference external image-reference&quot; href=&quot;https://chris-lamb.co.uk/azn/1405910119&quot;&gt;&lt;img alt=&quot;https://images-eu.ssl-images-amazon.com/images/P/1405910119.01._PC__.jpg&quot; class=&quot;align-right&quot; src=&quot;https://images-eu.ssl-images-amazon.com/images/P/1405910119.01._PC__.jpg&quot; /&gt;&lt;/a&gt;
&lt;a class=&quot;reference external image-reference&quot; href=&quot;https://chris-lamb.co.uk/azn/B00EAA6QFE&quot;&gt;&lt;img alt=&quot;https://images-eu.ssl-images-amazon.com/images/P/B00EAA6QFE.01._PC__.jpg&quot; class=&quot;align-right&quot; src=&quot;https://images-eu.ssl-images-amazon.com/images/P/B00EAA6QFE.01._PC__.jpg&quot; /&gt;&lt;/a&gt;
&lt;p&gt;&lt;a class=&quot;reference external&quot; href=&quot;https://chris-lamb.co.uk/azn/B00EAA6QFE&quot;&gt;&lt;strong&gt;The Complete Short Stories&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Roald Dahl&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I distinctly remember reading Roald Dahl&#39;s &lt;a class=&quot;reference external&quot; href=&quot;https://chris-lamb.co.uk/azn/B005PVLZMQ&quot;&gt;The Wonderful Story of Henry Sugar and Six
More&lt;/a&gt; collection of short stories as a child, some characters still
etched in my mind; the &#39;od carrier and fingersmith of &lt;em&gt;The
Hitchhiker&lt;/em&gt; or the protagonist polishing &lt;a class=&quot;reference external&quot; href=&quot;https://en.wikipedia.org/wiki/Treasure_trove#England_and_Wales_common_law&quot;&gt;his silver Trove&lt;/a&gt;
in &lt;em&gt;The Mildenhall Treasure&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Instead of re-reading this collection I embarked on reading his complete short
stories, curious whether the rest of his &lt;em&gt;œuvre&lt;/em&gt; was at the same level. After reading two
entire volumes, I can say it mostly does — Dahl&#39;s typical humour and
descriptive style are present throughout with only a few show-off sentences
such as:&lt;/p&gt;
&lt;blockquote&gt;
&quot;There&#39;s a trick that nearly every writer uses of inserting at least one
long obscure word into each story. This makes the reader think that the man
is very wise and clever. I have a whole stack of long words stored away just
for this purpose.&quot; &quot;Where?&quot; &quot;In the &#39;word-memory&#39; section,&quot; he said,
epexegetically.&lt;/blockquote&gt;
&lt;p&gt;There were a perhaps too many of his early, mostly-factual, war tales that were
lacking a an interesting conceit and I still might recommend the &lt;em&gt;Henry
Sugar&lt;/em&gt; collection for the uninitiated, but I would still heartily recommend
either of these two volumes, starting with &lt;a class=&quot;reference external&quot; href=&quot;https://chris-lamb.co.uk/azn/1405910119&quot;&gt;the second&lt;/a&gt;.&lt;/p&gt;
&lt;hr class=&quot;docutils&quot; /&gt;
&lt;a class=&quot;reference external image-reference&quot; href=&quot;https://chris-lamb.co.uk/azn/B00GIUGEO2&quot;&gt;&lt;img alt=&quot;https://images-eu.ssl-images-amazon.com/images/P/B00GIUGEO2.01._PC__.jpg&quot; class=&quot;align-right&quot; src=&quot;https://images-eu.ssl-images-amazon.com/images/P/B00GIUGEO2.01._PC__.jpg&quot; /&gt;&lt;/a&gt;
&lt;p&gt;&lt;a class=&quot;reference external&quot; href=&quot;https://chris-lamb.co.uk/azn/B00GIUGEO2&quot;&gt;&lt;strong&gt;Watching the English&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Kate Fox&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Written by a social anthropologist, this book dissects &quot;English&quot; behaviour for
the layman providing an insight into British humour, rites of passage,
dress/language codes, amongst others.&lt;/p&gt;
&lt;p&gt;A must-read for anyone who is in — or considering... — a relationship with an
Englishman, it is also a curious read for the native Brit: a kind of horoscope
for folks, like me, who believe they are above them.&lt;/p&gt;
&lt;p&gt;It&#39;s not perfect: Fox tediously repeats that her &quot;rules&quot; or patterns are
not rules in the strict sense of being observed by 100% of the population;
there will always be people who do not, as well as others whose defiance of a
so-called &quot;rule&quot; only reinforces the concept. Most likely this reiteration is
to sidestep wearisome criticisms but it becomes ponderous and patronising
over time.&lt;/p&gt;
&lt;p&gt;Her general conclusions (that the English are repressed, risk-averse and, above
all, hypocrites) invariably oversimplify, but taken as a series of vignettes
rather than a scientifically accurate and coherent whole, the book is worth
your investment.&lt;/p&gt;
&lt;p&gt;(Ensure you locate the &quot;revised&quot; edition — it not only contains more content,
it also profers valuable counter-arguments to rebuttals Fox received since the
original publication.)&lt;/p&gt;
&lt;hr class=&quot;docutils&quot; /&gt;
&lt;a class=&quot;reference external image-reference&quot; href=&quot;https://chris-lamb.co.uk/azn/B06Y619TS1&quot;&gt;&lt;img alt=&quot;https://images-eu.ssl-images-amazon.com/images/P/B06Y619TS1.01._PC__.jpg&quot; class=&quot;align-right&quot; src=&quot;https://images-eu.ssl-images-amazon.com/images/P/B06Y619TS1.01._PC__.jpg&quot; /&gt;&lt;/a&gt;
&lt;p&gt;&lt;a class=&quot;reference external&quot; href=&quot;https://chris-lamb.co.uk/azn/B06Y619TS1&quot;&gt;&lt;strong&gt;What Does This Button Do?&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Bruce Dickinson&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In this entertaining autobiography we are thankfully spared a litany of Iron
Maiden gigs, successes and reproaches of the inevitable bust-ups and are
instead treated to an introspective insight into just another &quot;everyman&quot; who
could very easily be your regular drinking buddy if it weren&#39;t for a need to
fulfill a relentless inner drive for... well, just about anything.&lt;/p&gt;
&lt;p&gt;The frontman&#39;s antics as a schoolboy stand out, as are his later sojourns into
Olympic fencing and being a commercial pilot. These latter exploits sound
bizarre out of context but despite their non-sequitur nature they make a
perfect foil (hah!) to the heavy metal.&lt;/p&gt;
&lt;p&gt;A big follower of Maiden in my teens, I fell off the wagon as I didn&#39;t care for
their newer albums so I was blindsided by Dickinson&#39;s sobering cancer diagnosis
in the closing chapters. Furthermore, whilst Bruce&#39;s book fails George
Orwell&#39;s test that &lt;a class=&quot;reference external&quot; href=&quot;http://www.orwell.ru/library/reviews/dali/english/e_dali&quot;&gt;autobiography is only to be trusted when it
reveals something disgraceful&lt;/a&gt;, it is &lt;em&gt;tour de
force&lt;/em&gt; enough for to distract from any concept of integrity.&lt;/p&gt;
&lt;p&gt;(I have it on excellent authority that the audiobook, which is narrated by the
author, is definitely worth one&#39;s time.)&lt;/p&gt; </description> 
	<pubDate>Sat, 30 Dec 2017 18:56:24 +0000</pubDate>

</item> 
<item>
	<title>Sune Vuorela: Aubergine – Playing with emoji</title>
	<guid>http://pusling.com/blog/?p=451</guid>
	<link>http://pusling.com/blog/?p=451</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/sune.png&quot; width=&quot;65&quot; height=&quot;90&quot; alt=&quot;&quot; align=&quot;right&quot; style=&quot;float: right;&quot;&gt;  &lt;p&gt;Playing with emojis&lt;/p&gt;
&lt;p&gt;At some point, I needed to copy paste emojis, but couldn’t find a good way to do it. So what does a good hacker do?&lt;br /&gt;
Scratch an own itch.  As I &lt;a href=&quot;http://pusling.com/blog/?p=230&quot;&gt;wrote&lt;/a&gt; about in the past, all these projects should be shared with the rest of the world.&lt;br /&gt;
So here it is: &lt;a href=&quot;https://cgit.kde.org/scratch/sune/aubergine.git/&quot;&gt;https://cgit.kde.org/scratch/sune/aubergine.git/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It looks like this with the symbola font for emojis: &lt;img alt=&quot;Screenshot&quot; src=&quot;https://i.imgur.com/Okf1oF3.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;It basically lets you search for emojis by their description, and by clicking on a emoji, it gets inserted into the clipboard.&lt;/p&gt;
&lt;p&gt;As such, I’m not sure the application is really interesting, but there might be two interesting bits in the source code:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A parser for the unicode data text files in &lt;tt&gt;/usr/share/unicode/NamesList.txt&lt;/tt&gt; is placed in lib/parser.{h,cpp}&lt;/li&gt;
&lt;li&gt;A class that tries to expose QClipboard as QML objects placed in app/clipboard.{h,cpp}. I’m not yet sure if this is the right approach for that, but it is the one that currently makes most sense in my mind. If I’m receiving proper feedback, I might be able to extend/finish it and submit it to Qt.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And of course, now it is simple to describe fancy cooking:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;🍆&quot; class=&quot;wp-smiley&quot; src=&quot;https://s.w.org/images/core/emoji/2.3/72x72/1f346.png&quot; style=&quot;height: 1em;&quot; /&gt; &lt;img alt=&quot;🔪&quot; class=&quot;wp-smiley&quot; src=&quot;https://s.w.org/images/core/emoji/2.3/72x72/1f52a.png&quot; style=&quot;height: 1em;&quot; /&gt; &lt;img alt=&quot;🔥&quot; class=&quot;wp-smiley&quot; src=&quot;https://s.w.org/images/core/emoji/2.3/72x72/1f525.png&quot; style=&quot;height: 1em;&quot; /&gt;&lt;br /&gt;
(aubergine) (hocho) (fire)&lt;/p&gt;
&lt;p&gt;I ❣ emoji&lt;/p&gt; </description> 
	<pubDate>Sat, 30 Dec 2017 18:33:36 +0000</pubDate>

</item> 
<item>
	<title>Russ Allbery: Review: Saving Francesca</title>
	<guid>https://www.eyrie.org/~eagle/reviews/books/0-307-43371-4.html</guid>
	<link>https://www.eyrie.org/~eagle/reviews/books/0-307-43371-4.html</link>
     <description>  &lt;p&gt;Review: &lt;cite&gt;Saving Francesca&lt;/cite&gt;, by Melina Marchetta&lt;/p&gt;

&lt;table&gt;
  &lt;tbody&gt;&lt;tr&gt;
    &lt;td&gt;Series:&lt;/td&gt;
    &lt;td&gt;Francesca #1&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Publisher:&lt;/td&gt;
    &lt;td&gt;Alfred A. Knopf&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Copyright:&lt;/td&gt;
    &lt;td&gt;2003&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Printing:&lt;/td&gt;
    &lt;td&gt;2011&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;ISBN:&lt;/td&gt;
    &lt;td&gt;0-307-43371-4&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Format:&lt;/td&gt;
    &lt;td&gt;Kindle&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Pages:&lt;/td&gt;
    &lt;td&gt;245&lt;/td&gt;
  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;

&lt;p&gt;
Francesca is in Year Eleven in St. Sebastian&#39;s, in the first year that the
school opened to girls.  She had a social network and a comfortable place
at her previous school, but it only went to Year Ten.  Most of her friends
went to Pius, but St. Sebastian&#39;s is a better school.  So Francesca is
there, one of thirty girls surrounded by boys who aren&#39;t used to being in
a co-ed school, and mostly hanging out with the three other girls who had
gone to her previous school.  She&#39;s miserable, out of place, and homesick
for her previous routine.
&lt;/p&gt;

&lt;p&gt;
And then, one morning, her mother doesn&#39;t get out of bed.  Her mother, the
living force of energy, the one who runs the household, who pesters
Francesca incessantly, who starts every day with a motivational song.  She
doesn&#39;t get out of bed the next day, either.  Or the day after that.  And
the bottom falls out of Francesca&#39;s life.
&lt;/p&gt;

&lt;p&gt;
I come at this book from a weird angle because I read
&lt;a href=&quot;https://www.eyrie.org/~eagle/reviews/books/0-7636-5458-2.html&quot;&gt;&lt;cite&gt;The Piper&#39;s Son&lt;/cite&gt;&lt;/a&gt; first.  It&#39;s about Tom
Mackee, one of the supporting characters in this book, and is set five
years later.  I&#39;ve therefore met these people before: Francesca, quiet
Justine who plays the piano accordion, political Tara, and several of the
Sebastian boys.  But they are much different here as their younger selves:
more raw, more childish, and without the understanding of settled
relationships.  This is the story of how they either met or learned how to
really see each other, against the backdrop of Francesca&#39;s home life
breaking in entirely unexpected ways.
&lt;/p&gt;

&lt;p&gt;
I think &lt;cite&gt;The Piper&#39;s Son&lt;/cite&gt; was classified as young adult mostly
because Marchetta is considered a young adult writer.  &lt;cite&gt;Saving
Francesca&lt;/cite&gt;, by comparison, is more fully a young adult novel.  Instead of
third person with two tight viewpoints, it&#39;s all first person: Francesca
telling the reader about her life.  She&#39;s grumpy, sad, scared, anxious,
and very self-focused, in the way of a teenager who is trying to sort out
who she is and what she wants.  The reader follows her through the
uncertainty of maybe starting to like a boy who may or may not like her
and is maddeningly unwilling to commit, through realizing that the friends
she had and desperately misses perhaps weren&#39;t really friends after all,
and into the understanding of what friendship really means for her.  But
it&#39;s all very much caught up in Francesca&#39;s head.  The thoughts of the
other characters are mostly guesswork for the reader.
&lt;/p&gt;

&lt;p&gt;
&lt;cite&gt;The Piper&#39;s Son&lt;/cite&gt; was more effective for me, but this is still a very
good book.  Marchetta captures the gradual realization of friendship,
along with the gradual understanding that you have been a total ass,
extremely well.  I was somewhat less convinced by Francesca&#39;s mother&#39;s
sudden collapse, but depression does things like that, and by the end of
the book one realizes that Francesca has been somewhat oblivious to
tensions and problems that would have made this less surprising.  And the
way that Marchetta guides Francesca to a deeper understanding of her
father and the dynamics of her family is emotionally realistic and
satisfying, although Francesca&#39;s lack of empathy occasionally makes one
want to have a long talk with her.
&lt;/p&gt;

&lt;p&gt;
The best part of this book are the friendships.  I didn&#39;t feel the moments
of catharsis as strongly here as in &lt;cite&gt;The Piper&#39;s Son&lt;/cite&gt;, but I greatly
appreciated Marchetta&#39;s linking of the health of Francesca&#39;s friendships
to the health of her self-image.  Yes, this is how this often works: it&#39;s
very hard to be a good friend until you understand who you are inside, and
how you want to define yourself.  Often that doesn&#39;t come in words, but in
moments of daring and willingness to get lost in a moment.  The character
I felt the most sympathy for was Siobhan, who caught the brunt of
Francesca&#39;s defensive self-absorption in a way that left me wincing even
though the book never lingers on her.  And the one who surprised me the
most was Jimmy, who possibly shows the most empathy of anyone in the book
in a way that Francesca didn&#39;t know how to recognize.
&lt;/p&gt;

&lt;p&gt;
I&#39;m not unhappy about reading &lt;cite&gt;The Piper&#39;s Son&lt;/cite&gt; first, since I don&#39;t
think it needs this book (and says some of the same things in a more adult
voice, in ways I found more powerful).  I found &lt;cite&gt;Saving Francesca&lt;/cite&gt; a
bit more obvious, a bit less subtle, and a bit more painful, and I think I
prefer reading about the more mature versions of these characters.  But
this is a solid, engrossing psychological story with a good emotional
payoff.  And, miracle of miracles, even a bit of a denouement.
&lt;/p&gt;

&lt;p&gt;
Followed by &lt;a href=&quot;https://www.eyrie.org/~eagle/reviews/books/0-7636-5458-2.html&quot;&gt;&lt;cite&gt;The Piper&#39;s Son&lt;/cite&gt;&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;Rating: 7 out of 10&lt;/p&gt; </description> 
	<pubDate>Sat, 30 Dec 2017 04:15:00 +0000</pubDate>

</item> 
<item>
	<title>Antoine Beaupré: An overview of KubeCon + CloudNativeCon</title>
	<guid>https://anarc.at/blog/2017-12-13-kubecon-overview/</guid>
	<link>https://anarc.at/blog/2017-12-13-kubecon-overview/</link>
     <description>  &lt;p&gt;The &lt;a href=&quot;https://www.cncf.io/&quot;&gt;Cloud Native Computing Foundation&lt;/a&gt; (CNCF)
held its conference, &lt;a href=&quot;http://events.linuxfoundation.org/events/kubecon-and-cloudnativecon-north-america&quot;&gt;KubeCon +
CloudNativeCon&lt;/a&gt;,
in December 2017. There were 4000 attendees at this gathering in Austin,
Texas, more than all the previous KubeCons before, which shows the rapid
growth of the community building around the tool that was announced by
Google in 2014. Large corporations are also taking a larger part in the
community, with major players in the industry
&lt;a href=&quot;https://techcrunch.com/2017/09/20/Kubernetes-gains-momentum-as-big-name-vendors-join-cloud-native-computing-foundation/&quot;&gt;joining&lt;/a&gt;
the CNCF, which is a project of the Linux Foundation. The CNCF now
features three of the largest cloud hosting businesses (Amazon, Google,
and Microsoft), but also emerging companies from Asia like Baidu and
Alibaba.&lt;/p&gt;

&lt;p&gt;In addition, KubeCon saw an impressive number of diversity scholarships,
which &quot;&lt;em&gt;include free admission to KubeCon and a travel stipend of up to
$1,500, aimed at supporting those from traditionally underrepresented
and/or marginalized groups in the technology and/or open source
communities&lt;/em&gt;&quot;, &lt;a href=&quot;https://coreos.com/blog/kubecon-2017-recap-day-1&quot;&gt;according to Neil McAllister of
CoreOS&lt;/a&gt;. The diversity
team raised an impressive $250,000 to bring 103 attendees to Austin
from all over the world.&lt;/p&gt;

&lt;p&gt;We have looked into Kubernetes in the past but, considering the speed at
which things are moving, it seems time to make an update on the projects
surrounding this newly formed ecosystem.&lt;/p&gt;

&lt;h2 id=&quot;the-cncf-and-its-projects&quot;&gt;The CNCF and its projects&lt;/h2&gt;

&lt;p&gt;The CNCF was founded, in part, to manage the Kubernetes software
project, which was donated to it by Google in 2015. From there, the
number of projects managed under the CNCF umbrella has grown quickly. It
first added the &lt;a href=&quot;http://prometheus.io/&quot;&gt;Prometheus&lt;/a&gt; monitoring and
alerting system, and then quickly went up from four projects in the
first year, to &lt;a href=&quot;https://www.cncf.io/projects/&quot;&gt;14 projects&lt;/a&gt; at the time
of this writing, with more expected to join shortly. The CNCF&#39;s latest
additions to its roster are
&lt;a href=&quot;https://github.com/theupdateframework/notary&quot;&gt;Notary&lt;/a&gt; and &lt;a href=&quot;https://github.com/theupdateframework/specification&quot;&gt;The Update
Framework&lt;/a&gt; (TUF,
which we &lt;a href=&quot;https://lwn.net/Articles/629426/&quot;&gt;previously covered&lt;/a&gt;), both
projects aimed at providing software verification. Those add to the
already existing projects which are, bear with me,
&lt;a href=&quot;http://opentracing.io/&quot;&gt;OpenTracing&lt;/a&gt; (a tracing API),
&lt;a href=&quot;http://www.fluentd.org/&quot;&gt;Fluentd&lt;/a&gt; (a logging system),
&lt;a href=&quot;https://linkerd.io/&quot;&gt;Linkerd&lt;/a&gt; (a &quot;service mesh&quot;, which we &lt;a href=&quot;https://lwn.net/Articles/719282/&quot;&gt;previously
covered&lt;/a&gt;), &lt;a href=&quot;http://www.grpc.io/&quot;&gt;gRPC&lt;/a&gt;
(a &quot;universal RPC framework&quot; used to communicate between pods),
&lt;a href=&quot;https://coredns.io/&quot;&gt;CoreDNS&lt;/a&gt; (DNS and service discovery),
&lt;a href=&quot;https://github.com/rkt/rkt&quot;&gt;rkt&lt;/a&gt; (a container runtime),
&lt;a href=&quot;http://containerd.io/&quot;&gt;containerd&lt;/a&gt; (&lt;em&gt;another&lt;/em&gt; container runtime),
&lt;a href=&quot;https://github.com/uber/jaeger&quot;&gt;Jaeger&lt;/a&gt; (a tracing system),
&lt;a href=&quot;https://lyft.github.io/envoy/&quot;&gt;Envoy&lt;/a&gt; (&lt;em&gt;another&lt;/em&gt; &quot;service mesh&quot;), and
&lt;a href=&quot;https://github.com/containernetworking/cni&quot;&gt;Container Network
Interface&lt;/a&gt; (CNI, a
networking API).&lt;/p&gt;

&lt;p&gt;This is an incredible diversity, if not fragmentation, in the community.
The CNCF made this large diagram depicting Kubernetes-related
projects—so large that you will have a hard time finding a monitor that
will display the whole graph without scaling it (seen below, click
through for larger version). The diagram shows &lt;em&gt;hundreds&lt;/em&gt; of projects,
and it is hard to comprehend what all those components do and if they
are all necessary or how they overlap. For example, Envoy and Linkerd
are similar tools yet both are under the CNCF umbrella—and I&#39;m ignoring
&lt;em&gt;two&lt;/em&gt; more such projects presented at KubeCon (&lt;a href=&quot;https://istio.io&quot;&gt;Istio&lt;/a&gt;
and &lt;a href=&quot;https://buoyant.io/2017/12/05/introducing-conduit/&quot;&gt;Conduit&lt;/a&gt;). You
could argue that all tools have different focus and functionality, but
it still means you need to learn about all those tools to pick the right
one, which may discourage and confuse new users.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://raw.githubusercontent.com/cncf/landscape/master/landscape/CloudNativeLandscape_latest.jpg&quot;&gt;&lt;img alt=&quot;Cloud Native landscape&quot; id=&quot;cloudnativelandscape&quot; src=&quot;https://static.lwn.net/images/2017/cn-landscape.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You may notice that containerd and rkt are &lt;em&gt;both&lt;/em&gt; projects of the CNCF,
even though they overlap in functionality. There is also a &lt;em&gt;third&lt;/em&gt;
Kubernetes runtime called &lt;a href=&quot;http://cri-o.io/&quot;&gt;CRI-O&lt;/a&gt; built by RedHat.
This kind of fragmentation leads to significant confusion within the
community as to which runtime they should use, or if they should even
care. We&#39;ll run a separate article about CRI-O and the other runtimes to
try to clarify this shortly.&lt;/p&gt;

&lt;p&gt;Regardless of this complexity, it does seem the space is maturing. In
his keynote, Dan Kohn, executive director of the CNCF, announced &quot;1.0&quot;
releases for 4 projects:
&lt;a href=&quot;https://coredns.io/2017/12/01/coredns-1.0.0-release/&quot;&gt;CoreDNS&lt;/a&gt;,
&lt;a href=&quot;https://www.cncf.io/blog/2017/12/05/general-availability-containerd-1-0/&quot;&gt;containerd&lt;/a&gt;,
&lt;a href=&quot;https://www.cncf.io/blog/2017/12/06/fluentd-v1-0/&quot;&gt;Fluentd&lt;/a&gt; and
&lt;a href=&quot;https://www.cncf.io/blog/2017/12/06/announcing-jaeger-1-0-release/&quot;&gt;Jaeger&lt;/a&gt;.
Prometheus also had a &lt;a href=&quot;https://prometheus.io/blog/2017/11/08/announcing-prometheus-2-0/&quot;&gt;major 2.0
release&lt;/a&gt;,
which we will cover in a separate article.&lt;/p&gt;

&lt;p&gt;There were significant announcements at KubeCon for projects that are
not directly under the CNCF umbrella. Most notable for operators
concerned about security is the introduction of &lt;a href=&quot;http://katacontainers.io/&quot;&gt;Kata
Containers&lt;/a&gt;, which is basically a merge of
&lt;a href=&quot;https://github.com/hyperhq/runv&quot;&gt;runV&lt;/a&gt; from
&lt;a href=&quot;https://hyper.sh/&quot;&gt;Hyper.sh&lt;/a&gt; and Intel&#39;s &lt;a href=&quot;https://clearlinux.org/containers&quot;&gt;Clear
Containers&lt;/a&gt; projects. Kata
Containers, introduced during a keynote by Intel&#39;s VP of the software
and services group, Imad Sousou, are virtual-machine-based containers,
or, in other words, containers that run in a hypervisor instead of under
the supervision of the Linux kernel. The rationale here is that
containers are convenient but all run on the same kernel, so the
compromise of a single container can leak into all containers on the
same host. This may be unacceptable in certain environments, for example
for multi-tenant clusters where containers cannot trust each other.&lt;/p&gt;

&lt;p&gt;Kata Containers promises the &quot;best of both worlds&quot; by providing the
speed of containers and the isolation of VMs. It does this by using
minimal custom kernel builds, to speed up boot time, and parallelizing
container image builds and VM startup. It also uses tricks like
&lt;a href=&quot;https://en.wikipedia.org/wiki/Kernel_same-page_merging&quot;&gt;same-page memory sharing across
VMs&lt;/a&gt; to
deduplicate memory across virtual machines. It currently works only on
x86 and KVM, but it integrates with Kubernetes, Docker, and OpenStack.
There was a &lt;a href=&quot;https://kccncna17.sched.com/event/CU81/kata-containers-hypervisor-based-container-runtime-xu-wang-hyperhq-samuel-ortiz-intel&quot;&gt;talk explaining the technical
details&lt;/a&gt;;
that page should eventually feature video and slide links.&lt;/p&gt;

&lt;h2 id=&quot;industry-adoption&quot;&gt;Industry adoption&lt;/h2&gt;

&lt;p&gt;As hinted earlier, large cloud providers like &lt;a href=&quot;https://en.wikipedia.org/wiki/Amazon_Web_Services&quot;&gt;Amazon Web
Services&lt;/a&gt; (AWS) and
&lt;a href=&quot;https://en.wikipedia.org/wiki/Microsoft_Azure&quot;&gt;Microsoft Azure&lt;/a&gt; are
adopting the Kubernetes platform, or at least its API. The keynotes
featured AWS prominently; Adrian Cockcroft (AWS vice president of cloud
architecture strategy) announced the
&lt;a href=&quot;https://aws.amazon.com/fargate/&quot;&gt;Fargate&lt;/a&gt; service, which introduces
containers as &quot;first class citizens&quot; in the Amazon infrastructure.
Fargate should run alongside, and potentially replace, the existing
Amazon EC2 Container Service (ECS), which is currently the way
developers would deploy containers on Amazon by using EC2 (Elastic
Compute Cloud) VMs to run containers with Docker.&lt;/p&gt;

&lt;p&gt;This move by Amazon has been met with &lt;a href=&quot;https://medium.com/@cloud_opinion/Kubernetes-on-aws-caution-c5acae0e1790&quot;&gt;skepticism in the
community&lt;/a&gt;.
The concern here is that Amazon could pull the plug on Kubernetes when
it hinders the bottom line, like &lt;a href=&quot;https://www.recode.net/2015/10/1/11619122/amazon-raises-a-walled-garden-by-booting-apple-tv-google-chromecast&quot;&gt;it did with the Chromecast products on
Amazon&lt;/a&gt;.
This seems to be part of a changing strategy by the corporate sector in
adoption of free-software tools. While historically companies like
Microsoft or Oracle have been hostile to free software, they are now not
only using free software but also releasing free software. Oracle, for
example, released what it called &quot;&lt;a href=&quot;https://www.oracle.com/corporate/pressrelease/oracle-Kubernetes-tools-120617.html&quot;&gt;Kubernetes Tools for Serverless
Deployment and Intelligent Multi-Cloud
Management&lt;/a&gt;&quot;,
named &lt;a href=&quot;http://fnproject.io/&quot;&gt;Fn&lt;/a&gt;. Large cloud providers are getting
certified by the CNCF for compliance with the Kubernetes API and other
standards.&lt;/p&gt;

&lt;p&gt;One theory to explain this adoption is that free-software projects are
becoming on-ramps to proprietary products. In this strategy, as
&lt;a href=&quot;https://www.infoworld.com/article/3238491/open-source-tools/open-source-innovation-is-now-all-about-vendor-on-ramps.html&quot;&gt;explained by
InfoWorld&lt;/a&gt;,
open-source tools like Kubernetes are merely used to bring consumers
over to proprietary platforms. Sure, the client and the API are open,
but the underlying software can be proprietary. The data and &lt;em&gt;some&lt;/em&gt;
magic interfaces, especially, remain proprietary. Key examples of this
include the &lt;a href=&quot;https://en.wikipedia.org/wiki/Serverless_computing&quot;&gt;&quot;serverless&quot;
services&lt;/a&gt;, which are
currently not standardized at all: each provider has its own
incompatible framework that could be a deliberate lock-in strategy.
Indeed, a &lt;a href=&quot;https://www.martinfowler.com/articles/serverless.html&quot;&gt;common
definition&lt;/a&gt; of
serverless, from Martin Fowler, goes as follows:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Serverless architectures refer to applications that significantly
  depend on third-party services (knows as Backend as a Service or
  &quot;BaaS&quot;) or on custom code that&#39;s run in ephemeral containers (Function
  as a Service or &quot;FaaS&quot;).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;By designing services that explicitly require proprietary,
provider-specific APIs, providers ensure customer lock-in at the core of
the software architecture. One of the upcoming battles in the community
will be exactly how to standardize this emerging architecture.&lt;/p&gt;

&lt;p&gt;And, of course, Kubernetes can still be run on bare metal in a
colocation facility, but those costs are getting less and less
affordable. In an &lt;a href=&quot;https://kccncna17.sched.com/event/CU8N/the-true-costs-of-running-cloud-native-infrastructure-b-dmytro-dyachuk-pax-automa&quot;&gt;enlightening
talk&lt;/a&gt;,
Dmytro Dyachuk explained that unless cloud costs hit $100,000 per
month, users may be better off staying in the cloud. Indeed, that is
where a lot of applications end up. During an &lt;a href=&quot;https://kccncna17.sched.com/event/CU7S/panel-Kubernetes-cloud-native-and-the-public-cloud-b-moderated-by-dan-kohn-cloud-native-computing-foundation&quot;&gt;industry
roundtable&lt;/a&gt;,
Hong Tang, chief architect at Alibaba Cloud, posited that the &quot;majority
of computing will be in the public cloud, just like electricity is
produced by big power plants&quot;.&lt;/p&gt;

&lt;p&gt;The question, then, is how to split that market between the large
providers. And, indeed, according to a &lt;a href=&quot;https://www.cncf.io/blog/2017/12/06/cloud-native-technologies-scaling-production-applications/&quot;&gt;CNCF survey of 550 conference
attendees&lt;/a&gt;:
&quot;&lt;em&gt;Amazon (EC2/ECS) continues to grow as the leading container deployment
environment (69%)&lt;/em&gt;&quot;. CNCF also notes that on-premise deployment
decreased for the first time in the five surveys it has run, to 51%,
&quot;&lt;em&gt;but still remains a leading deployment&lt;/em&gt;&quot;. On premise, which is a
colocation facility or data center, is the target for these cloud
companies. By getting users to run Kubernetes, the industry&#39;s bet is
that it makes applications and content more portable, thus easier to
migrate into the proprietary cloud.&lt;/p&gt;

&lt;h2 id=&quot;next-steps&quot;&gt;Next steps&lt;/h2&gt;

&lt;p&gt;As the Kubernetes tools and ecosystem stabilize, major challenges
emerge: monitoring is a key issue as people realize it may be more
difficult to diagnose problems in a distributed system compared to the
previous monolithic model, which people at the conference often referred
to as &quot;legacy&quot; or the &quot;old OS paradigm&quot;. Scalability is another
challenge: while Kubernetes can easily manage thousands of pods and
containers, you still need to figure out how to organize all of them and
make sure they can talk to each other in a meaningful way.&lt;/p&gt;

&lt;p&gt;Security is a particularly sensitive issue as deployments struggle to
isolate TLS certificates or application credentials from applications.
Kubernetes makes big promises in that regard and it is true that
isolating software in microservices can limit the scope of compromises.
The solution emerging for this problem is the &quot;service mesh&quot; concept
pioneered by Linkerd, which consists of deploying tools to coordinate,
route, and monitor clusters of interconnected containers. Tools like
Istio and Conduit are designed to apply cluster-wide policies to
determine who can talk to what and how. Istio, for example, can
progressively deploy containers across the cluster to send only a
certain percentage of traffic to newly deployed code, which allows
detection of regressions. There is also work being done to ensure
standard end-to-end encryption and authentication of containers in the
&lt;a href=&quot;https://spiffe.io/&quot;&gt;SPIFFE&lt;/a&gt; project, which is useful in environments
with untrusted networks.&lt;/p&gt;

&lt;p&gt;Another issue is that Kubernetes is just a set of nuts and bolts to
manage containers: users get all the parts and it&#39;s not always clear
what to do with them to get a platform matching their requirements. It
will be interesting to see how the community moves forward in building
higher-level abstractions on top of it. Several tools competing in that
space were featured at the conference:
&lt;a href=&quot;https://openshift.io/&quot;&gt;OpenShift&lt;/a&gt;,
&lt;a href=&quot;https://coreos.com/tectonic/&quot;&gt;Tectonic&lt;/a&gt;,
&lt;a href=&quot;http://rancher.com/&quot;&gt;Rancher&lt;/a&gt;, and &lt;a href=&quot;https://kasten.io/&quot;&gt;Kasten&lt;/a&gt;, though
there are many more out there.&lt;/p&gt;

&lt;p&gt;The 1.9 Kubernetes release should be coming out in early 2018; it will
&lt;a href=&quot;https://kubernetes.io/docs/reference/workloads-18-19/&quot;&gt;stabilize the Workloads
API&lt;/a&gt; that was
introduced in 1.8 and add Windows containers (for those who like .NET)
in beta. There will also be &lt;em&gt;three&lt;/em&gt; KubeCon conferences in 2018 (in
Copenhagen, Shanghai, and Seattle). Stay tuned for more articles from
KubeCon Austin 2017 ...&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;em&gt;This article &lt;a href=&quot;https://lwn.net/Articles/741301/&quot;&gt;first appeared&lt;/a&gt; in the &lt;a href=&quot;http://lwn.net/&quot;&gt;Linux Weekly News&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt; </description> 
	<pubDate>Fri, 29 Dec 2017 18:23:19 +0000</pubDate>

</item> 
<item>
	<title>Shirish Agarwal: The VR Show</title>
	<guid>http://flossexperiences.wordpress.com/?p=4181</guid>
	<link>https://flossexperiences.wordpress.com/2017/12/29/the-vr-show/</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/shirish.png&quot; width=&quot;80&quot; height=&quot;80&quot; alt=&quot;&quot; align=&quot;right&quot; style=&quot;float: right;&quot;&gt;  &lt;p&gt;One of the things If I had got the visa on time for Debconf 15 (Germany) apart from the conference itself was the attention on VR (Virtual Reality) and AR (Augmented Reality) . I had heard the hype so much for so many years that I wanted to experience and did know that with Debianities who might be perhaps a bit better in crystal-gazing and would have perhaps more of an idea as I had then. The only VR which I knew about was from Hollywood movies and some VR videos but that doesn’t tell you anything. Also while movie like Chota-Chetan and others clicked they were far lesser immersive than true VR has to be. &lt;/p&gt;
&lt;p&gt;I was glad that it didn’t happen after the fact as in 2016 while going to the South African Debconf I experienced VR at Qatar Airport in a Samsung showroom. I was quite surprised as how heavy the headset was and also surprised by how little content they had. Something which has been hyped for 20 odd years had not much to show for it. I was also able to trick the VR equipment as the eye/motion tracking was not good enough so if you put shook the head fast enough it couldn’t keep up with you. &lt;/p&gt;
&lt;p&gt;I shared the above as I was invited to another VR conference by a web-programmer/designer friend Mahendra couple of months ago here in Pune itself . We attended the conference and were showcased quite a few success stories. One of the stories which was liked by the geek in me was framastore’s &lt;a href=&quot;http://framestorevr.com/field-trip-to-mars&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;360 Mars VR Experience on a bus&lt;/a&gt; the link shows how the framastore developers mapped Mars or part of Mars on Washington D.C. streets and how kids were able to experience how it would feel to be on Mars without knowing any of the risks the astronauts or the pioneers would have to face if we do get the money, the equipment and the technology to send people to Mars. In reality we are still decades from making such a trip keeping people safe to Mars and back or to have Mars for the rest of their life.  &lt;/p&gt;
&lt;p&gt;If my understanding is correct, the gravity of Mars is half of earth and once people settle there they or their &lt;a href=&quot;https://en.wikipedia.org/wiki/Exoskeleton&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;exoskeleton&lt;/a&gt; would no longer be able to support Earth’s gravity, at least a generation who is born on Mars. &lt;/p&gt;
&lt;p&gt;An interesting take on how things might turn out is shown in ‘&lt;a href=&quot;https://en.wikipedia.org/wiki/The_Expanse_(TV_series)&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;The Expanse&lt;/a&gt;‘ &lt;/p&gt;
&lt;p&gt;But this is taking away from the topic at hand. While I saw the newer generation &lt;a href=&quot;https://en.wikipedia.org/wiki/Virtual_reality_headset&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;VR headsets&lt;/a&gt; there are still a bit ways off. It would be interesting once the headset becomes similar to eye-glasses and you do not have to either be tethered to a power unit or need to lug a heavy backpack full of dangerous lithium-ion battery. The chemistry for battery or some sort of self-powered unit would need to be much more safer, lighter. &lt;/p&gt;
&lt;p&gt;While being in the conference and seeing the various scenarios being played out between potential developers and marketeers, it crossed my mind that people were not at all thinking of safe-guarding users privacy. Right from what games or choices you make to your biometric and other body sensitive information which has a high chance of being misused by companies and individuals. &lt;/p&gt;
&lt;p&gt;There were also questions about how Sony and other developers are asking insane amounts for use of their SDK to develop content while it should be free as games and any content is going to enhance the marketability of their own ecosystem. For both the above questions (privacy and security asked by me) and SDK-related questions asked by some of the potential developers were not really answered. &lt;/p&gt;
&lt;p&gt;At the end, they also showed AR or Augmented Reality which to my mind has much more potential to be used for reskilling and upskilling of young populations such as India and other &lt;a href=&quot;https://en.wikipedia.org/wiki/List_of_countries_by_median_age&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;young populous&lt;/a&gt; countries.  It was interesting to note that both China and the U.S. are inching towards the older demographics while India would relatively be a still young country till another 20-30 odd years. Most of the other young countries (by median age) seem to be in the African continent and I believe (might be a myth) is that they are young because most of the countries are still tribal-like and they still are perhaps a lot of &lt;a href=&quot;https://en.wikipedia.org/wiki/Civil_war&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;civil wars&lt;/a&gt; for resources. &lt;/p&gt;
&lt;p&gt;I was underwhelmed by what they displayed in Augmented Reality, part of which I do understand that there may be lot many people or companies working on their &lt;a href=&quot;https://en.wikipedia.org/wiki/Intellectual_property&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;IP&lt;/a&gt; and hence didn’t want to share or show or show a very rough work so their idea doesn’t get stolen. &lt;/p&gt;
&lt;p&gt;I was also hoping somebody would take about &lt;a href=&quot;https://en.wikipedia.org/wiki/Virtual_reality_sickness&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;motion-sickness&lt;/a&gt; or motion displacement similar to what people feel when they are train-lagged or &lt;a href=&quot;https://en.wikipedia.org/wiki/Jet_lag&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;jet-lagged&lt;/a&gt;. I am surprised that wikipedia still doesn’t have an article on train-lag as millions of Indians go through the process every year. The one which is most pronounced on Indian Railways is&lt;a href=&quot;https://en.wikipedia.org/wiki/Motion_sickness#Motion_is_felt_but_not_seen&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt; Motion being felt but not seen&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;There are both challenges and opportunities provided by VR and AR but until costs come down both in terms of complexity, support and costs (for both the deployer and the user) it would remain a distant dream. &lt;/p&gt;
&lt;p&gt;There are scores of ideas that could be used or done. For instance, the whole of North India is one big palace in the sense that there are palaces built by Kings and queens which have their own myth and lore over centuries. A story-teller could use a modern story and use say something like &lt;a href=&quot;https://en.wikipedia.org/wiki/Chota_Imambara&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;Chota Imambara&lt;/a&gt; or/and &lt;a href=&quot;https://en.wikipedia.org/wiki/Bara_Imambara&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;Bara Imambara&lt;/a&gt; where there have been lots of stories of people getting lost in the alleyways. &lt;/p&gt;
&lt;p&gt;Such sort of lore, myths and mysteries are all over India. &lt;a href=&quot;https://en.wikipedia.org/wiki/Ramayana&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;The Ramayana&lt;/a&gt; and the &lt;a href=&quot;https://en.wikipedia.org/wiki/Mahabharata&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;Mahabharata&lt;/a&gt; are just two of the epics which tell how grand the tales could be spun. &lt;a href=&quot;https://en.wikipedia.org/wiki/Indus_Valley_Civilisation&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;The History of Indus Valley Civilization&lt;/a&gt; till date and the modern contestations to it are others which come to my mind. &lt;/p&gt;
&lt;p&gt;Even the humble &lt;a href=&quot;https://en.wikipedia.org/wiki/Panchatantra&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;Panchtantra&lt;/a&gt; can be re-born and retold to generations who have forgotten it. I can’t express it much better as the variety of stories and contrasts to offer as bolokids &lt;a href=&quot;http://www.bolokids.com/index.php?md=Content&amp;amp;sd=Articles&amp;amp;ArticleID=397&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;does&lt;/a&gt; as well as SRK did in &lt;a href=&quot;http://www.hindustantimes.com/bollywood/srk-invokes-vasudhaiva-kutumbakam-at-iffi-says-india-land-of-stories-fables-cultural-history/story-vAZ6omyYdrGFaCfkjkC77O.html&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;opening&lt;/a&gt; of IFFI. Even something like &lt;a href=&quot;http://www.imdb.com/title/tt7659080/&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;Khakee&lt;/a&gt; which is based on true incidents and a real-life inspector could be retold in so many ways. Even &lt;a href=&quot;http://www.imdb.com/title/tt5997928/&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;Mukti Bhavan&lt;/a&gt; which I saw few months ago, coincidentally before I became ill tells of stories which have complex stories and each person or persons have their own rich background which on VR could be much more explored. &lt;/p&gt;
&lt;p&gt;Even titles such as the ever-famous Harry Potter or even the ever-beguiling &lt;a href=&quot;https://en.wikipedia.org/wiki/Rendezvous_with_Rama&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;RAMA&lt;/a&gt; could be shared and retooled for generations to come. The &lt;a href=&quot;https://en.wikipedia.org/wiki/The_Immortals_of_Meluha&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;Shiva Trilogy&lt;/a&gt; is another one which comes to my mind which could be retold as well.  There was another RAMA trilogy by the same author and another competing one which comes out in 2018 by an author called &lt;a href=&quot;http://www.theramatrilogy.com/&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;PJ Annan&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;We would need to work out the complexities of both hardware, bandwidth and the technologies but stories or content waiting to be developed is aplenty. &lt;/p&gt;
&lt;p&gt;Once upon a time I had the opportunity to work, develop and understand make-believe walk-throughs (2-d blueprints animated/bought to life and shown to investors/clients) for potential home owners in a society (this was in the hey-days and heavy days of growth circa around y2k ) , it was 2d or 2.5 d environment, tools were lot more complex and I was the most inept person as I had no idea of what camera positioning and what source of light meant. &lt;/p&gt;
&lt;p&gt;Apart from the gimmickry that was shown, I thought it would have been interesting if people had shared both the creative and the budget constraints while working in immersive technologies and bringing something good enough for the client. There was some discussion in a ham-handed way but not enough as there was considerable interest from youngsters to try this new medium but many lacked both the opportunities, knowledge, the equipment and the software stack to make it a reality. &lt;/p&gt;
&lt;p&gt;Lastly, as far as the literature I have just shared bits and pieces of just the Indian English literature. There are 16 recognized Indian languages and all of them have a vibrant literature scene. Just to take an example, Bengal has been a bed-rock of new Bengali Detective stories &lt;a href=&quot;https://en.wikipedia.org/wiki/Category:Bengali_detective_writers&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;all the time&lt;/a&gt;. I think I had shared the history of Bengali Crime fiction sometime back as well but nevertheless here &lt;a href=&quot;https://thegrowlery2014.wordpress.com/2014/01/26/the-great-bengali-detectives-part-1/&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;it&lt;/a&gt; is again. &lt;/p&gt;
&lt;p&gt;So apart from games, galleries, 3-d visual interactive visual novels with alternative endings could make for some interesting immersive experiences provided we are able to shed the costs and the technical challenges to make it a reality.&lt;/p&gt;&lt;br /&gt;Filed under: &lt;a href=&quot;https://flossexperiences.wordpress.com/category/miscellenous/&quot;&gt;Miscellenous&lt;/a&gt; Tagged: &lt;a href=&quot;https://flossexperiences.wordpress.com/tag/augmented-reality/&quot;&gt;#Augmented Reality&lt;/a&gt;, &lt;a href=&quot;https://flossexperiences.wordpress.com/tag/debconf-south-africa-2016/&quot;&gt;#Debconf South Africa 2016&lt;/a&gt;, &lt;a href=&quot;https://flossexperiences.wordpress.com/tag/epics/&quot;&gt;#Epics&lt;/a&gt;, &lt;a href=&quot;https://flossexperiences.wordpress.com/tag/framastore/&quot;&gt;#framastore&lt;/a&gt;, &lt;a href=&quot;https://flossexperiences.wordpress.com/tag/indian-literature/&quot;&gt;#indian literature&lt;/a&gt;, &lt;a href=&quot;https://flossexperiences.wordpress.com/tag/mars-trip/&quot;&gt;#Mars trip&lt;/a&gt;, &lt;a href=&quot;https://flossexperiences.wordpress.com/tag/median-age-population-inded/&quot;&gt;#median age population inded&lt;/a&gt;, &lt;a href=&quot;https://flossexperiences.wordpress.com/tag/motion-sickness/&quot;&gt;#motion sickness&lt;/a&gt;, &lt;a href=&quot;https://flossexperiences.wordpress.com/tag/palaces/&quot;&gt;#Palaces&lt;/a&gt;, &lt;a href=&quot;https://flossexperiences.wordpress.com/tag/planet-debian/&quot;&gt;#planet-debian&lt;/a&gt;, &lt;a href=&quot;https://flossexperiences.wordpress.com/tag/pune-vr-conference/&quot;&gt;#Pune VR Conference&lt;/a&gt;, &lt;a href=&quot;https://flossexperiences.wordpress.com/tag/rama/&quot;&gt;#RAMA&lt;/a&gt;, &lt;a href=&quot;https://flossexperiences.wordpress.com/tag/rama-trilogy/&quot;&gt;#RAMA trilogy&lt;/a&gt;, &lt;a href=&quot;https://flossexperiences.wordpress.com/tag/samsung-vr/&quot;&gt;#Samsung VR&lt;/a&gt;, &lt;a href=&quot;https://flossexperiences.wordpress.com/tag/shiva-trilogy/&quot;&gt;#Shiva Trilogy&lt;/a&gt;, &lt;a href=&quot;https://flossexperiences.wordpress.com/tag/the-expanse/&quot;&gt;#The Expanse&lt;/a&gt;, &lt;a href=&quot;https://flossexperiences.wordpress.com/tag/virtual-reality/&quot;&gt;#Virtual Reality&lt;/a&gt;, &lt;a href=&quot;https://flossexperiences.wordpress.com/tag/vr-headsets/&quot;&gt;#VR Headsets&lt;/a&gt;, &lt;a href=&quot;https://flossexperiences.wordpress.com/tag/walkthroughs/&quot;&gt;#walkthroughs&lt;/a&gt;, &lt;a href=&quot;https://flossexperiences.wordpress.com/tag/privacy/&quot;&gt;Privacy&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/flossexperiences.wordpress.com/4181/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/flossexperiences.wordpress.com/4181/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godelicious/flossexperiences.wordpress.com/4181/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/flossexperiences.wordpress.com/4181/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gofacebook/flossexperiences.wordpress.com/4181/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/flossexperiences.wordpress.com/4181/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gotwitter/flossexperiences.wordpress.com/4181/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/flossexperiences.wordpress.com/4181/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gostumble/flossexperiences.wordpress.com/4181/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/flossexperiences.wordpress.com/4181/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godigg/flossexperiences.wordpress.com/4181/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/flossexperiences.wordpress.com/4181/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/goreddit/flossexperiences.wordpress.com/4181/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/flossexperiences.wordpress.com/4181/&quot; /&gt;&lt;/a&gt; </description> 
	<pubDate>Fri, 29 Dec 2017 16:39:24 +0000</pubDate>

</item> 
<item>
	<title>Steinar H. Gunderson: Compute rescaling progress</title>
	<guid>http://blog.sesse.net/blog/tech/2017-12-29-14-18_compute_rescaling_progress.html</guid>
	<link>http://blog.sesse.net/blog/tech/2017-12-29-14-18_compute_rescaling_progress.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;My Lanczos rescaling compute shader for &lt;a href=&quot;https://movit.sesse.net/&quot;&gt;Movit&lt;/a&gt;
is finally nearing usable performance improvements:&lt;/p&gt;

&lt;pre&gt;BM_ResampleEffectInt8/Fragment/Int8Downscale/1280/720/640/360         3149 us      69.7767M pixels/s
BM_ResampleEffectInt8/Fragment/Int8Downscale/1280/720/320/180         2720 us      20.1983M pixels/s
BM_ResampleEffectHalf/Fragment/Float16Downscale/1280/720/640/360      3777 us      58.1711M pixels/s
BM_ResampleEffectHalf/Fragment/Float16Downscale/1280/720/320/180      3269 us      16.8054M pixels/s

BM_ResampleEffectInt8/Compute/Int8Downscale/1280/720/640/360          2007 us      109.479M pixels/s  [+ 56.9%]
BM_ResampleEffectInt8/Compute/Int8Downscale/1280/720/320/180          1609 us      34.1384M pixels/s  [+ 69.0%]
BM_ResampleEffectHalf/Compute/Float16Downscale/1280/720/640/360       2057 us      106.843M pixels/s  [+ 56.7%]
BM_ResampleEffectHalf/Compute/Float16Downscale/1280/720/320/180       1633 us      33.6394M pixels/s  [+100.2%]
&lt;/pre&gt;

&lt;p&gt;Some tuning and bugfixing still needed; this is on my Haswell
(the NVIDIA results are somewhat different). Upscaling also
on its way. :-)&lt;/p&gt; </description> 
	<pubDate>Fri, 29 Dec 2017 13:18:00 +0000</pubDate>

</item> 
<item>
	<title>Martin-&amp;#201;ric Racine: Jackpot</title>
	<guid>tag:blogger.com,1999:blog-20663524.post-5248294449841494188</guid>
	<link>http://q-funk.blogspot.com/2017/12/jackpot.html</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/qfunk.png&quot; width=&quot;57&quot; height=&quot;85&quot; alt=&quot;&quot; align=&quot;right&quot; style=&quot;float: right;&quot;&gt;  &lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://d3vsgec5pd3juy.cloudfront.net/wp-content-new/uploads/ap/sites/23/2017/12/jytky-1024x932.jpg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://d3vsgec5pd3juy.cloudfront.net/wp-content-new/uploads/ap/sites/23/2017/12/jytky-1024x932.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
I have no idea whatsover of how I achieved this, but there you go. This citizen&#39;s legal draft is moving forward to the Finnish parliament. </description> 
	<pubDate>Fri, 29 Dec 2017 11:11:03 +0000</pubDate>
  <author>noreply@blogger.com (Martin-Éric)</author>  
</item> 
<item>
	<title>Russ Allbery: Review: One Fell Sweep</title>
	<guid>https://www.eyrie.org/~eagle/reviews/books/1-943772-71-1.html</guid>
	<link>https://www.eyrie.org/~eagle/reviews/books/1-943772-71-1.html</link>
     <description>  &lt;p&gt;Review: &lt;cite&gt;One Fell Sweep&lt;/cite&gt;, by Ilona Andrews&lt;/p&gt;

&lt;table&gt;
  &lt;tbody&gt;&lt;tr&gt;
    &lt;td&gt;Series:&lt;/td&gt;
    &lt;td&gt;Innkeeper Chronicles #3&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Publisher:&lt;/td&gt;
    &lt;td&gt;NYLA&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Copyright:&lt;/td&gt;
    &lt;td&gt;2016&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;ISBN:&lt;/td&gt;
    &lt;td&gt;1-943772-71-1&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Format:&lt;/td&gt;
    &lt;td&gt;Kindle&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Pages:&lt;/td&gt;
    &lt;td&gt;326&lt;/td&gt;
  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;

&lt;p&gt;
This is the third book of the Innkeeper Chronicles series, and this isn&#39;t
the sort of series to read out of order.  Each book contains substantial
spoilers for the previous books, and the characterization and plot
benefits from the foundation of previous installments.
&lt;/p&gt;

&lt;p&gt;
Sean has not fully recovered from the events of &lt;a href=&quot;https://www.eyrie.org/~eagle/reviews/books/1-943772-32-0.html&quot;&gt;&lt;cite&gt;Sweep in Peace&lt;/cite&gt;&lt;/a&gt;.  Dina is still unsure about the parameters of
their friendship, or whatever it is.  But some initial overtures at
processing that complexity are cut off by a Ku with far more enthusiasm
than sense arriving in the neighborhood on a boost bike at two in the
morning.  A Ku with a message from Dina&#39;s sister, asking for help.
&lt;/p&gt;

&lt;p&gt;
&lt;cite&gt;One Fell Sweep&lt;/cite&gt; moves farther and farther from urban fantasy in
setting, although it still uses the urban fantasy style of first-person
narration and an underground group of misfits who know the &quot;real truth&quot;
about how the world works.  This story opens with a rescue mission to
another planet (aided by Dina calling on favors from previous books), and
then segues into the main plot: a hunted species of aliens approach Dina
for aid in accessing a solution to their plight, one they&#39;ve already paid
dearly for.  The result is an episodic and escalating series of threats,
both inside the inn and in some away missions.  This is much more
entertaining than it had any right to be given the repetitive structure.
There isn&#39;t a great deal of plot here, and much of it is predictable, but
there&#39;s a lot of competence porn.  And I &lt;em&gt;like&lt;/em&gt; these people and
enjoy reading about them.
&lt;/p&gt;

&lt;p&gt;
This series isn&#39;t philosophically deep by any stretch, but Andrews does do
a good job of avoiding pitfalls and keeping it entertaining.  For example,
the aliens are being hunted by religious fanatics who think killing them
will send their executioners directly to paradise, but this isn&#39;t as close
of an analogy to real-world stereotypes as it may seem in a brief
description.  Andrews mixes enough different sources together and gives
the aliens enough unique characterization that the real-world analogies
are muted at best.  If there is a common theme, it&#39;s a suspicion of
hierarchical religions, or just about any other hierarchical structure.
(I suspect it&#39;s obviously American.)
&lt;/p&gt;

&lt;p&gt;
The main new characters in this entry are Dina&#39;s sister and her sister&#39;s
daughter, both of whom are a delight.  Andrews is very good at the feeling
of family: Dina and her sister are very different people with very
different interests, but they have a family similarity and mutual
knowledge that comes from growing up in the same house with the same
parents.  And Dina&#39;s sister is just as competent as she is, albeit in
somewhat different ways.  She&#39;s spent much of her life with what this
series calls vampires (more like religious Klingons with some of their own
unique traditions), and she&#39;s raising a half-vampire child who managed to
entirely escape my normal dislike of child characters in adult books.
&lt;/p&gt;

&lt;p&gt;
It&#39;s also a refreshing change from a lot of urban fantasy that Andrews
doesn&#39;t drag out the love triangle established in the first book.  For
once, the resolution obvious to the reader appears to also be obvious to
the characters.
&lt;/p&gt;

&lt;p&gt;
I would say that this book is again a notch above the previous books in
the series.  Sadly, the climax involves a deeply irritating section that
sidelines Dina in a way that I found totally out of character.  Key parts
of the conclusion happen to her rather than because of her.  Given that
the agency of the protagonist is one of the things I like the most about
this series, I found that disappointing and difficult to read, and thought
the way that event resolved was infuriatingly dumb.  Andrews is mostly
above that sort of thing, but occasionally slips into banal tropes.  The
grand revelation about the hunted alien race was also just a little too
neat.  In both cases, I would have appreciated more nuanced messiness and
internal courage, and less after-school-special morality.
&lt;/p&gt;

&lt;p&gt;
But other than some missteps at the end, this is another surprisingly good
book in a series that is much more fun than I had expected.  It&#39;s darker
and more serious than &lt;a href=&quot;https://www.eyrie.org/~eagle/reviews/books/1-62517-343-1.html&quot;&gt;&lt;cite&gt;Clean Sweep&lt;/cite&gt;&lt;/a&gt;, but
still the sort of book in which you can be fairly certain nothing truly
bad is going to happen to the protagonists.  Just the sort of thing when
one is in the mood for highly competent characters showing a creatively
wide range of villains why they shouldn&#39;t be underestimated.
&lt;/p&gt;

&lt;p&gt;
There&#39;s a clear setup for a sequel, but neither the title nor the
publication date have been announced yet, although there&#39;s apparently an
upcoming novella about Dina&#39;s sister.
&lt;/p&gt;

&lt;p&gt;Rating: 8 out of 10&lt;/p&gt; </description> 
	<pubDate>Fri, 29 Dec 2017 02:40:00 +0000</pubDate>

</item> 
<item>
	<title>Sean Whitton: Debian Policy call for participation -- December 2017</title>
	<guid>https://spwhitton.name//blog/entry/policydec17/</guid>
	<link>https://spwhitton.name//blog/entry/policydec17/</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/spwhitton.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;Yesterday we released Debian Policy 4.1.3.0, containing patches from
numerous different contributors, some of them first-time
contributors.  Thank you to everyone who was involved!&lt;/p&gt;

&lt;p&gt;Please consider getting involved in preparing the next release of
Debian Policy, which is likely to be uploaded sometime around the end
of January.&lt;/p&gt;

&lt;h1&gt;Consensus has been reached and help is needed to write a patch&lt;/h1&gt;

&lt;p&gt;&lt;a href=&quot;https://bugs.debian.org/780725&quot;&gt;#780725&lt;/a&gt; PATH used for building is not specified&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://bugs.debian.org/793499&quot;&gt;#793499&lt;/a&gt; The Installed-Size algorithm is out-of-date&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://bugs.debian.org/823256&quot;&gt;#823256&lt;/a&gt; Update maintscript arguments with dpkg &amp;gt;= 1.18.5&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://bugs.debian.org/833401&quot;&gt;#833401&lt;/a&gt; virtual packages: dbus-session-bus, dbus-default-session-bus&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://bugs.debian.org/835451&quot;&gt;#835451&lt;/a&gt; Building as root should be discouraged&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://bugs.debian.org/838777&quot;&gt;#838777&lt;/a&gt; Policy 11.8.4 for x-window-manager needs update for freedesktop menus&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://bugs.debian.org/845715&quot;&gt;#845715&lt;/a&gt; Please document that packages are not allowed to write outside thei…&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://bugs.debian.org/853779&quot;&gt;#853779&lt;/a&gt; Clarify requirements about update-rc.d and invoke-rc.d usage in mai…&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://bugs.debian.org/874019&quot;&gt;#874019&lt;/a&gt; Note that the ’-e’ argument to x-terminal-emulator works like ’–’&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://bugs.debian.org/874206&quot;&gt;#874206&lt;/a&gt; allow a trailing comma in package relationship fields&lt;/p&gt;

&lt;h1&gt;Wording proposed, awaiting review from anyone and/or seconds by DDs&lt;/h1&gt;

&lt;p&gt;&lt;a href=&quot;https://bugs.debian.org/515856&quot;&gt;#515856&lt;/a&gt; remove get-orig-source&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://bugs.debian.org/582109&quot;&gt;#582109&lt;/a&gt; document triggers where appropriate&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://bugs.debian.org/610083&quot;&gt;#610083&lt;/a&gt; Remove requirement to document upstream source location in debian/c…&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://bugs.debian.org/645696&quot;&gt;#645696&lt;/a&gt; [copyright-format] clearer definitions and more consistent License:…&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://bugs.debian.org/649530&quot;&gt;#649530&lt;/a&gt; [copyright-format] clearer definitions and more consistent License:…&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://bugs.debian.org/662998&quot;&gt;#662998&lt;/a&gt; stripping static libraries&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://bugs.debian.org/682347&quot;&gt;#682347&lt;/a&gt; mark ‘editor’ virtual package name as obsolete&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://bugs.debian.org/737796&quot;&gt;#737796&lt;/a&gt; copyright-format: support Files: paragraph with both abbreviated na…&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://bugs.debian.org/742364&quot;&gt;#742364&lt;/a&gt; Document debian/missing-sources&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://bugs.debian.org/756835&quot;&gt;#756835&lt;/a&gt; Extension of the syntax of the Packages-List field.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://bugs.debian.org/786470&quot;&gt;#786470&lt;/a&gt; [copyright-format] Add an optional “License-Grant” field&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://bugs.debian.org/835451&quot;&gt;#835451&lt;/a&gt; Building as root should be discouraged&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://bugs.debian.org/845255&quot;&gt;#845255&lt;/a&gt; Include best practices for packaging database applications&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://bugs.debian.org/846970&quot;&gt;#846970&lt;/a&gt; Proposal for a Build-Indep-Architecture: control file field&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://bugs.debian.org/864615&quot;&gt;#864615&lt;/a&gt; please update version of posix standard for scripts (section 10.4)&lt;/p&gt; </description> 
	<pubDate>Thu, 28 Dec 2017 22:47:06 +0000</pubDate>

</item> 
<item>
	<title>Jonathan Dowland: Get rid of the backpack</title>
	<guid>http://jmtd.net/log/backpack/</guid>
	<link>http://jmtd.net/log/backpack/</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;In 2008 I read a &lt;a href=&quot;http://web.archive.org/web/20110607220653/http://diveintomark.org/archives/2008/11/03/the-pursuit-of-happiness&quot;&gt;blog
post&lt;/a&gt;
by Mark Pilgrim which made a profound impact on me, although I
didn&#39;t realise it at the time. It was&lt;/p&gt;

&lt;blockquote&gt;
  &lt;ol&gt;
  &lt;li&gt;Stop buying stuff you don’t need&lt;/li&gt;
  &lt;li&gt;Pay off all your credit cards&lt;/li&gt;
  &lt;li&gt;Get rid of all the stuff that doesn’t fit in your house/apartment (storage lockers, etc.)&lt;/li&gt;
  &lt;li&gt;Get rid of all the stuff that doesn’t fit on the first floor of your house (attic, garage, etc.)&lt;/li&gt;
  &lt;li&gt;Get rid of all the stuff that doesn’t fit in one room of your house&lt;/li&gt;
  &lt;li&gt;Get rid of all the stuff that doesn’t fit in a suitcase&lt;/li&gt;
  &lt;li&gt;Get rid of all the stuff that doesn’t fit in a backpack&lt;/li&gt;
  &lt;li&gt;Get rid of the backpack&lt;/li&gt;
  &lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;At the time I first read it, I think I could see (and concur) with the logic
behind the first few points, but not further. Revisiting it now I can agree
much further along the list and I&#39;m wondering if I&#39;m brave enough to get to
the last step, or anywhere near it.&lt;/p&gt;

&lt;p&gt;Mark was obviously going on a journey, and another stopping-off point for him
on that journey was to &lt;a href=&quot;http://jmtd.net/log/infocide/&quot;&gt;delete his entire online persona&lt;/a&gt;, which is
why I&#39;ve linked to the &lt;a href=&quot;http://web.archive.org&quot;&gt;Wayback Machine&lt;/a&gt; copy of the
blog post.&lt;/p&gt; </description> 
	<pubDate>Thu, 28 Dec 2017 22:43:26 +0000</pubDate>

</item> 
<item>
	<title>Jonathan Dowland: Successive Heresies</title>
	<guid>http://jmtd.net/log/heresy/</guid>
	<link>http://jmtd.net/log/heresy/</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 prefer the book &lt;em&gt;The Hobbit&lt;/em&gt; to &lt;em&gt;The Lord Of The Rings&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;I much prefer the &lt;em&gt;Hobbit&lt;/em&gt; movies to the &lt;em&gt;LOTR&lt;/em&gt; movies.&lt;/p&gt;

&lt;p&gt;I &lt;em&gt;like&lt;/em&gt; the fact the &lt;em&gt;Hobbit&lt;/em&gt; movies were extended with material
not in the original book: I&#39;m glad there are female characters. I
love the additional material with Radagast the Brown.  I love the
singing and poems and sense of fun preserved from what was a novel
for children.&lt;/p&gt;

&lt;p&gt;I find the foreshadowing of Sauron in &lt;em&gt;The Hobbit&lt;/em&gt; movies to more
effectively convey a sense of dread and power than actual Sauron
in the &lt;em&gt;LOTR&lt;/em&gt; movies.&lt;/p&gt;

&lt;p&gt;Whilst I am generally bored by large CGI battles, I find the skirmishes
in &lt;em&gt;The Hobbit&lt;/em&gt; movies to be less boring than the epic-scale ones in
&lt;em&gt;LOTR&lt;/em&gt;.&lt;/p&gt; </description> 
	<pubDate>Thu, 28 Dec 2017 13:37:38 +0000</pubDate>

</item> 
<item>
	<title>Reproducible builds folks: Reproducible Builds: Weekly report #139</title>
	<guid>https://reproducible.alioth.debian.org/blog/posts/139/</guid>
	<link>https://reproducible.alioth.debian.org/blog/posts/139/</link>
     <description>  &lt;p&gt;Here&#39;s what happened in the &lt;a href=&quot;https://reproducible-builds.org&quot;&gt;Reproducible
Builds&lt;/a&gt; effort between Sunday December 17 and
Saturday December 23 2017:&lt;/p&gt;

&lt;h2&gt;Packages reviewed and fixed, and bugs filed&lt;/h2&gt;

&lt;p&gt;Bugs filed in Debian:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chris Lamb:

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/884677&quot;&gt;#884677&lt;/a&gt; filed against &lt;a href=&quot;https://tracker.debian.org/pkg/bitseq&quot;&gt;bitseq&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/884714&quot;&gt;#884714&lt;/a&gt; filed against &lt;a href=&quot;https://tracker.debian.org/pkg/gtranslator&quot;&gt;gtranslator&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/884936&quot;&gt;#884936&lt;/a&gt; filed against &lt;a href=&quot;https://tracker.debian.org/pkg/nanoc&quot;&gt;nanoc&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/885063&quot;&gt;#885063&lt;/a&gt; filed against &lt;a href=&quot;https://tracker.debian.org/pkg/cairomm&quot;&gt;cairomm&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Bugs filed in openSUSE:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bernhard M. Wiedemann:

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://build.opensuse.org/request/show/558817&quot;&gt;WindowMaker&lt;/a&gt; (merged) -
use modification date of ChangeLog, upstreamable&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://build.opensuse.org/request/show/559102&quot;&gt;ntp&lt;/a&gt; (merged) - drop date&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://build.opensuse.org/request/show/559126&quot;&gt;bzflag&lt;/a&gt; - version upgrade
to include already-upstreamed &lt;code&gt;SOURCE_DATE_EPOCH&lt;/code&gt; patch&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;Reviews of unreproducible packages&lt;/h2&gt;

&lt;p&gt;20 package reviews have been added, 36 have been updated and 32 have been removed in this week,
adding to our knowledge about &lt;a href=&quot;https://tests.reproducible-builds.org/debian/index_issues.html&quot;&gt;identified issues&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Weekly QA work&lt;/h2&gt;

&lt;p&gt;During our reproducibility testing, FTBFS bugs have been detected and reported by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Adrian Bunk (6)&lt;/li&gt;
&lt;li&gt;Matthias Klose (8)&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;diffoscope development&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Juliana Oliveira Rodrigues:

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/reproducible/diffoscope.git/commit/?id=f4e50d7&quot;&gt;tests: comparators: test_rlib: fixes llvm &amp;gt;= 5.0 test case&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Chris Lamb:

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/reproducible/diffoscope.git/commit/?id=18364f4&quot;&gt;Support Android ROM boot.img introspection. (Closes: #884557)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Holger Levsen:

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/reproducible/diffoscope.git/commit/?id=f8adedc&quot;&gt;Update Standards-Version to 4.1.2. No changes required.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;strip-nondeterminism development&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Holger Levsen:

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/reproducible/strip-nondeterminism.git/commit/?id=c86804f&quot;&gt;Update Standards-Version to 4.1.2. No changes required.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;disorderfs development&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Holger Levsen:

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/reproducible/disorderfs.git/commit/?id=e75793e&quot;&gt;Update Standards-Version to 4.1.2. No changes required.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/reproducible/disorderfs.git/commit/?id=679c675&quot;&gt;d/control: Declare that disorderfs doesn&#39;t need root to build.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;reprotest development&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Holger Levsen:

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/reproducible/reprotest.git/commit/?id=1836b1f&quot;&gt;d/control: Declare that strip-nondeterminism doesn&#39;t need root to build.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;reproducible-website development&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Chris Lamb:

&lt;ul&gt;
&lt;li&gt;rws3:

&lt;ul&gt;
&lt;li&gt;Huge number of formatting improvements, typo fixes, capitalisation&lt;/li&gt;
&lt;li&gt;Add section headings to make splitting up easier.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Holger Levsen:

&lt;ul&gt;
&lt;li&gt;rws3:

&lt;ul&gt;
&lt;li&gt;Add a disclaimer that this part of the website is a Work-In-Progress.&lt;/li&gt;
&lt;li&gt;Split notes from each session into separate pages (6 sessions).&lt;/li&gt;
&lt;li&gt;Other formatting and style fixes.&lt;/li&gt;
&lt;li&gt;Link to Ludovic Courtès&#39; &lt;a href=&quot;https://www.gnu.org/software/guix/blog/2017/reproducible-builds-a-status-update/&quot;&gt;notes on GNU
Guix&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Ximin Luo:

&lt;ul&gt;
&lt;li&gt;rws3:

&lt;ul&gt;
&lt;li&gt;Format agenda.md to look like previous years&#39;, and other fixes&lt;/li&gt;
&lt;li&gt;Split notes from each session into separate pages (1 session).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;jenkins.debian.net development&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Hans-Christoph Steiner:

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/qa/jenkins.debian.net.git/commit/?id=874ff3e9&quot;&gt;reproducible fdroid: update cleanup_all to kill random daemons leftover&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Holger Levsen:

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/qa/jenkins.debian.net.git/commit/?id=dd9b5305&quot;&gt;make dsa-check-running-kernel work with changes in Ubuntu LTS. WIP, not yet deployed to all the other hosts&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;Misc.&lt;/h2&gt;

&lt;p&gt;This week&#39;s edition was written by Ximin Luo and Bernhard M. Wiedemann &amp;amp;
reviewed by a bunch of Reproducible Builds folks on IRC &amp;amp; the mailing lists.&lt;/p&gt; </description> 
	<pubDate>Thu, 28 Dec 2017 12:55:15 +0000</pubDate>

</item> 
<item>
	<title>Vincent Bernat: (Micro)benchmarking Linux kernel functions</title>
	<guid>http://www.luffy.cx/en/blog/2017-linux-kernel-microbenchmark.html</guid>
	<link>https://vincent.bernat.im/en/blog/2017-linux-kernel-microbenchmark</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;Usually, the performance of a Linux subsystem is measured through an
external (local or remote) process stressing it. Depending on the
input point used, a large portion of code may be involved. To
benchmark a single function, one solution is to write a &lt;strong&gt;kernel
module&lt;/strong&gt;.&lt;/p&gt;
&lt;div class=&quot;toc&quot;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://vincent.bernat.im#minimal-kernel-module&quot;&gt;Minimal kernel module&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://vincent.bernat.im#configurable-parameters&quot;&gt;Configurable parameters&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://vincent.bernat.im#meaningful-statistics&quot;&gt;Meaningful statistics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://vincent.bernat.im#benchmark-validity&quot;&gt;Benchmark validity&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://vincent.bernat.im#alternative&quot;&gt;Alternative&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h1 id=&quot;minimal-kernel-module&quot;&gt;Minimal kernel module&lt;/h1&gt;
&lt;p&gt;Let’s suppose we want to benchmark the IPv4 route lookup function,
&lt;code&gt;fib_lookup()&lt;/code&gt;. The following kernel function executes 1,000 lookups
for 8.8.8.8 and returns the average value.&lt;sup id=&quot;fnref-loop&quot;&gt;&lt;a class=&quot;footnote-ref&quot; href=&quot;https://vincent.bernat.im#fn-loop&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; It uses the
&lt;code&gt;get_cycles()&lt;/code&gt; function to compute the execution “time.”&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;cm&quot;&gt;/* Execute a benchmark on fib_lookup() and put&lt;/span&gt;
&lt;span class=&quot;cm&quot;&gt;   result into the provided buffer `buf`. */&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;do_bench&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;n&quot;&gt;buf&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;unsigned&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;long&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;long&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;t1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;t2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;unsigned&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;long&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;long&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;total&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;kt&quot;&gt;unsigned&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;long&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;kt&quot;&gt;unsigned&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;count&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1000&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;err&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;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fib_result&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;res&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;flowi4&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fl4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;memset&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;fl4&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;k&quot;&gt;sizeof&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fl4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;fl4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;daddr&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;in_aton&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;8.8.8.8&quot;&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;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;count&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;n&quot;&gt;t1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;get_cycles&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;hll&quot;&gt;        &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fib_lookup&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;init_net&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;fl4&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;res&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&gt;        &lt;span class=&quot;n&quot;&gt;t2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;get_cycles&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;total&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;t2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;t1&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;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;err&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;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scnprintf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;buf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;PAGE_SIZE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;err=%d msg=&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;lookup error&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&quot;\n&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scnprintf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;buf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;PAGE_SIZE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;avg=%llu&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;total&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;count&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;Now, we need to embed this function in a kernel module. The following
code registers a &lt;em&gt;sysfs&lt;/em&gt; directory containing a pseudo-file
&lt;code&gt;run&lt;/code&gt;. When a user queries this file, the module runs the benchmark
function and returns the result as content.&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;cp&quot;&gt;#define pr_fmt(fmt) &quot;kbench: &quot; fmt&lt;/span&gt;

&lt;span class=&quot;cp&quot;&gt;#include&lt;/span&gt; &lt;span class=&quot;cpf&quot;&gt;&amp;lt;linux/kernel.h&amp;gt;&lt;/span&gt;&lt;span class=&quot;cp&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;cp&quot;&gt;#include&lt;/span&gt; &lt;span class=&quot;cpf&quot;&gt;&amp;lt;linux/version.h&amp;gt;&lt;/span&gt;&lt;span class=&quot;cp&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;cp&quot;&gt;#include&lt;/span&gt; &lt;span class=&quot;cpf&quot;&gt;&amp;lt;linux/module.h&amp;gt;&lt;/span&gt;&lt;span class=&quot;cp&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;cp&quot;&gt;#include&lt;/span&gt; &lt;span class=&quot;cpf&quot;&gt;&amp;lt;linux/inet.h&amp;gt;&lt;/span&gt;&lt;span class=&quot;cp&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;cp&quot;&gt;#include&lt;/span&gt; &lt;span class=&quot;cpf&quot;&gt;&amp;lt;linux/timex.h&amp;gt;&lt;/span&gt;&lt;span class=&quot;cp&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;cp&quot;&gt;#include&lt;/span&gt; &lt;span class=&quot;cpf&quot;&gt;&amp;lt;net/ip_fib.h&amp;gt;&lt;/span&gt;&lt;span class=&quot;cp&quot;&gt;&lt;/span&gt;

&lt;span class=&quot;cm&quot;&gt;/* When a user fetches the content of the &quot;run&quot; file, execute the&lt;/span&gt;
&lt;span class=&quot;cm&quot;&gt;   benchmark function. */&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;ssize_t&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;run_show&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;kobject&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;kobj&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;kobj_attribute&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;attr&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;n&quot;&gt;buf&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;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;do_bench&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;buf&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;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;kobj_attribute&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;run_attr&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;__ATTR_RO&lt;/span&gt;&lt;span class=&quot;p&quot;&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;static&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;attribute&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bench_attributes&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;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;run_attr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;attr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;nb&quot;&gt;NULL&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;attribute_group&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bench_attr_group&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;n&quot;&gt;attrs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;bench_attributes&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;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;kobject&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bench_kobj&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;init_module&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;void&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;n&quot;&gt;rc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;cm&quot;&gt;/* ❶ Create a simple kobject named &quot;kbench&quot; in /sys/kernel. */&lt;/span&gt;
&lt;span class=&quot;hll&quot;&gt;    &lt;span class=&quot;n&quot;&gt;bench_kobj&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;kobject_create_and_add&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;kbench&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;kernel_kobj&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/span&gt;    &lt;span class=&quot;k&quot;&gt;if&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;n&quot;&gt;bench_kobj&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ENOMEM&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;cm&quot;&gt;/* ❷ Create the files associated with this kobject. */&lt;/span&gt;
&lt;span class=&quot;hll&quot;&gt;    &lt;span class=&quot;n&quot;&gt;rc&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sysfs_create_group&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bench_kobj&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;bench_attr_group&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/span&gt;    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rc&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;kobject_put&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bench_kobj&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;rc&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;k&quot;&gt;return&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;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;cleanup_module&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;void&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;kobject_put&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bench_kobj&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;/* Metadata about this module */&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;MODULE_LICENSE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;GPL&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;MODULE_DESCRIPTION&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Microbenchmark for fib_lookup()&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;In ❶, &lt;code&gt;kobject_create_and_add()&lt;/code&gt; creates a new &lt;code&gt;kobject&lt;/code&gt; named
&lt;code&gt;kbench&lt;/code&gt;. A &lt;code&gt;kobject&lt;/code&gt; is the abstraction behind the &lt;em&gt;sysfs&lt;/em&gt;
filesystem. This new &lt;code&gt;kobject&lt;/code&gt; is visible as the &lt;code&gt;/sys/kernel/kbench/&lt;/code&gt;
directory.&lt;/p&gt;
&lt;p&gt;In ❷, &lt;code&gt;sysfs_create_group()&lt;/code&gt; attaches a set of attributes to
our &lt;code&gt;kobject&lt;/code&gt;. These attributes are materialized as files inside
&lt;code&gt;/sys/kernel/kbench/&lt;/code&gt;. Currently, we declare only one of them, &lt;code&gt;run&lt;/code&gt;,
with the &lt;code&gt;__ATTR_RO&lt;/code&gt; macro. The attribute is therefore read-only
(&lt;code&gt;0444&lt;/code&gt;) and when a user tries to fetch the content of the file, the
&lt;code&gt;run_show()&lt;/code&gt; function is invoked with a buffer of &lt;code&gt;PAGE_SIZE&lt;/code&gt; bytes as
last argument and is expected to return the number of bytes written.&lt;/p&gt;
&lt;p&gt;For more details, you can look at the &lt;a href=&quot;http://elixir.free-electrons.com/linux/v4.14.5/source/Documentation/kobject.txt&quot; title=&quot;Everything you never wanted to know about kobjects, ksets, and ktypes&quot;&gt;documentation in the
kernel&lt;/a&gt; and the &lt;a href=&quot;http://elixir.free-electrons.com/linux/v4.14.5/source/samples/kobject/kobject-example.c&quot; title=&quot;Sample kobject implementation&quot;&gt;associated example&lt;/a&gt;. Beware,
random posts found on the web (including this one) may be outdated.&lt;sup id=&quot;fnref-backward&quot;&gt;&lt;a class=&quot;footnote-ref&quot; href=&quot;https://vincent.bernat.im#fn-backward&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;The following &lt;code&gt;Makefile&lt;/code&gt; will compile this example:&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;# Kernel module compilation&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;KDIR&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; /lib/modules/&lt;span class=&quot;k&quot;&gt;$(&lt;/span&gt;shell uname -r&lt;span class=&quot;k&quot;&gt;)&lt;/span&gt;/build
&lt;span class=&quot;nv&quot;&gt;obj-m&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; kbench_mod.o
&lt;span class=&quot;nf&quot;&gt;kbench_mod.ko&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;kbench_mod&lt;/span&gt;.&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt;
    make -C &lt;span class=&quot;k&quot;&gt;$(&lt;/span&gt;KDIR&lt;span class=&quot;k&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;M&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;$(&lt;/span&gt;PWD&lt;span class=&quot;k&quot;&gt;)&lt;/span&gt; modules
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;After executing &lt;code&gt;make&lt;/code&gt;, you should get a &lt;code&gt;kbench_mod.ko&lt;/code&gt; file:&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; modinfo kbench_mod.ko
&lt;span class=&quot;go&quot;&gt;filename:       /home/bernat/code/…/kbench_mod.ko&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;description:    Microbenchmark for fib_lookup()&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;license:        GPL&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;depends:&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;name:           kbench_mod&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;vermagic:       4.14.0-1-amd64 SMP mod_unload modversions&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;You can load it and execute the benchmark:&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; insmod ./kbench_mod.ko
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; ls -l /sys/kernel/kbench/run
&lt;span class=&quot;go&quot;&gt;-r--r--r-- 1 root root 4096 déc.  10 16:05 /sys/kernel/kbench/run&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; cat /sys/kernel/kbench/run
&lt;span class=&quot;go&quot;&gt;avg=75&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The result is a number of cycles. You can get an approximate time in
nanoseconds if you divide it by the frequency of your processor in
gigahertz (25 ns if you have a 3 GHz processor).&lt;sup id=&quot;fnref-frequency&quot;&gt;&lt;a class=&quot;footnote-ref&quot; href=&quot;https://vincent.bernat.im#fn-frequency&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;h1 id=&quot;configurable-parameters&quot;&gt;Configurable parameters&lt;/h1&gt;
&lt;p&gt;The module hard-code two constants: the number of loops and the
destination address to test. We can make these parameters
user-configurable by exposing them as attributes of our &lt;code&gt;kobject&lt;/code&gt; and
define a pair of functions to read/write them:&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;unsigned&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;long&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;loop_count&lt;/span&gt;      &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5000&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;n&quot;&gt;u32&lt;/span&gt;           &lt;span class=&quot;n&quot;&gt;flow_dst_ipaddr&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;0x08080808&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;cm&quot;&gt;/* A mutex is used to ensure we are thread-safe when altering attributes. */&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;DEFINE_MUTEX&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;kb_lock&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;cm&quot;&gt;/* Show the current value for loop count. */&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;ssize_t&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;loop_count_show&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;kobject&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;kobj&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;kobj_attribute&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;attr&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;n&quot;&gt;buf&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;ssize_t&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;mutex_lock&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;kb_lock&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;res&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scnprintf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;buf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;PAGE_SIZE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;%lu&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;loop_count&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;mutex_unlock&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;kb_lock&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;res&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;/* Store a new value for loop count. */&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;ssize_t&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;loop_count_store&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;kobject&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;kobj&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;kobj_attribute&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;attr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                                &lt;span class=&quot;k&quot;&gt;const&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;n&quot;&gt;buf&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;n&quot;&gt;count&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;unsigned&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;long&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;val&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;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;kstrtoul&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;buf&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;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;val&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&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;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;val&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&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;return&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;EINVAL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;mutex_lock&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;kb_lock&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;loop_count&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;val&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;mutex_unlock&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;kb_lock&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;count&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;/* Show the current value for destination address. */&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;ssize_t&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;flow_dst_ipaddr_show&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;kobject&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;kobj&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;kobj_attribute&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;attr&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;n&quot;&gt;buf&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;ssize_t&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;mutex_lock&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;kb_lock&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;res&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scnprintf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;buf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;PAGE_SIZE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;%pI4&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&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;flow_dst_ipaddr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;mutex_unlock&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;kb_lock&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;res&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;/* Store a new value for destination address. */&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;ssize_t&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;flow_dst_ipaddr_store&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;kobject&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;kobj&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;kobj_attribute&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;attr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                                     &lt;span class=&quot;k&quot;&gt;const&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;n&quot;&gt;buf&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;n&quot;&gt;count&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;mutex_lock&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;kb_lock&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;flow_dst_ipaddr&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;in_aton&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;buf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;mutex_unlock&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;kb_lock&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;count&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;/* Define the new set of attributes. They are read/write attributes. */&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;kobj_attribute&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;loop_count_attr&lt;/span&gt;      &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;__ATTR_RW&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;loop_count&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;kobj_attribute&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;flow_dst_ipaddr_attr&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;__ATTR_RW&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;flow_dst_ipaddr&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;kobj_attribute&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;run_attr&lt;/span&gt;             &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;__ATTR_RO&lt;/span&gt;&lt;span class=&quot;p&quot;&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;static&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;attribute&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bench_attributes&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;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;loop_count_attr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;attr&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;flow_dst_ipaddr_attr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;attr&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;run_attr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;attr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;nb&quot;&gt;NULL&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The IPv4 address is stored as a 32-bit integer but displayed and
parsed using the dotted quad notation. The kernel provides the
appropriate helpers for this task.&lt;/p&gt;
&lt;p&gt;After this change, we have two new files in &lt;code&gt;/sys/kernel/kbench&lt;/code&gt;.  We
can read the current values and modify them:&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; /sys/kernel/kbench
&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt; ls -l
&lt;span class=&quot;go&quot;&gt;-rw-r--r-- 1 root root 4096 déc.  10 19:10 flow_dst_ipaddr&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;-rw-r--r-- 1 root root 4096 déc.  10 19:10 loop_count&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;-r--r--r-- 1 root root 4096 déc.  10 19:10 run&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt; cat loop_count
&lt;span class=&quot;go&quot;&gt;5000&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt; cat flow_dst_ipaddr
&lt;span class=&quot;go&quot;&gt;8.8.8.8&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;9&lt;/span&gt;.9.9.9 &amp;gt; flow_dst_ipaddr
&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt; cat flow_dst_ipaddr
&lt;span class=&quot;go&quot;&gt;9.9.9.9&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;We still need to alter the &lt;code&gt;do_bench()&lt;/code&gt; function to make use of these
parameters:&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;do_bench&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;n&quot;&gt;buf&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;/* … */&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;mutex_lock&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;kb_lock&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;count&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;loop_count&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;fl4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;daddr&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;flow_dst_ipaddr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;mutex_unlock&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;kb_lock&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;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;count&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;/* … */&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h1 id=&quot;meaningful-statistics&quot;&gt;Meaningful statistics&lt;/h1&gt;
&lt;p&gt;Currently, we only compute the average lookup time. This value is
usually inadequate:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A small number of &lt;strong&gt;outliers&lt;/strong&gt; can raise this value quite
   significantly. An outlier can happen because we were preempted out
   of &lt;span class=&quot;caps&quot;&gt;CPU&lt;/span&gt; while executing the benchmarked function. This doesn’t
   happen often if the function execution time is short (less than a
   millisecond), but when this happens, the outliers can be off by
   several milliseconds, which is enough to make the average
   inadequate when most values are several order of magnitude
   smaller. For this reason, the median usually gives a better view.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;strong&gt;distribution&lt;/strong&gt; may be asymmetrical or have several local
   maxima. It’s better to keep several percentiles or even a
   distribution graph.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To be able to extract meaningful statistics, we store the results in
an array.&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;do_bench&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;n&quot;&gt;buf&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;unsigned&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;long&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;long&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;results&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;cm&quot;&gt;/* … */&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;results&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;kmalloc&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;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;results&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;n&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;GFP_KERNEL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&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;n&quot;&gt;results&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scnprintf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;buf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;PAGE_SIZE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;msg=&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;no memory&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&quot;\n&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&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;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;count&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;n&quot;&gt;t1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;get_cycles&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fib_lookup&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;init_net&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;fl4&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;res&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;n&quot;&gt;t2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;get_cycles&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;hll&quot;&gt;        &lt;span class=&quot;n&quot;&gt;results&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;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;t2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;t1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/span&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;err&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;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;kfree&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;results&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;scnprintf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;buf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;PAGE_SIZE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;err=%d msg=&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;lookup error&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&quot;\n&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;err&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;/* Compute and display statistics */&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;display_statistics&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;buf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;results&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;kfree&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;results&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;strnlen&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;buf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;PAGE_SIZE&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;Then, We need an helper function to be able to compute percentiles:&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;unsigned&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;long&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;long&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;percentile&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;p&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                                     &lt;span class=&quot;kt&quot;&gt;unsigned&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;long&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;long&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sorted&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                                     &lt;span class=&quot;kt&quot;&gt;unsigned&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;count&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;n&quot;&gt;index&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;p&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;count&lt;/span&gt; &lt;span class=&quot;o&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;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;index2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;index&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;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;p&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;count&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;100&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;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sorted&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;index2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;index2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;index&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;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;index2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&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;index2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sorted&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;index&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;n&quot;&gt;sorted&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;index&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;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;/pre&gt;&lt;/div&gt;


&lt;p&gt;This function needs a sorted array as input. The kernel provides a
&lt;a href=&quot;http://elixir.free-electrons.com/linux/v4.14.5/source/lib/sort.c#L62&quot; title=&quot;Kernel sort() function&quot;&gt;heapsort function&lt;/a&gt;, &lt;code&gt;sort()&lt;/code&gt;, for this purpose. Another useful
value to have is the deviation from the median. Here is a function to
compute the &lt;a href=&quot;https://en.wikipedia.org/wiki/Median_absolute_deviation&quot; title=&quot;Median absolute deviation on Wikipedia&quot;&gt;median absolute deviation&lt;/a&gt;:&lt;sup id=&quot;fnref-mad&quot;&gt;&lt;a class=&quot;footnote-ref&quot; href=&quot;https://vincent.bernat.im#fn-mad&quot;&gt;4&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;unsigned&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;long&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;long&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;mad&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;unsigned&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;long&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;long&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sorted&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                              &lt;span class=&quot;kt&quot;&gt;unsigned&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;long&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;long&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;median&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                              &lt;span class=&quot;kt&quot;&gt;unsigned&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;count&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;unsigned&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;long&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;long&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dmedian&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;kmalloc&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;kt&quot;&gt;unsigned&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;long&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;long&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;n&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                                          &lt;span class=&quot;n&quot;&gt;GFP_KERNEL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;unsigned&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;long&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;long&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;kt&quot;&gt;unsigned&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;k&quot;&gt;if&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;n&quot;&gt;dmedian&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;return&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;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;count&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;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sorted&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;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;median&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;dmedian&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;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sorted&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;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;median&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;dmedian&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;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;median&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sorted&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;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;sort&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dmedian&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;count&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;kt&quot;&gt;unsigned&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;long&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;long&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;compare_ull&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;NULL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;res&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;percentile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;50&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dmedian&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;kfree&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dmedian&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;res&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 these two functions, we can provide additional statistics:&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;display_statistics&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;n&quot;&gt;buf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                               &lt;span class=&quot;kt&quot;&gt;unsigned&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;long&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;long&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;results&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                               &lt;span class=&quot;kt&quot;&gt;unsigned&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;long&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;count&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;unsigned&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;long&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;long&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;p95&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;p90&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;p50&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;sort&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;results&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;count&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;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;results&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;compare_ull&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;NULL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;count&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;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;scnprintf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;buf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;PAGE_SIZE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;msg=&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;no match&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&quot;\n&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&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;p95&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;percentile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;95&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;results&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;p90&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;percentile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;90&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;results&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;p50&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;percentile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;50&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;results&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;scnprintf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;buf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;PAGE_SIZE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;s&quot;&gt;&quot;min=%llu max=%llu count=%lu 95th=%llu 90th=%llu 50th=%llu mad=%llu&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;n&quot;&gt;results&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;n&quot;&gt;results&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;count&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;n&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;n&quot;&gt;p95&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;n&quot;&gt;p90&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;n&quot;&gt;p50&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;n&quot;&gt;mad&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;results&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;p50&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;count&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;We can also append a &lt;a href=&quot;https://github.com/vincentbernat/network-lab/blob/7cd27509497f19250c34f38af90178bf781fc163/lab-routes-ipv4/kbench_mod.c#L165-L207&quot;&gt;graph of the distribution function&lt;/a&gt; (and of
the cumulative distribution function):&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;min=72 max=33364 count=100000 95th=154 90th=142 50th=112 mad=6
    value │                      ┊                         count
       72 │                                                   51
       77 │▒                                                3548
       82 │▒▒░░                                             4773
       87 │▒▒░░░░░                                          5918
       92 │░░░░░░░                                          1207
       97 │░░░░░░░                                           437
      102 │▒▒▒▒▒▒░░░░░░░░                                  12164
      107 │▒▒▒▒▒▒▒░░░░░░░░░░░░░░                           15508
      112 │▒▒▒▒▒▒▒▒▒▒▒░░░░░░░░░░░░░░░░░░░░░░               23014
      117 │▒▒▒░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░             6297
      122 │░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░              905
      127 │▒░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░           3845
      132 │▒▒▒░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░       6687
      137 │▒▒░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░     4884
      142 │▒▒░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░   4133
      147 │░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░  1015
      152 │░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░  1123
&lt;/pre&gt;&lt;/div&gt;


&lt;h1 id=&quot;benchmark-validity&quot;&gt;Benchmark validity&lt;/h1&gt;
&lt;p&gt;While the benchmark produces some figures, we may question their
validity. There are several traps when writing a microbenchmark:&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;dead code&lt;/dt&gt;
&lt;dd&gt;Compiler may optimize away our benchmark because the result is not
  used. In our example, we ensure to combine the result in a variable
  to avoid this.&lt;/dd&gt;
&lt;dt&gt;warmup phase&lt;/dt&gt;
&lt;dd&gt;One-time initializations may affect negatively the benchmark. This
  is less likely to happen with C code since there is no
  &lt;abbr title=&quot;Just-in-time (compiler)&quot;&gt;&lt;span class=&quot;caps&quot;&gt;JIT&lt;/span&gt;&lt;/abbr&gt;. Nonetheless, you may want to add a small &lt;a href=&quot;https://github.com/vincentbernat/network-lab/blob/7cd27509497f19250c34f38af90178bf781fc163/lab-routes-ipv4/kbench_mod.c#L258-L265&quot;&gt;warmup phase&lt;/a&gt;.&lt;/dd&gt;
&lt;dt&gt;too small dataset&lt;/dt&gt;
&lt;dd&gt;If the benchmark is running using the same input parameters over and
  over, the input data may fit entirely in the L1 cache. This affects
  positively the benchmark. Therefore, it is important to
  &lt;a href=&quot;https://github.com/vincentbernat/network-lab/blob/7cd27509497f19250c34f38af90178bf781fc163/lab-routes-ipv6/kbench_mod.c#L278-L309&quot;&gt;iterate over a large dataset&lt;/a&gt;.&lt;/dd&gt;
&lt;dt&gt;too regular dataset&lt;/dt&gt;
&lt;dd&gt;A regular dataset may still affect positively the benchmark despite
  its size. While the whole dataset will not fit into L1/L2 cache, the
  previous run may have loaded most of the data needed for the current
  run. In the route lookup example, as route entries are organized in
  a tree, it’s important to not linearly scan the address
  space. Address space could be explored randomly (a
  &lt;a href=&quot;https://github.com/vincentbernat/network-lab/blob/7cd27509497f19250c34f38af90178bf781fc163/lab-routes-ipv6/kbench_mod.c#L113-L116&quot;&gt;simple linear congruential generator&lt;/a&gt; brings reproducible
  randomness).&lt;/dd&gt;
&lt;dt&gt;large overhead&lt;/dt&gt;
&lt;dd&gt;If the benchmarked function runs in a few nanoseconds, the overhead
  of the benchmark infrastructure may be too high. Typically, the
  overhead of the method presented here is around 5
  nanoseconds. &lt;code&gt;get_cycles()&lt;/code&gt; is a thin wrapper around the
  &lt;a href=&quot;https://en.wikipedia.org/wiki/Time_Stamp_Counter&quot; title=&quot;Time Stamp Counter on Wikipedia&quot;&gt;&lt;span class=&quot;caps&quot;&gt;RDTSC&lt;/span&gt; instruction&lt;/a&gt;: it returns the number of cycles for the current
  processor since last reset. It’s also virtualized with low-overhead
  in case you run the benchmark in a virtual machine. If you want to
  measure a function with a greater precision, you need to wrap it in
  a loop. However, the loop itself adds to the overhead, notably if
  you need to compute a large input set (in this case, the input can
  be prepared). Compilers also like to mess with loops. At last, a loop
  hides the result distribution.&lt;/dd&gt;
&lt;dt&gt;preemption&lt;/dt&gt;
&lt;dd&gt;While the benchmark is running, the thread executing it can be
  preempted (or when running in a virtual machine, the whole virtual
  machine can be preempted by the host). When the function takes less
  than a millisecond to execute, one can assume preemption is rare
  enough to be filtered out by using a percentile function.&lt;/dd&gt;
&lt;dt&gt;noise&lt;/dt&gt;
&lt;dd&gt;When running the benchmark, noise from unrelated processes (or
  sibling hosts when benchmarking in a virtual machine) needs to be
  avoided as it may change from one run to another. Therefore, it is
  not a good idea to benchmark in a public cloud. On the other hand,
  adding controlled noise to the benchmark may lead to less artificial
  results: in our example, route lookup is only a small part of
  routing a packet and measuring it alone in a tight loop affects
  positively the benchmark.&lt;/dd&gt;
&lt;dt&gt;syncing parallel benchmarks&lt;/dt&gt;
&lt;dd&gt;While it is possible (and safe) to run several benchmarks in
  parallel, it may be difficult to ensure they really run in parallel:
  some invocations may work in better conditions because other threads
  are not running yet, skewing the result. Ideally, each run should
  execute bogus iterations and start measures only when all runs are
  present. This doesn’t seem a trivial addition.&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;As a conclusion, the benchmark module presented here is quite
primitive (notably compared to a framework like &lt;a href=&quot;http://openjdk.java.net/projects/code-tools/jmh/&quot; title=&quot;OpenJDK jmh&quot;&gt;&lt;span class=&quot;caps&quot;&gt;JMH&lt;/span&gt;&lt;/a&gt; for Java) but,
with care, can deliver some conclusive results like in these posts:
“&lt;a href=&quot;https://vincent.bernat.im/en/blog/2017-ipv4-route-lookup-linux&quot; title=&quot;IPv4 route lookup on Linux&quot;&gt;IPv4 route lookup on Linux&lt;/a&gt;” and “&lt;a href=&quot;https://vincent.bernat.im/en/blog/2017-ipv6-route-lookup-linux&quot; title=&quot;IPv6 route lookup on Linux&quot;&gt;IPv6 route lookup on Linux&lt;/a&gt;.”&lt;/p&gt;
&lt;h1 id=&quot;alternative&quot;&gt;Alternative&lt;/h1&gt;
&lt;p&gt;Use of a tracing tool is an alternative approach. For example, if we
want to benchmark IPv4 route lookup times, we can use the following
process:&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;while&lt;/span&gt; true&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
  ip route get &lt;span class=&quot;k&quot;&gt;$((&lt;/span&gt;RANDOM%100&lt;span class=&quot;k&quot;&gt;))&lt;/span&gt;.&lt;span class=&quot;k&quot;&gt;$((&lt;/span&gt;RANDOM%100&lt;span class=&quot;k&quot;&gt;))&lt;/span&gt;.&lt;span class=&quot;k&quot;&gt;$((&lt;/span&gt;RANDOM%100&lt;span class=&quot;k&quot;&gt;))&lt;/span&gt;.5
  sleep &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;.1
&lt;span class=&quot;k&quot;&gt;done&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Then, we instrument the &lt;code&gt;__fib_lookup()&lt;/code&gt; function with &lt;abbr title=&quot;Extended Berkeley Packet Filter&quot;&gt;eBPF&lt;/abbr&gt; (through
&lt;a href=&quot;https://github.com/iovisor/bcc&quot; title=&quot;BCC - Tools for BPF-based Linux IO analysis, networking, monitoring, and more&quot;&gt;&lt;span class=&quot;caps&quot;&gt;BCC&lt;/span&gt;&lt;/a&gt;):&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt; sudo funclatency-bpfcc __fib_lookup
&lt;span class=&quot;go&quot;&gt;Tracing 1 functions for &quot;__fib_lookup&quot;... Hit Ctrl-C to end.&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;^C&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;     nsecs               : count     distribution&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;         0 -&amp;gt; 1          : 0        |                    |&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;         2 -&amp;gt; 3          : 0        |                    |&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;         4 -&amp;gt; 7          : 0        |                    |&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;         8 -&amp;gt; 15         : 0        |                    |&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;        16 -&amp;gt; 31         : 0        |                    |&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;        32 -&amp;gt; 63         : 0        |                    |&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;        64 -&amp;gt; 127        : 0        |                    |&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;       128 -&amp;gt; 255        : 0        |                    |&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;       256 -&amp;gt; 511        : 3        |*                   |&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;       512 -&amp;gt; 1023       : 1        |                    |&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;      1024 -&amp;gt; 2047       : 2        |*                   |&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;      2048 -&amp;gt; 4095       : 13       |******              |&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;      4096 -&amp;gt; 8191       : 42       |********************|&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Currently, the overhead is quite high, as a route lookup on an empty
routing table is less than 100 ns. Once Linux supports &lt;a href=&quot;https://lwn.net/Articles/740831/&quot; title=&quot;tracing: Inter-event (e.g. latency) support&quot;&gt;inter-event
tracing&lt;/a&gt;, the overhead of this solution may be reduced to be usable
for such microbenchmarks.&lt;/p&gt;
&lt;div class=&quot;footnote&quot;&gt;
&lt;hr /&gt;
&lt;ol&gt;
&lt;li id=&quot;fn-loop&quot;&gt;
&lt;p&gt;In this simple case, it may be more accurate to use:&lt;/p&gt;
&lt;div class=&quot;codehilite&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;get_cycles&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;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;count&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;n&quot;&gt;err&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fib_lookup&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;err&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;n&quot;&gt;t2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;get_cycles&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;total&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;t2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;t1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;However, this prevents us to compute more statistics. Moreover,
when you need to provide a non-constant input to the &lt;code&gt;fib_lookup()&lt;/code&gt;
function, the first way is likely to be more accurate. &lt;a class=&quot;footnote-backref&quot; href=&quot;https://vincent.bernat.im#fnref-loop&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-backward&quot;&gt;
&lt;p&gt;In-kernel &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; backward compatibility is a &lt;a href=&quot;http://elixir.free-electrons.com/linux/v4.14.5/source/Documentation/process/stable-api-nonsense.rst&quot; title=&quot;The Linux Kernel Driver Interface&quot;&gt;non-goal&lt;/a&gt; of
the Linux kernel. &lt;a class=&quot;footnote-backref&quot; href=&quot;https://vincent.bernat.im#fnref-backward&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-frequency&quot;&gt;
&lt;p&gt;You can get the current frequency with &lt;code&gt;cpupower
  frequency-info&lt;/code&gt;. As the frequency may vary (even when using the
  &lt;code&gt;performance&lt;/code&gt; governor), this may not be accurate but this still
  provides an easier representation (comparable results should use the
  same frequency). &lt;a class=&quot;footnote-backref&quot; href=&quot;https://vincent.bernat.im#fnref-frequency&quot; title=&quot;Jump back to footnote 3 in the text&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-mad&quot;&gt;
&lt;p&gt;Only integer arithmetic is available in the kernel. While it
is possible to approximate a standard deviation using only
integers, the median absolute deviation just reuses the
&lt;code&gt;percentile()&lt;/code&gt; function defined above. &lt;a class=&quot;footnote-backref&quot; href=&quot;https://vincent.bernat.im#fnref-mad&quot; title=&quot;Jump back to footnote 4 in the text&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt; </description> 
	<pubDate>Thu, 28 Dec 2017 09:27:30 +0000</pubDate>

</item> 
<item>
	<title>Ritesh Raj Sarraf: Freezing of tasks failed</title>
	<guid>https://www.researchut.com/302 at https://www.researchut.com</guid>
	<link>https://www.researchut.com/blog/freezing-task-failure</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/rrs.png&quot; width=&quot;75&quot; height=&quot;80&quot; alt=&quot;&quot; align=&quot;right&quot; style=&quot;float: right;&quot;&gt;  &lt;div class=&quot;field field-name-body field-type-text-with-summary field-label-hidden view-mode-rss&quot;&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;p&gt;It is interesting how a user-space task could lead to hinder a Linux kernel software suspend operation.&lt;/p&gt;
&lt;pre class=&quot;rteindent1&quot;&gt;[11735.155443] PM: suspend entry (deep)
[11735.155445] PM: Syncing filesystems ... done.
[11735.215091] [drm:wait_panel_status [i915]] *ERROR* PPS state mismatch
[11735.215172] [drm:wait_panel_status [i915]] *ERROR* PPS state mismatch
[11735.558676] rfkill: input handler enabled
[11735.608859] (NULL device *): firmware: direct-loading firmware rtlwifi/rtl8723befw_36.bin
[11735.609910] (NULL device *): firmware: direct-loading firmware rtl_bt/rtl8723b_fw.bin
[11735.611871] Freezing user space processes ... 
[11755.615603] Freezing of tasks failed after 20.003 seconds (1 tasks refusing to freeze, wq_busy=0):
[11755.615854] digikam         D    0 13262  13245 0x00000004
[11755.615859] Call Trace:
[11755.615873]  __schedule+0x28e/0x880
[11755.615878]  schedule+0x2c/0x80
[11755.615889]  request_wait_answer+0xa3/0x220 [fuse]
[11755.615895]  ? finish_wait+0x80/0x80
[11755.615902]  __fuse_request_send+0x86/0x90 [fuse]
[11755.615907]  fuse_request_send+0x27/0x30 [fuse]
[11755.615914]  fuse_send_readpages.isra.30+0xd1/0x120 [fuse]
[11755.615920]  fuse_readpages+0xfd/0x110 [fuse]
[11755.615928]  __do_page_cache_readahead+0x200/0x2d0
[11755.615936]  filemap_fault+0x37b/0x640
[11755.615940]  ? filemap_fault+0x37b/0x640
[11755.615944]  ? filemap_map_pages+0x179/0x320
[11755.615950]  __do_fault+0x1e/0xb0
[11755.615953]  __handle_mm_fault+0xc8a/0x1160
[11755.615958]  handle_mm_fault+0xb1/0x200
[11755.615964]  __do_page_fault+0x257/0x4d0
[11755.615968]  do_page_fault+0x2e/0xd0
[11755.615973]  page_fault+0x22/0x30
[11755.615976] RIP: 0033:0x7f32d3c7ff90
[11755.615978] RSP: 002b:00007ffd887c9d18 EFLAGS: 00010246
[11755.615981] RAX: 00007f32d3fc9c50 RBX: 000000000275e440 RCX: 0000000000000003
[11755.615982] RDX: 0000000000000002 RSI: 00007ffd887c9f10 RDI: 000000000275e440
[11755.615984] RBP: 00007ffd887c9f10 R08: 000000000275e820 R09: 00000000018d2f40
[11755.615986] R10: 0000000000000002 R11: 0000000000000000 R12: 000000000189cbc0
[11755.615987] R13: 0000000001839dc0 R14: 000000000275e440 R15: 0000000000000000
[11755.616014] OOM killer enabled.
[11755.616015] Restarting tasks ... done.
[11755.817640] PM: suspend exit
[11755.817698] PM: suspend entry (s2idle)
[11755.817700] PM: Syncing filesystems ... done.
[11755.983156] rfkill: input handler disabled
[11756.030209] rfkill: input handler enabled
[11756.073529] Freezing user space processes ... 
[11776.084309] Freezing of tasks failed after 20.010 seconds (2 tasks refusing to freeze, wq_busy=0):
[11776.084630] digikam         D    0 13262  13245 0x00000004
[11776.084636] Call Trace:
[11776.084653]  __schedule+0x28e/0x880
[11776.084659]  schedule+0x2c/0x80
[11776.084672]  request_wait_answer+0xa3/0x220 [fuse]
[11776.084680]  ? finish_wait+0x80/0x80
[11776.084688]  __fuse_request_send+0x86/0x90 [fuse]
[11776.084695]  fuse_request_send+0x27/0x30 [fuse]
[11776.084703]  fuse_send_readpages.isra.30+0xd1/0x120 [fuse]
[11776.084711]  fuse_readpages+0xfd/0x110 [fuse]
[11776.084721]  __do_page_cache_readahead+0x200/0x2d0
[11776.084730]  filemap_fault+0x37b/0x640
[11776.084735]  ? filemap_fault+0x37b/0x640
[11776.084743]  ? __update_load_avg_blocked_se.isra.33+0xa1/0xf0
[11776.084749]  ? filemap_map_pages+0x179/0x320
[11776.084755]  __do_fault+0x1e/0xb0
[11776.084759]  __handle_mm_fault+0xc8a/0x1160
[11776.084765]  handle_mm_fault+0xb1/0x200
[11776.084772]  __do_page_fault+0x257/0x4d0
[11776.084777]  do_page_fault+0x2e/0xd0
[11776.084783]  page_fault+0x22/0x30
[11776.084787] RIP: 0033:0x7f31ddf315e0
[11776.084789] RSP: 002b:00007ffd887ca068 EFLAGS: 00010202
[11776.084793] RAX: 00007f31de13c350 RBX: 00000000040be3f0 RCX: 000000000283da60
[11776.084795] RDX: 0000000000000001 RSI: 00000000040be3f0 RDI: 00000000040be3f0
[11776.084797] RBP: 00007f32d3fca1e0 R08: 0000000005679250 R09: 0000000000000020
[11776.084799] R10: 00000000058fc1b0 R11: 0000000004b9ac50 R12: 0000000000000000
[11776.084801] R13: 0000000000000001 R14: 0000000000000000 R15: 0000000000000000
[11776.084806] QXcbEventReader D    0 13268  13245 0x00000004
[11776.084810] Call Trace:
[11776.084817]  __schedule+0x28e/0x880
[11776.084823]  schedule+0x2c/0x80
[11776.084827]  rwsem_down_write_failed_killable+0x25a/0x490
[11776.084832]  call_rwsem_down_write_failed_killable+0x17/0x30
[11776.084836]  ? call_rwsem_down_write_failed_killable+0x17/0x30
[11776.084842]  down_write_killable+0x2d/0x50
[11776.084848]  do_mprotect_pkey+0xa9/0x2f0
[11776.084854]  SyS_mprotect+0x13/0x20
[11776.084859]  system_call_fast_compare_end+0xc/0x97
[11776.084861] RIP: 0033:0x7f32d1f7c057
[11776.084863] RSP: 002b:00007f32cbb8c8d8 EFLAGS: 00000206 ORIG_RAX: 000000000000000a
[11776.084867] RAX: ffffffffffffffda RBX: 00007f32c4000020 RCX: 00007f32d1f7c057
[11776.084869] RDX: 0000000000000003 RSI: 0000000000001000 RDI: 00007f32c4024000
[11776.084871] RBP: 00000000000000c5 R08: 00007f32c4000000 R09: 0000000000024000
[11776.084872] R10: 00007f32c4024000 R11: 0000000000000206 R12: 00000000000000a0
[11776.084874] R13: 00007f32c4022f60 R14: 0000000000001000 R15: 00000000000000e0
[11776.084906] OOM killer enabled.
[11776.084907] Restarting tasks ... done.
[11776.289655] PM: suspend exit
[11776.459624] IPv6: ADDRCONF(NETDEV_UP): wlp1s0: link is not ready
[11776.469521] rfkill: input handler disabled
[11776.978733] IPv6: ADDRCONF(NETDEV_UP): wlp1s0: link is not ready
[11777.038879] IPv6: ADDRCONF(NETDEV_UP): wlp1s0: link is not ready
[11778.022062] wlp1s0: authenticate with 50:8f:4c:82:4d:dd
[11778.033155] wlp1s0: send auth to 50:8f:4c:82:4d:dd (try 1/3)
[11778.038522] wlp1s0: authenticated
[11778.041511] wlp1s0: associate with 50:8f:4c:82:4d:dd (try 1/3)
[11778.059860] wlp1s0: RX AssocResp from 50:8f:4c:82:4d:dd (capab=0x431 status=0 aid=5)
[11778.060253] wlp1s0: associated
[11778.060308] IPv6: ADDRCONF(NETDEV_CHANGE): wlp1s0: link becomes ready
[11778.987669] [drm:wait_panel_status [i915]] *ERROR* PPS state mismatch
[11779.117608] [drm:wait_panel_status [i915]] *ERROR* PPS state mismatch
[11779.160930] [drm:wait_panel_status [i915]] *ERROR* PPS state mismatch
[11779.784045] [drm:wait_panel_status [i915]] *ERROR* PPS state mismatch
[11779.913668] [drm:wait_panel_status [i915]] *ERROR* PPS state mismatch
[11779.961517] [drm:wait_panel_status [i915]] *ERROR* PPS state mismatch
11:58 ♒♒♒   ☺    &lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;section class=&quot;field field-name-taxonomy-vocabulary-1 field-type-taxonomy-term-reference field-label-above view-mode-rss&quot;&gt;&lt;h2 class=&quot;field-label&quot;&gt;Categories: &lt;/h2&gt;&lt;ul class=&quot;field-items&quot;&gt;&lt;li class=&quot;field-item even&quot;&gt;&lt;a href=&quot;https://www.researchut.com/taxonomy/term/2&quot;&gt;Debian-Blog&lt;/a&gt;&lt;/li&gt;&lt;li class=&quot;field-item odd&quot;&gt;&lt;a href=&quot;https://www.researchut.com/taxonomy/term/1&quot;&gt;Computing&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/section&gt;&lt;section class=&quot;field field-name-taxonomy-vocabulary-2 field-type-taxonomy-term-reference field-label-above view-mode-rss&quot;&gt;&lt;h2 class=&quot;field-label&quot;&gt;Keywords: &lt;/h2&gt;&lt;ul class=&quot;field-items&quot;&gt;&lt;li class=&quot;field-item even&quot;&gt;&lt;a href=&quot;https://www.researchut.com/taxonomy/term/181&quot;&gt;linux&lt;/a&gt;&lt;/li&gt;&lt;li class=&quot;field-item odd&quot;&gt;&lt;a href=&quot;https://www.researchut.com/taxonomy/term/319&quot;&gt;swsusp&lt;/a&gt;&lt;/li&gt;&lt;li class=&quot;field-item even&quot;&gt;&lt;a href=&quot;https://www.researchut.com/taxonomy/term/320&quot;&gt;suspend&lt;/a&gt;&lt;/li&gt;&lt;li class=&quot;field-item odd&quot;&gt;&lt;a href=&quot;https://www.researchut.com/taxonomy/term/269&quot;&gt;power saving&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/section&gt;&lt;div class=&quot;field field-name-taxonomy-vocabulary-5 field-type-taxonomy-term-reference field-label-hidden view-mode-rss&quot;&gt;&lt;ul class=&quot;field-items&quot;&gt;&lt;li class=&quot;field-item even&quot;&gt;&lt;a href=&quot;https://www.researchut.com/taxonomy/term/157&quot;&gt;RHUT&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;section class=&quot;field field-name-field-like field-type-addthis field-label-above view-mode-rss&quot;&gt;&lt;h2 class=&quot;field-label&quot;&gt;Like: &lt;/h2&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt; </description> 
	<pubDate>Thu, 28 Dec 2017 06:33:59 +0000</pubDate>

</item> 
<item>
	<title>Russ Allbery: Tasker 0.4</title>
	<guid>https://www.eyrie.org/~eagle/journal/2017-12/007.html</guid>
	<link>https://www.eyrie.org/~eagle/journal/2017-12/007.html</link>
     <description>  &lt;p&gt;
As mentioned in my previous post, I&#39;m orphaning this package and won&#39;t be
working on it further.  I doubt anyone cares about my little experiment in
an extremely simple web task tracker with almost no features.  But Julien
ÉLIE sent me a few patches for it many years ago when he was experimenting
with it, and it seemed like a shame to let those die in my inbox.
&lt;/p&gt;

&lt;p&gt;
So this is a final release incorporating his fixes (including a few that
had been languishing in Git).  It has a variety of bug fixes to things
like URL encoding, error checking, and non-ASCII group name support.  I&#39;m
not using this any more, and must admit that I didn&#39;t even test this (and
it&#39;s Python 2, and the coding style is poor, etc.), so this is just an &quot;in
case it&#39;s useful to someone&quot; release.
&lt;/p&gt;

&lt;p&gt;
You can get the latest version from the &lt;a href=&quot;https://www.eyrie.org/~eagle/software/tasker/&quot;&gt;Tasker distribution page&lt;/a&gt;.
&lt;/p&gt; </description> 
	<pubDate>Thu, 28 Dec 2017 04:47:00 +0000</pubDate>

</item> 
<item>
	<title>Carl Chenet: Testing Ansible Playbooks With Vagrant</title>
	<guid>https://carlchenet.com/?p=5422</guid>
	<link>https://carlchenet.com/testing-ansible-playbooks-with-vagrant/</link>
     <description>  &lt;p&gt;I use Ansible to automate the deployments of my websites (&lt;a href=&quot;https://www.linuxjobs.fr&quot;&gt;LinuxJobs.fr&lt;/a&gt;, &lt;a href=&quot;https://www.journalduhacker.net&quot;&gt;Journal du hacker&lt;/a&gt;) and my applications (&lt;a href=&quot;https://gitlab.com/chaica/feed2toot&quot;&gt;Feed2toot&lt;/a&gt;, &lt;a href=&quot;https://gitlab.com/chaica/feed2tweet&quot;&gt;Feed2tweet&lt;/a&gt;). I’ll describe in this blog post my setup in order to test my Ansible Playbooks locally on my laptop.&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-5422&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;&lt;a href=&quot;https://www.ansible.com/&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;aligncenter size-medium wp-image-5446&quot; height=&quot;300&quot; src=&quot;https://carlchenet.com/wp-content/uploads/2017/12/ansible-300x300.png&quot; width=&quot;300&quot; /&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h2&gt;Why testing the Ansible Playbooks&lt;/h2&gt;
&lt;p&gt;I need a simple and a fast way to test the deployments of my Ansible Playbooks locally on my laptop, especially at the beginning of writing a new Playbook, because deploying directly on the production server is both reeeeally slow… and risky for my services in production.&lt;/p&gt;
&lt;p&gt;Instead of deploying on a remote server, I’ll deploy my Playbooks on a &lt;a href=&quot;https://www.virtualbox.org/&quot;&gt;VirtualBox&lt;/a&gt; using &lt;a href=&quot;https://www.vagrantup.com/&quot;&gt;Vagrant&lt;/a&gt;. This allows getting quickly the result of a new modification, iterating and fixing as fast as possible.&lt;/p&gt;
&lt;p&gt;Disclaimer: I am not a profesionnal programmer. There might exist better solutions and I’m only describing one solution of testing Ansible Playbooks I find both easy and efficient for my own use cases.&lt;/p&gt;
&lt;h2&gt;My process&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Begin writing the new Ansible Playbook&lt;/li&gt;
&lt;li&gt;Launch a fresh virtual machine (VM) and deploy the playbook on this VM using Vagrant&lt;/li&gt;
&lt;li&gt;Fix the issues either from the playbook either from the application deployed by Ansible itself&lt;/li&gt;
&lt;li&gt;Relaunch the deployment on the VM&lt;/li&gt;
&lt;li&gt;If more errors, go back to step 3. Otherwise destroy the VM, recreate it and deploy to test a last time with a fresh install&lt;/li&gt;
&lt;li&gt;If no error remains, tag the version of your Ansible Playbook and you’re ready to deploy in production&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;What you need&lt;/h2&gt;
&lt;p&gt;First, you need Virtualbox. If you use the &lt;a href=&quot;https://www.debian.org&quot;&gt;Debian&lt;/a&gt; distribution, &lt;a href=&quot;https://wiki.debian.org/VirtualBox&quot;&gt;this link&lt;/a&gt; describes how to install it, either from the Debian repositories either from the upstream.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.virtualbox.org/&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;aligncenter wp-image-5444 size-thumbnail&quot; height=&quot;150&quot; src=&quot;https://carlchenet.com/wp-content/uploads/2017/12/virtualbox-150x150.png&quot; width=&quot;150&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Second, you need Vagrant. Why Vagrant? Because it’s a kind of middleware between your development environment and your virtual machine, allowing programmatically reproducible operations and easy linking your deployments and the virtual machine. Install it with the following command:&lt;/p&gt;
&lt;pre&gt;# apt install vagrant&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://www.vagrantup.com/&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;aligncenter size-medium wp-image-5445&quot; height=&quot;98&quot; src=&quot;https://carlchenet.com/wp-content/uploads/2017/12/vagrant-300x98.png&quot; width=&quot;300&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Setting up Vagrant&lt;/h2&gt;
&lt;p&gt;Everything about Vagrant lies in the file Vagrantfile. Here is mine:&lt;/p&gt;
&lt;pre&gt;Vagrant.require_version &quot;&amp;gt;= 2.0.0&quot;

Vagrant.configure(1) do |config|

 config.vm.box = &quot;debian/stretch64&quot;
 config.vm.provision &quot;shell&quot;, inline: &quot;apt install --yes git python3-pip&quot;
 config.vm.provision &quot;ansible&quot; do |ansible|
   ansible.verbose = &quot;v&quot;
   ansible.playbook = &quot;site.yml&quot;
   ansible.vault_password_file = &quot;vault_password_file&quot;
 end
end
&lt;/pre&gt;
&lt;div class=&quot;wp-caption aligncenter&quot; id=&quot;attachment_791&quot;&gt;&lt;a href=&quot;https://www.debian.org&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;size-full wp-image-791&quot; height=&quot;82&quot; src=&quot;https://carlchenet.com/wp-content/uploads/2010/10/bouton-debian.jpg&quot; width=&quot;204&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Debian, the best OS to operate your online services&lt;/p&gt;&lt;/div&gt;
&lt;pre&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;The 1st line defines what versions of Vagrant should execute your Vagrantfile.&lt;/li&gt;
&lt;li&gt;The first loop of the file, you could define the following operations for as many virtual machines as you wish (here just 1).&lt;/li&gt;
&lt;li&gt;The 3rd line defines the official Vagrant image we’ll use for the virtual machine.&lt;/li&gt;
&lt;li&gt;The 4th line is really important: those are the missing apps we miss on the VM. Here we install git and python3-pip with apt.&lt;/li&gt;
&lt;li&gt;The next line indicates the start of the Ansible configuration.&lt;/li&gt;
&lt;li&gt;On the 6th line, we want a verbose output of Ansible.&lt;/li&gt;
&lt;li&gt;On the 7th line, we define the entry point of your Ansible Playbook.&lt;/li&gt;
&lt;li&gt;On the 8th line, if you use Ansible Vault to encrypt some files, just define here the file with your Ansible Vault passphrase.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;When Vagrant launches Ansible, it’s going to launch something like:&lt;/p&gt;
&lt;pre&gt;$  ansible-playbook --inventory-file=/home/me/ansible/test-ansible-playbook/.vagrant/provisioners/ansible/inventory -v --vault-password-file=vault_password_file site.yml&lt;/pre&gt;
&lt;h2&gt;Executing Vagrant&lt;/h2&gt;
&lt;p&gt;After writing your Vagrantfile, you need to launch your VM. It’s as simple as using the following command:&lt;/p&gt;
&lt;pre&gt;$ vagrant up&lt;/pre&gt;
&lt;p&gt;That’s a slow operation, because the VM will be launched, the additionnal apps you defined in the Vagrantfile will be installed and finally your Playbook will be deployed on it. You should sparsely use it.&lt;/p&gt;
&lt;p&gt;Ok, now we’re really ready to iterate fast. Between your different modifications, in order to test your deployments fast and on a regular basis, just use the following command:&lt;/p&gt;
&lt;pre&gt;$ vagrant provision&lt;/pre&gt;
&lt;p&gt;Once your Ansible Playbook is finally ready, usually after lots of iterations (at least that’s my case), you should test it on a fresh install, because your different iterations may have modified your virtual machine and could trigger unexpected results.&lt;/p&gt;
&lt;p&gt;In order to test it from a fresh install, use the following command:&lt;/p&gt;
&lt;pre&gt;$ vagrant destroy &amp;amp;&amp;amp; vagrant up&lt;/pre&gt;
&lt;p&gt;That’s again a slow operation. You should use it when you’re pretty sure your Ansible Playbook is almost finished. After testing your deployment on a fresh VM, you’re now ready to deploy in production.Or at least better prepared :p&lt;/p&gt;
&lt;h2&gt;Possible improvements? Let me know&lt;/h2&gt;
&lt;p&gt;I find the setup described in this blog post quite useful for my use cases. I can iterate quite fast especially when I begin writing a new playbook, not only on the playbook but sometimes on my own latest apps, not yet ready to be deployed in production. Deploying on a remote server would be both slow and dangerous for my services in production.&lt;/p&gt;
&lt;p&gt;I could use a continous integration (CI) server, but that’s not the topic of this blog post.  As said before, the goal is to iterate as fast as possible in the beginning of writing a new Ansible Playbook.&lt;/p&gt;
&lt;div class=&quot;wp-caption aligncenter&quot; id=&quot;attachment_3339&quot;&gt;&lt;a href=&quot;https://about.gitlab.com/features/gitlab-ci-cd/&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;wp-image-3339 size-thumbnail&quot; height=&quot;150&quot; src=&quot;https://carlchenet.com/wp-content/uploads/2016/01/gitlab-150x150.png&quot; width=&quot;150&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Gitlab, offering Continuous Integration and Continuous Deployment services&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Commiting, pushing to your Git repository and waiting for the execution of your CI tests is overkill at the beginning of your Ansible Playbook, when it’s full of errors waiting to be debugged one by one. I think CI is more useful later in the life of the Ansible Playbooks, especially when different people work on it and you have a set or code quality rules to enforce. That’s only my opinion and it’s open to discussion, one more time I’m not a professionnal programmer.&lt;/p&gt;
&lt;p&gt;If you have better solutions to test Ansible Playbooks or to improve the one describe here, let me know by writing a comment or by contacting me through my accounts on social networks below, I’ll be delighted to listen to your improvements.&lt;/p&gt;
&lt;h2&gt;About Me&lt;/h2&gt;
&lt;p&gt;Carl Chenet, Free Software Indie Hacker, Founder of &lt;a href=&quot;https://www.linuxjobs.fr&quot;&gt;LinuxJobs.fr&lt;/a&gt;, a job board for Free and Open Source Jobs in France.&lt;/p&gt;
&lt;h2&gt;Follow Me On Social Networks&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;My Mastodon account : &lt;a href=&quot;https://mastodon.social/@carlchenet&quot;&gt;@carlchenet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;My Diaspora* account : &lt;a href=&quot;https://framasphere.org/u/carlchenet&quot;&gt;@carlchenet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;My Twitter account : &lt;a href=&quot;https://twitter.com/carl_chenet&quot;&gt;@carl_chenet&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt; &lt;/p&gt; </description> 
	<pubDate>Wed, 27 Dec 2017 23:00:48 +0000</pubDate>

</item> 
<item>
	<title>Steve Kemp: Translating my website to Finnish</title>
	<guid>https://blog.steve.fi/translating_my_website_to_finnish.html</guid>
	<link>https://blog.steve.fi/translating_my_website_to_finnish.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;I&#39;ve now been living in Finland for two years, and I&#39;m pondering a small
project to translate my main website into Finnish.&lt;/p&gt;

&lt;p&gt;Obviously if my content is solely Finnish it will become of little
interest to the world - if my vanity lets me even pretend it is useful
at the moment!&lt;/p&gt;

&lt;p&gt;The traditional way to do this, with Apache, is to render pages in
multiple languages and let the client(s) request their preferred version
with &lt;code&gt;Accept-Language:&lt;/code&gt;.  Though it seems that many clients are terrible
at this, and the whole approach is a mess.  Pretending it works though
we render pages such as:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;index.html
index.en.html
index.fi.html
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Then &quot;magic happens&quot;, such that the right content is served.  I can
then do extra-things, like add links to &quot;English&quot; or &quot;Finnish&quot; in the
header/footers to let users choose.&lt;/p&gt;

&lt;p&gt;Unfortunately I have an immediate problem!  I host a bunch of websites
on a single machine and I don&#39;t want to allow a single site compromise 
to affect other sites.  To do that I run each website under its own Unix
user.  For example I have the website &quot;&lt;a href=&quot;https://steve.fi/&quot;&gt;steve.fi&lt;/a&gt;&quot;
running as the &quot;&lt;code&gt;s-fi&lt;/code&gt;&quot; user, and my blog runs as &quot;&lt;code&gt;s-blog&lt;/code&gt;&quot;, or &quot;&lt;code&gt;s-blogfi&lt;/code&gt;&quot;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;root@www ~ # psx -ef | egrep &#39;(s-blog|s-fi)&#39;
s-blogfi /usr/sbin/lighttpd -f /srv/blog.steve.fi/lighttpd.conf -D
s-blog   /usr/sbin/lighttpd -f /srv/blog.steve.org.uk/lighttpd.conf -D
s-fi     /usr/sbin/lighttpd -f /srv/steve.fi/lighttpd.conf -D
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;There you can see the Unix user, and the per-user instance of &lt;code&gt;lighttpd&lt;/code&gt;
which hosts the website.   Each instance binds to a high-port on
localhost, and I have a reverse proxy listening on the public IP address
to route incoming connections to the appropriate back-end instance.&lt;/p&gt;

&lt;p&gt;I used to use &lt;code&gt;thttpd&lt;/code&gt; but switched to &lt;code&gt;lighttpd&lt;/code&gt; to allow CGI scripts
to be used - some of my sites are slightly/mostly dynamic.&lt;/p&gt;

&lt;p&gt;Unfortunately &lt;code&gt;lighttpd&lt;/code&gt; &lt;a href=&quot;http://redmine.lighttpd.net/issues/224&quot;&gt;doesn&#39;t support
multiviews&lt;/a&gt; without &lt;a href=&quot;http://redmine.lighttpd.net/projects/lighttpd/wiki/MigratingFromApache#MultiViews&quot;&gt;some Lua
hacks&lt;/a&gt; which will require rewriting - as the supplied example only
handles &lt;code&gt;Accept&lt;/code&gt; rather than the language-header I want.&lt;/p&gt;

&lt;p&gt;It seems my &lt;em&gt;simplest&lt;/em&gt; solution is to switch from having lighttpd on the
back-end to running apache2 instead, but I&#39;ve not yet decided which way
to jump.&lt;/p&gt;

&lt;p&gt;Food for thought, anyway.&lt;/p&gt;

&lt;p&gt;hyvää joulua!&lt;/p&gt; </description> 
	<pubDate>Wed, 27 Dec 2017 22:00:00 +0000</pubDate>

</item> 
<item>
	<title>Russ Allbery: Review: The Tiger&#39;s Daughter</title>
	<guid>https://www.eyrie.org/~eagle/reviews/books/0-7653-9254-2.html</guid>
	<link>https://www.eyrie.org/~eagle/reviews/books/0-7653-9254-2.html</link>
     <description>  &lt;p&gt;Review: &lt;cite&gt;The Tiger&#39;s Daughter&lt;/cite&gt;, by K. Arsenault Rivera&lt;/p&gt;

&lt;table&gt;
  &lt;tbody&gt;&lt;tr&gt;
    &lt;td&gt;Series:&lt;/td&gt;
    &lt;td&gt;Their Bright Ascendancy #1&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Publisher:&lt;/td&gt;
    &lt;td&gt;Tor&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Copyright:&lt;/td&gt;
    &lt;td&gt;October 2017&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;ISBN:&lt;/td&gt;
    &lt;td&gt;0-7653-9254-2&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Format:&lt;/td&gt;
    &lt;td&gt;Kindle&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Pages:&lt;/td&gt;
    &lt;td&gt;493&lt;/td&gt;
  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;

&lt;p&gt;
Shizuka is the heir to the Hokkaran Empire, daughter of the empire&#39;s most
celebrated poet (her father) and its greatest soldier (her mother).
Shefali is Qorin, one of the horse people, daughter of the ruler of the
clans in all but name.  Their mothers slayed a Demon General together and
were the closest of friends.  When they were introduced at the age of
three, Shizuka tried to kill Shefali.  Then they started sending letters
to each other.  By the time they met again at seven, they were
inseparable.
&lt;/p&gt;

&lt;p&gt;
This was the second epic fantasy novel inspired by China (well, more Japan
in this case) and Mongolia that I read within a couple of days.  The other
one, Elizabeth Bear&#39;s &lt;a href=&quot;https://www.eyrie.org/~eagle/reviews/books/0-7653-2754-6.html&quot;&gt;&lt;cite&gt;Range of Ghosts&lt;/cite&gt;&lt;/a&gt;,
was tightly controlled, careful, and structured, mixing character growth
with foreboding glimpses of the antagonist.  &lt;cite&gt;The Tiger&#39;s Daughter&lt;/cite&gt;
is a sprawling, rambling story with a ridiculous frame, full of
larger-than-life personalities, expressions of devotion, dramatic stands,
impulsive choices, angry denouncements, and unshakable loyalty.  It has
&lt;em&gt;all&lt;/em&gt; the feelings about its characters, and it&#39;s much more
interested in those feelings than in the structure of the story.
&lt;/p&gt;

&lt;p&gt;
It&#39;s a glorious mess and I loved it unreservedly.
&lt;/p&gt;

&lt;p&gt;
There is no way this book should have worked as well as it did,
particularly on me.  The story frame is an extended &quot;as you know, Bob&quot;
retelling of events to a character who was there for 90% of them.  Later
in the book, there is an unhealing wound story line and some disturbing
body horror, two of my least favorite fictional tropes.  There were a few
parts of this book I found difficult to read.  And yet, I loved it anyway.
There is something utterly delightful about Shizuka and Shefali&#39;s
relationship: the rock-solid certainty of it underneath all the drama, the
sense of both of them against the entire world if necessary, and the
beautiful balancing of Shizuka&#39;s aggressive, dramatic arrogance and
Shefali&#39;s quieter, cautious determination.  The unique friendship between
their mothers adds more depth, both as a role model and as a contrast.
Under all of that sprawl, this book is doing so much work with
unapologetic female power and female relationships.
&lt;/p&gt;

&lt;p&gt;
One key to the success of &lt;cite&gt;The Tiger&#39;s Daughter&lt;/cite&gt; is that it&#39;s
unashamed of its feelings about its main characters.  This is a book about
two very different women and their brilliant, blazing relationship.
&lt;em&gt;That&lt;/em&gt; is what this book is about, not fighting off a great evil,
saving the world, or tracing a coming-of-age story, and it is completely
unapologetic about it.  The two protagonists do not postpone relationship
work to fix some larger problem.  They don&#39;t sacrifice their relationship
for the realm.  Each of them is the most important thing in the world to
the other, they act accordingly, and they dare the world to make something
of it.  It&#39;s not an uncomplicated relationship: there are moments of
depression and despair, misunderstandings, and repeated cases of Shizuka
promising things she can&#39;t deliver.  But there&#39;s a solidity, a sense that
this book is not going to rip this relationship apart because it would be
more dramatic or would be a growth experience.
&lt;/p&gt;

&lt;p&gt;
It&#39;s a type of love at first sight, it&#39;s perhaps not the most realistic
relationship (although what does that mean in a world of demons and gods
and strange powers?), but Rivera commits to it and doesn&#39;t back down,
which gives the story a glorious strength.
&lt;/p&gt;

&lt;p&gt;
I don&#39;t think this book would have existed in traditionally-published epic
fantasy twenty years ago.  You might see characters with Shizuka&#39;s skill
with swords or Shefali&#39;s inability to miss an arrow shot, but Shizuka
wouldn&#39;t also be the finest calligrapher in the land (and her mother would
be the poet and her father the soldier, even if she were still female).
And, more centrally, the characters would be focused towards a goal:
fighting off a great evil, defending a kingdom, overthrowing a bad ruler.
Relationships and story structure would have been bent towards a
coming-of-age story, probably focused on a man, that was all about power
and responsibility and training.  Even urban fantasy, which is more
willing to add romance, tended towards a similar arc.
&lt;/p&gt;

&lt;p&gt;
This has changed, and I think that&#39;s wonderful.  I don&#39;t have the critical
background to pinpoint where it changed first (I have a personal theory
that it&#39;s related to the growth of the fan-fiction community, but it&#39;s
just a theory), but it&#39;s given us more books like this where the goal of
the characters is to be happy together and glory in their power and skill.
They&#39;re not apologetic about it, they don&#39;t have elder mentor figures in
whose shadows they live and whose instructions they have to follow, and
they make their own lessons from mistakes instead of being handed analysis
by others.  And they own every last decision, for good or for ill.
There&#39;s no overriding fantasy, no guiding prophecy, no unexpected
manifestation of powers outside of their control.  Just decisions and
consequences, where emotions and logic both play a part.  This book
doesn&#39;t have the structure of a romance, but it allows for romance
motivations alongside epic fantasy motivations and it&#39;s a better story for
it.
&lt;/p&gt;

&lt;p&gt;
&lt;cite&gt;The Tiger&#39;s Daughter&lt;/cite&gt; has some messy first novel problems, is
occasionally overly dramatic, has several tropes I personally find
uncomfortable to read, and is full of &quot;most powerful in the land&quot; fantasy
wish fulfillment.  But I adore these people and would happily read about
them for days at a time.  The ending is absurdly artificial and yet still
had me grinning in delight.  What&#39;s wrong with wish fulfillment, anyway?
Isn&#39;t fulfilling wishes a &lt;em&gt;good&lt;/em&gt; thing?
&lt;/p&gt;

&lt;p&gt;
I&#39;ve already pre-ordered the sequel.
&lt;/p&gt;

&lt;p&gt;
This book reaches a definite conclusion, but leaves a lot on the table for
a series.  Followed by &lt;cite&gt;The Phoenix Empress&lt;/cite&gt;.
&lt;/p&gt;

&lt;p&gt;Rating: 8 out of 10&lt;/p&gt; </description> 
	<pubDate>Wed, 27 Dec 2017 04:46:00 +0000</pubDate>

</item> 
<item>
	<title>Russ Allbery: Reducing obligations</title>
	<guid>https://www.eyrie.org/~eagle/journal/2017-12/006.html</guid>
	<link>https://www.eyrie.org/~eagle/journal/2017-12/006.html</link>
     <description>  &lt;p&gt;
At this year&#39;s DebConf, Enrico Zini gave a
&lt;a href=&quot;https://debconf17.debconf.org/talks/92/&quot;&gt;talk on consensually doing
things together&lt;/a&gt; that has stuck with me ever since.  I recommend watching
it if you haven&#39;t.  The core idea that I took away from it is that
volunteer projects should be both voluntary and enjoyable to stay healthy,
and an important component of this is for those involved to stop doing
things they&#39;re not enjoying.  (And for others to not pressure them or
expect them to be heroes.)
&lt;/p&gt;

&lt;p&gt;
I frequently have to tell myself that one cannot continuously add new
obligations without occasionally setting aside existing ones, so this is
something I needed to hear.  I also have a hard time not responding to
email or software contributions, even when I don&#39;t have the time or
emotional energy to reply.  I&#39;ve therefore accumulated a lot of old email
that I &quot;should&quot; respond to (that word is always a warning sign), or
patches or ideas for software I maintain that I haven&#39;t implemented.
&lt;/p&gt;

&lt;p&gt;
This is the time of the year when I try to step back, look over my life
and my current goals and priorities, and decide if there&#39;s anything I want
to change.  My goal for this year is to put aside things that I&#39;m not
doing consensually, in Enrico&#39;s term, and refocus my time and effort on
things that I&#39;m truly enjoying.  Or, in some cases, picking up things
again that I had been enjoying but hadn&#39;t given enough energy to.
&lt;/p&gt;

&lt;p&gt;
So, I&#39;m not going away, from Debian or from free software or from replying
to email, by any stretch!  But I am giving myself permission to not feel
obligated to do a bunch of things I was doing (or not doing but thinking I
&quot;should&quot; do).  I&#39;m also going to remove myself from the Uploaders control
field of more packages that I haven&#39;t worked on in some time, just for
clarity and fewer things on my packages overview page.
&lt;/p&gt;

&lt;p&gt;
I already orphaned the following packages upstream, but was still
maintaining the corresponding Debian packages.  I don&#39;t use any of this
software at the moment, though, so that doesn&#39;t make much sense.  I&#39;m
therefore going to orphan these Debian packages or put them for adoption.
(In some cases, there are other possibly obvious maintainers, so I&#39;ll ask
them first.)
&lt;/p&gt;

&lt;ul&gt;
&lt;li class=&quot;packed&quot;&gt;krb5-sync&lt;/li&gt;
&lt;li class=&quot;packed&quot;&gt;lbcd&lt;/li&gt;
&lt;li class=&quot;packed&quot;&gt;libafs-pag-perl (will give this to the Perl team)&lt;/li&gt;
&lt;li class=&quot;packed&quot;&gt;libpam-afs-session&lt;/li&gt;
&lt;li class=&quot;packed&quot;&gt;webauth&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
I had not yet orphaned the following software for which I&#39;m upstream, but
I probably should have, and will fairly soon:
&lt;/p&gt;

&lt;ul&gt;
&lt;li class=&quot;packed&quot;&gt;&lt;a href=&quot;https://www.eyrie.org/~eagle/software/kadmin-remctl/&quot;&gt;kadmin-remctl&lt;/a&gt;&lt;/li&gt;
&lt;li class=&quot;packed&quot;&gt;&lt;a href=&quot;https://www.eyrie.org/~eagle/software/tasker/&quot;&gt;Tasker&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Finally, I have oodles of older mail messages from various people that I
wish I&#39;d had the energy and thoughtfulness to reply to at the time.  At
this point, many of them are years old, and everyone except me has
probably forgotten about them.  But I still had them saved to respond to,
and they were sitting around radiating obligation.  This week, I&#39;m giving
myself to go through and delete them unanswered.  I&#39;m sorry to all the
people I didn&#39;t reply to!  Sadly, energy is short, and even with
conversations that I start, sometimes life happens.
&lt;/p&gt;

&lt;p&gt;
Please feel free to try again if there&#39;s something you still wanted to
talk to me about!  I do manage to reply to most things.
&lt;/p&gt; </description> 
	<pubDate>Wed, 27 Dec 2017 04:18:00 +0000</pubDate>

</item> 
<item>
	<title>Thorsten Alteholz: Debian-Med bug squashing</title>
	<guid>http://blog.alteholz.eu/?p=861</guid>
	<link>http://blog.alteholz.eu/2017/12/debian-med-bug-squashing/</link>
     <description>  &lt;p&gt;The &lt;a href=&quot;http://debian-med.alteholz.de/advent/&quot; title=&quot;Debian Med Advent Calendar&quot;&gt;Debian Med Advent Calendar&lt;/a&gt; was again really successful this year. As announced &lt;a href=&quot;https://lists.debian.org/debian-med/2017/12/msg00118.html&quot; title=&quot;result announcement&quot;&gt;on the mailinglist&lt;/a&gt;, this year the second highest number of bugs has been closed during that bug squashing:&lt;/p&gt;
&lt;table&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;b&gt;year&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;number of bugs closed&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2011&lt;/td&gt;
&lt;td&gt;63&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2012&lt;/td&gt;
&lt;td&gt;28&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2013&lt;/td&gt;
&lt;td&gt;73&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2014&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2015&lt;/td&gt;
&lt;td&gt;150&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2016&lt;/td&gt;
&lt;td&gt;95&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2017&lt;/td&gt;
&lt;td&gt;&lt;b&gt;105&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Well done everybody who participated!&lt;/p&gt; </description> 
	<pubDate>Tue, 26 Dec 2017 11:16:57 +0000</pubDate>

</item> 
<item>
	<title>Tianon Gravi: Dockerizing Compiled Software</title>
	<guid>https://tianon.github.io/post/2017/12/26/dockerize-compiled-software</guid>
	<link>https://tianon.github.io/post/2017/12/26/dockerize-compiled-software.html</link>
     <description>  &lt;p&gt;I recently went through a stint of closing a &lt;em&gt;huge&lt;/em&gt; number of issues in the &lt;a href=&quot;https://github.com/docker-library/php&quot;&gt;docker-library/php&lt;/a&gt; repository, and one of the oldest (and longest) discussions was related to installing depedencies for a compiling extensions, and I wrote a &lt;a href=&quot;https://github.com/docker-library/php/issues/75#issuecomment-353673374&quot;&gt;semi-long comment&lt;/a&gt; explaining how I do this in a general way for any software I wish to Dockerize.&lt;/p&gt;

&lt;p&gt;I’m going to copy most of that comment here and perhaps expand a little bit more in order to have a better/cleaner place to link to!&lt;/p&gt;

&lt;p&gt;The first step I take is to write the naïve version of the &lt;code class=&quot;highlighter-rouge&quot;&gt;Dockerfile&lt;/code&gt;: download the source, run &lt;code class=&quot;highlighter-rouge&quot;&gt;./configure &amp;amp;&amp;amp; make&lt;/code&gt; etc, clean up.  I then try building my naïve creation, and in doing so hope for an error message. (yes, really!)&lt;/p&gt;

&lt;p&gt;The error message will usually take the form of something like &lt;code class=&quot;highlighter-rouge&quot;&gt;error: could not find &quot;xyz.h&quot;&lt;/code&gt; or &lt;code class=&quot;highlighter-rouge&quot;&gt;error: libxyz development headers not found&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If I’m building in Debian, I’ll hit &lt;code class=&quot;highlighter-rouge&quot;&gt;https://packages.debian.org/file:xyz.h&lt;/code&gt; (replacing “xyz.h” with the name of the header file from the error message), or even just Google something like “xyz.h debian”, to figure out the name of the package I require.&lt;/p&gt;

&lt;p&gt;If I’m building in Alpine, I’ll use &lt;a href=&quot;https://pkgs.alpinelinux.org/contents&quot;&gt;https://pkgs.alpinelinux.org/contents&lt;/a&gt; to perform a similar search.&lt;/p&gt;

&lt;p&gt;The same works to some extent for “libxyz development headers”, but in my experience Google works better for those since different distributions and projects will call these development packages by different names, so sometimes it’s a little harder to figure out exactly which one is the “right” one to install.&lt;/p&gt;

&lt;p&gt;Once I’ve got a package name, I add that package name to my &lt;code class=&quot;highlighter-rouge&quot;&gt;Dockerfile&lt;/code&gt;, rinse, and repeat.  Eventually, this usually leads to a successful build.  Occationally I find that some library either isn’t in Debian or Alpine, or isn’t new enough, and I’ve also got to build it from source, but those instances are rare in my own experience – YMMV.&lt;/p&gt;

&lt;p&gt;I’ll also often check the source for the Debian (via &lt;a href=&quot;https://sources.debian.org&quot;&gt;https://sources.debian.org&lt;/a&gt;) or Alpine (via &lt;a href=&quot;https://git.alpinelinux.org/cgit/aports/tree&quot;&gt;https://git.alpinelinux.org/cgit/aports/tree&lt;/a&gt;) package of the software I’m looking to compile, especially paying attention to &lt;code class=&quot;highlighter-rouge&quot;&gt;Build-Depends&lt;/code&gt; (ala &lt;a href=&quot;https://sources.debian.org/src/php7.0/7.0.26-1/debian/control/&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;php7.0=7.0.26-1&lt;/code&gt;’s &lt;code class=&quot;highlighter-rouge&quot;&gt;debian/control&lt;/code&gt; file&lt;/a&gt;) and/or &lt;code class=&quot;highlighter-rouge&quot;&gt;makedepends&lt;/code&gt; (ala &lt;a href=&quot;https://git.alpinelinux.org/cgit/aports/tree/community/php7/APKBUILD?id=d0ca197f031f96d4664cafaa618aeccf94640a1e&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;php7&lt;/code&gt;’s &lt;code class=&quot;highlighter-rouge&quot;&gt;APKBUILD&lt;/code&gt; file&lt;/a&gt;) for package name clues.&lt;/p&gt;

&lt;p&gt;Personally, I find this sort of detective work interesting and rewarding, but I realize I’m probably a bit of a unique creature.  Another good technique I use occationally is to determine whether anyone else has already Dockerized the thing I’m trying to, so I can simply learn directly from their &lt;code class=&quot;highlighter-rouge&quot;&gt;Dockerfile&lt;/code&gt; which packages I’ll need to install.&lt;/p&gt;

&lt;p&gt;For the specific case of PHP extensions, there’s almost always someone who’s already figured out what’s necessary for this or that module, and all I have to do is some light detective work to find them.&lt;/p&gt;

&lt;p&gt;Anyways, that’s my method!  Hope it’s helpful, and happy hunting!&lt;/p&gt; </description> 
	<pubDate>Tue, 26 Dec 2017 07:00:00 +0000</pubDate>
  <author>admwiggin@gmail.com (Tianon Gravi)</author>  
</item> 
<item>
	<title>Christoph Berg: Salsa batch import</title>
	<guid>http://www.df7cb.de/blog/2017/Salsa_batch_import.html</guid>
	<link>http://www.df7cb.de/blog/2017/Salsa_batch_import.html</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/myon.png&quot; width=&quot;71&quot; height=&quot;95&quot; alt=&quot;&quot; align=&quot;right&quot; style=&quot;float: right;&quot;&gt;  &lt;p&gt;Now that &lt;a href=&quot;https://salsa.debian.org/&quot;&gt;Salsa&lt;/a&gt; is in
&lt;a href=&quot;http://blog.snow-crash.org/blog/salsa.debian.org-git.debian.org-replacement-going-into-beta/&quot;&gt;beta&lt;/a&gt;,
it&#39;s time to import projects (= GitLab speak for &quot;repository&quot;). This is
probably best done automated. Head to
&lt;a href=&quot;https://salsa.debian.org/profile/personal_access_tokens&quot;&gt;Access Tokens&lt;/a&gt;
and generate a token with &quot;api&quot; scope, which you can then use with curl:&lt;/p&gt;

&lt;pre&gt;$ cat salsa-import
#!/bin/sh

set -eux

PROJECT=&quot;${1%.git}&quot;
DESCRIPTION=&quot;$PROJECT packaging&quot;
ALIOTH_URL=&quot;https://anonscm.debian.org/git&quot;
ALIOTH_GROUP=&quot;collab-maint&quot;
SALSA_URL=&quot;https://salsa.debian.org/api/v4&quot;
SALSA_NAMESPACE=&quot;2&quot; # 2 is &quot;debian&quot;
SALSA_TOKEN=&quot;yourcryptictokenhere&quot;

curl -f &quot;$SALSA_URL/projects?private_token=$SALSA_TOKEN&quot; \
  --data &quot;path=$PROJECT&amp;amp;namespace_id=$SALSA_NAMESPACE&amp;amp;description=$DESCRIPTION&amp;amp;import_url=$ALIOTH_URL/$ALIOTH_GROUP/$PROJECT&amp;amp;visibility=public&quot;
&lt;/pre&gt;


&lt;p&gt;This will create the GitLab project in the chosen namespace, and import the repository from Alioth.&lt;/p&gt;

&lt;p&gt;To get the namespace id, use something like:&lt;/p&gt;

&lt;pre&gt;curl https://salsa.debian.org/api/v4/groups | jq . | less
&lt;/pre&gt;


&lt;p&gt;Pro tip: To import a whole Alioth group to GitLab, run this on Alioth:&lt;/p&gt;

&lt;pre&gt;for f in *.git; do sh salsa-import $f; done
&lt;/pre&gt; </description> 
	<pubDate>Mon, 25 Dec 2017 15:43:30 +0000</pubDate>

</item> 
<item>
	<title>Clint Adams: Fewer than 450 to go</title>
	<guid>https://xana.scru.org/posts/mintings/mundart.html</guid>
	<link>https://xana.scru.org/posts/mintings/mundart.html</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/clint.png&quot; width=&quot;80&quot; height=&quot;88&quot; alt=&quot;&quot; align=&quot;right&quot; style=&quot;float: right;&quot;&gt;  &lt;div class=&quot;inlinecontent&quot;&gt;
&lt;p&gt;«Chäs us Rohmilch us de Region»&lt;/p&gt;
&lt;p&gt;„kein Schweizerdeutsch“&lt;/p&gt;
&lt;p&gt;«Englisch?»&lt;/p&gt;
&lt;p&gt;„oder Hochdeutsch“&lt;/p&gt;
&lt;p&gt;«Chäs us em Chloster vo Einsiedeln»&lt;/p&gt;
&lt;p&gt;„kein Schwyzerdütsch“&lt;/p&gt;
&lt;p&gt;«Englisch?»&lt;/p&gt;
&lt;p&gt;„oder Hochdeutsch“&lt;/p&gt;
&lt;p&gt;«Chääs?»&lt;/p&gt;
&lt;p&gt;„kein Schwyzertüütsch“&lt;/p&gt;
&lt;p&gt;«Englisch?»&lt;/p&gt;
&lt;p&gt;„oder Hochdeutsch“&lt;/p&gt;
&lt;p&gt;«ʕ •ᴥ•ʔ /ᐠ｡ꞈ｡ᐟ ▼・ᴥ・▼»&lt;/p&gt;
&lt;p&gt;“Hold on, talk to the Portuguese guy.”&lt;/p&gt;
&lt;p&gt;«Schwitzertitsch?»&lt;/p&gt;
&lt;p&gt;「Chäs」&lt;/p&gt;
&lt;p&gt;«ᕕ( ᐛ )ᕗ ヽ༼ຈل͜ຈ༽ﾉ (◕‿◕✿)»&lt;/p&gt;
&lt;p&gt;「ﾟ･:&lt;em&gt;｡(ꈍᴗꈍ)ε｀&lt;/em&gt;)~｡*:･ﾟ 」&lt;/p&gt;
&lt;p&gt;«/╲/( ͡° ͡° ͜ʖ ͡° ͡°)/╱»&lt;/p&gt;
&lt;p&gt;“What happened?”&lt;/p&gt;
&lt;p&gt;「Oh, she just wanted to know where to get Thai food.」&lt;/p&gt;
&lt;/div&gt;

&lt;div class=&quot;info&quot;&gt;
    Posted on 2017-12-25
    
&lt;/div&gt;
&lt;div class=&quot;info&quot;&gt;
    
    Tags: &lt;a href=&quot;https://xana.scru.org/tags/mintings.html&quot;&gt;mintings&lt;/a&gt;
    
&lt;/div&gt; </description> 
	<pubDate>Mon, 25 Dec 2017 15:13:30 +0000</pubDate>

</item> 
<item>
	<title>Alexander Wirt: salsa.debian.org (git.debian.org replacement) going into beta</title>
	<guid>http://blog.snow-crash.org/blog/salsa.debian.org-git.debian.org-replacement-going-into-beta/</guid>
	<link>http://blog.snow-crash.org/blog/salsa.debian.org-git.debian.org-replacement-going-into-beta/</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/formorer.png&quot; width=&quot;94&quot; height=&quot;101&quot; alt=&quot;&quot; align=&quot;right&quot; style=&quot;float: right;&quot;&gt;  &lt;p&gt;Since summer we have worked on our git.debian.org replacement based
on GitLab. I am really happy to say that we are launching the beta of our service
today. Please keep in mind that it is a beta, we don’t expect any database
resets, but under unexpected circumstances it might still happen.&lt;/p&gt;

&lt;p&gt;The new service is available at &lt;a href=&quot;https://salsa.debian.org&quot;&gt;https://salsa.debian.org&lt;/a&gt;. Every active Debian
Developer already has an account. Please request a password reset via &lt;a href=&quot;https://salsa.debian.org/users/sign_in&quot;&gt;https://salsa.debian.org/users/sign_in&lt;/a&gt;
– your login is either your Debian login or Debian e-mail address.&lt;/p&gt;

&lt;h2 id=&quot;guest-users&quot;&gt;Guest users&lt;/h2&gt;

&lt;p&gt;External users are invited to create an account on salsa. To avoid clashes with
future Debian Developers, we are enforcing a ‘-guest’ suffix for any guest username.
Therefore we developed a self-service portal which allows non-Debian Developers to sign up,
available at &lt;a href=&quot;https://signup.salsa.debian.org&quot;&gt;https://signup.salsa.debian.org&lt;/a&gt;.
Please keep in mind that your username will have ‘-guest’ appended.&lt;/p&gt;

&lt;h2 id=&quot;project-creation&quot;&gt;Project creation&lt;/h2&gt;

&lt;p&gt;Every user can create projects in their own namespace (similar to GitHub).&lt;/p&gt;

&lt;h2 id=&quot;teams&quot;&gt;Teams&lt;/h2&gt;

&lt;p&gt;For larger projects you can also create a group to host your projects.
To avoid clashes with usernames (that share the same namespace as groups) we are requiring
groups to have a ‘-team’ suffix to their name.
Groups can be created using the same self-service portal &lt;a href=&quot;https://signup.salsa.debian.org&quot;&gt;https://signup.salsa.debian.org&lt;/a&gt;.
For larger, already-established teams it is also possible to ask us to create the group with a
name not conforming to the normal team namespace. Examples are teams like &lt;em&gt;debian-qa&lt;/em&gt;.
Please create an issue in the &lt;a href=&quot;https://salsa.debian.org/salsa/support&quot;&gt;support&lt;/a&gt; project.&lt;/p&gt;

&lt;h2 id=&quot;collab-maint&quot;&gt;Collab-maint&lt;/h2&gt;

&lt;p&gt;If you want to allow other Debian Developers to work on your packages or software, you can create projects within the
&lt;strong&gt;Debian&lt;/strong&gt; group. Every Debian Developer has write access to projects created in this group.
If you create a project within the Debian group, you are implicitly welcoming all DDs to contribute directly to the project.&lt;/p&gt;

&lt;p&gt;Guest users can only be added to individual projects with the Debian group, but not to the entire Debian group. This is different to the policy for the collab-maint group on Alioth.&lt;/p&gt;

&lt;h2 id=&quot;gitlab-runners&quot;&gt;GitLab runners&lt;/h2&gt;

&lt;p&gt;We won’t provide any shared Gitlab runners for now. If you want to sponsor resources for such runners please contact us.&lt;/p&gt;

&lt;h2 id=&quot;gitlab-pages&quot;&gt;Gitlab pages&lt;/h2&gt;

&lt;p&gt;We will support Gitlab pages in the future, but more work is needed first. We will post an update when they
are ready.&lt;/p&gt;

&lt;h2 id=&quot;migration-of-repositories&quot;&gt;Migration of repositories&lt;/h2&gt;

&lt;p&gt;We don’t plan to do any automatic migration of alioth repositories. If you use a repository and think it is important (!)
migrate it on your own. We will provide a read-only export of all repositories that weren’t exported after disabling
alioth.&lt;/p&gt;

&lt;h2 id=&quot;timeline&quot;&gt;Timeline&lt;/h2&gt;

&lt;p&gt;We want to run this beta at least for four weeks. If everything goes well we intend to leave beta around the end of January.&lt;/p&gt;

&lt;h2 id=&quot;documentation&quot;&gt;Documentation&lt;/h2&gt;

&lt;p&gt;Documentation of the service will happen in the &lt;a href=&quot;https://wiki.debian.org/Salsa/Doc&quot;&gt;Debian Wiki&lt;/a&gt;. Please feel free to enhance the documentation.
See also the upstream &lt;a href=&quot;https://docs.gitlab.com/ee/README.html&quot;&gt;GitLab docs&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;getting-help&quot;&gt;Getting help&lt;/h2&gt;

&lt;p&gt;If you have problems with the service you can reach us:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;IRC: #alioth@irc.debian.org&lt;/li&gt;
&lt;li&gt;Mailing list: &lt;a href=&quot;https://lists.alioth.debian.org/mailman/listinfo/alioth-staff-replacement&quot;&gt;https://lists.alioth.debian.org/mailman/listinfo/alioth-staff-replacement&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Issue tracker: &lt;a href=&quot;https://salsa.debian.org/salsa/support/issues&quot;&gt;https://salsa.debian.org/salsa/support/issues&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Don’t expect us to be responsive during the holidays, so be patient :).&lt;/p&gt;

&lt;h2 id=&quot;request-for-help&quot;&gt;Request for help&lt;/h2&gt;

&lt;p&gt;If you want to take part in salsa administration please get in touch with us. We want to have at least two more administrators
for the Gitlab instance.&lt;/p&gt; </description> 
	<pubDate>Mon, 25 Dec 2017 11:00:09 +0000</pubDate>

</item> 
<item>
	<title>Jonathan Carter: Hello, world! – Welcome to my Linux related videos</title>
	<guid>https://jonathancarter.org/?p=8922</guid>
	<link>https://jonathancarter.org/2017/12/24/hello-world-welcome-to-my-linux-related-video-channel/</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/highvoltage.png&quot; width=&quot;76&quot; height=&quot;110&quot; alt=&quot;&quot; align=&quot;right&quot; style=&quot;float: right;&quot;&gt;  &lt;p&gt;I’ve been meaning to start a video channel for years. This is more of a test video than anything else, but if you have any ideas or suggestions, then don’t hesitate to comment.&lt;/p&gt; </description> 
	<pubDate>Sun, 24 Dec 2017 18:13:13 +0000</pubDate>

</item> 
<item>
	<title>Louis-Philippe Véronneau: Holiday Beer Recipe - Le Courant Noir</title>
	<guid>tag:veronneau.org,2017-12-24:holiday-beer-recipe-le-courant-noir.html</guid>
	<link>https://veronneau.org/holiday-beer-recipe-le-courant-noir.html</link>
     <description>  &lt;p&gt;It&#39;s holiday season once again, and while I&#39;m waiting for the deserts I made for
my family&#39;s Christmas party to finish cooking (I highly recommend &lt;em&gt;Bon Apétit&lt;/em&gt;&#39;s
&lt;a href=&quot;https://www.bonappetit.com/recipe/bruleed-bourbon-maple-pumpkin-pie&quot;&gt;Brûléed Bourbon-Maple Pumpkin Pie&lt;/a&gt;), I opened one of the beers I brewed
recently.&lt;/p&gt;
&lt;p&gt;And oh boy, what a success. &lt;/p&gt;
&lt;p&gt;I&#39;ve been brewing beer with 2 other friends for a few years now, and while we&#39;ve
brewed some excellent stuff in the past, I feel &lt;em&gt;Le Courant Noir&lt;/em&gt;&lt;sup&gt;&lt;a href=&quot;https://veronneau.org/feeds/languages/en.atom.xml#note1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;
- a blackcurrant witbier-inspired ale - is my most resounding achievement.&lt;/p&gt;
&lt;p&gt;This was my first time brewing with fresh fruits, and I&#39;m very happy with the
results. The beer has a very pleasant, sharp nose of blackcurrants and esters.
To the taste, the blackcurrant comes through, but is counterbalanced by the malt
and pretty high alcohol content (~8% ABV). The result is a tart, ever so
slightly acidic fruity beer. I love it.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;A glass of Courant Noir&quot; height=&quot;30%&quot; src=&quot;https://veronneau.org/media/blog/2017-12-24/courant_noir.jpg&quot; style=&quot;float: right;&quot; title=&quot;A glass of Courant Noir&quot; width=&quot;30%&quot; /&gt;&lt;/p&gt;
&lt;p&gt;So yeah, I thought I&#39;d share the recipe in case you want to try replicating it.
Try to get fresh blackcurrant, as what you are looking for is the tart taste of
the blackcurrant. Using syrup, you&#39;re bound to get some jelly-like aftertaste.&lt;/p&gt;
&lt;h2&gt;Recipe&lt;/h2&gt;
&lt;p&gt;The target boil volume is 25L and the target batch size 20L. I&#39;m mashing with a
pretty low efficiency (70%), so if you use a proper mash tun, you might want to
use a little less grain.&lt;/p&gt;
&lt;p&gt;Mash at 67°C and ferment at 19°C. Add the blackcurrants whole once the primary
fermentation is over.&lt;/p&gt;
&lt;p&gt;Malt:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2.8 kg x 2 row Pale Malt&lt;/li&gt;
&lt;li&gt;2.8 kg x White Wheat Malt&lt;/li&gt;
&lt;li&gt;1.0 kg x Munich Malt&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Hops:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;35 g x Saaz (4.4% alpha acid) - 60 min Boil&lt;/li&gt;
&lt;li&gt;25 g x Saaz (4.4% alpha acid) - 30 min Boil&lt;/li&gt;
&lt;li&gt;15 g x Saaz (4.4% alpha acid) - Dry Hop&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Yeast:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;White Labs Belgian Witbier Ale Yeast - WLP400&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Other:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;25 g x Coriander Seeds (crushed) - 10 min Boil&lt;/li&gt;
&lt;li&gt;1.7 kg x Whole Blackcurrant&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Pie&lt;/h2&gt;
&lt;p&gt;Here&#39;s a bonus picture of the pie I referenced earlier.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Pumpkin pie in the over in a cast iron pan&quot; height=&quot;100%&quot; src=&quot;https://veronneau.org/media/blog/2017-12-24/pumpkin_pie.jpg&quot; title=&quot;Pumpkin pie in the oven in a cast iron pan&quot; width=&quot;100%&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p style=&quot;font-size: 95%;&quot;&gt;&lt;a name=&quot;note1&quot;&gt;1&lt;/a&gt; - Amongst other things, &quot;courant noir&quot;
is the French word-for-word translation for blackcurrant. It&#39;s also a very bad
translation pun Ⓐ ⚑.&lt;/p&gt; </description> 
	<pubDate>Sun, 24 Dec 2017 05:00:00 +0000</pubDate>

</item> 
<item>
	<title>Vasudev Kamath: My personal Email setup - Notmuch, mbsync, postfix and dovecot</title>
	<guid>tag:copyninja.info,2017-12-23:/blog/email_setup.html</guid>
	<link>https://copyninja.info/blog/email_setup.html</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/vasudev.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 been using personal email setup for quite long and have not documented it
anywhere. Recently when I changed my laptop (a post is pending about it) I got
lost trying to recreate my local mail setup. So this post is a self
documentation so that I don&#39;t have to struggle again to get it right.&lt;/p&gt;
&lt;div class=&quot;section&quot; id=&quot;server-side&quot;&gt;
&lt;h2&gt;Server Side&lt;/h2&gt;
&lt;p&gt;I run my own mail server and I use &lt;em&gt;postfix&lt;/em&gt; as SMTP server and &lt;em&gt;Dovecot&lt;/em&gt; for
the IMAP purpose. I&#39;m not going into detail of setting those up as my setup was
mostly done by using scripts created by Jonas for &lt;em&gt;Redpill&lt;/em&gt; infrastructure. What
redpill is?. (In jonas&#39;s own words)&lt;/p&gt;
&lt;blockquote&gt;
&amp;lt;jonas&amp;gt; Redpill is a concept - a way to setup Debian hosts to collaborate
across organisations
&amp;lt;jonas&amp;gt; I develop the concept, and use it for the first ever Redpill
network-of-networks redpill.dk, involving my own network (jones.dk), my main
client&#39;s network (homebase.dk), a network in Germany including Skolelinux
Germany (free-owl.de), and Vasudev&#39;s network (copyninja.info)&lt;/blockquote&gt;
&lt;p&gt;Along with that I have a dovecot sieve filtering to classify on high level mails
into various folders depending on from where they originate. All the rules live
in the &lt;cite&gt;~/dovecot.sieve&lt;/cite&gt; file under every account which has a mail address.&lt;/p&gt;
&lt;p&gt;Again I&#39;m not going into detail of how to set these things up, as its not goal
of my this post.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot; id=&quot;on-my-laptop&quot;&gt;
&lt;h2&gt;On my Laptop&lt;/h2&gt;
&lt;p&gt;On my laptop I&#39;ve following 4 parts setup&lt;/p&gt;
&lt;ol class=&quot;arabic simple&quot;&gt;
&lt;li&gt;Mail syncing : Done using mbsync command&lt;/li&gt;
&lt;li&gt;Classification: Done using notmuch&lt;/li&gt;
&lt;li&gt;Reading: Done using notmuch-emacs&lt;/li&gt;
&lt;li&gt;Mail sending: Done using postfix running as relay server and SMTP client.&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot; id=&quot;mail-syncing&quot;&gt;
&lt;h2&gt;Mail Syncing&lt;/h2&gt;
&lt;p&gt;Mail syncing is done using &lt;cite&gt;mbsync&lt;/cite&gt; tool, I was previously user of offlineimap
and recently switched to &lt;cite&gt;mbsync&lt;/cite&gt; as I felt it more lighter and simpler to
configure than &lt;cite&gt;offlineimap&lt;/cite&gt;. &lt;cite&gt;mbsync&lt;/cite&gt; command is provided by package &lt;cite&gt;isync&lt;/cite&gt;.&lt;/p&gt;
&lt;p&gt;Configuration file is &lt;em&gt;~/.mbsyncrc&lt;/em&gt;. Below is my sample content with some
private things redacted.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;IMAPAccount  copyninja&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;Host imap.copyninja.info&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;User vasudev&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;PassCmd      &quot;gpg -q --for-your-eyes-only --no-tty --exit-on-status-write-error --batch --passphrase-file ~/path/to/passphrase.txt -d ~/path/to/mailpass.gpg&quot;&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;SSLType IMAPS&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;SSLVersion TLSv1.2&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;CertificateFile /etc/ssl/certs/ca-certificates.crt&lt;/span&gt;


&lt;span class=&quot;na&quot;&gt;IMAPAccount gmail-kamathvasudev&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;Host imap.gmail.com&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;User kamathvasudev@gmail.com&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;PassCmd &quot;gpg -q --for-your-eyes-only --no-tty --exit-on-status-write-error --batch --passphrase-file ~/path/to/passphrase.txt -d ~/path/to/mailpass.gpg&quot;&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;SSLType IMAPS&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;SSLVersion TLSv1.2&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;CertificateFile /etc/ssl/certs/ca-certificates.crt&lt;/span&gt;

&lt;span class=&quot;na&quot;&gt;IMAPStore copyninja-remote&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;Account copyninja&lt;/span&gt;

&lt;span class=&quot;na&quot;&gt;IMAPStore gmail-kamathvasudev-remote&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;Account gmail-kamathvasudev&lt;/span&gt;

&lt;span class=&quot;na&quot;&gt;MaildirStore copyninja-local&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;Path ~/Mail/vasudev-copyninja.info/&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;Inbox ~/Mail/vasudev-copyninja.info/INBOX&lt;/span&gt;

&lt;span class=&quot;na&quot;&gt;MaildirStore gmail-kamathvasudev-local&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;Path ~/Mail/Gmail-1/&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;Inbox ~/Mail/Gmail-1/INBOX&lt;/span&gt;

&lt;span class=&quot;na&quot;&gt;Channel copyninja&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;Master :copyninja-remote:&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;Slave :copyninja-local:&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;Patterns *&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;Create Both&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;SyncState *&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;Sync All&lt;/span&gt;

&lt;span class=&quot;na&quot;&gt;Channel gmail-kamathvasudev&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;Master :gmail-kamathvasudev-remote:&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;Slave :gmail-kamathvasudev-local:&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# Exclude everything under the internal [Gmail] folder, except the interesting folders&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;Patterns * ![Gmail]*&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;Create Both&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;SyncState *&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;Sync All&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Explanation for some interesting part in above configuration. One is the
&lt;em&gt;PassCmd&lt;/em&gt; which allows you to provide shell command to obtain the password for
the account. This avoids filling in the password in configuration file. I&#39;m
using symmetric encryption with gpg and storing password some where on my disk.
Which is of course just safe guarded by Unix ACL.&lt;/p&gt;
&lt;p&gt;I actually wanted to use my public key to encrypt the file but unlocking the
file when script is run in background or via systemd looks difficult (or looked
nearly impossible). If you have better suggestion I&#39;m all ears :-).&lt;/p&gt;
&lt;p&gt;Next instruction part is &lt;em&gt;Patterns&lt;/em&gt;. This allows you to selectively sync mail
from your mail server. This was really helpful for me to exclude all crappy
&lt;em&gt;[Gmail]/&lt;/em&gt; folders.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot; id=&quot;mail-classification&quot;&gt;
&lt;h2&gt;Mail Classification&lt;/h2&gt;
&lt;p&gt;Once mail is locally on your device, we need a way to read the mails easily in a
mail reader. My original setup was serving synced &lt;em&gt;Maildir&lt;/em&gt; using local dovecot
instance and read it in &lt;em&gt;Gnus&lt;/em&gt;. This setup was bit of a over kill with all
server software setups but inability of Gnus to not cope well with &lt;em&gt;Maildir&lt;/em&gt;
format this was best way to do it. This setup also has a disadvantage, that is
searching a mail quickly when you have huge pile of mail to go through. This is
where &lt;em&gt;notmuch&lt;/em&gt; comes into picture.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;notmuch&lt;/em&gt; allows me to easily index through Gigabytes of my mail archives and
get what I need very easily. I&#39;ve created a small script which combines
executing of &lt;cite&gt;mbsync&lt;/cite&gt; and &lt;cite&gt;notmuch&lt;/cite&gt; execution. I tag mails based on the Maildirs
which are actually created on server side using dovecot sieve. Below is my full
shell script which is doing task of syncing classification and deleting of
spams.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;#!/bin/sh&lt;/span&gt;

&lt;span class=&quot;nv&quot;&gt;MBSYNC&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;$(&lt;/span&gt;pgrep mbsync&lt;span class=&quot;k&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;NOTMUCH&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;$(&lt;/span&gt;pgrep notmuch&lt;span class=&quot;k&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; -n &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$MBSYNC&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; -o -n &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$NOTMUCH&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&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;k&quot;&gt;then&lt;/span&gt;
   &lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Already running one instance of mail-sync. Exiting...&quot;&lt;/span&gt;
         &lt;span class=&quot;nb&quot;&gt;exit&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;fi&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Deleting messages tagged as *deleted*&quot;&lt;/span&gt;
notmuch search --format&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;text0 --output&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;files tag:deleted &lt;span class=&quot;p&quot;&gt;|&lt;/span&gt;xargs -0 --no-run-if-empty rm -v

&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Moving spam to Spam folder&quot;&lt;/span&gt;
notmuch search --format&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;text0 --output&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;files tag:Spam and &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  to:vasudev@copyninja.info &lt;span class=&quot;p&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
    xargs -0 -I &lt;span class=&quot;o&quot;&gt;{}&lt;/span&gt; --no-run-if-empty mv -v &lt;span class=&quot;o&quot;&gt;{}&lt;/span&gt; ~/Mail/vasudev-copyninja.info/Spam/cur
notmuch search --format&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;text0 --output&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;files tag:Spam and
  to:vasudev-debian@copyninja.info &lt;span class=&quot;p&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
     xargs -0 -I &lt;span class=&quot;o&quot;&gt;{}&lt;/span&gt; --no-run-if-empty mv -v &lt;span class=&quot;o&quot;&gt;{}&lt;/span&gt; ~/Mail/vasudev-copyninja.info/Spam/cur


&lt;span class=&quot;nv&quot;&gt;MDIR&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;vasudev-copyninja.info vasudev-debian Gmail-1&quot;&lt;/span&gt;
mbsync -Va
notmuch new

&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; mdir in &lt;span class=&quot;nv&quot;&gt;$MDIR&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
    &lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Processing &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$mdir&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; fdir in &lt;span class=&quot;k&quot;&gt;$(&lt;/span&gt;ls -d /home/vasudev/Mail/&lt;span class=&quot;nv&quot;&gt;$mdir&lt;/span&gt;/*&lt;span class=&quot;k&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
      &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;$(&lt;/span&gt;basename &lt;span class=&quot;nv&quot;&gt;$fdir&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;)&lt;/span&gt; !&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;INBOX&quot;&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;k&quot;&gt;then&lt;/span&gt;
          &lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Tagging for &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;$(&lt;/span&gt;basename &lt;span class=&quot;nv&quot;&gt;$fdir&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
          notmuch tag +&lt;span class=&quot;k&quot;&gt;$(&lt;/span&gt;basename &lt;span class=&quot;nv&quot;&gt;$fdir&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;)&lt;/span&gt; -inbox -- folder:&lt;span class=&quot;nv&quot;&gt;$mdir&lt;/span&gt;/&lt;span class=&quot;k&quot;&gt;$(&lt;/span&gt;basename &lt;span class=&quot;nv&quot;&gt;$fdir&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;k&quot;&gt;fi&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;done&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;done&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;So before running mbsync I search for all mails tagged as &lt;em&gt;deleted&lt;/em&gt; and delete
them from system. Next I look for mails tagged as &lt;em&gt;Spam&lt;/em&gt; on both my accounts and
move it to Spam folder. Yeah you got it right these are mails escaping the spam
filter and landing in my inbox and personally marked as Spam.&lt;/p&gt;
&lt;p&gt;After running mbsync I tag mails based on their folder (searching string
&lt;em&gt;folder:&lt;/em&gt;). This allows me easily get contents of lets say a mailing list
without remembering the list address.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot; id=&quot;reading-mails&quot;&gt;
&lt;h2&gt;Reading Mails&lt;/h2&gt;
&lt;p&gt;Now that we have synced and classified mail its time to setup the reading part.
I use notmuch-emacs interface to read the mails. I use &lt;em&gt;Spacemacs&lt;/em&gt; flavor of
emacs so I took some time to write down the a private layer which brings
together all my keybindings and classification in one place and does not clutter
my entire &lt;em&gt;.spacemacs&lt;/em&gt; file. You can find the code for my private layer in
&lt;a class=&quot;reference external&quot; href=&quot;https://source.copyninja.info/notmuch-emacs-layer.git/&quot;&gt;notmuch-emacs-layer repository&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot; id=&quot;sending-mails&quot;&gt;
&lt;h2&gt;Sending Mails&lt;/h2&gt;
&lt;p&gt;Well its not sufficient that if we can read mails, we need to be able to reply
to mail. And this was the slightly tricky part where I recently got lost and had
to write this post so that I don&#39;t forget it again. (And of course don&#39;t have to
refer some outdated posts on web).&lt;/p&gt;
&lt;p&gt;My setup to send mails is using &lt;em&gt;postfix&lt;/em&gt; as SMTP client with my own SMTP server
as relayhost for it. The problem of relaying is it&#39;s not for the hosts with
dynamic IP. There are couple of ways to allow hosts with dynamic IP to use relay
servers, one is put the IP address from where mail will originate into
&lt;em&gt;my_network&lt;/em&gt; or second use SASL authentication.&lt;/p&gt;
&lt;p&gt;My preferred way is use of SASL authentication. For this I first had to create a
separate account one for each machine which is going to relay the mails to my
main server. Idea is to not use my primary account for SASL authentication.
(Originally I was using primary account, but Jonas gave this idea of account per
road runner).&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;adduser &amp;lt;hostname&amp;gt;_relay
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Here replace &amp;lt;hostname&amp;gt; with name of your laptop/desktop or whatever you are
using. Now we need to adjust postfix to act as relaying server. So add following
lines to postfix configuration&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;# SASL authentication&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;smtp_sasl_auth_enable&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;yes&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;smtp_tls_security_level&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;encrypt&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;smtp_sasl_tls_security_options&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;noanonymous&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;relayhost&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;[smtp.copyninja.info]:submission&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;smtp_sasl_password_maps&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;hash:/etc/postfix/sasl_passwd&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;So here relayhost is the server name which your postfix instance will be using
to relay mails forward into internet. &lt;em&gt;:submission&lt;/em&gt; part tells postfix to
forward mail on to port 587 (secure). &lt;em&gt;smtp_sasl_tls_security_options&lt;/em&gt; is set to
disallow anonymous connection. This is must so that relay server trusts your
mobile host and agrees to forward the mail for you.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;/etc/postfix/sasl_passwd&lt;/em&gt; is the file where you need to store password for
account to be used for SASL authentication with server. Put following content
into it.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[smtp.example.com]:submission    user:password
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Replace smtp.example.com with your SMTP server name which you have put in
&lt;em&gt;relayhost&lt;/em&gt; configuration. Replace user with &amp;lt;hostname&amp;gt;_relay user you created
and its password.&lt;/p&gt;
&lt;p&gt;To secure the sasl_passwd file and create a hash of it for postfix use following
command.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;chown root:root /etc/postfix/sasl_passwd
chmod &lt;span class=&quot;m&quot;&gt;0600&lt;/span&gt; /etc/postfix/sasl_passwd
postmap /etc/postfix/sasl_passwd
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The last command will create /etc/postfix/sasl_passwd.db file which is hash of
your file /etc/postfix/sasl_passwd with same owner and permission. Now reload
the postfix and check if mail makes out of your system using mail command.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;section&quot; id=&quot;bonus-part&quot;&gt;
&lt;h2&gt;Bonus Part&lt;/h2&gt;
&lt;p&gt;Well since I&#39;ve a script created above bringing together mail syncing and
classification. I went ahead and created a systemd timer to periodically sync
mails in the background. In my case every 10 minutes. Below is &lt;em&gt;mailsync.timer&lt;/em&gt;
file.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;[Unit]&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;Description&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Check Mail Every 10 minutes&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;RefuseManualStart&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;no&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;RefuseManualStop&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;no&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;[Timer]&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;Persistent&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;false&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;OnBootSec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;5min&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;OnUnitActiveSec&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;10min&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;Unit&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;mailsync.service&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;[Install]&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;WantedBy&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;default.target&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Below is &lt;em&gt;mailsync.service&lt;/em&gt; which is needed by mailsync.timer to execute our
scripts.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;[Unit]&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;Description&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Check Mail&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;RefuseManualStart&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;no&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;RefuseManualStop&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;yes&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;[Service]&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;Type&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;oneshot&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;ExecStart&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;/usr/local/bin/mail-sync&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;StandardOutput&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;syslog&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;StandardError&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;syslog&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Put these files under /etc/systemd/user and run below command to enable them.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;systemctl &lt;span class=&quot;nb&quot;&gt;enable&lt;/span&gt; --user mailsync.timer
systemctl &lt;span class=&quot;nb&quot;&gt;enable&lt;/span&gt; --user mailsync.service
systemctl start --user mailsync.timer
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;So that&#39;s how I&#39;ve sync and send mail from my system. I came to know about
&lt;em&gt;afew&lt;/em&gt; from Jonas Smedegaard who also proof read this post. So next step I will
try to improve my notmuch configuration using afew and of course a post will
follow after that :-).&lt;/p&gt;
&lt;/div&gt; </description> 
	<pubDate>Sat, 23 Dec 2017 11:13:00 +0000</pubDate>

</item> 
<item>
	<title>Dirk Eddelbuettel: #14: Finding Binary .deb Files for CRAN Packages</title>
	<guid>http://dirk.eddelbuettel.com/blog/2017/12/22#014_finding_binary_deb_packages</guid>
	<link>http://dirk.eddelbuettel.com/blog/2017/12/22#014_finding_binary_deb_packages</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/dirk.png&quot; width=&quot;65&quot; height=&quot;90&quot; alt=&quot;&quot; align=&quot;right&quot; style=&quot;float: right;&quot;&gt;  &lt;p&gt;Welcome to the fourteenth post in the &lt;em&gt;rationally rambling R rants&lt;/em&gt; series, or &lt;span class=&quot;math inline&quot;&gt;&lt;em&gt;R&lt;/em&gt;&lt;sup&gt;4&lt;/sup&gt;&lt;/span&gt; for short. The last two posts were concerned with faster installation. First, we showed how &lt;a href=&quot;http://dirk.eddelbuettel.com/blog/2017/11/27#011_faster_package_installation_one&quot;&gt;ccache can speed up (re-)installation&lt;/a&gt;. This was followed by a second post on &lt;a href=&quot;http://dirk.eddelbuettel.com/blog/2017/12/13#013_faster_package_installation_two&quot;&gt;faster installation via binaries&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This last post immediately sparked some follow-up. Replying to &lt;a href=&quot;https://twitter.com/eddelbuettel/status/941339379137679360&quot;&gt;my tweet&lt;/a&gt; about it, &lt;a href=&quot;https://twitter.com/revodavid?ref_src=twsrc%5Egoogle%7Ctwcamp%5Eserp%7Ctwgr%5Eauthor&quot;&gt;David Smith&lt;/a&gt; wondered how to combine binary and source installation (&lt;em&gt;tl;dr&lt;/em&gt;: it is hard as you need to combine two package managers). Just this week, &lt;a href=&quot;https://github.com/maxogden&quot;&gt;Max Ogden&lt;/a&gt; wondered &lt;a href=&quot;https://twitter.com/denormalize/status/943226601835134976&quot;&gt;how to install CRAN packages as binaries on Linux&lt;/a&gt;, and &lt;a href=&quot;https://github.com/nuest&quot;&gt;Daniel Nuest&lt;/a&gt; poked me &lt;a href=&quot;https://github.com/o2r-project/containerit/issues/107&quot;&gt;on GitHub as part of his excellent containerit project&lt;/a&gt; as installation of binaries would of course also make Docker container builds much faster. (&lt;em&gt;tl;dr&lt;/em&gt;: Oh yes, see below!)&lt;/p&gt;
&lt;p&gt;So can one? Sure. We have a tool. But first the basics.&lt;/p&gt;
&lt;h4 id=&quot;the-basics&quot;&gt;The Basics&lt;/h4&gt;
&lt;p&gt;Packages for a particular distribution are indexed by a packages file for that distribution. This is not unlike &lt;a href=&quot;https://cran.r-project.org&quot;&gt;CRAN&lt;/a&gt; using top-level &lt;code&gt;PACKAGES*&lt;/code&gt; files. So in principle you could just fetch those packages files, parse and index them, and then search them. In practice that is a lot of work as Debian and Ubuntu now have several tens of thousands of packages.&lt;/p&gt;
&lt;p&gt;So it is better to use the distro tool. In my use case on &lt;code&gt;.deb&lt;/code&gt;-based distros, this is &lt;code&gt;apt-cache&lt;/code&gt;. Here is a quick example for the (Ubuntu 17.04) server on which I type this:&lt;/p&gt;
&lt;div class=&quot;sourceCode&quot;&gt;&lt;pre class=&quot;sourceCode sh&quot;&gt;&lt;code class=&quot;sourceCode bash&quot;&gt;$ &lt;span class=&quot;fu&quot;&gt;sudo&lt;/span&gt; apt-get update -qq            ## suppress stdout display
$ &lt;span class=&quot;ex&quot;&gt;apt-cache&lt;/span&gt; search r-cran- &lt;span class=&quot;kw&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;wc&lt;/span&gt; -l
&lt;span class=&quot;ex&quot;&gt;419&lt;/span&gt;
$&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;So a very vanilla Ubuntu installation has &quot;merely&quot; 400+ binary CRAN packages. Nothing to write home about (yet) -- but read on.&lt;/p&gt;
&lt;h4 id=&quot;cran2deb4ubuntu-or-c2d4u-for-short&quot;&gt;cran2deb4ubuntu, or c2d4u for short&lt;/h4&gt;
&lt;p&gt;A decade ago, I was involved in two projects to turn all of CRAN into .deb binaries. We had a first ad-hoc predecessor project, and then (much better) a &#39;version 2&#39; thanks to the &lt;a href=&quot;https://wiki.debian.org/SummerOfCode2008/cran2deb&quot;&gt;excellent Google Summer of Code work&lt;/a&gt; by &lt;a href=&quot;http://www.gatsby.ucl.ac.uk/~ucgtcbl/&quot;&gt;Charles Blundell&lt;/a&gt; (and mentored by me). I ran with that for a while and carried at the peak about 2500 binaries or so. And then my controlling db died, just as I visited CRAN to show it off. Very sad. &lt;a href=&quot;https://www.donarmstrong.com/&quot;&gt;Don Armstrong&lt;/a&gt; ran with the code and rebuilt it on better foundations and had for quite some time all of CRAN and BioC built (peaking at maybe 7k package). Then his RAID died. The surviving effort is the one by &lt;a href=&quot;http://behrend.psu.edu/person/michael-rutter&quot;&gt;Michael Rutter&lt;/a&gt; who always leaned on the &lt;a href=&quot;http://launchpad.net&quot;&gt;Lauchpad&lt;/a&gt; PPA system to build his packages. And those &lt;a href=&quot;https://launchpad.net/~marutter/+archive/ubuntu/c2d4u&quot;&gt;still exist&lt;/a&gt; and provide a core of over 10k packages (but across different Ubuntu flavours, see below).&lt;/p&gt;
&lt;h4 id=&quot;using-cran2deb4ubuntu&quot;&gt;Using cran2deb4ubuntu&lt;/h4&gt;
&lt;p&gt;In order to access &lt;a href=&quot;https://launchpad.net/~marutter/+archive/ubuntu/c2d4u&quot;&gt;c2d4u&lt;/a&gt; you need an Ubuntu system. For example my &lt;a href=&quot;https://github.com/eddelbuettel/r-travis/blob/master/run.sh&quot;&gt;Travis runner script&lt;/a&gt; does&lt;/p&gt;
&lt;div class=&quot;sourceCode&quot;&gt;&lt;pre class=&quot;sourceCode sh&quot;&gt;&lt;code class=&quot;sourceCode bash&quot;&gt;&lt;span class=&quot;co&quot;&gt;# Add marutter&#39;s c2d4u repository, (and rrutter for CRAN builds too)&lt;/span&gt;
&lt;span class=&quot;fu&quot;&gt;sudo&lt;/span&gt; add-apt-repository -y &lt;span class=&quot;st&quot;&gt;&quot;ppa:marutter/rrutter&quot;&lt;/span&gt;
&lt;span class=&quot;fu&quot;&gt;sudo&lt;/span&gt; add-apt-repository -y &lt;span class=&quot;st&quot;&gt;&quot;ppa:marutter/c2d4u&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;After that one can query &lt;code&gt;apt-cache&lt;/code&gt; as above, but take advantage of a much larger pool with over 3500 packages (see below). The &lt;code&gt;add-apt-repository&lt;/code&gt; command does the Right Thing (TM) in terms of both getting the archive key, and adding the &lt;code&gt;apt&lt;/code&gt; source entry to the config directory.&lt;/p&gt;
&lt;h4 id=&quot;how-about-from-r-sure-via-rcppapt&quot;&gt;How about from R? Sure, via RcppAPT&lt;/h4&gt;
&lt;p&gt;Now, all this command-line business is nice. But can we do all this programmatically from R? Sort of.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;http://dirk.eddelbuettel.com/code/rcpp.apt.html&quot;&gt;RcppAPT package&lt;/a&gt; interface the libapt library, and provides access to a few functions. I used this feature when I argued (unsuccessfully, as it turned out) for a particular &lt;a href=&quot;http://eddelbuettel.github.io/rcppapt/binnmuAfterR340.html&quot;&gt;issue concerning Debian and R upgrades&lt;/a&gt;. But that is water under the bridge now, and the main point is that &quot;yes we can&quot;.&lt;/p&gt;
&lt;h4 id=&quot;in-docker-r-apt&quot;&gt;In Docker: r-apt&lt;/h4&gt;
&lt;p&gt;Building on &lt;a href=&quot;http://dirk.eddelbuettel.com/code/rcpp.apt.html&quot;&gt;RcppAPT&lt;/a&gt;, within the &lt;a href=&quot;https://www.rocker-project.org/&quot;&gt;Rocker Project&lt;/a&gt; we built on top of this by proving a particular class of containers for different Ubuntu releases which all contain i) &lt;a href=&quot;http://dirk.eddelbuettel.com/code/rcpp.apt.html&quot;&gt;RcppAPT&lt;/a&gt; and ii) the required &lt;code&gt;apt&lt;/code&gt; source entry for Michael&#39;s repos.&lt;/p&gt;
&lt;p&gt;So now we can do this&lt;/p&gt;
&lt;div class=&quot;sourceCode&quot;&gt;&lt;pre class=&quot;sourceCode sh&quot;&gt;&lt;code class=&quot;sourceCode bash&quot;&gt;$ &lt;span class=&quot;ex&quot;&gt;docker&lt;/span&gt; run --rm -ti rocker/r-apt:xenial /bin/bash -c &lt;span class=&quot;st&quot;&gt;&#39;apt-get update -qq; apt-cache search r-cran- | wc -l&#39;&lt;/span&gt;
&lt;span class=&quot;ex&quot;&gt;3525&lt;/span&gt;
$&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This fires up the corresponding Docker container for the &lt;code&gt;xenial&lt;/code&gt; (ie 16.04 LTS) release, updates the &lt;code&gt;apt&lt;/code&gt; indices and then searches for &lt;code&gt;r-cran-*&lt;/code&gt; packages. And it seems we have a little over 3500 packages. Not bad at all (especially once you realize that this skews strongly towards the more popular packages).&lt;/p&gt;
&lt;h4 id=&quot;example-an-rstan-container&quot;&gt;Example: An rstan container&lt;/h4&gt;
&lt;p&gt;A little while a ago a seemingly very frustrated user came to &lt;a href=&quot;http://www.carlboettiger.info/&quot;&gt;Carl&lt;/a&gt; and myself and claimed that out &lt;a href=&quot;https://www.rocker-project.org/&quot;&gt;Rocker Project&lt;/a&gt; sucketh because building &lt;code&gt;rstan&lt;/code&gt; was all but impossible. I don&#39;t have the time, space or inclination to go into details, but he was just plain wrong. You do need to know a little about C++, package building, and more to do this from scratch. Plus, there was a &lt;a href=&quot;https://github.com/stan-dev/rstan/issues/441&quot;&gt;long-standing issue with rstan and newer Boost&lt;/a&gt; (which also included several workarounds).&lt;/p&gt;
&lt;p&gt;Be that as it may, it serves as nice example here. So the first question: is &lt;code&gt;rstan&lt;/code&gt; packaged?&lt;/p&gt;
&lt;div class=&quot;sourceCode&quot;&gt;&lt;pre class=&quot;sourceCode sh&quot;&gt;&lt;code class=&quot;sourceCode bash&quot;&gt;$ &lt;span class=&quot;ex&quot;&gt;docker&lt;/span&gt; run --rm -ti rocker/r-apt:xenial /bin/bash -c &lt;span class=&quot;st&quot;&gt;&#39;apt-get update -qq; apt-cache show r-cran-rstan&#39;&lt;/span&gt;
&lt;span class=&quot;ex&quot;&gt;Package&lt;/span&gt;: r-cran-rstan
&lt;span class=&quot;ex&quot;&gt;Source&lt;/span&gt;: rstan
&lt;span class=&quot;ex&quot;&gt;Priority&lt;/span&gt;: optional
&lt;span class=&quot;ex&quot;&gt;Section&lt;/span&gt;: gnu-r
&lt;span class=&quot;ex&quot;&gt;Installed-Size&lt;/span&gt;: 5110
&lt;span class=&quot;ex&quot;&gt;Maintainer&lt;/span&gt;: cran2deb4ubuntu &lt;span class=&quot;op&quot;&gt;&amp;lt;&lt;/span&gt;cran2deb4ubuntu@gmail.com&lt;span class=&quot;op&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;ex&quot;&gt;Architecture&lt;/span&gt;: amd64
&lt;span class=&quot;ex&quot;&gt;Version&lt;/span&gt;: 2.16.2-1cran1ppa0
&lt;span class=&quot;ex&quot;&gt;Depends&lt;/span&gt;: pandoc, r-base-core, r-cran-ggplot2, r-cran-stanheaders, r-cran-inline, r-cran-gridextra, r-cran-rcpp,\
   r-cran-rcppeigen, r-cran-bh, libc6 (&lt;span class=&quot;op&quot;&gt;&amp;gt;&lt;/span&gt;= 2.14), &lt;span class=&quot;ex&quot;&gt;libgcc1&lt;/span&gt; (&lt;span class=&quot;op&quot;&gt;&amp;gt;&lt;/span&gt;= 1:4.0), &lt;span class=&quot;ex&quot;&gt;libstdc++6&lt;/span&gt; (&lt;span class=&quot;op&quot;&gt;&amp;gt;&lt;/span&gt;= 5.2)
&lt;span class=&quot;ex&quot;&gt;Filename&lt;/span&gt;: pool/main/r/rstan/r-cran-rstan_2.16.2-1cran1ppa0_amd64.deb
&lt;span class=&quot;ex&quot;&gt;Size&lt;/span&gt;: 1481562
&lt;span class=&quot;ex&quot;&gt;MD5sum&lt;/span&gt;: 60fe7cfc3e8813a822e477df24b37ccf
&lt;span class=&quot;ex&quot;&gt;SHA1&lt;/span&gt;: 75bbab1a4193a5731ed105842725768587b4ec22
&lt;span class=&quot;ex&quot;&gt;SHA256&lt;/span&gt;: 08816ea0e62b93511a43850c315880628419f2b817a83f92d8a28f5beb871fe2
&lt;span class=&quot;ex&quot;&gt;Description&lt;/span&gt;: GNU R package &lt;span class=&quot;st&quot;&gt;&quot;R Interface to Stan&quot;&lt;/span&gt;
&lt;span class=&quot;ex&quot;&gt;Description-md5&lt;/span&gt;: c9fc74a96bfde57f97f9d7c16a218fe5

$&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;It would seem so. With that, the following &lt;em&gt;very minimal&lt;/em&gt; Dockerfile is all we need:&lt;/p&gt;
&lt;div class=&quot;sourceCode&quot;&gt;&lt;pre class=&quot;sourceCode sh&quot;&gt;&lt;code class=&quot;sourceCode bash&quot;&gt;&lt;span class=&quot;co&quot;&gt;## Emacs, make this -*- mode: sh; -*-&lt;/span&gt;

&lt;span class=&quot;co&quot;&gt;## Start from xenial&lt;/span&gt;
&lt;span class=&quot;ex&quot;&gt;FROM&lt;/span&gt; rocker/r-apt:xenial

&lt;span class=&quot;co&quot;&gt;## This handle reaches Carl and Dirk&lt;/span&gt;
&lt;span class=&quot;ex&quot;&gt;MAINTAINER&lt;/span&gt; &lt;span class=&quot;st&quot;&gt;&quot;Carl Boettiger and Dirk Eddelbuettel&quot;&lt;/span&gt; rocker-maintainers@eddelbuettel.com

&lt;span class=&quot;co&quot;&gt;## Update and install rstan&lt;/span&gt;
&lt;span class=&quot;ex&quot;&gt;RUN&lt;/span&gt; apt-get update &lt;span class=&quot;kw&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;ex&quot;&gt;apt-get&lt;/span&gt; install -y --no-install-recommends r-cran-rstan

&lt;span class=&quot;co&quot;&gt;## Make R the default&lt;/span&gt;
&lt;span class=&quot;ex&quot;&gt;CMD&lt;/span&gt; [&lt;span class=&quot;st&quot;&gt;&quot;R&quot;&lt;/span&gt;]&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In essence, it executes one command: install &lt;code&gt;rstan&lt;/code&gt; but from &lt;em&gt;binary&lt;/em&gt; taking care of all dependencies. And lo and behold, it works as advertised:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ docker run --rm -ti rocker/rstan:local Rscript -e &#39;library(rstan)&#39;
Loading required package: ggplot2
Loading required package: StanHeaders
rstan (Version 2.16.2, packaged: 2017-07-03 09:24:58 UTC, GitRev: 2e1f913d3ca3)
For execution on a local, multicore CPU with excess RAM we recommend calling
rstan_options(auto_write = TRUE)
options(mc.cores = parallel::detectCores())
$&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;So there: installing from binary works, takes care of dependencies, is easy and as an added bonus even faster. What&#39;s not too like?&lt;/p&gt;
&lt;p&gt;(And yes, a few of us are working on a system to have more packages available as binaries, but it may take another moment...)&lt;/p&gt;
&lt;p style=&quot;font-size: 80%; font-style: italic;&quot;&gt;
This post by &lt;a href=&quot;http://dirk.eddelbuettel.com&quot;&gt;Dirk Eddelbuettel&lt;/a&gt; originated on his &lt;a href=&quot;http://dirk.eddelbuettel.com/blog/&quot;&gt;Thinking inside the box&lt;/a&gt; blog. Please report excessive re-aggregation in third-party for-profit settings.
&lt;/p&gt;&lt;p&gt;&lt;/p&gt; </description> 
	<pubDate>Fri, 22 Dec 2017 22:34:00 +0000</pubDate>

</item> 
<item>
	<title>Ben Hutchings: BPF security issues in Debian</title>
	<guid>https://www.decadent.org.uk/ben/blog/2017/12/22/bpf-security-issues-in-debian</guid>
	<link>https://www.decadent.org.uk/ben/blog/bpf-security-issues-in-debian.html</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/benh.png&quot; width=&quot;109&quot; height=&quot;100&quot; alt=&quot;&quot; align=&quot;right&quot; style=&quot;float: right;&quot;&gt;  &lt;p&gt;
  Since Debian 9 &quot;stretch&quot;, we&#39;ve shipped a Linux kernel supporting
  the &quot;enhanced BPF&quot; feature which allows unprivileged user space to
  upload code into the kernel.  This code is written in a restricted
  language, but one that&#39;s much richer than the older &quot;classic&quot; BPF.
  The kernel verifies that the code is safe (doesn&#39;t loop, only
  accesses memory it is supposed to, etc.) before running it.
  However, this means that bugs in the verifier could allow unsafe
  programs to compromise the kernel&#39;s security.
&lt;/p&gt;
&lt;p&gt;
  Unfortunately, Jann Horn and others recently found many such bugs in
  Linux 4.14, and some of them affect older versions too.  As a
  mitigation, consider setting the sysctl
  &lt;tt&gt;kernel.unprivileged_bpf_disabled=1&lt;/tt&gt;.  Updated packages will
  be available shortly.
&lt;/p&gt;
&lt;p&gt;
  &lt;strong&gt;Update:&lt;/strong&gt; There is a public exploit that uses several
  of these bugs to get root privileges.  It doesn&#39;t work as-is on
  stretch with the Linux 4.9 kernel, but is easy to adapt.  I
  recommend applying the above mitigation as soon as possible to all
  systems running Linux 4.4 or later.
&lt;/p&gt; </description> 
	<pubDate>Fri, 22 Dec 2017 21:20:15 +0000</pubDate>

</item> 
<item>
	<title>Shirish Agarwal: 24×7 shopping in Maharashtra, Learning and Economics</title>
	<guid>http://flossexperiences.wordpress.com/?p=4159</guid>
	<link>https://flossexperiences.wordpress.com/2017/12/22/24x7-shopping-in-maharashtra-learning-and-economics/</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/shirish.png&quot; width=&quot;80&quot; height=&quot;80&quot; alt=&quot;&quot; align=&quot;right&quot; style=&quot;float: right;&quot;&gt;  &lt;p&gt;Dear Friends, &lt;/p&gt;
&lt;p&gt;My broadband connectivity (ADSL) by &lt;a href=&quot;https://en.wikipedia.org/wiki/Bharat_Sanchar_Nigam_Limited&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;BSNL&lt;/a&gt;  was down for a month and a bit more hence couldn’t post any blogs. In account of road-work there had been digging and numerous accounts of stealing thick copper cables which can be resold to different people and even melted to extract copper. Optical fiber for communication prices have dropped &lt;a href=&quot;https://www.quora.com/What-is-the-price-of-fiber-optic-cables-in-India-say-for-100-metres-that-are-used-for-communication-purposes&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;tremendously&lt;/a&gt; , the only expensive and tricky part is splicing and termination of the strands. There is a lobby which has clout and incentives to continue with this outdated and outmoded technology, which is why it continues, although this take discussion from the main topic. &lt;/p&gt;
&lt;p&gt;I could have cheated and made a blog post in bits and pieces, something I hope to do this week-end but there has been some encouraging news and views which prompted me to post this blog post – &lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.hindustantimes.com/mumbai-news/from-today-you-can-shop-dine-and-play-all-night-long-in-mumbai/story-qaYNMZPS19HfzJaBL6vqTI.html&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;Mumbai 24/7: Shop, dine and play all night long in the city from today&lt;/a&gt;&lt;br /&gt;
and&lt;br /&gt;
&lt;a href=&quot;https://www.hungryforever.com/hotels-restaurants-maharashtra-remain-open-24x7/&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;Hotels And Restaurants In Maharashtra To Remain Open 24×7&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;One of the motives apart from being part of Debconf itself which is a valuable incentive to learn new things,  is to see Taiwan shopping 24×7, it is the night market bit that the Taiwan team has shared, something I looked up and was a bit &lt;a href=&quot;https://www.aswesawit.com/shilin-night-market/&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;hooked up&lt;/a&gt; when I saw what’s it all about. &lt;/p&gt;
&lt;p&gt;Of course if things go my way would probably would have to do bit more of research than what I have shared above. &lt;/p&gt;
&lt;p&gt;The real meat (figure of speech) of today’s announcements was a discussion on CNBC Awaaz &lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Posted the youtube link above of the discussion – is in Hindi, the crux of the discussion while was about Mumbai (while I live in Pune, about 250-300 kms. in the neighboring city) the implications are for all those places which have restaurants. small &lt;a href=&quot;https://en.wikipedia.org/wiki/Convenience_store&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;kirana stores&lt;/a&gt; which had been facing lot of competition from e-tailers. One of the things being envisaged are places to eat and shop at unearthly hours at discounted rates which will drive people interested in such products and services. Also lot of retail services which depend upon such services are also reckoned to grow bringing more stability and multiplier effects to the Indian economy. Maharashtra ( one of the 29 States/Provinces in India) has been a bit contributor to the Indian economy over decades but hasn’t had its share of investment vis-a-vis what it gives to the national exchequer in terms of various fees and taxes. There are figures and beliefs which both support the argument. I haven’t shared as the blog post would still balloon up without adding anything but if needed can still share it in comments.  &lt;/p&gt;
&lt;p&gt;It was also shared that it would increase tourism but that got mixed reviews that it might not unless and until liquor timings, licenses are loosened up a bit. &lt;/p&gt;
&lt;p&gt;I would contend though that there should be substantial increase and flexibility in domestic tourism and businesses as people would be able to make amicable plans for both parties ( a giver and a receiver.)  &lt;/p&gt;
&lt;p&gt;If one were to specifically talk about Mumbai, both Marine Drive, Grandstand as well as some other places in Colaba and elsewhere have been/were open all night. But with this shift of policy the civic infrastructure which already was in deficit might increase more as it comes under more pressure while law and order would need to be more beefed up and adequately trained, both of which are under strain as well. What was shared this policy would also end the lower-rank corruption by police officials who used to ask for protection  money if shops were even a little late in closing up. &lt;/p&gt;
&lt;p&gt;There is also a possibility that traffic congestion might be in night as well but it may reflect into a bit less traffic congestion in the day-time. Again all of this is a bit of imagination, conjecture at this point in time. People like me who can’t stand Mumbai’s humidity in the day-time would find a bit more excuse to be there at night if more budget restaurants were to be open late at night. &lt;/p&gt;
&lt;p&gt;Also it is not a blanket thing for everybody, there are restrictions on shops in residential areas which might be expected to be relaxed a bit once things happen in the open. One well-known name which cropped up was the ubiquitous &lt;a href=&quot;https://en.wikipedia.org/wiki/7-Eleven&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;7-11&lt;/a&gt; stores. There would certainly be lot of interest if such convenience stores opened up all across the city/state. &lt;/p&gt;
&lt;p&gt;I am excited to see if this happens.       &lt;/p&gt;
&lt;p&gt;Although, this has happened in India years ago, just it was ‘illegal’ and now it is ‘legal’. When I was in my college, around 1993 – 1994 I had shared also in 2016 Debconf the net/web had just started in India and I was lucky to be able to see/view the net using a service called &lt;a href=&quot;http://www.niit.com/india/&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;NIIT&lt;/a&gt; Computerdrome. &lt;/p&gt;
&lt;p&gt;Just to be explicit, NIIT is and was a premium offering for students who wanted to learn about programming and various MS-Windows technologies as there were already signs that IT (Information Technology) would be a disruptive force. Although nowadays they have also moved into management and administration courses as local IT industry has yet to grow up and lot of H1B-Visas under &lt;a href=&quot;http://indianexpress.com/article/india/h-1b-visa-holders-us-may-stop-spouses-from-working-4986351/&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;scanner&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;It was a fancy name for what is now known as a cyber-cafe but we used to get net access at discounted rates. Now this place was about 4-5 kms. from my place so I had to be really careful in planning, figuring out as I had to buy coupons which had an expiry date and everything. &lt;/p&gt;
&lt;p&gt;Couple of years later, came to know of a service much closer to home, in the basement of a place called &lt;a href=&quot;https://www.openstreetmap.org/way/202297127&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;Sagar Arcade&lt;/a&gt;. Now for those of us who were addicted to web access either for porn, or net technologies, or net gaming, IRC, Video chatting all used to throng there. At that time, NIIT had an 8 Mbps leased line which was a big deal and still is. &lt;/p&gt;
&lt;p&gt;While wholesale bulk bandwidth rates have hit rock-bottom, last-mile connectivity still seems to be an issue. Because of Reliance Jio’s aggressive pitches some of the retail bandwidth rates have softened up but still have miles to go before I could say we have adequate bandwidth. Dropped calls (on mobile and landline) are still an issue while bandwidth tapering off every now and then seems to be endemic behavior in both public and private sector ISPs (Internet Service Provider) most of which are Tier-3 ISPs, the only tier-1 ISP Indian ISP I  know is &lt;a href=&quot;http://map.tatacommunications.com/#/&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;Tatas&lt;/a&gt;, see &lt;a href=&quot;https://www.tatacommunications.com/about/faq/&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;this FAQ &lt;/a&gt; as well – &lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;World’s largest wholly owned submarine fibre network – more than 500,000 km of subsea fibre, and more than 210,000 km of terrestrial fibre&lt;br /&gt;
Only Tier-1 provider that is in the top five in five continents – by internet routes&lt;br /&gt;
Over 24% of the world’s internet routes are on Tata Communications’ network&lt;br /&gt;
400+ PoPs reach more than 240 countries and territories&lt;br /&gt;
44 data centres and co-location centres with over one million sq. ft. of space&lt;br /&gt;
7600 petabytes of internet traffic travels over the Tata Communications’ internet backbone each month&lt;br /&gt;
15+ terabits/s of international bandwidth lit capacity&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt; – From Tata Communications FAQ . &lt;/p&gt;
&lt;p&gt;but came to know they are merging their end-user business with Airtel (another Tier-3 ISP) while their under-sea fibre optic cable business(see above) will still remain with them but this again is taking outside the current topic.  &lt;/p&gt;
&lt;p&gt;Back to topic on hand – &lt;/p&gt;
&lt;p&gt;I am guessing that there was practically no work being done after hours so NIIT might have in-turn leased some of the capacity to the cyber-cafe. &lt;/p&gt;
&lt;p&gt;The cybercafe owner had two rates, normal rates which were comparable to any other cyber-cafes and night rates which were half or one-fourth (happy hours) which extended from 2300 hrs – 0500 hours. In order to indulge into net curiosity/net addiction me and few of my friends used to go there. Few days/couple of weeks later a chinese take-away and then a juice/tea/coffee shop came to serve the cybercafe customers. &lt;/p&gt;
&lt;p&gt;This whole setup was illegal as according to laws of the time, no commercial establishment (only exceptions being Railway stations, Police Stations, Hopitals, some specific Petrol Pumps and Medicine dispensations shops were allowed to remain open 24×7 ) But even in the case of Medicine shops and Petrol Pumps there were very few who had got permission (looking back might have a combo for Business/Political patronage to it which were not apparent when I was a teenager.) I also came to know much much later that what we were doing was illegal as in using a commercial establishment after hours even though it was in connivance with the owner. see &lt;a href=&quot;https://mahakamgar.maharashtra.gov.in/images/lc/pdf/the-bombay-shops-establishments-act.pdf&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;The Bombay Shop Act, 1948&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;Comically, the Bombay Shop Act which has now been superseded by the&lt;a href=&quot;http://bombayhighcourt.nic.in/libweb/acts/Stateact/2017acts/2017.61.pdf&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt; Maharashtra Shops and Establishments Act 2017 &lt;/a&gt; has never been in the syllabus of Commerce Students even when we were graduating with Business Administration as one of the optional subjects. The Act and surrounding topics should have been there in the books and creative discussions and consultations with students being taken up. This was in 1994, a full 46 years after the Act came into being. &lt;/p&gt;
&lt;p&gt;But as has been shared on this blog before, this is a dream which seems shall not be realized at least in the immediate future.  &lt;/p&gt;
&lt;p&gt;While reading today’s newspaper I came across this &lt;a href=&quot;http://indianexpress.com/article/opinion/columns/an-artificial-shortage-of-facts-4993543/&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;editorial&lt;/a&gt; which also opens up a window what the elitist institutions have shrunk in their collective responsibility. While it only talks about social sciences, another &lt;a href=&quot;https://www.clearias.com/indian-economy-growth-development-and-employment/&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;article&lt;/a&gt; for students of UPSC Mains which was shared by a student friend of mine. It actually took me back to the term &lt;a href=&quot;https://en.wikipedia.org/wiki/The_dismal_science&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;Dismal Science&lt;/a&gt; as I came across the term and understood the implications years ago. &lt;/p&gt;
&lt;p&gt;While it is too early to state/predict whether it would change things in Pune and Maharashtra as a whole, but am hopeful as it would generate both direct and indirect employment. After years of jobless inflationary growth it would be welcome departure especially as youngsters without adequate job skills are joining the unemployed in millions.   &lt;/p&gt;&lt;br /&gt;Filed under: &lt;a href=&quot;https://flossexperiences.wordpress.com/category/miscellenous/&quot;&gt;Miscellenous&lt;/a&gt; Tagged: &lt;a href=&quot;https://flossexperiences.wordpress.com/tag/mumbai-24x7/&quot;&gt;# Mumbai 24x7&lt;/a&gt;, &lt;a href=&quot;https://flossexperiences.wordpress.com/tag/business-in-india/&quot;&gt;#Business in India&lt;/a&gt;, &lt;a href=&quot;https://flossexperiences.wordpress.com/tag/copper-cables/&quot;&gt;#Copper Cables&lt;/a&gt;, &lt;a href=&quot;https://flossexperiences.wordpress.com/tag/economic-theory-19th-century/&quot;&gt;#Economic Theory 19th century&lt;/a&gt;, &lt;a href=&quot;https://flossexperiences.wordpress.com/tag/maharashtra-shops-and-establishments-act-2017/&quot;&gt;#Maharashtra Shops and Establishments Act 2017&lt;/a&gt;, &lt;a href=&quot;https://flossexperiences.wordpress.com/tag/optical-fiber-prices-in-india/&quot;&gt;#Optical Fiber Prices in India&lt;/a&gt;, &lt;a href=&quot;https://flossexperiences.wordpress.com/tag/planet-debian/&quot;&gt;#planet-debian&lt;/a&gt;, &lt;a href=&quot;https://flossexperiences.wordpress.com/tag/social-sciences/&quot;&gt;#Social Sciences&lt;/a&gt;, &lt;a href=&quot;https://flossexperiences.wordpress.com/tag/tier-1-isp/&quot;&gt;#Tier 1 ISP&lt;/a&gt;, &lt;a href=&quot;https://flossexperiences.wordpress.com/tag/tier-3-isps/&quot;&gt;#Tier 3 ISP&#39;s&lt;/a&gt;, &lt;a href=&quot;https://flossexperiences.wordpress.com/tag/broadband/&quot;&gt;Broadband&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/flossexperiences.wordpress.com/4159/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/flossexperiences.wordpress.com/4159/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godelicious/flossexperiences.wordpress.com/4159/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/flossexperiences.wordpress.com/4159/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gofacebook/flossexperiences.wordpress.com/4159/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/facebook/flossexperiences.wordpress.com/4159/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gotwitter/flossexperiences.wordpress.com/4159/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/twitter/flossexperiences.wordpress.com/4159/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/gostumble/flossexperiences.wordpress.com/4159/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/flossexperiences.wordpress.com/4159/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/godigg/flossexperiences.wordpress.com/4159/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/flossexperiences.wordpress.com/4159/&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.wordpress.com/1.0/goreddit/flossexperiences.wordpress.com/4159/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/flossexperiences.wordpress.com/4159/&quot; /&gt;&lt;/a&gt; </description> 
	<pubDate>Fri, 22 Dec 2017 15:18:31 +0000</pubDate>

</item> 
<item>
	<title>Olivier Berger: Safely testing my students’ PHP graded labs with docker containers</title>
	<guid>https://www-public.tem-tsp.eu/~berger_o/weblog/?p=1405</guid>
	<link>https://www-public.tem-tsp.eu/~berger_o/weblog/2017/12/22/safely-testing-my-students-php-graded-labs-with-docker-containers/</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/obergix.png&quot; width=&quot;63&quot; height=&quot;85&quot; alt=&quot;&quot; align=&quot;right&quot; style=&quot;float: right;&quot;&gt;  &lt;p&gt;During the course of Web architecture and applications, our students had to deliver a Silex / Symfony Web app project which I’m grading.&lt;/p&gt;
&lt;p&gt;I had initially hacked a Docker container to be able to test that the course’s lab examples and code bases provided would be compatible with PHP 5 even though the nominal environment provided in the lab rooms was PHP 7. As I’m running a recent Debian distro with PHP 7 as the default PHP installation, being able to run PHP 5 in a container is quite handy for me. Yes, PHP 5 is dead, but some students might still have remaining installs of old Ubuntus where PHP5 was the norm. As the course was based on Symfony and Silex and these would run as well on PHP 5 or 7 (provided we configured the right stuff in the composer.json), this was supposed to be perfect.&lt;/p&gt;
&lt;p&gt;I’ve used such a container a lot for preparing the labs and it served me well. Most of the time I’ve used it to start the PHP command line interpreter from the current dir to start the embedded Web server with “php -S”, which is the standard way to run programs in dev/tests environment with Silex or Symfony (yes, Symfony requires something like “php -S localthost:8000 -t web/” maybe).&lt;/p&gt;
&lt;p&gt;I’ve later discovered an additional benefit of using such a container, when comes the time to grad the work that our students have submitted, and I need to test their code. Of course, it ensures that I may run it even if they used PHP5 and I rely on PHP 7 on my machine. But it also assures that I’m only at risk of trashing stuff in the current directory if sh*t happens. Of course, no student would dare deliver malicious PHP code trying to mess with my files… but better safe than sorry. If the contents of the container is trashed, I’m rather on the safe side. &lt;/p&gt;
&lt;p&gt;Of course one may give a grade only by reading the students’ code and not testing, but that would be bad taste. And yes, there are probably ways to escape the container safety net in PHP… but I sould maybe not tempt the smartest students of mine in continuing on this path &lt;img alt=&quot;😉&quot; class=&quot;wp-smiley&quot; src=&quot;https://s.w.org/images/core/emoji/2.3/72x72/1f609.png&quot; style=&quot;height: 1em;&quot; /&gt; &lt;/p&gt;
&lt;p&gt;If you feel like testing the container, I’ve uploaded the necessary bits to a public repo : &lt;a href=&quot;https://gitlab.com/olberger/local-php5-sqlite-debian&quot;&gt;https://gitlab.com/olberger/local-php5-sqlite-debian&lt;/a&gt;.&lt;/p&gt; </description> 
	<pubDate>Fri, 22 Dec 2017 11:34:48 +0000</pubDate>

</item> 
<item>
	<title>Gustavo Noronha Silva: CEF on Wayland</title>
	<guid>https://blog.kov.eti.br/?p=412</guid>
	<link>https://blog.kov.eti.br/2017/12/cef-on-wayland/</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/kov.png&quot; width=&quot;65&quot; height=&quot;86&quot; alt=&quot;&quot; align=&quot;right&quot; style=&quot;float: right;&quot;&gt;  &lt;p&gt;TL;DR: &lt;a href=&quot;https://bitbucket.org/chromiumembedded/cef/pull-requests/128/santosh-cef-mus-support/diff&quot; title=&quot;Pull request for CEF/Mus/Ozone&quot;&gt;we have patches for CEF&lt;/a&gt; to enable its usage on Wayland and X11 through the Mus/Ozone infrastructure that is to become Chromium’s streamlined future. And also for &lt;a href=&quot;https://gitlab.collabora.com/web/chromium/tree/content_shell_mus_support&quot; title=&quot;Content Shell Mus/Ozone support&quot;&gt;Content Shell&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;At Collabora we recently assisted a customer who wanted to upgrade their system from X11 to Wayland. The problem: they use CEF as a runtime for web applications and CEF was not Wayland-ready. They also wanted to have something which was as future-proof and as upstreamable as possible, so the Chromium team’s plans were quite relevant.&lt;/p&gt;
&lt;p&gt;Chromium is at the same time very modular and quite monolithic. It supports several platforms and has slightly different code paths in each, while at the same time acting as a desktop shell for Chromium OS. To make it even more complex, the Chromium team is constantly rewriting bits or doing major refactorings.&lt;/p&gt;
&lt;p&gt;That means you’ll often find several different and incompatible ways of doing something in the code base. You will usually not find clear and stable interfaces, which is where tools like CEF come in, to provide some stability to users of the framework. CEF neutralizes some of the instability, providing a more stable API.&lt;/p&gt;
&lt;p&gt;So we started by looking at 1) where is Chromium headed and 2) what kind of integration CEF needed with Chromium’s guts to work with Wayland? We quickly found that the Chromium team is trying to streamline some of the infrastructure so that it can be better shared among the several use cases, reducing duplication and complexity.&lt;/p&gt;
&lt;p&gt;That’s where the mus+ash (pronounced “mustache”) project comes in. It wants to make a better split of the window management and shell functionalities of Chrome OS from the browser while at the same time replacing obsolete IPC systems with Mojo. That should allow a lot more code sharing with the “Linux Desktop” version. It also meant that we needed to get CEF to talk Mus.&lt;/p&gt;
&lt;p&gt;Chromium already has Wayland support that was built by Intel a while ago for the Ozone display platform abstraction layer. More recently, the &lt;a href=&quot;https://github.com/Igalia/chromium/tree/ozone-wayland-dev&quot; title=&quot;Ozone Wayland dev branch&quot;&gt;ozone-wayland-dev&lt;/a&gt; branch was started by our friends at Igalia to integrate that work with mus+ash, implementing the necessary Mus and Mojo interfaces, window decorations, menus and so on. That looked like the right base to use for our CEF changes.&lt;/p&gt;
&lt;p&gt;It took quite a bit of effort and several Collaborans participated in the effort, but &lt;a href=&quot;https://gitlab.collabora.com/web/cef/commit/1165a2107203c350998dc4521aa529d401b49d94&quot; title=&quot;First version of working Mus support&quot;&gt;we eventually managed to convince CEF&lt;/a&gt; to properly start the necessary processes and set them up for running with Mus and Ozone. Then we moved on to make the use cases our customer cared about stable and to port their internal runtime code.&lt;/p&gt;
&lt;p&gt;We contributed touch support for the Wayland Ozone backend, &lt;a href=&quot;https://chromium-review.googlesource.com/c/chromium/src/+/754703&quot; title=&quot;Patch to enable touch for Wayland/Ozone&quot;&gt;which we are in the process of upstreaming&lt;/a&gt;, reported a few bugs on the Mus/Ozone integration, and did some debugging for others, which we still need to figure out &lt;a href=&quot;https://gitlab.collabora.com/web/chromium/commit/77ee9e5dd93470bc1ff41d507bbf68e7f88062ba&quot; title=&quot;Separate thread for Wayland poll&quot;&gt;better&lt;/a&gt; &lt;a href=&quot;https://git.collabora.com/cgit/cef-wayland/chromium.git/commit/?h=cef-wayland&amp;amp;id=7aaf1b4a91dc15e9d89085c83d7c992f03519d02&quot; title=&quot;Work-around for startup hang&quot;&gt;fixes&lt;/a&gt; for.&lt;/p&gt;
&lt;p&gt;For instance, the way Wayland fd polling works does not integrate nicely with the Chromium run loop, since &lt;a href=&quot;https://wayland.freedesktop.org/docs/html/apb.html#Client-classwl__display_1a040dca18775e3177883f06bd6fdf395f&quot; title=&quot;Wayland prepare_read&quot;&gt;there needs to be some locking involved&lt;/a&gt;. If you don’t lock/unlock the display for polling, you may end up in a situation in which you’re told there is something to read and before you actually do the read the GL stack may do it in another thread, causing your blocking read to hang forever (or until there is something to read, like a mouse move). As a work-around, &lt;a href=&quot;https://gitlab.collabora.com/web/chromium/commit/77ee9e5dd93470bc1ff41d507bbf68e7f88062ba&quot; title=&quot;Wayland thread&quot;&gt;we avoided the Chromium run loop entirely&lt;/a&gt; for Wayland polling.&lt;/p&gt;
&lt;p&gt;More recently, we have start working on an internal project for adding &lt;a href=&quot;https://gitlab.collabora.com/web/chromium/tree/content_shell_mus_support&quot; title=&quot;Content Shell Mus/Ozone support&quot;&gt;Mus/Ozone support to Content Shell&lt;/a&gt;, which is a test shell simpler than Chromium the browser. We think it will be useful as a test bed for future work that uses Mus/Ozone and the content API but not the browser UI, since it lives inside the Chromium code base. We are looking forward to upstreaming it soon!&lt;/p&gt;
&lt;p&gt;PS: if you want to build it and try it out, here are some instructions:&lt;/p&gt;
&lt;pre&gt;# Check out Google build tools and put them on the path
$ git clone https://chromium.googlesource.com/a/chromium/tools/depot_tools.git
$ export PATH=$PATH:`pwd`/depot_tools

# Check out chromium; note the &#39;src&#39; after the git command, it is important
$ mkdir chromium; cd chromium
$ git clone -b cef-wayland https://gitlab.collabora.com/web/chromium.git src
$ gclient sync  --jobs 16 --with_branch_heads

# To use CEF, download it and look at or use the script we put in the repository
$ cd src # cef goes inside the chromium source tree
$ git clone -b cef-wayland https://gitlab.collabora.com/web/cef.git
$ sh ./cef/build.sh # NOTE: you may need to edit this script to adapt to your directory structure
$ out/Release_GN_x64/cefsimple --mus --use-views

# To build Content Shell you do not need to download CEF, just switch to the branch and build
$ cd src
$ git checkout -b content_shell_mus_support origin/content_shell_mus_support
$ gn args out/Default --args=&quot;use_ozone=true enable_mus=true use_xkbcommon=true&quot;
$ ninja -C out/Default content_shell
$ ./out/Default/content_shell --mus --ozone-platform=wayland
&lt;/pre&gt; </description> 
	<pubDate>Fri, 22 Dec 2017 11:25:40 +0000</pubDate>

</item> 
<item>
	<title>Michal &amp;#268;iha&amp;#345;: New projects on Hosted Weblate</title>
	<guid>https://blog.cihar.com/archives/2017/12/22/new-projects-hosted-weblate/?utm_source=rss2</guid>
	<link>https://blog.cihar.com/archives/2017/12/22/new-projects-hosted-weblate/?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;&lt;a href=&quot;http://weblate.org/hosting/&quot;&gt;Hosted Weblate&lt;/a&gt; provides also free hosting for free software projects. The hosting requests queue has grown too long, so it&#39;s time to process it and include new projects. I hope that gives you have good motivation to spend Christmas break by translating free software.&lt;/p&gt;
&lt;p&gt;This time, the newly hosted projects include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://hosted.weblate.org/projects/cagette/translations/&quot;&gt;Cagette.net&lt;/a&gt; - web app for CSA/Foodcoops&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://hosted.weblate.org/projects/manuskript/translations/&quot;&gt;Manuskript&lt;/a&gt; - tool for writers &lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://hosted.weblate.org/projects/harbour-lyrics/translations/&quot;&gt;Harbour Lyrics&lt;/a&gt; - Music lyrics application for Sailfish OS.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://hosted.weblate.org/projects/harbour-mpw/translations/&quot;&gt;Harbour MPV&lt;/a&gt; - MasterPassword client for SailfishOS.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://hosted.weblate.org/projects/harbour-sailhn/translations/&quot;&gt;Harbour SailHN&lt;/a&gt; - An unofficial Hacker News client for Sailfish OS.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://hosted.weblate.org/projects/harbour-papocchio/translations/&quot;&gt;Harbour Papocchio&lt;/a&gt; - A free-hand draw application for Sailfish OS.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://hosted.weblate.org/projects/harbour-base64/translations/&quot;&gt;Harbour Base64&lt;/a&gt; - A Base64 encoder/decoder for Sailfish OS.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://hosted.weblate.org/projects/harbour-hostisdown/translations/&quot;&gt;Harbour HostIsDown&lt;/a&gt; - A Salfish OS application to check if the desired host is up or not.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://hosted.weblate.org/projects/coala/&quot;&gt;Coala&lt;/a&gt; - linting and fixing code for all languages&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://hosted.weblate.org/projects/gnumdk/lollypop/&quot;&gt;Lollypop&lt;/a&gt; - GNOME music playing application.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://hosted.weblate.org/projects/nm-tray/translations/&quot;&gt;nm-tray&lt;/a&gt; - NetworkManager tray icon &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There are also some notable additions to existing projects:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://hosted.weblate.org/projects/ayatana-indicators/system-tray-applet/&quot;&gt;Ayatana Indicators System Tray Applet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://hosted.weblate.org/projects/ayatana-indicators/notifications-applet/&quot;&gt;Ayatana Indicators Notifications Applet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://hosted.weblate.org/projects/turris/foris-netmetr-plugin/&quot;&gt;Foris: Netmetr plugin&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you want to support this effort, please &lt;a href=&quot;https://weblate.org/donate/&quot;&gt;donate to Weblate&lt;/a&gt;, especially recurring donations are welcome to make this service alive. You can do that easily on &lt;a href=&quot;https://liberapay.com/Weblate/&quot;&gt;Liberapay&lt;/a&gt; or &lt;a href=&quot;https://salt.bountysource.com/teams/weblate&quot;&gt;Bountysource&lt;/a&gt;.&lt;/p&gt;

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

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

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

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

&lt;a href=&quot;https://blog.cihar.com/archives/weblate/&quot;&gt;Weblate&lt;/a&gt;

&lt;/p&gt; </description> 
	<pubDate>Fri, 22 Dec 2017 11:00:20 +0000</pubDate>

</item> 
<item>
	<title>Vincent Fourmond: Run QSoas complely non-interactively</title>
	<guid>tag:blogger.com,1999:blog-3019054489127059271.post-2479845262342102750</guid>
	<link>http://vince-debian.blogspot.com/2017/05/run-qsoas-complely-non-interactively.html</link>
     <description>  &lt;a href=&quot;http://qsoas.org&quot;&gt;QSoas&lt;/a&gt; can run scripts, and, since version 2.0, it can be run completely without user interaction from the command-line (though an interface may be briefly displayed). This possibility relies on the following &lt;a href=&quot;http://bip.cnrs-mrs.fr/bip06/qsoas/manual.html#command-line-options&quot;&gt;command-line options&lt;/a&gt;:&lt;p&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;--run&lt;/code&gt;, which runs the command given on the command-line;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--exit-after-running&lt;/code&gt;, which closes automatically QSoas after all the commands specified by &lt;code&gt;--run&lt;/code&gt; were run;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--stdout&lt;/code&gt; (since version 2.1), which redirects QSoas&#39;s terminal directly to the shell output.&lt;/li&gt;
&lt;/ul&gt;If you create a &lt;code&gt;script.cmds&lt;/code&gt; file containing the following commands:&lt;br /&gt;
&lt;pre&gt;generate-buffer -10 10 sin(x)
save sin.dat
&lt;/pre&gt;and run the following command from your favorite command-line interpreter:&lt;br /&gt;
&lt;pre&gt;~ QSoas --stdout --run &#39;@ script.cmds&#39; --exit-after-running
&lt;/pre&gt;This will create a &lt;code&gt;sin.dat&lt;/code&gt; file containing a sinusoid. However, if you run it twice, a &lt;q&gt;Overwrite file &#39;sin.dat&#39; ?&lt;/q&gt; dialog box will pop up. You can prevent that by adding the &lt;code&gt;/overwrite=true&lt;/code&gt; option to &lt;code&gt;save&lt;/code&gt;. As a general rule, you should avoid all commands that may ask questions in the scripts; a &lt;code&gt;/overwrite=true&lt;/code&gt; option is also available for &lt;code&gt;save-buffers&lt;/code&gt; for instance.&lt;p&gt;&lt;/p&gt;&lt;p&gt;I use this possibility massively because I don&#39;t like to store &lt;q&gt;processed&lt;/q&gt; files, I prefer to store the original data files and run a script to generate the &lt;q&gt;processed&lt;/q&gt; data when I want to plot or to further process them. It can also be used to generate fitted data from saved parameters files. I use this to run automatic tests on Linux, Windows and Mac for every single build, in order to quickly spot platform-specific regressions.&lt;/p&gt;&lt;p&gt;To help you make use of this possibility, here is a shell function (Linux/Mac users only, add to your &lt;code&gt;$HOME/.bashrc&lt;/code&gt; file or equivalent, and restart a terminal) to run directly on QSoas command files:&lt;br /&gt;
&lt;/p&gt;&lt;pre&gt;qs-run () {
        QSoas --stdout --run &quot;@ $1&quot; --exit-after-running
}
&lt;/pre&gt;To run the &lt;code&gt;script.cmds&lt;/code&gt; script above, just run&lt;br /&gt;
&lt;pre&gt;~ qs-run script.cmds
&lt;/pre&gt;&lt;br /&gt;
&lt;h4&gt;About QSoas&lt;/h4&gt;&lt;a href=&quot;http://qsoas.org&quot;&gt;QSoas&lt;/a&gt; is a powerful open source data analysis program that focuses on flexibility and powerful fitting capacities. It is described in &lt;a href=&quot;http://pubs.acs.org/doi/abs/10.1021/acs.analchem.6b00224&quot;&gt;Fourmond, Anal. Chem., 2016, 88 (10), pp 5050–5052&lt;/a&gt;. Current version is &lt;strong&gt;2.1&lt;/strong&gt; </description> 
	<pubDate>Thu, 21 Dec 2017 13:51:52 +0000</pubDate>
  <author>noreply@blogger.com (Vincent Fourmond)</author>  
</item> 
<item>
	<title>Sandro Knauß: Kontact on Debian</title>
	<guid>https://exote.ch/blogs/sandro/tag/debian/rss/e17e5685-ebd3-4512-b562-757508de487b</guid>
	<link>https://exote.ch/blogs/sandro/kontact-on-debian/</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/hefee.png&quot; width=&quot;80&quot; height=&quot;72&quot; alt=&quot;&quot; align=&quot;right&quot; style=&quot;float: right;&quot;&gt;  &lt;p&gt;When coding at Kontact you normally don&#39;t have to care a lot about dependencies in between the different KDE Pim packages, because there are great tools available already. &lt;a href=&quot;https://kdesrc-build.kde.org/&quot;&gt;kdesrc-build&lt;/a&gt; finds a solution to build all KDE Pim packages in the correct order. The &lt;a href=&quot;https://community.kde.org/KDE_PIM/Docker&quot;&gt;Kde Pim docker image&lt;/a&gt; gives you an environment with all dependencies preinstalled, so you can start hacking on KDE Pim directly.&lt;/p&gt;

&lt;p&gt;While hacking on &lt;code&gt;master&lt;/code&gt; is nice, most users are not using &lt;code&gt;master&lt;/code&gt; on their computers in daily life. To reach the users, distributions need to compile and ship KDE Pim. I am active within Debian and would like to make the newest version of KDE Pim available to Debian users. Because &lt;a href=&quot;https://wiki.qt.io/New_Features_in_Qt_5.5#Deprecated_Functionality&quot;&gt;Qt deprecated Qt Webkit within Qt 5.5&lt;/a&gt; KDE Pim had to switch  from &lt;a href=&quot;https://wiki.qt.io/Qt_WebKit&quot;&gt;Qt Webkit&lt;/a&gt; to &lt;a href=&quot;https://wiki.qt.io/QtWebEngine&quot;&gt;Qt WebEngine&lt;/a&gt;. Unfortunately Qt WebEngine wasn&#39;t available in Debian, so I had to package Qt WebEngine for Debian before packaging KDE Pim for Debian. Qt WebEngine itself is a beast to package. It was only possible to package Qt WebEngine for the last stable release named &quot;Stretch&quot; in time with the help of others of the Debian Qt/KDE mainatiners especially Scarlett Clark, Dmitry Shachnev and Simon Quigley, and we could only upload it some hours before the deep freeze. So if you have asked yourself why Debian doesn&#39;t ship 16.08 within their last stable release, this is the answer. The missing dependency for KDE Pim named Qt WebEngine. &lt;br /&gt;
There is a second consequence of the switch: Kontact will only be available for those architectures that are supported by Qt WebEngine. Of &lt;a href=&quot;https://buildd.debian.org/status/package.php?p=kdepim&quot;&gt;19 supported architectures for 16.04&lt;/a&gt;, we can only support &lt;a href=&quot;https://buildd.debian.org/status/package.php?p=qtwebengine-opensource-src&quot;&gt;five architectures&lt;/a&gt; in future.&lt;/p&gt;

&lt;p&gt;Now after Debian has woken up again from its slumber, we first had to update Qt and KDE Frameworks. After the first attempt at packaging KDE Pim 17.08.0, that was released for experimental, we are now finally reaching the point where we can package and deliver KDE Pim 17.08.3 to Debian unstable. Because Pino Toscano and I had time we started packaging it and stumbled across the issue of having to package 58 source packages, all dependent on each other. Keep in mind all packaging work is not a oneman or twoman show, mostly all in the Qt/KDE Debian mantainers are involved somehow. Either by putting their name under a upload or by being available via IRC, mail and answering questions, making jokes or doing what so ever. &lt;a href=&quot;http://jriddell.org/2016/08/05/kontact-build-dependencies/&quot;&gt;Jonathan Riddell visualized the dependencies for KDE Pim 16.08 with graphviz&lt;/a&gt;. But KDE Pim is a fast moving target, and I wanted to make my own graphs and make them more useful for packaging.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Full dependency graph for KDE Pim 17.08&quot; src=&quot;https://exote.ch/blogs/sandro/content/images/2017/12/fullgraph.svg&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The dependencies you see on this graph are created out of the Build dependencies within Debian for KDE Pim 17.08. I stripped out every dependency that isn&#39;t part of KDE Pim. In contrast to Jonathan, I made the arrows from dependency to package. So the starting point of the arrow is the dependency and it is pointing to the packages that can be built from it. The green colour shows you packages that have no dependency inside KDE Pim. The blue indicates packages with nothing depending on them. But to be honest, neither Jonathan&#39;s nor my graph tells me any more than they do you. They are simply too convoluted. The only thing these graphs make apparent is that packaging KDE Pim is a very complex task :D&lt;/p&gt;

&lt;p&gt;But fortunately we can simplify the graphs. For packaging, I&#39;m not interested in &quot;every&quot; dependency, but only in &quot;new&quot; ones. That means, if a &lt;code&gt;&amp;lt;package&amp;gt;&lt;/code&gt; depends on &lt;code&gt;a&lt;/code&gt;,&lt;code&gt;b&lt;/code&gt; and &lt;code&gt;c&lt;/code&gt;, and &lt;code&gt;b&lt;/code&gt; depends on &lt;code&gt;a&lt;/code&gt;, than I know: Okay, I need to package &lt;code&gt;b&lt;/code&gt; and &lt;code&gt;c&lt;/code&gt; before &lt;code&gt;&amp;lt;package&amp;gt;&lt;/code&gt; and &lt;code&gt;a&lt;/code&gt; before &lt;code&gt;b&lt;/code&gt;. I would call &lt;code&gt;a&lt;/code&gt; an implicit dependency of &lt;code&gt;&amp;lt;package&amp;gt;&lt;/code&gt;. Here again in a dot style syntax:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;a -&amp;gt; &amp;lt;package&amp;gt;
b -&amp;gt; &amp;lt;package&amp;gt;
c -&amp;gt; &amp;lt;package&amp;gt;
a -&amp;gt; b
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;can be simplified to:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;b -&amp;gt; &amp;lt;package&amp;gt;
c -&amp;gt; &amp;lt;package&amp;gt;
a -&amp;gt; b
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;With this quite simple rule to strip all implicit dependencies out of the graph we end up with a more useful one:&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Simplified dependency graph for KDE Pim 17.08&quot; src=&quot;https://pkg-kde.alioth.debian.org/images/pim-build-deps-17.08.png&quot; /&gt;&lt;/p&gt;

&lt;p&gt;(You can find the dot file and the code to create such a graph at &lt;a href=&quot;https://pkg-kde.alioth.debian.org/applications-17.08-build-deps.html&quot;&gt;pkg-kde.alioth.debian.org&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;At least this is a lot easier to consume and create a package ordering from. But still it looks scary. So I came up with the idea to define tiers, influenced by the tier model in KDE Frameworks. I defined one tier as the maximum set of packages that are independent from each other and only depend on lower tiers:&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Build tiers for KDE Pim 17.08&quot; src=&quot;https://pkg-kde.alioth.debian.org/images/pim-build-tier-17.08.png&quot; /&gt;
(The dot file and the code to create such a graph you can find at &lt;a href=&quot;https://pkg-kde.alioth.debian.org/applications-17.08-build-deps.html&quot;&gt;pkg-kde.alioth.debian.org&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Additionally I only show the dependencies, from the last tier to the current one. So a dependency from &lt;code&gt;tier 0 -&amp;gt; tier 1&lt;/code&gt; but not from &lt;code&gt;tier 0 -&amp;gt; tier 2&lt;/code&gt;. That&#39;s why it looks like nothing depends on &lt;code&gt;kdav&lt;/code&gt; or &lt;code&gt;ktnef&lt;/code&gt;. But the ellipse shape tells you, that in higher tiers something depends on them. The lightblue diamond shaped ones in contrast indicating, nothing depending on them anymore.  So here you can see the &quot;hotpath&quot; for dependencies. This shows that the bottleneck is &lt;code&gt;libkdepim-&amp;gt;pimcommon&lt;/code&gt;. Interestingly this is also, more or less, the border between the former split of kdepimlibs and kdepim during KDE SC 4 times. &lt;br /&gt;
I think this is a useful visualization of the dependencies and may be a starting point to define a goal, what the dependencies should look like. &lt;/p&gt;

&lt;p&gt;You also may ask yourself why an application needs so much more tiers than complete KDE Frameworks? Well, the third tier of KDE Frameworks is more of a collection for leftovers that don&#39;t reach tier 1 or tier 2. See the definition of tier 3 is: &lt;a href=&quot;https://community.kde.org/Frameworks/Policies&quot;&gt;&quot;Tier 3 Frameworks can depend only on other Tier 3 Frameworks, Tier 2 Frameworks, Tier 1 Frameworks, Qt official frameworks, or other system libraries.&quot;&lt;/a&gt;. The relevant part is that a framework tier 3 can depend on other tier 3 frameworks. If you use my tier definition in contrast, then you end up with more than ten tiers for KDE Frameworks, too.&lt;/p&gt;

&lt;p&gt;After building all of these nice graphs for Debian, I wanted to see if I could create such graphs for KDE Pim directly. As KDE is mostly using the &lt;a href=&quot;https://cgit.kde.org/kde-build-metadata.git/&quot;&gt;kde-build-metadata.git&lt;/a&gt; for documenting dependencies I updated my scripts to create graphs from this data directly:&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;Simplified dependency graph for for KDE Pim 17.12&quot; src=&quot;https://exote.ch/blogs/sandro/content/images/2017/12/kde-build-metadata-17-12-deps.svg&quot; /&gt;
&lt;img alt=&quot;Build tiers for KDE Pim 17.12&quot; src=&quot;https://exote.ch/blogs/sandro/content/images/2017/12/kde-build-metadata-17-12-tier.svg&quot; /&gt;&lt;/p&gt;

&lt;p&gt;(the code to build the graphs yourselves is available here: &lt;a href=&quot;https://cgit.kde.org/kde-dev-scripts.git/tree/pim-build-deps-graphs.py&quot;&gt;kde-dev-scripts.git/pim-build-deps-graphs.py&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;In detail this graph looks different and not just because of the version difference (17.08 vs. &lt;code&gt;master&lt;/code&gt;). I think we need to update the dependencies data. This also may explain why sometimes kdesrc-build don&#39;t manage it to compile complete KDE Pim in the first run.&lt;/p&gt; </description> 
	<pubDate>Thu, 21 Dec 2017 12:39:16 +0000</pubDate>

</item> 
<item>
	<title>Bastian Blank: Google Cloud backed Debian mirror</title>
	<guid>tag:bblank.thinkmo.de,2017-12-21:/google-cloud-backed-debian-mirror.html</guid>
	<link>https://bblank.thinkmo.de/google-cloud-backed-debian-mirror.html</link>
     <description>  &lt;p&gt;It&#39;s been some time that someone at Google told us that they had problems providing a stable mirror of Debian for use by their cloud platform.
I wanted to give it a try and see what the platform can give us.
At this time I was already responsible for the Debian mirror network inside Microsoft Azure.&lt;/p&gt;
&lt;p&gt;So I started to generalize a setup of Debian mirrors in cloud environments.
I applied the setup to both Google Cloud Engine and Amazon EC2.
The setup on the Google Cloud works pretty fine.
I scraped the EC2 setup for now, as it can neither provide the throughput, nor the inter-region connectivity to at a level that can compete with Google.&lt;/p&gt;
&lt;p&gt;So I&#39;d like to proudly present a test setup of a Google Cloud backed Debian mirror.
It provides access to the &lt;a href=&quot;http://debian.gce-test.mirrors.debian.org/debian/&quot;&gt;main&lt;/a&gt; and &lt;a href=&quot;http://security.gce-test.mirrors.debian.org/debian-security/&quot;&gt;security&lt;/a&gt; archive.
I would be glad to see a bit more traffic on it.
I&#39;d like to asses if there are problems, both with synchronicity and reacheability.&lt;/p&gt;
&lt;p&gt;They can be used by adding one of the following to your &lt;code&gt;sources.list&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;deb&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;http://debian.gce-test.mirrors.debian.org/debian&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;stretch&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;main&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;contrib&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;non-free&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;deb&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;http://debian.gce-test.mirrors.debian.org/debian&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;buster&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;main&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;contrib&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;non-free&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;deb&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;http://debian.gce-test.mirrors.debian.org/debian&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;sid&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;main&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;contrib&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;non-free&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;deb&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;http://debian.gce-test.mirrors.debian.org/debian&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;experimental&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;main&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;contrib&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;non-free&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;If you do and see problems, please report them back to me at &lt;a href=&quot;mailto:waldi@debian.org&quot;&gt;waldi@debian.org&lt;/a&gt;.
Also please note that Google stores load balancer logs for seven days, including the client IP.&lt;/p&gt; </description> 
	<pubDate>Thu, 21 Dec 2017 08:45:00 +0000</pubDate>

</item> 
<item>
	<title>Martin Pitt: Migration from PhantomJS to Chrome DevTools Protocol</title>
	<guid>https://piware.de/post/2017-12-21-phantomjs-to-chromium/</guid>
	<link>https://piware.de/post/2017-12-21-phantomjs-to-chromium/</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;Being a web interface, &lt;a href=&quot;http://cockpit-project.org/&quot;&gt;Cockpit&lt;/a&gt; has a comprehensive
&lt;a href=&quot;https://github.com/cockpit-project/cockpit/tree/master/test/verify&quot;&gt;integration test suite&lt;/a&gt;
which exercises all of its functionality on a real web browser that is driven by the tests.
Until recently we used &lt;a href=&quot;http://phantomjs.org/&quot;&gt;PhantomJS&lt;/a&gt; for this, but there was an ever-increasing pressure to replace
it.&lt;/p&gt;

&lt;h2 id=&quot;why-replace-phantomjs&quot;&gt;Why replace PhantomJS?&lt;/h2&gt;

&lt;p&gt;Phantom’s engine is becoming really outdated: it cannot understand even simple ES6 constructs like &lt;code&gt;Set&lt;/code&gt;, arrow
functions, or promises, which have been in real browsers for many years; this currently blocks hauling in some new code
from the welder project. It also doesn’t understand reasonably modern CSS which particularly is important for making
mobile-friendly pages, so that we had to put in workarounds for crashes and other misbehaviour into our code.  Also,
development got officially declared as &lt;a href=&quot;https://groups.google.com/forum/#!topic/phantomjs/9aI5d-LDuNE&quot;&gt;abandoned&lt;/a&gt; last
April.&lt;/p&gt;

&lt;p&gt;So about two months ago I started some research for possible replacements. Fortunately, Cockpit’s tests are not directly
written in JavaScript using the PhantomJS API, but they use an abstract
&lt;a href=&quot;https://github.com/cockpit-project/cockpit/blob/master/test/common/testlib.py#L86&quot;&gt;Browser Python class&lt;/a&gt; with methods
like &lt;code&gt;open(url)&lt;/code&gt;, &lt;code&gt;wait_visible(selector)&lt;/code&gt;, and &lt;code&gt;click(selector)&lt;/code&gt;. So I “only” needed to reimplement that Browser class,
and didn’t have to rewrite the entire test suite.&lt;/p&gt;

&lt;h2 id=&quot;candidates&quot;&gt;Candidates&lt;/h2&gt;

&lt;p&gt;The contenders in the ring which are currently popular and most likely supported for a fair while, with their pros and
cons:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://electron.atom.io&quot;&gt;Electron&lt;/a&gt;. This is the rendering engine of Chromium plus
the JS engine from nodejs. It is widely adopted and used, and relatively
compact (much smaller than Chromium itself).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;pro&lt;/em&gt;: It has a built in REPL to use it interactively (&lt;code&gt;node_modules/.bin/electron -i&lt;/code&gt;) and this API is relatively
simple and straightforward to use, if your test is built around an external process. This is the case for our Python tests.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;pro&lt;/em&gt;: If your tests are in JS, there is &lt;a href=&quot;https://github.com/segmentio/nightmare&quot;&gt;Nightmare&lt;/a&gt; as API for electron.
This is a &lt;em&gt;really&lt;/em&gt; nice one, and super-easy to get started; &lt;code&gt;npm install nightmare&lt;/code&gt;, write your first test in 5
lines of JS, done.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;pro&lt;/em&gt;: Has nice features such as verbose debug logging to watch every change, signal, and action that’s going on.
You can also enable the graphical window where you see your test actions fly by, you can click around, and use the
builtin inspector/debugger/console.&lt;/li&gt;
&lt;li&gt;It lags behind the latest Chromium a bit. E. g. latest chromium-browser in Fedora 27 is v62, latest Electron is
based on 58. (But this might be a good or bad thing depending on your project - sometimes you actually don’t want to
require the very latest browser)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;con&lt;/em&gt;: Not currently packaged in Fedora or Debian, so you need to install it through npm (~ 130 MB uncompressed).
I. e. almost twice as big as PhantomJS, although the difference in the compressed download is much smaller.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;con&lt;/em&gt;: It does not represent a “real-life” browser as it uses a custom JS engine. While this should not make much of
a difference in theory, there’s always little quirks and bugs to be aware of.
&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Use a real browser (Chromium, Firefox, Edge) with &lt;a href=&quot;http://www.seleniumhq.org&quot;&gt;Selenium&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;pro&lt;/em&gt;: Gives very realistic results&lt;/li&gt;
&lt;li&gt;&lt;em&gt;pro&lt;/em&gt;: Long-established standard, so most likely will continue to stay around for a while&lt;/li&gt;
&lt;li&gt;&lt;em&gt;con&lt;/em&gt;: Much harder to set up than the other two&lt;/li&gt;
&lt;li&gt;&lt;em&gt;con&lt;/em&gt;: API is low-level, so you need to have some helper API to write tests in a sensible manner.
&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Use Chromium itself with the &lt;a href=&quot;https://chromedevtools.github.io/devtools-protocol/&quot;&gt;DevTools Protocol&lt;/a&gt;, possibly in
the stripped down &lt;a href=&quot;https://chromium.googlesource.com/chromium/src/+/lkgr/headless/README.md&quot;&gt;headless variant&lt;/a&gt;.
You have to use a library on top of that:
&lt;a href=&quot;https://github.com/cyrus-and/chrome-remote-interface&quot;&gt;chrome-remote-interface&lt;/a&gt; seems to be the standard one, but
it’s tiny and straightforward.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;pro&lt;/em&gt;: This is becoming an established standard which other browsers start to support as well (e. g. Edge)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;pro&lt;/em&gt; By nature, gives very realistic test results, and you can choose which Chrome version to test against.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;pro&lt;/em&gt;: Chromium is packaged in all distros, so this doesn’t require a big npm download for running the tests.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;con&lt;/em&gt;: Relatively hard to set up compared to electron or phantom: you manually need to control the actual chromium
process plus your own chrome-remote-interface controller process, and allocate port numbers in a race-free manner
(to run tests in parallel).&lt;/li&gt;
&lt;li&gt;&lt;em&gt;con&lt;/em&gt;: Relatively low-level protocol (roughly comparable to Selenium), so this is not directly appropriate for
writing tests - you need to create your own high-level library on top of this. (But in Cockpit we already have
that)
&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/GoogleChrome/puppeteer&quot;&gt;puppeteer&lt;/a&gt; is a high-level JS library on top of the Chromium DevTools
 Protocol.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;pro&lt;/em&gt;: Comfortable and abstract API, comparable to Nightmare.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;pro&lt;/em&gt;: It does the job of launching and controlling Chromium, so similarly simple to set up as Nightmare or Phantom.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;con&lt;/em&gt;: Does not work with the already installed/packaged Chromium, it bundles its own.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After evaluating all these, my conclusion is that for a &lt;em&gt;new&lt;/em&gt; project I can recommend puppeteer. If you can live with
pulling in the browser through NPM for every test run (CI services like &lt;a href=&quot;https://semaphoreci.com/&quot;&gt;Semaphore&lt;/a&gt; cache your
&lt;code&gt;node_modules&lt;/code&gt; directory, so it might not be a big issue) and are fine with writing your tests in JavaScript, then
puppeteer provides the easiest setup and a comfortable and abstract API.&lt;/p&gt;

&lt;p&gt;For our existing Cockpit project however, I eventually went with option 3, i. e. Chrome DevTools protocol directly.
puppeteer’s own abstraction does not actually help our tests as we already have the &lt;code&gt;Browser&lt;/code&gt; class abstraction, and for
our CI system and convenience of local test running it actually does make a difference whether you can use the already
installed/packaged Chrome or have to download an entire copy. I also suspect that my troubles with SSL certificates (see
below) would be much harder or even impossible to solve/workaround with puppeteer.&lt;/p&gt;

&lt;h2 id=&quot;interacting-with-chromium&quot;&gt;Interacting with Chromium&lt;/h2&gt;

&lt;p&gt;The &lt;a href=&quot;https://chromedevtools.github.io/devtools-protocol/1-2/&quot;&gt;API documentation &lt;/a&gt; is excellent, and one can tinker
around in the REPL interpreter in simple and straightforward way and watch the result in an interactive Chromium that
runs with a temporary &lt;code&gt;$HOME&lt;/code&gt; (to avoid interfering with your real config):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ rm -rf /tmp/h; HOME=/tmp/h chromium-browser --remote-debugging-port=9222 about:blank &amp;amp;
$ mkdir /tmp/test; cd /tmp/test
$ npm install chrome-remote-interface
$ node_modules/.bin/chrome-remote-interface inspect
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;In the &lt;code&gt;chrome-remote-interface&lt;/code&gt; shell one can directly use the CDP commands, for example: Open Google’s search page, focus
the search input line, type a query, and check the current URL afterwards:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; Page.navigate({url: &quot;https://www.google.de&quot;})
{ frameId: &#39;4521.1&#39; }
&amp;gt;&amp;gt;&amp;gt; Runtime.evaluate({expression: &quot;document.querySelector(&#39;input[name=\&quot;q\&quot;]&#39;).focus()&quot;})

&amp;gt;&amp;gt;&amp;gt; // type in the search term and Enter key by key
&amp;gt;&amp;gt;&amp;gt; &quot;cockpit\r&quot;.split(&#39;&#39;).map(c =&amp;gt; Input.dispatchKeyEvent({type: &quot;char&quot;, text: c}))

&amp;gt;&amp;gt;&amp;gt; Runtime.evaluate({expression: &quot;window.location.toString()&quot;})
{ result:
   { type: &#39;string&#39;,
     value: &#39;https://www.google.de/search?source=hp&amp;amp;ei=T5...&amp;amp;q=cockpit&amp;amp;oq=cockpit&amp;amp;gs_l=[...]&#39; } }
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&quot;the-porting-process&quot;&gt;The porting process&lt;/h2&gt;

&lt;p&gt;After getting an initial idea and feeling how the DevTools protocol works, the actual porting process went in a pretty
typical &lt;a href=&quot;https://en.wikipedia.org/wiki/Pareto_principle&quot;&gt;Pareto way&lt;/a&gt;. After two days I had around 150 out of our ~ 180
tests working, and porting most of the API from PhantomJS to CDP invocations was straightforward. A lot of the remaining test
failures were due to “ordinary” flakes and bugs in the tests themselves, and a
&lt;a href=&quot;https://github.com/cockpit-project/cockpit/pull/8051&quot;&gt;series&lt;/a&gt;
&lt;a href=&quot;https://github.com/cockpit-project/cockpit/pull/8166&quot;&gt;of&lt;/a&gt; &lt;a href=&quot;https://github.com/cockpit-project/cockpit/pull/8182&quot;&gt;four&lt;/a&gt;
&lt;a href=&quot;https://github.com/cockpit-project/cockpit/pull/8227&quot;&gt;PRs&lt;/a&gt; fixed them.&lt;/p&gt;

&lt;p&gt;There were three major issues on which I spent the “other 90%” of the time on this though - perhaps this blog post and
my upstream bug reports help other people to avoid the same traps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Frame handling&lt;/strong&gt;: Cockpit is built around the concept of iframes, with each frame representing an
“application” on your “server Linux session”. To make an assertion or run a query in an iframe, you need to “drill
through” into the desired iframe from the root page DOM. I started with a naïve JavaScript-only solution:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;if (current_frame)
  frame_doc = document.querySelector(`iframe[name=&quot;${current_frame}&quot;]`).contentDocument.documentElement;
else
  frame_doc = document;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;and then do queries on &lt;code&gt;frame_doc&lt;/code&gt;. This actually works well for all but one of our tests which checks embedding a Cockpit page into a custom HTML page. Then this approach (rightfully) fails due to browser’s &lt;a href=&quot;https://en.wikipedia.org/wiki/Same-origin_policy&quot;&gt;Same-origin Policy&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;So I went ahead and implemented a solution using the DevTools “mirror” DOM and API. It took me three different
attemps to get that right, and in that regard the API documentation nor a Google search were particularly
instructive. This is an area where the protocol really could be improved. I posted my solution and a few
suggestions to &lt;a href=&quot;https://github.com/ChromeDevTools/devtools-protocol/issues/72&quot;&gt;devtools-protocol issue #72&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;SSL client certs&lt;/strong&gt;: Our OpenShift tests kept failing when the OAuth page came up, but only when using Headless
mode. I initially thought this was due to the OAuth server having an invalid SSL certificate, as the initial error
message suggests something like that. But all approaches with &lt;code&gt;--ignore-certificate-errors&lt;/code&gt; or a more elaborate
usage of the &lt;a href=&quot;https://chromedevtools.github.io/devtools-protocol/1-3/Security/&quot;&gt;Security&lt;/a&gt; API or even actually
installing the OAuth server’s certificate didn’t work - quite frustrating.&lt;/p&gt;

&lt;p&gt;It finally helped to enable a &lt;a href=&quot;https://chromedevtools.github.io/devtools-protocol/1-3/Log/&quot;&gt;third kind of logs&lt;/a&gt;
(besides console messages and &lt;code&gt;--enable-logging --v=1&lt;/code&gt;) which finally revealed what it was complaining about: OAuth
was sending a request for presenting a client-side SSL certificate, and this just causes Chromium Headless to
&lt;a href=&quot;https://bugs.chromium.org/p/chromium/issues/detail?id=757181&quot;&gt;throw its hands into the air&lt;/a&gt;.  As
there is no workaround with Chromium Headless, I had to bite the bullet and install the full graphical Chromium
(plus half a metric ton of X/mesa dependencies) and Xvfb into our test containers, plus write the logic to bring
these up and down in an orderly and parallel fashion.&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;Silently broken pushState API&lt;/strong&gt;: One of our tests was reproducibly failing on the infrastructure, and only
sometimes locally; the screenshot shows that it clearly was on the wrong page, although the previous navigation
requests caused no error. Single-stepping through them also worked. Peter and I have spent about three days
debugging this and figuring out why adding a simple &lt;code&gt;sleep(3)&lt;/code&gt; at a random place in the test made the test to
succeed.&lt;/p&gt;

&lt;p&gt;It turned out that a few months ago the &lt;code&gt;window.history.pushState()&lt;/code&gt; method changed behaviour: When there are too
many calls to it (&amp;gt; 50 in 10 seconds) it ignores the function call, &lt;em&gt;without returning or logging an error&lt;/em&gt;.
This was by far the most frustrating and biggest time-sink, but after finally discovering it, we had a good
justification why a static &lt;code&gt;sleep()&lt;/code&gt; is actually warranted in this case. (Related upstream bug reports:
&lt;a href=&quot;https://bugs.chromium.org/p/chromium/issues/detail?id=794923&quot;&gt;#794923&lt;/a&gt; and
&lt;a href=&quot;https://bugs.chromium.org/p/chromium/issues/detail?id=769592&quot;&gt;#769592&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After figuring all that out, the final &lt;a href=&quot;https://github.com/cockpit-project/cockpit/pull/8069/files&quot;&gt;patch&lt;/a&gt; turned out to
be reasonably small and readable. Most of the commits are minor test adjustments which weren’t possible to implement
exactly as before in the API. Of course this got preceded with half a dozen preparatory commits, to adjust dependencies
in containers, fix test races, and the like.&lt;/p&gt;

&lt;p&gt;Now that this is landed, we could
&lt;a href=&quot;https://github.com/cockpit-project/cockpit/pull/8275&quot;&gt;clean up a bunch of PhantomJS related hacks&lt;/a&gt;, it is now possile
to write tests for the mobile navigation, and we can now also test ES6 code (such as
&lt;a href=&quot;https://github.com/weldr/welder-web&quot;&gt;welder-web&lt;/a&gt;). Debugging tests is much more fun now as you can run them on an
interactive graphical browser, to see widgets and pages flying around and interactively mess around or inspect them.&lt;/p&gt; </description> 
	<pubDate>Thu, 21 Dec 2017 08:26:37 +0000</pubDate>

</item> 
<item>
	<title>Russell Coker: Designing Shared Cars</title>
	<guid>https://etbe.coker.com.au/?p=4442</guid>
	<link>https://etbe.coker.com.au/2017/12/20/designing-shared-cars/</link>
     <description>  &lt;p&gt;Almost 10 years ago I blogged about &lt;a href=&quot;https://etbe.coker.com.au/2008/04/13/car-sharing-in-melbourne/&quot;&gt;car sharing companies in Melbourne [1]&lt;/a&gt;. Since that time the use of such services appears to have slowly grown (judging by the slow growth in the reserved parking spots for such cars). This isn’t the sudden growth that public transport advocates and the operators of those companies hoped for, but it is still positive. I have just watched the documentary &lt;a href=&quot;http://www.imdb.com/title/tt2414454/&quot;&gt;The Human Scale [2]&lt;/a&gt; (which I highly recommend) about the way that cities are designed for cars rather than for people.&lt;/p&gt;
&lt;p&gt;I think that it is necessary to make cities more suited to the needs of people and that car share and car hire companies are an important part of converting from a car based city to a human based city. As this sort of change happens the share cars will be an increasing portion of the new car sales and car companies will have to design cars to better suit shared use.&lt;/p&gt;
&lt;h3&gt;Personalising Cars&lt;/h3&gt;
&lt;p&gt;Luxury car brands like Mercedes support storing the preferred seat position for each driver, once the basic step of maintaining separate driver profiles is done it’s an easy second step to have them accessed over the Internet and also store settings like preferred radio stations, Bluetooth connection profiles, etc. For a car share company it wouldn’t be particularly difficult to extrapolate settings based on previous use, EG knowing that I’m tall and using the default settings for a tall person every time I get in a shared car that I haven’t driven before. Having Bluetooth connections follow the user would mean having one slave address per customer instead of the current practice of one per car, the addressing is 48bit so this shouldn’t be a problem.&lt;/p&gt;
&lt;p&gt;Most people accumulate many items in their car, some they don’t need, but many are needed. Some of the things in my car are change for parking meters, sunscreen, tools, and tissues. Car share companies have deals with councils for reserved parking spaces so it wouldn’t be difficult for them to have a deal for paying for parking and billing the driver thus removing the need for change (and the risk of a car window being smashed by some desperate person who wants to steal a few dollars). Sunscreen is a common enough item in Australia that a car share company might just provide it as a perk of using a shared car.&lt;/p&gt;
&lt;p&gt;Most people have items like tools, a water bottle, and spare clothes that can’t be shared which tend to end up distributed in various storage locations. The solution to this might be to have a fixed size storage area, maybe based on some common storage item like a milk crate. Then everyone who is a frequent user of shared cars could buy a container designed to fit that space which is divided in a similar manner to a Bento box to contain whatever they need to carry.&lt;/p&gt;
&lt;p&gt;There is a lot of research into having computers observing the operation of a car and warning the driver or even automatically applying the brakes to avoid a crash. For shared cars this is more important as drivers won’t necessarily have a feel for the car and can’t be expected to drive as well.&lt;/p&gt;
&lt;h3&gt;Car Sizes&lt;/h3&gt;
&lt;p&gt;Generally cars are designed to have 2 people (sports car, Smart car, van/ute/light-truck), 4/5 people (most cars), or 6-8 people (people movers). These configurations are based on what most people are able to use all the time. Most car travel involves only one adult. Most journeys appear to have no passengers or only children being driven around by a single adult.&lt;/p&gt;
&lt;p&gt;Cars are designed for what people can drive all the time rather than what would best suit their needs most of the time. Almost no-one is going to buy a personal car that can only take one person even though most people who drive will be on their own for most journeys. Most people will occasionally need to take passengers and that occasional need will outweigh the additional costs in buying and fueling a car with the extra passenger space.&lt;/p&gt;
&lt;p&gt;I expect that when car share companies get a larger market they will have several vehicles in the same location to allow users to choose which to drive. If such a choice is available then I think that many people would sometimes choose a vehicle with no space for passengers but extra space for cargo and/or being smaller and easier to park.&lt;/p&gt;
&lt;p&gt;For the common case of one adult driving small children the front passenger seat can’t be used due to the risk of airbags killing small kids. A car with storage space instead of a front passenger seat would be more useful in that situation.&lt;/p&gt;
&lt;p&gt;Some of these possible design choices can also be after-market modifications. I know someone who removed the rear row of seats from a people-mover to store the equipment for his work. That gave a vehicle with plenty of space for his equipment while also having a row of seats for his kids. If he was using shared vehicles he might have chosen to use either a vehicle well suited to cargo (a small van or ute) or a regular car for transporting his kids. It could be that there’s an untapped demand for ~4 people in a car along with cargo so a car share company could remove the back row of seats from people movers to cater to that.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;[1]&lt;a href=&quot;https://etbe.coker.com.au/2008/04/13/car-sharing-in-melbourne/&quot;&gt; https://etbe.coker.com.au/2008/04/13/car-sharing-in-melbourne/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[2]&lt;a href=&quot;http://www.imdb.com/title/tt2414454/&quot;&gt; http://www.imdb.com/title/tt2414454/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;yarpp-related-rss&quot;&gt;
&lt;p&gt;Related posts:&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://etbe.coker.com.au/2009/11/24/designing-unsafe-cars/&quot; rel=&quot;bookmark&quot; title=&quot;Designing Unsafe Cars&quot;&gt;Designing Unsafe Cars &lt;/a&gt; &lt;small&gt;The LA Times has an interesting article about problems with...&lt;/small&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://etbe.coker.com.au/2007/12/22/a-better-design-for-child-seats/&quot; rel=&quot;bookmark&quot; title=&quot;A Better Design for Child Seats&quot;&gt;A Better Design for Child Seats &lt;/a&gt; &lt;small&gt;The current method of carrying young children (less than 4-6...&lt;/small&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://etbe.coker.com.au/2009/03/18/hyperthermia-children-in-cars/&quot; rel=&quot;bookmark&quot; title=&quot;Hyperthermia and Children in Cars&quot;&gt;Hyperthermia and Children in Cars &lt;/a&gt; &lt;small&gt;Bruce Schneier writes about the risks involving children abandoned in...&lt;/small&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt; </description> 
	<pubDate>Wed, 20 Dec 2017 12:31:15 +0000</pubDate>

</item> 
<item>
	<title>Renata D&#39;Avila: My project with Outreachy</title>
	<guid>tag:rsip22.github.io,2017-12-20:/blog/my-project-with-outreachy.html</guid>
	<link>https://rsip22.github.io/blog/my-project-with-outreachy.html</link>
     <description>  &lt;p&gt;Let&#39;s get to the project I actually applied to:&lt;/p&gt;
&lt;h2&gt;To build a calendar for FOSS events&lt;/h2&gt;
&lt;p&gt;We have a page on Debian wiki where we centralize the information needed to make that a reality, you can find it here: &lt;a href=&quot;https://wiki.debian.org/SocialEventAndConferenceCalendars&quot;&gt;SocialEventAndConferenceCalendars&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;So, in fact, the first thing I did on my internship was:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Search for more sources for FOSS events that hadn&#39;t been mentioned in that page yet&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Update said page with these sources&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add some attributes for events that I believe could be useful for people wanting to attend them, such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Is the registration (and not just the CFP) still open?&lt;/li&gt;
&lt;li&gt;Does the event has a code of conduct?&lt;/li&gt;
&lt;li&gt;What about accessibility?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I understand that some of these informations might not be readily available for most of the events, but maybe the mere act of mentioning them in our aggregation system may be enough to an organizer to think about them, if they aim to have their event mentioned &quot;by us&quot;?&lt;/p&gt;
&lt;p&gt;Both my mentor, Daniel, and I have been looking around to find projects that have worked on a goal similar to this one, to study them and see what can be learned from what has been done already and what can be reused from it. They are mentioned on the wiki page as well. If you know any others, feel free to add there or to let us know!&lt;/p&gt;
&lt;p&gt;Among the proposed deliverables for this project:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;making a plugin for other community web sites to maintain calendars within their existing web site (plugin for Discourse forums, MoinMoin, Drupal, MediaWiki, WordPress, etc) and export it as iCalendar data&lt;/li&gt;
&lt;li&gt;developing tools for parsing iCalendar feeds and storing the data into a large central database&lt;/li&gt;
&lt;li&gt;developing tools for searching the database to help somebody find relevant events or see a list of deadlines for bursary applications&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;My dear mentor Daniel Pocock suggested that I considered working on a plugin for &lt;a href=&quot;https://moinmo.in/MoinMoinWiki&quot;&gt;MoinMoinWiki&lt;/a&gt;, because Debian and FSFE use MoinMoin for their wikis. I have to admit that I thought that was an awesome idea as soon as I read it, but I was a bit afraid that it would be a very steep learning curve to learn how MoinMoin worked and how I could contribute to it. I&#39;m glad Daniel calmed my fears and reminded me that the mentors are on my side and glad to help!&lt;/p&gt;
&lt;p&gt;So, what else have I been doing?&lt;/p&gt;
&lt;p&gt;So far? I would say studying! Studying documentation for MoinMoin, studying code that has already been written by others, studying how to plan and to implement this project.&lt;/p&gt;
&lt;p&gt;And what have I learned so far?&lt;/p&gt;
&lt;h2&gt;What is MoinMoin Wiki?&lt;/h2&gt;
&lt;p&gt;&lt;img alt=&quot;MoinMoin logo, sort of a white &amp;quot;M&amp;quot; inside a circle with light blue background. The corners of the M are rounded and seem connected like nodes&quot; src=&quot;https://rsip22.github.io/blog/img/Moinmoin.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;MoinMoin is a wiki written in... Python (YAY! \o/). Let&#39;s say that I have... interacted with development on a wiki-like system back when I created my first (and now defunct) blog post-Facebook.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Ikiwiki logo, the first &#39;iki&#39; is black and mirrors the second one, with a red &#39;W&#39; in the middle&quot; src=&quot;https://rsip22.github.io/blog/img/ikiwiki.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://ikiwiki.info/&quot;&gt;Ikiwiki&lt;/a&gt; was written in Perl, a language I know close to nothing about it, which limited a lot how I could interact with. I am glad that I will be able to work with a language that I am way more familiarized with. (And, on Prof. Masanori&#39;s words:  &quot;Python is a cool language.&quot;)&lt;/p&gt;
&lt;p&gt;I also learned that MoinMoin&#39;s storage mechanism is based on flat files and folders, rather than a database (I swear that, despite &lt;a href=&quot;https://rsip22.github.io/chosing-a-system-for-the-blog&quot;&gt;my defense for flat file systems&lt;/a&gt;, this is a coincidence. I mean, if you believe in coincidences). I also found out that the development uses &lt;a href=&quot;https://www.mercurial-scm.org/&quot;&gt;Mercurial&lt;/a&gt; for version control. I look forward to learning exploring it, because so far I have only used git.&lt;/p&gt;
&lt;p&gt;The past few days I set up a local MoinMoin instance. Even though there is &lt;a href=&quot;https://moinmo.in/HowTo/Debian8&quot;&gt;a HowTo guide&lt;/a&gt; to get MoinMoinWiki working on Debian, I had a little trouble setting it up using it. Mostly because the guide is sort of confusing with permissions, I think? I mean, it says to create a new user with no login, but then it gives commands that can only be executed by root or sudo. That doesn&#39;t seen very wise. So I went on and found &lt;a href=&quot;https://hub.docker.com/r/olavgg/moinmoin-wiki/&quot;&gt;a docker image for MoinMoin wiki&lt;/a&gt; and was able to work on MoinMoin with it. This image is based on Debian Jessie, so maybe that is something that I might work to improve in the future.&lt;/p&gt;
&lt;p&gt;Only after I got everything working with docker that I found this &lt;a href=&quot;https://master19.moinmo.in/InstallDocs/QuickInstall#qdlinux&quot;&gt;page with instructions for Linux&lt;/a&gt; which was what I should&#39;ve tried in the first place, because I didn&#39;t really needed fully configurated server with nginx and uwsgi, only a local instance to play with. It happens.&lt;/p&gt;
&lt;p&gt;I studied the development guide for MoinMoin and I have also worked to understand the development process (and what Macros, Plugins and such are in this context), so I could figure out where and how to develop!&lt;/p&gt;
&lt;h3&gt;&lt;em&gt;Macros&lt;/em&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;A macro is entered as wiki markup and it processes a few parameters to generate an output, which is displayed in the content area.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Searching for Macros, I found out there is a &lt;a href=&quot;https://moinmo.in/WikiCourse/21%20Macros&quot;&gt;Calendar Macro&lt;/a&gt;. And I have discovered that, besides the Calendar Macro, there is also an &lt;a href=&quot;https://moinmo.in/MacroMarket/EventCalendar&quot;&gt;EventCalendar macro&lt;/a&gt; that was developed years ago. I expect to use the next few days to &lt;a href=&quot;https://moinmo.in/MacroMarket/EventCalendar?action=AttachFile&amp;amp;do=view&amp;amp;target=EventCalendar-099b.py&quot;&gt;study the EventCalendar code&lt;/a&gt; more throughly, but the first impression I had is that this code that can be reused and improved for the FOSS calendar.&lt;/p&gt;
&lt;h3&gt;&lt;em&gt;Parsers&lt;/em&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;A parser is entered as wiki markup and it processes a few parameters and a multiline block of text data to generate an output, which is displayed in the content area.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;&lt;em&gt;Actions&lt;/em&gt;&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;An action is mostly called using the menu (or a macro) and generates a complete HTML page on its own.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So maybe I will have to work a bit on this afterwards, to interact with the macro and customize the information to be displayed? I am not sure, I will have to look more into this.&lt;/p&gt;
&lt;p&gt;I guess that is all I have to report for now. See you in two weeks (or less)!&lt;/p&gt; </description> 
	<pubDate>Wed, 20 Dec 2017 04:20:00 +0000</pubDate>

</item> 
<item>
	<title>Renata D&#39;Avila: My contribution to Github-icalendar</title>
	<guid>tag:rsip22.github.io,2017-12-20:/blog/my-contribution-to-github-icalendar.html</guid>
	<link>https://rsip22.github.io/blog/my-contribution-to-github-icalendar.html</link>
     <description>  &lt;p&gt;Hello!&lt;/p&gt;
&lt;p&gt;Now that &lt;a href=&quot;https://rsip22.github.io/hello-world&quot;&gt;you already know a bit about me&lt;/a&gt;, let me start talking about my internship with Outreachy.&lt;/p&gt;
&lt;p&gt;One of the steps to apply to the internship is to pick the project you would like to work on. I chose the one with Debian to build &lt;a href=&quot;https://wiki.debian.org/Outreachy/Round15/Projects#Outreachy.2FRound15.2FProjects.2FSocialEventAndConferenceCalendars.A_calendar_database_of_social_events_and_conferences&quot;&gt;a calendar database of social events and conferences&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It is also part of the application process to make some contribution for the project. At first, it wasn&#39;t clear to me what contribution would that be (I hadn&#39;t found that URL yet), so I went to the &lt;a href=&quot;irc://irc.debian.org/debian-outreach&quot;&gt;#debian-outreach&lt;/a&gt; IRC channel and... well, asked, of course. That is when I found the page with a description of the task. I was supposed to learn about the iCalendar format (I didn&#39;t even know what it was, back then!) and work on an &lt;a href=&quot;https://github.com/dpocock/github-icalendar/issues/6&quot;&gt;issue on the github-icalendar project&lt;/a&gt;: to use repository labels in one of the suggested ways.&lt;/p&gt;
&lt;h2&gt;My contribution for github-icalendar&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dpocock/github-icalendar/&quot;&gt;Github-icalendar&lt;/a&gt; works by accessing the open issues in all repositories that the user has access to and transforming them into an iCalendar feed of VTODO items.&lt;/p&gt;
&lt;p&gt;I chose to solve the labels issue using them to filter the list of issues that should appear in a feed. I imagined two use cases for it:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;An user wants to get issues from all their repositories that contain a given label (getting all &#39;bug&#39; issues, for instance)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;An user wants to get issues from only an specific repository that contain a given label.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Therefore, the label system should support both of these uses.&lt;/p&gt;
&lt;p&gt;Working on this contribution taught me not only about the icalendar format, but it also gave me hands-on experience on interacting with the &lt;a href=&quot;https://developer.github.com/v3/issues/&quot;&gt;Github Issues API&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Back in October, I was able to attend &lt;a href=&quot;http://2017.pythonbrasil.org.br&quot;&gt;Python Brasil&lt;/a&gt;, the national conference about Python, during which I stayed in an accomodation with other PyLadies and allies. I used this opportunity to share what I had developed so far and to get some feedback. That&#39;s how I learned about pudb and how to use it to debug my code (and find out where I was getting the Github Issues API wrong). Because I found it so useful, on my Pull-Request, I proposed it to be added to the project, to help with future development. I also started adding some tests and wrote some specifications as suggestions to anyone who keeps working on it.&lt;/p&gt;
&lt;p&gt;I would like take this opportunity to thank you to the friends who pointed me in the right direction during the application process and made this internship a reality to me, in particular Elias Dorneles.&lt;/p&gt; </description> 
	<pubDate>Wed, 20 Dec 2017 02:01:00 +0000</pubDate>

</item> 
<item>
	<title>Reproducible builds folks: Reproducible Builds: Weekly report #138</title>
	<guid>https://reproducible.alioth.debian.org/blog/posts/138/</guid>
	<link>https://reproducible.alioth.debian.org/blog/posts/138/</link>
     <description>  &lt;p&gt;Here&#39;s what happened in the &lt;a href=&quot;https://reproducible-builds.org&quot;&gt;Reproducible Builds&lt;/a&gt; effort between Sunday December 10 and Saturday December 16 2017:&lt;/p&gt;

&lt;h2&gt;Upcoming events&lt;/h2&gt;

&lt;p&gt;The Reproducible Builds project &lt;a href=&quot;https://events.ccc.de/congress/2017/wiki/index.php/Assembly:Reproducible-Builds&quot;&gt;are organising an assembly at 34C3&lt;/a&gt; (the &lt;em&gt;&lt;a href=&quot;https://events.ccc.de/2017/11/26/a-galactic-congress-welcomes-all-lifeforms/&quot;&gt;&quot;Galactic Congress&quot;&lt;/a&gt;&lt;/em&gt;) in Leipzig, Germany. &lt;a href=&quot;https://lists.reproducible-builds.org/pipermail/rb-general/2017-November/000735.html&quot;&gt;We will informally meet every day at 13:37 UTC&lt;/a&gt; and would be delighted if you joined us there.&lt;/p&gt;

&lt;h2&gt;Packages reviewed and fixed, and bugs filed&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Adrian Bunk:

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/884214&quot;&gt;#884214&lt;/a&gt; filed against &lt;a href=&quot;https://tracker.debian.org/pkg/purify&quot;&gt;purify&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/884295&quot;&gt;#884295&lt;/a&gt; filed against &lt;a href=&quot;https://tracker.debian.org/pkg/node-semver-diff&quot;&gt;node-semver-diff&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/884477&quot;&gt;#884477&lt;/a&gt; filed against &lt;a href=&quot;https://tracker.debian.org/pkg/node-simple-swizzle&quot;&gt;node-simple-swizzle&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Alexander lynxis Couzens:

&lt;ul&gt;
&lt;li&gt;lua-i2c: Remove build timestamp (&lt;a href=&quot;https://github.com/mrpace2/lua-i2c/pull/1&quot;&gt;forwarded upstream&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bernhard M. Wiedemann:

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://build.opensuse.org/request/show/557560&quot;&gt;arj&lt;/a&gt; merged, date - upstreamable?&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/jcupitt/libvips/pull/832&quot;&gt;libvips&lt;/a&gt; merged, date&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/osdlyrics/osdlyrics/pull/34&quot;&gt;osdlyrics&lt;/a&gt; date&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/ruby/rdoc/pull/569&quot;&gt;ruby/rdoc&lt;/a&gt; drop gzip mtime&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/ruby/rdoc/pull/570&quot;&gt;ruby/rdoc&lt;/a&gt; support &lt;code&gt;SOURCE_DATE_EPOCH&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://build.opensuse.org/request/show/557611&quot;&gt;rmt-server&lt;/a&gt; merged, drop build logs, CPU-count&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://build.opensuse.org/request/show/557607&quot;&gt;sakura&lt;/a&gt; merged, png-timestamp&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Chris Lamb:

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/884047&quot;&gt;#884047&lt;/a&gt; filed against &lt;a href=&quot;https://tracker.debian.org/pkg/bibledit&quot;&gt;bibledit&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/884254&quot;&gt;#884254&lt;/a&gt; filed against &lt;a href=&quot;https://tracker.debian.org/pkg/pydoctor&quot;&gt;pydoctor&lt;/a&gt; (&lt;a href=&quot;https://github.com/twisted/pydoctor/pull/146&quot;&gt;forwarded upstream&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/884256&quot;&gt;#884256&lt;/a&gt; filed against &lt;a href=&quot;https://tracker.debian.org/pkg/pysph&quot;&gt;pysph&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/884402&quot;&gt;#884402&lt;/a&gt; filed against &lt;a href=&quot;https://tracker.debian.org/pkg/sonic-pi&quot;&gt;sonic-pi&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/884527&quot;&gt;#884527&lt;/a&gt; filed against &lt;a href=&quot;https://tracker.debian.org/pkg/parso&quot;&gt;parso&lt;/a&gt; (&lt;a href=&quot;https://github.com/davidhalter/parso/pull/25&quot;&gt;forwarded upstream&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;Reviews of unreproducible packages&lt;/h2&gt;

&lt;p&gt;43 package reviews have been added, 48 have been updated and 51 have been removed in this week,
adding to our knowledge about &lt;a href=&quot;https://tests.reproducible-builds.org/debian/index_issues.html&quot;&gt;identified issues&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;4 issue types have been updated:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chris Lamb:

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/reproducible/notes.git/commit/?id=fda94dd4&quot;&gt;Add a patch for nondeterminism_added_by_pyqt5_pyrcc5&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/reproducible/notes.git/commit/?id=259acf35&quot;&gt;Add patch for nondeterminism_in_documentation_generated_by_pydoctor toolchain issue.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/reproducible/notes.git/commit/?id=d8b96933&quot;&gt;Add new nondeterminism_in_documentation_generated_by_pydoctor toolchain issue.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Christoph Berh:

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/reproducible/notes.git/commit/?id=3664f5ad&quot;&gt;sphinx_htmlhelp_readdir_sensitive is #884010&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;Weekly QA work&lt;/h2&gt;

&lt;p&gt;During our reproducibility testing, FTBFS bugs have been detected and reported by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Adrian Bunk (55)&lt;/li&gt;
&lt;li&gt;Andreas Beckmann (2)&lt;/li&gt;
&lt;li&gt;Laurent Bigonville (1)&lt;/li&gt;
&lt;li&gt;Michael Biebl (1)&lt;/li&gt;
&lt;li&gt;Pierre Saramito (2)&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;diffoscope development&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Juliana Oliveira Rodrigues:

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/reproducible/diffoscope.git/commit/?id=9e2013f&quot;&gt;Fix &lt;code&gt;readelf&lt;/code&gt; exit code&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;reprotest development&lt;/h2&gt;

&lt;p&gt;Version &lt;a href=&quot;https://tracker.debian.org/news/893681&quot;&gt;0.7.5&lt;/a&gt;, &lt;a href=&quot;https://tracker.debian.org/news/894425&quot;&gt;0.7.6&lt;/a&gt; and &lt;a href=&quot;https://tracker.debian.org/news/894429&quot;&gt;0.7.7&lt;/a&gt; was uploaded to unstable by Ximin Luo.&lt;/p&gt;

&lt;p&gt;It included &lt;a href=&quot;https://anonscm.debian.org/git/reproducible/reprotest.git/log/?h=debian/0.7.5&quot;&gt;contributions&lt;/a&gt; already covered by posts of the previous weeks as well as new changes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ximin Luo:

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/reproducible/reprotest.git/commit/?id=5ec344e&quot;&gt;Fix nondeterministic &lt;code&gt;num\_cpus&lt;/code&gt;-related test failures&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/reproducible/reprotest.git/commit/?id=e6c91e4&quot;&gt;Update to latest &lt;code&gt;Standards-Version;&lt;/code&gt; no changes required&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/reproducible/reprotest.git/commit/?id=3bc2e51&quot;&gt;Bump version in &lt;code&gt;setup.py&lt;/code&gt;.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/reproducible/reprotest.git/commit/?id=4a6154d&quot;&gt;Update debian/copyright and use HTTPS in debian/watch.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;buildinfo.debian.net development&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Chris Lamb:

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/reproducible/buildinfo.debian.net.git/commit/?id=6da7bf2&quot;&gt;Don&#39;t HTTP 500 if no request body.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/reproducible/buildinfo.debian.net.git/commit/?id=a4f4613&quot;&gt;Actually catch the &lt;code&gt;TypeError: decode() argument 1 must be string, not None&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;reproducible-website development&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Holger Levsen:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/reproducible/reproducible-website.git/commit/?id=3c92ee5&quot;&gt;Link preliminary notes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/reproducible/reproducible-website.git/commit/?id=d0a4fa2&quot;&gt;Add group photo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/reproducible/reproducible-website.git/commit/?id=38e7bdc&quot;&gt;Cleanup some markup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/reproducible/reproducible-website.git/commit/?id=a303994&quot;&gt;Link agenda brains-torming session&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/reproducible/reproducible-website.git/commit/?id=c2afe16&quot;&gt;Seperate ogo-design notes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/reproducible/reproducible-website.git/commit/?id=489a42c&quot;&gt;Move agenda to its own page&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/reproducible/reproducible-website.git/commit/?id=b7513c2&quot;&gt;Add archive-formats notes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/reproducible/reproducible-website.git/commit/?id=14689b9&quot;&gt;Include PDF version of report by Aspiration and link to it&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Daniel Kahn Gillmor:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/reproducible/reproducible-website.git/commit/?id=5585c18&quot;&gt;Removed HTML-formatted table now that we have it in markdown&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/reproducible/reproducible-website.git/commit/?id=bd4d2aa&quot;&gt;Added table for archive formats&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;jenkins.debian.net development&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Holger Levsen (ArchLinux support)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Scheduler:

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/qa/jenkins.debian.net/commit/?id=8ba4ecf7&quot;&gt;Sleep at job end to prevent immediate restarts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/qa/jenkins.debian.net/commit/?id=e0a48b35&quot;&gt;Improve scheduler output&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/qa/jenkins.debian.net/commit/?id=b5bb6fbc&quot;&gt;Don&#39;t reschedule blacklisted packages&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;New features / enhancements, etc.:

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/qa/jenkins.debian.net/commit/?id=80091e40&quot;&gt;Improve locking&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/qa/jenkins.debian.net/commit/?id=7dc06c90&quot;&gt;Delete old package files after the new ones have been created&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/qa/jenkins.debian.net/commit/?id=f0fc959e&quot;&gt;Deal with yet another way to build unreproducible packages&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug-fixes:

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/qa/jenkins.debian.net/commit/?id=60d6d27e&quot;&gt;Prevent concurrent builds of the same package&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/qa/jenkins.debian.net/commit/?id=555e5b70&quot;&gt;Use &lt;code&gt;sudo&lt;/code&gt; to cleanup after the build&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/qa/jenkins.debian.net/commit/?id=1134da0c&quot;&gt;Ensure &lt;code&gt;pkg.html&lt;/code&gt; files are world-readable&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/qa/jenkins.debian.net/commit/?id=938c0025&quot;&gt;Fix conditional IRC message&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/qa/jenkins.debian.net/commit/?id=30aa899e&quot;&gt;Correctly output packgae name&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/qa/jenkins.debian.net/commit/?id=e4491a4d&quot;&gt;Also detect FTBFS due to failing to source &lt;code&gt;PKGBUILD&lt;/code&gt; files&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Documentation/reporting:

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/qa/jenkins.debian.net/commit/?id=b03e6ca4&quot;&gt;Explain some (perceived) inconsistencies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/qa/jenkins.debian.net/commit/?id=d9fa859b&quot;&gt;Also announce current percentage on IRC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/qa/jenkins.debian.net/commit/?id=e4ebd9a2&quot;&gt;Shorten irc message&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/qa/jenkins.debian.net/commit/?id=6f6985e2&quot;&gt;Disable irc notifications about unreproducible packages until we found a way to report status changes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Misc:

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/qa/jenkins.debian.net/commit/?id=520ea710&quot;&gt;Unblacklist zathura&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Mattia Rizzolo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/qa/jenkins.debian.net/commit/?id=6132c7a6&quot;&gt;Start moving build configuration to an &lt;code&gt;.ini&lt;/code&gt; file&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/qa/jenkins.debian.net/commit/?id=f5874f07&quot;&gt;Do not bind-mount &lt;code&gt;/dev&lt;/code&gt; and &lt;code&gt;/dev/fs&lt;/code&gt; inside new chroots&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/qa/jenkins.debian.net/commit/?id=123b089a&quot;&gt;Fix &quot;future detection&quot; now that we are close to 2018&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;common.py&lt;/code&gt; support library:

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/qa/jenkins.debian.net/commit/?id=fd97a23c&quot;&gt;Move &lt;code&gt;argparse&lt;/code&gt; handling before parsing the configuration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/qa/jenkins.debian.net/commit/?id=e0e1ac74&quot;&gt;Allow passing parameters to &lt;code&gt;query\_db()&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/qa/jenkins.debian.net/commit/?id=027f3e23&quot;&gt;Fix a &lt;code&gt;debian&lt;/code&gt; hardcoding&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/qa/jenkins.debian.net/commit/?id=0afdbbda&quot;&gt;Allow passing a distribution value to scripts&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Documentation:

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/qa/jenkins.debian.net/commit/?id=5deee654&quot;&gt;INSTALL: fix formatting&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/qa/jenkins.debian.net/commit/?id=580b8e4e&quot;&gt;INSTALL: draft some documentation on how slaves are set up&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Jenkins management:

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/qa/jenkins.debian.net/commit/?id=065b840d&quot;&gt;Simplify ssh restrictions by using the new &lt;code&gt;restrict&lt;/code&gt; option&lt;/a&gt; (see &lt;code&gt;sshd(1)&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/qa/jenkins.debian.net/commit/?id=5f3b2100&quot;&gt;Allow &lt;code&gt;jenkins&lt;/code&gt; user to SSH to itself&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/qa/jenkins.debian.net/commit/?id=0c3b9079&quot;&gt;Don&#39;t rewrite HTTP requests for &lt;code&gt;/descriptorByName&lt;/code&gt; endpoint&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;Misc.&lt;/h2&gt;

&lt;p&gt;This week&#39;s edition was written by Alexander Couzens, Bernhard M. Wiedemann, Chris Lamb and Holger Levsen &amp;amp; reviewed by a bunch of Reproducible Builds folks on IRC &amp;amp; the mailing lists.&lt;/p&gt; </description> 
	<pubDate>Tue, 19 Dec 2017 14:35:00 +0000</pubDate>

</item> 
<item>
	<title>Colin Watson: An odd test failure</title>
	<guid>tag:www.chiark.greenend.org.uk,2017-12-19:~cjwatson/blog/odd-test-failure.html</guid>
	<link>https://www.chiark.greenend.org.uk/~cjwatson/blog/odd-test-failure.html</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/cjwatson.png&quot; width=&quot;70&quot; height=&quot;82&quot; alt=&quot;&quot; align=&quot;right&quot; style=&quot;float: right;&quot;&gt;  &lt;p&gt;Weird test failures are great at teaching you things that you didn’t realise
you might need to know.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.chiark.greenend.org.uk/~cjwatson/blog/mysterious-bug-with-twisted-plugins.html&quot;&gt;As previously
mentioned&lt;/a&gt;, I’ve been
working on converting Launchpad from &lt;a href=&quot;http://www.buildout.org/&quot;&gt;Buildout&lt;/a&gt; to
&lt;a href=&quot;https://virtualenv.pypa.io/en/stable/&quot;&gt;virtualenv&lt;/a&gt; and
&lt;a href=&quot;https://pip.pypa.io/en/stable/&quot;&gt;pip&lt;/a&gt;, and I finally landed that change on
our development branch today.  The final landing was mostly quite smooth,
except for one test failure on our buildbot that I hadn’t seen before:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span class=&quot;x&quot;&gt;ERROR: lp.codehosting.codeimport.tests.test_worker.TestBzrSvnImport.test_stacked&lt;/span&gt;
&lt;span class=&quot;x&quot;&gt;worker ID: unknown worker (bug in our subunit output?)&lt;/span&gt;
&lt;span class=&quot;x&quot;&gt;----------------------------------------------------------------------&lt;/span&gt;
&lt;span class=&quot;gt&quot;&gt;Traceback (most recent call last):&lt;/span&gt;
&lt;span class=&quot;gr&quot;&gt;_StringException&lt;/span&gt;: &lt;span class=&quot;n&quot;&gt;log: {{{&lt;/span&gt;
&lt;span class=&quot;x&quot;&gt;36.384  creating repository in file:///tmp/testbzr-6CwSLV.tmp/lp.codehosting.codeimport.tests.test_worker.TestBzrSvnImport.test_stacked/work/stacked-on/.bzr/.&lt;/span&gt;
&lt;span class=&quot;x&quot;&gt;36.388  creating branch &amp;lt;bzrlib.branch.BzrBranchFormat7 object at 0xeb85b36c&amp;gt; in file:///tmp/testbzr-6CwSLV.tmp/lp.codehosting.codeimport.tests.test_worker.TestBzrSvnImport.test_stacked/work/stacked-on/&lt;/span&gt;
&lt;span class=&quot;x&quot;&gt;}}}&lt;/span&gt;

&lt;span class=&quot;gt&quot;&gt;Traceback (most recent call last):&lt;/span&gt;
  File &lt;span class=&quot;nb&quot;&gt;&quot;/srv/buildbot/lpbuildbot/lp-devel-xenial/build/lib/lp/codehosting/codeimport/tests/test_worker.py&quot;&lt;/span&gt;, line &lt;span class=&quot;m&quot;&gt;1108&lt;/span&gt;, in &lt;span class=&quot;n&quot;&gt;test_stacked&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;stacked_on&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Branch&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;source_details&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
  File &lt;span class=&quot;nb&quot;&gt;&quot;/srv/buildbot/lpbuildbot/lp-devel-xenial/build/env/local/lib/python2.7/site-packages/bzrlib/branch.py&quot;&lt;/span&gt;, line &lt;span class=&quot;m&quot;&gt;186&lt;/span&gt;, in &lt;span class=&quot;n&quot;&gt;open&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;possible_transports&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;possible_transports&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_unsupported&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_unsupported&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  File &lt;span class=&quot;nb&quot;&gt;&quot;/srv/buildbot/lpbuildbot/lp-devel-xenial/build/env/local/lib/python2.7/site-packages/bzrlib/controldir.py&quot;&lt;/span&gt;, line &lt;span class=&quot;m&quot;&gt;689&lt;/span&gt;, in &lt;span class=&quot;n&quot;&gt;open&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;_unsupported&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_unsupported&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  File &lt;span class=&quot;nb&quot;&gt;&quot;/srv/buildbot/lpbuildbot/lp-devel-xenial/build/env/local/lib/python2.7/site-packages/bzrlib/controldir.py&quot;&lt;/span&gt;, line &lt;span class=&quot;m&quot;&gt;718&lt;/span&gt;, in &lt;span class=&quot;n&quot;&gt;open_from_transport&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;find_format&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;transport&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;redirected&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  File &lt;span class=&quot;nb&quot;&gt;&quot;/srv/buildbot/lpbuildbot/lp-devel-xenial/build/env/local/lib/python2.7/site-packages/bzrlib/transport/__init__.py&quot;&lt;/span&gt;, line &lt;span class=&quot;m&quot;&gt;1719&lt;/span&gt;, in &lt;span class=&quot;n&quot;&gt;do_catching_redirections&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;transport&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  File &lt;span class=&quot;nb&quot;&gt;&quot;/srv/buildbot/lpbuildbot/lp-devel-xenial/build/env/local/lib/python2.7/site-packages/bzrlib/controldir.py&quot;&lt;/span&gt;, line &lt;span class=&quot;m&quot;&gt;706&lt;/span&gt;, in &lt;span class=&quot;n&quot;&gt;find_format&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;probers&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;probers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
  File &lt;span class=&quot;nb&quot;&gt;&quot;/srv/buildbot/lpbuildbot/lp-devel-xenial/build/env/local/lib/python2.7/site-packages/bzrlib/controldir.py&quot;&lt;/span&gt;, line &lt;span class=&quot;m&quot;&gt;1155&lt;/span&gt;, in &lt;span class=&quot;n&quot;&gt;find_format&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;raise&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;errors&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;NotBranchError&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;transport&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;base&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;gr&quot;&gt;NotBranchError&lt;/span&gt;: &lt;span class=&quot;n&quot;&gt;Not a branch: &quot;/tmp/tmpdwqrc6/trunk/&quot;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;When I investigated this locally, I found that I could reproduce it if I ran
just that test on its own, but not if I ran it together with the other tests
in the same class.  That’s certainly my favourite way round for test
isolation failures to present themselves (it’s more usual to find state from
one test leaking out and causing another one to fail, which can make for a
very time-consuming exercise of trying to find the critical combination),
but it’s still pretty odd.&lt;/p&gt;
&lt;p&gt;I stepped through the &lt;code&gt;Branch.open&lt;/code&gt; call in each case in the hope of some
enlightenment.  The interesting difference was that the custom probers
installed by the &lt;code&gt;bzr-svn&lt;/code&gt; plugin weren’t installed when I ran that one test
on its own, so it was trying to open a branch as a Bazaar branch rather than
using the foreign-branch logic for Subversion, and this presumably depended
on some configuration that only some tests put in place.  I was on the verge
of just explicitly setting up that plugin in the test suite’s &lt;code&gt;setUp&lt;/code&gt;
method, but I was still curious about exactly what was breaking this.&lt;/p&gt;
&lt;p&gt;Launchpad installs several Bazaar plugins, and
&lt;code&gt;lib/lp/codehosting/__init__.py&lt;/code&gt; is responsible for putting most of these in
place: anything in Launchpad itself that uses Bazaar is generally supposed
to do something like &lt;code&gt;import lp.codehosting&lt;/code&gt; to set everything up.  I
therefore put a breakpoint at the top of &lt;code&gt;lp.codehosting&lt;/code&gt; and stepped
through it to see whether anything was going wrong in the initial setup.
Sure enough, I found that &lt;code&gt;bzrlib.plugins.svn&lt;/code&gt; was failing to import due to
an exception raised by &lt;code&gt;bzrlib.i18n.load_plugin_translations&lt;/code&gt;, which was
being swallowed silently but meant that its custom probers weren’t being
installed.  Here’s what that function looks like:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;load_plugin_translations&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;domain&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;sd&quot;&gt;&quot;&quot;&quot;Load the translations for a specific plugin.&lt;/span&gt;

&lt;span class=&quot;sd&quot;&gt;    :param domain: Gettext domain name (usually &#39;bzr-PLUGINNAME&#39;)&lt;/span&gt;
&lt;span class=&quot;sd&quot;&gt;    &quot;&quot;&quot;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;locale_base&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;os&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dirname&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;nb&quot;&gt;unicode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;__file__&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sys&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;getfilesystemencoding&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()))&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;translation&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;install_translations&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;domain&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;domain&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;locale_base&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;locale_base&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;add_fallback&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;translation&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;translation&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;In this case, &lt;code&gt;sys.getfilesystemencoding&lt;/code&gt; was returning &lt;code&gt;None&lt;/code&gt;, which isn’t
a valid &lt;code&gt;encoding&lt;/code&gt; argument to &lt;code&gt;unicode&lt;/code&gt;.  But why would that be?  It gave
me a sensible result when I ran it from a Python shell in this environment.
A bit of head-scratching later and it occurred to me to look at a backtrace:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;(Pdb) bt
  /home/cjwatson/src/canonical/launchpad/lp-branches/testfix/env/lib/python2.7/site.py(703)&amp;lt;module&amp;gt;()
-&amp;gt; main()
  /home/cjwatson/src/canonical/launchpad/lp-branches/testfix/env/lib/python2.7/site.py(694)main()
-&amp;gt; execsitecustomize()
  /home/cjwatson/src/canonical/launchpad/lp-branches/testfix/env/lib/python2.7/site.py(548)execsitecustomize()
-&amp;gt; import sitecustomize
  /home/cjwatson/src/canonical/launchpad/lp-branches/testfix/env/lib/python2.7/sitecustomize.py(7)&amp;lt;module&amp;gt;()
-&amp;gt; lp_sitecustomize.main()
  /home/cjwatson/src/canonical/launchpad/lp-branches/testfix/lib/lp_sitecustomize.py(193)main()
-&amp;gt; dont_wrap_bzr_branch_classes()
  /home/cjwatson/src/canonical/launchpad/lp-branches/testfix/lib/lp_sitecustomize.py(139)dont_wrap_bzr_branch_classes()
-&amp;gt; import lp.codehosting
&amp;gt; /home/cjwatson/src/canonical/launchpad/lp-branches/testfix/lib/lp/codehosting/__init__.py(54)&amp;lt;module&amp;gt;()
-&amp;gt; load_plugins([_get_bzr_plugins_path()])
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;I wonder if there’s something interesting about being imported from a
&lt;code&gt;sitecustomize&lt;/code&gt; hook?  Sure enough, when I went to look at Python for where
&lt;code&gt;sys.getfilesystemencoding&lt;/code&gt; is set up, I found this in &lt;code&gt;Py_InitializeEx&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;    &lt;span class=&quot;k&quot;&gt;if&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;n&quot;&gt;Py_NoSiteFlag&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;initsite&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt; &lt;span class=&quot;cm&quot;&gt;/* Module site */&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;cp&quot;&gt;#if defined(Py_USING_UNICODE) &amp;amp;&amp;amp; defined(HAVE_LANGINFO_H) &amp;amp;&amp;amp; defined(CODESET)&lt;/span&gt;
    &lt;span class=&quot;cm&quot;&gt;/* On Unix, set the file system encoding according to the&lt;/span&gt;
&lt;span class=&quot;cm&quot;&gt;       user&#39;s preference, if the CODESET names a well-known&lt;/span&gt;
&lt;span class=&quot;cm&quot;&gt;       Python codec, and Py_FileSystemDefaultEncoding isn&#39;t&lt;/span&gt;
&lt;span class=&quot;cm&quot;&gt;       initialized by other means. Also set the encoding of&lt;/span&gt;
&lt;span class=&quot;cm&quot;&gt;       stdin and stdout if these are terminals, unless overridden.  */&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;if&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;n&quot;&gt;overridden&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Py_FileSystemDefaultEncoding&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;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;I &lt;a href=&quot;https://code.launchpad.net/~cjwatson/launchpad/avoid-importing-bzr-plugins-from-site/+merge/335379&quot;&gt;moved this out of
sitecustomize&lt;/a&gt;,
and it’s working better now.  But did you know that a &lt;code&gt;sitecustomize&lt;/code&gt; hook
can’t safely use anything that depends on &lt;code&gt;sys.getfilesystemencoding&lt;/code&gt;?  I
certainly didn’t, until it bit me.&lt;/p&gt; </description> 
	<pubDate>Tue, 19 Dec 2017 13:52:52 +0000</pubDate>

</item> 
<item>
	<title>Jonathan Dowland: Containers lecture</title>
	<guid>http://jmtd.net/log/containers_lecture/</guid>
	<link>http://jmtd.net/log/containers_lecture/</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 repeated last year&#39;s &lt;a href=&quot;http://jmtd.net/log/docker_lecture/&quot;&gt;docker lecture&lt;/a&gt; a couple of times recently,
now revised and retitled &quot;Introduction to Containers&quot;. The material is
mostly the same; the demo steps exactly the same and I haven&#39;t produced any
updated hand-outs this time (sorry). Revised slides: &lt;a href=&quot;http://jmtd.net/log/containers_lecture/slides.pdf&quot;&gt;shorter version&lt;/a&gt;
(terms: &lt;a href=&quot;https://creativecommons.org/licenses/by-sa/4.0/&quot;&gt;CC-BY-SA&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Whilst trying to introduce containers, the approach I&#39;ve taken is to work up
the history of Web site/server/app hosting from physical hosting and via
Virtual Machines. This gives you the context for their popularity, but I find
VMs are not the best way to explain container technology. I prefer to go the
other way and look at a process on a multi-user system, the problems due to
lack of isolation and steadily build up the isolation available with tools like
&lt;code&gt;chroot&lt;/code&gt;, etc.&lt;/p&gt;

&lt;p&gt;The other area I&#39;ve tried to expand on is the orchestration layer on top of
containers, and above, including technologies such as Kubernetes and Openshift.
If I deliver this again I&#39;d like to expand this material much more. On that
note, a colleague recently forwarded a link to a Google research paper
originally published in &lt;em&gt;acmqueue&lt;/em&gt; in January 2016, &lt;a href=&quot;https://static.googleusercontent.com/media/research.google.com/en//pubs/archive/44843.pdf&quot;&gt;Borg, Omega, and
Kubernetes&lt;/a&gt;
which is a great read on the history of containers in Google and what led up
to the open sourcing of Kubernetes, their third iteration at designing a
container orchestrator.&lt;/p&gt; </description> 
	<pubDate>Tue, 19 Dec 2017 10:07:52 +0000</pubDate>

</item> 
<item>
	<title>Norbert Preining: Japan-styled Christmas Cards</title>
	<guid>https://www.preining.info/blog/?p=7002</guid>
	<link>https://www.preining.info/blog/2017/12/japan-styled-christmas-cards/</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/preining.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;A friend of mine, &lt;a href=&quot;http://www.kimberleealiasgart.com&quot;&gt;Kimberlee Aliasgar&lt;/a&gt; of Trinidad and Tobago, has created very nice Christmas cards “Japan styled” over at &lt;a href=&quot;https://www.xmasjapan.com/&quot;&gt;Xmascardsjapan&lt;/a&gt; (Japanese version is &lt;a href=&quot;https://www.xmascardsjapan.com/&quot;&gt;here&lt;/a&gt;). They pick up some typical themes from Japan and turn them into lovely designed cards that are a present by itself, no need for additional presents &lt;img alt=&quot;😉&quot; class=&quot;wp-smiley&quot; src=&quot;https://s.w.org/images/core/emoji/2.3/72x72/1f609.png&quot; style=&quot;height: 1em;&quot; /&gt;&lt;br /&gt;
&lt;img alt=&quot;&quot; class=&quot;aligncenter size-full wp-image-7009&quot; height=&quot;416&quot; src=&quot;https://www.preining.info/blog/wp-content/uploads/2017/12/christmas-cards1-small.jpg&quot; width=&quot;300&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Here is another example with “Merry Christmas” written in Katakana, giving a nice touch.&lt;br /&gt;
&lt;img alt=&quot;&quot; class=&quot;aligncenter size-full wp-image-7010&quot; height=&quot;423&quot; src=&quot;https://www.preining.info/blog/wp-content/uploads/2017/12/christmas-cards2-small.jpg&quot; width=&quot;300&quot; /&gt;&lt;/p&gt;
&lt;p&gt;In case you are interested, head over to the &lt;a href=&quot;https://www.xmasjapan.com/&quot;&gt;English version&lt;/a&gt; or &lt;a href=&quot;https://www.xmascardsjapan.com/&quot;&gt;Japanese version&lt;/a&gt; of there web shop.&lt;br /&gt;
&lt;a href=&quot;https://www.xmasjapan.com/&quot;&gt;&lt;img alt=&quot;&quot; class=&quot;aligncenter size-full wp-image-7003&quot; height=&quot;550&quot; src=&quot;https://www.preining.info/blog/wp-content/uploads/2017/12/christmas-cards0.jpg&quot; width=&quot;490&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I hope you enjoy the cards!&lt;/p&gt; </description> 
	<pubDate>Tue, 19 Dec 2017 08:12:29 +0000</pubDate>

</item> 
<item>
	<title>Colin Watson: Kitten Block equivalent for Firefox 57</title>
	<guid>tag:www.chiark.greenend.org.uk,2017-12-19:~cjwatson/blog/kitten-block-equivalent-for-firefox-57.html</guid>
	<link>https://www.chiark.greenend.org.uk/~cjwatson/blog/kitten-block-equivalent-for-firefox-57.html</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/cjwatson.png&quot; width=&quot;70&quot; height=&quot;82&quot; alt=&quot;&quot; align=&quot;right&quot; style=&quot;float: right;&quot;&gt;  &lt;p&gt;I’ve been using &lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/addon/kitten-block/&quot;&gt;Kitten
Block&lt;/a&gt; for
years, since I don’t really need the blood pressure spike caused by
accidentally following links to certain &lt;span class=&quot;caps&quot;&gt;UK&lt;/span&gt; newspapers.  Unfortunately it
hasn’t been ported to Firefox 57.  I tried emailing the author a couple of
months ago, but my email bounced.&lt;/p&gt;
&lt;p&gt;However, if your primary goal is just to block the websites in question
rather than seeing kitten pictures as such (let’s face it, the internet is
not short of alternative sources of kitten pictures), then it’s easy to do
with &lt;a href=&quot;https://addons.mozilla.org/en-GB/firefox/addon/ublock-origin/&quot;&gt;uBlock
Origin&lt;/a&gt;.
After installing the extension if necessary, go to Tools → Add-ons →
Extensions → uBlock Origin → Preferences → My filters, and add
&lt;code&gt;www.dailymail.co.uk&lt;/code&gt; and &lt;code&gt;www.express.co.uk&lt;/code&gt;, each on its own line.  (Of
course you can easily add more if you like.)  Voilà: instant tranquility.&lt;/p&gt;
&lt;p&gt;Incidentally, this also works fine on Android.  The fact that it was easy to
install a good ad blocker without having to mess about with a rooted device
or strange proxy settings was the main reason I switched to Firefox on my phone.&lt;/p&gt; </description> 
	<pubDate>Tue, 19 Dec 2017 00:00:00 +0000</pubDate>

</item> 
<item>
	<title>Dirk Eddelbuettel: littler 0.3.3</title>
	<guid>http://dirk.eddelbuettel.com/blog/2017/12/17#littler-0.3.3</guid>
	<link>http://dirk.eddelbuettel.com/blog/2017/12/17#littler-0.3.3</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/dirk.png&quot; width=&quot;65&quot; height=&quot;90&quot; alt=&quot;&quot; align=&quot;right&quot; style=&quot;float: right;&quot;&gt;  &lt;p&gt;&lt;img alt=&quot;max-heap image&quot; height=&quot;100&quot; src=&quot;http://dirk.eddelbuettel.com/images/letter-r.png&quot; style=&quot;float: left; margin: 15px 30px 15px 15px;&quot; width=&quot;100&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The fourth release of &lt;a href=&quot;http://dirk.eddelbuettel.com/code/littler.html&quot;&gt;littler&lt;/a&gt; as a &lt;a href=&quot;https://cran.r-project.org/package=littler&quot;&gt;CRAN package&lt;/a&gt; is now available, following in the now more than ten-year history as a package started by &lt;a href=&quot;http://jeffreyhorner.blogspot.com/&quot;&gt;Jeff&lt;/a&gt; in 2006, and joined by me a few weeks later.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://dirk.eddelbuettel.com/code/littler.html&quot;&gt;littler&lt;/a&gt; is the first command-line interface for R and predates &lt;code&gt;Rscript&lt;/code&gt;. In my very biased eyes better as it allows for piping as well &lt;em&gt;shebang&lt;/em&gt; scripting via &lt;code&gt;#!&lt;/code&gt;, uses command-line arguments more consistently and still &lt;a href=&quot;http://dirk.eddelbuettel.com/blog/2014/09/02#littler-faster-at-doing-nothing&quot;&gt;starts faster&lt;/a&gt;. Last but not least it is also less silly than &lt;code&gt;Rscript&lt;/code&gt; and always loads the &lt;code&gt;methods&lt;/code&gt; package avoiding those bizarro bugs between code running in &lt;code&gt;R&lt;/code&gt; itself and a scripting front-end.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://dirk.eddelbuettel.com/code/littler.html&quot;&gt;littler&lt;/a&gt; prefers to live on Linux and Unix, has its difficulties on OS X due to yet-another-braindeadedness there (who ever thought case-insensitive filesystems where a good idea?) and simply does not exist on Windows (yet -- the build system could be extended -- see &lt;a href=&quot;http://dirk.eddelbuettel.com/code/rinside.html&quot;&gt;RInside&lt;/a&gt; for an existence proof, and volunteers welcome!).&lt;/p&gt;
&lt;p&gt;A few examples as highlighted at the &lt;a href=&quot;https://github.com/eddelbuettel/littler&quot;&gt;Github repo&lt;/a&gt;:&lt;/p&gt;
&lt;div class=&quot;figure&quot;&gt;
&lt;img src=&quot;http://dirk.eddelbuettel.com/blog/2017/12/17/littlerExamples.png&quot; style=&quot;width: 99.0%;&quot; /&gt;

&lt;/div&gt;
&lt;p&gt;This release brings a few new examples scripts, extends a few existing ones and also includes two fixes thanks to &lt;a href=&quot;https://www.carlboettiger.info/&quot;&gt;Carl&lt;/a&gt;. Again, no internals were changed. The &lt;code&gt;NEWS&lt;/code&gt; file entry is below.&lt;/p&gt;
&lt;blockquote&gt;
&lt;h4 id=&quot;changes-in-littler-version-0.3.3-2017-12-17&quot;&gt;Changes in littler version 0.3.3 (2017-12-17)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Changes in examples&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The script &lt;code&gt;installGithub.r&lt;/code&gt; now correctly uses the &lt;code&gt;upgrade&lt;/code&gt; argument (Carl Boettiger in &lt;a href=&quot;https://github.com/eddelbuettel/littler/pull/49&quot;&gt;#49&lt;/a&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;New script &lt;code&gt;pnrrs.r&lt;/code&gt; to call the package-native registration helper function added in R 3.4.0&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The script &lt;code&gt;install2.r&lt;/code&gt; now has more robust error handling (Carl Boettiger in &lt;a href=&quot;https://github.com/eddelbuettel/littler/pull/50&quot;&gt;#50&lt;/a&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;New script &lt;code&gt;cow.r&lt;/code&gt; to use R Hub&#39;s &lt;code&gt;check_on_windows&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Scripts &lt;code&gt;cow.r&lt;/code&gt; and &lt;code&gt;c4c.r&lt;/code&gt; use &lt;code&gt;#!/usr/bin/env r&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;New option &lt;code&gt;--fast&lt;/code&gt; (or &lt;code&gt;-f&lt;/code&gt;) for scripts &lt;code&gt;build.r&lt;/code&gt; and &lt;code&gt;rcc.r&lt;/code&gt; for faster package build and check&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;code&gt;build.r&lt;/code&gt; script now defaults to using the current directory if no argument is provided.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The RStudio getters now use the &lt;code&gt;rvest&lt;/code&gt; package to parse the webpage with available versions.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Changes in package&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Travis CI now uses https to fetch script, and sets the group&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;Courtesy of &lt;a href=&quot;http://dirk.eddelbuettel.com/cranberries/&quot;&gt;CRANberries&lt;/a&gt;, there is a comparison to &lt;a href=&quot;http://dirk.eddelbuettel.com/cranberries/2017/12/17#littler_0.3.3&quot;&gt;the previous release&lt;/a&gt;. Full details for the &lt;a href=&quot;http://dirk.eddelbuettel.com/code/littler.html&quot;&gt;littler&lt;/a&gt; release are provided as usual at the &lt;a href=&quot;https://github.com/eddelbuettel/littler/blob/master/ChangeLog&quot;&gt;ChangeLog&lt;/a&gt; page. The code is available via the &lt;a href=&quot;https://github.com/eddelbuettel/littler&quot;&gt;GitHub&lt;/a&gt; repo, from tarballs off my &lt;a href=&quot;http://dirk.eddelbuettel.com/code/littler.html&quot;&gt;littler page&lt;/a&gt; and the &lt;a href=&quot;http://dirk.eddelbuettel.com/code/littler/&quot;&gt;local directory here&lt;/a&gt; -- and now of course all from &lt;a href=&quot;https://cran.rstudio.com/web/packages/littler/index.html&quot;&gt;its CRAN page&lt;/a&gt; and via &lt;code&gt;install.packages(&quot;littler&quot;)&lt;/code&gt;. Binary packages are available directly in &lt;a href=&quot;http://www.debian.org&quot;&gt;Debian&lt;/a&gt; as well as &lt;em&gt;soon&lt;/em&gt; via &lt;a href=&quot;http://cran.r-project.org/bin/linux/ubuntu&quot;&gt;Ubuntu binaries at CRAN&lt;/a&gt; thanks to the tireless Michael Rutter.&lt;/p&gt;
&lt;p&gt;Comments and suggestions are welcome at the &lt;a href=&quot;https://github.com/eddelbuettel/littler/&quot;&gt;GitHub&lt;/a&gt; repo.&lt;/p&gt;
&lt;p style=&quot;font-size: 80%; font-style: italic;&quot;&gt;
This post by &lt;a href=&quot;http://dirk.eddelbuettel.com&quot;&gt;Dirk Eddelbuettel&lt;/a&gt; originated on his &lt;a href=&quot;http://dirk.eddelbuettel.com/blog/&quot;&gt;Thinking inside the box&lt;/a&gt; blog. Please report excessive re-aggregation in third-party for-profit settings.
&lt;/p&gt; </description> 
	<pubDate>Sun, 17 Dec 2017 16:37:00 +0000</pubDate>

</item> 
<item>
	<title>Lars Wirzenius: The proof is in the pudding</title>
	<guid>http://blog.liw.fi/posts/2017/12/17/the_proof_is_in_the_pudding/</guid>
	<link>http://blog.liw.fi/posts/2017/12/17/the_proof_is_in_the_pudding/</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;I wrote these when I woke up one night and had trouble getting back to
sleep, and spent a while in a very philosophical mood thinking about
life, success, and productivity as a programmer.&lt;/p&gt;

&lt;p&gt;Imagine you&#39;re developing a piece of software.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;You don&#39;t know it works, unless you&#39;ve used it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You don&#39;t know it&#39;s good, unless people tell you it is.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You don&#39;t know you can do it, unless you&#39;ve already done it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You don&#39;t know it can handle a given load, unless you&#39;ve already tried it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The real bottlenecks are always a surprise, the first time you measure.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It&#39;s not ready for production until it&#39;s been used in production.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Your automated tests always miss something, but with only manual
tests, you always miss more.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt; </description> 
	<pubDate>Sun, 17 Dec 2017 09:25:32 +0000</pubDate>

</item> 
<item>
	<title>Petter Reinholdtsen: Cura, the nice 3D print slicer, is now in Debian Unstable</title>
	<guid>http://people.skolelinux.org/pere/blog/Cura__the_nice_3D_print_slicer__is_now_in_Debian_Unstable.html</guid>
	<link>http://people.skolelinux.org/pere/blog/Cura__the_nice_3D_print_slicer__is_now_in_Debian_Unstable.html</link>
     <description>  &lt;p&gt;After several months of working and waiting, I am happy to report
that the nice and user friendly 3D printer slicer software Cura just
entered Debian Unstable.  It consist of five packages,
&lt;a href=&quot;https://tracker.debian.org/pkg/cura&quot;&gt;cura&lt;/a&gt;,
&lt;a href=&quot;https://tracker.debian.org/pkg/cura-engine&quot;&gt;cura-engine&lt;/a&gt;,
&lt;a href=&quot;https://tracker.debian.org/pkg/libarcus&quot;&gt;libarcus&lt;/a&gt;,
&lt;a href=&quot;https://tracker.debian.org/pkg/fdm-materials&quot;&gt;fdm-materials&lt;/a&gt;,
&lt;a href=&quot;https://tracker.debian.org/pkg/libsavitar&quot;&gt;libsavitar&lt;/a&gt; and
&lt;a href=&quot;https://tracker.debian.org/pkg/uranium&quot;&gt;uranium&lt;/a&gt;.  The last
two, uranium and cura, entered Unstable yesterday.  This should make
it easier for Debian users to print on at least the Ultimaker class of
3D printers.  My nearest 3D printer is an Ultimaker 2+, so it will
make life easier for at least me. :)&lt;/p&gt;

&lt;p&gt;The work to make this happen was done by Gregor Riepl, and I was
happy to assist him in sponsoring the packages.  With the introduction
of Cura, Debian is up to three 3D printer slicers at your service,
Cura, Slic3r and Slic3r Prusa.  If you own or have access to a 3D
printer, give it a go. :)&lt;/p&gt;

&lt;p&gt;The 3D printer software is maintained by the 3D printer Debian
team, flocking together on the
&lt;a href=&quot;http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/3dprinter-general&quot;&gt;3dprinter-general&lt;/a&gt;
mailing list and the
&lt;a href=&quot;irc://irc.debian.org/#debian-3dprinting&quot;&gt;#debian-3dprinting&lt;/a&gt;
IRC channel.&lt;/p&gt;

&lt;p&gt;The next step for Cura in Debian is to update the cura package to
version 3.0.3 and then update the entire set of packages to version
3.1.0 which showed up the last few days.&lt;/p&gt; </description> 
	<pubDate>Sun, 17 Dec 2017 06:00:00 +0000</pubDate>

</item> 
<item>
	<title>Steve Kemp: IoT radio: Still in-progress ..</title>
	<guid>https://blog.steve.fi/iot_radio__still_in_progress___.html</guid>
	<link>https://blog.steve.fi/iot_radio__still_in_progress___.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;So &lt;a href=&quot;https://blog.steve.fi/started_work_on_an_internet_of_things_radio.html&quot;&gt;back in September&lt;/a&gt; I was talking about building a IoT Radio, and after that I switched to talking about &lt;a href=&quot;https://blog.steve.fi/tracking_aircraft_in_real_time__via_software_defined_radio.html&quot;&gt;tracking aircraft&lt;/a&gt; via software-defined radio.  Perhaps time for a followup.&lt;/p&gt;

&lt;p&gt;So my initial attempt at a IoT radio was designed with RDA5807M module.  Frustratingly the damn thing was too small to solder easily!  Once I did get it working though I found that either the specs lied to me, or I&#39;d misunderstood them:  It wouldn&#39;t drive headphones, and performance was poor.  (Though amusingly the first time I got it working I managed to tune to Helsinki&#39;s rock-station, and the first thing I heard was &lt;a href=&quot;https://www.youtube.com/watch?v=Rr8ljRgcJNM&quot;&gt;Rammstein&#39;s Amerika&lt;/a&gt;.)&lt;/p&gt;

&lt;p&gt;I made another attempt with an Si4703-based &quot;evaluation board&quot;.  This was a board which had most of the stuff wired in, so all you had to do was connect an MCU to it, and do the necessary software dancing.  There was a headphone-socket for output, and no need to fiddle with the chip itself, it was all pretty neat.&lt;/p&gt;

&lt;p&gt;Unfortunately the evaluation board was perfect for basic use, but not at all suitable for real use.  The board did successfully output audio to a pair of headphones, but unfortunately it &lt;em&gt;required&lt;/em&gt; the use of headphones, as the cable would be treated as an antenna.  As soon as  I fed the output of the headphone-jack to an op-amp to drive some speakers I was beset with the kind of noise that makes old people reminisce about how music was better back in their day.&lt;/p&gt;

&lt;p&gt;So I&#39;m now up to round 3.  I have a TEA5767-based project in the works, which should hopefully resolve my problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;There are explicit output and aerial connections.&lt;/li&gt;
&lt;li&gt;I know I&#39;ll need an amplifier.&lt;/li&gt;
&lt;li&gt;The hardware is easy to control via arduino/esp8266 MCUs.
&lt;ul&gt;
&lt;li&gt;Numerous well-documented projects exist using this chip.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The only downside I can see is that I have to use the op-amp for volume control too - the TEA5767-chip allows you to mute/unmute via software but &lt;em&gt;doesn&#39;t&lt;/em&gt; allow you to set the volume.  Probably for the best.&lt;/p&gt;

&lt;p&gt;In unrelated news I&#39;ve got some e-paper which is ESP8266/arduino controlled.  I have no killer-app for it, but it&#39;s pretty great.  I should write that up sometime.&lt;/p&gt; </description> 
	<pubDate>Sat, 16 Dec 2017 22:00:00 +0000</pubDate>

</item> 
<item>
	<title>Dirk Eddelbuettel: drat 0.1.4</title>
	<guid>http://dirk.eddelbuettel.com/blog/2017/12/16#drat_0.1.4</guid>
	<link>http://dirk.eddelbuettel.com/blog/2017/12/16#drat_0.1.4</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/dirk.png&quot; width=&quot;65&quot; height=&quot;90&quot; alt=&quot;&quot; align=&quot;right&quot; style=&quot;float: right;&quot;&gt;  &lt;p&gt;&lt;img alt=&quot;drat user&quot; src=&quot;http://i.imgur.com/dXKsSSK.jpg&quot; style=&quot;float: left; margin: 12px 24px 12px 12px;&quot; width=&quot;320&quot; /&gt;&lt;/p&gt;
&lt;p&gt;A new version of &lt;a href=&quot;http://dirk.eddelbuettel.com/code/drat.html&quot;&gt;drat&lt;/a&gt; just arrived on &lt;a href=&quot;https://cran.r-project.org&quot;&gt;CRAN&lt;/a&gt; as another no-human-can-delay-this automatic upgrade directly from the CRAN prechecks (though I did need a manual reminder from Uwe to remove a now stale drat repo URL -- bad &lt;span class=&quot;citation&quot;&gt;@hrbrmstr&lt;/span&gt; -- from the README in a first attempt).&lt;/p&gt;
&lt;p&gt;This release is mostly the work of &lt;a href=&quot;https://github.com/nfultz&quot;&gt;Neal Fultz&lt;/a&gt; who kindly sent me two squeaky-clean pull requests addressing two open issue tickets. As &lt;a href=&quot;http://dirk.eddelbuettel.com/code/drat.html&quot;&gt;drat&lt;/a&gt; is reasonably small and simple, that was enough to motivate a quick release. I also ensured that &lt;code&gt;PACKAGES.rds&lt;/code&gt; will always if committed along (if we&#39;re in commit mode), which is a follow-up to an initial change from 0.1.3 in September.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://dirk.eddelbuettel.com/code/drat.html&quot;&gt;drat&lt;/a&gt; stands for &lt;em&gt;drat R Archive Template&lt;/em&gt;, and helps with easy-to-create and easy-to-use &lt;em&gt;repositories&lt;/em&gt; for R packages. Since its inception in early 2015 it has found reasonably widespread adoption among R users &lt;em&gt;because repositories with marked releases is the better way&lt;/em&gt; to distribute code.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;NEWS&lt;/code&gt; file summarises the release as follows:&lt;/p&gt;
&lt;blockquote&gt;
&lt;h4 id=&quot;changes-in-drat-version-0.1.4-2017-12-16&quot;&gt;Changes in drat version 0.1.4 (2017-12-16)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Changes in drat functionality&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Binaries for macOS are now split by R version into two different directories (Neal Futz in &lt;a href=&quot;https://github.com/eddelbuettel/drat/pull/67&quot;&gt;#67&lt;/a&gt; addring &lt;a href=&quot;https://github.com/eddelbuettel/drat/issues/64&quot;&gt;#64&lt;/a&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The target branch can now be set via a global option (Neal Futz in &lt;a href=&quot;https://github.com/eddelbuettel/drat/pull/68&quot;&gt;#68&lt;/a&gt; addressing &lt;a href=&quot;https://github.com/eddelbuettel/drat/issues/61&quot;&gt;#61&lt;/a&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In commit mode, add file &lt;code&gt;PACKAGES.rds&lt;/code&gt; unconditionally.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Changes in drat documentation&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Updated &#39;README.md&#39; removing another stale example URL&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;Courtesy of &lt;a href=&quot;http://dirk.eddelbuettel.com/cranberries/&quot;&gt;CRANberries&lt;/a&gt;, there is a comparison to &lt;a href=&quot;http://dirk.eddelbuettel.com/cranberries/2017/12/16#drat_0.1.4&quot;&gt;the previous release&lt;/a&gt;. More detailed information is on the &lt;a href=&quot;http://dirk.eddelbuettel.com/code/drat.html&quot;&gt;drat&lt;/a&gt; page.&lt;/p&gt;
&lt;p style=&quot;font-size: 80%; font-style: italic;&quot;&gt;
This post by &lt;a href=&quot;http://dirk.eddelbuettel.com&quot;&gt;Dirk Eddelbuettel&lt;/a&gt; originated on his &lt;a href=&quot;http://dirk.eddelbuettel.com/blog/&quot;&gt;Thinking inside the box&lt;/a&gt; blog. Please report excessive re-aggregation in third-party for-profit settings.
&lt;/p&gt;&lt;p&gt;&lt;/p&gt; </description> 
	<pubDate>Sat, 16 Dec 2017 17:26:00 +0000</pubDate>

</item> 
<item>
	<title>Daniel Lange: IMAPFilter 2.6.11-1 backport for Debian Jessie AMD64 available</title>
	<guid>https://daniel-lange.com/archives/139-guid.html</guid>
	<link>https://daniel-lange.com/archives/139-IMAPFilter-2.6.11-1-backport-for-Debian-Jessie-AMD64-available.html</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/DLange.png&quot; width=&quot;81&quot; height=&quot;85&quot; alt=&quot;&quot; align=&quot;right&quot; style=&quot;float: right;&quot;&gt;  &lt;p&gt;One of the perks you get as a Debian Developer is a @debian.org email address. And because Debian is old and the Internet used to be a friendly place this email address is plastered all over the Internet. So you get email spam, a lot of spam.&lt;/p&gt;

&lt;p&gt;I&#39;m using a combination of server and client site filtering to keep spam at bay. Unfortunately the &lt;a href=&quot;https://github.com/lefcha/imapfilter&quot; title=&quot;IMAPFilter github page&quot;&gt;IMAPFilter&lt;/a&gt; version in Debian Jessie doesn&#39;t even support &quot;dry run&quot; (-n) which is not so cool when developing complex filter rules. So I backported the latest (sid) version and agreed with &lt;a href=&quot;http://sylvestre.ledru.info/blog/&quot; title=&quot;Sylvestre&#39;s blog&quot;&gt;Sylvestre Ledru&lt;/a&gt;, one of its maintainers, to share it here and see whether making an official backport is worth it. It&#39;s a straight recompile so no magic and no &lt;a href=&quot;https://packages.debian.org/sid/imapfilter&quot; title=&quot;Debian package site for IMAPFilter&quot;&gt;source code&lt;/a&gt; or &lt;a href=&quot;https://anonscm.debian.org/cgit/collab-maint/imapfilter.git/tree/&quot; title=&quot;Debian packaging for IMAPFilter&quot;&gt;packaging&lt;/a&gt; changes required.&lt;/p&gt;

&lt;p&gt;Get it while its hot:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://daniel-lange.com/software/imapfilter_2.6.11-1~bpo8+1_amd64.deb&quot; title=&quot;download for AMD64: 61kB&quot;&gt;imapfilter_2.6.11-1~bpo8+1_amd64.deb (IMAPFilter Jessie backport)&lt;/a&gt;&lt;br /&gt;
SHA1: bedb9c39e576a58acaf41395e667c84a1b400776&lt;/p&gt;

&lt;p&gt;Clever LUA snippets for &lt;tt&gt;~/.imapfilter/config.lua&lt;/tt&gt; appreciated.&lt;/p&gt; </description> 
	<pubDate>Sat, 16 Dec 2017 14:59:22 +0000</pubDate>
  <author>nospam@example.com (Daniel Lange)</author>  
</item> 
<item>
	<title>Dirk Eddelbuettel: digest 0.6.13</title>
	<guid>http://dirk.eddelbuettel.com/blog/2017/12/16#digest_0.6.13</guid>
	<link>http://dirk.eddelbuettel.com/blog/2017/12/16#digest_0.6.13</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/dirk.png&quot; width=&quot;65&quot; height=&quot;90&quot; alt=&quot;&quot; align=&quot;right&quot; style=&quot;float: right;&quot;&gt;  &lt;p&gt;A small maintenance release, version 0.6.13, of the &lt;a href=&quot;http://dirk.eddelbuettel.com/code/digest.html&quot;&gt;digest&lt;/a&gt; package arrived on &lt;a href=&quot;http://cran.r-project.org&quot;&gt;CRAN&lt;/a&gt; and in &lt;a href=&quot;http://www.debian.org&quot;&gt;Debian&lt;/a&gt; yesterday.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://dirk.eddelbuettel.com/code/digest.html&quot;&gt;digest&lt;/a&gt; creates hash digests of arbitrary R objects (using the &#39;md5&#39;, &#39;sha-1&#39;, &#39;sha-256&#39;, &#39;crc32&#39;, &#39;xxhash&#39; and &#39;murmurhash&#39; algorithms) permitting easy comparison of R language objects.&lt;/p&gt;
&lt;p&gt;This release accomodates a request by Luke and Tomas to make the &lt;code&gt;version&lt;/code&gt; argument of &lt;code&gt;serialize()&lt;/code&gt; an argument to &lt;code&gt;digest()&lt;/code&gt; too, which was easy enough to accomodate. The value &lt;code&gt;2L&lt;/code&gt; is the current default (and for now only permitted value). The ALTREP changes in R 3.5 will bring us a new, and more powerful, format with value &lt;code&gt;3L&lt;/code&gt;. Changes can be set in each call, or globally via &lt;code&gt;options()&lt;/code&gt;. Other than we just clarified one aspect of &lt;code&gt;raw&lt;/code&gt; vector usage in the manual page.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://dirk.eddelbuettel.com/cranberries/index.html&quot;&gt;CRANberries&lt;/a&gt; provides the usual summary of changes to the &lt;a href=&quot;http://dirk.eddelbuettel.com/cranberries/2017/01/15#digest_0.6.13&quot;&gt;previous version&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For questions or comments use the &lt;a href=&quot;https://github.com/eddelbuettel/digest/issues&quot;&gt;issue tracker&lt;/a&gt; off the &lt;a href=&quot;https://github.com/eddelbuettel/digest&quot;&gt;GitHub repo&lt;/a&gt;.&lt;/p&gt;
&lt;p style=&quot;font-size: 80%; font-style: italic;&quot;&gt;
This post by &lt;a href=&quot;http://dirk.eddelbuettel.com&quot;&gt;Dirk Eddelbuettel&lt;/a&gt; originated on his &lt;a href=&quot;http://dirk.eddelbuettel.com/blog/&quot;&gt;Thinking inside the box&lt;/a&gt; blog. Please report excessive re-aggregation in third-party for-profit settings.
&lt;/p&gt;&lt;p&gt;&lt;/p&gt; </description> 
	<pubDate>Sat, 16 Dec 2017 12:43:00 +0000</pubDate>

</item> 
<item>
	<title>Michael Prokop: Usage of Ansible for Continuous Configuration Management</title>
	<guid>http://michael-prokop.at/blog/?p=4349</guid>
	<link>https://michael-prokop.at/blog/2017/12/16/usage-of-ansible-for-continuous-configuration-management/</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/mikap.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;It all started with &lt;a href=&quot;https://twitter.com/mikagrml/status/941304704004448257&quot;&gt;a tweet of mine&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/mikagrml/status/941304704004448257&quot;&gt;&lt;img alt=&quot;Screenshot of https://twitter.com/mikagrml/status/941304704004448257&quot; src=&quot;https://michael-prokop.at/blog/img/tweet_ansible_cfgmgmt.png&quot; style=&quot;border: 0px;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I received quite some feedback since then and I’d like to iterate on this.&lt;/p&gt;
&lt;p&gt;I’m a &lt;a href=&quot;http://puppetlabs.com/&quot;&gt;puppet&lt;/a&gt; user since ~2008 and since ~2015 also &lt;a href=&quot;https://www.ansible.com/&quot;&gt;ansible&lt;/a&gt; is part of my sysadmin toolbox. Recently certain ansible setups I’m involved in grew faster than I’d like to see, both in terms of managed hosts/services as well as the size of the ansible playbooks. I like ansible for ad hoc tasks, like `&lt;code&gt;ansible -i ansible_hosts all -m shell -a &#39;lsb_release -rs&#39;&lt;/code&gt;` to get an overview what distribution release systems are running, requiring only a working SSH connection and python on the client systems. &lt;a href=&quot;https://github.com/fboender/ansible-cmdb&quot;&gt;ansible-cmdb&lt;/a&gt; provides a nice and simple to use ad hoc host overview without much effort and overhead. I even have &lt;em&gt;puppetdb_to_ansible&lt;/em&gt; scripts to query a puppetdb via its API and generate host lists for usage with ansible on-the-fly. Ansible certainly has its use case for e.g. bootstrapping systems, orchestration and handling deployments.&lt;/p&gt;
&lt;p&gt;Ansible has an easier learning curve than e.g. puppet and this might seem to be the underlying reason for its usage for tasks it’s not really good at. To be more precise: &lt;abbr title=&quot;In My Opinion&quot;&gt;IMO&lt;/abbr&gt; ansible is a bad choice for &lt;em&gt;continuous configuration management&lt;/em&gt;. Some observations, though &lt;abbr title=&quot;Your mileage may vary&quot;&gt;YMMV&lt;/abbr&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ansible’s &lt;a href=&quot;https://docs.ansible.com/ansible/2.4/vault.html&quot;&gt;vaults&lt;/a&gt; are no real replacement for something like puppet’s &lt;a href=&quot;https://puppet.com/docs/puppet/5.3/hiera_intro.html&quot;&gt;hiera&lt;/a&gt; (though &lt;a href=&quot;http://jerakia.io/&quot;&gt;Jerakia&lt;/a&gt; might mitigate at least the pain regarding data lookups)&lt;/li&gt;
&lt;li&gt;ansible runs are slow, and get slower with every single task you add&lt;/li&gt;
&lt;li&gt;having a push model with ansible instead of pull (like puppet’s agent mode) implies you don’t get/force regular runs all the time, and your ansible playbooks might just not work anymore once you (have to) touch them again&lt;/li&gt;
&lt;li&gt;the lack of a &lt;abbr title=&quot;Domain Specific Language&quot;&gt;DSL&lt;/abbr&gt; results in e.g. &lt;a href=&quot;http://docs.ansible.com/ansible/latest/list_of_packaging_modules.html&quot;&gt;each single package management having its own module&lt;/a&gt; (apt, dnf, yum,….), having too many ways how to do something, resulting more often than not in something I’d tend to call spaghetti code&lt;/li&gt;
&lt;li&gt;the lack of community modules comparable to &lt;a href=&quot;https://forge.puppet.com/&quot;&gt;Puppet’s Forge&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;the lack of a central DB (like puppetdb) means you can’t do something like with &lt;a href=&quot;https://puppet.com/docs/puppet/5.3/lang_exported.html&quot;&gt;puppet’s exported resources&lt;/a&gt;, which is useful e.g. for central ssh hostkey handling, monitoring checks,…&lt;/li&gt;
&lt;li&gt;the lack of a resources &lt;a href=&quot;https://en.wikipedia.org/wiki/Directed_acyclic_graph&quot;&gt;&lt;abbr title=&quot;Directed acyclic graph&quot;&gt;DAG&lt;/abbr&gt;&lt;/a&gt; in ansible might look like a welcome simplification in the beginning, but its absence is becoming a problem when complexity and requirements grow (example: delete all unmanaged files from a directory)&lt;/li&gt;
&lt;li&gt;it’s not easy at all to have ansible run automated and remotely on a couple of hundred hosts without stumbling over anything — &lt;a href=&quot;https://twitter.com/rbo_ne/status/941591770621673473&quot;&gt;Rudolph Bott&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;as complexity grows, the limitations of Ansible’s (lack of a) language become more maddening — &lt;a href=&quot;https://twitter.com/felis_rex/status/941600342801879041&quot;&gt;Felix Frank&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let me be clear: I’m in no way saying that puppet doesn’t have its problems (side-rant: it took way too long until Debian/stretch was properly supported by puppets’ &lt;abbr title=&quot;All In One&quot;&gt;AIO&lt;/abbr&gt; packages). I had and still have all my ups and downs with it, though in 2017 and especially since puppet v5 it works fine enough for all &lt;em&gt;my&lt;/em&gt; use cases at a diverse set of customers. Whenever I can choose between puppet and ansible for &lt;em&gt;continuous configuration management&lt;/em&gt; (without having any host specific restrictions like unsupported architectures, memory limitations,… that puppet wouldn’t properly support) I prefer puppet. Ansible can and does exist as a nice addition next to puppet for me, even if &lt;a href=&quot;https://puppet.com/docs/mcollective/current/index.html&quot;&gt;MCollective&lt;/a&gt;/&lt;a href=&quot;https://choria.io/&quot;&gt;Choria&lt;/a&gt; is available. Ansible has its use cases, just not for &lt;em&gt;continuous configuration management&lt;/em&gt; for me.&lt;/p&gt;
&lt;p&gt;The hardest part is to leave some tool behind once you reached the end of its scale. Once you feel like a tool takes more effort than it is worth you should take a step back and re-evaluate your choices. And &lt;a href=&quot;https://twitter.com/felis_rex/status/941697170163621893&quot;&gt;quoting Felix Frank&lt;/a&gt;: &lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;OTOH, if you bend either tool towards a common goal, you’re not playing to its respective strengths.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Thanks: Michael Renner and Christian Hofstaedtler for initial proof reading and feedback&lt;/p&gt; </description> 
	<pubDate>Fri, 15 Dec 2017 22:29:54 +0000</pubDate>

</item> 
<item>
	<title>Reproducible builds folks: Reproducible Builds: Weekly report #137</title>
	<guid>https://reproducible.alioth.debian.org/blog/posts/137/</guid>
	<link>https://reproducible.alioth.debian.org/blog/posts/137/</link>
     <description>  &lt;p&gt;Here&#39;s what happened in the &lt;a href=&quot;https://reproducible-builds.org&quot;&gt;Reproducible
Builds&lt;/a&gt; effort between Sunday December 3 and
Saturday December 9 2017:&lt;/p&gt;

&lt;h2&gt;Documentation update&lt;/h2&gt;

&lt;p&gt;There was more discussion on &lt;a href=&quot;https://lists.reproducible-builds.org/pipermail/rb-general/2017-December/000741.html&quot;&gt;different logos being
proposed&lt;/a&gt;
for the project.&lt;/p&gt;

&lt;h2&gt;Reproducible work in other projects&lt;/h2&gt;

&lt;p&gt;Cyril Brulebois wrote about Tails&#39; &lt;a href=&quot;https://debamax.com/blog/2017/11/20/tails-early-work-on-reproducibility/&quot;&gt;work on
reproducibility&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Gabriel Scherer submitted a &lt;a href=&quot;https://github.com/ocaml/ocaml/pull/1515&quot;&gt;pull request to the OCaml
compiler&lt;/a&gt; to honour the
&lt;code&gt;BUILD_PATH_PREFIX_MAP&lt;/code&gt; environment variable.&lt;/p&gt;

&lt;h2&gt;Packages reviewed and fixed&lt;/h2&gt;

&lt;p&gt;Patches filed upstream:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bernhard M. Wiedemann:

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/python/cpython/pull/2263&quot;&gt;cpython tar/zip&lt;/a&gt; - file ordering, sort file lists&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Eli Schwartz:

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.launchpad.net/calibre/+bug/1736313&quot;&gt;calibre:&lt;/a&gt; - hash table ordering&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Foxboron

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/justwatchcom/gopass/pull/495&quot;&gt;gopass:&lt;/a&gt; - use &lt;code&gt;SOURCE_DATE_EPOCH&lt;/code&gt; in Makefile&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Jelle

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/php/php-src/pull/2965&quot;&gt;PHP:&lt;/a&gt; - use &lt;code&gt;SOURCE_DATE_EPOCH&lt;/code&gt; for Build Date&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Chris Lamb:

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/PyCQA/pylint/pull/1761&quot;&gt;pylint&lt;/a&gt; - file ordering, nondeterminstic data structure&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/trendmicro/tlsh/pull/51#issuecomment-349206496&quot;&gt;tlsh&lt;/a&gt; - clarify error message (via diffoscope development)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Alexander &quot;lynxis&quot; Couzens:

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/eclipse/mosquitto/pull/651&quot;&gt;mosquitto&lt;/a&gt; - remove build timestamp&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/warmcat/libwebsockets/pull/1122&quot;&gt;libwebsockets&lt;/a&gt; - remove build user/hostname&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/qca/open-plc-utils/pull/114&quot;&gt;open-plc-utils&lt;/a&gt; - remove build timestamp&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Patches filed in Debian:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chris Lamb:

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/883376&quot;&gt;#883376&lt;/a&gt; filed against &lt;a href=&quot;https://tracker.debian.org/pkg/p4vasp&quot;&gt;p4vasp&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/883728&quot;&gt;#883728&lt;/a&gt; filed against &lt;a href=&quot;https://tracker.debian.org/pkg/designate&quot;&gt;designate&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/883913&quot;&gt;#883913&lt;/a&gt; filed against &lt;a href=&quot;https://tracker.debian.org/pkg/pylint&quot;&gt;pylint&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.debian.org/884047&quot;&gt;#884047&lt;/a&gt; filed against &lt;a href=&quot;https://tracker.debian.org/pkg/bibledit&quot;&gt;bibledit&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Patches filed in OpenSUSE:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bernhard M. Wiedemann:

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/openSUSE/build-compare/pull/19&quot;&gt;build-compare&lt;/a&gt; (merged) - handle .egg as .zip&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://build.opensuse.org/request/show/547886&quot;&gt;neovim&lt;/a&gt; (merged) - hostname, username&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://build.opensuse.org/request/show/548200&quot;&gt;perl&lt;/a&gt; (merged) - date, hostname, username&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://build.opensuse.org/request/show/548518&quot;&gt;sendmail&lt;/a&gt; - date, hostname, username&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Patches filed in OpenWRT:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Alexander &quot;lynxis&quot; Couzens:

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/openwrt/packages/pull/5216&quot;&gt;tcpproxy&lt;/a&gt; - remove build timestamp and hostname&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/openwrt/packages/pull/5217&quot;&gt;libwebsockets&lt;/a&gt; - remove build hostname&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/openwrt/packages/pull/5218&quot;&gt;lua-rs232&lt;/a&gt; - remove build timestamp&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/openwrt/packages/pull/5227&quot;&gt;wavemon&lt;/a&gt; - use &lt;code&gt;SOURCE_DATE_EPOCH&lt;/code&gt; as &lt;code&gt;BUILD_DATE&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/openwrt/telephony/pull/223&quot;&gt;asterisk&lt;/a&gt; - remove build timestamp&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/openwrt/telephony/pull/221&quot;&gt;sipp&lt;/a&gt; - remove build timestamp&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/openwrt/telephony/pull/220&quot;&gt;restund&lt;/a&gt; - remove build timestamp&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/openwrt/packages/pull/5234&quot;&gt;zabbix&lt;/a&gt; - remove build timestamp&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/openwrt/packages/pull/5235&quot;&gt;uanytun&lt;/a&gt; - remove build timestamp and hostname&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/openwrt/packages/pull/5236&quot;&gt;perl&lt;/a&gt; - remove build timestamp&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/openwrt/packages/pull/5237&quot;&gt;php7&lt;/a&gt; - remove build timestamp&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/openwrt/packages/pull/5238&quot;&gt;lcdproc&lt;/a&gt; - remove build timestamp&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/openwrt/packages/pull/5241&quot;&gt;mosquitto&lt;/a&gt; - remove build timestamp&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/openwrt/telephony/pull/224&quot;&gt;kamailio-5.x&lt;/a&gt; - remove build timestamp&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;Reviews of unreproducible packages&lt;/h2&gt;

&lt;p&gt;17 package reviews have been added, 31 have been updated and 43 have been
removed in this week, adding to our knowledge about &lt;a href=&quot;https://tests.reproducible-builds.org/debian/index_issues.html&quot;&gt;identified
issues&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Weekly QA work&lt;/h2&gt;

&lt;p&gt;During our reproducibility testing, FTBFS bugs have been detected and reported by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Adrian Bunk (13)&lt;/li&gt;
&lt;li&gt;Andreas Beckmann (2)&lt;/li&gt;
&lt;li&gt;Emilio Pozuelo Monfort (3)&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;reprotest development&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Santiago Torres:

&lt;ul&gt;
&lt;li&gt;Use &lt;code&gt;uname -m&lt;/code&gt; instead of &lt;code&gt;arch&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;trydiffoscope development&lt;/h2&gt;

&lt;p&gt;Version &lt;a href=&quot;https://tracker.debian.org/news/892026&quot;&gt;66&lt;/a&gt; was uploaded to unstable by Chris Lamb.
It included &lt;a href=&quot;https://anonscm.debian.org/git/reproducible/trydiffoscope.git/log/?h=66&quot;&gt;contributions&lt;/a&gt;
already covered by posts of the previous weeks as well as new ones from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chris Lamb:

&lt;ul&gt;
&lt;li&gt;Parse dpkg-parsechangelog instead of hard-coding version&lt;/li&gt;
&lt;li&gt;Bump Standards-Version to 4.1.2&lt;/li&gt;
&lt;li&gt;flake8 formatting&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;reproducible-website development&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Holger Levsen:

&lt;ul&gt;
&lt;li&gt;Add documentation from our &lt;a href=&quot;https://reproducible-builds.org/events/berlin2017/&quot;&gt;third
summit&lt;/a&gt;, as provided
by Beatrice Martini from &lt;a href=&quot;https://aspirationtech.org/&quot;&gt;Aspiration Tech&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;tests.reproducible-builds.org&lt;/h2&gt;

&lt;p&gt;reproducible Arch Linux:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Holger Levsen:

&lt;ul&gt;
&lt;li&gt;Scheduler:

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/qa/jenkins.debian.net.git/commit/?id=c6ce6a01&quot;&gt;Randomize the scheduling of packgaes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/qa/jenkins.debian.net.git/commit/?id=5e44c991&quot;&gt;Schedule newer packages so they are built sooner&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/qa/jenkins.debian.net.git/commit/?id=a75bf50a&quot;&gt;Schedule 250 old packages if nothing else to do&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/qa/jenkins.debian.net.git/commit/?id=5a74b822&quot;&gt;Don&#39;t schedule packages that blacklisted&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bug fixes:

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/qa/jenkins.debian.net.git/commit/?id=b128725f&quot;&gt;Don&#39;t fail the build if &lt;code&gt;PKGBUILD&lt;/code&gt; cannot be sourced&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/qa/jenkins.debian.net.git/commit/?id=100e1b44&quot;&gt;Also detect &lt;code&gt;==&amp;gt; ERROR: Failure while creating working copy&lt;/code&gt; as a download failure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/qa/jenkins.debian.net.git/commit/?id=f049c47b&quot;&gt;Dont use &lt;code&gt;sudo&lt;/code&gt; if &lt;code&gt;-u root&lt;/code&gt; works&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/qa/jenkins.debian.net.git/commit/?id=cb3a5085&quot;&gt;Cleanup files before the next build&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Alerting:

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/qa/jenkins.debian.net.git/commit/?id=4a373f6c&quot;&gt;Conditionally shorten IRC messages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/qa/jenkins.debian.net.git/commit/?id=62fb1f4a&quot;&gt;Notify IRC about new daily graphs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Reporting/logging:

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/qa/jenkins.debian.net.git/commit/?id=cf8d1e3b&quot;&gt;Log which old packages have been rescheduled&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/qa/jenkins.debian.net.git/commit/?id=ba1c68b8&quot;&gt;Output number of currently scheduled packages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/qa/jenkins.debian.net.git/commit/?id=5cea6adc&quot;&gt;Show blacklisted packages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/qa/jenkins.debian.net.git/commit/?id=7e7e05c0&quot;&gt;Correctly create pkg.html for blacklisted packages we dont know anything about&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Misc:

&lt;ul&gt;
&lt;li&gt;Blacklist management: &lt;a href=&quot;https://anonscm.debian.org/git/qa/jenkins.debian.net.git/commit/?id=16f54f61&quot;&gt;Refactoring, blacklist core/gnutls&lt;/a&gt; and blacklist &lt;a href=&quot;https://anonscm.debian.org/git/qa/jenkins.debian.net.git/commit/?id=d69dcea2&quot;&gt;ltrace&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/qa/jenkins.debian.net.git/commit/?id=ba7a2bf0&quot;&gt;Add pointer to a patch we want to see merged&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;anthraxx:

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/qa/jenkins.debian.net.git/commit/?id=34421333&quot;&gt;Remove Pacman lock in local session&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/qa/jenkins.debian.net.git/commit/?id=92460fde&quot;&gt;Skip GPG checks for future builds re. expired keys&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/qa/jenkins.debian.net.git/commit/?id=dc83c484&quot;&gt;Remove overly verbose debugging&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Eli Schwartz:

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/qa/jenkins.debian.net.git/commit/?id=e2eb0473&quot;&gt;Add variation for /bin/sh&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/qa/jenkins.debian.net.git/commit/?id=95000432&quot;&gt;Don&#39;t install multilib-devel members manually&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;reproducible F-Droid:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hans-Christoph Steiner:

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://anonscm.debian.org/git/qa/jenkins.debian.net.git/commit/?id=6dbb4137&quot;&gt;Add all supported VCSs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;Misc.&lt;/h2&gt;

&lt;p&gt;This week&#39;s edition was written by Ximin Luo, Alexander Couzens, Holger Levsen,
Chris Lamb, Bernhard M. Wiedemann and Santiago Torres &amp;amp; reviewed by a bunch of
Reproducible Builds folks on IRC &amp;amp; the mailing lists.&lt;/p&gt; </description> 
	<pubDate>Fri, 15 Dec 2017 18:49:27 +0000</pubDate>

</item> 
<item>
	<title>Rapha&amp;#235;l Hertzog: Freexian’s report about Debian Long Term Support, November 2017</title>
	<guid>https://raphaelhertzog.com/?p=3658</guid>
	<link>https://raphaelhertzog.com/2017/12/15/freexians-report-about-debian-long-term-support-november-2017/</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 alt=&quot;A Debian LTS logo&quot; class=&quot;alignright size-full wp-image-3226&quot; height=&quot;128&quot; src=&quot;https://raphaelhertzog.com/files/2015/03/Debian-LTS-2-small.png&quot; width=&quot;128&quot; /&gt;Like &lt;a href=&quot;https://raphaelhertzog.com/tag/Freexian+LTS/&quot;&gt;each month&lt;/a&gt;, here comes a report about the work of &lt;a href=&quot;http://www.freexian.com/services/debian-lts.html&quot;&gt;paid contributors&lt;/a&gt; to &lt;a href=&quot;https://wiki.debian.org/LTS&quot;&gt;Debian LTS&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Individual reports&lt;/h3&gt;
&lt;p&gt;In October, about 144 work hours have been dispatched among 12 paid contributors. Their reports are available:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://anarc.at/blog/2017-11-30-free-software-activities-november-2017/&quot;&gt;Antoine Beaupré&lt;/a&gt; did 8.5h (out of 13h allocated + 3.75h remaining, thus keeping 8.25h for December).&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.decadent.org.uk/ben/blog/debian-lts-work-november-2017.html&quot;&gt;Ben Hutchings&lt;/a&gt; did 17 hours (out of 13h allocated + 4 extra hours).&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://lists.debian.org/debian-lts/2017/11/msg00087.html&quot;&gt;Brian May&lt;/a&gt; did 10 hours.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://chris-lamb.co.uk/posts/free-software-activities-in-november-2017&quot;&gt;Chris Lamb&lt;/a&gt; did 13 hours.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://lists.debian.org/debian-lts/2017/12/msg00044.html&quot;&gt;Emilio Pozuelo Monfort&lt;/a&gt; did 14.5 hours (out of 13 hours allocated + 15.25 hours remaining, thus keeping 13.75 hours for December).&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://lists.debian.org/debian-lts/2017/12/msg00016.html&quot;&gt;Guido Günther&lt;/a&gt; did 14 hours (out of 11h allocated + 5.5 extra hours, thus keeping 2.5h for December).&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://lists.debian.org/debian-lts/2017/12/msg00006.html&quot;&gt;Hugo Lefeuvre&lt;/a&gt; did 13h.&lt;/li&gt;
&lt;li&gt;Lucas Kanashiro did not request any work hours, but he had 3 hours left. He did not publish any report yet.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://gambaru.de/blog/2017/12/06/my-free-software-activities-in-november-2017/&quot;&gt;Markus Koschany&lt;/a&gt; did 14.75 hours (out of 13 allocated + 1.75 extra hours).&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://inguza.com/report/debian-long-term-support-work-2017-november&quot;&gt;Ola Lundqvist&lt;/a&gt; did 7h.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://raphaelhertzog.com/2017/12/03/my-free-software-activities-in-november-2017/&quot;&gt;Raphaël Hertzog&lt;/a&gt; did 10 hours (out of 12h allocated, thus keeping 2 extra hours for December).&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://lists.debian.org/debian-lts/2017/12/msg00003.html&quot;&gt;Roberto C. Sanchez&lt;/a&gt; did 32.5 hours (out of 13 hours allocated + 24.50 hours remaining, thus keeping 5 extra hours for November).&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.alteholz.eu/2017/12/my-debian-activities-in-november-2017/&quot;&gt;Thorsten Alteholz&lt;/a&gt; did 13 hours.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;About external support partners&lt;/h3&gt;
&lt;p&gt;You might notice that there is sometimes a significant gap between the number of distributed work hours each month and the number of sponsored hours reported in the “Evolution of the situation” section. This is mainly due to some work hours that are “externalized” (but also because some sponsors pay too late). For instance, since we don’t have Xen experts among our Debian contributors, we rely on &lt;a href=&quot;https://credativ.com&quot;&gt;credativ&lt;/a&gt; to do the Xen security work for us. And when we get an invoice, we convert that to a number of hours that we drop from the available hours in the following month. And in the last months, Xen has been a significant drain to our resources: 35 work hours made in September (invoiced in early October and taken off from the November hours detailed above), 6.25 hours in October, 21.5 hours in November. We also have a similar partnership with Diego Bierrun to help us maintain libav, but here the number of hours tend to be very low.&lt;/p&gt;
&lt;p&gt;In both cases, the work done by those paid partners is made freely available for others under the original license: credativ maintains a &lt;a href=&quot;https://github.com/credativ/xen-lts/&quot;&gt;Xen 4.1 branch on GitHub&lt;/a&gt;, Diego commits his work on the &lt;a href=&quot;https://git.libav.org/?p=libav.git;a=shortlog;h=refs/heads/release/0.8&quot;&gt;release/0.8 branch in the official git repository&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Evolution of the situation&lt;/h3&gt;
&lt;p&gt;The &lt;a href=&quot;https://www.freexian.com/services/debian-lts.html&quot;&gt;number of sponsored hours&lt;/a&gt; did not change at 183 hours per month. It would be nice if we could continue to find new sponsors as the amount of work seems to be slowly growing too.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://security-tracker.debian.org/tracker/status/release/oldstable&quot;&gt;security tracker&lt;/a&gt; currently lists 55 packages with a known CVE and the &lt;a href=&quot;https://anonscm.debian.org/viewvc/secure-testing/data/dla-needed.txt?view=markup&quot;&gt;dla-needed.txt file&lt;/a&gt; 35 (we’re a bit behind in CVE triaging apparently).&lt;/p&gt;
&lt;h3&gt;Thanks to our sponsors&lt;/h3&gt;
&lt;p&gt;New sponsors are in bold.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Platinum sponsors:&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.toshiba.co.jp/worldwide/index.html&quot;&gt;TOSHIBA&lt;/a&gt; (for 26 months)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com&quot;&gt;GitHub&lt;/a&gt; (for 17 months)&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Gold sponsors:&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.positive-internet.com&quot;&gt;The Positive Internet&lt;/a&gt; (for 42 months)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.blablacar.fr&quot;&gt;Blablacar&lt;/a&gt; (for 41 months)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.linode.com&quot;&gt;Linode&lt;/a&gt; (for 31 months)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.babiel.com&quot;&gt;Babiel GmbH&lt;/a&gt; (for 20 months)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.plathome.com&quot;&gt;Plat’Home&lt;/a&gt; (for 20 months)&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Silver sponsors:&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.domainnameshop.com&quot;&gt;Domeneshop AS&lt;/a&gt; (for 41 months)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.univ-lille3.fr&quot;&gt;Université Lille 3&lt;/a&gt; (for 41 months)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://trollweb.no&quot;&gt;Trollweb Solutions&lt;/a&gt; (for 39 months)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.nantesmetropole.fr/&quot;&gt;Nantes Métropole&lt;/a&gt; (for 35 months)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.dalenys.com&quot;&gt;Dalenys&lt;/a&gt; (for 32 months)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.univention.de&quot;&gt;Univention GmbH&lt;/a&gt; (for 27 months)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://portail.univ-st-etienne.fr/&quot;&gt;Université Jean Monnet de St Etienne&lt;/a&gt; (for 27 months)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.sonusnet.com&quot;&gt;Sonus Networks&lt;/a&gt; (for 21 months)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://maxcluster.de&quot;&gt;maxcluster GmbH&lt;/a&gt; (for 15 months)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.exonet.nl&quot;&gt;Exonet B.V.&lt;/a&gt; (for 11 months)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.lrz.de&quot;&gt;Leibniz Rechenzentrum&lt;/a&gt; (for 5 months)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://vente-privee.com&quot;&gt;Vente-privee.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Bronze sponsors:&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.intars.at&quot;&gt;David Ayers – IntarS Austria&lt;/a&gt; (for 42 months)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.evolix.fr&quot;&gt;Evolix&lt;/a&gt; (for 42 months)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.offensive-security.com&quot;&gt;Offensive Security&lt;/a&gt; (for 42 months)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.seznam.cz&quot;&gt;Seznam.cz, a.s.&lt;/a&gt; (for 42 months)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://freeside.biz&quot;&gt;Freeside Internet Service&lt;/a&gt; (for 41 months)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.mytux.fr&quot;&gt;MyTux&lt;/a&gt; (for 41 months)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://intevation.de&quot;&gt;Intevation GmbH&lt;/a&gt; (for 39 months)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://linuxhotel.de&quot;&gt;Linuxhotel GmbH&lt;/a&gt; (for 39 months)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://daevel.fr&quot;&gt;Daevel SARL&lt;/a&gt; (for 37 months)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://bitfolk.com&quot;&gt;Bitfolk LTD&lt;/a&gt; (for 36 months)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.megaspace.de&quot;&gt;Megaspace Internet Services GmbH&lt;/a&gt; (for 36 months)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.greenbone.net&quot;&gt;Greenbone Networks GmbH&lt;/a&gt; (for 35 months)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://numlog.fr&quot;&gt;NUMLOG&lt;/a&gt; (for 35 months)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.wingo.ch/&quot;&gt;WinGo AG&lt;/a&gt; (for 35 months)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://lheea.ec-nantes.fr&quot;&gt;Ecole Centrale de Nantes – LHEEA&lt;/a&gt; (for 31 months)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://sig-io.nl&quot;&gt;Sig-I/O&lt;/a&gt; (for 28 months)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.entrouvert.com/&quot;&gt;Entr’ouvert&lt;/a&gt; (for 26 months)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://adfinis-sygroup.ch&quot;&gt;Adfinis SyGroup AG&lt;/a&gt; (for 23 months)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.allogarage.fr&quot;&gt;GNI MEDIA&lt;/a&gt; (for 18 months)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.legi.grenoble-inp.fr&quot;&gt;Laboratoire LEGI – UMR 5519 / CNRS&lt;/a&gt; (for 18 months)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://quarantainenet.nl&quot;&gt;Quarantainenet BV&lt;/a&gt; (for 18 months)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.rhx.it&quot;&gt;RHX Srl&lt;/a&gt; (for 15 months)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://bearstech.com&quot;&gt;Bearstech&lt;/a&gt; (for 9 months)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://lihas.de&quot;&gt;LiHAS&lt;/a&gt; (for 9 months)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.people-doc.com&quot;&gt;People Doc&lt;/a&gt; (for 6 months)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.catalyst.net.nz&quot;&gt;Catalyst IT Ltd&lt;/a&gt; (for 4 months)&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p style=&quot;font-size: smaller;&quot;&gt;&lt;a href=&quot;https://raphaelhertzog.com/2017/12/15/freexians-report-about-debian-long-term-support-november-2017/#comments&quot;&gt;No comment&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; </description> 
	<pubDate>Fri, 15 Dec 2017 14:15:21 +0000</pubDate>

</item> 
<item>
	<title>Michal &amp;#268;iha&amp;#345;: Weblate 2.18</title>
	<guid>https://blog.cihar.com/archives/2017/12/15/weblate-218/?utm_source=rss2</guid>
	<link>https://blog.cihar.com/archives/2017/12/15/weblate-218/?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;&lt;a href=&quot;https://weblate.org/&quot;&gt;Weblate 2.18&lt;/a&gt; has been released today. The biggest improvement is probably &lt;a href=&quot;https://docs.weblate.org/en/latest/workflows.html&quot;&gt;reviewer based workflow&lt;/a&gt;, but there are some other enhancements as well.&lt;/p&gt;
&lt;p&gt;Full list of changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Extended contributor stats.&lt;/li&gt;
&lt;li&gt;Improved configuration of special chars virtual keyboard.&lt;/li&gt;
&lt;li&gt;Added support for DTD file format.&lt;/li&gt;
&lt;li&gt;Changed keyboard shortcuts to less likely collide with browser/system ones.&lt;/li&gt;
&lt;li&gt;Improved support for approved flag in Xliff files.&lt;/li&gt;
&lt;li&gt;Added support for not wrapping long strings in Gettext po files.&lt;/li&gt;
&lt;li&gt;Added button to copy permalink for current translation.&lt;/li&gt;
&lt;li&gt;Dropped support for Django 1.10 and added support for Django 2.0.&lt;/li&gt;
&lt;li&gt;Removed locking of translations while translating.&lt;/li&gt;
&lt;li&gt;Added support for adding new units to monolingual translations.&lt;/li&gt;
&lt;li&gt;Added support for translation workflows with dedicated reviewers.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you are upgrading from older version, please follow our &lt;a href=&quot;https://docs.weblate.org/en/latest/admin/upgrade.html&quot;&gt;upgrading instructions&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You can find more information about &lt;a href=&quot;https://weblate.org/&quot;&gt;Weblate&lt;/a&gt; on &lt;a href=&quot;https://weblate.org&quot;&gt;https://weblate.org&lt;/a&gt;, the code is hosted on &lt;a href=&quot;https://github.com/WeblateOrg/weblate&quot;&gt;Github&lt;/a&gt;. If you are curious how it looks, you can try it out on &lt;a href=&quot;http:s//demo.weblate.org/&quot;&gt;demo server&lt;/a&gt;. You can login there with &lt;code&gt;demo&lt;/code&gt; account using &lt;code&gt;demo&lt;/code&gt; password or register your own user. &lt;a href=&quot;https://weblate.org/&quot;&gt;Weblate&lt;/a&gt; is also being used on &lt;a href=&quot;https://hosted.weblate.org/&quot;&gt;https://hosted.weblate.org/&lt;/a&gt; as official translating service for phpMyAdmin, OsmAnd, Turris, FreedomBox, Weblate itself and many other projects.&lt;/p&gt;
&lt;p&gt;Should you be looking for hosting of translations for your project, I&#39;m happy to &lt;a href=&quot;https://weblate.org/hosting/&quot;&gt;host them for you&lt;/a&gt; or help with setting it up on your infrastructure.&lt;/p&gt;
&lt;p&gt;Further development of Weblate would not be possible without people &lt;a href=&quot;https://weblate.org/donate/&quot;&gt;providing donations&lt;/a&gt;, thanks to everybody who have helped so far! The &lt;a href=&quot;https://github.com/WeblateOrg/weblate/milestone/32&quot;&gt;roadmap for next release&lt;/a&gt; is just being prepared, you can influence this by expressing support for individual issues either by comments or by &lt;a href=&quot;https://www.bountysource.com/teams/weblate/issues&quot;&gt;providing bounty for them&lt;/a&gt;.&lt;/p&gt;

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

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

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

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

&lt;a href=&quot;https://blog.cihar.com/archives/weblate/&quot;&gt;Weblate&lt;/a&gt;

&lt;/p&gt; </description> 
	<pubDate>Fri, 15 Dec 2017 13:30:22 +0000</pubDate>

</item> 
<item>
	<title>Dimitri John Ledkov: What does FCC Net Neutrality repeal mean to you?</title>
	<guid>tag:blogger.com,1999:blog-347582618045055410.post-2027344606717920550</guid>
	<link>http://blog.surgut.co.uk/2017/12/what-does-fcc-net-neutrality-repeal.html</link>
     <description>  &lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot;&gt;&lt;center&gt;&lt;div dir=&quot;ltr&quot; style=&quot;background-color: #f1f1f1; border-color: black; border-radius: 30px; border: 2px solid; padding: 10px; text-align: left; width: 400px;&quot;&gt;&lt;h1&gt;Sorry, the web page you have requested is not available through your internet connection.&lt;/h1&gt;&lt;h1 style=&quot;text-align: center;&quot;&gt;&lt;div style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: normal; line-height: 18.079999923706055px; margin-bottom: 18.08px; text-align: left;&quot;&gt;We have received an order from the Courts requiring us to prevent access to this site in order to help protect against Lex Julia Majestatis infridgement.&lt;/div&gt;&lt;hr style=&quot;font-family: Arial, sans-serif; font-size: 16px; font-weight: normal; line-height: 18.079999923706055px; text-align: left;&quot; /&gt;&lt;div&gt;If you are a home broadband customer, for more information on why certain web pages are blocked, please click &lt;a href=&quot;https://www.eff.org/deeplinks/content-blocking&quot; style=&quot;color: #cc0000; text-decoration: none;&quot; target=&quot;_blank&quot; title=&quot;Home broadband&quot;&gt;here&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;If you are a business customer, or are trying to view this page through your company&#39;s internet connection, please click &lt;a href=&quot;https://www.eff.org/deeplinks/content-blocking&quot; style=&quot;color: #cc0000; text-decoration: none;&quot; target=&quot;_blank&quot; title=&quot;Business&quot;&gt;here&lt;/a&gt;. &lt;br /&gt;&lt;div&gt;∞ &lt;/div&gt;&lt;/div&gt;&lt;/h1&gt;&lt;/div&gt;&lt;/center&gt;&lt;/div&gt; </description> 
	<pubDate>Fri, 15 Dec 2017 09:09:37 +0000</pubDate>
  <author>noreply@blogger.com (Dimitri John Ledkov)</author>  
</item> 
<item>
	<title>Urvika Gola: KubeCon + CloudNativeCon, Austin</title>
	<guid>http://urvikagola.wordpress.com/?p=673</guid>
	<link>https://urvikagola.wordpress.com/2017/12/15/kubecon-cloudnativecon-austin/</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/urvikagola.png&quot; width=&quot;90&quot; height=&quot;118&quot; alt=&quot;&quot; align=&quot;right&quot; style=&quot;float: right;&quot;&gt;  &lt;p&gt;KubeCon + CloudNativeCon, North America took place in Austin, Texas from 6th to 8th December. But before that, I stumbled upon this great opportunity by Linux Foundation which would make it possible for me to attend and expand my knowledge about cloud computing, containers and all things cloud native!&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;cncf&quot; class=&quot;  wp-image-677 aligncenter&quot; height=&quot;276&quot; src=&quot;https://urvikagola.files.wordpress.com/2017/12/cncf.jpg?w=368&amp;amp;h=276&quot; width=&quot;368&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I would like to thank the diversity committee members – &lt;a href=&quot;https://twitter.com/michellenoorali&quot;&gt;@michellenoorali&lt;/a&gt; , &lt;a href=&quot;https://twitter.com/Kris__Nova&quot;&gt; @Kris__Nova, &lt;/a&gt;&lt;a href=&quot;https://twitter.com/jessfraz&quot;&gt;@jessfraz &lt;/a&gt;,&lt;a href=&quot;https://twitter.com/evonbuelow&quot;&gt; @evonbuelow&lt;/a&gt; and everyone (+Wendy West!!) behind this for making it possible for me and others by going extra miles to achieve the greatest initiative for diversity inclusion. It gave me an opportunity to learn from experts and experience the power of Kubernetes.&lt;/p&gt;
&lt;p&gt;After travelling 23+ in flight, I was able to attend the pre-conference sessions on 5th December. The day concluded with amazing Empower Her Evening Event where I met some amazing bunch of people! We had some great discussions and food, Thanks &lt;a class=&quot;twitter-atreply pretty-link js-nav&quot; href=&quot;https://twitter.com/nutanix&quot;&gt;&lt;s&gt;@&lt;/s&gt;nutanix!&lt;/a&gt;&lt;/p&gt;
&lt;figure class=&quot;wp-caption aligncenter&quot; id=&quot;attachment_674&quot;&gt;&lt;img alt=&quot;diversity-scholars-cncf&quot; class=&quot;alignnone  wp-image-674&quot; height=&quot;350&quot; src=&quot;https://urvikagola.files.wordpress.com/2017/12/diversity-scholars-cncf.jpg?w=467&amp;amp;h=350&quot; width=&quot;467&quot; /&gt;With diversity scholarship recipients at EmpowerHer event (credits – Radhika Nair)&lt;/figure&gt;
&lt;p&gt;On 6th December, I was super excited to attend Day 1 of the conference, when I reached at the venue, Austin Convention Center, there was a huge hall with *4100* people talking about all things cloud native!&lt;/p&gt;
&lt;p&gt;It started with informational KeyNote by &lt;span style=&quot;font-weight: 400;&quot;&gt;&lt;a href=&quot;https://kccncna17.sched.com/speaker/dankohn0&quot;&gt;Dan Kohn&lt;/a&gt;, the &lt;/span&gt;Executive Director of Cloud Native Computing Foundation. He pointed out how CNCF has grown over the year, from having 4 projects in 2016 to 14 projects in 2017. From having 1400 Attendees in March 2017 to 4100 Attendees in December 2017. It was really thrilling to know about the growth and power of Kubernetes, which really inspired me to contribute towards this project.&lt;/p&gt;
&lt;figure class=&quot;wp-caption aligncenter&quot; id=&quot;attachment_678&quot;&gt;&lt;img alt=&quot;dan-cncf&quot; class=&quot;  wp-image-678 aligncenter&quot; height=&quot;351&quot; src=&quot;https://urvikagola.files.wordpress.com/2017/12/dan-cncf.jpg?w=468&amp;amp;h=351&quot; width=&quot;468&quot; /&gt;&lt;a href=&quot;https://kccncna17.sched.com/speaker/dankohn0&quot;&gt;Dan Kohn&lt;/a&gt; Keynote talk at KubeCon+CloudNativeCon&lt;/figure&gt;
&lt;p&gt;It was hard to choose what session to attend because there was just so much going on!! I attended sessions mostly which were beginner &amp;amp; intermediate level. Missed out on the ones which required technical expertise I don’t possess, yet! Curious to know more about other tech companies working on, I made sure I visited all sponsor booths and learn what technology they are building. Apart from that they had cool goodies and stickers, the place where people are labelled at sticker-person or non-sticker-person! &lt;img alt=&quot;😀&quot; class=&quot;wp-smiley&quot; src=&quot;https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f600.png&quot; style=&quot;height: 1em;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;There was a diversity luncheon on 7th December, where I had really interesting conversations with people about their challenges and stories related to technology. I made some great friends at the table and thank you for voting my story as the best story of getting into open source &amp;amp; thank you Samsung for sponsoring this event.&lt;/p&gt;
&lt;p&gt;KubeCon + CloudNativeCon was a very informative and hugee event put up by Cloud Native Computing Foundation. It was interesting to know how cloud native technologies have expanded along with the growth of community! Thank you the Linux foundation for this experience! &lt;img alt=&quot;🙂&quot; class=&quot;wp-smiley&quot; src=&quot;https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f642.png&quot; style=&quot;height: 1em;&quot; /&gt;&lt;/p&gt;
&lt;figure class=&quot;wp-caption aligncenter&quot; id=&quot;attachment_679&quot;&gt;&lt;img alt=&quot;IMG_20171206_190624&quot; class=&quot;alignnone  wp-image-679&quot; height=&quot;477&quot; src=&quot;https://urvikagola.files.wordpress.com/2017/12/img_20171206_190624.jpg?w=358&amp;amp;h=477&quot; width=&quot;358&quot; /&gt;Keeping Cloud Native Weird!&lt;/figure&gt;
&lt;figure class=&quot;wp-caption aligncenter&quot; id=&quot;attachment_680&quot;&gt;&lt;img alt=&quot;IMG_20171207_192927&quot; class=&quot;  wp-image-680 aligncenter&quot; height=&quot;471&quot; src=&quot;https://urvikagola.files.wordpress.com/2017/12/img_20171207_192927.jpg?w=353&amp;amp;h=471&quot; width=&quot;353&quot; /&gt;Open bar all attendee party! (Where I experienced my first snow fall )&lt;/figure&gt;
&lt;p&gt; &lt;/p&gt;
&lt;figure class=&quot;wp-caption aligncenter&quot; id=&quot;attachment_676&quot;&gt;&lt;img alt=&quot;austin-lake&quot; class=&quot;  wp-image-676 aligncenter&quot; height=&quot;422&quot; src=&quot;https://urvikagola.files.wordpress.com/2017/12/austin-lake.jpg?w=562&amp;amp;h=422&quot; width=&quot;562&quot; /&gt;Goodbye Austin!&lt;/figure&gt;&lt;br /&gt;  &lt;a href=&quot;http://feeds.wordpress.com/1.0/gocomments/urvikagola.wordpress.com/673/&quot; rel=&quot;nofollow&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/urvikagola.wordpress.com/673/&quot; /&gt;&lt;/a&gt; </description> 
	<pubDate>Fri, 15 Dec 2017 07:50:49 +0000</pubDate>

</item> 
<item>
	<title>Sean Whitton: A second X server on vt8, running a different Debian suite, using systemd-nspawn</title>
	<guid>https://spwhitton.name//blog/entry/sidvt8xserver/</guid>
	<link>https://spwhitton.name//blog/entry/sidvt8xserver/</link>
     <description>  &lt;img src=&quot;http://planet.debian.org/heads/spwhitton.png&quot; width=&quot;65&quot; height=&quot;85&quot; alt=&quot;&quot; align=&quot;right&quot; style=&quot;float: right;&quot;&gt;  &lt;h1&gt;Two tensions&lt;/h1&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Sometimes the contents of the Debian archive isn’t yet sufficient
for working in a software ecosystem in which I’d like to work, and
I want to use that ecosystem’s package manager which downloads the
world into $HOME – e.g. &lt;code&gt;stack&lt;/code&gt;, &lt;code&gt;pip&lt;/code&gt;, &lt;code&gt;lein&lt;/code&gt; and friends.&lt;/p&gt;

&lt;p&gt;But I can’t use such a package manager when $HOME contains my PGP
subkeys and other valuable files, and my X session includes Firefox
with lots of saved passwords, etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I want to run Debian stable on my laptop for purposes of my day job
– if I can’t open Emacs on a Monday morning, it’s going to be a
tough week.&lt;/p&gt;

&lt;p&gt;But I also want to do Debian development on my laptop, and most of
that’s a pain without either Debian testing or Debian unstable.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;h1&gt;The solution&lt;/h1&gt;

&lt;p&gt;Have &lt;a href=&quot;https://propellor.branchable.com/&quot;&gt;Propellor&lt;/a&gt; provision and
boot a systemd-nspawn(1) container running Debian unstable, and start
a window manager in that container with $DISPLAY pointing at an X
server in vt8.  Wooo!&lt;/p&gt;

&lt;p&gt;In more detail:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Laptop runs Debian stable.  Main account is spwhitton.&lt;/li&gt;
&lt;li&gt;Achieve isolation from &lt;code&gt;/home/spwhitton&lt;/code&gt; by creating a new user
account, spw, that can’t read &lt;code&gt;/home/spwhitton&lt;/code&gt;.  Also, in X
startup scripts for spwhitton, run &lt;code&gt;xhost -local:&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;debootstrap a Debian unstable chroot into &lt;code&gt;/var/lib/container/develacc&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Install useful desktop things like &lt;code&gt;task-british-desktop&lt;/code&gt; into
&lt;code&gt;/var/lib/container/develacc&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Boot &lt;code&gt;/var/lib/container/develacc&lt;/code&gt; as a systemd-nspawn container
called &lt;code&gt;develacc&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dm-tool switch-to-greeter&lt;/code&gt; to start a new X server on vt8.  Login
as spw.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Propellor installs a script &lt;code&gt;enter-develacc&lt;/code&gt; which uses nsenter(1)
to run commands in the &lt;code&gt;develacc&lt;/code&gt; container.  Create a further
script &lt;code&gt;enter-develacc-i3&lt;/code&gt; which does&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; /usr/local/bin/enter-develacc sh -c &quot;cd ~spw; DISPLAY=$1 su spw -c i3&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Finally, &lt;code&gt;/home/spw/.xsession&lt;/code&gt; starts i3 in the chroot pointed at
vt8’s X server:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; sudo /usr/local/bin/enter-develacc-i3 $DISPLAY
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Phew.  May now &lt;code&gt;pip install foo&lt;/code&gt;.  And &lt;code&gt;Ctrl-Alt-F7&lt;/code&gt; to go back to
my secure session.  That session can read and write &lt;code&gt;/home/spw&lt;/code&gt;, so
I can &lt;code&gt;dgit push&lt;/code&gt; etc.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;h1&gt;The Propellor configuration&lt;/h1&gt;

&lt;div class=&quot;highlight-haskell&quot;&gt;&lt;pre class=&quot;hl&quot;&gt;develaccProvisioned &lt;span class=&quot;hl opt&quot;&gt;::&lt;/span&gt; Property &lt;span class=&quot;hl opt&quot;&gt;(&lt;/span&gt;HasInfo &lt;span class=&quot;hl opt&quot;&gt;+&lt;/span&gt; DebianLike&lt;span class=&quot;hl opt&quot;&gt;)&lt;/span&gt;
develaccProvisioned &lt;span class=&quot;hl opt&quot;&gt;=&lt;/span&gt; propertyList &lt;span class=&quot;hl str&quot;&gt;&quot;develacc provisioned&quot;&lt;/span&gt; &lt;span class=&quot;hl opt&quot;&gt;$&lt;/span&gt; props
    &lt;span class=&quot;hl opt&quot;&gt;&amp;amp;&lt;/span&gt; User&lt;span class=&quot;hl opt&quot;&gt;.&lt;/span&gt;accountFor &lt;span class=&quot;hl opt&quot;&gt;(&lt;/span&gt;User &lt;span class=&quot;hl str&quot;&gt;&quot;spw&quot;&lt;/span&gt;&lt;span class=&quot;hl opt&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;hl opt&quot;&gt;&amp;amp;&lt;/span&gt; Dotfiles&lt;span class=&quot;hl opt&quot;&gt;.&lt;/span&gt;installedFor &lt;span class=&quot;hl opt&quot;&gt;(&lt;/span&gt;User &lt;span class=&quot;hl str&quot;&gt;&quot;spw&quot;&lt;/span&gt;&lt;span class=&quot;hl opt&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;hl opt&quot;&gt;&amp;amp;&lt;/span&gt; User&lt;span class=&quot;hl opt&quot;&gt;.&lt;/span&gt;hasDesktopGroups &lt;span class=&quot;hl opt&quot;&gt;(&lt;/span&gt;User &lt;span class=&quot;hl str&quot;&gt;&quot;spw&quot;&lt;/span&gt;&lt;span class=&quot;hl opt&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;hl opt&quot;&gt;&amp;amp;&lt;/span&gt; withMyAcc &lt;span class=&quot;hl str&quot;&gt;&quot;Sean has &#39;spw&#39; group&quot;&lt;/span&gt;
        &lt;span class=&quot;hl opt&quot;&gt;(\&lt;/span&gt;u &lt;span class=&quot;hl opt&quot;&gt;-&amp;gt;&lt;/span&gt; tightenTargets &lt;span class=&quot;hl opt&quot;&gt;$&lt;/span&gt; User&lt;span class=&quot;hl opt&quot;&gt;.&lt;/span&gt;hasGroup u &lt;span class=&quot;hl opt&quot;&gt;(&lt;/span&gt;Group &lt;span class=&quot;hl str&quot;&gt;&quot;spw&quot;&lt;/span&gt;&lt;span class=&quot;hl opt&quot;&gt;))&lt;/span&gt;
    &lt;span class=&quot;hl opt&quot;&gt;&amp;amp;&lt;/span&gt; withMyHome &lt;span class=&quot;hl str&quot;&gt;&quot;Sean&#39;s homedir chmodded&quot;&lt;/span&gt;
        &lt;span class=&quot;hl opt&quot;&gt;(\&lt;/span&gt;h &lt;span class=&quot;hl opt&quot;&gt;-&amp;gt;&lt;/span&gt; tightenTargets &lt;span class=&quot;hl opt&quot;&gt;$&lt;/span&gt; File&lt;span class=&quot;hl opt&quot;&gt;.&lt;/span&gt;mode h &lt;span class=&quot;hl num&quot;&gt;0&lt;/span&gt;O0750&lt;span class=&quot;hl opt&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;hl opt&quot;&gt;&amp;amp;&lt;/span&gt; &lt;span class=&quot;hl str&quot;&gt;&quot;/home/spw&quot;&lt;/span&gt; `File&lt;span class=&quot;hl opt&quot;&gt;.&lt;/span&gt;mode` &lt;span class=&quot;hl num&quot;&gt;0&lt;/span&gt;O0770

    &lt;span class=&quot;hl opt&quot;&gt;&amp;amp;&lt;/span&gt; &lt;span class=&quot;hl str&quot;&gt;&quot;/etc/sudoers.d/spw&quot;&lt;/span&gt; `File&lt;span class=&quot;hl opt&quot;&gt;.&lt;/span&gt;hasContent`
        &lt;span class=&quot;hl opt&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;hl str&quot;&gt;&quot;spw ALL=(root) NOPASSWD: /usr/local/bin/enter-develacc-i3&quot;&lt;/span&gt;&lt;span class=&quot;hl opt&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;hl opt&quot;&gt;&amp;amp;&lt;/span&gt; &lt;span class=&quot;hl str&quot;&gt;&quot;/usr/local/bin/enter-develacc-i3&quot;&lt;/span&gt; `File&lt;span class=&quot;hl opt&quot;&gt;.&lt;/span&gt;hasContent`
        &lt;span class=&quot;hl opt&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;hl str&quot;&gt;&quot;#!/bin/sh&quot;&lt;/span&gt;
        &lt;span class=&quot;hl opt&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl str&quot;&gt;&quot;&quot;&lt;/span&gt;
        &lt;span class=&quot;hl opt&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl str&quot;&gt;&quot;echo&lt;/span&gt; &lt;span class=&quot;hl esc&quot;&gt;\&quot;&lt;/span&gt;&lt;span class=&quot;hl str&quot;&gt;$1&lt;/span&gt;&lt;span class=&quot;hl esc&quot;&gt;\&quot;&lt;/span&gt; &lt;span class=&quot;hl str&quot;&gt;| grep -q -E&lt;/span&gt; &lt;span class=&quot;hl esc&quot;&gt;\&quot;&lt;/span&gt;&lt;span class=&quot;hl str&quot;&gt;^:[0-9.]+$&lt;/span&gt;&lt;span class=&quot;hl esc&quot;&gt;\&quot;&lt;/span&gt; &lt;span class=&quot;hl str&quot;&gt;|| exit 1&quot;&lt;/span&gt;
        &lt;span class=&quot;hl opt&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl str&quot;&gt;&quot;&quot;&lt;/span&gt;
        &lt;span class=&quot;hl opt&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl str&quot;&gt;&quot;/usr/local/bin/enter-develacc sh -c&lt;/span&gt; &lt;span class=&quot;hl esc&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;hl str&quot;&gt;&quot;&lt;/span&gt;
        &lt;span class=&quot;hl opt&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl str&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;hl esc&quot;&gt;\t\&quot;&lt;/span&gt;&lt;span class=&quot;hl str&quot;&gt;cd ~spw; DISPLAY=$1 su spw -c i3&lt;/span&gt;&lt;span class=&quot;hl esc&quot;&gt;\&quot;&lt;/span&gt;&lt;span class=&quot;hl str&quot;&gt;&quot;&lt;/span&gt;
        &lt;span class=&quot;hl opt&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;hl opt&quot;&gt;&amp;amp;&lt;/span&gt; &lt;span class=&quot;hl str&quot;&gt;&quot;/usr/local/bin/enter-develacc-i3&quot;&lt;/span&gt; `File&lt;span class=&quot;hl opt&quot;&gt;.&lt;/span&gt;mode` &lt;span class=&quot;hl num&quot;&gt;0&lt;/span&gt;O0755

    &lt;span class=&quot;hl slc&quot;&gt;-- we have to start xss-lock outside of the container in order that it&lt;/span&gt;
    &lt;span class=&quot;hl slc&quot;&gt;-- can interface with host logind&lt;/span&gt;
    &lt;span class=&quot;hl opt&quot;&gt;&amp;amp;&lt;/span&gt; &lt;span class=&quot;hl str&quot;&gt;&quot;/home/spw/.xsession&quot;&lt;/span&gt; `File&lt;span class=&quot;hl opt&quot;&gt;.&lt;/span&gt;hasContent`
        &lt;span class=&quot;hl opt&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;hl str&quot;&gt;&quot;if [ -e&lt;/span&gt; &lt;span class=&quot;hl esc&quot;&gt;\&quot;&lt;/span&gt;&lt;span class=&quot;hl str&quot;&gt;$HOME/local/wallpaper.png&lt;/span&gt;&lt;span class=&quot;hl esc&quot;&gt;\&quot;&lt;/span&gt; &lt;span class=&quot;hl str&quot;&gt;]; then&quot;&lt;/span&gt;
        &lt;span class=&quot;hl opt&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl str&quot;&gt;&quot;    xss-lock -- i3lock -i $HOME/local/wallpaper.png &amp;amp;&quot;&lt;/span&gt;
        &lt;span class=&quot;hl opt&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl str&quot;&gt;&quot;else&quot;&lt;/span&gt;
        &lt;span class=&quot;hl opt&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl str&quot;&gt;&quot;    xss-lock -- i3lock -c 3f3f3f -n &amp;amp;&quot;&lt;/span&gt;
        &lt;span class=&quot;hl opt&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl str&quot;&gt;&quot;fi&quot;&lt;/span&gt;
        &lt;span class=&quot;hl opt&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl str&quot;&gt;&quot;sudo /usr/local/bin/enter-develacc-i3 $DISPLAY&quot;&lt;/span&gt;
        &lt;span class=&quot;hl opt&quot;&gt;]&lt;/span&gt;

    &lt;span class=&quot;hl opt&quot;&gt;&amp;amp;&lt;/span&gt; Systemd&lt;span class=&quot;hl opt&quot;&gt;.&lt;/span&gt;nspawned develAccChroot
    &lt;span class=&quot;hl opt&quot;&gt;&amp;amp;&lt;/span&gt; &lt;span class=&quot;hl str&quot;&gt;&quot;/etc/network/if-up.d/develacc-resolvconf&quot;&lt;/span&gt; `File&lt;span class=&quot;hl opt&quot;&gt;.&lt;/span&gt;hasContent`
        &lt;span class=&quot;hl opt&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;hl str&quot;&gt;&quot;#!/bin/sh&quot;&lt;/span&gt;
        &lt;span class=&quot;hl opt&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl str&quot;&gt;&quot;&quot;&lt;/span&gt;
        &lt;span class=&quot;hl opt&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl str&quot;&gt;&quot;cp -fL /etc/resolv.conf&lt;/span&gt; &lt;span class=&quot;hl esc&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;hl str&quot;&gt;&quot;&lt;/span&gt;
        &lt;span class=&quot;hl opt&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;hl str&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;hl esc&quot;&gt;\t&lt;/span&gt;&lt;span class=&quot;hl str&quot;&gt;/var/lib/container/develacc/etc/resolv.conf&quot;&lt;/span&gt;
        &lt;span class=&quot;hl opt&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;hl opt&quot;&gt;&amp;amp;&lt;/span&gt; &lt;span class=&quot;hl str&quot;&gt;&quot;/etc/network/if-up.d/develacc-resolvconf&quot;&lt;/span&gt; `File&lt;span class=&quot;hl opt&quot;&gt;.&lt;/span&gt;mode` &lt;span class=&quot;hl num&quot;&gt;0&lt;/span&gt;O0755
  &lt;span class=&quot;hl kwd&quot;&gt;where&lt;/span&gt;
    develAccChroot &lt;span class=&quot;hl opt&quot;&gt;=&lt;/span&gt; Systemd&lt;span class=&quot;hl opt&quot;&gt;.&lt;/span&gt;debContainer &lt;span class=&quot;hl str&quot;&gt;&quot;develacc&quot;&lt;/span&gt; &lt;span class=&quot;hl opt&quot;&gt;$&lt;/span&gt; props
        &lt;span class=&quot;hl slc&quot;&gt;-- Prevent propellor passing --bind=/etc/resolv.conf which&lt;/span&gt;
        &lt;span class=&quot;hl slc&quot;&gt;-- - won&#39;t work when system first boots as WLAN won&#39;t be up yet,&lt;/span&gt;
        &lt;span class=&quot;hl slc&quot;&gt;--   so /etc/resolv.conf is a dangling symlink&lt;/span&gt;
        &lt;span class=&quot;hl slc&quot;&gt;-- - doesn&#39;t keep /etc/resolv.conf up-to-date as I move between&lt;/span&gt;
        &lt;span class=&quot;hl slc&quot;&gt;--   wireless networks&lt;/span&gt;
        &lt;span class=&quot;hl opt&quot;&gt;!&lt;/span&gt; Systemd&lt;span class=&quot;hl opt&quot;&gt;.&lt;/span&gt;resolvConfed

        &lt;span class=&quot;hl opt&quot;&gt;&amp;amp;&lt;/span&gt; osDebian Unstable X86_64
        &lt;span class=&quot;hl opt&quot;&gt;&amp;amp;&lt;/span&gt; Apt&lt;span class=&quot;hl opt&quot;&gt;.&lt;/span&gt;stdSourcesList
        &lt;span class=&quot;hl opt&quot;&gt;&amp;amp;&lt;/span&gt; Apt&lt;span class=&quot;hl opt&quot;&gt;.&lt;/span&gt;suiteAvailablePinned Experimental &lt;span class=&quot;hl num&quot;&gt;1&lt;/span&gt;
        &lt;span class=&quot;hl slc&quot;&gt;-- use host apt cacher (we assume I have that on any system with&lt;/span&gt;
        &lt;span class=&quot;hl slc&quot;&gt;-- develaccProvisioned)&lt;/span&gt;
        &lt;span class=&quot;hl opt&quot;&gt;&amp;amp;&lt;/span&gt; Apt&lt;span class=&quot;hl opt&quot;&gt;.&lt;/span&gt;proxy &lt;span class=&quot;hl str&quot;&gt;&quot;http://localhost:3142&quot;&lt;/span&gt;

        &lt;span class=&quot;hl opt&quot;&gt;&amp;amp;&lt;/span&gt; Apt&lt;span class=&quot;hl opt&quot;&gt;.&lt;/span&gt;installed &lt;span class=&quot;hl opt&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;hl str&quot;&gt;&quot;i3&quot;&lt;/span&gt;
                &lt;span class=&quot;hl opt&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl str&quot;&gt;&quot;task-xfce-desktop&quot;&lt;/span&gt;
                &lt;span class=&quot;hl opt&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl str&quot;&gt;&quot;task-british-desktop&quot;&lt;/span&gt;
                &lt;span class=&quot;hl opt&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl str&quot;&gt;&quot;xss-lock&quot;&lt;/span&gt;
                &lt;span class=&quot;hl opt&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl str&quot;&gt;&quot;emacs&quot;&lt;/span&gt;
                &lt;span class=&quot;hl opt&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl str&quot;&gt;&quot;caffeine&quot;&lt;/span&gt;
                &lt;span class=&quot;hl opt&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl str&quot;&gt;&quot;redshift-gtk&quot;&lt;/span&gt;
                &lt;span class=&quot;hl opt&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl str&quot;&gt;&quot;gnome-settings-daemon&quot;&lt;/span&gt;
                &lt;span class=&quot;hl opt&quot;&gt;]&lt;/span&gt;

        &lt;span class=&quot;hl opt&quot;&gt;&amp;amp;&lt;/span&gt; Systemd&lt;span class=&quot;hl opt&quot;&gt;.&lt;/span&gt;bind &lt;span class=&quot;hl str&quot;&gt;&quot;/home/spw&quot;&lt;/span&gt;
        &lt;span class=&quot;hl slc&quot;&gt;-- note that this won&#39;t create /home/spw because that is&lt;/span&gt;
        &lt;span class=&quot;hl slc&quot;&gt;-- bind-mounted, which is what we want&lt;/span&gt;
        &lt;span class=&quot;hl opt&quot;&gt;&amp;amp;&lt;/span&gt; User&lt;span class=&quot;hl opt&quot;&gt;.&lt;/span&gt;accountFor &lt;span class=&quot;hl opt&quot;&gt;(&lt;/span&gt;User &lt;span class=&quot;hl str&quot;&gt;&quot;spw&quot;&lt;/span&gt;&lt;span class=&quot;hl opt&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;hl slc&quot;&gt;-- ensure that spw inside the container can read/write ~spw&lt;/span&gt;
        &lt;span class=&quot;hl opt&quot;&gt;&amp;amp;&lt;/span&gt; scriptProperty
            &lt;span class=&quot;hl opt&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;hl str&quot;&gt;&quot;usermod -u $(stat --printf=&lt;/span&gt;&lt;span class=&quot;hl esc&quot;&gt;\&quot;&lt;/span&gt;&lt;span class=&quot;hl str&quot;&gt;&lt;/span&gt;&lt;span class=&quot;hl ipl&quot;&gt;%u&lt;/span&gt;&lt;span class=&quot;hl str&quot;&gt;&lt;/span&gt;&lt;span class=&quot;hl esc&quot;&gt;\&quot;&lt;/span&gt; &lt;span class=&quot;hl str&quot;&gt;/home/spw) spw&quot;&lt;/span&gt;
            &lt;span class=&quot;hl opt&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;hl str&quot;&gt;&quot;groupmod -g $(stat --printf=&lt;/span&gt;&lt;span class=&quot;hl esc&quot;&gt;\&quot;&lt;/span&gt;&lt;span class=&quot;hl str&quot;&gt;&lt;/span&gt;&lt;span class=&quot;hl ipl&quot;&gt;%g&lt;/span&gt;&lt;span class=&quot;hl str&quot;&gt;&lt;/span&gt;&lt;span class=&quot;hl esc&quot;&gt;\&quot;&lt;/span&gt; &lt;span class=&quot;hl str&quot;&gt;/home/spw) spw&quot;&lt;/span&gt;
            &lt;span class=&quot;hl opt&quot;&gt;]&lt;/span&gt; `assume` NoChange
&lt;/pre&gt;&lt;/div&gt;


&lt;h1&gt;Comments&lt;/h1&gt;

&lt;p&gt;I first tried using a traditional chroot.  I bound lots of &lt;code&gt;/dev&lt;/code&gt; into
the chroot and then tried to start lightdm on vt8.  This way, the
whole X server would be within the chroot; this is in a sense more
straightforward and there is not the overhead of booting the
container.  But lightdm refuses to start.&lt;/p&gt;

&lt;p&gt;It might have been possible to work around this, but after &lt;a href=&quot;http://0pointer.de/blog/projects/changing-roots.html&quot;&gt;reading&lt;/a&gt;
a number of reasons why chroots are less good under systemd as
compared with sysvinit, I thought I’d try systemd-nspawn, which I’ve
used before and rather like in general.  I couldn’t get lightdm to
start inside that, either, because systemd-nspawn makes it difficult
to mount enough of &lt;code&gt;/dev&lt;/code&gt; for X servers to be started.  At that point
I realised that I could start only the window manager inside the
container, with the X server started from the host’s lightdm, and went
from there.&lt;/p&gt;

&lt;p&gt;The security isn’t that good.  You shouldn’t be running anything
actually untrusted, just stuff that’s semi-trusted.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;chmod 750 /home/spwhitton&lt;/code&gt;, &lt;code&gt;xhost -local:&lt;/code&gt; and the argument
validation in &lt;code&gt;enter-develacc-i3&lt;/code&gt; are pretty much the extent of the
security here.  The containerisation is to get Debian sid on a
Debian stable machine, not for isolation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;lightdm still runs X servers as root even though it’s been possible
to run them as non-root in Debian for a few years now (there’s a
wishlist bug against lightdm)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;I now have a total of six installations of Debian on my laptop’s hard
drive … four traditional chroots, one systemd-nspawn container and
of course the host OS.  But this is easy to manage with propellor!&lt;/p&gt;

&lt;h1&gt;Bugs&lt;/h1&gt;

&lt;p&gt;Screen locking is weird because logind sessions aren’t shared into the
container.  I have to run &lt;code&gt;xss-lock&lt;/code&gt; in &lt;code&gt;/home/spw/.xsession&lt;/code&gt; before
entering the container, and the window manager running in the
container cannot have a keybinding to lock the screen (as it does in
my secure session).  To lock the spw X server, I have to shut my
laptop lid, or run &lt;code&gt;loginctl lock-sessions&lt;/code&gt; from my secure session,
which requires entering the root password.&lt;/p&gt; </description> 
	<pubDate>Fri, 15 Dec 2017 00:18:30 +0000</pubDate>

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