Ein Bild sagt mehr als 1000 Worte...
Dienstag, 23. Dezember 2008
Sonntag, 21. Dezember 2008
Freaky Friday - A6: Almighty Webservice Client
Ein paar abendliche Punsch können erstaunliche Auswirkungen auf die Kreativität des menschlichen Gehirns haben - so geschehen Freitag abend, als auf der Heimfahrt in der U-Bahn die Idee geboren wurde, einen universellen Webservice Client zu erschaffen.
Die Idee hat sich hartnäckig gehalten und so sind Skripte und Quellen unter http://almighty.pri.univie.ac.at/~aXXXXXXX/a6/client/ zu finden - die Matrikelnummer bitte wieder selbst aus der Teilnehmerliste kopieren.
Ein paar der interessanten Features sind:
Die Idee hat sich hartnäckig gehalten und so sind Skripte und Quellen unter http://almighty.pri.univie.ac.at/~aXXXXXXX/a6/client/ zu finden - die Matrikelnummer bitte wieder selbst aus der Teilnehmerliste kopieren.
Ein paar der interessanten Features sind:
- Komplett automatisiert (Nur WS Name / Ersteller / WSDL URL sind manuell erfasst)
- Formulargenerierung inkl. Labels
- Geparster Methodenname als Formulartitel (erkennt "get", "add", CamelCase)
- Unterstützung komplexer Typen, auch verschachtelt
- Unterstützung von Arrays als Input Parameter (immer 3 Elemente)
- Tracelog (Per JavaScript Ein/Ausblendbar)
- Retournierte Arrays werden als Listen ausgegeben
- Retournierte Objekte werden als Tabelle ausgegeben (Attributname und Wert)
- Reflection für die Objekte: get_object_vars($result); in response.php
- Method Invocation für den SOAP Client: call_user_func_array( array($this->client,$operation) , $arguments); in definitions.php
Montag, 8. Dezember 2008
A6: Webservice Server Release
Das zuvor beschriebene Arzneimittel-Codex Webservice ist nun fertig implementiert, hier gibt es die Details.
Operation 1: String[] getArzneimittelliste(String stoffklasse)
Operation 2: Medikament getMedikament(String handelsname)
Der komplexe Datentyp Medikament enthält (in dieser Reihenfolge) die String-Elemente handelsname, freiname, wirkstoff, indikationen, kontraindikationen
Folgende Arzneimittelklassen sind vorhanden: Antibiotika, Antihistaminika, Benzodiazepine, Sonstiges. Je nach Kategorie werden dabei zwischen 1 und 3 Medikamente (Array Elemente) gespeichert. Wird eine "unbekannte" Arzneimittelklasse angefordert, so werden immer die Allheilmittel Panazee und Theriak zurückgeliefert.
Mögliche Medikamente sind Fenistil, Floxapen, Invanz, Ospamox, Panazee, Psychopax, Theriak und Valium. Zu diesen 8 Medikamenten können mit Operation 2 auch Details abgerufen werden. Bei einem unbekannten Medikament sind alle Attribute des zurückgelieferten Objekts NULL-Werte.
Wer bereits den Client implementieren will, dem kann ich versprechen dass ich keine Änderungen mehr geplant habe. WSDL und Server Source befinden sich am Almighty (http://almighty.pri.univie.ac.at/~aXXXXXXX/a6/). Interessenten mögen die Matrikelnummer in der Teilnehmerliste der Übungsumgebung nachschlagen, da ich sie hier nicht gleich Google direkt in den Rachen werfen möchte.
Operation 1: String[] getArzneimittelliste(String stoffklasse)
Operation 2: Medikament getMedikament(String handelsname)
Der komplexe Datentyp Medikament enthält (in dieser Reihenfolge) die String-Elemente handelsname, freiname, wirkstoff, indikationen, kontraindikationen
Folgende Arzneimittelklassen sind vorhanden: Antibiotika, Antihistaminika, Benzodiazepine, Sonstiges. Je nach Kategorie werden dabei zwischen 1 und 3 Medikamente (Array Elemente) gespeichert. Wird eine "unbekannte" Arzneimittelklasse angefordert, so werden immer die Allheilmittel Panazee und Theriak zurückgeliefert.
Mögliche Medikamente sind Fenistil, Floxapen, Invanz, Ospamox, Panazee, Psychopax, Theriak und Valium. Zu diesen 8 Medikamenten können mit Operation 2 auch Details abgerufen werden. Bei einem unbekannten Medikament sind alle Attribute des zurückgelieferten Objekts NULL-Werte.
Wer bereits den Client implementieren will, dem kann ich versprechen dass ich keine Änderungen mehr geplant habe. WSDL und Server Source befinden sich am Almighty (http://almighty.pri.univie.ac.at/~aXXXXXXX/a6/). Interessenten mögen die Matrikelnummer in der Teilnehmerliste der Übungsumgebung nachschlagen, da ich sie hier nicht gleich Google direkt in den Rachen werfen möchte.
Sonntag, 7. Dezember 2008
A6: Webservice Server Preview
Meine aktuelle Idee zu dieser Aufgabe kommt einmal mehr aus dem Bereich der medizinischen Informatik.
Operation 1 erhält als Parameter eine Arzneimittelklasse, und retourniert ein Array von Präparaten (Handelsnamen). Eine Liste dazu gibt es unter http://www.meduniwien.ac.at/medtools/medlist/ind-list.pdf, ein Teil davon wird wohl per Copy und Paste Einzug in mein Webservice erhalten.
Operation 2 realisiert einen Arzneimittelkodex (In Österreich: "Austria Codex"). Als Parameter wird der Handelsname eines Präparats als String übergeben, der komplexe Datentyp "Medikament" mit detailierten Informationen (Freiname, Wirkstoff, Indikationen, Kontraindikationen) zurückgegeben. Online verfügbare Kodizes sind unter http://www.meduniwien.ac.at/medtools/medlist/cms1/ueberuns/00000095fc12aeb01/index.php verlinkt. Die Schweizer Liste ist auch ohne vorhergehender Registrierung komplett abrufbar - einfach mal "Aspirin" oder sonst etwas bekanntes auf http://www.kompendium.ch/Search.aspx?lang=de eingeben.
Operation 1 erhält als Parameter eine Arzneimittelklasse, und retourniert ein Array von Präparaten (Handelsnamen). Eine Liste dazu gibt es unter http://www.meduniwien.ac.at/medtools/medlist/ind-list.pdf, ein Teil davon wird wohl per Copy und Paste Einzug in mein Webservice erhalten.
Operation 2 realisiert einen Arzneimittelkodex (In Österreich: "Austria Codex"). Als Parameter wird der Handelsname eines Präparats als String übergeben, der komplexe Datentyp "Medikament" mit detailierten Informationen (Freiname, Wirkstoff, Indikationen, Kontraindikationen) zurückgegeben. Online verfügbare Kodizes sind unter http://www.meduniwien.ac.at/medtools/medlist/cms1/ueberuns/00000095fc12aeb01/index.php verlinkt. Die Schweizer Liste ist auch ohne vorhergehender Registrierung komplett abrufbar - einfach mal "Aspirin" oder sonst etwas bekanntes auf http://www.kompendium.ch/Search.aspx?lang=de eingeben.
A4: XPath Abfragen
Nach der Deadline gibt es nun auch die "Auflösung":
Wer vor ähnlichen Problemen steht, kann ganz einfach mit Saxon arbeiten (unterstützt auch XPath2, Download: http://saxon.sf.net). Die Abfrage muss in eine Datei geschrieben werden (zb q.txt), der Aufruf lautet dann wie folgt:
java -cp saxon9.jar net.sf.saxon.Query -s file.xml q.txt
- Zu welchen Tumoren wurde noch kein Krebsmeldeblatt angelegt?
//tumor[count(krebsmeldeblatt)=0] - Untersuchungen, bei denen ein Residuum entdeckt wurde
//untersuchung[diagnose/tumorstatus="Residuum"] - Die Ausdehnung aller benignen Tumoren des Patienten mit der SVNR 1234010155
//patient[@svnr="1234010155"]/untersuchung/diagnose[id(@tumor)
[differenzierung/@name="benign"]]/ausdehnung
- Die Namen aller SPÖ-Sozialminister
id(//minister[@ressort="sozial"]/@person_id)[@partei="SPÖ"]/@name
XPath2: distinct-values( id(//minister[@ressort="sozial"]/@person_id)[@partei="SPÖ"]/@name) - Zurückgetretene FPÖ-Minister
//minister[ id(@person_id)/@partei="FPÖ" and @durchgehalten="nein" ] - Bundeskanzler gescheiterter Regierungen
//minister[ @bundeskanzler="ja" and ../@vorzeitige_neuwahlen="ja" ] - Die durchschnittliche Amtszeit von Regierungen (nur XPath 2)
sum(//legislaturperiode/number(@end_jahr - @beginn_jahr)) div count(//legislaturperiode)
Wer vor ähnlichen Problemen steht, kann ganz einfach mit Saxon arbeiten (unterstützt auch XPath2, Download: http://saxon.sf.net). Die Abfrage muss in eine Datei geschrieben werden (zb q.txt), der Aufruf lautet dann wie folgt:
java -cp saxon9.jar net.sf.saxon.Query -s file.xml q.txt
A5b: XSLT
Schon vor etwas mehr als einer Woche habe ich angefangen, A5 zu erledigen. Variante B (XSLT) war vermutlich die einfachste Aufgabe nach A1 (HTML) und dementsprechend schnell fertig. Die XML-Datenquelle war schnell erstellt, für das XSLT war auch nicht viel mehr nötig, als die vorhandene HTML Seite mit XSL-Tags auszustatten.
Zwei Tipps an dieser Stelle: Das erste Beispiel zeigt das Grundgerüst zum Sortieren einer Liste. Das zweite Beispiel demonstriert, wie man Werte in ein HTML Attribut einfügen kann (<xsl:value-of> wäre ja ein Tag im Tag und funktioniert somit auch nicht). Der String innerhalb der geschwungenen Klammern ist dabei der XPath-Ausdruck, der normalerweise im select="..." stehen würde)
Zwei Tipps an dieser Stelle: Das erste Beispiel zeigt das Grundgerüst zum Sortieren einer Liste. Das zweite Beispiel demonstriert, wie man Werte in ein HTML Attribut einfügen kann (<xsl:value-of> wäre ja ein Tag im Tag und funktioniert somit auch nicht). Der String innerhalb der geschwungenen Klammern ist dabei der XPath-Ausdruck, der normalerweise im select="..." stehen würde)
<xsl:for-each select="...">(Fleiß-)Aufgabe A5a werde ich mir dann ersparen, wenn bis 16.12. schon die nächste (Teil)aufgabe Webservice Server abzugeben ist. Außerdem beginnt am 9.12. ja wieder die ORF Ski-Challenge 09, da muss dann natürlich fleißig trainiert werden.
<xsl:sort select="..." />
</xsl:for-each>
<img id="cover" src="{cover}" alt="{titel}" />
Abonnieren
Posts (Atom)