Every Day is Exactly the Same.
, von Frank HellenkampWir 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:
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.