Digicted

Archief voor Apple

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.

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.

Nieuwe hardware deel 5: Macbook(2)

Wednesday, September 5th, 2007

Sommige mensen wisten het al: de MacBook Pro van Silverware is naar een partner in dat bedrijf en ik heb een “gewone” MacBook gekocht. Voor sommige mensen misschien een verrassing, aangezien ik niet heel erg positief was toen ik voor het laatst een MacBook had.

Ze is echter zeer mobiel qua formaat en gewicht en nu er 2GB geheugen in zit (de vorige die ik tijdelijk had, had slechts 512MB geheugen) draait ze geweldig! Op toekomstige afspraken met klanten van Crystal Labs zal ik dus met notebook verschijnen. En uit ervaring kan ik zeggen dat dat toch wel erg makkelijk is.

Voor de technici onder ons: een 1.83GHz Intel Core 2 Duo, 2GB 667 MHz DDR2 SDRAM (geleverd door PC Megastore en keurig afgehandeld), 60GB 5400RPM harde schijf.

Voor de a-technici: het is een witte laptop.

Zie ook de foto’s van de Macbook op Flickr (in omgekeerd chronologische volgorde).

Mijn “nieuwe” blogplek

Friday, August 3rd, 2007

Sinds mijn laatste post over mijn werkplek is deze behoorlijk gewijzigd. Daarom leek het me wel ‘ns leuk om eens wat updates te posten van hoe het er nu uitziet.

Daarom hier onder wat foto’s van het Crystal Labs-kantoor/mijn kamer/mijn blogplek. Het is maar waar ik mee bezig ben.. ;-)

Wat we zien (van links naar rechts):

  1. Telefoon, businesscard van Crystal Labs, schrijfblok.
  2. Scanner (HP Scanjet 4370)
  3. Samsung 205BW
  4. iPod Nano (beetje verborgen, ligt nu ergens anders ook)
  5. MacBook Pro
  6. Logitech MX 1000l
  7. Logitech Comfort Desktop toetsenbord (en Logitech Pilot Optical Black, omdat de batterijen van de muis die er bij hoorde steeds erg snel leeg waren)
  8. Samsung 173P

En de mensen die heeel goed kijken zien misschien één van de 3 usbdisks onder het bureau. En de server. En nog een PC.. En mijn laserprinter. En een heel klein stukje van mijn HP Compaq SR1879NL.

En tja.. Ik had die monitoren natuurlijk beter even uitgezet voor ik de foto’s maakte.

Uiteraard benieuwd naar jullie werkplekken, dus comments / trackbacks staan weer open.

p.s. Zoals altijd: Meer foto’s op Flickr.

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.

Een iPod die niet meer uitgaat…

Thursday, April 12th, 2007

Een iPod die niet meer uitgaat…

Schreef ik gisteren nog aardig positief over mijn geliefde gadget, vandaag dacht ik even dat ze me in de steek liet. Terwijl ik mij vanochtend klaarmaakte om op weg te gaan (ik loop ’s morgens altijd even een straatje naar één van de partners van Silverware waarna we dan met één auto naar het kantoor vertrekken) had ik gezellig mijn iPod aanstaan. ’s Morgens springt het dingetje automatisch aan om ongeveer half zes, zodat ik een poosje later wel eens een beetje wakker ben en van speakers switch naar de “iPod-oortjes”.

Beneden gekomen zong ik vrolijk mee met verschillende liedjes, maar toen ik de voordeur opende was het mooi geweest - in de auto staat de autoradio aan en wil je nog wel eens een gesprekje hebben; een MP3-speler is dan niet echt handig. Vreemd genoeg bleef de muziek doorspelen.. En nog een keer: niks.

Het holdknopje controleren dan maar: niks. Nu werd het toch wel erg vreemd.. Nog een aantal keer proberen leverde niets op. Ik heb het volume maar “uitgedraaid” en de iPod in m’n jaszak opgeborgen. Op kantoor nog eens gecontroleerd, weer zonder resultaat.

Door het inschakelen van de timer lukte het echter wel, na 15 minuten ging het display op zwart. Op weg naar huis ging het echter nog erger mis: ik wilde weer wat muziek, maar het volume ging niet meer harder. Sterker nog, de iPod reageerde helemaal niet meer!

Thuis heb ik gelukkig de, zeer simpele, oplossing gevonden: neem de meegeleverde kabel, stop het ene uiteinde in de USB-poort van je MacBook Pro (als je net zo gelukkig bent als ik, anders vervangen met jouw geavanceerde rekenmachine) en het andere uiteinde in de speler. Let wel op dat je de uiteindes niet omwisselt, je zult namelijk erg veel geweld moeten gebruiken om de kabel er dan in te krijgen; dit kan mogelijk beschadigingen opleveren.

Toen kwam er plots een Appeltje op het display, wat mij even deed vrezen dat ik terug zou gaan naar fabrieksinstellingen. Omdat ik (dankzij de file) laat thuis was ben ik echter gelijk gaan eten en heb ik de laptop gewoon even laten staan met iTunes open. Toen ik terugkwam (zo’n 20 minuten later) was alles terug normaal… Vreemd? Ja. Blij dat het opgelost is? Ook. ;)

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!

Over op webapplicaties

Wednesday, April 4th, 2007

Zoals ik twee dagen terug al schreef kunnen we steeds meer op het web doen, waar we eerst nog offline applicaties voor nodig hadden. Daarom heb ik besloten mijn veelgebruikte applicaties eens te analyseren en te zien of ik een web-alternatief ga zoeken of niet.
Hier, in volgorde zoals ik ze op dit moment in m’n dock zie staan, de applicaties:

  1. Finder: blijft offline, aardig vanzelfsprekend.
  2. Firefox: voor het lezen van feeds gebruik ik Bloglines al en voor de bookmarks ga ik weer eens opnieuw kijken naar del.icio.us.
  3. iTerm: blijft offline.
  4. Textmate: één van mijn favoriete Mac-applicaties, Textmate, kent wat mij betreft gewoon geen alternatief, online en offline niet.

    Update: Karel wees me net op skEdit, mogelijk toch een alternatief voor Textmate. ;)

  5. Mail: ik geef nog steeds de voorkeur aan een goede offline mailapplicatie, zeker zolang het zoeken in GMail gewoon slecht is. Wat enigszins ironisch is aangezien het product van Google komt.
  6. iCal: toch Google Calender proberen en synchroniseren met iCal, zoals Sanne ook doet.
  7. Adium: MSN en GTalk kunnen allebei online gebruikt worden, maar dat werkt lang niet zo prettig als een goede offline applicatie met tabs en andere leuke speeltjes, zoals het versturen van bestanden.
  8. CocoaMySQL: hoewel ik lange tijd gebruik heb gemaakt van PHPMyAdmin, vind ik dat nu lang niet zo snel werken als CocoaMySQL. Dit houd ik dus ook offline.
  9. Cyberduck: hoewel ik niet echt tevreden ben over deze FTP-client, vind ik het toch beter dan een online FTP-client. Voor een enkele file uploaden werkt een webapplicatie nog wel, maar een grote batch bestanden werkt al minder prettig.
  10. Nu niet open, maar wel veelgebruikt, is iTunes ook een applicatie waar ik geen goed online alternatief voor ken. Alleen last.fm biedt wat dat betreft leuke opties aan, waar ik zo af en toe eens gebruik van maak.
  11. Dan nog twee uit de menubar: Quicksilver en VirtueDesktops. Hoewel je met verschillende vensters en tabs best leuke dingen kunt doen in Firefox, komt het niet in de buurt van VirtueDesktops. Ook Quicksilver houd ik voorlopig maar offline.

Over een onbepaalde periode (;)) zal ik hier laten weten hoe de webapplicaties me bevallen, of dat ik misschien weer terug ben naar de offline applicaties.

Het gebruik van Swift Mailer

Thursday, March 22nd, 2007

Hoewel ik pas de oplossing voor het mailen in PHP (in Mac OS X) leek te hebben, blijkt toch dat het niet werkt. Van alle testemails is de eerste op magische wijze verstuurd (ik snap nog steeds niet hoe), maar van de rest niets aangekomen.
Bovendien valt heel het draadloos netwerk uit zodra ik sendmail probeer te gebruiken.. Misschien ligt het aan ons (netwerk), maar praktisch is het niet.

Waar ik uiteindelijk de oplossing in heb gevonden is het geweldige pakket Swiftmailer. Hiermee is het mogelijk om een SMTP-server te gebruiken om email te versturen.

Dit heb ik eerst gedaan op de volgende manier:

  1. Controleer eerst of je versie van PHP gecompiled is met SSL-support. Dit kun je doen door een PHP-bestand te maken met de simpele code <?php phpinfo() ?> en dit even in je browser te openen. Als er achter het configure-command ssl vernoemd staat is het meegecompileerd. Als dat niet zo is, zal een verbinding met GMail niet mogelijk zijn.
  2. Maak een account aan bij GMail. Dit kan sinds een poosje zonder uitnodiging en is volledig gratis. Het voordeel van een GMail-account is dat deze niet gekoppeld is aan een IP-adres, iets wat met een laptop erg lastig kan zijn. Hoewel ik inmiddels de SMTP van onze (tijdelijke) webhost gebruik, kan het gebruik van de SMTP van je eigen ISP problemen opleveren. Vaak mag je alleen van hun servers gebruik maken als het IP aan hen toebehoort, dit is om spam te voorkomen.
  3. Download het pakket.
  4. Pak het pakket uit, ik heb de tar.gz voor php5 genomen en uitgepakt op de terminal met het volgende commando: tar -xvzf Swift*php5.tar.gz.
    Eventueel kan ook bijvoorbeeld het programma The Unarchiver gebruikt worden, als je niet zo van de commandline houdt.
  5. Zelf draai ik de ontwikkelserver op de laptop, maar eventueel zou je natuurlijk de bestanden moeten uploaden naar je webserver.
  6. Eventueel kun je de tests laten draaien, maar als je net zo eigenwijs bent als ik sla je dat stuk over. ;)
  7. Nu gaan we verbinding maken met GMail, met het volgende stukje code (PHP5):
    <?php
    require_once "swift/Swift.php";
    require_once "swift/Swift/Connection/Multi.php";
    require_once "swift/Swift/Connection/SMTP.php";
    
    try
    {
      $oConnection = new Swift_Connection_SMTP( "smtp.gmail.com",
                                            	  Swift_Connection_SMTP::PORT_SECURE,
                                            	  Swift_Connection_SMTP::ENC_TLS);
      $oConnection->setUsername( "gebruikersnaam@gmail.com" ); //gebruikersnaam even vervangen met *jouw* gebruikersnaam en @gmail.com niet vergeten!
      $oConnection->setPassword( "gmailwachtwoord" );
      $oMail = new Swift( $oConnection );
      echo "<p>Connectie gemaakt!</p>";
    }
    catch( Exception $e )
    {
      print "Fout: " . $e->getMessage();
    }
    
  8. Bekijk nu je pagina, als er “connectie gemaakt” op je scherm verschijnt is het goed gegaan. Zo niet, even de foutmelding lezen. Naar mijn ervaring zijn de foutmeldingen op zich al erg duidelijk, maar bij een vraag kun je altijd reageren onder deze post. Een error die ik momenteel nog krijg op mijn server (dus niet de laptop) is:
          The SMTP connection failed to start [ssl://smtp.gmail.com:465]: fsockopen returned Error Number 276051505 and Error String 'Unable to find the socket transport "ssl" - did you forget to enable it when you configured PHP?'
        

    Zoals de foutmelding al aangeeft heb ik SSL niet meegecompileerd in PHP, dat moet dus nog even gebeuren.

  9. Nu gaan we een simpele email opstellen en verzenden met behulp van Swift. Zet dit onder de laatste regel van het vorige codevoorbeeld:
    $oMessage = new Swift_Message("Hallo wereld", "Dag wereld,\\r\\n\\r\\nIk ben blij u te mogen begroeten!\\r\\n\\r\\nGroeten\\r\\n\\r\\nSwift Mailer");
    $oRecipient = new Swift_Address("martijn@digicted.nl", "Martijn Engler");
    $oFrom = new Swift_Address("blizt.nl@gmail.com", "Mijn eigen naam");
    if( !$oMail->send( $oMessage, $oRecipient, $oFrom ) )
    {
      echo "<p>Het bericht kon niet verzonden worden.</p>";
    }
    else
    {
      echo "<p>Het bericht is succesvol verzonden!</p>";
    }
    

    Kruis je vingers, herlaad het bestand in je browser en dan maar hopen dat er bericht in beeld komt dat het bericht succesvol verzonden is.
    Als dat niet zo is, even goed nakijken of je de velden wel juist hebt ingevuld.

  10. Als het goed is komt er nu een email binnen in de inbox van het emailadres wat je hebt ingevuld bij $oRecipient.

Dit waren slechts enkele simpele mogelijkheden van Swift Mailer, meer is gedocumenteerd in de wiki.
Zo is er een deel over het verzenden van (bijvoorbeeld) nieuwsbrieven en het werken met bijlages.