Archiv der Kategorie: Programmieren

Tool: Fluoreszenz-Mikroskopie

Andrea hat mir vor zwei Tagen über ICQ drei Aufnahmen einer gefärbten Zelle geschickt, die sie mit einem Fluoreszenz-Mikroskop aufgezeichnet hatte. Alles Aufnahmen der selben Probe bei UV-Licht, bei unterschiedlichen Filtern, wenn ich es richtig verstanden habe. Während sie mir noch erklärte, was ich genau man auf den unterschiedlichen Bildern erkennen konnte, bastelte ich die Bilder schnell als eingefärbte Ebenen in GIMP zusammen.

Auf dem Ergebnis aufbauend, hab ich Quick & Dirty ein PHP-Script geschrieben, das diese Aufgabe automatisiert über das Modul php_imagick erledigt – eine Wrapper-Klasse für die bekannte ImageMagick Kommandozeilen-Suite und wohl eines der am schlechteste dokumentierten Module ever. 😉 Einige kurze Beispiele gibt es bei Mikko und im extrem rudimentären Manual. Den Rest muss man sich aus der normalen Doku für die Kommandozeile suchen.

Da die einzelnen Fluoreszenz-Farbstoffe ganz markante Maxima bei einem oder wenigen Wellenlängen haben, wollte ich die Ebenen auch mit der entsprechenden Farbe einfärben. Die Zuordnung Wellenlänge zu RGB Farbe ist allerdings alles andere als trivial. Dabei spielt die Farbwahrnehmung des menschlichen Augen ein große Rolle und schon nach ein paar gelesenen Seiten auf Wikipedia steht man knietief in Farbprofilen und ähnlichem. Das war mir dann doch etwas zu krass.
Dafür habe ich auf der Homepage von Dan Bruton einen Quelltext (in Fortan) gefunden, in dem er über eine einfache Approximation (Geraden) dem sichtbaren Spektrum RGB Farben zugeordnet hat. Das Modell habe ich 1:1 in eine PHP-Funktion übertragen (hoffentlich fehlerfrei) und zur Umrechnung benutzt.

Die Verarbeitungskette habe ich so aufgebaut:

  1. Die Aufnahmen (Graustufe) als Maske mit einem entsprechend einfarbig gefüllten Bild mit Imagick::COMPOSITE_MULTIPLY verbinden.
  2. Die Ergebnisse mit Imagick::COMPOSITE_PLUS vor einem schwarzen Hintergrund zusammenfügen.

Meinen ersten Ansatz, die Aufnahmen als Alphachannel zu benutzen, konnte ich mit der spärlichen Doku bisher nicht umsetzen. Das Ergebnis ist so aber auch recht ansehnlich. Vorschläge zur Optimierung sind sehr willkommen. =)

So entsteht aus drei Aufnahmen folgendes Ergebnis:

Ebene 1Ebene 2Ebene 3

Ergebnis

Hübsch oder? ^^ Die blauen Flecken im Zellkern sind übrigens ein Indiz dafür, dass Irgendwasâ„¢ geklappt hat. Die Veränderung eines Proteins, wenn ich mich recht erinnere.
Weiterlesen

Stapelrechner Milestone 3

Heute war der letzte Präsentationstermin für unseren Stapelrechner-Simulator. Schon nächsten Donnerstag geben wir das fertige Programm, den Code und die Dokumentation beim betreuenden Professor ab. Damit ist dann unser Softwareprojekt für dieses Semester abgeschlossen. Alle Kann- und Soll-Anforderungen sich erfüllt – was will man mehr. 🙂 Na hoffentlich ist auch im nächsten Semester etwas Interessantes mit dabei.

Für mich kann ich auf jeden Fall abschließend sagen, dass ich in den letzten Monaten unglaublich viel über SWING, Java-Threads, Exceptions und das Event-Konzept gelernt habe, was mir in Zukunft sicher helfen wird. Am einfachsten wäre natürlich, auch im nächsten Jahr wieder eine GUI-Applikation zu entwickeln. Solange das Zielsystem nicht Matlab heißt, bin ich natürlich auch für alles Andere offen, immerhin habe ich noch die „freie Wahl“ (der Sprache). C oder C++ würden mich z.B. auch freuen, da Pointer dieses Semester etwas kurz gekommen sind und uns die Vorlesung „Betriebssysteme und verteilte Systeme“ eigentlich alle Werkzeuge in die Hand gegeben hat, um auch auf primitivsten C-Umgebungen mit mehreren Prozessen zu jonglieren.

Jaja, Softwareentwicklung ist schon ne feine Sache – vielleicht sollte ich überlegen, das später mal beruflich zu machen. 😉

Stapelrechner Milestone 1

Heute war der erste Tag der Wahrheit für unser Semesterprojekt. Abgabe der Dokumente war schon diesen Mittwoch – heute folgte eine Präsentation über 15 Minuten + 5 Minuten Fragenteil, um den Stand der Entwicklung festzustellen und sich dem abschließenden Urteil des Auftraggebers bzw. des Managers zu stellen.

Kein Projektabbruch, keine gelbe Karte oder sonstige Ermahnungen. Offensichtlich haben wir wohl alles ordentlich vorgestellt, die Präsentationszeit fast bis auf die Sekunde eingehalten und auch alle notwendigen Projekte fristgerecht eingereicht. Einzig eine kleine Formsache in unseren Aktivitätsdiagramm muss geändert werden und die Aufteilung der Module auf die Team-Mitglieder so angepasst werden, dass alle Bezeichnungen aus der Grobarchitektur darin zu finden sind.

Heute morgen hatte ich noch 2,50€ in einen dieser Billig-Laserpointer investiert. Mal sehen, ob der bis zum Projektabschluss durchhält – ich kann es einfach nicht lassen damit herumzuspielen.

In den nächsten Wochen bis zum Milestone 2 darf endlich auch Code produziert werden. Die ersten Versuche mit Javadoc habe ich schon gemacht. Hübsch ist das Ergebnis zwar nicht, aber noch einfacher kommt man wohl nicht an eine Schnittstellen-Beschreibung seiner Klassen. Ein UML-Klassendiagramm steht dem Ganzen natürlich auch noch vorweg.

Projektarbeit

Vor ein paar Monaten habe ich in der FH-Bibliotek einen Kommilitionen aus Gummersbach kennengelernt, der gerade an seiner Master- oder Diplomarbeit (bin nicht mehr ganz sicher)  saß und in diesem Rahmen einen Instant-Messenger für die mobile Plattform „Openmoko“ entwickelte. Da hoffte er noch auf die Anschaffung eines DevKit-Smartphones durch seine Fakultät, um die Anwendung auch mal außerhalb seines Emulators zu testen zu können – Googles Android war grade erst durch die Presse gegangen.

Hm, das OpenMoko nun wohl neben Android auf der Strecke bleibt hat ihn bestimmt nicht allzu erfreut. Vor allem, wenn sich der „Plan B“ als Oberfläche für ein Navigationsgerät oder ähnliches entpuppt. Da arbeitet man über Monate an einer Software, die nun mit ein wenig Pech nie von jemanden benutzt werden wird – hoffentlich bleibt mir sowas erspart.

Themawechsel:

Seit Anfang der Woche kennen wir mit Sicherheit unser Projekt des Softwarepraktikums in diesem Semester: Es soll ein Simulator für einen Stapelrechner werden, der später in den Vorlesungen Digitaltechnik, rechnernahe Hardware-Programmierung oder Rechnerarchitektur eingesetzt werden kann, um die Funktionsweise einer registerlosen Rechenmaschine zu visualisieren. Diese soll dann Anweisungen (Addition, Multiplikation, Sprünge,  Funktionsaufrufe, …) in einer Assembler-ähnlichen Sprache verarbeiten können.  Ich würde behaupten, das auch leichtere Projekte zu Wahl standen. Ganz gemäß dem Motto: Jetzt auswählen – später fluchen! 😉

Nächsten Dienstag haben wir die erste Besprechung mit unserem „Auftraggeber“, um die Funktionalität abzustecken. Java als Programmiersprache steht aufgrund der gewünschten Plattform-Unabhängigkeit und Verzicht auf proprietäre Technologien eigentlich schon fest.

Am liebsten wäre es mir, wenn ich gleich hier und jetzt anfangen könnte zu programmieren, aber nach den Grundregeln des Software Engineering wäre das wohl mehr als nur falsch. 😉

Planung, Analyse, Entwurf, Programmierung, …

Eve – data export / toolkit

CCP bietet auf der Webseite einen ziemlich umfassenden Dump ihrer Datenbank an, der etliche Megabyte Informationen über Agenten, Gegenstände und die Sonnensysteme enthält. Ich hab mir in den Kopf gesetzt, diese Information brauchbar und hübsch für das Web aufzubreiten, wie es schon unzählige andere Fanseiten seit Jahren machen. CCP selbst liefert eine Liste, unter welchen Adressen ihre Datensammlung bereits verfügbar ist.

Meine ersten Versuche werde ich – mit den Einschränkungen meines Webspaces – in PHP auf einer MYSQL-Datenbank machen. Die Daten liegen auf der offiziellen Webseite aber in Form eines Backups für MSSQL-Server + zugehöriger Tabellen-Definition vor. Die erste Hürde ist also groß, wenn man sich damit beschäftigen möchte.

MYSQL bietet als einzige mir bekannte funktionierende freie Möglichkeit ein „Migration Toolkit“ an, das eine MSSQL Datenbank (online/ nicht als backup) in eine MYSQL-Datenbank übersetzen kann. Vor der Konvertierung steht also zunächst die Installation eines Microsoft SQL Servers 2008 (in der kostenlosen Express-Variante) an, um das Backup dort zunächst einzuspielen und ihn als Quelle für die Migration zu verwenden.

Auf meinem (in diesem Bereich) unbelasteten Windows Vista musste ich vor der Installation das .Net-Framework, einen aktuellen Windows-Installer und die PowerShell manuell nach installieren. Hat man dieses Abhängigkeitsfeuerwerk gemeistert, ist die Installation zwar langwierig aber genauso problemlos, wie das anschließende Einspielen der Sicherungsdatei.

Um den frisch aufgesetzten Server im Folgenden zur Mitarbeit bewegen zu können, muss man zunächst im Konfigurationsmanager den TCP/IP Zugriff erlauben. (SQL Server Netzwerkkonfiguration-> Protokolle -> TCP/IP aktivieren und in den Einstellungen den Port 1433 bei IPALL eintragen).

Da mir die Benutzerverwaltung von Windows nicht sonderlich liegt, habe ich im Managment Studio noch einen neuen Benutzer mit MSSQL-Authenifizierung erstellt, ihm die Rolle „public“/“sysadmin“ verpasst und die entsprechende Datenbank zugewiesen. Danach funktionierte auch die Anmeldung aus der Migrations Toolkit.

Die Migration direkt auf den Server schlug aber fehl, da der Namen der Zieldatenbank fest aus Datenbanknamen und Schemanamen generiert wird und mir zum Erstellen einer neuen Datenbank die Rechte fehlen. Eine Option dieses Verhalten zu ändern, habe ich auch nach langer Suche im Netz nicht finden können. Das bestes Suchergebnis war dieses, mit dem ich aber auch nicht weiter kam.

Als letzten Ausweg habe ich eine lokale XAMPP Installation eingerichtet, in der Hoffnung die Daten nach der Migration auf den richtigen Server kopieren zu können. Um beide Systeme zur Zusammenarbeit zu überreden, musste ich in der my.cnf im Abschnitt „[mysqld]“ noch die Zeile „character-set-server = utf8“ ergänzen.

Die Anwendung lief anschließend ohne Fehlermeldung durch, so dass ich endlich die 242,7 MiB Daten im mySQL Format vorliegen hatte!

Zu diesem Zeitpunkt hatte mich schon dafür entschieden, mein Glück nicht auf die Probe zu stellen und die Datenbank zunächst lokal zu verwenden, da ich doch inzwischen eh alles Nötige auf der Festplatte installiert hatte.

Der Vollständigkeit halber aber doch noch der Versuch, die Daten auf den Webserver zu kopieren:

Die Datenbank umbennen, damit der Namen der Vorgabe meines Providers entspricht. Phpmyadmin brach nach der Hälfte ab und hinterließ großes Chaos, so dass ich ein – in weiser Voraussicht – erstelltes Backup mit MYSQL-Administrator einspielen musste. Generell scheint mySQL nämlich das Umbenennen einer Datenbank nicht zu unterstützen und PHP verschluckt sich an der Menge der Daten.

Besser:

Das MySQL-Backup gleich in ein Schema mit dem richtigen Namen einspielen und das Alte löschen.

Die Prozedur lief sowohl lokal (~2m), als auch auf meinem Webserver (~35m bei DSL 16000) ohne Fehler durch. Ich hoffe nur, dass ich mit meinen zahlreichen Fehlversuchen die Mitbenutzer meines Shared-Servers nicht zu sehr gestört habe. 🙂

Los gehts!

The Art of Coding

Folgender Tipp wurde uns heute in einer Vorlesung mit auf den Weg gegeben:

Damit man bei umfangreichen Algorithmen nicht den „Arrayindex“ mit der „Position im Array“ verwechseln kann, einfach etwas mehr Speicher als nötig deklarieren und Index 0 gepflegt ignorieren!

Okay. Ich bin noch ein junger angehender Informatiker mit einem Kopf voller Träume und Ideale, aber dafür kommt man 100% ins Informatiker-Fegefeuer – und in der wird einem bekanntlich jede einzelne übergangene Speicherzelle als Hex-Adresse ins Zahnfleisch gelasert!

Selbst bei 2GB Arbeitsspeicher bekomme ich „i = p – 1″ noch gerade eben so hin …

Horner Newton Intervalle

Das heutige Praktikum in „Programmierung Numerischer Verfahren“ hatte es wirklich in sich. In 45 Minuten musste man seine Vorbereitungen in den Rechner hacken:

  • Lösung eines Polynoms mittels Horner-Schema
  • Nullstellensuche mit Intervallschachtelung
  • Nullstellensuche mit Newton-Verfahren

Dafür habe ich mir gestern noch die halbe Nacht um die Ohren gehauen, weil gerade letzter Algorithmus einfach nicht laufen wollte. Meine Lösung stelle ich hier (noch) nicht öffentlich ein, weil noch einige Praktikumstermine ausstehen – aber eigentlich handelt es sich dabei ja nur um numerische Standardverfahren, die man als Informatiker einfach mal gemacht haben muss.

Folgende Links waren mir beim Programmieren sehr hilfreich:

Vielleicht hilft es ja jemandem, der auch keine Lust hat nur fremde Lösungen auswendig zu lernen. 😉

Fehlersuche

Bis zum Beginn des Praktikums „Praktische Informatik“ durfte ich heute stundenlang im Rechner-Pool die Zeit totschlagen. Das vorzuzeigende Java-Programm wurde mit „Exception-Behandlung“ gepimpt – kleine Spielereien mit PHP in einer schnell installierten WAMP-Umgebung und ein ganz klein wenig heimliches Siedler 2 in einer virtuellen FreeDOS-Maschine brachten die Stunden auch irgendwie rum.

Bei der Besprechung waren die Erläuterungen zu Java-Code auch kein Problem. Bei der Übersetzung des Java-Codes in C(++) habe ich mich allerdings etwas schwer getan. Das schnell hingeschriebene Programm kompilierte, lieferte aber konsequent das Wertepaar (0,0) als Ergebnis zweier simpler Rechentherme. Ich probierte diverse Zahlenkombinationen der Eingabeparameter aus und konnte mir das Ganze einfach nicht erklären. Auch der zur Hilfe gerufene Mitarbeiter suchte den kurzen Quellcode nach Fehlern ab und schien ebenso ratlos. Sogar der Debugger wurde für den 6-Zeiler gestartet und der Ablauf in Einzelschritten abgegangen. Kein Fehler.

Erst als ich mein Programm dem meines Nachbarn angeglichen und auch exakt die selben Schritte wie er ausgeführt hatte, um ein Fehlverhalten meiner IDE oder des Compilers auszuschließen, wurde mir klar, dass ich in der vergangenen halben Stunde wohl sämtliche Kombinationen von Parametern als Test eingegeben hatte, die als absolut richtiges Ergebnis eben jene (0,0) ergaben.

Manches muss man wohl einfach auf die harte Tour lernen. *kopfschüttel*

Merke:
1. Wenn es keine Fehler gibt, sie diese besonders schwer zu finden.
2. Die richtige Auswahl geeigneter Testvektoren bedarf einer gewissen Sorgfalt.