Webkürzel unter FireFox

Donnerstag, 20. März 2008
Ich versuche, seit einiger Zeit auf FireFox umzusteigen. Momentan nutze ich oft noch den Konqueror, der startet subjektiv schneller und hat zusätzlich noch ein Feature "Webkürzel", das ich genial finde. Mit Webkürzeln kann man in der Adresszeile eine bestimmte Webseite als Kürzel wählen und ihr ein Suchwort übergeben, also z.B. die Eingabe von gg: open-medium [Enter] resultiert in eine Suche nach open-medium in Google.

Heute habe ich eine ähnliche Funktion im Firefox entdeckt, Keywords in Bookmarks und dabei kann mit %s das Wort übergeben. Man legt also ein Bookmark mit "http://www.google.de/search?hl=de&q=%s" an und trägt bei Keyword gg ein. Anschliessend kann man in die Adressezeile "gg open-medium" angeben und die Suche wird durchgeführt.

Buchempfehlung: Domain-Driven Design von Eric Evans

Sonntag, 3. Februar 2008
Heute starte ich mit einer neuen Reihe: Buchempfehlungen. Die Ehre, diese Reihe zu starten, hat ganz klar Domain-Driven Design von Eric Evans. Das Buch ist zwar auf Englisch, liest sich aber leicht und flüssig.

Vorallem ist es das Standardwerk für gutes Softwaredesign. Neben der software-technischen Seite widmet er auch ein ganzes Kapitel einer gemeinsamen Sprache (zwischen Entwickler, Fachabteilung, Kunden etc.) und weiterer Tipps für die sogenannte Soft-Skills.

Fröhliche Weihnachten!

Montag, 24. Dezember 2007
open-medium wünscht allen Kunden und Partnern ein frohes und besinnliches Weihnachtsfest.

OpenVPN unter OpenVZ

Donnerstag, 29. November 2007
Wie man an meinem vorigen Post sehen kann, beschäftige ich mich gerade mit VPNs. Ziel war es natürlich, das wir von zuhause auf die lokalen Daten zugreifen können. Nach anfänglichen Startschwierigkeiten mit einem Netgear Router und dessen IpSec Implementation, habe ich mich entschieden, wieder zu OpenVPN zu wechseln. Damit habe ich in der Vergangenheit gute Erfahrung gemacht und es ist im Gegensatz zu IpSec wirklcih einfach einzurichten.

Da wir auf unserem Firmenserver mit OpenVZ virtualisiert haben, sollte der OpenVPN Server ebenfalls als VPS darin laufen, und natürlich sollte man per VPN alle anderen Rechner (reale und virtualisierte) im Netz zugreifen können.

Die Erstellung von eine OpenVZ VPS und Zertifikaten erspare ich uns hier mal, dafür gibt es genug HowTos im Netz. Für das Erstellen von Zertifikaten empfehle ich easy-rsa. Sowohl Hostsystem als auch VPS laufen unter Ubuntu.

Vorbereitung: auf dem Router

Der Router muss den OpenVPN Port (in unserem Fall 1194) an die entsprechende VPS weiterleiten. Ich denke, das kann man heute bei allen Routern über die Verwaltungsoberfläche einstellen.

Schritt 1: auf dem Hostsystem muss noch ein weiteres IPTables Modul geladen werden.

# cat /etc/vz/vz.conf |grep IPTABLES
IPTABLES="ipt_REJECT ipt_tos ipt_limit ipt_multiport iptable_filter iptable_mangle ipt_TCPMSS ipt_tcpmss ipt_ttl ipt_length iptable_nat"

Schritt 2: auf dem VPS

# apt-get install openvpn
# echo 1 > /proc/sys/net/ipv4/ip_forward # falls noch nicht gesetzt
# mkdir -p /etc/openvpn/ssl # hier dann die Zertifikate kopieren, die unten benötigt werden
# vi /etc/openvpn/roadwarrior-server.conf
server 192.168.200.0 255.255.255.0 # Das VPN Netzwerk, kann ein freies privetes Netz sein
port 1194 # Auf Port 1194 horchen
proto tcp # Protokoll UDP, für TCP: proto tcp-server
dev tun # evtl. auch tap versuchen
tls-server
dh /etc/openvpn/ssl/dh2048.pem
ca /etc/openvpn/ssl/ca.crt
cert /etc/openvpn/ssl/server.crt
key /etc/openvpn/ssl/server.key
verb 3 # Zum Debugging erhöhen
mute 50 # Zum Debugging auskommentieren
push "route 192.168.0.0 255.255.255.0" # Die Route unseres internen Netzes
comp-lzo
user nobody
group nogroup
keepalive 10 60
ping-timer-rem
persist-key
persist-tun

Wenn man die anderen Rechner im Netz sehen möchte, müssen noch folgende IPTables Regeln gesetzt werden:

/sbin/iptables -A FORWARD -j ACCEPT -p all -s 0/0 -i tun0
/sbin/iptables -A FORWARD -j ACCEPT -p all -s 0/0 -o tun0
/sbin/iptables -t nat --flush
/sbin/iptables -t nat -A POSTROUTING -s ! 192.168.0.101 -o venet0 -j SNAT --to-source 192.168.0.101

Abschliessend kann man den OpenVPN Server starten.

/etc/init.d/openvpn start

Schritt 3: auf dem Clients

Hier muss ebenfalls OpenVPN installiert werden und die Konfigurationsdatei muss folgende Einträge beinhalten.

# mkdir -p /etc/openvpn/ssl # hier dann die Zertifikate kopieren, die unten benötigt werden
# vi /etc/openvpn/roadwarrior-client.conf
remote unsere.statische.ip.adresse
port 1194
proto tcp-client
dev tun
tls-client
pull
ca ssl/ca.crt # Hier muss dasselbe CA Zertifikat wie auf dem Server kopiert sein
cert ssl/client1-client.crt
key ssl/client1-client.key
nobind
comp-lzo
keepalive 5 15

/etc/init.d/openvpn start

Wenn alles OK ist, wird ein Device tun0 erstellt, und die entsprechenden Routen automatisch gesetzt. Ein

ping 192.168.0.101

sollte uns antworten. Andere Rechner im Netz sind dann entsprechend über 192.168.0.x zu erreichen. Bei Problemen empfehle ich die sehr gute FAQ von OpenVPN http://openvpn.net/faq.html.

Wikipedia: Openswan

Freitag, 16. November 2007
Habe gerade entdeckt, das in der deutschen Wikipedia kein Artikel über Openswan angelegt ist. Also habe ich einen erstellt:

http://de.wikipedia.org/wiki/Openswan

Telefonanlage geht wieder

Montag, 12. November 2007
wir sind allerdings mutig und haben "Rufumleitung im Amt" bei der Telekom bestellt. Kann also sein, das wir in Zukunft wieder ... nein ich will jetzt mal positiv denken. Alles wird gut.

Telefonanlage defekt

Dienstag, 6. November 2007
Seit Sonntag ist unsere Telefonanlage defekt :-( Daher hört man auch immer ein Besetztzeichen, wenn man anruft. Die Ferndiagnose mit dem Techniker unseres Vertrauens deutet auf ein defektes Netzteil. Schauen wir mal...

Löschung von Datensätzen: das gute alte Löschkennzeichen

Sonntag, 14. Oktober 2007
Bei allen Projekten stehe ich vor dem selben Problem: das Löschen von
Datensätzen. Da ich in der Datenbank Foreign Keys benutze, ist das manchmal garnicht so einfach.

Beispiel: wir haben eine Mitarbeitertabelle, und da der Login über die E-Mailadresse erfolgt, ist ein Unique Key auf der E-Mailadresse. Da Mitarbeiter aber auch Datensätze anlegen (und man dies gerne nachhalten möchte), wird die Mitarbeiter ID in anderen Tabellen mitgespeichert.

Wir können also dann Mitarbeiter nicht löschen, die dann bereits in anderen Datensätzen gespeichert wurden.

In so einem Fall kan man getrost das relationale Modell ein bisschen ausser Acht lassen und bei den anderen Datensätzen nicht die Mitarbeiter ID speichern, sondern bsp. den Vor- und Nachnamen, denn hier kommt aus auf die sichtbare Information an, wer den Datensatz "zu verantworten" hat.

Schwieriger wird es, wenn man eine Relation zu dem gelöschten Datensatz behalten muss, bsp. ein Artikel in einem Onlineshop. Hier kann man nicht einfach den Artikel löschen, denn diese muss natürlich weiterhin in der Statistik auftauchen.

Hierzu eignet sich dann ein Löschkennzeichen, das dann den Artikel als gelöscht markiert und in den wichtigsten Masken nicht mehr auftauchen lässt. Man muss dann entsprechend den Unique Key auf Artikel ID und Löschkennzeichen setzen.

Hierbei muss man übrigens beachten, daß das Löschkennzeichen nicht einfach ein boolean sein kann, denn dann kann man jeden Artikel nur einmal löschen. Vielmehr bietet sich an, das Löschkennzeichen als int abzubilden, und jedesmal, wenn man einen Artikel löscht, wird das Löschkennzeichen um eins erhöht.

Diese Logik ist auch bekannt als "Frackiewicz Notation".

Star Wars auf Kölsch

Mittwoch, 10. Oktober 2007
Wir hier in Düsseldorf mögen die Kölner. Besonders die lustige Sprache ;-)

Inek Framework 0.7 veröffentlicht

Mittwoch, 3. Oktober 2007
Heute habe ich das Inek Framework 0.7 veröffentlicht. Die Version wurde um das Page Object erweitert, siehe auch den hier unten stehenden Artikel.

http://wwwkit.opensourcebox.de/index.php/Inek_Framework

Eine genaue Beschreibung zu dem Page Object reiche ich noch nach - ich muss erstmal ein paar Beispiele raussuchen. Aber es lohnt sich!

Die CMS Bibliothek

Montag, 1. Oktober 2007
Gestern habe ich mich entschlossen, Inek Framework um meine "Page Object" Klasse zu erweitern, eine Art Framework für das Programmieren eines Content-Management Systems (CMS). Ursprünglich war Inek dafür gedacht, nur MVC abzubilden, aber ich füge immer wieder gerne Funktionen dazu, die man so im täglichen Web-Entwickler Leben braucht. Dabei ist auch das "Page Object" entstanden.

Das Page Object ist eine Klasse, die eine Web-Seite abbilden soll: eine Webseite besteht aus Spalten, die untereinander Inhalte haben. Sowohl die Spalten kann man sortieren als auch die Inhalte, man kann Inhalte zeitlich steuern und mit einer Up / Down Funktion versehen, also sortieren. Jeder Inhalt besteht aus einem PHP Interface, das man überschreiben muss, insgesamt muss man nur zwei Methoden implementieren. Die Inhalte kann man in XML speichern, sodass man alles mögliche darin integrieren kann. Und das beste daran ist die Zugriffsmethode: das ganze Page Object hat nur ein DAO (momentan in MySQL und Postgres), das für die komplette Speicherung der Seite verantwortlich ist.

Klingt jetzt alles sehr abstrakt, also ein Beispiel aus meinem Leben:


// man holt sich eine bestehende Seite
$page = $this->dao->get($pageId);
// hier holt man sich eine bestimmte Box (= Spalte)
$box = $page->getBox((int) $form->getValue('boxId'));
// hier erstellt man einen neuen Inhalt (Textelement)
$e = new ImageElement();
$e->setReleased(true);
$e->setText("Text");
// hier wird das Element in die Spalte eingefügt
$box->addElement($e);
// die Seite wird gespeichert
$page = $this->dao->save($page);


Insgesamt eine unheimlich schlanke Bibliothek, die einem das tägliche Entwicklerleben vereinfacht, wenn man ein kleines CMS irgendwo integrieren soll.

Servermonitoring für Arme

Dienstag, 18. September 2007
Ein Tipp für alle, die einen Linux Server ihr eigen nennen. Wichtige Meldungen spuckt der Kernel auf dem "kernel ring buffer" aus, was man unter anderem mit dmesg auf der Konsole abfragen kann. Diese lasse ich mir automatisch per E-Mail schicken, da es doch meist sehr wichtige Meldungen sind.

Einfach in die crontab eintragen:


# m h dom mon dow user command
15 root /bin/dmesg -c


Erste Schritte mit dem Zend Framework

Freitag, 14. September 2007
Vor zwei Jahren habe ich, mangels eines guten MVC Frameworks für PHP ein eigenes programmiert, dass der eine oder andere vielleicht als Inek Framework kennt. Absolut wichtig für mich war es, das es eben nicht das Rad neu erfindet, sondern sich auf viele bestehende Komponenten stützt, die eine Art Standard darstellen (PEAR). Was daraus geworden ist, wissen wir ja leider: PEAR heisst Beta Software, schlechte Dokumentation und wird leider größtenteils ignoriert.

Licht am Ende des Tunnels bringt das Zend Framework, das aus losen Komponenten besteht, die man immer wieder benötigt wie MVC, Logging, Email, Services und so weiter. Heute habe ich erste Schritte mit dem Framework gemacht und es gefällt mir gut. Die Dokumentantion ist erstklassig. Leider fehlt noch ein Buch.

Ein gutes deutsches Tutorial findet Ihr unter:

http://www.ralfeggert.de/2006/08/26/einfuehrung-und-anforderungen/

Das wurde zwar für eine etwas ältere Version des ZF geschrieben, man kann es aber gut verfolgen und nach einem kurzen Blick in die Doku korrigieren, denn die API zu ZF 1.0 hat sich an kleineren Stellen geändert.


DSL: Peinlich peinlich

Dienstag, 11. September 2007
Jaja, das sind die Semiprofis. Ich hatte ja bereits schon gesagt, das unser DSL nicht geht. Ich habe eine Störung rausgegeben, die dann zügig heute von der Telekom bearbeitet wurde, und es kam dann auch ein Techniker.

Es stellte sich heraus, daß der Router, den ich gekauft habe, kein eingebautes Modem besitzt. Meine Güte, war mir das peinlich!

Telefon geht, DSL nicht

Samstag, 8. September 2007
Gestern haben wir den halben Tag die Telefonanlage aufgebaut, und obwohl der Kasten sehr komplex ist, funktioniert es irgendwie.




Damit steht unser Telefon (0211 / 828 076 - 0), aber leider geht das DSL noch nicht.