Every Day is Exactly the Same.

, von Frank Hellenkamp

Wir leben in einer Box.

Oder besser — wir leben in mehreren Boxen. Klein und groß, offen und geschlossen, manche von ihnen haben Löcher und andere sind finster, wie in einem Maulwurfshügel. 

Eine dieser Boxen ist mein Computer. Er hat ein kleines Loch durch das man die Welt sehen kann — manche nennen es das World Wide Web — aber wenn man darüber nachdenkt, dann ist es in Wirklichkeit nur eine Anzahl weiterer Boxen, in die man schaut. 

Meine Box.

Everydayisexactlythesame.net ist ein Versuch meine eigene Box zu visualisieren. Alle fünf Minuten wird automatisch ein Screenshot erstellt. Und am Ende eines Tages wird dann das Durchschnittsbild für den jeweiligen Tag errechnet.  

 

Hier als Beispiel der Durschnitt für den 01. Januar 2009 — ein Tag voller Arbeit in Flash (Animation) und an mehreren Webseiten und zusätzlich noch ein wenig Zeit in dem Spiel The World of Goo

 

Da nur der Durschnitt (average) wenig aussagekräftig wäre — es wäre einfach nur ziemlich mittelgrau — werden zusätzlich noch weitere Versionen des gleichen Bildes berechnet: 

20090506 average

average 

20090506 equalize

equalize 

20090506 hard-light

hard-light 

20090506 multiply

multiply 

Automatisierung

Damit das ganze möglichst ohne manuelle Pflege von statten geht, sind alle Prozesse über verschiedene bash-Skripte automatisiert, die in regelmäßigen Abständen per Cronjob ausgeführt werden. 

1. Schritt: Screenshots

Alle fünf Minuten wird an meinem MacBook automatisch ein Screenshot erstellt, sowie ein Bild der Außenwelt mit der eingebauten iSight-Kamera aufgenommen. 

#!/bin/bash
savedir="~/Projects/autoscreens"
fdate=`date "+%Y%m%d"`
ftime=`date "+%H%M"`
filescreen="$savedir/$fdate/screen_$ftime"
filereal="$savedir/$fdate/real_$ftime"

mkdir -p $savedir/$fdate/
if [ -f $savedir/nocapture ]; then
    # abort if screencapture is denied
    exit
else
    # capture screen 
    screencapture -m "${filescreen}_01.png" 

    # capture iSight-shot
    /opt/local/bin/isightcapture -t jpg "${filereal}_01.jpg"
fi

2. Schritt: Automatisches Synchronisieren zum Server

Automatisch werden diese Dateien dann einmal täglich mit dem Linux-Server per rsync synchronisiert, der dann alle weiteren Aktionen vornimmt, ohne dass dazu das MacBook aktiv sein müsste. 

#!/bin/bash
cd /var/transfer/autoscreens

fdate=`date "+%Y%m%d"`

# test if macbook is reachable in local network
if ping -q -c3 -w3 macbook.local > /dev/null; then

    # sync autoscreens
    rsync -avz \
        -e "ssh -i ~/.ssh/id_rsync" \
        --exclude "autoscreens/$fdate" \
        --exclude "autoscreens/.git" \
        --exclude "autoscreens/sorted" \
        --exclude "autoscreens/monthly_temp" \
            \
            user@macbook.local:/Users/user/Projects/autoscreens \
            \
            /var/transfer/

    if [ $? -eq 0 ]; then 
        # process images with a low priority
        nice -n 20 ./process
        nice -n 20 ./process_real

        # sort and upload images
        nice -n 20 ./sort

        # process monthy videos
        nice -n 20 ./monthly
    fi
fi

3. Schritt: Das Berechnen der Bilder

Und anschließend in mehreren Variationen miteinander berechnet. Das Processing findet über convert aus der ImageMagick-Suite statt. 

#!/bin/bash
#
# processing script for everydayisexactelythesame.net
# (c) copyright 2008-2009 Frank Hellenkamp [jonas@depagecms.net]

# level image
level() {
    if [ ! -f ${1}_level.jpg ]; then
        convert \
            ${1}.jpg \
            -level 20%,80% \
            ${1}_level.jpg
    fi
}

# equalize image
equalize() {
    if [ ! -f ${1}_equalize.jpg ]; then
        convert \
            ${1}.jpg \
            -equalize \
            ${1}_equalize.jpg
    fi
}

# filter image once
filter_single() {
    if [ ! -f ${1}_${2}_a.jpg ]; then
        echo --- filtering with ${2}

        convert \
            ${1}.jpg \
            +clone -compose ${2} -composite \
            ${1}_${2}_a.jpg

        level ${1}_${2}_a
        equalize ${1}_${2}_a
    fi
}

# filter image twice
filter_double() {
    if [ ! -f ${1}_${2}_b.jpg ]; then
        echo --- filtering with ${2}

        convert \
            ${1}.jpg \
            +clone -compose ${2} -composite \
            +clone -compose ${2} -composite \
            ${1}_${2}_b.jpg

        level ${1}_${2}_b
        equalize ${1}_${2}_b
    fi
}

if [ -f process.lock ]; then
    exit
fi
touch process.lock

for day in 200?????; do
    fdate=`date "+%Y%m%d"`

    if [ $day != $fdate ]; then
        options="-limit memory 384mb -limit map 384mb"
        temppath="/tmp/autoscreens/${day}_temp"
        outputpath="${day}_processed"

        mkdir -p $outputpath

        output="${outputpath}/average_${day}_01"
        if [ ! -f ${output}.jpg ]; then
            echo " "
            echo processing screen for $day:

            mkdir -p $temppath

            # resize images to the same size
            # regardless if they are captured from the 
            # build in screen or the external bigger
            # screen
            cd $day
            for file in screen_*.png; do
                convert \
                    $file \
                    -resize 936x624! \
                    $temppath/$file

            done
            cd ..

            # calculate average for images of one day
            convert $options \
                $temppath/screen_*.png \
                -average \
                ${output}.jpg

            rm -r $temppath
        fi

        # level and equalize image
        level $output
        equalize $output

        # pass thru all filters
        for filter in \
            "multiply" \
            "overlay" \
            "color-burn" \
            "hard-light"
        do
            filter_single $output $filter
            filter_double $output $filter
        done
    fi
done

rm process.lock

Wie man sehen kann, werden dadurch mehr als nur die vier gezeigten Bilder generiert. Da aber diese vier in der Regel die aussagekräftigsten und ästhetischsten Varianten sind, werden nur diese online abgebildet. 

4. Schritt: Online-Veröffentlichung

Im letzten Schritt werden alle neuen Bilder auf den Online-Server hochgeladen und sind dann direkt unter everydayisexactlythesame.net sichtbar. Thumbnails und die Bilder für die Yearwall werden nur bei Bedarf berechnet und lokal gecached.  

 

Ein kleiner Hinweis für technisch Interessierte: 

Die Scripts sind noch nicht wirklich optimiert. Da /tmp allerdings unter der Gentoo Linux Installation als tmpfs im Arbeitsspeicher gemounted ist, ist der Zugriff hierauf sehr schnell, und es werden nur die wirklich nachher benötigten Bilder auf den Festplatte gespeichert.