Archiv für November, 2009

Archive und der Staub

Thursday, 12. November 2009

Freundlicherweise bieten viele Hoster ihre Rootserver inklusive Backupspace an, meistens FTP. Sehr praktisch, denn so kann man beispielsweise nachts ein schönes Backup aller Datenbanken machen und die archivierten Backups auf den FTP-Server schieben. Wer dabei schonmal als Übertragungsmodus ASCII statt BINARY verwendet hat wird wissen wie wichtig es ist, auch immer gleich zu prüfen, ob ein Restore geht ;) Allerdings muss man sich trotz großzügigem Platzangebot auf den Backupservern auch mit der Frage beschäftigen, wie man dort nach gewisser Zeit wieder Platz schafft. Ich habe diese Frage etwas vor mir her geschoben und jetzt ist mein Backupserver gut gefüllt. Gut, dass auch hier das Netz wieder allerlei Sammlungen an Tipps und Befehlslisten vorhält, wie zum Beispiel auf der Seite von Moritz Schubel. Ich habe mich zuerst mit einem mdelete versucht, aber dabei muss man jede einzelne Löschung bestätigen. Die Lösung ist hier ein promt vorneweg zu schicken, das dann den interaktiven Modus beendet :)

Natürlich gibt es auch in der Rails-Community wieder fleißige Helferchen, die bereits Tasks zum Thema Datenbank-Backups erstellt haben. Craig Ambrose zum Beispiel zeigt in seinem Post A Rake Task for Database Backups eine Möglichkeit auf, insbesondere die vielen Kommentare zu seinem Post sind interessant.

Besonders ärgerlich bei meinem letzten Festplattencrash war auch, dass alle Daten aus meinem OpenLDAP einfach weg waren :( Dass man diese auch backupen sollte ist eigentlich das Logischste der Welt, aber ich glaube, dass man diese schmerzhafte Erfahrung einmal machen muss, dann vergisst man das nie wieder. Dabei ist das Sichern des Datenbestandes in einem LDAP-Verzeichnis denkbar einfach:

$ slapcat -l my_backup.ldif

Und auch das Restore ist kein Hexenwerk:

$ slapadd -l my_backup.ldif

Dann das ldif noch komprimieren und ab damit auf unseren Backupserver, per Cron natürlich, man ist ja schließlich vergesslich :D Das könnte dann im guten alten PHP ersmal in etwa so aussehen:

// Lokaler Teil
$dir_name = "ldap";

// In das Standard-Backupverzeichnis wechseln
chdir("/var/backups/".$dir_name);

$file_praefix = "ldap_backup_";
$file_suffix = ".ldif";

// Schritt 1: Daten in LDIF packen
shell_exec("slapcat -l ".$file_praefix.date('d_m_y_H').$file_suffix);

// Schritt 2: Das entstandene LDIF-File komprimieren
shell_exec("tar -czf ".$file_praefix.date('d_m_y_H').$file_suffix.".gz ".$file_praefix.date('d_m_y_H').$file_suffix." 2> /dev/null");

// Schritt 3: Das unkomprimierte LDIF-File loeschen
shell_exec("rm ".$file_praefix.date('d_m_y_H').$file_suffix);

// Alle Archive lokal loeschen, die aelter als 7 Tage sind
deleteOldGz(7);

// Remote Teil
// Alle Backups nun auf den FTP-Server schieben
$connection_id = ftp_connect($ftp_server, $ftp_port);
$login_result = ftp_login($connection_id, $ftp_benutzername, $ftp_passwort);

// In das LDAP-Verzeichnis wechseln
ftp_chdir($connection_id, $dir_name);

// Auf dem FTP-Server werden in der Schleife alle Backups geloescht, die aelter als 30 Tage sind.
// Erst alle Dateien vom Server holen
$alle_dateien = ftp_nlist($connection_id, '.');

$zieldatei = $lokale_datei = $file_praefix.date('d_m_y_H').$file_suffix.".gz";
$upload = ftp_put($connection_id, $zieldatei, $lokale_datei, FTP_BINARY);

// Alle alten Archive dieser Datenbank auf dem FTP-Server loeschen
$suche = $file_praefix.date('d_m_y_H', time() - 30 * 86400).$file_suffix.".gz";

// Wenn eine Datei entsprechend dem Suchstring im Array vorhanden ist, diese loeschen
if(in_array($suche, $alle_dateien))
ftp_delete($connection_id, $suche);

ftp_quit($connection_id);

Die Geschichte mit den 1000 Passwörtern

Tuesday, 10. November 2009

Ihr kennt das sicherlich, wir haben im Netz und lokal und in der Firma 5.012.454 Accounts zu irgendwelchen tollen Applikationen, die alle einen schönen Benutzernamen und ein entsetzlich geheimes Passwort brauchen. Sofern ihr extrem cool seid, habt ihr eine Regel, nach der ihr generisch euer Passwort zusammenbaut, das selbe Passwort immer zu nutzen ist ja uncool, ne? Ich bin uncool. Aber dagegen kann man etwas tun: ein LDAP. Die meisten modernen Anwendungen unterstützen Gott sei Dank die Authentifizierung gegenüber einem LDAP, so auch das gestern installierte Retrospectiva. Eine einfache Anleitung für Retro hat Dimitrij Denissenko im Retrospectiva Wiki zusammengefasst. Falls ihr bis dato noch kein GIT auf eurem Server habt, das braucht es, also installieren bitte. Bei Ubuntu geht das wie immer supereinfach via apt-get install git-core.

Fat Free CRM

Tuesday, 10. November 2009

Ein gutes Unternehmen kommt ohne ein brauchbares Customer-Relationship-Management (CRM) Werkzeug kaum noch aus. Doch gerade junge Unternehmen haben in den seltensten Fällen soviele Euros übrig, dass ein kommerzielles CRM einfach so im Budget drin wäre. Gott sei Dank gibt es hier auch fleißige Entwickler wie etwa Michael Dvorkin, der mit seinem Fat Free CRM eine Opensource-Variante eines CRMs liefert, die noch dazu aus meiner Sicht sehr viel taugt. Fat Free CRM ist eine weitere Railsapplikation, die dementsprechend schnell aufgesetzt ist. Allerdings bin ich heute über die unterschiedlichen environments von Rails gestolpert, indem ich die ganze Zeit

rake db:create

genutzt habe anstatt

rake db:create RAILS_ENV='production'

Da der Mongrelcluster die Produktivumgebung von Rails anspricht (environment: production) kann das natürlich nicht klapppen :) Also: denkt immer daran, in welcher Umgebung ihr gerade unterwegs seid :D!

!”§&/!”

Monday, 9. November 2009

Mann, mann, mann. Es wäre doch einfach mal superklasse, wenn sich alle Browser im Bezug auf CSS gleich verhalten würden. Heute habe ich zwei Stunden mit einer Tabelle gekämpft bis ich schließlich aufgegeben habe und die Inhalte über CSS sauber positioniert habe. Dabei habe ich gelernt, dass der IE8, der über einen Kompatibitätsmodus verfügt, serverseitig bereits dazu gezwungen werden kann, denn Kompatibilitätsmodus zu verwenden. Sprich der Benutzer muss nicht erst auf Kompatibilitätsmodus umschalten sondern bekommt das direkt so geliefert. Schön zusammengefasst ist das Thema im Weblog von Selfhtml. Was für ein.. :(

Retrospectiva, SVN und die Erweiterungen

Monday, 9. November 2009

Damit Retrospectiva als Rails-App auf ein Subversion-Repository zugreifen kann, benötigt es dazu noch die passenden Ruby-Libraries. Unter meinem Ubuntu geht das ratzefatze mit

apt-get install libsvn-ruby

Danach kann man auf der Interaktiven Ruby-Shell (IRB) überprüfen, ob die Installation geklappt hat

irb -rsvn/client

Im Wiki von Retrospectiva sind alle Schritte nochmals zusammengefasst.

Dann wollten wir ja schließlich Scrummen, dazu braucht es noch ein paar Erweiterungen für Retrospectiva:

1. Die AgilePM-Erweiterung
2. Die RetroWiki-Erweiterung
3. Die RetroBlog-Erweiterung

Hierzu muss man einfach in das Verzeichnis von Retrospectiva springen und nacheinander die Erweiterungen installieren:


$ RAILS_ENV=production script/rxm install agile_pm
$ RAILS_ENV=production script/rxm install retro_wiki
$ RAILS_ENV=production script/rxm install retro_blog

Webserver (Achtung: natürlich den Mongrel, nicht den Apachen ;)) neustarten und fertig :) Alle Erweiterungen findet man im Wiki von Retrospectiva

Ferner nutzt Retrospectiva Tasks und eine Mail-Queue, sodass zusätzlich noch ein Cronjob eingerichtet werden muss. Dimitrij beschreibt in seinem Blog was genau zu tun ist.

Cluster, cluster, starte dich

Monday, 9. November 2009

Die Kombination Apache + ein Mongrel-Cluster hintendran hilft in Punkto Skalierbarkeit von Rails-Applikationen schnell und effektiv weiter. Die Frage ist nur, wie und wo läuft welche Konfiguration und wo muss ich die nochmals starten? Ich habe mir hier jetzt ersteinmal das Folgende angewöhnt, bis ich wieder etwas besseres kennenlerne :):

1. Jede Rails-Applikation bekommt ihren eigenen Mongrel-Cluster. Die Konfiguration dazu liegt einfach im Config-Verzeichnis der Rails-Applikation, also z.B. sowas wie /var/webapps/mywebapp/config und dort dann als mongrel_cluster.yml. In diesem YAML-File steht dann die Konfig des Clusters, also z.B.

cwd: /var/webapps/mywebapp
log_file: log/mongrel_mywebapp.log
port: 4000
environment: production
pid_file: log/mongrel_mywebapp.pid
servers: 3
address: 127.0.0.1

In diesem Fall werden also 3 Server auf Port 4000 – 4002 konfiguriert.

2. Dann muss man dem Apachen als Türsteher noch den neuen Cluster bekannt machen. In meiner Umgebung gebe ich ihm diese Information durch einen Eintrag im conf.d-Verzeichnis und nenne das Ganze proxy_mywebapp.conf mit folgendem Inhalt

<Proxy balancer://mywebapp_cluster>
BalancerMember http://localhost:4000
BalancerMember http://localhost:4001
BalancerMember http://localhost:4002
</Proxy>

3. In der Config des Virtual Hosts spreche ich dann diesen Proxy an durch

# Redirect all non-static requests to cluster
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
RewriteRule ^/(.*)$ balancer://mywebapp_cluster%{REQUEST_URI} [P,QSA,L]

4. Damit ich bei einem Neustart eines Clusters nicht jedes Mal bis in die ganzen Unterverzeichnisse absteigen muss, liegen alle Cluster-Konfigs als Symlink nochmals in /etc/mongrel_cluster. Das Starten und Stoppen eines Clusters geht damit recht einfach durch

mongrel_rails cluster::start -C mywebapp_cluster.yml

5. SSL-Support nicht vergessen, wie in einem früheren Artikel hier in der Schmiede beschrieben.

6. Um nun alle Mongrel-Cluster beim neustarten des Rootservers ebenfalls zu starten, kann man noch das Init-Skript des Clusters nutzen. Wie das geht beschreibt Austin Godber auf seiner Wiki-Seite bei Rubyforge Using Mongrel Custer.

Retrospectiva – Rails meets Scrum

Monday, 9. November 2009

Wenn ich eines die vergangenen Jahre gelernt habe: ein vernünftiges Projektmanagement gepaart mit einem lebbaren Software-Entwicklungsprozess ist die halbe Miete. Artur hat am Wochenende ein OpenSource-Werkzeug namens Retrospectiva ausgegraben, das selbst eine RailsApp ist und als Software-Entwicklungsprozess Scrum vorsieht. Wir werden dieses Tool die kommenden Tage einmal antesten, was es kann und ob es unseren Anforderungen gerecht wird :)

bgf 2009

Sunday, 8. November 2009

Zum ersten Mal waren wir von Second Home auch am Browser Game Forum anwesend und ich muss sagen, mir hat das Forum sehr viel gebracht. Viele der Vorträge haben mich darin bestätigt, dass das, was wir schon seit 2003 bei Second Home machen, eigentlich genau das Richtige ist und wir auch bei Irenia viele Dinge so weiterführen können. Es hat mich auch sehr beruhigt zu hören, dass die Kollegen die gleichen Probleme wie wir haben, Cheater im Spiel eindeutig zu identifizieren und diese gerecht zu bestrafen. Hier habe ich allerdings ein paar neue Anregunden mitgenommen, auf die ich in Kürze näher eingehen werde. Das Wichtigste aber was ich mitgenommen habe, sind viele neue Kontakte, die man in so einer schnell wachsenden Branche einfach braucht und die Bestätigung, dass wir mit Volldampf an Irenia weiterarbeiten sollten. In diesem Sinne mach ich mich mal wieder an das Werk ;-)

Schaufenster neu dekoriert!

Friday, 6. November 2009

Da wir unserer geneigten Leserschaft in dieser Schmiede immer die aktuellsten Entwicklungen in Aramoon mitteilen möchten, haben Artur und ich die Schmiede heute auf Vordermann gebracht. Wir hoffen, der neue Style gefällt euch :) Hinweise über Fehler oder neue Anregungen nehmen wir gerne entgegen :D

Drag’n'Drop Babe!

Wednesday, 4. November 2009

Kennt ihr das auch aus vielen Browsergames? Millionen von Listen, Tabellen und Knöpfen, die Spielspaß nicht wirklich aufkommen lassen. Dank den heutigen Javascript-Bibliotheken geht das schicker, bunter, toller. Klar, man muss sich zuerst mal dran gewöhnen, dass Gebäude in einem Spiel nicht mehr per Klick auf “bau mich” gebaut werden, sondern dass man das Gebäude einfach an die stelle “wirft” wo man es bauen will. Auch mit den Karten ist das so ne Sache. Google macht es uns mit seinen Maps vor wie komfortabel die Bedienung sein kann, aber auch die Kollegen von The West haben eine Karte implementiert, deren Benutzerfreundlichkeit meiner Meinung nach super gelungen ist. Die ganze Benutzerfreundlichkeit des Web2.0 mit Rails umzusetzen ist – wer hätte es gedacht – ein Kinderspiel. Wers nachlesen möchte, Brian Leonard hat ein schönes, kurzes Tutorial zu Drag’n'Drop in Rails veröffentlicht. Andernfalls kann ich Kapitel 5.3 im Buch Web 2.0 mit Ruby on Rails von Bettina Stracke empfehlen. Zwei bis drei Tassen Kaffee, dann dropt’s auch bei euch :)