Birthdays are a good opportunity for reflection - a natural time to look at from whence we came and where we are going.
I have done several purges in the last few years, letting go of what no longer serves me, so that there is room for what I truly want in my life.
This year I’ve decided to take a break from the Internet.
I love the Internet. In some ways I feel like it’s a part of me - maybe I’m not sure what I would be like without it. It’s been the source of nearly all my employment. My profession is not so much computer programming as Internet-building. The Internet has obviously delivered many positive things, and is constantly shaking things up, challenging old ways of thinking, and connecting people in new and interesting ways. However lately I’ve been noticing that I’ve allowed cyberspace to occupy too much of my space, and questioning the quality of my time spent there.
I’ve begun studying my habits (thoughts and actions), looking for ways to curb the stress-inducing ones, and promote the ones that are less demanding and more fulfilling. I’ve identified some Internet habits I have that I would like to break - here they are:
This one manifests as hours and hours and hours spent with my feed reader, scouring the headlines for drips of new and cool in a sea of noise. This activity is driven partly by a natural and healthy curiosity but also an unhealthy desire for stimulation/distraction and fear of becoming obsolete or behind the times.
This one is similar to my news addiction, but involves downloading music and movies. There is a ‘never enough’ feeling to this habit, as well as quantity over quality. What would I do without a hard drive full of music?
My blog and Facebook page are like alternate ‘faces’ of mine - whose appearance I have a tendency to be overly concerned with. How many people read my blog? How many follow my feed? Do I post often enough? Do people like what I post? Was that last post too technical, non-technical, trivial, flaky? Maybe I need to work on my theme? Update my blog software? Argh, more comment spam!
Yikes… I worry way to much about a page of HTML.
Braincrack (coined hilariously here) consists of compulsive thoughts about cool creative potential projects, which build up in your head, lingering there unfulfilled, only to be replaced by new thoughts of cool creative projects.
I am a victim of braincrack - at any given time I have 3 or 4 great web/tech/geek-related projects rolling around in my head that I never have time to work on. A fair number of my geek friends suffer from this as well… maybe it’s braincrack that makes you a geek. Anyway - it’s time to put the pipe down, and get off the braincrack.
The common theme here is wasted energy, wasted time, unnecessary worry and stress, and a turning away from the nuanced and infinite present moment.
These things have become so part of my reality that I’m not sure who I am without them. I want to find out.
I want more space in my life. More silence. Wider margins on the page.
This story by Thich Nhat Hanh has been popping up in my mind lately:
One day the Buddha was sitting in the wood with thirty or forty monks. They had an excellent lunch and they were enjoying the company of each other. There was a farmer passing by and the farmer was very unhappy. He asked the Buddha and the monks whether they had seen his cows passing by. The Buddha said they had not seen any cows passing by.
The farmer said, “Monks, I’m so unhappy. I have twelve cows and I don’t know why they all ran away. I have also a few acres of a sesame seed plantation and the insects have eaten up everything. I suffer so much I think I am going to kill myself.
The Buddha said, “My friend, we have not seen any cows passing by here. You might like to look for them in the other direction.”
So the farmer thanked him and ran away, and the Buddha turned to his monks and said, “My dear friends, you are the happiest people in the world. You don’t have any cows to lose. If you have too many cows to take care of, you will be very busy.
“That is why, in order to be happy, you have to learn the art of cow releasing. You release the cows one by one. In the beginning you thought that those cows were essential to your happiness, and you tried to get more and more cows. But now you realize that cows are not really conditions for your happiness; they constitute an obstacle for your happiness. That is why you are determined to release your cows.”
We have to ask what is really essential to our happiness. We believe that things are essential to our happiness, but we have to look again. Many of us have cows, many cows that prevent us from being happy. That is why we have to learn to release our cows. Also there are many cows inside, so many preoccupations! Many things to worry about, to be angry about, and there’s no space at all inside.
How can you be happy in such a state of being? That is why to release the cows around us and to let go of these preoccupations inside is a very essential condition for happiness. That is the space we are talking about when we practice. I am space; within and out. I feel free. Freedom is the real foundation of happiness.
It’s time to release some cows! Here’s what I have in mind for my Internet diet:
If there’s important information that I should know, I trust that the universe will find another way to give it to me. And if it doesn’t I guess that’s OK too… maybe it wasn’t that important?
I have a few podcasts that I’ll continue to watch - I find that these don’t have that random, always-searching-for-the-next-thing aspect. Maybe I’ll listen to the radio instead.
I’m closing down the blog - it’s been great, but it’s a big fat cow and needs to go. I’ll probably let go of the whole nearlyfree.org namespace entirely - time to move on.
I may still use it a bit for very specific things, like events, or for contacting people.
This one’s a little tougher, and is more psychological. The fact is, I have very little spare time these days, so the number of cool ideas I obsess over which actually manifest is close to zero. I’m also getting rid of all the domains I’ve registered and never done anything with, and never will. It’s kinda funny when you find yourself of thinking of projects to fit the domains you own. No more. Who knows what I’ll be able to do with all that freed up brain energy?
My goal is to be on this diet for a year, and re-evaluate next November 23rd.
Till then!
Peace.
Keith
Over the past 8 years I have been studying intensively at Lightwork Spiritual Development. A spiritual practice designed to create a safe space to heal oneself. There has been immense change in my life over the past 8 years. I have opened up new ways of being; more trust, love, self respect, determination and self responsibility. I have been able to create things that I have wanted in my life for years, a job I love, a beautiful loving husband, a safe happy home and more! This work is intense and takes courage. I am proud of myself for sticking to it. I am also proud of the students that I see at Lightwork healing themselves. I have been teaching now for 5 years and it is a blessing to assist people in such a real and safe way. This following piece is a focus on one aspect of healing. I feel one of the reasons I am on the planet at this time is to shine a light on this subject to bring it out of the darkness, raise it up to the sun and watch as the light cracks it open:
Sexual abuse is prevalent.
Some people want to avoid it,
hide it away,
tuck it in the back of the closet hidden under a mess of stuff in the dark.
Forget and deny.
When this happens sexual abuse stays there lingering,
affecting every move that person makes.
Sexual abuse can happen energetically - with a thought, a vision
either way conscious or unconscious,
the person thinking that thought is responsible for the thought.
It can happen with a word or
a physical act.
Some people who are sexually abused hold disdain towards others who talked about their sexual abuse. I have seen people forget, forget their entire childhood. Parts of their childhood. Forget that the abuse ever took place, like a blackout.
And I see people healing their sexual abuse. Taking ownership of the situation. Stepping out of the victim role with all of it’s limitations and powerlessness. Facing the fear of looking it straight on and seeing it clearly.
It doesn’t stand a chance
it backs off
cowering in the corner. A shivering cold lie. Disconnected from love, from light, from truth.
See it
Speak it
Heal it
The light is stronger. We are stronger. We are light.
I have been on the candida diet for 6 weeks now. Candida is a fungus that lives naturally in our bodies but can overgrow, some symptoms of candida are allergies, gastrointestinal issues, arthritis, sinus problems etc. I am only eating brown rice, veggies, beans and max. 2 pieces of fruit/day. I knew I had to do this diet. I have had allergies and other symptoms for years. I did not want to though. My body associates food with love, food with joy, food with entertainment, food with emotional support. I noticed right away how much less I need to eat to actually feel full, it isn’t that much food at all. I would usually eat another serving or have a fancy beverage or finish with dessert just because I could for all the reasons I stated above. I have been working on my emotional attachment to food for years now. One of my earliest happy memories was a regular and much anticipated event, walking to the bakery with my mom when I am 4 to buy a gingerbread man. MMM, that cookie was good. It was sunshine and love and my mom was there, it represented nurturing and simple pleasures, out of the house, away from my brothers and sisters and the stresses of learning how to live in our world. It was a great cookie with pretty buttons and a happy face. I have noticed how much my body wants to go unconscious with emotions, and during my time off. Dating has been effected since so much of it revolved around food; go for a chai latte, dining, movie with popcorn, treats. Now we drink green tea and both (Keith is on the diet too) are a bit tired. In theatre school (11 years ago) I started to realize, when I would steal a double chocolate chip cookie from the cafeteria everyday during lunch hour (I had to steal it, I was a vegan, but if it was free, according to this moral code, it was forgiven) I would eat that cookie and it would raise my energy level so high. I began to feel that this was life, high, strung out on sugar, wide eyed, this was joy. I can feel my body on this day, day 42 of the diet not wanting to be joyful, feeling it can’t, there is no joy without sugar. I am pretty sure there is but my body is grieving the death of an old friend, an old dysfunctional friend. I am more sensitive to the aches and pains, the emotions, the stress and most of all the nervous tension my body holds onto. The fear of being hurt that if I do something wrong I will be in trouble. That is usually when I would eat a cookie. But no more. Now I get to face the fear and kick it out of my life for good. I said to my naturopath the first time we met, I feel like candida is a monster and he said, “It is a monster.” It is a monster that steals joy and love and perpetuates denial. As my spiritual teacher says often, “That’s just not a good time!”
If you use /etc/hosts to create fake domains on a unix-like system, you’ve probably noticed that these domains don’t show up for the standard DNS debugging tools. Commands like ‘dig’, ‘host’ or ‘nslookup’ all return ‘Domain not found’ for your custom domains, because they all query your nameserver directly, rather than using a system call.
These domains work for your browser, for instance, because your browser uses system calls to do name resolution, which are handled by the operating system and can looked-up in various different places, like /etc/hosts. However sometimes I find it handy to have a simple shell command that works for my custom domain names. Here’s what I use:
alias resolv='perl -MSocket -e '\''@a=gethostbyname(shift); print map({inet_ntoa($_)."\n"} splice(@a, 4));'\'''
Example:
nearlyfree:keith keith$ resolv keith.local
127.0.0.1
You could write this simple program in any language - I chose to write it in Perl.
Here’s another handy command. If you are using Mac OS X, you may find that you need to send a signal to ‘lookupd’, the process that handles name lookups, to make sure your /etc/hosts changes ‘took’. This alias does just that:
alias lookhup="sudo kill -HUP \`ps -ax | awk '/lookupd/{print\$1}' | head -1\`"
Have fun!
For some time now I’ve had ideas banging around in my head about what a fully service-oriented blogging (SOB :) system would look like. It feels good to get this out of my head, and onto (virtual) paper.
Content store
The core of the blog system would be simply a store of blog posts with a blogging API in front of it.
Existing technology: Atom Publishing Protocol - Atom seems like the only blogging API with a future - I.e. the only one extensible enough to be used beyond the basic blogging use cases.
Existing services: it may be possible to use an existing hosted blogging service, if it provides an Atom API to access the store. However I doubt these systems are flexible enough to do what’s needed here.
Indexing
Your content store would be indexed by one or more indexing services. Some would perhaps focus more on categorization (e.g. Technorati) others on keyword search (e.g. Google search). The key is that the index services have an API that allows them to be easily plugged in to our blog UI.
Existing technology: Lucene perhaps?
Existing services: Google search, Yahoo! search, Technorati, many more…
Comments/Annotation
This service would allow commenting, annotation, rating, tagging, review, etc. of your content by others.
It would be cool to see a unification of pingback, trackback, and regular blog comments via smart schemas (Atom, hAtom, hReview) and smart indexers. It shouldn’t matter if my comment on your article resides in my blog system or yours (or on a third-party’s), as long as the links between the content items are discoverable programmatically, and notification of all interested parties is possible. In a sense this service doesn’t store content so much as store the links between pieces of content. To some extent this is the domain of an Indexing service - so maybe a seperate category of service is not necessary.
Existing technology: Atom, hAtom, hReview, RDF maybe
Existing services: There are several commenting services out there, but none are this flexible as far as I can tell. There have also been some experiments with decentralized annotation, like hoodwink.d and wikialong.
Authentication
Identity 2.0 technologies are appropriate here, so that none of these services need yet-another-password, and so people can easily give indexing and annotation services access to their private data.
Existing technology: OpenID, OAuth, Infocards, SAML, i-names
Existing services: many, I use Sxipper and MyOpenID.com
UI
At the end of the day, we need a front-end so that humans can see our wonderful content.
Likely there would be many - feed readers and browser plugins on the client side, on the server side one could imagine a generic content store navigator service - something that aggregates not just your content but all the various indexes, ratings, categories, tags and reviews on your content into one UI.
Existing technology: Many feed readers exist. Most modern content management systems and web frameworks are capable of assembling various feeds and querying various services to build a page.
Existing services: I don’t know of any services that do exactly what is needed here.

Poster seen near SE Marine drive (right behind Lee Valley Tools actually). Great marketing!
I recently got myself a phone with a data plan (a Treo 700p to be exact), so that I can check my email when I am laptop-less and/or wifi-less.
Living in Canada, I’m subjected to absurdly expensive mobile data rates, so every byte is precious. My solution to this is to limit the amount of email data that goes to my phone as much as possible.
Here’s what I decided my email-to-phone system needed to do:
I only want to receive important personal mail on my phone - no bulk mail, no low-signal-to-noise mailing lists.
Remove HTML, attachments, images
Modern mail user agents make it possible to increase email size by a factor of 10 without adding any more relevant information. I want to be able to slim my email down to just the facts.
How it works
At the end of my Procmail script, I have a recipe that forwards any mail that has gotten by all the filters to a different account from which my phone is set to get mail.
:0c
| awk 'NR > 2' | ~/bin/plaintextforward.pl keith.grennan@example.com
That awk bit there strips out the extra header (From line) and sends the rest to my email-slimming script, ‘plaintextforward.pl’, which looks like this:
#!/usr/bin/perl
use strict;
use warnings;
use Mail::Message;
use IO::File;
die "usage: $0 to-address < msg" unless @ARGV;
my $to = shift @ARGV;
# flatten, and create alternative text/plain parts for any HTML parts
my $msg = Mail::Message->read(\*STDIN)->rebuild(
extra_rules => ['flattenNesting', 'removeEmptyMultiparts','textAlternativeForHtml']);
# join all text/plain parts into one string, and discard the rest
my $body = join("\n", map($_->decoded,
grep(lc $_->get('Content-Type') eq 'text/plain', $msg->parts('RECURSE'))));
# make this string the body of the message
$body = Mail::Message::Body->new(mime_type => 'text/plain', data => $body);
$msg->body($body);
# forward the message
$msg->head->set(To => $to);
my $out = IO::File->new("$ENV{HOME}/last-msg", 'w');
my $bounce = $msg->bounce(To => $to);
$bounce->print($out);
$bounce->send;
I use the Perl module Mail::Message to do all the processing. It creates plain text alternates to all HTML parts, if they don’t already exist, and then I gather up all the plain text parts and join them together, discarding everything else - this becomes the new message. Then it gets forwarded on to the phone account.
So that works pretty well, but I still have a problem - the backlog of mail building up in the phone mailbox. If I don’t check my phone mail for a while, I don’t want to get a flood of already-read messages. And I don’t want to have to log in to that other account and clean it up all the time. Solution - make a mail box emptying script that uses the POP3 protocol, ‘clearmail.pl’:
#!/usr/bin/perl
use strict;
use Mail::Box::POP3;
my $p = Mail::Box::POP3->new(username=>"keith.grennan", password=>"XXXXX", server_name=>"pop.example.com");
$_->delete for $p->messages;
$p->close(write => 'MODIFIED', force => 1);
I hook this script up to a shell script called ‘m’ that i use to invoke my mail reader so it gets run in the background whenever I open my mail client:
#!/bin/bash
clearmail.pl &
mutt
So I know that when I check my main mail account, I am clearing out my phone mail account.
Hope this helps my fellow Canadians, until we see some actually competitive mobile data rates.
Observation - these two conditions must be met for a software company to be successful:
1. Engineering trusts Product Management.
2. Engineering believes Product Management to be competent.
Engineering and Product Management trust each other, and each believes the other to be competent.
Note:
Revised (2007-10-05): On reflection, I think it’s important to emphasize the reciprocal nature of the trust relationship.

The Amazon product-pairing algorithm clearing fails this Turing test.
Although, it could be there’s something about combining cast-iron teapots and Metroid that I don’t know about…
Update (2007-10-02): Net::OAuth now supports the RSA-SHA1 signing method!
Update (2008-06-04): Net::OAuth 0.11 released, with many new fixes and features Changelog
Quick links:
Today I noticed the link ‘OAuth 1.0 Draft’ appear in the del.icio.us popular feed. I followed it, and to my great delight found a spec for a protocol that is long overdue.
OAuth is
An open protocol to allow secure API authentication in a simple and standard method from desktop and web applications.
This abstract definition can be explained by a simple example:
I keep my photos on a photo-sharing site. I want to print some photos on a photo printing site, and have them shipped to me. How does the photo printing site get access to my photos (say they are my private photos, only visible to me)? One way would be to give the printing site (call this site the Consumer) my username and password at the sharing site where my photos are stored (call this the Service Provider). Problem: Then the Consumer has my credentials - this gives them total access - they could, in effect ‘be me’ on that other site. This obviously isn’t what I want. What I want to do is just give them the right to use my private data at the Service Provider, without giving away my password.
OAuth allows that to happen, in a simple standardized way.
OAuth is OpenID-like (not in its purpose, but in the way it is architected), but simpler. From reading the spec I can see that learnings from the OpenID process have been applied here - this spec has a clean, mature feel, despite being 1.0. It was also nice seeing some familiar names listed as authors on the document, like Blaine Cook and Andy Smith.
After all that I decided to help out with some Perl code. After a few hours of hacking, Net::OAuth was born! You can learn more about it on the Net::OAuth page on CPAN.
It’ll be fun to watch this protocol as it spreads. It is, like I said before, long overdue, and is immediately useful to many sites.