
Det verkar som om jag har haft möjlighet att göra tiotals presentationer för kollegor, kunder och offentliga tal under min karriÀr inom IT. MÄnga Är har PowerPoint varit mitt naturliga och pÄlitliga val för att skapa bildspel. Men i Är har situationen förÀndrats kvalitativt. FrÄn februari till maj hade jag nöjet att tala pÄ fem konferenser, och jag var tvungen att förbereda bilder till föredragen under tidspress, men av god kvalitet. FrÄgan om att delegera den del av arbetet som rör den visuella designen av bilderna till andra personer uppstod. En gÄng försökte jag samarbeta med en designer genom att skicka .pptx-filer via e-post, men arbetet förvandlades till kaos: ingen visste vilken version av bilderna som var
Vad vi vill
För ungefÀr ett och ett halvt Är sedan avstod vi i företaget frÄn att anvÀnda Word för att skapa projektdokumentation, efter att ha stött pÄ samma problem: Àven om Word Àr bra för att skriva en liten dokument, uppstÄr det svÄrigheter med samarbete och att fÄ en kvalitativ och enhetlig presentation nÀr volymerna ökar. VÄrt val föll pÄ , och vi slutar aldrig att glÀdjas över detta val, men det Àr Àmnet för en annan artikel. UngefÀr vid samma tidpunkt upptÀckte vi effektiviteten av en av DevOps-principerna "everything as code", sÄ valet av krav för den nya teknologin för att skapa presentationsbilder var ganska uppenbart:
- Presentationer bör bestÄ av en plain text-fil i ett markup-sprÄk.
- Bilderna handlar om utvecklingsprojekt, sÄ markupen bör tillÄta oss att enkelt, utan att behöva hjÀlp av externa system, infoga
- kodsnuttar med syntaxmarkering,
- enkla diagram i form av geometriska figurer kopplade med pilar,
- UML-diagram, flödesscheman och liknande.
- Projektpresentationen bör lagras i ett versionskontrollsystem.
- Validering och byggande av de fÀrdiga bilderna bör göras i en CI-system.
I dag finns det tvÄ grundlÀggande alternativ för att skapa bilder i markup-sprÄk: paketet för LaTeX eller en av ramverken för att skapa bilder i HTML/CSS (, , och mÄnga andra).
Ăven om min sjĂ€l dras till LaTeX, sa mitt förnuft att valet av en lösning som jag inte sjĂ€lva skulle anvĂ€nda, borde vara Ă„t det hĂ„ll av en lösning som Ă€r bekant för en bredare krets. LaTeX Ă€r inte vĂ€lkĂ€nt för alla, och om din vardagliga praktik inte handlar om att skriva vetenskapliga artiklar, finns det nog inte tid för att dyka ner i den omfattande, intrikata vĂ€rlden av detta system.
Trots detta Àr behÀrskning av HTML/CSS inte ett allmÀnt förekommande fÀrdighet: jag, till exempel, behÀrskar det inte helt. Lyckligtvis kommer den redan bekanta AsciiDoctor till hjÀlp: en konverterare som möjliggör skapandet av RevealJS-slides med hjÀlp av AsciiDoctor-markup. Och den Àr faktiskt enkel att lÀra sig och tillgÀnglig för alla!
Hur man kodar slides
För att förstÄ kÀrnan i kodning av slides i AsciiDoctor Àr det enklast att ge konkreta exempel. Alla dessa kommer frÄn verkliga slides som jag har skapat för mina konferenspresentationer detta Är.
En slide med en rubrik och en lista dÀr punkterna dyker upp en efter en:
== Varför behöver vi Streams API?
[%step]
* Realtidsströmbehandling
* Stream-liknande API (map / reduce)
* Under huven:
** Automatisk offset commit
** Rebalansering
** Intern status för behandlare
** LĂ€tt skalningResultat

Rubrik och fragment av kÀllkod med syntaxmarkering:
== Kafka Streams API: generell struktur för KStreams-applikationen
[source,java]
----
StreamsConfig config = ...;
// HÀr stÀller vi in olika alternativ
Topology topology = new StreamsBuilder()
// HĂ€r bygger vi topologi
....build();
----Resultat

Under förberedelserna för presentationen genomgÄr demonstrationskoden upprepade omarbetningar och förbÀttringar, dÀrför Àr det ovÀrderligt att snabbt kunna kopiera och klistra in "rÄ kod" direkt i sliden, vilket sÀkerstÀller relevansen av demonstrationsexemplet utan att behöva bekymra sig om syntaxmarkeringen.
Rubrik, illustration och text (layouten pÄ sliden gör vi i celler ):
== Kafka Streams in Action
[.custom-style]
[cols="30a,70a"]
|===
|image::KSIA.jpg[]
|
* **William Bejeck**, +
âKafkastreams i aktionâ, november 2018
* Exempelcode för Kafka 1.0
|===Resultat

Ibland behövs ingen rubrik, och för att illustrera din tanke behövs bara en bild i fullskÀrmslÀge:
[%notitle]
== Att leva med legacy Àr inte enkelt
image::swampman.jpg[canvas, size=cover]Resultat

Ofta behöver en tanke förstĂ€rkas med en enkel diagram, i form av "rutor som Ă€r kopplade med pilar". Lyckligtvis Ă€r AsciiDoctor integrerat med systemet â ett sprĂ„k som möjliggör beskrivning av grafdiagram baserat pĂ„ beskrivningen av noder och relationer mellan dem. Att bemĂ€stra Graphviz krĂ€ver tid, men att göra det utifrĂ„n befintliga exempel Ă€r ganska enkelt! SĂ„ hĂ€r ser det ut:
== Skriver "Bet Totalling App"
Vad Àr summan av utbetalningarna för gjorda insatser om resultatet slÄr in?
[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="Lokalt Lager"; fixedsize="true"; width="1.5"]
Source -> MapVal -> Sum -> Sink
Sum -> Store [dir=both; label=" n "]
{rank = same; Store; Sum;}
}
-----Resultat

Om det Ă€r nödvĂ€ndigt att redigera etiketten pĂ„ figuren, Ă€ndra pilens riktning osv. â kan detta göras direkt i presentationskoden, istĂ€llet för att rita om bilden nĂ„gon annanstans och sĂ€tta in den igen i sliden. Detta ökar avsevĂ€rt hastigheten pĂ„ arbetet med slids.
Ett nÄgot mer komplicerat exempel:
== Icke-reproducerbar byggnad
[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;}
}
-----Resultat

Förresten Àr det praktiskt att experimentera med Graphviz och justera bilder pÄ sidan .
Slutligen, om det behövs att infoga ett flödesschema, klassdiagram eller nÄgon annan standardiserad diagram, sÄ kan en annan integrerad med AsciiDoctor-systemet komma till hjÀlp, . Om PlantUML:s omfattande möjligheter har min kollega Nikolay Potashnikov skrivit .
Att omvandla presentationsprojektet till kod som lagras i versionskontrollsystemet möjliggör samarbete kring presentationen, framför allt att dela upp ansvaret för innehĂ„llsskapande och design. Utformningen av slids (typsnitt, bakgrunder, indrag) i RevealJS beskrivs med hjĂ€lp av CSS. Min personliga förmĂ„ga att hantera CSS övertrĂ€ffas bĂ€st av â men det Ă€r inget problem nĂ€r det finns folk som arbetar med CSS snabbare och smidigare Ă€n jag. I slutĂ€ndan innebĂ€r det att vi i ljuset av den snabbt nĂ€rmande deadline för presentationen kan arbeta samtidigt pĂ„ olika filer via Git och öka hastigheten pĂ„ det gemensamma arbetet, vilket inte Ă€r möjligt vid överföring av .pptx-filer via mejl.
Byggande av HTML-sida med slides
Vanlig textkÀllor Àr bra, men hur kompletterar man dem till sjÀlva presentationen?
AsciiDoctor Àr ett projekt skrivet i Ruby och kan köras pÄ flera sÀtt. För det första kan du installera Ruby-sprÄket och köra asciidoctor direkt, vilket förmodligen kommer att vara mest bekvÀmt för Ruby-utvecklare.
Om du inte vill ge dig in pÄ att installera Ruby kan du anvÀnda Docker-avbildningen , som vid körning kan koppla en mapp med projektets kÀllor via VOLUME och fÄ resultatet pÄ den angivna platsen.
Alternativet som jag valde kan verka nÄgot ovÀntat, men det Àr mest bekvÀmt för mig som Java-utvecklare. Det krÀver varken installation av Ruby eller Docker, men tillÄter att generera presentationer med hjÀlp av Maven-skript.
Det Ă€r sĂ„ att projektet â Java-implementationen av Ruby â Ă€r sĂ„ bra att det tillĂ„ter att köra praktiskt taget allt som skapats för Ruby i Java-maskinen, och att köra AsciiDoctor Ă€r en av de vanligaste anvĂ€ndningarna av JRuby.
NÀrvaron av möjliggör att kompilera AsciiDoctor-dokumentation som Àr en del av ett Java-projekt (vilket vi anvÀnder aktivt). BÄde AsciiDoctor och JRuby laddas ner automatiskt av Maven, och AsciiDoctor körs i JRuby-miljön: ingen installation pÄ maskinen behövs! (Förutom paketet graphviz, som behövs om du vill anvÀnda grafik frÄn GraphViz eller PlantUML.) Det rÀcker med att placera dina .adoc-filer i mappen src/main/asciidoc/. HÀr Àr , som samlar presentationer med diagram.
Konvertering av presentationer till PDF
Ăven om HTML-versionen av presentationerna Ă€r fullt sjĂ€lvförsörjande, Ă€r det fortfarande nödvĂ€ndigt att ha en PDF-version av presentationerna. För det första kan det hĂ€nda att vissa konferenser, som inte ger talarna möjlighet att ansluta sina egna bĂ€rbara datorer, krĂ€ver presentationerna "strikt i pptx- eller pdf-format", utan att förvĂ€nta sig att de Ă€ven finns i HTML. För det andra Ă€r det god ton att skicka en oförĂ€ndrad version av dina presentationer till arrangörerna i det format de visades i, i PDF-format för publicering av filen i konferensmaterialet.
Lyckligtvis hanterar detta uppgift Node.js-verktyget , som bygger pĂ„ â ett automatiseringssystem för att kontrollera Chrome-webblĂ€saren. Du kan konvertera en RevealJS-presentation till PDF med kommandot
node decktape.js -s 3200x1800 --slides 1-500
reveal "file:///index.html?fragments=true" slides.pdf TvÄ knep vid körning av decktape som jag kom fram till genom trial and error:
upplösningen via parameter
-sdet mÄste anges med dubbla marginaler, annars kan det uppstÄ problem med konverteringsresultateni URL:en för HTML-versionen av presentationen mÄste parametrar överföras
?fragments=true, vilket möjliggör skapandet av en separat PDF-sida för varje mellanliggande tillstÄnd av din bild (till exempel fem sidor för fem punkter pÄ listan, om de visas en i taget). Detta gör att man kan anvÀnda en sÄdan PDF för sig sjÀlv som en presentation under en förelÀsning.
Automatisk byggnation och publicering pÄ webben
Det Àr praktiskt nÀr bilderna samlas automatiskt vid Àndringar i versionskontrollsystemet, och Ànnu mer praktiskt nÀr de automatiskt sammanstÀllda bilderna publiceras pÄ internet för allmÀn anvÀndning. Bilder frÄn internet kan enkelt "spelats upp" för en publik frÄn vilken maskin som helst som Àr ansluten till internet och projektorn.
Eftersom vi arbetar med GitHub, Ă€r ett naturligt val av CI-system , och för hosting av avslutade presentationer â . IdĂ©n med github.io Ă€r att allt statiskt innehĂ„ll som placeras i grenen gh-pages av ditt projekt pĂ„ GitHub blir tillgĂ€ngligt pĂ„ adressen .gihub.io/.
Den fullstÀndiga konfigurationsfilen för TravisCI, som inkluderar kompileringen av HTML-versionen av sidan med hjÀlp av Maven, konvertering till PDF med decktape och uppladdning av resultaten till grenen gh-pages för publicering pÄ github.io, ser ut som .
För att bygga ett sÄdant projekt pÄ TravisCI-sidan mÄste miljövariablerna stÀllas in
GH_REFâ ett vĂ€rde av typen github.com/inponomarev/csa-hbGH_TOKENâ en Ă„tkomsttoken för GitHub. Den kan erhĂ„llas pĂ„ GitHub i instĂ€llningarna för din profil, Developer Settings -> Personal Access Tokens. Om du publicerar presentationen i ett offentligt repository, rĂ€cker det att ange den enda Ă„tkomstnivĂ„n "Access public repositories" för denna token.GH_USER_EMAIL/GH_USER_NAMEâ ett par namn/e-post som kommer att anvĂ€ndas för att göra ett push i grenengh-pages.
SÄledes leder varje kodcommit för presentationen pÄ GitHub till en automatisk ombyggnad av bilderna i HTML- och PDF-format och deras Äteruppladdning pÄ github.io. (SjÀlvklart bör man endast publicera de presentationer pÄ github.io som man slutligen vill göra offentliga.)
Exempel pÄ projekt
Slutligen â lĂ€nkar till nĂ„gra exempelprojekt för presentationer med konfigurerade Maven-skript och CI-konfiguration för Travis-CI, som kan klonas och anvĂ€ndas för att skapa egna presentationsprojekt:
(min presentation för JPoint 2019)
(min presentation för Heisenbug 2019)
FarvĂ€l, Powerpoint! Jag tror inte att jag nĂ„gonsin kommer att behöva dig för tekniska presentationer đ
KĂ€lla: habr.com
