July 7, 2007

Java Persistence API beim Java Forum Stuttgart

Auf dem diesjährigen Java Forum Stuttart haben Oliver Tigges und ich gemeinsam einen Vortrag über JPA gehalten.

Die Vortragsfolien gibt es beim Veranstalter.

Posted by Phillip Ghadir at 12:29 AM

June 1, 2007

Rails mit Unicode und Integration per REST

In Antwort auf Fragen von dem Flo ergänzend zum ersten Teil:

Unicode

Unicode wird demnächst in Ruby unterstützt. Bis dahin kann man auch im aktuellen Rails Unicode verwenden: siehe den Post im Ruby-On-Rails-Blog

strenge Typisierung

Mir selbst sind streng typisierte Sprachen vielfach lieber als dynamische. Dennoch: jede Sprache erlaubt durch Ihre Idiome und Konstrukte unterschiedlich gut Sachverhalte auszudrücken und in einer dynamischen Sprache ist die Programmierung im Kleinen sicherlich eleganter. Die seit Jahren brennenden Diskussionen für und wider strenge Typisierung wird vermutlich nicht so schnell abebben.

Ruby und Java

Ich selbst habe bislang Ruby und Java nur über HTTP bzw. Socket-Kommunikation integriert. Möchtest Du also POI anstelle einer MS-Office-OLE-Integration verwenden, würde ich spontan vermutlich auch wieder so eine Integrations-Strategie wählen.

Integration per REST

REST ist zur Integration von Systemen bestens geeignet. Erst heute haben wir einen Meilenstein in einem unserer Projekte erreicht, bei dem wir die Integration zweier Systeme, die auf verschiedenen Technologien basieren, sehr einfach und elegant zeigen konnten. Ich denke, dass ich dazu in Kürze etwas posten werde…

Posted by Phillip Ghadir at 10:19 PM

Legacy-Tabellen mit Ruby on Rails

Ich möchte hier auf eine Frage eingehen, die der Flo in einem Kommentar gestellt hat.

Es geht darum, wie man Legacy-Schemata in Rails verwenden kann, die beispielsweise nicht über eine ID-Autoinkrement-Spalte verfügen.

Nun ich habe dazu folgendes gemacht, nur um das Prinzip zu zeigen. Dies ist keine 1-zu-1-Anleitung für den unbedarften Nachahmer:

  1. Öffnen eines bestehenden Rails-Projekts
  2. In der zugehörigen Datenbank: Anlegen eines Dummy-Schemas ‘Mytable’
  3. Im Projekt-Verzeichnis-Baum: Anlegen einer ActiveRecord-Klasse ‘Mytable’ für meine Legacy-Tabelle
  4. Anpassungen für einen minimalen Showcase eingefügt.
  5. Rails-Konsole öffnen und
    1. Daten suchen (kein Inhalt in Mytable)
    2. Objekt anlegen mit new und anschließend speichern mit save
    3. Objekte suchen (jetzt ist eines da!)

Im Folgenden zeige ich die einzelnen Schritte:

  1. Öffnen eines bestehenden Rails-Projekts
    kein Kommentar
  2. Anlegen eines Dummy-Schemas ‘Mytable’
            pg-269:~/rp ghadir$ mysql -u root population_development
    
    
            mysql> create table MYTABLE (
                -> 
                ->   objectidentifier int not null,
                ->   name varchar(40), 
                ->   constraint  MYTABLEPK PRIMARY KEY  (objectidentifier)
                -> )
                -> 
                -> ;
            Query OK, 0 rows affected (0.01 sec)
            
  3. Anlegen einer ActiveRecord-Klasse ‘Mytable’ für meine Legacy-Tabelle
    In app/models/ anlegen von mytable.rb:
             1     class Mytable < ActiveRecord::Base
             2  
             3       @@counter = 1000
             4  
             5       set_table_name 'mytable'
             6       set_primary_key 'objectidentifier'
             7  
             8       before_save :create_oid
             9  
            10       def create_oid
            11         if self.id == nil then
            12           @@counter += 1
            13           self.id  = @@counter 
            14         end 
            15       end
            16     end
            

    Hier ist zu sehen, dass ich erstens den Default-Tabellennamen (mit set_table_name) angepasst habe, da die Legacy-Tabelle nicht der Plural-Namenskonvention für Tabellennamen genügt. Weiter wurde die Primärschlüsselspalte benannt (mit set_primary_key). Zu guter Letzt habe ich die Methode create_oid implementiert, die eigenständig den Primärschlüssel für eine Instanz vergibt, falls dieser noch nicht gesetzt ist. (ACHTUNG: create_oid ist nicht für den Einsatz in einer (Web-)Anwendung geeignet, sondern hier nur für den Demozweck implementiert.) Mit before_save wird sichergestellt, dass create_oid vor jedem Speichern aufgerufen wird.
  4. In der Rails-Konsole
    >> leitet Anweisungen ein, die ich geschrieben habe. Das andere sind die Antworten des Ruby-Interpreters.
                pg-269:~/rp ghadir$ script/console
    
                >> mt = Mytable.new :name => ‘TEST’
    
                >> Mytable.find :all
                #=> []
                >> mt.save
                => true
                >> Mytable.find :all
                => [#“TEST”, “objectidentifier”=>”1001”}>]
                >> mt = Mytable.new  :name => ‘TEST’                            
                => #“TEST”}>
                >> mt.save
                => true
                >> Mytable.find :all
                => [#“TEST”, “objectidentifier”=>”1001”}>, #“TEST”, “objectidentifier”=>”1002”}>]
    
            

Dieser Code ist natürlich unpraktisch, da ich nicht berücksichtige, dass objectidentifier eigentlich wieder der id zugewiesen werden muss, falls er gesetzt ist aber die id nicht. Sonst würde es mit den Scaffolds nicht funktionieren. Also ein gewisser Transfer muss gemacht werden. :-)

Ich hoffe trotzdem, dass klar geworden ist, dass auch die Anbindung einer Legacy-Tabelle mit wenigen Schritten getan werden kann.

Posted by Phillip Ghadir at 7:23 PM

May 30, 2007

Ein weiterer Fall von Rails-Fieber

Florian Duetsch war mittelschwer begeistert von dem Tutorial. Ich bin gespannt, wie seine ersten Rails-Prototypen aussehen.

Posted by Phillip Ghadir at 3:38 PM

Ruby on Rails in Regensburg

Ich möchte mich noch mal bei allen Teilnehmern für das große Interesse bedanken. Mir hat der Ruby on Rails Workshop (Flyer als PDF) in doppelter Hinsicht Spass gemacht: Einerseits wurde ich bestens empfangen und versorgt. Außerdem waren die Teilnehmer offensichtlich sehr interessiert, da sie selbst nach Veranstaltungsschluss noch nicht gehen wollten … (Ja, ich dachte auch erst, dass sie eingeschlafen sind.)

Aufgrund der längeren Anreise habe ich auf das Mitbringen von Literatur-Hinweisen verzichtet. Daher hier noch einmal die Empfehlungen, jeweils zwei Bücher zur Programmiersprache Ruby und zwei zum Framework Ruby on Rails:

Programming Ruby (Pickaxe Book)Programming Ruby Ruby CookbookRuby Cookbook

Agile Web Development with Ruby On RailsAgile Web Development with Ruby On Rails Rails RecipesRails Recipes

Posted by Phillip Ghadir at 3:33 PM

May 25, 2007

Ruby on Rails an der Uni-Düsseldorf

Bei dem Ruby on Rails Tutorial (Flyer als PDF) an der Heinrich-Heine-Universität in Düsseldorf haben wir am Mittwoch insgesamt 34 Teilnehmern unser liebstes Framework für datenbank-gestützte Web-Anwendungen vorgestellt. CREDITS: Natürlich ist Rails nicht "unser Framework" sondern ein frei-verfügbares, von DHH entwickeltes Framework.

Fragen des Tages bezogen sich auf die Erstellung barrierefreier Web-Anwendungen und auf ActiveRecords Caching-Strategien, beim Zugriff auf im Speicher geänderter Entitäten, die noch nicht in die Datenbank gespeichert wurden.

Erstellung barrierefreier Web-Anwendungen

Eine Web-Anwendung nennt man barrierefrei, wenn die Verwendung der Inhalte keine speziellen technischen oder körperlichen Fähigkeiten zwingend voraussetzt: Zum Beispiel, wenn sie auch mit einem Nicht-Standard-Web-Browser sondern beispielsweise mit einem PDA-Browser angesehen oder mit einem Braille(Vor-)lesegerät vorgelesen werden kann. Insbesondere für sehbehinderten Menschen ist die Schrift-Vergrößerung der einzige Weg, Inhalte lesen zu können: eine Option, die blinden Menschen nicht zur Verfügung steht.

Web-Oberflächen realisiert man mit Ruby on Rails direkt mit (X)HTML und CSS. Man verwendet in Rails spezielle Templating-Mechanismen, wie ERb oder RJS, mit deren Hilfe Inhalte (Text-/HTML-/JavaScript-Dokumente) dynamisch zusammen gesetzt werden können. So kann man - als Rails-Entwickler - die speziellen Anforderungen an die Barrierefreiheit der Web-Inhalte selbst gut berücksichtigen.

Es hat sich bewährt dabei ein paar Faustregeln zu befolgen:

  • Immer wiederkehrende Navigationselemente sollten im HTML-Text ans Ende gestellt werden. So dass ein Programm zum Vorlesen mit den Inhalten beginnt und nicht bei jedem Seitenwechsel 5-Minuten lang ein Navigationsmenu vorliest.
  • Mittels CSS kann die Seite anschließend so gesetzt werden, dass alle Elemente an ihrem angestammten Platz sind und dass der Besucher der Seite im Browser einstellen kann, wie groß die Schrift sein soll.
  • Die Webseite sollte komplett ohne Javascript auskommen können. Dies erreicht man am einfachsten dadurch, dass Javascript nicht im HTML verwendet wird.
  • Um die Ergonomie zu erhöhen, wird man Javascript-Funktionalität in die Webseite einbetten wollen. Dies sollte mittels CSS geschehen, über das HTML-Elemente selektiert und mit Javascript-Funktionalität erweitert werden kann.
  • Ein gutes Buch zu dem Thema ist nebenstehend abgebildet: Barrierefreies Webdesign
Barrierefreies Webdesign

Weder erschwert noch erleichtert Rails die Erstellung von barrierefreien Webseiten, zumindest solange man auf AJAX-Features verzichtet. Sobald man allerdings mit RJS beginnt, könnte die Barrierefreiheit schwieriger zu erhalten sein. - Dazu habe bislang noch keine Meinung.


Rails ActiveRecord und Caching

Im Gegensatz zu anderen Persistenz-Frameworks hat ActiveRecord keinen Cache eingebaut. Entweder man verlässt sich auf die Caching-Strategien der eingesetzten Datenbank (was in verschiedenen Szenarien eine gute Idee ist) oder man erweitert Rails um ein eigenes Caching (wenn dies nötig wird). Glücklicherweise bietet Rails vielfältige Möglichkeiten, sich in den Kontrollfluss einzuklinken (bevor eine Methode aufgerufen wird, bevor eine Entität gespeichert wird, bevor eine find-Methode ausgeführt wird, usw.). Damit kann man die Erweiterung um ein Caching erstens recht einfach selbst zu bauen.

Nachtrag:

Stefan, Ihr wisst schon, der mit dem Blog, hat mir zu dem Caching noch einen Link auf einen alten Eintrag zur Identity Map geschickt.

Posted by Phillip Ghadir at 8:33 AM

May 12, 2007

innoQ Event - Mai 2007 in Weggis

Administration des IBM WebSphere Applikationsserver, Über die Entwicklung von BeaTunes, Vom Geschäftsprozess zum Service, REST - das bessere Web Services-Modell, Domain Specific Languages - ein vielseitiges Eventprogramm.

Das dieswöchige innoQ-Event in Reggis war nicht nur dank der wunderschönen Lokation am Vierwaldstättersee ein toller Erfolg. Die hervorragend präsentierten Vorträge haben viele Diskussionen angestoßen und wieder einmal den Austausch zwischen den Interessen- und Projektgruppen gefördert.

Posted by Phillip Ghadir at 2:35 PM

Ruby on Rails Tutorial in München

Diese Woche haben Stefan und ich einen Workshop zu Ruby on Rails gehalten. Gemeinsam mit den Teilnehmern haben wir in zwei Tagen die Grundlagen von Ruby on Rails behandelt.

Einige der mächtigen Sprachmöglichkeiten von Ruby haben bei den Teilnehmern Bedenken verursacht. Beispielsweise kann die Möglichkeit, jederzeit existierende Klassen zu redefinieren und somit Struktur als auch Verhalten verändern zu können, ein Projekt mit (vielen) “unterdurchschnittlich talentierten aber ambitionierten” Entwicklern ins reinste Chaos führen.

Allerdings zeigt Rails sehr gut, wie die Ausdruckskraft von Ruby auch dazu verwendet werden kann, ein leichtgewichtiges, klares Programmiermodell zu schaffen, mit dem Web-Anwendungen leicht realisiert werden können. Ich kenne keinen Persistenzlayer, in dem man einfach deklarieren kann, wie dies mit ActiveRecord, dem Persistenz-Framework von Rails, getan werden kann:

class Person < ActiveRecord::Base
    validates_presence_of :last_name

    belongs_to :tenant
    has_many :addresses
end

Dieser Code definiert eine funktionsfähige Entität Person, die garantiert, dass der Nachname gesetzt ist, unterhalb eines Mandanten (tenant) angesiedelt ist und eine beliebige Zahl von Adressen haben kann.

Das hätte man doch auch erraten, ohne Rails bzw. ActiveRecord zu kennen, oder?

Deutschsprachige Informationen rund um das Thema gibt es unter anderem hier: http://www.rubyonrails.de/

Posted by Phillip Ghadir at 12:35 PM

May 5, 2007

Ruby-on-Rails Tutorial an der FH-Bochum

Gestern haben Stefan und ich ein 4-stündiges Einführungs-Tutorial zu Ruby-on-Rails gehalten.

Vielen Dank an Prof. Dr. Volker Klingspor von der FH-Bochum für die großartige Vorbereitung.

Es hat uns sehr viel Spass gemacht.

Posted by Phillip Ghadir at 12:32 PM | TrackBack (0)

April 11, 2007

Java Persistence API im JavaSPEKTRUM 2/2007

Warum habe ich noch nicht erwähnt, dass der JPA-Artikel von Serge Pagop, Oliver Tigges und mir längst erschienen ist?

Posted by Phillip Ghadir at 4:30 PM