Firefox Tip – Use the ^ Search Operator

This list of 11 secret Firefox tips is fantastic! Number 2 will change your life! OK, that’s overselling it a lot. Many of those I already knew, but the second tip really is great:

Search for a needle in a tabstack

Tab hoarders, we see you. Heck, we are you. Don’t ever let anyone shame you for having dozens (and dozens3) of open tabs, implying you don’t have it together and can’t find the right one. Instead, dazzle them with this trick. Add a % sign to your URL search bar to search specifically through all your open tabs, including tabs in different windows. Then you can click over to the already open tab instead of creating a duplicate, not that anyone has ever done that.

Bonus tip: If you love that tab search trick, try searching through your Bookmarks with * or your History with ^.

I’ve (somewhat) cut down on my tab hoarding thanks to One Tab and Pinboard, but my Firefox history is massive. Being able to search my history with ^ is a game-changer for me. I’m actively trying to build up my muscle memory for using that search operator.

A step toward replacing Facebook

One of the things I noted when I left Facebook was that I ended up outsourcing my social labor to my wife. Sarah Jeong wrote a great piece for The Verge about her experiences without Facebook, and found similar gaps in the Facebook-less life.

The real problem only began to present itself much later. I missed big personal news from people I knew. I missed dance parties and house parties and casual get-togethers. I was the last to find out about births and the last to see baby pictures. Classmates got engaged and married and I didn’t find out until after my hiatus.

The epitome of this phenomenon was when I sat down to interview my friend Dia Kayyali, an activist organizing against Facebook’s real names policy. “You’re coming to my birthday party, right?” they said, as we were leaving the cafe where I had interviewed them.

I froze in my tracks. “What party?”

“Oh,” said Dia. “I forgot you’re off Facebook.”

Please read the whole piece. The subtitle is “Facebook is an emotional labor machine, and if you want to leave it, you’re going to have to start doing a lot of work.” It’s a great look at why a thoughtful person would still use Facebook, despite it’s drawbacks.

I believe that distributed and remote workers need to take responsibility for social plans. Maintaining social ties is literally a matter of life and death. I am out of sight and out of mind and not the center of anyone else’s world.

How do you keep up with folks without Facebook? One way I’ve found is Monica, an “Open source personal CRM.”

You can use Monica to log when you do something with a friend, and get reminders when you haven’t talked to someone in a while. Want to go out for lunch or a beer? Take a look at who you haven’t seen in a while. Since it’s open source, if you don’t trust them with your data you can run it yourself.

The drawbacks are that you need to maintain the data yourself (instead of Facebook) and that it focuses a little too much on phone calls.

If that’s too much, another trick I’ve used is to create a Trello board with the months of the year on it. Put a card for each friend in the column for your last contact (however you define that) and you can see at a glance who you should catch up with.

I’m not perfect about keeping up. If you are reading this and realize we haven’t hung out in a while, please invite me out. I’ll say no because in May I’m going to London for a work trip and moving to Ann Arbor, but we’ll catch up after the dust settles. And I’ll be sure to log it in Monica.

❤️ This post proudly created in Gutenberg

OS X? Adium.

On OS X? Using iChat? Time to switch to Adium. I tried Adium maybe a couple years ago and was underwhelmed, so when I started hearing people talk about it I figured that it wasn’t anything worth checking out. Eventually the buzz got to me and I downloaded it again. Guess what? In a couple years software can get a lot better!

So what won me over this time?



The interface
It’s super simple. Easy to set up, easy to keep running.
Address Book integration
I love how iChat integrates with the OS X Address Book, and Adium is just as hooked in.
Hella configurable
There are a metric ass-load of add-ons available. Installation is a snap too, you can install right from the browser. (If you’re a Homestar Runner fan, check out this conversation layout and this soundset). Also, creating new message styles is just XHTML and CSS.
Most of my IM in one place
My AIM, my Jabber, and even the accounts I have but don’t use all in one contact window, thanks to the Gaim underpinnings. It even supports Zeroconf, err, I mean Rendezvous, err, I mean Bonjour. The one network it doesn’t support is Skype, so unfortunately I have to have 2 IM apps open.
Built-in crypto
It supports OTR encryption out of the box, and it’s super easy to get going.
Growl support
If you use Growl, you’ll appreciate the built-in support. No extra apps required.
History in chat windows
When you start a new conversation, the recent history is displayed. This is great if you leave a message for someone, close the window, and then the other person replies after you’ve forgotten what you’re talking about.
Open source
All things being equal, I prefer an open source solution. All things aren’t equal here though, this blows iChat out of the water.

That’s not to say it doesn’t have its shortcomings. If you use iChat for audio or video conferencing, you’ll probably want to stick with it. Another big hurdle is that sending files doesn’t work as well as iChat, likely due to NAT issues (which a simple upgrade should fix). The only other problem I have with it is that I can’t find a dock icon that doesn’t flash when I have an unread message, which I find distracting. [Update: Brian found a dock icon that isn’t animated.]

I’m pretty geeked about it, I like seeing an open source app that gets OS X UI right. Geeked enough to evangelize in my blog. Check out the screenshots, go download it and give it a try.

Further reading:
Tim Bray: Adium is the Future
Eric Meyer: Adium: Chatting With Style

CitizenSpeak Colophon

CitizenSpeak: your campaign
There were two projects in getting CitizenSpeak up and running: Developing the CitizenSpeak module and creating the CitizenSpeak site. While they were intertwined, they also provided distinct educations.

I found that the I18n module can serve dual purposes; it provides the Spanish language interface to the site as well as allowing us to customize standard English language messages. This is handy if you want customized labels for things, or your site isn’t as averse to capital letters as the Drupal project.

As an aside, only recently did I learn that name “I18n” is an abbreviation for the “Internationalization,” since “nternationalizatio” is 18 letters. I guess I just never bothered to count.

I was also happy to learn how to customize the output of other modules. The PHPTemplate and Smarty engines allow designers to customize how specific node types are displayed, what information is available to templates, and override any theme() call.

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.

Developing the CitizenSpeak Module

CitizenSpeak: your campaign
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:

function citizenspeak_user($op, &$edit, &$user, $category = false) {
$function = "citizenspeak_user_" . $op;
if (function_exists($function)) {
return call_user_func_array($function, array($edit, $user, $category));

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.

More About the CitizenSpeak Update

CitizenSpeak: your campaign
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.

CitizenSpeak Re-launches!

CitizenSpeak: your campaign
Remember when I begged for money months ago? Well it payed off, and now the new CitizenSpeak has re-launched.

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.

Big thanks to Jo Lee for being CitizenSpeak, Eric Gundersen at Development Seed for his fantastic design work and Embolden Design for providing hosting!