$30 off During Our Annual Pro Sale. View Details »

Do-it-yourself Kalender aus der Unix-Toolbox, Vortrag von Klaus-Dieter Ost

fraosug
September 17, 2019

Do-it-yourself Kalender aus der Unix-Toolbox, Vortrag von Klaus-Dieter Ost

Erstellung eines Bilder-Kalendes mit PostScript.

fraosug

September 17, 2019
Tweet

More Decks by fraosug

Other Decks in Programming

Transcript

  1. Ein do-it-yourself Kalender aus der Unix-Toolbox
    Der erste Kalender mit PostScript - kam leider erst an Ostern raus

    View Slide

  2. Hintergrund
    • Fotografie
    • Typografie
    • PDL / Packaging Design Language
    • Fotosatz

    View Slide

  3. Fotografie
    • Rollfilm
    - Box Kamera:
    - Rollfilm 6x9, eine Verschlusszeit, zwei Blenden: hell / dunkel
    - Agfa Isolette: https://de.wikipedia.org/wiki/Agfa_Isolette
    • Spiegelreflex
    - Kleinbild / Minolta SRT 101, XE-1
    - Rollfilm / Zenza Bronica, 6x6
    • Planfilm
    - Plaubel Peco Supra
    - Plaubel: ehemals Frankfurt, Betrieb eingestellt
    • Digital
    - Casio FH100 - Zoom!
    - Sony RX100 VI

    View Slide

  4. Typografie
    • Spass an Typografie
    • kaufe kein Buch mit unbefriedigendem Layout

    View Slide

  5. PDL / Packaging Design Language - I
    • Kundenprojekt
    • Sprache inspiriert von Pascal, aber viel einfacher
    • Zielgruppe: vergleichbar PostScript
    • Seitenbeschreibungssprache für Offset-Druck
    • Faltschachteln für Kosmetik- und Pharmaindustrie
    • unterschiedliche Schwerpunkte
    - Kosmetik: Farbtreue
    - Pharma: Texttreue

    View Slide

  6. PDL / Packaging Design Language - II
    • Unsere Aufgabe
    - Bau eines Compilers
    - Codeerzeugung für Fotosatz-Anlage von Purup Electronics
    - Schriftberechnung - entsprechend der Purup-Logik
    - später auch: Laserschneider für Stanzformen, Grafikbildschirm HP264x
    • Nutzen für Endkunden
    - Qualitätskontrolle (Beschriftung!)
    - reproduzierbare Ergebnisse
    PDL
    • Enstehungsjahr: 1983 und folgende
    • PostScript: erstes Release 1984

    View Slide

  7. "Epic Fail" mit GUI und Maus
    Erster Versuch mit OpenOffice
    • "unwürdig"
    • viel Mausgeschubse, trotz …
    - Templates, Vorlagen
    • … oder wegen …
    - cut&paste
    - "Wiederverwendung"
    • fehleranfälliges "Gefummele"
    • Dezember Kalendarium war einfach nur "Müll"
    • der "Nachbau" mit PostScript war dann wieder richtig
    Oder: es lebe ein gutes Skripting!

    View Slide

  8. Der korrigierte Dezember
    seit der Umstellung auf PostScript stimmmt alles

    View Slide

  9. PostScript und PDF
    PostScript ist eine Sprache
    • enstanden ab 1983
    • Stack-basiert
    - HP-Taschenrechner
    - Burroughs B5000/B6000-Serie
    - HP3000
    - Forth
    - OpenBoot PROM

    View Slide

  10. PostScript Sprachelemente
    • Datenelemente
    - string
    - number
    - dictionary
    - array
    • Arithmetik
    - add, mul, sub, div
    • Funktionen
    - Parameter auf dem Stack
    - Rückkehrwerte auf dem Stack

    View Slide

  11. Beispiele — Operatoren definieren
    >
    > % pyth - pythagoräische Formel auswerten
    > % a b pyth --> (a^2+b^2)
    > /pyth {
    dup mul % a b^2
    exch % b^2 a
    dup mul % b^2 a^2
    add % b^2+a^2
    } bind def
    > 3 4 pyth
    =
    25
    >
    >
    > % hyp - Hypothenuse im rechtwinkligen Dreieck
    > % a b hyp --> sqrt(a^2+b^2)
    > /hyp {
    pyth % b^2+a^2
    sqrt
    } bind def
    > 3 4 hyp
    =
    5.0
    >

    View Slide

  12. PDF ist ein Datenformat
    • Portable Document Format
    • basiert auf PostScript
    • COS — "Carousel" Object Structure
    - COS baut auf PostScript-Datenstrukturen auf
    - Objekte werden absolut platziert
    • PostScript ist tot - öffnet JavaScript neue Hintertüren?
    ... JavaScript in Adobe Acrobat software implements objects, methods, and properties that enable you
    to manipulate PDF files, produce database-driven PDF files, modify the appearance of PDF files, and
    much more. …
    — Adobe, JavaScript for Acrobat

    View Slide

  13. PostScript - Die Anfänge
    • Ende der 1960er erste digitale Fotosatz-Anlagen
    • proprietär, ca. 400.000 US-$ pro Stück
    • 1973 — Xerox 1200, Seitendrucker, entwickelt aus der Kopierertechnik
    • 1976 — IBM 3800, der erste Laserdrucker für Endlospapier
    • propieträre Seitenbeschreibungssprachen
    • Dezember 1982, John Warnock und Charles M. Geschke gründen Adobe
    • und entwickeln PostScript als Werkzeug zum Ansteuern von Druckern
    - baut auf InterPress auf
    - einfachere Struktur
    - Markteinführung 1984

    View Slide

  14. PostScript - Apple LaserWriter, Linotronic
    • Steve Jobs investiert in PostScript für den Apple LaserWriter
    • Markteinführung 1985 für 6.995 US-$
    Xerox Drucker kostet zu dieser Zeit ca. 1/2 Mio US-$
    • LaserWriter kann ganzseitige Photos drucken,
    • andere Laserdrucker erlauben Grafik nur in einem begrenzten Bereich
    Linotype
    • 1985 Linotronic 300 mit PostScript Unterstützung
    • 1987 PostScript Schriften
    1991 PostScript Level 2
    • Verarbeitung von JPEG Bildern
    • Farbtrennung direkt im RIP (Raster Image Processor)
    1997 PostScript Level 3

    View Slide

  15. gibt es irgendwann einmal PostScript 4?
    “Absolutely isn’t going to happen. PostScript is a programming language, not really a page description
    language. By its very nature, it does not provide for really reliable end-to-end workflows since by
    definition, content can change on the fly. … Beginning with PDF 1.4, all additions to the Adobe imaging
    model went into PDF and not PostScript …"
    — Dov Isaacs (Adobe), 2006, gefragt zu PostScript4

    View Slide

  16. 2001 PDF 1.4 — der Anfang vom Ende
    • neue Features ohne Entsprechung in PostScript
    - Transparenz
    - ICC Farbprofile
    - Ebenen
    - OpenType
    • APPE auf ( Adobe Print Engine) verwendet PDF statt PostScript
    • 2005 - Adobe rät zu OpenType Schriften statt PostScript Type 1
    • Abkehr von CPSI (Common PostScript Interpreter)
    PostScript heute
    • trotz aller Nachteile
    - immer noch im Gebrauch
    - es gibt zu viele Bilddaten in Encapsulated PostScript (EPS)

    View Slide

  17. Neustart

    View Slide

  18. "artgerechte Lösung"
    • Fummelei mit der Maus ist keine adäquate Lösung für einen Informtiker
    • … das muß besser gehen …
    textbasiert
    • Versionsverwaltung
    • einfache Bearbeitung
    • Skript oder Programm gibt volle Kontrolle über Layout
    • Bilder platzieren, skalieren, beschneiden, …
    • Kalenderberechnung

    View Slide

  19. mit einer Anwendung erzeugen?
    • Java
    - Apache PDFBox — https://pdfbox.apache.org/
    - iText — https://github.com/itext/itext7
    • C++ — teilweise auch JavaScript u.a.
    - Haru — http://libharu.org/
    - Hummus PDF — https://pdfhummus.com/
    - JagPDF — http://www.jagpdf.org/index.htm
    - VulcanWare PDF — http://www.vulcanware.com/cpp_pdf/index.html
    - wxPdfDocument — http://wxcode.sourceforge.net/docs/wxpdfdoc/index.html
    • HTML
    - wkhtmltopdf — https://wkhtmltopdf.org/
    Das habe ich aber erst hinterher gefunden

    View Slide

  20. PDF direkt aus PostScript erzeugen
    • sah aus wie "der direkte Weg"
    • … aber siehe oben - PDF
    • außerdem:
    If the only tool …
    • … you know is a hammer,
    • every problem looks like a nail.

    View Slide

  21. Teilaufgaben
    Bilder platzieren
    • geht offensichtlich - aber wie?
    • Position
    • Ausschnitt
    • Größe
    Kalender berechnen
    • bekanntes Problem
    • bekannte Lösungen
    • regionale Unterschiede
    - Code ist vorbereitet
    - zuerst nur Baden-Württemberg
    - für diesen Vortrag erweitert auf alle Bundesländer

    View Slide

  22. PostScript — Code Ausführung
    "newline" Operator in PostScript
    /lm 60 def % left margin
    /lh 48 def % line height
    /nl {
    currentpoint lh sub
    exch pop
    lm exch
    moveto
    } def
    nl Operator - Operanden auf dem Stack
    stack operator
    leer currentpoint
    x y lh
    x y 48 sub
    x (y-48) exch
    (y-48) x pop
    (y-48) lm
    (y-48) 60 exch
    60 (y-48) moveto

    View Slide

  23. Bilder platzieren - Koordinatensystem
    • PostScript Koordinaten — PostScript Language Reference Manual
    - standard mathematical practice
    - origin is located at the lower-left corner
    - positive x axis extending horizontally to the right
    - positive y axis extending vertically upward
    - length of a unit along x and y axes is 1/72 inch
    - default user space: all points have positive x and y values

    View Slide

  24. Bild auf der Seite platzieren
    • Grafik-Datei ausgeben mit image oder colorimage
    colorimage oder image erwarten für JPEGs auf dem Stack typischerweise:
    3 % Anzahl Farben (nur colorimage)
    false % für "single data source" (nur colorimage)
    % folgende Parameter auch für image-Operator
    proc % "datasrc" -- Prozedur, String, Datei, gefilterte Datei
    matrix % Abbildungsmatrix
    bits/sample % Bits pro Bildpunkt
    height % Bildpunkte vertikal
    width % Bildpunkte horizontal
    Photo anzeigen mit colorimage
    pllx plly translate % set photo origin
    % setup paramaters for colorimage
    w.pixel h.pixel bpp % pixel width, height + bits per pixel
    [ w.pixel 0 0 h.pixel neg 0 h.pixel ] % width height bpp matrix
    fileobj 0 setfileposition % width height bpp matrix
    % DCT = discrete cosine transform
    fileobj /DCTDecode filter % width height bpp matrix file
    false 3 % ... + single-data-source num-colors
    w.scale h.scale scale % scale image to "target" size
    colorimage % display image on current page

    View Slide

  25. JPEG analysieren
    • wichtige Meta-Daten
    - Bildgröße
    - Aufnahmedatum

    View Slide

  26. Kalenderberechnung
    • Wichtig zu wissen:
    - auf welchen Wochentag fällt der 1. Januar
    - an welchem Tag ist Ostern
    - trivial: Schaltjahr
    • Gauss
    - Wochentag des 1. Januar
    - Osterdatum
    • Feiertage ableiten von Ostern und Weihnachten
    • Umrechnungen
    - n-ter Tag im Jahr zu Datum
    - Datum zu Tagesnummer oder Wochentag

    View Slide

  27. Gauss - Wochentag des 1. Januar
    % firstDay - weekday number of January, 1st, of a year
    % Gauss' formula, as found in wikipedia
    % w = (1 + 5 * ((year-1) mod 4) +
    % 4 * ((year-1) mod 100) +
    % 6 * ((year-1) mod 400)
    % ) mod 7
    % year --> weekday (0..6 = So..Sa)
    /firstDay {
    dup % year year
    1 sub 4 mod 5 mul % year 1st
    exch dup % 1st year year
    1 sub 100 mod 4 mul % 1st year 2nd
    exch dup % 1st 2nd year year
    1 sub 400 mod 6 mul % 1st 2nd year 3rd
    exch pop add add 1 add
    7 mod
    } def

    View Slide

  28. Gauss’sche Osterformel
    • 1800 — Carl Friedrich Gauss
    • 1816 — korrigierte Fassung
    • 1997 — Heiner Lichtenberg
    - berücksichtigt spätere Änderungen
    - spätester Ostertermin ist der 25. April

    View Slide

  29. Osterformel von Lichtenberg, analog zu Gauss
    1. Säkularzahl K(X) = X div 100
    2. säkulare Mondschaltung M(K) = 15 + (3K + 3) div 4 -
    (8K + 13) div 25
    3. säkulare Sonnenschaltung S(K) = 2 - (3K + 3) div 4
    4. Mondparameter A(X) = X mod 19
    5. Keim für den ersten Vollmond im Frühling D(A,M) = (19A + M) mod 30
    6. kalendarische Korrekturgröße R(D,A) = (D + A div 11) div 29
    7. Ostergrenze OG(D,R) = 21 + D - R
    8. ersten Sonntag im März SZ(X,S) = 7 - (X + X div 4 + S)
    mod 7
    9. Entfernung des Ostersonntags von der
    Ostergrenze (Osterentfernung in Tagen) OE(OG,SZ) = 7 - (OG - SZ) mod 7
    10. Datum des Ostersonntags als Märzdatum
    (32. März = 1. April usw.) OS = OG + OE

    View Slide

  30. Osterformel in PostScript — mit Testhilfen
    % date of easter
    % year --> daynumber
    /easterDay {
    /X exch def
    % step 1
    % (**** step 1 ****) showstack pop
    X 100 idiv /K exch def
    % step 2
    % (**** step 2 ****) showstack pop
    15 K 1 add 3 mul 4 idiv add K 8 mul 13 add 25 idiv sub /M exch def
    % step 3
    % (**** step 3 ****) showstack pop
    2 K 1 add 3 mul 4 idiv sub /S exch def
    % step 4
    % (**** step 4 ****) showstack pop
    X 19 mod /A exch def
    % ... usw. ...
    % return the absolute day number / OS = relative to March
    X 3 1 dayOfYear 1 sub % get the zeroth of March
    OS add
    } def

    View Slide

  31. Osterformel in PostScript — der reine Code
    % date of easter
    % year --> daynumber
    /easterDay {
    /X exch def
    X 100 idiv /K exch def
    15 K 1 add 3 mul 4 idiv add K 8 mul 13 add 25 idiv sub /M exch def
    2 K 1 add 3 mul 4 idiv sub /S exch def
    X 19 mod /A exch def
    A 19 mul M add 30 mod /D exch def
    D A 11 idiv add 29 idiv /R exch def
    21 D add R sub /OG exch def
    7 X X 4 idiv add S add 7 mod sub /SZ exch def
    7 OG SZ sub 7 mod sub /OE exch def
    OG OE add /OS exch def
    X 3 1 dayOfYear 1 sub % get the zeroth of March
    OS add
    } def

    View Slide

  32. Organisation und Tests
    • Aufteilen in kleine Module
    • require Operator implementiert
    - bildet #include nach
    - vermeidet mehrfache includes
    • Unit-Tests analog xUnit
    - gut für Funktionen, die einen Ergebniswert liefern
    - noch keine Lösung für rein grafische Operatoren
    - Sichtkontrolle ist immer noch wichtig

    View Slide

  33. Zusammenbauen
    • Steuerdatei für einen Kalender enthält
    - Initialisierung
    · Duplex-Druck ausschalten
    - eigene Tools laden
    - Dictionary mit Kalenderbildern
    - Darstellungsparameter festlegen
    · Rahmen zeichnen
    · Bild beschneiden ja/nein
    · Beschnitt festlegen
    - Titelseite ausgeben
    - alle Kalenderseiten ausgeben
    - Statistiken

    View Slide

  34. Dictionary mit Kalenderbildern
    enthält ein Dictionary mit Angaben zum Titelblatt
    /photo.dict <<
    /title <<
    /variant 2
    /author (Klaus-Dieter Ost)
    /title (Frankfurt)
    /description [ (Frankfurter) utf8 (Spaziergänge) utf8 ]
    /year (2020)
    /copyrightYear (2019)
    /url ()
    >>

    View Slide

  35. pro Bild ein Dictionary mit Parametern
    /X0 <<
    /fname (pics/2020-ffm/cimg0450-16:9.jpg)
    /description (Platanen in der Nizza-Anlage) utf8
    /author (Klaus-Dieter Ost)
    /location (Frankfurt) utf8
    /year (2011)
    /date (2011-03-09)
    /clipAtY 0 % pixel value
    >>
    /X1 <<
    /fname (pics/2020-ffm/cimg4923.jpg)
    /description (Rote Front) utf8
    /author (Klaus-Dieter Ost)
    /location (Frankfurt, Haus der IGM im Gutleutviertel) utf8
    /year (2011)
    /date (2011-10-20)
    /clipAtY 200 % pixel value
    >>
    /X2 <<
    /fname (pics/2020-ffm/cimg5054.jpg)
    /description (Nacht am Main) utf8
    /author (Klaus-Dieter Ost)
    /location (Frankfurt, Blick von der Friedens-Brücke) utf8
    /year (2011)
    /date (2011-11-04)
    /clipAtY 1 % pixel value
    >>
    % usw.
    >> def

    View Slide

  36. Array mit allen Kalenderbildern in der richtigen Reihenfolge
    /all-photos [
    % 1 - 12 2020
    /X12
    /X0
    /X1
    /X4
    /X8
    /X6
    /X7
    /X11
    /X10
    /X9
    /X2
    /X3
    % 13 - 24 2021
    /X5
    ] def

    View Slide

  37. Kalender ausgeben
    Titelseite aufbereiten
    % ================================= %
    % %
    /COUNTRY (DE) def
    /COUNTRY.VARIANT (HE) def
    2020 01 month.first
    CURYEAR COUNTRY COUNTRY.VARIANT country.holidays
    title.page.grid showpage
    % %
    % ================================= %
    Alle Blätter drucken — vom Startmonat an, solange Bilder da sind
    all-photos {
    month.next oneSheet showpage
    } forall

    View Slide

  38. Einen neuen Kalender anlegen
    • Bilder zusammenstellen
    • Bild-Information im Dictionary
    • Startmonat festlegen
    • PDF erzeugen

    View Slide

  39. Was noch fehlt …
    • Kerning
    - Buchstaben-Abstände sind typografisch nicht korrekt
    • Metadaten der Bilder auswerten
    - Aufnahmedatum
    • Feiertagsberechnung
    - Kalender wird für ein bestimmtes Bundesland berechnet
    - mehr Text-Information nur sinnvoll mit richtiger Schriftberechnung
    - parametrisiert für Deutschland und deutsche Bundesländer
    • Erweiterung für andere Länder?
    - grundsätzlich möglich, da tabellengesteuert
    - Sprachanpassung?
    • Kalender interaktiv zusammenstellen?
    - Desktop
    - Web-Anwendung

    View Slide

  40. Wie so etwas beim Zugfahren entsteht
    • im schnellen ICE, aber trotzdem langsam …
    - Karlsruhe ab 6:49 - Frankfurt an: 7:52
    - Frankfurt ab: 18:05 - Karlsruhe an 19:07
    • "Umschaltzeiten"
    • Dokumentation zu PostScript etc.
    • WLAN verfügbar?
    • alle nötigen Dokumente auf dem Rechner?
    • …
    • noch oder schon müde?

    View Slide

  41. Erfahrung
    Kalender für beliebige Jahre
    • einfach zu erstellen
    • Kalendarium stimmt
    • erster Fehlschlag erfolgreich neu implementiert
    Extrem wichtig
    • Versionsverwaltung
    • ZFS
    Snapshots machen aber nicht soviel Spaß, wenn die Platte ziemlich voll ist

    View Slide

  42. Noch Fragen?

    View Slide

  43. Literatur - Typographie
    Grundbegriffe erklärt in einem Video auf dieser Seite:
    https://www.typografie.info/3/topic/18030-purup-film-%E2%80%9Egeschichte-der-schrift%E2%80%9C-
    offline/
    (Purup Electronics war ein Hersteller von Fotosatz-Anlagen, gehört jetzt zu Barco; der Purup-Film soll
    besser gewesen sein als das Video auf dieser Seite, ist aber nicht mehr frei verfügbar)
    Ein paar Begriffe sind auch hier erklärt:
    https://typetr.typenetwork.com/news/article/original-proforma-brochure-for-purup-electronics

    View Slide

  44. Literatur - PostScript + PDF
    Eine sehr umfangreiche Einführung liefert das Buch Mathematicl Illustrations - A manual of geometry and
    PostScript; die einzelnen Kapitel sind als PDF-Dokumente abrufbar:
    http://www.math.ubc.ca/~cass/graphics/manual/
    http://rgbcmyk.com.ar/en/history-of-postscript/
    http://rgbcmyk.com.ar/en/history-of-pdf/
    http://what-when-how.com/itext-5/understanding-the-carousel-object-system-itext-5/
    http://hacking-printers.net/wiki/index.php/PostScript
    http://paulbourke.net/dataformats/postscript
    http://pages.cs.wisc.edu/~rjl/landscape/

    View Slide

  45. Stackoverflow natürlich
    Kurt Pfeifle hat auf der GUUG-Jahrestagung in Frankfurt über PostScript erzählt. Der macht nichts anderes
    und ist ein ausgewiesener Experte:
    https://stackoverflow.com/users/359307/kurt-pfeifle

    View Slide

  46. Gute Nacht

    View Slide