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.

Einfache FTP Klasse für C#

Vor kurzem hab ich einen FTP-Datentransfer innerhalb eines C# Programmes benötigt, nach etwas Gehirnschmalzvernichtung ist dieses nichtssagende, undokumentierte Stück Code rausgekommen. Nichts besonderes, keine ausgefuchste Fehlerbehandlung, keine Spezialfunktionen, keine ausführlichen Tests durchlaufen – wozu auch, es läuft ja. 😉

Zur meiner Entschuldigung muss ich auch vorbringen, dass das ja nur der erste Schuss ist – zumindest bevor es produktiv geht, sollten zumindest noch ein paar Fehlerbehandlungsroutinen da reinwachsen.

using System;
using System.Net;
using System.IO;

class FTP {

    private string ftpServerIP;
    private string ftpUserName;
    private string ftpPassWord;

    public FTP(string serverIP, string userName, string passWord) {
        this.ftpServerIP = serverIP;
        this.ftpUserName = userName;
        this.ftpPassWord = passWord;
    }

    public bool Upload(string fileName) {
        FileInfo fi = new FileInfo(fileName);
        string uri = "ftp://" + ftpServerIP + "/" + fi.Name;

        FtpWebRequest ftpRequest = CreateRequest(uri, WebRequestMethods.Ftp.UploadFile);
        ftpRequest.ContentLength = fi.Length;

        int buffLength = 2048;
        byte[] buff = new byte[buffLength];
        int count;
            
        bool result = false;
            
        using (FileStream fileStream = fi.OpenRead()) {
            Stream ftpStream = ftpRequest.GetRequestStream();

            count = fileStream.Read(buff, 0, buffLength);

            while (count > 0) {
                ftpStream.Write(buff, 0, count);
                count = fileStream.Read(buff, 0, buffLength);
            }

            ftpStream.Close();
            fileStream.Close();

            result = true;
        }

        return result;

    }

    public bool Download(string filePath, string fileName) {

        string uri = "ftp://" + ftpServerIP + "/" + fileName;
        FtpWebRequest ftpRequest = CreateRequest(uri, WebRequestMethods.Ftp.DownloadFile);

        int buffLength = 2048;
        int count;
        byte[] buff = new byte[buffLength];

        bool result = false;

        using (FileStream outputStream = new FileStream(filePath + "\\" + fileName, FileMode.Create)) {

            FtpWebResponse response = (FtpWebResponse) ftpRequest.GetResponse();
            Stream ftpStream = response.GetResponseStream();

            count = ftpStream.Read(buff, 0, buffLength);
            while (count > 0) {
                outputStream.Write(buff, 0, count);
                count = ftpStream.Read(buff, 0, buffLength);
            }

                
            ftpStream.Close();
            response.Close();
            outputStream.Close();

            result = true;
        }

        return result;
    }

    private FtpWebRequest CreateRequest(string uri, string requestMethod) {
        FtpWebRequest ftpRequest;
        ftpRequest = FtpWebRequest.Create(new Uri(uri)) as FtpWebRequest;
        ftpRequest.Credentials = new NetworkCredential(this.ftpUserName, this.ftpPassWord);
        ftpRequest.KeepAlive = false;
        ftpRequest.Method = requestMethod;
        ftpRequest.UseBinary = true;
        return ftpRequest;
    }
}

 

Windows Server 2008 R2 – DNS Weiterleitung

Ich bin ja eigentlich ein totaler Windows Server Neuling – ja klar, man hat schon ein paarmal dran rumgespielt, ruminstalliert, Benutzer angelegt usw. Immerhin hab ich es in der Vergangenheit auch geschaft mal einen Small Business Server 2003 zu betreiben – lief zum Glück auch immer recht fehlerfrei und bereitete so nie wirkliches Kopfzerbrechen.

Nun wollte (…oder musste) ich der Sache etwas genauer auf den Grund gehen. Nachdem die Software die ich als Thema für meine zweite Bakkelaureatsarbeit verwende einen IIS und ein dazu funktionierendes Active Directory braucht sollte es schon das Neueste vom Neuen diesesmal sein. Also her damit, eine VM aufgesetzt, den 2008er Standardserver reininstalliert und losgelegt. Und dann kam dann (endlich) das „AHA“ Erlebnis. Das erfordet doch tatsächlich etwas Planung.

Also mal Bücher gewältz und schön nach Anleitung den Server aufgesetzt. Soweit so gut – funktioniert auch gut… Bis auf das blöde DNS Forwarding. Alles eingetragen, aber werder die DNS Server meines Providers noch die Root-Server werden gefragt wenn der DNS Server selbst keine Adresse auflösen kann.

Also mal im Buch weiterlesen. Hm, das Weiterleitungsthema ist da eigentlich nur sehr spärlich beschrieben – toll! Also mal Google angeworfen, und tatsächtlich, mit den richtigen Suchbegriffen findet man doch wirklich auch Personen die wohl auch schon mal vor dem gleichen Problem standen wie ich – mit einem entscheidenden Vorteil, die wussten sich selbst zu helfen. Aber zum Glück teilen diese netten Personen ja ihr Wissen mit der restlichen Community und so komm ich auch endlich weiter.

Der lange Rede kurzer Sinn – man muss da einfach „nur“ einen Teil des DNS Protokolls abschalten, dass der 2008er Server neu hat.

dnscmd /config /EnableEDNSProbes 0

Das wars, weiter 2.5 Stück graue Haare hätte ich mir erspart wenn ich das fürher gefunden hätte.

Meine Helden sind zum Einem die Microsoft Foren: Windows 2008 R2 DNS Issue – Recursion and Delegation sowie Scott Forsyth – er hat die Lösung „entdeckt“ und uns Unwissenden damit geholfen.

So, und nun gehts weiter – mal sehen was das Active Directory mir noch für Überraschungen schenkt.

Video Sessions der MIX10

Vor kurzem war die MIX10 Konferenz in Las Vegas.

Diese Konferenz wird von Mircosoft veranstaltet und behandelt vor allem Themen rund um Web und Design. Das ist ein weitgestreutes Themengebiet und so waren auch die Vorträge recht breit gestreut. Angefangen von Spieleentwicklung am Telefon bis zum Erstellen von Applikationen in der Cloud.

Es ist Teil der Geschäftspolitik von Microsoft, diese Vorträge (Videos und Folien) für jeden zugänglich zu machen – diesen Umstand möchte ich hier hervorheben, ich finde diesen Schachzug toll – davon könnten sich andere Hersteller was davon abschneiden *in Richtung IBM winkt*.

Tja, was fehlt hier noch – richtig, der Link zu den Videos: Videos

Viel Spaß damit, es sind wirklich sehr interessante Themen dabei.

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