Digicted

Archief voor October, 2007

HOWTO: Bash terminal in Mac OS X afstellen

Tuesday, October 30th, 2007

Toen ik gisteren echo $PATH typte om te zien hoe m’n path er uit zag schrok ik toch wel een beetje van de vele regels die over m’n scherm heen scrollde. Ik heb ze niet geteld, maar het waren er veel meer dan ik nodig acht.

Voor de mensen die niet zo bekend zijn met de commandline: in de variable PATH staan paden naar directories waar automatisch in gezocht wordt als je een bepaald commando typt. Een bekend commando is bijvoorbeeld cd wat gebruikt wordt om naar een andere directory te gaan. Dit kleine programma’tje staat in de directory /usr/bin. Doordat /usr/bin in het path staat kun je gewoon cd typen in plaats van elke keer volledig /usr/bin/cd te moeten typen.

In je path kun je meerdere directories opgeveven, gescheiden door een :, die één voor één doorzocht worden naar het ingetypte commando tot het commmando gevonden is.

Nu moet het voor de niet-zo-commandline-freakigere lezers ook duidelijk zijn dat ik het niet zo leuk vond dat dit path vele regels in beslag nam en dezelfde directories vaak terugkwamen waardoor het ook lastig was om uit te zoeken welke directory voorrang had.

Omdat ik toen toch wilde opruimen (en het is gelukt, het path is nu nog maar twee regels) heb ik gelijk heel mijn .profile maar eens goed doorgenomen en georganiseerd. En omdat ik vast niet de enige ben die bepaalde dingen uit mijn .profile kan gebruiken heb ik besloten het hier te delen.

Voor de mensen die ervaren zijn met de terminal en gewoon mijn .profile willen zien: download mijn .profile of ga direct naar de uitleg van de inhoud.

Andere mensen kunnen even rustig doorlezen om te zien wat .profile nu eigenlijk is en wat de inhoud in mijn geval doet.

En hoewel dit artikel is geschreven naar aanleiding van mijn ervaring op Mac OS X geldt dit natuurlijk ook gewoon voor Linux, BSD en andere systemen waarop bash in gebruik is.

Dus eh, .profile, wat is dat nou eigenlijk?

Waarschijnlijk zijn er inmiddels een aantal mensen die zich afvragen wat .profile nu eigenlijk is. Het is eigenlijk niet meer dan een simpel tekstbestand.

Maar zoals wel vaker in de UNIX-wereld is het wel een krachtig tekstbestand.

In dit bestand kun je namelijk commando’s plaatsen die worden uitgevoerd op het moment dat je inlogt op de terminal. Dit kan bijvoorbeeld iets zijn om het uiterlijk van je terminal aan te passen of om aliassen te maken voor commando’s die je veel gebruikt.

De rest van dit artikel zal praktische voorbeelden laten zien om te illustreren wat ik bedoel.

Eigenlijk zijn er een aantal verschillende bestanden die gebruikt worden om je terminal aan te passen. In het geval van bash hebben we het dan meestal over /etc/profile, /etc/bash.bashrc, ~/.bashrc, ~/.bash_profile en natuurlijk ~/.profile.

Deze hebben allemaal een eigen functie en roepen elkaar vaak aan, of ze overschrijven elkaar. Eigenlijk is het dan ook niet helemaal correct van mij om alles in ~/.profile te zetten, maar ik heb er niet zo’n probleem mee.

Voor de mensen die het wel graag 100% correct aanpakken is /etc/profile V.S. /etc/bashrc op LinuxQuestions.org waarschijnlijk interessant.

Hoe maak ik een .profile?

Je .profile plaats je in je home directory. Er is een goede kans dat je nog geen .profile hebt en dit bestand eerst moet aanmaken. Omdat het begint met een . is het een verborgen bestand, waardoor het misschien niet met elke editor te zien is. Wel kun je het aanmaken met iedere editor die gewoon platte tekst ondersteunt. Zelf gebruik ik meestal VI Improved (één van mijn favoriete editors, hier schrijf ik mogelijk later nog over) of Textmate.

Als je editor het opslaan van verborgen bestanden niet gemakkelijk ondersteunt kun je dit doen via een omweggetje:

  1. Maak het bestand aan en sla het op als profile.txt in je home directory;
  2. Start een terminal op (via Applications > Utilities > Terminal.app);
  3. Typ cd ~ om zeker te zijn dat je in je home directory zit;
  4. Typ mv profile.txt .profile;
  5. Klaar, je kunt nu weer de rest van de gewone stappen volgen.

Wijzigingen in je .profile worden pas zichtbaar nadat je opnieuw bent ingelogd of het volgende commando intypt: . ~/.profile.

En wat staat er nou in zo’n profile?

Het beruchte path

We beginnen met het beruchte path, wat bij mij nu netjes op twee regels staat en er zo uitziet:

export PATH=/opt/local/bin:/opt/local/sbin:/usr/local/bin:/usr/local/sbin/:/usr/local/mysql/bin
export PATH=$PATH:/usr/bin:/bin:/usr/sbin/:/usr/local/sbin/:/sbin:/usr/X11R6/bin/:/Users/martijnengler/scripts/

Neem dit niet zomaar over, maar ik wil het even gebruiken als voorbeeld. Als ik nu dus bijvoorbeeld cd intyp wordt er eerst gezocht of er een programma met de naam cd in /opt/local/bin staat, vervolgens /opt/local/sbin, etc. .. Net zo lang tot het gevonden is. cd Staat overigens in /usr/bin. Als je je afvraagt waar een programma staat kun je dat bekijken met whereis.

Typ bijvoorbeeld whereis bash om te zien waar bash staat of whereis whereis om te zien waar whereis zelf staat.

Geschiedenis

De volgende paar regels bepalen hoe bash moet omgaan met de geschiedenis van ingetypte commando’s. Zelf kies ik er voor om mijn laatste 999 commando’s te bewaren zodat ik een uitgebreidde geschiedenis heb om door heen te gaan en herhaalde commando’s niet te laten zien. Dit doe ik met de volgende regels:

export HISTCONTROL=erasedups
export HISTFILESIZE=999

De eerste regel zorgt er voor dat commando’s die ik meerdere keren invoer maar één keer terugkomen in de geschiedenis. Laten we zeggen dat dit een reeks commando’s is die ik invoer:

cd /tmp
ps
vi
ps
top
vi

Als ik vervolgens met cursor-omhoog door mijn history loop zou ik normaal de commando’s in omgekeerd chronologische volgorde terugzien. Door het gebruik van erasedups zie ik: vi, top, ps, /tmp. Zowel vi als ps worden allebei dus één keer getoond in plaats van meerdere keren. Als je veel door je geschiedenis heen gaat is dit erg prettig.

Door de tweede regel heb ik een geschiedenis van 999 commando’s.

Het uiterlijk

Waar sommige mensen hun terminal op die van Lost willen laten lijken (zie ook deze reactie) ben ik meer voor een informatieve prompt met een lichte achtergrond.

Daarom kies ik voor de volgende regels in mijn bestand:

export CLICOLOR=1
export TERM=xterm-color
export LSCOLORS=ExFxCxDxBxegedabagacad

PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '

De eerste drie regels zijn er om kleuren in te stellen. Als je liever een standaard zwart/wit hebt kun je dat dus gerust weglaten.

Het meest interessant is hier de laatste regel, deze bepaalt namelijk hoe je prompt er uit ziet. Op een Mac ziet de standaard opdrachtprompt er uit als hostname:dirnaam gebruikersnaam$ .

In mijn geval is dat bijvoorbeeld: puppis:ruby martijnengler$ als ik me in de directory ~/Documents/code/ruby bevind en ben ingelogd als martijnengler op mijn laptop, puppis.

Zelf zie ik echter liever het volledige path naar de directory waar ik me bevindt en mijn prompt ziet er dan ook zo uit: martijnengler@puppis:~/Documents/code/ruby$ .

Uiteraard zullen we allemaal onze eigen mening hebben hoe zo’n prompt er uit moet zien, daarom raad ik aan de documentatie van bash door te nemen om te zien welke variablen er allemaal beschikbaar zijn.

Een paar voorbeelden:

#volledige path naar de huidige directory
PS1='\w$ '

#computernaam:volledige path gebruikersnaam
PS1='\h:\w \u$ '

#voor de minimalisten: alleen een $
PS1='$ '

#een erg lange, als dat je ding is: de datum, tijd (HH:MM:SS in 24-uurs formaat) username@hostname : het volledige path naar de huidige directory
PS1='\d \t \u@\H : \w$'

#dezelfde lange prompt als net, nu verdeeld over twee regels
PS1='\d \t\n\u@\H : \w$'

Alles eindigt met een $, dit is gebruikelijk als je bent ingelogd als een “normale” user. Een # wordt gebruikt bij root (de beheerder van de computer) om zo snel te kunnen zien als wat voor user je bent ingelogd.

Uiteraard zijn er vele variaties te bedenken, expirimenteer hiermee totdat je iets hebt gevonden wat goed werkt voor jou. Een volledig overzicht van de variablen is beschikbaar in de handleiding.

Aanvullen van commands

Men zegt altijd “een goede ICT-er is lui”, waarmee bedoelt wordt dat ICT-ers graag zo min mogelijk doen om zoveel mogelijk werk klaar te krijgen. Wat daar bij helpt is het aanvullen van commando’s door slecht een paar karakters te typen en dan op tab te drukken.

Omdat ik ook een (goede) ICT-er ben heb ik dan ook de volgende regels opgenomen:

set show-all-if-ambiguous On
bind "set completion-ignore-case on"
complete -A user       su sudo
complete -A hostname   rsh rcp telnet rlogin r ftp ping disk ssh

Deze regels zorgen er voor dat:

  1. Alle mogelijke commands getoond worden als er meerdere mogelijkheden zijn. Typ ik bijvoorbeeld cl[tab] krijg ik cleanlinks, clear en clri te zien;
  2. Het aanvullen niet hoofdlettergevoelig is, wat erg handig is als je niet zeker bent over het hoofdlettergebruik;
  3. Usernames worden aangevuld na de commando’s su en sudo;
  4. Hostnames (zoals gevonden in /etc/hosts) worden aangevuld na het intypen van bijvoorbeeld ftp of ssh.

Aliassen

Hoewel het aanvullen van commando’s erg handig is, is het soms handiger om gewoon een korte alias te hebben voor een lang commando wat verschillende parameters accepteert. Gelukkig kan dit ook met alias aliasnaam commando in de file. Hieronder mijn aliassen:

alias ll='ls -hlA' 

alias irb='irb -r irb/completion'

alias cp='cp -i'
alias mv='mv -i'

alias st="svn st -u"
alias chi="svn ci *"
alias up="svn up"
alias di="svn diff"
alias rv="svn revert"

alias profileme="history | awk '{print \$2}' | awk 'BEGIN{FS=\"|\"}{print \$1}' | sort | uniq -c | sort -n | tail -n 20 | sort -nr"

alias e=mate

alias grip="grep -i"

alias sthrn="ruby /Users/martijnengler/code/ror/hrn/script/server webrick -p 3002"
#... zo nog een aantal voor RoR

Op deze manier kan door het typen van ll een lijst met bestanden in de directory krijgen, onder elkaar, met leesbare groottes (in kilobytes, megabytes, gigabytes etc.) inclusief verborgen bestanden. Als ik altijd het volledige ls -hlA zou moeten typen zou ik dit handige commando veel minder gebruiken.

De alias voor irb heb ik al eerder over geschreven, dit zorgt voor tab completion in de Interactive RuBy shell.

Ook de commando’s cp en mv overschrijf ik. Op deze manier komt er een prompt als je op het punt staat een file te overschrijven, net als in Mac OS X of Windows. Dit voorkomt het per ongeluk overschrijven van files.

De aliassen voor svn zijn handig voor mensen die hiermee werken. Deze hebben geen uitleg nodig voor SVN-gebruikers en zijn niet interessant voor mensen die dit toch niet gebruiken. ;)

De profileme-alias werkt niet samen met export HISTCONTROL=erasedups, maar geeft anders wat statistieken over de commando’s die je gebruikt. Best grappig dus, als je erasedups niet gebruikt.

e=mate maakt het commando om Textmate te openen nog korter. Vaak zit ik in een directory en wil ik die openen als project in Textmate om er aan te gaan werken. Ik typ dan simpelweg e . om te beginnen.

De grip-alias is een kortere manier om een grep uit te voeren die niet hoofdlettergevoelig is. Je kunt eventueel ook de alias grep noemen als je grep nooit hoofdlettergevoelig wilt gebruiken.

De laatste alias, sthrn, he ik er een aantal van. Hiermee kan ik snel een Rails-server starten zonder het hele path te moeten kennen, te weten op welke poort ik het wil draaien en expliciet aan te geven dat ik webrick wil gebruiken in plaats van Mongrel.

Overig

En dan zijn er nog wat dingetjes die ik gewoon graag neerzet:

export EDITOR=vi

export LC_CTYPE=en_US.UTF-8

export set CLASSPATH=/usr/local/lib/mysql/mysql-connector-java.jar:. 

export RUBYOPT=rubygems

set -o vi

set bell-style none

Dit maakt vi de standaard editor, zet de encoding op UTF-8, voegt de MySQL-connector toe aan mijn classpath voor Java, zorgt er voor dat rubygems automatisch geladen worden en maakt vi ook de editor die gebruikt wordt op de commandline zelf. En natuurlijk schakelen we die irritante beep uit…

Wil je ook alles hebben? Download mijn .profile!

Een makkelijke en snelle manier om dat te doen is door dit in te typen op de terminal: cd ~; curl -o .profile http://digicted.nl/uploads/.profile; . .profile

Dit verandert de huidige directory naar je homedirectory, download de .profile van Digicted en activeert ‘m.

Vragen, tips of opmerkingen?

Als altijd: de reacties staan open, want ik ben voor open communicatie. Behalve spam worden reacties nooit in de prullenbak gegooid.

Toch raad ik aan eventuele liefdesbrieven of huwelijksaanzoeken via email te doen of anoniem te posten. Uiteraard ben je hier echter ook vrij in, dus post ze gerust in de comments.

Wat voor blogger ben jij?

Thursday, October 18th, 2007

What Kind of Blogger Are You?

Zelf ben ik in ieder geval een Purist Expert Socialite:

Of ik echt een expert ben weet ik niet, maar een purist ben ik zeker. En sociaal? Ik gebruik sites als Reddit, Digg, del.icio.us e.d., dus volgens de test wel.

De grote vraag is nu natuurlijk: wat voor blogger ben jij? Take the test!

Via Gigadesign.

Verjaardaag 2007 (of: ik ben 20)

Sunday, October 14th, 2007

Hoewel ik geprobeerd heb m’n verjaardag over te slaan (ben niet zo’n verjaardagsmens) zijn er al zoveel mensen achter gekomen dat ik het maar net zo goed kan posten: vanaf vandaag, 14 oktober 2007, ben ik 20.

Voor de duidelijkheid: ik was dus 19, geen 20 en ook geen 21. En voor de paar mensen die me echt niet kennen: ik ben ook niet boven de 30.

E-cards, gewone kaartjes, telefoontjes en dat soort dingen kunnen mij ook vandaag via de normale weg bereiken.

Foto’s van de verjaardag volgen vast nog wel, hoewel ik het voor elkaar heb gekregen te zorgen dat er bijna niemand komt. Eigenlijk alleen een heel klein beetje familie. Of er moet weer zoiets gebeuren als drie jaar geleden… Veel foto’s zullen er dus niet zijn naar ik hoopverwacht.

Update: er zijn bijna geen foto’s gemaakt, vandaar dat er niets gepost is. Foto’s die er wel zijn uiteraard te vinden op Flickr.

Een huwelijksaanzoek via Ruby

Saturday, October 13th, 2007

Een uit de hand gelopen grap waarbij ik iemand ten huwelijk heb gevraagd resulteerde dit keer in het schrijven van een Ruby-script. Het hele verhaal is iets te veel om hier te plaatsen, maar de korte versie is dat mijn eerste aanzoek mislukte en ik daarom een tweede zou proberen. Omdat deze persoon ook wel iets met code heeft (niet met Ruby helaas) besloot ik dit in Ruby te schrijven. Huwelijksaanzoeken gaan ten slotte om liefde en dat ik van Ruby houd zal geen geheim zijn…

De vorm van het hart komt van een soortgelijk Perl-script, maar de code is geheel zelf geschreven.

Dit zou natuurlijk nooit gebruikt mogen worden in een “productie”-omgeving, maar voor een grap is het wel eens leuk om je code wat vorm te geven.

De code is op deze blog niet helemaal mooi zo op de weblog, misschien kan ik hier later nog wat aan doen.

Hoe dan ok, laten we maar beginnen:

#!/usr/bin/env ruby -W0
@y = ""
you = "Susan"
love = you

     def i           (a,b)
   puts @y         end;str =
 "Rtrzm, " + "vhk id zkridakh"
str.concat("des lds ld sqntvd")
str += "m"; str.split(//).each{
 |bfiwdl| @y << bfiwdl.succ };
  @y.split("").each{|qjwciqb|
   @you = @y.gsub(/\!/," ")}
    @you.gsub!("aa","a");id
      @y = @you.gsub("-",
        ",");@y += "?";
          @y.gsub!(#q
            /\s+/,#
             " ");
              you
               p

         i love, you

Voor we aan de uitleg beginnen zal ik de code eerst wat opsplitsen in een leesbare structuur.

#!/usr/bin/env ruby -W0
@y = ""
you = "Susan"
love = you

def i (a,b)
   puts @y
end

str = "Rtrzm, " + "vhk id zkridakh"
str.concat("des lds ld sqntvd")
str += "m"
str.split(//).each{ |bfiwdl|
  @y << bfiwdl.succ
}

@y.split("").each{ |qjwciqb|
  @you = @y.gsub(/\!/," ")
}

@you.gsub!("aa","a")
id
@y = @you.gsub("-", ",")
@y += "?"
@y.gsub!(#q
/\s+/,#
" ")
you
p
i love, you

Nu zal het ook duidelijk zijn dat er heel wat “overbodige” code in zit, maar die was soms nodig om de vorm succesvol te krijgen.

Regel voor regel er maar weer even door dan:

De eerste regel vertelt Ruby geen warnings te tonen door het gebruik van -W0. Dit voorkomt een warning over de methode id die eigenlijk niet meer gebruikt zou moeten worden. Op die plek had ik echter gewoon eventjes twee tekens nodig…

Daarna maken we de variable @y die in de hele class beschikbaar is, deze gebruiken we uiteindelijk om de output in op te slaan. De naam Susan wijzen we toe aan de variable you en you weer aan love.. We kunnen elke waarde in deze variablen stoppen, het gaat er om dat we ze nodig hebben aan het einde.

Dan begint het hart van de code, wat geopend wordt met een simpele methode die we i noemen en 2 parameters accepteer: a en b. Eigenlijk doen we niets met deze parameters, maar op deze manier kunnen we het later aanroepen als i love, you waarbij i gewoon een call is naar de methode en love en you de parameters zijn.

Alles wat we binnen deze methode doen is het printen van de waarde van @y.

De volgende stap is het aanmaken van de string die we willen printen. Normaal gesproken hadden we hier iets kunnen doen als @y = "Susan, wil je alsjeblieft met me trouwen?", maar het moest natuurlijk wat cryptisch zijn en het hart opvullen. De string maken we dan ook in een aantal stappen.

Eerst maken we simpelweg het eerste deel van de string aan, gebruiken we concat() om er nog een stukje aan toe te voegen en ten slotte += om de laatste letter toe te voegen.

Vervolgens doen we een split op de string, met als argument een lege regular expression. Het resultaat hiervan is dat we een array hebben waarin alle letters van de string afzonderlijk zijn opgeslagen. Met een each-block lopen we door de array heen en hebben we in de variable bfiwdl steeds de volgende letter van de string zitten.

Bij de eerste iteratie is dat dus een R, vervolgens een t etc. De naam bfiwdl is gekozen omdat dat het aantal karakters was wat ik nodig had om die regel op te vullen. Hier beginnen we ook de @y-string te vullen. @y << bfiwdl.succ is gewoon een andere schrijfwijze voor bijvoorbeeld @y += bfiwdl.succ. Zoals wel vaker kent Ruby gewoon verschillende methodes om iets uit te voeren.

De methode succ pakt steeds het volgende karakter, zoals dat voor een mens ook enigszins logisch zou zijn. Na een ‘a’ komt dus een ‘b’ en na een ‘c’ een b. Als we nu terugkijken naar de string die in str zit (Rtrzm, vhk id zkridakh des lds ld sqntvdm) zal het misschien ook opvallen dat we dus steeds een letter “terug” in het alfabet zijn gegaan.

Door de functie succ pakken we steeds de volgende waardoor we iets leesbaars krijgen. Als dit gebeurt is splitten we op onze nieuwe string. Dit keer geven we een lege string mee als argument aan split, wat hetzelfde resultaat geeft als een lege regular expression. Wederom een voorbeeld hoe je een probleem soms op meerdere manieren kan oplossen: iets wat erg handig kan zijn als je een stukje code schrijft wat enigszins cryptisch moet zijn.

De naam qjwciqb is weer puur gekozen vanwege lengte, deze variable gebruiken we verder ook niet in het blok. Wel gaan we de nieuwe variable @youineens gebruiken. Hier komt een string in te zitten die lijkt op de string in @y, maar een verbeterpunt heeft. Door het gebruik van .succ zijn de spaties in de string vervangen door uitroeptekens. Met gsub (een methode om tekst in een string te vervangen), zetten we de uitroeptekens terug om naar spaties.

Ook de dubbele a gaan we vervangen. Ruby vindt dat de ‘z’ opgevolgd moet worden door ‘aa’, iets waar ik het niet mee eens ben. Met @you.gsub!("aa","a") zet ik dit weer “goed”. Iets verder doen we een dergelijke replace als de vorige twee om van een - terug een komma te maken.

Voor die regel zien we echter nog een (nutteloze) call naar de functie id. Zoals gezegd bij de bespreking van regel 1 is deze niet nodig en puur voor opvulling van het hart.

We zijn weer terug aan het werk in @y en voegen nu het vraagteken toe aan het eind van de string. Het is ten slotte een verzoek, geen opdracht. Of dat is op z’n minst wat ik wil dat zij denkt. ;-)

Om het af te maken vervang ik dubbele spaties met een regular expression nog door een enkele spatie. Dit werkt als volgt: \s is het teken voor een spatie in regular expressions. \s+ Wil zeggen: één of meer spaties achter elkaar. Door deze te vervangen door een enkele spatie werd een probleem wat ik eerder had opgelost. Bij een latere iteratie van de code was de string eigenlijk al gelijk goed, maar toch heb ik het laten staan.

De # staan er weer voor … opvulling.

De laatste twee regels: you en p doen eigenlijk niets. Tegen het einde van zo’n hart wordt het erg smal en heb je gewoon wat korte namen nodig…

De i love, you op de laatste regel heb ik al uitgelegd in het begin: dit roept gewoon de functie i aan met parameters love en you.

Uiteraard is dit geen code die ooit in productie zo geschreven zou mogen worden, maar toch zitten er dingen in die ook in productie gebeuren:

  • Code die niet meer gebruikt wordt laten staan in plaats van verwijderen
  • De waarde van een variable in een andere stoppen en dan weer terug. Gelukkig zie ik dit weinig, maar ik heb het al meegemaakt…
  • Functies die eigenlijk geen nut hebben in de code zetten
  • Onduidelijke variabelenamen (zoals bfiwdl)
  • En natuurlijk: 15 regels code gebruiken voor iets wat ook in één regel opgelost had kunnen worden.

Kleine note nog: ik heb nog geen ja of nee gehoord van het bewuste meisje. Iemand tips om er een ‘ja’ uit te krijgen? ;-)

Mijn hardware: een overzicht

Saturday, October 6th, 2007

Op veler verzoek is het hier dan eindelijk: een lijst met mijn hardware. De belangrijkste in ieder geval, ik heb dingen als m’n Mac SE II er af gelaten.

Ik hoop dat mensen hier tevreden mee zijn en me nu niet meer blijven vragen wat ik heb staan… ;-)

Puppis (MacBook)

CPU
1.83GHz Intel Core 2 Duo
Geheugen
2GB 667 MHz DDR-II (2x 1GB PQI)

Operating System
Mac OS X Tiger
Harde schijven
Toshiba 60GB
Een 7200RPM, externe USB-disk (eigenlijk een interne disk ingebouwd in zo’n kastje..)
Grafische kaart
GMA 950
Netwerk
10/100mbit LAN
Airport (draadloos netwerk)
CD-Brander / DVD Speler
MATSHITACD-RW CW-8221
Monitor
Ingebouwd scherm en Samsung 205BW (Samsung 205BW review)

Zie ook mijn MacBook review en mijn eerdere mening over de MacBook.

Orion (Windows/Linux workstation)

CPU
Intel PentiumD 930 (P) DC 3.0GHz
Moederbord
Asus P5LP-LE
Geheugen
2GB DDR-II (2x 1GB Micron)
Operating System
Windows XP
Ubuntu Linux
Harde schijven
2x Seagate Barracuda 7200.8 SATA NCQ 200826, 200GB
Western Digital 160GB, 7200RPM, externe USB-disk
Grafische kaart
Radeon X1300
Netwerk
10/100mbit LAN
Ook een draadloos dingetje.. Niet in gebruik.
Geluid
Intel 82801GB ICH7 - High Definition Audio Controller
Brander
HP DVD Writer 740b
Speler
TSSTcorp DVD-ROM TS-H352C
Monitor
Samsung 173P

Libra (server)

CPU
Intel Celeron D 331 2.6 GHz, 533 MHz
Moederbord
Asus P5VDC-X
Geheugen
512MB
Operating System
FreeBSD
Harde schijven
3x 300GB in RAID5, een vierde ligt klaar
Western Digital Elements 500GB
Netwerk
10/100mbit LAN

Speler
Merkloos DVD-spelertje.
Monitor

Deelt de Samsung 205BW, via de VGA-poort. Meeste werk via SSH.

Dit zijn mijn belangrijkste computers. Ik heb ook nog een testbakje naast me staan en wat andere hardware zoals een iPod Nano, HTC S710, printers (inkjet en laser), scanner etc. Alle “nuttige rommel” die er nog op zolder ligt (cd-romdrives, floppydrives, oude hdds, netwerkkabels etc.) heb ik hier ook maar niet op het lijstje gezet.