Meeting20120602: presentation.html

File presentation.html, 45.8 KB (added by hodgestar, 12 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>