<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>www.linuxweblogs.nl &#187; jc</title>
	<atom:link href="http://www.linuxweblogs.nl/author/jc/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.linuxweblogs.nl</link>
	<description>Een verzameling Nederlandstalige weblogs die schrijven over Linux</description>
	<lastBuildDate>Tue, 07 Feb 2012 21:59:09 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>C++0X</title>
		<link>http://www.atcomputing.nl/blog/archives/2010/09/index.php#e2010-09-28T12_14_13.txt?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=c0x</link>
		<comments>http://www.atcomputing.nl/blog/archives/2010/09/index.php#e2010-09-28T12_14_13.txt#comments</comments>
		<pubDate>Tue, 28 Sep 2010 10:14:13 +0000</pubDate>
		<dc:creator>jc</dc:creator>
				<category><![CDATA[Algemeen]]></category>
		<category><![CDATA[Programmeren]]></category>

		<guid isPermaLink="false">http://www.atcomputing.nl/blog/archives/2010/09/index.php#e2010-09-28T12_14_13.txt</guid>
		<description><![CDATA[In mijn vorige blog heb ik gesproken over de vergadering van de
standaardisatie van C++ in Rapperswil.  Laten we nu eens gaan kijken
naar wat er allemaal gaat veranderen in de aanstaande C++ standaard.

Allereerst moet je je realiseren dat het bij prog...]]></description>
			<content:encoded><![CDATA[<p></p><p>In mijn vorige blog heb ik gesproken over de vergadering van de<br />
standaardisatie van C++ in Rapperswil.  Laten we nu eens gaan kijken<br />
naar wat er allemaal gaat veranderen in de aanstaande C++ standaard.</p>
<p>Allereerst moet je je realiseren dat het bij programmeren en het<br />
ontwikkelen van programmeertalen gaat over het aanbrengen van<br />
abstractie.  In eerste instantie werden computers geprogrammeerd door<br />
nullen en enen in het geheugen te zetten met behulp van schakelaars.<br />
Later werden groepjes van nullen en enen vervangen door octale of<br />
hexadecimale cijfers.  </p>
<p>Wat meer abstractie kwam er met de introductie van assembly talen.  In<br />
plaats van het binaire <code>0011 1110 0110 0111</code> of het hexadecimale <code>3E 67</code>,<br />
mocht je dan schrijven <code>LOAD A, 103</code>.  Je hebt dan niets meer te maken met<br />
nullen en enen, je zegt dat er in een processorregister met de naam <code>A</code>, de<br />
waarde <code>103</code> (hexadecimaal: <code>67</code>) moet worden gezet.  De assembler<br />
vertaalt de tekst <code>LOAD A, 103</code> naar <code>3E 67</code>.</p>
<p>Maar zelfs dat is niet abstractie genoeg.  In het midden van de jaren<br />
50 van de vorige eeuw bedacht een team van IBM een taal waarbij je<br />
wiskundige formules kon schrijven, die dan door een vertaalprogramma<br />
omgezet konden worden naar machinetaal instructies.<br />
Zo kon bijvoorbeeld <code>OPP = BREEDTE * HOOGTE</code> geschreven worden.  Het<br />
vertaalprogramma maakte daar zoiets van als: </p>
<pre><code>OPP:     RESERVEER 4 BYTES
BREEDTE: RESERVEER 4 BYTES
HOOGTE:  RESERVEER 4 BYTES
.....
LOAD       A, (BREEDTE) # haal breedte op en stop in register A
LOAD       B, (HOOGTE)  # haal hoogte op en stop in register B
MUL        C, A, B      # vermenigvuldig register A met B en sla op in C
STORE      C, (OPP)     # sla register C op in OPP
</code></pre>
<p>Je ziet, je hoeft als programmeur die <code>OPP=BREEDTE*HOOGTE</code> niet meer na<br />
te denken over hoe het moet worden gedaan, alleen maar dat het moet<br />
worden gedaan.</p>
<p>Je vraagt je misschien af: &#8220;wat heeft dit allemaal te maken met<br />
C++0X?&#8221;  Bij de stap van het C++ uit 1998 (met een kleine<br />
koerscorrectie in 2003) naar C++0X worden grote stappen gemaakt die<br />
onder andere het abstractieniveau verhogen.</p>
<p>Mooie voorbeelden zijn meteen twee voor de programmeur zeer zichtbare<br />
nieuwe faciliteiten: <code>auto</code> en het <code>for</code> statement over een range:</p>
<p>Het keyword <code>auto</code> dat nog in de taal zat maar geen echt gebruik meer<br />
had, heeft een nieuwe betekenis gekregen bij het definieren van een<br />
variabele.  <code>auto</code> laat de compiler uitzoeken wat het type van de<br />
variabele moet zijn &#8211; je hoeft dat dus niet meer expliciet op te<br />
geven:</p>
<pre><code>template &lt;typename Container&gt;
int f(Container c) {
  auto a=5;
  auto b=*(c.begin());
}
</code></pre>
<p>De variabele <code>a</code> hierboven krijgt als type <code>int</code>.  Dat is nog niet<br />
echt interessant.  Maar variabele <code>b</code> krijgt als type: datgene wat het<br />
dereferencen van de returnwaarde van de memberfunctie <code>begin()</code> van het<br />
type <code>Container</code> teruggeeft.  Als je de functie <code>f</code> aanroept met als<br />
parameter een <code>list&lt;double&gt;</code>, dan krijgt <code>b</code> het type <code>double</code>.  Maar de<br />
functie een <code>map&lt;string, int&gt;</code> als parameter meekrijgt, is <code>b</code> automatisch<br />
een <code>pair&lt;string, int&gt;</code>.  En dat is niet zo makkelijk &#8220;zelf&#8221; uit te<br />
zoeken in zo&#8217;n generieke functie:  In C++98 zouden we moeten<br />
schrijven: <code>typename c::valuetype b=*(c.begin())</code></p>
<p>Je ziet: je kunt met <code>auto</code> op een hoger abstractieniveau tegen dingen<br />
aankijken.  Iets soortgelijks zie je ook in de nieuwe mogelijkheid van<br />
de <code>for</code> lus.  Toevallig speelt <code>auto</code> daar ook een rol.</p>
<p>Vroeger zou je geschreven hebben:</p>
<pre><code>for (vector&lt;int&gt;::iterator p=v.begin(); p!=v.end; ++p) {
    cout &lt;&lt; *p &lt;&lt; endl;
}
</code></pre>
<p>We hebben al gezien dat je dat in C++0X ook mag schrijven als:</p>
<pre><code>for (auto p=v.begin(); p!=v.end; ++p) {
    cout &lt;&lt; *p &lt;&lt; endl;
}
</code></pre>
<p>Maar nu mag het zelfs op een hoger abstratie-niveau:</p>
<pre><code>for (auto x: v) {
    cout &lt;&lt; x &lt;&lt; endl;
}
</code></pre>
<p>En dat nu is zelfs echt nu: gcc 4.6 ondersteunt deze features nu ook<br />
al, zoals te zien is op http://gcc.gnu.org/gcc-4.6/cxx0x_status.html<br />
Je vertelt in deze <code>for</code>-lus niet meer hoe je over de container wilt<br />
itereren, maar alleen maar dat je dat wilt.</p>
<p>Behalve faciliteiten die denken op een hoger abstractieniveau mogelijk<br />
maken, zijn er ook faciliteiten toegevoegd die programma&#8217;s in C++<br />
sneller maken.  Een veel gehoorde klacht is dat als je een stukje code<br />
hebt als volgt (waarbij <code>Matrix</code> een klasse is die je zelf geschreven<br />
hebt):</p>
<pre><code>Matrix f() {
    Matrix m;
    ....
    return m;
}

int main() {
    Matrix mat;

    mat=f();
}
</code></pre>
<p>er erg veel kopieeracties van de <code>Matrix m</code> naar mat plaatsvindt.  In<br />
C++0X zijn zogenaamde move constructors mogelijk, waarbij je aangeeft<br />
dat de oude eigenaar van de inhoud van de <code>Matrix</code> (zoals <code>m</code> in de<br />
functie <code>f</code>) geen behoefte meer aan de data heeft, en dat de nieuwe<br />
eigenaar deze data over mag nemen.</p>
<p>Ook is de taal orthogonaler geworden.  Dat wil zeggen dat als een<br />
bepaalde constructie in situatie A mag, en situatie B lijkt erg op A,<br />
dan mag B die constructie ook.  Een voorbeeld:  We definieren een <code>struct</code><br />
met twee members, en een <code>class</code> met twee (private) members die middels<br />
een constructor worden geinitialiseerd:</p>
<pre><code>int main() {

    struct A {
        int a;
        int b;
    };

    class B {
    public:
        B(int x, int y) : a(x), b(y) {}
    private:
        int a;
        int b;
    }
}
</code></pre>
<p>Nu mogen we A en B objecten aanmaken.  Maar in C++0X mogen we de oude<br />
C syntaxt ook gebruiken: dat leidt automatisch tot het aanroepen van<br />
de constructor.</p>
<pre><code>A mijna = { 1, 2 };    // C, C++98 en C++0X okee

B mijnb(1,2);          // C++98 en C++0X okee
B nogeenb = { 1, 2 };  // C++0X okee
</code></pre>
<p>Maar dat mag zelfs bij het aanroepen van een functie:</p>
<pre><code>extern void f(A);
extern void g(B);

f( { 1, 2 })           // C++0X okee, niet in C++98
g( { 1, 2 })           // C++0X okee, niet in C++98
</code></pre>
<p>Via zogenaamde initializer lists mag je zelfs schrijven:</p>
<pre><code>vector&lt;int&gt; vec = { 1, 2, 3, 4 };
</code></pre>
<p>Naast deze vrij grote toevoegingen zijn er nog tal van wijzigingen die<br />
klein lijken, maar wel een groot programmeergemak opleveren.</p>
<p>Zo hoef je als je een template variabele definieert, niet meer uit te<br />
kijken dat een dubbele <code>&gt;</code> leidt tot het interpreteren als een <code>&gt;&gt;</code>:</p>
<pre><code>vector&lt;list&lt;int&gt; &gt;  v   // C++98: &gt; &gt; is nodig
vector&lt;list&lt;int&gt;&gt;   v2  // C++0X: spatie niet verplicht, &gt;&gt; mag ook
</code></pre>
<p>Een ergernis van velen is het ontbreken van een echte null pointer in<br />
C++.  Daardoor weet de compiler bij een overload als:<br />
    void f(int) { }<br />
    void f(char *) {}<br />
niet wat te doen met een anroep als <code>f(0)</code>.</p>
<p>In C++0X is er een constante: <code>nullptr</code> die als null pointer gebruik<br />
wordt.  Deze is niet zomaar te converteren van of naar een <code>int</code>.</p>
<p>Behalve wijzigingen en extra&#8217;s in de taal, zijn er ook flink wat<br />
toevoegingen in de standaardbibliotheek.  Zo zijn er onder andere<br />
faciliteiten voor reguliere expressies, threading (ook ondersteund in<br />
de taal), hash tables (zoasl <code>map</code>, maar dan ongesorteerd), en smart<br />
pointers ter vervanging van <code>auto_pointer</code>.</p>
<p>Al met al is de standaard flink gegroeid.<br />
Er zijn nog veel meer aanpassingen.<br />
Een aardige lijst staat op wikipedia:<br />
http://en.wikipedia.org/wiki/C%2B%2B0x maar ook Bjarne Stroustrup<br />
heeft een goed document over de nieuwe standaard:</p>
<p>http://www2.research.att.com/~bs/C++0xFAQ.html</p>
]]></content:encoded>
			<wfw:commentRss>http://www.linuxweblogs.nl/2010/09/28/c0x/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rapperswil 2-7 augustus 2010: een C++ vergadering</title>
		<link>http://www.atcomputing.nl/blog/archives/2010/08/index.php#e2010-08-17T14_45_17.txt?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=rapperswil-2-7-augustus-2010-een-c-vergadering</link>
		<comments>http://www.atcomputing.nl/blog/archives/2010/08/index.php#e2010-08-17T14_45_17.txt#comments</comments>
		<pubDate>Tue, 17 Aug 2010 12:45:17 +0000</pubDate>
		<dc:creator>jc</dc:creator>
				<category><![CDATA[Algemeen]]></category>
		<category><![CDATA[Programmeren]]></category>

		<guid isPermaLink="false">http://www.atcomputing.nl/blog/archives/2010/08/index.php#e2010-08-17T14_45_17.txt</guid>
		<description><![CDATA[Van 2 tot en met 7 augustus werd in Rapperswil, Zwitserland 
vergaderd door de ISO C++ standaardisatiecommissie.  Ik was daar
voor Nederland als Head of Delegation aanwezig namens het NeN voor AT
Computing en de NLUUG.

Je kunt je afvragen waar in zo'n...]]></description>
			<content:encoded><![CDATA[<p></p><p>Van 2 tot en met 7 augustus werd in Rapperswil, Zwitserland<br />
vergaderd door de ISO C++ standaardisatiecommissie.  Ik was daar<br />
voor Nederland als Head of Delegation aanwezig namens het NeN voor AT<br />
Computing en de NLUUG.</p>
<p>Je kunt je afvragen waar in zo&#8217;n vergadering over gesproken wordt.<br />
Waarom moet er zo lang gepraat worden?</p>
<p>In de vergadering in Rapperswil waren 8 landen vertegenwoordigd door<br />
zo&#8217;n 60 mensen.  Het grootste blok komt traditiegetrouw uit de<br />
verenigde staten.  Ieder land heeft tijdens de stemmingen één stem.<br />
Daarom wordt tijdens de officiele zittingen altijd eerst over de<br />
Amerikaanse mening gestemd, waarna ieder &#8220;head of delegation&#8221; van de<br />
landen hun nationale stem mag uitbrengen.  De leden van de<br />
standaardisatiecommissie werken bij vendors (compilerleveranciers<br />
zoals Microsoft, HP, Sun, RedHat (g++) en EDG (Edison Design Group een<br />
OEM compilerbouwer), C++ grootgebruikers zoals Bloomberg en Fermilabs,<br />
onderwijsinstellingen zoals universiteiten (en AT Computing!) en vele<br />
andere bedrijven en instellingen.  Al deze mensen hebben belang bij een<br />
standaard die implementeerbaar is, bruikbaar is en onderwijsbaar is.<br />
Er zijn dus verschillende belangen, waardoor soms ook spannende<br />
discussies kunnen ontstaan.</p>
<p>De eerste C++ standaard (C++98) kwam uit in 1998.  Daar is toen lang<br />
aan gewerkt.  In 2003 kwam er een &#8220;tussenversie&#8221; waarin kleine<br />
onvolkomenheden werden gerepareerd, maar geen grote features<br />
werden toegevoegd.  Er zit nu een echt nieuwe standaard aan te komen.  De<br />
werktitel is C++0X hoewel de standaard niet in het eerste decennium<br />
van deze eeuw uit is gekomen.  Er is vertraging opgelopen omdat op een<br />
vrij laat moment een groot feature uit de taal is verwijderd dat maar<br />
niet goed gespecifieerd leek te kunnen worden (&#8220;concepts&#8221;).  Een reële<br />
datum lijkt nu medio 2011 te zijn.</p>
<p>Geen enkel commissielid kent de hele standaard, of begrijpt van alle<br />
ontwerp-beslissingen waarom die genomen zijn.  Daarom wordt de<br />
vergadering opgesplitst in werkgroepen:  Eén of twee werkgroepen over<br />
de bibliotheek, Eén of twee over de kern van de taal (&#8220;core&#8221;) en een<br />
over concurrency (een van de nieuwe features in de taal is<br />
multi-threading).  De werkgroepen lopen de voor hun relevante<br />
problemen door en doen dan een voorstel voor de gehele vergadering.</p>
<p>Hoewel de atmosfeer ontspannen en vriendschappelijk is, zijn met name<br />
de ISO zittingen erg officieel.  Er mag absoluut niet de<br />
indruk ontstaan dat bedrijven hun mening proberen door te drukken of<br />
dat er gefraudeerd wordt.  Tijdens de werkgroepvergaderingen wordt er<br />
ook regelmatig gestemd, maar dan veel informeler.  Vaak worden er<br />
&#8220;straw polls&#8221; gehouden waar alle deelnemers aan de commissie mogen<br />
stemmen: &#8220;Stel dat we dit probleem oplossen op de<br />
besproken manier, zou je daar dan voor of tegen zijn&#8221;.  Meestal kun je<br />
kiezen uit vier standpunten: Strongly in Favor, Weakly in Favor,<br />
Weakly Against, Strongly Against.  Afgekort tot SF, WF, WA en SA.<br />
Heel soms kun je ook stemmen voor OMDB (&#8220;over my dead body&#8221;), maar dat<br />
kwam tijdens deze vergadering niet voor.  Vaak gaat het dan over<br />
nieuwe features, maar omdat in het stadium waarin de commissie nu zit<br />
geen nieuwe features worden toegevoegd, speelt dat nu niet.</p>
<p>De commissie heeft een werkdocument dat in feite de standaard in<br />
aanbouw is.  In juni 2010 hebben de leden van de ISO (de nationale<br />
standaardisatiecommissies)  mogen stemmen over de toenmalige versie<br />
van dat document.  Dat document had de status FCD &#8211; Final Committee<br />
Draft.  De landen hadden de gelegenheid de FCD goed of af te keuren,<br />
en ze konden daarbij commentaar op de tekst zelf leveren.  Dat<br />
commentaar kan groot zijn (wij vinden dat feature XYZ verwijderd moet<br />
worden: veel consequenties) maar ook erg klein: &#8220;op pagina 123 staat<br />
dat de libraryfunctie zusenmezo een <code>int</code> teruggeeft, terwijl op pagina<br />
456 een voorbeeld staat waarin de functie een <code>long</code> teruggeeft&#8221;.  Deze<br />
commentaren heten &#8220;National Body Comments&#8221;.  Tijdens de vergadering in<br />
Rapperswil zijn alle national body comments langsgelopen.  Dat waren<br />
er honderden.  </p>
<p>De verwachting is dat over twee vergaderingen (in maart 2011) alle<br />
commentaren adequaat kunnen zijn afgehandeld en dat het werkdocument<br />
met de status FDIS (Final Draft International Standard) naar het ISO<br />
gestuurd zal worden.  De landen kunnen er dan nog een laatste Ja of<br />
Nee tegen zeggen en hopelijk hebben we dan medio 2011 een C++11<br />
standaard.  Deze standaard maakt C++ makkelijker te gebruiken en<br />
makkelijker te leren.</p>
<p>Daarna blijft de commissie tweemaal per jaar bijeenkomen.  Ten eerste<br />
zullen er toch weer problemen opduiken in het 1200 pagina&#8217;s tellende<br />
document.  Maar ook zal een werkgroep weer nieuw leven ingeblazen<br />
worden: evolution.  In deze werkgroep worden nieuwe features<br />
voorbereid voor de standaard na 2011.  Hopelijk zal het mogelijk<br />
blijken om het belangrijke onderwerp &#8220;concepts&#8221; dat helaas niet in de<br />
huidige FCD meegenomen kon worden nu wél op een goede manier n de<br />
standaard opgenomen kan worden.  Het zal foutmeldingen van compilers<br />
een stuk beter maken, en het programmeren in C++ nog verder<br />
vergemakkelijken.</p>
<p>In een volgende blog gaan we kijken welke spannende features er in<br />
C++0X zitten en in hoeverre deze nu al bruikbaar zijn.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.linuxweblogs.nl/2010/08/17/rapperswil-2-7-augustus-2010-een-c-vergadering/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Op zoek naar de bron van de datacorruptie&#8230;</title>
		<link>http://www.atcomputing.nl/blog/archives/2010/07/index.php#e2010-07-12T12_07_11.txt?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=op-zoek-naar-de-bron-van-de-datacorruptie</link>
		<comments>http://www.atcomputing.nl/blog/archives/2010/07/index.php#e2010-07-12T12_07_11.txt#comments</comments>
		<pubDate>Mon, 12 Jul 2010 10:07:11 +0000</pubDate>
		<dc:creator>jc</dc:creator>
				<category><![CDATA[Algemeen]]></category>
		<category><![CDATA[Systeembeheer]]></category>

		<guid isPermaLink="false">http://www.atcomputing.nl/blog/archives/2010/07/index.php#e2010-07-12T12_07_11.txt</guid>
		<description><![CDATA[Thuis gebruik ik al jaren met veel plezier mythtv
(http://www.mythtv.org) op een Linux systeem als videorecorder.
We kijken bijna nooit meer live TV, het meest recente journaal staat
altijd klaar, en reclames spoelen we zo door omdat mythtv die voor on...]]></description>
			<content:encoded><![CDATA[<p></p><p>Thuis gebruik ik al jaren met veel plezier mythtv<br />
(<a href="http://www.mythtv.org">http://www.mythtv.org</a>) op een Linux systeem als videorecorder.<br />
We kijken bijna nooit meer live TV, het meest recente journaal staat<br />
altijd klaar, en reclames spoelen we zo door omdat mythtv die voor ons<br />
markeert.</p>
<p>Op een zeker moment begonnen nieuwe opnamen her en der &#8220;blokjes&#8221; te<br />
vertonen.  Van die typische MPEG-artefacten die je ook wel eens bij<br />
satelliet-TV ziet als het weer erg slecht is, of bij DVB-T<br />
(Digitenne en dergelijke) als een slecht afgeschermde brommer voorbij<br />
komt rijden.</p>
<p>Toen ik als test een aantal video-files naar een andere machine<br />
kopieerde om dáár het bestand beter te bekijken, gaf <code>rsync</code> af en<br />
toe foutmeldingen dat het kopieren niet goed gelukt was: de checksum<br />
aan beide zijden was niet hetzelfde.</p>
<p>Pardon?</p>
<p>Er leek dus iets mis met de hardware.  Het geheugen is het makkelijkst te<br />
testen.  Ik heb memtest86 (<a href="http://www.memtest86.com/">http://www.memtest86.com/</a>) een dag laten draaien<br />
om het geheugen te testen.  Geen enkel probleem.</p>
<p>Dan de disk.  In de logfiles was niets te zien.  Het viel het me wel op<br />
(bij de vele keren rebooten) dat er af en toe een filesystem op de<br />
disk corrupt was.  <code>smartctl</code> wist me te vertellen dat de disk zelf<br />
niet het idee had dat hij &#8220;bijna defect&#8221; zou zijn.  En bij het<br />
controleren van de disk gekoppeld aan een ander systeem vond ook<br />
<code>badblocks</code> dat er niets aan de hand was.  Ook andere intensieve tests<br />
op de disk aan een ander systeem lieten geen disk-problemen zien.</p>
<p>Vreemd.</p>
<p>De laatste test die ik deed gaf uitsluitsel.  Ik schreef een klein<br />
programmaatje dat willekeurige bytes in een file zet:</p>
<pre><code>#include &lt;stdlib.h&gt;
#include &lt;stdio.h&gt;

int main() {

  srandom(0);

  const int n=1024;

  short ar[n];
  long long i;
  int idx;

  for (i=0, idx=0; i&lt;2L*1024*1024*1024 / sizeof(ar[0]); ++i) {
    ar[idx++]=random();
    if (idx==n) {
      write(1, ar, sizeof(ar));
      idx=0;
    }

  }
}
</code></pre>
<p>Dit programma schrijft 2GiB aan pseudo-willekeurige bytes naar<br />
standard output.  Die gegenereerde random getallen zijn voorspelbaar<br />
als je het begingetal kent.  Ze zijn niet goed genoeg voor<br />
cryptografische doeleinden, maar wel goed genoeg om reproduceerbaar,<br />
min of meer willekeurige bytes te maken.  Iedere keer dat het<br />
programma start, krijg je bij hetzelfde begingetal dezelfde reeks.<br />
Dat begingetal wordt gezet met de functie <code>srandom</code>.  Hier gebruiken<br />
we het begingetal 0.  De 2GiB aan gegenereerde data kun je vervolgens<br />
in een file zetten:</p>
<pre><code>    ./randfile &gt; OUT
</code></pre>
<p>Door het programma nogmaals te draaien (met hetzelfde begingetal 0),<br />
kun je vergelijken of wat er in de file staat, overeenkomt met wat er<br />
door het programma wordt geschreven:</p>
<pre><code>    ./randfile | cmp OUT -
</code></pre>
<p>En wat bleek?  In ongeveer één op de miljoen bytes, was het meest<br />
significante bit (met de waarde 128) van 1 op 0 gevallen (zo werd een<br />
byte met de hexadecimale waarde C3 nu 43, en een byte met de waarde F9<br />
werd 79).  Het leek dat bij het schrijven naar de disk, soms de data<br />
niet goed bij de disk aankwam.  Het probleem zat niet in het lezen:<br />
nadat ik de file gemaakt had, en het programma op een andere machine<br />
startte, bleken de bytes ook echt fout op de disk te staan.  Ook met<br />
andere disks trad dit probleem op.  En op een andere machine met<br />
dezelfde disk, trad het verschijnsel niet op.  Het probleem leek dus<br />
niet aan de disk zelf te liggen.</p>
<p>Het probleem werd opgelost door een ander moederbord te nemen, en daar<br />
de videorecorder weer mee op te bouwen.  Toen dat gebeurd was, waren<br />
nieuwe opnamen weer vrij van blokjes, en traden filesystem problemen<br />
niet meer op.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.linuxweblogs.nl/2010/07/12/op-zoek-naar-de-bron-van-de-datacorruptie/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Performance-problemen oplossen zonder extra hardware</title>
		<link>http://www.atcomputing.nl/blog/archives/2010/06/index.php#e2010-06-24T10_48_22.txt?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=performance-problemen-oplossen-zonder-extra-hardware</link>
		<comments>http://www.atcomputing.nl/blog/archives/2010/06/index.php#e2010-06-24T10_48_22.txt#comments</comments>
		<pubDate>Thu, 24 Jun 2010 08:48:22 +0000</pubDate>
		<dc:creator>jc</dc:creator>
				<category><![CDATA[Algemeen]]></category>
		<category><![CDATA[Systeembeheer]]></category>

		<guid isPermaLink="false">http://www.atcomputing.nl/blog/archives/2010/06/index.php#e2010-06-24T10_48_22.txt</guid>
		<description><![CDATA[Laatst was een van onze consultants bij een klant die last had van
ernstige performance-problemen.  Na uitbreiding van het aantal
clientprocessen was het systeem bij tijd en wijle onbruikbaar traag.

In dergelijke gevallen komt dan al snel het aloude p...]]></description>
			<content:encoded><![CDATA[<p></p><p>Laatst was een van onze consultants bij een klant die last had van<br />
ernstige performance-problemen.  Na uitbreiding van het aantal<br />
clientprocessen was het systeem bij tijd en wijle onbruikbaar traag.</p>
<p>In dergelijke gevallen komt dan al snel het aloude programma top om de<br />
hoek zetten om te kijken waar het probleem nu werkelijk in zit.</p>
<p>Helaas laat top op systeemniveau niet zien hoe het resourcegebruik is<br />
van disk en netwerk; dus wachtsituaties die bij die resources ontstaan<br />
zijn niet te zien.  Gelukkig laat atop deze wel zien.  </p>
<p>Na installatie van atop bleek dat van de 24 CPUs er hooguit 6 werk<br />
hadden, en er 18 idle waren.  De CPU-belasting kon dus niet het<br />
probleem zijn.  Het beschikbare geheugen (48GiB) werd voor 70% benut<br />
door de cache en er was geen swapping actief.  Geheugengebrek was dus<br />
ook niet de oorzaak van het performance-probleem.  Ook de disks konden<br />
de vraag nog aan:  ze waren gemiddeld 30% busy.  En het netwerk<br />
(gigabit) kon de stroom data van circa 10 megabit/s ruimschoots aan.</p>
<p>Je kunt je natuurlijk afvragen: hoe kan een systeem waarvan deze vier<br />
hardware resources niet overbelast zijn, toch zo onwerkbaar traag<br />
zijn.  Vaak denken mensen dat als een systeem te traag is, er door<br />
extra of snellere hardware verlichting verkregen kan worden.  Helaas<br />
is dat niet altijd (of eigenlijk: meestal niet) het geval.</p>
<p>Laten we een voorbeeld nemen.  Stel dat er tegelijkertijd 100<br />
applicaties draaien op het systeem die allemaal een record in een<br />
bestand willen aanpassen.  Ze zullen daarvoor een record lock<br />
aanvragen bij het systeem.  Als ze allemaal een ander record willen<br />
aanpassen, kunnen ze tegelijkertijd op het bestand werken.  Maar wat<br />
nu als de applicatie zo geschreven is dat (om welke reden dan ook) er<br />
geen lock wordt aangevraagd voor een enkel record, maar voor de gehele<br />
file?  Dan kunnen de 100 applicaties niet meer tegelijkertijd de file<br />
aanpassen, en zullen ze een voor een aan het werk moeten gaan.  Zelfs<br />
al heb je 24 CPUs en zou je dus 24 applicaties echt tegelijk kunnen<br />
afhandelen.  Als er nu per seconde meer nieuwe aanvragen binnenkomen<br />
dan er een-voor-een per seconde kunnen worden afgehandeld, krijg je een<br />
steeds groter wordende achterstand.  </p>
<p>Je kunt dit vergelijken met een 24-baans snelweg waarvan<br />
op een klein stukje van de weg maar één baan mag worden bereden.<br />
Als je het brede deel van de snelweg verbreedt van 24 rijstroken naar<br />
48, levert dat helemaal niets op.  Het is de wegversmalling die het<br />
probleem oplevert.  Hier geldt: meer asfalt, niets wijzer.  Als je de<br />
wegversmalling zou verbreden (waarschijnlijk een veel goedkopere<br />
oplossing dan de hele weg verbreden), heb je het probleem op een veel<br />
effectievere manier opgelost.</p>
<p>In de praktijk blijkt dat software resources (zoals locks en<br />
semaforen) erg vaak de reden zijn van performance-problemen.<br />
Dergelijke wachtsituaties kun je zien door te kijken naar het<br />
wait-channel in de uitvoer van <code>ps</code>:</p>
<pre><code>$ ps -o pid,wchan:20,s,cmd
  PID WCHAN                S CMD
32275 wait                 S -bash
32277 pipe_wait            S awk {n+=$0} END {print n}
32278 fcntl_setlk          S tstlock
32279 -                    R tstlock
32280 fcntl_setlk          S tstlock
32281 fcntl_setlk          S tstlock
32282 fcntl_setlk          S tstlock
32283 fcntl_setlk          S tstlock
32284 fcntl_setlk          S tstlock
32285 fcntl_setlk          S tstlock
32299 -                    R ps -o pid,wchan:20,s,cmd
</code></pre>
<p>We kunnen hier duidelijk zien dat er maar een tstlock proces is dat<br />
loopt (de status is R).  De andere staan allemaal te wachten op het<br />
verkrijgen van een file lock (ze staan in de kernel te wachten op<br />
fcntl_setlk).  Op een systeem met meerdere CPUs staan hier de andere<br />
CPUs duimen te draaien&#8230;</p>
<p>Moraal van dit verhaal: Kijk bij performance-problemen naar alle<br />
resources, en niet alleen naar de hardware resources.  Voor je<br />
het weet heb je veel geld uitgegeven aan nieuwe hardware die het<br />
probleem niet oplost omdat de problemen in de applicatiesoftware<br />
zitten.  Motto: extra ijzer, niets wijzer.  En oh ja, bij die klant<br />
kwam het ook goed zonder andere hardware te hoeven kopen.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.linuxweblogs.nl/2010/06/24/performance-problemen-oplossen-zonder-extra-hardware/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rsync en performance</title>
		<link>http://www.atcomputing.nl/blog/archives/2010/05/index.php#e2010-05-04T12_59_53.txt?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=rsync-en-performance</link>
		<comments>http://www.atcomputing.nl/blog/archives/2010/05/index.php#e2010-05-04T12_59_53.txt#comments</comments>
		<pubDate>Tue, 04 May 2010 11:59:53 +0000</pubDate>
		<dc:creator>jc</dc:creator>
				<category><![CDATA[Algemeen]]></category>
		<category><![CDATA[Tips and Tricks]]></category>

		<guid isPermaLink="false">http://www.atcomputing.nl/blog/archives/2010/05/index.php#e2010-05-04T12_59_53.txt</guid>
		<description><![CDATA[Het Probleem

Ik was laatst een nieuwe disk aan het in-gebruik-nemen, waarbij ik
veel grote files moest kopieren van de oude (kleinere) disk.  Dat
soort dingen doe ik normaliter met rsync (daarvan zitten de opties in
mijn vingers).  Maar nu zag ik dat ...]]></description>
			<content:encoded><![CDATA[<p></p><p>Het Probleem</p>
<p>Ik was laatst een nieuwe disk aan het in-gebruik-nemen, waarbij ik<br />
veel grote files moest kopieren van de oude (kleinere) disk.  Dat<br />
soort dingen doe ik normaliter met rsync (daarvan zitten de opties in<br />
mijn vingers).  Maar nu zag ik dat de performance bedroevend was.  Ik<br />
moest zo&#8217;n 700GiB aan data overpompen, en dat ging met een tempo van<br />
zo&#8217;n 30MiB/s.  Beide disks kunnen ieder minstens 100MiB/sec lezen<br />
en/of schrijven.  En ik haalde dus nog geen derde daarvan.  (We hebben<br />
het over een totale doorlooptijd van ruim 2 uur versus 6 uur!)</p>
<p>Meten&#8230;</p>
<p>Ik ben toen eens wat gaan meten en gaan spelen.  Hiervoor bedacht ik<br />
een simpele benchmark: het kopieren van een file van 10GiB.  Zowel de<br />
bronfile als de bestemming stonden op een ext4 filesysteem dat ik op<br />
de buitenste (snelste) tracks van de twee fysieke disk formatteerde.</p>
<p>Als kopieerprogramma&#8217;s gebruikte ik:</p>
<ul>
<li>rsync</li>
<li>cpio</li>
<li>cp</li>
<li>cat</li>
</ul>
<p>uiteraard voorafgegaan door commando&#8217;s om de cache te legen en<br />
afgesloten door een sync om de cache te flushen.  Dus bijvoorbeeld:</p>
<pre><code>sync                               # forceer dirty buffers naar disk
echo 3 &gt; /proc/sys/vm/drop_caches  # gooi caches weg
time sh -c "cp $SRC $DEST; sync"   # meet cp én sync tijd
</code></pre>
<p>De echo naar /proc/sys/vm/drop_caches forceert het volledig<br />
invalideren van de cache.  Dat werkt alleen voor de niet-dirty<br />
pagina&#8217;s, daarom dat we eerst een sync commando gebruiken om alle<br />
dirty pagina&#8217;s naar disk te forceren.  Het betreffende kopieer programma zal<br />
de 10GiB file kopieren, maar ook eindigen vóórdat de laatste blokken naar<br />
disk worden geschreven (die blijven nog 30 seconden in de cache plakken).<br />
Daarom meet het time commando de tijd die nodig is voor het kopieer programma,<br />
en de sync om de laatste restjes te flushen.</p>
<p>De metingen voor rsync, cpio, cp en cat wezen het volgende uit:</p>
<pre><code>user      sys     elaps  hog  MiB/s  test
158.75   108.71  320.08  83%   31   rsync
  5.24    80.60  116.81  73%   87   cpio
  0.73    53.41  109.36  49%   93   cp
  1.42    62.03  108.80  58%   94   cat
</code></pre>
<p>Ik ben daarop wat nader gaan kijken.  Wat blijkt:<br />
rsync heeft 3 processen nodig:  een lezend, een schrijvend en een<br />
niets-doend (control?) proces.  Op mijn 4-core systeem draaien ze<br />
bijna de hele tijd alledrie op één enkele CPU.  Met het commando<br />
taskset kun je afdwingen op welke CPUs een proces mag draaien.  Stel<br />
dat de drie rsync processen de PID&#8217;s 1111, 1112, 1113 hebben, dan kun<br />
je afdwingen dat ze ieder op hun eigen CPU draaien met:</p>
<pre><code>taskset -pc 0 1111   # forceer op CPU0
taskset -pc 1 1112   # forceer op CPU1
taskset -pc 2 1113   # forceer op CPU2
</code></pre>
<p>Door met het taskset commando meteen na het starten ieder rsync<br />
proces zijn eigen CPU te geven, gaat de throughput omhoog van<br />
31MiB/s naar 39MiB/s.  Als de drie rsync processen met taskset<br />
geforceerd worden op één CPU, loopt de performance terug naar<br />
27MiB/s.</p>
<p>rsync heeft daarnaast erg veel user+sys CPU-tijd nodig.  Ondanks dat, schaalt<br />
de on-demand cpufreq niet de frequentie omhoog.  Als ik de frequentie forceer<br />
op de hoogst mogelijke met:</p>
<pre><code>for i in 0 1 2 3 ; do
  echo performance &gt; /sys/devices/system/cpu/cpu$i/cpufreq/scaling_governor
done
</code></pre>
<p>dan gaat de throughput van rsync fors omhoog: 58MiB/sec.  De CPU&#8217;s draaien dan<br />
op de hoogst mogelijke frequentie (op dit systeem 2.6GHz).  Als we dat<br />
combineren met de taskset truuk om de drie rsync processen ieder hun eigen CPU<br />
te geven, weten we er zelfs 79MiB/s uit te persen.  Nog altijd zo&#8217;n 20% lager<br />
dan de andere, en tegen flink CPU-verbruik, maar toch.</p>
<p>De conclusie is dat je door in plaats van rsync, cp te gebruiken in de default<br />
instellingen, je van 30MiB/s naar 93MiB/s kan gaan.  Maar ook door een<br />
beetje te spelen met de instellingen van het systeem, kun je zelfs met<br />
rsync flinke verbeteringen bereiken!</p>
<pre><code>throughput #CPUs    frequentie
22MiB/s    1 CPU,    0.8GHz
23MiB/s    1-3 CPUs, 0.8GHz
27MiB/s    1 CPU,    ondemand
31MiB/s    1-3 CPUs, ondemand     &lt;&lt; default
38MiB/s    3 CPUs,   0.8GHz
39MiB/s    3 CPUs,   ondemand
58MiB/s    1-3 CPUs, 2.6GHz
58MiB/s    1 CPU,    2.6GHz
79MiB/s    3 CPUs,   2.6GHz
</code></pre>
<p>In de tabel geeft de tweede kolom aan hoe de rsync processen over de<br />
CPU&#8217;s verdeeld werden: 1 CPU wil zeggen dat met taskset de drie rsyncs<br />
alledrie op één en dezelfde CPU gedwongen werden.  1-3 CPus wil zeggen<br />
dat de scheduler zelf de vrije hand had, en 3 CPU&#8217;s wil zeggen dat<br />
ieder rscyn proces met taskset zijn eigen CPU kreeg.</p>
<p>Je kunt duidelijk zien dat het slechter kan dan de default<br />
instellingen, maar ook heel veel beter!</p>
<p>De toekomst&#8230;</p>
<p>Op Linux Weekly News<br />
<a href="http://lwn.net/Articles/384132/">http://lwn.net/Articles/384132/</a><br />
stond recentelijk een bericht dat de ondemand scheduler moeite heeft<br />
met processen die veel I/O doen en ook vrij veel CPU tijd nodig<br />
hebben: In de tijd dat de CPU op disk I/O staat te wachten, wordt de<br />
CPU weer naar een lage frequentie teruggeschaald.  Als het proces dan<br />
weer wil rekenen duurt het enige tijd voordat er weer omhoog wordt<br />
geschaald.  Arjan van de Ven van het Intel Open Source Technology<br />
Centre heeft een aanpassing op de ondemand scheduler aangebracht die<br />
de CPU pas omlaag schaalt als deze echt idle is (en niet op disk I/O<br />
staat te wachten).</p>
<p>Je kunt dit verschijnsel ook mooi zien:</p>
<p>Als je</p>
<pre><code>modprobe cpufreq_stats
</code></pre>
<p>doet, krijg je precies (in jiffies gemeten) het aantal hits te zien<br />
voor de verschillende te gebruiken clock frequenties.</p>
<p>Bekijken we dit voor een rsync commando, dan zien we<br />
bijvoorbeeld voor cpu nummer 2:</p>
<pre><code>cat /sys/devices/system/cpu/cpu2/cpufreq/stats/time_in_state
2600000 423293
1900000 363
1400000 534
800000 6645805
</code></pre>
<p>Je kunt hier dus zien dat cpu2 (sinds het laden van de module) het<br />
grootste deel van de tijd in de lage frequentie (0.8GHz) heeft gelopen.</p>
<p>De aanpassing van Arjan van de Ven is nog een lapje voor het bloeden,<br />
want hij heeft een hele nieuwe governor in voorbereiding.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.linuxweblogs.nl/2010/05/04/rsync-en-performance/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Programmeren is een kunst&#8230;</title>
		<link>http://www.atcomputing.nl/blog/archives/2010/03/index.php#e2010-03-01T14_19_32.txt?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=programmeren-is-een-kunst</link>
		<comments>http://www.atcomputing.nl/blog/archives/2010/03/index.php#e2010-03-01T14_19_32.txt#comments</comments>
		<pubDate>Mon, 01 Mar 2010 12:19:32 +0000</pubDate>
		<dc:creator>jc</dc:creator>
				<category><![CDATA[Algemeen]]></category>
		<category><![CDATA[Programmeren]]></category>

		<guid isPermaLink="false">http://www.atcomputing.nl/blog/archives/2010/03/index.php#e2010-03-01T14_19_32.txt</guid>
		<description><![CDATA[Er was eens....

een bank met vele kantoren door het land.  De medewerkers in de
kantoren klaagden dat de nieuwe computers te traag waren.  Dit speelde
in de tijd dat electronisch bankieren, pinnen en geldautomaten nog een
onbeduidende rol speelden.  K...]]></description>
			<content:encoded><![CDATA[<p></p><p>Er was eens&#8230;.</p>
<p>een bank met vele kantoren door het land.  De medewerkers in de<br />
kantoren klaagden dat de nieuwe computers te traag waren.  Dit speelde<br />
in de tijd dat electronisch bankieren, pinnen en geldautomaten nog een<br />
onbeduidende rol speelden.  Klanten gingen naar de bank om geld op te<br />
nemen, en door de trage computers ontstonden er lange rijen.  Daarom<br />
wilde de bank af van het contract met de leverancier.</p>
<p>Maar de leverancier stuurde een performance analyse en tuning expert<br />
om de oorzaak van de problemen te onderzoeken.  Hij zag al snel dat<br />
één specifiek programma vrijwel alle CPU capaciteit opsoupeerde.  Met<br />
een profiling tool kon hij inzoomen op het programma, en vond hij de<br />
uiteindelijke oorzaak.  In de source code van het programma stond:</p>
<pre><code>for (i=0; i&lt;strlen(s); ++i) {
    if (... s[i] ...) ...
}
</code></pre>
<p>Die string s was gemiddeld vele duizenden karakters lang  en iedere<br />
aanroep van strlen loopt langs alle karakters van de string op zoek<br />
naar de afsluitende null-byte.  De string veranderde echter nooit in<br />
het lusje, dus hoefde de programmeur ook maar één keer de lengte vast<br />
te stellen.  Daarmee zouden duizenden aanroepen van strlen bespaard<br />
kunnen worden, en dus miljoenen karaktervergelijkingen.</p>
<p>De code (door de bank zelf geschreven) werd snel aangepast, en de<br />
bankbedienden leefden nog lang en gelukkig:</p>
<pre><code>n=strlen(s);
for (i=0; i&lt;n; ++i) {
    if (... s[i] ...) ...
}
</code></pre>
<p>Had de programmeur niet beter zijn best moeten doen?  Hij had toch<br />
moeten weten dat door de code zo op te schrijven als hij gedaan had,<br />
de code CPU-tijd nodig heeft die kwadratisch schaalt met de lengte van<br />
de string?</p>
<p>Iedere programmeur kent het motto:<br />
&#8220;first make it work, then make it work fast&#8221;.  Hiermee worden de<br />
valkuilen van micro-optimalisatie voorkomen.  Maar het bovenstaande<br />
voorbeeld zou je bijna doen geloven dat de programmeur een<br />
Machiavelliaans motto aanhing &#8220;first make it work slowly.&#8221;</p>
<p>Deze onnadenkendheid komt regelmatig voor.  En het is niet alleen maar<br />
een kwestie van &#8220;je moet niet proberen het wiel opnieuw uit te<br />
vinden&#8221;.  Soms tikken onwetende programmeurs zonder na te denken &#8220;in<br />
het wilde weg&#8221; en hebben ze op die manier zomaar bubble sort<br />
&#8220;uitgevonden&#8221;.  En dan zijn ze er misschien nog trots op ook!</p>
<p>Naast het kiezen van het goede algoritme, moet je ook de goede<br />
datastructuur kiezen voor het soort probleem dat je aan het oplossen<br />
bent.  De keuze voor een datastructuur kan erg veel invloed hebben.<br />
Als je bijvoorbeeld een gelinkte lijst gebruikt voor de opslag van<br />
miljoenen items waar je ook nog in wilt kunnen zoeken, heb je weer een<br />
suboptimale oplossing gevonden.  Een gehashte datastructuur of een<br />
binaire boom laat je in dit geval de te zoeken data veel sneller<br />
vinden.</p>
<p>Programmeurs moeten dus het wiel niet proberen uit te vinden, en<br />
zoveel mogelijk gebruik maken van bestaande bibliotheken.  Maar om<br />
problemen zoals die van de bank hierboven te vermijden, moeten de<br />
programmeurs wel wéten wat de eigenschappen van algoritmes en<br />
datastructuren zijn.  Goed programmeerwerk begint dus bij een goede<br />
opleiding.  Is het alleen maar de mooie opschmück in moderne<br />
tekstverwerkers die er voor zorgt dat ze net zo traag aanvoelen als<br />
old-school programma&#8217;s zoals WordStar die in de jaren 80 van de vorige<br />
eeuw op 8-bits processor&#8217;s draaiden in computers met 64KB geheugen?</p>
<p>Velen zeggen dat hergebruik is waar het om draait.  Maar bovenal<br />
moeten programmeurs weten wanneer je wat op welke manier moet<br />
hergebruiken.  Ze moeten dus kennis hebben van het probleemdomein, en<br />
van algoritmes en datastructuren.</p>
<p>Een goede programmeur weet ook wanneer een inferieur algoritme toch<br />
betere resultaten op zal leveren.  Als je bijvoorbeeld zeker weet dat<br />
je nooit meer dan vijf items wilt sorteren (denk aan de vijf<br />
dobbelstenen in een Yahtzee spel), kun je misschien wel het beste<br />
kiezen voor bubble sort, omdat dat bubble sort gegeven de beperkte<br />
probleemgrootte het snelst en simpelst is.</p>
<p>Dus: leer van anderen (open source helpt!) en lees goede boeken<br />
(die je dan wel ook moet snappen).  En mocht je <B>de</B> boekenserie bij<br />
uitstek goed lezen (Donald Knuths &#8220;The art of computer programming&#8221;)<br />
zou je nog mazzel kunnen hebben en je onsterfelijk kunnen maken ook:<br />
Don Knuth betaalt een hexadecimale dollar ($2,56) voor iedere fout die<br />
je in het boek ontdekt.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.linuxweblogs.nl/2010/03/01/programmeren-is-een-kunst/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>40 jaar UNIX</title>
		<link>http://www.atcomputing.nl/blog/archives/2009/07/20/index.php#e2009-07-20T08_45_49.txt?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=40-jaar-unix</link>
		<comments>http://www.atcomputing.nl/blog/archives/2009/07/20/index.php#e2009-07-20T08_45_49.txt#comments</comments>
		<pubDate>Mon, 20 Jul 2009 07:45:49 +0000</pubDate>
		<dc:creator>jc</dc:creator>
				<category><![CDATA[Algemeen]]></category>
		<category><![CDATA[Meta]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[<p>UNIX - a giant leap for mankind...</p>

<p>Zomer 1969: Op 20 juli zit de hele wereld aan de TV gekluisterd om de eerste
voetstappen van een mens op de maan te zien.</p>

<p>Terwijl Neil Armstrong zijn woorden "A small step for a man, a giant leap for
mankind" uitspreekt, vindt in AT&#38;T Bell laboratories in Murray Hill, New
Jersey een technische revolutie plaats die zo mogelijk nog meer directe
invloed op ons leven nu heeft: Ken Thompson en Dennis Ritchie bedenken UNIX.</p>

<p>De basis-ideeen in UNIX uit die zomer van 1969 waren baanbrekend.  Daarom
worden de concepten nog steeds gebruikt, niet alleen in UNIX varianten
(waaronder Linux en MacOS X) maar ook in andere moderne besturingssystemen
zoals Windows XP en zijn opvolgers.  Niet voor niets mochten Thompson en
Ritchie in 1983 de Turing award ontvangen voor hun werk.  De Turing award
wordt wel gezien als de Nobelprijs van de informatica.</p>

<p>Na 10 jaar UNIX systemen beheerd te hebben beginnen Ger Austen en Hendrik-Jan
Thomassen (A en T) in 1985 het bedrijf 
<a href="http://www.atcomputing.nl">AT Computing</a>; het eerste cursus- en
consultancybedrijf op het gebied van UNIX in Nederland.</p>

<p>Ruim 20 jaar na het ontstaan van UNIX bouwt in 1991 de Finse student Linus
Torvalds het UNIX compatible systeem Linux.</p>

<p>Inmiddels zijn we veertig jaar na de eerste schreden van Neil Armstrong, en
heeft Linux met zijn 18 jaren een volwassen leeftijd!  En wat zien we: Het
aantal UNIX-achtige systemen en dan met name Linux groeit en groeit.  </p>

<p>UNIX en Linux worden gebruikt op zeer kleine en zeer grote installaties.  Zo is
kans groot dat als u een ADSL router heeft, u daar Linux in heeft draaien.
Dat geldt ook voor navigatie apparaten, televisies, digitale videorecorders,
kassa's bij supermarkten en warenhuizen, reclamezuilen etc etc.  En wie een
hippe iPhone van Apple gebruikt, beleeft ook dagelijks plezier van het UNIX
dat binnenin het kleinood zijn werk doet...</p>

<p>Ook grote UNIX en Linux installaties worden door iedereen dagelijks gebruikt:
Het is algemeen bekend dat zoekdienst Google vele honderduizenden Linux
systemen laat samenwerken tot de website die iedereen kent.  En bekende sites
als <a href="http://www.ebay.com">Ebay</a>, <a href="http://www.amazon.com">Amazon</a>, 
<a href="http://www.bol.com">bol.com</a> en de <a href="http://www.ns.nl">Nederlandse Spoorwegen</a> 
zijn UNIX en Linux
grootgebruikers.  Van de <a href="http://www.top500.org">500</a> grootste en snelste 
computers in de wereld werkt ruim 95% met UNIX of Linux. </p>

<p>Kortom: Is UNIX na 40 dienstjaren pensioengerechtigd en afgeschreven?  Nee,
integendeel!  UNIX is springlevend!  U zult nog veel van UNIX en Linux
gebruik maken.</p>

<p><a href="http://www.atcomputing.nl">AT Computing</a> - Verstand van UNIX, gevoel voor UNIX - al 25 jaar.</p>]]></description>
			<content:encoded><![CDATA[<p></p><p>UNIX &#8211; a giant leap for mankind&#8230;</p>
<p>Zomer 1969: Op 20 juli zit de hele wereld aan de TV gekluisterd om de eerste<br />
voetstappen van een mens op de maan te zien.</p>
<p>Terwijl Neil Armstrong zijn woorden &#8220;A small step for a man, a giant leap for<br />
mankind&#8221; uitspreekt, vindt in AT&amp;T Bell laboratories in Murray Hill, New<br />
Jersey een technische revolutie plaats die zo mogelijk nog meer directe<br />
invloed op ons leven nu heeft: Ken Thompson en Dennis Ritchie bedenken UNIX.</p>
<p>De basis-ideeen in UNIX uit die zomer van 1969 waren baanbrekend.  Daarom<br />
worden de concepten nog steeds gebruikt, niet alleen in UNIX varianten<br />
(waaronder Linux en MacOS X) maar ook in andere moderne besturingssystemen<br />
zoals Windows XP en zijn opvolgers.  Niet voor niets mochten Thompson en<br />
Ritchie in 1983 de Turing award ontvangen voor hun werk.  De Turing award<br />
wordt wel gezien als de Nobelprijs van de informatica.</p>
<p>Na 10 jaar UNIX systemen beheerd te hebben beginnen Ger Austen en Hendrik-Jan<br />
Thomassen (A en T) in 1985 het bedrijf<br />
<a href="http://www.atcomputing.nl">AT Computing</a>; het eerste cursus- en<br />
consultancybedrijf op het gebied van UNIX in Nederland.</p>
<p>Ruim 20 jaar na het ontstaan van UNIX bouwt in 1991 de Finse student Linus<br />
Torvalds het UNIX compatible systeem Linux.</p>
<p>Inmiddels zijn we veertig jaar na de eerste schreden van Neil Armstrong, en<br />
heeft Linux met zijn 18 jaren een volwassen leeftijd!  En wat zien we: Het<br />
aantal UNIX-achtige systemen en dan met name Linux groeit en groeit.  </p>
<p>UNIX en Linux worden gebruikt op zeer kleine en zeer grote installaties.  Zo is<br />
kans groot dat als u een ADSL router heeft, u daar Linux in heeft draaien.<br />
Dat geldt ook voor navigatie apparaten, televisies, digitale videorecorders,<br />
kassa&#8217;s bij supermarkten en warenhuizen, reclamezuilen etc etc.  En wie een<br />
hippe iPhone van Apple gebruikt, beleeft ook dagelijks plezier van het UNIX<br />
dat binnenin het kleinood zijn werk doet&#8230;</p>
<p>Ook grote UNIX en Linux installaties worden door iedereen dagelijks gebruikt:<br />
Het is algemeen bekend dat zoekdienst Google vele honderduizenden Linux<br />
systemen laat samenwerken tot de website die iedereen kent.  En bekende sites<br />
als <a href="http://www.ebay.com">Ebay</a>, <a href="http://www.amazon.com">Amazon</a>,<br />
<a href="http://www.bol.com">bol.com</a> en de <a href="http://www.ns.nl">Nederlandse Spoorwegen</a><br />
zijn UNIX en Linux<br />
grootgebruikers.  Van de <a href="http://www.top500.org">500</a> grootste en snelste<br />
computers in de wereld werkt ruim 95% met UNIX of Linux. </p>
<p>Kortom: Is UNIX na 40 dienstjaren pensioengerechtigd en afgeschreven?  Nee,<br />
integendeel!  UNIX is springlevend!  U zult nog veel van UNIX en Linux<br />
gebruik maken.</p>
<p><a href="http://www.atcomputing.nl">AT Computing</a> &#8211; Verstand van UNIX, gevoel voor UNIX &#8211; al 25 jaar.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.linuxweblogs.nl/2009/07/20/40-jaar-unix/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>40 jaar UNIX</title>
		<link>http://www.atcomputing.nl/blog/archives/2009/07/index.php#e2009-07-20T08_45_49.txt?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=40-jaar-unix-2</link>
		<comments>http://www.atcomputing.nl/blog/archives/2009/07/index.php#e2009-07-20T08_45_49.txt#comments</comments>
		<pubDate>Mon, 20 Jul 2009 07:45:49 +0000</pubDate>
		<dc:creator>jc</dc:creator>
				<category><![CDATA[Algemeen]]></category>
		<category><![CDATA[Meta]]></category>

		<guid isPermaLink="false">http://www.atcomputing.nl/blog/archives/2009/07/index.php#e2009-07-20T08_45_49.txt</guid>
		<description><![CDATA[<p>UNIX - a giant leap for mankind...</p>

<p>Zomer 1969: Op 20 juli zit de hele wereld aan de TV gekluisterd om de eerste
voetstappen van een mens op de maan te zien.</p>

<p>Terwijl Neil Armstrong zijn woorden "A small step for a man, a giant leap for
mankind" uitspreekt, vindt in AT&#38;T Bell laboratories in Murray Hill, New
Jersey een technische revolutie plaats die zo mogelijk nog meer directe
invloed op ons leven nu heeft: Ken Thompson en Dennis Ritchie bedenken UNIX.</p>

<p>De basis-ideeen in UNIX uit die zomer van 1969 waren baanbrekend.  Daarom
worden de concepten nog steeds gebruikt, niet alleen in UNIX varianten
(waaronder Linux en MacOS X) maar ook in andere moderne besturingssystemen
zoals Windows XP en zijn opvolgers.  Niet voor niets mochten Thompson en
Ritchie in 1983 de Turing award ontvangen voor hun werk.  De Turing award
wordt wel gezien als de Nobelprijs van de informatica.</p>

<p>Na 10 jaar UNIX systemen beheerd te hebben beginnen Ger Austen en Hendrik-Jan
Thomassen (A en T) in 1985 het bedrijf 
<a href="http://www.atcomputing.nl">AT Computing</a>; het eerste cursus- en
consultancybedrijf op het gebied van UNIX in Nederland.</p>

<p>Ruim 20 jaar na het ontstaan van UNIX bouwt in 1991 de Finse student Linus
Torvalds het UNIX compatible systeem Linux.</p>

<p>Inmiddels zijn we veertig jaar na de eerste schreden van Neil Armstrong, en
heeft Linux met zijn 18 jaren een volwassen leeftijd!  En wat zien we: Het
aantal UNIX-achtige systemen en dan met name Linux groeit en groeit.  </p>

<p>UNIX en Linux worden gebruikt op zeer kleine en zeer grote installaties.  Zo is
kans groot dat als u een ADSL router heeft, u daar Linux in heeft draaien.
Dat geldt ook voor navigatie apparaten, televisies, digitale videorecorders,
kassa's bij supermarkten en warenhuizen, reclamezuilen etc etc.  En wie een
hippe iPhone van Apple gebruikt, beleeft ook dagelijks plezier van het UNIX
dat binnenin het kleinood zijn werk doet...</p>

<p>Ook grote UNIX en Linux installaties worden door iedereen dagelijks gebruikt:
Het is algemeen bekend dat zoekdienst Google vele honderduizenden Linux
systemen laat samenwerken tot de website die iedereen kent.  En bekende sites
als <a href="http://www.ebay.com">Ebay</a>, <a href="http://www.amazon.com">Amazon</a>, 
<a href="http://www.bol.com">bol.com</a> en de <a href="http://www.ns.nl">Nederlandse Spoorwegen</a> 
zijn UNIX en Linux
grootgebruikers.  Van de <a href="http://www.top500.org">500</a> grootste en snelste 
computers in de wereld werkt ruim 95% met UNIX of Linux. </p>

<p>Kortom: Is UNIX na 40 dienstjaren pensioengerechtigd en afgeschreven?  Nee,
integendeel!  UNIX is springlevend!  U zult nog veel van UNIX en Linux
gebruik maken.</p>

<p><a href="http://www.atcomputing.nl">AT Computing</a> - Verstand van UNIX, gevoel voor UNIX - al 25 jaar.</p>]]></description>
			<content:encoded><![CDATA[<p></p><p>UNIX &#8211; a giant leap for mankind&#8230;</p>
<p>Zomer 1969: Op 20 juli zit de hele wereld aan de TV gekluisterd om de eerste<br />
voetstappen van een mens op de maan te zien.</p>
<p>Terwijl Neil Armstrong zijn woorden &#8220;A small step for a man, a giant leap for<br />
mankind&#8221; uitspreekt, vindt in AT&amp;T Bell laboratories in Murray Hill, New<br />
Jersey een technische revolutie plaats die zo mogelijk nog meer directe<br />
invloed op ons leven nu heeft: Ken Thompson en Dennis Ritchie bedenken UNIX.</p>
<p>De basis-ideeen in UNIX uit die zomer van 1969 waren baanbrekend.  Daarom<br />
worden de concepten nog steeds gebruikt, niet alleen in UNIX varianten<br />
(waaronder Linux en MacOS X) maar ook in andere moderne besturingssystemen<br />
zoals Windows XP en zijn opvolgers.  Niet voor niets mochten Thompson en<br />
Ritchie in 1983 de Turing award ontvangen voor hun werk.  De Turing award<br />
wordt wel gezien als de Nobelprijs van de informatica.</p>
<p>Na 10 jaar UNIX systemen beheerd te hebben beginnen Ger Austen en Hendrik-Jan<br />
Thomassen (A en T) in 1985 het bedrijf<br />
<a href="http://www.atcomputing.nl">AT Computing</a>; het eerste cursus- en<br />
consultancybedrijf op het gebied van UNIX in Nederland.</p>
<p>Ruim 20 jaar na het ontstaan van UNIX bouwt in 1991 de Finse student Linus<br />
Torvalds het UNIX compatible systeem Linux.</p>
<p>Inmiddels zijn we veertig jaar na de eerste schreden van Neil Armstrong, en<br />
heeft Linux met zijn 18 jaren een volwassen leeftijd!  En wat zien we: Het<br />
aantal UNIX-achtige systemen en dan met name Linux groeit en groeit.  </p>
<p>UNIX en Linux worden gebruikt op zeer kleine en zeer grote installaties.  Zo is<br />
kans groot dat als u een ADSL router heeft, u daar Linux in heeft draaien.<br />
Dat geldt ook voor navigatie apparaten, televisies, digitale videorecorders,<br />
kassa&#8217;s bij supermarkten en warenhuizen, reclamezuilen etc etc.  En wie een<br />
hippe iPhone van Apple gebruikt, beleeft ook dagelijks plezier van het UNIX<br />
dat binnenin het kleinood zijn werk doet&#8230;</p>
<p>Ook grote UNIX en Linux installaties worden door iedereen dagelijks gebruikt:<br />
Het is algemeen bekend dat zoekdienst Google vele honderduizenden Linux<br />
systemen laat samenwerken tot de website die iedereen kent.  En bekende sites<br />
als <a href="http://www.ebay.com">Ebay</a>, <a href="http://www.amazon.com">Amazon</a>,<br />
<a href="http://www.bol.com">bol.com</a> en de <a href="http://www.ns.nl">Nederlandse Spoorwegen</a><br />
zijn UNIX en Linux<br />
grootgebruikers.  Van de <a href="http://www.top500.org">500</a> grootste en snelste<br />
computers in de wereld werkt ruim 95% met UNIX of Linux. </p>
<p>Kortom: Is UNIX na 40 dienstjaren pensioengerechtigd en afgeschreven?  Nee,<br />
integendeel!  UNIX is springlevend!  U zult nog veel van UNIX en Linux<br />
gebruik maken.</p>
<p><a href="http://www.atcomputing.nl">AT Computing</a> &#8211; Verstand van UNIX, gevoel voor UNIX &#8211; al 25 jaar.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.linuxweblogs.nl/2009/07/20/40-jaar-unix-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

