March 2008

Internet experiment #2: Ordering clothes – success!

March 2, 2008 - Categories: life

There are some things that most people would never think of buying from the Internet because they require such a personal fit: eyeglasses, clothes, and shoes. Having successfully ordered two pairs of eyeglasses from Zenni Optical with substantial savings, I decided to explore the second frontier: buying clothes off the Internet.

After four months of working in the corporate world, I found myself gravitating to a few favorite outfits: a gray pinstripe suit that I bought off the rack (about $40 because it was on sale) and invested about $70 in having it tailored to me, and a few combinations of a long-sleeved blouse, a V-neck sweater, pants matching the sweater, and a scarf matching the blouse. (See, Kathy, I’m getting the hang of this coordination thing…) I’m still not as sharply dressed as consultants in other practices, though, and there are some gaps in my wardrobe that I’m gradually filling in–such as a coordinated black suit.

I find it difficult to shop for clothes in brick-and-mortar stores. There just aren’t that many clothes for short, slim people with small torsos and somewhat wider hips. It’s frustrating to go through the entire Eaton Centre and find only a few outfits that merit a trip to the dressing room. I rarely find anything that fits off the rack, and the noisy crowd can feel overwhelming after a few hours.

It doesn’t help that I shop with a very specific idea of what I want: a pair of oval red frames, a black pant suit in size 4 petite, a pair of beige pumps with a slightly rounded toe and a 1″ to 1.5″ square heel. I wish I could press a button to have the store reorganized by color and style instead of just by brand. In short, I want an Internet-like shopping interface. Bring on some faceted navigation.

So when I was shopping for gifts on eBay.ca, I took the opportunity to also search for petite size 4 pantsuits, and I was happy to find some that I wouldn’t mind trying out. eBay is not known for good return policies, so I submitted bids that were low enough for me to charge to experience if things didn’t work. As in my experiment with ordering eyeglasses of the Internet, I reasoned that if it didn’t work, I wasted a little of money, but if it did, I could save a lot more time and money in the future. It was worth a try.

The first of my suits arrived the other day. I had to trek up to the post office to pay customs, but even with shipping and tax, the suit cost just about as much as the gray suit I picked up during one of the sales. I had ordered a double-breasted black suit, and it arrived in the condition described: new and all ready to go. In terms of fit, it was no worse than suits in stores. In terms of cost, it was decent. In terms of convenience, it was much better.

So there: shopping for clothes on the Internet is worth a try. =)

Weekly review – week ending March 2, 2008

March 2, 2008 - Categories: weekly

I feel a little flushed today, and I’ve been sniffling all weekend. After I finish this blog post, I’m going to go to bed.

Next week is going to be crazy. We’re flying to the Philippines on Saturday, so I have a bunch of things to take care of before then. To wit:

Waah.

Trying out the high-flying lifestyle

March 4, 2008 - Categories: sketches

080305-04.20.47.png

I have to confess that I’m more than a little anxious. That’s a lot of time spent in conference centers and airports.

What the heart has once owned and had, it shall never lose

March 4, 2008 - Categories: sketches

080305-04.29.27.png

You know what it’s like to make a choice you really don’t want to make, but have to because it’s the right thing to do?

I will probably not be bringing my cat over from the Philippines.

It is the choices we make that show who we truly are, far more than our abilities

March 4, 2008 - Categories: sketches

080305-04.35.29.png

“It is the choices we make, Harry, that show who we truly are, far more than our abilities,” said Albus Dumbledore to Harry Potter in JK Rowling’s The Philosopher’s Stone.

It’s always been a little intimidating, having all these doors open. It can be a struggle to find and listen to the small voice of my intuition when I’m surrounded by so many good suggestions and opportunities. I need to make sure that I’m growing at a sustainable rate, that I don’t overcommit or burn myself out, that I don’t lose myself. I need to make sure my priorities are right, and that I actually follow them.

He loves his new white hat

March 4, 2008 - Categories: sketches

080305-05.23.02.png

Working on the book

March 6, 2008 - Categories: wickedcoolemacs, writing

Now that I have an idea of what a good Wicked Cool Emacs book chapter looks like, I find it much easier to write and edit chapters. I’ve just finished revising my first three chapters based on my editor’s feedback, and they will be finding their way to my technical reviewer soon. Bursty productivity indeed.

Oh, that and productive application of structured procrastination… =)

Wow. Physics can be phun.

March 6, 2008 - Categories: geek

Props to Michael McGuffin for this awesome find: Phun – 2D physics sandbox. Watch the demo or download it and start playing.

Wow. Physics can be phun.

March 6, 2008 - Categories: geek

Props to Michael McGuffin for this awesome find: Phun – 2D physics sandbox. Watch the demo or download it and start playing.

This makes me want a Tablet PC.

You have received a painting from Sacha

March 6, 2008 - Categories: sketches

080307-05.28.25.png

Generational differences

March 7, 2008 - Categories: gen-y

One last big post before I focus on my vacation preparations.

I’ve been thinking a lot about generational differences because of my upcoming presentation on I.B.Millennials. I had a hard time figuring out how to speak about my generation without dealing with too many generalizations, and what to say to people who think that oh, it’s just about age. Today, I finally came to understand why I want to talk about this topic. It’s not about drawing lines, it’s about connecting people.

No one will argue that society today is very different from society in the 1950s or in the 1900s, and that there have been massive technological and social changes. One way to see this is to look at ads and newspaper articles from fifty years ago, many of which would be unacceptable today.

Why is a discussion about generational differences important? You have lived through these changes and adapted your ways of thinking to them, but for people of my generation, this is all we know. We will have all sorts of assumptions. We will take all sorts of things for granted. We will understand some things intuitively, and be stumped by others. ("What was life like before the Net? before mobile phones? What’s job security? Why would you want to work for just one company? Wouldn’t that be boring? If I can do my job in half the time it takes other people to do it, why shouldn’t I get the rest of the day off?") Perhaps some of these differences come with being young. Perhaps some of these differences come with growing up in societies that are radically different from the ones you grew up in. Perhaps we face our own questions and challenges that we are only now learning how to articulate.

Most of us will have neither the experience nor the perspective to recognize these differences or work around them. That’s why it’s important for leaders to be aware of trends, to spot opportunities and weaknesses, to bring people together. And that’s why this conversation about generational differences is important: not to draw lines, not to praise one generation over the other, but to recognize potential conflicts and work around them, and to build on each other’s strengths.

I don’t want to make excuses for my generation. I want people to be able to challenge us to be all we can be instead of shrugging things off with "Oh, they’re kids, they’ll change as they grow up." But the world can’t wait until we grow up. We can’t wait until people of my generation are thirty or forty, settled, ‘normal’. We are here and there are more of us coming; how can we all work together more effectively?

People of my generation are coming into a workplace that’s very different from the workplace you started in. The long time between generations can make companies forget the lessons learned the last time around. Every generation brings unique strengths and weaknesses. That does not make a discussion of those challenges irrelevant. Indeed, it shows that if organizations can learn to manage this transition well, they will reap the benefits with succeeding generations.

And why is making the most of this generation important? Many organizations recognize a need for massive cultural change when it comes to adopting new collaborative and social technologies that can require not only changes in behavior, but even changes in corporate culture and values. It reminds me of the very things that bewilder many parents – my generation’s reliance on electronic communication and virtual social networks, collaboration despite previous norms in education and other areas, and an inescapably globalized world. If organizations can make the most of our energy and our skills, then they can ride that wave into organization-wide cultural change. If not, then they will miss opportunities that their competitors will take.

Generational differences is a political topic, an emotional topic. No one likes being reminded that they grow older each year. It is easy to dismiss it with the same words used to dismiss the voice of youth: "They’ll grow up eventually." But if we can harness those differences to bring us to where we want to go as an organization and as a society, if we can anticipate and deal with the potential conflicts that many might encounter, then wouldn’t that be a valuable conversation?

I need to revise my TLE presentation. I’ve just found the kernel of passion in my talk. I’m not going to have the time to link this to all the conversations happening around this topic, so please feel free to cross-reference the other great discussions happening around this. But anyway, that’s what I had to say.

You have received a painting from Sacha

March 8, 2008 - Categories: sketches

080308-05.56.52.png

You have received a painting from Sacha

March 8, 2008 - Categories: sketches

080308-06.15.42.png

Vacations are essential

March 8, 2008 - Categories: sketches

080308-05.57.22.png

(color balance on my DS is a little off… How can I calibrate the color profile of this thing?)

You have received a painting from Sacha

March 8, 2008 - Categories: sketches

080308-05.58.55.png

Wicked Cool Emacs: BBDB: Use nicknames and custom salutations

March 24, 2008 - Categories: bbdb, emacs, wickedcoolemacs

Update 2014-05-13: The original code is for BBDB version 2. Thomas Morgan sent this update which makes it work with BBDB version 3 – see below.

I like starting my e-mail with a short salutation such as “Hello, Mike!”, “Hello, Michael”, or “Hello, Mikong!”, but it can be hard to remember which nicknames people prefer to use, and calling someone by the wrong name is a bit of a faux pas. Sometimes people sign e-mail with their preferred name, but what if you haven’t sent e-mail to or received e-mail from someone in a while? In this project, you’ll learn how to set up my BBDB to remember people’s nicknames for you using a custom “nick” field, and to use those nicknames when replying to messages in Gnus or composing messages from my BBDB.

The nickname code worked so well that I started thinking of what else I could customize. It was easy to go from nicknames to personalized salutations. This hack started because one of my friends is from Romania, so I thought I’d greet her in Romanian with “Salut, Letitia!” instead of just “Hello, Letitia!”. The code in this project uses a “hello” field to store these salutations in your BBDB.

To set up personalized nicknames and salutations, add the following code to your ~/.emacs:

For BBDB v2

(defvar wicked/gnus-nick-threshold 5 "*Number of people to stop greeting individually. Nil means always greet individually.")  ;; (1)
(defvar wicked/bbdb-hello-string "Hello, %s!" "Format string for hello. Example: \"Hello, %s!\"")
(defvar wicked/bbdb-hello-all-string "Hello, all!" "String for hello when there are many people. Example: \"Hello, all!\"")
(defvar wicked/bbdb-nick-field 'nick "Symbol name for nickname field in BBDB.")
(defvar wicked/bbdb-salutation-field 'hello "Symbol name for salutation field in BBDB.")

(defun wicked/gnus-add-nick-to-message ()
  "Inserts \"Hello, NICK!\" in messages based on the recipient's nick field."
  (interactive)
  (save-excursion
    (let* ((bbdb-get-addresses-headers ;; (2)
            (list (assoc 'recipients bbdb-get-addresses-headers)))
           (recipients (bbdb-get-addresses
                        nil
                        gnus-ignored-from-addresses
                        'gnus-fetch-field))
           recipient nicks rec net salutations)
      (goto-char (point-min))
      (when (re-search-forward "--text follows this line--" nil t)
        (forward-line 1)
        (if (and wicked/gnus-nick-threshold 
                 (>= (length recipients) wicked/gnus-nick-threshold))
            (insert wicked/bbdb-hello-all-string "\n\n") ;; (3)
          (while recipients
            (setq recipient (car (cddr (car recipients))))
            (setq net (nth 1 recipient))
            (setq rec (car (bbdb-search (bbdb-records) nil nil net)))
            (cond
             ((null rec) ;; (4)
              (add-to-list 'nicks (car recipient))) 
             ((bbdb-record-getprop rec wicked/bbdb-salutation-field) ;; (5)
              (add-to-list 'salutations 
                           (bbdb-record-getprop rec wicked/bbdb-salutation-field))) 
             ((bbdb-record-getprop rec wicked/bbdb-nick-field) ;; (6)
              (add-to-list 'nicks 
                           (bbdb-record-getprop rec wicked/bbdb-nick-field)))
             (t (bbdb-record-name rec))) ;; (7) 
            (setq recipients (cdr recipients))))
        (when nicks ;; (8)
          (insert (format wicked/bbdb-hello-string 
                          (mapconcat 'identity (nreverse nicks) ", "))
                  " "))
        (when salutations ;; (9)
          (insert (mapconcat 'identity salutations " ")))
        (when (or nicks salutations)
          (insert "\n\n")))))
  (goto-char (point-min)))

(defadvice gnus-post-news (after wicked/bbdb activate)
  "Insert nicknames or custom salutations."
  (wicked/gnus-add-nick-to-message))

(defadvice gnus-msg-mail (after wicked/bbdb activate)
  "Insert nicknames or custom salutations."
  (wicked/gnus-add-nick-to-message))

(defadvice gnus-summary-reply (after wicked/bbdb activate)
  "Insert nicknames or custom salutations."
  (wicked/gnus-add-nick-to-message))

For BBDB v3

;; This version is for BBDBv3 - thanks, Thomas!

(defvar wicked/gnus-nick-threshold 5 "*Number of people to stop greeting individually. Nil means always greet individually.")  ;; (1)
(defvar wicked/bbdb-hello-string "Hello, %s!" "Format string for hello. Example: \"Hello, %s!\"")
(defvar wicked/bbdb-hello-all-string "Hello, all!" "String for hello when there are many people. Example: \"Hello, all!\"")
(defvar wicked/bbdb-nick-field 'nick "Symbol name for nickname field in BBDB.")
(defvar wicked/bbdb-salutation-field 'hello "Symbol name for salutation field in BBDB.")

(defun wicked/gnus-add-nick-to-message ()
  "Inserts \"Hello, NICK!\" in messages based on the recipient's nick field."
  (interactive)
  (let ((recipients (bbdb-get-address-components))
        recipient nicks rec net salutations)
    (goto-char (point-min))
    (when (re-search-forward "--text follows this line--" nil t)
      (forward-line 1)
      (if (and wicked/gnus-nick-threshold 
               (>= (length recipients) wicked/gnus-nick-threshold))
          (insert wicked/bbdb-hello-all-string "\n\n") ;; (3)
        (while recipients
          (setq recipient (car recipients))
          (setq net (nth 1 recipient))
          (setq rec (car (bbdb-search (bbdb-records) nil nil net)))
          (cond
           ((null rec) ;; (4)
            (add-to-list 'nicks (car recipient))) 
           ((bbdb-record-xfield rec wicked/bbdb-salutation-field) ;; (5)
            (add-to-list 'salutations 
                         (bbdb-record-xfield rec wicked/bbdb-salutation-field))) 
           ((bbdb-record-xfield rec wicked/bbdb-nick-field) ;; (6)
            (add-to-list 'nicks 
                         (bbdb-record-xfield rec wicked/bbdb-nick-field)))
           (t
            (add-to-list 'nicks
                         (car (split-string (bbdb-record-name rec)))))) ;; (7) 
          (setq recipients (cdr recipients))))
      (when nicks ;; (8)
        (insert (format wicked/bbdb-hello-string 
                        (mapconcat 'identity (nreverse nicks) ", "))
                " "))
      (when salutations ;; (9)
        (insert (mapconcat 'identity salutations " ")))
      (when (or nicks salutations)
        (insert "\n\n")))))

(defadvice gnus-post-news (after wicked/bbdb activate)
  "Insert nicknames or custom salutations."
  (wicked/gnus-add-nick-to-message))

(defadvice gnus-msg-mail (after wicked/bbdb activate)
  "Insert nicknames or custom salutations."
  (wicked/gnus-add-nick-to-message))

(defadvice gnus-summary-reply (after wicked/bbdb activate)
  "Insert nicknames or custom salutations."
  (wicked/gnus-add-nick-to-message))

After you add this code, you can store personalized nicknames and salutations in your BBDB. Nicknames and salutations will be looked up using people’s e-mail addresses. While in the *BBDB* buffer, you can type C-o (bbdb-insert-new-field) to add a field to the current record. Add a nick field with the person’s nickname, or a hello field with a custom salutation. When you compose a message to or reply to a message from that person, the salutation or nickname will be included. If no nickname can be found, the recipient’s name will be used instead.

A number of variables can be used to modify the behavior of this code(1). For example, you may or may not want to greet 20 people individually. The default value of wicked/gnus-nick-threshold is to greet up to four people individually, and greet more people collectively. If you always want to greet people individually, add (setq wicked/gnus-nick-threshold nil) to your ~/.emacs. If you want to change the strings used to greet people individually or collectively, change wicked/bbdb-hello-string and wicked/bbdb-hello-all-string. If you want to store the data into different fields, change wicked/bbdb-nick-field and wicked/bbdb-salutation-field, but note that old data will not be automatically copied to the new fields.

Here’s how the code works. First, it retrieves the list of addresses from the header(2). If there are more addresses than wicked/gnus-nick-threshold, then wicked/bbdb-hello-all-string is used to greet everyone. If not, each recipient address is looked up. If the recipient cannot be found in your BBDB, then the recipient’s name or e-mail address is used(4). If there is a personalized salutation, it is used(5). If there is a nickname, it is used(6). If the person has a record but neither salutation or nickname, then the name of the record is used(7). After all recipients have been processed, the names are added to the message(8), followed by the salutations(9). This function is added to the different Gnus message-posting functions, so it should be called whenever you compose or reply to messages.

Jetlag-assisted wakefulness

March 24, 2008 - Categories: travel

I was out like a light last night at maybe 8:00 or so. Jetlag. Today I woke up at 3:30. I meant to stay in bed until at least 4:00, but I felt time slipping past, and I wanted to do something with it. That’s okay. Maybe I can turn this into a jetlag-assisted early-morning wakeup. I hear many productive writers wake up really early, write, and then go about the rest of the day.

I spent most of yesterday putting together a photo book. There were many memories omitted because we didn’t take pictures. I may work on something a little more verbose some other time. Still, it’s not a bad first photo book. There, that’s one new thing I did this week that I’ve never done before.

What are my goals for this week?

That should be enough for starters. =)

Vision + Value + Voice = Connection

March 24, 2008 - Categories: social

Gary Brown e-mailed me this insightful manifesto from Michael Lee Stallard, an expert on client and employee engagement. In it, Michael describes the key ingredients of a connection culture: vision, value, and voice. More and more companies are focusing on developing deep, rich connections between their employees and their customers, and this document has a number of good examples of the benefits of this approach. Check it out at ChangeThis :: The Connection Culture: A New Source of Competitive Advantage.

Optimizing my day

March 25, 2008 - Categories: kaizen

My old routineMy new routine

Maybe there’s some truth to the advice, “Early to bed and early to rise makes a man healthy, wealthy, and wise.” Thanks to jetlag, I’ve been up uncharacteristically early. I like the new rhythm my day has taken.

Before this jetlag-assisted early start, I used to stumble out of bed, scarf down a quick breakfast, and head to the office. Waking up was a gradual process, and it took me about an hour or so to warm up for more creative work. After I returned from the office, I tried to squeeze in some personal creative time in the evenings. I found it difficult to write when my brain was tired from work. Finding the time to exercise was low on my list, as it took me away from other things I would rather be doing.

Yesterday, I simply couldn’t stay in bed past 3:30 in the morning. That gave me plenty of time to exercise, plan my day and my week, and write a thousand words for my book. I arrived at the office at 8 o’ clock and worked on my most important tasks. Because I had breakfast earlier, I got hungry earlier, too. Fortunately, I had brought brownies from the Philippines, and that helped me last until lunch time. I felt myself winding down in the afternoon, so I worked on some more routine tasks. When I got home, I spent some time tidying up and chatting with other people. This was a good way to relax and get ready to sleep. I was asleep by 8.

Today I’ll find out if I can repeat that rhythm. This morning, I woke up at 4:30. I prepared oatmeal, then exercised while the oatmeal simmered. Exercising first thing in the morning meant that I woke up quickly and with lots of energy. I even found the time to bake peanut butter cookies. The only hiccup was that I had some filesystem problems with my laptop, so I didn’t get around to writing as much as I wanted. I spent some time sketching instead.

Tonight, I’ll see if preparing breakfast and lunch in the evening is a good way to use my downtime to free up some of my personal creative time. Tomorrow, I’ll set my alarm clock for even earlier. I’d also like to move my morning writing session earlier, perhaps even before breakfast. Kaizen: relentless improvement.

Morning Pages

March 26, 2008 - Categories: writing

Three tips for long flights

March 26, 2008 - Categories: travel

Flying to the other side of the world means almost a full day in transit. Here are three tips to help you get through your next long flight:

How do you fly over the ocean?

Morning pages

March 27, 2008 - Categories: Uncategorized

Weekly report

March 30, 2008 - Categories: weekly

One week on the ground–that’s all I have in between flights. We got back from a two-week vacation in the Philippines. I was glad to see that I’d tied everything up neatly before I left and things had gone on in my absence. Between catching up and getting ready for my next set of flights, my week was just packed (but in a very good way). Here’s what happened:

Next week, I’m flying to IBM Palisades in New York for the Best Practices Conference, and then to Florida for the Technical Leadership Exchange. If I can survive both conferences with plenty of networking opportunities and without falling flat on my face during my presentations, I think I’ll count that as a win.