BWL 1: Der Stoff, aus dem die Träume sind

Nachdem ich die letzten 1 1/2 Monate mit der Entwicklung des aktuellen ZABOS-Releases beschäftigt gewesen bin, habe ich am Montag wieder mit BWL 1 begonnen. Die Lernpause tat mir überhaupt nicht gut, da meine Lernmotivation durch den äußerst drögen Stoff doch arg leidet. Ich bin mir durchaus bewusst, dass BWL wichtig ist und habe auch den Sinn hinter dem Rechnungswesen verstanden. Das ändert aber nichts an der Tatsache, dass das Thema trocken ist. Weiterhin bin ich der Meinung, dass man die beiden Kurse des Moduls in zwei Module hätte stecken können.

Die Aufgaben und Tests des Kurses “Externes Rechnungswesen” habe ich bereits alle durchgearbeitet – dem Abschlusstest und der Onlineklausur stünde nichts mehr im Weg. Beim Kurs “Internes Rechnungswesen” habe ich die Tests bereits alle durch, die Aufgaben werde ich (hoffentlich) morgen anfangen.
Obwohl ich bereits relativ weit mit der Bearbeitung bin, habe ich nicht das Gefühl, wirklich drin zu sein. Im Gegensatz zu Mathe oder GDI fehlt mir schlichtweg der Praxisbezug. Ich bin trotzdem positiv gestimmt, dass ich BWL1 Ende März beim Präsenztag schreiben und dann ad acta legen kann.

, ,

1 Kommentar

openSUSE 10.3 und Ghostscript

Gestern ging mir der Hintern geringfügig auf Grundeis: am morgigen Freitag ist Rollout unseres ZABOS-Systems, die letzten Bugs sind soweit gefixt gewesen. Nach Ende einer Alarmierung (Details zu ZABOS gibt es unter http://www.zabos.info) sollte automatisch ein Abschluss-Report gedruckt werden. An sich auch gar kein Problem, da die mit BIRT erzeugten Reporte per lpr gedruckt werden sollten.

Allerdings lief auf dem Server noch Ghostscript in der Version 8.1.x, die bei der pdf2ps-Konvertierung den Fehler

   **** Warning:  An error occurred while reading an XREF table.
   **** The file has been damaged.  This may have been caused
   **** by a problem while converting or transferring the file.
   **** Ghostscript will attempt to recover the data.

schmiss. Grund dafür war, dass die installierte Ghostscript-Version noch nicht mit dem PDF-Format 1.5 klar kommt. BIRT erzeugt aber die PDFs in diesem Versions-Format. Eine Möglichkeit, eine ältere PDF-Formatsversion zu benutzen, habe ich nicht gefunden.

Ich hatte also nun die Option, das komplette, auf openSuSE basierende System, von 10.3 auf 11.2 zu upgraden oder aber die aktuelle Ghostscript-Version 8.70 zu kompilieren, in der der Fehler gefixt war.
Das Upgrade von 10.3 auf 11.2 mit Hilfe von zypper schlug fehl, da mir zypper ein std::bad_alloc() lieferte. Im Internet wurde ich nicht fündig, und die Zeit für das Debuggen hatte ich nicht.
Somit wurde die Option ersetzt durch “Server frisch aufsetzen und die komplette Umgebung anpassen”.
Da ich eher der Debian/Ubuntu-Mensch bin, hatte ich da so meine Abneigung gegen. Deshalb versuchte ich, Ghostscript manuell zu kompilieren. Als Paketabhängigkeiten müssen tiff-*-devel und cups-*-devel per YaST installiert werden, ein make && make install führte dann auch zum Erfolg.

, , , , , ,

Keine Kommentare

Perle IOLAN und RXTXcomm (Java) unter Linux

Für unser aktuelles Projekt verwenden wir eine Perle IOLAN-Box. Die Box stellt serielle Ports – in unserem Fall sind das zwei Stück – über Ethernet zur Verfügung.
Der Einsatzbereich ist z.B. nötig, wenn man GSM-Modems in abgeschirmten Räumen (Rechenzentren, Bunkern) betreiben will. Die IOLAN-Box bildet eine Bridge zwischen Seriell- und Ethernet ab. So lässt sich das GSM-Modem (Seriell) an die IOLAN-Box (Seriell) anschließen, die wiederum über Ethernet an das Netzwerk angebunden ist. Für Linux und Windows existieren passende Programme, die nun lokal wiederum die Verbindung über das Netzwerk als serielles Interface abbilden.

Gestern stieß ich bei der Einrichtung der lokalen Schnittstellen auf ein Problem: RXTXComm – das Java-Framework zur Kommunikation mit seriellen/parallelen Schnittstellen – listete beim Start die /dev/tx00*-Devices nicht auf. Die FAQ von RXTX weist daraufhin, dass man per
System.setProperty(“gnu.io.rxtx.SerialPorts”, portFileNames) zusätzliche Ports definieren kann. Der Lösungsansatz brachte kein Erfolg.
Zweite Idee war dann, dass ich – wie in der FAQ beschrieben – die tx*-Devices manuell in die RXTXCommDriver.java eintrage. Auch das war nicht von Erfolg gekrönt.

Der ausschlaggebende Punkt war schließlich, dass die /dev/tx00*-Devices die falschen Berechtigungen besaßen: RXTXComm erkennt die seriellen Schnittstellen nur wenn /dev/tx00* der Gruppe uucp angehört (chown uucp /dev/tx*) und die Gruppe Schreib- und Leserechte besitzt (chmod g+rw /dev/tx*).

, , , , , , , , , , , ,

1 Kommentar

CCC: 26c3 / Bluvert

Den zweiten Tag des CCCs in Berlin habe ich gemeinsam mit Flo besucht. Leider war das komplette BCC restlos überfüllt und man konnte nur schwerlich in den einzelnen Vortragsräumen einen Sitzplatz ergattern. Ich hatte den Eindruck, dass die gesamte Organisation hinter der Veranstaltung mehr als chaotisch ablief. Besonders nervig: das WLAN war – wenn es denn mal erreichbar war – mehr als inperformant.

Ich nutzte deshalb den Montag Abend und brachte Bluvert auf einen aktuellen Stand. Die Änderungen für Version 1.2 werde ich im Laufe der nächsten Tage auf sourceforge.net hochladen:

  • In der config.ini lässt sich nun $cwd als Variable für das aktuelle Arbeitsverzeichnisses verwenden. Damit entfallen einige kleinere Probleme.
  • Es muss nur noch einmalig execute-server.py gestartet werden. Das Script arbeitet nun als funktionierender Daemon.
  • Das Scanning der Geräte innerhalb der Bluetooth-Nachbarschaft geschieht nun ebenfalls über execute-server.py. Es besteht nicht mehr die Notwendigkeit, das Script set-active-bluetooth-devices.sh als Cron-Job auszuführen.
  • Versenden der noch nicht versendeten Nachrichten geschieht nun ebenfalls über einzelne Threads, was sich erheblich auf die Performance auswirkt.
  • Zeitintervall des Scannens nach neuen Geräten und Versenden der Nachrichten lässt sich in der config.ini frei definieren.
  • Script zum Scannen der aktiven Bluetooth-Geräte lässt sich in der config.ini frei definieren.

, , , ,

Keine Kommentare

8 aus 33: Neue Prüfungsordnung

Mit Freude laß ich in der Mail von unserem Prof, dass zwei Module des Studiums zum nächsten Jahr gesplittet werden: Web-Anwendungen wird nun in Web-Anwendungen 1 und 2 unterteilt, Grundlagen der Informatik 1 hingegen in GDI 1 und 2. Für mich bedeutet das, dass ich statt 6 bereits 8 Module erfolgreich bestanden habe, was wiederum 24% der nötigen Modul-Leistung des Studiums entspricht. Die Note aus WA und GDI gilt nun für WA 1 + 2, sowie GDI 1 + 2.

Finde ich echt gut – schade nur, dass BWL und Mathe nicht gekürzt werden ;)

,

Keine Kommentare

Howto: Citrix XenServer-Patch nochmals installieren

Heute wurde ich in das Büro geholt, da beim Update auf die letzten XenServer-Version (5.5.0 Update-1) wohl einiges schief gegangen ist. Nach dem Neustart des Servers konnten unser FibreChannel Storage Repository, das lokale Storage Repository und die iSCSI-Volumes nicht mehr geladen werden. Beim Re-attachen eines iSCSI-Laufwerks bekam ich den Fehler, dass der Treiber lvmoiscsi nicht geladen wurde. Weiterhin war es uns auch nicht möglich, die USB-Treiber zu nutzen, da diese offensichtlich nicht mehr vorhanden gewesen sind.

Problematischerweise konnten wir mit der Installations-Cd von 5.5.0 Update-1 unser System nicht wiederherstellen bzw. upgraden, da der Patch bereits als komplett installiert erkannt worden war.

Nach mehreren missglückten Lösungsansätzen und wenig Erfolg bei Google hatte ich dann die rettende Idee, folgende Kommandos müssen auf der CLI des XenServers abgesetzt werden.

wget http://downloadns.citrix.com.edgesuite.net/4276/XenServer-5.5.0-Update1.xsupdate /tmp
xe patch-upload file-name=XenServer-5.5.0-Update1.xsupdate

Nun kann es sein, dass der Patch bereits als installiert gekennzeichnet worden ist. Deshalb muss im Verzeichnis /var/patch bzw. /var/patch/applied das Verzeichnis mit der UUID, die xe patch-upload zurückliefert, verschoben werden.

/usr/bin/gpg --homedir /opt/xensource/gpg --no-default-keyring --keyring /opt/xensource/gpg/pubring.gpg --decrypt /tmp/XenServer-5.5.0-Update1.xsupdate > /tmp/update.sh
chmod u+x /tmp/update.sh
/tmp/update.sh unpack

Damit wird die Installationsdatei entschlüsselt und danach entpackt. Der Aufruf von /tmp/update.sh apply funktionierte bei uns nicht, da die Version trotz oben genannter Anpassungen als bereits installiert gekennzeichnet worden war.
Im Verzeichnis /tmp befindet sich nun ein neues Unterverzeichnis, in dem die Installationsdaten des Updates liegen. Das Script install.sh ist leider so geschrieben, dass es bei der ersten fehlgeschlagenen Installation eines RPM-Packages komplett abbricht. Außerdem braucht es eine kleine Anpassung im Header (vi install.sh):

#!/bin/bash
### Generic patch install.sh script
# ...

#[ -n "$UUID" ] || exit 2
UUID=$2
# ...

Die Zeile mit der Überprüfung der UUID muss auskommentiert und stattdessen UUID als zweiter Parameter des Scripts übergeben werden.
Nun folgt die Installation aller RPM-Packages. Eventuell müssen die Packages in richtiger Reihenfolge installiert werden, bei mir reichte aber

rpm -U *.rpm

aus.
Es sollten nun (hoffentlich!) alle nötigen RPM-Packages installiert worden sein. Als letzten Schritt muss die Datei CONTENTS angepasst werden. Sie enthält alle Dateien, die beim Update-Prozess geändert/installiert werden. Da die RPM-Packages bereits im vorherigen Schritt installiert worden sind, müssen sie aus der Datei entfernt werden.

cp CONTENTS CONTENTS.bak
vi CONTENTS
# alle Zeilen beginnend mit "rpm" löschen

Soweit so gut, nun folgt der Aufruf des install.sh-Scripts:

install.sh apply $UUID

$UUID muss mit der UUID aus Schritt 1 (xe patch-upload) ersetzt werden. Nach einem Neustart ist der XenServer auf dem letzten Stand.

Für die Frickler unter euch, die wissen möchten, wie der Update-Prozess abläuft:

  • Laden der Update-Datei
  • Entpacken der Daten und Aufruf des Scripts:
    • Delegation an die install.sh
    • Zeilenweise lesen der Datei CONTENTS
    • Je nach Beginn der Zeile in CONTENTS wird ein RPM-Package installiert oder eine Datei umkopiert
    • Aufruf der post_install(_update1) zum Generieren der initrds

, , , , , , , , , , , , ,

Keine Kommentare

Erledigt: Web-Anwendungen / 1. Fachsemester

Vorgestern bekam ich die freudige Nachricht, dass ich das Modul Web-Anwendungen erfolgreich mit 1.0 (112 von 100 Punkten) abgeschlossen habe. Somit habe ich auch das erste Fachsemester, d.h. die ersten 6 Module, hinter mich gebracht und mit der Note 1.0 abgeschlossen.

BWL1 kränkelt momentan vor sich hin, da ich durch Projekte auf der Arbeit ziemlich eingespannt bin. Ich hoffe, dass ich zum Präsenztag die Klausur dann schreiben kann. Den Prüfungstag Ende Januar werde ich voraussichtlich nicht mitmachen können.

, ,

1 Kommentar

Erledigt: Präsenzklausur Web-Anwendungen

Freitag sind Marci und ich nach Witten gekurvt, um die letzte Präsenzklausur für dieses Jahr zu schreiben. Bei Marc stand Webdesign und -Ergonomie auf dem Plan, ich schrieb Web-Anwendungen.
Die Klausur war ok, es gab aber viel zu schreiben. In der ersten Aufgabe mussten 10 Fragen mit Ja/Nein beantwortet werden und ließen sich einfach beantworten, die zweite Teilaufgabe behandelte das Benennen der einzelnen JSP-Markierungen.

Aufgabe Nummer 2 bestand darin, dass ein JSP-Quelltext auf Fehler untersucht werden musste und dann den korrigierten Quellcode aufschreiben sollte. In einer weiteren Teilaufgabe ging es dann darum zu beschreiben, was der Code eigentlich machte.
Aufgabe Nr. 3 war simpel: Kurz einen HTML-Code niederschreiben, in dem verschachtelte Listen benutzt werden sollten.

In Aufgabe Nummer 4 ging es darum, aus einem Pflichtenheft ein UML-Diagramm zu designen und dieses dann als Quellcode zu Papier zu bringen. Die Aufgabe sah vor, dass man mit Hilfe von JSP die Hintergrund- und Schriftfarbe einer Web-Anwendung dynamisch festlegen konnte. Die Einstellungen sollten dann in einem JavaBean gespeichert werden. An sich ganz einfach, aber echt viel zu schreiben.

Die letzte Aufgabe bestand darin, dass man die Validierung einer Telefonnummer durchführen sollte. Die Telefonnummer durfte nur Ziffern, “/” und “-” enthalten. Die Aufgabe konnte ich mehr oder minder aus einer der Online-Aufgaben abschreiben.

Alles in allem eine Klausur, die fair war, aber mir danach vom vielen Schreiben die Hand weh tat. Bestanden sollte ich die Klausur haben und somit das 1. Fachsemester erfolgreich absolviert haben.

Für mich steht nun BWL1 auf dem Plan. Ich bin seit Ende Oktober an dem Modul und habe den ersten der beiden Kurse (Externes Rechnungswesen) von den Tests zu 100% fertig, 2 Aufgaben fehlen mir noch. Mir fällt es aber echt schwer, mich für das Thema zu begeistern. Meine Planung sieht vor, Mitte Dezember den Abschlusstest und die Online-Klausur zu machen und dann Ende Januar die Präsenzklausur zu schreiben. Bin da allerdings noch etwas pessimistisch, da auf der Arbeit für die nächsten Wochen ein wichtiges Projekt ansteht.

, , ,

1 Kommentar

Let the ants feed the bird: ant-twitter, a Twitter task for Ant

I have learned the last 5 day for business studies and was so bored that I really got happy when I saw the article about a Twitter-Maven-Plugin on entwickler.com yesterday morning.
We still use Ant as building system in our development team so I searched for an Ant task which enables Twitter support. As I did not found any plugin I started to write my own simple task called ant-twitter.

Features

  • Support for URL shortening service bit.ly via bitlyj
  • Support for messages more than 140 characters – the message will be splitted into two or more messages. A small source snippet is taken  from jtwitter – thanks a lot guys!
  • Open source – Apache license
  • It is simple :)

Installation

I assume you have already installed Ant-1.70 (1.6x should work although) and configured your Ant working environment. I refer to $ANT_LIB$ which is a directory where your Ant installation can found further JARs (should be appended to your classpath).

  • Download needed packages and extract them to $ANT_LIB$:
  • Create a file twitter4j.properties in your classpath ($ANT_LIB$) and paste the following code into it:
    twitter4j.http.useSSL=true
    twitter4j.debug=false
    

Usage

After you have installed the needed dependencies and upset your configuration you have to edit your build.xml. Put the following taskdef in top of your build file:

<project name="TwitterTestTask" default="main" basedir=".">
  <taskdef name="twitter" classname="de.ecw.ant.twitter.AntTwitterTask"/>

You are now able to use the twitter task in form of

    <twitter message="Hello World from Ant!" username="twitter-username" password="twitter-password" bitlyUsername="bitly-username" bitlyApiKey="bitly-key" enableBitly="false" />

ant-twitter has the following options:

  • message (required, String): Your Twitter tweet
  • username (required, String): Your Twitter screenname
  • password (required, String): Your Twitter password
  • bitlyUsername (optional, required if enableBitly=true, String): Your bit.ly username
  • bitlyApiKey (optional, required if enableBitly=true, String): Your bit.ly API key
  • enableBitly (optional, true|false): Enable bit.ly support

, , , , , , ,

2 Kommentare

Gelöst: Encoding-Probleme mit MS SQL und PHP

Seit letzter Woche habe ich mich mit einem äußerst ominösen Problem beschäftigt – wär ja sonst auch langweilig: Ich habe für einen Kunden ein Import-Script geschrieben, dass aus mehreren Text-Dateien die Daten in eine MS SQL Server 2005-Datenbank importiert.
Bei unseren Tests hier in der Firma funktionierte alles wunderbar, es gab keine UTF-8- oder sonstigen Zeichensatz-Probleme – die Umlaute wurden korrekt dargestellt.

Nun meldete sich der Kunde und teilte uns mit, dass die Umlaute falsch dargestellt wären. Aus einem “für” wurde ein “fnr” u.s.w. Ein Schelm, wer jetzt denkt, es würde an UTF-8 liegen. Daran lag es nämlich nicht.

Der Kunde setzte einen amerikanischen Windows Server 2003 und ebenfalls einen amerikanischen Microsoft SQL Server 2005 ein – wir hingegen hatten die jeweils deutschen Versionen eingesetzt. Lag es an den unterschiedlichen Länder-Einstellungen? Nein, daran lag es nicht – wie wir nach dem Aufsetzen der gleichen Maschine feststellten.

UTF-8-Probleme auf Seiten PHP konnte ich ebenfalls ausschließen, da sonst substr() aus dem “für” ein “fn” hätte machen sollen.

Über die Lösung des Problems bin ich mehr durch Zufall gestolpert: Das Tool cliconfig.exe (zu finden unter %WINDOWS%\system32) bietet unter dem Tab DB-Library Options die Option Automatic ANSI to OEM conversion. Auf unseren System war diese Option deaktiviert, beim Kunden hingegen aktiviert. Warum? Ganz einfach: die Datenbank beim Kunden lief vor einigen Monaten noch unter MS SQL Server 2000 und wurde dann auf SQL Server 2005 geupgradet. Die Standard-Einstellungen für o.g. hatten sich vom Versions-Wechsel anscheinend geändert und somit konnten wir eben nicht die exakt gleichen Bedingungen nachstellen.

Was für ein Gefrickel, aber: Wieder ein Problem weniger auf der Welt.

Update: Ganz wichtig in diesem Zusammenhang ist, dass das Umlautproblem nur auftritt, wenn das PHP-Script von der Kommandozeile aufgerufen wird. Der Aufruf des Scripts als ausgeführtes CGI-Script in einer Apache-/IIS-/…-Umgebung liefert die richtigen Resultate.

, , , , , , , , , , ,

Keine Kommentare