Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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. 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
  2. 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
  3. 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
  4. "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!
  5. PostScript und PDF PostScript ist eine Sprache • enstanden ab

    1983 • Stack-basiert - HP-Taschenrechner - Burroughs B5000/B6000-Serie - HP3000 - Forth - OpenBoot PROM
  6. PostScript Sprachelemente • Datenelemente - string - number - dictionary

    - array • Arithmetik - add, mul, sub, div • Funktionen - Parameter auf dem Stack - Rückkehrwerte auf dem Stack
  7. 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 >
  8. 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
  9. 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
  10. 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
  11. 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
  12. 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)
  13. "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
  14. 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
  15. 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.
  16. 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
  17. 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
  18. 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
  19. 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
  20. 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
  21. 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
  22. 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
  23. 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
  24. 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
  25. 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
  26. 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
  27. 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
  28. 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 () >>
  29. 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
  30. 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
  31. 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
  32. Einen neuen Kalender anlegen • Bilder zusammenstellen • Bild-Information im

    Dictionary • Startmonat festlegen • PDF erzeugen
  33. 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
  34. 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?
  35. 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
  36. 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
  37. 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/
  38. 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