Sie sind hier: Startseite / Blog

Blog

Thumbnails wie ein Stapel verschobener Blätter

Für eine Präsentation benötigte ich als visuelles Element ein "Vorschau" der verwendeten Dokumente. Es sollte aussehen wie auf dem Bild: ein Stapel verschobener Blätter. Da ich über 40 Dokumente ...

Die Ursprungsdokumente waren MS-Word-Dateien (.doc). Daraus ein Bild pro Seite zu machen, war eine leichte Übung: openoffice-python (das übrigens von mir selbst stammt) enthält ein Skript odt2pdf.py , um aus Office-Dokumenten PDFs zu erstellen. Die einzige Voraussetzung dafür ist, dass OpenOffice bzw. LibreOffice das Dokument brauchbar lesen kann. Das war hier der Fall.

Aus den PDFs Bilder zu erzeugen, war auch meine Schwierigkeit: Das Programm "convert", das zum ImageMagick-Paket gehört, erledigt das. Hier das Kommando, um nach PDFs zu suchen und sie zu konvertieren:

find . -type f -iname \*.pdf -print0 | xargs -0 -n 1 convert '"{}"' '"{}"'.png

Dann wurde es kompliziert! Wie werden aus den Bildern die Stapel?

Meine Versuche, es mit der Python Image Library (PIL) hinzubekommen, scheiterten.

Auf der Mailingliste der Linux User Group Darmstadt erhielt ich einen entscheidenden Tipp: Guck dir die Option -compose an. Das war zwar dann nicht die Lösung, aber etwas unterhalb auf der gleichen Seite war -mosaic beschreiben. Dummerweise muss man trotzdem noch die Position für jedes Bild selbst berechnen :-( Das ist zwar aufwändig, aber nicht weiter schwierig.

So geht´s also: List der Bilder lesen, umgekehrt sortieren, damit das letzte Blatt das unterste wird, offsets berechnen und eine Schleife über alle Bilder. Der wichtige Teil des Skripts sieht dann so aus:

def process(outfilename, images):
    imagenames = images
    imagenames.sort()
    imagenames.reverse()

    # Bildbreite mit Python Image Library ermitteln
    im = Image.open(imagenames[-1])
    width, height = im.size
    offset = int(math.ceil(width*0.3 + BORDERWIDTH))

    cmd = ['convert']
    paste_offset = offset*(len(imagenames)-1) + BORDERWIDTH
    for inname in imagenames:
        cmd.extend([
            '-page', '+%i+0' % paste_offset,
            '(', '-border', '1%', '-bordercolor', 'black', inname, ')'])
        paste_offset -= offset
    cmd.extend(['-mosaic', outfilename])
    subprocess.call(cmd)
Im Endeffekt wird ein Kommando wie folgendes ausgeführt:
convert \
  -page +40+0 '(' -border 1% -bordercolor black seite3.png ')' \
  -page +20+0 '(' -border 1% -bordercolor black seite2.png ')' \
  -page +00+0 '(' -border 1% -bordercolor black seite1.png ')' \
  -mosaic zusammengesetzt.png

Das Ergebnis zeigt das Bild.

23.02.2011 15:30

Antike Fundstücke: Aminet und AmokEd

Neujahr ist eine gute Gelegenheit, auszumisten. Das habe ich habe heute mit meinen alten Bookmarks getan. Schön, wenn man gleich fünf oder zehn auf einmal löschen kann, weil die Seiten nicht mehr existieren. Dabei bin ich auch auf eine alte Sammlung Amiga-Links gestoßen. Die konnte ich alle löschen – bis auf einen, der tatsächlich noch aktuell war: AmiNet.

Anfang der 1990er war es noch üblich, Software per Diskette zu verschicken, wobei diejenigen von Fred Fish besonders bekannt war. Die Begriffe "Freie Software" oder "Open Source" waren damals vielleicht geboren, aber auch wir Studenten kannten sie nicht. Für uns gab es "Freeware" oder "Public Domain" (und noch ein paar Kategorien wie "Shareware"). Und dann kam Aminet! Erst ein einzelner FTP-Server, später ein paar Spiegelserver, von denen an sich die Software direkt herunterladen konnte. Wie revolutionär das war, wir mir erst heute bewußt. Und ich gehörte zu den Privilegierten, die an der Uni Internet hatten und Aminet nutzen konnten.

Bis Mitte der 1990er wurde Aminet ein wichtiges Online-Archiv für Amiga-Software. Mehr zur  Bedeutung und Geschichte von Aminet (Selbstdarstellung) beschreibt der englische Wikipedia-Eintrag (der deutsche Eintrag berücksichtigt leider die aktuellere Entwicklung nicht).

Was mich aber am meisten fasziniert: Es gibt Aminet noch immer. Und auch die Daten sind noch da. Darunter eine Version meines Editors AmokEd von 1992, zu dem als Quelle "Fish collection" angegeben ist. Und auch die Fisk Disks gibt es noch als FTP-Archiv und im Fred Fish memorial archive.

01.01.2011 22:24

Distributing Python programms for Windows using pyinstaller

While I not blogged on this topic yet, for several times now I looked into the topic of how to distribute Python for Windows users. There are several major problems, especially if one wants to cross-bundle from e.g. Linux. The later is a requirement for me, since my development platform is Linux and I do not want to boot into Windows just for creating a new distribution package.

With "cross-bundling" I mean "just" sticking together pure python programs, eventually with already compiled third-party packages like GTK. So one of the problems may be where to get the binary packages from. But I'll not going into this today.

The program I want to distribute is my pdfposter, which scales and tiles PDF images/pages to print on multiple pages. Basically this is a Python script, a Python package and another Python package (pyPDF). On a Unix system, installing it is quite easy, assuming that Python is already installed (which is the case on Linux).

Not so on WIndows!

On Windows users are used to get self-contained packages. For installing pdfposter, one needs to install Python, setuptools, (maybe pyPDF, if you are offline) and then pdfposter. Users get trapped be the provided .msi and pdfposter got horrible comments on Heise Software Verzeichnis. So I decided to release a Windows executable of pdfposter for the next release.

In 2008 I already did some work on pyinstaller, adding support for different target-platform and for relative imports (see this trak timeline). One of the major pros of pyinstaller is: the binaries required for bootstraping the program on the target platform are included prebuild. So one may really bundle cross platform.

Meanwhile, a lot has been worked on pyinstaller and it is now able to include Python eggs (this is packages packed into a zip-file or unpacked into a directory). Wow! py2exe (one of the major other options) still does not support this. There is still some more work to do until  can use pyinstaller. [Now it's getting technical] Currently scripts defined via entry_points are not bundled. You may work around this by first installing the script, not this will not recognize the required module.

It seams as if there is time for some more contributions to pyinstaller.

27.12.2010 14:10

Kartenvergleich OpenStreetmap vs. Google Maps

Ich habe ja schon öfter von OpenStreetmap geschwärmt. Heute habe ich in einem Artikel bei heise.de einen tollen vergleich zwischen Google Maps und OpenStreetmap gefunden: Es werden beide Karten transparent übereinandergelegt, mit einem Schieberegler kann man einstellen, welche der beiden Karten stärker durchscheint.

Es ist schon interessant, den Regler von Links (Google) langsam zur Mitte zu schieben und zu sehen, dass plötzliche viele, viele Details austauchen: Fuß- und Radwege, Parks, Gebäude.

Hier ein paar Beispiele:

  • Der englische Garten in München
  • Landshut, man beachte die Wege in der "Flutmulde"
  • Nürnberg, hier beachte man den Detailreichtum der Openstreetmap-Karte um den Dutzendteich und um den Tiergarten (Google kennt noch nicht einmal den Valznerweiher) oder im Hafen, Gibitzenhof und dem Rangierbahnhof.

Hier ein Beispiel, in dem Google die Nase vorne hat, wir uns wegen der Kartenfehler aber dann doch ordentlich verfahren hatten.

07.12.2010 00:00

Meine Beiträge im iX Special "Sicher im Netz"

Gleich zwei meiner Vortragsthemen haben es in das neue  Special "Sicher im Netz" des iX Magazins geschafft. Sie finden sie in zwei Artikeln, die ich speziell für das iX Special überarbeitet und inhaltlich auf den neusten Stand gebracht habe:

  • "Konzept Jericho - kann man Firewalls abschaffen?"
  • "Sicherheitsaufgaben priorisieren mit CVSS"

Natürlich habe ich mich über das Interesse der iX-Redaktion sehr gefreut. Denn es belegt, dass meine Themen als Security-Berater für eine breite Leserschicht interessant sind. Und ganz nebenbei hat mich die Überarbeitung der Beiträge veranlasst, nochmal über den aktuellen Stand dieser Themen nachzudenken und um einige neue Aspekte zu erweitern.

Viel Spaß beim Lesen!

01.10.2010 00:00

CSSLP-Gruppe in Xing gegründet

Die geschlossenen Gruppe für CISSPs auf Xing gefällt mir schon lange. Eine gute Möglichkeit, mit anderen CISSPs in Kontakt zu treten. Da ich nicht nur CISSP sondern eben auch CSSLP (Certified Secure Software Livecycle Professional) bin, habe ich hierfür eine geschlossenen Gruppe eingerichtet. Heute habe ich die Einladungen verschickt und hoffe auf rege Beteiligung.

27.09.2010 22:35

Bitte "Antwort an" abschalten

Ein offener Brief an alle, die ihre Emailadresse als "Antwort an" eingetragen haben.

Bitte entfernen Sie den Eintrag "Antwort an" in Ihrem Mailprogramm.

Das braucht man nur, wenn es eine andere Adresse ist als der Absender. Wenn die Antwort sowieso an den Absender gehen soll, dann ist der Eintrag völlig nutzlos.

Im Gegenteil: Wenn -- wie bei Ihnen -- nur die E-Mail-Adresse drin steht, dann geht die Anwort nur noch an "h.dampf@alle-gassen.de", nicht aber an "Hans Dampf <h.dampf@alle-gassen.de>". Den Realname (Echtname) geht also verloren. Wenn ich dann alle Nachrichten an "Hans" suche, finde ich diese nicht, weil im Empfänger der "Hans" nicht auftaucht. Und das Adressbuch merkt sich einen neuen Eintrag, weil "Hans Dampf <h.dampf@alle-gassen.de>" und "h.dampf@alle-gassen.de" eben zweierlei sind.

Bei einem Brief schreibt man ja auch nicht: "Die Antwort schicken Sie bitte an die Adresse XXX", wenn der Absender schon auf dem Briefpapier steht.

Also weg mit dem "Antwort an".

Danke!

19.08.2010 00:00

Batch-Printing für PDF und Postscript unter Windows

Meine Bürogenossin muss monatlich eine große Menge PDFs ausdrucken, die anderweitig erzeugt wurden. Diese manuell über Adobe Reader, FoxitReader, etc zu öffnen und dann zu drücken ist umständlich. Alleine das eigentliche drucken Drucken dauert mehrerer 10 Sekunden pro PDF. (Windows Printer ist langsam für Farbdrucker). Außerdem soll immer nur die erste Seite gedruckt werden.

Eine Lösung für Windows ist gar nicht so einfach zu finden. die meisten Tipps laufen darauf hinaus, dann doch den PDF-Reader mit dem Ausdrucken zu beauftragen. Egal ob per VB-Script, Com-Schnittstelle, print()-Funktion, etc. Aber genau das möchte ich ja vermeiden! Ich möchte eine Stapelverarbeitung, bei der am Ende nur evtl. aufgetreten Fehler gemeldet werden.

Nach einigem Suchen bin ich auch zwei Lösungen gestoßen und habe einen eigene programmiert (mich dann aber doch für eine der anderen entschieden):

a) GSBatchPrint hat ein paar nette Feature, z.B. kann einen Input-Ordner überwachen oder Output-Schacht angeben. Aber es verschiebt Dateien in Ordner, wobei nicht ganz immer klar ist, wo diese Ordner angelegt werden. Kostenlos, aber Source ist nicht verfügbar.

b) Mein Versuch, GSBatchPrint neu zu programmieren (natürlich in Python) ist prinzipiell gelungen. Nicht gelungen ist mir, dabei anzugeben, welche Seiten ausgedruckt werden sollen — es soll ja nur die erste Seite sein. Habe aber viel über mswinpr2 gelernt. Als Nebenprodukt ist ein Python-Interface für Ghostscript entstanden, über das ich letzte Woche berichtet habe.

c) GSPrint brachte die Lösung. Kann alles Wichtige, was meine Büroenossin braucht. Ich hätte es gleich nehmen sollen. Habe noch einen kleinen Wrapper herum gestrickt (ein droplet aka Batch-Skript), um die restliche Funktionen zu ergänzen und die gewünschten Parameter an GSPrint zu übergeben.

BTW: Unter Linux (und Unix generell) braucht man das alles nicht. lp dateiname genügt. Wenn das Drucksystem CUPS installiert ist (das ist inzwischen Standard), kann man auch allerlei Druckoptionen auswählen. Beispielswiese eben die erste und die letzte zu druckende Seite.

09.08.2010 00:00

Python-Interface für die C-API von Ghostscript

Für ein kleines Progrämmchen möchte ich die Ghostscript-Bibliothek (.dll bzw. .so) verwenden. Es ist mir nicht ganz einsichtig, weshalb man dafür immer Ghostscript als eigenen Prozess startet und den Output umständlich aus einer Pipe liest.

Daher habe ich ein kleines Python-Package geschrieben, das Ghostscript direkt über die C-API anspricht. Es verwendet ctypes, daher muss nichts kompiliert werden, und ist plattformunabhängig (ebenfalls durhc ctypes möglich). Lizenz: GPL v3. Das mercurial-Repository findet sich auf bitbucket.

Mit dabei sind auch ein paar kleine Beispielprogramme, die unter anderem gs und ps2pdf nachbilden. Dafür sind faszinierend wenige Zeilen nötig.

06.08.2010 00:00

Unsinnige KPIs: Anzahl Gefundener Viren

In loser Folge blogge ich über unsinnige Kennzahlen, neudeutsch Key Performance Indicators (PKIs).

Folge 1: Anzahl der gefundenen Viren

Gerade in meinem Metier ist es schwer, den "Erfolg" von IT-Security-Maßnahmen zu messen. Auf einigen Treffen der Fachgruppe Security Management der GI war dies bereits Thema. Ein sinnvolles, rundes Kennzahlensystem für IT-Security hat leider noch niemand dort vorgestellt. Dafür kam beim letzten Workshop eine neue unsinnige Kennzahl hoch: Es gibt allen Ernstes Unternehmen, die die Anzahl der gefundenen Viren messen. Viel gleich gut.

Aber was sagt die Zahl denn aus? Ist es besser, wenn die Zahl niedrig ist, oder wenn sie hoch ist?

Meines Erachtens sagt diese Zahl leider gar nichts aus. Beziehungsweise nur, wieviele Viren die Virenscanner gefunden haben. Leider sagt sie nichts aus, wieviele Viren nicht gefunden wurden, oder wieviele Viren erst gefunden wurden, nachdem sie Schaden angerichtet haben.

Auch als Vergleichszahl ist sie unbrauchbar: Ist der neue Virenscanner besser als der alte, oder sind einfach mehr Viren im Umlauf? Hat sich die Erkennungsrate des Virenscanners verbessert (wobei in "Rate" ja selbst schon ein Verhältnis steckt), oder sind unsere Mitarbeiter nur öfters in gefährlichen Ecken unterwegs? Werden bei uns weniger Viren erkannt, als im Branchenschnitt (wobei es eine solche Angabe wohl nie geben wird), oder sind die Anderen lediglich mehr Wirtschaftsspionage ausgesetzt?

Wirklich interessant wäre die Kennzahl: "Anzahl nicht (oder zu spät) gefundener Viren". Aber die unbekannten kann ich nicht messen. Schade!

Sind Sie anderer Meinung? Oder haben Sie Ideen für gute Kennzahlen in der IT-Security? Ich freue mich auf Ihren Kommentar oder Ihre Mail (siehe Kontakt) und diskutiere gerne darüber.

17.06.2010 00:00