Did you know that there are 17,500 anagrams for “George Hotelling”? If you are doing the math right now, you’ll probably come up with a different number because we are working off different word lists. For example, my word list includes “Google”. Did you know “Googler Eel Thing” is an anagram for “George Hotelling”?
Now that I have a list of anagrams, I wanted to automate changing my Twitter username to an anagram periodically. I set up a script to do that, but had to choose the frequency. After messing around for a bit, I realized that 17,500 was almost exactly the number of hours in 2 years (17,520 or 17,544 hours, depending on which years). So, for the next 2 years (or until Twitter blocks my script) (or until my bot fails) (or until I give up) you can pop over to @revgeorge for your hourly anagram fix.
The book includes a description of how a Philadelphia organization used CitizenSpeak and other online organizing tools to rally their community around their cause. You can read more on CitizenSpeak’s blog or by using Amazon’s Online Reader.
Finally, note that this is the first annual award. Open source developers: I strongly recommend you look in to submitting your work for the 2007 award. Anyone interested in non-profit tech: The Tides Foundation is looking for ways to make next years award even better, and they need your help. They’re looking for donations (they are a non-profit, after all), people to spread the word about the award, and feedback from the community; so go to their forums and let them know what you think!
There are some lessons learned from what I did wrong, too. The first was choosing Smarty as the theme engine. While I’ve had good luck with Smarty in my own projects, the majority of work being done with Drupal seems to use PHPTemplate.
There’s nothing wrong with Smarty, the PHP library. For Drupal, however, there is a lot more support available for PHPTemplate, and PHPTemplate more likely to be kept up to date. Drupal’s PHP functions are more than adequate for theming, which negates Smarty’s advantage of having view-centric functions available to it.
I also wish I had created a site-specific module. A module is a great place to create custom pages and blocks, to use callback hooks like hook_nodeapi() and hook_user(), and to collect helper functions. A lot of things I did by customizing the display interface and variables could have been more elegantly handled by simply creating a module for the CitizenSpeak site and stashing everything there.
That about wraps up my posts on building CitizenSpeak. Please visit the site (maybe even click that donate button on the right), and thanks for reading.
Yes, another CitizenSpeak post. I’ll probably do one more after this about how the site is configured, and then updates as events warrant. This time I want to talk about developing the module.
I’ll admit that it’s been a while since I started working on the CitizenSpeak module. Part of it was that I was donating a lot of the development effort and only getting paid for implementing the site. That means that keep-George-off-the-streets programming took priority over this.
Another part was that I hit a mental wall with Drupal’s module format. Having a monolithic .module file was not working for me, but I found that when I split it into several topical files it got much easier to deal with. If you look at the source code you’ll see that I’ve split functions into files by topic.
I even went one step further. A lot of Drupal hooks send an operation as the first parameter, take a look at hook_user() for an example. If you look at the CitizenSpeak implementation of hook_user(), it’s just a stub that calls other functions:
I then moved all the functionality out of giant switch() statement suggested by the docs and into individual functions in citizenspeak.user.php. The function arguments are redundant, but the manageable code is worth the repetition.
By moving everything out of the core file, I found it a lot easier to deal with the development and get into the groove. If I had one thing to tell someone getting started with Drupal module development, it would be that.
Looking ahead at the development, there are two big tasks. The CitizenSpeak module needs an API that will allow other modules to interact with it. The goal is to allow other modules to hook into the forms, campaign sending and reporting. One of the big things that everyone wants is CiviCRM integration and the CitizenSpeak API hook will allow that to happen. The other big task is to update the module for 4.7, which features new email and form APIs.
In the announcement yesterday I wrote that I would be blogging more about CitizenSpeak, and with this post the prophesy has come to pass.
Organizations have had tools like Capitol Advantage to create advocacy campaigns for quite some time. Those tools aren’t necessarily accessible for small or ad-hoc efforts due to the cost involved. CitizenSpeak offers a subset of their features — email-only campaigns and reporting — for free.
Now, when a blogger gets a bug up their butt about something that needs public outcry to fix (i.e. a proposed porch-couch ban in Ann Arbor, MI) they have a tool that will let them create a campaign and send all their readers to join in.
Even better, since its a GPL licensed module, anyone with a Drupal or CivicSpace can create their own campaign center. It can also build on things we chose to leave out of the site; things like categories, comments or any of the add-on modules that Drupal supports.
I can’t wait to see what other sites do with the module.
Briefly, CitizenSpeak is a site that allows people to create and host email campaigns. It allows ad-hoc organizing around any issue that puts a bug up someone’s butt. I’ll probably blog more about it later this week. In the meantime, check out the site or the open source Drupal module that I built for the site.
I set up mod_security, a web firewall for Apache, to deal with comment and trackback spam on my server. This isn’t a complete guide to mod_security, just the information I wish I had when I started.
I’m using mod_security because my server has lots of different blogging tools installed, and there’s no way to centrally protect them all. This won’t take care of all comment or trackback spam, but I’m hoping it will greatly reduce the amount we get. Also, I’m expecting mod_security to be faster than other tools since it stays in memory and doesn’t hit the database.
CitizenSpeak is a site that allows people to create email campaigns targeted at change, like the ultra-successful EFF campaign to stop the Broadcast Flag (that the EFF runs, not CitizenSpeak). It’s a tool that anyone can use, and activists at any level can use it to focus their community’s voice. And it’s free.
If you went to the CitizenSpeak site you might notice it sucks a little. There are frames and popups and non-obvious permalinks. I say that because I’m actually working on changing that.
I’m rebuilding the CitizenSpeak site with the main functionality going into a CivicSpace module, which we’ll be releasing under an open source license. That means that sites running CivicSpace (and Drupal) will be able to host their own campaigns, customized to the needs of the site. And yeah, the CitizenSpeak/CivicSpace thing does get confusing sometimes.
Another day, another Movable Type plugin. This one is kind of complex, so let’s start with the problem as outlined by Matt Haughey:
PostedElsewhere sends those TrackBacks automagically. It uses RSD to identify where to send a TrackBack when someone comments on your site. It’s up to you to set yourself up to receive the comment TrackBacks.
Because it uses Movable Type 3’s callbacks, and because I haven’t upgraded yet, you can’t test it out here. However, I set up a blog with it installed at http://george.hotelling.net/postedelsewhere/. Leave a comment there if you want to test out your RSD file and TrackBack handler.