Python 2.7 und die PIL Image-Library auf Windows 7 64-bit installieren

Im Zuge meiner Expiremente mit Python und der Google AppEngine brauchte ich für den lokalen Webserver zur Bearbeitung der Bildchen aus dem Blobstore auch die PIL Image Library installiert. Folgende Fehlermeldung nervte:

NotImplementedError: Unable to find the Python PIL library. Please view the SDK documentation for details about installing PIL on your system.

Klare Sache – runterladen, installieren und weiter gehts. Denkste 🙂 Aber wozu gibts ja haufenweise Anleitungen und Tipps in den unendlichen Weiten der Netzwelt. Also begab ich mich auf die Suche:

Erster Anlaufpunkt ist natürlich die Anleitung von Google selbst: http://code.google.com/intl/de-AT/appengine/docs/python/images/installingPIL.html
Ahh, da gibts einen Windows-Installer, wie praktisch – runtergeladen und fröhlich weiter. Gut, Google verweist weiter auf die Herstellerseite, denk ich mir „Passt, gibts wenigstens die aktuelle Version“. Nein, doch nicht, für Python 2.7 gibts kein Paket zum Runterladen. Gut, testen wir ob das 2.6er geht – natürlich nicht, der Installer fragt die Python Version ab.

Gut, also weitersuchen – die Herstellerseite hat einen Link auf eine weitere Seite: „Additional downloads may be found here.“ Das ‚here‘ ist dann da: http://effbot.org/downloads/#pil Grossartig, da gibts meine Version für 2.7, gleich runterziehen und installieren. Und einmal dürft ihr raten was der Installer von sich gegeben hat. Richtig, kein installiertes Python gefunden…

Tjo, vielleicht ist es in der Registry nicht richtig eingetragen, gesucht, gefunden, rumexperimentiert – aber da steht alles richtig drin.

Nun begann die richtige Recherche, sind ja nur ein paar Libs – händisch reinkopieren und konfigurieren? Ja geht, aber ziemlich aufwändig, also weitersuchen. Naja, langer Text kurzer Sinn – mein Freund Google hat mir dann doch ein verwertbares Ergebnis ausgeworfen, man braucht natürlich die 64bit Version des Installers – gefunden hab ich dann den erlösenden Download dann hier, eine wahre Fundgrube und Retter des restlichen Abends.

Lotus Domino und C#

Mittlerweile darf ich mich beruflich ja ein wenig mit Lotus Domino Softwareentwicklung auseinandersetzen. Die Dominowelt ist eine ganz ganz eigene Welt – aber schön langsam gewöhne ich mich daran.

Meine ersten Schritte passierten allerdings von ausserhalb, Ziel war der Zugriff auf Dominodatenbanken von Java Programmen (Servlets) aus. Dies funktioniert auch ganz gut, vielleicht veröffentliche ich später einmal ein paar Codeschnipsel.

Heute hab ich mich einmal daran versucht das ganz in C# zu testen, und als Ergebnis gilt es zu sagen, dass das auch viel besser funktioniert, vor allem weil man die COM Klassen ja direkt aus C# raus ansprechen kann.

Dabei ist folgender Codeschnippsel entstanden, der nix anderes macht als die lokale Maildatenbank zu öffnen, alle Mails zu durchwühlen, die Attachments die sich darin befinden an einen „sicheren“ Ort speicher und dann aus dem eigentlichen Mail rauslöscht, aber nicht ohne vorher einen Hinweis zu hinterlassen wo sich denn nun der Anhang befindet.

Vielleicht braucht ja sowas mal wer wirklich. 🙂

Read more

StringInputStream StringOutputStream

Nach einigen Überlegungen und Tests sind mir meine alten StringBufferInputStream und StringBufferOutputStream Konstrukte von ein paar Posts früher irgenwie buggy vorgekommen. Vor allem gab und gibts Schwierigkeiten mit Sonderzeichen – dieses Thema hatte ich bis heute eigentlich total ignoriert.

Nunja, aufgeben darf man ja nie – daher hab ich einen neuen Ansatz versucht, der besser funktioniert – und man muss auch nicht mehr den Umweg über einen StringBuffer machen.

Read more

C# Farbenmanagement #2

Ein paar kleine Optimierungen / Refactorings haben sich in meiner Farbenkonvertierungsklasse breitgemacht.

Zum einen habe ich den Code vereinfacht, indem ich sich wiederholenden Code entfernt habe, zum anderen brauchte ich noch eine weitere Konvertierungsart, und zwar vom XYZ Farbraum zurück in den L*ab Farbraum.

Farbmessgeräte werden üblicherweise einmal am Tag kalibriert, dazu haben sie einen Weiß-Standard der gemessen wird und an dem sich das Gerät orienterien kann. Somit werden die Alterungserscheinungen des Blitzlichtes wieder kompensiert und man bekommt gleichmässige Messergebnisse.

Die Werte dieses Standards liegen aber nur als XYZ Werte vor, das Messgerät liefert aber in der gebrauchten Einstellung nur L*ab Werte zurück, daher die kleine zusätzliche Konvertierungsmethode.

Bei den Refactorings hat sich gezeigt wie unendlich praktisch Unit-Tests sind. Man kann seine Methoden optimieren, kürzen, verändern. Ist man fertig lässt man die Unit-Tests drüberlaufen und kann sich dann sicher sein, dass die Überarbeitungen nichts an den Ergebnissen geändert hat.

Und hier nun der gesamte neue Code:

Read more

C# Farbenmanagement #1

Für eine Auftragsarbeit musst ich mich Farbräumen und deren Konvertierungen herumschlagen. Herausgefallen ist dabei so eine Art kleine „Farbverwaltungs“-Klassenbibliothek, mal sehen vielleicht wird ja in Zukunft noch mehr draus, es gibt ja noch viele Farbräume zu begutachten.

Anfangen tut das mit den verschiedenen Farbmodellen die es gibt, konkret brauchte ich nur einige wenige:

  • L*ab – ein gängiger (uralter) Standard in der „Farbenindustrie“
  • L*CH – eine andere Darstellung der Farbwerte
  • XYZ – eine Beschreibung des CIE Farbraumes
  • sRGB – wird u.a. von Windows verwendet um Farben auf dem Bildschirm darzustellen

Falls ihr mehr zu diesem Thema wissen wollt findet ihr ganz viele Ressourcen unter: Easy RGB

Um kurz auf die Programmiertechnik einzugehen: ich habe mich dazu entschieden die Klassen so in der Art immutable zu machen, das heisst eine einmal erzeugte Instanz kann nicht mehr geändert werden. Man kann die Werte einer Instanz nur über den Konstruktor ändern. So richtig immutable ist es aber wiederum doch nicht programmier, weil instanzen der gleichen Klasse bzw. die von einer dieser Modelklassen erben könnten ja theoretisch Werte ändern. Aber ich hatte jetzt keine Lust mich da im Moment weiter einzulesen und das wirklich 100%ig zu machen.

Und nun zu den Listings, die Namespaces hab ich rausgenommen, könnt ihr ja euch ganz einfach dazudenken 😉

Read more