Fully supported hosted Eduglu is coming! | Eduglu — Drupal Social Learning Platform

I haven’t had a chance to check it out since the initial announcement, but it looks like it’s progressing nicely. A social network application built entirely using Drupal and a set of modules.

[Eduglu Alpha 2](http://eduglu.com/sites/eduglu.com/files/eduglu_release/eduglu-1-0-alpha2.tgz) is available now. I’ll have to grab a copy when I’m back in the office next week…

Now, how to reconcile this with my disdain for the concept of the PLN? Because Eduglu isn’t claiming to be the whole widget. It’s a way to connect various sources of content, published by various people, distributed across the internet, and then use that in the context of a class. Where the magic really happens.

from *[Fully supported hosted Eduglu is coming! | Eduglu — Drupal Social Learning Platform](http://eduglu.com/)*

on the (lack of) usability of rich text editors in Drupal

I’ve been using Drupal to power websites for several years now, since 4.6 was the latest and greatest. One of the constant, ongoing, relentless complaints from our users has been that Drupal is (or seems) too complicated. It seems hard to use. It takes some care and feeding to initially set up a site. For example, when installing Drupal and creating a site, there is no option to have a rich text WYSIWYG editor, out of the box. Sure, übergeeks would rather gnaw off their paws than use a rich text editor, but Real Live Humans™ need them. They need to be able to edit text visually, and to upload and embed media, without having to follow recipes or read through pages of instructions.

I’m in the process of setting up a new website for a prof, so she can use it with her 200 students as a collaboration hub. Setting up the site (Drupal 6) took maybe 5 minutes. Installing extra modules like Organic Groups and Views? Maybe another 5 minutes. The site is working pretty much perfectly, about 10 minutes after starting to set it up. Yay, Drupal.

Except, I can’t get a rich text editor working the way the students will need it. They need to be able to just start typing, and to upload, resize, and embed images. I’ve got the wysiwyg-api module installed (and why in hell does it not INCLUDE an actual rich text editor? seriously.) and have been farting around with various image-assist and image-api and image-embed and image-etc… modules to get an “embed image” function working. And I can kinda/sorta get it working, as long as I can expect students to be geeks. But they’re not. We need a nice, simple, clear “upload image” button as part of the rich text editor. And that’s just plain not working.

Interestingly, while writing this blog post, the WordPress “Upload/Insert” media bar above the text area is exactly what I need in Drupal. I can’t just use WordPress, because I need to use the collaboration features offered by Organic Groups – and that’s just not possible with WordPress.

So, although I got the skeleton of the website up and running in about 10 minutes, I’ve been farting around for 3 hours now, trying to get a fracking “upload/insert media” function working at the level that will be required by the students. I’ve almost got it working, but the result is something only a geek would really use. And a geek wouldn’t be using the WYSIWYG editor in the first place.

Why in hell is a fully functioning rich text editor not included with Drupal Core? And why in hell is it not as fully featured as the WordPress one, with media uploading and embedding? I’d be willing to bet that the addition of a functional WYSIWYG editor would go a LONG way toward improving the perception of usability of Drupal. Heck, WordPress is GPL – just yank the one they use…

work with the tool, not against it

I have a recurring pattern when implementing a project. I start simple. Then things get complex. Then I start overthinking, overdesigning, overengineering things. And they start getting really, really cumbersome, awkward, and unmanageable.

I’ve done this with every development platform I’ve used. WebObjects. Rails. PHP. WordPress. Moodle. Drupal.

Yes, even Drupal.

So, again, I need to remind myself.

Work WITH the tool.

NOT against it.

Or, if you’re working too hard, you’re doing it wrong. If things are designed properly, using the most appropriate approaches, more often than not things become quite simple. Easy, even. If something isn’t easy, it’s being done wrong.

If you’re writing a bunch of custom code, you’re probably heading off on a blind alley. Chuck the custom code and find a shared framework, module, plugin, etc… that will do the job. The less code you write, the less to debug and maintain.

caution lights

I’m working on a website for an agency, where I’m building a system to manage the data and daily operations of a 100-person organization. I’d started writing custom code to embed snippets of processed data. I was writing code to chunk data into reporting periods, grouped by staff member, client, and any number of other criteria.

But – Views already does that. When combined with other modules like Calendar to provide the date-based chunking. And some other helpers to expose UI widgets and data selectors.

So, by working WITH the tools at hand, I just dumped a bunch of silly custom code. I’ll need to refactor a bunch of stuff, but it will work much better in the long run, and take MUCH less to maintain.

The biggest thing I have to do at the moment is refining the data entry process – I need to find the best date selector widgets to make the process as painless and error-free as possible when in use in the field.

Trying Mollom antispam

I’ve been having a fair number of spam comments get tgrouh the filters on my blog. I’ve tried Akismet. I’ve tried SpamKarma2. I’ve tried Akismet AND SpamKarma2. Still, I get over a dozen spam comments published on my blog every day (and hundreds successfully killed by the filters on a typical day).

It doesn’t sound like much of a problem – a dozen or two spams to deal with every day – but it makes keeping a blog with open comment posting more tedious than it needs to be. I shouldn’t have to fear leaving a computer for extended periods of time, nor dread returning to connectivity after a couple of days to sift through the crap that got through (and hopefully not accidentally nuke any valid comments).

So, it’s time to give Mollom a shot. I’ll try it for a week to see how it works out. It’s free. It works with WordPress (and Drupal, and several others) and claims to be quite effective.

Update: wow. I know it’s waaaaay too early to tell, but in the hour since enabling Mollom, I’ve had ZERO spam get through. 26 attempts blocked already, and no moderation needed. That’s a VERY good sign.

Update 2: jinx! as soon as I posted the first update, 3 spamments got through. doh…

Creating a custom compound field for CCK

I’m working on a project that partially involves the development of a website in Drupal to act as a directory of people who have graduated from a given University. Seems easy. I went into the project thinking it would be a trivial application of Taxonomies, or maybe some generic CCK fields.

Nope. Turns out the problem is much more difficult and complex than I initially thought.

Taxonomies won’t work, because of the need to tie a number of values together, namely the year the degree was awarded (say, “1992”), the type of degree (say, “BSc”), the specialization of the degree (say, “Zoology”), and the granting institution (say, “University of Calgary”).

That could be an easy thing to solve with CCK – just add four text fields. Done.

BUT – people can earn more than one degree. Of different types, in different years, from different institutions.

Taxonomies fail. Generic CCK fields fail.

What I came up with is a new CCK field type, cryptically named “University Degrees”, that defines the four values that describe a degree. This solves the problem quite tidily, and supports multiple values, predefined valid sets of values, and can integrate with Views to be used as filters and sorting fields.

In building this module, I leaned heavily on a couple of web pages (CCK Sample and What is the Content Construction Kit?) that describe how parts of the module should work, and provided some sample code. In the spirit of contributing back what I learned, I’m going to document the module to help others needing to do similar things.
Continue reading “Creating a custom compound field for CCK”

complex hierarchical taxonomies in drupal?

I’ve been struggling with this problem for some time now, and am a bit stumped. Bits of it are trivial to solve, but when I start hooking things up, there’s a pretty big gap and disconnect.

On the surface, it’s a simple problem. I’m using Drupal, and am building a website to store things like profiles for individuals. That’s easy. I need to add lists of the degrees they’ve been awarded. Like this:

D’Arcy Norman

  • Bachelor’s of Science, 1992 (University of Calgary)
  • Bachelor’s of Education, 1994 (University of Calgary)

Sounds easy. Could just be a CCK content type, with a text field that allows multiple values. Enter whatever text you want.

buuuuut…

I also need for the site to be organized such that I can list everyone who’s earned a BSc in Zoology from UCalgary, or everyone that’s earned a Bachelor’s Degree in 1992, or just people who have earned a BEd from UBC in 1998. Or potentially any combination or permutation.

So, simple text fields don’t cut it. They solve the display problem but not the data modeling and querying problems.

Taxonomies seem like the natural way to store the data – I can set up a Taxonomy vocabulary to represent the full hierarchical structure that is needed.

The problem with a hierarchical taxonomy is that I can’t seem to get it to actually display the hierarchy, with the full lineage shown. On the node display page, I get something like this by default:

First, that shows all terms from all vocabularies. In this case, “calgary” and “ucalgary” are from the Tags vocabulary, and “Bachelors” “Education” and “Science” are all from the Degrees vocabulary. Except they’re all munged together. And the hierarchy is completely gone.

With a bit of custom code, I can separate the vocabularies, like this:

Getting closer. But the hierarchy is still gone. I can’t get it to show something like:

Degrees:

  • Bachelors > Science
  • Bachelors > Education

The specifications call for the end result to look similar to this:

And there’s perhaps an even bigger problem – I can’t associate a year or institution with the degree. Under this strategy, there is no easy way to say Bachelors > Science (University of Calgary, 1992) and have the data be stored in such a way as to be properly searchable and meaningful as opposed to be essentially for display purposes only.

The other thing I’m hitting my head against is the need to keep data entry as simple as possible. Some really nicely designed forms have been sketched out with ease of use as the primary concern. But they’re going to be pretty darned difficult to implement in Drupal without writing custom modules. If ease of use wasn’t such a big concern, I could probably just use text fields for display so I could enter whatever text I wanted to represent the degrees, and have a set of Taxonomy vocabularies to be used to represent the data for querying and filtering. But that’s redundant data entry, and would be very confusing to anyone actually entering the data.

One other idea I had was to model institutions and degrees as nodes (using a custom content type) and use the node relation CCK field to tie it together. That could work, and we’ve used that technique on other projects (like the Great Teachers website) but I’m not sure that’s the best angle to take in this case.

Any Drupalistas out there with some ideas on how to properly represent multiple bits of hierarchical data to store and display things like sets of degrees granted in given years by given institutions?

EduGlu Screencast

I just recorded a (very) quick and dirty screencast to demo the EduGlu sandbox prototype that was put together in Drupal. It’s a 23 minute session, and clocks in at 28 MB. I probably rambled a bit more than I should have, but you’ll get the idea…

(The Anarchy Media Player displays a smallish video embedded on this post, but you can download the video to view at 640×480 if you want to try to read the tiny text in the screencast)

EduGlu Screencast

Download EduGlu Screencast

on eduglu – part 1: background

EduGlu is a concept that came out of some discussions at Northern Voice 2006 – almost exactly 2 years ago – as a way to make sense of an individual’s distributed content in the context of a course. The problem is on one hand very simple – a person publishes a bunch of stuff, and all they need to do is pull it into a course-based resource. On the other hand, it’s really quite hard – how can software provide what appears to be a centralized service, based on the decentralized and distributed publishings of the members of a group or community, and honour the flexible and dynamic nature of the various groups and communities to which a person belongs?

EduGlu Distributed Content

EduGu WhiteboardOne of the problems I’ve had with the EduGlu concept over the last 2 years is actually a problem that is pretty common in software development – I was overthinking things. By several orders of magnitude. My initial response to EduGlu was to start drafting database schemas, planning out code and applications, and to think about building the perfect course-based aggregator system. This overthinking went on for awhile, with an evolution and streamlining of the schemas and plans for the application. A project was set up on EduForge to act as the repository for the code that would be developed.

I realized that for this concept to be sustainable, it shouldn’t be a custom application. An “educational application” for this wouldn’t work. I started looking at every application as a possible way to implement the EduGlu concept. I played with Drupal and Aggregator2, but it wasn’t quite ready for prime time. I thought, maybe Elgg? Not quite.

Then Bill Fitzgerald recommended a more robust feed aggregator for Drupal, and things started clicking into place. That was back in May of 2006. It didn’t quite work, and wound up getting shelved for awhile.

In February 2007, at Northern Voice once again, the idea of EduGlu got tossed around by a bunch of people hanging out after the conference. It was generally agreed that there was something to the idea, but that it was too nebulous and ill-defined to make much sense at the time. WHAT. IS. EDUGLU? I played with Yahoo Pipes as a possible implementation. That didn’t work out very well. It wasn’t flexible enough, and didn’t provide enough control to each individual.

In May 2007, I started playing with BlogBridge Feed Library. It’s a very cool directory application, and I installed a copy of it on a server to experiment with it as an EduGlu implementation. It worked pretty well, with users able to add feeds to groups, and tag them as needed. It imported and exported OPML, and provided a web interface to view the feeds in case someone wasn’t using their own aggregator. It was close, but the workflow wasn’t quite there – user management wasn’t advanced enough to scale to the size of a large class or institution, and the concept of directories/folders/libraries was a bit inflexible for what EduGlu would need. It’s perfect for a relatively static directory, but for something where students may be adding and dropping feeds on a regular basis, and adding them to multiple contexts, it didn’t quite fit the bill.

Fast forward a few months, and Bill Fitzgerald is at it again. This time, he posts a full recipe for building a flexible feed aggregation application using Drupal and the much more robust FeedAPI aggregation management suite of modules. Very cool stuff. He’s got the aggregation stuff nailed.

Then, I start thinking about how we’ve been successfully using Drupal to power the websites for some active and dynamic course-based communities. The thing that is different on those websites is that they allow members to form their own groups at will. To create, join, and leave groups all on their own, without interference from any institutionally mandated concept of classes or departments. This is enabled by the incredible Organic Groups module for Drupal. Getting closer, but still not quite there.

And then Cole Camplese kicked things into high gear by posting a link (was it on Twitter?) to a site his group worked up to integrate feed aggregation and social rating. It let students rate the aggregated items ala Digg, and that rating data is used to determine importance of the aggregated content.

Bingo.

The magic combination of features for EduGlu are:

Aggregation of feeds + Groups + Social Rating + Tagging

Plugging all of these concepts together results in a workflow that looks something like this:

EduGlu Content Flow

Students add feeds to the system, placing them in any relevant groups, and tagging the feed appropriately. Items from these feeds are then aggregated, inheriting the feed’s tags and group settings. Students are able to view the incoming content in any (or all) of their groups at a glance, and apply social rating to sort and rank the items – items ranked over a threshold are pushed to the front page of the site. Tag clouds are generated, allowing easy browsing of content. And a full search engine is available, providing some pretty fully featured data mining tools. The aggregated items are archived for as long as needed, and discussion can occur within the context of the EduGlu website rather than being spread across dozens/hundreds of blogs and other applications scattered around the web.

The beauty of this implementation is that it involved no custom code. I didn’t write a single line of code. All I did was integrate a set of off-the-shelf modules for Drupal. This is all generalizable and re-implementable in any number of various ways.

Eduglu and the aggregate social tag cloud

I’ve been monkeying with a Drupal site that looks like it could fulfill most (even all?) of the mythical Eduglu concept – a website that aggregates all feeds published by students in a class/department/institution, and helps contextualize them in the various groups/cohorts/courses each student participates in. It’s getting really close – it can currently suck in all kinds of feeds, auto-tagging items, and even lets students create their own groups and associate feeds with them. There are issues, to be sure, mostly with respect to honouring the original tags in the aggregated items, and with taking advantage of the social rating system added to the website, but it’s so close I can taste it.

At the moment, there are almost 1200 items aggregated from feeds published by 19 users. It’s only been running for a week, so that’s not a bad start…

One added bonus of using Drupal for this, is that I can drop the Tagadelic module into place to generate a tag cloud representing all aggregated items’ tags. Here’s the tag cloud from the current prototype site:

Eduglu Tag Cloud

Just seeing that aggregate cloud makes me smile. I’ll have to work on things like adding a group-only tag cloud, and maybe a tag with date parameters (which could be REALLY useful to build a movie displaying the shifts in tag weights over the course of a semester or year…)

As an aside, I’m pretty sure that this is the first post that I’ve added to all of the main categories of my blog: General, Work, and Fun. I’m pretty sure there’s something to that…

Recipe for building a Drupal-powered blogging community website

I worked with our Faculty of Education to build a community blogging website for use by after-degree student teachers as part of their personal/professional development, reflection, and collaboration process, as well as to collect materials for use in ePortfolios. They had a set of pretty simple constraints. Because the student teachers would be writing about activities in the K-12 classroom, and likely would be posting media (photos, videos, etc…) they needed to restrict access to the site – there could be no public access to this content. Additionally, they needed to control with a fairly fine granularity which individuals within the community would be able to see specific pieces of content. Because of these constraints, we couldn’t just load up WPMU and set them free, nor could we just point them to WordPress.com or Blogger.com. What to do…

Drupal, of course. It’s got a blogging module available out of the box (it takes a checkbox to enable it). OK. Blogging is taken care of. Members just have to click “Create content” and select “Blog post”. Easy peasey.

Want to allow members of the community to create their own groups? Organic Groups. It’s amazingly flexible, and has an added bonus, in this case, of also enabling access control to content based on group membership (after enabling Organic Groups, go to the settings page for the module and enable “Access Control”). Meaning that the student teachers could create as many private group contexts as they like, and then grant access to their content to any of their groups (and only those groups) if desired. Very powerful stuff.

OK. So now we have a bunch of student teachers blogging their brains out. That’s a lot of content to keep track of. Their professors and practicum teachers need to keep up on all of the relevant posts, and provide feedback in a timely manner. How to provide tools to let individuals track content that they’re allowed to see, that they haven’t seen yet, and that they need to respond to… Views. Drupal’s Views module is killer for this. It’s basically a database query generator, where you can provide a set of criteria to filter content, and create a display on the website. So I created a couple of handy views to help people keep up.

The first view was a simple “all content that has been posted to any of your groups, sorted in reverse chronological order” – this is the “river of news” display, which meant that members didn’t have to go hunting through their various groups (some had over a dozen group memberships) to find new content. It’s all merged, sorted, and presented to them on the front page of the site. This let members keep their fingers on the pulse of the community – they could see at a glance what was being published in all of the groups they cared about. This view also displayed the number of comments (and any new comments were flagged) so people could easily follow up on conversations.

The second view was intended to help members keep up with new content – essentially an “inbox” to be used by professors and teachers. This view was a clone of the first “river of news” view, but only displayed unread items. As a professor viewed a blog post, it would get dropped out of this view for them.

We also used the Book module to create documentation on the site (how to use the site, as well as pages with links to other resources, an FAQ, etc…) and we enabled the Forum module to create a separate non-blog discussion board within the site (but this never really got used much…)

That’s really all there is to it – Drupal just handles the rest, and once it’s configured it takes very little care and feeding.

Here’s the stuff we used (the site was built a year ago on Drupal 4.7, but I’m listing what would be used as of the current Drupal 5.3):

I’ll try to revise this post to clarify stuff as needed, but this is the basic recipe. The best thing to do is just start downloading and playing…