elPeregrino.nl

Dit weblog werd me een beetje teveel een verzamelbak voor links naar berichten op mijn andere blog. En aangezien ik niet denk dat er nog iemand is die dit blog leest, maar niet mijn andere blog weet te vinden, heb ik de categorie elPeregrino.nl verwijderd.

Voor de zekerheid nog 1 keer een link: elPeregrino.nl.

Geplaatst in Algemeen | Een reactie plaatsen

Banaanappel

Ooit, op 19 november 2011 om precies te zijn, schreef ik een paar zinnen op Wikipedia; aan de pagina Golden Delicious voegde ik toe:

Vroeger werd deze appel banaanappel genoemd, vanwege de vettige gele schil en de zoete smaak. Sommige fruitverkopers gebruiken deze naam nog steeds.

Om de een of andere reden, ik weet eigenlijk niet precies waarom, tikte ik vandaag banaanappel in in een zoekmachine. En wat ik dus wel grappig vind, is dat er verschillende websites zijn die mijn tekst letterlijk of vrijwel letterlijk hebben overgenomen.
Goed, ’t is nog niet die eigen Wikipedia-pagina waar ik zo van droom, maar het is een stapje in de goeie richting.
ūüôā

Overigens, voor wie dit leest, en die zinnen op zijn/haar website heeft gebruikt: het is wel echt waar. Mijn groente-/fruitboer in Escamp destijds had een bak appels met daarbij een bordje ‘Banaanappels‘, waarop ik zei ‘Voor mij zien ze er gewoon uit als Golden Delicious.‘. En hij heeft me toen uitgelegd hoe het zat. En omdat hij niet op mij overkwam als iemand die heel veel om Wikipedia gaf, heb ik het toen maar op Wikipedia gezet.

…

Dus eigenlijk zijn het niet eens mijn eigen woorden…

…

Damn!

…

Ik ga verder zoeken naar mijn eigen 15 minuten roem…

Geplaatst in Aan de kook, Nerd stuff | Getagged , , | Reacties uitgeschakeld voor Banaanappel

2 Nieuwe metatags

Ik heb zojuist 2 nieuwe metatags toegevoegd aan WHATWG MetaExtensions registry.
En als je wilt dat je idee√ęn op een gegeven moment geaccepteerde standaarden worden, zul je er ook over moeten publiceren; dat doe ik dus hierbij.

origin

De eerste nieuwe metatag is origin:

<meta name="origin" content="…">

Met de origin metatag verwijs je naar de oorspronkelijke (online of offline) bron van een document; denk hierbij bijvoorbeeld aan de vertaling van een webpagina, maar ook aan een songtekst die je uittikt, of een (papieren) boek dat je op internet zet.
De documentatie voor de origin metatag vind je op doc.ohreally.nl/metatag-origin.

translator

De tweede nieuwe metatag is translator:

<meta name="translator" content="…">

De translator metatag geeft informatie over de vertaler van een document. Steeds meer informatie op internet is in meerdere talen beschikbaar, en het wordt dus ook steeds belangrijker de vertalers van documenten te bereiken (bijvoorbeeld wanneer er een nieuwe versie van het oorspronkelijke document beschikbaar is).
De documentatie voor de translator metatag vind je op doc.ohreally.nl/metatag-translator.

validatie

Binnen nu en 2 weken zullen de validators van het W3C de nieuwe metatags herkennen.

Geplaatst in Nerd stuff | Reacties uitgeschakeld voor 2 Nieuwe metatags

Regexp

Dit schreef ik vandaag:

/^(?:([^:\/?#@]+):(?=\/\/))?(?:(?:\/\/)?(?:([^\/?#:]+)(?::([^\/?#]+))?@)?([^\/?#@:]*)(?::(\d+))?)?([^?#]*)(?:\?([^#]*))?(?:#(.*))?$/

(Alles op 1 regel, uiteraard, en zonder spaties.)

Wie mij kan vertellen waar ik mee bezig was, is een eindbaas.
Om het makkelijker te maken, zal ik erbij vertellen dat ik in JavaScript aan het programmeren was.

Waarmee hij 2 jaar na zijn afscheid van de IT zijn titel Koning van de Regular Expressions toch nog prolongeerde…
ūüėČ

Geplaatst in Nerd stuff | 2 Reacties

P√Ętes au poulet et pesto

Dit keer geen nieuw recept, maar de Franse vertaling van een succesnummer; omdat er vraag naar is.

Une recette apprise dans un restaurant Néerlandais-Italien, et améliorée par moi-même.

Ingrédients:

  • huile d’olive
  • 1 kilo de blanc de poulet
  • 3-400 grammes de lard (pr√©f√©rablement la ventr√®che fum√©e)
  • sel (marin)
  • poivre (noir)
  • ail
  • 2 cubes de bouillon volaille
  • 50 cl de cr√®me l√©g√®re
  • 2 pots de pesto
  • 1 paquet de penne

Coupez les blancs de poulet et le lard en cubes.
Chauffez l’huile dans une grande po√™le, et y faites revenir le poulet avec l’ail, le sel et le poivre. Si vous avez choisi du lard cru, l’ajoutez avant le poulet; sinon, l’ajoutez quand le poulet est presque compl√®tement cuit.
Mettez les cubes de bouillon dans 2 tasses de l’eau, et faites cuire.
Dès que le bouillon bout, tempérez le feu, et ajoutez la crème. Ajoutez, dès que le bouillon est réchauffé, le pesto.
Mélangez la sauce avec le poulet et lard, et laissez mijoter un peu.
Faites cuire les p√Ętes, et m√©langez avec la sauce.

Servez avec une salade fra√ģche; par exemple de concombre, oignon, poivron et tomates avec un peu de huile d’olive et un peu de vinaigre.

Ce repas-ci se laisse bien accompagner par un vin rouge simple.

Bon ap’!

Geplaatst in Aan de kook | Getagged , , , | Reacties uitgeschakeld voor P√Ętes au poulet et pesto

Pasta Castet-Arrouy

Hè, eindelijk weer eens een receptje in de rubriek Hobo food…

De setting: je komt half februari als Compostela-pelgrim aan in de g√ģte communal van Castet-Arrouy, en daar liggen nog wat dingetjes in de kast van afgelopen seizoen.

Nodig:

  • 1 zakje instant tomatensoep
  • 125 gram macaroni
  • 1 blikje sardientjes in tomatensaus
  • proven√ßaalse kruiden

Het zakje soep is niet zo’n klein zakje troep als je op veel kantoren naast de koffieautomaat schijnt te kunnen vinden, maar een groter zakje troep, zoals je ze bij de supermarkt koopt. Maar met 2 of 3 van die kleintjes kom je ook vast een heel eind.
Eigenlijk gebruik je geen 125 gram macaroni, maar ongeveer de helft van een doosje van 250 gram (de andere helft bewaar je voor later).

Doe warm water in een pan; een beetje meer dan je zou gebruiken als het alleen om soep ging. Roer het soeppoeder erdoor en zet de pan op het vuur.
Roer de macaroni erdoor, en blijf roeren, terwijl je de soep zachtjes kookt tot de macaroni al dente is.
Schep het blikje vis erdoor, en warm het spul nog even door.
Haal de pan van het vuur (het vuur mag uit), en roer naar smaak kruiden door de pasta.

Smakelijk!

Geplaatst in Hobo food | Getagged , , | Reacties uitgeschakeld voor Pasta Castet-Arrouy

HTC Desire flashen (2)

Dit verhaal zal voor vrijwel niemand relevant zijn. Het gaat namelijk over een smartphone van 5 jaar oud. (Maar mocht je nog ergens zo’n telefoon hebben liggen: laat het me weten, en gooi ‘m nog niet weg; als mijn huidige stuk gaat, ben ik er erg blij mee.)
Alles dat ik hieronder beschrijf, heb ik op een Linux-laptop gedaan; waar nodig zul je zelf de vertaalslag moeten maken naar Windows of Mac.

Zo’n anderhalf jaar geleden beschreef ik al hoe ik een HTC Desire flashte. Toen ging het erom dat ik een Desire had gekregen waarop een custom ROM stond, en ik terug moest naar een stock ROM (maar dan wel met root).
Die telefoon heeft het zware buitenleven van een zwerver uiteindelijk niet overleefd, maar onlangs kreeg ik een kerstkadootje: een nieuwe tweedehands Desire.

Deze nieuwe telefoon was nog helemaal zoals hij uit de fabriek was gekomen, met Froyo (Android 2.2) als besturingssysteem. Het was dus aan mij om het apparaat te rooten (beheerdersrechten verkrijgen), en hem direct te upgraden naar Android 2.3 (Gingerbread).
De 2 belangrijkste redenen om root te willen hebben, zijn voor mij het kunnen installeren van een firewall, en het kunnen verwijderen van een aantal systeemapplicaties; en met ‘systeemapplicaties’ bedoel ik dan die applicaties die door de fabrikant op de systeempartitie ge√Įnstalleerd zijn, maar die alleen maar ontwikkeld zijn om mijn privacy te schenden, zoals ‘Aandelen’, ‘Nieuws en weer’, ‘Gmail’, ‘Facebook’, ‘Twitter’, enzovoort.

Als je het verhaaltje hieronder leest, denk je waarschijnlijk ‘dat is een eitje’. Ik moet eerlijk zeggen dat het me enige dagen gekost heeft voordat ik eindelijk zover was.
In eerste instantie was ik begonnen met wat nu stap 2 is (het verkrijgen van root). Het duurde even voordat ik doorhad dat ik, zelfs als ik de systeempartitie read-write gemount had, niet naar die partitie kon schrijven, en dus geen permanent root kon krijgen. Hiervoor moest ik eerst S-OFF (security off) zien te krijgen. Maar om S-OFF te krijgen, moest ik eerst root hebben. Uiteindelijk was het de fabrikant zelf die me uit deze kip-ei-situatie hielp.

Voordat ik begin, wil ik nog even 2 dingen zeggen:

Allereerst heb ik niets van wat ik hieronder beschrijf zelf verzonnen of ontwikkeld. Ik heb alleen informatie verzameld van heel veel verschillende websites, en die gebundeld in dit verhaaltje. Het echte werk is gedaan door anderen.

En allertweedst moet ik even melden dat ik geen enkele verantwoording accepteer voor wat jij doet of nalaat naar aanleiding van dit verhaaltje. Als jouw telefoon, na het al dan niet juist opvolgen van deze aanwijzingen, veranderd is in een hele dure baksteen, dan heb jij er die baksteen van gemaakt, en niet ik.
Ik adviseer je van harte je telefoon zo te laten als de fabrikant hem bedoeld heeft.

Stap 0: voorbereiding

Als je het op dezelfde manier doet als ik, kost de voorbereiding je een dag of wat: zoek alles op dat je op internet kunt vinden over het rooten van de HTC Desire, en lees dat een keer of 3, liefst in een onlogische, en steeds andere volgorde.

Wil je er iets minder tijd aan besteden, installeer dan adb en fastboot. Deze 2 programmaatjes maken deel uit van de Android SDK (Software Development Kit). Als je Arch Linux gebruikt, hoef je niet de hele SDK te installeren, maar kun je android-sdk-platform-tools uit de AUR halen.

Doe na de installatie even

# adb --help

en

# fastboot --help

om te zien wat je precies ge√Įnstalleerd hebt.
Beide programma’s gebruik je om met de telefoon te communiceren; adb als de telefoon gewoon aan staat, en fastboot als de telefoon in de bootloader staat. Uiteraard moet in beide gevallen de telefoon met een USB-kabel aangesloten zijn op je computer, en in de telefoon moet USB-foutopsporing ingeschakeld zijn (Instellingen / Applicaties / Ontwikkeling).
Beide programma’s voer je uit als root.

Hoe ik een geroote ROM gemaakt heb, heb ik bij mijn vorige flash al beschreven, dus daar ga ik niet te diep op in. In het kort: ROM downloaden van shipped-roms.com, en aanpassen met Android Kitchen.

Eén van de stappen hieronder vereist een SD-kaart in de telefoon (ik ben vergeten welke stap). Ik heb echter ook ergens de waarschuwing gelezen dat tijdens het proces de SD-kaart geformatteerd zou kunnen worden. Zorg dus dat er een SD-kaart in de telefoon zit waarvan het niet erg is als je de data die erop staat, kwijtraakt.

Stap 1: unlock bootloader

Zoals ik in mijn inleiding al schreef, liep ik tegen een kip-ei-dingetje aan: om het apparaat te kunnen rooten, moest ik S-OFF hebben, en om S-OFF te kunnen krijgen, had ik root nodig.
In mijn vorige leven, als ICT’er, zou ik een paar dagen vrij genomen hebben, een krat bier en een paar dozen frituursnacks aangeschaft, en Arnoud gebeld; ik twijfel er niet aan dat we erdoorheen gebroken zouden zijn.
Nu, zwervend door Frankrijk, met niet meer dan een 10-inch netbook, Arnoud op 1200 kilometer afstand, en bier en snacks ruimschoots boven mijn budget, was ik blij dat HTC zelf te hulp schoot.

De fabrikant van mijn telefoon heeft besloten 1 laagje van de verschillende laagjes beveiliging te verwijderen voor mensen die echt heel graag een andere ROM willen installeren. Als je daar gebruik van wilt maken, ga je naar de pagina Unlock Bootloader op HTCdev.com. Volg daar de aanwijzingen, en je telefoon is klaar om geroot te worden.

Stap 1¬Ĺ: update ROM

Het kan zijn dat je tijdens dat proces ziet dat je eerst een update moet installeren op je telefoon. Gelukkig was dat bij mij het geval, want dat maakte het toch nog een beetje interessant.

Want hoewel het unlocken van de bootloader door HTC netjes wordt ondersteunt voor de 3 belangrijkste besturingssystemen (Windows, Mac, Linux), is de update er alleen als .exe-bestand voor Windows. Maar dat wil natuurlijk niet zeggen dat ik die niet ge√Įnstalleerd krijg…

Eerst halen we de ROM uit dat bestand, zoals ik dat ook in mijn vorige verhaaltje al beschreef:
Start het .exe-bestand met Wine. Klik niet door als de InstallShield Wizard is gestart; hij zal crashen. Laat in plaats daarvan het venster open staan, en zoek het bestand rom.zip op:

$ find ~/.wine/c_drive/ -type f -name rom.zip -print

Kopieer het gevonden bestand naar een andere directory, en druk op Cancel in de installer.

Koppel nu je telefoon aan je computer (USB-foutopsporing aan), en installeer de ROM:

# adb reboot bootloader
# fastboot oem rebootRUU
# fastboot flash zip rom.zip
# fastboot reboot

(En rom.zip is dan natuurlijk het bestand dat je daarnet uit de installer gepulkt hebt.)

Hierna kun je op HTCdev.com verder met het unlocken van je bootloader.

Stap 2: root

Voor het rooten van je telefoon kun je verschillende programma’s en apps downloaden. Maar ik zit hier inmiddels zo diep in met mijn hoofd, dat ik het liever vanaf mijn vertrouwde command line doe; dan hoef ik ook niet te zoeken naar een programma dat specifiek voor Linux geschreven is.

Ik download daarom SuperOneClick versie 1.7 van deze pagina; dat was een vrij willekeurige, maar daarom nog geen verkeerde keuze. SuperOneClick is een .NET-applicatie, maar dat maakt niet uit, want we gebruiken het toch niet… We halen er alleen een paar bestandjes uit, en zetten die op de telefoon.

# unzip SuperOneClickv1.7-ShortFuse.zip
# cd SuperOneClickv1.7-ShortFuse
# adb install Superuser.apk
# adb push psneuter /data/local/tmp/
# adb push su-v3 /data/local/tmp/

We hebben nu 1 app op de telefoon ge√Įnstalleerd, en 2 bestanden naar de telefoon gekopieerd. De app gebruiken we straks om andere applicaties root-rechten te geven, maar dan moeten we eerst root-rechten op de telefoon hebben:

# adb shell
 $ chmod 755 /data/local/tmp/psneuter
 $ /data/local/tmp/psneuter

(Nu word je er even uitgeknikkerd, dus log opnieuw in; je bent dan root.)

# adb shell
 # mount -o remount,rw /dev/block/mtdblock3 /system
 # cat /data/local/tmp/su-v3 > /system/bin/su
 # chmod 755 /system/bin/su
 # exit
# adb reboot

Met psneuter hebben we tijdelijk root gekregen (wie wil weten hoe dat werkt, kan hier kijken), en vervolgens hebben we de systeempartitie read-write geremount (heb je voor die remount wel even gecontroleerd of je inderdaad /dev/block/mtdblock3 moest hebben?), om daar vervolgens su naartoe te kopi√ęren, zodat we na een reboot ook nog root kunnen krijgen.
Om dat te checken, kun je nu van de Playstore (dat heet in mijn telefoon trouwens nog Market) een willekeurige terminal emulator installeren, die starten, en dan su intikken. Als de $ prompt verandert in een # prompt, is het gelukt.

Stap 3: custom recovery

Nu we root hebben, kunnen we een custom recovery installeren. Die recovery hebben we sowieso nodig om straks onze eigen ROM te kunnen installeren, maar daarbij zijn de mogelijkheden van de standaard recovery nogal minimaal.

Download de ClockworkMod Touch recovery voor jouw model. (Of natuurlijk de andere, als de Touch er niet is voor jouw model.)

Installeren is een eitje:

# adb reboot bootloader
# fastboot flash recovery recovery-clockwork-touch-5.8.0.2-bravo.img
# fastboot reboot

En vervolgens reboot je in recovery om te zien wat je nou eigenlijk ge√Įnstalleerd hebt:

# adb reboot recovery

(Je kunt ook booten in recovery door je telefoon uit te zetten, en ‘m vervolgens weer aan te zetten terwijl je de ‘Volume omlaag’-toets ingedrukt houdt.)

Kijk een beetje rond, en maak vooral ook een backup. Dat laatste is best belangrijk, want daarmee kun je straks weer terug naar je huidige configuratie, als de installatie van je aangepaste ROM onverhoopt ontploft.
Kies tot slot de optie ‘reboot system now‘.

Stap 4: backup veiligstellen

Je hebt net in Recovery een backup gemaakt (toch?). Die gaan we even veiligstellen. Als het goed is, kun je straks met deze backup terug naar nu, als dat nodig mocht zijn.

# adb shell ls /mnt/sdcard/clockworkmod/backup
 > 2016-01-15.15.07.54
# mkdir -p ~/htc-desire.backups/2016-01-15.15.07.54
# cd ~/htc-desire.backups/2016-01-15.15.07.54
# adb pull -a /mnt/sdcard/clockworkmod/backup/2016-01-15.15.07.54
# md5sum -c ./nandroid.md5

Als md5sum bij een of meer bestanden aangeeft dat er iets mis is, ga je terug naar Recovery, en maak je een nieuwe backup.

Stap 5: nieuwe ROM installeren

H√®h√®, daar gaan we eindelijk…

Vervang ‘rom.zip’ door de naam van de ROM die je met Android Kitchen gebrouwen hebt:

# adb push rom.zip /mnt/sdcard/
# adb reboot recovery

En selecteer dan achtereenvolgens op je telefoon:

  • wipe data/factory reset
  • wipe cache partition
  • advanced
  • wipe dalvik cache
  • terug
  • install zip from sdcard
  • choose zip from sdcard
  • selecteer je ROM
  • terug
  • reboot system now

En als alles goed gegaan is, heb je nu een nieuw besturingssysteem op je HTC Desire. Gefeliciteerd!

Stap 6: klaar

# adb kill-server

(Anders blijft adb resources van je pc vreten.)

Geplaatst in Nerd stuff | Reacties uitgeschakeld voor HTC Desire flashen (2)

Os gezocht

De ‘stal’ voor de ezel is klaar; laat Kerstmis nu maar komen…

Een paar dode bomen uit het bos, wat afvalhout en een zeil. De liksteen en waterbak die ik vandaag van Elisabeth voor mijn verjaardag kreeg, maken het af.
Helaas durft Frimousse er nog niet in; waarschijnlijk lijkt het een beetje teveel op een paardentrailer, waarmee hij onlangs een niet-echt-geweldige ervaring had. Ik ga ervan uit dat de kou en zijn nieuwsgierigheid het in de komende dagen wel zullen winnen van zijn wantrouwen.

Geplaatst in Houtsnippers | 2 Reacties

Zwarte Piet

We naderen december. En dat betekent ongetwijfeld dat in Nederland de Zwarte-Pieten-discussie weer in volle gang is. Het leek me daarom een goed idee om ook mijn druppeltje olie even op het vuur te gooien:

Ik ben voor Zwarte Piet, en tegen Regenboogpiet!

Uiteraard ben ik van harte bereid om van mening te veranderen.
Mits:

  • Keti Koti voortaan alleen nog overdag gevierd wordt;
  • met Holi-Phagwa voortaan met confetti gestrooid wordt, in plaats van gekleurd poeder;
  • het tijdens de Ramadan voortaan wel toegestaan is om overdag vlees te eten; en
  • er bij de viering van Pesach voortaan bier geserveerd wordt.

Een paar kleine aanpassinkjes…
’t Is immers geven en nemen in het leven.

Vrolijk Sinterklaasfeest!

zwartepiet

Geplaatst in Algemeen | Reacties uitgeschakeld voor Zwarte Piet

Foto’s bewerken voor publicatie

Foto’s die ik publiceer (vooral op mijn andere blog en Flickr) zijn allemaal voorzien van een logo en de naam van mijn site. In mijn vorige leven was ik programmeur, dus je dacht toch niet dat ik dat allemaal handmatig deed…?

Vandaag heb ik wat aanpassingen gemaakt aan het script dat dat voor me doet, en toen dacht ik ‘Laat ik het op mijn site zetten…‘; zo heb ik weer eens een berichtje op deze site, en wie weet heeft een ander er ook nog eens iets aan.

Uiteraard is het weer niet voor Windows, maar voor Unix-achtige systemen.

Eerst even wat achtergrond info. Mijn directory-structuur voor foto’s (en andere media) ziet er als volgt uit:

~
 `- media
    |- audio
    |  |- original
    |  |- publish
    |  `- resize
    |- flickr
    |  |- publish
    |  `- resize
    |- gpx
    |  |- gpx
    |  |- jpg
    |  |- png
    |  `- work
    |- images
    |  |- original
    |  |- publish
    |  `- resize
    |- video
    `- watermerk

Nieuwe foto’s verplaats ik van mijn camera naar de directory ~/media/images/original/, in subdirectories die de datum als naam hebben (20151025). Als ik foto’s wil publiceren op mijn blog en/of Flickr, maak ik een subdirectory met zo’n zelfde naam (20151025) in ~/media/images/resize/ en/of ~/media/flickr/resize/, en kopieer ik de foto’s daarheen. Vervolgens start ik mijn script (dat je in zijn geheel onderaan dit bericht vind):

~/bin/peregrino_media.sh images

of

~/bin/peregrino_media.sh flickr

of

~/bin/peregrino_media.sh images flickr

Het script bewerkt dan alle foto’s voor publicatie, en verplaatst ze naar de respektievelijke subdirectories publish/. De bewerkingen die uitgevoerd worden, zijn:

  • schalen van de foto’s (max. 800×800 pixels voor mijn blog; max. 1000×1000 px voor Flickr)
  • de naam van mijn site op de foto plakken
  • het logo van mijn site op de foto plakken
  • de Exif-tag ImageDescription verwijderen
  • de Exif-tag Artist toevoegen
  • de Exif-tag Copyright toevoegen

Dit is mijn script (als de tekst te breed is voor je scherm, klik dan op het script, en gebruik vervolgens je pijltoetsen om naar rechts/links te scrollen):

#!/usr/bin/env bash

# ~/bin/peregrino_media.sh

############################################################

#                   peregrino_media.sh
#                        door Rob

# rob@ohreally.nl
############################################################
# http://ohreally.nl/

# Bulk edit elPeregrino.nl media for publication.

############################################################
#
# Copyright (c) 2013 Rob la Lau (rob@ohreally.nl)
#
# This work is licensed under the
#   Creative Commons Attribution 4.0 International License
# To view a copy of this license, visit
#   http://creativecommons.org/licenses/by/4.0/
# or send a letter to
#   Creative Commons
#   444 Castro Street, Suite 900
#   Mountain View, California, 94041
#   USA
#
############################################################

############################################################
# Configuration.
#
# All variables may be changed from the environment.

# Artist info.
: ${ARTIST_NAME:='Rob la Lau'}
: ${ARTIST_EMAIL:='rob@elperegrino.nl'}

# Watermarks.
#
# Copyright.
: ${WM_COPYRIGHT='~/media/watermerk/copyright.png'}
: ${WM_COPYRIGHT_DISSOLVE:=15}
: ${WM_COPYRIGHT_GRAVITY:=NorthWest}
: ${WM_COPYRIGHT_GEOMETRY=''}
#
# Logo.
: ${WM_LOGO='~/media/watermerk/klompen.png'}
: ${WM_LOGO_DISSOLVE:=50}
: ${WM_LOGO_GRAVITY:=SouthEast}
: ${WM_LOGO_GEOMETRY='+5+5'}

# Base directory.
: ${BASE='/data'}

# Applications.
: ${CONVERT=`which convert`}
: ${EXIFTOOL=`which exiftool`}
: ${GPX2PNG="`which perl` '~/bin/gpx2png.pl'"}

#
# End of configuration.
############################################################

# We need at least 1 parameter.
[ $# -eq 0 ] && {
    echo "Too few parameters."
    exit
}

# Correct Exif data:
# - remove description
# - add artist and copyright info
correct_exif() {
    local file=${1}
    local year=${2}

    # If we don't receive a correct year, get one from the file itself.
    [ -z "${year}" -o "${year}" = "-" ] && {
        # File creation.
        created=`stat -c '%w' "${file}"`
        [ "${created}" = "-" ] && {
            # Last modification.
            created=`stat -c '%y' "${file}"`
            [ "${created}" = "-" ] && {
                # Last status change.
                created=`stat -c '%z' "${file}"`
                [ "${created}" = "-" ] && {
                    # Last access.
                    created=`stat -c '%x' "${file}"`
                    [ "${created}" = "-" ] && {
                        # Fall back to now.
                        created=`date +'%Y'`
                    }
                }
            }
        }
        year=${created%%-*}
    }

    # Remove and add Exif tags.
    "${EXIFTOOL}" -m -q -overwrite_original -ImageDescription= -Artist="Camera owner, ${ARTIST_NAME}; Photographer, ${ARTIST_NAME}; Image creator, ${ARTIST_NAME}" -Copyright="Copyright, ${ARTIST_NAME} (${ARTIST_EMAIL}), ${year}. All rights reserved." "${file}"
}

# Process image:
# - resize
# - add copyright notice
# - add logo
# - move to publication directory
# - correct Exif data
process_image() {
    local file=${1}
    local size=${2}

    if [ -e "./publish/${file}" ]; then
        # Never process a file twice.
        echo "${file} : exists, skipping"
    else
        # Resize; add copyright and logo.
        "${CONVERT}" "./resize/${file}" -resize ${size} ${WM_COPYRIGHT_ARGS} ${WM_LOGO_ARGS} "./publish/${file}"

        # Correct Exif data.
        copyrightyear=`exiftool -q -CreateDate "./resize/${file}" | awk -F':' '{gsub(/ /,"",\$2)}{print \$2}'`
        correct_exif "./publish/${file}" ${copyrightyear}

        # Delete original.
        rm "./resize/${file}"

        echo "${file} : done"
    fi
}

# Process image directory.
process_image_directory() {
    local path=${1}
    local size=${2}

    # No use continuing without the right tools.
    [ -z "${CONVERT}" -o -z "${EXIFTOOL}" ] && {
        echo "${dir}: Toolset not complete."
        return
    }

    # Construct ImageMagick arguments.
    [ -n "${WM_COPYRIGHT}" ] && {
        WM_COPYRIGHT_ARGS=${WM_COPYRIGHT}
        [ -n "${WM_COPYRIGHT_DISSOLVE}" ] && WM_COPYRIGHT_ARGS+=" -compose dissolve -define compose:args=${WM_COPYRIGHT_DISSOLVE}"
        WM_COPYRIGHT_ARGS+=" -gravity ${WM_COPYRIGHT_GRAVITY}"
        [ -n "${WM_COPYRIGHT_GEOMETRY}" ] && WM_COPYRIGHT_ARGS+=" -geometry ${WM_COPYRIGHT_GEOMETRY}"
        WM_COPYRIGHT_ARGS+=' -composite'
    }
    [ -n "${WM_LOGO}" ] && {
        WM_LOGO_ARGS=${WM_LOGO}
        [ -n "${WM_LOGO_DISSOLVE}" ] && WM_LOGO_ARGS+=" -compose dissolve -define compose:args=${WM_LOGO_DISSOLVE}"
        WM_LOGO_ARGS+=" -gravity ${WM_LOGO_GRAVITY}"
        [ -n "${WM_LOGO_GEOMETRY}" ] && WM_LOGO_ARGS+=" -geometry ${WM_LOGO_GEOMETRY}"
        WM_LOGO_ARGS+=' -composite'
    }

    # Loop through files in 'resize' directory.
    cd "${path}"
    ls -1 ./resize | while read file; do
        if [ -d "./resize/${file}" ]; then
            # Process subdirectories.
            if [ `ls -1 "./resize/${file}" | wc -l` = 0 ]; then
                # Remove empty subdirectories.
                rmdir "./resize/${file}"
            else
                # Create subdirectory for publication.
                [ ! -d "./publish/${file}" ] && mkdir "./publish/${file}"

                # Loop through subdirectory.
                ls -1 "./resize/${file}" | while read f; do
                    # Process each image.
                    process_image "${file}/${f}" ${size}
                done
            fi
        else
            # If it's not a subdirectory, it must be a file; process it.
            process_image "${file}" ${size}
        fi
    done

    # Clean up.
    unset WM_COPYRIGHT_ARGS WM_LOGO_ARGS
}

# Loop through arguments and treat them as directory names.
while (( ${#} )); do
    dir=${1}
    shift
    path="${BASE}/${dir}"
    [ ! -d "${path}" ] && {
        echo "${dir} : Not a directory."
        continue
    }
    case "${dir}" in
        audio)
            ###FIXME
            # No functionality for audio, yet.
            echo "${dir} : Don't know how to process."
            ;;
        flickr)
            # Resize images for publication on Flickr.
            # (Same as blog, but larger.)
            size=1000x1000
            process_image_directory ${path} ${size}
            ;;
        gpx)
            # Create JPEG image from GPX track.

            # No use continuing without the right tools.
            [ -z "${CONVERT}" -o -z "${EXIFTOOL}" -o -z "${GPX2PNG}" ] && {
                echo "${dir}: Toolset not complete."
                continue
            }

            # Arguments for `convert'.
            # (Hardcoded, since this is only used for elPeregrino.nl.)
            [ -n "${WM_COPYRIGHT}" ] && WM_COPYRIGHT_ARGS="'${WM_COPYRIGHT}' -compose dissolve -define compose:args=50 -gravity NorthWest -composite"
            [ -n "${WM_LOGO}" ] && WM_LOGO_ARGS="'${WM_LOGO}' -compose dissolve -define compose:args=30 -gravity NorthEast -geometry +5+5 -composite"

            # Loop through GPX tracks.
            cd "${path}/work"
            ls -1 ../gpx | while read file; do
                png=${file/%.gpx/.png}
                jpg=${file/%.gpx/.jpg}

                if [ -e "../jpg/${jpg}" ]; then
                    # Never process a file twice.
                    echo "${file} : exists, skipping"
                else
                    # Create PNG image from track.
                    ${GPX2PNG} -o "../png/${png}" "../gpx/${file}"

                    # Resize, add copyright and logo, and convert to JPEG.
                    "${CONVERT}" "../png/${png}" -resize 1000x1000 ${WM_COPYRIGHT_ARGS} ${WM_LOGO_ARGS} "../jpg/${jpg}"

                    # Correct Exif data.
                    created=`stat -c '%w' "../gpx/${file}"`
                    [ "${created}" = "-" ] && {
                        created=`stat -c '%y' "../gpx/${file}"`
                    }
                    copyrightyear=${created%%-*}
                    correct_exif "../jpg/${jpg}" ${copyrightyear}

                    echo "${file} : done"
                fi
            done

            # Clean up.
            unset WM_COPYRIGHT_ARGS WM_LOGO_ARGS
            ;;
        images)
            # Resize images for publication on blog.
            # (Same as Flickr, but smaller.)
            size=800x800
            process_image_directory ${path} ${size}
            ;;
        video)
            ###FIXME
            # No functionality for video, yet.
            echo "${dir} : Don't know how to process."
            ;;
        *)
            # Warn and continue for other arguments.
            echo "${dir} : Don't know how to process."
            ;;
    esac
done

`convert‘ is onderdeel van ImageMagick.
`exiftool‘ is de command line applicatie van ExifTool.
In het begin van mijn pelgrimage hield ik GPS-tracks bij. In dit script gebruik ik gpx2png om van de GPX-bestanden PNG-afbeeldingen te generen, die ik vervolgens verder kan bewerken.

De transparantie van de watermerken regel ik in dit script (dissolve); de watermerken zijn dus ‘gewone’ afbeeldingen.

Mocht je je afvragen waarom de configuratievariabelen zo ‘raar’ gedefinieerd worden: dat is om ze vanuit mijn environment te kunnen wijzigen. Zo kan ik mijn script bijvoorbeeld ook gebruiken om een andere website-naam op de foto’s te zetten wanneer ik dat wil:

#!/usr/bin/env bash

# ~/bin/rll_media.sh

############################################################

#                      rll_media.sh
#                        door Rob

# rob@ohreally.nl
############################################################
# http://ohreally.nl/

# Bulk edit roblalau.net media for publication.

############################################################
#
# Copyright (c) 2015 Rob la Lau (rob@ohreally.nl)
#
# This work is licensed under the
#   Creative Commons Attribution 4.0 International License
# To view a copy of this license, visit
#   http://creativecommons.org/licenses/by/4.0/
# or send a letter to
#   Creative Commons
#   444 Castro Street, Suite 900
#   Mountain View, California, 94041
#   USA
#
############################################################

############################################################
# Configuration.
#
# All variables may be changed from the environment.

# Artist info.
export ARTIST_NAME=${ARTIST_NAME:-'Rob la Lau'}
export ARTIST_EMAIL=${ARTIST_EMAIL:-'rob@roblalau.net'}

# Watermarks.
#
# Copyright.
export WM_COPYRIGHT=${WM_COPYRIGHT-'~/media/watermerk/roblalau.net.png'}
export WM_COPYRIGHT_DISSOLVE=${WM_COPYRIGHT_DISSOLVE:-35}
export WM_COPYRIGHT_GRAVITY=${WM_COPYRIGHT_GRAVITY:-South}
export WM_COPYRIGHT_GEOMETRY=${WM_COPYRIGHT_GEOMETRY-'+0+20'}
#
# Logo.
export WM_LOGO=${WM_LOGO-''}

#
# End of configuration.
############################################################

# Call ./peregrino_media.sh to do the actual editing.
"$(dirname $(realpath $0))/peregrino_media.sh" $@

Dus als ik een foto wil publiceren op dit blog, doe ik

~/bin/rll_media.sh images

Of, als ik zelfs daaraan nog iets wil veranderen:

env ARTIST_EMAIL='rob@ohreally.nl' ~/bin/rll_media.sh images

(En dat is de wijziging die ik vandaag aan mijn script gemaakt heb.)

Geplaatst in Nerd stuff | Reacties uitgeschakeld voor Foto’s bewerken voor publicatie