Viewfinder
This is the complete source for the Viewfinder server and iOS and
Android apps as they existed at the time the Viewfinder service was
shut down. We're releasing this code in the hopes that it can be of
utility to others, either as an archaeological resource or to pick up
the baton and start running with the Viewfinder vision again.
The Viewfinder engineers' days are now filled with other priorities
and we won't be able to provide support or bug fixes for this
code. The code is not as clean nor as well tested as you might find in
other open source projects. Yet it is the reality of what was produced
by a startup.
That said, there is quite a bit of interesting code to look at:
The Viewfinder server provides a structured database schema with a
variety of indexing options on top of Amazon's DynamoDB. See
schema.py and
indexers.py. Also take a look at the
operation.py which provides at least once
execution of idempotent operations.
The server also provided support for versioning at both the database
and protocol levels. See db/versions.py,
base/message.py and
www/json_schema.py.q
The ViewfinderTool required
some nifty maths and fancy OpenGL graphics to implement. What is the
fastest way to draw a circular gradient? Our answer was to
approximate one using triangle fans and very simple and fast color
interpolation in a shader.
The Viewfinder Client uses [LevelDB]
(https://code.google.com/p/leveldb/) for all local metadata
storage. While arguably not as convenient as CoreData, we found
LevelDB to be easy to use and very very fast. See
DB.h.
How to detect duplicate and near duplicate images from the iOS
camera roll? Perceptual fingerprints. See
ImageFingerprint.h and
ImageIndex.h.
Need a full text search engine that can work on a mobile device? We
built one on top of LevelDB that we used for both searching for
contacts and searching for photos. See
FullTextIndex.h.
We used GYP for generating Xcode
project files and Android build files. GYP is awesome and removed
the serious headache during iOS development of how to handle merge
conflicts in Xcode project files. And GYP facilitated sharing a
large body of code between the iOS and Android
code bases.
Setup
We use subrepositories, so after cloning (or pulling any change that includes a change to
the subrepository), you must run
$ git submodule update --init
Many of the following scripts require certain PATH entries or other environment variables.
Set them up with the following (this is intended to be run from .bashrc or other shell
initialization scripts; if you do not install it there you will need to repeat this command
in each new terminal):
$ source scripts/viewfinder.bash
Server
To install dependencies (into ~/envs/vf-dev), run
$ update-environment
To run unit tests:
$ run-tests
TODO: add ssl certificates and whatever else local-viewfinder needs, and document running it.
iOS client
Our Xcode project files are generated with gyp. After checking out the code
(and after any pull in which a .gyp file changed), run
$ generate-projects.sh
Open the workspace containing the project, not the generated project itself:
$ open clients/ios/ViewfinderWorkspace.xcworkspace
Android client
The android client is unfinished. To build it, run
$ generate-projects-android.sh
$ vf-android.sh build