<div dir="ltr"><div><div><div><div><div>A universal CMS based on JSON is in the making. It is however much more low-level and ambitious than what Ian would need. Check out <a href="http://camlistore.org/docs/overview ">http://camlistore.org/docs/overview </a><br>
<br></div>I'm very excited about this technology - it is being primarily driven by Brad Fitzpatrick (<a href="http://bradfitz.com/">http://bradfitz.com/</a>), who has a history of building scalable content management solutions (LiveJournal, Memcached) amongst others like OpenID and PubSubHubbub.<br>
<br></div>The basic component in Camlistore is a blob, which is just dumb data without any identifiying metadata. The blobs are uniquely addressed by using sha1 keys called blobrefs. The basic operations are `get(blobref)`, `put(blobref, blob)` and `enumerate(after, limit)`.<br>
<br></div>The lower-most layer of Camlistore is this dumb blob server. On top of this we have a schema layer. This is where the metadata about the blobs are stored. All metadata is stored as JSON - here is an example of how a file would look like:<br>
<br>{"camliVersion": 1,<br> "camliType": "file",<br> "fileName": "foo.dat",<br> "unixPermission": "0644",<br> ...,<br> "size": 6000133,<br>
"contentParts": [<br> {"blobRef": "sha1-...dead", "size": 111},<br> {"blobRef": "sha1-...beef", "size": 5000000, "offset": 492 },<br>
{"size": 1000000},<br> {"blobRef": "digalg-blobref", "size": 22},<br> ]<br>}<br> <br></div>The interesting thing is that the schema files are also saved as blobs, and referred to using blobrefs. It is content addressable blobs all the way down. I borrowed the schema file description from <a href="https://docs.google.com/presentation/d/1otsEBBmOYoPY6T7p4YtM0ysX1vUG3amZQAykr9jZZgk/present#slide=id.i0">https://docs.google.com/presentation/d/1otsEBBmOYoPY6T7p4YtM0ysX1vUG3amZQAykr9jZZgk/present#slide=id.i0</a> - it is a short presentation by the authors that covers the architecture in good detail.<br>
<br></div>Camlistore borrows many things from Git - this includes the philosophy of having small low-level building blocks on top of which complex infrastructure can be built, using sha1 addressable blobs and preserving immutability by using diffs for mutation.<br>
<div><div><br></div><div>It comes with an indexing server, a web frontend for managing picture uploads, a FUSE driver to mount file and directory schema entries, and support for syncing to the cloud. It will work with both small and large files, and is especially optimized for things like VM images. Large files are typically split into many small blobs, and thus localized mutation will affect only a small number of blobs. Also since the blobs are quite dumb, we can distribute and sync them across systems without worrying about their higher meaning.<br>
<br></div>The whole project is written in GoLang and there is active development happening. The overriding goal of the project is to have a storage server where all our digital data can be dumped into, on top of which complex content management systems can be built. This project is part of the Indieweb movement where privacy and control of our data are fundamental principles. (<a href="http://www.wired.com/wiredenterprise/2013/08/indie-web/">http://www.wired.com/wiredenterprise/2013/08/indie-web/</a>)<br>
<br></div><div>The project is in active development, and even though I wouldn't recommend it for any kind of serious use yet, it should mature soon and would be something to watch out for.<br><br>--<br></div><div>Jasim A Basheer -- <a href="http://nilenso.com">http://nilenso.com</a><br>
</div><div><a href="http://twitter.com/jasim_ab">http://twitter.com/jasim_ab</a><br></div><div><div><div><div><div><div><div><div><div><div></div></div></div></div></div></div></div></div></div></div></div><div class="gmail_extra">
<br><br><div class="gmail_quote">On Wed, Sep 11, 2013 at 3:07 PM, Riccardo Tacconi <span dir="ltr"><<a href="mailto:rtacconi@gmail.com" target="_blank">rtacconi@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div dir="ltr">Hi,<div><br></div><div>As you said perhaps it does not exist and I think it doesn't. They should realise that they need a bespoke CMS. I would suggest to create an open source project and make the CMS public so it could become, in the near future, an Open source JSON CMS :-) </div>
</div><div class="gmail_extra"><div><div class="h5"><br><br><div class="gmail_quote">On 11 September 2013 10:31, Ian Kynnersley <span dir="ltr"><<a href="mailto:iankynnersley@gmail.com" target="_blank">iankynnersley@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Thanks for all the useful responses. I'll definitely look into Active Model Serializer. <div><br></div>
<div>Most of these replies rely on me creating a bespoke model structure in code which is what I'm trying to avoid. Parse and Helios look interesting but don't give me the admin interface that I need to allow totally non-techie users to be able to manage the content themselves.</div>
<div><br></div><div>What I'm after would be a library that I can install in my app (or something hosted like Parse / Helios) that instantly gives me my CMS. Something a bit like Radiant maybe. I would then want to create my model structure within that CMS such that admin users could add, remove and update information easily. However, unlike a normal CMS which would render the output as a website with some templates to alter the look and feel, I want it to provide a JSON API. </div>
<div><br></div><div>The reason for all of this is that ownership of this app will be handed over to a different company and they are (rightly) nervous about taking on a completely bespoke application rather than a customised version of an off-the-shelf product.</div>
<div><br></div><div>Perhaps I am looking for something that doesn't exist so your thoughts are all very useful.</div><div><br></div><div>Thanks again</div><span><font color="#888888"><div>Ian</div></font></span></div>
<div class="gmail_extra"><br><br><div class="gmail_quote"><div><div>
On Wed, Sep 11, 2013 at 3:20 AM, Tejas Dinkar <span dir="ltr"><<a href="mailto:tejasdinkar@gmail.com" target="_blank">tejasdinkar@gmail.com</a>></span> wrote:<br></div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div><div>
<div style="word-wrap:break-word"><div><div><div>On Sep-11-2013, at 7:02 AM, Nick Novitski <<a href="mailto:nicknovitski@gmail.com" target="_blank">nicknovitski@gmail.com</a>> wrote:</div><blockquote type="cite">
<div dir="ltr" style="font-family:Helvetica;font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;text-align:-webkit-auto;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px">
There's also<span> </span><a href="https://github.com/rails-api/active_model_serializers" target="_blank">https://github.com/rails-api/active_model_serializers</a> </div></blockquote></div><div><br></div></div>+1 on Active Model Serializer.<div>
<br></div><div>Benefits:</div><div>1) Easily testable, and OO</div><div>2) Has access to current_user (or any other controller method via `scope'). This makes it possible for you to serialize based on who has requested the object</div>
<div>3) Works seamlessly with respond_with </div><div>4) If you have the same relation object multiple times on your object (say user can be created_by, updated_by, etc…) then you have a way to just `embed' the user once.</div>
<div><br></div><div>Also, +1 on rails-api gem as well :-)</div><div><div>
--<br>Tejas Dinkar<br><a href="http://www.nilenso.com" target="_blank">http://www.nilenso.com</a><br>Nilenso Software (formerly C42 Engineering)<br>
</div>
<br></div></div><br></div></div><div>_______________________________________________<br>
Chat mailing list<br>
<a href="mailto:Chat@lists.lrug.org" target="_blank">Chat@lists.lrug.org</a><br>
<a href="http://lists.lrug.org/listinfo.cgi/chat-lrug.org" target="_blank">http://lists.lrug.org/listinfo.cgi/chat-lrug.org</a><br>
<br></div></blockquote></div><div><br><br clear="all"><div><br></div>-- <br>
<br>Ian Kynnersley<br><a href="http://iankynnersley.co.uk" target="_blank">http://iankynnersley.co.uk</a> | <a href="tel:%2B44%20%280%29%207973%20420%20829" value="+447973420829" target="_blank">+44 (0) 7973 420 829</a> | <a href="http://twitter.com/kpopper" target="_blank">http://twitter.com/kpopper</a>
</div></div>
<br>_______________________________________________<br>
Chat mailing list<br>
<a href="mailto:Chat@lists.lrug.org" target="_blank">Chat@lists.lrug.org</a><br>
<a href="http://lists.lrug.org/listinfo.cgi/chat-lrug.org" target="_blank">http://lists.lrug.org/listinfo.cgi/chat-lrug.org</a><br>
<br></blockquote></div><br><br clear="all"><div><br></div>-- <br></div></div>Riccardo Tacconi<br>Ruby on Rails and PHP development - System Administration<br><a href="http://www.virtuelogic.net/" target="_blank">VIRTUELOGIC LIMITED</a><br>
<br><a href="http://github.com/rtacconi" target="_blank">http://github.com/rtacconi</a><br><a href="http://riccardotacconi.blogspot.com" target="_blank">http://riccardotacconi.blogspot.com</a><br><a href="http://twitter.com/rtacconi" target="_blank">http://twitter.com/rtacconi</a>
</div>
<br>_______________________________________________<br>
Chat mailing list<br>
<a href="mailto:Chat@lists.lrug.org">Chat@lists.lrug.org</a><br>
<a href="http://lists.lrug.org/listinfo.cgi/chat-lrug.org" target="_blank">http://lists.lrug.org/listinfo.cgi/chat-lrug.org</a><br>
<br></blockquote></div><br><br clear="all"><br>-- <br><div dir="ltr">Jasim A Basheer -- <a href="http://twitter.com/jasim_ab" target="_blank">http://twitter.com/jasim_ab</a><br><br></div>
</div>