summaryrefslogtreecommitdiffstats
path: root/talks/cowboy-0.8
diff options
context:
space:
mode:
authorLoïc Hoguin <[email protected]>2016-03-28 15:36:42 +0200
committerLoïc Hoguin <[email protected]>2016-03-28 15:36:42 +0200
commitfe3492a98de29942477b061cd02c92246f4bf85a (patch)
tree2255b796a657e6e4dfb72beec1141258d17f1220 /talks/cowboy-0.8
downloadninenines.eu-fe3492a98de29942477b061cd02c92246f4bf85a.tar.gz
ninenines.eu-fe3492a98de29942477b061cd02c92246f4bf85a.tar.bz2
ninenines.eu-fe3492a98de29942477b061cd02c92246f4bf85a.zip
Initial commit, new website system
Diffstat (limited to 'talks/cowboy-0.8')
-rw-r--r--talks/cowboy-0.8/cowboy-0.8.html612
-rw-r--r--talks/cowboy-0.8/pics/adgear.pngbin0 -> 74256 bytes
-rw-r--r--talks/cowboy-0.8/pics/cowboy.pngbin0 -> 178106 bytes
-rw-r--r--talks/cowboy-0.8/pics/popularity-feb-2013.pngbin0 -> 25896 bytes
-rw-r--r--talks/cowboy-0.8/ui/default/blank.gifbin0 -> 49 bytes
-rwxr-xr-xtalks/cowboy-0.8/ui/default/bodybg.gifbin0 -> 10119 bytes
-rw-r--r--talks/cowboy-0.8/ui/default/framing.css23
-rw-r--r--talks/cowboy-0.8/ui/default/iepngfix.htc42
-rw-r--r--talks/cowboy-0.8/ui/default/opera.css7
-rw-r--r--talks/cowboy-0.8/ui/default/outline.css15
-rw-r--r--talks/cowboy-0.8/ui/default/pretty.css254
-rw-r--r--talks/cowboy-0.8/ui/default/print.css1
-rw-r--r--talks/cowboy-0.8/ui/default/s5-core.css9
-rw-r--r--talks/cowboy-0.8/ui/default/slides.css3
-rw-r--r--talks/cowboy-0.8/ui/default/slides.js545
-rw-r--r--talks/cowboy-0.8/ui/img/footer_bg.pngbin0 -> 978 bytes
-rw-r--r--talks/cowboy-0.8/ui/img/footer_logo.pngbin0 -> 2314 bytes
-rw-r--r--talks/cowboy-0.8/ui/img/footer_shadow.pngbin0 -> 949 bytes
-rw-r--r--talks/cowboy-0.8/ui/img/logo.pngbin0 -> 4379 bytes
-rw-r--r--talks/cowboy-0.8/ui/img/logo.svg44
20 files changed, 1555 insertions, 0 deletions
diff --git a/talks/cowboy-0.8/cowboy-0.8.html b/talks/cowboy-0.8/cowboy-0.8.html
new file mode 100644
index 00000000..e3e1d7dd
--- /dev/null
+++ b/talks/cowboy-0.8/cowboy-0.8.html
@@ -0,0 +1,612 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+<title>The new Cowboy</title>
+<!-- metadata -->
+<meta charset="utf8" />
+<meta name="generator" content="S5" />
+<meta name="version" content="S5 1.1" />
+<meta name="presdate" content="20130322" />
+<meta name="author" content="Loïc Hoguin" />
+<meta name="company" content="Nine Nines" />
+<!-- configuration parameters -->
+<meta name="defaultView" content="slideshow" />
+<meta name="controlVis" content="visible" />
+<!-- style sheet links -->
+<link rel="stylesheet" href="ui/default/slides.css" type="text/css" media="projection" id="slideProj" />
+<link rel="stylesheet" href="ui/default/outline.css" type="text/css" media="screen" id="outlineStyle" />
+<link rel="stylesheet" href="ui/default/print.css" type="text/css" media="print" id="slidePrint" />
+<link rel="stylesheet" href="ui/default/opera.css" type="text/css" media="projection" id="operaFix" />
+<!-- S5 JS -->
+<script src="ui/default/slides.js" type="text/javascript"></script>
+</head>
+<body>
+
+<div class="layout">
+<div id="controls"><!-- DO NOT EDIT --></div>
+<div id="currentSlide"><!-- DO NOT EDIT --></div>
+<div id="header">
+ <div id="sub_header"></div>
+ <div id="logo"><img src="ui/img/logo.svg"/></div>
+</div>
+<div id="footer">
+<div id="footer_shadow"></div>
+<h1>Erlang Factory SF 2013</h1>
+<h2>The new Cowboy, Nine Nines</h2>
+</div>
+
+</div>
+
+
+<div class="presentation">
+
+<div class="slide">
+<h1>The new Cowboy</h1>
+<h2>Le Cowboy nouveau est arrivé !</h2>
+<h3>Loïc Hoguin - @lhoguin</h3>
+<h4>Erlang Cowboy and Nine Nines Founder</h4>
+</div>
+
+
+<div class="slide">
+<h1>The Cowboy guy</h1>
+</div>
+
+
+<div class="slide">
+<h1>Fact 1</h1>
+<ul>
+<li>I know you but I forgot your name or face, remind me!</li>
+</ul>
+</div>
+
+
+<div class="slide">
+<h1>Fact 2</h1>
+<ul>
+<li>Not drinking alcohol, offer me a coke, not a beer!</li>
+</ul>
+</div>
+
+
+<div class="slide">
+<h1>Fact 3</h1>
+<ul>
+<li>I forget my hat all the time. :(</li>
+</ul>
+</div>
+
+
+<div class="slide">
+<h1>The road so far</h1>
+</div>
+
+
+<div class="slide">
+<h1>Beginnings</h1>
+<ul>
+<li>Unsatisfied with existing solutions</li>
+<li>Wanted a mix of Webmachine and Misultin<ul>
+ <li>With binaries</li>
+ <li>And dynamic "listeners"</li>
+ <li>And some icing on top</li>
+</ul></li>
+<li>First commit on March 7th 2011</li>
+</ul>
+</div>
+
+
+<div class="slide">
+<h1>Initial goals</h1>
+<ul>
+<li>Binary</li>
+<li>Dynamic listeners</li>
+<li>Low latency and memory usage</li>
+<li>One Erlang process per connection</li>
+<li>Small codebase</li>
+<li>Clean Erlang code</li>
+</ul>
+</div>
+
+
+<div class="slide">
+<h1>Initial reactions</h1>
+<ul>
+<li>Encouraging</li>
+<li>Community started growing slowly</li>
+<li>People started recommending Cowboy to others</li>
+<li>First Cowboy talk at EUC 2011 had a full room</li>
+</ul>
+</div>
+
+
+<div class="slide">
+<h1>Misultin's help</h1>
+<ul>
+<li>Great project</li>
+<li>Still unmatched in usability</li>
+<li>Development stopped in favor of Cowboy</li>
+<li>Boosted Cowboy's adoption</li>
+<li>My thanks go to Roberto Ostinelli</li>
+</ul>
+</div>
+
+
+<div class="slide">
+<h1>The road to stable</h1>
+<ul>
+<li>Few changes for about 6 months</li>
+<li>Spent a lot of time figuring things out</li>
+<li>Then spent a lot more time getting things done</li>
+<li>A few improvements remain to be done</li>
+</ul>
+</div>
+
+
+<div class="slide">
+<h1>Recent changes</h1>
+</div>
+
+
+<div class="slide">
+<h1>Mascot</h1>
+<img src="pics/cowboy.png"/>
+</div>
+
+
+<div class="slide">
+<h1>New goals</h1>
+<ul>
+<li>Complete HTTP stack</li>
+<li>Complete support for the modern web</li>
+<li>Good documentation</li>
+<li>Stable version</li>
+<li>Target non-Erlang developers</li>
+</ul>
+</div>
+
+
+<div class="slide">
+<h1>New conventions</h1>
+<ul>
+<li>Everything is a binary, including method and header names</li>
+<li>HTTP header names are lowercase</li>
+<li>cowboy_http_req -&gt; cowboy_req</li>
+<li>cowboy_http_* -&gt; cowboy_*</li>
+</ul>
+</div>
+
+
+<div class="slide">
+<h1>HTTP</h1>
+<ul>
+<li>Improved HTTP/1.1 and HTTP/1.0 support</li>
+<li>Built-in response compression</li>
+<li>Built-in parsing of HTTP headers</li>
+<li>Much faster request body streaming code</li>
+<li>Properly detect socket close in long-polling</li>
+</ul>
+</div>
+
+
+<div class="slide">
+<h1>HTTP Req</h1>
+<ul>
+<li>Normalized cowboy_req API</li>
+<li>Access: {Value, Req}</li>
+<li>Action: {Result, Req} | {Result, Value, Req} | {error, atom()}</li>
+<li>Modification: Req</li>
+<li>Question: boolean()</li>
+</ul>
+</div>
+
+
+<div class="slide">
+<h1>Websocket</h1>
+<ul>
+<li>Fully passes the Autobahn test suite</li>
+<li>Much faster at processing frames</li>
+<li>Text frames now required to be valid UTF-8</li>
+</ul>
+</div>
+
+
+<div class="slide">
+<h1>REST</h1>
+<ul>
+<li>Better error reporting</li>
+<li>PATCH method support</li>
+<li>Still experimental, no documentation</li>
+<li>Widely adopted by users</li>
+</ul>
+</div>
+
+
+<div class="slide">
+<h1>More powerful routing</h1>
+<ul>
+<li>Routes must now be compiled</li>
+<li>Nicer string-based syntax</li>
+<li>Constraints: apply functions on bound values</li>
+<li>Allows distinguishing between these two:<ul>
+ <li>/api/42/add</li>
+ <li>/api/blue/add</li>
+</ul></li>
+</ul>
+</div>
+
+
+<div class="slide">
+<h1>Middlewares</h1>
+<ul>
+<li>Hook code at any point in request handling</li>
+<li>Replace routing or handling components of request processing</li>
+<li>Not WSGI</li>
+<li>WSGI: data centric, chain request, then reverse chain response</li>
+<li>Cowboy: chain of execution, only chain request, response happens at any point</li>
+</ul>
+</div>
+
+
+<div class="slide">
+<h1>Documentation</h1>
+<ul>
+<li>Cowboy now has a guide!</li>
+<li>Still many improvements can be made</li>
+<li>Feedback needed</li>
+</ul>
+</div>
+
+
+<div class="slide">
+<h1>Focus on performance</h1>
+</div>
+
+
+<div class="slide">
+<h1>Improvements</h1>
+<img src="pics/adgear.png"/>
+</div>
+
+
+<div class="slide">
+<h1>Testing in production</h1>
+<ul>
+<li>Synthetic benchmarks don't help</li>
+<li>Most interesting results are under heavy load</li>
+<li>Users' production systems are the best benchmark</li>
+<li>The PROWESS Project might deliver benchmarking tools later on</li>
+</ul>
+</div>
+
+
+<div class="slide">
+<h1>NIFs and BIFs</h1>
+<ul>
+<li>NIFs considered harmful</li>
+<li>BIFs can be harmful too!</li>
+<li>BIF doesn't mean "fast" or "scheduler friendly"</li>
+</ul>
+</div>
+
+
+<div class="slide">
+<h1>Example of BIFs killing scalability</h1>
+<ul>
+<li>erlang:decode_packet/3</li>
+<li>binary:match/2</li>
+<li>lists:length/1</li>
+<li>...</li>
+</ul>
+</div>
+
+
+<div class="slide">
+<h1>Performance tips</h1>
+<ul>
+<li>Measure, measure, measure</li>
+<li>Don't assume something is faster, measure it</li>
+<li>Optimize the critical code path</li>
+<li>Don't waste your time on code that is rarely ran</li>
+</ul>
+</div>
+
+
+<div class="slide">
+<h1>Project status</h1>
+</div>
+
+
+<div class="slide">
+<h1>Actively developed</h1>
+<ul>
+<li>Cowboy is Nine Nines' main product</li>
+<li>Cowboy is the central project of a family</li>
+<li>Cowboy is key to Nine Nines' future SaaS solution</li>
+</ul>
+</div>
+
+
+<div class="slide">
+<h1>Popular</h1>
+<img src="pics/popularity-feb-2013.png"/>
+</div>
+
+
+<div class="slide">
+<h1>Many contributors</h1>
+<ul>
+<li>Exponential growth</li>
+<li>More than 50 total contributors in 2 years</li>
+<li>Half of them over the past 9 months!</li>
+<li>470+ total tickets</li>
+<li>200+ total pull requests</li>
+</ul>
+</div>
+
+
+<div class="slide">
+<h1>Many success stories</h1>
+<ul>
+<li>Kóði for realtime financial market data streaming</li>
+<li>2600Hz in Kazoo, their telecom platform</li>
+<li>Heroku for Logplex, a high-performance, realtime system for log delivery</li>
+<li>Linden Lab for Versu, an interactive storytelling platform</li>
+<li>BLOOM for AdGear, their realtime ad bidding system</li>
+</ul>
+</div>
+
+
+<div class="slide">
+<h1>More success stories</h1>
+<ul>
+<li>jtendo.com for a dynamic mobile provisioning system</li>
+<li>Tambur.IO for realtime web and mobile messaging PaaS</li>
+<li>Unison for realtime collaborative environment</li>
+<li>LeChat.im for their realtime team chat system</li>
+<li>Others: TV, Sports, Set-top boxes, ...</li>
+</ul>
+</div>
+
+
+<div class="slide">
+<h1>Success story template</h1>
+<ul>
+<li>Service needs high-performance, realtime capabilities</li>
+<li>Service is using HTTP either directly or for inter-connecting systems</li>
+<li>Service needs a REST API and Websocket support</li>
+<li>Service may be used for web or mobile applications</li>
+<li>Bonus points for gaming related projects</li>
+</ul>
+</div>
+
+
+<div class="slide">
+<h1>Many open source projects</h1>
+<ul>
+<li>Compatible web frameworks: Nitrogen, ChicagoBoss, axiom...</li>
+<li>Open source users:<ul>
+ <li>RabbitMQ</li>
+ <li>LeoFS</li>
+ <li>Project-FiFo</li>
+ <li>Ybot</li>
+ <li>fipelines</li>
+ <li>Bigwig (needs a maintainer!)</li>
+</ul></li>
+</ul>
+</div>
+
+
+<div class="slide">
+<h1>Repository of Cowboy applications</h1>
+<ul>
+<li>Chapter in the guide for listing Cowboy applications</li>
+<li>Please open pull requests to add your project</li>
+</ul>
+</div>
+
+
+<div class="slide">
+<h1>Related projects</h1>
+</div>
+
+
+<div class="slide">
+<h1>Ranch</h1>
+<ul>
+<li>Listener and acceptor code spin-off from Cowboy</li>
+<li>Supervises connections automatically</li>
+<li>Abstracts transport and protocol code</li>
+<li>Can be embedded into your own supervision tree</li>
+</ul>
+</div>
+
+
+<div class="slide">
+<h1>Bullet</h1>
+<ul>
+<li>Cowboy handler</li>
+<li>Websocket-like behavior on all browsers</li>
+<li>Permanent connection, reconnects on failure</li>
+</ul>
+</div>
+
+
+<div class="slide">
+<h1>Farwest</h1>
+<ul>
+<li>A mix of web framework and CMS</li>
+<li>Gives users autonomy to build and manage Erlang web applications</li>
+<li>First alpha version just released!</li>
+<li>Huge amount of development needed</li>
+<li><a href="http://bountysource.com">Bountysource.com Farwest fundraiser</a> just started</a></li>
+</ul>
+</div>
+
+
+<div class="slide">
+<h1>LeoFS</h1>
+<ul>
+<li>The Lion of storage systems</li>
+<li>Distributed file system compatible with Amazon S3 API</li>
+<li>Powered by Cowboy</li>
+<li>Focuses on high throughput instead of latency</li>
+</ul>
+</div>
+
+
+<div class="slide">
+<h1>Future works</h1>
+</div>
+
+
+<div class="slide">
+<h1>Remaining API breaking changes</h1>
+<ul>
+<li>Improved POST handling in REST</li>
+<li>Improved request body reading</li>
+<li>Removal of cowboy_req:peer_addr/1</li>
+</ul>
+</div>
+
+
+<div class="slide">
+<h1>Connections supervisor</h1>
+<ul>
+<li>Duplicate work with 'max_connections' related monitors</li>
+<li>Overhead on creation and especially termination</li>
+<li>Custom supervisor can fill in both roles</li>
+<li>Makes other optimizations possible</li>
+</ul>
+</div>
+
+
+<div class="slide">
+<h1>SPDY</h1>
+<ul>
+<li>Asynchronous, fully compressed, binary HTTP</li>
+<li>One process per connection + one process per request</li>
+<li>Same code for HTTP and SPDY requests</li>
+<li>Headers in SPDY are lowercase too, no conversion needed</li>
+</ul>
+</div>
+
+
+<div class="slide">
+<h1>Complete HTTP support</h1>
+<ul>
+<li>Parsing code for all standard HTTP headers</li>
+<li>Allow users to build any HTTP compatible technology on top of Cowboy</li>
+<li>Support for Websocket extensions</li>
+<li>Support for SPDY based HTTP/2.0 when implementations come out</li>
+</ul>
+</div>
+
+
+<div class="slide">
+<h1>Version 1.0</h1>
+<ul>
+<li>All of the above</li>
+<li>Stable API</li>
+<li>Fully documented</li>
+<li>Work won't stop there!</li>
+</ul>
+</div>
+
+
+<div class="slide">
+<h1>Getting help</h1>
+</div>
+
+
+<div class="slide">
+<h1>Community support</h1>
+<ul>
+<li>#ninenines on Freenode</li>
+<li>Mailing list on http://ninenines.eu</li>
+</ul>
+</div>
+
+
+<div class="slide">
+<h1>Consulting and commercial support</h1>
+<ul>
+<li>Hourly remote or on-site consulting</li>
+<li>A la carte commercial support<ul>
+ <li>Specific developments</li>
+ <li>System optimization</li>
+ <li>Code reviews</li>
+ <li>On-call support</li>
+ <li>For both Erlang and Cowboy</li>
+</ul></li>
+</ul>
+</div>
+
+
+<div class="slide">
+<h1>Getting involved</h1>
+</div>
+
+
+<div class="slide">
+<h1>Contributing</h1>
+<ul>
+<li>Tell me where you use Cowboy and for what</li>
+<li>Send me graphs showing how new Cowboy versions improve things</li>
+<li>Report bugs on Github</li>
+<li>Send patches, see CONTRIBUTING.md file</li>
+</ul>
+</div>
+
+
+<div class="slide">
+<h1>Sponsoring</h1>
+<ul>
+<li>Gives you visibility</li>
+<li>Gives us a budget</li>
+</ul>
+</div>
+
+
+<div class="slide">
+<h1>The Cowboy book</h1>
+<ul>
+<li>The Bible of writing web applications with Erlang and Cowboy</li>
+<li>Accessible by people who never programmed Erlang</li>
+<li>Goes into and explains advanced web development concepts</li>
+<li>Published online for free as it is written</li>
+<li>Hard-copy will be released when the book is completed</li>
+</ul>
+</div>
+
+
+<div class="slide">
+<h1>One more thing</h1>
+</div>
+
+
+<div class="slide">
+<h1>Hello, Joe</h1>
+<ul>
+<li>Cowboy will make an appearance in Programming Erlang 2nd Edition!</li>
+</ul>
+</div>
+
+
+<div class="slide">
+<h1>Contact info</h1>
+<ul>
+<li>IRC: essen on #erlang or #ninenines on Freenode</li>
+<li>Twitter: @lhoguin</li>
+<li>Sales: [email protected]</li>
+</ul>
+</div>
+
+
+</div>
+
+</body>
+</html>
diff --git a/talks/cowboy-0.8/pics/adgear.png b/talks/cowboy-0.8/pics/adgear.png
new file mode 100644
index 00000000..9d977f3a
--- /dev/null
+++ b/talks/cowboy-0.8/pics/adgear.png
Binary files differ
diff --git a/talks/cowboy-0.8/pics/cowboy.png b/talks/cowboy-0.8/pics/cowboy.png
new file mode 100644
index 00000000..dd52b748
--- /dev/null
+++ b/talks/cowboy-0.8/pics/cowboy.png
Binary files differ
diff --git a/talks/cowboy-0.8/pics/popularity-feb-2013.png b/talks/cowboy-0.8/pics/popularity-feb-2013.png
new file mode 100644
index 00000000..792360c0
--- /dev/null
+++ b/talks/cowboy-0.8/pics/popularity-feb-2013.png
Binary files differ
diff --git a/talks/cowboy-0.8/ui/default/blank.gif b/talks/cowboy-0.8/ui/default/blank.gif
new file mode 100644
index 00000000..75b945d2
--- /dev/null
+++ b/talks/cowboy-0.8/ui/default/blank.gif
Binary files differ
diff --git a/talks/cowboy-0.8/ui/default/bodybg.gif b/talks/cowboy-0.8/ui/default/bodybg.gif
new file mode 100755
index 00000000..5f448a16
--- /dev/null
+++ b/talks/cowboy-0.8/ui/default/bodybg.gif
Binary files differ
diff --git a/talks/cowboy-0.8/ui/default/framing.css b/talks/cowboy-0.8/ui/default/framing.css
new file mode 100644
index 00000000..14d8509e
--- /dev/null
+++ b/talks/cowboy-0.8/ui/default/framing.css
@@ -0,0 +1,23 @@
+/* The following styles size, place, and layer the slide components.
+ Edit these if you want to change the overall slide layout.
+ The commented lines can be uncommented (and modified, if necessary)
+ to help you with the rearrangement process. */
+
+/* target = 1024x768 */
+
+div#header, div#footer, .slide {width: 100%; top: 0; left: 0;}
+div#header {top: 0; height: 3em; z-index: 1;}
+div#footer {top: auto; bottom: 0; height: 2.5em; z-index: 5;}
+.slide {top: 0; width: 92%; padding: 3.5em 4% 4%; z-index: 2; list-style: none;}
+div#controls {left: 50%; bottom: 0; width: 50%; z-index: 100;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+ margin: 0;}
+#currentSlide {position: absolute; width: 10%; left: 45%; bottom: 1em; z-index: 10;}
+html>body #currentSlide {position: fixed;}
+
+/*
+div#header {background: #FCC;}
+div#footer {background: #CCF;}
+div#controls {background: #BBD;}
+div#currentSlide {background: #FFC;}
+*/
diff --git a/talks/cowboy-0.8/ui/default/iepngfix.htc b/talks/cowboy-0.8/ui/default/iepngfix.htc
new file mode 100644
index 00000000..bba2db75
--- /dev/null
+++ b/talks/cowboy-0.8/ui/default/iepngfix.htc
@@ -0,0 +1,42 @@
+<public:component>
+<public:attach event="onpropertychange" onevent="doFix()" />
+
+<script>
+
+// IE5.5+ PNG Alpha Fix v1.0 by Angus Turnbull http://www.twinhelix.com
+// Free usage permitted as long as this notice remains intact.
+
+// This must be a path to a blank image. That's all the configuration you need here.
+var blankImg = 'ui/default/blank.gif';
+
+var f = 'DXImageTransform.Microsoft.AlphaImageLoader';
+
+function filt(s, m) {
+ if (filters[f]) {
+ filters[f].enabled = s ? true : false;
+ if (s) with (filters[f]) { src = s; sizingMethod = m }
+ } else if (s) style.filter = 'progid:'+f+'(src="'+s+'",sizingMethod="'+m+'")';
+}
+
+function doFix() {
+ if ((parseFloat(navigator.userAgent.match(/MSIE (\S+)/)[1]) < 5.5) ||
+ (event && !/(background|src)/.test(event.propertyName))) return;
+
+ if (tagName == 'IMG') {
+ if ((/\.png$/i).test(src)) {
+ filt(src, 'image'); // was 'scale'
+ src = blankImg;
+ } else if (src.indexOf(blankImg) < 0) filt();
+ } else if (style.backgroundImage) {
+ if (style.backgroundImage.match(/^url[("']+(.*\.png)[)"']+$/i)) {
+ var s = RegExp.$1;
+ style.backgroundImage = '';
+ filt(s, 'crop');
+ } else filt();
+ }
+}
+
+doFix();
+
+</script>
+</public:component> \ No newline at end of file
diff --git a/talks/cowboy-0.8/ui/default/opera.css b/talks/cowboy-0.8/ui/default/opera.css
new file mode 100644
index 00000000..9e9d2a3c
--- /dev/null
+++ b/talks/cowboy-0.8/ui/default/opera.css
@@ -0,0 +1,7 @@
+/* DO NOT CHANGE THESE unless you really want to break Opera Show */
+.slide {
+ visibility: visible !important;
+ position: static !important;
+ page-break-before: always;
+}
+#slide0 {page-break-before: avoid;}
diff --git a/talks/cowboy-0.8/ui/default/outline.css b/talks/cowboy-0.8/ui/default/outline.css
new file mode 100644
index 00000000..62db519e
--- /dev/null
+++ b/talks/cowboy-0.8/ui/default/outline.css
@@ -0,0 +1,15 @@
+/* don't change this unless you want the layout stuff to show up in the outline view! */
+
+.layout div, #footer *, #controlForm * {display: none;}
+#footer, #controls, #controlForm, #navLinks, #toggle {
+ display: block; visibility: visible; margin: 0; padding: 0;}
+#toggle {float: right; padding: 0.5em;}
+html>body #toggle {position: fixed; top: 0; right: 0;}
+
+/* making the outline look pretty-ish */
+
+#slide0 h1, #slide0 h2, #slide0 h3, #slide0 h4 {border: none; margin: 0;}
+#slide0 h1 {padding-top: 1.5em;}
+.slide h1 {margin: 1.5em 0 0; padding-top: 0.25em;
+ border-top: 1px solid #888; border-bottom: 1px solid #AAA;}
+#toggle {border: 1px solid; border-width: 0 0 1px 1px; background: #FFF;}
diff --git a/talks/cowboy-0.8/ui/default/pretty.css b/talks/cowboy-0.8/ui/default/pretty.css
new file mode 100644
index 00000000..e556f7c3
--- /dev/null
+++ b/talks/cowboy-0.8/ui/default/pretty.css
@@ -0,0 +1,254 @@
+/* Following are the presentation styles -- edit away! */
+
+body {background: #FFF -16px 0 no-repeat; color: #000; font-size: 2em;}
+:link, :visited {text-decoration: none; color: #00C;}
+#controls :active {color: #88A !important;}
+#controls :focus {outline: 1px dotted #227;}
+h1, h2, h3, h4 {font-size: 100%; margin: 0; padding: 0; font-weight: inherit;}
+ul, pre {margin: 0; line-height: 1em;}
+html, body {margin: 0; padding: 0;}
+
+blockquote, q {font-style: italic;}
+blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em; text-align: center; font-size: 1em;}
+blockquote p {margin: 0;}
+blockquote i {font-style: normal;}
+blockquote b {display: block; margin-top: 0.5em; font-weight: normal; font-size: smaller; font-style: normal;}
+blockquote b i {font-style: italic;}
+
+kbd {font-weight: bold; font-size: 1em;}
+sup {font-size: smaller; line-height: 1px;}
+
+.slide code {padding: 2px 0.25em; font-weight: bold; color: #533;}
+.slide code.bad, code del {color: red;}
+.slide code.old {color: silver;}
+.slide pre {padding: 0; margin: 0.25em 0 0.5em 0.5em; color: #533; font-size: 90%;}
+.slide pre code {display: block;}
+.slide ul {margin-left: 5%; margin-right: 7%; list-style: disc;}
+.slide li {margin-top: 0.75em; margin-right: 0;}
+.slide ul ul {line-height: 1;}
+.slide ul ul li {margin: .2em; font-size: 85%; list-style: square;}
+.slide img.leader {display: block; margin: 0 auto;}
+
+div#header, div#footer {color: #ccc;
+ font-family: Verdana, Helvetica, sans-serif; background: url("../img/footer_bg.png") repeat scroll 0 0 transparent;
+
+}
+div#header {
+
+background-image: linear-gradient(bottom, rgb(234,234,234) 26%, rgb(246,246,246) 49%, rgb(252,252,252) 83%);
+background-image: -o-linear-gradient(bottom, rgb(234,234,234) 26%, rgb(246,246,246) 49%, rgb(252,252,252) 83%);
+background-image: -moz-linear-gradient(bottom, rgb(234,234,234) 26%, rgb(246,246,246) 49%, rgb(252,252,252) 83%);
+background-image: -webkit-linear-gradient(bottom, rgb(234,234,234) 26%, rgb(246,246,246) 49%, rgb(252,252,252) 83%);
+background-image: -ms-linear-gradient(bottom, rgb(234,234,234) 26%, rgb(246,246,246) 49%, rgb(252,252,252) 83%);
+line-height: 1px;
+border-bottom: 1px solid #ccc;
+}
+
+div#sub_header {
+ display: block; z-index: 2; top: 0pt; background: none repeat scroll 0% 0% rgba(255, 255, 255, 0.4); left: 50%; position: fixed; border-radius: 100em 100em 100em 100em; height: 80em; width: 80em; margin-top: -77.3em; margin-left: -40em;
+}
+
+div#footer {font-size: 0.5em; font-weight: bold; padding: 0 0 1em; height: 5em;}
+#footer h1, #footer h2 {display: block; padding: 0 1em;}
+#footer h2 {font-style: italic;}
+
+#footer_shadow {
+ background: url("../img/footer_shadow.png") repeat scroll 0 0 transparent;
+ width: 100%;
+ height: 7px;
+ margin-bottom: 1em;
+}
+
+
+div.long {font-size: 0.75em;}
+.slide h1 {position: absolute; top: 0.3em; left: 87px; z-index: 1;
+ margin: 0; padding: 0.3em 0 0 15px; white-space: nowrap;
+ font: bold 150%/1em Helvetica, sans-serif; text-transform: capitalize;
+ color: #333;}
+.slide h3 {font-size: 130%;}
+h1 abbr {font-variant: small-caps;}
+
+div#controls {position: absolute; left: 50%; bottom: 0;
+ width: 50%;
+ text-align: right; font: bold 0.9em Verdana, Helvetica, sans-serif;}
+html>body div#controls {position: fixed; padding: 0 0 1em 0;
+ top: auto;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+ margin: 0; padding: 0;}
+#controls #navLinks a {padding: 0; margin: 0 0.5em;
+ border: none; color: #ccc;
+ cursor: pointer;}
+#controls #navList {height: 1em;}
+#controls #navList #jumplist {position: absolute; bottom: 0; right: 0; background: #DDD; color: #227;}
+
+#currentSlide {text-align: center; font-size: 0.5em; color: #ccc;}
+
+#logo {text-align: right; position: fixed; width: 100%; bottom: 0pt;}
+#logo img { height: 18em; width: 24em; margin-right: 0em; }
+
+#slide0 {padding-top: 3.5em; font-size: 90%;}
+#slide0 h1 {position: static; margin: 1em 0 0; padding: 0;
+ font: bold 2em Helvetica, sans-serif; white-space: normal;
+ color: #000; background: transparent;}
+#slide0 h2 {font: bold italic 1em Helvetica, sans-serif; margin: 0.25em;}
+#slide0 h3 {margin-top: 1.5em; font-size: 1.5em;}
+#slide0 h4 {margin-top: 0; font-size: 1em;}
+
+ul.urls {list-style: none; display: inline; margin: 0;}
+.urls li {display: inline; margin: 0;}
+.note {display: none;}
+.external {border-bottom: 1px dotted gray;}
+html>body .external {border-bottom: none;}
+.external:after {content: " \274F"; font-size: smaller; color: #77B;}
+
+.incremental, .incremental *, .incremental *:after {color: #DDE; visibility: visible;}
+img.incremental {visibility: hidden;}
+.slide .current {color: #B02;}
+
+button.btn, input[type="submit"].btn {
+ *padding-top: 2px;
+ *padding-bottom: 2px;
+}
+button.btn::-moz-focus-inner, input[type="submit"].btn::-moz-focus-inner {
+ padding: 0;
+ border: 0;
+}
+button.btn.large, input[type="submit"].btn.large {
+ *padding-top: 7px;
+ *padding-bottom: 7px;
+}
+button.btn.small, input[type="submit"].btn.small {
+ *padding-top: 3px;
+ *padding-bottom: 3px;
+}
+.btn-group {
+ position: relative;
+ *zoom: 1;
+ *margin-left: .3em;
+}
+.btn-group:before, .btn-group:after {
+ display: table;
+ content: "";
+}
+.btn-group:after {
+ clear: both;
+}
+.btn-group:first-child {
+ *margin-left: 0;
+}
+.btn-group + .btn-group {
+ margin-left: 5px;
+}
+.btn-toolbar {
+ margin-top: 9px;
+ margin-bottom: 9px;
+}
+.btn-toolbar .btn-group {
+ display: inline-block;
+ *display: inline;
+ /* IE7 inline-block hack */
+
+ *zoom: 1;
+}
+.btn-group .btn {
+ position: relative;
+ float: left;
+ margin-left: -1px;
+ -webkit-border-radius: 0;
+ -moz-border-radius: 0;
+ border-radius: 0;
+}
+.btn-group .btn:first-child {
+ margin-left: 0;
+ -webkit-border-top-left-radius: 4px;
+ -moz-border-radius-topleft: 4px;
+ border-top-left-radius: 4px;
+ -webkit-border-bottom-left-radius: 4px;
+ -moz-border-radius-bottomleft: 4px;
+ border-bottom-left-radius: 4px;
+}
+.btn-group .btn:last-child, .btn-group .dropdown-toggle {
+ -webkit-border-top-right-radius: 4px;
+ -moz-border-radius-topright: 4px;
+ border-top-right-radius: 4px;
+ -webkit-border-bottom-right-radius: 4px;
+ -moz-border-radius-bottomright: 4px;
+ border-bottom-right-radius: 4px;
+}
+.btn-group .btn.large:first-child {
+ margin-left: 0;
+ -webkit-border-top-left-radius: 6px;
+ -moz-border-radius-topleft: 6px;
+ border-top-left-radius: 6px;
+ -webkit-border-bottom-left-radius: 6px;
+ -moz-border-radius-bottomleft: 6px;
+ border-bottom-left-radius: 6px;
+}
+.btn-group .btn.large:last-child, .btn-group .large.dropdown-toggle {
+ -webkit-border-top-right-radius: 6px;
+ -moz-border-radius-topright: 6px;
+ border-top-right-radius: 6px;
+ -webkit-border-bottom-right-radius: 6px;
+ -moz-border-radius-bottomright: 6px;
+ border-bottom-right-radius: 6px;
+}
+.btn-group .btn:hover,
+.btn-group .btn:focus,
+.btn-group .btn:active,
+.btn-group .btn.active {
+ z-index: 2;
+}
+.btn-group .dropdown-toggle:active, .btn-group.open .dropdown-toggle {
+ outline: 0;
+}
+.btn-group .dropdown-toggle {
+ padding-left: 8px;
+ padding-right: 8px;
+ -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+ -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+ box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+ *padding-top: 5px;
+ *padding-bottom: 5px;
+}
+.btn-group.open {
+ *z-index: 1000;
+}
+.btn-group.open .dropdown-menu {
+ display: block;
+ margin-top: 1px;
+ -webkit-border-radius: 5px;
+ -moz-border-radius: 5px;
+ border-radius: 5px;
+}
+.btn-group.open .dropdown-toggle {
+ background-image: none;
+ -webkit-box-shadow: inset 0 1px 6px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+ -moz-box-shadow: inset 0 1px 6px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+ box-shadow: inset 0 1px 6px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+.btn .caret {
+ margin-top: 7px;
+ margin-left: 0;
+}
+.btn:hover .caret, .open.btn-group .caret {
+ opacity: 1;
+ filter: alpha(opacity=100);
+}
+.btn-primary .caret,
+.btn-danger .caret,
+.btn-info .caret,
+.btn-success .caret,
+.btn-inverse .caret {
+ border-top-color: #ffffff;
+ opacity: 0.75;
+ filter: alpha(opacity=75);
+}
+.btn-small .caret {
+ margin-top: 4px;
+}
+
+
+/* diagnostics
+
+li:after {content: " [" attr(class) "]"; color: #F88;}
+ */ \ No newline at end of file
diff --git a/talks/cowboy-0.8/ui/default/print.css b/talks/cowboy-0.8/ui/default/print.css
new file mode 100644
index 00000000..e7a71d14
--- /dev/null
+++ b/talks/cowboy-0.8/ui/default/print.css
@@ -0,0 +1 @@
+/* The following rule is necessary to have all slides appear in print! DO NOT REMOVE IT! */ .slide, ul {page-break-inside: avoid; visibility: visible !important;} h1 {page-break-after: avoid;} body {font-size: 12pt; background: white;} * {color: black;} #slide0 h1 {font-size: 200%; border: none; margin: 0.5em 0 0.25em;} #slide0 h3 {margin: 0; padding: 0;} #slide0 h4 {margin: 0 0 0.5em; padding: 0;} #slide0 {margin-bottom: 3em;} h1 {border-top: 2pt solid gray; border-bottom: 1px dotted silver;} .extra {background: transparent !important;} div.extra, pre.extra, .example {font-size: 10pt; color: #333;} ul.extra a {font-weight: bold;} p.example {display: none;} #header {display: none;} #footer h1 {margin: 0; border-bottom: 1px solid; color: gray; font-style: italic;} #footer h2, #controls {display: none;} /* The following rule keeps the layout stuff out of print. Remove at your own risk! */ .layout, .layout * {display: none !important;} \ No newline at end of file
diff --git a/talks/cowboy-0.8/ui/default/s5-core.css b/talks/cowboy-0.8/ui/default/s5-core.css
new file mode 100644
index 00000000..86444e04
--- /dev/null
+++ b/talks/cowboy-0.8/ui/default/s5-core.css
@@ -0,0 +1,9 @@
+/* Do not edit or override these styles! The system will likely break if you do. */
+
+div#header, div#footer, div#controls, .slide {position: absolute;}
+html>body div#header, html>body div#footer,
+ html>body div#controls, html>body .slide {position: fixed;}
+.handout {display: none;}
+.layout {display: block;}
+.slide, .hideme, .incremental {visibility: hidden;}
+#slide0 {visibility: visible;}
diff --git a/talks/cowboy-0.8/ui/default/slides.css b/talks/cowboy-0.8/ui/default/slides.css
new file mode 100644
index 00000000..0786d7db
--- /dev/null
+++ b/talks/cowboy-0.8/ui/default/slides.css
@@ -0,0 +1,3 @@
+@import url(s5-core.css); /* required to make the slide show run at all */
+@import url(framing.css); /* sets basic placement and size of slide components */
+@import url(pretty.css); /* stuff that makes the slides look better than blah */ \ No newline at end of file
diff --git a/talks/cowboy-0.8/ui/default/slides.js b/talks/cowboy-0.8/ui/default/slides.js
new file mode 100644
index 00000000..3d9ad756
--- /dev/null
+++ b/talks/cowboy-0.8/ui/default/slides.js
@@ -0,0 +1,545 @@
+// S5 v1.1 slides.js -- released into the Public Domain
+//
+// Please see http://www.meyerweb.com/eric/tools/s5/credits.html for information
+// about all the wonderful and talented contributors to this code!
+
+var undef;
+var slideCSS = '';
+var snum = 0;
+var smax = 1;
+var incpos = 0;
+var number = undef;
+var s5mode = true;
+var defaultView = 'slideshow';
+var controlVis = 'visible';
+
+var isIE = navigator.appName == 'Microsoft Internet Explorer' && navigator.userAgent.indexOf('Opera') < 1 ? 1 : 0;
+var isOp = navigator.userAgent.indexOf('Opera') > -1 ? 1 : 0;
+var isGe = navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('Safari') < 1 ? 1 : 0;
+
+function hasClass(object, className) {
+ if (!object.className) return false;
+ return (object.className.search('(^|\\s)' + className + '(\\s|$)') != -1);
+}
+
+function hasValue(object, value) {
+ if (!object) return false;
+ return (object.search('(^|\\s)' + value + '(\\s|$)') != -1);
+}
+
+function removeClass(object,className) {
+ if (!object) return;
+ object.className = object.className.replace(new RegExp('(^|\\s)'+className+'(\\s|$)'), RegExp.$1+RegExp.$2);
+}
+
+function addClass(object,className) {
+ if (!object || hasClass(object, className)) return;
+ if (object.className) {
+ object.className += ' '+className;
+ } else {
+ object.className = className;
+ }
+}
+
+function GetElementsWithClassName(elementName,className) {
+ var allElements = document.getElementsByTagName(elementName);
+ var elemColl = new Array();
+ for (var i = 0; i< allElements.length; i++) {
+ if (hasClass(allElements[i], className)) {
+ elemColl[elemColl.length] = allElements[i];
+ }
+ }
+ return elemColl;
+}
+
+function isParentOrSelf(element, id) {
+ if (element == null || element.nodeName=='BODY') return false;
+ else if (element.id == id) return true;
+ else return isParentOrSelf(element.parentNode, id);
+}
+
+function nodeValue(node) {
+ var result = "";
+ if (node.nodeType == 1) {
+ var children = node.childNodes;
+ for (var i = 0; i < children.length; ++i) {
+ result += nodeValue(children[i]);
+ }
+ }
+ else if (node.nodeType == 3) {
+ result = node.nodeValue;
+ }
+ return(result);
+}
+
+function slideLabel() {
+ var slideColl = GetElementsWithClassName('*','slide');
+ var list = document.getElementById('jumplist');
+ smax = slideColl.length;
+ for (var n = 0; n < smax; n++) {
+ var obj = slideColl[n];
+
+ var did = 'slide' + n.toString();
+ obj.setAttribute('id',did);
+ if (isOp) continue;
+
+ var otext = '';
+ var menu = obj.firstChild;
+ if (!menu) continue; // to cope with empty slides
+ while (menu && menu.nodeType == 3) {
+ menu = menu.nextSibling;
+ }
+ if (!menu) continue; // to cope with slides with only text nodes
+
+ var menunodes = menu.childNodes;
+ for (var o = 0; o < menunodes.length; o++) {
+ otext += nodeValue(menunodes[o]);
+ }
+ list.options[list.length] = new Option(n + ' : ' + otext, n);
+ }
+}
+
+function currentSlide() {
+ var cs;
+ if (document.getElementById) {
+ cs = document.getElementById('currentSlide');
+ } else {
+ cs = document.currentSlide;
+ }
+ cs.innerHTML = '<span id="csHere">' + snum + '<\/span> ' +
+ '<span id="csSep">\/<\/span> ' +
+ '<span id="csTotal">' + (smax-1) + '<\/span>';
+ if (snum == 0) {
+ cs.style.visibility = 'hidden';
+ } else {
+ cs.style.visibility = 'visible';
+ }
+}
+
+function go(step) {
+ if (document.getElementById('slideProj').disabled || step == 0) return;
+ var jl = document.getElementById('jumplist');
+ var cid = 'slide' + snum;
+ var ce = document.getElementById(cid);
+ if (incrementals[snum].length > 0) {
+ for (var i = 0; i < incrementals[snum].length; i++) {
+ removeClass(incrementals[snum][i], 'current');
+ removeClass(incrementals[snum][i], 'incremental');
+ }
+ }
+ if (step != 'j') {
+ snum += step;
+ lmax = smax - 1;
+ if (snum > lmax) snum = lmax;
+ if (snum < 0) snum = 0;
+ } else
+ snum = parseInt(jl.value);
+ var nid = 'slide' + snum;
+ var ne = document.getElementById(nid);
+ if (!ne) {
+ ne = document.getElementById('slide0');
+ snum = 0;
+ }
+ if (step < 0) {incpos = incrementals[snum].length} else {incpos = 0;}
+ if (incrementals[snum].length > 0 && incpos == 0) {
+ for (var i = 0; i < incrementals[snum].length; i++) {
+ if (hasClass(incrementals[snum][i], 'current'))
+ incpos = i + 1;
+ else
+ addClass(incrementals[snum][i], 'incremental');
+ }
+ }
+ if (incrementals[snum].length > 0 && incpos > 0)
+ addClass(incrementals[snum][incpos - 1], 'current');
+ ce.style.visibility = 'hidden';
+ ne.style.visibility = 'visible';
+ jl.selectedIndex = snum;
+ currentSlide();
+ number = 0;
+}
+
+function goTo(target) {
+ if (target >= smax || target == snum) return;
+ go(target - snum);
+}
+
+function subgo(step) {
+ if (step > 0) {
+ removeClass(incrementals[snum][incpos - 1],'current');
+ removeClass(incrementals[snum][incpos], 'incremental');
+ addClass(incrementals[snum][incpos],'current');
+ incpos++;
+ } else {
+ incpos--;
+ removeClass(incrementals[snum][incpos],'current');
+ addClass(incrementals[snum][incpos], 'incremental');
+ addClass(incrementals[snum][incpos - 1],'current');
+ }
+}
+
+function toggle() {
+ var slideColl = GetElementsWithClassName('*','slide');
+ var slides = document.getElementById('slideProj');
+ var outline = document.getElementById('outlineStyle');
+ if (!slides.disabled) {
+ slides.disabled = true;
+ outline.disabled = false;
+ s5mode = false;
+ fontSize('1em');
+ for (var n = 0; n < smax; n++) {
+ var slide = slideColl[n];
+ slide.style.visibility = 'visible';
+ }
+ } else {
+ slides.disabled = false;
+ outline.disabled = true;
+ s5mode = true;
+ fontScale();
+ for (var n = 0; n < smax; n++) {
+ var slide = slideColl[n];
+ slide.style.visibility = 'hidden';
+ }
+ slideColl[snum].style.visibility = 'visible';
+ }
+}
+
+function showHide(action) {
+ var obj = GetElementsWithClassName('*','hideme')[0];
+ switch (action) {
+ case 's': obj.style.visibility = 'visible'; break;
+ case 'h': obj.style.visibility = 'hidden'; break;
+ case 'k':
+ if (obj.style.visibility != 'visible') {
+ obj.style.visibility = 'visible';
+ } else {
+ obj.style.visibility = 'hidden';
+ }
+ break;
+ }
+}
+
+// 'keys' code adapted from MozPoint (http://mozpoint.mozdev.org/)
+function keys(key) {
+ if (!key) {
+ key = event;
+ key.which = key.keyCode;
+ }
+ if (key.which == 84) {
+ toggle();
+ return;
+ }
+ if (s5mode) {
+ switch (key.which) {
+ case 10: // return
+ case 13: // enter
+ if (window.event && isParentOrSelf(window.event.srcElement, 'controls')) return;
+ if (key.target && isParentOrSelf(key.target, 'controls')) return;
+ if(number != undef) {
+ goTo(number);
+ break;
+ }
+ case 32: // spacebar
+ case 34: // page down
+ case 39: // rightkey
+ case 40: // downkey
+ if(number != undef) {
+ go(number);
+ } else if (!incrementals[snum] || incpos >= incrementals[snum].length) {
+ go(1);
+ } else {
+ subgo(1);
+ }
+ break;
+ case 33: // page up
+ case 37: // leftkey
+ case 38: // upkey
+ if(number != undef) {
+ go(-1 * number);
+ } else if (!incrementals[snum] || incpos <= 0) {
+ go(-1);
+ } else {
+ subgo(-1);
+ }
+ break;
+ case 36: // home
+ goTo(0);
+ break;
+ case 35: // end
+ goTo(smax-1);
+ break;
+ case 67: // c
+ showHide('k');
+ break;
+ }
+ if (key.which < 48 || key.which > 57) {
+ number = undef;
+ } else {
+ if (window.event && isParentOrSelf(window.event.srcElement, 'controls')) return;
+ if (key.target && isParentOrSelf(key.target, 'controls')) return;
+ number = (((number != undef) ? number : 0) * 10) + (key.which - 48);
+ }
+ }
+ return false;
+}
+
+function clicker(e) {
+ number = undef;
+ var target;
+ if (window.event) {
+ target = window.event.srcElement;
+ e = window.event;
+ } else target = e.target;
+ if (target.getAttribute('href') != null || hasValue(target.rel, 'external') || isParentOrSelf(target, 'controls') || isParentOrSelf(target,'embed') || isParentOrSelf(target,'object')) return true;
+ if (!e.which || e.which == 1) {
+ if (!incrementals[snum] || incpos >= incrementals[snum].length) {
+ go(1);
+ } else {
+ subgo(1);
+ }
+ }
+}
+
+function findSlide(hash) {
+ var target = null;
+ var slides = GetElementsWithClassName('*','slide');
+ for (var i = 0; i < slides.length; i++) {
+ var targetSlide = slides[i];
+ if ( (targetSlide.name && targetSlide.name == hash)
+ || (targetSlide.id && targetSlide.id == hash) ) {
+ target = targetSlide;
+ break;
+ }
+ }
+ while(target != null && target.nodeName != 'BODY') {
+ if (hasClass(target, 'slide')) {
+ return parseInt(target.id.slice(5));
+ }
+ target = target.parentNode;
+ }
+ return null;
+}
+
+function slideJump() {
+ if (window.location.hash == null) return;
+ var sregex = /^#slide(\d+)$/;
+ var matches = sregex.exec(window.location.hash);
+ var dest = null;
+ if (matches != null) {
+ dest = parseInt(matches[1]);
+ } else {
+ dest = findSlide(window.location.hash.slice(1));
+ }
+ if (dest != null)
+ go(dest - snum);
+}
+
+function fixLinks() {
+ var thisUri = window.location.href;
+ thisUri = thisUri.slice(0, thisUri.length - window.location.hash.length);
+ var aelements = document.getElementsByTagName('A');
+ for (var i = 0; i < aelements.length; i++) {
+ var a = aelements[i].href;
+ var slideID = a.match('\#slide[0-9]{1,2}');
+ if ((slideID) && (slideID[0].slice(0,1) == '#')) {
+ var dest = findSlide(slideID[0].slice(1));
+ if (dest != null) {
+ if (aelements[i].addEventListener) {
+ aelements[i].addEventListener("click", new Function("e",
+ "if (document.getElementById('slideProj').disabled) return;" +
+ "go("+dest+" - snum); " +
+ "if (e.preventDefault) e.preventDefault();"), true);
+ } else if (aelements[i].attachEvent) {
+ aelements[i].attachEvent("onclick", new Function("",
+ "if (document.getElementById('slideProj').disabled) return;" +
+ "go("+dest+" - snum); " +
+ "event.returnValue = false;"));
+ }
+ }
+ }
+ }
+}
+
+function externalLinks() {
+ if (!document.getElementsByTagName) return;
+ var anchors = document.getElementsByTagName('a');
+ for (var i=0; i<anchors.length; i++) {
+ var anchor = anchors[i];
+ if (anchor.getAttribute('href') && hasValue(anchor.rel, 'external')) {
+ anchor.target = '_blank';
+ addClass(anchor,'external');
+ }
+ }
+}
+
+function createControls() {
+ var controlsDiv = document.getElementById("controls");
+ if (!controlsDiv) return;
+ var hider = ' onmouseover="showHide(\'s\');" onmouseout="showHide(\'h\');"';
+ var hideDiv, hideList = '';
+ if (controlVis == 'hidden') {
+ hideDiv = hider;
+ }
+ controlsDiv.innerHTML = '<form action="#" id="controlForm"' + hideDiv + '>' +
+ '<div id="navLinks">' +
+ '<a accesskey="t" id="toggle" href="javascript:toggle();">&#216;<\/a>' +
+ '<a accesskey="z" id="prev" href="javascript:go(-1);">&laquo;<\/a>' +
+ '<a accesskey="x" id="next" href="javascript:go(1);">&raquo;<\/a>' +
+ '<div id="navList"><select id="jumplist" onchange="go(\'j\');"><\/select><\/div>' +
+ '<\/div><\/form>';
+}
+
+function fontScale() { // causes layout problems in FireFox that get fixed if browser's Reload is used; same may be true of other Gecko-based browsers
+ if (!s5mode) return false;
+ var vScale = 22; // both yield 32 (after rounding) at 1024x768
+ var hScale = 32; // perhaps should auto-calculate based on theme's declared value?
+ if (window.innerHeight) {
+ var vSize = window.innerHeight;
+ var hSize = window.innerWidth;
+ } else if (document.documentElement.clientHeight) {
+ var vSize = document.documentElement.clientHeight;
+ var hSize = document.documentElement.clientWidth;
+ } else if (document.body.clientHeight) {
+ var vSize = document.body.clientHeight;
+ var hSize = document.body.clientWidth;
+ } else {
+ var vSize = 700; // assuming 1024x768, minus chrome and such
+ var hSize = 1024; // these do not account for kiosk mode or Opera Show
+ }
+ var newSize = Math.min(Math.round(vSize/vScale),Math.round(hSize/hScale));
+ fontSize(newSize + 'px');
+ if (isGe) { // hack to counter incremental reflow bugs
+ var obj = document.getElementsByTagName('body')[0];
+ obj.style.display = 'none';
+ obj.style.display = 'block';
+ }
+}
+
+function fontSize(value) {
+ if (!(s5ss = document.getElementById('s5ss'))) {
+ if (!isIE) {
+ document.getElementsByTagName('head')[0].appendChild(s5ss = document.createElement('style'));
+ s5ss.setAttribute('media','screen, projection');
+ s5ss.setAttribute('id','s5ss');
+ } else {
+ document.createStyleSheet();
+ document.s5ss = document.styleSheets[document.styleSheets.length - 1];
+ }
+ }
+ if (!isIE) {
+ while (s5ss.lastChild) s5ss.removeChild(s5ss.lastChild);
+ s5ss.appendChild(document.createTextNode('body {font-size: ' + value + ' !important;}'));
+ } else {
+ document.s5ss.addRule('body','font-size: ' + value + ' !important;');
+ }
+}
+
+function notOperaFix() {
+ slideCSS = document.getElementById('slideProj').href;
+ var slides = document.getElementById('slideProj');
+ var outline = document.getElementById('outlineStyle');
+ slides.setAttribute('media','screen');
+ outline.disabled = true;
+ if (isGe) {
+ slides.setAttribute('href','null'); // Gecko fix
+ slides.setAttribute('href',slideCSS); // Gecko fix
+ }
+ if (isIE && document.styleSheets && document.styleSheets[0]) {
+ document.styleSheets[0].addRule('img', 'behavior: url(ui/default/iepngfix.htc)');
+ document.styleSheets[0].addRule('div', 'behavior: url(ui/default/iepngfix.htc)');
+ document.styleSheets[0].addRule('.slide', 'behavior: url(ui/default/iepngfix.htc)');
+ }
+}
+
+function getIncrementals(obj) {
+ var incrementals = new Array();
+ if (!obj)
+ return incrementals;
+ var children = obj.childNodes;
+ for (var i = 0; i < children.length; i++) {
+ var child = children[i];
+ if (hasClass(child, 'incremental')) {
+ if (child.nodeName == 'OL' || child.nodeName == 'UL') {
+ removeClass(child, 'incremental');
+ for (var j = 0; j < child.childNodes.length; j++) {
+ if (child.childNodes[j].nodeType == 1) {
+ addClass(child.childNodes[j], 'incremental');
+ }
+ }
+ } else {
+ incrementals[incrementals.length] = child;
+ removeClass(child,'incremental');
+ }
+ }
+ if (hasClass(child, 'show-first')) {
+ if (child.nodeName == 'OL' || child.nodeName == 'UL') {
+ removeClass(child, 'show-first');
+ if (child.childNodes[isGe].nodeType == 1) {
+ removeClass(child.childNodes[isGe], 'incremental');
+ }
+ } else {
+ incrementals[incrementals.length] = child;
+ }
+ }
+ incrementals = incrementals.concat(getIncrementals(child));
+ }
+ return incrementals;
+}
+
+function createIncrementals() {
+ var incrementals = new Array();
+ for (var i = 0; i < smax; i++) {
+ incrementals[i] = getIncrementals(document.getElementById('slide'+i));
+ }
+ return incrementals;
+}
+
+function defaultCheck() {
+ var allMetas = document.getElementsByTagName('meta');
+ for (var i = 0; i< allMetas.length; i++) {
+ if (allMetas[i].name == 'defaultView') {
+ defaultView = allMetas[i].content;
+ }
+ if (allMetas[i].name == 'controlVis') {
+ controlVis = allMetas[i].content;
+ }
+ }
+}
+
+// Key trap fix, new function body for trap()
+function trap(e) {
+ if (!e) {
+ e = event;
+ e.which = e.keyCode;
+ }
+ try {
+ modifierKey = e.ctrlKey || e.altKey || e.metaKey;
+ }
+ catch(e) {
+ modifierKey = false;
+ }
+ return modifierKey || e.which == 0;
+}
+
+function startup() {
+ defaultCheck();
+ if (!isOp)
+ createControls();
+ slideLabel();
+ fixLinks();
+ externalLinks();
+ fontScale();
+ if (!isOp) {
+ notOperaFix();
+ incrementals = createIncrementals();
+ slideJump();
+ if (defaultView == 'outline') {
+ toggle();
+ }
+ document.onkeyup = keys;
+ document.onkeypress = trap;
+ document.onclick = clicker;
+ }
+}
+
+window.onload = startup;
+window.onresize = function(){setTimeout('fontScale()', 50);}
diff --git a/talks/cowboy-0.8/ui/img/footer_bg.png b/talks/cowboy-0.8/ui/img/footer_bg.png
new file mode 100644
index 00000000..bf08c6c7
--- /dev/null
+++ b/talks/cowboy-0.8/ui/img/footer_bg.png
Binary files differ
diff --git a/talks/cowboy-0.8/ui/img/footer_logo.png b/talks/cowboy-0.8/ui/img/footer_logo.png
new file mode 100644
index 00000000..9887afd7
--- /dev/null
+++ b/talks/cowboy-0.8/ui/img/footer_logo.png
Binary files differ
diff --git a/talks/cowboy-0.8/ui/img/footer_shadow.png b/talks/cowboy-0.8/ui/img/footer_shadow.png
new file mode 100644
index 00000000..27fd93db
--- /dev/null
+++ b/talks/cowboy-0.8/ui/img/footer_shadow.png
Binary files differ
diff --git a/talks/cowboy-0.8/ui/img/logo.png b/talks/cowboy-0.8/ui/img/logo.png
new file mode 100644
index 00000000..ffd0fcf9
--- /dev/null
+++ b/talks/cowboy-0.8/ui/img/logo.png
Binary files differ
diff --git a/talks/cowboy-0.8/ui/img/logo.svg b/talks/cowboy-0.8/ui/img/logo.svg
new file mode 100644
index 00000000..833a691a
--- /dev/null
+++ b/talks/cowboy-0.8/ui/img/logo.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="498.5px" height="336px" viewBox="0 0 498.5 336" enable-background="new 0 0 498.5 336" xml:space="preserve">
+<g opacity="0.2">
+ <path fill="#5195AA" d="M170.314,115.788c0,17.162-7.237,40.448-21.685,69.856l-55.483,113.25H41.331l54.38-108.102
+ c-5.396,2.21-11.875,3.312-19.468,3.312c-18.623,0-34.536-6.857-47.777-20.592c-14.205-14.704-21.31-33.699-21.31-56.989
+ c0-25.245,7.834-45.345,23.509-60.296C45.609,42.012,64.97,34.902,88.738,34.902c23.758,0,43.115,6.985,58.049,20.955
+ C162.469,70.562,170.314,90.544,170.314,115.788z M122.172,116.159c0-11.77-3.097-21.083-9.272-27.944
+ c-6.18-6.864-14.246-10.299-24.164-10.299c-9.933,0-17.995,3.435-24.173,10.299c-6.185,6.861-9.267,16.175-9.267,27.944
+ c0,11.525,3.082,20.772,9.267,27.757c6.178,6.986,14.24,10.479,24.173,10.479c9.918,0,17.984-3.43,24.164-10.295
+ C119.074,137.239,122.172,127.923,122.172,116.159z"/>
+ <path fill="#FC9DB5" d="M340.007,115.788c0,17.162-7.224,40.448-21.682,69.856l-55.489,113.25h-51.808l54.387-108.102
+ c-5.397,2.21-11.89,3.312-19.479,3.312c-18.618,0-34.538-6.857-47.766-20.592c-14.208-14.707-21.316-33.701-21.316-56.991
+ c0-25.245,7.834-45.345,23.52-60.296C215.308,42.01,234.662,34.9,258.431,34.9c23.761,0,43.12,6.985,58.067,20.955
+ C332.168,70.562,340.007,90.544,340.007,115.788z M291.871,116.159c0-11.77-3.096-21.083-9.277-27.944
+ c-6.179-6.864-14.231-10.299-24.166-10.299c-9.933,0-17.993,3.435-24.176,10.299c-6.173,6.861-9.264,16.175-9.264,27.944
+ c0,11.525,3.091,20.772,9.264,27.757c6.183,6.986,14.243,10.479,24.176,10.479c9.935,0,17.987-3.43,24.166-10.295
+ C288.778,137.239,291.871,127.923,291.871,116.159z"/>
+ <path fill="#C6D673" d="M491.156,238.598c0,20.346-7.847,36.029-23.514,47.062c-14.7,10.294-33.93,15.441-57.695,15.441
+ c-17.888,0-32.465-1.602-43.725-4.779c-14.21-4.166-26.822-11.768-37.849-22.795l31.229-31.256
+ c12,12.015,29.032,18.014,51.068,18.014c22.543,0,33.814-6.617,33.814-19.852c0-10.535-6.752-16.426-20.216-17.649l-30.136-2.943
+ c-37.229-3.678-55.854-21.567-55.854-53.679c0-19.116,7.473-34.314,22.414-45.593c13.725-10.295,30.871-15.441,51.452-15.441
+ c32.821,0,57.198,7.482,73.12,22.429l-29.396,29.781c-9.552-8.583-24.375-12.872-44.466-12.872
+ c-18.13,0-27.191,6.129-27.191,18.385c0,9.808,6.61,15.326,19.854,16.549l30.129,2.94
+ C472.178,186.018,491.156,204.77,491.156,238.598z"/>
+ <path fill="#43A3BA" d="M146.787,55.854c-14.934-13.971-34.291-20.957-58.049-20.957c-10.371,0-19.843,1.435-28.542,4.143
+ c8.149,5.549,15.888,11.744,23.214,18.592c8.055,7.558,15.274,15.672,21.736,24.297c2.848,1.608,5.434,3.703,7.756,6.279
+ c4.783,5.315,7.699,12.12,8.778,20.38c12.84,25.312,20.201,54.312,22.088,86.977l4.859-9.924
+ c14.452-29.407,21.685-52.691,21.685-69.857C170.314,90.544,162.469,70.562,146.787,55.854z"/>
+ <path fill="#E8809E" d="M191.529,66.489c8.312,18.707,19.499,35.677,33.506,50.944c-0.006-0.432-0.047-0.84-0.047-1.274
+ c0-11.77,3.091-21.083,9.264-27.944c6.183-6.864,14.243-10.299,24.178-10.299c9.933,0,17.985,3.435,24.165,10.299
+ c6.184,6.861,9.276,16.175,9.276,27.944c0,11.764-3.096,21.08-9.276,27.944c-3.867,4.299-8.479,7.248-13.824,8.856
+ c17.236,9.888,35.812,16.361,55.727,19.428c10.301-23.211,15.51-42.109,15.51-56.595c0-25.242-7.843-45.227-23.515-59.936
+ c-14.945-13.97-34.308-20.955-58.068-20.955c-23.767,0-43.12,7.11-58.055,21.327C197.044,59.399,194.149,62.854,191.529,66.489z"/>
+ <g>
+ <path fill="#ACB75C" d="M386.362,170.945c-1.382-2.271-2.142-4.938-2.142-8.095c0-12.252,9.062-18.385,27.189-18.385
+ c20.091,0,34.918,4.289,44.466,12.87l29.396-29.779c-15.922-14.949-40.298-22.431-73.117-22.431
+ c-20.584,0-37.731,5.148-51.455,15.443c-14.942,11.278-22.414,26.475-22.414,45.593c0,2.708,0.185,5.278,0.448,7.785
+ c4.417,0.312,8.867,0.524,13.402,0.524C364.728,174.473,376.118,173.291,386.362,170.945z"/>
+ </g>
+</g>
+</svg>