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 https://pkg.go.dev/camlistore.org/pkg/context .link https://pkg.go.dev/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