/*
* A compilation of comments from CCNMTL's software developers.
* These reflections are rooted in our professional and personal experiences
* developing educational technology. This blog is directed at hackers,
* designers, and architects of all flavors, but everyone is welcome.
*/

DjangoCon '12 is on the East Coast this year, and we submitted a proposal to present on our recent intervention in South Africa. We hope to see you in DC!

Title: Offline and Off-Road: Django, Health and Human Rights

Description: For years, CCNMTL has been using Django to create interactive multimedia health interventions. We'll spotlight our latest NIMH-funded project where we deployed Django to offline netbooks at South African HIV clinics, and developed a sneakernet-based (ie USB drives) data synchronization protocol. We'll also present our FOSS CMS for authoring these ebook-like sites.

Abstract: For years, CCNMTL has been using Django to create interactive multimedia health interventions as a part of our Triangle initiative. We have worked closely with the Schools of Social Work and Public health to explore the possibilities and benefits of incorporating rich, interactive, multimedia into these kinds of counseling sessions.

In this talk we will spotlight Masivukeni, our latest NIMH-funded project where we deployed Django to offline netbooks at South African HIV clinics, and developed a sneakernet-based (ie USB drives) data synchronization protocol.

As we iterate over projects like these, we have continued to abstract the aspects of these projects that are idiosyncratic to this domain. We'll also present our open-source lightweigth-CMS that we have created for authoring these ebook-like sites. The characteristics of these sites are serial content delivery (often with specific business rules, such as preventing access to already-seen, or not-yet-seen pages), interspersed with casual learning "games" (eg html5/javascript drag and drop activities).

Finally, we will discuss the roadmap for this authoring tool, including the possibility of a networked, collaborative ebook authoring tool, that might export epub3 or SCORM-compliant sites.

At CCNMTL we focus on pedagogical innovation, but we continue to work on projects that involve delivering static educational materials in traditional sequential formats. We work hard to carve out places for study in a world of instruction, but there is plenty of important knowledge that people want to acquire, and training people on skills continues to be an important component of education and often a precondition of concept formation.

In many of our projects, we've explored the boundaries of what we call - "Serial Directed Learning Modules". The key properties of these projects include:

  • Nested, hierarchical, rich content with idiosyncratic navigation and access rules
  • Rich interactive activities (quizzes, drag/drop, planning, mapping)
  • Detailed reporting on the learner's performance and completion

In our partnership with the Columbia University Medical Center and our strategic Triangle Initiative we've worked on several multimedia behavioral interventions that conform to this delivery pattern. We've worked on direct interventions relating to HIV couples counseling, childhood diabetes and cavity prevention, treatment adherence, and we've developed directing learning modules for teaching practitioners about tobacco cessation, child abuse, and more.

While similar in the abstract, these projects vary in their devilish details. Some of these environments are mediated by a service provider, such as a social worker and their patient, while others are self-directed. Some require multiple modes with additional notes available only to the facilitator. A few lessons are completed in a single sitting, while others must preserve state and pick up where the learner left off.

We try to balance the effort of creating unique works of art with churning out boilerplate, cookie-cutter sites. We've explored the use of general purpose content management solutions (CMS) for these projects and are regularly stymied by the mismatch between these styles of interaction and the sweet spots of the CMS platforms we know well. CMS platforms are great for creating collections of random-access content, and organizing and relating it in a variety of ways. The business rules around the directed learning projects often left us wrestling with CMS environments, wishing we had developed them using a lightweight MVC framework, without as much overhead to introduce the customize workflows these projects demand.

After building of a few of these sites à la carte, we began to generalize our approach and developed the PageTree hierarchical menu-creation system for Django. PageTree evolved into an open-source lightweight, domain-specific content management system, and we introduced a modular architecture for embedding and assembling PageBlocks which introduces elements like text, media, or custom Javascript activities within pages. The source code for PageTree and a basic set of PageBlocks are available on our 'ccnmtl' github account. We have also released the code and content powering the childhood diabetes intervention - and it is available here.

As the demand for these sites has grown, we've recently created a system for "farming" these PageTree sites -- aptly named "Forest" -- that allows our project managers to very quickly set up their own PageTree sites (called "Stands") in order to get a skeletal site up and running without the bottleneck of overhead of developer intervention. You can see a self-documenting demo of Forest here.

This approach allows us to collect content as early as possible. The features can be developed around the content, instead of vice-versa. If the site requires custom functionality that goes beyond the generic features of the Forest farm, we can spin off an independent Django site from the Forest farm, and begin development at the onset with the site's content already in place.

This system helped us achieve a nice balance between customization and efficiency, and we are pleased with the flexibility this approach has enabled for this class of projects. We're in the process of conceptualizing a roadmap for PageTree sites, and have been imagining a collaborative authoring platform that supports versioning, SCORM authoring/publishing platform, BasicLTI compliance, and more.

For years, I’ve watched our video team do amazing work shooting, editing, and encoding video for the web. I think most production companies would be shocked at how much high quality work our team produces with so few staff, a tight budget, and tighter time constraints.

When I look closely at how they do what they do, I’m impressed and just a little frightened at how many manual steps are involved in getting a video online. Manual steps that take time, attention to detail, expertise, and are ripe for mistakes.

I try to automate everything I touch. I can’t help it. It’s the curse of being a programmer.

At CCNMTL most of our new Python projects are written in Django, but we still support a number of older projects that were written with TurboGears 1.0.4. They've continued to be stable, and we don't do a ton of new development on them, so it hasn't been worthwhile to upgrade them to newer versions of TurboGears.

But we do occasionally make changes to their code, and recently we've begun migrating them to newer servers.  So I recently spent some time updating their deployment processes to CCNMTL's current best practices:

  • Installation with pip instead of easy_install
  • Fully pinned local source distributions versioned alongside the code
  • No Internet access required anywhere in the deployment
  • Containment with virtualenv
I ended up with a package that you can use to create an isolated TurboGears 1.0.4 environment to run legacy projects in, or (if for some reason you want to) to create new TurboGears 1.0.4 projects.  You can get it on Github here: https://github.com/ccnmtl/turbogears_pip_bootstrapper

In this post I'll go into detail about what it does, and the hurdles I ran into along the way.

Earlier this week, I wrote about how to make virtualenv install pip and setuptools from local source distributions, instead of fetching unpinned copies of them from the Internet, which it does (somewhat silently) by default. The approach relied on a somewhat buried feature of virtualenv: looking for appropriate distributions in a virtualenv_support directory before downloading them.

In a future release of virtualenv, this will be easier, and also more apparent.  I submitted patches for two new features which were accepted by virtualenv's maintainers:

These new features are documented in the source here.  If you want to start using them now, you can fetch a copy of virtualenv.py from the "develop" branch: https://github.com/pypa/virtualenv/raw/develop/virtualenv.py