Reporting mal anders, Markdown sei Dank XHTML, HTML5, HTML slide shows, RTF, Microsoft Word docx,...
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