go.talks: Camlistore: Android, ARM, App Engine, anywhere.

LGTM=bradfitz
R=bradfitz
CC=golang-codereviews
https://golang.org/cl/113900044
diff --git a/2014/camlistore.slide b/2014/camlistore.slide
new file mode 100644
index 0000000..897dd69
--- /dev/null
+++ b/2014/camlistore.slide
@@ -0,0 +1,207 @@
+Camlistore: Android, ARM, App Engine, anywhere.
+
+25 June 2014
+Tags: camlistore
+
+Brad Fitzpatrick
+Gopher, Google
+@bradfitz
+bradfitz@golang.org
+http://bradfitz.com/
+http://camlistore.org/
+
+* Me
+
+- bradfitz
+- LiveJournal, memcached, OpenID, ...
+- Google
+- Go Standard Library, etc
+- Camlistore
+
+* Camlistore
+
+* Camlistore
+
+- "Your personal storage system for life"
+- 4 year+ open source project:
+.link http://camlistore.org
+- All in Go.
+- Early user of Go's standard library. Helped shape it.
+
+* Camlistore
+
+- stores, indexes, searches, syncs, shares content
+- can optionally model POSIX filesystems
+- lightweight object storage model, stores all mutations
+
+Stores on:
+
+- local disk, S3, Google Cloud Storage
+- MySQL, Postgres, SQLite, LevelDB,
+- MongoDB, App Engine,
+- itself,
+- encrypted, sharded, replicated, load balanced,
+- ...
+
+* Camlistore screenshots
+
+* Web UI
+
+.image camlistore/cam-mix-types.png _ 1000
+
+* Location search
+
+.image camlistore/cam-moscow.png 580 _
+
+* Panos
+
+.image camlistore/cam-pano.png _ 1000
+
+* Paris + Portrait
+
+.image camlistore/cam-paris-portrait.png _ 1000
+
+* Non-images
+
+.image camlistore/cam-other.png _ 1000
+
+* FUSE
+
+.image camlistore/cam-fuse.png _ 1000
+
+* Android
+
+.image camlistore/cam-android.png 600 _
+
+* Camlistore Demo
+
+* Camlistore does much, in many places
+
+* Camlistore
+
+does:
+
+- a web & API server
+- a FUSE filesystem (OS X, Linux)
+- command-line tools
+
+on:
+
+- desktops, personal servers
+- Raspberry Pi, etc (ARM)
+- Android
+- App Engine
+- Cloud (EC2, GCE)
+
+* Desktops, personal servers
+
+- Linux, FreeBSD, Mac, Windows, ...
+
+  $ go {get,build,install,test} camlistore.org/{cmd,pkg,server}/...
+
+- Occasional use of +build windows, etc.
+- Nothing fancy.
+
+* Raspberry Pi
+
+- Most ARM devices are very slow
+- Cross compile from any OS, architecture on a fast machine:
+
+  $ GOARCH=arm GOOS=linux go build camlistore.org/server/camlistored
+
+- ... then copy binary to the slow ARM device.
+- Popular helper tool:
+
+.link https://github.com/davecheney/golang-crosscompile
+
+- For debugging: ChromeOS + crouton is nice, pretty fast
+
+* App Engine
+
+- Just upload the code.
+- App Engine APIs require context plumbing.
+- Ugly hacks avoid context plumbing, but don't.
+.link https://developers.google.com/appengine/docs/go/reference#Context
+.link http://godoc.org/camlistore.org/pkg/context
+.link http://godoc.org/code.google.com/p/go.net/context
+- Restructure code to not assume long-running goroutines; handlers only
+- No unsafe, syscall, etc: use build tags on files:
+
+  // +build !appengine
+
+* Cloud
+
+- Same as desktop.
+- Static binaries make deployment easy
+- Even easier: 
+- Embed resources (CSS, JS, HTML, images) with fileembed
+- Camlistore has: camlistore.org/pkg/fileembed + genfileembed
+
+* fileembed
+
+Definition:
+
+  package fileembed
+  func (f *Files) Open(filename string) (http.File, error)
+
+Use in Camlistore:
+
+  package server
+  uistatic.Files = &fileembed.Files{
+      DirFallback: ui.uiDir,
+      Listable:    true,
+      // In dev_appserver, allow edit-and-reload without
+      // restarting. In production, though, it's faster to just
+      // slurp it in.
+      SlurpToMemory: uistatic.IsProdAppEngine,
+  }
+
+- Just reload in dev; embedded in binary in production.
+
+* Camlistore's genfileembed
+
+  $ genfileembed ./path/to/dir
+
+- generates zindex.html.go
+
+* Embedding resources
+
+- Many options in the Go community
+- Coming to Go 1.4 built-in
+
+* Web server
+
+- Obvious
+- net/http is great: no need for Apache, nginx, etc
+- WebSockets support is great and easy
+
+* FUSE
+
+- Native filesystem on OS X & Linux
+- hanwen/gofuse (then only Linux) -> rsc/fuse (then only Mac) -> Camlistore fork (both) -> bazil.org (community maintained)
+- Easy to write fast filesystems in Go
+
+* Android
+
+- child process
+- on Application start, unzip arm binary to Unix (not media) filesystem 
+.link https://camlistore.googlesource.com/camlistore/+/master/clients/android/src/org/camlistore/UploadApplication.java UploadApplication.java
+.link https://camlistore.googlesource.com/camlistore/+/master/clients/android/src/org/camlistore/UploadThread.java UploadThread.java
+- build with Docker (demo)
+.link https://camlistore.googlesource.com/camlistore/+/master/clients/android/devenv/Dockerfile Dockerfile
+.link https://camlistore.googlesource.com/camlistore/+/master/clients/android/Makefile Makefile
+.link https://camlistore.googlesource.com/camlistore/+/master/clients/android/build-in-docker.pl build-in-docker.pl
+
+* Command-line tools
+
+  $ cmdtool [--global=foo] subcmd [--subcommand opts]
+
+.link http://camlistore.org/pkg/cmdmain/
+.link https://camlistore.googlesource.com/camlistore/+/master/cmd/camtool/describe.go camtool's describe.go
+.link https://github.com/codegangsta/cli Popular: codegangsta/cli
+
+* In summary
+
+Go is awesome and runs lots of places, easily.
+
+- Web, CLI, FUSE, x86, ARM, Android, App Engine
diff --git a/2014/camlistore/cam-android.png b/2014/camlistore/cam-android.png
new file mode 100644
index 0000000..e56804a
--- /dev/null
+++ b/2014/camlistore/cam-android.png
Binary files differ
diff --git a/2014/camlistore/cam-boot.png b/2014/camlistore/cam-boot.png
new file mode 100644
index 0000000..3c7726e
--- /dev/null
+++ b/2014/camlistore/cam-boot.png
Binary files differ
diff --git a/2014/camlistore/cam-checkins.png b/2014/camlistore/cam-checkins.png
new file mode 100644
index 0000000..29a9a81
--- /dev/null
+++ b/2014/camlistore/cam-checkins.png
Binary files differ
diff --git a/2014/camlistore/cam-fuse.png b/2014/camlistore/cam-fuse.png
new file mode 100644
index 0000000..77334f0
--- /dev/null
+++ b/2014/camlistore/cam-fuse.png
Binary files differ
diff --git a/2014/camlistore/cam-mix-types.png b/2014/camlistore/cam-mix-types.png
new file mode 100644
index 0000000..c53603a
--- /dev/null
+++ b/2014/camlistore/cam-mix-types.png
Binary files differ
diff --git a/2014/camlistore/cam-moscow.png b/2014/camlistore/cam-moscow.png
new file mode 100644
index 0000000..9f2a62c
--- /dev/null
+++ b/2014/camlistore/cam-moscow.png
Binary files differ
diff --git a/2014/camlistore/cam-other.png b/2014/camlistore/cam-other.png
new file mode 100644
index 0000000..246b72a
--- /dev/null
+++ b/2014/camlistore/cam-other.png
Binary files differ
diff --git a/2014/camlistore/cam-pano.png b/2014/camlistore/cam-pano.png
new file mode 100644
index 0000000..3d0e4dc
--- /dev/null
+++ b/2014/camlistore/cam-pano.png
Binary files differ
diff --git a/2014/camlistore/cam-paris-portrait.png b/2014/camlistore/cam-paris-portrait.png
new file mode 100644
index 0000000..583535c
--- /dev/null
+++ b/2014/camlistore/cam-paris-portrait.png
Binary files differ