- Calendar -

February 2010
Mo Tu We Th Fr Sa Su
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28

- Archive -

- Browse By Random Tag -

- Most Commented -

- Random Favourites -

- Blogs I Like -

- Email Viruses Received -

- My Geek Code -

-BEGIN GEEK CODE BLOCK-
Version: 3.12
GIT d-- s: a- C++ UL++ P+++ L+++ E--- W+++ N+ o-- K- w--- O- M-- V- PS+++ PE-- Y++ PGP t++ 5+++ X R tv b+ DI+ D++ G e h r+ y+
--END GEEK CODE BLOCK--
Get The Encoder
Get The Decoder

- My Blog Code -

-BEGIN BLOG CODE BLOCK-
B6 d+ t++ k+ s++ u-- f i++ o+ x+ e l c-- --END BLOG CODE BLOCK--
Blog Code Encoder
Blog Code Decoder

- The Internet is Cool -

- Nifty Blog Toys -

RSS Feed

- Content License -

Blog

'Canadian Pride' (At Grandma's Request)

My grandmother just sent this to me with the added request that I distribute it to those in my own networks. I can agree with the sentiment and so I'm doing just that. It's about time that Canadians recognised that our place in this world is more than "America's Hat":

I am old enough to remember when the Great Lakes St. Lawrence Seaway was debated and ultimately opened to navigation in 1959. Construction of the 306 km. stretch of the Seaway between Montreal and Lake Ontario is recognized as one of the most challenging engineering feats in history.

Discussion with the U.S. had been ongoing over the past thirty years but in the end they decided not to participate in such a major undertaking. Canadian public opinion was pushing our politicians to go it alone and in July , 1951 Premier Frost of Ontario publicly asked the United States to “Please, get out of the way and let us get on with the job.” The Federal Government followed within days and announced we would build the St. Lawrence Seaway. It was a time of Canadian pride. The United States then decided that they would participate in the building of the Seaway and the project went ahead.

I tell this story because I wonder where our Canadian pride has gone. We were a much smaller nation in the 1950’s but we felt we could do it. Now it seems we must ask the U.S. to make our policy on climate change, auto emissions etc.

Shirley Quinn,
Armstrong, B.C.

Unrepresented

So that word is floating around again "Prorogue". For those of you who missed it, I'm sorry to be the one to break it to you, but we've all been without representation in the federal government now for almost a month now. Stephen Harper, our Prime Minister decided to shut down parliament back in December and won't be affording us representation until some time in March.

That's three months paid vacation for a parliament that sat for only 49days last year. Three months without the business of government being done, without your voice being heard in the House. Sure Harper still gets to be the boss and represent Canada abroad and at the Olympics, and no, our soldiers in Afghanistan don't get to take a break. Addressing our commitments on climate change won't happen by the Copenhagen deadline, and we're all still paying taxes for the privilege of living in a democracy.

People have staged (successful) revolutions for less.

In Canada though, where we once saw only apathy, there appears to be some exciting movement among the grass roots. Hundreds of thousands of people have joined a Facebook group denouncing Harper's Conservatives for this move and the numbers keep growing. Support for the Conservatives has begun to dwindle as well and now there are rallies planned around the world in condemnation of this prorogue.

Here's a list of what proroguing means to Canada:

  1. Committees investigating accusations of torture of Afghan detainees stop working.
  2. Questions about Canada's inaction at the Copenhagen climate-change summit are silenced. Opportunities to move forward with Canada’s plan for sustainable development are stalled for over a month.
  3. Discussions and decisions about the pension crisis affecting Canada’s seniors stops.
  4. All 37 bills being debated in Parliament are thrown in the trash. Discussion on bills starts from scratch in March, wasting months of hard work by all parties. These bills included new crime legislation, and limits on credit card insurance rates, etc.
  5. Your MP cannot raise your concerns in Ottawa
  6. Harper will still appoint Conservative senators, giving him control of the Senate.

Frankly, it's actions like these that make it hard for me to claim that I live in a democracy. Instead, it might be more accurate to say that we've become a cyclical banana republic. As for what the other parties are saying...

  • The Liberals have flat-out said that they're going back to work with or without the Conservatives on January 25th, the original date that Parliament would have reconvened.
  • The NDP have similarly said that they will be "on Parliament Hill" on the 25th, though I'm unsure as to what that means exactly.
  • The Bloc Québécois have condemned the prorogation but as far as I can tell, have not said anything about showing up to work.
  • The Greens, not in possession of a seat (yet) also condemned the Harper move and will be out at the rallies tomorrow across the country as well.

So what can you do? Some suggestions:

  • Tell your friends and family about this. A lot of people still don't know that they're paying taxes to a non-existent government and the Conservatives are counting on an ignorant public to keep them in power. Don't let them have it.
  • Join in on one of the rallies this Saturday, January 23rd. They're happening all over the world in Vancouver, Toronto, New York, Amsterdam and even Costa Rica. Details are on noprorogue.ca. Vancouver's rally starts at 1pm at the VAG, while Toronto's starts at 1pm at Dundas Square.
  • Call your MP. If (s)he's a Conservative, tell them to get back to work. If they aren't, tell them to consider all alternatives for bringing democracy back to our government. The Coalition is still an option, if only the opposition parties can learn to get along.

I'll be at the event in Vancouver, so if you care to come along, let me know and we can meet up :-)

It's a Wonderful Life

A lot of people have read this thinking that it was an exercise in self-loathing or a cry for help of sorts. Nothing could be further from the truth. It was purely an existential question based in the thinking that at the core, humanity hasn't changed that much through the course of our history. New titles, different roles is all. Anyway, thanks for the support everyone, but I'm fine, honest :-)

You know how in that movie, George Bailey finds out just what the world would be like if he'd never existed? The moral of the story is supposed to be how significant your own minor contributions have been to the tapestry of your life, but I was just thinking...

In the grand scheme of things, the unremarkable of us (that is to say, pretty much everyone but a remarkable few) don't really have lasting effects on the world as a whole. Rather, our greatest effects, if we have any at all, are usually on those we care about, those to whom we are closest.

Given this reality, is this idea that we are somehow integral to "the world" in our own small way, really just a egocentric fantasy? How different would the world really be if one of us never existed? Wouldn't it be more honest to say that the tiny part of the world about which we care the most would be different? Isn't it a bit presumptuous to think that every one of us is integral to the balance of society?

Humanity hasn't changed much in the last few thousand years. Sometimes, I wonder if any of us really matter at all.

Facebook Page Syncronisation

This is going to be a rather technical post, coupled with a smattering of rants about Facebook so those of you uninterested in such things might just wanna skip this one.

As part of my work on my new company, I'm building a syncroniser for status updates between Twitter, Facebook, and our site. Eventually, it'll probably include additional services like Flickr, but for now, I'm just focusing on these two external systems.

A Special Case

Reading this far, you might think that this isn't really all that difficult for either Twitter or Facebook. After all, both have rather well-documented and heavily used APIs for pushing and pulling data to and from a user's stream, so why bother writing about it? Well for those with my special requirements, I found that Facebook has constructed a tiny, private hell, on in which I was trapped for four days over the Christmas break. In an effort to save others from this pain, I'm posting my experiences here. If you have questions regarding this setup, or feel that I've missed something, feel free to comment here and I'll see what I can do for you.

So, lets start with my special requirements. The first stumbler was the fact that my project is using Python, something not officially supported by Facebook. Instead, they've left the job to the community which has produced two separate libraries with different interfaces and feature sets.

Second, I wasn't trying to syncronise the user streams. Instead, I needed push/pull rights for the stream on a Facebook Page, like those created for companies, politicians, famous people, or products. Facebook claims full support for this, but in reality it's quite obvious that these features have been crowbared into the overall design, leaving gaping holes in the integration path.

What Not to Do

  • Don't expect Facebook to do the right/smart thing. Everything in Facebookland can be done in one of 3 or 4 ways and none of them do exactly what you want. You must accept this.
  • Don't try to hack Facebook into submission. It doesn't work. Facebook isn't doing that thing that makes sense because they forgot or didn't care to do it in the first place. Accept it and deal. If you try to compose elaborate tricks to force Facebook's hand, you'll only burn 8 hours, forget to eat or sleep in the process and it still won't work.

What to Do

Step 1: Your basic Facebook App

If you don't know how to create and setup a basic canvas page in Django, this post is not for you. Go read up on that and come back when you're ready.

You need a simple app so for starters get yourself a standard "Hello World" canvas page that requires a login. You can probably do this in minifb, but PyFacebook makes this easy since it comes with handy Django method decorators:

# views.py
from django.http import HttpResponse, HttpResponseRedirect
import facebook

@facebook.djangofb.require_login()
def fbCanvas(request):
    return HttpResponse("Hello World")
Step 2: Ask the User to Grant Permissions

This will force the user to add your application before proceeding, which is all fine and good but that doesn't give you access to much of anything you want, so we'll change the view to use a template that asks the user to click on a link to continue:

# views.py
from django.shortcuts import render_to_response
from django.template import RequestContext
import facebook

@facebook.djangofb.require_login()
def fbCanvas(request):
    return render_to_response(
        "social/canvas.fbml",
        {},
        context_instance=RequestContext(request)
    )

Note what I mentioned above, that we're asking the user to click on a link rather than issuing a redirect. I fought with Facebook for a good few hours to get this to happen all without user-input and it worked... sometimes. My advice is to just go with the user-clickable link. That way seems fool-proof (so far).

Here's our template:

<!-- canvas.fbml -->
<fb:header>
    <p>To enable the syncronisation, you'll need to grant us permission to read/write to your Facebook stream.  To do that, just <a href="http://www.facebook.com/connect/prompt_permissions.php?api_key=de33669a10a4219daecf0436ce829a2e&v=1.0&next=http://apps.facebook.com/myappname/granted/%3fxxRESULTTOKENxx&display=popup&ext_perm=read_stream,publish_stream,offline_access&enable_profile_selector=1">click here</a>.
</fb:header>

See that big URL? It's option #5 (of 6) for granting extended permissions to a Facebook App for a user. It's the easiest to use and hasn't broken for me yet (Numbers 1, 2, 3 and 4 all regularly complained about silly things like not having the app instaled when this was not the case, but your milage may vary). Basically, the user will be directed to a page asking her to grant read_stream, publish_stream, and offline_access to your app on whichever pages or users she selects from the list of pages she administers. Details for modifying this URL can be found in the Facebook Developer Wiki.

Step 3: Understanding Facebook's Hackery

So you see how in the previous section, adding enable_profile_selector=1 to the URL will tell Facebook to ask the user to specify which pages to which she'd like to grant these shiny new permissions? Well that's nifty and all, but they don't tell you which pages the user selected.

When the permission questions are finished, Facebook does a POST to the URL specified in next=. The post will include a bunch of cool stuff, including the all important infinite session key and the user id doing all of this, but it doesn't tell you anything about the choices made. You don't even know what page ids were in the list, let alone which ones were selected to have what permissions. Nice job there Facebook.

Step 4: The Workaround

My workaround for this isn't pretty, and worse, depends on a reasonably intelligent end-user (not always a healthy assumption), but after four days cursing Facebook for their API crowbarring, I could come up with nothing better. Basically, when the user returns to us from the permissioning steps, we capture that infinite session id, do a lookup for a complete list of pages our user maintains and then bounce them out of Facebook back to our site to complete the process by asking them to tell us what they just told Facebook. I'll start with the page defined in next=:

# views.py
@facebook.djangofb.require_login()
def fbGranted(request):

    from cPickle import dumps as pickle
    from urllib  import quote as encode

    from myproject.myapp.models import FbGetPageLookup

    return render_to_response(
        "social/granted.fbml",
        {
            "redirect": "http://mysite.com/social/facebook/link/?session=%s&pages=%s" % (
                request.POST.get("fb_sig_session_key"),
                encode(pickle(FbGetPageLookup(request.facebook, request.POST["fb_sig_user"])))
            )
        },
        context_instance=RequestContext(request)
    )
# models.py
def FbGetPageLookup(fb, uid):
    return fb.fql.query("""
        SELECT
            page_id,
            name
        FROM
            page
        WHERE
            page_id IN (
                SELECT
                    page_id
                FROM
                    page_admin
                WHERE
                    uid = %s
            )
    """ % uid)

The above code will fetch a list of page ids from Facebok using FQL, and coupling it with the shiny new infinite session key, bounce the user out of Facebook and back to your site where you'll use that info to re-ask the user about which page(s) you want them to link to Facebook.

Step 5: Capture That page_id

How you capture and store the page id is up to you. For me, I had to create a list of organisations we're storing locally and let the user compare that list of organisations to the list of Facebook Pages and make the links appropriately. Your process will probably be different. Regardless of how you do it, just make sure that for every page you wish to syncronise with Facebook, you have a session_key and page_id.

Step 6: Push & Pull

Because connectivity with Facebook (and Twitter) is notonoriously flakey, I don't recommend doing your syncronisation in real-time unless your use-case demands it. Instead, run the code via cron, or better yet as a daemon operating on a queue depending on the amount of data you're playing with. However you do it, the calls are the same:

import facebook

# Setup your connection
fb = facebook.Facebook(settings.FACEBOOK_API_KEY, settings.FACEBOOK_SECRET_KEY)
infinitesessionkey = "your infinite session key from facebook"
pageid             = "the page id the user picked"

# To push to Facebook:
fb(
    method="stream_publish",
    args={
        "session_key": infinitesessionkey,
        "message":     message,
        "target_id":   "NULL",
        "uid":         pageid
    }
)

# To pull from Facebook:
fb(
    method="stream_get",
    args={
        "session_key": infinitesessionkey,
        "source_ids": pageid
    }
)["posts"]

Conclusion

And that's it. It looks pretty complicated, and... well it is. For the most part, Facebook's documentation is pretty thorough, it's just that certain features like this page_id thing appear to have fallen off their radar. I'm sure that they'll change it in a few months though, which will make my brain hurt again :-(

Abstract Sequential

I was up late last night. Very late. So late that it had stopped being late and moved well into being mid-morning before I finally passed out. I should probably look into that, but it was fun ;-)

So what was I doing until 1030 on New Years Day? Blogging and writing code of course. My previous post was only the first of two, the second of which is really long and all about my Facebook/Python/Django experiences. It's not finished/polished yet though, so I haven't published it yet.

In addition to those two posts though, I was also inspired by this post on Stephanie's blog about thinking styles to write a Javascript-managed quiz based word-for-word on the pen and paper quiz she pointed to there. For the most part, it was just an exercise for me in how to improve my Jquery-foo, but the subject of the test is fun and interesting too. I'm apparently an "Abstract Sequential" thinker which means that I like things done one way: the right way, and I'm not very good on picking up non-verbal cues. I ranked rather high in both "Abstract Random" and "Concrete Random" too though.

Anyway, if you're so inclined, I've posted the test here. Take it, and let me know what you are!

The Once and Future Me (MMX)

I noticed a number of people posting on Twitter today with the tag #10yearsago and it got me thinking of my actions over this past decade. I started asking questions like what was life like for me back in 2000? What's changed in the world, and what's changed in me over the course of these ten years? More than anything, my father's voice keeps coming up, telling me how life moves so fast. "Blink", he says, "and you're ten years older", and he's exactly right.

Ten years ago, I was still living with my parents in Langley. I claimed to be an environmentalist, while driving 33km to and from work every day and was dying to get the hell out of this province and into the world. My understanding of who I was, and what I wanted was still quite fragile, but at least I was beginning to comprehend that knowing these things was important.

Since then, I've run away from this place and seen the world -- admittedly only few pieces of it, but more than many people around here bother to see in a lifetime. I've lived in the biggest city in Canada, embraced volunteerism and politics and furthered my understanding of the answers to those two important questions.

To be honest, it's hard not to look back on the last ten years of my life and not be pleased with my experiences. I've made a good many mistakes (even made the same ones more than once), but on the whole, I think that I've done good for this world and been true to myself and those I care about. I've learnt more about who I am and what I want than I thought possible, and have no doubt that there's still a great deal more to take in. If my next ten years are as rich as the last, I will be a lucky man.

My concern however is rooted in my father's voice. Indeed, this time has passed quite quickly: I remember having lunch with my father days after 9/11 like it was yesterday, and some days it feels like I'd only recently abandoned Vancouver for a bigger, better life in Toronto... How did I do all of that in just ten years? How much time is left?

There is a life that I want out there, a person I want to be -- is there time remaining to become that man, to build the life I want? Is it folly to try to do both at the same time, or even to convince myself that that life can be achieved? And what if the needs of the various parts of that life are in conflict? When 2020 rings in, and I am 40 years old, will I be able to look back on these next ten years as favourably as those that just passed?

It's a hell of a thing to ask so much of a mere passage of time, but this is who I want to be and what I want out of this life. It may not happen. It may all go sideways. But the path will be mine.

Gnomedex 2009

Way back in September, I went on a "professional development" trip down to Seattle, Americaland for a conference called Gnomedex. The official line on the shindig is that it's all about "human circuitry", the ways in which society interacts with technology and what comes out of it all. The whole thing sounded rather interesting, so I convinced my employer to send me down there on their dime. However, as part of the deal, I had to "report back" on my experiences there... a job I've neglected 'till now. So, in an effort to fill that reporting gap, while simultaneously rejuvenating my slowly staling blog I'm going to post it all here:

General Impressions

I'll get these out of the way so you know whether you want to keep reading or not. I know that the title sounds rather interesting for the sociology-types, tech-nerds, and those that dabble in either but really Gnomedex can be summed up in one sentence: 300 people in a room for 10 hours talking about Twitter. That's it kids, if you're looking for a broader meaning or more interesting conference, Gnomedex isn't it. In fact, if you're a technical type (as I am), I'd go so far as to say that you should avoid this event like the plague.

For starters, the whole thing is a single-track, meaning that at any given time, there's one presentation happening and if it's more boring than watching paint dry, your only alternative is to step out into the hall and socialise with the herds of marketing people trading business cards and dropping names. For many though, this single-track focus is a feature and not a bug. The assumption being that everyone is collectively participating via Twitter during the presentation, people are constantly posting little 140character quips about the talk, and tagging everything #Gnomedex.

A neat experiment in social engineering to be sure... or at least it would be if the technology would cooperate. Internet connectivity was flaky at best, and when you could get online, sites aggregating the #Gnomedex hash-tag were freezing up, crashing out or just not responding. Behold: the future of monolithic service architecture. Look upon it and be unimpressed.

The conference also has a very cliquey feel to it, with the majority of people attending returning from previous years, most everyone knows everyone from the last time they were here. Much like Vancouver, Seattle seems to have a rather tight-knit community of social media junkies that really get off on this sort of thing. I'm sure it's nice for them, to have the opportunity to see in-person, those with whom they've been tweeting back and forth for a year, but for someone like myself, in from out of town to learn something... no fun.

The last general note I'll make here is that the event was a big hit with the big corporations. Micros~1 was out in force, pushing Bing like crazy, Starbucks was pushing their new instant coffee, and Amazon was trying to look all edgy by posting some Java code on a wall and asking people to attempt to "solve" it. The only problem? They didn't have anyone on-site that actually understood the code.

Talk: Thingiverse & Makerbot

The coolest part of the conference was generously scheduled at the start. The Makerbot is the future of product distribution. Here's how it works:

  1. You buy a makerbot machine
  2. You download a model file of what you want
  3. The makerbot "prints" it.

Often referred to as a "3D printer", the makerbot will make you anything you want (of a reasonable size) out of ABS plastic. Just keep it supplied with low-cost spools of plastic and feed in whatever 3D model you can find online and *poof* you have one. Potential uses include the practical: the little plastic knob on the A/C unit that broke off last week, to the functional: ornate boxes or jewellery, to the fun & crazy: a 1:1 scale model of Darth Vader's helmet, or Walt Disney's head. Really cool stuff, and lots of potential. The machines sell for just under $750/each, but are produced in batches so they might not be able to ship you one right away until they've filled the order for the batch.

I want one so hardcore.

fold.it

The premise sounded like a good idea, but someone really should have vetted the presenter. fold.it is a nifty video game that has you folding proteins. The idea is that protein folding (Wikipedia) is such a complex process that relying on computers to do the work just isn't practical. However, the scientific community just doesn't have the manpower to do it all manually. So instead, they made a video game that lets non-nerds use natural human understanding to do the job. Fold a protein and experience the joys of flashing lights, bouncing things and celebratory music. Rinse, repeat. It may sound silly, but this tactic is a growing field out there because it works.

Unfortunately, the presenter was 99% scientist, 1% people-person. The presentation was dry, boring, way, way, way over-technical and few people, if anyone in the room had any inkling as to what he was talking about.

Full video of the presentation can be found here.

Spam

This presentation was done by an ex-spammer, about the tactics his former industry of choice use to do that which we despise. Some of the more interesting tactics included:

  • Paying $50 to a student for her login so they could spam an entire .edu domain from her account.
  • Hacking sites to insert code that would redirect people to another spam site, or just pay the site owner to do it for them.
  • Comment spam (posting "comments" on blog posts all over the web that tell you about the awesome power of Viagra)
  • Using tools like "autopligg" to spam digg.com with spam.
  • Creating new blog sites using content from other people's sites (they access your RSS feed) and then riddle the copied site with ads.

Ignite

This guy has what he thinks is a brilliant idea: bring the concept of brevity out of Twitter and into in-person presentations. Take a topic, any topic and talk about it for no more than 5 minutes with 20 slides, at 15 seconds/slide. We sat through about 5 or 10 of these. Uninteresting and uninformative. Seriously people, this is not a good idea, it's just a way to pretend that you can be informed on something while simultaneously not knowing anything about anything.

My Cancer is Social

Drew Olanoff has Cancer, and he's dealing with it by sharing his experiences with the world. For just over 30minutes, Drew talked about what it was like for him to be hit by the news, how it affected him and his family and how reaching out to his online social community (many of the members of which were in the audience) has helped him cope. He's since created a site called Blame Drew's Cancer as a way to make light of, and deal with his situation and there's been a rather large outpouring of support.

There was a lot of hugging, and touchy-feelyness which I obviously didn't identify with, but as a social outsider looking in on the process, I found the whole thing rather fascinating.

Full video of the presentation can be found here.

Frank Eliason - A Twitter Top 10 List with Humour

A Twitter success story. Frank worked at Comcast in support and decided that it might be a good idea to run a Twitter account for the company, so he set one up. Then, he started noticing people bitching out the company for one reason or another, so he responded with something to the effect of: "ok, I'll get right on that" and went about fixing it. The result: a spike in customer satisfaction and stuff got done.

For the purposes of the presentation, he put together a top ten list of reasons why a company should get on board with Twitter and I'm not going to re-post it here. It's already on the Gnomedex blog.

Full video of the presentation can be found here.

Hacker Journalism (Mark Glaser)

Far and away the most disappointing presentation of the conference, though admittedly this is due in part to the rather low expectations I had for the other talks. If anything, this one suffers from a poor choice of title. Rather than "Hacker Journalism", he could have properly adjusted my expectations with something like "Data Reporting with a Purpose" or something.

Glaser's position was simple: journalism is a way of presenting data in a way that helps people understand it, so hacker journalism is using one's mad it-skillz to take big blobs of data and turn them in to non-nerd-friendly graphs and maps. He asked the audience to make suggestions for data mash-ups with maps and/or pie charts etc and then went on to demo a few examples of similar work already out there. One that I make a note of was the Obameter, a graphing app that takes stock of the promises made, kept, and ignored during the course of President Obama's administration. Neat stuff.

Unfortunately, Glaser has a tendency to throw around the term "hacker" in all kinds of contexts 'till the meaning is really quite gone. I get the impression that he thinks that anyone who can use Yahoo pipes is a hacker, or someone who can use Google Maps to draw something nifty should also wear such a title.

In the end, the talk was more about how maps + stats = mash-ups = awesome, and not so much about front-line independent journalism. As this was the presentation to which I was most looking forward, I was rather disappointed.

NerdCraft (Beth Goza)

As cute and fun as this was, I really don't understand how this presentation made it into the event. There was nothing technical or really even social about it, rather Goza talked at length about the subculture of nerd crafters, people who knit, sew, and crochet all kinds of stuff, from sci-fi characters, to katamari costumes. Some of the stuff she had was crazy:

  • Crochet Star Wars characters
  • A knitted panel of the entire first level of Super Mario Brothers (wo baby, awesome)
  • Some crazy person knitted/crocheted a life-size Ferrari
  • A little crochet Hellboy
  • And DnD dice!

All-in-all, I'm not convinced that her presentation was appropriate for the event, but it was a nice break from the rest of it.

Full video of the presentation can be found here. You should check this one out, it's fun :-)

Audience vs. Impact (Giant Ant Media (@giantantmedia))

There to talk to us about what works in social media was the couple that started Giant Ant Media. They opened with some examples of where they started: making 2min flicks about fart jokes, and followed this with what they were doing now, a documentary about youth in Africa called Bongo. The focus of the talk though was really about how to cultivate an online community. Find what both you and your users love and do it. Don't lie, or try to misrepresent yourself because your audience can smell it. Just focus on honesty in production, be it blogging or richer media and all will be good.

Full video of the presentation can be found here.

Closing

The conference was long, and really not much fun, but I salvaged a few nuggets of wisdom from the whole ordeal, my favourite of which was this:

The difference between knowledge and expertise is trust. Knowledge can be acquired, but unrecognised, isn't much use to anyone, while expertise is given by others who offer you their own credibility in praise of your knowledge. In the knowledge economy, this is kid of a big deal.

...and I think that that's where I'll close this one out. Next year, maybe my employer will send someone more marketing-friendly. Nerds really don't belong at Gnomedex.

On Capitalism

I've been thinking about my own views on capitalism lately. It makes sense, I suppose when you consider that I'm co-founding a for-profit company with an intent to build something so useful that my shares in it would be worth a great deal of money. Add to that the fact that I've been re-negotiating my employment contract with Work [at] Play so that I might better apply my time & energy to this new venture and how I view capitalism becomes pretty important.

Basically, I see my role in a capitalist system as one of maintaining fairness for those involved. In other words, I don't want to make millions of dollars (honestly, what would I do with it?) Rather, I just want to be sure that the profits generated from my work aren't being disproportionately distributed.

To me, any capitalist model should be founded on the understanding that all parties involved stand to profit from their work equally based on the risk endured and the effort applied. In an employer-employee situation, wages are more than the trading of time for money (though they're that too). Wages are also a statement that the employer acknowledges that they wouldn't have a company without the employee and that in recognition of this fact, a reasonable portion of the profits are allocated to them.

I think that a lot of people share my views on this, but don't realise it. They're bitter that person X is paid more or less than person Y but can't explain why. In a co-venture, a lack of understanding can kill the partnership, so knowing the motivation behind those involved is always a good idea. My partner and I are on the same page on this, and I honestly think that it relieves a lot of potential tension.

On a related note, I found this link today that I thought I'd share. It's loosely related, titled "How to Fix Capitalism".

Movember 2009

Every year in November, a group gets together to raise money for the fight against prostate cancer -- and they do this by getting everyone to grow ridiculous moustaches. The more embarassing the "mo", the more money usually raised... or so that's the theory.

My "mospace" page is here, complete with pictures of the progress to date. I'll be shaving it off as of December 1st, so if you're curious as to the "progress" so far, you'll have to look there ;-)

An Output Highlighter

I wrote something like this some time ago, but this version is much better, if only because it's in python. Basically, it's a script that highlights standard input based on arguments passed to it.

But how is that useful? Well imagine that you've dumped the contents of a file to standard output, maybe even piped it through grep, and/or sed etc. Oftentimes you're still left with a lot of text and it's hard to find what you're looking for. If only there was a way to highlight arbitrary portions of the text with some colour...

Here's what you do:

$ cat somefile | highlight.py some strings

You'll be presented with the same body of text, but with the word "some" highlighted everywhere in light blue and "strings" highlighted in light green. The script can support up to nine arguments which will show up in different colours. I hope someone finds it useful.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import sys,re

colours = [
    "\033[1;34m", # light blue
    "\033[1;32m", # light green
    "\033[1;36m", # light cyan
    "\033[1;31m", # light red
    "\033[1;33m", # yellow
    "\033[0;32m", # green
    "\033[0;36m", # cyan
    "\033[0;33m", # brown
    "\033[1;35m", # pink
    "\033[0m"     # none
]

args = sys.argv[1:]

# Strip out arguments exceeding the maximum
if len(args) > 9:
    print("\n%sWARNING: This script only allows for a maximum of 9 arguments.%s\n\n" % (colours[4], colours[9]), file=sys.stderr)
    args = args[0:8]

while True:
    line = sys.stdin.readline()
    colour = 0
    for arg in args:
        line = re.sub(
            r"(%s)" % (arg),
            "%s%s%s" % (colours[colour], "\g<1>", colours[9]),
            line
        )
        colour = colour + 1
    if line == '':
        break
    try:
        print(line.rstrip("\n"))
    except:
        pass
pit-faulty