diff roadmap.txt @ 0:e3823be6a423

initial commit of bitsyblog, from https://svn.openplans.org/svn/standalone/bitsyblog/trunk/
author k0s <k0scist@gmail.com>
date Sat, 12 Sep 2009 16:06:57 -0400
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/roadmap.txt	Sat Sep 12 16:06:57 2009 -0400
@@ -0,0 +1,208 @@
+bitsyblog, middleware, and the roadmap to the future
+
+the nice thing with working like software like bitsyblog is that the
+intent of the software is clear.  bitsyblog aims to provide a solution
+for users to keep a log of their activities on the web.  When thinking of
+software in terms of the narrow intent of a component, it becomes much
+easier to divine what sort of framework would look like around it and
+how this framework might be applicable to other types of software.
+
+Firstly, I noticed that the bitsyblog component app is not as small as
+it could be.  bitsyblog provides a multi-user solution to (personal)
+blogging.  This level of solution should exist, but thinking in terms
+of components it is easy to see that users may want a personal blog
+that is not multi-user.  lammy wants a blog on his desktop computer.
+When at his computer, he probably wants to be logged in all the time
+(always accept connections from 127.0.0.1).  He doesn't want other
+people to be able to make a blog there.  When not at his desktop, he
+wants to be able to login and post through the web and maybe used the
+blogme.py script too. In bitsyblog terms, '/lammy'
+becomes '/' and all urls ('preferences', 'post', 'css/') become
+relative to this.  Doing this involves separating out the individual
+blog components from the multi-user component and probably having
+different .ini files from which to run paste.
+
+I've also realized that the way I handle CSS is a solution to a
+problem that has nothing to do with bitsyblog.  The other items in
+preferences ('date', 'subject', but not 'friends' which has to do with
+roles) are about formatting the blog posts.  The CSS is about themeing
+pages which has nothing to do with blog posts.  So what is needed is a
+CSS component, which is possibly linked to from the preferences page.
+Lets put this at '/lammy/css'.  This pages may have the fields for
+preferences, but also provides an interface for managing the CSS.  A
+user may want to delete CSS or edit them, render the current page with
+a selected stylesheet or what's in the editor, or render an arbitrary web page
+This is like CSS zen garden, but more interactive, and
+(optionally) allowing the user to save the CSS and apply it to their
+pages.  I can also imagine, in a 2.0 version, an implementation that
+allows permits transforming of CSS to suitable to theming a page with
+a stylesheet intended for another page.  One has a stylesheet with a
+bunch of rules.  Using javascript, one mouses over the DOM of the
+other page.  The rules are modified in order to applied to the
+appropriate container on the page.  This sounds much like what
+deliverance is supposed to do, and maybe it could be utilized for this
+intent, though perhaps the intents are different and its better not to
+use it (to be investigated).
+
+Both of the above components fall into a general pattern:  there is a
+component which is the multi-user blog manager.  Lets call this
+bitsyblog.  There are microcomponents, the single-user blog (lets call
+this microblog) and the CSS zen garden component which lets you play
+with stylesheets (I dub thee samadhi).  microblog and samadhi can live
+on their own, in which case they live at '/', or they might be managed
+by an external component -- microblog by bitsyblog, or samadhi
+by...not really sure, either a microblog instance or bitsyblog.  In
+the latter case, they need to know where they live.  I'm not sure what
+provides the rewrite rule telling them where they live.  Ian?  Ethan?
+There are a few configuration type details -- like auth, whether
+samadhi needs to know about where to put these CSS files or how
+bitsyusers can fetch them, but essentially if you give these the
+appropriate path, they should be able to work relatively
+independently.
+
+In a different class of components are comments and tagging.  While it
+is easy to imagine bitsyblog managing comments and tags, it is also
+fairly easy to see that these services really don't need to know what
+is being commented or tagged on.  For commenting, I imagine an app
+similar to smokesignals, but with a different persistence model.  Lets
+call it commentator.  Commentator is a javascript app with no
+intrinsic URLs.  Given a set of rules (for instance, "allow commenting
+on <div>s with an id attribute) a block of text is shown as the last child
+of each <div> (or conditionally on mouseover).  This will initially
+say something like "No comments | Add a comment" where each of these
+do what you think ('N comments' displays the comments, 'Add a comment'
+gives a textarea where you can say your mind).  When a comment is
+added, it is put in a database (presumedly SQL, though really on a
+super-simple db is necessary) with the URL and/or id
+as its key.  When the page is loaded, the text of the page is examined
+on response and the appropriate comments are displayed.  It is also
+necessary to have some sort of mapping optionally between URL and id
+to another URI, as blog posts both are displayed as part of the user's
+entire blog and also have a unique URL.  Notice that nothing here is
+particularly unique to blogs.  Commenting on <div>s or <p>s in a wiki
+page is essentially the same (though in this case, it might be better
+to comment on the entire page, as these may not have ids and the page
+can be editted all willy-nilly like that.  Commenting on individual
+<p>s and <div>s is, however, a really nice thing to have, so in a 2.0
+type incarnation of commentator, this should be added regardless of
+the difficulty).  If bitsyblog was part of a
+site with a wiki, then commentator could deal with them both nicely.
+Optionally, one might specify the rule that if an item had comments,
+it either could not be deleted or that an alert would pop up before
+deletion with [Confirm] and [Cancel] buttons.  This is easy to do if a
+browser could do a DELETE request and things behaved all RESTful.
+Otherwise, this would also be a non-trivial problem.
+
+Tagging is very similar to commentator, though it might have a few
+intrinsic URLs too.  You specify a similar set of rules concerning
+what can be tagged ("all <div>s with ids in /%(user)s/ and
+/%(user)s/200*") and a method pointing the ids to URLs.  Then you have
+a database, which again is pretty simple and again in its simplest
+form could be a dictionary.  Though here, the tags are the keys and
+the URLs are the values.  You could also record number of tags per
+item, specify whether non-authenticated members can tag, etc.  As the
+first or last child of each (say) <div>, you have what it has been
+tagged with, maybe weighted by how many times it has been tagged.  You
+have a URL for searching by tags, maybe on a per-path basis ("I want
+to see all the tags under /k0s that have been tagged with 'cats' and
+'cute'").  You could also have a URL for the tag cloud.  Again, what
+is being tagged is pretty divorced from the tagging component itself
+(lets call it tagit, unless that name is taken).
+
+I have presented samadhi as being managed by bitsyblog or microblog
+and commentator and tagit living outside of bitsyblog in the
+middleware stack.  I've done this because this "feels right" to me
+right now, though I reseve my right to change my mind about it.  The
+thing I want emphasize is the difference in the two approaches:
+
+* When a WSGI app is "managed" by another component app, the manager
+  has to know about the managed app and dispatch the appropriate
+  information (request, etc) to it, though in doing so it has the
+  opportunity to have more control over the URL structure and what the
+  component app does.  It is also easier to return HTML this way.
+
+* When a WSGI "app" is used as middleware and needs to markup the
+  returned page in HTML, this is conducive to using javascript in
+  order to insert nodes into the DOM dynamically, presumedly based on
+  some rule set.  Alternatively, the middleware may decompose the page
+  with lxml and insert HTML where it needs to go that way.  In this
+  approach, the middleware need not have a URL (this may be
+  preferable).
+
+It is not necessarily clear to me at this time which approach is
+better for different apps.  I have put commenting and tagging in the
+latter category because commenting and tagging on web pages seems
+divorced (save by a rule set) from what is being commented on or
+tagged.  I have put microblog in the first category because it is
+clearly in the same layer of software as bitsyblog, and some
+management tasks will be necessary even for microblog.  samadhi I put
+in the first category as well (though I hesistate right now) because
+otherwise the rewriting of URLs makes me nervous.  Perhaps there is
+need of a WSGI dispatcher that fetches apps based on some sort of rule
+concerning the URL?  Also, it seems
+necessary to put the CSS on user data.  This could also be
+accomplished the other way:  1. abstract out members and roles
+(teamroler?) and store the data (CSS, etc) on them here; 2. have
+samadhi write a defined set of urls (how defined?  not sure) including
+the stylesheets that it knows about, presumedly putting the 'foo'
+stylesheet at '/lammy/css/foo.css'.  This still involves samadhi
+knowing something about the url structure, and now it is dependent on
+the user/role thing, though this could be a configuration option.
+
+This is the middleware story.  Other things could also be done
+internally to bitsyblog and its supporting software to make the
+experience more seamless.  
+
+I am bothered by the fact that the logic supporting the form and user
+settings is somewhat divorced.  Ideally, rendering the form should do
+all the validation and return the settings in a sensible way to use.
+I don't think this is hard -- the settings.py should just be
+incorporated into markup.form.  This goes some ways to reinventing
+things like formencode and zope.schema, so if we can get these to do
+what we want, maybe we shouldn't write our own.  But at cursory
+glance, formencode won't and zope.schema isn't easily usable outside
+of zope.  So maybe rolling our own isn't bad.
+
+There's more middleware, but its hidden and is a bad coupling (that
+is, the app will depend on the middleware unless its done cleverly).
+The site nav does not appear on '/login' or '/join' (or any url not
+specified internally to bitsyblog, for that matter).  It would be
+conceivable to have a SiteNav middleware that (either through
+javascript or lxml decomposition) writes the site nav at the top of
+the screen.  bistyblog and bitsyauth would have to know about this
+though, so that they could add the relevent links into environ.  Maybe
+this isn't horrible, but it seems so.  Likewise, the site css doesn't
+show up here.  Should it?  Is this another piece of middleware or part
+of samadhi?
+
+An important piece of middleware should involve members and roles.  I
+really don't want to write this one, but I would like to consume it.
+It should live just inside of bitsyauth and make the users.py file
+unnecessary.  It might be better to sit on this one until last.
+
+So should be bitsyblog 2.0.
+There are a few other streamlining things (see the TODO.txt), but if
+all of this was implemented, bitsyblog would be a rich web experience
+that was highly componentized with each of the components doing one
+thing well.  Moreso, since coupling is avoided, save through
+configuration, auth, and other loose links, each of these components
+could be used independently of bitsyblog or turned off without
+undesirable consequences.
+
+At least as much as being a good blogging app, bitsyblog is about
+elegant design and component architecture.  This roadmap shows what is
+possible in terms of having a fully functional blogging application
+with middleware that can be used outside of just bitsyblog.  To take
+the other end of the spectrum, wordpress says "Hey, write plugins that
+will make me work better."  As a programmer, I really hate this
+approach.  If I write a commenting plugin for wordpress, then I have
+just that.  If I want to use it to comment on a wiki page, I'm out of
+luck.  If I write commenting middleware, then it can be used for any
+WSGI app with minimal configuration.  As a programmer, I generally
+want the freedom to assemble a webapp however I want.  With this
+freedom comes some work, but for me its a worthy sacrifice.  As a web
+consumer, I understand that site administrators want out of the box
+solutions.  bitsyblog will offer this too.  The default deployment of
+bitsyblog will pull down commentator, samadhi, and tagit and have an
+.ini file pointing to the appropriate factory to create the chain of
+middleware to have all of these pieces in place.  There is no contradiction.