
In meiner IT-Karriere hatte ich die Gelegenheit, dutzende PrĂ€sentationen fĂŒr Kollegen, Kunden und öffentliche Auftritte zu halten. Viele Jahre lang war PowerPoint fĂŒr mich das natĂŒrliche und zuverlĂ€ssige Werkzeug zur Erstellung von Folien. Doch in diesem Jahr hat sich die Situation grundlegend geĂ€ndert. Von Februar bis Mai durfte ich auf fĂŒnf Konferenzen sprechen, wobei die Folien fĂŒr die VortrĂ€ge in kurzer Zeit, aber qualitativ hochwertig erstellt werden mussten. Daher stellte sich die Frage, den visuellen Designteil der Folien an andere Personen zu delegieren. Einmal versuchte ich, mit einem Designer zusammenzuarbeiten, indem ich .pptx-Dateien per E-Mail verschickte, aber es wurde chaotisch: Niemand wusste, welche Version der Folien die âneuesteâ war, und das Layout variierte aufgrund unterschiedlicher PowerPoint-Versionen und Schriftarten auf unseren Maschinen. Also beschloss ich, etwas Neues auszuprobieren. Ich versuchte es und seitdem denke ich nicht mehr daran, zu PowerPoint zurĂŒckzukehren.
Was wir möchten
Vor etwa anderthalb Jahren haben wir in unserem Unternehmen beschlossen, auf Word fĂŒr die Erstellung von Projektdokumentationen zu verzichten. Wir hatten mit genau denselben Problemen zu kĂ€mpfen: WĂ€hrend Word fĂŒr kleinere Dokumente geeignet ist, bringt die zunehmende Dokumentationsmenge Schwierigkeiten bei der Zusammenarbeit und dem Erhalt einer qualitativ hochwertigen, einheitlichen Formatierung mit sich. Unsere Wahl fiel auf , und darĂŒber freuen wir uns immer noch, aber das ist ein Thema fĂŒr einen separaten Artikel. Etwa zu dieser Zeit erkannten wir die Effizienz eines der DevOps-Prinzipien âeverything as codeâ, was unsere Anforderungen an die neue Technologie zur Erstellung von PrĂ€sentationsfolien ziemlich offensichtlich machte:
- Eine PrÀsentation sollte aus einer plain text-Datei im Markup-Format bestehen.
- Unsere Folien beziehen sich auf Entwicklungsprojekte, daher sollte das Markup es ermöglichen, einfach und ohne Hilfe externer Systeme
- Code-Snippets mit Syntax-Hervorhebung einzufĂŒgen,
- einfache Diagramme in Form von geometrischen Figuren, die durch Pfeile verbunden sind,
- UML-Diagramme, Flussdiagramme und mehr.
- Das Projekt der PrÀsentation sollte im Versionskontrollsystem gespeichert werden.
- Die Validierung und Kompilierung der fertigen Folien sollte in der CI-Plattform erfolgen.
FĂŒr heute gibt es zwei grundlegende Möglichkeiten, Folien in Markup-Sprachen zu erstellen: das Paket fĂŒr LaTeX oder eines der Frameworks zur Erstellung von Folien in HTML/CSS (, , und viele andere).
Obwohl mein Herz fĂŒr LaTeX schlĂ€gt, hat mein Verstand mir gesagt, dass ich eine Lösung wĂ€hlen sollte, die nicht nur ich benutze, sondern die auch einem breiteren Publikum bekannt ist. LaTeX ist nicht jedermanns Sache, und wenn Ihre tĂ€gliche Arbeit nicht mit dem Schreiben von wissenschaftlichen Artikeln verbunden ist, werden Sie wahrscheinlich nicht die Zeit haben, sich in die komplexe Welt dieses Systems einzuarbeiten.
Allerdings ist auch das Wissen ĂŒber HTML/CSS kein verbreiteter Skill: Ich beispielsweise beherrsche es bei weitem nicht in vollem Umfang. Zum GlĂŒck kommt uns hier der bereits bekannte AsciiDoctor zur Hilfe: Der Konverter ermöglicht die Erstellung von RevealJS-Folien mit AsciiDoctor-Markup. Und dieses ist einfach zu erlernen und fĂŒr jeden zugĂ€nglich!
Wie man Folien codiert
Um die Grundlagen der Foliencodierung in AsciiDoctor zu verstehen, ist es am einfachsten, konkrete Beispiele zu geben. Alle stammen aus realen Folien, die ich in diesem Jahr fĂŒr meine KonferenzvortrĂ€ge erstellt habe.
Titel-Slide mit einer Liste von Punkten, die nacheinander ausgeklappt werden:
== Warum benötigen wir das Streams API?
[%step]
* Echtzeit-Stream-Verarbeitung
* Stream-Ă€hnliche API (map / reduce)
* Im Hintergrund:
** Automatisches Offset-Commit
** Rebalancing
** Internen Zustand der Handler
** Einfaches ScalingErgebnis

Titel und ein Code-Snippet mit Syntax-Highlighting:
== Kafka Streams API: Grundstruktur einer KStreams-Anwendung
[source,java]
----
StreamsConfig config = ...;
// Hier setzen wir verschiedene Optionen
Topology topology = new StreamsBuilder()
// Hier bauen wir die Topologie
....build();
----Ergebnis

Im Zuge der Vorbereitung des Vortrags werden die Beispielcodes mehrfach ĂŒberarbeitet und optimiert. Daher ist es wertvoll, die Möglichkeit zu haben, den ârohen Codeâ schnell zu kopieren und direkt in die Folie einzufĂŒgen, um die AktualitĂ€t des Demo-Beispiels sicherzustellen, ohne sich um die Syntax-Hervorhebung kĂŒmmern zu mĂŒssen.
Titel, Illustrierung und Text (die Anordnung auf der Folie erfolgt in den Zellen der ):
== Kafka Streams in Action
[.custom-style]
[cols="30a,70a"]
|===
|image::KSIA.jpg[]
|
* **William Bejeck**, +
âKafka Streams in Actionâ, November 2018
* Beispielcodes fĂŒr Kafka 1.0
|===Ergebnis

Manchmal ist kein Titel erforderlich, und um deine Idee zu verdeutlichen, genĂŒgt einfach ein Bild ĂŒber die gesamte Folie:
[%notitle]
== Leben in Legacy ist nicht einfach
image::swampman.jpg[canvas, size=cover]Ergebnis

Oft ist es nötig, eine Idee mit einem einfachen Diagramm zu untermauern, das aus âKĂ€sten, die mit Pfeilen verbunden sindâ besteht. GlĂŒcklicherweise ist AsciiDoctor in das System integriert, â eine Sprache, die es ermöglicht, Diagramme zu beschreiben, die auf der Beschreibung von Knoten und den Verbindungen zwischen ihnen basieren. Graphviz muss man lernen, aber basierend auf den vorhandenen Beispielen ist das ziemlich einfach! So sieht es aus:
== Schreiben der âBet Totalling Appâ
Was ist die Auszahlungssumme fĂŒr getĂ€tigte EinsĂ€tze, wenn das Ergebnis eintritt?
[graphviz, "counting-topology.png"]
-----
digraph G {
graph [ dpi = 150 ];
rankdir="LR";
node [fontsize=18; shape="circle"; fixedsize="true"; width="1.1"];
Store [shape="cylinder"; label="Lokaler Speicher"; fixedsize="true"; width="1.5"]
Source -> MapVal -> Sum -> Sink
Sum -> Store [dir=both; label=" n "]
{rank = same; Store; Sum;}
}
-----Ergebnis

Falls es nötig ist, die Beschriftung in der Figur zu bearbeiten, die Richtung des Pfeils zu Ă€ndern usw. â kann dies direkt im PrĂ€sentationscode durchgefĂŒhrt werden, anstatt ein Bild irgendwo neu zu zeichnen und es erneut in die Folie einzufĂŒgen. Das erhöht die Effizienz bei der Arbeit an Folien erheblich.
Ein komplexeres Beispiel:
== Nicht reproduzierbare Zusammenstellung
[graphviz, "unstable-update.png"]
-----
digraph G {
rankdir="LR";
graph [ dpi = 150 ];
u -> r0;
u[shape=plaintext; label="linter updaten+ 13 warnings"]
r0[shape=point, width = 0]
r1 -> r0[ arrowhead = none, label="master branch" ];
r0-> r2 []; b1 -> b4; r1->b1
r1[label="150nwarnings"]
b1[label="± 0nwarnings"]
b4[label="± 0nwarnings"]
b4->r2
r2[label="163nwarnings", color="red", xlabel=<merge blocked>]
{rank = same; u; r0; b4;}
}
-----Ergebnis

Ăbrigens ist es praktisch, mit Graphviz zu experimentieren und Bilder auf der Seite zu debuggen. .
Wenn Sie schlieĂlich ein Flussdiagramm, ein Klassendiagramm oder ein anderes standardisiertes Diagramm in eine Folie einfĂŒgen mĂŒssen, kann ein weiteres, in AsciiDoctor integriertes System helfen, . Mein Kollege Nikolai Potashnikov hat einen .
die gesamte PrĂ€sentation in Code zu verwandeln, der im Versionskontrollsystem gespeichert ist, ermöglicht eine Zusammenarbeit an der PrĂ€sentation, insbesondere die Aufgaben zur Erstellung von Inhalten und zum Design zu trennen. Das Design der Folien (Schriftarten, HintergrĂŒnde, AbstĂ€nde) in RevealJS wird mithilfe von CSS beschrieben. Meine persönliche FĂ€higkeit, mit CSS umzugehen, wird am besten durch â aber das ist nicht schlimm, wenn es Leute gibt, die viel geschickter und schneller mit CSS arbeiten als ich. So können wir, angesichts der schnell nĂ€her kommenden Deadline fĂŒr die PrĂ€sentation, gleichzeitig an verschiedenen Dateien ĂŒber Git arbeiten und die Geschwindigkeit der Zusammenarbeit entwickeln, die mit dem Versenden von .pptx-Dateien per E-Mail unmöglich wĂ€re.
Zusammenstellung einer HTML-Seite mit Folien
Reiner Text-Quellcode ist groĂartig, aber wie kompiliert man ihn zur eigentlichen PrĂ€sentation?
AsciiDoctor ist ein in Ruby geschriebenes Projekt, das auf mehrere Arten gestartet werden kann. Erstens können Sie die Programmiersprache Ruby installieren und asciidoctor direkt ausfĂŒhren, was wahrscheinlich fĂŒr Ruby-Entwickler am nahegelegensten ist.
Wenn Sie sich nicht mit der Installation von Ruby herumschlagen möchten, können Sie das Docker-Image verwenden , das beim Starten Ihnen ermöglicht, ĂŒber VOLUME einen Ordner mit den Projektquellen anzuschlieĂen und das Ergebnis an einem bestimmten Ort zu erhalten.
Die Variante, auf der ich gelandet bin, mag etwas unerwartet erscheinen, ist aber fĂŒr mich als Java-Entwickler am bequemsten. Es erfordert keine Ruby-Installation und kein Docker, ermöglicht aber die Generierung von Folien mit Hilfe eines Maven-Skripts.
Es geht darum, dass das Projekt â eine Java-Implementierung der Ruby-Sprache â so gut ist, dass es ermöglicht, nahezu alles, was fĂŒr Ruby geschaffen wurde, in der Java-Maschine auszufĂŒhren, wobei die AusfĂŒhrung von AsciiDoctor eine der hĂ€ufigsten Anwendungen von JRuby ist.
Vorhandensein von ermöglicht das Erstellen von AsciiDoctor-Dokumentationen, die Teil eines Java-Projekts sind (was wir aktiv nutzen). Dabei werden AsciiDoctor und JRuby automatisch von Maven heruntergeladen, und AsciiDoctor wird in der JRuby-Umgebung ausgefĂŒhrt: es ist nichts auf der Maschine zu installieren! (AuĂer dem Paket graphviz, das benötigt wird, wenn Sie Grafiken von GraphViz oder PlantUML verwenden möchten.) Es genĂŒgt, Ihre .adoc-Dateien in den Ordner src/main/asciidoc/. Hier ist , das Folien mit Diagrammen generiert.
Die Konvertierung von Folien in PDF
Obwohl die HTML-Version der Folien völlig eigenstĂ€ndig ist, kann es dennoch notwendig sein, auch eine PDF-Version der Folien zu haben. Erstens kommt es vor, dass auf einigen Konferenzen, die dem Redner nicht die Möglichkeit bieten, einen eigenen Laptop anzuschlieĂen, die Folien "ausschlieĂlich im pptx- oder pdf-Format" verlangen, ohne zu erwarten, dass sie auch in HTML vorliegen. Zweitens ist es gute Umgangsform, den Organisatoren eine unverĂ€nderliche Version Ihrer Folien in dem Format zuzusenden, wie sie wĂ€hrend des Vortrags prĂ€sentiert wurden, im PDF-Format zur Veröffentlichung in den Konferenzmaterialien.
GlĂŒcklicherweise wird diese Aufgabe von einem Node.js-Tool , das auf basiert â einem Automatisierungssystem fĂŒr die Steuerung des Chrome-Browsers. Um eine RevealJS-PrĂ€sentation in PDF umzuwandeln, kann der folgende Befehl verwendet werden:
node decktape.js -s 3200x1800 --slides 1-500
reveal "file:///index.html?fragments=true" slides.pdf Zwei Tricks beim AusfĂŒhren von decktape, die ich durch Ausprobieren herausgefunden habe:
die Auflösung ĂŒber den Parameter
-smuss doppelt so hoch festgelegt werden, da sonst Probleme mit den Konvertergebnissen auftreten können.im URL der HTML-Version der PrĂ€sentation muss der Parameter ĂŒbergeben werden.
?fragments=true, was es ermöglicht, fĂŒr jeden Zwischenzustand Ihrer Folie eine separate PDF-Seite zu erstellen (zum Beispiel fĂŒnf Seiten fĂŒr fĂŒnf Punkte, wenn diese nacheinander gezeigt werden). Dadurch kann diese PDF auch eigenstĂ€ndig als PrĂ€sentation verwendet werden.
Automatische Zusammenstellung und Veröffentlichung im Web
Es ist praktisch, wenn Folien automatisch erstellt werden, wenn Ănderungen im Versionskontrollsystem vorgenommen werden, und noch besser, wenn die automatisch kompilierten Folien im Internet fĂŒr die allgemeine Nutzung veröffentlicht werden. Folien aus dem Internet können leicht von jedem mit dem Internet und einem Projektor verbundenen GerĂ€t prĂ€sentiert werden.
Da wir in unserer Arbeit GitHub verwenden, ist die naheliegendste Wahl fĂŒr das CI-System , und fĂŒr das Hosting der fertigen PrĂ€sentationen â . Die Idee von github.io ist, dass jeder statische Inhalt, der in den Branch gh-pages Ihres Projekts auf GitHub platziert wird, unter der Adresse .github.io/.
Die vollstĂ€ndige Konfigurationsdatei fĂŒr TravisCI, die die Kompilierung der HTML-Version der Seite mit Maven, die Konvertierung in PDF mittels DeckTape und das Hochladen der Ergebnisse in den Branch umfasst, gh-pages sieht folgendermaĂen aus: .
Um ein solches Projekt auf der TravisCI-Seite zu bauen, mĂŒssen Umgebungsvariablen eingerichtet werden:
GH_REFâ ein Wert im Format github.com/inponomarev/csa-hbGH_TOKENâ ein Zugangstoken fĂŒr GitHub. Dieses kann in den Einstellungen Ihres GitHub-Profils unter Developer Settings -> Personal Access Tokens generiert werden. Wenn Sie eine PrĂ€sentation in einem öffentlichen Repository veröffentlichen, benötigen Sie fĂŒr dieses Token nur den Zugriffslevel "Access public repositories."GH_USER_EMAIL/GH_USER_NAMEâ ein Paar von Name/E-Mail, unter dem der Push in den Branch erfolgt.gh-pages.
Somit fĂŒhrt jeder Code-Commit der PrĂ€sentation auf GitHub zur automatischen Neuanordnung der Folien in HTML- und PDF-Formaten und deren erneuten Hochladen auf github.io. (SelbstverstĂ€ndlich sollten nur die PrĂ€sentationen auf github.io veröffentlicht werden, die Sie letztendlich öffentlich machen möchten.)
Beispiele fĂŒr Projekte
AbschlieĂend finden Sie Links zu einigen Beispielen von PrĂ€sentationsprojekten mit eingerichteten Maven-Skripten und CI-Konfigurationen fĂŒr Travis-CI, die Sie klonen und fĂŒr Ihre eigenen PrĂ€sentationsprojekte verwenden können:
(mein Vortrag fĂŒr JPoint 2019)
(mein Vortrag fĂŒr Heisenbug 2019)
Leb wohl, PowerPoint! Ich glaube nicht, dass ich dich jemals fĂŒr technische PrĂ€sentationen brauchen werde đ
Quelle: habr.com
