Looking for a simple and minimalistic way to store

2019-05-16 13:39发布

问题:

I'm looking for a very simple and free cloud store for small packets of data.

Basically, I want to write a Greasemonkey script that a user can run on multiple machines with a shared data set. The data is primarily just a single number, eight byte per user should be enough.

It all boils down to the following requirements:

  • simple to develop for (it's a fun project for a few hours, I don't want to invest twice as much in the sync)
  • store eight bytes per user (or maybe a bit more, but it's really tiny)
  • ideally, users don't have to sign up (they just get a random key they can enter on all their machines)
  • I don't need to sign up (it's all Greasemonkey, so there's no way to hide a secret, like a developer key)
  • there is no private data in the values, so another user getting access to that information by guessing the random key is no big deal
  • the information is easily recreated (sharing it in the cloud is just for convenience), so another user taking over the 'key' is easily fixed as well

First ideas:

  • Store on Google Docs with a form as the frontend. Of course, that's kinda ugly and every user needs to set it up again.
  • I could set up a Google App Engine instance that allows storing a number to a key and retrieving the number by key. It wouldn't be hard, but it still sounds overkill for what I need.
  • I could create a Firefox add-on instead of a Greasemonkey script and use Mozilla Weave/Sync—which unfortunately doesn't support storing HTML5 local storage yet, so GM isn't enough. Of course I'd have to implement the same for Opera and Chrome then (assuming there are similar services for them), instead of just reusing the user script.

Anybody got a clever idea or a service I'm not aware of?


Update for those who are curious: I ended up going the GAE route (about half a page of Python code). I only discovered OpenKeyval afterwards (see below). The advantage is that it's pretty easy for users to connect on all their machines (just a Google account login, no other key to transfer from machine A to machine B), the disadvantage is that everybody needs a Google account.

回答1:

OpenKeyval is pretty much what I was looking for.

OpenKeyval was what I was looking for but has apparently been shut down.



回答2:

I think GAE will be nice choice. With your requirements for storage size you will never pass free 500 mb of GAE's store. And it will be easy to port your script across browsers because of REST nature of your service;)



回答3:

I was asked to share my GAE key/value store solution, so here it comes. Note that this code hasn't run for years, so it might be wrong and/or very outdated GAE code:

app.yaml

application: myapp
version: 1
runtime: python
api_version: 1

handlers:
- url: /
  script: keyvaluestore.py

keyvaluestore.py

from google.appengine.api import users
from google.appengine.ext import db
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app

class KeyValue(db.Model):
    v = db.StringProperty(required=True)

class KeyValueStore(webapp.RequestHandler):
    def _do_auth(self):
        user = users.get_current_user()
        if user:
            return user
        else:
            self.response.headers['Content-Type'] = 'text/plain'
            self.response.out.write('login_needed|'+users.create_login_url(self.request.get('uri')))

    def get(self):
        user = self._do_auth()
        callback = self.request.get('jsonp_callback')
        if user:
            self.response.headers['Content-Type'] = 'text/plain'
            self.response.out.write(self._read_value(user.user_id()))

    def post(self):
        user = self._do_auth()
        if user:
            self._store_value(user.user_id(), self.request.body)

    def _read_value(self, key):
        result = db.get(db.Key.from_path("KeyValue", key))
        return result.v if result else 'none'

    def _store_value(self, k, v):
        kv = KeyValue(key_name = k, v = v)
        kv.put()

application = webapp.WSGIApplication([('/', KeyValueStore)],
                                     debug=True)

def main():
    run_wsgi_app(application)

if __name__ == "__main__":
    main()


回答4:

The closest thing I've seen is Amazon's Simple Queue Service.
http://aws.amazon.com/sqs/

I've not used it myself so I'm not sure how the developer key aspect works, but they give you 100,000 free queries a month.