<?xml version="1.0" encoding="utf-8"?>
        <?xml-stylesheet type="text/css" href="http://www.atcomputing.nl/blog/"?>
<rss version="2.0"
 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 xmlns:dc="http://purl.org/dc/elements/1.1/"
 xmlns:admin="http://webns.net/mvcb/"
 xmlns:atom="http://www.w3.org/2005/Atom"
>
<channel>
<title>AT Blog</title>
<atom:link href="http://www.atcomputing.nl/blog/rss.xml" rel="self" type="application/rss+xml" />
<link>http://www.atcomputing.nl/blog</link>
<description>Linux/UNIXperts, opleiders &amp; oplossers</description>
<dc:language>en-us</dc:language>
<dc:creator>jacco</dc:creator>
<dc:date>2012-05-03T20:23:07+02:00</dc:date>
<admin:generatorAgent rdf:resource="http://nanoblogger.sourceforge.net" />

<item>
<link>http://www.atcomputing.nl/blog/archives/2012/05/index.php#e2012-05-02T20_16_32.txt</link>
<guid isPermaLink="true">http://www.atcomputing.nl/blog/archives/2012/05/index.php#e2012-05-02T20_16_32.txt</guid>
<title>Scp/rsync speed up</title>
<dc:date>2012-05-02T20:16:32+02:00</dc:date>
<dc:creator>jacco</dc:creator>
<dc:subject> Tips and Tricks</dc:subject>
<description><![CDATA[<p>Zo, eventjes een dikke file naar de andere kant pompen ...</p>

<pre><code>$ scp dikkefile pietje@anderemachine:
dikkefile           100% 1024MB  37.7MB/s   00:27
</code></pre>

<p>Mmmh, 37 schamele megabytes per seconde. Het is dat het meer is dan 10 MB/sec, anders zou je nog denken dat je per ongeluk data over een verbinding aan het trekken bent waar een fast ethernet component de zwakste schakel is. <br />
De brondisk en de doeldisk zijn snel (> 100MB/sec), er ligt gigabit ethernet tussen en beide machines zijn op dezelfde ethernetswitch aangesloten. Kan dat niet sneller? <br />
Jazeker kan dat! En daar hoef je maar weinig voor te doen.  </p>

<p>Wanneer je regelmatig grote hoeveelheden data via scp of rsync naar een andere machine verstuurt, loont het de moeite om aan de default instellingen van ssh te sleutelen. Om het verkeer te versleutelen gebruikt ssh een bepaalde cipher (versleutelingsmethode). En de default cipher blijkt niet uit te blinken in snelheid. <br />
Als je in de manpage van ssh_config zoekt naar "Ciphers", wordt een hele lijst versleutelingsmethodes opgehoest. De ssh-client gaat in conclaaf met de ssh-server om een te gebruiken cipher af te spreken. Volgens de manpage begint de lijst met aes128-ctr en eindigt hij met arcfour, met daar tussenin nog 10 andere ciphers. Tenminste, bij de OpenSSH die Ubuntu gebruikt. De eerste uit de lijst die zowel client als server ondersteunen, wordt als cipher gepakt.  </p>

<p>Het is maar een kleine moeite om vanaf de commandline een andere cipher aan te prikken, namelijk met de vlag "-c". <br />
Mocht je per ongeluk een cipher pakken waarvan de server "ken ik niet" zegt, zie je dat gelijk. In onderstaand voorbeeld is de client een Ubuntu 10.04 machine en de server een OpenIndiana (SunOS 5.11) machine:  </p>

<pre><code>$ scp -c blowfish-cbc dikkefile pietje@anderemachine:
no matching cipher found: client blowfish-cbc server aes128-ctr,aes192-ctr,aes256-ctr,arcfour128,arcfour256,arcfour
</code></pre>

<p>Afhankelijk van de gekozen cipher, kan het ook nuttig zijn compressie te gebruiken (vlaggetje "-C"). <br />
Ik heb een handvol beschikbare ciphers naast elkaar gezet, om de performanceverschillen inzichtelijk te maken. Daarbij heb ik uitgesloten dat de disken een bottleneck zouden vormen, door vanaf een ram-filesystem te lezen en op de doelmachine ook naar een ram-filesystem te schrijven.</p>

<table>
<tr>
<td><b>Cipher</b></td>
<td><b>Snelheid (MB/sec)</b></td>
</tr>
<tr>
<td>default</td>
<td>37.9 (cpu-utilization: 10% sys, 90% user)</td>
</tr>
<tr>
<td>default met compressie</td>
<td>51.2 (cpu-utilization: 9% sys, 91% user)</td>
</tr>
<tr>
<td>3des</td>
<td>25.6</td>
</tr>
<tr>
<td>3des-cbc</td>
<td>23.8</td>
</tr>
<tr>
<td>blowfish/blowfish-cbc</td>
<td>53.9</td>
</tr>
<tr>
<td>aes128-cbc (cipher block chaining)</td>
<td>60.2</td>
</tr>
<tr>
<td>aes128-ctr (counter mode)</td>
<td>37.9</td>
</tr>
<tr>
<td>aes256-cbc</td>
<td>53.9</td>
</tr>
<tr>
<td>arcfour</td>
<td>78.8 (cpu-utilization: 33% sys, 66% user)</td>
</tr>
<tr>
<td>arcfour met compressie</td>
<td>51.2 (cpu-utilization: 9% sys, 91% user)</td>
</tr>
</table>

<p>Het blijkt dat de cipher "arcfour" er - qua snelheid - met kop en schouders bovenuit steekt.  </p>

<p>Wanneer je deze als jouw persoonlijke favoriet instelt (keyword "Ciphers" in de file ~/.ssh/config), maakt alle tooling die gebruik maakt van ssh van deze cipher gebruik. Dat geldt o.a. voor scp en rsync. <br />
Er is overigens wel een reden dat arcfour (oftewel "Alleged RC4") niet de default is. Het is - vanuit security-oogpunt - niet de meest veilige versleuteling. Maar daar was het me ook niet om te doen: bij flinke kopieeracties wil ik die gigabit pijp gewoon dichttrekken, als het even kan.  </p>

<p>Meer leesvoer over RC4 kun je vinden op <a href="http://en.wikipedia.org/wiki/Arcfour">wikipedia</a>.</p>

<p><em>Nota Bene</em>: Wanneer je over een verbinding met een hoge latency een niet optimale snelheid haalt, kan dat ook een andere oorzaken hebben. Kijk dan eens naar de TCP-window size op de ontvangende en zendende machine. Het probleem kan dan zitten in de beperkte bufferruimte voor TCP-pakketjes (een machine kan maar een beperkt aantal pakketjes opsturen voor hij een ontvangstbevestiging van de overkant vereist).</p>]]></description>

</item>
<item>
<link>http://www.atcomputing.nl/blog/archives/2012/01/index.php#e2012-01-13T11_35_21.txt</link>
<guid isPermaLink="true">http://www.atcomputing.nl/blog/archives/2012/01/index.php#e2012-01-13T11_35_21.txt</guid>
<title>Performance: If statements elimineren</title>
<dc:date>2012-01-13T11:35:21+02:00</dc:date>
<dc:creator>martijn_brekhof</dc:creator>
<dc:subject> Programmeren</dc:subject>
<description><![CDATA[<p>Ik was in de blog
<a href="http://atcomputing.nl/blog/archives/2011/10/index.php#e2011-10-12T12_15_19.txt">Performance: lazy evaluation</a> begonnen met het optimaliseren van onderstaand
loopje. </p>

<pre><code>for ( bug_number = 0; bug_number &lt; MAX_BUGS; bug_number++ )
{
  for ( employee_id = 0; employee_id &lt; MAX_EMPLOYEES; employee_id++ )
  {
    if( ( employee_employed[employee_id] == false ) &amp;&amp; (employee_id == bug_assignee[bug_number]) )
    {
      printf("Bug %d assigned to non employed person\n", bug_number);
    }
  }
}
</code></pre>

<p>Door simpelweg de condities in de if-statement om te draaien behaalde ik een
winst van 76%. In de blog
<a href="http://atcomputing.nl/blog/archives/2011/11/index.php#e2011-11-22T12_41_37.txt">Loopjes, loopjes, loopjes</a> ging ik verder in op bovenstaand stukje code waar
ik vooral de for loop onder de loep nam. Door simpelweg de binnenste loop
alleen uit te voeren als het een medewerker betreft die niet meer in dienst
is,
behaalde ik een extra winst van 1 seconde. De uiteindelijke code laat ik hier
voor het gemak nog even zien:</p>

<pre><code>for ( employee_id = 0; employee_id &lt; MAX_EMPLOYEES; employee_id++ )
{
  if (employee_employed[employee_id] == false)
  {
    for ( bug_number = 0; bug_number &lt; MAX_BUGS; bug_number++ )
    {
      if (employee_id == bug_assignee[bug_number])
      {
        printf("Bug %d assigned to non employed person\n", bug_number);
      }
    }
  }
}
</code></pre>

<p>Ik zal nu de (voor mij) laatste slag in de optimalisatie van
de code behandelen.
Door het herschrijven van de code viel me namelijk iets anders op. 
Wellicht dat het je al was opgevallen, maar de twee if-statements gebruiken
allebei de variabele <code>employee_id</code>. <br />
De lijst <code>bug_assignee</code> geeft een <code>employee_id</code> terug en de lijst
<code>employee_employed</code> geeft op basis van <code>employee_id</code> aan of deze nog in dienst
is. Ik had in de blog
<a href="http://atcomputing.nl/blog/archives/2011/10/index.php#e2011-10-12T12_15_19.txt">Performance: lazy evaluation</a> al aangegeven dat een bug altijd toegewezen is aan één persoon. 
Oftewel <code>bug_assignee</code> geeft altijd een valide medewerkersnummer terug
(<code>employee_id</code>). We hoeven hier dus helemaal niet expliciet op te controleren
en kunnen de twee for loops herschrijven tot één:</p>

<pre><code>for ( bug_number = 0; bug_number &lt; MAX_BUGS; bug_number++ )
{
  employee_id = bug_assignee[bug_number];
  if( employee_employed[employee_id] == false )
  {
    printf("Bug %d assigned to non employed person\n", bug_number);
  }
}
</code></pre>

<p>De code is nu een stuk leesbaarder (vind ik in ieder geval) en doet er nog
maar 0.3 seconden over.
Dit is dus uiteindelijk een winst van 99% ten opzichte van de code in mijn
blog <a href="http://atcomputing.nl/blog/archives/2011/10/index.php#e2011-10-12T12_15_19.txt">Performance: lazy
evaluation</a>.</p>]]></description>

</item>
<item>
<link>http://www.atcomputing.nl/blog/archives/2012/01/index.php#e2012-01-02T13_54_42.txt</link>
<guid isPermaLink="true">http://www.atcomputing.nl/blog/archives/2012/01/index.php#e2012-01-02T13_54_42.txt</guid>
<title>Geluiden uit de keuken van Fedora (december)</title>
<dc:date>2012-01-02T13:54:42+02:00</dc:date>
<dc:creator>martijn_brekhof</dc:creator>
<dc:subject> Systeembeheer</dc:subject>
<description><![CDATA[<p>In de keuken van Debian werd er niets besproken dat ik noemenswaardig vond en daarom beperk
ik me deze keer tot alleen de geluiden uit de keuken van Fedora.</p>

<p>Andreas Tunek vraagt zich af of Fedora 17 weer bootable kan worden gemaakt op
Macs (<a href="http://lists.fedoraproject.org/pipermail/devel/2011-December/160152.html">link</a>).
Fedora 15 werkte wel op Macs maar Fedora 16 weigert te installeren of na een
upgrade van 15 te booten.
Adam Williamson geeft aan dat hiervoor EFI ondersteuning voor het booten en
voor
anaconda (installer) moet worden ontwikkeld (<a href="http://lists.fedoraproject.org/pipermail/devel/2011-December/160264.html">link</a>).</p>

<p>Giovanni Campagna vindt dat Fedora een goede tool mist om applicaties mee te
installeren. Hij doelt hiermee op een tool dat het voor eindgebruikers
makkelijk maakt om een
gewenste applicatie te vinden en noemt als voorbeeld <a href="https://launchpad.net/software-center">Ubuntu Software
Center</a> (<a href="http://lists.fedoraproject.org/pipermail/devel/2011-November/159951.html">link</a>).
Na veel positieve feedback heeft Giovanni Campagna besloten er een officiële
<a href="https://fedoraproject.org/wiki/Features/SoftwareCenter">feature</a> voor Fedora
17 van te maken (<a href="http://lists.fedoraproject.org/pipermail/devel/2011-December/160136.html">link</a>).</p>

<p>Eric Smith geeft aan dat hij bezig is om MATE voor Fedora te packagen. MATE is
een fork van GNOME 2 en hij vraagt zich af of er veel animo is voor MATE.
Hoewel er nogal wat gebruikers van Fedora zijn die GNOME 3 maar niets vinden
is er ook maar weinig animo voor MATE. Dit komt vooral omdat het er niet naar
uitziet dat MATE erg actief wordt ontwikkeld (<a href="http://lists.fedoraproject.org/pipermail/devel/2011-December/160369.html">link</a>).</p>]]></description>

</item>
<item>
<link>http://www.atcomputing.nl/blog/archives/2011/12/index.php#e2011-12-06T13_58_31.txt</link>
<guid isPermaLink="true">http://www.atcomputing.nl/blog/archives/2011/12/index.php#e2011-12-06T13_58_31.txt</guid>
<title>Geluiden uit de keukens van Debian en Fedora (november)</title>
<dc:date>2011-12-06T13:58:31+02:00</dc:date>
<dc:creator>martijn_brekhof</dc:creator>
<dc:subject> Systeembeheer</dc:subject>
<description><![CDATA[<h2>Debian</h2>

<p>Bastien Roucaries laat weten dat het verplaatsen van de directory
<code>/tmp</code> van disk naar tmpfs voor hem problemen oplevert met
beeldverwerkingsoftware.
De algemene reactie is dat <code>/tmp</code> niet bedoeld is om grote bestanden in op te slaan en dat
de software het op een andere locatie moet opslaan, bijvoorbeeld in
<code>/var/tmp</code>.
Echter, het probleem met <code>/var/tmp</code> is dat deze niet bij elke boot wordt
leeggemaakt.
Bastien stelt voor om een nieuwe directory te introduceren bijvoorbeeld
<code>/var/tmp/nonpersistent</code> <a href="http://lists.debian.org/debian-devel/2011/11/msg00281.html">(link)</a>.</p>

<p>Yaroslav Halchenko vraagt zich af of het is toegestaan om onder <code>/usr/bin</code>
subdirectories te hebben <a href="http://lists.debian.org/debian-devel/2011/11/msg00046.html">(link)</a>.
Dit is algemeen niet toegestaan alhoewel er twee
uitzonderingen zijn voor <a href="http://mailutils.org/">mailutils</a>. De
<a href="http://www.pathname.com/fhs/">FHS</a> is niet
erg duidelijk in de bewoording waardoor er nogal wat discussie ontstaat of de
FHS het nu wel of niet verbiedt. Cyril Brulebois maakt duidelijk dat de
nieuwe FSH 3.0 standaard het expliciet verbiedt <a href="http://lists.debian.org/debian-devel/2011/11/msg00073.html">(link)</a>.
De juiste locatie voor extra executables onder Debian zou zijn
<code>/usr/lib/&lt;PACKAGENAAM&gt;</code>. Maar
andere distro's gebruiken hier <code>/usr/libexec</code> voor. Debian was hier initieel
op
tegen omdat het onduidelijk is wat de bedoeling van <code>/usr/libexec</code> is. Het
lijkt
erop dat het in de FHS is opgenomen en dat Debian <code>/usr/libexec</code> zal gaan
gebruiken voor executables die niet direct door gebruikers maar door andere
executables worden aangeroepen.</p>

<p>Ben Hutchings vindt dat het tijd is om ondersteuning voor de 486 architectuur
te stoppen.
Reden is dat er nog maar weinig gebruik wordt gemaakt
van 486 hardware. Door als minimale eis 586 te nemen kan er beter
geoptimaliseerd
worden en dat zal algemeen de performance verbeteren <a href="http://lists.debian.org/debian-devel/2011/11/msg00565.html">(link)</a>.
Er zijn er natuurlijk wel een paar gebruikers die nog oude hardware draaien en
bezwaar
maken. Maar de meesten lijken het eens te zijn. Wellicht dat Wheezy (de
volgende stable) al als minimale eis 586 krijgt.</p>

<h2>Fedora</h2>

<p>Daniel J Walsh doet een voorstel om services die met root-rechten draaien te
verbieden files aan te maken onder <code>/tmp</code> en/of <code>/var/tmp</code> <a href="http://lists.fedoraproject.org/pipermail/devel/2011-November/159165.html">(link)</a>. Hier
kan namelijk
door "gewone" gebruikers misbruik van worden gemaakt. Wanneer de gebruiker vooraf
de file die de service
gebruikt aanmaakt onder <code>/tmp</code> (iedereen mag daar immers files aanmaken) en de 
service deze file inleest en uitvoert kan de gebruiker hiermee root-rechten 
verkrijgen. Door in de file bijvoorbeeld een script te verwerken zal het
script namelijk met de rechten van de service draaien.
De oplossing is om via <code>systemd</code> ieder proces een privé directory te geven
onder <code>/tmp</code> en/of <code>/var/tmp</code>. Deze directories zullen dan een willekeurige
naam
krijgen. Hierdoor is de kans op misbruik minimaal doordat het erg moeilijk is
vooraf te voorspellen welke directory wordt gebruikt door een bepaalde
service.</p>]]></description>

</item>
<item>
<link>http://www.atcomputing.nl/blog/archives/2011/11/index.php#e2011-11-22T12_41_37.txt</link>
<guid isPermaLink="true">http://www.atcomputing.nl/blog/archives/2011/11/index.php#e2011-11-22T12_41_37.txt</guid>
<title>Loopjes, loopjes, loopjes</title>
<dc:date>2011-11-22T12:41:37+02:00</dc:date>
<dc:creator>martijn_brekhof</dc:creator>
<dc:subject> Programmeren</dc:subject>
<description><![CDATA[<p>Ditmaal een voorbeeld van een goedbedoelde optimalisatie techniek die geen
verbetering maar een verslechtering opleverde. De optimalisatie houdt in dat
je het aantal keer dat een for-loop moet worden opgebouwd minimaliseert.
Dit speelt vooral wanneer je loops in loops codeert, zoals de twee loops uit
mijn vorige <a href="http://atcomputing.nl/blog/archives/2011/10/index.php#e2011-10-12T12_15_19.txt">blog</a>.
Hier als opfrisser de geoptimaliseerde code.</p>

<pre><code>for ( bug_number = 0; bug_number &lt; MAX_BUGS; bug_number++ )
{
  for ( employee_id = 0; employee_id &lt; MAX_EMPLOYEES; employee_id++ )
  {
    if( ( employee_id == bug_assignee[bug_number] ) &amp;&amp; 
        ( employee_employed[employee_id] == false ) )
    {
        printf("Bug %d assigned to non employed person\n", bug_number);
    }
  }
}
</code></pre>

<p>Als we kijken naar de buitenste for-loop dan wordt voor elke
bug een for-loop opgestart die de toegewezen medewerker opspeurt.
De binnenste for-loop wordt dus voor elke bug opgebouwd en dit opbouwen
kost CPU cycles. Er valt winst te behalen als we dit opbouwen kunnen
verminderen.</p>

<p>In ons geval zal <code>MAX_EMPLOYEES</code> meestal vele malen kleiner zijn dan
<code>MAX_BUGS</code>. Het zou in ons geval dus lonen om de twee for-loops om te draaien.
Dan hoeft er namelijk nog maar <code>MAX_EMPLOYEES</code> keer een for-loop te
worden opgebouwd.
Oftewel de code wordt als volgt:</p>

<pre><code>for ( employee_id = 0; employee_id &lt; MAX_EMPLOYEES; employee_id++ )
{
  for ( bug_number = 0; bug_number &lt; MAX_BUGS; bug_number++ )
  {
    if( ( employee_id == bug_assignee[bug_number] ) &amp;&amp; 
        ( employee_employed[employee_id] == false ) )
    {
        printf("Bug %d assigned to non employed person\n", bug_number);
    }
  }
}
</code></pre>

<p>Je zal helaas merken dat de code langzamer draait dan de voorgaande versie.
In mijn geval 2 seconden langzamer. Dit komt omdat <code>bug_assignee[bug_number]</code>
nu in elke
iteratie van de binnenste loop een ander array element aanwijst. Bij de vorige
bleef deze constant tijdens de binnenste loop en hierdoor maak je
efficiënter gebruik van je CPU registers.</p>

<p>Dit was niet wat ik beloofd had, namelijk een optimalisatie die ervoor zorgt
dat de code minder dan 1 seconde nodig heeft. Ik ga dat echter nu nog niet
verklappen. Maar ik zal jullie ook niet achterlaten met een slechter werkende
code. Er valt namelijk nog wel een seconde winst te behalen door op te merken
dat het doel is om alleen voor medewerkers die niet in dienst zijn de bugs te
tonen. We hoeven dus niet voor iedere medewerker de lijst van bugs langs te
lopen.
Als we de code aanpassen als volgt:</p>

<pre><code>for ( employee_id = 0; employee_id &lt; MAX_EMPLOYEES; employee_id++ )
{
  if (employee_employed[employee_id] == false)
  {
    for ( bug_number = 0; bug_number &lt; MAX_BUGS; bug_number++ )
    {
      if (employee_id == bug_assignee[bug_number])
      {
        printf("Bug %d assigned to non employed person\n", bug_number);
      }
    }
  }
}
</code></pre>

<p>Dan wordt de code er zeker niet leesbaarder op maar haal ik wel een winst van 1
seconde ten opzichte van de geoptimaliseerde code
aan het begin van deze blog.
Wellicht dat bovenstaande aanpassing jullie al op een idee brengt om de code
nog sneller te maken....</p>]]></description>

</item>
<item>
<link>http://www.atcomputing.nl/blog/archives/2011/11/index.php#e2011-11-01T16_08_39.txt</link>
<guid isPermaLink="true">http://www.atcomputing.nl/blog/archives/2011/11/index.php#e2011-11-01T16_08_39.txt</guid>
<title>Geluiden uit de keukens van Fedora en Debian (oktober)</title>
<dc:date>2011-11-01T16:08:39+02:00</dc:date>
<dc:creator>martijn_brekhof</dc:creator>
<dc:subject> Systeembeheer</dc:subject>
<description><![CDATA[<h2>Debian</h2>

<p>In het Debiankamp vraagt Thomas Hood zich af of Bash scripts kunnen/moeten
worden geëlimineerd <a href="http://lists.debian.org/debian-devel/2011/09/msg00574.html">(link)</a>.
Hij geeft een aantal redenen die al snel van tafel worden geveegd. De enige
reden die 
overblijft is dat Dash (Debian Amquist Shell) minder afhankelijkheden heeft.
Men 
vindt dit niet voldoende om Bash in de ban te doen.</p>

<p>Manjul Apratim merkt op dat Sid (unstable) eigenlijk erg bruikbaar is en
vraagt zich af wat het
verschil is tussen Sid en de stabiele versie van Debian. Daarnaast vraagt ie
zich af waarom Sid
nog steeds erg achter loopt met betrekking tot GNOME <a href="http://lists.debian.org/debian-devel/2011/10/msg00016.html">(link)</a>.
Jonathan Nieder geeft aan dat unstable vooral betekent dat afhankelijkheden
van pakketten wellicht
nog niet bestaan. Er mag in principe geen instabiele software aan Sid worden
toegevoegd. In dat opzicht is Sid dus vaak goed bruikbaar.
Josselin Mouette maakt duidelijk dat GNOME 3 wel al in de experimentele versie
zit. 
Echter, het kan pas in Sid worden opgenomen wanneer "alle" pakketten waaruit
GNOME 3 bestaat in Sid kunnen worden 
opgenomen. Aangezien GNOME 3 uit heel veel pakketten bestaat duurt dit
allemaal wat langer.</p>

<p>De database die de tijdzones bijhoudt is uitgezet <a href="http://article.gmane.org/gmane.comp.time.tz/4133">(link)</a>.
Dit kan grote gevolgen hebben voor localisatie van de tijd op Linux systemen. 
Maar men maakt zich er niet zo druk over aangezien er al een backup is gemaakt
en de database
op een andere locatie alweer online is <a href="http://lists.debian.org/debian-devel/2011/10/msg00086.html">(link)</a>.</p>

<p>Eric Dorland maakt bekend dat hij automake versie 1.7 zal verwijderen
<a href="http://lists.debian.org/debian-devel/2011/10/msg00373.html">(link)</a>. 
Paul Wise vraagt waarom dan 
niet eerst versie 1.4 wordt verwijderd. Eric durft daar niet aan omdat er
wellicht gebruikers zijn die
nog oude software willen bouwen die alleen te bouwen is met automake versie
1.4.</p>

<p>Marco d'Itri vraagt zich af hoe complex het zal zijn om het idee van Fedora om
alle software naar
/usr te verplaatsen ook in Debian te implementeren <a href="https://fedoraproject.org/wiki/Features/UsrMove">(link)</a> <a href="http://lists.debian.org/debian-devel/2011/10/msg00157.html">(link)</a>.
Het doel van de directories <em>/bin</em>, <em>/sbin</em>, en <em>/lib</em> is om software te
bevatten die vervolgens kan
worden gebruikt om <em>/usr</em> te mounten. Het idee is om deze taak over te hevelen
naar de initrd (initiele ramdisk).
Men geeft aan dat er een hoop voorwaarden zijn maar deze lijken vooralsnog
niet onoverkomelijk.</p>

<h2>Fedora</h2>

<p>Bij Fedora maakt Kevin Fenzy bekend dat iedere gebruiker van het Fedora
Account System (FAS) zijn of haar wachtwoord moet wijzigen en een nieuwe
publieke
SSH sleutel moet uploaden <a href="http://lists.fedoraproject.org/pipermail/devel/2011-October/158122.html">(link)</a>.
De reden is <em>niet</em> dat de systemen van Fedora zijn gehackt maar is in
navolging van het grote aantal recente inbraken op 
andere belangrijke systemen (e.g. linuxfoundation.org, kernel.org, mysql.net).
Men heeft weinig problemen met het wijzigen van het wachtwoord, maar het
wijzigen
van de sleutels vindt men meer problematisch. Dit aangezien vele één sleutel
gebruiken voor meerdere diensten. Dit vereist dan dat men meerdere sleutels
moet
gaan beheren.</p>

<p>Daniel Drake geeft aan dat er nogal een verschil zit tussen de fontgroottes
van Fedora 14 en Fedora 16. Hij vraagt zich af waardoor dit komt <a href="http://lists.fedoraproject.org/pipermail/devel/2011-September/157540.html">(link)</a>. 
Het blijkt dat deze hardcoded in GNOME zitten <a href="http://lists.fedoraproject.org/pipermail/devel/2011-October/157605.html">(link)</a>.
Dit is zo gedaan omdat men niet kan vertrouwen op de schermresolutie in dotch
per inch (DPI) die Xorg aangeeft.
Dit komt weer omdat de correcte DPI niet eenduidig kan worden berekend omdat
hardware leveranciers niet altijd correct de beeldscherm afmeting doorgeven
<a href="http://lists.fedoraproject.org/pipermail/devel/2011-October/157671.html">(link)</a>.</p>

<p>Er wordt natuurlijk nog flink ontwikkeld aan <em>systemd</em> en dit levert de nodige
discussies op. Meestal gaat dit over hoe het een en ander moet via systemd.
Maar er wordt bijvoorbeeld ook gediscussieerd over de opstarttijd van CD
(live) van een 
Fedora 16 en in vergelijking met Knoppix <a href="http://lists.fedoraproject.org/pipermail/devel/2011-October/157680.html">(link)</a>.
Lennart Poettering geeft aan dat het wel een beetje appels met peren
vergelijken is aangezien Fedora 16 veel enterprise software bevat en opstart
terwijl Knoppix veel minder opstart.
Desalniettemin is het interessant om te kijken wat er geoptimaliseerd kan
worden. Het blijkt dat sommige hardware probes op andere hardware probes staan
te wachten die eigenlijk niet afhankelijk zijn van elkaar. Hierdoor duurt het
opzetten van bijvoorbeeld LVM erg lang dat wacht totdat alle hardware probes
klaar zijn <a href="http://lists.fedoraproject.org/pipermail/devel/2011-October/157732.html">(link)</a>. </p>

<p>Ook bij Fedora wordt er druk gediscussieerd over het verplaatsen van <em>/bin</em>,
<em>/sbin</em>,
en <em>/lib</em> naar <em>/usr</em> en wat voor impact het heeft <a href="http://lists.fedoraproject.org/pipermail/devel/2011-October/158599.html">(link)</a>.
Algemeen ziet iedereen deze opzet wel zitten.
Deze opzet maakt het mogelijk om <em>/usr</em> bijvoorbeeld read-only te mounten en
het
root filesysteem read-writable. Daarnaast kan dan makkelijk het OS gedeeld
worden over meerdere machines door <em>/usr</em> te exporteren.</p>]]></description>

</item>
<item>
<link>http://www.atcomputing.nl/blog/archives/2011/10/index.php#e2011-10-12T12_15_19.txt</link>
<guid isPermaLink="true">http://www.atcomputing.nl/blog/archives/2011/10/index.php#e2011-10-12T12_15_19.txt</guid>
<title>Performance: lazy evaluation</title>
<dc:date>2011-10-12T12:15:19+02:00</dc:date>
<dc:creator>martijn_brekhof</dc:creator>
<dc:subject> Programmeren</dc:subject>
<description><![CDATA[<p>In een vorige
<a href="http://atcomputing.nl/blog/archives/2011/09/index.php#e2011-09-19T15_17_20.txt">blog</a> heb ik laten zien dat de volgorde van if-statements van
invloed kan zijn op de prestaties van je programma.
Dat dit op meerdere manieren tot uiting kan komen in je code wil ik graag
illustreren aan de hand van een ander praktijkvoorbeeld. 
De volgende code is onderdeel van een routine die een lijst van bugs moet
tonen die toegewezen zijn aan medewerkers die niet meer in dienst zijn.</p>

<pre><code>for ( bug_number = 0; bug_number &lt; MAX_BUGS; bug_number++ )
{
  for ( employee_id = 0; employee_id &lt; MAX_EMPLOYEES; employee_id++ )
  {
    if( ( employee_employed[employee_id] == false ) &amp;&amp; (employee_id == bug_assignee[bug_number]) )
    {
      printf("Bug %d assigned to non employed person\n", bug_number);
    }
  }
}
</code></pre>

<p>De code is geschreven op basis van een zogenaamde "user story" en is recht toe
recht aan geprogrammeerd.</p>

<p>De code doet precies wat de gebruiker wilde, het was echter erg traag.
Gemiddeld moest de gebruiker 30 seconden wachten op het eerste resultaat. De
routine waarin
bovenstaande <em>for-loop</em> zat had een aandeel van 28 seconden.
Dit was onacceptabel. Het resultaat mocht niet langer dan 10 seconden
op zich laten wachten.
Laten we eens kijken of we dit kunnen bereiken. </p>

<p>Allereerst neem ik de if-statement onder de loep. 
In een volgend blog zal ik de code verder analyseren en optimaliseren.
De if-statement bevat twee condities, namelijk:</p>

<pre><code>employee_employed[employee_id] == false
</code></pre>

<p>en</p>

<pre><code>employee_id == bug_assignee[bug_number]
</code></pre>

<p>De condities zijn verbonden via <code>&amp;&amp;</code> oftewel een logische AND.
Dit betekent dat de gecombineerde conditie alleen slaagt als beide condities
waar zijn.
Als één van beide condities onwaar is, zal de gecombineerde conditie ook
onwaar zijn. Wanneer de conditie voor de <code>&amp;&amp;</code> faalt, zal dus de gecombineerde
conditie ook falen. Het programma hoeft de conditie na de <code>&amp;&amp;</code> dan ook niet te
evalueren. Dit wordt door de meeste programmeertalen ondersteund; men noemt dat
<em>lazy evaluation</em>. 
Dit stelt ons in staat om dit stukje code te optimaliseren door hier ook een
frequentie-analyse te doen.</p>

<p>De buitenste loop itereert over de lijst van bugs, terwijl de binnenste loop
itereert over de lijst van medewerkers. 
In de binnenste loop gaan we op zoek naar de medewerker die is toegewezen aan
de bug en controleren we of de medewerker nog in dienst is.
Nu is het zo dat elke bug altijd is toegewezen aan maximaal één medewerker.
Oftewel de conditie <code>employee_id == bug_assignee[bug_number]</code> zal in de
binnenste loop maar één keer slagen. Er zijn meerdere medewerkers inmiddels
niet meer in dienst. Dit betekent dat de conditie
<code>employee_employed[employee_id] == false</code> veel vaker slaagt. 
Dit heeft tot gevolg dat tijdens de binnenste loop een aantal keer onnodig
alle twee de condities worden geëvalueerd. Namelijk voor die situaties
waarbij
de medewerker niet meer in dienst is en hij of zij niet aan de bug is
toegewezen.
Dit kunnen we voorkomen door de condities om te draaien.</p>

<pre><code>...
if( (employee_id == bug_assignee[bug_number]) &amp;&amp; (employee_employed[employee_id] == false) )
...
</code></pre>

<p>Deze simpele aanpassing leverde in dit geval een winst op van bijna 23
seconden en
voldeed daarmee aan de wensen van de gebruiker.</p>

<p>Er is echter nog veel meer winst te behalen. Het lukte mij om de routine
te herschrijven zodat deze minder dan één seconde nodig had.
Ik zal hier in een volgend blog verder op ingaan.</p>]]></description>

</item>
<item>
<link>http://www.atcomputing.nl/blog/archives/2011/10/index.php#e2011-10-05T13_31_38.txt</link>
<guid isPermaLink="true">http://www.atcomputing.nl/blog/archives/2011/10/index.php#e2011-10-05T13_31_38.txt</guid>
<title>Geluiden uit de keukens van Fedora en Debian (september)</title>
<dc:date>2011-10-05T13:31:38+02:00</dc:date>
<dc:creator>martijn_brekhof</dc:creator>
<dc:subject> Systeembeheer</dc:subject>
<description><![CDATA[<p>In het Debiankamp vraagt Christoph Anton Mitterer zich af of Debian's kernel
gevolgen ondervindt van de
<a href="https://www.linuxfoundation.org/news-media/blogs/browse/2011/08/cracking-kernelorg">kernel.org</a> hack <a href="http://lists.debian.org/debian-devel/2011/09/msg00003.html">(link)</a>. 
Ben Hutchings laat weten dat hij de ondertekeningen controleert en dat de
sleutels niet op kernel.org
staan. Naar zijn inziens is de code dus niet gecompromitteerd.</p>

<p>Jon Dowland vraagt zich af of ondersteuning voor encrypted filesystemen niet
gebruikersvriendelijker kan <a href="http://lists.debian.org/debian-devel/2011/09/msg00176.html">(link)</a>. Nu is het zo dat je tijdens
installatie de optie
hebt voor encryptie van het volledige filesysteem. Hij wil graag dat er ook
een optie komt om alleen de home directory te versleutelen. 
Men heeft hier bedenkingen bij, aangezien het de gebruiker
wellicht een vals gevoel van veiligheid geeft. Sommige gevoelige informatie
zoals sleutels in het geheugen of bijvoorbeeld printjobs onder <code>/var/spool/cups</code>
worden dan niet versleuteld. Wanneer de gebruiker zijn systeem
laat "hibernaten" worden deze gegevens onversleuteld naar de swapruimte
geschreven.</p>

<p>Stefano Zacchiroli (de huidige Debian projectleider) geeft een verslag van
zijn presentatie op de GNU Hackers Meeting (GHM) in Parijs <a href="http://lists.debian.org/debian-project/2011/09/msg00004.html">(link)</a>.
Hij heeft daar lang gepraat met Steve White over Debians procedure om bugs
door te spelen naar de originele ontwikkelaars (upstream). Veel eindgebruikers
melden bugs bij Debian aan die niet door de packager maar door de originele
ontwikkelaar moeten worden opgelost.
Steve White kwam met het voorstel om het bug tracking systeem en/of het
package tracking
systeem van Debian aan te passen, zodat upstream ontwikkelaars makkelijker hun
software in Debian in de gaten kunnen houden. Hiermee een betere link leggende
tussen de eindgebruikers en de originele ontwikkelaars <a href="http://lists.debian.org/debian-devel/2011/09/msg00224.html">(link)</a>.</p>

<p>Didier Raboud geeft een verslag van de Mobile UX discussie sessie (Birds Of a
Feather (BoF)) <a href="http://lists.debian.org/debian-devel/2011/09/msg00126.html">(link)</a>.
Belangrijkste conclusie is dat er veel initiatieven zijn om Debian op Mobiele
platformen (denk aan smartphones en tablets) te krijgen, maar dat deze nu
verdeeld zijn over meerdere groepen.
Er moet een overkoepelende organisatie komen waardoor de inzet beter 
kan worden gecoördineerd.</p>

<p>Bij Fedora is er wat ophef ontstaan over het openssh pakket dat in Rawhide
(ontwikkelversie van Fedora) na een update niet meer werkte <a href="http://lists.fedoraproject.org/pipermail/devel/2011-September/156695.html">(link)</a>.
Men vraagt zich af hoe het kan dat een pakket door de tests is gekomen en zo 
in Rawhide is opgenomen. 
Jan F. Chadima geeft eerlijk toe dat hij de oorzaak van het probleem is
<a href="http://lists.fedoraproject.org/pipermail/devel/2011-September/156741.html">(link)</a>.
Hij gebruikt wel degelijk tests om het pakket te controleren en begrijpt niet
waarom de
tests bij hem slaagden terwijl na installatie de software niet werkte.
Het is duidelijk dat Rawhide een ontwikkelversie is en stuk kan gaan. Maar men
vindt dat er toch beter getest moet worden voordat het wordt opgenomen in
Rawhide. Men heeft goede hoop dat testen via het autoQA project
dit soort problemen in de toekomst kan voorkomen.</p>

<p>Matyas Selmeci wil graag weten hoe hij prioriteiten in packages kan verwerken
zodat <code>yum</code> op bepaalde machines selectief pakketten installeert
<a href="http://lists.fedoraproject.org/pipermail/devel/2011-September/157023.html">(link)</a>.
Richard Hughes raadt hem <code>zif</code> aan en raakt daarmee een gevoelige snaar.
Het programma <code>zif</code> is net als <code>yum</code> een package manager. 
Zif gebruikt echter andere regels om te bepalen welk pakket moet worden
geïnstalleerd
dan de regels die <code>yum</code> gebruikt. Men vindt dit onacceptabel en men heeft
liever dat
verbeteringen worden aangedragen bij <code>yum</code>. Daarnaast is men erg sceptisch of
<code>zif</code> wel beter is in het afhandelen van pakket-afhankelijkheden dan <code>yum</code>.
Hierover blijft Richard Hughes helaas stil. Kevin Kofler legt uit dat de
logica in <code>yum</code> om een pakket te kiezen zo complex is geworden, dat het als een
random algoritme
moet worden beschouwd. De nieuwe package manager <code>zif</code> probeert dit te
verbeteren <a href="http://lists.fedoraproject.org/pipermail/devel/2011-September/157069.html">(link)</a>.</p>

<p>Tom Callaway laat weten dat de Fedora Packaging Guidelines zijn
geactualiseerd <a href="http://lists.fedoraproject.org/pipermail/devel/2011-September/157361.html">(link)</a>.
Ten behoeve van hardening is een sectie <a href="http://en.wikipedia.org/wiki/Position-independent_code">Position Independent Executable
(PIE)</a> 
toegevoegd. Dit maakt het voor aanvallers moeilijker om vooraf te bepalen
waar bepaalde code in het geheugen wordt geplaatst. Als dit wel bekend is,
kunnen ze ervoor zorgen dat hun eigen code wordt uitgevoerd via een zogenaamde
<a href="http://en.wikipedia.org/wiki/Return-to-libc_attack">return-to-libc</a> aanval.
Daarnaast is er een voorbeeld toegevoegd waarbij expliciete afhankelijkheden
zijn toegestaan en <code>md5-peslyak</code> is toegevoegd waarin bundelen van bibliotheken
wel is
toegestaan.</p>

<p>Paul Wouters doet een oproep om <code>dns-trigger</code> te testen <a href="http://lists.fedoraproject.org/pipermail/devel/2011-September/157108.html">(link)</a>.
Dit pakket maakt het mogelijk om een (desktop)gebruiker te waarschuwen wanneer DNS niet te vertrouwen is via <a href="http://en.wikipedia.org/wiki/Domain_Name_System_Security_Extensions">DNSSEC</a>.</p>]]></description>

</item>
<item>
<link>http://www.atcomputing.nl/blog/archives/2011/09/index.php#e2011-09-19T15_17_20.txt</link>
<guid isPermaLink="true">http://www.atcomputing.nl/blog/archives/2011/09/index.php#e2011-09-19T15_17_20.txt</guid>
<title>Performance: volgorde van condities</title>
<dc:date>2011-09-19T15:17:20+02:00</dc:date>
<dc:creator>martijn_brekhof</dc:creator>
<dc:subject> Programmeren</dc:subject>
<description><![CDATA[<p>Er zijn een heleboel zaken die de performance van een programma kunnen
beïnvloeden. Eén daarvan is je code en simpelweg geldt dat hoe minder 
instructies nodig zijn om iets uit te voeren hoe sneller het programma zal draaien.
In deze en toekomstige blogs zal ik wat voorbeelden laten zien
waarbij de performance soms iets en soms aanzienlijk verbeterd kan worden
door de code net iets anders op te schrijven. Ik gebruik voor de voorbeelden
de programmeertaal C. Echter zijn de meeste concepten ook in andere talen
van toepassing.
Let op, soms zal het herschrijven van de code tot gevolg hebben dat het niet
meer voldoet aan een gebruikte programmeerstijl of standaard. Daar maak ik me
even geen zorgen over. Het gaat me nu vooral om de performance. </p>

<p>In deze eerste blog omtrent performance wil ik het hebben over de volgorde van <code>if-then-else</code> statements.
Bekijk het volgende stukje C-code eens.</p>

<pre><code>#include&lt;stdio.h&gt;

#define AMOUNT_OF_ITERATIONS 1000000000

int func1() { return 10; }
int func2() { return 12; }
int func3() { return 23; }
int func4() { return 11; }

int parse_message(char *msg)
{
  if(strcmp("potato", msg) == 0)
  {
          return func1();
  }
  else if(strcmp("tomato", msg) == 0)
  {
          return func2();
  }
  else if(strcmp("banana", msg) == 0)
  {
          return func3();
  }
  else if(strcmp("orange", msg) == 0)
  {
          return func4();
  }
}


int main(int argc, char* argv[])
{
  unsigned long int i;
  int rate;

  for(i = 0; i &lt; AMOUNT_OF_ITERATIONS; i++)
  {
        if( random()%2 )
      rate = parse_message(argv[1]);
    else
      rate = parse_message(argv[2]);
  }
  printf("Rate=%d\n", rate);
  return 0;
}
</code></pre>

<p>De code doet niet echt veel zinnigs. Het is een aangepaste versie van code
van een daemon waarin zich een performance probleem voordeed. Maar dit soort
code, waarbij op basis
van een reeks <code>if-then-else</code> statements (of in een <code>switch</code>) bepaalde code wel
of niet wordt aangeroepen, kom ik
geregeld tegen. 
De <code>main</code> functie is alleen bedoeld om het effect van de volgorde van de
condities in de functie <code>parse_message</code> te demonstreren. Dat we hier op
"willekeurige" basis bepalen of het eerste of het tweede argument moet worden
gebruikt is nodig om te voorkomen dat compiler-optimalisaties roet in het eten
gooien.
De code is als volgt te compileren met <code>gcc</code>.</p>

<pre><code>$ gcc -O3 freqs.c -o freqs
</code></pre>

<p>De optie <code>-O3</code> zorgt ervoor dat <code>gcc</code> zoveel mogelijk optimalisatie zal
toepassen. Dit doe ik om te laten zien dat je als programmeur toch ook echt
invloed kan hebben.
Het programma kan ik als volgt uitvoeren.</p>

<pre><code>$ time ./freqs orange orange
Rate=11

real  0m15.747s
user  0m15.741s
sys   0m0.000s
</code></pre>

<p>Ik gebruik het programma <code>time</code> om de hoeveelheid tijd te laten zien die het
programma in beslag heeft genomen.
Ik roep het programma dus aan met twee keer "orange" als argument. Dit zorgt
ervoor dat
altijd de laatste conditie slaagt in de functie <code>parse_message</code>. 
Laten we
nu eens het programma uitvoeren met als argumenten <code>potato</code> en <code>potato</code>:</p>

<pre><code>$ time ./freqs potato potato
Rate=10

real  0m6.231s
user  0m6.228s
sys   0m0.000s
</code></pre>

<p>Dit is een performance verbetering van maar liefst 60 procent. 
De winst wordt behaald doordat in de tweede run altijd de eerste conditie
slaagt.
Bij de eerste run slaagde telkens de laatste conditie en werd dus tijdens
iedere
aanroep van <code>parse_message</code> ook gecontroleerd of <code>message</code> gelijk is aan
<code>potato</code>, <code>tomato</code>, of <code>banana</code>. Deze controle wordt in de tweede run niet
gedaan waardoor deze dus vele malen sneller is.</p>

<p>Vaak zullen condities met een bepaalde frequentie slagen gedurende normaal
gebruik van het programma.
Stel nu dat uit tests blijkt dat het programma voor 90 procent wordt
aangeroepen met <code>orange</code> en <code>tomato</code>. Dan zal het dus lonen om de condities
voor 
<code>orange</code> en <code>tomato</code> bovenaan te zetten.
Het analyseren van het slagingspercentage van de verschillende condities wordt
ook wel een
<em>frequentie-analyse</em> genoemd.
Soms kun je direct uit de programmacode de frequenties afleiden. Maar meestal zul je met
een zogenaamde 
<em>coverage tool</em> of <em>profiler</em> aan de slag moeten. Je voert dan het programma in
een realistische omgeving uit en de coverage tool of profiler laat dan zien
hoe vaak bepaalde onderdelen van je code zijn uitgevoerd.
Om dit te illustreren zal ik de GNU profiler gebruiken, genaamd <code>gprof</code>. 
Om <code>gprof</code> te kunnen gebruiken dien je het programma te hercompileren met
profile informatie (gcc optie <code>-pg</code>) als volgt:</p>

<pre><code>$ gcc -pg freqs.c -o freqs
</code></pre>

<p>Let op dat je geen level 3 optimalisatie meegeeft. Je zult merken dat anders de
functies niet meer worden aangeroepen, ze zijn namelijk inline gecompileerd in de <code>main</code> functie. Het gevolg is dat je dan geen frequentie-analyse kan doen.</p>

<p>Door het programma nogmaals uit te voeren wordt er profiling
informatie naar het bestand <code>gmon.out</code> geschreven.</p>

<pre><code>$ ./freqs tomato banana
</code></pre>

<p>Met <code>gprof</code> kun je vervolgens het bestand <code>gmon.out</code> uitlezen.</p>

<pre><code>$ gprof -b -Q freqs
Flat profile:

Each sample counts as 0.01 seconds.
  %   cumulative   self               self     total           
 time   seconds   seconds    calls   ns/call  ns/call  name    
 67.68      1.78     1.78                              main
 26.62      2.48     0.70 100000000     7.00     8.35  parse_message
  3.04      2.56     0.08 49996838      1.60     1.60  func2
  2.09      2.62     0.06 50003162      1.10     1.10  func3
  0.57      2.63     0.01                              func1
</code></pre>

<p>Voor iedere functie wordt de rekentijd en het aantal aanroepen getoond. Voor
ons is nu alleen het aantal aanroepen van belang. Dit wordt getoond in de
kolom <code>calls</code>. Vervolgens kun je deze informatie gebruiken om de beste
volgorde van je if-statements te bepalen. In bovenstaand geval zouden dus
eerst de condities voor "tomato" en "banana" moeten komen en dan de overige.</p>

<p>Wanneer je geen functies aanroept in je if-statements kun je beter <code>gcov</code>
gebruiken. Als je toch <code>gprof</code> wilt gebruiken kun je dummy-functies toevoegen
aan je code.</p>

<pre><code>void func1() { return; }
void func2() { return; }
...
</code></pre>

<p>Deze functies dien je vervolgens in je if-statements aan te roepen.</p>

<p>Helaas levert frequentie-analyse niet altijd een performance winst
op. Dat het in bovenstaand voorbeeld wel winst oplevert komt voor het grootste
deel door de functie <code>strcmp</code>. Deze routine vereist nogal wat CPU tijd. Wanneer de condities
een simpele vergelijking bevatten (bijvoorbeeld <code>amount == 1</code>) zul je merken
dat de winst erg tegenvalt.
Daarnaast moet er uit de frequentie analyse een duidelijke winnaar komen. Als
de condities ongeveer met dezelfde frequentie slagen zal de
winst ook tegenvallen.</p>]]></description>

</item>
<item>
<link>http://www.atcomputing.nl/blog/archives/2011/09/index.php#e2011-09-09T12_35_22.txt</link>
<guid isPermaLink="true">http://www.atcomputing.nl/blog/archives/2011/09/index.php#e2011-09-09T12_35_22.txt</guid>
<title>Geluiden uit de keukens van Debian en Fedora (augustus)</title>
<dc:date>2011-09-09T12:35:22+02:00</dc:date>
<dc:creator>martijn_brekhof</dc:creator>
<dc:subject> Systeembeheer</dc:subject>
<description><![CDATA[<p>Bij Debian meldt Roger Leigh dat Fedora een aparte groep "lock" heeft
geïntroduceerd
om de directory <code>/var/lock</code> niet meer world-writable te hoeven maken. Hij vraagt
zich af of dit onder Debian ook zo kan worden opgezet.
Het zal vooral
aanpassingen aan de init-scripts vereisen waarbij de opgestarte daemon niet
onder root-rechten zal draaien. De benodigde lock directory moet dan eerst
aangemaakt worden en van de juiste permissies worden voorzien voordat de
daemon wordt opgestart (<a href="http://lists.debian.org/debian-devel/2011/08/msg00327.html">link</a>).</p>

<p>Asheesh Laroia laat weten dat de nieuwe mentor website up is (<a href="http://lists.debian.org/debian-devel/2011/08/msg00214.html">link</a>).
De site is bedoeld om het makkelijker te maken voor niet officiële Debian
ontwikkelaars om een zogenaamde sponsor te vinden voor hun package.
De sponsor zal het pakket dan controleren en namens de ontwikkelaar in de
Debian distributie opnemen.</p>

<p>Jan Möbius heeft een bug aangemeld met betrekking tot <code>rpc.statd</code> dat
poort 631 in gebruik neemt terwijl dit de poort is voor CUPS.
Ben Hutchings laat weten dat het een bekend probleem is met het gebruik van
de <code>bindresvport</code>
functie. Dit is een functie die een willekeurige poort opent tussen 512 en 1023.
Hij maakt vervolgens meteen gebruik van de gelegenheid om <code>systemd</code> te promoten door te stellen dat 
overstappen op <code>systemd</code> de juiste oplossing is. Deze oplossing wordt snel van tafel
geveegd. Er is namelijk de mogelijkheid om bepaalde poorten uit te sluiten voor
<code>bindresvport</code>. Echter wordt dit voor de IPv6 versie van <code>bindresvport</code> niet
gebruikt. Ben Hutchings levert vervolgens een patch aan om dit op te lossen 
(<a href="http://lists.debian.org/debian-devel/2011/08/msg00413.html">link</a>, <a href="http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=638810">link</a>).</p>

<p>Er wordt druk gediscussieerd over het nut van <code>xz</code> compressie ten
opzichte van de veel gebruikte <code>gz</code> compressie voor de bestanden in de
directory <code>/usr/share/doc</code>. Het blijkt dat de winst
van <code>xz</code> ten opzichte van de al veel gebruikte <code>bz2</code> compressie minimaal is en
soms zelfs slechter (<a href="http://lists.debian.org/debian-devel/2011/08/msg00336.html">link</a>). Er wordt dan ook geopperd om wellicht <code>bz2</code> te gaan
gebruiken in plaats van over te stappen op <code>xz</code>.</p>

<p>Nanakos Chrysostomos heeft na het aanbrengen van een patch voor
een lang openstaande bug zichzelf als copyrighthouder voor
de yubico PAM module toegevoegd. Hier was de originele auteur niet van
gediend.
Nanakos vroeg zich af of dit correct was. Hij kreeg helaas geen bijval en
iedereen vond
zijn bijdrage ook te klein om als copyright houder te worden opgenomen 
(<a href="http://lists.debian.org/debian-devel/2011/08/msg00629.html">link</a>).</p>

<p>Bij Fedora meldt Josef Bacik in navolging van de heftige discussie rondom
BTRFS vorige maand dat BTRFS niet het standaard filesysteem wordt in Fedora
Core 16 (<a href="http://lists.fedoraproject.org/pipermail/devel/2011-August/155345.html">link</a>).</p>]]></description>

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

