| 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 |