September 29, 2006

Taking the Terror out of Talk

September 29, 2006 - Categories: speaking, toastmasters

Does the thought of speaking in public make you anxious? Want some
tips on how to deal with the butterflies in your stomach? Come to the
Toast I.T. Toastmasters Open House on Oct 10, 2006 for a fun,
informative session!

I’m giving one of the Toastmasters International educational modules
called “Taking the Terror out of Talk”. It will be part of the 229th
meeting of Toast I.T. Toastmasters, so you’ll also get to see a little
bit of what Toastmasters is like.

This is free, so come on over!

Toast I.T. Toastmasters

Metro Hall

55 John Street, Toronto, Ontario (map)

Oct 10, 2006 (Tuesday)

6:00 PM – 8:00 PM

(And even if you’re a polished public speaker, come anyway to show
support and share tips! ;) )

Photo credit: Cherie, Creative Commons Attribution License, from Flickr.

On Technorati: , ,

Emacs BBDB: Filtering tags with the power of lambda expressions

September 29, 2006 - Categories: bbdb, connecting, emacs, pimpmyemacs

What do you do when you’re into both Emacs geeks and social
networking? Well, you build a really really weird contact management
tool, that’s what!

One of the things I often need to do is filter my contacts for a
particular set of interests. I would have no idea how to do this in
Microsoft Outlook and other proprietary contact management systems.
Because Emacs is infinitely programmable, though, I can just hack it
in.

You’d expect the intersection of the set “emacs geek” and the set
“social networker” to be a null set or a singleton (me!). As it turns
out, there’s at least one other geek in this space – hooray!

Paul Lussier’s been bouncing all sorts of
crazy ideas off me, which explains all the weird
porridge-and-toe-nails posts of Emacs Lisp code on my blog lately.
He’s responsible for my puttting together yesterday’s LinkedIn
importer. Today, he wrote:

Then found your sacha/bbdb-search-tags stuff which
totally, completely rocks. I just wish I had the first inkling as to
how it worked :) Now, the question I have is: How can I use
sacha/bbdb-search-tags to search for entries which are tagged with one
label, but NOT with another? For example, I want to search on: (and
(taq eq “planner”) (not (tag eq “muse”)))

I’d completely forgotten about sacha/bbdb-search-tags! Anyway, I’d
been meaning to write a fancy alias management thing for a while now,
and this code does a reasonable job for me. I can now filter my
displayed records by arbitrary Lisp expressions, bringing me closer to
insane contact relationship management. I mean, c’mon…

;; M-x sacha/bbdb-filter-by-alias-function RET
;;     (lambda (aliases) (and (member "planner" aliases)
;;                       (not (member "muse" aliases))))) RET

If I do this often enough, I might make up an easier syntax, but
lisp expressions work fine for me.

MWAHAHAHAHA!

Here’s the code:

;;;_+ Mail aliases

;; Code for working with aliases

;; 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.

;; Goal: Be able to specify ALIAS and ALIAS
;; M-x sacha/bbdb-filter-displayed-records-by-alias RET alias alias
;; Goal: Be able to specify ALIAS or ALIAS
;; C-u M-x sacha/bbdb-filter-displayed-records-by-alias RET alias alias
;; Goal: Be able to specify not ...
;; M-x sacha/bbdb-omit-displayed-records-by-alias RET alias alias
;; C-u M-x sacha/bbdb-omit-displayed-records-by-alias RET alias alias

(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))
                              propsym) "")
                         "[ \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-by-function
    (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-by-function
    (or bbdb-records (bbdb-records))
    (if any
        'sacha/bbdb-filter-by-alias-match-any
      'sacha/bbdb-filter-by-alias-match-all)
    query
    t)))

;;;_+ Advanced mail alias queries

;; Goal: Use complicated lambda expressions to filter displayed records
;; M-x sacha/bbdb-filter-by-alias-function RET
;;     (lambda (aliases) (and (member "planner" aliases)
;;                       (not (member "muse" aliases))))) RET
;; Thanks to Paul Lussier for the suggestion!

(defun sacha/bbdb-filter-by-alias-function (bbdb-records
                                            alias-filter-function)
  "Return only the BBDB-RECORDS that match ALIAS-FILTER-FUNCTION.
ALIAS-FILTER-FUNCTION should accept one argument:
 - aliases, a list of keywords from the record."
  (interactive (list (or bbdb-records (bbdb-records))
                     (read t)))
  (let (records)
    (setq records
          (delq nil
                (mapcar
                 (lambda (rec)
                   (when (funcall alias-filter-function
                                  (split-string
                                   (or (bbdb-record-getprop
                                        (if (vectorp rec)
                                            rec
                                          (car rec))
                                        propsym) "")
                                   "[ \n\t,]+"))
                     rec))
                 bbdb-records)))
    (if (interactive-p) (bbdb-display-records records))
    records))

On Technorati: , , , ,

Hospitality

September 29, 2006 - Categories: Uncategorized

Someday I want to be able to make people feel as welcome as Luis Suarez felt in Cincinnati:

But on the contrary, it was one of those parties
difficult to forget. I know I will not forget it that easily. Not only
did Melody open her house to everyone as if they were close family
members but everyone else even made you feel that way, too ! An
incredible experience ! It felt like I was part of the group and all
that from someone who visited Cincy for the first time ever and who
didn’t know most of the people back there. If there is a way to define
hospitality in the best terms possible that, folks, would be the best
I can come up with.

On Technorati:

Networking: Create value with your business cards

September 29, 2006 - Categories: connecting

Business cards are not only a good way to leave your contact
information with people, but they can be a great way to make a
memorable impression by sharing valuable tips. Here’s how I made a
difference with my business cards.

I had two hours of free time before going to a networking workshop,
and I wanted to create as much value as possible for the other
attendees. The back of my business card felt like a good place to put
a takeaway message, so I pulled up my business card template and a few
sheets of perforated business cards.

Would my recent blog post about networking with nametags have been a good fit? Hmm, maybe not. It would be useful if I gave them my card before they made nametags, but I wasn’t sure if I could get to everyone in time unless I volunteered to be at the reception. Besides, that kind of information is easy to absorb and remember. What could create lasting value for people?

Aha! Whenever I meet someone who wants to learn more about networking,
I run through a list of my favorite books on the topic. Why not put
*that* on my business card? That way, I could help people learn even
more about networking. So I changed the back of my business card to read:

My favorite networking books:

  • Never Eat Alone, Keith Ferrazzi
  • Work the Pond, Darcy Rezac
  • Love is the Killer App, Tim Sanders
  • How to Talk to Anyone, Leil Lowndes
  • Dig Your Well Before You’re Thirsty, Harvey Mackay

Then I thought, hey, what else can I do to create value for other
people? Well, I read, think, and blog a *lot* about networking and
other topics. What if I e-mail people a free networking newsletter
with tips? So I added this to the back of my business card:

Want tips, good networking resources, and upcoming
events? E-mail me at networking@sachachua.com to subscribe to
my free networking newsletter!

Hey, I’ll figure out how to do newsletters if people are interested.
I’ve got plenty of material, I know. I just have to search through my
blog and tidy up some of the articles!

I printed out thirty new business cards and headed to the event. I
handed one to the organizer, whom I knew from other tech events.
Whenever I got people’s contact information in order to send them
something or to continue a conversation, I gave them a business card.
I didn’t call attention to the back; it was just there.

The perfect opportunity to mention the business card came up during
the networking workshop, though. Alex Sirota
mentioned the idea of interdependence and networking, and one of the
books on my list has a very good description of how networking can
help you reach out to others. I told him (and thus everyone) that on
the back of my business card is a list of my favorite networking
books, and book 3 – Love is the Killer App – has a great description
of networking along those lines. People perked up, and some of the
people I hadn’t gotten to talk to reached out and asked for a business
card. I got several compliments on such a great idea, too!

So, networking tip for the day: Take a look at your business card
and figure out how you can create more value for the people you
meet.
For example, if you’re a writer, you might want to list your
latest useful articles and offer to send a copy if people are
interested. Carry several versions of your business cards targeted for
different audiences. (Thanks to Greg A. Fitz
for this tip.) It’s a great way to make an impression!

I love following these crazy little ideas. Stay tuned for more
networking tips. I’d love to hear yours, too!

On Technorati:

Stories from New York: Making things happen

September 29, 2006 - Categories: travel

I was thrilled when the Greater IBM Initiative invited me to be one of
the Core Connectors. Thrilled, yes, and more than a little anxious. I
didn’t know what I could bring, being so new to IBM and knowing hardly
anyone, much less being able to convince them to register for a new
social networking site or get them excited about networking with IBM
alumni I didn’t even know. Still, I accepted the invitation with great
enthusiasm, and I signed up to help with the blog.

I still haven’t contributed anything to the blog despite all the stuff
I’ve been blogging here about networking. I think I should just work
up the nerve to get one of these potential articles out there in
public. =)

My insecurity about not feeling like a proper Core Connector didn’t
stop me from being excited about the events the Greater IBM Initiative
was organizing. They were kicking it off with parties in New York, San
Francisco, and other awesome places.

On 2006.09.16 (Saturday), I woke up and asked myself, “What if we could make this happen?” I knew I really wanted to meet these people in person. I wanted to meet other people serious about social networking and passionate about connecting people. So I said, okay, what can I do to get there?

I was thinking about it during the Queen West Art Crawl, and I just kept seeing encouraging signs wherever I went. Quinn, Ian, Simon and I were hanging out at the Melody Bar for karaoke (kudos to Simon for stepping out of his comfort zone, although we still haven’t gotten him to sing!). Someone sang “New York, New York” – imagine that! It made me smile, and for the rest of the evening I felt such an urge to break out into song.

Next thing I knew, a UK IBMer called me up to tell me to check my mail, because the Greater IBM Initiative had heard me muse about things on my blog and people were trying to figure out how to fit me into their budget. My mom hooked me up with a family friend who could lend me couchspace. Suddenly, everything was falling into place.

All I needed to do was find a cheap way to get to New York. I stumbled across Skybus, which offered a round trip for USD 100. What a deal! I signed up for that using my Canadian credit card, scrambled to pack my things and prepare for the networking event, and off I was!

And that’s how I found myself in New York last Thursday: a crazy idea that I wanted to make happen, and the generous, generous support of family and friends and everyone around me.

Wow.

On Technorati:

Stories from the NY trip

September 29, 2006 - Categories: friends

The e-ticket from the bus company said that people should arrive
twenty minutes early in order to keep their reservation priority. The
pickup point was 1.5 km from my residence. I was taking no chances,
though. If I missed the bus, I had no idea how I’d get to New York
without spending way too much on a plane ticket! I requested a cab for
5:00 AM (meep!), giving myself _plenty_ of time to get there.

Too much time, apparently.

As it turns out, waiting alone on the sidewalk at 5:10 in the morning
is nerve-wracking, even in Toronto. Toronto feels like a generally
safe city (compared to Manila, at least!), but I was still pretty
nervous. Someone with a thick Irish accent asked me for help getting
back to Oakville. I normally don’t give people money because, well, I
haven’t sorted out the best response to panhandlers yet, but I was
just so rattled that I gave him the smallest amount I had. Didn’t have
any coins, so I ended up giving him CAD 10. Fortunately, he headed off after that…

… but then I was sitting on the sidewalk, shivering, scared, and
more than a little worried that the bus might not actually show up.
After all, I wasn’t going with an established company like Greyhound.
Knowing that I’d charged it to Visa and could dispute the charge just
in case they scammed me was small comfort waiting there at 5:15 in the
morning with no bus in sight.

Waah.

And that was one of the times I felt really, really, really lucky to
have friends I can call at 5:17 in the morning.
Jedediah Smith lived closest to the
intersection. Although I knew he wasn’t really a morning person and
he’d probably need the sleep, I called him up anyway. I was starting
to get really nervous.

And he came, and that was awesome. =) We chatted for a bit before the
bus showed up. It turned out to be non-dodgy. Whew! But it was
wonderful having company. =)

Yay.

On Technorati:

Notes from KMD2004 meeting

September 29, 2006 - Categories: Uncategorized

Attendance: Dave Kemp, MJ Suhonos, Sacha Chua

Next action Work on individual ANT maps, due Oct 5
Next meeting Oct 5 2:00 PM at Dave Kemp’s studio

On Technorati:

Emacs BBDB: Prioritize exact matches

September 29, 2006 - Categories: bbdb, emacs, pimpmyemacs

I often include people’s names in my notes on other people, such as
when I’m tracking who introduced me to whom. The following code
modifies BBDB’s behavior to put exact matches for name, company, or
network address above matches for notes.

(defun sacha/bbdb (string elidep)
  "Display all entries in the BBDB matching the regexp STRING
in either the name(s), company, network address, or notes.
Prioritize non-note matches."
  (interactive
   (list (bbdb-search-prompt "Search records %m regexp: ")
         current-prefix-arg))
  (let* ((bbdb-display-layout (bbdb-grovel-elide-arg elidep))
         (notes (cons '* string))
         (records-top
          (bbdb-search (bbdb-records) string string string nil
                       nil))
         (records
          (bbdb-search (bbdb-records) string string string notes
                       nil))
         temp)
    (setq temp records-top)
    (while temp
      (setq records (delete (car temp) records))
      (setq temp (cdr temp)))
    (if (or records-top records)
        (bbdb-display-records (append
                               records-top
                               records))
      ;; we could use error here, but it's not really an error.
      (message "No records matching '%s'" string))))

(defalias 'bbdb 'sacha/bbdb)

On Technorati: , , , ,

Networking story: Being in the right place at the right time

September 29, 2006 - Categories: connecting, story

At last night’s New Path Network workshop, Alex Sirota told us a story about how Fernando Morales networked his way to an opportunity. Fernando turned up at a New Path meeting because he was interested in catering for their events. It so happened that New Path Networks was thinking of having a summer social, so they hooked up with Fernando. New Path Networks sold 25 tickets to its members for a social event that was part of a larger celebration organized by Fernando, and Fernando’s event gained more people, visibility, and credibility.

So get out there and ask for opportunities! =)

On Technorati: ,

Networking is about being memorable; the art of the deep bump

September 29, 2006 - Categories: connecting

Kevin McIntosh made a couple of great points at last night’s Newpath Network workshop. One of my favorite ideas from the evening was:

Networking isn’t about getting an immediate business lead. It’s about making an impression on someone. Your opportunities are probably not going to come directly from the people you meet, but rather from the people _they_ meet. Make that connection with people so that they’ll remember you.

I think that’s one of the things that I still find a little bit
strange about networking events. I’m getting better at finding an
excuse to e-mail people. Knowing a bit about a lot of different topics
helps. I love offering to send people more information about
something, and my trusty Moleskine notebook means I can promise all
those things and (usually) be good at following up. When I’m in a
large crowd, then, all I’m really looking for is an idea of what
someone’s interested in and a reason to get in touch with them in the
future.

For example, Quinn and I were talking about the Toronto Public Library
system at Wednesday’s !CaseCamp. Someone else jumped in with praise
for the public library system. I immediately asked him if he’d heard
of the library lookup bookmarklet and other cool tools. He hadn’t, so
I got his e-mail address and promised to e-mail him more information
about that.

I get the feeling that most people aren’t like that. Many people I
talk to at networking events don’t immediately give me hooks to get in
touch with them about, or spend time finding out what I’m into. I
noticed that when I _don’t_ actively look for those ways to continue a
conversation, don’t actively deep-bump people, I come away from these
events feeling that I haven’t really met anyone. One of the social
salons I went to was like that: random people talking about the
weather, little self-disclosures that I’ll never use, maybe a bit of
trivia that I _might_ pick up and remember even though I probably
wouldn’t remember the person I heard it from.

My awareness of this difference is shaped in part by Keith Ferrazzi’s
book “Never Eat Alone”, from which I got the term “deep bump.” I go to
networking events not to have full conversations, but to start them. I
guess it’s because I hate chatting at loud, crowded networking events.
;) I’d rather sit down and have coffee with someone (well, when I can
find the time to do so!), or have them over for a barbecue or dinner
party, or e-mail them a little tidbit that fits their interests…

Hmm, there’s probably a little article in here somewhere. How can I
help other people get the hang of the deep bump?

On Technorati:

The power of sales

September 29, 2006 - Categories: business

Simon just finished a sales call that came in through a referral. He’s
got a pretty nifty voice messaging system (for non-profits that don’t
do evil!), and he’s starting to realize that he doesn’t have to spend
a lot of time doing development when he’s already got a totally cool product
that he should be selling the heck out of. =)

Yay!

On Technorati: , ,

Geek dinners and networking ideas

September 29, 2006 - Categories: connecting

Kevin McIntosh’s presentation on networking reminded me of Geek Dinner. I’ve been meaning to organize one of these for ages.

You know what? These networking/hanging-out events might be fun with a
little more structure instead of the hit-or-miss things that usually happen.

I’m curious as to how a networking event would work with the following tweaks, roughly in order of effort/preparation required:

  1. nametags with best practices
  2. introduction segment, maybe a la silent resource auction
  3. wants/haves
  4. introductions, wants, haves posted/distributed at the event for people who RSVPd
  5. introductions, wants, haves e-mailed before the event
  6. post-event automatic followup a la speed dating, with possible automatic sharing of contact info
  7. pre-event networking plan
  8. an active host looking at people’s profiles and encouraging connections
  9. self-placement so that you can plan who you’ll be physically near, if it’s a sit-down thing like a dinner
  10. planned placement, like that done by truly out-of-this-world hosts at elegant parties

You know, that would be _so_ fun to hack. I’d love to have a venue for trying out my crazy networking ideas.

On Technorati: