<?xml version="1.0" encoding="iso-8859-1"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
<?xml-stylesheet type="text/css" href="http://www.miek.nl/blog/"?>


<title type="html">Miek</title>
<subtitle type="html">Thoughts on (technical) stuff</subtitle>
<link rel="alternate" type="text/html" href="http://www.miek.nl/blog"/>
<link rel="self" type="application/atom+xml" href="http://www.miek.nl/blog/atom.xml"/>
<updated>2010-09-06T04:13:35+02:00</updated>
<author>
<name>Miek Gieben</name>
<uri>http://www.miek.nl/blog</uri>
</author>
<id>http://www.miek.nl/blog/</id>
<generator uri="http://nanoblogger.sourceforge.net" version="3.4.1">
NanoBlogger
</generator>

<entry>
<title type="html">Android 2.2 (Froyo) op je foon</title>
<author>
<name>Miek Gieben</name>
</author>
<link rel="alternate" type="text/html" href="http://www.miek.nl/blog/archives/2010/09/04/android_2_2_froyo_op_je_foon/index.html"/>

<id>http://www.miek.nl/blog/archives/2010/09/04/android_2_2_froyo_op_je_foon/index.html</id>
<published>2010-09-04T20:43:10+02:00</published>
<updated>2010-09-04T20:43:10+02:00</updated>
<category term="dutch" />
<category term="android" />
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<p>Deze <a href="http://forum.xda-developers.com/showthread.php?t=764530">excellente howto</a> heeft
ervoor gezorgd dat ik nu Android 2.2 (<em>nicknamed</em> Froyo) op mijn oude
HTC magic draai. Ik hoef dus nog lang geen nieuwe telefoon. Het upgraden
zelf is met de ROM van <a href="http://www.cyanogenmod.com/">CyanogenMod</a> gedaan.</p>

<p>Een Nederlandse howto kun je bij
<a href="http://www.techzine.nl/tutorials/364/android-froyo-2-2-installeren-op-een-htc-magic.html">techzine.nl</a>
vinden. Maar het <em>rooten</em> van je phone is daar wat omslachtiger
omschreven dan hier. </p>

<blockquote>
  <p>Het flashen van je telefoon kan deze dusdanig beschadigen dat 'ie
kapot is. Hij is dan zogenaamd <em>gebricked</em> en alleen nog maar nuttig
als <em>paperweight</em>. Je hebt er dan dus <strong>helemaal</strong> niks meer aan! </p>
</blockquote>

<p>Na deze waarschuwing wil je natuurlijk <em>ook</em> naar Froyo upgraden. De stappen zijn als volgt:</p>

<ul>
<li>Root je phone;</li>
<li><em>Recovery</em> installeren (soort bootloader);</li>
<li>Booten naar <em>recovery</em>;</li>
<li>Je telefoon <em>flashen</em>;</li>
<li>Klaar!</li>
</ul>

<p>In detail komt dat op het volgende neer. Eerst de voorbereidende stappen:</p>

<ol>
<li><p>In de Android Market zoek en installeer:</p></li>
<li><p><code>AppInstaller</code> van modmymobile;</p></li>
<li><p><code>ROM Manager</code>.</p></li>
<li><p>Download <code>universalandroot</code> van
<a href="http://blog.23corner.com/tag/universalandroot/">blog.23corner.com/tag/universalandroot/</a>.
Dit is een <a href="http://bit.ly/aa4jxJ">directe link</a>;</p></li>
<li><p>Download de juiste "Stable Mod" ROM voor je telefoon van
<a href="http://forum.cyanogenmod.com/files/">Cyanongenmod/files</a>.</p></li>
<li><p>Download "Google Addon pack" voor jouw telefoon. Hier zitten de
standaard Google Apps in.</p></li>
<li><p>Zet de <code>universalandroot</code>, "Google Addon pack" en de ROM in de root
directory op de SD kaart van je telefoon.</p></li>
</ol>

<h2>Rooten en flashen</h2>

<ol>
<li><p>Open <code>AppInstaller</code> en laat de <code>androot.apk</code> vinden op je SD kaart.
Selecteer die <code>.apk</code> en laat hem installeren.</p></li>
<li><p>Open dan <code>Universal AndRoot</code>. Die moet het type van je telefoon herkennen, zo
niet, dan zo ik nu maar ophouden. Herkent die je telefoon klik dan op
'root'. Als dat lukt, ben je eindelijk super user op je <em>eigen</em>
telefoon.</p></li>
</ol>

<p>Nu een custom ROM installeren:</p>

<ol>
<li><p>Open <code>ROM Manager</code> en installeer <em>Recovery</em>. Wat ik er van begrijp is
dit een soort custom boot loader. Met deze loader kun je dan weer een
ROM in je telefoon schieten. Ik heb <code>ClockworkMod Recovery</code> gebruikt en
bij mij werkte dat goed. Enige moeilijke was ontdekken welke telefoon ik
nu precies had.</p></li>
<li><p>Als je een recovery hebt geinstalleerd, selecteer dan "Backup Current ROM". Dit is mij
niet gelukt, maar toen dacht dat ik mijn oude ROM toch nooit meer nodig
zou hebben. (Gelukkig ging het flashen goed).</p></li>
<li><p>Daarna kies je voor "Reboot Into Recovery". Dit lukte bij mij niet
meteen goed, maar na een aantal keer de battery eruit gehaald te hebben,
zat ik eindelijk de <em>recovery</em>. Krijg je ipv de <em>Recovery</em> een geel
uitroep teken te zien, dan is er iets mis gegaan met de installatie
hiervan. Reboot dan je telefoon weer een keer en ga terug naar stap 1.
Mocht je niet in de <em>recovery</em> eindigen, dan kun je ook nog proberen
om te rebooten en dan de "Home" en de "Power" toets tegelijk ingedrukt
te houden.</p></li>
<li><p>In de <em>recovery</em> selecteer:</p></li>
<li><p>"wipe data/factory reset" en dan;</p></li>
<li><p>"wipe cache partition". Dit een belangrijke stap, als je dit niet
doet kun je in een reboot-loop terecht komen en is je telefoon stuk.</p></li>
<li><p>"install zip from sdcard". Navigeer naar je ROM op je SD en laat je
telefoon ermee flashen.</p></li>
<li><p>"reboot". Reboot je telefoon. Dit kan wat langer duren na  zo'n firmware upgrade. </p>

<blockquote>
  <p>Als de stap lukt. Gefeliciteerd: Je draait nu CyanogenMod 6.0</p>

<p>Als het mislukt. Gefelictieerd: Je telefoon is nu kapot. (Misschien helpt nog een keer flashen).</p>
</blockquote></li>
<li><p>Je kunt nu ook via de <em>recovery</em> een <code>nandroid</code> backup maken;</p></li>
<li><p>Reboot naar de <em>recovery</em> en installeer de "Google Addon pack";</p></li>
</ol>

<h2>Resterende issues</h2>

<p>Mijn Nederlands woordenboek deed het niet goed, maar <a href="http://blog.cone.be/2010/08/20/creating-dutch-dictionary-for-android/">gelukkig is dat ook opgelost</a>. 
Installeer <a href="http://www.miek.nl/downloads/2010/LatinIME.apk">deze .apk</a>,
met:</p>

<pre><code>adb install -r LatinIME.apk
</code></pre>

<p>Je kunt ook nog <code>Swype</code> installeren en waarschijnlijk moet je de
<code>Android Market</code> nog fixen. Zie daarvoor: <a href="http://www.techzine.nl/tutorials/364/android-froyo-2-2-installeren-op-een-htc-magic.html">techzine.nl</a></p>
</div>
</content>

</entry>
<entry>
<title type="html">DNSSEC voor miek.nl</title>
<author>
<name>Miek Gieben</name>
</author>
<link rel="alternate" type="text/html" href="http://www.miek.nl/blog/archives/2010/08/23/dnssec_voor_miek_nl/index.html"/>

<id>http://www.miek.nl/blog/archives/2010/08/23/dnssec_voor_miek_nl/index.html</id>
<published>2010-08-23T11:35:37+02:00</published>
<updated>2010-08-23T11:35:37+02:00</updated>
<category term="dutch" />
<category term="dns(sec)" />
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<p>Aangezien gister avond (22 augustus) om 5 voor half 1 's nachts 
<a href="http://www.miek.nl/blog/archives/2010/08/23/it_is_there/index.html">de eerste gesignde versie van .NL is
gepubliceerd</a>
is het natuurlijk de hoogste tijd om
je eigen zone te signen. Je kunt vooralsnog geen secure delegatie
aanvragen, maar dat proces zit in de pijplijn bij
<a href="http://www.sidn.nl">SIDN</a>.</p>

<p>Ik ga er van uit dat je redelijk bekent bent met DNS. Deze <em>howto</em> neemt
een recent <a href="http://www.isc.org/software/bind">BIND9</a> als uitgangspunt, maar met
<a href="http://www.nlnetlabs.nl/projects/nsd/">NSD</a> kom je ook een heel
eind.</p>

<p>Er zijn een aantal stappen die je moet zetten voordat je DNSSEC aan hebt staan:</p>

<ol>
<li>Maak een sleutel paar, liefst een KSK (Key signing key) en een ZSK
(zone signing key). Dus in totaal twee sleutel paren;</li>
<li>Sign je zone met die sleutels;</li>
<li>Configureer je nameserver zodat de gesignde zone wordt geserveerd;</li>
<li>Configureer CRON zodat elke dag je zone wordt ge-resigned;</li>
<li>Test het.</li>
</ol>

<p>Deze sleutels zijn statisch. We gaan dus geen <em>key rollovers</em>
implementeren.</p>

<h2>Maak de sleutels:</h2>

<p>Sleutels maken gaat met <code>dnssec-keygen</code>, dit programma heeft nogal wat
opties. De belangrijkste zijn: <code>-a ALG</code> om het algoritme van je sleutel
te specificeren, <code>-b BITS</code>: hoe lang moet je sleutel zijn, <code>-f KSK</code>
specificeert een KSK en <code>-n ZONE</code> zegt dat er een DNS sleutel moet
worden gemaakt. Voor <a href="http://www.miek.nl">miek.nl</a>, komen we tot:</p>

<pre><code>dnssec-keygen -a RSASHA256 -b 2048 -f KSK -n ZONE miek.nl
dnssec-keygen -a RSASHA256 -b 1024 -n ZONE miek.nl
</code></pre>

<p>(Je kunt dit versnellen door <code>-r /dev/urandom</code> als optie mee te geven,
maar dan krijg je kwalitatief slechtere sleutels). Dit levert vier
files op, in mijn geval:</p>

<p><code>Kmiek.nl.+008+12051.{key,private}</code> en <code>Kmiek.nl.+008+33694.{key,private}</code></p>

<p>Het public deel van mijn KSK ziet er zo uit:</p>

<pre><code>; This is a key-signing key, keyid 33694, for miek.nl.
; Created: Wed Aug 18 14:46:09 2010
; Publish: Wed Aug 18 14:46:09 2010
; Activate: Wed Aug 18 14:46:09 2010
miek.nl. IN DNSKEY 257 3 8 AwEAAcWdjBl4W4wh/hPmNC.&lt;ingekort&gt;...V BdTRBtgHi0s=
</code></pre>

<h2>Signeer je zone</h2>

<p>Dit is de stap die je van PLAIN DNS naar DNSSEC tilt. Signeren gaat
met <code>dnssec-signzone</code>. In dit geval gebruik ik ook de <code>-S</code> optie, de
zogenaamd <em>smart signing</em>, hierbij kijkt <code>dnssec-signzone</code> naar de
commentaar regels (de regels die met <code>;</code> beginnen in de key), om te
zien welke sleutels gebruikt moeten worden. Verder hebben we de sleutels
in een aparte directory staan (<code>-K keys</code>) en moeten de gegenereerde DS
records ook apart komen (<code>-d ds</code>) (zie "DS records"), <code>-o miek.nl</code> wordt
gebruik om aan te geven dat het hier om <code>miek.nl</code> gaat.</p>

<p>Het signeren van <code>miek.nl</code> gaat uiteindelijk met:</p>

<pre><code>dnssec-signzone -K keys -d ds -o miek.nl -S miek.nl
</code></pre>

<p>Om dit te automatiseren gebruik ik een kleine <code>Makefile</code>:</p>

<pre><code>.PHONY: miek.nl.signed
KEYDIR=/etc/bind/external/keys
DSDIR=/etc/bind/external/ds
miek.nl.signed:     miek.nl
    @dnssec-signzone -N unixtime -K $(KEYDIR) -d $(DSDIR) -o $&lt; -S $&lt;
</code></pre>

<p>NB: deze <code>Makefile</code> zorgt ervoor dat er <em>altijd</em> wordt ge-resigned.</p>

<h2>Nameserver configuratie</h2>

<p>Verander in mijn geval:</p>

<pre><code>zone "miek.nl" {
type master;
file "/etc/bind/external/miek.nl";
};
</code></pre>

<p>naar</p>

<pre><code>zone "miek.nl" {
type master;
file "/etc/bind/external/miek.nl.signed";
};
</code></pre>

<p>De bedoeling is duidelijk: serveer de gesignde variant van je zone.</p>

<h2>CRON</h2>

<p>Plaats een script <code>/etc/cron.daily</code>, die zorgt voor een dagelijkse
resign:</p>

<pre><code>% cat /etc/cron.daily/dnssec

#!/bin/bash
# Resign unconditionally
( cd /etc/bind/external ; /usr/bin/make ) &amp;&amp; /usr/sbin/rndc reload
</code></pre>

<h2>Test</h2>

<p>Run het script even met de hand: <code>/etc/cron.daily/dnssec</code>:</p>

<pre><code>Fetching KSK 33694/RSASHA256 from key repository.
Fetching ZSK 12051/RSASHA256 from key repository.
Verifying the zone using the following algorithms: RSASHA256.
Zone signing complete:
Algorithm: RSASHA256: KSKs: 1 active, 0 stand-by, 0 revoked
          ZSKs: 1 active, 0 stand-by, 0 revoked
miek.nl.signed
server reload successful
</code></pre>

<p>Ziet er goed uit, nu een tweede controle:</p>

<pre><code>dig @a.miek.nl +dnssec +multiline DNSKEY miek.nl

;; ANSWER SECTION:
miek.nl.        14400 IN DNSKEY 257 3 8 (
            AwEAAcWdjBl4W4wh/hPxMDcBytmNCvEngIgB9Ut3C2+Q
            ...
            4N0t9ac/T0a0Sxba/BUX2UVPWaIVBdTRBtgHi0s=
            ) ; key id = 33694
miek.nl.        14400 IN DNSKEY 256 3 8 (
            AwEAAcNEU67LJI5GEgF9QLNqLO1SMq1EdoQ6E9f85ha0
            ...
            M335Ft9xjtXHPy7ztCbV9qZ4TVDTW/Iyg0PiwgoXVesz
            ) ; key id = 12051
</code></pre>

<p>Succes!</p>

<h2>DS records</h2>

<p>In de <code>ds</code> directory staat na het signen een <code>dsset</code> bestand:</p>

<pre><code>% cat dsset-miek.nl.
miek.nl.        IN DS 33694 8 1 8BA582C292324D256599CE72EEE6DF2A9F317AFD
miek.nl.        IN DS 33694 8 2 2C235500B09FA87BBC0981674FC31AF87D2FA4DCFE666A64BA2646F2 9651DB83
</code></pre>

<p>Deze records zijn de hash waardes van mijn KSK. Er staan twee DSen in
deze file, omdat er twee verschillende hashes
<a href="http://tools.ietf.org/search/rfc3658">SHA-1</a> (de 1 in "33694 8 1") en
<a href="http://tools.ietf.org/search/rfc4509l">SHA-256</a> (de 2 in "33694 8 2").</p>

<p>Deze DS records, of misschien maar eentje moeten bij <code>.nl</code> terecht komen, zodat
zij een secure delegatie voor <code>miek.nl</code> kunnen maken.</p>
</div>
</content>

</entry>
<entry>
<title type="html">It is there</title>
<author>
<name>Miek Gieben</name>
</author>
<link rel="alternate" type="text/html" href="http://www.miek.nl/blog/archives/2010/08/23/it_is_there/index.html"/>

<id>http://www.miek.nl/blog/archives/2010/08/23/it_is_there/index.html</id>
<published>2010-08-23T09:06:05+02:00</published>
<updated>2010-08-23T09:06:05+02:00</updated>
<category term="dns(sec)" />
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<p>Congrats to
<a href="https://www.sidn.nl/nieuws/nieuwsbericht/article/sidn-heeft-dnssec-voor-nl-zone-succesvol-ingevoerd/">SIDN</a></p>

<pre><code>% dig +dnssec +multiline DNSKEY nl 

;; ANSWER SECTION:
nl.         6547 IN DNSKEY 256 3 8 (
                AwEAAbXfJH0LevocrgMOI62Y0+oD02AxPrsXja59z11c
                cqgW527Ghac2f1aj32a4c1Wc+H6UhTy+daf6LkVytw0l
                lMmzDDVn/YHcfh7B+9DdbVjdBHvY6q+YTnZbsU3wGwod
                PMneYJZl8d47eFYmraKKl/endifNukan0z4GkaKYHuI1
                ) ; key id = 37408
nl.         6547 IN DNSKEY 257 3 8 (
                AwEAAekt0eDh+EmOVQMh1av++d5F6eS3B85YkFW9OBQN
                8X9EA1rG8vl9TRHFBUfpu/vIaUJeuXV9tm/PO+qhNyIL
                WxI26W1t1/EKr1WhbaNsLXPMhjtuelPqpxuQL/onXvhB
                83uPcF88pjnKmu73pcdhInLfYkf4JfARztj4e+xaddoL
                5eJ0Fj3KMVd303NAsH0tmRPBi3EGMAOtM4Ic84Rn8ZkH
                bwmVUQ3n4qRYaLpgvmpX82RUpEkgPxhrrJGENp1QYGPv
                0oWPWkcJcSUGsEBgjLSal5IzTJmOEFm7nzbvyrfq/KJX
                PZZRfJgPpFPwqNfY+GlTfb39kDEcB34z2LCNM2U=
                ) ; key id = 38420
nl.         6547 IN RRSIG DNSKEY 8 1 7200 20100902004149 (
                20100819064254 38420 nl.
                0/C52WJ2OjQZOrP8y7relQWGVS5gmJLnwnrbic7dGNeJ
                PVjI7W2gXgt8vVTg36bQ6gVpX7GG2zwvNA/cYTGYnfvF
                n+0HpA8oZLqeVh1rbQR3oU+iym5F4vX1pka7pbJk358x
                O9B9KsMFXH9exCoHHXzu/SU3D/TPZ60imrNgvJp6iOci
                kPeomSQhwKmyyKBUheaOocdV/XIMtzFwOnKYV6bu9wCq
                PXtOj4Qhp8Ty7mGMnOSpgAzwWcksvqmSZeNpC/tLT/57
                TxefWNNGlbdY7+fxvA0T+AQVn0xctsS1y194SAv92kZW
                azVQ9+ZYxQLVZqwSl1/ZBo8spxT1aiwMnw== )
</code></pre>
</div>
</content>

</entry>
<entry>
<title type="html">Go number cruncher</title>
<author>
<name>Miek Gieben</name>
</author>
<link rel="alternate" type="text/html" href="http://www.miek.nl/blog/archives/2010/08/17/go_number_cruncher/index.html"/>

<id>http://www.miek.nl/blog/archives/2010/08/17/go_number_cruncher/index.html</id>
<published>2010-08-17T21:27:11+02:00</published>
<updated>2010-08-17T21:27:11+02:00</updated>
<category term="go" />
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<p>Write a number cruncher that works as follows:</p>

<ul>
<li><p>Pick six (6) random numbers from this list:
<code><pre>
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 25, 50, 75, 100
</pre></code></p>

<p>Numbers may be picked multiple times.</p></li>
<li><p>Pick one (1) random number (i) in the range:
<code><pre>
1 . . . 1000
</pre></code></p></li>
<li><p>Tell how, by combining the first 6 numbers or or subset with the operators +,-,* and /, you can
make i;</p></li>
</ul>

<p>An example. We have picked the numbers: 1, 6, 7, 8, 8 and 75. And i is 977. This can be
done in many different ways, two ways are:</p>

<pre><code>((((1 * 6) * 8) + 75) * 8) - 7 = 977
(8*(75+(8*6)))-(7/1) = 977
</code></pre>

<p>Another:</p>

<pre><code>(((6*8)+75)*8)-7 = 977
</code></pre>

<p>When using only a subset. This one is without the number 1.</p>

<p>Credit for this particular exercise goes to JC van Winkel.</p>
</div>
</content>

</entry>
<entry>
<title type="html">Learning Go - version 0.1</title>
<author>
<name>Miek Gieben</name>
</author>
<link rel="alternate" type="text/html" href="http://www.miek.nl/blog/archives/2010/08/16/learning_go_-_version_0_1/index.html"/>

<id>http://www.miek.nl/blog/archives/2010/08/16/learning_go_-_version_0_1/index.html</id>
<published>2010-08-16T20:46:42+02:00</published>
<updated>2010-08-16T20:46:42+02:00</updated>
<category term="go" />
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<p>I've tagged an 0.1 version of the book I'm writing: "Learning Go". It
currently has 7 chapters. The first five are finished. Chapter 6 and 7
still need work. The exercises can also use some (more) love.
The current chapter list of "Learning Go" is:</p>

<ol>
<li>Introduction</li>
<li>Basics</li>
<li>Functions</li>
<li>Packages</li>
<li>Beyond the basics</li>
<li>Concurrency</li>
<li>Communication</li>
</ol>

<p>To get it:</p>

<ul>
<li><a href="/downloads/2010/go-0.1.pdf">PDF</a> download</li>
<li><a href="http://www.miek.nl/cgi-bin/gitweb.cgi?p=gobook.git;a=summary">Gitweb repository</a></li>
</ul>

<p>If you have comments, text or exercises feel free to drop an email.</p>
</div>
</content>

</entry>
<entry>
<title type="html">Programmeer opdrachtje: oplossing(en)</title>
<author>
<name>Miek Gieben</name>
</author>
<link rel="alternate" type="text/html" href="http://www.miek.nl/blog/archives/2010/08/14/programmeer_opdrachtje_oplossingen/index.html"/>

<id>http://www.miek.nl/blog/archives/2010/08/14/programmeer_opdrachtje_oplossingen/index.html</id>
<published>2010-08-14T15:35:35+02:00</published>
<updated>2010-08-14T15:35:35+02:00</updated>
<category term="dutch" />
<category term="go" />
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<p>Emil was <a href="http://www.miek.nl/blog/archives/2010/08/13/programmeer_opdrachtje_in_go/index.html">gisteren</a>
wel heel <a href="http://www.miek.nl/blog/archives/2010/08/13/programmeer_opdrachtje_in_go/index.html#comment1">snel</a>.
met een mooie (korte) oplossing. Zie <a href="http://www.miek.nl/downloads/2010/emil-proc.go">hier</a> voor een lokale kopie.</p>

<p>Regel nummers kun je weghalen met: <code>sed -r 's/^ +[0-9]+//'</code></p>

<p>Mijn eigen <a href="http://www.miek.nl/downloads/2010/proc.go">oplossing</a> is
iets langer, maar ik kende <code>exec.Run</code> dan ook nog niet. Hij is wel iets
korter geworden dan verwacht, maar daarvoor heb ik een klein beetje
gesjoemeld, want ik print nu:</p>

<pre><code>PID 0 has 2 childeren: [453 612]
</code></pre>

<p>Dus met blokhaken. Dit doet <code>%v</code> in de <code>fmt.Printf</code> voor mij. </p>
</div>
</content>

</entry>
<entry>
<title type="html">Programmeer opdracht(je) in Go</title>
<author>
<name>Miek Gieben</name>
</author>
<link rel="alternate" type="text/html" href="http://www.miek.nl/blog/archives/2010/08/13/programmeer_opdrachtje_in_go/index.html"/>

<id>http://www.miek.nl/blog/archives/2010/08/13/programmeer_opdrachtje_in_go/index.html</id>
<published>2010-08-13T18:04:01+02:00</published>
<updated>2010-08-13T18:04:01+02:00</updated>
<category term="dutch" />
<category term="go" />
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<p>Een leuke opdracht om je handen vuil te maken met programmeren in Go.
De opdracht:</p>

<blockquote>
  <p>Schrijf een programma dat van alle processen op het systeem
uitschrijft hoeveel kinderen elke ouder (<em>parent</em>) heeft. Gebruik
het <code>ps</code> commando als volgt: <code>ps -e -opid,ppid</code>. De uitvoer van
die <code>ps</code> ziet er als volgt uit (maar dan langer):</p>

<p><code>PID  PPID COMMAND</code><br/>
<code>24497 24496 zsh</code><br/>
<code>25337 24497 ps</code><br/></p>

<p>De uitvoer van jou programma moet iets worden als:</p>

<p><code>Pid 0 has 2 children: 1 2</code><br/>
<code>Pid 20555 has 1 child: 20571</code><br/></p>

<p>Merk op: 1 kind, print dan <code>child</code>, meerdere kinderen print
dan <code>children</code>.
De uitvoer van de parent PID (PPIDs) moet gesorteerd zijn, dus
beginnend bij 0 en dan oplopend.</p>
</blockquote>

<p>Om je op weg te helpen, hier een versie in de programmeertaal Perl
(Als je Perl niet snapt, heb je nu een probleem):</p>

<pre><code>#!/usr/bin/perl -l
use strict;
use warnings;

my (%child, $pid, $parent);
my @ps=`ps -e -opid,ppid,comm`;     # Capture the ouput from `ps`
foreach (@ps[1..$#ps]) {            # Discard the header line
    ($pid, $parent, undef) = split; # Split the line, discard 'comm'
    push @{$child{$parent}}, $pid;  # Save the child PIDs on a list
}
# Walk through the sorted PPIDs
foreach (sort { $a &lt;=&gt; $b } keys %child) {  
    print "Pid ", $_, " has ", @{$child{$_}}+0, " child",  # Print them
    @{$child{$_}} == 1 ? ": " : "ren: ", "@{$child{$_}}";
}
</code></pre>

<p>De versie in Go is iets langer (zo'n 80 regels). Ik zal deze morgen
middag posten. In de tussen tijd mag je hier je tanden op stuk bijten.</p>
</div>
</content>

</entry>
<entry>
<title type="html">Formatting Go code with Vim</title>
<author>
<name>Miek Gieben</name>
</author>
<link rel="alternate" type="text/html" href="http://www.miek.nl/blog/archives/2010/08/08/formatting_go_code_with_vim/index.html"/>

<id>http://www.miek.nl/blog/archives/2010/08/08/formatting_go_code_with_vim/index.html</id>
<published>2010-08-08T22:23:22+02:00</published>
<updated>2010-08-08T22:23:22+02:00</updated>
<category term="go" />
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<p>There are no formatting rules when writing Go code, but there is an official
style. If you pipe your code through <code>gofmt</code>, its output <em>is</em> the
official style. So while writing you need to occasionally execute:
<code>%!~/bin/gofmt</code> (which I've wrapped in a command, so I only need
to type <code>:Fmt</code>). </p>

<p>But the trouble is that executing this code resets the
cursor to the first line and you then have to jump back to whatever
line number you were on.</p>

<p>Surely <code>vim</code> should do better... and it does. The scripting in <code>vim</code> is
wonderful, this small function is all you need:</p>

<pre><code>function Goformat()
    let regel=line(".")
    %!~/bin/gofmt
    call cursor(regel, 1)
endfunction
</code></pre>

<p>And then together with this:</p>

<pre><code>autocmd Filetype go command! Fmt call Goformat()
</code></pre>

<p>Put both in your <code>.vimrc</code> and you are set. Nice formatting with 
<code>:Fmt</code> and you'll stay on the current line. The actual line
may be slightly different due to the reformatting, but this is 
a far cry from being put on the first one.</p>
</div>
</content>

</entry>
<entry>
<title type="html">Go DNS online</title>
<author>
<name>Miek Gieben</name>
</author>
<link rel="alternate" type="text/html" href="http://www.miek.nl/blog/archives/2010/08/04/go_dns_online/index.html"/>

<id>http://www.miek.nl/blog/archives/2010/08/04/go_dns_online/index.html</id>
<published>2010-08-04T00:29:09+02:00</published>
<updated>2010-08-04T00:29:09+02:00</updated>
<category term="go" />
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<p>The last couple of days I've been working on (better) DNS support in Go.
I think it would be very nice to get something like
<a href="http://www.nlnetlabs.nl/projects/ldns/">ldns</a> in Go, but then in less
lines of code.</p>

<p>I've just published the first code on
<a href="http://github.com/miekg/godns">godns @github</a>. This is heavily based on the
DNS implementation currently in Go, in the <em>net</em>-package. Current
additions consist of:</p>

<ul>
<li>AAAA support;</li>
<li>Parsing rdata to <code>hex</code> or <code>base64</code>;</li>
<li>Groundwork for DNSSEC types (DS, DNSKEY, RRSIG);</li>
<li>Groundwork for EDNS0.</li>
</ul>

<p>More info (well not a lot at the moment) can be found
<a href="http://miek.nl/projects/godns/index.html">here</a>. </p>
</div>
</content>

</entry>
<entry>
<title type="html">Computer Languages </title>
<author>
<name>Miek Gieben</name>
</author>
<link rel="alternate" type="text/html" href="http://www.miek.nl/blog/archives/2010/08/01/computer_languages/index.html"/>

<id>http://www.miek.nl/blog/archives/2010/08/01/computer_languages/index.html</id>
<published>2010-08-01T19:17:00+02:00</published>
<updated>2010-08-01T19:17:00+02:00</updated>
<category term="programming" />
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<p>I have done programming in (or at least looked at) the following computer
languages during my live. Of course the world is not a perfect place,
but some languages out there are just plain awful.</p>

<ul>
<li><p>BASIC - with line numbers!
At the time (I was 11) didn't know there was something else
out there. Fun and easy language, although I never programmed
in it ever again.</p></li>
<li><p>Pascal -
After BASIC, there is no going back to Pascal. Only briefly
looked at it in my youth and discarded it in favor for BASIC...</p></li>
<li><p>PHP -  a language for children, by children.
Insecure, weird and no namespaces (and that for a dynamic language).
I always need to look up function prototypes, like the difference of
the thing you are looking for in these functions:</p></li>
</ul>

<p><code><pre>
    int preg_match ( string $pattern , string $subject ...
</pre></code></p>

<p>And</p>

<p><code><pre>
    int substr_compare ( string $main_str , string $str ...
</pre></code></p>

<p>And then you find a nice function on <a href="http://www.php.net">www.php.net</a>, which 
  is 'deprecated' because of various reasons.</p>

<ul>
<li><p>C - old, but functional.
Obviously no gc and namespaces, but you get a real sense of power 
and nicely documented in manual pages 
I still use C today for <a href="http://www.miek.nl/projects/rdup">rdup</a> for
instance.</p></li>
<li><p>Perl - love it.
Easy to write, easy to read (after using it for a few years).</p></li>
<li><p>Python - not for me.
I just don't like OO programming and the format rules are really not for me.</p></li>
<li><p>Unix Shell - sucks, except for short stuff.
See <a href="http://fvue.nl/wiki/Bash:_Piped_`while-read'_loop_starts_subshell">Bash: Gotchaes</a>:</p></li>
</ul>

<p><code><pre>
!/bin/bash
echo nothing | while read line; do
    foo=bar
    echo foo1: $foo
done
echo foo2: $foo
</pre></code></p>

<p>Example output:
<code><pre>
foo1: bar
foo2:  (shouldn't be empty)
</pre></code></p>

<ul>
<li><p>Java - never dared venturing in to it.
Way too verbose and again I don't really like OO programming.</p></li>
<li><p>C++ - I will rather be shot in the shoulder than to use this.
See this nice <a href="http://miek.nl/downloads/2010/c++-talk.pdf">pdf</a> for
some horrific examples, <code>Pdf</code> is
from <a href="http://www.fefe.de/c++/c++-talk.pdf">fefe.de</a> (Felix von
Leitner).</p></li>
<li><p>Lisp - nice language.
One of the oldest languages out there and still interesting. But
learning (common) Lisp now (without concurrency and stuff) isn't 
worth the effort.</p></li>
<li><p>Erlang - great language.
I could not cope with the syntax, although I even
found the functional aspect of it rather nice.</p></li>
<li><p>Go - better than C, simpler than C++.
And has concurrency, namespaces and gc. The more I code in it
the more I like it. Even the OO implementation (using Interfaces{}) is
nice.</p></li>
<li><p>Assorted macro languages, like LaTex and m4.
Fun, but obscure. </p></li>
</ul>
</div>
</content>

</entry>

</feed>
