Codebase Backup: alle Git-Repositories sichern

Ich habe für diverse Projekte die Git-Repositories und alles was dazugehört (z. B. Bugtracker und Wikis) bei Codebase zu liegen. Gerade die Repositories enthalten mit dem Sourcecode der Projekte natürlich sehr wichtige Daten und gehören daher regelmäßig gesichert.

Auch wenn man mit Git mehr oder weniger sowieso implizit die ganze Zeit dezentrale Backups seiner Repositories erzeugt und pflegt (sofern man mit ihnen regelmäßig arbeitet), hat man damit natürlich noch lange keine zuverlässigen Sicherungen. Ich würde mich jedenfalls nicht drauf verlassen, im Falle des Falles vollständige Daten zu haben.

Ich habe mir daher vor einer Weile mal ein kleines PHP-Skript gebaut, mit dem man seine Codebase-Repositories (Source Code und Wikis/Notebooks) mit einem simplen make backup sichern kann. Über die Codebase-API wird zuerst eine Liste aller Projekte und der dazugehörigen Repositories geladen. Danach wird einmal durch diese Liste iteriert und jedes Repository unterhalb eines definierbaren Verzeichnisses geclont (bzw. gefetcht, sofern schon vorhanden).

Das Skript zum Codebase Backup samt Kurzdokumentation liegt bei Github:

icon-github mjaschen/codebase-backup

Astrofotografie – der Kampf gegen die Erdrotation

Nach dem ich zuletzt an die ersten Grenzen der Astrofotografie gestoßen bin – nämlich die fehlende Nachführung zur Kompensation der Erdrotation – war es an der Zeit für Abhilfe zu sorgen.

Anfangs stand die Idee einen kleinen dedizierten Tracker für Kameras zu kaufen. Dieser Plan wurde schnell verworfen, denn diese Geräte sind entweder nicht in der Lage, eine DSLR samt schwerem Teleobjektiv (Nikon 70-200 f/2.8) ordentlich zu tragen oder sind mit dem erforderlichen Zubehör mindestens genauso teuer wie eine echte Montierung (z. B. AstroTrac). Nach etwas Recherche fiel die Entscheidung dann auf eine echte parallaktische/äquatoriale Montierung: die Celestron Advanced VX. Die Advanced VX ist für den Einsteiger sicher nicht billig, bietet aber ein sehr gutes Preis-Leistungs-Verhältnis und dürfte durchaus in der Lage sein, einige Jahre lang als Arbeitspferd für meine astrofotografischen Versuche zu dienen.

Außer der Montierung benötigt man für die Astrofotografie noch etwas Kleinzeug, z. B. die Stromversorgung und eine Prismenschiene um die Kamera und Objektiv auf der Montierung zu befestigen. Die Stromversorgung wird von einem kleinen Blei-Vlies-Akku (12 V, 10 Ah) bereitgestellt. Außerdem bietet es sich an, einen programmierbaren Fernauslöser für die Kamera anzuschaffen, der es ermöglicht, Serienaufnahmen definierbarer Belichtungszeit und Anzahl zu erstellen.

Mit diesem Setup (Nikon D300 DSLR + Nikkor 70-200 f/2.8 + Celestron AVX) ist es schon möglich, das eine oder andere Deep Sky-Bild direkt aus einem Großstadt-Hinterhof aufzunehmen:

Messier 45 - Plejaden, Nikon D300, Nikkor 70-200/2.8, 200 mm, f/3.2, 30 s, ISO 1600
Messier 45 – Plejaden, Nikon D300, Nikkor 70-200/2.8, 200 mm, f/3.2, 30 s, ISO 1600
Nikon D300, Nikkor 70-200/2.8, 200 mm, f/3.2, 45 s, ISO 1600
Messier 38 – Starfish Cluster, Nikon D300, Nikkor 70-200/2.8, 200 mm, f/3.2, 45 s, ISO 1600
Nikon D300, Nikkor 70-200/2.8, 200 mm, f/3.2, 60 s, ISO 1600 (2015-02-20, 19:15 UTC)
Comet C/2014 Q2 Lovejoy, Nikon D300, Nikkor 70-200/2.8, 200 mm, f/3.2, 60 s, ISO 1600 (2015-02-20, 19:15 UTC) Foto bei Astrobin

Beim Fotografieren mit dem Nikkor 70-200 mm-Teleobjektiv kam es immer wieder zu dem Problem, dass sich der mühsam eingestellte Fokus nach dem Anfahren der Zielregion am Himmel verstellt hatte. Das Fixieren einer einmal gefundenen Fokuslage ist nicht möglich, da das Objektiv eine Innenfokussierung hat, welche mechanisch nicht 1:1 an den Einstellring gekoppelt ist. Dies führt dazu, dass viele Bilder unfokussiert und damit de facto unbrauchbar sind, siehe z. B. das folgende Bild von Messier 81 und Messier 82. Trotz der sonst über alle Zweifel erhabenen optischen Qualität des Nikkors, ist es somit leider kaum für die Astrofotografie brauchbar (zumindest meins).

Nikon D300, Nikkor 70-200/2.8, 200 mm, f/3.2, 60 s, ISO 1600 (2015-02-20, 19:15 UTC)
Messier 81 und 82 – Bode-Nebel, Nikon D300, Nikkor 70-200/2.8, 200 mm, f/3.2, 60 s, ISO 1600 (2015-02-20, 19:15 UTC)

Mit passendem Fokus ist es jetzt aber zumindest möglich deutlich länger zu belichten – sofern die Montierung gut auf den Himmelspol ausgerichtet ist, sind ohne weiteren Eingriff Belichtungszeiten von locker zwei Minuten möglich, ohne dass die Sterne zu Strichen verzerrt werden. In der Großstadt stößt man damit direkt an die nächste Grenze: die Lichtverschmutzung, die dafür sorgt, dass der Himmelshintergrund schon bei Belichtungszeiten im Bereich einer Minute die Pixel des Sensors nahezu sättigt. Mit einer Minute Belichtungszeit kann man aber leider meist nicht die schwachen aber wichtigen Details der Deep Sky-Objekte abbilden.

Aber auch dafür gibt es Abhilfe, dazu bald mehr.

Balkon-Astrofotografie – die ersten Grenzen

Nachdem ich mich jetzt eine Weile theoretisch mit dem Thema Astrofotografie auseinandergesetzt habe, zeigten mir zuletzt meine wenigen praktischen Versuche den spätabendlichen Himmel vom Balkon aus zu fotografieren recht schnell die Grenzen des Machbaren.

Zunächst möchte man für fast alle Objekte außer Mond und Planeten möglichst lange Belichtungszeiten erreichen um möglichst viele der sehr spärlich ankommenden Photonen auf dem Bildsensor zu sammeln. Der helle Himmel in der Stadt ist hier schonmal der erste limitierende Faktor, dieser flutet ab einer bestimmten Belichtungszeit den CCD-Sensor der Kamera mit orangem Licht und überstrahlt damit die eigentlichen Signale.

Dieses Limit zu erreichen ist zunächst aber gar nicht möglich, da sich ein anderes Problem viel gravierender bemerkbar macht: die Erdrotation. Die Sterne gehen – genau wie die Sonne – im Osten auf und im Westen wieder unter, ziehen also gleichmäßig ihre Bahnen über den Himmel. Mit einem 200 mm-Teleobjektiv erreicht man bei rund zwei Sekunden Belichtungszeit bereits den Punkt, an dem die Spuren der Sterne sichtbar werden.

Der nächste logische Schritt ist also die Anschaffung einer parallaktischen/äquatorialen Montierung, welche die Kamera der scheinbaren Himmelsbewegung nachführt. Je nach Fertigungsqualität der Montierung sollten ohne weitere Korrekturen („Guiding“) mit 200 mm Brennweite Belichtungszeiten von 60 bis 120 Sekunden problemlos nachgeführt werden können. Die so gewonnenen Bilder sollten dann deutlich mehr Informationen enthalten und nur durch den hellen, lichtverschmutzten Himmel der Stadt in der Aufnahmelänge limitiert sein.

Hier sind mal zwei Bilder, die ohne Nachführung angefertigt wurden, einmal mit zwei Sekunden und einmal mit drei Sekunden Belichtungszeit. Diese sind bereits aus mehreren Einzelaufnahmen zusammengeführt, um das Rauschen etwas zu mindern.

Im nächsten Artikel werde ich die ersten nachgeführten Bilder zeigen – zwischenzeitlich habe ich mir nämlich eine anständige Montierung zugelegt.

Messier M 37 und β Tau. Nikon D300 mit Nikon 70-200/2.8; 135 mm, f/2.8, 3 s, ISO 1600
Astrofotografie vom Großstadt-Balkon: Messier M 37 und β Tau. Nikon D300 mit Nikon 70-200/2.8; 135 mm, f/2.8, 3 s, ISO 1600
Gürtel des Orion; Nikon D300 mit Nikon 70-200/2.8; 200 mm, f/2.8, 2 s, ISO 1600
Astrofotografie vom Großstadt-Balkon: Gürtel des Orion; Nikon D300 mit Nikon 70-200/2.8; 200 mm, f/2.8, 2 s, ISO 1600

Kurz vor Vollmond (mit Überraschungsgast Jupiter)

Kurz bevor der Schnee kam, konnte ich gestern Abend noch eine kurze Wolkenlücke dazu nutzen, ein Foto vom Mond zu machen.

In Ermangelung eines Telekops mit ordentlicher Brennweite musste das Nikon 70-200 ƒ/2,8 mit einem 1,7fach Telekonverter (alles was ich an Brennweite zusammenkratzen konnte) an der Nikon D300 reichen. Der Autofokus funktioniert bei Vollmond überhaupt nicht und auch der Live-View-Modus der D300 kommt mit der Mondhelligkeit nicht zurecht, so dass ich ohne weitere Hilfsmittel nur mit Blick durch den Sucher scharfstellen musste. Das klappte dann doch erstaunlich gut – zumindest besser als ich es erwartet hatte. Ausgelöst wurde mit Kabel-Fernauslöser sowie mit aktivierter Spiegel-Vorauslösung.

Die Mondphase war kurz vor Vollmond (98,7 %) was gerade noch so ausreichte um ein paar Schatten am Terminator zu erkennen.

Mond am 2015-02-02 gegen 21:21 Uhr CET, Nikon 70-200 ƒ/2,8 + 1,7fach Telekonverter an Nikon D300, ISO 200, 1/320 Sekunde, ƒ/8
Mond am 2015-02-02 gegen 21:21 Uhr CET, Nikon 70-200 ƒ/2,8 + 1,7fach Telekonverter an Nikon D300, ISO 200, 1/320 Sekunde, ƒ/8 (Originaldatei)

Nach dem Mond habe ich spaßeshalber noch zwei, drei Bilder vom in der Nähe stehenden Jupiter gemacht, wissend, dass die Fotos vermutlich direkt in den Mülleimer wandern würden. Erstaunlicherweise ist tatsächlich die Planetenscheibe samt einem (bei viel Fantasie auch zwei) Wolkenstreifen erkennbar.

Jupiter am 2015-02-02 gegen 21:23 Uhr CET, Nikon 70-200 ƒ/2,8 + 1,7fach Telekonverter an Nikon D300, ISO 200, 1/125 Sekunde, ƒ/6,3
Jupiter am 2015-02-02 gegen 21:23 Uhr CET, Nikon 70-200 ƒ/2,8 + 1,7fach Telekonverter an Nikon D300, ISO 200, 1/125 Sekunde, ƒ/6,3, 2fach vergrößert (Originaldatei)

Astrofotografie vom Balkon: Plejaden und Komet Lovejoy

Eben habe ich nach langer Zeit mal wieder einen klaren Nachthimmel sehen – und fotografieren können. Zwar nur vom Balkon (schlecht), nicht nachgeführt (schlechter), in Berlin (noch viel schlechter) und ohne große Vorbereitung. Stativ aufgestellt, die kleine Olympus rauf, die Blende vom 17 mm-Objektiv aufgemacht und wieder eine halbe Blendenstufe zu auf f/2, Empfindlichkeit auf ISO 1600 eingestellt sowie drei Sekunden Belichtungszeit vorgewählt. Ausgelöst ohne Vorauslösung. Das Ergebnis ist durchaus in Ordnung.

Hauptziel war M45 – der Sternhaufen der Plejaden, dank des großen Blickwinkels ist aber noch eine Menge mehr zu erkennen. Markant sind die Hyaden mit dem rötlichen Aldebaran (ɑ Leo) im mittig im unteren Bildteil zu sehen. Oben links ist Capella (ɑ Aur) deutlich zu erkennen – zusammen mit Aldebaran kann man also immerhin schon ein Drittel des Wintersechsecks ausmachen :-)

Vergrößert man das Bild kann man den einen oder anderen offenen Sternhaufen aus dem Messier-Katalog erkennen, M36, M37 und M38 im Sternibild Fuhrmann seien exemplarisch genannt.

Als besonderer Bonus ist auf dem Bild der Komet C/2014 Q2 (Lovejoy) zu sehen – das habe ich selbst erst am Rechner bemerkt. Die grünlich-blaue Farbe des Objekts machte mich stutzig – nach einem kurzen Blick in Stellarium stellte sich dann raus, dass zufällig eben der Komet mit auf dem Bild zu sehen ist.

Ein erneutes Foto ließ sich dann nicht mehr anfertigen, da mittlerweile der Himmel bewölkt war :-(

Foto mit Anmerkungen
Foto mit Anmerkungen; verlinkt ist das Bild in Originalgröße

PHP: foreach vs. array_reduce

Ich habe letztens meine PHP-Library phpgeo mit Scrutinizer CI auf Code-Qualität untersuchen lassen. Es wurde an zwei Stellen Code-Duplication angemahnt, die ich dann auch gleich entfernt habe.

Dabei stieß ich auf eine foreach-Schleife, welche für die Berechnung der Länge einer Polyline (GPS-Track) zuständig ist.

Das Ergebnis der Schleife lässt sich auch wunderbar mit PHPs Funktion array_reduce berechnen. Die Frage war jetzt, ob ich es so lasse wie gehabt oder tatsächlich auf array_reduce umstelle.

Die betreffende Methode:

public function getLength(DistanceInterface $calculator)
{
    $distance = 0.0;

    if (count($this->points) <= 1) {
        return $distance;
    }

    foreach ($this->getSegments() as $segment) {
        $distance += $segment->getLength($calculator);
    }

    return $distance;
}

lässt sich auch so schreiben:

public function getLength(DistanceInterface $calculator)
{
    $distance = 0.0;

    if (count($this->points) <= 1) {
        return $distance;
    }

    return array_reduce(
        $this->getSegments(),
        function($carry, $item) use ($calculator) {
            return $carry + $item->getLength($calculator);
        }
    );
}

array_reduce müsste schon mindestens einen relevanten Vorteil gegenüber foreach bieten und außer der Geschwindigkeit und vielleicht ein bisschen mehr Eleganz fiel mir keiner ein. Die Geschwindigkeit lässt sich zum Glück schnell testen und ein kurzes Skript für diesen Zweck war schnell geschrieben:

<?php
/**
 * we need something to call
 */
function calculate_something($value) {
    return $value / ($value + 1);
}

$cycles = 100000;

// create some random data
$array = [];
for ($i = 0; $i < $cycles; $i ++) {
    $array[$i] = mt_rand(0, 0x7fffffff);
}

$timer['start'] = microtime(true);

$sumForeach = 0;
foreach ($array as $value) {
    $sumForeach += calculate_something($value);
}

$timer['foreach'] = microtime(true);

$sumArrayReduce = array_reduce($array, function($carry, $item) {
    return $carry + calculate_something($item);
});

$timer['array_reduce'] = microtime(true);

echo $sumForeach . " == " . $sumArrayReduce . PHP_EOL;
echo "foreach     : " . ($timer['foreach'] - $timer['start']) . PHP_EOL;
echo "array_reduce: " . ($timer['array_reduce'] - $timer['foreach']) . PHP_EOL;

Es zeigte sich, dass foreach deutlich schneller ist als array_reduce:

[mj@neptune:~/tmp]
% php test.php
99999.999335167 == 99999.999335167
foreach     : 0.068737030029297
array_reduce: 0.2411630153656

Wenn man darüber nachdenkt ist auch schnell klar warum das so sein muss: Für jeden Wert des Arrays wird in array_reduce ein – in PHP relativ teurer – Funktionsaufruf fällig (nämlich die Callback-Closure), was in foreach nicht notwendig ist.

Ende der Geschichte: Die Längenberechnung in phpgeo geschieht weiterhin in einer foreach-Schleife.

Es ist allerdings leicht vorstellbar, dass der Overhead eines Funktionsaufrufes bei anderen Anwendungen weniger ins Gewicht fällt und dort array_reduce die elegantere Alternative darstellen kann.