Reporting mal anders, Markdown sei Dank XHTML, HTML5, HTML slide shows, RTF, Microsoft Word docx,...

22
2016/11/13 16:56 1/22 Reporting mal anders, Markdown sei Dank Alex & Ottmar's DokuWiki - https://gobrechts.net/wiki/ Reporting mal anders, Markdown sei Dank Ein Open Source Kochrezept Ottmar Gobrecht DOAG Konferenz 2016, Nürnberg Markdown hat sich in den letzten Jahren als vereinfachte Auszeichnungssprache zur HTML-Erstellung durchgesetzt. Es genügt ein einfacher Texteditor und wenige, allgemein gebräuchliche Konventionen, um z.B. eine Aufzählung in reinem Text auszuzeichnen, die jeder als solche erkennt. Dieser Vortrag erklärt anhand einer Beispiel-Implementierung, wie wir mit Hilfe von Markdown, dem Formatkonverter Pandoc, dem Textsatzsystem LaTeX, der Python Matplotlib und Node.js eine auf Open Source Tools basierende Reporting-Engine erstellen können, die per PL/SQL ansprechbar ist. Das Ergebnis sind hochwertige PDF-Dokumente in Buchdruckqualität, in denen Charts rein vektorbasiert eingebettet sind. Auch bei einer Konvertierung in HTML sind alle Charts vektorbasiert direkt in einer einzelnen HTML-Datei enthalten, wodurch die Weiterverarbeitung erleichtert wird. Was diese Reporting-Engine von anderen unterscheidet ist die Herangehensweise: Es werden keine pixelgenauen Templates erstellt, stattdessen überläßt man es LaTeX, wie der Text gesetzt und die Tabellen und Charts eingebettet werden. Und das ganze eben, ohne sich mit LaTeX-Quellcode auseinandersetzen zu müssen. Zur Auszeichnung wird Markdown verwendet und zur Definition von Tabellen und Charts verwenden wir trickreich die in Markdown vorhandene Möglichkeit, Codeblöcke zu hinterlegen, in die wir einfach unsere SQL-Abfragen eintragen. Motivation Wiki-Fan Markdown-APEX-Plugin Vorbereitung Vortrag APEX-Connect 2016 SQL-Code-Blöcke: Was tue ich da eigentlich? Idee: Markdown Reporter Die Idee Markdown kennt Codeblöcke Codeblöcke können SQL Statements sein Ein Beispiel in Markdown: SELECT * FROM user_tables SQL Statements kann eine Datenbank ausführen Also los: Codeblöcke durch Daten ersetzen 1. Daten in Charts wandeln 2. Fertig, jedenfalls theoretisch … 3.

Transcript of Reporting mal anders, Markdown sei Dank XHTML, HTML5, HTML slide shows, RTF, Microsoft Word docx,...

2016/11/13 16:56 1/22 Reporting mal anders, Markdown sei Dank

Alex & Ottmar's DokuWiki - https://gobrechts.net/wiki/

Reporting mal anders, Markdown sei Dank

Ein Open Source Kochrezept

Ottmar GobrechtDOAG Konferenz 2016, Nürnberg

Markdown hat sich in den letzten Jahren als vereinfachte Auszeichnungssprache zur HTML-Erstellungdurchgesetzt. Es genügt ein einfacher Texteditor und wenige, allgemein gebräuchliche Konventionen,um z.B. eine Aufzählung in reinem Text auszuzeichnen, die jeder als solche erkennt. Dieser Vortragerklärt anhand einer Beispiel-Implementierung, wie wir mit Hilfe von Markdown, dem FormatkonverterPandoc, dem Textsatzsystem LaTeX, der Python Matplotlib und Node.js eine auf Open Source Toolsbasierende Reporting-Engine erstellen können, die per PL/SQL ansprechbar ist. Das Ergebnis sindhochwertige PDF-Dokumente in Buchdruckqualität, in denen Charts rein vektorbasiert eingebettetsind. Auch bei einer Konvertierung in HTML sind alle Charts vektorbasiert direkt in einer einzelnenHTML-Datei enthalten, wodurch die Weiterverarbeitung erleichtert wird. Was diese Reporting-Enginevon anderen unterscheidet ist die Herangehensweise: Es werden keine pixelgenauen Templateserstellt, stattdessen überläßt man es LaTeX, wie der Text gesetzt und die Tabellen und Chartseingebettet werden. Und das ganze eben, ohne sich mit LaTeX-Quellcode auseinandersetzen zumüssen. Zur Auszeichnung wird Markdown verwendet und zur Definition von Tabellen und Chartsverwenden wir trickreich die in Markdown vorhandene Möglichkeit, Codeblöcke zu hinterlegen, in diewir einfach unsere SQL-Abfragen eintragen.

Motivation

Wiki-FanMarkdown-APEX-PluginVorbereitung Vortrag APEX-Connect 2016

SQL-Code-Blöcke: Was tue ich da eigentlich?Idee: Markdown Reporter

Die Idee

Markdown kennt CodeblöckeCodeblöcke können SQL Statements sein

Ein Beispiel in Markdown:

SELECT * FROM user_tables

SQL Statements kann eine Datenbank ausführenAlso los:

Codeblöcke durch Daten ersetzen1.Daten in Charts wandeln2.Fertig, jedenfalls theoretisch …3.

Last update: 2016/11/13 16:55 https://gobrechts.net/wiki/folien/reporting-mal-anders-markdown-sei-dank

https://gobrechts.net/wiki/ Printed on 2016/11/13 16:56

Warum Ein Kochrezept?

Beispielimplementierung aus Open Source KomponentenIndividuell anpassbarKeine Komponente größer als ein paar dutzend Zeilen CodeReporting ist ein hochgradig individuelles ThemaKlingt wie kochen nach Rezept und anpassen an eigenen Geschmack, oder?

Ein Gruß aus der Küche

Appetithäppchen

Beispieldaten

Einwohnerentwicklung New York, Rio, Tokio 1940 - 2010

Population Development,New York,Rio,Tokio1940,7454995,1759277,67788041950,7891957,2375280,53850711960,7781984,3300431,83100271970,7895563,4251918,88409421980,7071639,5090723,83518931990,7322564,5480768,81635732000,8008278,5857904,81346882010,8175133,6320446,8980768

Line Chart

2016/11/13 16:56 3/22 Reporting mal anders, Markdown sei Dank

Alex & Ottmar's DokuWiki - https://gobrechts.net/wiki/

Area Chart

Last update: 2016/11/13 16:55 https://gobrechts.net/wiki/folien/reporting-mal-anders-markdown-sei-dank

https://gobrechts.net/wiki/ Printed on 2016/11/13 16:56

Area Chart Stacked

2016/11/13 16:56 5/22 Reporting mal anders, Markdown sei Dank

Alex & Ottmar's DokuWiki - https://gobrechts.net/wiki/

Bar Chart

Last update: 2016/11/13 16:55 https://gobrechts.net/wiki/folien/reporting-mal-anders-markdown-sei-dank

https://gobrechts.net/wiki/ Printed on 2016/11/13 16:56

Bar Chart Stacked

2016/11/13 16:56 7/22 Reporting mal anders, Markdown sei Dank

Alex & Ottmar's DokuWiki - https://gobrechts.net/wiki/

Bar Chart Horizontal

Last update: 2016/11/13 16:55 https://gobrechts.net/wiki/folien/reporting-mal-anders-markdown-sei-dank

https://gobrechts.net/wiki/ Printed on 2016/11/13 16:56

Bar Chart Horizontal Stacked

2016/11/13 16:56 9/22 Reporting mal anders, Markdown sei Dank

Alex & Ottmar's DokuWiki - https://gobrechts.net/wiki/

Pie Chart

Last update: 2016/11/13 16:55 https://gobrechts.net/wiki/folien/reporting-mal-anders-markdown-sei-dank

https://gobrechts.net/wiki/ Printed on 2016/11/13 16:56

System Overview

2016/11/13 16:56 11/22 Reporting mal anders, Markdown sei Dank

Alex & Ottmar's DokuWiki - https://gobrechts.net/wiki/

APEX Demo

Der Demo Report im PDF Format

Last update: 2016/11/13 16:55 https://gobrechts.net/wiki/folien/reporting-mal-anders-markdown-sei-dank

https://gobrechts.net/wiki/ Printed on 2016/11/13 16:56

Zutatenliste

Selber Kochen

Überblick

Markdown (Auszeichnungssprache)Pandoc (Formatkonverter)LaTeX (PDF-Erstellung)Python Matplotlib, Pandas, Seaborn (Chart-Generierung)IPython/Jupyter (Chart-Entwicklung)Node.js (Web-Fernsteuerung)Markdown Reporter (PL/SQL Datenlieferant)APEX (Reporterstellung/-verwaltung)

Markdown

Vereinfachte Auszeichnungsprache zur HTML ErstellungDefinition: 2004, John Gruber, Aaron SwartzZiel: Ohne Konvertierung leicht les- und schreibbar

# Eine Überschrift Ein kurzer Absatz. * Ein Aufzählungspunkt* Noch einer mit *kursivem* und **fettem** Text

HTML = Publikations-FormatMarkdown = Schreib-FormatKomplette ursprüngliche Syntax, WeiterentwicklungenDas APEX Plugin

Pandoc

Universeller FormatkonverterLiest: Markdown, HTML, DocBook, LaTeX, Microsoft Word docx, OpenOffice/LibreOfficeODT, EPUB …Schreibt: XHTML, HTML5, HTML slide shows, RTF, Microsoft Word docx,OpenOffice/LibreOffice ODT, OpenDocument XML, EPUB Version 2 oder 3, LaTeX, PDF viaLaTeX, Markdown …

Kommandozeilentool (Windows, Mac OS X, Linux)

pandoc demo.md --from=markdown --to=html --output=demo.html

2016/11/13 16:56 13/22 Reporting mal anders, Markdown sei Dank

Alex & Ottmar's DokuWiki - https://gobrechts.net/wiki/

pandoc.org, Pandoc's Markdown

LaTeX

Makrosammlung (Textsatzsystem TeX)Guter Formelsatz, PDF-Exportlatex-project.org, Wikipedia en deDistributionen: MiKTeX, TeX Live …

Python Matplotlib

Programmbibliothek: Mathematische DarstellungenExportformate: SVG, PDF, PNG …matplotlib.org, Wikipedia en de

Last update: 2016/11/13 16:55 https://gobrechts.net/wiki/folien/reporting-mal-anders-markdown-sei-dank

https://gobrechts.net/wiki/ Printed on 2016/11/13 16:56

Python Pandas

Programmbibliothek: Datenstrukturen & AnalyseHochperformantes DataFrame Objekt …pandas.pydata.org, Wikipedia en

Python Seaborn

Programmbibliothek: Statistische Datenvisualisierungstanford.edu/~mwaskom/software/seaborn

IPython/Jupyter

Interaktive Shell (Client/Server Architektur)Browserbasiertes Notizbuch (JSON-Austauschformat)

2016/11/13 16:56 15/22 Reporting mal anders, Markdown sei Dank

Alex & Ottmar's DokuWiki - https://gobrechts.net/wiki/

ipython.org, Wikipedia en de, jupyter.org

Node.js

JavaScript Backend (Webserver, Laufzeitumgebung)Nonblocking Event Loopnodejs.org, Wikipedia en dePaketmanager: NPM

Markdown Reporter

https://github.com/ogobrecht/markdown-reporterPL/SQL Helper Package

Führt Queries in Codeblöcken ausErsetzt Queries durch CSV Daten oder Markdown-Tabellen

Last update: 2016/11/13 16:55 https://gobrechts.net/wiki/folien/reporting-mal-anders-markdown-sei-dank

https://gobrechts.net/wiki/ Printed on 2016/11/13 16:56

Ruft Pandoc per HTTP Call aufNode.js-Fernsteuerung für Pandoc

Minimaler WebserverFührt Pandoc als Shell-Befehl aus

Node.js führt die gleichen Shellscripte aus, die man auch zur Entwicklung lokal ausführt. Es ist wirklichnur eine Fernsteuerung übers Web, weil in der Regel in einer Produktivumgebung die Möglichkeitfehlt, solche Dienste lokal auf dem Datenbankserver zu hosten. Das ist auch der Grund, warumjegliches Logging in der Node-App fehlt. Es darf ausschließlich von der Datenbank zugegriffen werdenund etwaige Fehler können auf der Datenbank in eine Tabelle geschrieben werden.

Da die PDF-Erstellung in LaTeX recht aufwendig ist, sollte man überlegen, seitens der Datenbank dieAnzahl der gleichzeitigen PDF-Erstellungen zu limitieren. Dies kann durch eine Jobsteuerunggeschehen, was im Reporting-Umfeld ja sowieso oft der Fall ist.

Natürlich steht es jedem frei, alles nach seinen Wünschen anzupassen. Dies ist ja nur eineBeispielimplementierung, welche die Einstiegshürde in das Thema senken soll.

APEX

Muss dazu noch etwas gesagt werden?

apex.oracle.com

Fragen?

Vorbereitung

Installation Basiskomponenten

Unverbindlich: siehe “Geheimrezept für Windows”Ansonsten:

Pandoc & LaTeX, Node.jsPython (3.5.x)

Upgrade Paketmanager pip:Linux/OS X: pip3 install -U pipWindows: python -m pip install -U pip

pip3 install matplotlibpip3 install pandaspip3 install seabornpip3 install jupyter

Bei der Installation von seaborn unter Windows kann es zu folgendem Fehler kommen, wenn scipyinstalliert wird: No Lapack/Blas Resources Found

2016/11/13 16:56 17/22 Reporting mal anders, Markdown sei Dank

Alex & Ottmar's DokuWiki - https://gobrechts.net/wiki/

Dazu gibt es einen Stackoverflow Beitrag - hier (eine) mögliche Lösung in Kurzform:

Zur eigenen Python-Version (32/64 bit) passende, vorkompilierte Binärversion herunterladen -bei mir auf einem Windows 7 (64 bit) und Python (32 bit) war das dann die Dateiscipy-0.18.1-cp35-cp35m-win32.whlMit pip install localDownloadedFileName dann installierenDanach sollte die Wiederholung von pip install seaborn klappen

Später habe ich dann bei der Anwendung von dem Pandoc Python Filter wieder einen Fehlerbekommen, diesmal ging es um numpy+mkl - die Lösung ist fast die gleiche:

Vorkompilierte Binärversion herunterladen - bei mir war das numpy-1.11.2+mkl-cp35-cp35m-win32.whlMit pip install localDownloadedFileName installieren

Installation Pandoc Fernsteuerung

Markdown Reporter downloadenentpacken, ins Rootverzeichnis wechselnnpm install (dort, wo package.json liegt)node app.jsIm Browser http://localhost:3000 aufrufenmit Pandoc example form rumspielen

Installation PL/SQL Helper Package

Markdown Reporter Download, Unterverzeichnis oracle_plsqlKompilieren von markdown_reporter.pks/pkbEventuell Anlage von JobtabellenReportverwaltung könnte in APEX stattfinden

Zubereitung

Markdown Reporter - Demo Chart

SELECT markdown_reporter.convert_document( p_format => 'pdf' -- html, pdf, docx (with png's only) , p_markdown => markdown_reporter.preprocess_data(p_markdown => q'[``` { .sql .chart .line caption="Demo Chart"}SELECT 1940 "Population Development", 7454995 "New York", 1759277 "Rio" , 6778804 "Tokio" FROM dual UNION ALLSELECT 1950,7891957,2375280,5385071 FROM dual UNION ALLSELECT 1960,7781984,3300431,8310027 FROM dual UNION ALLSELECT 1970,7895563,4251918,8840942 FROM dual UNION ALLSELECT 1980,7071639,5090723,8351893 FROM dual UNION ALL

Last update: 2016/11/13 16:55 https://gobrechts.net/wiki/folien/reporting-mal-anders-markdown-sei-dank

https://gobrechts.net/wiki/ Printed on 2016/11/13 16:56

SELECT 1990,7322564,5480768,8163573 FROM dual UNION ALLSELECT 2000,8008278,5857904,8134688 FROM dual UNION ALLSELECT 2010,8175133,6320446,8980768 FROM dual;```]')) FROM dual;

Das Ergebnis dieser Query

Eingangsdaten Pandoc

SELECT markdown_reporter.preprocess_data(p_markdown => '...') FROM dual;

``` { .sql .chart .line caption="Demo Chart"}"Population Development","New York","Rio","Tokio""1940","7454995","1759277","6778804""1950","7891957","2375280","5385071""1960","7781984","3300431","8310027""1970","7895563","4251918","8840942""1980","7071639","5090723","8351893""1990","7322564","5480768","8163573""2000","8008278","5857904","8134688""2010","8175133","6320446","8980768"```

Pandoc Filter

Die ganze Magie findet in einem Pandoc Filter statt

Pandoc wandelt Markdown in Zwischenformat JSONÜber Zwischenformat iteriert der FilterCode-Blöcke mit Klassen SQL & Chart werden aufbereitetDiese Aufbereitung können wir ergänzen

Pandoc Filter - Beispiel Line Chart

#---<snip>-----------------------------------------------------------# read csv data from code blockdf = pd.read_csv(StringIO( code ), index_col=, parse_dates=True)# create chartif charttype == 'line': ax = df.plot.line(subplots=False, figsize=(width/96, height/96), \ legend=legend) # size must be given in inches, default is 96 dpi#---<snip>-----------------------------------------------------------# set title and axis labelsif title != '':

2016/11/13 16:56 19/22 Reporting mal anders, Markdown sei Dank

Alex & Ottmar's DokuWiki - https://gobrechts.net/wiki/

ax.set_title(title)#---<snip>-----------------------------------------------------------# clean up chart with seaborn despine methodsns.despine()# save chartplt.savefig(filename)#---<snip>-----------------------------------------------------------

Der komplette Filter

Chartentwicklung mit Jupyter

Jupyter Start mit Shellaufruf:

jupyter notebook

Jupyter-DocsDas Notizbuch aus dem Markdown Reporter Projekt

Jupyter Notebook

Notebook Schritt für Schritt ausführen

Last update: 2016/11/13 16:55 https://gobrechts.net/wiki/folien/reporting-mal-anders-markdown-sei-dank

https://gobrechts.net/wiki/ Printed on 2016/11/13 16:56

Jupyter Demo

Fragen?

Geheimrezept für Windows

Alles ohne Installation

Für einen unverbindlichen Test oder eine temporäre Entwicklungsumgebung ohne Adminrechte:

Pandoc:

msiexec /a pathToMsiFile /qb TARGETDIR=pathToTargetDir

Full Python Stack: https://winpython.github.io/LaTeX: http://miktex.org/portableNode.js: http://gareth.flowers/nodejs-portable/

Natürlich muß man sich selbst um die Pfadangaben kümmern, wenn man alles portabel installiert -aber man kann sich ja mit Batchdateien aushelfen - hier ein Beispiel:

convert.portable.bat

echo offcls if [%1]==[] echo Please provide the desired target format as a

2016/11/13 16:56 21/22 Reporting mal anders, Markdown sei Dank

Alex & Ottmar's DokuWiki - https://gobrechts.net/wiki/

parameter - example: convert html & goto end set format=%1set filterformat=%1set filter=..\..\pandoc_filter\pandocFilterMarkdownReporter.pyset datadir=..set pandoc=c:\og\PortableApps\pandoc\pandoc.exesetpython=c:\og\PortableApps\python\python-3.5.2.amd64\python.exeset latex=c:\og\PortableApps\miktex\miktex\bin\lualatex.exe

rem remove the first parameter (the format)shiftrem fill var params with remaining parametersset params=%1:loopshiftif [%1]==[] goto afterloopset params=%params% %1goto loop:afterloop

rem ensure the same format names like pandoc - for PDF files the outputformat is latex!if %format%==pdf set filterformat=latex echo generate JSON source...%pandoc% document.md --from=markdown --to=json --output=document.json%params% echo apply filter (generate charts from relevant code blocks)...%python% %filter% %filterformat% echo generate target document...if %format%==html %pandoc% document.filtered.json --from=json --to=html--output=document.html --data-dir=%datadir% --self-contained --standalone %params%if %format%==docx %pandoc% document.filtered.json --from=json --to=docx--output=document.docx --data-dir=%datadir% %params%if %format%==pdf %pandoc% document.filtered.json --from=json --to=latex --output=document.pdf --data-dir=%datadir% --latex-engine=%latex% %params%

:end

Portable Stolperfallen - MikTeX

Will zur Laufzeit nachinstallieren

Last update: 2016/11/13 16:55 https://gobrechts.net/wiki/folien/reporting-mal-anders-markdown-sei-dank

https://gobrechts.net/wiki/ Printed on 2016/11/13 16:56

Autoinstall einschalten1.Proxy konfigurieren2.Repository einstellen3.

Genutzte Features immer lokal testen

The End

Fragen?

[email protected]/ogobrecht

From:https://gobrechts.net/wiki/ - Alex & Ottmar's DokuWiki

Permanent link:https://gobrechts.net/wiki/folien/reporting-mal-anders-markdown-sei-dank

Last update: 2016/11/13 16:55