aboutsummaryrefslogtreecommitdiff
%!PS-Adobe-3.0 
%%DocumentMedia: SLIDE 842 595 0 () () 
%%EndComments 
%%BeginDefaults 
%%PageMedia: SLIDE
%%EndDefaults 
<< /PageSize [842 595] /ImagingBBox null >> setpagedevice 

/reencode {
	exch
	findfont
	dup length dict
	begin
	{       
		1 index /FID ne
		{ def }
		{ pop pop }
		ifelse
	} forall
	/Encoding ISOLatin1Encoding def
	currentdict
	end
	definefont pop
} def
/Courier /Courier reencode
/Helvetica /Helvetica reencode
/Times /Times reencode
/Times-Italic /Times-Italic reencode


/headerheight 77 def

/frontfontsz  60 def
/authorfontsz 40    def
/titlefontsz  40     def
/mainfontsz   30      def
/codefontsz   18      def
/tinyfontsz   18      def

/titlefont  /Helvetica     findfont titlefontsz  scalefont def
/mainfont   /Courier      findfont mainfontsz   scalefont def
/codefont   /Courier      findfont codefontsz   scalefont def
/tinyfont   /Times      findfont tinyfontsz   scalefont def
/frontfont  /Helvetica findfont frontfontsz  scalefont def
/authorfont /Times-Italic    findfont authorfontsz scalefont def
/authorfonttwo /Times findfont authorfontsz scalefont def


/pagewidth  842 def
/pageheight 595 def
/leftmargin 30  def
/topmargin  595 def

/pad 10 def

/titlefonth  titlefontsz  pad add def
/mainfonth   mainfontsz   pad add def
/codefonth   codefontsz   pad add def
/tinyfonth   tinyfontsz   pad add def
/frontfonth  frontfontsz  pad add def
/authorfonth authorfontsz pad add def

/headermargin
	pageheight headerheight titlefonth sub 2 div titlefontsz add sub
def
/rightmargin pagewidth leftmargin sub def
/tbtop topmargin def
/ypos topmargin def

/xcur { currentpoint pop      } def
/ycur { currentpoint exch pop } def

/wordbreak ( ) def
/linewrap {
	/proc exch def
	/linelength exch def
	/textstring exch def
	/breakwidth wordbreak stringwidth pop def
	/curwidth 0 def
	/lastwordbreak 0 def
	/startchar 0 def
	/restoftext textstring def
	{
		restoftext wordbreak search
		{
			/nextword exch def pop
			/restoftext exch def
			/wordwidth nextword stringwidth pop def
			curwidth wordwidth add linelength gt
			{
				textstring startchar
				lastwordbreak startchar sub
				getinterval proc
				/startchar lastwordbreak def
				/curwidth wordwidth breakwidth add def
			}
			{
				/curwidth curwidth wordwidth add
				breakwidth add def 
			} ifelse
			/lastwordbreak lastwordbreak
			nextword length add 1 add def
		}
		{
			pop exit
		} ifelse
	} loop
	/lastchar textstring length def
	textstring startchar lastchar startchar sub 
	getinterval proc
} def

/line {
	0 0 0 setrgbcolor
	0.5 setlinewidth
	leftmargin ypos moveto
	rightmargin ypos lineto
	stroke
} def

/center {
	dup
	/str exch def
	/sw str stringwidth pop def
	/xpos pagewidth sw sub 2 div xcur sub def
	xpos 0 rmoveto
} def

/objcenter {
	pagewidth exch sub 2 div 0 translate
} def

/s {
	/tbtop topmargin def
	/ypos topmargin def
	1 1 1 setrgbcolor
	0 setlinewidth
	newpath
	0 pageheight moveto
	pagewidth pageheight lineto
	pagewidth 0 lineto
	0 0 lineto
	closepath
	fill
	stroke
} def

/l {
	/h exch def
	/ypos ypos h sub def
	leftmargin ypos moveto
} def

/title {
	frontfonth l
	frontfont setfont
	0.5 0.5 0.9 setrgbcolor
	{ pagewidth leftmargin 2 mul sub }
	{ frontfonth l center show }
	linewrap
	frontfonth 2 div l
	frontfonth l
} def

/author {
	authorfont setfont
	0 0 0 setrgbcolor
	{ pagewidth leftmargin 2 mul sub }
	{ authorfonth l center show }
	linewrap
} def

/authortwo {
	authorfonttwo setfont
	0 0 0 setrgbcolor
	{ pagewidth leftmargin 2 mul sub }
	{ authorfonth l center show }
	linewrap
} def

/header {
	/ypos pageheight headerheight sub def
	0 0 0 setrgbcolor
	0 setlinewidth
	newpath
	0 pageheight moveto
	pagewidth pageheight lineto
	pagewidth ypos lineto
	0 ypos lineto
	closepath
	fill
	stroke
	leftmargin headermargin moveto
	titlefont setfont 
	0.5 0.5 0.9 setrgbcolor
	center show
	leftmargin ypos moveto
} def

/n {
	mainfont setfont
	0 0 0 setrgbcolor
	{ pagewidth leftmargin 2 mul sub }
	{ mainfonth l show }
	linewrap
} def

/cn {
	codefont setfont
	0 0 0 setrgbcolor
	{ pagewidth leftmargin 2 mul sub }
	{ codefonth l show }
	linewrap
} def

/tn {
	tinyfont setfont
	0 0 0 setrgbcolor
	{ pagewidth leftmargin 2 mul sub }
	{ tinyfonth l show }
	linewrap
} def

/is {
	/level1 save def
	/showpage {} def
} def

/ie {
	level1 restore
} def

/bs {
	/tbtop ypos def
} def

/be {
	/tm tbtop pad sub def
	/bm ypos pad sub def
	newpath
	leftmargin 10 sub tm moveto
	rightmargin tm lineto
	rightmargin bm lineto
	leftmargin 10 sub bm lineto
	closepath
	0 0 0 setrgbcolor
	0.5 setlinewidth
	stroke
} def
( On "local-first") title
(Beyond the CRDT silver bullet) authortwo
showpage
%%Page: 1 1
s
( Part 1) header
( Exposition) title
showpage
%%Page: 2 2
s
( Target) header
() n
() n
() n
(- documents) n
(- files) n
(- personal data repositories) n
() n
() n
(Not: banking services, e-commerce, social networking, ride-sharing, etc.) n
showpage
%%Page: 3 3
s
() n
() n
() n
( 7 ideals for local-first software) title
showpage
%%Page: 4 4
s
() n
() n
() n
( 1 - no spinners: your work at your fingertips) title
showpage
%%Page: 5 5
s
() n
() n
() n
( 2 - your work is not trapped on one device) title
showpage
%%Page: 6 6
s
() n
() n
() n
( 3 - the network is optional) title
showpage
%%Page: 7 7
s
() n
() n
() n
( 4 - seamless collaboration with your colleagues) title
showpage
%%Page: 8 8
s
() n
() n
() n
( 5 - the long now) title
showpage
%%Page: 9 9
s
() n
() n
() n
( 6 - security and privacy by default ) title
showpage
%%Page: 10 10
s
() n
() n
() n
( 7 - you retain ultimate ownership and control) title
showpage
%%Page: 11 11
s
( Towards a better future) header
() n
() n
() n
() n
( CRDTs \(Conflict-free Replicated Data Types\) as a Foundational Technology) authortwo
showpage
%%Page: 12 12
s
( Use case) header
() n
bs
(# in node A and node B) cn
(s = "Hello, World") cn
() cn
(# in node A) cn
(s = "Hello, Alice") cn
() cn
(# in node B) cn
(s = "Hello, Bob") cn
be
(How to reconcile those?) n
(- Hello, ABloibce) n
(- Hello, AliceBob) n
(- Hello, BobAlice) n
(- Hello, Alice) n
(...) n
showpage
%%Page: 13 13
s
( Existing CRDTs differ) title
(- performance) n
(- storage) n
(- compression) n
(- metadata overhead) n
showpage
%%Page: 14 14
s
() n
() n
() n
( Hint towards the "automerge" CRDT) title
showpage
%%Page: 15 15
s
() n
() n
() n
() n
() n
() n
(show comparison table, page 9) author
showpage
%%Page: 16 16
s
( Part 2) header
( Critique) title
showpage
%%Page: 17 17
s
( Software license) header
() n
() n
() n
("In our opinion, maintaining control and ownership of data does not mean that the software must necessarily be open source.") author
showpage
%%Page: 18 18
s
( Example 1 - intentional restriction) header
() n
bs
(#!/bin/sh) cn
(TODAY="$\(date +%s\)") cn
(LICENSE_EXPIRATION="$\(date -d 2020-10-27 +%s\)") cn
(if [ "$TODAY" -ge "$LICENSE_EXPIRATION" ]; then) cn
(	echo 'License expired!') cn
(	exit 1) cn
(fi) cn
(echo $\(\(2 + 2\)\)) cn
be
() n
bs
(# today) cn
($ ./useful-adder.sh) cn
(4) cn
(# tomorrow) cn
($ ./useful-adder.sh) cn
(License expired!) cn
be
showpage
%%Page: 19 19
s
( Example 2 - unintentional restriction) header
() n
bs
(# today) cn
($ useful-program) cn
(# ... useful output ...) cn
() cn
(# tomorrow, with more data) cn
($ useful-program) cn
(ERROR: Panic!  Stack overflow!) cn
be
showpage
%%Page: 20 20
s
() n
() n
( local-first *requires* free software ) title
(Otherwise "The Long Now" \(ideal nš5\) is lost) n
showpage
%%Page: 21 21
s
( Denial of existing solutions) header
() n
() n
("In principle it is possible to collaborate without a repository service, e.g. by sending patch files by email, but the majority of Git users rely on GitHub." ) author
() n
(Solution: either GitHub+CRDTs or git send-email ) n
showpage
%%Page: 22 22
s
( Plain-text formats) header
() n
("Git is highly optimized for code and similar line-based text file") author
() n
(It even pulls software to the plain text directtion, e.g.:) n
(- delivery-templates) n
(- common-core.protocols.config) n
() n
(Why not exploit that more?) n
showpage
%%Page: 23 23
s
( Ditching of web applications) header
() n
() n
("The architecture of web apps remains fundamentally server-centric) author
() n
(Disagree.  Contrast PouchDB with Android Instant Apps) n
showpage
%%Page: 24 24
s
( Costs are underrated) header
() n
(- storage) n
(- backups) n
(- maintenance) n
() n
(Example: blog vs vlog) n
showpage
%%Page: 25 25
s
( Real-time collaboration a bit overrated) header
() n
(It is only possible on the presence of reliable, medium-quality network connection) n
() n
() n
("X also works when inside an elevator, subway or plane!") author
showpage
%%Page: 26 26
s
( On CRDTs and developer experience) header
() n
("For an app developer, how does the use of a CRDT-based data layer compare to existing storage layers like a SQL database, a filesystem, or CoreData?  Is a distributed system harder to write software for?) author
() n
(YES.) authortwo
() n
(See "A Note on Distributed Computing") n
showpage
%%Page: 27 27
s
( Conclusion) header
() n
(Why this is a "paper I love": it took offline-first and ran with it.) n
() n
(But a pinch of CRDT won't make the world local-first. ) n
() n
(The tricky part is the end of the sentence: "in spite of the Cloud".) n
showpage
%%Page: 28 28
s
( References) header
() n
(1. "Local-First Software: You Own Your Data, in spite of the Cloud", by M. Kleppmann, A. Wiggins, P. Van Hardenberg and M. F. McGranaghan) n
(2. The Morning Paper article) n
(3. "A Note on Distributed Compiting", by J. Waldo, G. Wyant, A. Wollrath and S. Kendall) n
(4. these slides: euandre.org/slide/) n
(5. prose version of this presentation) n
(6. view source) n

showpage

%%EOF