Jun 26

Ohne jetzt hier wieder den alten Kampf zwischen WebORB und RubyAMF als Schnittstelle zwischen Ruby und Flex anzufachen, wollte ich hier etwas aus unserer eigenen Erfahrung berichten.

Vor einiger Zeit sind haben wir ein größeres Projekt von WebORB auf RubyAMF umgebaut. Wir hatten die Anwendung zuerst mit WebORB aufgebaut, da das WebORB besser gepflegt schien und RubyAMF nicht mehr weiter entwickelt wird (jedenfalls nicht vom ursprünglichen Entwickler und nicht momentan, wer weis was die Zukunft bringt). Doch mit der Zeit stellten wir fest, dass WebORB seeehr langsam ist und ausserdem sehr speicherhungrig. Wir haben ein System mit mehreren Mongrel-Instanzen laufen, dass von einem monit überwacht wird.
Weiterlesen »

Jun 06

Wieder zurück aus China und schon fleißig am arbeiten!

Nachdem wir 3 Wochen Urlaub in China gemacht haben, ohne den Laptop mit zu nehmen und überhaupt nicht ans arbeiten zu denken, bin ich jetzt seit 1 Woche wieder hier und schon wieder fleißig dabei. Vor ein paar Tagen gabs ein neues Projekt von einem Web2.0-Startup, wobei meine beiden Chefs meinten, es wäre gut wenn ich für dieses Projekt als Projektleiter fungiere, also Ansprechperson bin, die Arbeiten koordiniere und gleichzeitig natürlich auch noch programmiere. Spaß machen tuts, im Moment läufts aber auch noch ganz gut. Wer weis wie es zum Abgabetermin hin wird :-D

Ausserdem habe ich heute mit meinem Chef einen kleinen Workshop zum Thema OpenID bei einem großen, bekannten Telefon-/Handy-Konzern gegeben, wobei ich nur den kleineren Teil der Praxis und der Umsetzung mit RubyOnRails durchgeführt habe. Das hieß heute morgen um 5 Uhr aufstehen und um 6 Uhr mit dem Zug nach Düsseldorf. Solange auf den Beinen zu sein, hinterlässt so langsam seine Spuren und ich freue mich nachher ins Bett zu fallen.

Zu unseren Ausführungen zu OpenID mit RubyOnRails werde ich demnächst näheres berichten, wenn die Zeit zum ordentlichen bloggen wieder reicht. 

Apr 08

In den letzten Tagen habe ich bei Indiginox unsere erste Facebook-Applikation programmiert. Heute war der Tag der Veröffentlichung auf Facebook und damit haben wir den Lebenstraum meines Chefs erfüllt :-)

Where Did I Leave It?

Diese Applikation nutzt die Weisheit der Masse, um verlorene Dinge wieder zu finden. Wie das?

Ein User der etwas wiedergefunden hat, geht auf http://apps.facebook.com/wheredidileaveit und speichert den Fundort ab. Sucht ein anderer Benutzer z.B. nach seinem Mobiltelefon, so erhält er als Ergebnis die Orte an denen andere ihr Mobiltelefon wiedergefunden haben. Diese Fundorte werden in einer Tag-Cloud dargestellt, wobei die häufigsten Orte größer dargestellt werden. Dadurch erhält der Suchende wertvolle Tipps, an welchen Stellen er noch suchen könnte.

Um so mehr Personen diese Applikation nutzen, um so genauer werden die Suchergebnisse, da natürlich repräsentativere Aussagen zum möglichen Fundort eines Objekts gemacht werden können.

Die Anwendung wurde mit RubyOnRails entwickelt und daraufhin in Facebook eingebaut. Dabei kam das Rails-Plugin rfacebook zum Einsatz, dass eine einfache Einbindung von Rails-Projekten in Facebook ermöglicht. Ausserdem werden neue Einträge zu Fundorten im Facebook Mini-Feed des Users und per Twitter-Feed (Username: wheredidileave) ausgegeben. Diese Anwendung ist ein Beispiel für die Integration verschiedenster aktueller Web2.0-Anwendungen und deren Möglichkeiten.

Die Anwendung wurde heute freigegeben und ist nun für jeden Facebook-User zugänglich.

Where Did I Leave It? 

Apr 05

Endlich mal wieder ein Post von mir!
Nach langer Zeit der Abstinenz habe ich wieder Lust zu schreiben und hier gleich der zweite Post heute:

ActionMailer und Emails mit Anhang

Hier als Beispiel eine Funktion aus einem MailerModel:

def newsletter(letter, recipient, attach = nil)
  @recipients = recipient.email
  @from = EMAIL_FROM_ADDRESS_CONSTANT
  @subject = letter.title@body["letter"] = letter
  @body["recipient"] = recipient
  part :content_type => "text/html",
       :body => render_message('newsletter', @body)
  unless attach.nil?
    attachment :content_type => attach.content_type.to_s,
               :body => File.read(attach.full_filename().to_s),
               :filename => attach.filename
  end
end

Beim Versenden von E-Mails mit Attachment muss die E-Mail als Multipart-Mail codiert werden, da sonst der eigentliche Text/Body der E-Mail nicht mit verschickt wird. Der Text der E-Mail wird dabei als text/html oder text/plain über die Funktion render_message(”filename_der_view_der_email”, @body”) erstellt. Das Attachment wird mit dem Content- Type der Datei die versendet wird codiert. Das Plugin Attachment_fu ist dabei eine großartige Hilfe, aber dazu vielleicht mehr in einem anderen Post.

Bis denne!

Jan 17

Stemming ist ein Verfahren, um – mit Hilfe von Algorithmen – den Wortstamm von Wörtern zu ermitteln. Dies wird z.B. bei Suchmaschinen angewendet, damit die Suche nicht an einem eingebenen Wort scheitert, dass zwar nicht in der Datenbank als solches zu finden ist, wohl aber dessen Wortstamm, z.B. Gitarren => Gitarre.Ferret und ActsAsFerret bietet eine einfach zu konfigurierende Unterstützung für dieses Stemming:Eine Datei

stemming_analyzer.rb

im lib/-Verzeichnis anlegen:

require 'rubygems'
require 'ferret'
class StemmingAnalyzer < Ferret::Analysis::Analyzer
 
include Ferret::Analysis
 
def initialize(stop_words = FULL_GERMAN_STOP_WORDS)
    @stop_words = stop_words
end
def token_stream(field, str)
  StemFilter.new(StopFilter.new(LowerCaseFilter.new(StandardTokenizer.new(str)),@stop_words), 'de')
end
 
end

Im zu durchsuchenden Model dann folgendes:

acts_as_ferret :fields =>
  {  :bandname => {}, :firstName_if_public => {},  :tag_list => {}, :comment_list => {}},
  :ferret => {    :analyzer => StemmingAnalyzer.new, :remote => true}

Dabei ist darauf zu achten, dass, wenn ihr den DrB-Server verwenden wollt, :remote => true innerhalb des :ferret-Attributs sein muss. Bei uns war dieses ausserhalb, woraufhin bei einem Aufruf von XYZ.rebuild_index nur nil zurückgeliefert wurde und Stemming nicht funktionierte. Siehe unten unter UPDATE. Über script/console kann dann schön getestet werden. Wenn man nebenbei noch die log/ferret_server.log anschaut, kann man sehen, dass jetzt automatisch Suchwörter wie “und” in XYZ.find_by_contents(”Gitarren und Geigen”) entfernt werden. Ausserdem kann man sehen, dass z.B. “Geigen” auf “Geig” reduziert wird, womit sich dann auch Wörter wir Geige finden lassen.

UPDATE

Nach einigen Problemen mit Ferret in unserem Projekt ist klar geworden, dass der Drb-Server mit meiner Konfiguration nicht verwendet wurde. Interessanterweise nur auf unserem Development-Server. Hier eine acts_as_ferret Konfig die funktioniert:

acts_as_ferret ({:fields =>
      [:bandname, :shortname, :tag_list, :comment_list],
       :remote => true},
      {:analyzer => StemmingAnalyzer.new})
Jan 15

… und der heisst Aljoscha Everding.

Wenn er da ist, dann sitzt er genau hier, mir gegenüber, und wie man schon an seinen Stuhl-Armlehnen sehen kann, ist er nicht grad der kleinste :-) Aber ein total Netter. Gestern war der erste Tag und er durfte sich erstmal mit der Installation unseres Projektes ligx.de auf seinem neuen Macbook ausruhen. Heute kann er endlich zeigen was in ihm steckt :-D Aber das wird wohl kein Problem werden, schließlich hat er seine Diplomarbeit in RubyOnRails gemacht.

Also dann, auf eine gute Zusammenarbeit!

foto-1.jpg

Jan 11

Onlinemusicstar.de ist jetzt Ligx.de und dazu noch mit Flash/Flex Oberfläche. Nachdem wir uns bei der Umsetzung vorerst auf HTML+RoR beschränkt hatten, ist aus diesem Projekt jetzt eine Flex+RoR-Anwendung geworden. Dabei wird auf Server-Seite das RailsPlugin WebORB verwendet, mit dem im J2EE-Stil Webservices zur Verfügung gestellt und diese dann von Flex aufgerufen werden können.

Durch die Möglichkeiten des ClassMappings haben wir ausserdem die Möglichkeit RubyObjekte zwischen Flex und RoR hin- und herzuschicken, anstatt POST-Variablen oder xml-Daten, was doch alles sehr vereinfacht. Ein Beispiel:

def updateUserData(user_object)
  user_object.save
end

Diese Funktion speichert die persönlichen Daten eines Users ab. Das interessante daran ist, dass wir nicht etwas einen Block an Variablen erhalten (den wir dann über params[...] speichern müssten), sondern wir erhalten von der Flex-Seite ein User-Objekt, welches wir auch sofort speichern können und können genauso einfach Objekte (die über das Classmapping definiert wurden) zurückschicken.

Was dabei herauskommt sieht man auf www.ligx.de

Sep 17

Gestern war der erste Tag (inoffizielle) RailsConf-Tag: BratwurstOnRails. Die Berliner Rails-User-Group hatte einen fröhlichen Grillabend organisiert der wie das Foto zeigt auch gut besucht wurde.

bild003.jpg bild005.jpg

Sep 15


RailsConf Europe 2007

Morgen nachmittag gehts los mit dem ICE zur RailsConfEurope in Berlin. Wirklich interessante Themen und Tutorials stehen an und natürlich BratwurstOnRails morgen abend ;-)

See you at RailsConf!

Aug 30

Nach dem ich mich jetzt so einige Zeit mit dem Testen von Railsapplikationen beschäftige, habe ich wieder etwas Interessantes herausgefunden.

Wie kann ich meine Goldberg-Tabelleninhalte möglichst einfach in meine Testdatenbank laden?

Eigentlich ganz einfach:

Im Rails_Root

rake goldberg:dump_bootstrap

aufrufen, damit werden die Tabelleninhalte von Goldberg in das Verzeichnis vendor/plugins/goldberg/db gedumpt und zwar im yml-Format.

In den Functionality/Unit-Tests z.B. in der setup Methode einfach den Befehl

GoldbergMigration.load_bootstrap

aufrufen und die Test-Tabellen werden mit den aktuellen Goldbergdaten gefüllt.