coder::by(♥); wünscht einen entspannten Januar

January 1st, 2012 — 8:52pm by

Meinen Freunden, Kunden und Kollegen wünsche ich viel Erfolg im Jahr 2012!

Damit der Januar nicht genau so stressig beginnt, wie der Dezember geendet hat, gibt es als kleines Geschenk für deinen Desktop ein (hoffentlich) entspannenden Desktop-Hintergrund:

coder::by(♥); Januar 2012 Desktophintergrund

Für jede Auflösung gibt es ein speziell angepasste Version:

1 comment » | Uncategorized

WordPress-Quellcode als Store-Dekoration

December 28th, 2011 — 12:18pm by

WordPress Code Sankthorst

Der Sankthorst-Concept-Store in der Zeilgalerie in Frankfurt verwendet als Dekoration an seinen Schaufenstern und Aufzügen Auszüge aus dem Quellcode von WordPress. Zu sehen ist das auch auf den Grafiken der Internetseite.

Es läuft einem schon kalt den Rücken herunter, wenn man dieses negativ-Beispiel für PHP-Quellcode, in riesigen Lettern tapeziert sieht.

Fotos von der Dekoration finden sich hier.

Comment » | Kurioses

Logrotate-Config für VHosts automatisch erstellen

December 11th, 2011 — 5:10pm by

Mit diesem Script erzeuge ich für alle Virtuellen-Hosts eines Apache2-Webservers eine Konfiguration für Logrotate.

Hierzu lese ich die VHost-Konfigurationen in /data/sites ein und parse daraus die Pfade zu den Logfiles.

Anschließend erzeuge ich mit Hilfe eines Templates die eigentliche Konfigurations-Datei im logrotate.d-Ordner.

logrotate-config.sh

#!/bin/bash

CONFDIR=/data/sites/
TEMPLATE=/data/sites/logrotate.conf.template
OUTFILE=/etc/logrotate.d/`hostname`-apache

echo "# DO NOT EDIT!" > $OUTFILE
echo "# automatically generated by $0 on `date`" >> $OUTFILE
echo "" >> $OUTFILE

for i in `cat $CONFDIR/*.conf | grep -i -E "(Transfer|Error|Custom)Log" | awk '{ print $2; }' | sort | uniq`
do
echo -n "$i " >> $OUTFILE
done;

echo $OUTFILE
cat $TEMPLATE >> $OUTFILE
cat $OUTFILE

/data/sites/logrotate.conf.template

{
missingok
notifempty
sharedscripts
postrotate
/etc/init.d/apache2 reload > /dev/null 2>&1 || true
endscript
rotate 9999999
}

Comment » | Snippets

Entwickler und Projektmanager

November 24th, 2011 — 1:46pm by

Entwickler und ProjektmanagerDiese zwei Kollegen stehen immer auf meinem Schreibtisch bei meinem aktuellen Arbeitgeber. Vor ein paar Monaten standen sie bei Scholz&Volkmer und als ich mit einem Kollegen darüber sprach, ist ein interessantes Bildnis entstanden.

Der Große (der Marine aus dem Computerspiel “Quake II”) ist ein Entwickler: ziemlich grobschlächtig mit dem Hang zu schnellen einfachen Lösungen, aber halt für die dreckige Aufgabe des codens bestens geeignet — die Waffe benutzt er um Bugs zu töten.

Aber ohne den Projektmanager davor ist der Entwickler aufgeschmissen. Mit seiner Lampe sucht und findet der Projektmanager Bugs und weißt dem Entwickler den Weg durch den Projektdschungel. Die Schutzausrüstung braucht er dabei vor allem im Umgang mit dem Kunden — das kann nämlich manchmal sehr giftig werden.

Wichtig dabei ist aber, dass beide nur gut als Team funktionieren können, weil sie sich so gut ergänzen — arbeiten sie nicht zusammen, oder sogar gegeneinander, wird die Arbeit am Projekt viel schwieriger als nötig.

Comment » | Kurioses

Die Browserkompatibilitätsklausel

October 9th, 2011 — 1:02pm by

Wenn man in der glücklichen Situation ist, ein Angebot zu schreiben, ist dessen Basis in der Regel auch eine möglichst genaue Beschreibung über den Umfang des Auftrags, im Allgemeinen Pflichtenheft genannt.

Die Ausformulierung ist dabei entscheidend um im Fall von Meinungsverschiedenheiten klar bestimmen zu können, welche Partei Recht hat. Speziell bei Software kann aber die Beschreibung von Funktionen oft nicht exakt erfolgen — läuft die Software in einem vorher nicht genau bekannten Umfeld trifft man unweigerlich auf dieses Problem.

Die Regel ist das bei Anwendungen, die im Webbrowser dargestellt werden. Die Vielzahl existierender Browser und Platformen macht es praktisch unmöglich, die exakte Darstellung in verschiedenen Browsern zu garantieren. Dieser Umstand ist allgemein akzeptiert und inzwischen existiert das Bewußtsein dafür auch auf Kundenseite.

Wie aber formuliert man solche “Ungenauigkeiten” möglichst genau?

Den folgenden Absatz verwende ich in Pflichtenheften.

Browser-Unterstützung

Unterstützt werden:

  • Internet-Explorer 7-9
  • Firefox 3.6-6
  • Safari 5

Browser-Unterstützung, der aufgelisteten Browser und Versionen, bedeutet, dass die volle Funktionalität der Anwendung in diesen Browsern gewährleistet ist. Eine pixelgenaue, identische Darstellung in allen Browsern und unter allen Plattformen kann nicht gewährleistet werden, jedoch wird eine, im Sinne der Gestaltung und aus Sicht des Benutzers, fehlerfreie Darstellung angestrebt.

Eine Plattform ist ein Computer, Smartphone, Spielekonsole etc.

Die Wahl der Browser und Versionen ist dabei natürlich an das jeweilige Projekt angepasst. Als Faustregel sollte man die Browserversionen unterstützen, die in den Webserverstatistiken der Website (falls vorhanden) von mehr als 3% der Besucher verwendet werden — eine Ausnahme ist hier der IE6, eine Unterstützung für diesen Browser sollte in der Aufwandsschätzung für die Umsetzung in HTML und JS mit einem Aufschlag von 30% berücksichtigt werden.

Wichtig ist noch, dass man auf keinen Fall eine Aufwärtskompatibilität garantieren darf, z.B. mit Formulierungen wie “IE 9+”, dies führt zu unkalkulierbaren Aufwänden, und der Kunde hat den Eindruck, dass seine Website auch noch in 10 Jahren einwandfrei funktionieren wird.

Comment » | Technik

Default-Werte für Methoden-Argumente sollten null sein

August 4th, 2011 — 9:37pm by

Oft genug sieht man Methodendefinitionen mit Standardwerten für Argumente, da viele Programmiersprachen das Überladen von Methoden, wie z.B. in Java, nicht unterstützen.

Ein einfaches Beispiel einer Methode mit zwei optionalen Argumenten:
function connect($host, $port = 1234, $timeout = 60) { ... }

Möchte man nun diese Methode verwenden, und den letzten der beiden Parameter überschreiben, ist man gezwungen, auch den zweiten an zu geben,
connect('server', 1234, 10);

Eigentlich meint man aber
connect('server', {default}, 10);

Und genau hier liegt das Problem: das Übernehmen des Standardwertes aus der Definition führt dazu, dass bei einer Änderung des Standardwertes sich diese Änderung nicht auf den Teil des Codes auswirkt, in dem die Methode aufgerufen wird — obwohl das eigentlich das Verhalten ist, dass der Verwender erwartet hätte.

Deswegen sollten Standardwerte immer mit null definiert werden:
function connect($host, $port = null, $timeout = null) {
    if ($port === null) $port = 1234;
    if ($timeout === null) $timeout = 10;
    ...
}

So muss der Aufrufer Standardwerten nur Beachtung schenken, wenn er sie explizit überschreiben will. Ansonsten kann er einfach null übergeben:
connect('server', null, 10);

Übrigens hat Python, in dem das Überladen von Methoden nicht unterstützt wird, eine clevere Lösung dafür: beim Aufrufen einer Methode kann man die Argumente explizit mit ihrem Namen ansprechen.

1 comment » | Technik

Auszeichnung zum Top Coder erhalten

August 4th, 2011 — 8:00am by

Markus Tacker, Gewinner beim Top Coder Gewinnspiel der Mayflower GmbHBeim Top Coder Gewinnspiel der Mayflower GmbH habe ich mit meiner Einreichung den ersten Preis gewonnen: ein iPad 2.

Für das Gewinnspiel mussten drei Aufgaben erfüllt werden:

  1. Gesucht wurde ein SQL-Query mit dem die Anzahl der P und H in einem String ermittelt werden kann.
  2. Gesucht wurde eine Funktion, die aus einem gegebenen String durch vertauschen, hinzufügen und entfernen von Zeichen den Namen einer PHP-Funktion ermittelt.
  3. Gesucht wurde die Größe eines MySQL-Indexes, wenn statt Bytes Trytes verwendet werden.

Comment » | Kurioses

Hübsche Dummy-Bilder erzeugen

July 11th, 2011 — 5:12pm by

Der Dummy-Image-Generator erzeugt auf Wunsch die passenden Bilder. Wenn man aber auch mal lokal ein paar Dateien braucht, um z.B. einen Uploader oder eine Galerie zu testen, kann man sich mit ein paar Zeilen Python schnell ein paar Testbilder erzeugen:

from itertools import cycle
from urllib.request import urlretrieve

words = cycle("Lorem ipsum dolor sit amet consectetur adipiscing elit Etiam
sit amet tortor velit id consectetur ipsum Morbi id nulla diam sit amet".split(" "))

colors = cycle(["1b9e77","d95f02","7570b3","e7298a",
"66a61e","e6ab02","a6761d","666666","a6cee3","1f78b4",
"b2df8a","33a02c","fb9a99","e31a1c","fdbf6f","ff7f0",
"cab2d6","6a3d9a","ffff99","b15928"])

for i in range(10):
    word = next(words)
    url = "http://dummyimage.com/1280x1024/%s/000000.jpg&text=%s"
        % (next(colors), word)
    print(urlretrieve(url, "%s.jpg" % word))

Comment » | Snippets

PyDev und PIL

May 23rd, 2011 — 8:18pm by

PyDev meckert standardmäßig über ein

from PIL import Image

da es die Bibliothek nicht finden kann.

Dieser FAQ-Eintrag hilft da ein wenig weiter.

In den Einstellungen findet sich uner PyDev ➜ Interpreter – Python der Reiter Forced Builtins unter dem man mittels New den Eintrag PIL einträgt.

Comment » | Technik

MacBook Funktionstasten unter Linux

April 13th, 2011 — 11:38am by

Diese sind, zumindest unter Arch Linux, standardmäßig nur mittels FN+F<1..12> zum auslösen zu bewegen.

Dieser Eintrag in der /etc/modprobe.d/modprobe.conf behebt das Problem:

options hid_apple fnmode=2

Comment » | Technik

Back to top