Tag-Archiv für 'ruby'

05
Jun

Capistrano Multistage synchronisation

Für das Deployment des Radiant CMS verwende ich schon seit längerem Capistrano und bin auch sehr zufrieden damit. Nachdem nun auch schon einige Seiten damit produktiv sind, bin ich immer häufiger über die gleiche Aufgabe gestolpert wenn eine Weiterentwicklung anstand:

  1. Produktive Datenbank dumpen
  2. Dump und Assets auf die lokale Maschine kopieren
  3. Datenbankdump einlesen
  4. Entwickeln
  5. Lokale Datenbank dumpen
  6. Dump und Assets auf die Stagingumgebung kopieren
  7. Datenbank einlesen
  8. Kunden informieren
  9. Datenbankdump und Assets auf die Produktivumgebung kopieren
  10. Datenbankdump einlesen

Uff… jedes Mail ziemlich viel repetitive Arbeit. Da ich minimalistisch veranlagt bin, habe ich natürlich eine Lösung gesucht um mich wieder auf die wesentlichen Dinge konzentrieren zu können. Dabei rausgekommen ist mein…

Capistrano Sync Rezept

Installation

Für die Installation muss man das Rezept einfach nach lib/recipes in die Ruby on Rails Applikation kopieren und in das Capfile folgende Zeile einfügen:


Dir['lib/recipes/*.rb'].each { |receipe| load(receipe) }

Konfiguration

In der Deploykonfiguration config/deploy.rb können nun zwei Einstellungen vorgenommen werden:


set :sync_directories, %w(assets)
set :sync_backups, 3

Mit sync_directories werden die Verzeichnisse definiert, welche man zwischen den Umgebungen synchronisiert haben möchte - ‘assets’ ist dabei auch gleich die Defaulteinstellungund kann beliebig erweitern werden (z.B. mit ‘galleries’). sync_backups definiert die Anzahl der Backups welche auf dem System behalten werden, doch mehr dazu später.

Für den Zugriff auf die Datenbank liest das Rezept die lokale config/database.yml Datei, wesshalb dort dann auch die Zugriffsdaten der Datenbank aller Umgebungen eingetragen werden müssen. Dies ist ja kein Problem, da diese Datei sowieso schon im .gitignore eingetragen ist und nie eingecheckt wird, oder?

Für das Reibungslose deployment sollte man natürlich die Public-Key SSH Authentifizierung eingerichtet haben.

Sync!

Da in einer Multistageumgebung x Umgebungen vorhanden sein können, gibt es keine Kommandos für eine direkte Synchronisation zwischen den Umgebungen. Es muss immer via die lokale Entwicklungsumgebung synchronisiert werden.

Das zu Beginn beschriebene Synchronisationsszenario sieht nun mit dem Capistrano Rezept folgendermassen aus:

  1. cap production sync:down
  2. Entwickeln
  3. cap staging sync:up
  4. Kunden informieren
  5. cap production sync:up

Das ist also schon definitiv etwas schneller… Der Task sync:down ruft übrigens lediglich die beiden tasks sync:down:db und sync:down:fs auf. Es ist also mit diesen Tasks auch möglich, nur das Dateisystem oder die Datenbank zu synchronisieren, wie uns das Kommando ‘cap -T’ zeigt:


cap sync:down
cap sync:down:db
cap sync:down:fs
cap sync:setup
cap sync:up
cap sync:up:db
cap sync:up:fs

Abhängigkeiten

Das Rezept benötigt rsync für die Synchronisation der Dateien, damit nur immer die Differenz und nicht jedesmal alle Dateien synchronisiert werde. Auch wird der Datenbankdump mit mysqldump gemacht, wesshalb im Moment die Datenbanksynchronisation nur mit MySql läuft. Die Faulheit welche mit zum Schreiben des Rezeptes veranlasst hat, verhindert eben auch gleichzeitig die Entwicklung von Features welches ich selber im Moment nicht benötige ;-)

Backups

Da ich unter einer angeborenen Datenverlustsparanoia leide, musste natürlich auch ein Backupmechanismus her. Dazu wird das Verzeichnis ‘shared/sync‘ beim deploy:setup task automatisch angelegt. In diesem Verzeichnis werden nun die erzeugten Datenbankdumps abgelegt und beim Hochladen eines DB-Dumps wird vor dem Einlesen noch zusätzlich ein Dump auf der Umgebung erstellt bevor der hochgeladene Dump eingelesen wird.

Auch bei der Synchronisation von Verzeichnissen auf die Umgebung wird vorher ein Archiv erstellt und abgelegt - sicher ist sicher ;-)

Ein Task für ein Rollback existiert nicht - bei einem Fehler ist dann einfach Handarbeit angesagt.

Happy syncing!

03
Mrz

Ruby on Rails Entwickler gesucht

Wir suchen einen erfahrenen und motivierten Softwareentwickler mit hervorrangenden Programmierkenntnissen und viel Kreativität als Verstärkung für unser Entwicklungsteam. Du liebst die Kunstfertigkeit der Programmierung und hast den Ergeiz verständlichen Code zu schreiben und diesen optimalerweise durch stetige, testgetriebene Refaktorisierung zu pflegen.

Als Senior bist du auch für den Design von Datenbanken zuständig und hast fundierte Kenntnisse in SQL sowohl auch der objektorientierter Analyse und Design unter Anwendung von Entwurfsmustern. Die bist von agilen Methodiken begeistert und arbeitest gerne im Team und verbesserst konstant die Abläufe und Qualität der Arbeiten und hilfts deinen Kollegen bei der Paarprogrammierung oder durch einen Code Review.

Du solltest sehr gute Kenntnisse im Design von besonders benutzerfreundlichen Webseiten haben, welche mit Prototype, Scritaculous und JQuery zum Leben erweckt werden. Du legst Wert auf eine saubere Trennung von XHTML, CSS und JavaScript und beherrscht diese Techniken anstandslos. Falls notwendig werden Unklarheiten in der Bedienung in einen Usability-Test geklärt.

Du arbeitest selbstständig im gesamten Prozess mit: Von der Beratung über den Design bis hin zur Entwicklung und Wartung der Systeme. Die bist kommunikativ und hilfst bei der Leitung der Projekte mit und kannst auch Pflichtenhefte und Kostenschätzungen erstellen.

Wir verwenden hauptsächlich Ruby on Rails/Radiant und Flex um hochdynamische Webapplikationen zu entwickeln, verwalten unseren Code mit Git und nutzen Apache/Passenger auf Linux Servern in der Produktion, auf welche wir mit Capistrano deployen.

Du solltest dich aber nicht scheuen auch einmal bei der Wartung von älteren Systemen in Java oder PHP Hand anzulegen, oder aber auch neues wie Erlang oder Objective C ausprobieren zu wollen. Kenntnisse von Java sind von Vorteil, da auch Ruby und Flex von der Java Plattform (JRuby) und Tools wie Ant profitieren können.

Obwohl unsere Applikationen professionell von einem externen Partner betrieben werden, solltest du dich gut mit der Administration diverser Linux Servern auskennen (Ubuntu/SuSE/RedHat/Debian) um die Umgebungen der diversen Test- und Produktivservern für unsere Projekte zu planen und verwalten.

Wir sind von den Vorteilen von Open Source überzeugt und stellen unsere eigenen Codes der Allgemeinheit zu Verfügung und helfen auch bei anderen Projekten aktiv mit.

Einige Jahre Erfahrung in der Entwicklung webbasierter Anwendungen sind ideal und du solltes über eine fundierte Ausbilung (ETH/Uni/FH) oder genügend praktischer Erfahrung in der Softwareentwicklung verfügen.

Wir sind ein kleines Team welches gerade im Umbruch ist. Weg von den grossen e-Commerce Systemen mit JEE zu eher kleinen, ausgetüftelten und  hoch-dynamischen Webseiten. Du hast die aussergewöhnliche Gelegenheit mit deinem Wissen den Weg in die Zukunft mitzugestalten.

Falls du dich angesprochen fühlst, schreib mir doch eine Email an michael.kessler@screenconcept.ch oder ruf mich unter 041 748 44 58 an, damit wir uns kennenlernen können. Und ja, wir arbeiten bereits an unserer eigenen Webseite, die aktuelle ist schrecklich ;-)

25
Sep

Ruby wird erwachsen

Eigentlich ist Ruby ja schon länger eine solide Sprache, aber als Software Entwickler spielt nicht nur die Sprache selber eine Rolle, sondern auch die Entwicklungsumgebung und die Integration und der Betrieb der Applikationen. Und gerade in diesen Punkten hat sich einiges getan in letzter Zeit.

IDE

Ist zwar im Ruby on Rails Umfeld die Verwendung von Textmate der Stand der Dinge (zumindestens bei den Rails Persönlichkeiten), ist der gelegentliche Ruby Entwickler doch manchmal froh um etwas Unterstützung durch eine intelligente IDE. Gerade die Code-Vervollständigung und auch einen integrierten Debugger können doch extrem hilfreich sein und die Entwicklungsgeschwindigkeit zusätzlich erhöhen.

Lange Zeit hatte man keine grosse Auswahl für eine IDE, neben Textmate wurden hauptsächlich die Plugins RDT und RadRails für Eclipse verwendet. Andere IDE’s der ersten Stunde wie Mondrian und FreeRIDE kamen nie richtig aus den Kinderschuhen heraus und werden nicht mehr aktiv weiterentwickelt. Kommerzielle Angebote wie Komodo IDE und Arachno Ruby IDE konnten mich selber nie richtig Überzeugen. Komodo IDE lief auf meinem Macintosh einfach zu langsam und beide machten noch nicht ganz einen ausgereiften Eindruck (Der Ehrlichkeit halber muss ich hier erwähnen, dass mein letzter Versuch mit diesen IDE’s doch schon etwa 6 Monate zurück liegt).

Seit RadRails von Aptana übernommen und auch Chris Williams, der Hauptentwickler von RDT, angestellt wurde, war Aptana lange Zeit meine erste Wahl. Aptana ist eine wirklich gute IDE die viel mehr bietet als nur Ruby und Rails. Gerade aber das war der Punkt für meine Suche nach einer anderen IDE, da nach der Einführung des AIR und iPhone Plugin die IDE viele kleine Fehler hatte und die Integration der Ruby spezifischen Plugins nicht wirklich schnell vonstatten ging.

Zur etwa gleicher Zeit war dann plötzlich DLTK in aller Munde, welches ein neuer Ansatz für die Verwendung von Script-Sprachen in Eclipse versprach. Die ersten Demos waren auch recht überzeugend, waren doch einige Features wie die Code-Vervollständigung und auch Code-Outline besser Implementiert. Jedoch beschränkt sich DLTK auf Ruby und die Rails Unterstützung kam nie in Fahrt. Dies hat nun CodeGears (die Borland IDE Abteilung) mit ihrem neuen Produkt 3rdRails nachgeholt. Ich frage mich jedoch, wer bereit ist 299$ für eine IDE auszugeben, welche nicht mehr bietet als andere freie Produkte.

Neben Eclipse haben nun auch andere Platzhirsche aus der Java IDE Welt Ruby Unterstützung in ihre Produkte integriert: Für IntelliJ gibt es ein Ruby Plugin, welches aber leider noch keinen Debugger beinhaltet. Leider kauft man hier eine vollständige Java IDE (eine wohlgemerkt sehr gute), welche Ruby eher nebenbei mitbringt. Eine billigere nur-Ruby Version würde wohl für mehr Leute interessant sein, die z.B. gar keine Java IDE benötigen.

Mein aktuelle Lieblings IDE für Ruby und Ruby on Rails ist NetBeans. Ehrlich gesagt mochte ich zu beginnt die IDE rein vom Aussehen nicht besonders gut. Nach ein paar Wochen Arbeit damit bin ich aber restlos überzeugt: Die IDE wirkt trotz ihres Beta Stadiums sehr ausgereift und bietet mir doch alles was ich für die Ruby on Rails Entwicklung brauche. Der von Sun angestellt Entwickler Tor Norbye berichtet auf seinem Blog über die Fortschritte der Netbeans Ruby Implementation. Neben der offiziellen Beta kann auch immer der aktuellste Build installiert werden. Sogar die bekannten TextMate Code Snippets sind verfügbar!

Es gibt auch noch einige IDE’s welche nur auf Windows laufen und die ich mangels Windows installation nie angeschaut habe: Ruby on Steel und RDE on Windows

Da jeder seine eigenen Vorlieben hat, ist es wohl unumgänglich sich selber ein Bild von einer IDE zu machen und eine gewisse Zeit damit zu Arbeiten. Hier ein Versuch einer Liste von verfügbaren Ruby IDE’s:

IDE’s welche in Java bzw. Ruby erstellt wurden, laufen auf allen Betriebssystemen, wo auch ein entsprechender Interpreter verfügbar ist.

Wer keine IDE’s mag und lieber mit einem Editor arbeitet, findet auch ein grosses Angebot: RubyJEdit für jEdit, TextMate, e-TextEditor, rails.vim für VIM und auch Emacs.

Ruby vs. Java

Eine immer wieder geführte Diskussion ist Ruby vs. Java. Ich persönlich finde beide Sprachen (und ihre Frameworks) toll, von daher ist es keine Frage des ‘oders’. Mit JRuby existiert ein in Java geschriebener Ruby Interpreter. Damit ist es möglich eine Ruby (on Rails) Applikation in einem Java Container wie Tomcat laufen zu lassen. Nebenbei kann man so auch ganz einfach auf existierenden Java Code zugreifen und das Beste aus beiden Welten verbinden: Tor Norbye demonstriert dies in einem Video. In vielen Fällen läuft JRuby bereits schneller als im originalen Ruby Interpreten, kein Wunder wenn man bedenkt, wie viele Mannjahre Entwicklungsarbeit in einer JVM stecken…

Einen ganz anderen Ansatz verfolgt XRuby. Im Gegensatz zu JRuby interpretiert XRuby den Ruby Code nicht, sonder kompiliert daraus Java Bytecode. Dies dürfte die Ausführungsgeschwindigkeit noch etwas steigern. Ruby on Rails lässt sich aber noch nicht mit XRuby kompilieren.

Für Entwickler aus der Java Welt dürfte ToughtWorks ein Begriff sein, ist doch deren Chief Scientist Martin Fowler eine Koriphäe der Enterprise Java Entwicklung und hat einige wichtige Bücher dazu geschrieben. Fowler selber beschäftigt sich schon seit einiger Zeit mit allem Rund um Ruby. ToughtWorks hat in letzter Zeit einige wichtige Persönlichkeiten aus der Java und Ruby Welt angestellt: Ola Bini, JRuby Entwickler und Author von ‘Practical JRuby on Rail’ sowie auch Ye Zheng, Entwickler von XRuby. ToughtWorks bietet auch einen RubyWorks getauften Rails Software Stack und Support dazu an, wichtige Stützpfeiler für einen Enterprise Einsatz.

Netbeans unterstützt übrigens JRuby und auch das originale Ruby von Yukihiro “Matz” Matsumoto.

Ausblick

ThoughtWorks selber gibt auf der RubyWorks Seite selbst an, dass in den USA bereits 40% der Consulting Projekte mit Ruby on Rails durchgeführt werden. Die Verfügbarkeit von guten Entwicklungsumgebungen und auch die immer engere Integration von Ruby in Java dürfen diese Tendenz vermehrt unterstützten. Auch gibt es immer mehr Rails Entwickler mit fundiertem Wissen, oftmals ehemalige Java (oder .NET) Entwickler mit zusätzlichen Wissen aus der Enterprise Welt.

Ruby und Rails ermöglichen somit benutzerfreundliche Web 2.0 Anwendungen mit kurzer Entwicklungszeit und Anbindung an robuste und bewährte Java Systeme.

Man kann nur hoffen, dass man von dieser Entwicklung auch bald etwas in der Schweiz spürt, was bis jetzt eindeutig nicht der Fall ist…

Update: Der Compiler Modus von JRuby ist nun fertig gestellt. Somit dürfte man mit den nächsten Release auch Ruby on Rails Applikationen direkt kompilieren und danach in einem Java Container ausführen können.

28
Aug

Auf der Suche nach einer neuen Herausforderung

Ein Artikel in eigener Sache: Nach fast sechs Jahren bei der Swisscom ist für mich die Zeit gekommen, mich nach einer neuen Herausforderung umzusehen. Nicht dass mir die Softwareentwicklung nicht mehr gefällt - im Gegenteil - ich vermisse die Umsetzung grösserer Projekte. Im letzten Jahr hat sich mein Tätigkeitsbereich immer mehr in Richtung Betrieb der Applikationen verschoben, was sicher einen gewissen Reiz hat, aber definitiv nicht für einen längeren Zeitraum. Auch durch die zunehmende Spezialisierung vermisse ich gewisse Aspekte in meiner täglichen Arbeit.

Am liebsten würde ich wieder für einen KMU Software entwickeln und zwar mit einem breiten Spektrum: Von der View mit XHTML/CSS und guter Usability mit AJAX, über den Businesslayer mit Ruby on Rails und Java, hinunter auf die Datenbank bis zur Administration der Applikationsserver und des Betriebssystem. Vom Entwicklungsprozess bin ich von eXtreme Programming überzogen und geniesse den Austausch zwischen den beteiligten Personen. Mehr über meinen Werdegang in der IT und mein angesammeltes Know-How kann in der Rubrik Über Netzpiraten nachgelesen werden.

Obwohl ich Java für eine wirklich tolle Sprache und JEE für eine mächtige Plattform halte, reizt mich persönlich Ruby (on Rails) mehr - die Lösungen sind extrem elegant, übersichtlich und die Produktivität ist gefühlsmässig höher als mit Java. Mit Java arbeite ich auch schon mehr als ein halbes Jahrzehnt und befinde mich langsam auf einem Senior Level, wogegen mit Ruby gibts es nach erst anderthalb Jahren noch viel mehr Neues zu Entdecken. Am Liebsten würde ich natürlich beide Sprachen bei der Arbeit pflegen können…

Mein idealer Arbeitsort befindet sich maximal eine Stunde von meinem Wohnort, also Bevorzug in in der Region Bremgarten im Aargau, im angrenzenden Kanton Zug, Luzern oder eventuell auch Zürich. Die Umgangsform sollte kollegial und respektvoll sein und die Hirarchien überschaubar.

Ich freue mich um jeden Hinweis auf eine mögliche neue Arbeitsstelle.

Update: Ab dem 1. Januar werde ich als Softwareentwickler bei der Screen Concept in Steinhausen angestellt sein. Ich freue mich in einem kleinen und dynamischen Team unbürokratisch und flexibel anspruchsvolle Software zu Entwickeln!

31
Dez

Postfix Logdateien mit AWStats auswerten

Um die Logdateien von Postfix auszuwerten und auch noch grafisch schön aufzubereiten eignet sich AWStats hervorragend. AWStats bringt auch mit maillogconvert.pl ein Perlscript für die Konvertierung von Maillogs von diversen Mailserrvern mit um die Mailserver Logfiles auswerten zu können. Unter Ubuntu in Kombination mit Avamis klappt nun nach der Umstellung zur aktuellsten Version Edgy Eft die Auswertung nicht mehr richtig: Das Perlscript findet nur noch alle fehlgeschlagenen Emails, jedoch keine welche erfolgreich versendet wurden (SMTP Status 250). Da das Script durch die Unterstützung diverser Mailserver ziemlich gross ist und ich auch kein Perl-Fan, habe ich mir selber ein kleines Script für die Konvertierung in Ruby geschrieben:

#!/usr/bin/env ruby
# Converts a postfix log file into awstats mailserver log
# Author: Michael Kessler
# No rights reserved
require 'date'
senders = Hash.new
mailservers = Hash.new
year = Time.now.strftime(" %Y")
for line in STDIN.read.split("\n") do
 
  #rejected messages with full qualified hostname of mailserver
  if line =~ /^(\w\w\w [\d\s]\d) (\d\d:\d\d:\d\d).*NOQUEUE.*RCPT from ((?:[-a-z0-9]+\.)+[a-z]{2,})\[.*\]: (\d\d\d).*from=<([^@\s]+@(?:[-a-z0-9]+\.)+[a-z]{2,})> to=<([^@\s]+@(?:[-a-z0-9]+\.)+[a-z]{2,})>/
    puts “#{Date.parse($1 + year).strftime(’%Y-%m-%d’)} #{$2} #{$5} #{$6} #{$3} - SMTP - #{$4} ?”
 
  #rejected messages with only ip address of mailserver
  elsif line =~ /^(\w\w\w [\d\s]\d) (\d\d:\d\d:\d\d).*NOQUEUE.*RCPT from unknown\[(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})?\]: (\d\d\d).*from=<([^@\s]+@(?:[-a-z0-9]+\.)+[a-z]{2,})> to=<([^@\s]+@(?:[-a-z0-9]+\.)+[a-z]{2,})>/
    puts “#{Date.parse($1 + year).strftime(’%Y-%m-%d’)} #{$2} #{$5} #{$6} #{$3} - SMTP - #{$4} ?”
 
  #amavis passed email, get sender for accepted messages
  elsif line =~ /^.*amavis.* Passed.*<([^@\s]+@(?:[-a-z0-9]+\.)+[a-z]{2,})> -> <.* queued_as: (\w+),/
    senders.store($2,$1)
 
  #connected mailserver with full qualified hostname
  elsif line =~ /^.*postfix\/smtpd\[\d+\]: (\w+): client=((?:[-a-z0-9]+\.)+[a-z]{2,})\[.*\]/
    mailservers.store($1,$2)
 
  #connected mailserver with only ip address
  elsif line =~ /^.*postfix\/smtpd\[\d+\]: (\w+): client=unknown\[(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})?\]/
    mailservers.store($1,$2)
 
  #accepted messages
  elsif line =~ /^(\w\w\w [\d\s]\d) (\d\d:\d\d:\d\d).* (\w+): to=<([^@\s]+@(?:[-a-z0-9]+\.)+[a-z]{2,})>.* queued as (\w+)/
    puts “#{Date.parse($1 + year).strftime(’%Y-%m-%d’)} #{$2} #{senders.fetch($5,’unknown’)} #{$4} #{mailservers.fetch($3,’unknown’)} - SMTP - 250 ?”
  end
end

Das Problem mit den gesendeten Emails ist, dass die benötigten Informationen nicht auf einer Logzeile zu finden sind. Desshalb müssen diese Vorgängig geparst werden und anhand der Message-ID beim Senden angereichert werden. Dies kann bei einer täglichen Rotation der Logdateien auch dazu führen, dass nicht alle Informationen in der gleichen Logdatei zu finden ist.

Das Script sieht auf den ersten Blick nicht wirklich lesbarer als ein Perl Script aus, was jedoch an den langen regulären Ausdrücken liegt und nicht an Ruby. Das Script wird übrigens genau gleich wie maillogconvert.pl in die AWStats Konfiguration eingebunden.




Februar 2010
M D M D F S S
« Jun    
1234567
891011121314
15161718192021
22232425262728

Werbung


Buttonitis