Bob Ippolito avatar Bob Ippolito committed 363c60c

initial import

Comments (0)

Files changed (36)

+OUTPUT=slides.html# slides.pdf
+
+all: $(OUTPUT)
+
+clean:
+	rm -f $(OUTPUT) slides.{snm,aux,out,log,nav,toc,latex}
+
+slides.latex: slides.txt ui/beamerdefs.txt ui/stylesheet.latex ui/author.latex
+	./bin/rst2beamer.py --stylesheet=ui/stylesheet.latex --documentoptions=14pt slides.txt $@
+	sed -i.old 's/\\date{}/\\input{ui\/author.latex}/' $@
+
+slides.pdf: slides.latex
+	pdflatex slides.latex
+
+slides.html: slides.txt includes/*.html
+	rst2s5.py --theme-url ui/mochikit slides.txt $@
+
+.PHONY: all clean
+curl -O http://codespeak.net/svn/user/antocuni/bin/rst2beamer.py

bin/rst2beamer.py

+#!/usr/bin/env python
+# encoding: utf-8
+"""
+A docutils script converting restructured text into Beamer-flavoured LaTeX.
+
+Beamer is a LaTeX document class for presentations. Via this script, ReST can
+be used to prepare slides. It can be called::
+
+        rst2beamer.py infile.txt > outfile.tex
+        
+where ``infile.tex`` contains the produced Beamer LaTeX.
+
+See <http:www.agapow.net/programming/python/rst2beamer> for more details.
+
+"""
+# TODO: modifications for handout sections?
+# TOOD: sections and subsections?
+# TODO: enable beamer themes?
+# TODO: convert document metadata to front page fields?
+# TODO: toc-conversion?
+# TODO: fix descriptions
+
+# Unless otherwise stated, created by P-M Agapow on 2007-08-21
+# and open for academic & non-commercial use and modification .
+
+__docformat__ = 'restructuredtext en'
+__author__ = "Paul-Michael Agapow <agapow@bbsrc.ac.uk>"
+__version__ = "0.2"
+
+
+### IMPORTS ###
+
+import locale
+from docutils.core import publish_cmdline, default_description
+from docutils.writers.latex2e import Writer as Latex2eWriter
+from docutils.writers.latex2e import LaTeXTranslator, DocumentClass
+from docutils import nodes
+
+## CONSTANTS & DEFINES: ###
+
+BEAMER_SPEC =   (
+        'Beamer options',
+        'These are derived almost entirely from the LaTeX2e options',
+        tuple (
+                [
+                        (
+                                'Specify theme.',
+                                ['--theme'],
+                                {'default': '', }
+                        ),
+                        (
+                                'Specify document options.       Multiple options can be given, '
+                                'separated by commas.  Default is "10pt,a4paper".',
+                                ['--documentoptions'],
+                                {'default': '', }
+                        ),
+                ] + list (Latex2eWriter.settings_spec[2][2:])
+        ),
+)
+
+BEAMER_DEFAULTS = {
+        'output_encoding': 'latin-1',
+        'documentclass': 'beamer',
+}
+
+
+### IMPLEMENTATION ###
+
+try:
+         locale.setlocale (locale.LC_ALL, '')
+except:
+         pass
+
+class BeamerTranslator (LaTeXTranslator):
+        """
+        A converter for docutils elements to beamer-flavoured latex.
+        """
+
+        def __init__ (self, document):
+                LaTeXTranslator.__init__ (self, document)
+                self.head_prefix = [x for x in self.head_prefix if ('{typearea}' not in x)]
+                hyperref_posn = [i for i in range (len (self.head_prefix)) if ('{hyperref}' in self.head_prefix[i])]
+                self.head_prefix[hyperref_posn[0]] = '\\usepackage{hyperref}\n'
+                self.head_prefix.extend ([
+                        '\\definecolor{rrblitbackground}{rgb}{0.55, 0.3, 0.1}\n',
+                        '\\newenvironment{rtbliteral}{\n',
+                        '\\begin{ttfamily}\n',
+                        '\\color{rrblitbackground}\n',
+                        '}{\n',
+                        '\\end{ttfamily}\n',
+                        '}\n',
+                ])
+                # this fixes the hardcoded section titles in docutils 0.4
+                self.d_class = DocumentClass ('article')
+
+        def begin_frametag (self):
+                return '\\begin{frame}\n'
+
+        def end_frametag (self):
+                return '\\end{frame}\n'
+
+        def visit_section (self, node):
+                if (self.section_level == 0):
+                        self.body.append (self.begin_frametag())
+                LaTeXTranslator.visit_section (self, node)
+
+        def depart_section (self, node):
+                # Remove counter for potential subsections:
+                LaTeXTranslator.depart_section (self, node)
+                if (self.section_level == 0):
+                        self.body.append (self.end_frametag())
+
+        def visit_title (self, node):
+                if (self.section_level == 1):
+                        self.body.append ('\\frametitle{%s}\n\n' % self.encode(node.astext()))
+                        raise nodes.SkipNode
+                else:
+                        LaTeXTranslator.visit_title (self, node)
+
+        def depart_title (self, node):
+                if (self.section_level != 1):
+                        LaTeXTranslator.depart_title (self, node)
+
+        def visit_literal_block(self, node):
+                 if not self.active_table.is_open():
+                          self.body.append('\n\n\\smallskip\n\\begin{rtbliteral}\n')
+                          self.context.append('\\end{rtbliteral}\n\\smallskip\n\n')
+                 else:
+                          self.body.append('\n')
+                          self.context.append('\n')
+                 if (self.settings.use_verbatim_when_possible and (len(node) == 1)
+                                 # in case of a parsed-literal containing just a "**bold**" word:
+                                 and isinstance(node[0], nodes.Text)):
+                          self.verbatim = 1
+                          self.body.append('\\begin{verbatim}\n')
+                 else:
+                          self.literal_block = 1
+                          self.insert_none_breaking_blanks = 1
+
+        def depart_literal_block(self, node):
+                if self.verbatim:
+                        self.body.append('\n\\end{verbatim}\n')
+                        self.verbatim = 0
+                else:
+                        self.body.append('\n')
+                        self.insert_none_breaking_blanks = 0
+                        self.literal_block = 0
+                self.body.append(self.context.pop())
+
+
+class BeamerWriter (Latex2eWriter):
+        """
+        A docutils writer that modifies the translator and settings for beamer.
+        """
+        settings_spec = BEAMER_SPEC
+        settings_defaults = BEAMER_DEFAULTS
+
+        def __init__(self):
+                Latex2eWriter.__init__(self)
+                self.translator_class = BeamerTranslator
+
+
+if __name__ == '__main__':
+        description = (
+                "Generates Beamer-flavoured LaTeX for PDF-based presentations." + default_description)
+        publish_cmdline (writer=BeamerWriter(), description=description)
+
+
+### END ######################################################################
+
Add a comment to this file

images/649px-Bloom_filter.png

Added
New image
Add a comment to this file

images/i-has-minions.jpg

Added
New image
Add a comment to this file

images/mochi_ad_sales.jpg

Added
New image
Add a comment to this file

images/sc4_pub_ss_cassandra003_copy.jpg

Added
New image
Add a comment to this file

images/we-await-ur-instrucsions.jpg

Added
New image

includes/logo.html

+<script type="text/javascript">
+    addLoadEvent(function () {
+        appendChildNodes(document.body,
+            DIV({id: "mochikit_logo", 'class': 'draggable'}));
+    });
+</script>
+Theory:
+
+* http://queue.acm.org/detail.cfm?id=1394128
+* http://www.readwriteweb.com/archives/is_the_relational_database_doomed.php
+* http://research.microsoft.com/en-us/um/people/lamport/pubs/pubs.html#paxos-simple
+* http://en.wikipedia.org/wiki/Lamport_timestamps
+* http://en.wikipedia.org/wiki/Vector_clocks
+* http://ieeexplore.ieee.org/xpl/freeabs_all.jsp?arnumber=755678
+
+Caching:
+
+* http://www.danga.com/memcached/
+* Invalidation is hard
+
+Bloom filters:
+
+* http://en.wikipedia.org/wiki/Bloom_filter
+* http://www.youtube.com/watch?v=947gWqwkhu0
+* http://github.com/jaybaird/python-sbf/tree/master
+* http://www.eecs.harvard.edu/~kirsch/pubs/bbbf/esa06.pdf
+* Bloom Filter, Scalable Bloom Filter, Counting Bloom Filter
+
+Cassandra:
+
+* http://code.google.com/p/the-cassandra-project/
+* http://www.slideshare.net/jhammerb/data-presentations-cassandra-sigmod
+* http://perspectives.mvdirona.com/2009/02/07/FacebookCassandraArchitectureAndDesign.aspx
+
+Column Databases:
+
+* http://hypertable.org/
+* http://db.csail.mit.edu/projects/cstore/
+* http://monetdb.cwi.nl/
+* http://code.google.com/appengine/docs/python/datastore/
+
+Bitmap Indexes:
+
+* https://codeforge.lbl.gov/projects/fastbit/
+
+Key-value stores:
+
+* http://blog.plathome.com/2009/02/first-key-value-storage-meeting-held.html
+* http://www.oracle.com/technology/products/berkeley-db/index.html
+* http://tokyocabinet.sourceforge.net/
+* http://code.google.com/p/redis/
+
+Distributed Key-Value stores:
+
+* http://opensource.plurk.com/LightCloud/
+* http://www.metabrew.com/article/anti-rdbms-a-list-of-distributed-key-value-stores/
+* http://delicious.com/RichardJones
+* http://en.wikipedia.org/wiki/Vector_clocks
+* http://en.wikipedia.org/wiki/Lamport_timestamps
+
+Distributed Databases
+
+* http://www.allthingsdistributed.com/2007/10/amazons_dynamo.html
+* http://labs.google.com/papers/bigtable.html
+* http://wiki.apache.org/hadoop/Hbase
+* http://www.hypertable.org/
+
+
+Document Databases:
+
+* http://www.mongodb.org/
+* http://couchdb.apache.org/
+* http://code.google.com/p/thrudb/
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<meta name="generator" content="Docutils 0.5: http://docutils.sourceforge.net/" />
+<meta name="version" content="S5 1.1" />
+<title>Drop ACID and think about data</title>
+<meta name="author" content="Bob Ippolito" />
+<meta name="date" content="March 2009" />
+<style type="text/css">
+
+/*
+:Author: David Goodger (goodger@python.org)
+:Id: $Id: html4css1.css 5196 2007-06-03 20:25:28Z wiemann $
+:Copyright: This stylesheet has been placed in the public domain.
+
+Default cascading style sheet for the HTML output of Docutils.
+
+See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
+customize this style sheet.
+*/
+
+/* used to remove borders from tables and images */
+.borderless, table.borderless td, table.borderless th {
+  border: 0 }
+
+table.borderless td, table.borderless th {
+  /* Override padding for "table.docutils td" with "! important".
+     The right padding separates the table cells. */
+  padding: 0 0.5em 0 0 ! important }
+
+.first {
+  /* Override more specific margin styles with "! important". */
+  margin-top: 0 ! important }
+
+.last, .with-subtitle {
+  margin-bottom: 0 ! important }
+
+.hidden {
+  display: none }
+
+a.toc-backref {
+  text-decoration: none ;
+  color: black }
+
+blockquote.epigraph {
+  margin: 2em 5em ; }
+
+dl.docutils dd {
+  margin-bottom: 0.5em }
+
+/* Uncomment (and remove this text!) to get bold-faced definition list terms
+dl.docutils dt {
+  font-weight: bold }
+*/
+
+div.abstract {
+  margin: 2em 5em }
+
+div.abstract p.topic-title {
+  font-weight: bold ;
+  text-align: center }
+
+div.admonition, div.attention, div.caution, div.danger, div.error,
+div.hint, div.important, div.note, div.tip, div.warning {
+  margin: 2em ;
+  border: medium outset ;
+  padding: 1em }
+
+div.admonition p.admonition-title, div.hint p.admonition-title,
+div.important p.admonition-title, div.note p.admonition-title,
+div.tip p.admonition-title {
+  font-weight: bold ;
+  font-family: sans-serif }
+
+div.attention p.admonition-title, div.caution p.admonition-title,
+div.danger p.admonition-title, div.error p.admonition-title,
+div.warning p.admonition-title {
+  color: red ;
+  font-weight: bold ;
+  font-family: sans-serif }
+
+/* Uncomment (and remove this text!) to get reduced vertical space in
+   compound paragraphs.
+div.compound .compound-first, div.compound .compound-middle {
+  margin-bottom: 0.5em }
+
+div.compound .compound-last, div.compound .compound-middle {
+  margin-top: 0.5em }
+*/
+
+div.dedication {
+  margin: 2em 5em ;
+  text-align: center ;
+  font-style: italic }
+
+div.dedication p.topic-title {
+  font-weight: bold ;
+  font-style: normal }
+
+div.figure {
+  margin-left: 2em ;
+  margin-right: 2em }
+
+div.footer, div.header {
+  clear: both;
+  font-size: smaller }
+
+div.line-block {
+  display: block ;
+  margin-top: 1em ;
+  margin-bottom: 1em }
+
+div.line-block div.line-block {
+  margin-top: 0 ;
+  margin-bottom: 0 ;
+  margin-left: 1.5em }
+
+div.sidebar {
+  margin: 0 0 0.5em 1em ;
+  border: medium outset ;
+  padding: 1em ;
+  background-color: #ffffee ;
+  width: 40% ;
+  float: right ;
+  clear: right }
+
+div.sidebar p.rubric {
+  font-family: sans-serif ;
+  font-size: medium }
+
+div.system-messages {
+  margin: 5em }
+
+div.system-messages h1 {
+  color: red }
+
+div.system-message {
+  border: medium outset ;
+  padding: 1em }
+
+div.system-message p.system-message-title {
+  color: red ;
+  font-weight: bold }
+
+div.topic {
+  margin: 2em }
+
+h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
+h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
+  margin-top: 0.4em }
+
+h1.title {
+  text-align: center }
+
+h2.subtitle {
+  text-align: center }
+
+hr.docutils {
+  width: 75% }
+
+img.align-left {
+  clear: left }
+
+img.align-right {
+  clear: right }
+
+ol.simple, ul.simple {
+  margin-bottom: 1em }
+
+ol.arabic {
+  list-style: decimal }
+
+ol.loweralpha {
+  list-style: lower-alpha }
+
+ol.upperalpha {
+  list-style: upper-alpha }
+
+ol.lowerroman {
+  list-style: lower-roman }
+
+ol.upperroman {
+  list-style: upper-roman }
+
+p.attribution {
+  text-align: right ;
+  margin-left: 50% }
+
+p.caption {
+  font-style: italic }
+
+p.credits {
+  font-style: italic ;
+  font-size: smaller }
+
+p.label {
+  white-space: nowrap }
+
+p.rubric {
+  font-weight: bold ;
+  font-size: larger ;
+  color: maroon ;
+  text-align: center }
+
+p.sidebar-title {
+  font-family: sans-serif ;
+  font-weight: bold ;
+  font-size: larger }
+
+p.sidebar-subtitle {
+  font-family: sans-serif ;
+  font-weight: bold }
+
+p.topic-title {
+  font-weight: bold }
+
+pre.address {
+  margin-bottom: 0 ;
+  margin-top: 0 ;
+  font-family: serif ;
+  font-size: 100% }
+
+pre.literal-block, pre.doctest-block {
+  margin-left: 2em ;
+  margin-right: 2em }
+
+span.classifier {
+  font-family: sans-serif ;
+  font-style: oblique }
+
+span.classifier-delimiter {
+  font-family: sans-serif ;
+  font-weight: bold }
+
+span.interpreted {
+  font-family: sans-serif }
+
+span.option {
+  white-space: nowrap }
+
+span.pre {
+  white-space: pre }
+
+span.problematic {
+  color: red }
+
+span.section-subtitle {
+  /* font-size relative to parent (h1..h6 element) */
+  font-size: 80% }
+
+table.citation {
+  border-left: solid 1px gray;
+  margin-left: 1px }
+
+table.docinfo {
+  margin: 2em 4em }
+
+table.docutils {
+  margin-top: 0.5em ;
+  margin-bottom: 0.5em }
+
+table.footnote {
+  border-left: solid 1px black;
+  margin-left: 1px }
+
+table.docutils td, table.docutils th,
+table.docinfo td, table.docinfo th {
+  padding-left: 0.5em ;
+  padding-right: 0.5em ;
+  vertical-align: top }
+
+table.docutils th.field-name, table.docinfo th.docinfo-name {
+  font-weight: bold ;
+  text-align: left ;
+  white-space: nowrap ;
+  padding-left: 0 }
+
+h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
+h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
+  font-size: 100% }
+
+ul.auto-toc {
+  list-style-type: none }
+
+</style>
+<!-- configuration parameters -->
+<meta name="defaultView" content="slideshow" />
+<meta name="controlVis" content="hidden" />
+<!-- style sheet links -->
+<script src="ui/mochikit/slides.js" type="text/javascript"></script>
+<link rel="stylesheet" href="ui/mochikit/slides.css"
+      type="text/css" media="projection" id="slideProj" />
+<link rel="stylesheet" href="ui/mochikit/outline.css"
+      type="text/css" media="screen" id="outlineStyle" />
+<link rel="stylesheet" href="ui/mochikit/print.css"
+      type="text/css" media="print" id="slidePrint" />
+<link rel="stylesheet" href="ui/mochikit/opera.css"
+      type="text/css" media="projection" id="operaFix" />
+
+<style type="text/css">
+#currentSlide {display: none;}
+</style>
+</head>
+<body>
+<div class="layout">
+<div id="controls"></div>
+<div id="currentSlide"></div>
+<div id="header">
+
+</div>
+<div id="footer">
+<h1>Drop ACID and think about data</h1>
+
+</div>
+</div>
+<div class="presentation">
+<div class="slide" id="slide0">
+<h1 class="title">Drop ACID and think about data</h1>
+<table class="docinfo" frame="void" rules="none">
+<col class="docinfo-name" />
+<col class="docinfo-content" />
+<tbody valign="top">
+<tr><th class="docinfo-name">Author:</th>
+<td>Bob Ippolito</td></tr>
+<tr><th class="docinfo-name">Date:</th>
+<td>March 2009</td></tr>
+<tr class="field"><th class="docinfo-name">Venue:</th><td class="field-body">PyCon 2009</td>
+</tr>
+</tbody>
+</table>
+<!-- Definitions of interpreted text roles (classes) for S5/HTML data. -->
+<!-- This data file has been placed in the public domain. -->
+<!-- Colours
+======= -->
+<!-- Text Sizes
+========== -->
+<!-- Display in Slides (Presentation Mode) Only
+========================================== -->
+<!-- Display in Outline Mode Only
+============================ -->
+<!-- Display in Print Only
+===================== -->
+<!-- Display in Handout Mode Only
+============================ -->
+<!-- Incremental Display
+=================== -->
+<!-- colors -->
+<!-- =========================== -->
+<!-- general useful commands -->
+<!-- =========================== -->
+<!-- closed bracket -->
+<!-- =========================== -->
+<!-- example block -->
+<!-- =========================== -->
+<!-- alert block -->
+<!-- =========================== -->
+<!-- columns -->
+<!-- =========================== -->
+<script type="text/javascript">
+    addLoadEvent(function () {
+        appendChildNodes(document.body,
+            DIV({id: "mochikit_logo", 'class': 'draggable'}));
+    });
+</script>
+
+</div>
+<div class="slide" id="bob-s-perspective">
+<h1>Bob's Perspective</h1>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field"><th class="field-name" colspan="2">Startup with lots of data:</th></tr>
+<tr><td>&nbsp;</td><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<ul class="simple">
+<li>Cofounded Mochi Media in 2005</li>
+<li>MochiBot analytics platform (for Flash)</li>
+<li>MochiAds ad serving platform (for Flash games)</li>
+<li>Other cool services for game developers</li>
+</ul>
+</div>
+<div class="slide" id="mochi-ad-sales">
+<h1>Mochi Ad Sales</h1>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field"><th class="field-name">Hard Sell:</th><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<img alt="images/mochi_ad_sales.jpg" src="images/mochi_ad_sales.jpg" />
+</div>
+<div class="slide" id="what-s-acid">
+<h1>What's ACID?</h1>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field"><th class="field-name" colspan="2">A promise ring your DBMS wears:</th></tr>
+<tr><td>&nbsp;</td><td class="field-body"></td>
+</tr>
+<tr class="field"><th class="field-name">Atomicity:</th><td class="field-body">all or nothing</td>
+</tr>
+<tr class="field"><th class="field-name">Consistency:</th><td class="field-body">no explosions</td>
+</tr>
+<tr class="field"><th class="field-name">Isolation:</th><td class="field-body">no fights</td>
+</tr>
+<tr class="field"><th class="field-name">Durability:</th><td class="field-body">no lying</td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="slide" id="acid-trips">
+<h1>ACID Trips</h1>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field"><th class="field-name" colspan="2">Scalability and reliability:</th></tr>
+<tr><td>&nbsp;</td><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<ul class="simple">
+<li>Downtime is unacceptable</li>
+<li>Reliable is &gt;= 2 nodes</li>
+<li>Scalable is ... more</li>
+<li>Networks make it hard</li>
+<li>Networks make it hard</li>
+<li>Networks make it hard</li>
+</ul>
+</div>
+<div class="slide" id="what-can-i-have">
+<h1>What can I have?</h1>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field"><th class="field-name" colspan="2">CAP theorem says pick two:</th></tr>
+<tr><td>&nbsp;</td><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<ul class="simple">
+<li>Consistency</li>
+<li>Availability</li>
+<li>Partition tolerance</li>
+</ul>
+</div>
+<div class="slide" id="turn-up-the-base">
+<h1>Turn up the BASE</h1>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field"><th class="field-name" colspan="2">Write smarter applications:</th></tr>
+<tr><td>&nbsp;</td><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<ul class="simple">
+<li>Basically Available</li>
+<li>Soft state</li>
+<li>Eventually consistent</li>
+</ul>
+</div>
+<div class="slide" id="base-jumping">
+<h1>BASE jumping</h1>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field"><th class="field-name" colspan="2">Everyone else is doing it:</th></tr>
+<tr><td>&nbsp;</td><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<ul class="simple">
+<li>Google</li>
+<li>Amazon</li>
+<li>eBay</li>
+<li>Yahoo!</li>
+<li>Facebook</li>
+<li>...</li>
+</ul>
+</div>
+<div class="slide" id="bigtable">
+<h1>BigTable</h1>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field"><th class="field-name">Google:</th><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<ul class="simple">
+<li>Paxos (Chubby)</li>
+<li>Single-master</li>
+<li>Distributed tablets via GFS</li>
+<li>Row/Column db hybrid</li>
+<li>Compression (BMDiff, Zippy)</li>
+<li>Versioned (Row, Column, Timestamp)</li>
+<li>Bloom filters</li>
+</ul>
+</div>
+<div class="slide" id="bigtable-pros">
+<h1>BigTable Pros</h1>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field"><th class="field-name">Pros:</th><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<ul class="simple">
+<li>Compression = Awesome</li>
+<li>Clients are probably simple</li>
+<li>Integrates with map/reduce</li>
+</ul>
+</div>
+<div class="slide" id="bigtable-cons">
+<h1>BigTable Cons</h1>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field"><th class="field-name">Cons:</th><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<ul class="simple">
+<li>Proprietary to Google</li>
+<li>Single-master</li>
+</ul>
+</div>
+<div class="slide" id="bigtable-diagram">
+<h1>BigTable Diagram</h1>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field"><th class="field-name">Single-master:</th><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<img alt="images/i-has-minions.jpg" src="images/i-has-minions.jpg" />
+</div>
+<div class="slide" id="dynamo">
+<h1>Dynamo</h1>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field"><th class="field-name">Amazon:</th><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<ul class="simple">
+<li>Key/Value store</li>
+<li>Consistent hashing</li>
+<li>Vector clocks</li>
+<li>Read repair</li>
+</ul>
+</div>
+<div class="slide" id="dynamo-pros">
+<h1>Dynamo Pros</h1>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field"><th class="field-name">Pros:</th><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<ul class="simple">
+<li>No master</li>
+<li>Highly available for write</li>
+<li>Knobs to make it fast to read</li>
+<li>&quot;Simple&quot; (lots of half-baked clones!)</li>
+</ul>
+</div>
+<div class="slide" id="dynamo-cons">
+<h1>Dynamo Cons</h1>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field"><th class="field-name">Cons:</th><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<ul class="simple">
+<li>Proprietary to Amazon</li>
+<li>Clients need to be smart</li>
+<li>No compression</li>
+<li>Not suitable for column-like workloads</li>
+<li>Just a Key/Value store</li>
+</ul>
+</div>
+<div class="slide" id="dynamo-diagram">
+<h1>Dynamo Diagram</h1>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field"><th class="field-name">Smart client:</th><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<img alt="images/we-await-ur-instrucsions.jpg" src="images/we-await-ur-instrucsions.jpg" />
+</div>
+<div class="slide" id="cassandra">
+<h1>Cassandra</h1>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field"><th class="field-name" colspan="2">Facebook -&gt; Apache:</th></tr>
+<tr><td>&nbsp;</td><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<ul class="simple">
+<li>Open source!</li>
+<li>No master like Dynamo</li>
+<li>Storage model more like BigTable</li>
+</ul>
+</div>
+<div class="slide" id="cassandra-pros">
+<h1>Cassandra Pros</h1>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field"><th class="field-name">Pros:</th><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<ul class="simple">
+<li>OPEN SOURCE</li>
+<li>Incrementally scalable</li>
+<li>Minimal administration</li>
+</ul>
+</div>
+<div class="slide" id="cassandra-cons">
+<h1>Cassandra Cons</h1>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field"><th class="field-name">Cons:</th><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<ul class="simple">
+<li>Not polished</li>
+<li>No compression yet</li>
+</ul>
+</div>
+<div class="slide" id="cassandra-diagram">
+<h1>Cassandra Diagram</h1>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field"><th class="field-name">Soul Calibur:</th><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<img alt="images/sc4_pub_ss_cassandra003_copy.jpg" src="images/sc4_pub_ss_cassandra003_copy.jpg" />
+</div>
+<div class="slide" id="distributed-musings">
+<h1>Distributed Musings</h1>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field"><th class="field-name">New Hotness:</th><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<ul class="simple">
+<li>Distributed databases are the new web framework</li>
+<li>... except none of them are awesome yet</li>
+<li>I don't think we need another half-baked Dynamo clone</li>
+</ul>
+</div>
+<div class="slide" id="key-value-stores">
+<h1>Key-Value Stores</h1>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field"><th class="field-name" colspan="2">Simple and Fast:</th></tr>
+<tr><td>&nbsp;</td><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<ul class="simple">
+<li>Similar to a Python dict</li>
+<li>Keys usually bytes, probably limited</li>
+<li>Values usually bytes, often have fewer limits</li>
+<li>Extremely fast, simple</li>
+</ul>
+</div>
+<div class="slide" id="memcached">
+<h1>Memcached</h1>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field"><th class="field-name" colspan="2">Key/Value store as cache:</th></tr>
+<tr><td>&nbsp;</td><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<ul class="simple">
+<li>No persistence</li>
+<li>RAM only</li>
+<li>Throws data away (on purpose)</li>
+<li>Lightning fast</li>
+<li>&quot;Everyone&quot; uses it</li>
+</ul>
+</div>
+<div class="slide" id="caching-immutable-data">
+<h1>Caching Immutable Data</h1>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field"><th class="field-name" colspan="2">If only data never changed:</th></tr>
+<tr><td>&nbsp;</td><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<ul class="simple">
+<li>Immutable is easy, do that</li>
+</ul>
+</div>
+<div class="slide" id="caching-mutable-data">
+<h1>Caching Mutable Data</h1>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field"><th class="field-name" colspan="2">Invalidation sucks:</th></tr>
+<tr><td>&nbsp;</td><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<ul class="simple">
+<li>Mutable is hard</li>
+<li>Failed transactions?</li>
+<li>Concurrent writers?</li>
+<li>Dependent cache keys?</li>
+<li>You will get it wrong and it will be hard to debug</li>
+</ul>
+</div>
+<div class="slide" id="tokyo-cabinet-tyrant">
+<h1>Tokyo Cabinet/Tyrant</h1>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field"><th class="field-name" colspan="2">Not your mom's BerkeleyDB:</th></tr>
+<tr><td>&nbsp;</td><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<ul class="simple">
+<li>Disk persistent</li>
+<li>Very performant</li>
+<li>Actively developed</li>
+<li>Similar replication strategy to MySQL</li>
+</ul>
+</div>
+<div class="slide" id="redis">
+<h1>Redis</h1>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field"><th class="field-name">Still very new:</th><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<ul class="simple">
+<li>Not just a Key/Value store</li>
+<li>Matching on key spaces</li>
+<li>Values can be bytes, lists or sets</li>
+<li>Requires full store in RAM</li>
+<li>Might be a nice cache server?</li>
+</ul>
+</div>
+<div class="slide" id="document-databases">
+<h1>Document Databases</h1>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field"><th class="field-name">Schema-free:</th><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<ul class="simple">
+<li>Very easy to use</li>
+<li>Document Versioning</li>
+<li>Great for storing documents</li>
+</ul>
+</div>
+<div class="slide" id="couchdb">
+<h1>CouchDB</h1>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field"><th class="field-name" colspan="2">Document DB Poster Child:</th></tr>
+<tr><td>&nbsp;</td><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<ul class="simple">
+<li>Apache project</li>
+<li>Asynchronous replication</li>
+<li>JSON based</li>
+<li>Views materialized on demand (not indexes)</li>
+<li>Neat admin UI</li>
+</ul>
+</div>
+<div class="slide" id="mongodb">
+<h1>MongoDB</h1>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field"><th class="field-name">C++'s revenge:</th><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<ul class="simple">
+<li>Fast</li>
+<li>JSON and BSON (binary JSON-ish)</li>
+<li>Asynchronous replication with auto-sharding &quot;soon&quot;</li>
+<li>Index support</li>
+<li>Nested documents</li>
+<li>Advanced queries</li>
+</ul>
+</div>
+<div class="slide" id="column-databases">
+<h1>Column Databases</h1>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field"><th class="field-name" colspan="2">Data Warehousing:</th></tr>
+<tr><td>&nbsp;</td><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<ul class="simple">
+<li>Sequential reads are awesome</li>
+<li>Columns compress better than rows</li>
+<li>Doesn't waste I/O on uninteresting columns</li>
+</ul>
+</div>
+<div class="slide" id="monetdb">
+<h1>MonetDB</h1>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field"><th class="field-name" colspan="2">Research project:</th></tr>
+<tr><td>&nbsp;</td><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<ul class="simple">
+<li>Tried really hard to get it to work</li>
+<li>Crashes a lot and corrupts your data</li>
+<li>Do not waste your time</li>
+</ul>
+</div>
+<div class="slide" id="luciddb">
+<h1>LucidDB</h1>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field"><th class="field-name" colspan="2">Sounds interesting:</th></tr>
+<tr><td>&nbsp;</td><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<ul class="simple">
+<li>Java/C++ open source data warehouse</li>
+<li>No clustering</li>
+<li>No experience yet</li>
+</ul>
+</div>
+<div class="slide" id="vertica">
+<h1>Vertica</h1>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field"><th class="field-name">We paid for it:</th><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<ul class="simple">
+<li>Commercial (based on C-Store)</li>
+<li>Clustered</li>
+<li>Would still prefer open source</li>
+</ul>
+</div>
+<div class="slide" id="bitmap-indexes">
+<h1>Bitmap Indexes</h1>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field"><th class="field-name" colspan="2">Sequential Scans can be fast:</th></tr>
+<tr><td>&nbsp;</td><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<ul class="simple">
+<li>1-N bits per row of data</li>
+<li>Can apply logical operations across indexes</li>
+<li>Can be compressed (BBC, WAH)</li>
+<li>FastBit is a good implementation</li>
+</ul>
+</div>
+<div class="slide" id="bitmap-index-uses">
+<h1>Bitmap Index Uses</h1>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field"><th class="field-name">Big Queries:</th><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<ul class="simple">
+<li>PostgreSQL 8.1+ in-memory for some queries</li>
+<li>Almost a requirement for column stores</li>
+<li>FastBit is a great implementation (WAH)</li>
+</ul>
+</div>
+<div class="slide" id="bloom-filters-are-neat">
+<h1>Bloom Filters are Neat</h1>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field"><th class="field-name" colspan="2">But our Princess is in another castle:</th></tr>
+<tr><td>&nbsp;</td><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<ul class="simple">
+<li>Probabilistic data structure</li>
+<li>False positives at a known error</li>
+<li>Constant space</li>
+<li>I won't bore you with the math</li>
+</ul>
+</div>
+<div class="slide" id="bloom-filter-diagram">
+<h1>Bloom Filter Diagram</h1>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field"><th class="field-name" colspan="2">Actually Relevant:</th></tr>
+<tr><td>&nbsp;</td><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<img alt="images/649px-Bloom_filter.png" src="images/649px-Bloom_filter.png" />
+</div>
+<div class="slide" id="bloom-filter-uses">
+<h1>Bloom Filter Uses</h1>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field"><th class="field-name" colspan="2">Find stuff, maybe:</th></tr>
+<tr><td>&nbsp;</td><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<ul class="simple">
+<li>Approximate counting of a large set (e.g. unique IPs from logs)</li>
+<li>Knowing that data is definitely NOT stored somewhere, e.g. remote cache</li>
+<li>Several variants (Counting Bloom Filter, Scalable Bloom Filter, ...)</li>
+</ul>
+</div>
+<div class="slide" id="questions">
+<h1>Questions?</h1>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field"><th class="field-name">Open Space:</th><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+<ul class="simple">
+<li>Open Space TODAY &#64; 5pm, Lambert. See Jonathan Ellis</li>
+</ul>
+</div>
+</div>
+</body>
+</html>

Binary file added.

+.. include:: <s5defs.txt>
+.. include:: ui/beamerdefs.txt
+
+.. raw:: html
+    :file: includes/logo.html
+
+================================
+ Drop ACID and think about data
+================================
+
+:Author:
+    Bob Ippolito
+:Date:
+    March 2009
+:Venue:
+    PyCon 2009
+
+Bob's Perspective
+=================
+
+:Startup with lots of data:
+
+* Cofounded Mochi Media in 2005
+* MochiBot analytics platform (for Flash)
+* MochiAds ad serving platform (for Flash games)
+* Other cool services for game developers
+
+Mochi Ad Sales
+==============
+
+:Hard Sell:
+
+.. image:: images/mochi_ad_sales.jpg
+
+What's ACID?
+============
+
+:A promise ring your DBMS wears:
+
+:Atomicity:
+    all or nothing
+:Consistency:
+    no explosions
+:Isolation:
+    no fights
+:Durability:
+    no lying
+
+ACID Trips
+==========
+
+:Scalability and reliability:
+
+* Downtime is unacceptable
+* Reliable is >= 2 nodes
+* Scalable is ... more
+* Networks make it hard
+* Networks make it hard
+* Networks make it hard
+
+What can I have?
+================
+
+:CAP theorem says pick two:
+
+* Consistency
+* Availability
+* Partition tolerance
+
+Turn up the BASE
+================
+
+:Write smarter applications:
+
+* Basically Available
+* Soft state
+* Eventually consistent
+
+BASE jumping
+============
+
+:Everyone else is doing it:
+
+* Google
+* Amazon
+* eBay
+* Yahoo!
+* Facebook
+* ...
+
+BigTable
+========
+
+:Google:
+
+* Paxos (Chubby)
+* Single-master
+* Distributed tablets via GFS
+* Row/Column db hybrid
+* Compression (BMDiff, Zippy)
+* Versioned (Row, Column, Timestamp)
+* Bloom filters
+
+BigTable Pros
+=============
+
+:Pros:
+
+* Compression = Awesome
+* Clients are probably simple
+* Integrates with map/reduce
+
+BigTable Cons
+=============
+
+:Cons:
+
+* Proprietary to Google
+* Single-master
+
+BigTable Diagram
+================
+
+:Single-master:
+
+.. image:: images/i-has-minions.jpg
+
+Dynamo
+======
+
+:Amazon:
+
+* Key/Value store
+* Consistent hashing
+* Vector clocks
+* Read repair
+
+Dynamo Pros
+===========
+
+:Pros:
+
+* No master
+* Highly available for write
+* Knobs to make it fast to read
+* "Simple" (lots of half-baked clones!)
+
+Dynamo Cons
+===========
+
+:Cons:
+
+* Proprietary to Amazon
+* Clients need to be smart
+* No compression
+* Not suitable for column-like workloads
+* Just a Key/Value store
+
+Dynamo Diagram
+==============
+
+:Smart client:
+
+.. image:: images/we-await-ur-instrucsions.jpg
+
+Cassandra
+=========
+
+:Facebook -> Apache:
+
+* Open source!
+* No master like Dynamo
+* Storage model more like BigTable
+
+Cassandra Pros
+==============
+
+:Pros:
+
+* OPEN SOURCE
+* Incrementally scalable
+* Minimal administration
+
+Cassandra Cons
+==============
+
+:Cons:
+
+* Not polished
+* No compression yet
+
+Cassandra Diagram
+=================
+
+:Soul Calibur:
+
+.. image:: images/sc4_pub_ss_cassandra003_copy.jpg
+
+Distributed Musings
+===================
+
+:New Hotness:
+
+* Distributed databases are the new web framework
+* ... except none of them are awesome yet
+* I don't think we need another half-baked Dynamo clone
+
+Key-Value Stores
+================
+
+:Simple and Fast:
+
+* Similar to a Python dict
+* Keys usually bytes, probably limited
+* Values usually bytes, often have fewer limits
+* Extremely fast, simple
+
+Memcached
+=========
+
+:Key/Value store as cache:
+
+* No persistence
+* RAM only
+* Throws data away (on purpose)
+* Lightning fast
+* "Everyone" uses it
+
+Caching Immutable Data
+======================
+
+:If only data never changed:
+
+* Immutable is easy, do that
+
+Caching Mutable Data
+====================
+
+:Invalidation sucks:
+
+* Mutable is hard
+* Failed transactions?
+* Concurrent writers?
+* Dependent cache keys?
+* You will get it wrong and it will be hard to debug
+
+Tokyo Cabinet/Tyrant
+====================
+
+:Not your mom's BerkeleyDB:
+
+* Disk persistent
+* Very performant
+* Actively developed
+* Similar replication strategy to MySQL
+
+Redis
+=====
+
+:Still very new:
+
+* Not just a Key/Value store
+* Matching on key spaces
+* Values can be bytes, lists or sets
+* Requires full store in RAM
+* Might be a nice cache server?
+
+Document Databases
+==================
+
+:Schema-free:
+
+* Very easy to use
+* Document Versioning
+* Great for storing documents
+
+CouchDB
+=======
+
+:Document DB Poster Child:
+
+* Apache project
+* Asynchronous replication
+* JSON based
+* Views materialized on demand (not indexes)
+* Neat admin UI
+
+MongoDB
+=======
+
+:C++'s revenge:
+
+* Fast
+* JSON and BSON (binary JSON-ish)
+* Asynchronous replication with auto-sharding "soon"
+* Index support
+* Nested documents
+* Advanced queries
+
+Column Databases
+================
+
+:Data Warehousing:
+
+* Sequential reads are awesome
+* Columns compress better than rows
+* Doesn't waste I/O on uninteresting columns
+
+MonetDB
+=======
+
+:Research project:
+
+* Tried really hard to get it to work
+* Crashes a lot and corrupts your data
+* Do not waste your time
+
+LucidDB
+=======
+
+:Sounds interesting:
+
+* Java/C++ open source data warehouse
+* No clustering
+* No experience yet
+
+Vertica
+=======
+
+:We paid for it:
+
+* Commercial (based on C-Store)
+* Clustered
+* Would still prefer open source
+
+Bitmap Indexes
+==============
+
+:Sequential Scans can be fast:
+
+* 1-N bits per row of data
+* Can apply logical operations across indexes
+* Can be compressed (BBC, WAH)
+* FastBit is a good implementation
+
+Bitmap Index Uses
+=================
+
+:Big Queries:
+
+* PostgreSQL 8.1+ in-memory for some queries
+* Almost a requirement for column stores
+* FastBit is a great implementation (WAH)
+
+Bloom Filters are Neat
+======================
+
+:But our Princess is in another castle:
+
+* Probabilistic data structure
+* False positives at a known error
+* Constant space
+* I won't bore you with the math
+
+Bloom Filter Diagram
+====================
+
+:Actually Relevant:
+
+.. image:: images/649px-Bloom_filter.png 
+
+Bloom Filter Uses
+=================
+
+:Find stuff, maybe:
+
+* Approximate counting of a large set (e.g. unique IPs from logs)
+* Knowing that data is definitely NOT stored somewhere, e.g. remote cache
+* Several variants (Counting Bloom Filter, Scalable Bloom Filter, ...)
+
+Questions?
+==========
+
+:Open Space:
+
+* Open Space TODAY @ 5pm, Lambert. See Jonathan Ellis
+\definecolor{rrblitbackground}{rgb}{0.0, 0.0, 0.0}
+
+\title[Drop ACID and think about data]{Drop ACID and think about data}
+\author[Bob Ippolito]{Bob Ippolito\\Mochi Media, Inc.}
+\institute[PyCon 2009]{PyCon 2009 - Chicago (actually Rosemont)}
+\date{March 28, 2009}

ui/beamerdefs.txt

+.. colors
+.. ===========================
+
+.. role:: green
+.. role:: red
+
+
+.. general useful commands
+.. ===========================
+
+.. |pause| raw:: latex
+
+   \pause
+
+.. |small| raw:: latex
+
+   {\small
+
+.. |end_small| raw:: latex
+
+   }
+
+
+.. closed bracket
+.. ===========================
+
+.. |>| raw:: latex
+
+   }
+
+
+.. example block
+.. ===========================
+
+.. |example<| raw:: latex
+
+   \begin{exampleblock}{
+
+
+.. |end_example| raw:: latex
+
+   \end{exampleblock}
+
+
+
+.. alert block
+.. ===========================
+
+.. |alert<| raw:: latex
+
+   \begin{alertblock}{
+
+
+.. |end_alert| raw:: latex
+
+   \end{alertblock}
+
+
+
+.. columns
+.. ===========================
+
+.. |column1| raw:: latex
+
+   \begin{columns}
+      \begin{column}{0.45\textwidth}
+
+.. |column2| raw:: latex
+
+      \end{column}
+      \begin{column}{0.45\textwidth}
+
+
+.. |end_columns| raw:: latex
+
+      \end{column}
+   \end{columns}

ui/mochikit/MochiKit/MochiKit.js

+/***
+
+    MochiKit.MochiKit 1.4 : PACKED VERSION
+
+    THIS FILE IS AUTOMATICALLY GENERATED.  If creating patches, please
+    diff against the source tree, not this file.
+
+    See <http://mochikit.com/> for documentation, downloads, license, etc.
+
+    (c) 2005 Bob Ippolito.  All rights Reserved.
+
+***/
+
+if(typeof (dojo)!="undefined"){
+dojo.provide("MochiKit.Base");
+}
+if(typeof (MochiKit)=="undefined"){
+MochiKit={};
+}
+if(typeof (MochiKit.Base)=="undefined"){
+MochiKit.Base={};
+}
+if(typeof (MochiKit.__export__)=="undefined"){
+MochiKit.__export__=(MochiKit.__compat__||(typeof (JSAN)=="undefined"&&typeof (dojo)=="undefined"));
+}
+MochiKit.Base.VERSION="1.4";
+MochiKit.Base.NAME="MochiKit.Base";
+MochiKit.Base.update=function(_1,_2){
+if(_1===null||_1===undefined){
+_1={};
+}
+for(var i=1;i<arguments.length;i++){
+var o=arguments[i];
+if(typeof (o)!="undefined"&&o!==null){
+for(var k in o){
+_1[k]=o[k];
+}
+}
+}
+return _1;
+};
+MochiKit.Base.update(MochiKit.Base,{__repr__:function(){
+return "["+this.NAME+" "+this.VERSION+"]";
+},toString:function(){
+return this.__repr__();
+},camelize:function(_6){
+var _7=_6.split("-");
+var cc=_7[0];
+for(var i=1;i<_7.length;i++){
+cc+=_7[i].charAt(0).toUpperCase()+_7[i].substring(1);
+}
+return cc;
+},counter:function(n){
+if(arguments.length===0){
+n=1;
+}
+return function(){
+return n++;
+};
+},clone:function(_b){
+var me=arguments.callee;
+if(arguments.length==1){
+me.prototype=_b;
+return new me();
+}
+},_flattenArray:function(_d,_e){
+for(var i=0;i<_e.length;i++){
+var o=_e[i];
+if(o instanceof Array){
+arguments.callee(_d,o);
+}else{
+_d.push(o);
+}
+}
+return _d;
+},flattenArray:function(lst){
+return MochiKit.Base._flattenArray([],lst);
+},flattenArguments:function(lst){
+var res=[];
+var m=MochiKit.Base;
+var _15=m.extend(null,arguments);
+while(_15.length){
+var o=_15.shift();
+if(o&&typeof (o)=="object"&&typeof (o.length)=="number"){
+for(var i=o.length-1;i>=0;i--){
+_15.unshift(o[i]);
+}
+}else{
+res.push(o);
+}
+}
+return res;
+},extend:function(_18,obj,_1a){
+if(!_1a){
+_1a=0;
+}
+if(obj){
+var l=obj.length;
+if(typeof (l)!="number"){
+if(typeof (MochiKit.Iter)!="undefined"){
+obj=MochiKit.Iter.list(obj);
+l=obj.length;
+}else{
+throw new TypeError("Argument not an array-like and MochiKit.Iter not present");
+}
+}
+if(!_18){
+_18=[];
+}
+for(var i=_1a;i<l;i++){
+_18.push(obj[i]);
+}
+}
+return _18;
+},updatetree:function(_1d,obj){
+if(_1d===null||_1d===undefined){
+_1d={};
+}
+for(var i=1;i<arguments.length;i++){
+var o=arguments[i];
+if(typeof (o)!="undefined"&&o!==null){
+for(var k in o){
+var v=o[k];
+if(typeof (_1d[k])=="object"&&typeof (v)=="object"){
+arguments.callee(_1d[k],v);
+}else{
+_1d[k]=v;
+}
+}
+}
+}
+return _1d;
+},setdefault:function(_23,obj){
+if(_23===null||_23===undefined){
+_23={};
+}
+for(var i=1;i<arguments.length;i++){
+var o=arguments[i];
+for(var k in o){
+if(!(k in _23)){
+_23[k]=o[k];
+}
+}
+}
+return _23;
+},keys:function(obj){
+var _29=[];
+for(var _2a in obj){
+_29.push(_2a);
+}
+return _29;
+},values:function(obj){
+var _2c=[];
+for(var _2d in obj){
+_2c.push(obj[_2d]);
+}
+return _2c;
+},items:function(obj){
+var _2f=[];
+var e;
+for(var _31 in obj){
+var v;
+try{
+v=obj[_31];
+}
+catch(e){
+continue;
+}
+_2f.push([_31,v]);
+}
+return _2f;
+},_newNamedError:function(_33,_34,_35){
+_35.prototype=new MochiKit.Base.NamedError(_33.NAME+"."+_34);
+_33[_34]=_35;
+},operator:{truth:function(a){
+return !!a;
+},lognot:function(a){
+return !a;
+},identity:function(a){
+return a;
+},not:function(a){
+return ~a;
+},neg:function(a){
+return -a;
+},add:function(a,b){
+return a+b;
+},sub:function(a,b){
+return a-b;
+},div:function(a,b){
+return a/b;
+},mod:function(a,b){
+return a%b;
+},mul:function(a,b){
+return a*b;
+},and:function(a,b){
+return a&b;
+},or:function(a,b){
+return a|b;
+},xor:function(a,b){
+return a^b;
+},lshift:function(a,b){
+return a<<b;
+},rshift:function(a,b){
+return a>>b;
+},zrshift:function(a,b){
+return a>>>b;
+},eq:function(a,b){
+return a==b;
+},ne:function(a,b){
+return a!=b;
+},gt:function(a,b){
+return a>b;
+},ge:function(a,b){
+return a>=b;
+},lt:function(a,b){
+return a<b;
+},le:function(a,b){
+return a<=b;
+},seq:function(a,b){
+return a===b;
+},sne:function(a,b){
+return a!==b;
+},ceq:function(a,b){
+return MochiKit.Base.compare(a,b)===0;
+},cne:function(a,b){
+return MochiKit.Base.compare(a,b)!==0;
+},cgt:function(a,b){
+return MochiKit.Base.compare(a,b)==1;
+},cge:function(a,b){
+return MochiKit.Base.compare(a,b)!=-1;
+},clt:function(a,b){
+return MochiKit.Base.compare(a,b)==-1;
+},cle:function(a,b){
+return MochiKit.Base.compare(a,b)!=1;
+},logand:function(a,b){
+return a&&b;
+},logor:function(a,b){
+return a||b;
+},contains:function(a,b){
+return b in a;
+}},forwardCall:function(_73){
+return function(){
+return this[_73].apply(this,arguments);
+};
+},itemgetter:function(_74){
+return function(arg){
+return arg[_74];
+};
+},typeMatcher:function(){
+var _76={};
+for(var i=0;i<arguments.length;i++){
+var typ=arguments[i];
+_76[typ]=typ;
+}
+return function(){
+for(var i=0;i<arguments.length;i++){
+if(!(typeof (arguments[i]) in _76)){
+return false;
+}
+}
+return true;
+};
+},isNull:function(){
+for(var i=0;i<arguments.length;i++){
+if(arguments[i]!==null){
+return false;
+}
+}
+return true;
+},isUndefinedOrNull:function(){
+for(var i=0;i<arguments.length;i++){
+var o=arguments[i];
+if(!(typeof (o)=="undefined"||o===null)){
+return false;
+}
+}
+return true;
+},isEmpty:function(obj){
+return !MochiKit.Base.isNotEmpty.apply(this,arguments);
+},isNotEmpty:function(obj){
+for(var i=0;i<arguments.length;i++){
+var o=arguments[i];
+if(!(o&&o.length)){
+return false;
+}
+}
+return true;
+},isArrayLike:function(){
+for(var i=0;i<arguments.length;i++){
+var o=arguments[i];
+var typ=typeof (o);
+if((typ!="object"&&!(typ=="function"&&typeof (o.item)=="function"))||o===null||typeof (o.length)!="number"||o.nodeType===3){
+return false;
+}
+}
+return true;
+},isDateLike:function(){
+for(var i=0;i<arguments.length;i++){
+var o=arguments[i];
+if(typeof (o)!="object"||o===null||typeof (o.getTime)!="function"){
+return false;
+}
+}
+return true;
+},xmap:function(fn){
+if(fn===null){
+return MochiKit.Base.extend(null,arguments,1);
+}
+var _87=[];
+for(var i=1;i<arguments.length;i++){
+_87.push(fn(arguments[i]));
+}
+return _87;
+},map:function(fn,lst){
+var m=MochiKit.Base;
+var itr=MochiKit.Iter;
+var _8d=m.isArrayLike;
+if(arguments.length<=2){
+if(!_8d(lst)){
+if(itr){
+lst=itr.list(lst);
+if(fn===null){
+return lst;
+}
+}else{
+throw new TypeError("Argument not an array-like and MochiKit.Iter not present");
+}
+}
+if(fn===null){
+return m.extend(null,lst);
+}
+var _8e=[];
+for(var i=0;i<lst.length;i++){
+_8e.push(fn(lst[i]));
+}
+return _8e;
+}else{
+if(fn===null){
+fn=Array;
+}
+var _90=null;
+for(i=1;i<arguments.length;i++){
+if(!_8d(arguments[i])){
+if(itr){
+return itr.list(itr.imap.apply(null,arguments));
+}else{
+throw new TypeError("Argument not an array-like and MochiKit.Iter not present");
+}
+}
+var l=arguments[i].length;
+if(_90===null||_90>l){
+_90=l;
+}
+}
+_8e=[];
+for(i=0;i<_90;i++){
+var _92=[];
+for(var j=1;j<arguments.length;j++){
+_92.push(arguments[j][i]);
+}
+_8e.push(fn.apply(this,_92));
+}
+return _8e;
+}
+},xfilter:function(fn){
+var _95=[];
+if(fn===null){
+fn=MochiKit.Base.operator.truth;
+}
+for(var i=1;i<arguments.length;i++){
+var o=arguments[i];
+if(fn(o)){
+_95.push(o);
+}
+}
+return _95;
+},filter:function(fn,lst,_9a){
+var _9b=[];
+var m=MochiKit.Base;
+if(!m.isArrayLike(lst)){
+if(MochiKit.Iter){
+lst=MochiKit.Iter.list(lst);
+}else{
+throw new TypeError("Argument not an array-like and MochiKit.Iter not present");
+}
+}
+if(fn===null){
+fn=m.operator.truth;
+}
+if(typeof (Array.prototype.filter)=="function"){
+return Array.prototype.filter.call(lst,fn,_9a);
+}else{
+if(typeof (_9a)=="undefined"||_9a===null){
+for(var i=0;i<lst.length;i++){
+var o=lst[i];
+if(fn(o)){
+_9b.push(o);
+}
+}
+}else{
+for(i=0;i<lst.length;i++){
+o=lst[i];
+if(fn.call(_9a,o)){
+_9b.push(o);
+}
+}
+}
+}
+return _9b;
+},_wrapDumbFunction:function(_9f){
+return function(){
+switch(arguments.length){
+case 0:
+return _9f();
+case 1:
+return _9f(arguments[0]);
+case 2:
+return _9f(arguments[0],arguments[1]);
+case 3:
+return _9f(arguments[0],arguments[1],arguments[2]);
+}
+var _a0=[];
+for(var i=0;i<arguments.length;i++){
+_a0.push("arguments["+i+"]");
+}
+return eval("(func("+_a0.join(",")+"))");
+};
+},methodcaller:function(_a2){
+var _a3=MochiKit.Base.extend(null,arguments,1);
+if(typeof (_a2)=="function"){
+return function(obj){
+return _a2.apply(obj,_a3);
+};
+}else{
+return function(obj){
+return obj[_a2].apply(obj,_a3);
+};
+}
+},method:function(_a6,_a7){
+var m=MochiKit.Base;
+return m.bind.apply(this,m.extend([_a7,_a6],arguments,2));
+},compose:function(f1,f2){
+var _ab=[];
+var m=MochiKit.Base;
+if(arguments.length===0){
+throw new TypeError("compose() requires at least one argument");
+}
+for(var i=0;i<arguments.length;i++){
+var fn=arguments[i];
+if(typeof (fn)!="function"){
+throw new TypeError(m.repr(fn)+" is not a function");
+}
+_ab.push(fn);
+}
+return function(){
+var _af=arguments;
+for(var i=_ab.length-1;i>=0;i--){
+_af=[_ab[i].apply(this,_af)];
+}
+return _af[0];
+};
+},bind:function(_b1,_b2){
+if(typeof (_b1)=="string"){
+_b1=_b2[_b1];
+}
+var _b3=_b1.im_func;
+var _b4=_b1.im_preargs;
+var _b5=_b1.im_self;
+var m=MochiKit.Base;
+if(typeof (_b1)=="function"&&typeof (_b1.apply)=="undefined"){
+_b1=m._wrapDumbFunction(_b1);
+}
+if(typeof (_b3)!="function"){
+_b3=_b1;
+}
+if(typeof (_b2)!="undefined"){
+_b5=_b2;
+}
+if(typeof (_b4)=="undefined"){
+_b4=[];
+}else{
+_b4=_b4.slice();
+}
+m.extend(_b4,arguments,2);
+var _b7=function(){
+var _b8=arguments;
+var me=arguments.callee;
+if(me.im_preargs.length>0){
+_b8=m.concat(me.im_preargs,_b8);
+}
+var _ba=me.im_self;
+if(!_ba){
+_ba=this;
+}
+return me.im_func.apply(_ba,_b8);
+};
+_b7.im_self=_b5;
+_b7.im_func=_b3;
+_b7.im_preargs=_b4;
+return _b7;
+},bindMethods:function(_bb){
+var _bc=MochiKit.Base.bind;
+for(var k in _bb){
+var _be=_bb[k];
+if(typeof (_be)=="function"){
+_bb[k]=_bc(_be,_bb);
+}
+}
+},registerComparator:function(_bf,_c0,_c1,_c2){
+MochiKit.Base.comparatorRegistry.register(_bf,_c0,_c1,_c2);
+},_primitives:{"boolean":true,"string":true,"number":true},compare:function(a,b){
+if(a==b){