Ein Status kommt selten allein …

24. Februar 2010

Als Anwendungsentwickler oder Software-Architekt kommt man immer wieder mit UML Statechart-Diagrammen in Berührung. Immer wieder spricht man in diesem Zusammenhang vom Status eines Objekts und stolpert dabei auch immer wieder über die Mehrzahl des Status. Doch wie lautet diese eigentlich? “Stati” hört man häufig, doch das ist leider falsch. Hier ein kleiner Artikel von duden.de, der alle (Un-)Klarheiten beseitigt ;-)

Was Sie schon immer wissen wollten

Ein Status kommt selten allein …

… und wie nennt man nun mehrere davon? Vielleicht „Stati”, Staten oder gar „Statusse”? Viele der Fremdwörter auf -us, die aus dem Lateinischen oder Griechischen übernommen wurden, bilden den Plural mit der deutschen Endung -e[n], so z. B. „Virus – Viren”, „Zyklus – Zyklen” oder „Globus – Globen/Globusse” (beides ist möglich!). Einige tanzen jedoch aus der Reihe und behalten ihre ursprüngliche Pluralform bei. Auch der Status konnte sich von seinen lateinischen Wurzeln nicht trennen und bildet seinen Plural nach wie vor mit der Endung -us (mit lang gesprochenem u!), also „die Status”. Genauso verhält es sich übrigens auch bei „(der) Passus – (die) Passus” und „(der) Kasus – (die) Kasus”.

Jetzt können sie kommen, die Status!

Plesk und Ruby on Rails

18. September 2009

Ich habe gerade ein paar Infos zu Plesk und Ruby on Rails gefunden. Allerdings kann ich noch nicht bestätigen, ob die beschriebene Anleitungauf funktioniert …

Go to your domain that you want to adjust, and click Setup. Make sure the CGI and FastCGI options are enabled. Pick a name for your application and make the directory for your application in the httpdocs directory. Upload your files to that directory.

Once you’ve done that, create an .htaccess file in the httpdocs directory with the following text inside:

RewriteEngine On
RewriteRule ^$ /public/index.html [L]
RewriteCond % !^/railsapp/public
RewriteRule ^(.*)$ /public/$1 [L]
RewriteCond % !-f
RewriteRule ^(.*)$ public/dispatch.fcgi/$1 [QSA,L]

Remove the .htaccess file within the public directory of your application and add a file called dispatch.fcgi to that directory which contains:

#!/usr/bin/ruby

You should be able to access your application at http://domain.com/railsapp/

Thx Major Hayden 4 the information :)

rubber uses deprecated md5 module

19. August 2009

Auf dieses Problem bin ich nun mehrfach gestoßen, nachdem ich das gedit-latex-plugin aus den repositories installiert habe. Um nicht immer wieder nach dem Bugfix suchen zu müssen, hier der Link:

https://bugs.launchpad.net/ubuntu/+source/rubber/+bug/338285

Einfach den Patch, der dort verlinkt ist herunterladen und dann …

You just need to download the patch file to somewhere convenient (let’s say a folder called ~/rubberpatch) and then run the patch tool:

cd ~/rubberpatch
sudo patch /usr/share/rubber/rubber/util.py util.py.diff

Dat wars :)

Impressionen aus Arès/Frankreich

10. August 2009

Viecher

16. Juni 2009

-ohne Worte- ;)

UUIDs im EMF-Modell verwenden

07. April 2009

Die Referenzierung erfolgt in der XML/XMI-Repräsentation eines EMF-generierten Modells standardmäßig über XPath Ausdrücke (hm, stimmt das? wo hab ich das denn gelesen?).
<packagedElement xsi:type="KobrA2SUM.Structure:K2ComponentClass" name="TravelBookingSystem">
<generalization general="#//BookingSystem"/>
<!-- ... -->
</packagedElement>
<packagedElement xsi:type="KobrA2SUM.Structure:K2ComponentClass" name="TravelBookingSystem">
<!-- ... -->
</packagedElement>

Hieraus ergibt sich der Nachteil, dass ein SUM-View-Mapping der Modellelemente nur zu Programmlaufzeit sichergestellt werden kann. Ändert man zum Beispiel den Namen der Komponente “BookingSystem” in der View “offline” und möchte dann die Änderung in das SUM importieren, ist die nicht mehr korrekt möglich, da kein passendes Mapping mehr erfolgen kann. Vor allem hinsichtlich einer kollaborativen Entwicklung ergeben sich Schwierigkeiten, die ohne künstliche IDs nicht zu umgehen sind.

Aus diesem Grund gibt es die Möglichkeit UUIDs zu verwenden. Da diese bei EMF-generierten Modellen standardmäßig nicht vorgesehen sind, ist ein kleiner Eingriff des Programmierers in den erzeugten Code notwendig. Wie das funktioniert habe ich vor allem durch einen Artikel von Seweryn Niemiec erfahren: How To Enable UUID In EMF Generated Model [...]

Folgende Änderungen brachten mich zum Ziel:

  1. Die Klasse KobrA2SUMResourceFactoryImpl erweitert org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl
  2. Die Klasse KobrA2SUMResourceImpl erweitert org.eclipse.emf.ecore.xmi.impl.XMIResourceImpl
  3. Außerdem wurde die Methode useUUIDs() der Klasse KobrA2SUMResourceImpl überschrieben:
    /* (non-Javadoc)
    * @see org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl#useUUIDs()
    */
    @Override
    protected boolean useUUIDs() {
    return true;
    }

Schließlich erhielt ich ein Modell, das UUIDs verwendet und auch über diese referenziert.
<packagedElement xsi:type="KobrA2SUM.Structure:K2ComponentClass" xmi:id="_5F2l0CKuEd654_10FfizxA" name="TravelBookingSystem">
<generalization xmi:id="_5F96kCKuEd654_10FfizxA" general="#_5H7CYSKuEd654_10FfizxA"/>
<!-- ... -->
</packagedElement>
<packagedElement xsi:type="KobrA2SUM.Structure:K2Class" xmi:id="_5H7CYSKuEd654_10FfizxA" name="BookingSystem">
<!-- ... -->
</packagedElement>

Bei der View-Erzeugung werden dann die UUIDs der Elemente “kopiert”, d.h. die UUID des Elements des SUM per eObject.eResource().getURIFragment(eObject) ausgelesen und dann beim Element der View manuell per UMLResource.setID(eObject) gesetzt.

Um dies herauszufinden war das durchstöbern der Newsgroup [news.eclipse.modeling.mdt.uml2] sehr hilfreich, denn dort fand ich den entsprechenden Hinweis.

SUM->SpecificationStructuralServiceView Transformation

07. April 2009

Heute möchte ich meine vorgehensweise zur SUM->View Transformation anhand von Pseudocode erläutern. Die Java-Implementierung ist etwas komplexer, doch im Kern spiegelt der Pseudocode meine programmatische Umsetzung wieder.

Lies den Rest des Artikels »

KobrA2 Metamodellierung

24. März 2009

Endlich melde ich mich nach etwas längerer Pause mit einem neuen Artikel zurück. In der Zwischenzeit ist auch das eine oder andere geschehen, auch hinsichtlich meiner Diplomarbeit. Heute möchte ich mich dem Thema “Metamodellierung” widmen:

Grundlage: Jan’s Diplomarbeit

Grundlage dieses Teils meiner Arbeit war diesmal vor allem die Diplomarbeit von Jan Kadathukalam, der in den Abschnitten 3.1 und 3.3 die benötigten theoretischen Hintergrund erläutert. Aus seiner praktischen Arbeit habe ich das auf MDT UML2 basierte KobrA2 Metamodell verwendet und an meine Anforderungen angepasst. Diese Anpassungen sind in erster Linie das Umbenennen der Packages, das Ausgliedern der Elemente K2Model und K2Package sowie die Erweiterung des Package Structure (ehemals StructureClasses) um die voraussichtlich für meine Arbeit benötigten Elemente des KobrA2 Metamodells.

Lies den Rest des Artikels »

Konzept zur Programmierung

26. Februar 2009

In den letzten Tagen habe ich mir nach den bisher gewonnenen Erkenntnissen unter anderem ein grobes Konzept überlegt, wie eine Programmierung der Transformationen in Java aussehen könnte, das ich im Folgenden vorstellen möchte.

Package "views"

Package"views"

Sehen wir uns zunächst den Inhalt des von mir modellierten Package “views” an:

Zu Grunde liegt eine abstrakte Klasse Generation, deren Instanzen das Ergebnis aus von dem SUM ausgehenden Transformationen (-> ViewGenerations) repräsentieren. In den Attribute dieser Klasse werden zum einen die Repräsentation der .uml-Datei (umlFile) und zum anderen die Information, ob diese Datei verändert wurde, gespeichert (isModified).

Diese Klasse wird wiederum von einer abstrakten Klasse View erweitert, die die Informationen zu der Darstellung der Daten, die in einer .umldi-Datei gespeichert werden, kapselt (umldiFile).

Schließlich wird die eben genannte Klasse nochmals erweitert. Die erweiternden Klassen repräsentieren schließlich die tatsächlichen Sichten (z.B. SpecificationClassServiceView und SpecificationClassTypeView).

Package "transformation"

Package"transformation"

Die eben vorgestellten Elemente werden in dem zweiten modellierten Package “transformation” verwendet, das etwas komplizierter aufgebaut ist:

Ausgangselement dieses Package ist das generische Interface ViewGenerator. In Abhängigkeit des Parameters TGeneration, der die Klasse Generation erweitern muss, wird über die Methode generate() eine View aus dem SUM erzeugt. Als Parameter muss hierbei die Repräsentation der Zieldatei übergeben werden. Das Gegenstück zu dieser Methode, die die Transformation von SUM zu View repräsentiert, ist merge(). Hier wird die als Methodenparameter übergebene View wieder mit dem SUM zusammengeführt.

Dieses Interface wird von einer abstrakten Klasse AbstractViewGenerator “quasi-implementiert”, d.h., dass diese Klasse alle gemeinsamen Attribute und Methoden der verschiedenen View-Generatoren beherbergen soll, wie z.B. die (protected) Methode selectSubject(), die anhand des Klassennamens das entsprechende Element aus dem SUM selektieren und ggf. mit dem vorgesehenen Stereotyp “subject” versehen soll. Der Rückgabewert ist derzeit noch vom Typ org.eclipse.uml2.uml.Class, doch kann es sein, dass dies noch geändert werden muss.

Die konkreten Erweiterungen des (ebenfalls generischen) abstrakten Generators sind schließlich die einzelnen View-Generatoren, z.B. SpecificationClassServiceViewGenerator und SpecificationClassTypeViewGenerator.

Soweit so gut :) Doch ich habe mich entschieden, das Ganze noch etwas zu erweitern, in dem ich das “factory method pattern” (http://en.wikipedia.org/wiki/Factory_method_pattern) anwende.

Zu verwenden ist die daraus entstandene ViewGeneratorFactory folgendermaßen: Über den Konstruktor wird der Factory-Instanz mitgeteilt, welche Datei das SUM repräsentiert. Die Methode getViewGenerator(), der man als Parameter die Klasse der zu erzeugenden View übergibt liefert über ein Mapping stets den passenden ViewGenerator.

Durch die Anwendung dieses Pattern ergeben zwei offensichtliche Vorteile: Zum einen ist es nur noch bei der Erzeugung einer Factory-Instanz notwendig, die SUM-Datei anzugeben. Zum anderen entsteht dadurch ein Transformation-Framwork, das einfach um weitere Views erweitert werden kann. Dazu müssen nur zwei Klassen implementiert werden: eine, die die Klasse Generation (oder View) und eine, die die Klasse AbstractViewGenerator erweitert. Dann muss nur noch die Klasse der ViewGenerator-Implementierung und die zugehörige View-Klasse in der Factory registriert werden.

Artikel zu meiner Diplomarbeit

19. Februar 2009

Wie ihr sehen könnt, veröffentliche ich in der letzten Zeit immer wieder Artikel zu meiner Diplomarbeit. Diese sind zunächst einmal mit einem Passwort geschützt, um die Inhalte nur einem kleinen Kreis zugänglich zu machen. Ein Grund dafür ist, dass diese Artikel Auszüge meiner Diplomarbeit enthalten können. Somit dient mir der Blog zur Zeit als Art DA-Tagebuch und Sketchbook. Ich halte Informationen fest, berichte über neue Erkenntnisse und den Fortschritt meiner praktischen Arbeit. Die Idee dahinter ist, nach dem praktischen Teil viele Informationen und eine gute Grundlage für die schriftliche Ausarbeitung zu haben.

Nach Beendigung meiner DA werde ich alle (oder zumindest den Großteil) der DA-Artikel der öffentlichkeit zugänglich machen. Falls du das nicht abwarten kannst, dich meine DA interessiert und/oder der Meinung bist, auch zu dem kleinen Kreis der “Auserwählten” zu gehören, frag mich einfach nach dem Passwort :)