Archiv

Archiv für Februar, 2012

Origami – Doppelpyramide

23. Februar 2012 Keine Kommentare

Ein neues Modell ist fertig geworden. Zugegeben, es handelt sich dabei um nichts besonderes, es besteht aus grade mal 3 Elementen und sieht auch nicht sonderlich spektakulär aus, aber dafür ist es eine sehr schöne Übung, um nach Anleitung zu falten und zusammen zu setzen. Denn genau darin besteht hier die Schwierigkeit.

Der Autor hat auf seiner Seite bei den Basismodulen 3 Faltungen vergessen, die das Zusammenstecken deutlich vereinfachen. Und das Zusammenstecken selbst kann man auch eher erahnen als erkennen.

Wer es dennoch schafft, kann sich ohne Probleme an komplexeren Gebilden versuchen.

WordPress – Individuelle <head> Ergänzungen

21. Februar 2012 Keine Kommentare

WordPress ist ein dynamisches System mit vielen Möglichkeiten, aber dennoch stößt man des öfteren an Grenzen, die ohne Eingriffe in den Quelltext nicht oder nur über Plugins zu überwinden sind.

Möchte man beispielsweise auf einer statischen Seite ein Script verwenden, das man aber ansonsten nirgendwo auf seiner Webseite benötigt, würde man dies normalerweise einfach in den Kopf der Seite schreiben. Da WordPress aber für alle erzeugten Seiten den selben Seitenkopf läd, würde eine Änderung an dessen Quelltest gleich die gesamte Webseite betreffen.

Die Entwickler haben dies aber glücklicherweise bereits bedacht. Beim Erstellen von Artikeln oder Seiten hat man unter dem Textfeld für den Inhalt die Möglichkeit, benutzerdefinierte Felder anzulegen. Sollte diese Möglichkeit nicht angezeigt werden, muss es erst unter Optionen einblenden aktiviert werden.

Nun denkt man sich einen Namen für das Feld aus und kopiert den Quelltext des Scripts in das Werte-Feld. Das öffnende und schließende Script-Tag dabei nicht vergessen!

Anschließend muss man die header.php des verwendeten Themes bearbeiten. Ich verwende iNove, daher liegt die Datei bei mir in folgendem Verzeichnis:

/wp-content/themes/inove/header.php

Hier muss eine neue Zeile eingefügt werden.

<!-- script START -->
<script type="text/javascript" src="<?php bloginfo('template_url'); ?>/js/base.js"></script>
<script type="text/javascript" src="<?php bloginfo('template_url'); ?>/js/menu.js"></script>
<?php echo get_post_meta($post->ID, "header_js", true); ?>
<!-- script END -->

header_js sollte gegen den selbst gewählten Feldnamen ausgetauscht werden.

Ab sofort kann für jede Seite und jeden Artikel, falls nötig, ein individuelles Script eingebunden werden. Natürlich lassen sich auch beliebige andere Informationen über die benutzerdefinierten Felder in die Seiten einbinden. Einfach Name vergeben und den Code an der entsprechenden Stelle einfügen.

Auf http://www.officetrend.de werden noch umfangreiche Möglichkeiten vorgestellt, dort mit dem Ziel selbst definierbarer Meta-Tags auf der Seite. Über den Beitrag bin ich auf das ganze überhaupt aufmerksam geworden.

Windows XP ohne USB und optisches Laufwerk installieren

20. Februar 2012 Keine Kommentare

Immer mal wieder bekommt man kleine Aufgaben gestellt. Seit einiger Zeit lag nun schon ein älteres Notebook (P3, 1GHz) bei mir herum und wartete darauf, endlich mit einem neuen Betriebssystem versehen zu werden. Was auch ein leichtes gewesen wäre, hätte das CD-Laufwerk noch funktioniert.

Man kennt die Problematik nicht funktionierender oder gar fehlender optischer Laufwerke zwar nicht zuletzt seit dem kleinen Boom von Netbooks vor einigen Jahren, aber auch die dort übliche Vorgehensweise, nämlich die Installation von einem USB-Stick aus, konnte nicht genutzt werden. Das Notebook ist zu alt und das Booten über USB ist dem BIOS unbekannt.

Zwar existiert in dem Gerät ein 3,5″ Diskettenlaufwerk, aber wer bitte hat denn schon noch eine alte MS-DOS 6.22 Disk liegen, geschweige denn ein solches Laufwerk, um sich ggf. eine zu erstellen…ich jedenfalls nicht ^^

Also musste die Festplatte raus und via Adapter an einen anderen PC gehängt werden. Praktischerweise hatte ich einen passenden IDE-USB Adapter schon länger liegen, er wollte nur gefunden werden.

Was nun folgt, ist wiederum die übliche Vorgehensweise mit den Hilfsmitteln USB-Multiboot oder WinSetupFromUSB. Ersteres habe ich bereits für mein Netbook benutzt, daher viel die Wahl diesmal auf WinSetupFromUSB. Und da erste Anläufe mit der Stable nicht sonderlich erfolgreich waren, musste die Beta zeigen, was sie kann.

Als die Festplatte wieder im Notebook steckte, begann die Installation. Und wer schon mal auf diesem Wege Windows XP installiert hat, der weiß, dass bei dieser Vorgehensweise 3x vom USB-Stick aus gebootet werden soll, um die Installation abzuschließen.

Da sich aber in diesem Fall Quelle und Ziel das selbe Laufwerk teilen, wird der MBR schon beim ersten Durchlauf überschrieben, wodurch die beiden folgenden Durchgänge nicht gestartet werden können. Mit leichter Spannung wartete ich somit auf den ersten Neustart und freute mich, dass die Installation auch ohne die beiden Extrarunden wunderbar funktionierte.

Windows XP läuft jetzt auf dem Notebook und hat keine offensichtlichen Macken, daher stellt sich mir abschließend nur noch die Frage, ob die beiden zusätzlichen Bootvorgänge überhaupt nötig sind oder ob sie nur wegfallen konnten, weil eh alle Daten auf dem selben Laufwerk lagen.

Indie Game: Creeper World

13. Februar 2012 Keine Kommentare

Der Name ist bei mir schon lange Programm. Durch Zufall bin ich vor Jahren mal auf das Flash-Game Creeper World – Training Simulator aufmerksam geworden. Ein wie ich finde sehr unterhaltsames und fesselndes Gameplay, am ehesten zu beschreiben als eine Mischung aus Echtzeitrollenspiel und Tower Defence. Die Training Sim stellte wohl ursprünglich auch die Demo zum eigentlichen Spiel Creeper World dar welches als AIR Anwendung zwar auch auf Flash basiert, aber leider nicht im Browser gespielt werden kann.

Das schöne ist, dass einem so schnell nicht langweilig wird, da das Spiel Zugriff auf unzählige Karten, die von begeisterten Fans erstellt wurden, gewährt. Also das selbe Prinzip, das auch Little Big Planet zu einer solch großen beliebtheit hat werden lassen.

In den letzten Monaten ist die Liste an Titeln rund um Creeper World nochmals angewachsen. Der Entwickler hat noch 2 neue Flash-Games veröffentlicht: User Space und Evermore. Beide stützen sich auf die Costum Maps, bei User Space gibts eine Auswahl an beliebten Maps, Evermore liefert jeden Tag eine andere Map. Zwar letztlich auch nichts anderes als das, was das Hauptspiel auch bietet, aber jetzt auch ohne AIR nutzbar.

 
Creeper World 2: Redemption

Wer den ersten Teil durch hat und sich auf mehr freut, kann gleich mit Creeper World 2 fortfahren. Das Spielprinzip ist das gleiche, nur das Gameplay hat sich etwas geändert. Aber auch hier gibt es dank Unterstützung von Costum Maps fast unbegrenzten Langzeitspaß. Das Hauptspiel kommt wie schon der erste Teil als AIR-Anwendung auf die heimische Platte, ein kleines Flash-Game mit der selben Spielmechanik wurde in den letzten Wochen mit Academy gerade erst veröffentlicht.

Beide Spiele zusammen kann man für $14,95 (umgerechnet weniger als 12€) beim Entwickler erwerben. Wenn man bedenkt, wie lange einen die Spiele unterhalten können, und insbesondere aufgrund der Tatsache, dass es sich hierbei um einen kleinen Indie Entwickler handelt, ein durchaus fairer Preis, den ich sehr gerne investiert habe 🙂

 
Noch immer nicht genug?

Wer mit Creeper World fertig ist und noch immer Nachschub braucht, könnte noch einen Blick auf die folgenden beiden Flash-Games von CasualCollective werfen: The Space Game und dessen Fortsetzung Missions.

Viel Spaß beim Zocken ^^

Speed up my Firefox

10. Februar 2012 Keine Kommentare

Und wieder zeigt sich, wie leicht ich von einem Thema ins nächste rutsche. Wie gestern schon angekündigt wollte ich mich mit der Synchronisation von Addons befassen, aber meine sprunghafte Natur hat sich natürlich gleich von etwas neuem ablenken lassen.

In der Firma benutze ich wie die meisten den Firefox Portable, und das schon relativ lange. Als ich heute schauen wollte, wie groß die Addons denn so sind, um den benötigten Speicherplatz schon mal einschätzen zu können, viel mir fast alles aus dem Gesicht: großzügige 280 MB umfasste mein Profilverzeichnis, die reinen Addons beanspruchen davon aber nicht mal 20 MB für sich. Der Großteil entfällt auf die von Firefox und einigen Addons angelegten SQLite Datenbanken.

 
Die größten Speicherfresser

Spitzenreiter der Verschwendung war/ist das Addon Brief, welches scheinbar nie seine DB aufräumt, selbst wenn im GUI was anderes behauptet wird, und somit auf stolze 130 MB kam. Da geht zwar noch einiges mehr, aber dafür hab ich Brief wohl noch nicht lange genug installiert. Nett war auch das 60 MB große Backup-File, das Brief noch angelegt hatte.

Platz 2 geht an die Datei urlclassifier3.sqlite und gehört direkt zu Firefox. Diese empfand ich mit ~50 MB auch als etwas zu groß, insbesondere für eine Anwendung, die als Portable betittelt wird und somit wohl häufig auf USB-Sticks eingesetzt wird. Wenn immer so große Brocken beim Start oder bei Eingaben geladen und durchsucht werden müssen, ist es ja kein Wunder, dass der Fuchs etws langsam wirkt.

Auch die Datei places.sqlite kommt ohne Probleme schon auf gute 10 MB, selbst wenn darin nur die offenen Tabs und Lesezeichen gespeichert werden. Aktiviert man dann auch noch die Chronik, kommt man schnell auf 20-30 MB oder noch mehr.

Alles zusammen also schon eine nicht ganz unerhebliche Datenmenge, die bei jedem Start verarbeitet wird.

 
Erster Schritt, Aufräumen und somit Komprimieren der Datenbanken

Auf Caschys Blog gibt es einen guten Artikel, wie man diese Aufgabe bewältigen kann. Angesprochen werden verschiedene Möglichkeiten, die für mich interessanteste und auch flexibelste Lösung ist über die Kommandozeile.

Man benötigt unter Windows das Programm sqlite3.exe. Das Archiv enthält nur eine Datei, die man direkt in den Profilordner von Firefox (oder auch Thunderbird) entpackt. Mit diesem Programm ist es möglich, die überflüssigen Leerzeilen, die sich im Laufe der Zeit in Datenbanken ansammeln, zu entfernen, was zu enormen Platzeinsparungen führen kann.

Jetzt braucht es nur noch eine kleine Batch-Datei (ebenfalls im Profilordner), um den Vorgang zu starten. Der Name der Datei ist dabei egal, nur die Endung muss .bat lauten.

@echo off
echo.
echo VACUUM SQLite Files
echo ----------------------------------------
for %%i in (*.sqlite) do sqlite3.exe %%i "VACUUM" & echo VACUUM %%i
echo done

Wichtig: Firefox darf nicht geöffnet sein, wenn die Komprimierung ausgeführt wird!

Dieser Vorgang kann, je nach Größe der vorhandenen SQLite Dateien, mehrere Minuten dauern. Anschließend sollte sich aber schon ein Unterschied in der Ladegeschwindigkeit von Firefox bemerkbar machen.

 
Existenzberechtigung der Addons prüfen

Dass Addons den Startvorgang von Firefox verlangsamen, ist inzwischen allgemein bekannt. Einige machen sich kaum bemerkbar, andere Addons können mehrere Sekunden ausmachen.

Im Falle Brief muss man sich die Frage stellen, wie oft man die Funktionen des Addons nutzt. Hat man Lesezeichen? Archiviert man alles, um später nochmal drauf zugreifen zu können? Oder nutzt man es nur, um die neusten Infos auf Webseiten nicht zu verpassen?

Wenn man den letzten Punkt mit Ja beantworten kann, wäre das einfachste, vor der Komprimierung der Datenbanken die von Brief einfach zu löschen. Man spart Platz und Brief reagiert schneller. Den Befehl zum löschen kann man mit in der Batch-Datei unterbringen.

@echo off
del brief.sqlite
echo.
echo VACUUM SQLite Files
echo ----------------------------------------
for %%i in (*.sqlite) do sqlite3.exe %%i "VACUUM" & echo VACUUM %%i
echo done

Bei anderen Addons muss man schauen, ob man diese überhaupt dringend benötigt. Falls nein, Addon deaktivieren oder gleich ganz löschen. FoxyProxy ist so ein Kandidat, zumindest kommt es mir so vor, als wenn FF deutlich schneller ist, wenn man das Addon deaktiviert. Allerdings brauche ich es, daher werde ich mich damit wohl abfinden müssen ^^

 
urlclassifier3.sqlite

Eine grundsätzliche Frage muss hier erst beantwortet werden: wie wichtig ist mir „Sicherheit“?

Viele haben sie schon mal gesehen, die Warnung, dass eine Seite als unsicher oder attackierend eingestuft wurde. Google führt eine Datenbank, in der alle als bedenklich eingestuften Webseiten aufgelistet werden. In regelmäßigen Abständen erwischt dies auch bekannte Seiten, weil ein Teil ihres Quellcodes plötzlich durch die Heuristik-Prüfung fällt oder aber ein Werbeanbieter gehackt wurde und die Werbung so plötzlich echten Schadcode enthält. Das Problem ist dann nach meist wenigen Minuten behoben, der Eintrag bei Google aber nur sehr aufwendig zu entfernen.

Die Datei urlclassifier3.sqlite stellt ein lokales Abbild dieser Datenbank von Google dar. Zumindest in Auszügen. Jede eingegebene Adresse wird erst mit dieser Datenbank abgeglichen, bevor sie aufgerufen wird. Das wiederum kostet Zeit und lässt den Firefox langsamer werden.

Die Datei nur zu löschen, bringt nicht den gewünschten Erfolg. Man muss auch dafür sorgen, dass sie nicht gleich wieder neu von Google befüllt wird. Dazu geht man in die Einstellungen von Firefox:

Extras -> Einstellungen -> Sicherheit

und entfernt die Häckchen bei allen Punkten, die mit Webseiten blockieren, wenn… beginnen.

Nach dem nächsten Start von Firefox wird diese Datei zwar neu angelegt, aber sie wird nicht mehr größer und bei Seitenaufrufen auch nicht mehr durchsucht.

 
Fazit

Vorher fast 300 MB, jetzt nur noch knapp über 30 MB im Profilordner und ein Firefox, der sich spürbar schneller verhält 🙂

Firefox 11 synchronisiert Addons … teilweise

9. Februar 2012 Keine Kommentare

Der kommende Firefox 11 wird eine tolle Neuerung bringen, Sync wird künftig auch die Addons synchronisieren. Was sich im ersten Moment richtig gut anhört, verliert schnell an Bedeutung, wenn man weiter ins Detail geht und sich die Einschränkungen ansieht.

Firefox wird nämlich nur die Addons synchronisieren, die von addons.mozilla.org aus installiert worden sind. Erweiterungen, die aus anderen Quellen installiert wurden, werden nicht synchronisiert, selbst wenn sie im Bestand der Webseite enthalten sind.

Diese Entscheidung ist technisch durchaus nachvollziehbar, schließlich muss so nur die ID der Erweiterung synchronisiert werden, der Addon-Server weiß dann schon, was er zu laden hat. Selbst wenn sehr viele Addons installiert sind, liegt die Zusatzbelastung der Sync-Server so gerade mal bei wenigen kByte. Und für Personen, die eh nur von der offiziellen Seite installieren, ist das gar nicht mal so uninteressant.

Wenn man aber lieber von der Herstellerseite installiert, da dort logischerweise die neusten Versionen als erstes zu haben sind und man ggf. auch mal auf Beta-Versionen zugreifen kann, muss man sich um eine andere Lösung bemühen.

Dem bis hier aufmerksamen Leser mit etwas technischem Verständnis wird auch schon der zweite große Nachteil aufgefallen sein, den diese Vorgehensweise mit sich bringt:  die Einstellungen der Addons werden nicht synchronisiert! Denn das würde den Speicherplatzbedarf exorbitant in die Höhe treiben, was Mozilla natürlich nicht möchte. Also muss man nach wie vor in jeder neuen Firefox-Installation die immer gleichen Einstellungen in den Addons manuell vornehmen…

 
Alternative Ideen zu Sync

Sync an sich ist ja ne feine Sache, für die Lesezeichen und Einstellungen des Browser benutze ich es auch sehr gerne. Aber selbst dafür reicht es mir schon nicht, und deshalb muss zusätzlich noch Xmarks seinen Dienst verrichten.

Bei den Addons habe ich bisher vollständig auf eine Synchronisation verzichtet, mich aber doch schon das eine oder andere Mal darüber geärgert, wenn ich zum xten Mal eine Seite in NoScript freigeben musste oder ähnliches. Und somit kommt das Thema jetzt einmal unter die Lupe…Vorschläge und Ideen zur Umsetzung findet man im Netz zu hauf, aber welche taugen auch wirklich was.

Mehr dazu gibt es, sobald ich etwas Zeit zum experimentieren habe. Ich schmeiß aber schon mal ein paar Schlagwörter in den Raum: Dropbox, MozBackup und FEBE 😉

WordPress personalisieren

9. Februar 2012 Keine Kommentare

Das Blog installieren und sich bei Bedarf noch ein fertiges Theme im Internet suchen, schon ist der Großteil der Benutzer zufrieden. Allerdings gehöre ich nicht zu dieser Gruppe. Da Design nicht grade eine meiner Stärken ist, werde ich zwar darauf verzichten, irgendwann ein eigenes Theme zu erstellen, und mich auf fertige Vorlagen stützen, aber dennoch muss dieser Blog ein wenig personalisiert werden. Einiges ist halt aus meiner Sicht nicht ganz optimal in der Standardkonfiguration.

 
Das richtige Design

Ich bin ein Freund von relativ einfachen Designs, zu viel Informationen auf engem Raum und agressive Farben überlasse ich gerne anderen.

Zwei Themes kamen bei der Suche in die engere Auswahl: zBench und iNove. zBench war mein ursprünglicher Favourit, da es wie ich finde einen etwas harmonischeren Eindruck macht. Allerdings störte mich das vollständige Fehlen eines typischen Headers dann doch so sehr, dass meine Wahl letztlich auf iNove viel. Zwar hat das Theme mit der Darstellung von CSS Dropdown-Menüs Probleme, aber das wird ja vielleicht noch in einer der späteren Versionen behoben. Außerdem brauche ich diese Funktion vorerst eh nicht.

 
Login im Header

Die erste wichtige Anpassung betrifft das An- und Abmelden am System. In der Standard-Seitenleiste rutscht dieser Punkt im Laufe der Jahre bei aktiver Blog-Nutzung immer weiter nach unten und ein extra Lesezeichen dafür halte ich für Verschwendung, also muss daran was geändert werden. Da mir die Seitenleiste aber derzeit so wie sie ist ganz gut gefällt, muss eine andere Lösung her.

Der Header. Man kennt es von vielen Seiten, oben rechts stehen die immer gleichen Links. Ob das auch bei WordPress geht? Klar, und zwar sehr einfach über den Admin-Bereich:

Design -> Aktuelle Themen Optionen -> Banner

In dem Eingabefeld kann man den Inhalt des Headers einfügen und mit HTML und CSS formatieren. Allerdings ist es damit noch nicht getan, denn selbst mit Plugins kann man in dem Feld keinen PHP-Code platzieren, was aber unverzichtbar ist, wenn man einen dynamischen Link zum An- und Abmelden haben möchte. Über das Feld kann man nur statische Links vorgeben.

Also muss man direkt in der entsprechenden Datei Änderungen vornehmen. Zu finden ist diese beim iNove-Theme in folgendem Verzeichnis:

/wp-content/themes/inove/templates/header.php

Hier fügt man nun an der markierten Stelle den zusätzlichen Code ein:

<!-- header START -->
<div id="header">

	<!-- banner START -->
	<?php if( $options['banner_content'] && (
		($options['banner_registered'] && $user_ID) || 
		($options['banner_commentator'] && !$user_ID && isset($_COOKIE['comment_author_'.COOKIEHASH])) || 
		($options['banner_visitor'] && !$user_ID && !isset($_COOKIE['comment_author_'.COOKIEHASH]))
	) ) : ?>
		<div class="banner">
			<?php wp_loginout(); ?> 
			<?php echo($options['banner_content']); ?>
		</div>
	<?php endif; ?>
	<!-- banner END -->

Diese Zeile bewirkt, dass oben rechts im Header ab sofort immer der An- oder Abmelden Link angezeigt wird, allerdings nur, wenn im Admin-Bereich auch der Haken zum Banner anzeigen gesetzt ist. Alle Eingaben in dem Textfeld des Banners werden nun hinter dem An- / Abmelden-Link angezeigt.

Möchte man jetzt abschließend noch die Link-Farbe ändern, ohne dass die Änderung gleich im ganzen Blog gültig wird, muss der Code nochmals leicht angepasst werden:

<?php echo str_replace('">','" style="color:#CCCCCC">',wp_loginout(false,false)); ?> 

Das ist die schlichteste Variante, natürlich kann man ebenso eine neue ID vergeben und die CSS Datei des Themes anpassen. Wäre sauberer, mir aber grad etwas zu viel unnötiger Arbeit.

 
Mehr Funktionen durch Plugins

SyntaxHighlighter Evolved
Sehr hilfreich, wenn man in den Beiträgen Code veröffentlichen und Syntax-Highlighting zur besseren Lesbarkeit einsetzen möchte.

Exclude Pages from Navigation
Seiten werden, wenn es das Theme unterstützt (im Falle iNove horizontal neben dem Home-Button) automatisch aufgelistet und verlinkt. Wenn man aber nicht jede erstellte Seite dort stehen haben möchte, ist dieses Plugin sehr hilfreich. Beim Erstellen einer Seite kann man nach der Installation festlegen, ob diese Seite aufgelistet werden soll oder nicht.

Contact Form 7
Da die Rechtsprechung bezüglich Webseiten inzwischen kaum noch durchschaubar ist (ab wann ist eine private Seite nicht mehr als privat anzusehen? Braucht man ein Impressum?) und keiner diese Fragen zu beantworten vermag, sollte man sich überlegen, ob man nicht lieber auf Nummer Sicher geht und seine Seite um ein kleines Impressum und ein Kontaktformular ergänzt. Kostet auf jeden Fall weniger als eine mögliche Abmahnung eines dieser parasitären Geschwüre der Gesellschaft.

Allow PHP in posts and pages
Eigener Code innerhlab eines Artikels oder einer Seite, die mit WordPress erstellt wurde. Kein Problem, mit diesem Plugin ist es möglich. Bei Interesse kann man so den Inhalt seiner Artikel dynamisch generieren, eigene Datenbanken einbinden, etc.

Akismet
Wird von WordPress mitgeliefert, und das aus gutem Grund. Wer keine Lust auf Spam hat, sollte sich das Plugin mal näher ansehen.

Falten gegen den Schmachter

8. Februar 2012 Keine Kommentare

Bascetta Stern aus 9*9cm NotizpapierSeit einer Woche rauchfrei, das ist doch mal ein guter Anfang. Und statt jetzt wie viele andere angehende Nichtraucher gleich der nächsten Sucht anheim zu fallen (Futtern, Kaugummi, etc.), habe ich mir etwas anderes überlegt.

Vor einiger Zeit habe ich mein Interesse an der Kunst des Origami entdeckt und mich ein wenig mit dem Themengebiet beschäftigt. Ich finde es faszinierend, was man alles aus Papier (und zwar nur Papier, keine Schere, kein Kleber) herstellen kann. Und ich rede jetzt nicht von kleinen Schwänen, Schweinen oder sonstigem Getier 😉

Besonders angetan bin ich von modularen Figuren. Begonnen hat das alles mit einem Bascetta-Stern in der Vorweihnachtszeit, hat sich dann aber schnell weiter entwickelt und andere Figuren wollten ausprobiert werden. Youtube ist in der Hinsicht ein unerschöpflicher Quell an Faltanleitungen. Und bevor ich mich der Königsklasse, Origami Tessellation, widmen kann, brauch ich noch einiges mehr an Übung und Fingerfertigkeit.

So, was aber hat das alles mit dem Nichtrauchen zu tun, mag sich der ein oder andere unaufmerksame Leser fragen, bei dem der Groschen bis jetzt noch nicht gefallen ist.

Die Antwort lautet: 1 Stapel Notizzettel (9x9cm) und ein wenig Dreistigkeit, um auch während der Arbeitszeit statt eine Rauchen zu gehen einfach das eine oder andere Modul zu falten. Den Startschuss stellt der am Artikelanfang abgebildete Bascetta-Stern dar, der heute fertig geworden ist. Mögen ihm noch viele weitere Figuren folgen…

Gleichzeitig ist das auch ein genereller Versuch, was für Figuren sich überhaupt aus 9x9cm Größe gut falten lassen, zumal das Papier nicht wirklich quadratisch geschnitten ist.

PHP Kalender Teil 4, Jahreszeiten

8. Februar 2012 3 Kommentare

Nun kommen die etwas anspruchsvolleren Themen. Bisher gab es für alle Termine einen bestimmten Bezugspunkt, mit dem es sich leicht rechnen ließ. Bei den Jahreszeiten ist das leider nicht mehr so einfach, denn diese sind nicht von einem Datum abhängig, sondern vom Stand der Sonne. Der Frühling beispielsweise beginnt, wenn die scheinbare geozentrische Länge der Sonne 0° beträgt. Man nennt diesen Zeitpunkt auch Tag-und-Nacht-Gleiche, Äquinoktium oder noch präziser Primaräquinoktium, da es im Herbst ein weiteres Äquinoktium gibt…

Hö? Ähm…ja…sind soweit alle Klarheiten beseitigt?

Gut, dann können wir uns ja tiefer in das Thema vorwagen. Bevor hier irgendwas berechnet wird, sollte man sich erstmal Bezugsdaten holen, damit man die späteren Ergebnisse auch auf Fehlerfreiheit prüfen kann. Ich habe zu diesem Zweck 2 Seiten gefunden. Zum einen (mal wieder) den passenden Artikel im Wiki (Termine von 2006 – 2018) und zum anderen eine leicht umfangreichere Liste auf der Seite des Astronomical Applications Department of the U.S. Naval Observatory (Termine von 2000 – 2020).

Da PHP soweit mir bekannt keine Funktion beinhaltet, mit der man sich das Leben in diesem Falle leichter machen könnte, bleibt nur die Suche im Netz nach einer geeigeneten Formel. Alternativ hätte ich mir natürlich auch in den nächsten Monaten selbst das nötige Wissen anlesen können, aber Google erschien mir weniger aufwendig ^^

 
Die „einfache“ Grundformel

Bei der Suche stößt man auf das Buch Astronomical Algorithms von Jean Meeus. Darin enthalten ist eine oft zitierte Grundformel ohne Korrekturterme. Der Fehler soll bei unter 15 Minuten liegen.

Für Y = (Jahr-2000)/1000

März-Äquinoktium (Beginn des astronomischen Frühlings):
JDE = 2451623.80984 + 365242.37404*Y + 0.05169*Y^2 - 0.00411*Y^3 - 0.00057*Y^4

Juni-Solstitium (Beginn des astronomischen Sommers):
JDE = 2451716.56767 + 365241.62603*Y + 0.00325*Y^2 + 0.00888*Y^3 - 0.00030*Y^4

September-Äquinoktium (Beginn des astronomischen Herbstes)
JDE = 2451810.21715 + 365242.01767*Y - 0.11575*Y^2 + 0.00337*Y^3 + 0.00078*Y^4

Dezember-Solstitium (Beginn des astronomischen Winters):
JDE = 2451900.05952 + 365242.74049*Y - 0.06223*Y^2 - 0.00823*Y^3 + 0.00032*Y^4 

Im Forum von selfhtml hat der Benutzer EisFuX diese Grundformel in einer PHP-Klasse veröffentlicht. Leider hat die Klasse wie ich finde ein paar Schwachpunkte.

Hinzu kommt, dass der Abgleich mit den Referenzseiten einen falschen Winterbeginn 2014 offenbarte. Nicht ganz verwunderlich, denn der Winterbeginn ist um 0:03 Uhr MEZ und die Formel hat einen Fehler von 15 Minuten. Die Formel kann es somit gar nicht besser…

…also wieder auf die Suche.

 
Die komplexere Formel

Eine genauere Formel zur Berechnung der Jahreszeiten zu finden, ist schon eine etwas größere Herausforderung. Für jeden Mist bekommt man im Internet haufenweise vorgefertigte Funktionen, Klassen, Codeschnipsel oder zumindest besserwisserische Kommentare…aber hier beschleicht einen das Gefühl, dass vor einem noch niemand die Jahreszeiten selbst berechnen wollte.

Eigentlich gar nicht mal so schlecht, so erspart man sich schlichtes übernehmen und muss tatsächlich noch ein wenig Hirnschmalz aufbringen.

Die Suche führte mich letztlich auf die Seite des IMCCE (Institut de Mecanique Celeste et de Calcul des Ephemerides), welche eine deutlich komplexere Formel zur Berechnung der Jahreszeiten verwenden. Hier wird nicht nur auf den Tag, sondern auf die Minute genau gerechnet.

Freundlicherweise haben sie die Berechnung in JavaScript realisiert, so dass man sich auch den Quelltext anschauen kann.

So, bevor ich wieder lang aushole, erstmal die Fakten: die Formel des IMCCE hat nach ersten Proberechnungen nur einen Fehler von 1 Minute, eine größere Abweichung konnte ich zwischen 2000 und 2020 nicht feststellen. Dem Perfektionisten mag selbst diese eine Minute noch zu viel sein, mir reicht diese Genauigkeit jedoch vollkommen aus. Zu einem falschen Datum kann es jetzt nur noch kommen, wenn der Beginn einer Jahreszeit genau auf 23:59 oder 0:00 fällt und der Fehler in die „falsche Richtung“ geht. Sobald man das weiß, kann man händisch nachbessern, das sollte nicht allzu häufig vorkommen.

Hier nun die Formel des IMCCE als PHP-Klasse inkl. automatischer Umrechung des Ergebnisses in die Zeitzone des Servers, auf dem das Script ausgeführt wird:

/****************************************************************\
| Alle Funktionen und Formeln stammen von der Webseite des IMCCE |
| (Institut de Meécanique Celeste et de Calcul des Ephemerides)  |
|      http://www.imcce.fr/en/grandpublic/temps/saisons.php      |
\****************************************************************/
class jahreszeit {
  function datum() {
    $this->JJD = 0;
    $this->JAHR = 0;
    $this->MONAT = 0;
    $this->TAG =0;
    $this->JZ = array();
  }

  function trunc($x) {
    if($x>0.0)
      return floor($x);
    else
      return ceil($x);
  }

  function JJDATEJ(){
    $Z1 = $this->JJD+0.5;
    $Z = $this->trunc($Z1);
    $A = $Z;
    $B = $A+1524;
    $C = $this->$trunc(($B-122.1)/365.25);
    $D = $this->$trunc(365.25*$C);
    $E = $this->trunc(($B-$D)/30.6001);
    $this->TAG = $this->trunc($B-$D-$this->trunc(30.6001*$E));
    if($E<13.5)
      $this->MONAT = $this->trunc($E-1);
    else
      $this->MONAT = $this->trunc($E-13);
    if($this->MONAT >= 3)
      $this->JAHR = $this->trunc($C-4716);
    else
      $this->JAHR = $this->trunc($C-4715);
  }

  function JJDATE (){
    $Z1 = $this->JJD+0.5;
    $Z = $this->trunc($Z1);
    if($Z<2299161) 
      $A = $Z;
    else {
      $ALPHA = $this->trunc(($Z-1867216.25)/36524.25);
      $A = $Z+1+$ALPHA-$this->trunc($ALPHA/4);}
    $B = $A+1524;
    $C = $this->trunc(($B-122.1)/365.25);
    $D = $this->trunc(365.25*$C);
    $E = $this->trunc(($B-$D)/30.6001);
    $this->TAG = $this->trunc($B-$D-$this->trunc(30.6001*$E));
    if($E<13.5)
      $this->MONAT = $this->trunc($E-1);
    else
      $this->MONAT = $this->trunc($E-13);
    if($this->MONAT >= 3)
      $this->JAHR = $this->trunc($C-4716);
    else
      $this->JAHR = $this->trunc($C-4715);
  }

  function affsai($n) {
    $nomsai = Array("spring","summer", "autumn", "winter");
    $FDJ = ($this->JJD+0.5E0)-floor($this->JJD + 0.5E0);
    $HH = floor($FDJ*24);
    $FDJ-=$HH/24.0;
    $MM = floor($FDJ*1440);
    $temp = date_default_timezone_get();
    date_default_timezone_set("UTC");
    $this->JZ[$nomsai[$n]] = mktime($HH,$MM,0,$this->MONAT,$this->TAG,$this->JAHR);
    date_default_timezone_set($temp);
  }

  function saison($YY) {  
    $CODE1 = $YY;
    $nline = 1;
    $k = $YY-2000-1;
    for($n=0;$n<8;$n++) {
      $nn = $n%4;
      $dk = $k+0.25E0*$n;
      $T = 0.21451814e0+0.99997862442e0*$dk
          +0.00642125e0*sin( 1.580244e0+0.0001621008e0*$dk)                              
          +0.00310650e0*sin( 4.143931e0+6.2829005032e0*$dk)                              
          +0.00190024e0*sin( 5.604775e0+6.2829478479e0*$dk)                              
          +0.00178801e0*sin( 3.987335e0+6.2828291282e0*$dk)                              
          +0.00004981e0*sin( 1.507976e0+6.2831099520e0*$dk)                              
          +0.00006264e0*sin( 5.723365e0+6.2830626030e0*$dk)                              
          +0.00006262e0*sin( 5.702396e0+6.2827383999e0*$dk)                              
          +0.00003833e0*sin( 7.166906e0+6.2827857489e0*$dk)                              
          +0.00003616e0*sin( 5.581750e0+6.2829912245e0*$dk)                              
          +0.00003597e0*sin( 5.591081e0+6.2826670315e0*$dk)                              
          +0.00003744e0*sin( 4.3918e0  +12.56578830e0 *$dk)                                
          +0.00001827e0*sin( 8.3129e0  +12.56582984e0 *$dk)                                
          +0.00003482e0*sin( 8.1219e0  +12.56572963e0 *$dk)                                
          -0.00001327e0*sin(-2.1076e0  +0.33756278e0  *$dk)                                
          -0.00000557e0*sin( 5.549e0   +5.7532620e0   *$dk)                                 
          +0.00000537e0*sin( 1.255e0   +0.0033930e0   *$dk)                                 
          +0.00000486e0*sin(19.268e0   +77.7121103e0  *$dk)                                 
          -0.00000426e0*sin( 7.675e0   +7.8602511e0   *$dk)                                 
          -0.00000385e0*sin( 2.911e0   +0.0005412e0   *$dk)                                 
          -0.00000372e0*sin( 2.266e0   +3.9301258e0   *$dk)                                 
          -0.00000210e0*sin( 4.785e0   +11.5065238e0  *$dk)                                 
          +0.00000190e0*sin( 6.158e0   +1.5774000e0   *$dk)                                 
          +0.00000204e0*sin( 0.582e0   +0.5296557e0   *$dk)                                 
          -0.00000157e0*sin( 1.782e0   +5.8848012e0   *$dk)                                 
          +0.00000137e0*sin(-4.265e0   +0.3980615e0   *$dk)                                 
          -0.00000124e0*sin( 3.871e0   +5.2236573e0   *$dk)                                 
          +0.00000119e0*sin( 2.145e0   +5.5075293e0   *$dk)                                 
          +0.00000144e0*sin( 0.476e0   +0.0261074e0   *$dk)                                 
          +0.00000038e0*sin( 6.45e0    +18.848689e0   *$dk)                                  
          +0.00000078e0*sin( 2.80e0    +0.775638e0    *$dk)                                  
          -0.00000051e0*sin( 3.67e0    +11.790375e0   *$dk)                                  
          +0.00000045e0*sin(-5.79e0    +0.796122e0    *$dk)                                  
          +0.00000024e0*sin( 5.61e0    +0.213214e0    *$dk)                                  
          +0.00000043e0*sin( 7.39e0    +10.976868e0   *$dk)                                  
          -0.00000038e0*sin( 3.10e0    +5.486739e0    *$dk)                                  
          -0.00000033e0*sin( 0.64e0    +2.544339e0    *$dk)                                  
          +0.00000033e0*sin(-4.78e0    +5.573024e0    *$dk)                                  
          -0.00000032e0*sin( 5.33e0    +6.069644e0    *$dk)                                  
          -0.00000021e0*sin( 2.65e0    +0.020781e0    *$dk)                                  
          -0.00000021e0*sin( 5.61e0    +2.942400e0    *$dk)                                  
          +0.00000019e0*sin(-0.93e0    +0.000799e0    *$dk)                                  
          -0.00000016e0*sin( 3.22e0    +4.694014e0    *$dk)                                  
          +0.00000016e0*sin(-3.59e0    +0.006829e0    *$dk)                                  
          -0.00000016e0*sin( 1.96e0    +2.146279e0    *$dk)                                  
          -0.00000016e0*sin( 5.92e0    +15.720504e0   *$dk)                                  
          +0.00000115e0*sin(23.671e0   +83.9950108e0  *$dk)              
          +0.00000115e0*sin(17.845e0   +71.4292098e0  *$dk);
      $JJD = 2451545+$T*365.25e0;
      $D = $CODE1/100.0;
      $TETUJ = (32.23e0*($D-18.30e0)*($D-18.30e0)-15)/86400.e0;
      $JJD-=$TETUJ;
      $JJD+=0.0003472222e0;
      $this->JJD = $JJD;
      if($JJD<2299160.5e0)
        $this->JJDATEJ();
      else
        $this->JJDATE();
      if($this->JAHR == $CODE1)
        $this->affsai($nn);
    }
  return $this->JZ;
  }
}

PHP Kalender Teil 3, Zeitumstellung

8. Februar 2012 Keine Kommentare

Die aktuell gültige Regelung zur Zeitumstellung wird nach dem selben Prinzip wie die Feiertage berechnet. Seit 1996 gelten folgende Definitionen:

Beginn der Sommerzeit: letzter Sonntag im März
Ende der Sommerzeit: letzter Sonntag im Oktober

Die Termine sind in PHP nicht sonderlich schwer zu berechnen:

$sz_beginn = strtotime("last Sunday",mktime(0,0,0,4,1,$YY));
$sz_ende   = strtotime("last Sunday",mktime(0,0,0,11,1,$YY));

Möchte man aber auch die Termnie für die Zeitumstellung vor 1996 verwenden, so muss man eine Menge Sonderfälle berücksichtigen. Genaueres ist im entsprechenden Wiki-Artikel zu finden.