UbuntuOneDB
Dev Week -- u1db: synced data for your apps on many platforms -- aquarius -- Thu, Aug 30th, 2012
1 [18:01] <aquarius> first, thanks to the Alexes :-)
2 [18:01] <aquarius> The subtitle for this talk on the schedule is "synced data for your apps on many platforms", and that's what u1db does.
3 [18:01] <aquarius> You build an app, and use u1db to store its data, and you can then sync that data to your app on other machines and other devices and other platforms.
4 [18:02] <aquarius> So if you built an Ubuntu app, you could have the same data sync between all your Ubuntu machines, meaning that your data is everywhere.
5 [18:02] <aquarius> You could also sync to other platforms, so an Android app could share the same data, and so on.
6 [18:02] <aquarius> Imagine your shopping lists and your notes and your movie watching habits and your music ratings in your Ubuntu desktop and your smartphone and on the web available from anywhere.
7 [18:03] <aquarius> So far, this is just syncing, like Ubuntu One file sync: why have a database?
8 [18:03] <aquarius> U1DB is good at dealing with data; file sync isn't.
9 [18:03] <aquarius> Some people have thought in the past "hey, my app stores things in SQLite; I'll just use U1 to sync my app's data folder and then my data is synced everywhere, woo!"
10 [18:03] <aquarius> This is great, until it isn't.
11 [18:04] <aquarius> If you make changes to your SQLite database on two different machines, they'll conflict, because SQLite isn't designed for syncing.
12 [18:04] <aquarius> So you'll get a conflict from Ubuntu One file sync, which you'll have to resolve.
13 [18:04] <aquarius> U1DB is cleverer than that; changes to your data won't conflict unless they really, really need to, so it's much more suitable for syncing.
14 [18:04] <aquarius> You probably have questions at this point, but let's see some code first and then we can discuss.
15 [18:04] <aquarius> First, you'll need u1db, of course.
16 [18:05] <aquarius> For this talk, you'll need to get u1db from launchpad, with "bzr branch lp:u1db"
17 [18:05] <aquarius> (U1DB itself is now available in Ubuntu Quantal, but for this demo please get the Launchpad version because it contains the example app as well!)
18 [18:05] <aquarius> Once you have u1db, this should work and not throw errors: PYTHONPATH=u1db python -c "import u1db"
19 [18:05] <aquarius> (I pause a little to give people a chance to grab u1db :))
20 [18:06] <aquarius> Let's try a simple example of a working app first: the u1db distribution comes with an example app called "cosas", which is a small todo list.
21 [18:07] <aquarius> (Everyone writes a todo list now: it's like the Hello World of the 21st century)
22 [18:07] <aquarius> cd u1db/cosas
23 [18:07] <aquarius> PYTHONPATH=.. python ui.py
24 [18:07] <aquarius> and you should see a todo list window pop up, looking like http://ubuntuone.com/7aOvtpIljWwbwB1FEFbs5L
25 [18:08] <aquarius> (you might need to apt-get install python-qt4 if you don't have it)
26 [18:08] <ClassBot> calmi asked: python is the recommended language?
27 [18:09] <aquarius> calmi: I'll get to that. It is *a* language you can use :)
28 [18:09] <aquarius> there are many others :)
29 [18:09] <aquarius> Add a couple of tasks, tick a couple
30 [18:09] <aquarius> Then from the app menu, do File > Synchronize
31 [18:09] <aquarius> and choose Ubuntu One and Synchronize Now
32 [18:09] <aquarius> (this demo is for people who have an Ubuntu One account; if you don't have one, just skip doing this and take my word for it. You can sync u1db without using Ubuntu One at all by running your own server)
33 [18:10] <aquarius> Your little todo list is now synced with your U1 account!
34 [18:10] <aquarius> You can prove this: quit cosas and then delete the file ~/.local/share/cosas/cosas.u1db, as if you're a second machine
35 [18:11] <aquarius> If you now restart cosas you'll have no todo list items... just File > Synchronize again and they'll be synced to you!
36 [18:11] <aquarius> Obviously you could be running cosas on many different Ubuntu machines and the data could be synced to all of them.
37 [18:12] <aquarius> So, let's see how this actually works. I'll show using U1DB from Python on Ubuntu, but it's also available in other platforms and languages too, which I'll talk about later.
38 [18:12] <aquarius> Start with some simple examples, taken from the documentation at http://packages.python.org/u1db/
39 [18:12] <aquarius> Start a python interpreter with "python"
40 [18:12] <aquarius> >>> import u1db
41 [18:12] <aquarius> >>> db = u1db.open("mydb.u1db", create=True)
42 [18:13] <aquarius> We've now created a U1DB database named mydb.u1db.
43 [18:13] <aquarius> Next, we'll create a document in it. U1DB is a document-based database: you save JSON documents into it. So, a simple document naming a person:
44 [18:13] <aquarius> >>> content = {"name": "Alan Hansen"}
45 [18:13] <aquarius> >>> doc = db.create_doc(content)
46 [18:13] <aquarius> And the Document is saved in the database. You can still see the Document's content:
47 [18:14] <aquarius> >>> doc.content
48 [18:14] <aquarius> {'name': 'Alan Hansen'}
49 [18:14] <aquarius> We can edit the content of that document, of course:
50 [18:14] <aquarius> >>> doc.content = {"name": "Alan Hansen", "position": "defence"}
51 [18:14] <aquarius> After changing the content, we need to save that updated Document:
52 [18:14] <aquarius> >>> rev = db.put_doc(doc)
53 [18:14] <aquarius> And now the updated document is saved in the DB, ready to be retrieved or queried or synced.
54 [18:15] <aquarius> Let's create a couple more documents:
55 [18:15] <aquarius> >>> doc2 = db.create_doc({"name": "John Barnes", "position": "defence"})
56 [18:15] <aquarius> (and we'll change the content before saving: Document.content is a dictionary)
57 [18:15] <aquarius> >>> doc2.content["position"] = "forward"
58 [18:15] <aquarius> >>> db.put_doc(doc2)
59 [18:15] <aquarius> >>> doc3 = db.create_doc({"name": "Ian Rush", "position": "forward"})
60 [18:15] <aquarius> and we now have three documents.
61 [18:15] <aquarius> Retrieving documents from the database with a query is done by creating an "index".
62 [18:15] <aquarius> To create an index, give it a name, and the field(s) in the document that you want to query on:
63 [18:15] <aquarius> >>> db.create_index("by-position", "position") # create an index by passing a field name
64 [18:16] <aquarius> so we have an index, named "by-position", indexing all documents on the field "position".
65 [18:16] <aquarius> And now we can query that index for a particular value. If we want to get everyone with position="forward" in our list of people:
66 [18:16] <aquarius> >>> results = db.get_from_index("by-position", "forward")
67 [18:16] <aquarius> And our results is a list of two Documents:
68 [18:16] <aquarius> >>> len(results)
69 [18:16] <aquarius> 2
70 [18:17] <aquarius> And you can manipulate that list just like a standard Python list, which is what it is:
71 [18:17] <aquarius> >>> data = [result.content for result in results]
72 [18:17] <aquarius> >>> names = [item["name"] for item in data]
73 [18:17] <aquarius> >>> sorted(names)
74 [18:17] <aquarius> [u'Ian Rush', u'John Barnes']
75 [18:17] <aquarius> That's the very basics of using u1db: saving data, loading it, and querying for it, same as any database.
76 [18:17] <aquarius> The documentation at http://packages.python.org/u1db/ goes into much, much more detail.
77 [18:18] <aquarius> In particular, the tutorial at http://packages.python.org/u1db/tutorial.html walks through cosas, the example todo list app, and explains how it structures its data and how to sync a U1DB with other places, like Ubuntu One.
78 [18:19] <aquarius> As I said right at the beginning, U1DB is designed to work everywhere.
79 [18:19] <aquarius> This means that there will be, or could be, a U1DB implementation for any choice of platform and language.
80 [18:19] <aquarius> What I've shown above is the Python implementation, which should work on any platform where you have Python (so Ubuntu, other Linuxes, Windows, Mac, N9, etc).
81 [18:20] <aquarius> There is also a C implementation, so if you're writing apps in C or some other C-bound language you can use the C version.
82 [18:20] <aquarius> At U1 we're also building an Android Java version and an iOS Objective-C version, in time.
83 [18:20] <aquarius> There's also a command line client (u1db-client, and u1db-serve to run a simple server).
84 [18:21] <aquarius> Members of the U1DB team are also bringing U1DB to Vala, Go, and in-browser JavaScript.
85 [18:21] <aquarius> So apps using all those languages on all those platforms will be able to sync data: imagine your app on Ubuntu and a mobile version on your Android phone and a web version, all able to sync data between themselves.
86 [18:22] <aquarius> Part of the goal of U1DB is that if you decide that you want to be able to use it in a platform we haven't provided (and you can't or won't bind to the C version) then it ought to be possible to do a full reimplementation of it in your chosen language for your chosen platform
87 [18:23] <aquarius> There's a very comprehensive test suite exactly so that it's possible to test compliance.
88 [18:23] <aquarius> So we're building U1DB for a whole load of different platforms, and it's possible to bring it to others.
89 [18:23] <aquarius> U1DB is in Ubuntu Quantal, so your apps can depend on it.
90 [18:24] <aquarius> You don't actually have to sync data to use U1DB, of course: you can just use it as a database and never sync it at all!
91 [18:24] <aquarius> If you use U1DB in an app now, then you can add syncing later when you choose to.
92 [18:24] <aquarius> This has been a brief tour of U1DB, and I'm sure there are questions, so I'll happily take them now :)
93 [18:24] <ClassBot> jsjgruber-l85-p asked: How is this different from couchdb?
94 [18:25] <aquarius> Similar goals, similar-ish implementation, but the big difference is that U1DB runs in your process, and it's built separately for each platform and uses the platform's native data storage capabilities.
95 [18:25] <aquarius> So couchdb was a server; if you wanted to use couchdb on your phone, you (or someone else) had to port the whole couchdb server to that platform, and run it as a server there and connect to it.
96 [18:26] <aquarius> u1db is built separately and independently for each platform
97 [18:26] <aquarius> so it's not making one codebase run everywhere; an implementation can do whatever makes the most sense on the platform it's on: an Android version would likely be written in Java, for example
98 [18:27] <aquarius> and an in-browser JavaScript version would be run entirely by your web app; it's not a separate server that you have to deploy and secure, it's entirely client-side and then you sync it with a u1db server elsewhere.
99 [18:27] <aquarius> using the DB is similar: it's a store of JSON documents, which is similar to couch.
100 [18:28] <aquarius> does that answer the question? :)
101 [18:28] <ClassBot> jsjgruber-l85-p asked: How will it avoid the scaling problems couchdb had on the U1 infrastructure?
102 [18:29] <aquarius> we've deliberately built the U1DB server infrastructure to work exactly for this use case
103 [18:30] <aquarius> I'm not the server scaling expert, but I know the people who are :) If you have specific questions, we can answer them
104 [18:31] <ClassBot> wan26 asked: What encryption scheme is used for sync?
105 [18:31] <aquarius> Sync to Ubuntu One is always over SSL
106 [18:32] <aquarius> If you run your own server, you are able to run it over SSL or not as you choose
107 [18:33] <aquarius> and sync to U1 is authenticated the same way as all the other Ubuntu One APIs
108 [18:33] <aquarius> again, if you run your own server, you can (and should) define your own authentication policy :)
109 [18:34] <aquarius> The best place to learn about u1db is the documentation, as mentioned, at http://packages.python.org/u1db/
110 [18:35] <aquarius> There are introductory materials there to get started, and a much deeper dive into the intricacies of querying, syncing, replication, and so on when you want to do more complicated things
111 [18:36] <aquarius> or if you want to do a new implementation of u1db for a different platform
112 [18:36] <aquarius> but the best thing is to use u1db as it exists and build apps on it :)
113 [18:38] <aquarius> one of the apps in the recent Ubuntu App Showdown (tickit) is using u1db for storage precisely to get syncing capabilities
114 [18:38] <aquarius> and we have a bunch of others talking to us as well :)
115 [18:38] <aquarius> you can get hold of the u1db team if you have questions once you start development on irc, here on freenode, on #u1db
116 [18:39] <aquarius> and the mailing list at https://launchpad.net/~u1db-discuss
117 [18:40] <aquarius> and if you fancy helping me work on the JavaScript version, that'd be great :P
118 [18:43] <aquarius> So, that concludes the brief tour: if you have questions, or you're thinking of using u1db, or curious as to how you'd use it, speak now. :)
119 [18:45] <aquarius> Cool, no more questions
120 [18:45] <aquarius> So, thank you for your time: come and tell us about which apps you're using u1db in!
MeetingLogs/devweek1208/UbuntuOneDB (last edited 2012-08-31 09:41:41 by dholbach)