From 499f996ae29359b7fd5179cad7e6cb367023354d Mon Sep 17 00:00:00 2001 From: Charles McGarvey Date: Mon, 11 Jul 2016 17:02:10 -0600 Subject: [PATCH 1/1] initial commit --- Makefile | 38 + README.md | 18 + abstract.txt | 18 + css/common.css | 79 +++ css/slides.css | 61 ++ img/avatar-miyagawa.jpg | Bin 0 -> 7222 bytes img/basic-flow1.dot | 24 + img/basic-flow2.dot | 27 + img/basic-flow3.dot | 28 + img/basic-flow4.dot | 35 + img/basic-flow5.dot | 38 + img/bluehost.png | Bin 0 -> 3250 bytes img/cgi.gif | Bin 0 -> 1724 bytes img/cpan.png | Bin 0 -> 11320 bytes img/fastcgi.png | Bin 0 -> 26016 bytes img/mod_perl.gif | Bin 0 -> 4776 bytes img/talkqr.svg | 9 + notes.txt | 35 + slides.html | 1476 +++++++++++++++++++++++++++++++++++++++ 19 files changed, 1886 insertions(+) create mode 100644 Makefile create mode 100644 README.md create mode 100644 abstract.txt create mode 100644 css/common.css create mode 100644 css/slides.css create mode 100644 img/avatar-miyagawa.jpg create mode 100644 img/basic-flow1.dot create mode 100644 img/basic-flow2.dot create mode 100644 img/basic-flow3.dot create mode 100644 img/basic-flow4.dot create mode 100644 img/basic-flow5.dot create mode 100644 img/bluehost.png create mode 100644 img/cgi.gif create mode 100644 img/cpan.png create mode 100644 img/fastcgi.png create mode 100644 img/mod_perl.gif create mode 100644 img/talkqr.svg create mode 100644 notes.txt create mode 100644 slides.html diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..eb0b95f --- /dev/null +++ b/Makefile @@ -0,0 +1,38 @@ + +SLIDES = introduction-to-psgi +BROWSER = chrome +DOT = dot + +dotfiles = $(shell find . -iname '*.dot') +svgfiles = $(patsubst %.dot,%.svg,$(dotfiles)) + +all: $(svgfiles) + +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 ' \ + -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 + diff --git a/README.md b/README.md new file mode 100644 index 0000000..9ca631d --- /dev/null +++ b/README.md @@ -0,0 +1,18 @@ + +# Slides for "Introduction to PSGI" + +This directory contains the slides for my talk entitled "Introduction to PSGI". + +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 + diff --git a/abstract.txt b/abstract.txt new file mode 100644 index 0000000..1240399 --- /dev/null +++ b/abstract.txt @@ -0,0 +1,18 @@ +If you write web apps in Perl (perhaps using Catalyst, Mojolicious, Dancer, or +one of the other great web frameworks), you are probably already using PSGI, +but do you understand how it works and why PSGI is so amazing? You should! If +you still write web apps using CGI, then there are many reasons why you should +create your next project using a PSGI-compatible web framework. + +PSGI is a specification, like CGI, that describes how web apps and web servers +can communicate. It stands for Perl web Server Gateway Interface, and the +first version of the specification was published to the CPAN on Oct 13, 2009. + +This talk will go over: +* what PSGI is and how it works, +* how it differs and is better than CGI, +* what makes it so cool, +* and how you can use it to do awesome things. + +You'll get the most out of this talk if you already know Perl and use it to +build web applications. diff --git a/css/common.css b/css/common.css new file mode 100644 index 0000000..63feb09 --- /dev/null +++ b/css/common.css @@ -0,0 +1,79 @@ +@import url(https://fonts.googleapis.com/css?family=Yanone+Kaffeesatz); +@import url(https://fonts.googleapis.com/css?family=Droid+Serif:400,700,400italic); +@import url(https://fonts.googleapis.com/css?family=Ubuntu+Mono:400,700,400italic); + +body { + font-family: 'Droid Serif'; +} + +h1, h2, h3 { + font-family: 'Yanone Kaffeesatz'; + font-weight: normal; +} + +.remark-slide-content li { + line-height: 2em; +} +.remark-slide-content .condensed li { + line-height: 1em; +} + + +.remark-code, .remark-inline-code { + font-family: Inconsolata, 'Ubuntu Mono'; +} +.remark-code { + border-radius: 5px; + border: 1px solid #ccc; +} + +blockquote { + border-radius: 5px; + border: 1px solid #ccc; + background: #f0f0f0; + margin: 1.5em 0; + padding: 1em; + quotes: "\201C""\201D""\2018""\2019"; + position: relative; +} +blockquote:before { + color: #ccc; + position: absolute; + content: open-quote; + font-size: 6em; + line-height: 0.1em; + margin-right: 0.25em; + vertical-align: -0.4em; +} + +.col { + box-sizing: border-box; + display: block; + float: left; + border: 0; + margin: 0; + padding: 0; + width: 50%; +} +.col:nth-of-type(odd) { + padding: 0 1em 0 0; +} +.col:nth-of-type(even) { + padding: 0 0 0 1em; +} +.col.sep:nth-of-type(odd) { + border-right: 1px solid #ccc; +} +.col.sep:nth-of-type(even) { + border-left: 1px solid #ccc; +} + +.top-right { + float: right; + margin: 50px 0 0 2em; +} + +.highlight { + color: #7d9726; +} + diff --git a/css/slides.css b/css/slides.css new file mode 100644 index 0000000..210a3db --- /dev/null +++ b/css/slides.css @@ -0,0 +1,61 @@ + +.basic-flow { + line-height: 200px; + height: 200px; +} +.basic-flow img { + display: inline-block; + vertical-align: middle; + max-width: 100%; +} + +/* fix overzealous syntax highlighter */ +.http .hljs-selector-tag, +.http .hljs-selector-class { + font-weight: normal; + color: inherit; +} + +.cgi .remark-code { + font-size: 22px; +} + +.fastcgi .remark-code { + font-size: 22px; +} + +.mod_perl .remark-code { + font-size: 20px; +} + +.psgi .remark-code { + font-size: 22px; +} + +/* fix non-collapsing margin */ +.psgi pre { + margin-bottom: 0; +} + +.plackup .remark-code { + font-size: 24px; +} + +.app-psgi .remark-code { + font-size: 22px; +} + +.env .condensed li { + line-height: 1.4em; +} + +.middleware .remark-code { + font-size: 22px; +} + +#slide-theend .talkqr img { + display: inline-block; + width: 230px; + height: 230px; +} + diff --git a/img/avatar-miyagawa.jpg b/img/avatar-miyagawa.jpg new file mode 100644 index 0000000000000000000000000000000000000000..44112ba31d517e8ce6f3c8ea4443a7edd6c5990c GIT binary patch literal 7222 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 "your\napp" [label="PSGI",dir=both,fontcolor=blue,fontsize=30] +} + diff --git a/img/basic-flow2.dot b/img/basic-flow2.dot new file mode 100644 index 0000000..0cebe6d --- /dev/null +++ b/img/basic-flow2.dot @@ -0,0 +1,27 @@ + +digraph G +{ + rankdir = LR + + node + [ + fontname = "Inconsolata" + fontsize = 22 + shape = record + style = rounded + ] + + edge + [ + fontname = "Inconsolata" + fontsize = 20 + arrowhead = vee + arrowtail = vee + ] + + "user\nagents" -> "web\nserver" [label="HTTP",dir=both] + "web\nserver" -> "your\napp" [label="PSGI",dir=both,fontcolor=blue,fontsize=30] + + "web\nserver" [style="rounded,filled",fillcolor="#FFFF88"] +} + diff --git a/img/basic-flow3.dot b/img/basic-flow3.dot new file mode 100644 index 0000000..bcaefde --- /dev/null +++ b/img/basic-flow3.dot @@ -0,0 +1,28 @@ + +digraph G +{ + rankdir = LR + + node + [ + fontname = "Inconsolata" + fontsize = 22 + shape = record + style = rounded + ] + + edge + [ + fontname = "Inconsolata" + fontsize = 20 + arrowhead = vee + arrowtail = vee + ] + + "user\nagents" -> "web\nserver" [label="HTTP",dir=both] + "web\nserver" -> "PSGI\nhandler" [label="CGI, mod_perl,\nFastCGI, HTTP",dir=both] + "PSGI\nhandler" -> "your\napp" [label="PSGI",dir=both,fontcolor=blue,fontsize=30] + + "PSGI\nhandler" [style="rounded,filled",fillcolor="#FFFF88"] +} + diff --git a/img/basic-flow4.dot b/img/basic-flow4.dot new file mode 100644 index 0000000..83ba026 --- /dev/null +++ b/img/basic-flow4.dot @@ -0,0 +1,35 @@ + +digraph G +{ + rankdir = LR + + node [ + fontname = "Inconsolata" + fontsize = 22 + shape = record + style = rounded + ] + + edge [ + fontname = "Inconsolata" + fontsize = 20 + arrowhead = vee + arrowtail = vee + ] + + "user\nagents" -> "web\nserver" [label="HTTP",dir=both] + "web\nserver" -> "PSGI\nhandler" [label="CGI, mod_perl,\nFastCGI, HTTP",dir=both] + "PSGI\nhandler" -> "your\napp" [label="PSGI",dir=both,fontcolor=blue,fontsize=30] + + subgraph cluster_devops { + fontname = "Inconsolata" + fontsize = 30 + label = "DevOps" + style = filled + fillcolor = "#FFFF88" + + "web\nserver" + "PSGI\nhandler" + } +} + diff --git a/img/basic-flow5.dot b/img/basic-flow5.dot new file mode 100644 index 0000000..5fbef5c --- /dev/null +++ b/img/basic-flow5.dot @@ -0,0 +1,38 @@ + +digraph G +{ + rankdir = LR + + node + [ + fontname = "Inconsolata" + fontsize = 22 + shape = record + style = rounded + ] + + edge + [ + fontname = "Inconsolata" + fontsize = 20 + arrowhead = vee + arrowtail = vee + ] + + "user\nagents" -> "web\nserver" [label="HTTP",dir=both] + "web\nserver" -> "PSGI\nhandler" [label="CGI, mod_perl,\nFastCGI, HTTP",dir=both] + "PSGI\nhandler" -> "web\nframework" [label="PSGI",dir=both,fontcolor=blue,fontsize=30] + "web\nframework" -> "your\napp" [label="???",dir=both] + + "web\nframework" [style="rounded,filled",fillcolor="#FFFF88"] + + subgraph cluster_devops { + fontname = "Inconsolata" + fontsize = 30 + label = "DevOps" + + "web\nserver" + "PSGI\nhandler" + } +} + diff --git a/img/bluehost.png b/img/bluehost.png new file mode 100644 index 0000000000000000000000000000000000000000..3a831807c89ef9c07dd5510b9a6197a83cd30127 GIT binary patch literal 3250 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 E0YzCy%>V!Z literal 0 HcmV?d00001 diff --git a/img/fastcgi.png b/img/fastcgi.png new file mode 100644 index 0000000000000000000000000000000000000000..458c0df742568cd68d52d63570bcd420cf828a2e GIT binary patch literal 26016 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

vp-(F@z|j!fx@>(c^(JEYO?dQw}) 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 literal 0 HcmV?d00001 diff --git a/img/talkqr.svg b/img/talkqr.svg new file mode 100644 index 0000000..9904271 --- /dev/null +++ b/img/talkqr.svg @@ -0,0 +1,9 @@ + + + QR Code + https://joind.in/talk/6e4d2 + + + + + diff --git a/notes.txt b/notes.txt new file mode 100644 index 0000000..49c810b --- /dev/null +++ b/notes.txt @@ -0,0 +1,35 @@ + +- High-level what is PSGI: + - Interface between web app and web server. + - a specification (not code) + +- Why care about understanding PSGI when you can just use a high-level language. + +- Alternatives: CGI, mod_perl, FCGI, SCGI, WSGI (Python), JSGI (JS), Rack (Ruby), ISAPI (IIS) + +- Describe how CGI, mod_perl, and FCGI work. + +PSGI is easy. RFC 3875 (CGI 1.1) is 36 pages. +The PSGI spec is shorter and much more consumable. + +Overview of HTTP? + +Implementations: + - Plack + - Alternatives: Paste (Python), + - Rack-compliant: Rack (Ruby), Clack (Common Lisp) + +Benefits of PSGI: +- Web frameworks only need to target PSGI. +- Easy to write tests because requests and responses are data, not necessarily bytestreams. + +- What frameworks support PSGI? + - [Catalyst](http://www.catalystframework.org/) + - [Mojolicious](http://mojolicious.org/) + - [Dancer](http://perldancer.org/) + - [CGI::Ex](https://github.com/chazmcgarvey/CGI-Ex/tree/psgi-2) + +- What handlers does plack support? + +- What types of things should be written as middleware? + diff --git a/slides.html b/slides.html new file mode 100644 index 0000000..5781fc8 --- /dev/null +++ b/slides.html @@ -0,0 +1,1476 @@ + +Introduction to PSGI + -- 2.45.2