Digicted

Archief voor Software

Perl warnings op Leopard oplossen

Sunday, November 11th, 2007

Voor mensen die Leopard gebruken en het volgende probleem hebben met Perl:

perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
   LC_ALL = (unset),
   LC_CTYPE = "en_US.UTF-8",
   LANG = "UTF-8"
   are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").

Zet dit in je .profile:

# This setting is for the new UTF-8 terminal support
export LC_CTYPE=en_US.UTF-8
export LC_ALL=en_US.UTF-8

En de warnings zijn weg…

Oplossing gevonden via Rubify.

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.

Ruby: tab completion in IRB

Monday, May 7th, 2007

Het is nog steeds erg druk bij Silverware, dus dit wordt even een snelle post, maar misschien dat er nog mensen zijn die hier erg blij van worden? ;)

Als je net zoals ik nog wel eens werk met de Interactive RuBy shell (kortweg IRB) heb je vast wel eens autocompletion gemist. Dankzij de geweldige tip van Eli Bendersky is dat niet langer nodig!

Hij plaatste zelf de volgende tip voor Windows-gebruikers:

For some reason, however, irb doesn’t come with tab completion out of the box. To set it up, you can create a batch file called irbb.bat, for instance, which calls:

  irb -r irb/completion
  

And call that instead of irb. A simpler method, IMHO, is directly edit the irb.bat file in the Ruby installation bin/ directory to require irb/completion.

Voor de mensen die echter Mac OS (of Linux/BSD of een ander UNIX-based OS) gebruiken werkt het beter om even je .profile (een verborgen bestand in je homedirectory) te bewerken (als je gebruikt maakt van bash in ieder geval). Door onderaan het regeltje alias irb='irb -r irb/completion' te plaatsen, het bestand op te slaan en dan . .profile in te typen op de terminal zou je autocompletion toegevoegd moeten hebben.

Nieuwe hardware deel 4: Western Digital Elements 500GB

Monday, April 16th, 2007

Zoals bekend staan mijn muziekbestandjes op de server en geven ze me de laatste tijd nog al eens problemen ook. Vandaag zijn ze misschien echter mijn redding geweest.
Terwijl ik vrolijk muziek aan het luisteren was tijdens het (thuis)werken besloot het liedje er plots mee te stoppen. Ik hoop niet dat er op dit moment mensen in de buurt waren, want mijn stem werd plots niet langer overstemd door de speakers; waarschijnlijk zijn weinig mensen daar erg blij mee.

Snel switch ik dus naar iTunes en inderdaad.. De tijd bleef stilstaan op nog 1:17, het nummer op New Found Glory - The Story So Far en verder gebeurde er niks… Tot daar die melding kwam “Volume MP3 disconnected”. Uiteraard draaide ik me onmiddelijk om naar de monitor die ik tijdelijk heb aangesloten op de server, omdat ze de laatste tijd al vaker problemen gaf. Enge meldingen over “ATA” en “SCSI” stonden op dat moment op mijn scherm. Uiteraard doet dat je altijd even schrikken, ook al heb je nog zulke goede backups. En eigenlijk heb ik die niet. Nu is er ook veel data waar ik zonder zou kunnen, maar liever niet kwijtraak. Omdat dat heel wat GB-tjes zijn is een backupoplossing daarvoor ook al snel relatief duur. Nu heb ik echter toch de knoop doorgehakt en ben ik naar Ridderkerk (of is het nou Barendrecht?) gereden om de omzet van Alternate maar weer eens te verhogen.

Van te voren even bellen om de harde schijf te laten reserveren en ophalen dan maar.

Thuis uitgezocht hoe ik de harde schijf als ext3 kon formatteren en met wat zoekwerk was dat eigenlijk zo moeilijk nog niet. Het enige wat ik moest doen was het commando mkfs -t ext3 /dev/sdc1 te typen en de FAT32-partitie werd zo omgezet naar een ext3.

Vervolgens mounten door de commando’s sudo mkdir -p /mnt/norma en sudo mount /dev/sdc1 /mnt/norma en de USB-schijf werkte eigenlijk direct. Hierna heb ik mijn eigen gebruiker eigenaar gemaakt van de mount: chown -R martijnengler /mnt/norma.

De volgende stap is dan natuurlijk het maken van een backup van de volledige Ubuntu-installatie: sudo tar cvpjf /mnt/norma/backup-2007-04-16.tar.bz2 --exclude=/proc --exclude=/lost+found --exclude=/mnt/norma/backup-2007-04-16.tar.bz2 --exclude=/mnt --exclude=/sys / wat een volledige backup van alle mappen maakt in een tar-file, met bz2-compressie. Bepaalde mappen (/proc, /lost+found, de backup zelf etc.) nemen we niet mee.

Het terugzetten van de backup zou moeten lukken met tar xvpfj /mnt/norma/backup2007-04-16.tar.bz2 -C / volgens deze guide.

Update: omdat root-access natuurlijk nodig is, moest er sudo voor de commands staan.. Niet zo handig van me. En om de één of andere reden verandert wordpress de 2 dashes (- -) voor exclude in één dash: dat klopt ook niet. Er horen twee dashses voor exclude te staan, niet één!

Herstel missende bestanden in iTunes met Applescript

Wednesday, April 11th, 2007

Al mijn mp3’s staan op een server, zodat ik er makkelijk bij welke computer ik ook gebruik op dat moment. Ook vanaf het internet kan ik de mp3 zo bereiken op verschillende manieren. Ondanks deze, en andere, voordelen zijn er ook nadelen aan deze oplossing. Als ik geen verbinding heb met het netwerk of het internet kan ik niet bij mijn geliefde muziekbestandjes. Dit introduceert ook gelijk een ander probleem…

Als ik mijn iPod aansluit wordt iTunes geopend die daarna gelijk synchroniseert met het speeltje. Omdat ik de mp3speler meestal direct aansluit op de MacBook Pro als ik thuiskom betekent dit soms dat ik nog geen verbinding heb met de shares van de server.

Nu zou dit geen probleem zijn als het gedrag van iTunes altijd hetzelfde was. Helaas is dat niet het geval: bij het afspelen van een liedje wat op de share staat waar geen verbinding mee is maakt het muziekprogramma automatisch verbinding. Bij het synchroniseren met de iPod is dit echter niet het geval: alle liedjes die overgezet moesten worden worden gemarkeerd als “niet gevonden”, ook al bestaan ze wel. Als zo’n track vervolgens wordt afgespeeld valt het programma terug in haar normale doen: het omcirkelde uitroepteken verdwijnt. Een simpele “oplossing” is dan ook het aanklikken van de verschillende items (op next drukken zal deze bestanden overslaan), maar dat is geen leuk werk als het gaat om honderden nummers. Wat dat betreft heb ik geluk met dat ik een iPod nano heb waar maar 8GB op kan. ;)

Vandaag gebeurde het me weer en was ik het zat, dus ben ik op zoek gegaan naar een oplossing. Uiteindelijk vond ik dit Apple Script:

tell application "iTunes"
  set thePlaylist to library playlist 1
  set musicFiles to the file tracks of thePlaylist

  repeat with mf in musicFiles
    --the name of mf as string
    set hasLoc to ""
    if (the location of mf as string ¬
     is equal to "missing value") then
      try
        set comment of mf to the comment of mf & ""
      on error number errNum
        delete mf
      end try

    end if
  end repeat
end

De regel waarin de bestanden weggegooid worden als ze *echt* niet bestaan heb ik er uit gehaald, omdat ik die liever handmatig nog eens nakijk. Het script werd bij mij dan ook uiteindelijk als volgt:

tell application "iTunes"
  set thePlaylist to library playlist 1
  set musicFiles to the file tracks of thePlaylist

  repeat with mf in musicFiles
    --the name of mf as string
    set hasLoc to ""
    if (the location of mf as string ¬
     is equal to "missing value") then
      try
        set comment of mf to the comment of mf & ""
      end try
    end if
  end repeat
end

Door te navigeren naar “Applications”=>”Applescript”=>”Script Editor” en daar de code in te plakken was het genoeg dit op te slaan in mijn Applications-map en daarna te runnen. Tá dá! Alle rondjes weg!

Voor mij dus een geweldige uitkomst voor dit vervelende probleem!

Takenlijst met “toevoegen” en “verwijderen” maken met prototype

Saturday, April 7th, 2007

Eerder deze week schreef ik al over het toevoegen van een nieuwe rij met prototype waar ik uitlegde hoe je een tabel gemakkelijk dynamisch kunt uitbreiden met behulp van wat Javascript.
Dit keer gaan we weer aan de slag met prototype, maar maken we een dynamische todolist. We willen gebruikers items laten toevoegen en verwijderen en vervolgens opslaan. Voor het gemak heb ik hier een plat tekstbestand voor gebruikt, maar het is natuurlijk ook mogelijk om het naar een database te schrijven. Laten we maar weer beginnen de HTML te schrijven:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
  "http://www.w3.org/TR/html4/strict.dtd">
<html>
  <head>
    <title>Todolist</title>
    <script type="text/javascript" src="prototype.js"></script>
    <script type="text/javascript" src="todolist.js"></script>
  </head>
  <body>
    <form action="displaylist.php" method="post" id="items">
      <fieldset>
        <legend>Items</legend>
        <ul id="todolist">

        </ul>
        <input type="submit" name="done" value="Klaar" id="done">
      </fieldset>
    </form>
    <form id="addtodo" action="" method="post">
      <fieldset>
        <legend>Nieuwe items</legend>
        <label for="item">Item</label>
        <input type="text" name="item" id="item">
        <input type="submit" name="add" value="Voeg toe" id="add">
      </fieldset>
    </form>
  </body>
</html>

Het lijkt me niet dat ik hier veel uitleg bij hoef te geven. Er komen simpelweg twee formulieren en een lijst. Het tweede formulier is voor het toevoegen van nieuwe items en het eerste formulier hebben we straks nodig om de waarden echt op te slaan.

En dan het Javascript:

function addItem()
{
  $( 'addtodo' ).onsubmit = function()
  {
    var item = $F( 'item' );
    id = id + 1;
    var newitem = '<li id="todo-' + id  + '">' + item;
    newitem += ' (<a href="#" id="delete-item-' + id + '" class="delete">verwijderen</a>)';
    newitem += '<input type="hidden" name="items[]" value="' + item + '">';
    newitem += '</li>';
    new Insertion.Bottom( "todolist", newitem );
    deleteItem();
    $('item').value = '';
    Form.Element.focus( 'item' );
    return false;
  }
}

function deleteItem()
{
  var items = document.getElementsByClassName("delete");
  for (var i=0; i < items.length; i++)
  {
    var myitem = items[i];
    items[i].onclick = function()
    {
      $( 'todo-' + this.id.substring( 12 ) ).remove();
      return false;
    }
  }
}

function init()
{
  id = 0;
  addItem();
}

Event.observe(window, 'load', init, false);

Hier zien we eerst een functie om een nieuw item toe te voegen aan de lijst (additem) als het onderste form gesubmit wordt. We voegen het item toe aan de lijst en maken daarna het vak leeg. Daarna plaatsen we de focus in het vak, zodat er gelijk een nieuw item getypt kan worden.
De return false; is om te voorkomen dat het formulier echt gesubmit wordt.

Daarna deleteItem() om ook items te kunnen verwijderen. Eerst halen we daar alle elementen op met de class “delete” en daarna kijken we of er op geklikt wordt. Als dit zo is verwijderen we de complete li met het dat id van het DOM.
De andere functies zullen aardig vanzelfsprekend zijn als je het vorige artikel hebt gelezen

Nu komt de PHP:

<?php
$sList = '';
foreach( $_POST[ 'items' ] as $sItem )
{
  $sList .= "- " . $sItem . "\n\r";
}
file_put_contents( "list.txt", $sList );
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
  "http://www.w3.org/TR/html4/strict.dtd">
<html>
  <head>
    <title>Resultaat</title>
  </head>
  <body>
    <p><a href="list.txt">De lijst</a> is succesvol weggeschreven.</p>
  </body>
</html>

Ook dit stelt op zich niet zo heel veel voor:

  1. Loop door alle inputvelden heen en voeg ze toe aan een variable.
  2. Schrijf deze variable weg naar een bestand. Ik gebruik hier de functie file_put_contents, die pas beschikbaar is vanaf versie 5; als er behoefte is aan een PHP4-versie wil ik deze later nog posten.
  3. Geef de gebruiker een linkje naar zijn nieuwe todolist. Het is natuurlijk ook mogelijk om de lijst al gelijk weer te geven.

Bekijk hier de demo en stel eventuele vragen in de reacties.

Peepel: nu echt je desktop op het web?

Thursday, April 5th, 2007

Een paar dagen geleden schreef ik al over een mogelijke omschakeling van desktopapplicaties naar webapplicaties (en inmiddels gebruik ik del.icio.us voor de bookmarks en Google Calendar voor de kalender), maar dat was nog voor ik “Peepel” had gezien.

Peepel is een behoorlijk compleet product wat onder andere een tekstverwerker, spreadsheetprogramma en rekenmachine aanbiedt. Nu kenden we natuurlijk al een tijdje tekstverwerkers op internet (Google Docs & Spreadsheets, Zoho Writer bijvoorbeeld) en een calculator is ook niet zo ingewikkeld.

Het is echter de manier waarop Peepel de applicaties samenvoegt die het product uniek maakt. Het is mogelijk verschillende vensters open te hebben binnen je werkgebied en deze vervolgens minimaliseren, maximaliseren, afsluiten et cetera. Staat de “applicatie” niet waar je het hebben wilt? Gewoon simpelweg verslepen.

Verder biedt Peepel ook een “appswitcher” aan (aan de linkerkant) en kun je vensters naar voren halen door er op te klikken. Dit alles is natuurlijk zeer bekend in de wereld van de traditionele applicaties, maar nog niet veel op deze schaald uitgevoerd in een webapplicatie.

Ook is het mogelijk om heel simpel mappen aan te maken, bestanden er in te plaatsen, verwijderen en alles wat je gewend zou zijn van een normale filemanager.

Ook voor dit product geldt dat ik het nog niet direct zelf wil gebruiken, maar zeker denk dat er toekomst voor is. En technisch gezien moet ik ze ook nageven dat ze goed hun best hebben gedaan en er een mooi product uit is gekomen. Wel vond ik het jammer dat de applicatie maar half werkte in Safari; typen in de tekstverwerk ging niet bijvoorbeeld.

Interesse? Bekijk de demonstratievideo of maak een account aan en kijk zelf.

Slickrun: Quicksilver voor Windows?

Wednesday, April 4th, 2007

Dankzij Replacing Start Run - The Quest Continues heb ik weer eens gekeken naar een zogenoemde “application launcher” voor Windows. Op de Mac ben ik helemaal weg van Quicksilver, hoewel ik daar nog lang niet de maximale potentie uithaal. Momenteel gebruik ik het als simpele app launcher, maar bijna niet meer dan dat, hoewel de mogelijkheden erg uitgebreid zijn.

Op Windows gebruikte ik al geruime tijd Colibri, wat ineens stopte met werken met een rare SQL error. Helaas ben ik er nooit meer aan toegekomen om het probleem te onderzoeken dus was het weer terug naar Winkey+R en dan de programmanaam intypen. Omdat het toetsenbord echter letterlijk in de kast ligt doe ik momenteel toch veel met de muis op Windows, dus ik kan ook weer niet zeggen dat ik het heel erg mis.

Nu ik SlickRun op de PC heb gezet en er even mee gewerkt heb lijkt dit me toch een programma wat, na wat configuratiewerk, best lekker gaat werken.

Je voegt zelf je keywords toe, wat mij bijvoorbeeld de mogelijkheid geeft om met 2 letters PuTTY op te starten. Eerst druk ik op ctrl+space, dan typ ik pt en daar staat PuTTY direct voor m’n neus.
Ook tor voor µTorrent werkt heel vlug en gemakkelijk.

Natuurlijk is het daarna maar de vraag wat je met je toetsenbord kunt, want om snel te connecten met mijn ontwikkelserver moet ik alsnog even dubbelklikken op de naam in het venstertje omdat ik anders door allerlei velden moet “tabben”.

Het lijkt er dus op dat Slickrun nog zeker geen Quicksilver is, maar een snelle manier om je applicaties op te starten is het wel. Zeker voor de “keyboardshortcut”-freaks onder ons een geweldig (en gratis!) programma!

Besturingssystemen het raam uit, Firefox het nieuwe platform?

Monday, April 2nd, 2007

Vandaag las ik op Lifehack het artikel Firefox OS: Why My Hard Drive & Software are Obsolete waar schrijver Leo Babauta uitlegt waarom hij denkt dat Firefox (of elke browser in principe) het nieuwe platform zou kunnen zijn in plaats van Mac OS X, Windows, Linux, (Free)BSD of welk ander systeem dan ook.

Omdat ik zelf 97% van de tijd op een MacBook Pro met Mac OS X werk, maar ook jaren met Windows (3.11, 95, 98, ME, 2000 en XP) heb gewerkt en zelfs de nodige Linux distributies heb meegemaakt (Redhat / Fedora, Gentoo, Debian en Ubuntu als voornaamste) heb ik hier ook wel enigszins een visie op. Nu alle computers in het Crystal Labs kantoor een ander OS draaien (de ontwikkelserver op Ubuntu, de MacBook Pro Mac OS X, de testpc voornamelijk FreeBSD en de Windowsbak op WindowsXP) denk ik ook genoeg kennis te hebben om dit eerlijk in te schatten.

Persoonlijk ben ik helemaal weg van Firefox. Hoewel ik vind dat zowel Safari als Opera voordelen bieden, mis ik gewoon te veel extensies zonder Firefox. Erg jammer, omdat ik zeker voordelen zie in beide browsers.
Ondanks deze voorliefde voor Firefox, zie ik toch verschillende nadelen in het gebruik van het internet als “besturingssysteem”:

  1. We zijn nog steeds niet 100% van de tijd online. Uiteraard wordt dit met de dag makkelijker door verschillende technologieën als UMTS en HDSPA, maar voorlopig laat de snelheid nog te wensen over. Ook de extra kosten die dit met zich meebrengt zijn niet voor iedereen de moeite waard.
  2. Verder hangt het, zoals de auteur zelf ook al aangeeft, ook erg af van de branche waarin men zich begeeft. Of beter gezegd: het doel van het gebruik van de computer. Hetzelfde als de keuze voor een “traditioneel” besturingssysteem (of überhaupt een computer eigenlijk) moet eerst gekeken worden wat het doel is. Voor het delen van foto’s maak ik ook gebruik van Flickr (hoewel minder dan ik zou willen, ik heb vanavond besloten al mijn foto’s op Flickr te gaan plaatsen), deze weblog draait op Wordpress en voor het bijhouden van verschillende blogs gebruik ik Bloglines. Al deze diensten zijn zeer gemakkelijk in gebruik en veelgebruikt, waardoor er ook voldoende documentatie voor handen is.
    Zo schreef Sanne Roemen over het gebruik van Bloglines, vond ik vanavond dit artikel over het gebruik van Flickr en is er ook voldoende Nederlandse documentatie van Wordpress.

    Voorlopig zijn er echter applicaties die ik liever “offline” gebruik, zoals het lezen van email (met Mail.app van Apple), het bijhouden van een kalender (iCal, ook van Apple) en mijn core business: het typen van code.
    Zelfs het typen van deze blogpost doe ik in mijn favoriete editor, Textmate.

Ik zie dus best voordelen in webapplicaties en voor sommige wil ik misschien zelfs wel switchen van een “offline” applicatie naar een online applicatie (zo ben ik al tijden geleden van Sage overgeschakeld naar Bloglines en twijfel ik of ik de kalender misschien toch ook niet online wil hebben), maar sommige dingen blijven gewoon beter offline. Het gebruik van GTalk in de browser is leuk als ik echt geen normale client heb en even snel op MSN met eBuddy kan ook, maar dit zijn dingen die ik toch liever niet online doe. Misschien dat dat in de toekomst verandert als webapplicaties zich verder ontwikkelen, maar voorlopig blijf ik voor deze dingen bij mijn vertrouwde applicaties.

Kortom: ik zie zeker een toekomst voor Firefox als het nieuwe platform, maar nu nog niet. Niet voor mij in ieder geval, maar ik denk dat er zeker al een doelgroep voor is. En zoals ook blijkt uit het artikel lijkt het er op dat Google dat ook gezien heeft en er slim op inspeelt…