Aug 17 2006
Aug 17

Ernest has done quite a lot of experiments with his collaborative editor. Early on I've advised him early on to focus on the communication/collision detetection/... part as opposed to a new really fancy editor. In the ideal world his code should be mixed in with and editor of your choice, but that is a utopian fantasy.

At the moment the demo code is focused around a special node, but Ernest is working on removing the specialisation to eventually handle any form.

If you are reading this please try it (links follow) and give him comments, ideas, etc... Don't kill him though - the learning curve of the drupal apis is steepish. Help with ideas and bug reports works better.

the drupal groups page
how to test the module page a bit outdated, but the major points still valid (hint: look for the usernames)

Aug 04 2006
Aug 04

I strongly urge all Drupal developers to read through this paper on Postgres. This is a 15 year old design document from PostgreSQL’s predecessor, but there are many gems in this which apply directly to where (I think) Drupal is headed. I intended to write this up properly as an informal presentation, but it came up on #drupal today, so thought I might as well share it with everyone.

Jul 12 2006
Jul 12

In part 2 of their "Using open source software to design, develop, and deploy a collaborative Web site," IBM developerWorks has posted a great tutorial on analysis and design of putting together a website. I will probably use this in my writing for the web class in the fall.

Jun 26 2006
Jun 26

My town uses my code : the Ann Arbor District Library uses Drupal for their web interface, including my captcha module!

Jun 20 2006
Jun 20

D'Arcy notes that it has been one month since he's switched over from WordPress 2 to Drupal 4.7 and he's very happy with the change. In comparing the two applications, he writes,

I'd recommend WordPress for new bloggers, but I'd wholeheartedly recommend Drupal for people that want to take advantage of some of the more flexible content management stuff available in a higher-end app. Not a shot against WordPress at all - the two platforms serve slightly different (and complementary) roles.

I agree. But I'd also recommend Drupal over WordPress for newbie bloggers who want to learn an application that they can use for other, not-just-a-blog web projects. In the process of learning Drupal, one gains experience with a tool that has so many other applications.

Jun 15 2006
Jun 15
Vertice sign
Originally uploaded by bmann. />

Well, well....That is a surprise. Adrian must be chuffed :).


Well done Boris. Have you spotted a dikini plaque somewhere? I'll pay in beer.


read more

Jun 14 2006
Jun 14

The Drupal way in programming is 60% about hooks 10% about nodeapi and the rest is ingenuity. That's allright, but one fact has always troubled me. And that is - how much effort is spent on discovering which module implements the hook I need. Far enough, the old caching/memoizing trick does the job to ensure that the cpu time is not expensive. Yeah, but still it's outside simplicity might be, just might be implemented in a more elegant fashion.

Drupal hooks implement a nearly Aspect Oriented API. The cross-cut is the point where the hook is invoked. aspect(cross-cut) === hook. The different aspects are declared as moduleName_hook. The disatvantage is that these are indiscriminate. Hooks are always fired. Pros - simplicty, cons - wasted cpu cycles.

I wonder. Is it possible to achieve a similarly simple syntax, but with the added advantage of not firing unnessesary hook calls.

Problem (1st iteration)

We need to call all functions interested in this particular execution point. The current context and the run history should determine which functions are actually interested in this particular point/label/crosscut.

So what if:

.....
hook('view','a callback);
.....
//in a code piece far away
invoke('view', .... );

In invoke() we can have something similar to the current code

function invoke($hook,$args) {
...
while($call = next($hooks[$hook])) {
$call($args);
}
...
}

How to implement hook(...)?

function hook($hook,$callback) {
invoke( $hook, $callback, 'add');
}

We would need an unhook() though, so that the interest is fully managed.
function unhook($hook,$callback) {
invoke( $hook, $callback, 'remove');
}

And finally the modified invoke:
function invoke($hook, $args, $op) {
static $hooks;

if($op == 'add') {
//memory waste, but can do for now
$hooks[$hook][$args] = $args;
return;
}
elseif($op == 'remove') {
unset($hooks[$hook][$args]);
return;
}

while($call = next($hooks[$hook])) {
$call($args);
}
}

Order please

Partial order that is. It would be handy to be able to have before($hook) and after($hook) calls. This will allow manipulating the sequence of calls, without modifying the grand plan request workflow.

before($hook) adds the callback before the hook point. The order of the other 'before' callbacks for this hook is unknown.

after($hook) does the same, but after the execution of the hook

The arguments of the callbacks added with before and after are the same as for hook for a given cross-cut/hook point

The implementation is similar to hook

function before($hook,$callback) {
invoke( $hook, $callback, 'add-before');
}

function not_before($hook,$callback) {
invoke( $hook, $callback, 'remove-before');
}

function not_before($hook,$callback) {
invoke( $hook, $callback, 'add-after');
}

function not_after($hook,$callback) {
invoke( $hook, $callback, 'remove-after');
}
....
//in invoke, the rest is similar
if($op == 'add-before') {
unset($hooks[$hook]['before'][$args]);
return;
}
....

An interesting 'theoretical' consequence is that this is a kind of a higher-order functions based implementation of aspect style programming in an imperative language. That is if you are into such words. It is more interesting thing to notice is that the $var() syntax allow you to code wanted patterns and execute them later on by simply passing new $var to the pattern function. This technique parallells lisp and scheme style macros, you just can't easily manipulate them.

Second iteration or cleaning up the nest

There are a few problems with the above code. It doesn't reflect faithfully the problem, that is the treatment of arguments and results. It is too verbose and can do with some optimisation.

Let's start with the model. The type of an aspect function is ($args→$result). We are not interested in actual shape of either, but their correct treatment. It suffice to say that the only requirement to both is that they are the same for each separate hook. The shape of the aspect computation is (∥($args→$result))→(∥($args→$result))→(∥($args→$result)), where ∥ denotes parallell or unordered behaviour of a bunch of functions. The last remark is important, since we are introducing order or synchronisation with the before and after operations, but that order is only partial, relevant to the bigger picture. In each phase the order of execution should remain unknown. This doesn't break the abstraction boundaries, which is good. This as well means that the functions in each phase must not change $args and must not overwrite the same part of $result. This restriction won't be enforced for both simplicty and performance, it should be tested with unit tests in real life code. Failing to obey this discipline will cause an unexpected behaviour.

Let's change the code then. What is the shape of a typical before function?
function a_before($args, &$result) {
....
}
As it happens the shapes of the at and after functions are the same. We are enforcing a partial order of evaluation and enhancing a function, not changing it's signature.
The evaluator can be written out as looping over each of the different phases
....
while(current( $hooks[$hook]['before'] )) {
$cb = key( $hooks[$hook]['before'] );
$cb($args);
next( $hooks[$hook]['before'] );
}

while( current( $hooks[$hook]['during'] ) ) {
$cb = key( $hooks[$hook]['during'] );
$cb( $args, $result );
next( $hooks[$hook]['during'] );
}

while( current( $hooks[$hook]['after']) ) {
$cb = key( $hooks[$hook]['after'] );
$cb( $result );
next( $hooks[$hook]['after'] );
}
return $result;
....

This code can be optimised by parametrising the hook selection, add and remove operations, so that we end up with the following short hook invoke function
function invoke($hook, &$args, $op = 'run', $phase = '' ) {
static $hooks = array();

switch($op) {
case 'run':
foreach( array('before', 'at' ,'after') as $phase ) {
while( current( $hooks[$hook][$phase] )) {
$cb = key( $hooks[$hook][$phase] );
$cb( $args, $result );
next( $hooks[$hook][$phase] );
}
}
return $result;

case 'add':
$hooks[$hook][$phase][$args] = true;
break;
case 'remove':
unset( $hooks[$hook][$phase][$args] );
break;
}
}

We can sweeten the syntax by adding explicit hook_before, after, at and the respective unhook functions, to hide the message passing notation of the above function. For example
function hook_after( $hook, $cb ) {
invoke( $hook, $cb, 'add', 'after');
}
function unhook_before( $hook, $cb ) {
invoke( $hook, $cb, 'remove', 'before');
}

Adding honey to the pud

The invoke function does too many things, it is unfortunate. It is a natural 'object', purists of any kind don't go for me, that is not a flame bate. We can use php's object oriented features to make this a bit more abstract and enforce separation of concerns, rather than a static and a switch.

class hook_namespace {
var $hooks;

function run( $hook,$args ) {
foreach( array('before', 'at' ,'after') as $phase ) {
while( current( $this->$hooks[$hook][$phase] )) {
$cb = key( $this->$hooks[$hook][$phase] );
$cb( $args, $result );
next( $this->$hooks[$hook][$phase] );
}
}
return $result;
}

function hook($hook, $phase, $cb) {
$this->$hooks[$hook][$phase][$cb] = true;
}
function unhook($hook, $phase, $cb) {
unset($this->$hooks[$hook][$phase][$cb]);
}
}

While I could have gone oveboard abstracting further and further, the above class is good enough for my personal taste. It is concise. It does what it says on the box. Ok, fair enough, there are bits to keep in your head, but that is (hopefully) allright. The last two versions practically implement the drupal hook wiring without the broadcast effect for trying out all possible hook definitions. On an abstract level it is a tad more powerful. It has the disadvantage that you need to hook up at runtime, not definition time.

If php had more abstract features we could have done more. With a proper macro facility, we could have shifted the work further towards compile time, now there are extra operations to be performed.

To killes - you are more right than you ever thought. The above code is monadic for all practicall purposes. Of course in haskell it will look very differently, but hey it is a step.

Update I realised that it is better to name the class hook_namespace, since the instance of that class is providing a encapsulation of hook in a single scope, it's a bit verobose, but at least a better name. This has the dubious benefit of renaming add and remove to hook and unhook.

Attachment Size aspect.php.txt 1.71 KB
Jun 06 2006
Jun 06

At the Yearly Kos convention on June 8th the CivicSpace community will be teaching a workshop on building netroots campaign websites. Experts will be avaliable all day to teach participants at every skill level. The day will culminate in a barn raising of a real world netroots campaign website thought up by the DailyKos community and built by workshop participants and facilitators.

This thread:

http://www.dailykos.com/story/2006/6/6/13713/38510

is being used used as a campaign idea incubator with the best concept being built three days from now at the YearlyKos convention. If any of you are DailyKos members we could use your help recommending the thread so that it gets exposure within the DailyKos community, also please submit your ideas if you have them. If any of you want to help out please send me an email and let me know:

  1. If you will be attending YearlyKos
  2. If you want to help facilitate the workshop
  3. What specifically (if anything) you would like to pitch in on.

Hope to I'll see some of you in Las Vegas shortly.

May 24 2006
May 24

What a good occasion. After so much time spent on Google SOC (the bit about Drupal), after dealing with students, mentors, and other creatures. After the results are out, you finish it off with a birthday.

Well done, Happy Birthday Rob. (true or not it is your birthday)

May 23 2006
May 23

I've updated the code. Now the scripts can convert a module into a new module and tpl file.

The script can produce a _widget hook from the old module file.
usage
bash$ ./mparse.php filename option
for example try:
bash$ ./mparse.php path/to/drupal/modules/node.module --all

update: fixed several bugs, so a new file is attached

Attachment Size mparse.tgz 3.46 KB
May 22 2006
May 22

I kind of finished the parser bit of the transformer routines for splitting off the theme functions from the drupal modules. It ended up a bigger thing than anticipated. The parser doesn't handle yet functions returning references.

At the moment only a parser and a pretty printer exists. It can be modified to enforce appropriate style and is not drupal specific.

I'll be adding the module_templates() functions generator this evening and tomorrow and maybe a specific split driver, so you can do the generation of the name.module, name.tpl.php in one pass, rather than running separate programs.

I attach a working as of this morning for your amusement. Warning: ugly code.

Attachment Size mparse.tgz 2.36 KB
May 12 2006
May 12


Alaa - a blogger, an activist, a drupal contributor and more importantly just a man was jailed for being on a demo. Disgusting.

While that doesn't surprise me, things like that happen everywhere, not just in countries with regimes similar to Mubarak's, it still pisses me off.

I can't stand the response of the 'powers of the day' to bully you into submission, if you dare not to support them.

If you happen to be in London on 13/5 and fancy making noise in front of the Egyptian embassy just join the protest.

Oh, yes have you heard the carpet bombers for peace, here's the Egypt version?

May 09 2006
May 09

Spencer Critchley recently interviewed me about CivicSpace, Drupal, and DeanSpace for the O'Reilly OnLamp blog.

May 09 2006
May 09

As I go through a test site for One Inch Frame’s update to Drupal 4.7, I’m doing something different with my wiki nodes and web link nodes. Right now, I’m using to build a custom wikinode type, and am using for the large amount of links that I accumulate in my links directory, the sort of thing that I used to post to del.icio.us. The weblinks module has been discontinued in favor of the , but that promising project is still not ready, and my needs are such that that project might just be overkill. I’ve still got my eye on it, though.

With the 4.7 version, I’ve decide to take a good hard look at the , as it is basically the future of flexinode and Drupal. And it’s also really, really cool.

So I created a simple node type for wikinodes, and a type for web links. One of the things I want to do differently this time around is build in attribution to my web links, so I can give credit to the source where I found the link. So, another CCK content type for web link source is needed, and I can use the built-in ‘nodereference’ field type to link a web link to its source.

And, out of the box, it works great. I can add attribution sources and they show up in a drop-down in the web link content creation form. Super cool. The default look of this field when viewing a web link makes the attribution hotlinked to the attribution’s source node. It boggles my mind to think of some of the ways smart people are going to take advantage of the CCK, and, particularly, its nodereference field type. There’s also a userreference which does the same thing for users, for completeness.

The way CCK-created content looks is a fine default, but, theming them will be necessary in almost every case. Fortunately, the CCK download comes with a theme/ directory with documentation and samples.

So, the first thing I want to do for all my CCKreated (heh, like it? made it up myself) nodes is to remove the label. The CCK allows theming at the field level or up at the node level. To remove the labels globally for all CCKreated content, there’s some code to add to the template.php file, then your PHPTemplate-based theme will call field.tpl.php files to render all CCK fields. Just removing the printing of the label is fine here:

So, my field.tpl.php looks like this:

<div class="field field-type-<?php print strtr($field_type, '_', '-') ?> field-<?php print strtr($field_name, '_', '-') ?>">
<div class="field-items">
  <?php foreach ($items as $item) { ?>
    <div class="field-item"><?php print $item['view'] ?></div>
  <?php } ?>
</div>
</div>

Simple.

While that takes care of theming the individual fields, for my web links I want to theme the whole node. PHPTemplate allows for different themes to be applied to different content types, and CCK extends that to its own types. So, to theme a web link CCKreated node, I write a node-content-web_link.tpl.php. This will override the theming of the individual fields, and give me control over the content as a whole. As CCK exposes its fields via a $field_<fieldname> array, this, too, is pretty simple:

<div class="node<?php if ($sticky) { print " sticky"; } ?><?php if (!$status) { print " node-unpublished"; } ?>">
  <?php if ($picture) { print $picture; }?>
  <h2 class="headerstyle"><a href="http://oif.eafarris.com/cck_theming_in_drupal_4_7/<?php print $node_url?>"><?php print $title?></a></h2>
  <span class="submitted"><?php print $submitted?></span>
  <span class="content">
    <p class="weblink_description"><?php print $field_description[0][view] ?></p>
    <p class="weblink_url"><?php print $field_url[0][view]?></p>
    <p class="weblink_attribution">via <?php print $field_attribution[0][view]) ?></p>
  </span>
  <span class="taxonomy">Categories: <?php print $terms?></span>
  <?php if ($links) { ?><p class="internallinks">&raquo; <?php print theme('links', $node->links, '&nbsp;&middot;&nbsp;')?></p><?php }; ?>
</div>

That’s nice, and generic. I need a couple more things to make this just what I’m after:

  • The url isn’t hot. It should be linked to itself.
  • The attribution goes to the attribution node, but I’d much rather it go directly to the attribution’s site, which is contained in a URL field as part of the attribution node.

The first one is very simple, just wrap the url in an href of itself:

<p class="weblink_url"><a href="http://oif.eafarris.com/cck_theming_in_drupal_4_7/<?php print $field_url[0][view]?>"><?php print $field_url[0][view]?></a></p>

Getting to the last part will require a tiny bit of programming. What we want, instead of a link to the attribution node (which is a cck-derived content type of content-web_link_source) we want the link to go directly to the url within that node. To start, we’ll need to call a custom theme function instead of printing the $field_attribution stuff:

<p class="weblink_attribution">via <?php print theme('oif_attribution', $field_attribution[0][nid]) ?></p>

Now, we write that theme function. It goes in template.php, and, for completeness’ sake, we call it andreas03_oif_attribution(), since andreas03 is the name of the theme. It gets the nid of the attribution node passed to it::

<?php
function andreas03_oif_attribution($nid) {
  $attribution = node_load($nid);
  $output = '<a href="http://oif.eafarris.com/cck_theming_in_drupal_4_7/' . $attribution->field_url[0][value] . '">' .  $attribution->title . '</a>';
  return $output;
}
?>

And, there it is. A fully themed CCK node. Drupal is so freakin’ cool. You’ll see these new nodes when I roll out the new version of One Inch Frame, based on Drupal 4.7, which is still several weeks away. There are just so many cool things that I want to do, that are now possible.

May 09 2006
May 09

I've just uploaded into the bryght svn a basic filter, actually a couple of them (I was lazy). They parse a php file, and output (leave out in the case of the no_filter), all functions starting with a given prefix.

I've done it in order to be able to play with separate theme_xxx files.

usage:
vlado:~$ no_filter function_prefix php_file
read the php_file, print it to stdout, leaving out all functions starting with function prefix.

vlado:~$ yes_filter function_prefix php_file
read the php_file, print it to stdout, leaving out all functions not starting with function prefix.

both filters know about associated comments, etc...

May 04 2006
May 04

Funny things these summer of code applications. Some of them come a very well thought out projects, others are more like cloudy ideas.

If you want to submit a proposal, and want to be successful, please put a little effort in spec-ing properly. Tangible goals are a very good thing. Good language, not really importnat, just put them in bullets if you fancy it that way.

If unsure, get to #drupal on irc.freenet.org, and ask. Mention SOC and project proposal, and you'll get attention and tlc. That is if you are applying for a drupal project, for others, well don't expect much help in that channel.

Good luck

May 04 2006
May 04

Watch this screencast to learn how to use Drupal to create Google Maps mashups of virtually any arbitrary data or content with no coding in minutes. For the example shown in this screencast I took a csv file of crime data provided by the San Francisco government and turned it into a usable google maps mashup in about 10 minutes.


14 minutes / 60megs

To play along at home you will need to install the following:

Please feel free to leave any comments, questions, or feedback.

May 02 2006
May 02

Google accepts studet applications for the summer of code 2006. Drupal has interesting projects for you to choose from. If you are a student anywhere, interested in php and/or drupal development, want to spend your summer coding and earning some money, apply. You might get accepted. If none of the proposed projects interests you, you can suggest your own. Come on, be brave. You can get a rock-star status in a part of the net.

May 02 2006
May 02

Drupal 4.7 is out. It features a lot of genetic improvements. Features support for a lot of hot features, but more importantly, it started the slimming trend.

I'm delighted that although there are loads of additional functionality, the modules are getting slimmer. Probably due to forms api. I hope this trend will continue.

May 02 2006
May 02

On Saturday night Drummy, Tony, and I went to Super Happy Dev House IX. I was a bit drunk. I bet Neil and Tony that I the "business guy" would beat them the "hackers" at hacking. My goal for the night was to integrate the gmaps module with views to allow users to create maps of any view.

I won handily:
http://zacker.org/mapdev/?q=crimemap

The how-to is posted on this handbook page.

May 01 2006
May 01

Wheee! Drupal 4.7.0, the new stable release of the CMS, has been released. After more than one year of development, we are now finally able to enjoy all the goodies which this new release brings.

For German speaking people we can now proudly claim to have a completed translation of the user interface, thanks to all the contributors! If you don't speak German, you can choose from one of the other 40+ translations for your site.

Read the release announcement for more information, I'm off upgrading a couple of sites now ;)

Apr 28 2006
Apr 28

I finally came about to changing the look of this blog. It is a new css-based design. It might get heavyish on some machines+browsers, but to be honest I can't care less about it.

This design is kind of a proof for the themability of drupal. It took me about 20 minutes to convert this from a plain html with embedded stylesheet to page.tpl.php+css.

If I can do it, any monkey should be able to.

Update: thanks to rkerr & |gatsby| I've fugured out that I have a slight problem in IE - unreadable. The bloody boxes and png transparency problems. Now it should be much better.

Thanks guys

Apr 20 2006
Apr 20

Jeff Robbins of Lullabot posted a podcast interview of me here. I babble on for an hour or so about the Dean Campaign, DeanSpace, and CivicSpace.

Apr 11 2006
Apr 11

A few weeks ago we held our first ever "Drupal Camp" in San Francisco at Compumentor's office. I blogged about this previously when we were hashing out the idea. Today I posted a pretty lengthy report back about it on Drupal.org:

http://drupal.org/node/58182

Apr 05 2006
Apr 05

Yes, conceivably within a few years Ruby on Rails could emerge as a dominant web application development environment. But I am betting strongly against it. Why all the hype then? True innovation, great presentation, lots of screencasts & brilliant marketing. But in the end, RoR is fighting an uphill battle. E.G. LISP has a much greater market share than Ruby (.721% vs .2%).

Programming language market share numbers are taken from this study. It covers the languages in general and is not specific to web application development. If anyone has any better analysis please let me know.

*Update*: There is a great blogpost from a Ruby on Rails devotee here that comes away with much the same conclusion but instead of just numbers he provides a well reasoned argument.

Apr 01 2006
Apr 01

Frustrated with the never-ending betas of the imminent Drupal 4.7, I have decided to switch to a better project, Drup.us.

Mar 28 2006
Mar 28

Today, I woke up and decided that I will give my drupal modules away, in the hope that they will be better maintained. If you’re a Drupal developer who would like to take over the Captcha, TextImage and Similar modules, please contact me. Note, I’m not unmaintaining them, I’m only looking for a person who has more time and energy than me to work out the kinks and make the modules work for every Drupal version and not bloat the features and prefers to make things more efficient. If I do not find such a person, I’ll just keep sporadically maintaining them like I was. Interested? Just send me your drupal.org username, and what module you’d like to take over.

Mar 27 2006
Mar 27

Recently, I've had the pleasure to try out something new - reviewing a book before it is published.

I have been acting as technical editor/reviewer (or whatever that's called in English) for the first German book about Drupal, written by Hagen Graf: "Drupal: Community-Websites entwickeln und verwalten mit dem Open Source-CMS". The book covers the Drupal 4.7-beta series and is a good introduction to Drupal and it's concepts. It's a nice book for people who want to learn more about creating websites with Drupal. More details in this post over at drupal.org.

Reviewing books is a lot of fun - I might do that more often in future ;)

Mar 22 2006
Mar 22

Consider this:

  • My job is to focused around developing web applications that help communities collaborate yet the majority of the day to day collaborative work I am personally involved in is faciliated by standard mailman mailing lists, not community focused web applications. Mailing lists are functionaly no different than they were more than twenty years ago when they were invented.
  • Without a doubt the most pervasive and powerful organizing tool the Dean campaign grassroots groups used beyond Meetup to self organize was Yahoo groups. Yahoo's business is centered around "user produced content" and community. YahooGroups (formerly eGroups) with 50M registered users is their #1 community tool. Yet the toolset has barely changed in the 6+ years since eGroups was bought and made a part of Yahoo.
  • In my experience as a community organizer (DeanSpace, PeopleFinder) I have found that there are only two indespensable tools: wiki's and mailinglists. With both in place 85%+ of your web app needs are covered and groups are more than capable of self-organizing effectively.

So given all this, why does CivicSpace still not ship with working YahooGroups-like mailinglists and wiki support? Good freaking questions. Thankfully, I believe we are finally getting close to an adequate answer....

My first screecast (37 megs 10 min):

This sandbox runs on Drupal 4.7 beta 5. Modules I am using on this site:

  • Og - to create and manage the groups. Thank you Moshe!
  • og2list - to send out mail to group members
  • og_forum - to sync a forum w/ each group
  • og_mandatory_group (4.7 port included below) - to auto-join site registrants with the main group
  • og_intro (in zip below) - to send notices to the main group when users join and new groups are formed
  • Tabs - to draw the fancy ajax tabbed pages on the og nodes. Thanks nedjo!
  • Node Relativity - to handle 'sub groups'
  • Freelinking - to handle wiki-link -> node edit forms and [[wiki link]] fiters
  • Masquerade - to let me test the site as a non-admin user
  • Mailhandler - to post mail to my site off of og email lists (reads a catchall for the domain)
  • Mail Stuffer (in zip below) - my hacky helper module that associates mail sent in to mailinglists
  • Wikipage (in zip below)- to create wiki node types and manage permissions
  • Bookmark - to let users save pages in their bookmarks block

I would highly recommend waiting until og2list is fully baked and until I have a chance to clean up my code before you use this. But if you must I have included all my new modules, slightly hacked modules (ported og2list to 4.7 and added tags support to mailhandler) and my theme .tpl files. This stuff will all make it into cvs some time next week if all goes well.

Attachment Size theme.tar.gz 14.91 KB modules.tar.gz 90.38 KB
Mar 17 2006
Mar 17

I've poured almost three of my life in to CivicSpace waving my hands and willing it into existance. We have a lot to show for it: 30 major software releases, two thousands CivicSpace powered websites, a vibrant and quickly growing user community, and a network of 25+ vendors occupying a solid slice of the marketplace of advocacy / non-profit web technology services. But what we haven't had so far is a solid user facing product - something I can show my mom...

Ten minutes ago I sent a note to our mailinglists announcing that we will shortly begin alpha testing a hosted CivicSpace service and are looking for testers. Three minutes later four people signed up.

The CivicSpace hosted service is almost here and I couldn't be more excited.

Mar 14 2006
Mar 14

New versions of Drupal are out for the 4.5.x, the 4.6.x and the 4.7.0-beta branches which fix 4 (in words: four) security issues from four different categories, namely: access control bypassing, cross-site scripting, session fixation, and mail header injection.

Upgrade now!

Warning: If you're using 4.5.x, the patches for DRUPAL-SA-2006-003 will not fix the security issue immediately. You have two options: a) upgrade to 4.6.6 instead of 4.5.8, or b) upgrade to PHP >= 4.3.2.

Mar 01 2006
Mar 01

John Stahl recently gave me some heat for my assertion that Elgg should be built on top of Drupal.

I think that the next few years are going to bring tremendous challenges for applications that do not easily communicate with other applications that are “outside their platform” i.e are written using a different language/framework, run on a different server, etc....The days of monolithic application stacks that try to do everything are fading fast. A new “network-centric” software ecosystem is starting to bloom.

This is wishful thinking. I've spent much of the past few years puzzling over this exact question. While I am personally very much a proponent of web standards and web services I am pessimistic as to how much immediate impact they will have in the evolving marketplace of non-profit/ngo & advocay web technology services.

Backstory

I didn't always think this way. If you told me a year and a half ago that I would be hawking CivicSpace/Drupal as the über-platform that could meet virtually every need of any size organization I would have told you you were nuts....

After the Dean campaign ended and we started work on CivicSpace our assumptions were:

  • Drupal wouldn't be able to "scale" to meet the needs of large organizations
  • We would not be able to develop the platform quick enough to meet all the core needs of organizations any time soon
  • We would integrate third party service providers to fill the functionality gap organizations required

Then some interesting and unexpected things happened:

  • It turned out Drupal could scale
  • CiviCRM showed up and filled the functionality gap
  • Lots of vendors established quickly growing businesses servicing the technology. The top half dozen firms now employ ~ 50 people between them and each are looking to hire.

This reshaped my thinking on the future of the web-technology marketplace quite a bit. We have an immediate opportunity to commodify the core web-technology organizations need to a single integrated and scalable open-source application stack and this is a very good thing for the marketplace. Over the next few years I believe the advantages afforded by this stack of technology (CS/Drupal/CiviCRM) will far outweigh the benifits realized by the integration of applications accross web-services in terms of costs saved and passed on to technology owners and innovations in technology and services.

Integration accross web-services and web-standards is relatively costly

  • Web applications that are not built from the ground up to be integrated will never play nicely with one another. Let me repeat: if an open-source application is not built to be integrated with your web-application it probably isn't worth the effort to try to integrate it. This renders 95%+ of open-source web applications useless for those looking to leverage the work of other communities.
  • If an application has a strong API it is still tricky to integrate. Even integrating with CiviCRM, an application that was built from the ground up to interface with CMS's and shares the same web-app environment as Drupal, it costs us 2-10X more to integrate with it than it does to integrate with a standard Drupal module.
  • The most cutting edge private sector web-service and web-standards are not that advanced. We still don't have workable single sign-on solution, the cutting edge of semantic information interchange across the web is to embed it in XHTML, the hottest API's from SalesForce and Flickr haven't made much of a dent in the marketplace, and please don't get me started on the semantic web.

The market currently prefers a single integrated stack

  • The majority of the market for web-technology services is owned by companies like Kintera, GetActive, and Convio that serve as one-stop shops for virtualy all an organizations web-technology needs. They have trained technology owners to make purchasing decisions under the assumption that they can cut a check to a single entity that will provide and support a complete "solution". I.E. there is not much point to shopping around for "best of breed" services to integrate, "just give us your business and all your technology problems will go away". This creates an uphill battle in the marketplace for vendors selling what will be seen as "piecemail" solutions created by amassing various web-technology providers products across web-services.
  • There are huge unanswered usability concerns created by integrating together two different applications. This is espcially felt in functionality that is presented to an organization's contituents. Technology owners demand a seamless user-experience across their user facing application space (CMS, event tools, community tools, etc). In the future as more and more functionality moves out of the back-office and onto the web these concerns will only increase.
  • Open-Source vendors eat costs when integrating third party services, mantaining integration, and licensing software, so they have economic incentives to service a complete pre-integrated stack of technology instead of servicing a suite of other providers products integrated over web-services.

The future of the application stack and the role I think webservices will play

I hope and expect that in the next year the CS/CiviCRM/Drupal stack will evolve to a point where it can compete head on with the likes of Kintera, GetActive, and Convio. When this happens open-source vendors will grow into full blown ASP's that will be able to sell services that undercut the current market of proprietary service providers and will be able to grow downmarket to smaller organizations and horizontally to for-profits with overlapping technology needs. With so many organizations and vendors based on the same codebase it will create a very efficient marketplace that supports application development and services. It will also open up the marketplace to anyone wishing to specialize their services towards a vertical, sell data services, or offer 'best of breed' applications. Since the majority of the vendors business will be based entirely around customization and hosting / support and not licensing fees to support product development and sales, they will be much more likely to partner with 3rd party providers or create specialized services themselves. Over time as web-standards evolve the third party services and specialization will grow increasingly important in the marketplace. And then we can all live happily ever after....

Feb 21 2006
Feb 21

Russell Beattie figures out MySpace, in component terms. Funny how every sentence of his reminded me of a specific Drupal module that provides that feature.

Then of course, we’re not counting the sentences that talk about hotties and risque photographs. I don’t think there’s a module (yet) to provide that.

Feb 14 2006
Feb 14

The Yahoo! UI people just opened up their widget library, complete with graded browser support. Hmm. Maybe we would use the calendar widget for the Drupal archive.

Jan 31 2006
Jan 31

Recent versions of Drupal have the oh-so-cool feature that allows you to host many websites off a single Drupal codebase. The coolest part about this is that you can share some tables accross multiple websites; which means you can do things like have a single username/password table accross all the websites. This can easily be done, as specified in the settings.php comments as:

* $db_prefix = array( * 'default' => 'main_', * 'users' => 'shared_', * 'sessions' => 'shared_', * 'role' => 'shared_', * 'authmap' => 'shared_', * 'sequences' => 'shared_', * );

Now here’s an important thing to note: The first table you have to share is the sequences table. This is the table that handles all the id counters, so if you don’t share this one, something like this can happen:

[you shared only the users table]

1. User 1 signs up on Site A, gets user id#1
2. User 2 signs up on Site A, gets user id#2
3. User 3 signs up on Site B, gets user id#….? The correct answer is not 3!

This happens because you didn’t share sequences… Site B uses it’s own sequence generator to render a duplicate userid… which the user table would not accept, and this would go on till the Site B sequence catches up with the Site A sequence, and then things would be normal. The code quality in user.module helps protect the user table from data corruption, but you will have many signups disappear into thin air with a set up like this. Hence, all you need to do is share the sequences table along with the users… and you’re all set!

Btw, hello Planet people!

Jan 30 2006
Jan 30

FINALLY finished the captcha.module for drupal. This is ONLY a first draft, lots of improvements to happen. Features:
* ability to protect any drupal form
* captcha API – make your own challenge response! (math and image are included in package)

(use cvs checkout to get)

Jan 10 2006
Jan 10

Just a quick note: Drupal 4.7.0 beta 3 is available now, fixing more than 100 bugs since the last beta. If you have any further issues or suggestions for 4.7 — now is the time to speak up, file bug reports, post patches etc.

I haven't had too much time for Drupal development recently, but I guess I should really start updating the poormanscron module now (finally!) and help with getting the German translation up-to-date...

Pages

About Drupal Sun

Drupal Sun is an Evolving Web project. It allows you to:

  • Do full-text search on all the articles in Drupal Planet (thanks to Apache Solr)
  • Facet based on tags, author, or feed
  • Flip through articles quickly (with j/k or arrow keys) to find what you're interested in
  • View the entire article text inline, or in the context of the site where it was created

See the blog post at Evolving Web

Evolving Web