GET /api/v2/video/424
HTTP 200 OK Vary: Accept Content-Type: text/html; charset=utf-8 Allow: GET, PUT, PATCH, HEAD, OPTIONS
{ "category": "PyCon US 2011", "language": "English", "slug": "pycon-2011--backup-is-hard--let--39-s-go-shopping", "speakers": [ "Gary Bernhardt" ], "tags": [ "backup", "bigdata", "bitbacker", "pycon", "pycon2011" ], "id": 424, "state": 1, "title": "Backup Is Hard; Let's Go Shopping", "summary": "", "description": "Backup Is Hard; Let's Go Shopping\n\nPresented by Gary Bernhardt\n\nWe'll fly through the most clever bits of BitBacker, an online backup app\ndeveloped as a startup for three years and eventually abandoned. Highlights: a\nhacked-up httplib/asyncore HTTP client; a real-life, HATEOAS-respecting\nRESTful API, and an encryption scheme that can quickly diff a file system\nagainst the server while leaking no information \u2013 not even file timestamps.\n\nAbstract\n\nThis is the story of a solution to a huge problem: fast, secure online backup.\nA single client generates a hundred gigabytes, millions of data chunks, and\nthousands of file system snapshots. To appreciate the problem's scale,\nconsider that a Python array holding content hashes for 1,000,000 files\nconsumes 100 MB of memory. File hashes are only a portion of the required per-\nfile metadata, and that's only one for snapshot of thousands.\n\nWe'll tour the hard parts of this system with no apology for their difficulty.\nThe httplib/asyncore hybrid monster that served millions of parallel requests,\ntransparently retrying on failures and timeouts, with only 300 lines of\npython. The RESTful API \u2013 fully respecting hypertext, with every request\nsafely repeatable, even POSTs, and not a single hard-coded URL in the client.\nThe encryption scheme that leaked nothing \u2013 not even modification times \u2013 but\ncould quickly diff local file systems against the server. And, that one time\nthat a client accidentally requested a 4.76 megabyte URL in production.\n\n", "quality_notes": "", "copyright_text": "Creative Commons Attribution-NonCommercial-ShareAlike 3.0", "embed": "", "thumbnail_url": "", "duration": null, "video_ogv_length": 169795828, "video_ogv_url": null, "video_ogv_download_only": false, "video_mp4_length": null, "video_mp4_url": "", "video_mp4_download_only": false, "video_webm_length": null, "video_webm_url": null, "video_webm_download_only": false, "video_flv_length": null, "video_flv_url": null, "video_flv_download_only": false, "source_url": "", "whiteboard": "", "recorded": "2011-03-11", "added": "2012-02-23T04:20:00", "updated": "2014-04-08T20:28:27.949" }