[Bps-public-commit] r11708 - in Prophet/trunk: . talks/2008

jesse at bestpractical.com jesse at bestpractical.com
Sat Apr 12 15:14:43 EDT 2008


Author: jesse
Date: Sat Apr 12 15:14:30 2008
New Revision: 11708

Added:
   Prophet/trunk/talks/
   Prophet/trunk/talks/2008/
   Prophet/trunk/talks/2008/osdc.tw.txt
   Prophet/trunk/talks/2008/present-slides
Modified:
   Prophet/trunk/   (props changed)

Log:
 r29632 at 98:  jesse | 2008-04-12 15:12:12 -0400
 * Starting to sketch osdc slides


Added: Prophet/trunk/talks/2008/osdc.tw.txt
==============================================================================
--- (empty file)
+++ Prophet/trunk/talks/2008/osdc.tw.txt	Sat Apr 12 15:14:30 2008
@@ -0,0 +1,145 @@
+Step 3: Prophet
+---
+ A semirelational, 
+ peer to peer replicated, 
+ disconnected,
+ versioned,
+ property database with
+ self-healing conflict
+ resolution
+----
+WHAT ARE ALL THOSE BUZZWORDS?
+----
+semirelational
+----
+* Joins are expensive
+* Joins are discouraged
+----
+peer-to-peer replicated
+----
+* Update any replica
+* Pull from any replica
+* Push _to_ any replica
+* Changes will propagate
+----
+disconnected
+----
+* Real-time replication is hard to scale
+* Real-time replication only works in the cloud
+* I don't live in the cloud
+  (Except when I go hiking)
+* I want my data when I'm offline
+* Prophet works offline.
+* Prophet sync isn't time-constrained
+----
+versioned
+----
+* Compare a record to any point in the past
+* Full changelog
+* Undo changes
+* Use history to be smart
+----
+property database
+----
+* Records can have validation and canonicalization
+* Records do not NEED canonicalization and validation
+* Records of the same type do not need to have the same properties
+* Add and remove 'columns' at will
+----
+self-healing conflict resolution
+----
+* Prophet remembers all conflict resolutions
+* Prophet can detect identical conflicts
+* Prophet can use your peers' resolutions as 'votes' for the winner in a conflict
+----
+HOW DID WE GET HERE?
+----
+* INSERT WEB 2.0 IS SCARY RANT
+----
+WHERE IS HERE, ANYWAY?
+----
+HAVE YOU BUILT ANYTHING WITH IT?
+----
+sd
+----
+A bug tracker: 'simple defects'
+----
+ ./bin/sd ticket create --summary "Can't sync sd with Google Code" --status new
+ Created ticket 93BF979E-08C1-11DD-94C3-D4B1FCEE7EC4
+----
+ ./bin/sd ticket search --regex .
+ 93BF979E-08C1-11DD-94C3-D4B1FCEE7EC4 Can't sync sd with Google Code new
+----
+ ./bin/sd ticket update --uuid 93BF979E-08C1-11DD-94C3-D4B1FCEE7EC4 --status resolved
+----
+ ./bin/sd ticket search --regex .
+ 93BF979E-08C1-11DD-94C3-D4B1FCEE7EC4 Can't sync sd with Google Code resolved
+----
+ Bugs on my laptop alone isn't interesting.
+----
+Syncable!
+----
+ ./bin/sd publish /tmp/mybugs
+ scp -rvp /tmp/mybugs myserver.com:public_html/sd_replica
+----
+ Bob:
+ ./bin/sd pull prophet:http://myserver.com/~clkao/sd_replica
+----
+Same thing over svn protocol 
+(svn also supports push)
+----
+"My project uses another bug tracker!"
+----
+Actually, mine use two:
+RT and Hiveminder.com
+----
+Wrote an RT Replica type for SD in an afternoon.
+(Using only the public REST API)
+----
+Mirror an RT instance into SD
+----
+Share it with your peers using prophet
+----
+Sync changes back from your peers to RT
+----
+Wrote the same thing for Hiveminder
+(Using only the public REST API)
+----
+Now I can sync with RT or Hiveminder
+----
+Now, I can sync BETWEEN RT *AND* Hiveminder
+----
+(Or two RTs)
+----
+We need more replica definitions:
+----
+Trac
+----
+Google Code
+----
+SourceForge
+----
+Bugzilla
+----
+Jira
+----
+GForge
+----
+debbugs
+----
+What else?
+----
+WHAT CAN I DO WITH PROPHET?
+----
+HOW DOES IT SCALE?
+----
+WHAT ARE YOUR PLANS?
+----
+(AKA: What sucks about Prophet?)
+----
+WHERE DO I GET A COPY?
+----
+CAN I HELP?
+----
+HOW CAN I HELP?
+

Added: Prophet/trunk/talks/2008/present-slides
==============================================================================
--- (empty file)
+++ Prophet/trunk/talks/2008/present-slides	Sat Apr 12 15:14:30 2008
@@ -0,0 +1,139 @@
+#!/usr/bin/env perl
+
+use warnings;
+use strict;
+use Term::ANSIScreen qw/:color :cursor :screen :keyboard/;
+use Term::ReadKey;
+use Text::Autoformat;
+our @SLIDES;
+
+load_slides();
+my $counter = 0;
+my $slides_played = {};
+	my $title;
+
+open(my $next_slide, ">/tmp/next_slide");
+select($next_slide);
+$| = 1;
+select(STDOUT);
+
+my $cmd = q{ osascript -e ' tell application "Terminal"' -e ' do script " tail -f /tmp/next_slide"' -e 'end tell' };
+system($cmd);
+while ( $counter <= $#SLIDES ) {
+    my $translation = '';
+
+    my $mode = 'text';
+    my ( $cols, $rows, undef, undef ) = GetTerminalSize();
+    my $slide = $SLIDES[$counter];
+
+    print $next_slide Term::ANSIScreen::cls;
+    print $next_slide locate(1,1);
+    print $next_slide colored("Time: ".scalar localtime()  ."\n", 'blue');
+    print $next_slide colored("Back 1\n", 'red');
+    print $next_slide $SLIDES[$counter-1] ."\n\n";
+    print $next_slide colored("This slide, $counter/".$#SLIDES."\n", 'blue');
+    print $next_slide $SLIDES[$counter] ."\n\n";
+    print $next_slide colored("Next slide\n", 'red');
+    print $next_slide $SLIDES[$counter+1];
+    print $next_slide "\n";	
+
+    my $console = Term::ANSIScreen->new;
+    $console->Cls;
+    $console->Cursor(1,1);
+
+    # comments
+    $slide =~ s/^### .*$//gm;
+
+    if ( $slide =~ s/^#\s*title\s*?(.*?)$//gm ) {
+        $title = $1;
+    }
+	if ($title) {
+        my $start = int ( ( $cols / 2 ) - ( length($title) / 2 ) );
+	$console->Cursor($start,0);
+	chomp $title;
+	print "$title\n";
+	}
+
+    if ($slide =~ s/#\s*loc-ja\s*(.*?)$//sm) {
+	$translation = $1;
+    }
+    if ($slide =~ s/#\s*`(.*?)`//m) {
+	my $cmd = $1;
+	if(!$slides_played->{$counter}) {
+	`$cmd>/dev/null 2>/dev/null &`;
+	$slides_played->{$counter}++}
+    }
+
+    if ( $slide =~ s/#\s*mode\s*(\S+)\s*$//gms ) {
+        $mode = $1;
+    }
+
+    if ( $mode eq 'text' and $slide ) {
+        $slide = autoformat $slide, { left => 2, right => ($cols-1), all => 1 };
+    }
+    else {
+	$slide =~ s/^/ /gsm;
+	my $tidycols = $cols - 2; # squeeze for display
+	open my $out , ">/tmp/output.$$" || die $!;
+	print $out $slide || die $!;
+	close $out || die $!;
+	$slide = ` cat /tmp/output.$$ | source-highlight -s $mode -f esc`;
+	#$slide = ` cat /tmp/output.$$ | perltidy -q -l $tidycols| source-highlight -s perl -f esc`;
+    }
+ 
+    if ( $slide =~ /(\S+)\s*\n\s*(\S+)/m ) {
+	my $lines = ($slide =~ tr/\n//);
+	$console->Cursor(0, int(($rows/2)-($lines/2))-1);
+    	print $slide;
+    } else {
+	chomp $slide;
+	$slide =~ s/(?:\n|\r)//g;
+		my $left = int ( ( $cols / 2 ) - ( length($slide) / 2 ) ); 
+	if ($left < 0 ){
+		$left = 0;
+	}
+        $console->Cursor( $left,	int($rows/2)-1, );
+	print  colored($slide." \n",'bold blue on white');
+    }
+
+
+    $console->Cursor( 0, ( $rows - 1 ) );
+    print colored("$counter/" . $#SLIDES, "bold white");
+    if ($translation) {
+        my $start = int ( ( $cols / 2 ) - ( length($translation) / 2 ) );
+    	$console->Cursor( $start , ( $rows - 1 ) );
+    	print colored($translation, "bold yellow on black");
+   }
+    ReadMode 4;
+    my $key = ReadKey(0);
+    ReadMode 0;
+    if ( $key eq 'q' ) {
+        exit;
+    }
+    if ( $key =~ /^(?: |\n|n)/ ) {
+        $counter++;
+    } elsif ( $key eq 'e' ) {
+	system($ENV{EDITOR}||"vim", $ARGV[0]);
+	load_slides();
+	next;
+    } elsif ( $key eq 'r' ) {
+	load_slides();
+        next;
+
+    } else {
+        $counter--;
+        if ( $counter < 0 ) {
+            $counter = 0;
+        }
+    }
+}
+
+sub load_slides {
+my $file = $ARGV[0] || die "usage: $0 name_of_slides.txt\n";
+my $handle;
+open( $handle, "<$file" ) || die $!;
+
+my $datadata = join( '', <$handle> );
+
+ @SLIDES  = split( /^----?\s*$/mi, $datadata );
+}



More information about the Bps-public-commit mailing list