Meeting20120602: presentation.html

File presentation.html, 45.8 KB (added by Simon Cross, 8 years ago)

Riak ORM talk slides (rather minimal)

Line 
1<!DOCTYPE html>
2<!--
3  Copyright 2010 Google Inc.
4
5  Licensed under the Apache License, Version 2.0 (the "License");
6  you may not use this file except in compliance with the License.
7  You may obtain a copy of the License at
8
9     http://www.apache.org/licenses/LICENSE-2.0
10
11  Unless required by applicable law or agreed to in writing, software
12  distributed under the License is distributed on an "AS IS" BASIS,
13  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  See the License for the specific language governing permissions and
15  limitations under the License.
16
17  Original slides: Marcin Wichary (mwichary@google.com)
18  Modifications: Ernest Delgado (ernestd@google.com)
19                 Alex Russell (slightlyoff@chromium.org)
20
21  landslide modifications: Adam Zapletal (adamzap@gmail.com)
22                           Nicolas Perriault (nperriault@gmail.com)
23-->
24<html>
25<head>
26    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
27    <meta http-equiv="X-UA-Compatible" content="chrome=1">
28    <title>Building an ORM for Riak</title>
29    <!-- Styles -->
30   
31    <style type="text/css" media="print">
32      * {
33    margin: 0;
34    padding: 0;
35}
36
37@page {
38    size: landscape;
39}
40
41body {
42    font: 100% "Lucida Grande", "Trebuchet MS", Verdana, sans-serif;
43    padding: 0;
44    margin: 0;
45}
46
47div.slide {
48    min-width: 800px;
49    min-height: 600px;
50    padding: 1em;
51    overflow: hidden;
52    page-break-after: always;
53    border: 1px solid black;
54    border-radius: 20px;
55}
56
57div.slide div.inner {
58    width: 800px;
59    height: 600px;
60    margin: auto;
61    display: table-cell;
62}
63
64h1 {
65    font-size: 2.4em;
66}
67
68h2 {
69    font-size: 1.4em;
70}
71
72h3 {
73    margin: 1em 0;
74}
75
76ul {
77    margin: 0;
78    padding: 0;
79}
80
81p, li, pre {
82    margin: 1em 0;
83}
84
85li {
86    margin-left: 2em;
87}
88
89a {
90    color: #000000;
91}
92
93pre, code {
94    max-width: 800px;
95    background: #eee;
96    font-family: Monaco, monospace;
97    font-size: 90%;
98}
99
100pre {
101    padding: .2em .5em;
102    overflow: hidden;
103    border-radius: .8em;
104}
105
106code {
107    padding: 0 .2em;
108}
109
110.slide header:only-child h1 {
111  line-height: 180%;
112  text-align: center;
113  display: table-cell;
114  vertical-align: middle;
115  height: 600px;
116  width: 800px;
117  font-size: 48px;
118  margin-top:100px;
119  margin-bottom:100px;
120}
121
122#toc, #help, .slide aside, .slide footer, .slide .notes,
123.presenter_notes, #current_presenter_notes, #presenter_note {
124  display: none;
125}
126
127    </style>
128    <style type="text/css" media="screen, projection">
129      body {
130  font: 14px "Lucida Grande", "Trebuchet MS", Verdana, sans-serif;
131  background: #778;
132  padding: 0;
133  margin: 0;
134  overflow: hidden;
135}
136
137div.presentation {
138  position: absolute;
139  width: 100%;
140  display: table-cell;
141  vertical-align: middle;
142  height: 100%;
143  background: inherit;
144}
145
146div.presentation > h1 {
147  display: none;
148}
149
150div.slides, body.expose div.slides.nocontext {
151  width: 100%;
152  height: 100%;
153  left: 0;
154  top: 0;
155  position: absolute;
156  display: block;
157}
158
159div.slides.nocontext {
160  width: 900px;
161  margin: 0 auto;
162  overflow: hidden;
163  position: relative;
164  left: auto;
165  top: auto;
166}
167
168div.slide {
169  display: inline;
170  position: absolute;
171  overflow: hidden;
172  width: 900px;
173  height: 700px;
174  margin-top: -350px;
175  margin-left: -400px;
176  left: 50%;
177  top: 50%;
178  background: -webkit-gradient(linear, left bottom, left top, from(#bbd), to(#fff));
179  background-color: #eee;
180  background: -moz-linear-gradient(bottom, #bbd, #fff);
181  -webkit-transition: margin 0.25s ease-in-out;
182  -moz-transition: margin 0.25s ease-in-out;
183  -o-transition: margin 0.25s ease-in-out;
184  border-top-left-radius: 20px;
185  -moz-border-radius-topleft: 20px;
186  -webkit-border-top-left-radius: 20px;
187  border-top-right-radius: 20px;
188  -moz-border-radius-topright: 20px;
189  -webkit-border-top-right-radius: 20px;
190  border-bottom-right-radius: 20px;
191  -moz-border-radius-bottomright: 20px;
192  -webkit-border-bottom-right-radius: 20px;
193  border-bottom-left-radius: 20px;
194  -moz-border-radius-bottomleft: 20px;
195  -webkit-border-bottom-left-radius: 20px;
196}
197
198/* Expose */
199
200body.expose div.slides {
201  float: left;
202  position: relative;
203  overflow: auto;
204  margin-bottom: 10px;
205}
206
207body.expose div.slide {
208  display: block;
209  float: left;
210  position: relative;
211  left: auto !important;
212  top: auto !important;
213  margin: 10px !important;
214  -webkit-transition: none;
215  -moz-transition: none;
216  -o-transition: none;
217  -moz-transform: scale(.33, .33);
218  -moz-transform-origin: 0 0;
219  -webkit-transform: scale(.33, .33);
220  -webkit-transform-origin: 0 0;
221  -o-transform: scale(.33, .33);
222  -o-transform-origin: 0 0;
223  -webkit-transition: none;
224  -moz-transition: none;
225  -o-transition: none;
226  cursor: pointer;
227}
228
229body.expose div.slide:hover {
230  background: -webkit-gradient(linear, left bottom, left top, from(#bdd), to(#fff));
231  background-color: #eee;
232  background: -moz-linear-gradient(bottom, #bdd, #fff);
233}
234
235body.expose .slide-wrapper {
236  float: left;
237  position: relative;
238  margin: .5%;
239  width: 300px;
240  height: 233px;
241}
242
243body.expose .slide footer {
244}
245
246body.expose .slide .inner {
247}
248
249body.expose .slide.far-past,
250body.expose .slide.past,
251body.expose .slide.future,
252body.expose .slide.far-future {
253  margin-left: 0;
254}
255
256body.expose .slide.current {
257  background: -webkit-gradient(linear, left bottom, left top, from(#ddb), to(#fff));
258  background-color: #eee;
259  background: -moz-linear-gradient(bottom, #ddb, #fff);
260  border: 16px solid #fff;
261  -moz-transform: scale(.315, .315);
262  -moz-transform-origin: 0 0;
263  -webkit-transform: scale(.315, .315);
264  -webkit-transform-origin: 0 0;
265  -o-transform: scale(.315, .315);
266  -o-transform-origin: 0 0;
267}
268
269/* Presenter Mode */
270
271body.presenter_view div.slide {
272  display: inline;
273  position: absolute;
274  overflow: hidden;
275  -moz-transform: scale(.5, .5);
276  -moz-transform-origin: 0 0;
277  -webkit-transform: scale(.5, .5);
278  -webkit-transform-origin: 0 0;
279  -o-transform: scale(.5, .5);
280  -o-transform-origin: 0 0;
281    margin-top: -300px;
282}
283
284body.presenter_view .slide.far-past {
285  display: block;
286  margin-left: -1500px;
287}
288
289body.presenter_view .slide.past {
290  display: block;
291  margin-left: -975px;
292}
293
294body.presenter_view .slide.current {
295  display: block;
296  margin-left: -475px;
297  border: 8px solid maroon;
298  z-index: 2;
299}
300
301body.presenter_view .slide.future {
302  display: block;
303  margin-left: 25px;
304  z-index: 1;
305}
306
307body.presenter_view .slide.far-future {
308  display: block;
309  margin-left: 525px;
310}
311
312body.presenter_view div#current_presenter_notes {
313    visibility: visible;
314    display: block;
315    position: absolute;
316    overflow: auto;
317    vertical-align: middle;
318    left: 50%;
319    top: 50%;
320    margin-left: -475px;
321    margin-top: 100px;
322    z-index: 2;
323    width: 950px;
324    border-style: solid;
325    height: 30%;
326    background-color: silver;
327}
328
329body.presenter_view div#current_presenter_notes section {
330  font-family: "Lucida Grande", "Trebuchet MS", Verdana, sans-serif;
331  color: black;
332  text-shadow: rgba(0, 0, 0, 0.2) 0 2px 5px;
333  display: block;
334  overflow: visible;
335    position: relative;
336    background-color: #fffeff;
337    height: 120px;
338    margin-right: 30px;
339    margin-top: 60px;
340    margin-left: 30px;
341    padding-right: 10px;
342    padding-left: 10px;
343    padding-top: 10px;
344}
345
346body.presenter_view div#current_presenter_notes section p {
347    margin: 0;
348}
349
350body.presenter_view div#current_presenter_notes h1 {
351    font-size: 50%;
352    display: block;
353}
354
355div#current_presenter_notes {
356  display: none;
357}
358
359div.slide div.presenter_notes, div.slides div.presenter_notes {
360  display: none;
361}
362
363/* Slide styles */
364
365div.slide p {
366  font-size: 20px;
367}
368
369.slide.far-past {
370  display: block;
371  margin-left: -2400px;
372}
373
374.slide.past {
375  display: block;
376  margin-left: -1400px;
377}
378
379.slide.current {
380  display: block;
381  margin-left: -450px;
382}
383
384.slide.future {
385  display: block;
386  margin-left: 500px;
387}
388
389.slide.far-future {
390  display: block;
391  margin-left: 1500px;
392}
393
394body.three-d div.slides {
395  -webkit-transform: translateX(50px) scale(0.8) rotateY(10deg);
396  -moz-transform: translateX(50px) scale(0.8) rotateY(10deg);
397  -o-transform: translateX(50px) scale(0.8) rotateY(10deg);
398}
399
400
401/* Content */
402
403header:not(:only-child) {
404  font-family: "Lucida Grande", "Trebuchet MS", Verdana, sans-serif;
405  font-weight: normal;
406  font-size: 50px;
407  letter-spacing: -.05em;
408  color: black;
409  text-shadow: rgba(0, 0, 0, 0.2) 0 2px 5px;
410  position: absolute;
411  left: 30px;
412  top: 25px;
413  margin: 0;
414  padding: 0;
415}
416
417header h1, header h2, header h3, header h4, header h5, header h6 {
418  display: inline;
419  font-size: 100%;
420  font-weight: normal;
421  padding: 0;
422  margin: 0;
423}
424
425header h2:first-child {
426  margin-top: 0;
427}
428
429section, .slide header:only-child h1 {
430  font-family: "Lucida Grande", "Trebuchet MS", Verdana, sans-serif;
431  color: #3f3f3f;
432  text-shadow: rgba(0, 0, 0, 0.2) 0 2px 5px;
433  margin-left: 30px;
434  margin-right: 30px;
435  margin-top: 100px;
436  display: block;
437  overflow: hidden;
438}
439
440img { display: block; margin: auto; }
441
442section img.align-center {
443  display: block;
444  margin-left: auto;
445  margin-right: auto;
446}
447
448section img.align-right {
449  display: block;
450  margin-left: auto;
451  margin-right: 0;
452}
453
454section img.align-left {
455  display: block;
456  margin-right: auto;
457  margin-left: 0;
458}
459
460a {
461  color: inherit;
462  display: inline-block;
463  text-decoration: none;
464  line-height: 110%;
465  border-bottom: 2px solid #3f3f3f;
466}
467
468pre {
469  font-size: 16px;
470  font-family: Monaco, Courier, monospace;
471}
472
473li {
474  padding: 10px 0;
475  font-size: 20px;
476}
477
478.slide header:only-child h1 {
479  line-height: 180%;
480  text-align: center;
481  display: table-cell;
482  vertical-align: middle;
483  height: 700px;
484  width: 900px;
485  font-size: 50px;
486  margin-top:100px;
487  margin-bottom:100px;
488}
489
490.sidebar {
491  clear: both;
492  background: -webkit-gradient(linear, top right, bottom right, from(#dde), to(#fff));
493  -webkit-transition: margin 0.25s ease-in-out;
494  background-color: #eee;
495  background: -moz-linear-gradient(right, #dde, #fff);
496  border-right: 5px solid #ccd;
497  z-index: 9999999;
498  height: 100%;
499  overflow: hidden;
500  top: 0;
501  position: absolute;
502  display: block;
503  margin: 0;
504  margin-left: -400px;
505  padding: 10px 16px;
506  overflow: auto;
507  -webkit-transition: margin 0.2s ease-in-out;
508  -moz-transition: margin 0.2s ease-in-out;
509  -o-transition: margin 0.2s ease-in-out;
510}
511
512.sidebar h2 {
513  text-shadow: rgba(0, 0, 0, 0.2) 0 2px 5px;
514  margin: 0 0 16px;
515  padding: 0;
516}
517
518.sidebar table {
519  width: 100%;
520  margin: 0;
521  padding: 0;
522  border-collapse: collapse;
523}
524
525.sidebar table caption {
526  display: none;
527}
528
529.sidebar tr {
530  margin: 2px 0;
531  border-bottom: 1px solid #ccc;
532}
533
534.sidebar th {
535  text-align: left;
536  font-weight: normal;
537  max-width: 300px;
538  overflow: hidden;
539}
540
541.sidebar tr.sub th {
542  text-indent: 20px;
543}
544
545.sidebar td {
546  text-align: right;
547  min-width: 20px;
548}
549
550.sidebar a {
551  display: block;
552  text-decoration: none;
553  border-bottom: none;
554  padding: 4px 0;
555}
556
557.sidebar tr.active {
558  background: #ff0;
559}
560
561aside {
562  display: none;
563}
564  aside.source {
565    position: absolute;
566    bottom: 6px;
567    left: 10px;
568    text-indent: 10px;
569  }
570  aside.page_number {
571    position: absolute;
572    bottom: 6px;
573    right: 10px;
574    text-indent: 10px;
575  }
576
577.notes {
578  display: none;
579  padding: 10px;
580  background: #ccc;
581  border-radius: 10px;
582  -moz-border-radius: 10px;
583  -webkit-border-radius: 10px;
584}
585  div.slide p.notes {
586    font-size: 90%;
587}
588
589/* Pygments default theme */
590.hll { background-color: #ffffcc }
591.c { color: #408080; font-style: italic } /* Comment */
592.err { border: 1px solid #FF0000 } /* Error */
593.k { color: #008000; font-weight: bold } /* Keyword */
594.o { color: #666666 } /* Operator */
595.cm { color: #408080; font-style: italic } /* Comment.Multiline */
596.cp { color: #BC7A00 } /* Comment.Preproc */
597.c1 { color: #408080; font-style: italic } /* Comment.Single */
598.cs { color: #408080; font-style: italic } /* Comment.Special */
599.gd { color: #A00000 } /* Generic.Deleted */
600.ge { font-style: italic } /* Generic.Emph */
601.gr { color: #FF0000 } /* Generic.Error */
602.gh { color: #000080; font-weight: bold } /* Generic.Heading */
603.gi { color: #00A000 } /* Generic.Inserted */
604.go { color: #808080 } /* Generic.Output */
605.gp { color: #000080; font-weight: bold } /* Generic.Prompt */
606.gs { font-weight: bold } /* Generic.Strong */
607.gu { color: #800080; font-weight: bold } /* Generic.Subheading */
608.gt { color: #0040D0 } /* Generic.Traceback */
609.kc { color: #008000; font-weight: bold } /* Keyword.Constant */
610.kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
611.kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
612.kp { color: #008000 } /* Keyword.Pseudo */
613.kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
614.kt { color: #B00040 } /* Keyword.Type */
615.m { color: #666666 } /* Literal.Number */
616.s { color: #BA2121 } /* Literal.String */
617.na { color: #7D9029 } /* Name.Attribute */
618.nb { color: #008000 } /* Name.Builtin */
619.nc { color: #0000FF; font-weight: bold } /* Name.Class */
620.no { color: #880000 } /* Name.Constant */
621.nd { color: #AA22FF } /* Name.Decorator */
622.ni { color: #999999; font-weight: bold } /* Name.Entity */
623.ne { color: #D2413A; font-weight: bold } /* Name.Exception */
624.nf { color: #0000FF } /* Name.Function */
625.nl { color: #A0A000 } /* Name.Label */
626.nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
627.nt { color: #008000; font-weight: bold } /* Name.Tag */
628.nv { color: #19177C } /* Name.Variable */
629.ow { color: #AA22FF; font-weight: bold } /* Operator.Word */
630.w { color: #bbbbbb } /* Text.Whitespace */
631.mf { color: #666666 } /* Literal.Number.Float */
632.mh { color: #666666 } /* Literal.Number.Hex */
633.mi { color: #666666 } /* Literal.Number.Integer */
634.mo { color: #666666 } /* Literal.Number.Oct */
635.sb { color: #BA2121 } /* Literal.String.Backtick */
636.sc { color: #BA2121 } /* Literal.String.Char */
637.sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
638.s2 { color: #BA2121 } /* Literal.String.Double */
639.se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */
640.sh { color: #BA2121 } /* Literal.String.Heredoc */
641.si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */
642.sx { color: #008000 } /* Literal.String.Other */
643.sr { color: #BB6688 } /* Literal.String.Regex */
644.s1 { color: #BA2121 } /* Literal.String.Single */
645.ss { color: #19177C } /* Literal.String.Symbol */
646.bp { color: #008000 } /* Name.Builtin.Pseudo */
647.vc { color: #19177C } /* Name.Variable.Class */
648.vg { color: #19177C } /* Name.Variable.Global */
649.vi { color: #19177C } /* Name.Variable.Instance */
650.il { color: #666666 } /* Literal.Number.Integer.Long */
651
652#blank {
653  position: absolute;
654  top: 0;
655  left: 0;
656  background-color: black;
657  width: 100%;
658  height: 100%;
659  z-index: 64;
660  display: none;
661}
662
663    </style>
664   
665   
666    <!-- /Styles -->
667    <!-- Javascripts -->
668   
669    <script>
670      function main() {
671    // Since we don't have the fallback of attachEvent and
672    // other IE only stuff we won't try to run JS for IE.
673    // It will run though when using Google Chrome Frame
674    if (document.all) { return; }
675
676    var currentSlideNo;
677    var notesOn = false;
678    var expanded = false;
679    var hiddenContext = false;
680    var blanked = false;
681    var slides = document.getElementsByClassName('slide');
682    var touchStartX = 0;
683    var spaces = /\s+/, a1 = [''];
684    var tocOpened = false;
685    var helpOpened = false;
686    var overviewActive = false;
687    var modifierKeyDown = false;
688    var scale = 1;
689    var showingPresenterView = false;
690    var presenterViewWin = null;
691    var isPresenterView = false;
692
693    var str2array = function(s) {
694        if (typeof s == 'string' || s instanceof String) {
695            if (s.indexOf(' ') < 0) {
696                a1[0] = s;
697                return a1;
698            } else {
699                return s.split(spaces);
700            }
701        }
702        return s;
703    };
704
705    var trim = function(str) {
706        return str.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
707    };
708
709    var addClass = function(node, classStr) {
710        classStr = str2array(classStr);
711        var cls = ' ' + node.className + ' ';
712        for (var i = 0, len = classStr.length, c; i < len; ++i) {
713            c = classStr[i];
714            if (c && cls.indexOf(' ' + c + ' ') < 0) {
715                cls += c + ' ';
716            }
717        }
718        node.className = trim(cls);
719    };
720
721    var removeClass = function(node, classStr) {
722        var cls;
723        if (!node) {
724            throw 'no node provided';
725        }
726        if (classStr !== undefined) {
727            classStr = str2array(classStr);
728            cls = ' ' + node.className + ' ';
729            for (var i = 0, len = classStr.length; i < len; ++i) {
730                cls = cls.replace(' ' + classStr[i] + ' ', ' ');
731            }
732            cls = trim(cls);
733        } else {
734            cls = '';
735        }
736        if (node.className != cls) {
737            node.className = cls;
738        }
739    };
740
741    var getSlideEl = function(slideNo) {
742        if (slideNo > 0) {
743            return slides[slideNo - 1];
744        } else {
745            return null;
746        }
747    };
748
749    var getSlideTitle = function(slideNo) {
750        var el = getSlideEl(slideNo);
751        if (el) {
752            var headers = el.getElementsByTagName('header');
753            if (headers.length > 0) {
754                return el.getElementsByTagName('header')[0].innerText;
755            }
756        }
757        return null;
758    };
759
760    var getSlidePresenterNote = function(slideNo) {
761        var el = getSlideEl(slideNo);
762        if (el) {
763            var n = el.getElementsByClassName('presenter_notes');
764            if (n.length > 0) {
765                return n[0];
766            }
767        }
768        return null;
769    };
770
771    var changeSlideElClass = function(slideNo, className) {
772        var el = getSlideEl(slideNo);
773        if (el) {
774            removeClass(el, 'far-past past current future far-future');
775            addClass(el, className);
776        }
777    };
778
779    var updateSlideClasses = function(updateOther) {
780        window.location.hash = (isPresenterView ? "presenter" : "slide") + currentSlideNo;
781
782        for (var i=1; i<currentSlideNo-1; i++) {
783            changeSlideElClass(i, 'far-past');
784        }
785
786        changeSlideElClass(currentSlideNo - 1, 'past');
787        changeSlideElClass(currentSlideNo, 'current');
788        changeSlideElClass(currentSlideNo + 1, 'future');
789
790        for (i=currentSlideNo+2; i<slides.length+1; i++) {
791            changeSlideElClass(i, 'far-future');
792        }
793
794        highlightCurrentTocLink();
795
796        processContext();
797
798        document.getElementsByTagName('title')[0].innerText = getSlideTitle(currentSlideNo);
799
800        updatePresenterNotes();
801
802        if (updateOther) { updateOtherPage(); }
803    };
804
805    var updatePresenterNotes = function() {
806        if (!isPresenterView) { return; }
807
808        var existingNote = document.getElementById('current_presenter_notes');
809        var currentNote = getSlidePresenterNote(currentSlideNo).cloneNode(true);
810        currentNote.setAttribute('id', 'presenter_note');
811
812        existingNote.replaceChild(currentNote, document.getElementById('presenter_note'));
813    };
814
815    var highlightCurrentTocLink = function() {
816        var toc = document.getElementById('toc');
817
818        if (toc) {
819            var tocRows = toc.getElementsByTagName('tr');
820            for (var i=0; i<tocRows.length; i++) {
821                removeClass(tocRows.item(i), 'active');
822            }
823
824            var currentTocRow = document.getElementById('toc-row-' + currentSlideNo);
825            if (currentTocRow) {
826                addClass(currentTocRow, 'active');
827            }
828        }
829    };
830
831    var updateOtherPage = function() {
832        if (!showingPresenterView) { return; }
833
834        var w = isPresenterView ? window.opener : presenterViewWin;
835        w.postMessage('slide#' + currentSlideNo, '*');
836    };
837
838    var nextSlide = function() {
839        if (currentSlideNo < slides.length) {
840            currentSlideNo++;
841        }
842        updateSlideClasses(true);
843    };
844
845    var prevSlide = function() {
846        if (currentSlideNo > 1) {
847            currentSlideNo--;
848        }
849        updateSlideClasses(true);
850    };
851
852    var showNotes = function() {
853        var notes = getSlideEl(currentSlideNo).getElementsByClassName('notes');
854        for (var i = 0, len = notes.length; i < len; i++) {
855            notes.item(i).style.display = (notesOn) ? 'none':'block';
856        }
857        notesOn = !notesOn;
858    };
859
860    var showSlideNumbers = function() {
861        var asides = document.getElementsByClassName('page_number');
862        var hidden = asides[0].style.display != 'block';
863        for (var i = 0; i < asides.length; i++) {
864            asides.item(i).style.display = hidden ? 'block' : 'none';
865        }
866    };
867
868    var showSlideSources = function() {
869        var asides = document.getElementsByClassName('source');
870        var hidden = asides[0].style.display != 'block';
871        for (var i = 0; i < asides.length; i++) {
872            asides.item(i).style.display = hidden ? 'block' : 'none';
873        }
874    };
875
876    var showToc = function() {
877        if (helpOpened) {
878                showHelp();
879        }
880        var toc = document.getElementById('toc');
881        if (toc) {
882            toc.style.marginLeft = tocOpened ? '-' + (toc.clientWidth + 20) + 'px' : '0px';
883            tocOpened = !tocOpened;
884        }
885        updateOverview();
886    };
887
888    var showHelp = function() {
889        if (tocOpened) {
890                showToc();
891        }
892
893        var help = document.getElementById('help');
894
895        if (help) {
896            help.style.marginLeft = helpOpened ? '-' + (help.clientWidth + 20) + 'px' : '0px';
897            helpOpened = !helpOpened;
898        }
899    };
900
901    var showPresenterView = function() {
902        if (isPresenterView) { return; }
903
904        if (showingPresenterView) {
905            presenterViewWin.close();
906            presenterViewWin = null;
907            showingPresenterView = false;
908        } else {
909            presenterViewWin = open(window.location.pathname + "#presenter" + currentSlideNo, 'presenter_notes',
910                                                                    'directories=no,location=no,toolbar=no,menubar=no,copyhistory=no');
911            showingPresenterView = true;
912        }
913    };
914
915    var switch3D = function() {
916        if (document.body.className.indexOf('three-d') == -1) {
917            document.getElementsByClassName('presentation')[0].style.webkitPerspective = '1000px';
918            document.body.className += ' three-d';
919        } else {
920            window.setTimeout('document.getElementsByClassName(\'presentation\')[0].style.webkitPerspective = \'0\';', 2000);
921            document.body.className = document.body.className.replace(/three-d/, '');
922        }
923    };
924
925    var toggleOverview = function() {
926        if (!overviewActive) {
927            addClass(document.body, 'expose');
928            overviewActive = true;
929            setScale(1);
930        } else {
931            removeClass(document.body, 'expose');
932            overviewActive = false;
933            if (expanded) {
934                setScale(scale);    // restore scale
935            }
936        }
937        processContext();
938        updateOverview();
939    };
940
941    var updateOverview = function() {
942        try {
943            var presentation = document.getElementsByClassName('presentation')[0];
944        } catch (e) {
945            return;
946        }
947
948        if (isPresenterView) {
949            var action = overviewActive ? removeClass : addClass;
950            action(document.body, 'presenter_view');
951        }
952
953        var toc = document.getElementById('toc');
954
955        if (!toc) {
956            return;
957        }
958
959        if (!tocOpened || !overviewActive) {
960            presentation.style.marginLeft = '0px';
961            presentation.style.width = '100%';
962        } else {
963            presentation.style.marginLeft = toc.clientWidth + 'px';
964            presentation.style.width = (presentation.clientWidth - toc.clientWidth) + 'px';
965        }
966    };
967
968    var computeScale = function() {
969        var cSlide = document.getElementsByClassName('current')[0];
970        var sx = cSlide.clientWidth / window.innerWidth;
971        var sy = cSlide.clientHeight / window.innerHeight;
972        return 1 / Math.max(sx, sy);
973    };
974
975    var setScale = function(scale) {
976        var presentation = document.getElementsByClassName('slides')[0];
977        var transform = 'scale(' + scale + ')';
978        presentation.style.MozTransform = transform;
979        presentation.style.WebkitTransform = transform;
980        presentation.style.OTransform = transform;
981        presentation.style.msTransform = transform;
982        presentation.style.transform = transform;
983    };
984
985    var expandSlides = function() {
986        if (overviewActive) {
987            return;
988        }
989        if (expanded) {
990            setScale(1);
991            expanded = false;
992        } else {
993            scale = computeScale();
994            setScale(scale);
995            expanded = true;
996        }
997    };
998
999    var showContext = function() {
1000        try {
1001            var presentation = document.getElementsByClassName('slides')[0];
1002            removeClass(presentation, 'nocontext');
1003        } catch (e) {}
1004    };
1005
1006    var hideContext = function() {
1007        try {
1008            var presentation = document.getElementsByClassName('slides')[0];
1009            addClass(presentation, 'nocontext');
1010        } catch (e) {}
1011    };
1012
1013    var processContext = function() {
1014        if (hiddenContext) {
1015            hideContext();
1016        } else {
1017            showContext();
1018        }
1019    };
1020
1021    var toggleContext = function() {
1022        hiddenContext = !hiddenContext;
1023        processContext();
1024    };
1025
1026    var toggleBlank = function() {
1027        blank_elem = document.getElementById('blank');
1028
1029        blank_elem.style.display = blanked ? 'none' : 'block';
1030
1031        blanked = !blanked;
1032    };
1033
1034    var isModifierKey = function(keyCode) {
1035        switch (keyCode) {
1036            case 16: // shift
1037            case 17: // ctrl
1038            case 18: // alt
1039            case 91: // command
1040                return true;
1041                break;
1042            default:
1043                return false;
1044                break;
1045        }
1046    };
1047
1048    var checkModifierKeyUp = function(event) {
1049        if (isModifierKey(event.keyCode)) {
1050            modifierKeyDown = false;
1051        }
1052    };
1053
1054    var checkModifierKeyDown = function(event) {
1055        if (isModifierKey(event.keyCode)) {
1056            modifierKeyDown = true;
1057        }
1058    };
1059
1060    var handleBodyKeyDown = function(event) {
1061        switch (event.keyCode) {
1062            case 13: // Enter
1063                if (overviewActive) {
1064                    toggleOverview();
1065                }
1066                break;
1067            case 27: // ESC
1068                toggleOverview();
1069                break;
1070            case 37: // left arrow
1071            case 33: // page up
1072                prevSlide();
1073                break;
1074            case 39: // right arrow
1075            case 32: // space
1076            case 34: // page down
1077                nextSlide();
1078                break;
1079            case 50: // 2
1080                if (!modifierKeyDown) {
1081                        showNotes();
1082                }
1083                break;
1084            case 51: // 3
1085                if (!modifierKeyDown && !overviewActive) {
1086                    switch3D();
1087                }
1088                break;
1089            case 190: // .
1090            case 48: // 0
1091            case 66: // b
1092                if (!modifierKeyDown && !overviewActive) {
1093                    toggleBlank();
1094                }
1095                break;
1096            case 67: // c
1097                if (!modifierKeyDown && !overviewActive) {
1098                    toggleContext();
1099                }
1100                break;
1101            case 69: // e
1102                if (!modifierKeyDown && !overviewActive) {
1103                    expandSlides();
1104                }
1105                break;
1106            case 72: // h
1107                showHelp();
1108                break;
1109            case 78: // n
1110                if (!modifierKeyDown && !overviewActive) {
1111                    showSlideNumbers();
1112                }
1113                break;
1114            case 80: // p
1115                if (!modifierKeyDown && !overviewActive) {
1116                    showPresenterView();
1117                }
1118                break;
1119            case 83: // s
1120                if (!modifierKeyDown && !overviewActive) {
1121                    showSlideSources();
1122                }
1123                break;
1124            case 84: // t
1125                showToc();
1126                break;
1127        }
1128    };
1129
1130    var handleWheel = function(event) {
1131        if (tocOpened || helpOpened || overviewActive) {
1132            return;
1133        }
1134
1135        var delta = 0;
1136
1137        if (!event) {
1138            event = window.event;
1139        }
1140
1141        if (event.wheelDelta) {
1142            delta = event.wheelDelta/120;
1143            if (window.opera) delta = -delta;
1144        } else if (event.detail) {
1145            delta = -event.detail/3;
1146        }
1147
1148        if (delta && delta <0) {
1149            nextSlide();
1150        } else if (delta) {
1151            prevSlide();
1152        }
1153    };
1154
1155    var addSlideClickListeners = function() {
1156        for (var i=0; i < slides.length; i++) {
1157            var slide = slides.item(i);
1158            slide.num = i + 1;
1159            slide.addEventListener('click', function(e) {
1160                if (overviewActive) {
1161                    currentSlideNo = this.num;
1162                    toggleOverview();
1163                    updateSlideClasses(true);
1164                    e.preventDefault();
1165                }
1166                return false;
1167            }, true);
1168        }
1169    };
1170
1171    var addRemoteWindowControls = function() {
1172        window.addEventListener("message", function(e) {
1173            if (e.data.indexOf("slide#") != -1) {
1174                    currentSlideNo = Number(e.data.replace('slide#', ''));
1175                    updateSlideClasses(false);
1176            }
1177        }, false);
1178    };
1179
1180    var addTouchListeners = function() {
1181        document.addEventListener('touchstart', function(e) {
1182            touchStartX = e.touches[0].pageX;
1183        }, false);
1184        document.addEventListener('touchend', function(e) {
1185            var pixelsMoved = touchStartX - e.changedTouches[0].pageX;
1186            var SWIPE_SIZE = 150;
1187            if (pixelsMoved > SWIPE_SIZE) {
1188                nextSlide();
1189            }
1190            else if (pixelsMoved < -SWIPE_SIZE) {
1191             prevSlide();
1192            }
1193        }, false);
1194    };
1195
1196    var addTocLinksListeners = function() {
1197        var toc = document.getElementById('toc');
1198        if (toc) {
1199            var tocLinks = toc.getElementsByTagName('a');
1200            for (var i=0; i < tocLinks.length; i++) {
1201                tocLinks.item(i).addEventListener('click', function(e) {
1202                    currentSlideNo = Number(this.attributes['href'].value.replace('#slide', ''));
1203                    updateSlideClasses(true);
1204                    e.preventDefault();
1205                }, true);
1206            }
1207        }
1208    };
1209
1210    // initialize
1211
1212    (function() {
1213        if (window.location.hash == "") {
1214            currentSlideNo = 1;
1215        } else if (window.location.hash.indexOf("#presenter") != -1) {
1216            currentSlideNo = Number(window.location.hash.replace('#presenter', ''));
1217            isPresenterView = true;
1218            showingPresenterView = true;
1219            presenterViewWin = window;
1220            addClass(document.body, 'presenter_view');
1221        } else {
1222            currentSlideNo = Number(window.location.hash.replace('#slide', ''));
1223        }
1224
1225        document.addEventListener('keyup', checkModifierKeyUp, false);
1226        document.addEventListener('keydown', handleBodyKeyDown, false);
1227        document.addEventListener('keydown', checkModifierKeyDown, false);
1228        document.addEventListener('DOMMouseScroll', handleWheel, false);
1229
1230        window.onmousewheel = document.onmousewheel = handleWheel;
1231        window.onresize = expandSlides;
1232
1233        for (var i = 0, el; el = slides[i]; i++) {
1234            addClass(el, 'slide far-future');
1235        }
1236        updateSlideClasses(false);
1237
1238        // add support for finger events (filter it by property detection?)
1239        addTouchListeners();
1240
1241        addTocLinksListeners();
1242
1243        addSlideClickListeners();
1244
1245        addRemoteWindowControls();
1246    })();
1247}
1248
1249    </script>
1250   
1251   
1252    <!-- /Javascripts -->
1253</head>
1254<body>
1255  <div id="blank"></div>
1256  <div class="presentation">
1257    <div id="current_presenter_notes">
1258      <div id="presenter_note"></div>
1259    </div>
1260    <div class="slides">
1261     
1262      <!-- slide source: slides.rst -->
1263      <div class="slide-wrapper">
1264        <div class="slide">
1265          <div class="inner">
1266           
1267            <header><h1>Building an ORM for Riak</h1></header>
1268           
1269           
1270            <section><table class="docinfo" frame="void" rules="none">
1271<col class="docinfo-name" />
1272<col class="docinfo-content" />
1273<tbody valign="top">
1274<tr><th class="docinfo-name">Author:</th>
1275<td>Simon Cross</td></tr>
1276<tr><th class="docinfo-name">Date:</th>
1277<td>2 June 2012</td></tr>
1278</tbody>
1279</table></section>
1280           
1281          </div>
1282          <div class="presenter_notes">
1283            <header><h1>Presenter Notes</h1></header>
1284            <section>
1285           
1286            </section>
1287          </div>
1288          <footer>
1289           
1290            <aside class="source">
1291              Source: <a href="slides.rst">slides.rst</a>
1292            </aside>
1293           
1294            <aside class="page_number">
1295              1/8
1296            </aside>
1297          </footer>
1298        </div>
1299      </div>
1300     
1301      <!-- slide source: slides.rst -->
1302      <div class="slide-wrapper">
1303        <div class="slide">
1304          <div class="inner">
1305           
1306            <header><h1>What is Riak?</h1></header>
1307           
1308           
1309            <section><img alt="images/riak-transparent-small.png" class="align-center" src="data:image/png;base64,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" />
1310<ul class="simple">
1311<li>A key/value store (a <strong>GIANT</strong> hash table)</li>
1312<li>A product of Basho (www.basho.com)</li>
1313<li>Apached licensed</li>
1314</ul></section>
1315           
1316          </div>
1317          <div class="presenter_notes">
1318            <header><h1>Presenter Notes</h1></header>
1319            <section>
1320           
1321            </section>
1322          </div>
1323          <footer>
1324           
1325            <aside class="source">
1326              Source: <a href="slides.rst">slides.rst</a>
1327            </aside>
1328           
1329            <aside class="page_number">
1330              2/8
1331            </aside>
1332          </footer>
1333        </div>
1334      </div>
1335     
1336      <!-- slide source: slides.rst -->
1337      <div class="slide-wrapper">
1338        <div class="slide">
1339          <div class="inner">
1340           
1341            <header><h1>Why Riak</h1></header>
1342           
1343           
1344            <section><ul class="simple">
1345<li>Super easy to administer</li>
1346<li>Secondary indexes</li>
1347<li>Solr-like search interface</li>
1348<li>Map-reduce queries</li>
1349</ul></section>
1350           
1351          </div>
1352          <div class="presenter_notes">
1353            <header><h1>Presenter Notes</h1></header>
1354            <section>
1355           
1356            </section>
1357          </div>
1358          <footer>
1359           
1360            <aside class="source">
1361              Source: <a href="slides.rst">slides.rst</a>
1362            </aside>
1363           
1364            <aside class="page_number">
1365              3/8
1366            </aside>
1367          </footer>
1368        </div>
1369      </div>
1370     
1371      <!-- slide source: slides.rst -->
1372      <div class="slide-wrapper">
1373        <div class="slide">
1374          <div class="inner">
1375           
1376            <header><h2>Under the hood</h2></header>
1377           
1378           
1379            <section><ul class="simple">
1380<li>The key space is a partitioned ring.</li>
1381<li>Vector clocks are used to determine ordering.</li>
1382<li>When conflicts arrise, keep both values.</li>
1383</ul></section>
1384           
1385          </div>
1386          <div class="presenter_notes">
1387            <header><h1>Presenter Notes</h1></header>
1388            <section>
1389           
1390            </section>
1391          </div>
1392          <footer>
1393           
1394            <aside class="source">
1395              Source: <a href="slides.rst">slides.rst</a>
1396            </aside>
1397           
1398            <aside class="page_number">
1399              4/8
1400            </aside>
1401          </footer>
1402        </div>
1403      </div>
1404     
1405      <!-- slide source: slides.rst -->
1406      <div class="slide-wrapper">
1407        <div class="slide">
1408          <div class="inner">
1409           
1410            <header><h1>Setting up Riak</h1></header>
1411           
1412           
1413            <section><p>Download package and install:</p>
1414<pre><span class="gp">$</span> wget http://downloads.basho.com/riak/CURRENT/riak_1.1.2-1_i386.deb
1415<span class="gp">$</span> sudo dpkg -i riak_1.1.2-1_i386.deb
1416</pre>
1417<p>Add another node:</p>
1418<pre><span class="gp">$</span> riak-admin join riak@192.168.1.10
1419</pre>
1420<p>Tweaks for /etc/riak/app.config:</p>
1421<pre>{riak_kv, [
1422  %% Switch to backend that supports indexes
1423  {storage_backend, riak_kv_eleveldb_backend}
1424  ...
1425  ]},
1426
1427{riak_search, [
1428  %% To enable Search functionality
1429  {enabled, true}
1430  ]},
1431</pre></section>
1432           
1433          </div>
1434          <div class="presenter_notes">
1435            <header><h1>Presenter Notes</h1></header>
1436            <section>
1437           
1438            </section>
1439          </div>
1440          <footer>
1441           
1442            <aside class="source">
1443              Source: <a href="slides.rst">slides.rst</a>
1444            </aside>
1445           
1446            <aside class="page_number">
1447              5/8
1448            </aside>
1449          </footer>
1450        </div>
1451      </div>
1452     
1453      <!-- slide source: slides.rst -->
1454      <div class="slide-wrapper">
1455        <div class="slide">
1456          <div class="inner">
1457           
1458            <header><h1>Why an ORM</h1></header>
1459           
1460           
1461            <section><ul class="simple">
1462<li>Description of data</li>
1463<li>Ease of use</li>
1464</ul></section>
1465           
1466          </div>
1467          <div class="presenter_notes">
1468            <header><h1>Presenter Notes</h1></header>
1469            <section>
1470           
1471            </section>
1472          </div>
1473          <footer>
1474           
1475            <aside class="source">
1476              Source: <a href="slides.rst">slides.rst</a>
1477            </aside>
1478           
1479            <aside class="page_number">
1480              6/8
1481            </aside>
1482          </footer>
1483        </div>
1484      </div>
1485     
1486      <!-- slide source: slides.rst -->
1487      <div class="slide-wrapper">
1488        <div class="slide">
1489          <div class="inner">
1490           
1491            <header><h1>What we want this to look like</h1></header>
1492           
1493           
1494            <section><pre><span class="k">class</span> <span class="nc">Contact</span><span class="p">(</span><span class="n">Model</span><span class="p">):</span>
1495    <span class="sd">&quot;&quot;&quot;A contact&quot;&quot;&quot;</span>
1496
1497    <span class="n">user_account</span> <span class="o">=</span> <span class="n">ForeignKey</span><span class="p">(</span><span class="n">UserAccount</span><span class="p">)</span>
1498    <span class="n">name</span> <span class="o">=</span> <span class="n">Unicode</span><span class="p">(</span><span class="n">max_length</span><span class="o">=</span><span class="mi">255</span><span class="p">,</span> <span class="n">null</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
1499    <span class="n">surname</span> <span class="o">=</span> <span class="n">Unicode</span><span class="p">(</span><span class="n">max_length</span><span class="o">=</span><span class="mi">255</span><span class="p">,</span> <span class="n">null</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
1500    <span class="n">email_address</span> <span class="o">=</span> <span class="n">Unicode</span><span class="p">(</span><span class="n">null</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
1501    <span class="n">msisdn</span> <span class="o">=</span> <span class="n">Unicode</span><span class="p">(</span><span class="n">max_length</span><span class="o">=</span><span class="mi">255</span><span class="p">)</span>
1502    <span class="n">created_at</span> <span class="o">=</span> <span class="n">Timestamp</span><span class="p">(</span><span class="n">default</span><span class="o">=</span><span class="n">datetime</span><span class="o">.</span><span class="n">utcnow</span><span class="p">)</span>
1503    <span class="n">groups</span> <span class="o">=</span> <span class="n">ManyToMany</span><span class="p">(</span><span class="n">ContactGroup</span><span class="p">)</span>
1504</pre></section>
1505           
1506          </div>
1507          <div class="presenter_notes">
1508            <header><h1>Presenter Notes</h1></header>
1509            <section>
1510           
1511            </section>
1512          </div>
1513          <footer>
1514           
1515            <aside class="source">
1516              Source: <a href="slides.rst">slides.rst</a>
1517            </aside>
1518           
1519            <aside class="page_number">
1520              7/8
1521            </aside>
1522          </footer>
1523        </div>
1524      </div>
1525     
1526      <!-- slide source: slides.rst -->
1527      <div class="slide-wrapper">
1528        <div class="slide">
1529          <div class="inner">
1530           
1531            <header><h1>How we wrote it</h1></header>
1532           
1533           
1534            <section><ul class="simple">
1535<li>Descriptors</li>
1536<li>Database engine</li>
1537<li>Supports both sync and async in one code-base!</li>
1538</ul></section>
1539           
1540          </div>
1541          <div class="presenter_notes">
1542            <header><h1>Presenter Notes</h1></header>
1543            <section>
1544           
1545            </section>
1546          </div>
1547          <footer>
1548           
1549            <aside class="source">
1550              Source: <a href="slides.rst">slides.rst</a>
1551            </aside>
1552           
1553            <aside class="page_number">
1554              8/8
1555            </aside>
1556          </footer>
1557        </div>
1558      </div>
1559     
1560    </div>
1561  </div>
1562 
1563  <div id="toc" class="sidebar hidden">
1564    <h2>Table of Contents</h2>
1565    <table>
1566      <caption>Table of Contents</caption>
1567     
1568      <tr id="toc-row-1">
1569        <th><a href="#slide1">Building an ORM for Riak</a></th>
1570        <td><a href="#slide1">1</a></td>
1571      </tr>
1572     
1573     
1574      <tr id="toc-row-2">
1575        <th><a href="#slide2">What is Riak?</a></th>
1576        <td><a href="#slide2">2</a></td>
1577      </tr>
1578     
1579     
1580      <tr id="toc-row-3">
1581        <th><a href="#slide3">Why Riak</a></th>
1582        <td><a href="#slide3">3</a></td>
1583      </tr>
1584     
1585       
1586        <tr id="toc-row-4" class="sub">
1587          <th><a href="#slide4">Under the hood</a></th>
1588          <td><a href="#slide4">4</a></td>
1589        </tr>
1590       
1591     
1592     
1593      <tr id="toc-row-5">
1594        <th><a href="#slide5">Setting up Riak</a></th>
1595        <td><a href="#slide5">5</a></td>
1596      </tr>
1597     
1598     
1599      <tr id="toc-row-6">
1600        <th><a href="#slide6">Why an ORM</a></th>
1601        <td><a href="#slide6">6</a></td>
1602      </tr>
1603     
1604     
1605      <tr id="toc-row-7">
1606        <th><a href="#slide7">What we want this to look like</a></th>
1607        <td><a href="#slide7">7</a></td>
1608      </tr>
1609     
1610     
1611      <tr id="toc-row-8">
1612        <th><a href="#slide8">How we wrote it</a></th>
1613        <td><a href="#slide8">8</a></td>
1614      </tr>
1615     
1616     
1617    </table>
1618  </div>
1619 
1620  <div id="help" class="sidebar hidden">
1621    <h2>Help</h2>
1622    <table>
1623      <caption>Help</caption>
1624      <tr>
1625        <th>Table of Contents</th>
1626        <td>t</td>
1627      </tr>
1628      <tr>
1629        <th>Exposé</th>
1630        <td>ESC</td>
1631      </tr>
1632      <tr>
1633        <th>Full screen slides</th>
1634        <td>e</td>
1635      </tr>
1636      <tr>
1637        <th>Presenter View</th>
1638        <td>p</td>
1639      </tr>
1640      <tr>
1641        <th>Source Files</th>
1642        <td>s</td>
1643      </tr>
1644      <tr>
1645        <th>Slide Numbers</th>
1646        <td>n</td>
1647      </tr>
1648      <tr>
1649        <th>Toggle screen blanking</th>
1650        <td>b</td>
1651      </tr>
1652      <tr>
1653        <th>Show/hide slide context</th>
1654        <td>c</td>
1655      </tr>
1656      <tr>
1657        <th>Notes</th>
1658        <td>2</td>
1659      </tr>
1660      <tr>
1661        <th>Help</th>
1662        <td>h</td>
1663      </tr>
1664    </table>
1665  </div>
1666  <script>main()</script>
1667</body>
1668</html>