February 2008

Notes along the way

February 1, 2008 - Categories: life

The subway floor is slick with muddy footprints. It’s crowded, so I sandwich my backpack between my feet and take out the Treo that W- lent me. If I write quickly I’ll finish this before I get to Don Mills.

*

I kept my head down while walking so that the snow wouldn’t get on my glasses.  This meant that all I could see was the snow in front of me barely indented by the footprints of other people on their morning trek to the subway station. I had some portable sunshine – an inspiring podcast about writing.

*

These are my morning pages, I guess. Stretching exercises to warm up my brain and limber up for an interesting day. There’s so much to write about. I’ll write about yesterday.

*

I spent yesterday morning at one of my clients, integrating the wiki I made with a wiki that another team had put together. I joined a working meeting and shared what I knew. Things are going well.

In the afternoon, I prepared for the second part of a workshop for Web 2.0 brainstorming and planning. My team members  were happy to let me take the lead in organizing the information and creating slides.  I enjoyed creating a spreadsheet that organized the ideas from our brainstorming session. The spreadsheet made it easy to evaluate the ideas as well. We’ll see how well that goes!

End result: I’m in charge of practically everything on the second day of the workshop. :) This will be fun.

*

When I checked my personal mail, I found an acceptance letter for an article proposal I’d sent to Linux Journal. (I have warm and fuzzy feelings about Linux Journal because that’s how W- first heard about me.)

With so many extracurricular writing projects on the horizon, I realized that I needed to do more than play on my DS during commutes. I’ve tried writing on the DS before, but I didn’t like tapping ideas out on an onscreen keyboard because that meant that one hand would be doing all the work. W- had an old Treo 270 that he no longer used, and it had a thumbboard. Now all I had to do was figure out the best way to use it to write.

I tried different outlining programs, but I wasn’t happy with any of them. I was looking for in-place editing, a quick way to add nodes, and drag-and-drop reorganization. Most outlining programs for the Palm separate editing the outline from editing the nodes. Bonsai looked promising, but my Microsoft Windows XP kept blue-screening whenever I tried to transfer it over. So it’s back to the built-in MemoPad, which should be fine for now.

So far, so good. I plan to use the Palm to outline, and occasionally to write blog posts like this. My voice recorder is always around my neck, so once I’ve fleshed out my outline, I can talk it through. I have earphones too, so I can review my braindump and write down interesting points. This involves my ear in the editing process.

Oops, I forgot the index cards. I had volunteered to bring index cards just in case they’re useful for the prioritization of ideas. That’s okay, we’ll make do.

*

As W- expected, the meeting was cancelled due to the storm. Aaron Kim called me on my cellphone just as I was looking for the right bus at the Don Mills subway station.  Jennifer’s cellphone charger went kaboom, so there’s no way to get in touch with her right now. I’ll drop by the Innovation Centre and see if it’s worth staying there, or if I should just work at home. I didn’t pack lunch, but I brought some granola bars. If Bernie and Jen are there, then it’s worth working on Drupal next to them. If not, I’ll go home.

I’ve been working on my outlines, so I don’t feel that my commute has been a total wash. :) It’s surprisingly easy to work on a speech or article outline using just a flat text file. I still want Org on the Palm, though. Maybe Emacs on the Zaurus?

*

Why not work on my laptop?

I don’t always have a seat, and the laptop is a little too big and heavy for me to feel comfortable about pulling it out anywhere. It’s the convenience factor, I guess. I’ll try it on the trip down Yonge to see if it’s easier than I think. If so, then I’ll take the Palm sync cable with me so that I can work either way.

*

Oh, look at that, I’ve hit the 4K limit on MemoPad. See? Writing is easy. You just think out loud.

*

Actually, no, I think I’ll head straight home. Healthier food. :)

xkcd: Real programmers use Emacs

February 1, 2008 - Categories: emacs

From xkcd

Thanks to Jean-Francois Arsenault!

Two tweaks = a great writing day

February 1, 2008 - Categories: writing

This was a very good writing day. I wrote 2256 words for my book, Wicked Cool Emacs, filling in the section on using Planner to take notes. I braindumped some stories from yesterday and today in an 847-word blog post, and I also sketched the outlines of my upcoming presentations and articles. All of that was extracurricular work in addition to e-mails, instant messages, meetings, wikis, and spreadsheets. Yes, it was a very good writing day, and I think I’ll finish this chapter by the 7th, somehow managing to finish a chapter a month despite everything else that’s going on.

What did I do differently? I tried two things:

Using a PDA to write during my commute: the thumb board made all the difference. Tapping tiny keys on a virtual screen or even scrawling in handwriting or graffiti was too slow for me. It made me think too much about input, and I got distracted from what I want to say. On the other hand, I found it easy to type while thinking about what I want to say. I didn’t feel slowed down by the technology.

I spent most of my commute writing blog posts and outlining my upcoming presentations and articles. I was surprised to find that a flat file was good enough for organizing my outline. I thought that I would need an outline or mind mapping program, but all the programs I tried took too much effort to get ideas into the system. Palm’s built-in memo pad did quite well, although I ran into the 4 kB limit about halfway through my commute and I had to start a new note.

I also ended up draining the battery because I hadn’t dimmed the backlight, but that just meant that I could play on my DS with a clear conscience.

Tracking the number of words remaining: Early in the writing process, I set up Emacs to show a running total of the number of words in my draft. The first version of the quote showed the total number of words, and the second version of the quote showed the difference between a baseline and the current number of words. This was useful for seeing how much I’d written since I reset the baseline. Today, I flipped it around. Instead of showing me how many words I’d written, Emacs showed me how many words I still had to write, starting at 2000 and counting down. I don’t know if that’s a key change, but I admit that it was fun seeing the number inch down. Maybe it’s the computer science geek in me, but I find it easier to test if something is zero then to test if something is equal to another number.

Hmm. One of these days, I might even hook my word counter into some kind of automatic status notification to the outside world so that people can find out how I’m doing. Maybe it would automatically tweet when I reach 50%, 75%, and 100% of my quota. Not that anyone really needs to know, but I think it would be fun.

I didn’t look into doing word counts on the Palm, but I don’t think I’ll need it. I think of the Palm as a way to work on outlines and jot quick thoughts. I was pleasantly surprised to find out that I’d written so much, though.

End result: another section in the book, another step closer to the end of my third chapter, and a warm and fuzzy feeling of accomplishment. I may be getting the hang of this writing thing.

I’m looking forward to joining the writing group that Leigh Honeywell is thinking of starting up. I’d happily head out into the snow for an afternoon of writing at the Linux Caffe. Of course, I won’t be able to do speech recognition, but I think the company will more than make up for it. And who knows? If I bring my voice recorder along, I can use it to capture my demos to other people and transcribe those into my computer afterwards.

Kaizen: relentless improvement. Yes, even for creative processes like writing… =)

Juggling; paperwork

February 1, 2008 - Categories: work

All of this is extracurricular work. My day job is going well, too. One of the challenges than figuring out right now is how to do my best at all the different projects that I’m working on. I want to make sure that each client is happy with the work I do, and that when I am working on the project, our expectations are aligned and people feel that their goals are as important to me as their goals are to them. I get a little anxious when my schedule is uncertain, but with a little bit of initiative and planning, I’m sure I’ll work things out.

I’ve also submitted an application for an emergency visa applicant to the US consulate. There are couple of exciting work-related opportunities that I would love to be part of. I can’t talk about them yet, but if they do go through, you’ll know. It’s a bit of a pain to not be able to travel freely, but hey, that’s life!

Testing from Emacs

February 2, 2008 - Categories: blogging, emacs

I’m using weblogger.el and xml-rpc.el to post directly to my WordPress.

I wonder how well it works…

Sorry about the RSS thrashing! <sheepish grin> It took a while for the idea of a test blog to occur to me. So sorry. =)

In conclusion: Emacs posting to external weblogs – not quite there yet. Weblogger.el is somewhat okay, g-client and atom-api didn’t work at all on my system. Waah. Quite frustrating.

I so rock =)

February 3, 2008 - Categories: wickedcoolemacs, writing

I have about 41 pages for my current chapter on taking notes in Emacs, and I still have to write the introduction and wrap-up sections. This means that I’ll need to do some more editing. It’s clearly time to apply another piece of advice from the wonderful book How to Write Fast (While Writing Well), by David Fryxell: don’t over-write, because the time you waste writing more than necessary and then editing down to the required length could be spent writing about something else!

I also rock because I’m getting the hang of writing macros for OpenOffice.org. Basic is not my favorite language and OpenOffice.org macro programming is sufficiently obscure that it’s hard to find examples of what I want to do. OOoMacros.org helped me learn enough to write a few more functions to make my writing life better. I wrote two new functions today: one to mark up wingdings in my code, and another to mark up the source code examples. Both save me lots of tedious work. The wingding function replaced all instances of (1), ;; (1), (2), ;; (2), until (9) and ;; (9) with the corresponding wingding. The example function marked up everything enclosed in <example>..</example> tags, formatting the first and last lines in a different style and using a single-line code style for short examples. Between that and the two functions I’d previously written to format about 80% of my command and keyboard shortcuts, editing is just so much better.

It seems that most people don’t tinker with their tools. I like doing so. I like getting to know what I can do with a tool and how far I can push it. This can be frustrating sometimes (I spent all afternoon trying to get Emacs to play nicely with other weblogs!), but most of the time, it’s both fun and useful. Not only am I saving myself time, I’m also exercising my brain and opening opportunities for other hacks down the line. This is good.

Oh! And W- is giving Ledger a try. The tool he’d been using to keep track of finances dropped some more of his data recently. Because it’s all magic inside, he couldn’t figure out what happened. I’d been going on about how awesome Ledger is, this command-line double-entry accounting tool that provides no bells or whistles but with which I can do all sorts of crazy things. He described how he wanted to budget, and I showed him how to do it. No screencast, but I do plan to review the audio and create some supporting materials for my upcoming article on Ledger and Gnuplot.

Life is good. =)

Library Elf is awesome

February 3, 2008 - Categories: library, reading

image

When I blogged about my totally small-school library reminder script, Claudine recommended Library Elf, which helps people manage their library loans. I hopped over and set weekly reminders to go out on Sunday, just before my Monday book runs. I just got my first reminder e-mail from them, and I am impressed. C’mon. Look at that screenshot. It tells me when books are due and when my holds expire. If I hover over the links, I can see which books they are. The lists of holds ready for pickup and books that are checked out are sorted by date, which makes perfect sense. I can add W-‘s library card and track his books as well. =)

Awesome awesome awesome.

Chapter 7: Managing Your Notes in Emacs – done!

February 3, 2008 - Categories: emacs, notetaking, wickedcoolemacs, writing

By golly, it’s starting to look like a book.

I just finished putting together my third chapter, which is really chapter 7 in the book: managing your notes and Emacs. This chapter is about taking notes in Emacs, focusing on Remember, Org, Planner, and blogs. At 38 pages, it’s a little over my planned 35 pages, and I haven’t even covered all the things that I wanted to like random information management with Howm, blogging to Blosxom, and customizing Planner templates. Maybe after some really fierce copy-editing, I’ll have some space.

I sent a copy off to my editor, and I just finished uploading a PDF and OpenOffice.org document that you can download and read. There’s also an HTML version, but the formatting is a little wonky. I hope you find this useful! I didn’t blog as much of this as I did last time, so I missed out on all the wonderful feedback people could’ve given me. I’ll do that next chapter.

I formatted most of the chapter this afternoon, hanging out with Leigh Honeywell, Seth Hardy, and a few other geeks at the Linux Caffe. Leigh’s working on a book proposal, and we’re thinking of organizing a writing group for technical authors. We’ll start by meeting this Thursday at Leigh’s apartment. iI enjoyed chatting with them as I worked on my book, drifting in and out of conversations. I think it would be a good idea to work somewhere quieter, with plenty of table room for assorted gadgets, but this was a good start.

Next chapter: contact management in Emacs. I’ve got a lot of fun hacks that I want to share here, so coming up with material shouldn’t be hard. I’ll keep you posted!

(UPDATE: Fixed links. Thanks to Leschinsky Oleg for pointing that out!)

Upcoming events

February 3, 2008 - Categories: blogging, speaking

image My proposal was accepted at an IBM conference on best practices! I’m thrilled to have all these opportunities to share what I’m learning and to learn even more from other people. It’s a little mindboggling dealing with all of this as an early-career employee with less than half a year on the job, but I know from personal experience just how wonderful public speaking is when it comes to networking and connecting with people.

I’ll need to work extra hard to balance all these conferences with paying work, and to show the business value of all of that. It’s a bit of a challenge in the consulting world where we’re supposed to maximize our utilization, but maybe it will work out well.

To help keep track of all the conferences, articles, and other significant events on my horizon, I’ve added an upcoming events widget below the calendar on my blog. I used MagpieRSS and PHP to read the XML file from Google Calendar, and I did a little regular expression magic to get just the dates and locations. Maybe you’ll find it useful too!

Business responsibilities come first. If my clients aren’t happy, I may just have to pull out of some of the conferences. I think everything will work out, though, and the conferences will help me bring even more value to my client work!

Weekly review – Feb 9, 2007

February 9, 2008 - Categories: weekly

I haven’t written in a while, and my fingers are starting to itch. I’ve been preoccupied. Last Thursday I learned (again!) that an hour before the end of the day is not the best time to attempt to switch my work laptop over to Linux, and I spent the rest of that evening trying to restore some kind of functionality. On Friday I got everything sorted out while still being able to do my regular work, and now I’m posting this from a nicely set-up Linux. I will get Emacs blog posting up again soon.

I also spent a good deal of time catching up with Quinn Fung, one of my best friends in Canada. She’s in Toronto for a few weeks in order to interview people for research, and she’s staying over here. (I was a student not too long ago, and I remember how nice it is not to have to worry about accommodation!) I’ve really enjoyed our reflections on Emacs, life, music, education… and I should write about them because I think you’d enjoy them too.

Because I hadn’t regularly written during the week, it’s hard for me to tell you what I did and what the highlights were. Fortunately, I remembered to jot down some points during the commute home last Friday, so here they are:

Monday: Started a new engagement at another financial services company
Tuesday: Worked on social media wiki, had a good status-check meeting
Wednesday: Worked on my first Drupal module (opt-in)
Wednesday: Note about learning from example (… darn if I can remember what that was about)
Thursday: Worked on social media wiki, learned about the table-plus macro, thought about information design
Thursday: Started switching over to Linux
Thursday: Went to writing session at Leigh Honeywell’s place. Would have written if I hadn’t been trying to fix my computer. Nice to catch up, though!
Friday: Got Linux working again.
Friday: Brainstormed a 40-minute talk together with Bernie Michalik using a whiteboard. Good stuff.
Friday: Installed Node Relativity and started to play around with that for another module I need to write.

Being in flux unnerves me. I hadn’t been keeping track of my time in Emacs, hadn’t been writing regularly, hadn’t done my weekly planning… I felt adrift. I couldn’t point to anchors in my day, blog posts and checked-off tasks that showed me that I’d done something. Brrr.

So enough mucking about with VMWare or VirtualBox. Time to write. Time to think. Time to relax.

Powered by ScribeFire.

Linux and Windows playing nicely together

February 10, 2008 - Categories: geek, linux

I spent the better part of this weekend trying to get Linux and Windows to play nicely together. I’m much more comfortable in Linux than I am at Windows, but I need both: Linux for development, and Windows to deal with all the other office productivity stuff. After I started running into frustrating Windows-specific issues, I realized that Linux-like workarounds on Windows just weren’t enough for me. So I repartitioned my hard disk, installed IBM’s Open Client for Linux, and switched over. 

It wasn’t easy to get VMware up and running. I saw more Blue Screens of Death than I had in the past year. It was frustrating switching back and forth, trying to figure out the right combination of drivers so that I could use VMware to run an existing Windows XP installation. After I installed the VMware SCSI drivers, my SATA drive finely worked.

Audio wasn’t enabled by default, but after I set that up, even Dragon NaturallySpeaking worked without a hitch. So now, I’m dictating into Windows, which is running in Linux. This makes me happy. =)

Rough guide to getting an existing Windows XP partition to boot as a VMWare guest under Linux

February 10, 2008 - Categories: geek

Because I might have to do this again someday…

  1. Install VMWare Server. Use the advanced config to create an image that uses your existing hard disk.
  2. Boot Windows (physically). Back up the current hardware profile.
  3. Boot Linux. Download the SCSI drivers from http://www.vmware.com/download/ws/index.html#drivers ..
  4. Change your GRUB config so that it doesn’t time out. You do _not_ want to accidentally boot your Linux partition while inside Linux.
  5. Start VMWare with your Windows image. Use the recovery console. Mount the SCSI drivers FLP as a floppy and copy the files to c:\windows\system32\drivers .
  6. Boot Windows physically. Use the Control Panel – Add New Hardware dialog to add the VMWare SCSI driver. It might also be a good idea to disable ACPI for the computer
  7. Boot to Linux. Use VMWare to load the Windows image.

The SATA drive complicated things a bit, but I eventually got stuff sorted out. Yay! Next step: Wonder if seamless is worth the trouble…

Powered by ScribeFire.

Writing and "Better: A Surgeon’s Notes on Performance"

February 10, 2008 - Categories: blogging, reading, writing

I don’t remember where I got the book recommendation to read this book, but it’s a fascinating read, and I aspire to this kind of life. (Although not in medicine – I couldn’t bear the responsibility!).

Better: A Surgeon’s Notes on Performance
by Atul Gawande

Read more about this book…

 

Here’s a quote for all you writers, bloggers, and other aspiring communicators, from the afterword on how to become a positive deviant [p.249]

My fourth suggestion was: write something. I don’t mean this to be an intimidating suggestion. It makes no difference whether you write five paragraphs or a blog, a paper for a professional journal, or a poem for reading group. Just write. What you write need not achieve perfection. It need only add some small observation about your world.

You should also not underestimate the power of the act of writing itself. I did not write until I became a doctor. But once I became a doctor, I found I needed to write. For all its complexity, medicine is more physically than intellectually taxing. Because medicine is a retail enterprise, because doctors provide their services to one person after another, it can be a grind. You can lose your larger sense of purpose. But writing lets you step back and think through a problem. Even the angriest rant forces the writer to achieve a degree of thoughtfulness.

… Most of all, by offering your reflections to an audience, even a small one, you make yourself part of a larger world. Put a few thoughts on a topic in just a newsletter, and you find yourself wondering nervously: Will people notice it? What will they think? Did I say something dumb? An audience is a community. The published word is a declaration of membership in that community and also the willingness to contribute something meaningful to it.

So choose your audience. Write something.

Atul Gawande, Better

My blog anchors my participation in the larger world, resulting in not only online interaction but real-world as was well. It makes me part of the conversation.

When I talk to people who don’t blog. I feel a strange disconnect as if the conversation we have stops there: stops at the e-mail exchange with each other, stops at the meeting, is confined within the boundaries of our encounters. When I talk to people who blog, the conversation is wide open and embraces the world.

It’s hard to explain that to the people who are afraid that they might have nothing to say. The truth is that you won’t discover what you have to say until you say it. Sometimes it’s hard to remember that not everyone has discovered the use of writing in reflecting and connecting with others. People have other priorities. They have no time. And perhaps at the core of it, they are shy as I was shy, as I still am shy. But I can overcome my shyness because I want to be part of that larger conversation with them. With you.

Write, and join the conversation.

You have received a painting from Sacha

February 11, 2008 - Categories: sketches

Building relationships: 10 ways to get the most out of social networking sites

February 11, 2008 - Categories: connecting

Dustin Wax shares these tips in Building Relationships: 10 Ways to Get the Most Out of Social Networking Sites – Lifehack.org :

  1. Have a clear purpose
  2. Complete your profile
  3. Don’t follow the leader
  4. Accept everyone
  5. Add everyone you know, no matter how little
  6. Pick one or two networks and work them
  7. Send messages
  8. Have something to say
  9. Avoid clutter
  10. Firewall your personal with [sic] business lives

Dustin Wax, Building Relationships: 10 Ways to Get the Most Out of Social Networking Sites – Lifehack.org

I agree with most of his list, except for Accept everyone and Firewall your personal and business lives. Here’s why:

I don’t accept everyone. At least, not until I’ve had a good conversation with them. Many people on social networking sites seem to think that it’s all about collecting connections. The only time you’ll ever hear from them is when they send you a form-letter invite, and that’s it. I don’t mind connecting with people out of the blue, but I want to make at least a little effort to establish a connection first. I want to know more about my connections than just what’s on their profile. What’s the point of social networking if I can’t make a personal introduction? After all, if people are in my network, I should be able to vouch for them, or at least say something that people wouldn’t get if they just search the Net. So if people want to collect connections, but they don’t want to engage in at least one e-mail conversation about why they want to connect and what their personal goals are, if they’ve never checked out my blog or told me about theirs, if they’ve never even made an effort to find things we have in common and how we can help each other… I won’t connect. I’d rather limit my already-large contact list to people I feel comfortable reaching out to. Similarly, I don’t add people en-masse, just people I would like to keep in touch with. And (gasp!) I prune the contact list once in a while. After all, if people just want to keep an eye on me, they can read my blog or use lots of other asymmetric ways to keep in touch. My contact list should be a list of people who would read my e-mail or take my call if I needed help, and who are willing to spend some time helping me get to know them.

I don’t separate my business and personal life. People who do this miss out on such rich interactions. The truth is, you need that personal touch to make business relationships sparkle. I can’t tell you how many times my personal blog has led to interesting conversations with my clients and colleagues. Granted, there are some things I don’t blog (mainly because I don’t have the time to write about everything I do want to blog). But I won’t try to build barriers between my personal and business life. This is who I am: all of it, all my blog posts and sketches and rants. It is possible to have both integrity of self and honesty of self-expression.

How about you? How do you feel about open networking or work-life separation?

Technorati Tags:

Powered by ScribeFire.

I love you library!

February 11, 2008 - Categories: library

On February 21, when you access the library’s catalogue and your account online, you will see the following improvements

  • Book covers and reviews for many items
  • Receive email notification about holds and overdue material, if you have provided library staff with your email address. After February 21, contact your branch or call Answerline (416-393-7131) and provide us with your email address, if you wish to take advantage of this new service.
  • Ability to suspend your holds request for a period of time – eg. do not fill this hold between July 10 and August 1. Your place in the holds queue is maintained but you are not called if you come to the top of the list between July 10 and August 1. After August 1 your hold becomes active again and you will be called when the item is available.
  • Ability to change the pick-up location for unfilled hold requests.

Toronto Public Library > About the Library > Website Redesign

I can’t wait to see the new interface!

Powered by ScribeFire.

Rumor has it that Dragon NaturallySpeaking works under WINE

February 11, 2008 - Categories: linux

That would be _just_ awesome. Wine Application DB – Viewing App: Dragon Naturally Speaking 9

I wonder if it will let me program in Emacs through dictation?

UPDATE: Darn! I have Dragon NaturallySpeaking 9.5, which does not work. Boo. Back to VMWare, then…

Making arrangements for my cat

February 12, 2008 - Categories: Uncategorized

Trying to arrange my cat’s transit isn’t easy. Today I called the Japanese Quarantine Service. Not trusting my command of the Japanese language (it’s been two years of no practice!), I decided to just try to make it in English. I’d rather repeat myself using creative analogies than have my cat turned back at the airport!

The woman at the Yokohama head office assured me that I didn’t need the microchip and quarantine system they have for pets brought into Japan. A health certificate would do. She advised me to call the Narita Terminal 2 branch for more details.

So I called up the Narita Terminal 2 branch and explained that I wanted to bring my cat from the Philippines to Toronto through Narita, and that I wanted to know what papers I needed. The man on the other end of the line apologized, saying he spoke little English.

After trying to explain it in different ways, I gave in and said, “Ummm… neko no koto desu.”

“Oh, cat! Nihongo ga wakarimasu ka?”

I explained in the fragments of Japanese that I remembered that no, not really, I’m really bad at Japanese (heta desu), but we could try. In broken Japanese, I explained what I wanted to do. Relieved, he launched into a confident (and fast!) explanation, which I had to interrupt with “Gomen nasai, zenzen wakarimasen deshita! (Sorry, I didn’t understand a word of that!)” He slowed down and made an effort to intersperse English words whenever he could–and that’s how I found out that I just need to check with the airline.

See, if Neko were here, my Japanese would probably be better. I had been studying Japanese when we tore open the bathroom wall to save this tiny ant-covered kitten, so naturally I named the cat “Cat” in Japanese. (My sister calls her Catastrophix, based on the characters in the wonderful series Asterix and Obelix.) I practiced my Japanese on her, and that’s probably why she won’t listen to anyone else in the household. Anyway…

So I need a health certificate no earlier than 10 days of departure and a document from a vet showing rabies vaccination no later than 30 days prior to departure. As I won’t be there a full month, I’ll need to ask my family to take care of getting the rabies vaccination certificate.

I’ve missed my cat so much. I’m looking forward to bringing her over. Don’t know what she’ll do about snow, though. Looks like she’ll be an indoor cat with a heated bed and all! ;)

Powered by ScribeFire.

Taking quick notes for books

February 12, 2008 - Categories: notetaking, reading

I love my book notes system. I almost always ask fellow bookworms how they keep track of what they’ve learned from the books they’ve read, and their suggestions have helped me put together a pretty darn good system. Here’s how I work:

Capture: I usually read books in front of my computer so that I can use Dragon NaturallySpeaking to take notes while I read. I speak the page number and the quote I want to remember. Using speech recognition to write book notes means that I don’t have to take my hands off the book, and I don’t have to perch it precariously on my lap as I try to type in quotes. Speech recognition is reasonably accurate, and I love breezing through a passage at some 300 words a minute. This is awesome. This is so much better than my old way of doing things. I suspect this also does good things for my ability to recall important points. When I finish a page, I correct the text that’s already there.

If I’m not at my computer, I record notes into a portable voice recorder. If I’m feeling lucky, I get DNS to auto-transcribe the recordings. This doesn’t usually work. Background noise messes up the recognition. But it’s usually good enough to let me find the pages again. Or–shhh–sometimes I dogear pages. ;)

Organize: I copy the book notes into a plain text file that uses the Org outline mode. I organize my booknotes with the titles as second-level headings, and I sometimes tag the books with keywords.

Store: I copy my book notes onto my Nintendo DS, where I can use
the ReadMore homebrew application to quickly review my book notes on
the subway.

Review: Every so often, I whiz through the books in my book notes system so that I can keep the key points fresh in my mind. This review is also a good opportunity to pass a book’s idea on to someone else.

What would make this even better? A Nintendo or Palm text editor that understood Org files would be just amazing.  Integration with LibraryThing would be nice, too, so that people could easily find out which books to discuss with me. Even without those pieces, though, my system works really really well for me.

What’s your system?

Powered by ScribeFire.

Sketch: My first writing group

February 12, 2008 - Categories: sketches

080213-02.23.47.png

You have received a painting from Sacha

February 12, 2008 - Categories: sketches

080213-02.30.08.png

Chapter 6: Being Big Brother (plan)

February 13, 2008 - Categories: emacs, wickedcoolemacs

I haven’t been writing about Emacs lately. Here’s my outline so that you can help keep me honest. =) My next chapter is about the Big Brother Database (BBDB) and contact management in Emacs, which is one of the things that made people laugh when I showed my Emacs configuration at DemoCamp in Toronto. Anyway, here’s what I’m planning to write about:

Chapter 6: Being Big Brother (30 pages)

BBDB: Show an address list

February 13, 2008 - Categories: emacs, wickedcoolemacs

I sometimes feel like bringing out my stationery, my fountain pen, and a coil of stamps, and writing cards to random people in my address book. When I travel, I also enjoy writing quick postcards to people who live in the country I’m visiting. That’s why I wrote this code to filter my address book so that I could see only the contacts with snail-mail addresses, or only the contacts whose snail-mail addresses match a regular expression.

You can call M-x wicked/bbdb-find-people-with-addresses to filter the displayed BBDB records. Press RET at the “Regexp: ” prompt in order to show all records with addresses, or type in a regular expression that matches anything in the addresses field. By default,

wicked/bbdb-find-people-with-addresses works on the BBDB records already shown in the *BBDB* window, or all records if none are shown. This allows you to successively filter BBDB records. (Combined with the other BBDB projects I’ll blog about, you’ll be able to get a list of all the people you haven’t talked to in three months but who you’ve talked to within the year, who are interested in Emacs and cooking but not social networking, and who have a phone number in your contact database! How’s that for targeted mail? ;) ) Anyway, if you want to start your search from scratch and you don’t want to call M-x bbdb with . as the regular expression, use the universal prefix argument (C-u M-x wicked/bbdb-find-people-with-addresses) and it will search your entire contact database.

Have fun! =)

(defun wicked/bbdb-find-people-with-addresses (&optional regexp records)
  "Filter the displayed BBDB records to those with addresses."
  (interactive "MRegexp: ")
  (let ((records (if current-prefix-arg (bbdb-records)
           (or records bbdb-records (bbdb-records))))
        filtered
        cons next)
    (while records
      (when (and (bbdb-record-get-field-internal (if (arrayp (car records))
                            (car records)
                                                 (caar records)) 'address)
         (or (null regexp)
             (string= regexp "")
             (delq nil
               (mapcar
                (lambda (address)
                  (string-match regexp (wicked/bbdb-address-string address)))
                (bbdb-record-get-field-internal
                 (if (arrayp (car records))
                 (car records)
                   (caar records)) 'address)))))
        (setq filtered (cons (if (arrayp (car records))
                                 (car records)
                               (caar records)) filtered)))
      (setq records (cdr records)))
    (bbdb-display-records (nreverse filtered))))

(defun wicked/bbdb-address-string (address)
  "Return ADDRESS as a string."
  (mapconcat
   'identity
   (delq nil
         (list
          (mapconcat 'identity (bbdb-address-streets address) ", ")
          (let ((s (bbdb-address-city address))) (and (not (string= s "")) s))
      (let ((s (bbdb-address-state address))) (and (not (string= s "")) s))
      (let ((s (bbdb-address-zip address))) (and (not (string= s "")) s))
      (let ((s (bbdb-address-country address))) (and (not (string= s "")) s))))
   ", "))

(defun wicked/bbdb-yank-addresses ()
  "Copy displayed addresses to the kill ring."
  (interactive)
  (kill-new
   (mapconcat
    (lambda (record)
      (concat
       (bbdb-record-name (car record)) "\n"
       (mapconcat
    (lambda (address)
      (concat (bbdb-address-location address) ": " (wicked/bbdb-address-string address)))
    (bbdb-record-get-field-internal (car record) 'address)
    "\n")))
    bbdb-records
    "\n\n")))

BBDB: Show a phone list

February 14, 2008 - Categories: bbdb, emacs, wickedcoolemacs

When I find myself in an airport, I sometimes take a little time to say hi to a bunch of people who are suddenly just a local call a way. Or sometimes I’m thinking of going somewhere, and instead of flipping through my phone’s address book, I’ll check my computer to see who might be interested.

You can use this function to filter phone numbers in your BBDB based on a regular expression. As usual, leaving the regular expression blank means that all records with phone numbers will be displayed. By default, the function works on the currently displayed records, allowing you to apply multiple filters. You can call it with a universal prefix argument (C-u M-x sacha/bbdb-find-people-with-phones) to match against all contacts in your database.

Here’s the code:

(defun sacha/bbdb-find-people-with-phones (&optional regexp records)
  "Search for phone numbers that match REGEXP in BBDB RECORDS.
Without a prefix argument, filter the list of displayed records.
Call with a prefix argument to search the entire database.  This
works best if you use a consistent format to store your phone
numbers.  The search will strip out non-numeric characters. For
example, +1-888-123-4567 will be treated as +18001234567.

To search for all numbers in Toronto, search for
\"+1\\(416\\|647\\)\". If you search for certain areas
frequently, it might be a good idea to define a function for
them."
  (interactive (list (read-string "Regexp: ")
		     (if current-prefix-arg
			 (bbdb-records)
		       (or bbdb-records (bbdb-records)))))
  (let (filtered next)
    (while records
      (when
          (and (bbdb-record-get-field-internal
		(if (arrayp (car records))
		    (car records)
		  (caar records)) 'phone)
               (or
                (null regexp)
		(string= regexp "")
                (delq nil
                      (mapcar
                       (lambda (phone)
			 (when (string-match regexp (sacha/bbdb-phone-string phone))
			   (concat (bbdb-phone-location phone) ": " (bbdb-phone-string phone))))
                       (bbdb-record-get-field-internal
                        (if (arrayp (car records))
                            (car records)
                          (caar records)) 'phone)))))
        (setq filtered (cons (if (arrayp (car records))
                                 (car records)
                               (caar records)) filtered)))
      (setq records (cdr records)))
    (bbdb-display-records (nreverse filtered))))

(defun sacha/bbdb-phone-string (&optional phone)
  "Strip non-numeric characters from PHONE, except for +."
  (replace-regexp-in-string "[^+1234567890]" "" (bbdb-phone-string phone)))
   
(defun sacha/bbdb-yank-phones ()
  "Copy a phone list into the kill ring."
  (interactive)
  (kill-new
   (mapconcat
    (lambda (record)
      (mapconcat
       (lambda (phone)
	 (concat (bbdb-record-name (car record)) "\t" 
                 (bbdb-phone-location phone) "\t"
		 (bbdb-phone-string phone)))
        (bbdb-record-get-field-internal (car record) 'phone)
        "\n"))
    bbdb-records
    "\n")))

Software as a service, high tech startup :: Morph Code :: Schedule of Events

February 14, 2008 - Categories: entrepreneurship, philippines

Winston Damarillo is an all-around cool guy and a serial tech entrepreneur who wants to help more people start up tech companies in the Philippines. So he put together Mor.ph, and now Mor.ph is holding a bootcamp for aspiring tech entrepreneurs. It’s also a business competition, so if you win, you get funding, support, and mentoring. Good stuff. Kinda makes me wish I was based in Manila instead! ;)

Software as a service, high tech startup :: Morph Code :: Schedule of Events

BBDB: Filtering by Mail Alias

February 16, 2008 - Categories: bbdb, emacs, wickedcoolemacs

You can use “a” (bbdb-add-or-remove-mail-alias) in BBDB buffers to add a mail alias to the current entry, or “* a” to add a mail alias to all displayed entries. I use mail aliases to tag or categorize my contacts (example: emacs, writing, etc.). The following functions can make it easy for you to filter displayed records using a combination of keywords:

Display records matching ALIAS and ALIAS M-x sacha/bbdb-filter-displayed-records-by-alias RET alias alias
Display records matching ALIAS or ALIAS C-u M-x sacha/bbdb-filter-displayed-records-by-alias RET alias alias
Omit records matching ALIAS and ALIAS M-x sacha/bbdb-omit-displayed-records-by-alias RET alias alias
Omit records matching ALIAS or ALIAS C-u M-x sacha/bbdb-omit-displayed-records-by-alias RET alias alias

Here’s the code:

(defun sacha/bbdb-filter-by-alias-match-all (query-aliases record-aliases)
  "Return non-nil if all QUERY-ALIASES are in RECORD-ALIASES."
  (let ((result t))
    (while query-aliases
      (unless (member (car query-aliases) record-aliases)
        (setq query-aliases nil
              result nil))
      (setq query-aliases (cdr query-aliases)))
    result))

(defun sacha/bbdb-filter-by-alias-match-any (query-aliases record-aliases)
  "Return non-nil if any in QUERY-ALIASES can be found in RECORD-ALIASES."
  (let (result)
    (while query-aliases
      (when (member (car query-aliases) record-aliases)
        (setq query-aliases nil
              result t))
      (setq query-aliases (cdr query-aliases)))
    result))

;; Moved this to a convenience function so that we don't
;; have to deal with invert and property splitting.
(defun sacha/bbdb-filter-by-alias (bbdb-records
                                   alias-filter-function
                                   query
                                   &optional invert)
  "Return only the BBDB-RECORDS that match ALIAS-FILTER-FUNCTION.
ALIAS-FILTER-FUNCTION should accept two arguments:
 - QUERY, a list of keywords to search for
 - aliases, a list of keywords from the record
If INVERT is non-nil, return only the records that do
not match."
  (delq nil
        (mapcar
         (lambda (rec)
           (if (funcall alias-filter-function
                        query
                        (split-string
                         (or (bbdb-record-getprop
                              (if (vectorp rec)
                                  rec
                                (car rec))
                              'mail-alias) "")
                         "[ \n\t,]+"))
               (when (null invert) rec)
             (when invert rec)))
         bbdb-records)))

;; Splitting this into two functions because of interactive calling.
(defun sacha/bbdb-filter-displayed-records-by-alias (query &optional any)
  "Display only records whose mail-aliases match QUERY.
If ANY is non-nil, match if any of the keywords in QUERY are
present.
See also `sacha/bbdb-omit-displayed-records-by-alias'."
  (interactive (list
                (let ((crm-separator " "))
                  (completing-read-multiple
                   "Mail aliases: "
                   (bbdb-get-mail-aliases)))
                current-prefix-arg))
  (when (stringp query)
    (setq query (split-string query "[ \n\t,]+")))
  (bbdb-display-records
   (sacha/bbdb-filter-by-alias
    (or bbdb-records (bbdb-records))
    (if any
        'sacha/bbdb-filter-by-alias-match-any
      'sacha/bbdb-filter-by-alias-match-all)
    query)))

;; Splitting this into two functions because of interactive calling.
(defun sacha/bbdb-omit-displayed-records-by-alias (query &optional any)
  "Display only records whose mail-aliases do not match QUERY.
If ANY is non-nil, match if any of the keywords in QUERY are
present.

See also `sacha/bbdb-filter-displayed-records-by-alias'."
  (interactive (list
                (let ((crm-separator " "))
                  (completing-read-multiple
                   "Mail aliases: "
                   (bbdb-get-mail-aliases))
                  current-prefix-arg)))
  (when (stringp query)
    (setq query (split-string query "[ \n\t,]+")))
  (bbdb-display-records
   (sacha/bbdb-filter-by-alias
    (or bbdb-records (bbdb-records))
    (if any
        'sacha/bbdb-filter-by-alias-match-any
      'sacha/bbdb-filter-by-alias-match-all)
    query
    t)))

This will be part of my book, Wicked Cool Emacs. Looking forward to putting it together!

Trying out virtual assistants

February 16, 2008 - Categories: life

I’ve set aside some of my play money to try out virtual assistants. I want to learn more about delegating tasks effectively, because that’s something that’ll help me a lot in the future. Help with online research, document and presentation design, and miscellaneous tasks would be appreciated, too. There’s always that urge to go and just stick the money into my long-term investments account, but I think this would be a good long-term investment as well.

I’ve been focusing on virtual assistants from the Philippines because I want to help out and because I’ll have fewer language barriers. (It may be a good opportunity to pick up a dialect, even!) Over 80 virtual assistants and companies have registered on VA4U. The best practice seems to be to go with larger companies that can coordinate different kinds of talent and cover for gaps in staffing, but it’s hard to get a sense of size in the list.

And every time I come across someone who confesses to be a computer geek, or someone who has a computer science degree, the teacher inside me feels a pang. I want to give them more interesting work than what most people might give them. Something that matches their strengths and helps them develop the skills they want to have. Yes, I know, I’m technically hiring or contracting with people, but I want to treat them as partners and help them develop anyway.

So I’ve started asking these potential virtual assistants what kind of work they love to do and what they want to get better at. Maybe we can find something that will work out for everyone. =)

Have you tried having a virtual assistant? How was your experience?

Ever been curious about it? What would you outsource?

Geni – Your family tree online

February 17, 2008 - Categories: connecting, family, social

Okay, I did find another social network I wanted to join online.  Geni is a family-oriented application, and you can use it to collaboratively build your family tree. I don’t know if it can handle the complexities of the Chua clan (my grandmother led a complicated life! ;) ), but it isn’t a bad way to start. The good thing about it is that it doesn’t rely on everyone opting in, because you can fill in other people’s details. And once you’ve gotten your family tree in place, you can share photos, look up birthdays, send messages, announce events, that sort of thing.

Check it out!

Weekly report – February 17, 2008

February 17, 2008 - Categories: weekly

It’s been a good week for experiments. I gave a presentation on Web 2.0 and the enterprise to a large financial institution, and I took responsibility for the second half of a Web 2.0 workshop at a publishing company. On a personal note, I tried outsourcing some of my online research to virtualworkdesk.com, ordering gifts (and a suit!) off eBay.ca, and entering data into Geni.

Here’s what my week looked like:

My goals for next week are to:

Oh, and it would be nice to sort out Ledger envelope budgeting again… =)

You have received a painting from Sacha

February 19, 2008 - Categories: sketches

080219-06.07.37.png

You have received a painting from Sacha

February 19, 2008 - Categories: sketches

080219-06.16.19.png

Spontaneous outbursts of baked goods

February 19, 2008 - Categories: sketches

080219-06.24.37.png

You have received a painting from Sacha

February 20, 2008 - Categories: sketches

080220-23.18.22.png

Weekly review – Week ending February 24

February 23, 2008 - Categories: sketches, weekly

080223-15.31.46.png

New rule for presentations

February 24, 2008 - Categories: sketches

080225-04.10.41.png

Doodling

February 24, 2008 - Categories: sketches

080225-04.11.14.png

Speaker’s block

February 24, 2008 - Categories: sketches

080225-04.11.44.png

You have received a painting from Sacha

February 25, 2008 - Categories: sketches

080226-02.05.27.png

You have received a painting from Sacha

February 25, 2008 - Categories: sketches

080226-02.13.04.png

You have received a painting from Sacha

February 25, 2008 - Categories: sketches

080226-02.20.04.png

You have received a painting from Sacha

February 26, 2008 - Categories: sketches

080226-14.44.56.png

Headless chicken impression

February 26, 2008 - Categories: conference

Today is not my day.

As it turns out, my presentation on “Blogging Your Way Out of a Job… and Into a Career” for the Concordia University Alumni Association is tomorrow evening, not Friday evening as I thought. (Next time, I should create a calendar entry while reading e-mail, instead of relying on my memory!) Apparently it’s been quite a hit, with over 60 people registered and people pleading to get in. If I do this right, it might even result in more business for my team at IBM. (Must remember to put in a slide about who I am, and add something like that to the closing.)

I wanted to print my handouts on business cards. Bringing home something physical from an event is a good way to remember to act on what you’ve learned. But the printer at home stubbornly refused to feed the Avery business card forms I picked up, and Staples.ca didn’t seem to let me make totally custom business cards. Taking off on Jonathan Coulton’s “Big Bad World One”, I couldn’t help but sing, “I quit, I’m done, I don’t think it’s going to turn out okay. It’s no fair and it’s no fun if every time it’s gonna print the same way: Me zero, big bad printer one.”

So I threw up my hands and considered my backup plans. I could just point the audience to one URL and have them look up the resources from there, but there’s something about taking a visible reminder home. What else could I do?

Fortunately, I had plenty of blank index cards lying around, thanks to my experimentations with paper-based productivity planning. After much tweaking, I got the printer to print on index cards. The margins are off because the printer won’t let me print less than an inch from the edge, but I limited the number of lines and the result looks deliberately balanced.

Now all I have to do is actually build the page, update the presentation, rehearse it, and get everything sorted out. Oh, and do the rest of my day job, too. But something I’ve noticed–and I don’t know how I learned to do this–is that even while part of me can flail wildly about in a headless chicken impression, part of me is always looking for the humor in the entire thing, part of me is always planning ahead and thinking of backup plans, and part of me just focuses on getting the work done.

Be like a duck. Calm on the surface, but always paddling like the dickens underneath.

Michael Caine, actor

=)

Networking 2.0: Blogging Your Way out of a Job… and Into a Career

February 27, 2008 - Categories: blogging, connecting

Blog for FREE on wordpress.com or blogger.com! Make a habit of writing at least once a week, and your blog will help you develop your passion, improve your skills, and build your network. Here are some ideas to help you get started:

  1. Who are you?
  2. What are your interests?
  3. What are your goals?
  4. What’s a typical day in your life?
  5. How did you get started?
  6. Share a recent challenge or success story!
  7. Share a tip!

COMING SOON: The presentation and recording from the event
Check this page on March 7 (Friday) for more news, or leave a comment below so that I can e-mail you when new tips are up!

Connect with other people who attended this talk by leaving a comment! Put in your name, your e-mail address, and the address of your blog (ex: http://example.blogspot.com). Tell us what you thought about the presentation, and what you’d like to learn more about. Your e-mail address will not be shared or sold with anyone, and your name will be automatically linked to your blog. Check out other people’s comments and blogs to find out more. Good luck and have fun!

You have received a painting from Sacha

February 27, 2008 - Categories: sketches

080228-05.45.21.png

You have received a painting from Sacha

February 29, 2008 - Categories: sketches

080229-06.05.17.png

Why DemoCamp is one of my favorite networking events

February 29, 2008 - Categories: connecting

I love DemoCamp and the whole BarCampToronto scene. I’ve made all sorts of incredible connections there. Let me tell you a story from just this Monday’s DemoCamp17, and you’ll see why.

It was towards the end of the DemoCamp pub night, past the bar’s closing time. I headed over to say hi to Kaleem Khan, whom I hadn’t talked with that evening. He was talking to a woman I didn’t recognize, so I introduced myself and asked whether she had been to DemoCamp before. She introduced herself as Alex and said that this was her first DemoCamp and that her friend had told her about it. Kaleem joked that clearly nobody had told Alex that it would be a conference full of geeks. Alex laughed and said that she works with scientists, so geeks were extroverts in comparison. When she mentioned scientists, I perked up and told her that there was someone she really needed to met. I headed across the room and found Jamie McQuay chatting with a few other people. At the first break in the conversation, I kidnapped Jamie and steered him across the room to where Alex was sitting. I mentioned that Jamie was helping organize a SciBarCamp (an unconference for scientist-types), and I told Jamie about how the topic of scientists had come up. Jamie and Alex started chatting, and the next time I checked in on them, I heard Alex invite Jamie to get in touch with her to see if her organization might be interested in sponsoring SciBarCamp. How cool was that?

That’s a terrific example of the kind of connections I love making. By keeping my ears open, I can come across all these opportunities to connect the dots. If I know what people are interested in or are looking for, then I can connect them with the peolpe, ideas, or tools they need in order to make things happen.

DemoCamp has been a consistently fantastic place for me to make those connections. Why? I think it’s because of these reasons:

People who go to DemoCamp are interesting. They’re independent consultants, startup founders, and even the occasional big-company anomaly like me. They’ve all got something interesting about them, and they make it easy to find out what that interesting thing is.

The demos and Ignite presentations are a terrific way to get the conversation started. High-energy, eye-opening demos put everyone in an optimistic and open mood, and do away with all the small talk about the weather. My favorite opener is, “So, which of the demos and Ignite presentations did you like the most?” From there, I can find out more about why people found them interesting and what else they’re into. Plus, I can carry their compliments back to the speakers for extra karma points!

I know or know of enough people to get network effects. I’ve reached the tipping point. I get economies of scale. When I meet new people, I can usually think of people they should get to know. If I don’t know someone, I know the other connectors can help me find that person – and then I’ll know them too. I’m on hugging terms with many DemoCamp regulars, and I feel warm and fuzzy about people there because I’ve gotten to know and admire them through their blog entries, presentations, comments, and e-mail.

How can I connect even better at DemoCamp?

How about you? Been to DemoCamp? What do you think?

Notes from "Networking 2.0: Blogging Your Way Out of a Job and Into a Career"; the experience of speaking

February 29, 2008 - Categories: connecting, speaking

[mostly drafted right after I got home]

I just got back from a presentation I gave to the Concordia University Alumni Association on blogging your way out of a job into a career. My voice is a little hoarse and my feet are slowly getting reacquainted with the ground. No, seriously–I must remember not to wear those heels to presentations. But I really enjoyed sharing those stories and tips, and I’m glad that people found the presentation not only informative but also entertaining.

What did I do well?

The combination of blogging, social networking, writing, and self-development in a single talk made this one really pop with passion. I love sharing my experiences and tips on social media because I can’t wait to see what other people will do with it, and if there’s anything I can do to help them get over that rut, that’s awesome! This passion and all the practice I’ve had talking about these topics made it really easy to get up there and focus on making a connection.

I used the rule of three all over the place: passion, skills, and network; "I don’t know what to do, I don’t have the time, I don’t know who’ll read it;" remember, reflect, reach out; start a blog, share regularly, reach out. This fractal structure helped me prepare the presentation (not too long, not too short), remember what I was going to say, and show some semblance of order in the presentation.

I put in some effort and a few dollars into visually fixing up this presentation with stock illustrations from stockxpert.com. Most of my presentations have been plain text (white on a black background, usually), but I felt like giving graphics a try. The coordinated graphics I use helped make my presentation feel more fun for me. Practice will help me get better and better at communicating visually as well as verbally…

I rehearsed the entire talk while reading my speaker notes, recording it as an MP3. I looped over this recording during my commute today. This helped keep the topics in my mind. I also printed out a few pages of slide handouts (9 slides per page) to visually anchor my talk as I rehearsed it mentally. During the actual presentation, this practice helped me remember the key points I wanted to make for each slide. Giving myself permission to say things differently helped me not only avoid anxiety (which would have made it even harder to remember what I wanted to say!) but also work within that flexible framework to match the interest of the audience.

I built interactivity into the talk, with two networking breaks and a number of shows of hands. One of the things I love about speaking to a small audience is the challenge and experience of listening while I’m talking. I’m not always good at this. My own enthusiasm sometimes makes it hard for me to slow down! But the physical experience of listening to people’s eyes, people’s postures, people’s smiles, feeling that itch in my hands and in my bones as I find myself attuned to their energy… Wow.

What can I do better next time? (Yes, see, I really do this!)

The key thing that will make this even better would be to make sure someone else is in charge of recording. ;) You know, someone who’ll remember to bring fresh batteries instead of dead ones, someone who’ll remember to actually start the voice recorder, someone who’ll get all of that sorted out. When I’m out there, I’m just too caught up in the moment, in the opportunity to connect with people,

I could use some more planning. I’m glad that people felt comfortable asking me questions throughout the presentation. I completely forgot about defining what a blog is in the first place, silly me, and other things like that which I inevitably discover right after the projector’s turned off. Such is life. Next time, I’ll try listening to my recording with my newbie hat firmly on.

And I should probably bring along a fishbowl and collect people’s business cards or e-mail addresses so that I can make it easier to keep in touch after the talk! =)

Wicked Cool Emacs: BBDB: Keeping track of contact dates

February 29, 2008 - Categories: emacs, wickedcoolemacs

I hadn’t realized just how much I missed my Big Brother Database until today. Three networking events packed into one week meant that I hadn’t set aside enough time for follow up, and I felt my memories of the conversations getting a little hazy. Fortunately I’d taken some notes on my Palm, but I knew I had to get it into some kind of contact management system quickly, and Gmail Contacts just wasn’t compelling enough for me. So it’s back to Emacs, plain text files, and a surprisingly sophisticated contact manager.

I also promised to do some work on the book today, so everything dovetailed nicely.

The following bit of code helps me filter displayed contacts to show only the people I haven’t contacted since a certain date. This is handy for remembering to keep in touch with old friends, for example. Or at least it would be handy if I used it more often and if I actually sent the letters that pile up in my e-mail drafts and my snail mail outbox… but at least it’s a step in the right direction.

If you want to know who you have or haven’t talked to in a while, you need to do two things. First, you need to keep track of when you talked to people. Second, you need to generate reports.

To be able to quickly add contact notes to BBDB records, add the following to your ~/.emacs:

ch6-bbdb-ping.el:

(define-key bbdb-mode-map "z" 'wicked/bbdb-ping-bbdb-record)
(defun wicked/bbdb-ping-bbdb-record (bbdb-record text &optional date regrind)
  "Adds a note for today to the current BBDB record.
Call with a prefix to specify date.
BBDB-RECORD is the record to modify (default: current).
TEXT is the note to add for DATE.
If REGRIND is non-nil, redisplay the BBDB record."
  (interactive (list (bbdb-current-record t)
                     (read-string "Notes: ")
                     ;; Reading date - more powerful with Planner, but we'll make do if necessary
                     (if (featurep 'planner)
                         (if current-prefix-arg (planner-read-date) (planner-today))
                       (if current-prefix-arg
                           (read-string "Date (YYYY.MM.DD): ")
                         (format-time-string "%Y.%m.%d")))
                     t))
  (bbdb-record-putprop bbdb-record
                       'contact
                       (concat date ": " text "\n"
                               (or (bbdb-record-getprop bbdb-record 'contact))))
  (if regrind
      (save-excursion
        (set-buffer bbdb-buffer-name)
        (bbdb-redisplay-one-record bbdb-record)))
  nil)

You can then use z in BBDB buffers to add a quick note to the “contact” field of the current record. The date is automatically noted. You can create a note for a specific date by calling {{C-u wicked/bbdb-ping-bbdb-record}} with a prefix argument. For convenience, the suggested configuration binds this to “z”, because it was one of the few unbound keys I could find. Use this after you meet, call, or e-mail people, and write down a short note about the conversation you had. You might find these notes useful later on.

If you met a number of people at an event in the past and you have Planner installed and loaded, you can use {{planner-timewarp}} to set the effective date to another date. To return to today, use {{M-x planner-timewarp nil}}.

To automatically add a datestamped copy of sent e-mail subjects to people’s BBDB records, add the following to your ~/.gnus:

ch6-bbdb-message-add-subject.el:

(defun wicked/message-add-subject-to-bbdb-record ()
  "Add datestamped subject note for each person this message has been sent to."
  (let* ((subject (concat (format-time-string "%Y.%m.%d")
                          ": E-mail: " (message-fetch-field "Subject") "\n"))
         (bbdb-get-addresses-headers
          (list (assoc 'recipients bbdb-get-addresses-headers)))
         records)
    (setq records
          (bbdb-update-records
           (bbdb-get-addresses nil gnus-ignored-from-addresses 'gnus-fetch-field)
           nil nil))
    (mapc (lambda (rec)
            (bbdb-record-putprop rec
                                 'contact
                                 (concat subject
                                         (or
                                          (bbdb-record-getprop rec 'contact)
                                          ""))))
          records)))
(add-hook 'message-send-hook 'wicked/message-add-subject-to-bbdb-record)

Now that you have the data, how can you use it to filter? Add the following to your ~/.emacs:

ch6-bbdb-show-only-no-contact-since.el:

(defun wicked/bbdb-show-only-no-contact-since (date &optional reverse records)
  "Show only people who haven't been pinged since DATE or at all.
If REVERSE is non-nil, show only the people you've contacted on or since DATE.
Call with a prefix argument to show only people you've contacted on or since DATE."
  (interactive (list
                (if (featurep 'planner)
                    (planner-read-date)
                  (read-string "Date (YYYY.MM.DD): "))
                current-prefix-arg (or bbdb-records (bbdb-records))))
  (let (new-records
        last-match
        timestamp
        omit
        notes)
    (while records
      ;; Find the latest date mentioned in the entry
      (let ((timestamp (wicked/bbdb-last-date
                        (if (vectorp (car records))
                            (car records)
                          (caar records)))))
        (if (if reverse
                ;; Keep if contact is >= date
                (null (string< timestamp date))
              ;; Keep if date > contact
              (string> date timestamp))
            (add-to-list 'new-records (if (vectorp (car records))
                            (car records)
                          (caar records)) t)))
      (setq records (cdr records)))
    (bbdb-display-records new-records)))

(defun wicked/bbdb-last-date (rec)
  "Return the most recent date for REC or nil if none.
Dates should be in the form YYYY.MM.DD.  The first date in the
notes field and the first date in the contact field are used, so
dates should be in reverse chronological order."
  (let* ((wicked/date-regexp
          "\\<\\([1-9][0-9][0-9][0-9]\\)\\.\\([0-9][0-9]?\\)\\.\\([0-9][0-9]?\\)\\>")
         ;; Get the first date mentioned in the notes field
         (notes-date
          (or (and (string-match wicked/date-regexp (or (bbdb-record-notes rec) ""))
                   (match-string 0 (or (bbdb-record-notes rec) "")))
              "0000.00.00"))
         ;; Get the first date mentioned in the contact field
         (contact-date
          (or (and (string-match wicked/date-regexp (or (bbdb-record-getprop rec 'contact) ""))
                   (match-string 0 (or (bbdb-record-getprop rec 'contact) "")))
              "0000.00.00")))
    ;; Compare the two dates
    (or (if (string< notes-date contact-date) contact-date notes-date)
        "0000.00.00")))

To generate a report, use {{M-x wicked/bbdb-show-only-no-contact-since}} and specify the date. These functions are much easier to use with Planner’s date-handling functions. Planner can read dates like “-1″ (yesterday), “-7fri” (seven Fridays ago), “2” (the second of this month), “1.2” (January 2 in this year), and “2007.01.02” (January 2, 2007).

You can also flip the filter by using the universal prefix argument ({{C-u M-x wicked/bbdb-show-only-no-contact-since}}) to show only the people you’ve contacted since a certain date. This is good for knowing the size of your active network. Because the filter works on displayed records, you can combine it to find all the people you talked to last year but not this year. You can also combine it with other filters to find all the people you’ve marked as friends, but who you haven’t talked to in three months. Then you can send a personalized e-mail or make a phone list, and get back in touch. And that’s how you keep track of your contact dates!