--- /dev/null
+/remark.min.js
+/slides-offline.html
--- /dev/null
+
+SLIDES = event-driven-programming-in-perl
+BROWSER = google-chrome
+DOT = dot
+
+dotfiles = $(shell find . -iname '*.dot')
+svgfiles = $(patsubst %.dot,%.svg,$(dotfiles))
+
+all: offline
+
+clean:
+ rm -f slides-offline.html remark.min.js $(SLIDES).pdf $(svgfiles)
+
+offline: slides-offline.html remark.min.js $(svgfiles)
+
+pdf: $(SLIDES).pdf
+
+run: $(svgfiles)
+ $(BROWSER) slides.html
+
+run-offline: offline
+ $(BROWSER) slides-offline.html
+
+%.svg: %.dot
+ $(DOT) -Tsvg -o$@ $<
+
+$(SLIDES).pdf: slides.html $(wildcard css/*) $(wildcard img/*) $(svgfiles)
+ docker run --rm -v `pwd`:/pwd astefanutti/decktape /pwd/slides.html /pwd/$(SLIDES).pdf
+
+slides-offline.html: slides.html
+ sed -e '1 a <!-- This file is auto-generated - DO NOT EDIT!!! -->' \
+ -e 's!https://.*remark-latest\.min\.js!remark.min.js!' <$< >$@
+
+remark.min.js:
+ curl -Lo $@ https://gnab.github.io/remark/downloads/remark-latest.min.js
+
+.PHONY: all clean offline pdf run run-offline
+
--- /dev/null
+
+# Slides for "Event-driven Programming in Perl"
+
+This directory contains the slides for my talk entitled "Event-driven Programming in Perl".
+
+The slides were written in [Markdown](https://daringfireball.net/projects/markdown/) format and can be rendered with
+[remark](http://remarkjs.com/).
+
+## Options
+
+To view the slides:
+
+ make run
+
+To build a PDF version of the slides:
+
+ make pdf
+
--- /dev/null
+Event-driven programming in Perl
+Charles McGarvey | Mon, 6/18 at 2:00 pm | 50 minutes | Ballroom B
+
+Event-driven programming is a paradigm where programmers creates subroutines
+that get called when events occur. Events can be just about anything: timers
+expiring, new data becoming available to read from a socket, even humans
+clicking on things in an interactive program.
+
+Event-driven programming definitely isn't anything new, but there have been
+some interesting developments over the past ten years. Event-driven frameworks
+and applications have risen in popularity and are replacing systems built
+using outdated techniques. New methods and language features have been created
+to make event-driven programming nicer.
+
+In this talk we’ll go over:
+
+ - the language features in Perl that make event-driven programming happen,
+ - some CPAN modules that offer the extra functionality you need.
+
+This talk is somewhat geared toward beginners (either to Perl or to
+event-driven programming), but it may also be interesting to anyone wondering
+about the current state of event-driven programming in Perl.
--- /dev/null
+@import url(https://fonts.googleapis.com/css?family=Open+Sans);
+@import url(https://fonts.googleapis.com/css?family=Muli);
+@import url(https://fonts.googleapis.com/css?family=Inconsolata);
+
+.remark-slide-content {
+ font-family: 'Open Sans';
+ font-size: 22px;
+}
+
+.remark-slide-content h1,
+.remark-slide-content h2,
+.remark-slide-content h3 {
+ font-family: Muli;
+ font-weight: bold;
+}
+.remark-slide-content h2 {
+ font-size: 40px;
+}
+.remark-slide-content h3 {
+ font-size: 30px;
+}
+
+.remark-slide-content li {
+ line-height: 2em;
+}
+.remark-slide-content .condensed li {
+ line-height: 1em;
+}
+
+.remark-code, .remark-inline-code {
+ font-family: Inconsolata, monospace;
+}
+.remark-code {
+ border-radius: 5px;
+ border: 1px solid #ccc;
+}
+
+.remark-slide-content blockquote {
+ border-radius: 5px;
+ border: 1px solid #ccc;
+ background: #f0f0f0;
+ margin: 1.5em 0;
+ padding: 1em;
+ quotes: "\201C""\201D""\2018""\2019";
+ position: relative;
+}
+.remark-slide-content blockquote:before {
+ color: #ccc;
+ position: absolute;
+ content: open-quote;
+ font-size: 6em;
+ line-height: 0.1em;
+ margin-right: 0.25em;
+ vertical-align: -0.4em;
+}
+
+.remark-slide-content .col {
+ box-sizing: border-box;
+ display: block;
+ float: left;
+ border: 0;
+ margin: 0;
+ padding: 0;
+ width: 50%;
+}
+.remark-slide-content .col:nth-of-type(odd) {
+ padding: 0 1em 0 0;
+}
+.remark-slide-content .col:nth-of-type(even) {
+ padding: 0 0 0 1em;
+}
+.remark-slide-content .col.sep:nth-of-type(odd) {
+ border-right: 1px solid #ccc;
+}
+.remark-slide-content .col.sep:nth-of-type(even) {
+ border-left: 1px solid #ccc;
+}
+
+/* fix non-collapsing margin */
+.remark-slide-content .marginfix h3,
+.remark-slide-content .marginfix ul {
+ margin-top: 0;
+}
+
+.remark-slide-content .top-right {
+ float: right;
+ margin: 50px 0 0 2em;
+}
+
+.remark-slide-content .highlight {
+ color: #7d9726;
+}
+
--- /dev/null
+
+#slide-bluehost img {
+ width: 250px;
+}
+
--- /dev/null
+
+/*
+ * Create a shortcut on a number key to jump to a named slide.
+ *
+ * Using the hotkey on the target slide will go "back" to the slide that was active before jumping
+ * to the target slide.
+ *
+ * Example: Jump to the slide named "myslide" when the "1" key is pressed.
+ * createHotkey(1, 'myslide');
+ */
+function createHotkey(key, slideName) {
+ var targetSlide = slideshow.getSlideByName(slideName);
+ var lastSlide = -1;
+ document.addEventListener('keydown', function(e) {
+ if (e.which === key + 48) {
+ var currentNum = slideshow.getCurrentSlideIndex() + 1;
+ var targetNum = targetSlide.getSlideIndex() + 1;
+ if (currentNum !== targetNum) {
+ lastSlide = currentNum;
+ slideshow.gotoSlide(targetNum);
+ }
+ else {
+ slideshow.gotoSlide(lastSlide);
+ }
+ }
+ });
+};
+
+/*
+ * Set a hotkey "u" to navigate backwards in time.
+ *
+ * If you get on the wrong slide, this might be the easiest way to get back on track. This is what
+ * you might expect the browser's "Back" button to do if it worked.
+ */
+(function() {
+ var history = [];
+ var skip = false;
+ slideshow.on('hideSlide', function(slide) {
+ if (skip) {
+ skip = false;
+ return;
+ }
+ history.push(slide.getSlideIndex() + 1);
+ });
+ document.addEventListener('keydown', function(e) {
+ if (e.which === 85 /* [u]ndo */) {
+ var lastNum = history.pop();
+ if (lastNum) {
+ skip = true;
+ slideshow.gotoSlide(lastNum);
+ }
+ }
+ });
+})();
+
--- /dev/null
+
+Topics:
+
+Evolution of event-driven programming:
+- Wait for a key press or line of text.
+- Interrupts (hardware and software).
+- Modern event loops
+
+How to write a modern event-loop.
+- kernel facilities (poll, select, etc.)
+
+Event-drive programming in Perl
+- POE
+- AnyEvent
+- IO::Async
+
+List of already-built event loops.
+- EV
+- Glib
+
+Types of events in modern applications:
+- Data available
+- Timer
+- User input
+- Signal
+- Anything that can spontaneously happen in the real world.
+
+Exceptions in event-driven code.
+
+Promises:
+- Future
+- Future::AsyncAwait
+- Future::Utils
+
+Real-world uses for event-driven applications:
+- Webhooks
+- WebSockets
+- PubsubHubbub
+- msg queue
+
--- /dev/null
+<!DOCTYPE html>
+<html><head><meta charset="utf-8"><title>Event-driven Programming in Perl</title><link rel="stylesheet" href="css/common.css"><link rel="stylesheet" href="css/slides.css"></head><body><textarea id="source">
+
+class: center, middle
+name: title
+
+# Event-driven Programming in Perl
+
+Charles McGarvey
+
+???
+- Hi. I'm Charles McGarvey.
+- Been a Perl programmer for a long time...
+
+---
+class: center, middle
+name: bluehost
+
+![Bluehost](img/bluehost.png)
+
+### https://bluehost.com/jobs
+
+???
+- My employer is hiring.
+- It's a pretty cool employer...
+
+---
+class: center, middle
+name: conclusion
+
+## Conclusion:
+
+### Perl is fun.
+
+---
+class: center, middle
+name: last
+
+### Thanks.
+
+</textarea><script src="https://gnab.github.io/remark/downloads/remark-latest.min.js"></script><script>var slideshow = remark.create({countIncrementalSlides: true, highlightLanguage: '', highlightLines: true, ratio: '16:9', /*slideNumberFormat: '',*/ navigation: {scroll: false, touch: false, click: false}})</script><script src="js/common.js"></script><script src="js/slides.js"></script></body></html>
+<!-- vim: set ts=4 sts=4 sw=4 tw=120 et ft=markdown nowrap: -->