Archive for the ‘tech’ Category

Change

Thursday, September 27th, 2012

It’s crazy just how fast life can change.

When I was in Montreal having the time of my life at Osheaga, I received the following email from the Dan (the CTO, now CEO) of my company (Peek):

hey man – we should have had this conversation yesterday.

We need to cut cost at Peek (I can give you the bigger picture when you’re back). I want to try and find you a new home for next semester, so I’m going to intro you to a few startups in town, as is Amol. If we don’t find something new and we still have a business going, etc, we will of course try to keep you… but I’m about to make some intro’s for you and hopefully they will work out.

This, of course, was a huge shock, and it put a bit of a damper on my weekend. I wasn’t sure what I’d be going back to in NY: whether or not I still had a job, if I’d be able to find something new, if I’d have to move back to Barrie, nothing; the uncertainty was a bit surreal. But stressing out never makes anything better, so I enjoyed my weekend of amazing music in a beautiful city with some great friends and tried to keep a smile on my face.

After my long weekend, I headed into work with the hopes of dispelling some of the uncertainty. After a talk with Dan, many of my worries were alleviated. It turns out Peek’s place in the feature-phone market was fast becoming non-existent. They were in the midst of planning a pivot and they were willing to keep me on. However, I realized that life probably wouldn’t be much fun at a company in survival mode so I elected to try and find something else for my second term.

I emailed a bunch of companies and I ended up meeting up with seven over the next week: Adcade, AppNexus, Vine, Evidon, Kohort, Facebook, and Twitter. However, I immediately ruled Facebook and Twitter out because their application process was measured in weeks rather than days. In the end, I received four written offers (AppNexus, Adcade, Evidon, Kohort) and one verbal offer (Vine). I decided I needed a bit of a break before making my decision so I told Peek I’d be working my last two weeks remotely and took off to Canada. After my first weekend at Karl’s place, MPD from Kohort called me and did his spiel, trying to convince me to join Kohort. He was very convincing and inspiring, but I told him that I was trying to decide between Kohort and one other company (Adcade). Less than five minutes after hanging up, he called back offering me 25% more than his original offer if I accepted on the spot and I couldn’t refuse. I committed. After getting the weight of that decision off my shoulders, I was able to enjoy my time in Canada knowing I had an amazing job to go back to.

I’m now three weeks into life at Kohort and have no doubts that I made the right decision. The team (Steve, JT, Tom, Matt, Ben, and the biz team) is awesome, I’m having fun learning the ropes of an early-stages start-up, I’ve made significant contributions to the codebase, and I’m very happy overall. Life is good :) .

Built for organizers, by organizers.

Whether you’re organizing a book club with a few friends or leading a team with thousands of members, we created Kohort for you.

Our goal was to make organizing and participating in groups of any size easy. We hope Kohort can be the cure for group management headaches with all the tools you need from member directories to seamless communication tools and a lot more coming soon.

Kohort is the ultimate solution for groups — both online and in the real world.

Here’s a brief tour of the office. Apologies for the crappy pictures; my NEX-3 is still in for warranty so these were taken on my Lumia 710.

The main office is where the business team lives, and is shared with another company called Wrapp. The kitchen is always well-stocked. A fridge full of Red Bull and Coke, sandwich fixings, Greek yogourt, and hot dogs, and cupboards with real bread, Cliff bars, and tons of other snacks make the day a little happier. In the back corner there, you can see the dev cave:

Here’s where the dev team lives. Country, dub step, or something else decent is always playing on the Sonos, and we get Seamless delivered right here at least once a day. Cinema Displays for everyone are another decent perk :) :

Finally, here’s the view from the roof:

I’m really quite lucky to be where I am. I highly doubt switching jobs would have been nearly as painless as it was if I hadn’t ended up going to UW for computer science; there’s crazy demand right now for programmers from decent schools and Waterloo is as good as it gets. I had almost made the decision to go to either UofT or McMaster, but my decision was made when Kory told me to man up and go to Waterloo so that we could room together. Thanks, dude :p. Here’s to hoping that the demand for CS nerds like me continues for the indefinite future, and that I’ll be able to find an awesome job (like Kohort) after graduation.

Working at Peek, and now Kohort, has helped me form a rough plan for my future. I’ve come to the realization that I definitely want to work at a start-up for the next five to ten years. I’ve come to love the past-paced days and the immense opportunity for learning, and making significant contributions to real stuff that is used by people every day is a great feeling. Perhaps I’ll try my hand at a larger company like Microsoft, Amazon, or Google when (if?) I have a family and need something more stable, but that scenario likely won’t occur for a number of years. Until then, I’ll be keeping this quote by Stephen Cohen close in mind:

If you graduate Stanford at 22 and Google recruits you, you’ll work a 9-to-5. It’s probably more like an 11-to-3 in terms of hard work. They’ll pay well. It’s relaxing. But what they are actually doing is paying you to accept a much lower intellectual growth rate. When you recognize that intelligence is compounding, the cost of that missing long-term compounding is enormous. They’re not giving you the best opportunity of your life. Then a scary thing can happen: You might realize one day that you’ve lost your competitive edge. You won’t be the best anymore. You won’t be able to fall in love with new stuff. Things are cushy where you are. You get complacent and stall.

Design Language

Wednesday, September 19th, 2012

You know you’ve done something right when other companies start iterating on aspects of your design language:

Still, it’s nice to know that Nokia isn’t the only major player dedicated to the Windows Phone game.

“Capturing the Memories”

Monday, July 23rd, 2012

This week’s cover of the New Yorker:

Steve Wozniak, Tech Hero

Wednesday, July 18th, 2012

Steve Wozniak recently opened up to questions on a Gizmodo comments board (here’s the full posting). His answers should be read by everyone, especially those aspiring to make a change in the world of technology. Here are a few that stood out to me:

On LSD:

I have never used an illicit drug. I never spoke to Steve Jobs about drugs or heard from him about drugs even a single time. He never brought it up around me. I had many friends in my high school in Cupertino who used LSD (1966-1968) and many bright ones too but (a) I had many ways to have fun and (b) if it would expand my mind, I felt I had a great mind and wanted to be judged as myself, not myself plus an aid. I did accept drug use by others and was accepted among them and never was judgmental. I don’t have any strong resistance to using LSD someday but after a certain point in your life, what’s the point? Don’t be judgmental. Don’t call yourself right and others, who do different things, wrong. Same for computer and smart phone platforms.

On changing the world:

Change the world because you want to. Don’t judge it by money success. Don’t expect success from the start. Go as far as you can making it perfect before you share it or seek funding. Have a working model or demonstration before you seek venture money. You could get funded and spend $100K on a video demonstration and then own less of your company and need further funding sooner. Or you could work hard to make a video for free, in your home (garage), and be that much better at the deal you finally work. And expect that many of your first tries will go nowhere. But they will get you experience toward the big one. You should have a job or live at home so you can work on your own passions on your on time. That implies not being too social or partying. Make good things when you are young and you’ve covered your needs for life.

On aspiring to be a programmer:

If you have college courses in CS, buy the books and spend day and night the few days before class going through the books and taking notes and answering questions and programming examples before the first class even starts. If you really want to do this in your life, that’s what you should do, not just wait for the education to be handed you. Those who finish at the top will always be in high demand. You can learn outside of school too but you have to put a lot of time into it. It doesn’t come easily. Small steps, each improving on the other, is what to expect, not instant understanding and expertise.

On success:

I worked out lifetime philosophies of truth and happiness in high school and early college years. I worked out a few keys for my own life but they wouldn’t necessarily work for someone else. Because I spent a lot of quiet inner hours, walking home from school for example, thinking out this philosophy, it was my own creation and much more important to me than any ideas that could have been shoveled my way, by parents or church or books. I had success for life based on my own internal keys and didn’t need money or Apple or fame. In fact, those latter things fight it a bit. One of my philosophies was to be open. So I don’t hide. I’m only one person and when thousands of people want me (email) I can’t answer them all but I spend a lot of time trying. One of my keys was that if I’m open and truthful, I won’t do things that I myself consider bad and wrong. You might get a clue why this fights what’s needed in running a company. But it’s great for an engineer.

On pranking:

Built a TV jammer…the only color TV (1968) was in the basement of Libby Hall, a girl’s dorm. I sat there one night and jammed (fuzzed up) the TV. A friend hit the TV and I made it go good. After a few sessions, they started stationing a student right by the TV every night whose job it was to knock and pound and adjust (fine tuning in those days) the TV until it worked. I started making it work depending on what they did and where their bodies were. I got a guy to stand on a chair with the twin-lead antenna in his hand to make it work. One time I got a guy to hold his hand on the TV screen and a foot on a table while he stood on the other foot, to watch the last half of Mission Impossible.

I built one of these TV jammers into a magic marker. I was taking introduction to computers, which was a graduate course back then. I did get an A+ in the course but ran our class 5x over budget due to all the programs I ran on the CDC 6400 supercomputer. Well, this class was in 2 classrooms. The upperclassmen watched the professor live and the rest of us were in a room with 4 TV’s. My jammer worked but the TV near me barely got jammed and others to varying degrees. 3 guys stood up in the front of the class looking back. I was going to turn my jammer right off but I didn’t know TA’s were present. They said to turn off the transmitter but I wasn’t about to own up to it. If I reached down to turn it off, the guy next to me would see me and I might get caught. It was a dilemma. I left it on. Near the end of class, a guy under the TV jammed the worst gathered his books to leave class early. As he walked toward the door in the front right (from my view) I made the TV’s go in-and-out, in-and-out. When the guy left through the doorway I made the TV’s go good. A TA pointed at the student who had left and said “there he goes.”

My pranks are usually verbal now. I get a wrong number asking for Sylvia and I say that she’s in the shower with a friend. I recently was given a fake iPhone 4 while in Perth and have slipped it in place of other iPhone 4′s at dinners. The person can’t get it to turn on. It looks extremely real, with buttons that look the same. But then I ordered a few online and the ones I got were too fake looking so I had to trash them.

On the future of personal computing:

We’re on the path to wearable computers, on our eyes and wrist. People have been comfortable wearing technology in these places for hundreds of years. I wish my tablet had full computer operation, with multiple windows visible at the same time. Maybe that will happen. Maybe I’ll even have nice user scripting languages on a tablet someday. That’s hopeful thinking.

On Lumia:

I think highly of the visual appearance of things on my Lumia 900. It’s not able to be a main phone of mine yet due to limited voice actions (I need and want something like SIRI) and voice dictation. I wouldn’t tell anyone it’s a lousy phone. Microsoft did a lot that does not look anything like other smartphones on the screen and I applaud them.

On privacy:

We’ve lost. Technology is too inexpensive and everywhere. The next privacy battle may be in decades but it will be computers protecting themselves from human inspection.

On the negatives of technology:

We are driven to create new technology to help us do things. The past ways were not absolute. They were ways that existed in a very different environment than today. People are reluctant to give things up that they are used to, even bad things like why we have the stupid concept of months or why 12 PM is before 1 PM instead of after 11 PM. The need for family is much less than in the far past too. So many of us love our technology and what it brings into our lives so much that others worry we are getting away from human contact. I disagree. Human contact is just changed, and it’s much greater than ever before. How many letters did you ever write in the days of paper mail, for example.

Yes, we might be on a path where someday we humans are not needed and computers exceed our abilities at everything. But there’s no way to turn it off. I tell people not to stand in front of a steamroller you can’t stop.

On being a morning/night person:

I’m not a morning or night person. I sleep when I need to or can’t stay awake. I’m awake when I have to. This session is very hard on me because I’m hurting and falling asleep in Jakarta and have an early wakeup for a breakfast with some top execs from the big telecommunications company here. I sometimes sleep 10 hours. Usually I sleep 8 hours if I can. But it’s rare to have that much time. Quick little 2-3 hour naps, even 45 minute naps, help me all the time get ready for something.

I did spend 25 years of my life sleeping 4-5 hours every night and being just fine. Now, if I have the right situation, I’ll sleep all through a day. Recently my wife and I were in S. Korea or somewhere and she was zonked too. I let her sleep all night and all day and when I finally told her it was 4 o’clock she thought it meant 4 AM, ha ha. I’d slept the entire time too. Sometimes you need to catch up on sleep when you are very busy.

In younger years I’d say I was a night person, working on my strange projects then. When my kids were in school I was a morning and a night person.

On educating the youth:

I think that students should learn what they want to outside of school. In school they will have the same pages as 30 other students every day of the week, and a test on Friday. By 3rd grade many have dropped out of education being important, since a few top students always have the answer first. A better solution to this is to call on students randomly. But so little of what we learn is necessary. Someday we’ll have one teacher per student and the major goal of letting kids learn what they want to at the pace they can learn it, for straight A’s, will be achieved. But our teachers won’t be pure human. Oh, they’ll have to be conscious and feeling but cost less than real humans.

Teachers can only teach what they know. In this digital world, that’s a problem. When I went to school our teachers may have known more than us about everything. But when I taught, students in elementary school knew more about computers and video games than any teacher. Performance in the classroom is only at the expectation level of the teacher. So we need more teacher who are totally into applying the digital tools to every subject in the classroom.

A student who is given digital tools of their own, at home, will learn more about them than could be taught. But one thing is certain. If these students live their digital lives on the modern mobile devices, these devices have to be incorporated into their learning methods. That means direct apps and not just web pages for communication on all aspects of being a student, including content and testing. I applaud schools like Abilene Christian University for giving every student an iPhone or iPod Touch with this thinking in mind. You might think that a Christian school would not be progressive so it’s even more to admire. I run into many schools now around the world that do get one iPad or iPhone per student. But the apps to keep good communication and learning are a new thing.

Woz, you are nothing short of a hero to geeks around the world.

Canadian Supreme Court Embraces Fair Use in Landmark Decisions

Saturday, July 14th, 2012

This is huge. Fair use is one of those concepts that seems easy in concept but is nigh impossible to define in practice. Hopefully this thinking will inspire some change in the comparatively medieval American system, but it seems US politicians and industry lobbyists think Canada is a cesspool of pirates and thieves by the way they talk about our copyright policies.

http://arstechnica.com/tech-policy/2012/07/canadian-supreme-court-embraces-fair-use-in-landmark-decisions/

The Future of Apple’s Dock Connector

Thursday, July 12th, 2012

John Brownlee discusses the Apple dock connector, explaining the technical details, history, and what we can expect from the future:
http://www.cultofmac.com/178093/the-future-of-apples-dock-connector-feature/

But what does the 30-Pin Dock Connector do, why doesn’t Apple just use USB like most of its competitors, and why is 19-Pin — not 30 — the way to go?

As a bit of a nerd, I find this article fascinating. I knew that each pin represented a specific function, but I did not know how drivers fit into the picture. It’s the little things like this that show how forward-thinking Apple is as an innovator, and how the groundwork for their current domination was already being laid over a decade ago.

The Next Microsoft

Thursday, July 5th, 2012

Andrew Kim proposes an image redesign for Microsoft and it looks good:
http://www.minimallyminimal.com/journal/2012/7/3/the-next-microsoft.html
Whether or not Microsoft uses something like Kim’s proposal, I agree that Microsoft really needs to add some edge to their brand to go with their new aggressive approach to hardware/software.

The Little Things

Tuesday, June 19th, 2012

The little things really do matter.

If you sit on, sleep on, stare at, or touch something for more than an hour a day, spend whatever it takes to get the best. -@marcoarment

Although I’ve started to come to this realization over the past few years, this post by Ben Brooks really hit home. It’s why I spent the extra $500 on a MacBook Air when a shitty plastic brick from Best Buy would have probably done the job. It’s why I bought the BluRay of my favourite live album (All I Ever Wanted – The Airborne Toxic Event). It’s why I waited the few extra months until I could afford a high-end plasma when there were (inferior) screens of the same size available for less than half the cost. It’s why I bought that leather jacket. It’s why I trashed the crappy earbuds that came with my Zune HD and bought some Shure IEMs instead.

I spend the majority of my time interacting with a relatively small number of possessions. In some cases (my laptop), this is usually more than eight hours a day. If spending that little bit extra makes these interactions even just a little bit more enjoyable, my life as a whole is happier.

Just something to think about.

http://brooksreview.net/2012/05/little-things-2/

Node.js & Uploading Images to Facebook

Friday, June 15th, 2012

I was recently faced with the task of adding “Share on Facebook” functionality from our node.js application. I wasn’t really able to find clear instructions for this anywhere online, so I thought posting my code might be helpful to someone. While this example is fairly specific, the steps can likely easily be generalized to suit most cases.

The first step is to create an application on Facebook. Head to Facebook Developers, create a new app, and then go into the application settings. You’re going to want to enable “Website with Facebook Login,” setting the Site URL here to your applications URL (localhost:3000 or similar is fine for testing). Also, make note of your App ID and Secret, you’ll be using those soon.

Next, the node.js app needs to get an authentication token from the Facebook servers. I used the node-oauth for this, it was simple and fast. In our app, I redirect to a function called picturesOpFacebookOAuthIDGET after hitting the “FB Share” button, passing in the database ID of the picture. The code I used for this is as follows, filling in the id and secret from above:

exports.picturesOpFacebookOAuthIdGET = function(req, res) { logger.info("GET /pictures/op/facebookOAuth/" + req.params.pictureId); var client_id = "..."; var client_secret = "..."; oa = new oauth.OAuth2(client_id, client_secret, "https://graph.facebook.com"); res.redirect(oa.getAuthorizeUrl( { scope : "publish_stream", // Gets permission for posting to the users timeline response_type : "code", redirect_uri : "http://localhost:3000/pictures/op/facebookUpload/" + req.params.pictureId } )); };

(Keep in mind that redirect_uri needs to be an absolute URI, so you might need to change it between local testing and deployment.)

Once an authorization token has been acquired, the application is directed to a function called picturesOpFacebookUploadIdGET This function does the work of actually uploading the picture to the Facebook servers. This function required the most work, as it appears there are no libraries that perform the actual Facebook uploading for node.js, and standard multipart/form-data libraries don’t work quite as needed. This function is as follows:

exports.picturesOpFacebookUploadIdGET = function(req, res) { logger.info("GET /pictures/op/facebookUpload/" + req.params.pictureId); var address = 'http://localhost:3000/pictures/op/facebookUpload/' + req.params.pictureId; oa.getOAuthAccessToken(req.query.code, {grant_type:'authorization_code', redirect_uri:address}, function(err, access_token, refresh_token) { if(err) { logger.error("500 Error getting the OAuth Access token for Facebook sharing: " + err); res.redirect('/500'); } else { Picture.findOne({_id: req.params.pictureId, share_key: req.currentUser.share_key}, function(err, result) { if(err) { logger.error("500 Database search error: " + err); res.redirect('/500'); } else { // base64 uploading refused to work, so binary it is var enc = 'binary'; var filepath = result.file_path; var filename = result.original_file_name; // The next two lines are for extracting the file type, for sending in the header (Content-Type) var re = /(?:\.([^.]+))?$/; var ext = re.exec(filename)[1]; var authKey = access_token; // We set up the request body here var outputBits = []; outputBits.push('------------0xKhTmLbOuNdArY\r\n'); outputBits.push('Content-Disposition: form-data; name="access_token"\r\n\r\n'); outputBits.push(authKey + '\r\n'); outputBits.push('------------0xKhTmLbOuNdArY\r\n'); outputBits.push('Content-Disposition: form-data; name="message"\r\n\r\n'); outputBits.push(filename + '\r\n'); outputBits.push('------------0xKhTmLbOuNdArY\r\n'); outputBits.push('Content-Disposition: form-data; name="source"; filename="' + filepath + '"\r\n'); outputBits.push('Content-Type: image/' + ext + '\r\n'); outputBits.push('Content-Transfer-Encoding: ' + enc + '\r\n\r\n'); var output0 = outputBits.join(""); // This terminates the output body var outputBits2 = []; outputBits2.push('\r\n------------0xKhTmLbOuNdArY--\r\n'); var output2 = outputBits2.join(""); // Here's where we get the actual image fs.readFile(filepath, function(err, imageData) { if(err) { logger.error("500 Error reading the image for Facebook sharing: " + err); res.redirect('/500'); } else { // We set up the header for the request var options = { host : 'graph.facebook.com', port : 443, path : '/me/photos', method : 'POST', headers : { 'Content-Type' : 'multipart/form-data; boundary=----------0xKhTmLbOuNdArY', 'Content-Length' : output0.length + imageData.length + output2.length } }; // Preparing for the response from the Facebook servers, after sending the image var request = https.request(options, function(response) { logger.info('STATUS: ' + response.statusCode); logger.info('HEADERS: ' + JSON.stringify(response.headers)); response.setEncoding('utf8'); response.on('data', function(chunk) { logger.info('BODY: ' + chunk); }); response.on('end', function() { res.redirect('/syncweb/pictures/' + req.params.pictureId); }); response.on('close', function() { logger.error('500 Premature closing of the Facebook upload response.'); res.redirect('/500'); }); }); request.on('error', function(err) { logger.error('500 Problem with uploading the picture to Facebook: ' + err); res.redirect('/500'); }); // This is where the request is actually sent request.write(output0); request.write(imageData); request.write(output2); request.end(); } }); } }); } }); }

Note that the image itself isn’t included in the buffer, it’s set up separately. This resolved an issue where Facebook was complaining of something like an invalid file or image type.

As you can see, the multipart/form-data was a bit of a headache to setup. This code is currently running on our servers, and appears to working without issue. If anyone has any suggested improvements, feel free to leave a comment below.

(My apologies for the terrible scrolling code boxes, they’re the best I could whip up in a few minutes and my CSS really needs a rewrite.)

Wreck-it Ralph

Wednesday, June 6th, 2012

This looks like it’s going to be totally awesome: