CS and the City2015-06-22T10:32:38-07:00http://sean.lyn.chSean LynchBuilders2015-06-22T00:00:00-07:00http://sean.lyn.ch/2015/06/builders<p>My dad is a builder. </p>
<p>When I was young, my dad would take my brother and I to visit real estate. Show homes and open houses, we'd even occasionally sneak into places under construction to have a look. My brother and I would run between rooms imagining which ones we could claim as bedrooms, but dad would inspecting the layout, looking for the details in construction, and critiquing the use of space. He taught us to estimate the dimensions of the rooms with our feet: one foot length stopped in front of the other. </p>
<p>For us, it was an adventure. For him, it was an opportunity to consider the features of each design, and visualizing whether they'd help or hinder the owners, pointing out the obvious-to-him issues that construction firm had missed. Money was tight growing up so a new house was out of the question, but that didn't stop him from looking and planning for a day in the future.</p>
<p>This weekend, I visited my parents new home. They've retired now, and finally have the time and resources to build a new one. My dad walked me around the house, pointing out things that, the contractors missed, changes in the design he insisted on, and mistakes that slipped through anyway. The place is beatiful, spacious, and thoughtfully organized. And still, I know that same familiar combination of pride and frustration.</p>
<p>I'm a builder too. </p>
<p>As we walked around, we talked about how he'd do it differently if he did it again. The lessons he'd apply, the subcontractors he'd call in (or blacklist). I immediately fell into it, brainstorming ways to solve the problems the remained; how to properly wire the house or evaluate the true color of paint in the light of the room. In these situations, my software brain spins to life but I also found myself thinking about building well-designed houses too. And though I haven't ever had any inclination to the construction industry, I was immedately excited about the option.</p>
<p>I've been building for nearly all my life, but walking around with my Dad reminded me where I received that spark.</p>
<p>And I can't wait to start building again.</p>
Unstructured days2015-05-13T00:00:00-07:00http://sean.lyn.ch/2015/05/unstructuerd_days<p>Week 2 and I've been completely unsuccessful in hitting all four of my targets every day. My best is three, but median is two of four.</p>
<table>
<thead style="font-weight: bold;">
<td></td>
<td>Exercise</td>
<td>Talk</td>
<td>Write</td>
<td>Code</td>
</thead>
<tr>
<td>5/6 - Wed </td>
<td></td>
<td>Yep</td>
<td></td>
<td></td>
</tr>
<tr>
<td>5/7 - Thu</td>
<td>Yep</td>
<td>Yep</td>
<td></td>
<td></td>
</tr>
<tr>
<td>5/8 - Fri</td>
<td></td>
<td>Yep</td>
<td></td>
<td>Yep</td>
</tr>
<tr>
<td>5/9 - Sat</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>5/10 - Sun</td>
<td>Yep</td>
<td></td>
<td></td>
<td>Yep</td>
</tr>
<tr>
<td>5/11 - Mon</td>
<td></td>
<td></td>
<td>Yep</td>
<td></td>
</tr>
<tr>
<td>5/12 - Tue</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</table>
<p>I blame this on poor time management.</p>
<p>I've spent the last few years as a slave to my calendar. PM roles tend to involve an embarassing number of meetings. Though good PMs will stay constantly vigilant for useless ones, some amount remains. </p>
<p>My first week was heavily calendared as well, but mostly with hour long coffees, obstensibly to reach my "Talk" goals. Turns out that coffees aren't progressing me toward my goals and they are costing a lot in time (including transit) and money (including transit).</p>
<ul>
<li>They're too easy too set up</li>
<li>They move around too easily</li>
<li>They're even harder to keep structured and valuable (particularly for both people)</li>
</ul>
<p>I've only had one day so far that ended up being completely free, but only after a few things canceled and rescheduled. And I ended up wasting it by heading home and then cooking, which triggered couch sitting and distractions. Despite the newly found free time, I wasn't able to pull out of the productivity nose dive.</p>
<p>What I need to fix:</p>
<ul>
<li>I'm not making progress on exercise and reflection goals each day. I need to schedule time for them</li>
<li>I also haven't spent any time in other startup offices because its hard to find large chunks of time </li>
<li>Avoid rescheduling meetings impacting the rest of my day</li>
<li>Neee a predetermined fallback plan when things get canceled</li>
<li>Keep the time of day I feel most productive (9am-12pm or so) free for productivity</li>
</ul>
<p>I'm taking as a given that I won't be able to abandon my calendar. So instead, I'm proposing a default structure for my day:</p>
<h4>8am - 12pm</h4>
<ul>
<li>Exercise</li>
<li>Meditation</li>
<li>Code/write</li>
</ul>
<h4>12pm-1pm</h4>
<ul>
<li>Lunch</li>
<li>(Transition time)</li>
</ul>
<h4>1pm - 6pm</h4>
<ul>
<li>Hang out in an office space</li>
<li>Code/write</li>
</ul>
<h4>3pm - 6pm (Optional)</h4>
<ul>
<li>Coffees and meetings</li>
</ul>
<h4>6pm onward</h4>
<ul>
<li>Hanging out with girlfriend, friends</li>
<li>Code</li>
<li>Read</li>
</ul>
<p>On the surface, it seems really natural and attainable. It also appears to be a schedule I could put into place for my day-to-day as a PM. So it's somewhat surprising I haven't run into other people preaching a more structured default day model. I'm interested to see how it works in practice!</p>
The plan2015-05-05T00:00:00-07:00http://sean.lyn.ch/2015/05/the_plan<p>As of May 1st, I'm on a two month sabbatical. I'm grateful for Dropbox being down with me taking time off and giving me the opportunity to reflect and explore.</p>
<p>I'm trying to figure out what's next "work"-wise. ie how I want to spend my working time for the next few years of my life. Of course, the non-work aspects of life are just as important and will weave into this process regardless. But I'm a worker, I love the work I do and the people I work with. Getting this side of the house in order is fundamental.</p>
<p>(I'll tackle the elephant in the room: there's an assumption that this means I'm leaving Dropbox. That's not how I'm looking at it. There's a whole world of possible answers to the question of what's next, and Dropbox is the best place in a world for a whole lot of them. It's possible that it's not for some, but I'll cross that bridge <strong>if</strong> I get there.)</p>
<p>Two months is both a huge amount of free time and a period that will blink by in a moment if I'm not careful. And my biggest fear is that I'll end up at the end of the two months and not have made any progress in my thinking. So I've been trying to be really structured with that the time.</p>
<p>I started putting together a TODO list, but after a few years at TapEngage and Dropbox, I'm accutely aware that laying out a plan in uncertainty isn't useful any further than a few weeks. So I boiled down my TODO into a few themes that, in theory, I can aim to repeat every day. And, as a initial goal, I propose doing each of these things for at least 30 minutes each day.</p>
<p>Sean's really overwrought sabbatical framework:</p>
<ul>
<li>Talk with potential users/customers</li>
<li>Write thoughts and reflections (like this!)</li>
<li>Code and build things</li>
<li>Exercise</li>
</ul>
<p>So, how am I doing so far?</p>
<table>
<thead style="font-weight: bold;">
<td></td>
<td>Exercise</td>
<td>Talk</td>
<td>Write</td>
<td>Code</td>
</thead>
<tr>
<td>5/2 - Sat</td>
<td></td>
<td></td>
<td></td>
<td>Yep</td>
</tr>
<tr>
<td>5/3 - Sun</td>
<td></td>
<td>Yep</td>
<td></td>
<td>Yep</td>
</tr>
<tr>
<td>5/4 - Mon</td>
<td></td>
<td>Yep</td>
<td></td>
<td>Yep</td>
</tr>
<tr>
<td>5/5 - Tue</td>
<td>Yep</td>
<td></td>
<td>Yep</td>
<td></td>
</tr>
</table>
<p>tl;dr - Not a single day where I did all four, and right now, averaging only two per day. On my own version of this table, I've added a fifth column: "What actually happened?". Everything on that list is important (so far), but it does limit the 'Yep's in the table.</p>
<p>It's only four days in, but I already figured a few things I need to improve in order to get to a Yep in each category. Follow along and I'll report back every week until the end of my time. Hopefully I'll have some interesting lessons as a result.</p>
Service and perks included with American Express Platinum2015-03-08T00:00:00-08:00http://sean.lyn.ch/2015/03/service-and-perks-included-with-american-express-platinum<p>I recently signed up for an Amex Platinum card after being a Blue Cash customer for six years. I was interested in taking it for a spin to understand the perks associated with the card. Unfortunately, it doesn’t seem like American Express does a very good job capturing or keeping this list up to date.</p>
<p>This is a list of services I’ve had to discover and set up myself. I’ll add to it as I find more.</p>
<p><strong>Centurion lounge access</strong><br>
Nothing to set up, just show your card. Only <a href="http://thecenturionlounge.com/info/faq">four airports</a> available so far.</p>
<p><strong>Priority Pass lounge access</strong><br>
Sign in with your American Express card account at <a href="https://rewards.americanexpress.com/olet/splash?campaignId=plpp0401&#038;offerType=platinumprioritypass">https://rewards.americanexpress.com/olet/splash?campaignId=plpp0401&#038;offerType=platinumprioritypass</a></p>
<p>This is only a <a href="http://www.prioritypass.com/select/select/index.cfm">Priority Pass Select</a> account which excludes access to United lounges.</p>
<p><strong>2x Membership Rewards on Uber</strong><br>
Instructions at <a href="https://get.uber.com/amex/">https://get.uber.com/amex/</a></p>
<p><strong>Free Boingo wifi access</strong><br>
Sign up at <a href="http://www.boingo.com/americanexpress">http://www.boingo.com/americanexpress</a></p>
Parsing JSON in Go2015-02-28T00:00:00-08:00http://sean.lyn.ch/2015/02/parsing-json-in-go<p>I got to hang out with the team at <a href="http://www.sendwithus.com">Sendwithus</a> at their <a href="http://www.battlesnake.io">Battlesnake</a> competition. While the actual competitors scrambled to build the mightiest of snake AIs, I took the opportunity to learn a bit more about Golang by attempting to write a snake in Go. Coming from a Python background, I never expected that JSON parsing would be where I spent most of my time. Today, I’ll cover the different approaches you can take when you start Parsing JSON in Go.</p>
<p>All the code and various methods here are sampled from my <a href="https://github.com/sean-lynch/golang-json-experiment">Golang Json Experiment</a> project if you want to cut to the chase.</p>
<p>There’s really three general approaches to pick from:</p>
<ul>
<li>Define <a href="https://gobyexample.com/structs">structs</a> for all the JSON you’ll need to parse. This is the most Go-idiomatic way to parse JSON in Go. It’s also the furthest away from using Python dicts if you’re coming from that world and frustrating if the JSON doesn’t have a clearly defined spec.
<ul>
<li>There’s even a few tools that use the explicit definition to pre-generate parsers for better performance.</li>
</ul></li>
<li>Use empty interfaces to parse the JSON, then convert each field to the type you need. This is promising on the surface but quickly becomes complex.</li>
<li>Use one of a few wrapper packages that use an empty interface underneath but make the type conversion more natural.</li>
</ul>
<h2>Parsing JSON using struts</h2>
<p>This is the standard path for Go and, cutting to the chase, the option that felt most natural in the end. Though it may seem frustrating if you’re coming from a dynamically typed world, fighting against this will be frustrating in different ways.</p>
<p>My server needed to receive a JSON-encode request and response back with more JSON. I used the standard library’s net/http server (<a href="http://soryy.com/blog/2014/not-another-go-net-http-tutorial/">walkthrough if you need it</a>). There’s a bit of boilerplate required to make it behave properly (throw 400 and 500 errors, set the right content-type), so I’ll include that at the bottom of the post.</p>
<p>Your first step is to define your struct. You have a lot of options at your disposal and Eager wrote a great blog post on <a href="https://eager.io/blog/go-and-json/">how to leverage structs to parse JSON</a>. Here’s what a basic one might look like:</p>
<div class="highlight"><pre><code class="language-text" data-lang="text">type MoveRequest struct {
GameID string `json:"game_id"`
Snakes []struct {
Coords [][]int `json:"coords"`
Name string `json:"name"`
Taunt *string `json:"taunt"`
} `json:"snakes"`
Turn int `json:"turn"`
}
</code></pre></div>
<p>A few things to note here:</p>
<ul>
<li>the <code>json:"game_id"</code> fields on the right are called tags and are used by the standard JSON package to map JSON fields into the right field in a struct. They’re not always required (Go will try to match up names ignoring capitalization for example), but it’s helpful documentation</li>
<li>You can include arrays and nest structs in your definition.</li>
<li>One place I got caught: If your JSON can contain nulls then you need to do a bit more work. It turns out that Go variables can’t be <code>nil</code>, only pointers can be <code>nil</code> so you need to use <code>*string</code> as the type for a field that might be null, and refrence it appropriately in your code. You can see an example of this with <code>taunt</code> in the above struct.</li>
</ul>
<p>Now, creating a structure for an arbitrary JSON API can be a daunting task, but thankfully there’s a few projects that will help you do this automatically just by providing a sample of the JSON. I tested the four I found (listed in the <a href="https://github.com/sean-lynch/golang-json-experiment#classes-of-mechanisms">repo</a>) and prefered the output from<br>
<a href="https://github.com/ChimeraCoder/gojson">gojson</a> the most as it nailed the formatting and naming, even getting <a href="https://github.com/golang/go/wiki/CodeReviewComments#initialisms">capitalization right</a>. If you’re in a hurry, <a href="http://mholt.github.io/json-to-go/">json-to-go</a> will do the conversion in your browser. Keep in mind, it’s automated. So take a look at the output and make any changes you need.</p>
<p>With your structure, you can now parse your JSON with the built in <code>encoding/json</code> library.</p>
<div class="highlight"><pre><code class="language-text" data-lang="text">func MoveHandler(w http.ResponseWriter, r *http.Request) {
request := MoveRequest{}
err := json.NewDecoder(r.Body).Decode(&request)
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
...
</code></pre></div>
<p>You may see other examples that use Unmarshal, you really shouldn’t use that unless the data is already in memory (see Datadog’s <a href="https://www.datadoghq.com/2014/07/crossing-streams-love-letter-gos-io-reader/">love letter to io.Reader</a>).</p>
<p>Once that’s done, you can access all the fields in a very natural way:</p>
<div class="highlight"><pre><code class="language-text" data-lang="text"> fmt.Printf("%+v\n", request) // The + in %+v adds field names when printing structs
fmt.Printf("Turn: %d\n", request.Turn)
fmt.Printf("Snake name: %s\n",request.Snakes[0].Name)
</code></pre></div>
<p>Generating a JSON response follows pretty much the same model:</p>
<div class="highlight"><pre><code class="language-text" data-lang="text"> ...
// You'll define this struct beforehand
response := MoveResponse{Move: "down"}
jsonResponse, err := json.Marshal(response)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
w.Header().Set("Content-Type", "application/json")
w.Write(jsonResponse)
}
</code></pre></div>
<p>Nothing revolutionary here, but you can start to add some nice things. Go’s function model lets you hang functions off any struct. For example, I can add a String() function to the MoveRequest that will automatically get used whenever I try and print it, making logging and debugging easier:</p>
<div class="highlight"><pre><code class="language-text" data-lang="text">func (m MoveRequest) String() string {
return fmt.Sprintf("Game [%s] is on turn %d", m.GameID, m.Turn)
}
</code></pre></div>
<p>You can use this feature with the built in JSON decoder to change the behavior by implementing the <code>func type UnmarshalJSON(b []byte) error</code> interface on your struct. Let’s change <code>Coords</code> from a two dimensional array of ints to an array of X,Y Coord type.</p>
<div class="highlight"><pre><code class="language-text" data-lang="text">type Coord struct {
X int
Y int
}
type MoveRequest struct {
GameID string `json:"game_id"`
Snakes []struct {
Coords []Coord `json:"coords"`
Name *string `json:"name"`
} `json:"snakes"`
Turn int `json:"turn"`
}
func (c *Coord) UnmarshalJSON(b []byte) error {
var tmp []int
if err := json.Unmarshal(b, &tmp); err != nil {
return err
}
if len(tmp) != 2 {
return errors.New("Coord only accepts a length two array")
}
c.X, c.Y = tmp[0], tmp[1]
return nil
}
</code></pre></div>
<p>Then accessing the values is straightforward:</p>
<div class="highlight"><pre><code class="language-text" data-lang="text"> snake = request.Snakes[0].Coords[0]
fmt.Printf("Snake position: %d,%d\n", snake.x, snake.y)
</code></pre></div>
<h2>Using empty interfaces instead</h2>
<p>But what if you don’t want to do all that struct work ahead of time? I sure didn’t, so I kept looking. I quickly found the empty interface but it took me a lot longer to realize the problems.</p>
<p>Here’s the theory: Every variable in Go must be typed. But a type can be an interface and an interface can have zero functions. This means that you can catch any variable of any type by looking for <code>interface{}</code> which every possible type satisfies. So instead of doing the hard work defining a struct, you can just import your JSON into a map of strings -> empty interfaces like so.</p>
<div class="highlight"><pre><code class="language-text" data-lang="text">var request map[string]interface{}
err := json.NewDecoder(r.Body).Decode(&request);
</code></pre></div>
<p>Well that sure looks easy! By default, golang looks at the input and tries to unmarshal to the right type, then you just have to cast to the variable you need. Turns out, that’s much easier said that done.</p>
<div class="highlight"><pre><code class="language-text" data-lang="text">turn := request["turn"] // returns a interface{} typed value
</code></pre></div>
<p>So I need to type assert it using <code>.(int)</code> syntax. This immediately breaks. It turns out that go marshals ints into float64 because it can’t confidently move between JavaScript’s int and Go ints. There’s a <a href="https://github.com/golang/go/issues/5562">long discussion about how the community thinks its a bug and Go creators effectively telling themselves to Go &^#@ themselves</a>. What this means is you actually need to do this:</p>
<div class="highlight"><pre><code class="language-text" data-lang="text">turn := int(request["turn"].(float64))
</code></pre></div>
<p>Well that’s ugly. What about this <a href="http://golang.org/pkg/encoding/json/#Decoder.UseNumber">JSON.UseNumber</a> thing? That seems to inspire some confidence. Nope, just as ugly:</p>
<div class="highlight"><pre><code class="language-text" data-lang="text">turn, err := request["turn"].(json.Number).Int64()
</code></pre></div>
<p>And accessing nested values get even crazier:</p>
<div class="highlight"><pre><code class="language-text" data-lang="text">taunt := request["snakes"].([]interface{})[0].(map[string]interface{})["taunt"]
</code></pre></div>
<p>At this point, I quickly wrote this off. But I couldn’t be the only person looking for a more flexible way to parse JSON. Turns out I wasn’t.</p>
<h2>Wrapping empty interface maps in syntactic sugar</h2>
<p>There’s at least three projects out there that wrap importing into an empty interface to make accessing the values easier. None are perfect, but they might be a good choice depending on your use case.</p>
<h3><a href="https://github.com/karlseguin/typed">typed</a></h3>
<p>This was my quick favorite because of the terse syntax. Even digging multiple levels is relatively straightforward:</p>
<div class="highlight"><pre><code class="language-text" data-lang="text">request.Objects("snakes")[0].String("taunt")
</code></pre></div>
<p>Unfortunately, ran into a few issues:<br>
– No support for multi-dimensional arrays (no .Arrays() import)<br>
– No io stream initializer<br>
– No ability to create JSON, though there is a sister project that offers this ability</p>
<h3><a href="https://github.com/bitly/go-simplejson">go-simplejson</a></h3>
<p>It’s syntax is a bit more verbose, requiring you to switch between gets and type assertions:</p>
<div class="highlight"><pre><code class="language-text" data-lang="text">taunt, _ := request.Get("snakes").GetIndex(0).Get("taunt").String()
</code></pre></div>
<p>On the plus side, it includes the ability to create JSON built in. Though it also struggles with multidimensional arrays, it doesn’t make it impossible.</p>
<h3><a href="https://github.com/antonholmquist/jason">jason</a></h3>
<p>This syntax is also verbose, and because each step returns a possible error, it’s hard to chain. So the one liners above become:</p>
<div class="highlight"><pre><code class="language-text" data-lang="text">snakes, _ := request.GetObjectArray("snakes")
snake := snakes[0]
taunt,_ := snake.GetString("taunt")
</code></pre></div>
<p>It’s also impossible to handle multi-dimensional arrays and no JSON creation, and this one seems to be missing a lot of the sugar.</p>
<h3>End of the day</h3>
<p>Despite all my attempts to break away from the default, I couldn’t find a solution that felt right. I think <a href="https://github.com/karlseguin/typed">typed</a> might be the closest to handling arbitrary JSON, but it stills falls short for this case. I’ll keep an eye on it.</p>
<p>For now, the best “feeling” solution for what is now a very familiar API is to stick to structs. I’m still concerned about having to do all that work upfront before testing any API, but maybe that’s just what idiomatic feels like.</p>
Using Protocol Buffers with Google APIs2014-07-16T00:00:00-07:00http://sean.lyn.ch/2014/07/using-protocol-buffers-with-google-apis<p><em>Disclaimer: This is hastily researched and poorly authored. I’d love to have any of the below assertions corrected by wiser folks!</em></p>
<p>Right up front, you almost certainly don’t want to use protocol buffers to access Google APIs. This is what every smart person told me when I asked them for help. As far as I can tell, very few people actually try this anyway, as evidence by the complete lack of any documentation on the topic. </p>
<p>I wanted to understand the mechanism a bit better so I went spelunking into the deep, undocumented recesses of Google’s APIs anyway, mostly because it’s <a href="https://blog.dropbox.com/tag/hackweek2014/">Hackweek at Dropbox</a>!</p>
<p>If you’ve never heard of <a href="https://developers.google.com/protocol-buffers/docs/overview">Protocol Buffers</a> (or protobufs for short) before, here’s the tagline: “a language-neutral, platform-neutral, extensible way of serializing structured data for use in communications protocols, data storage, and more.”</p>
<p>At a high-level, it’s a communication protocol not unlike XML and JSON. It also includes a structure definition language like structs in C/C++. In theory, you can use this definition to generate code for working with the data. Protocol Buffers were created by Google and <a href="http://en.wikipedia.org/wiki/Protocol_Buffers">open sourced in 2008</a>. And as far as I can tell, no one else uses them.</p>
<p>Now because Google’s APIs all use shared infrastructure (which enables shared auth and a <a href="https://developers.google.com/api-client-library/">single SDK</a>), it turns out that they all support protobufs. By default, they return JSON, but every now and then, the marketing will mention protobufs as well. In fact, the <a href="http://youtu.be/UhdiQmS3kDs?t=3m49s">Gmail API folks did just that</a>, causing me to follow them all the way down the rabbit hole.</p>
<p>All in all, it’s a rough ride but it can be done. And again, to be clear, you almost certainly don’t want to.</p>
<h2>Talking to Google’s REST API endpoints</h2>
<p>First up, I wanted to get a sense of how the Gmail API worked. I used my new favorite HTTP exploration tool, <a href="https://luckymarmot.com/paw">Paw</a>, to start exploring endpoints. I’m going to skip right over the pains of setting up apps using the Google developer console, and skip OAuth as well (the guide on <a href="https://developers.google.com/accounts/docs/OAuth2WebServer">OAuth 2 from a webserver</a> worked well).</p>
<p>It’s obvious that Google would rather we all just use their SDKs. The docs and tutorials are entirely set up around one of the individual languages. For the Gmail API, only the very first page of the <a href="https://developers.google.com/gmail/api/v1/reference/">API reference</a> mentions anything about the REST endpoints. This is what I used to test that I could at least get responses in JSON.</p>
<div class="highlight"><pre><code class="language-text" data-lang="text">GET https://www.googleapis.com/gmail/v1/users/me/threads
HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
{
"threads": [
{
"id": "1473cacbd4d2f10d",
"snippet": "",
"historyId": "8487586"
},
...
],
"nextPageToken": "09120543318741434532",
"resultSizeEstimate": 226
}
</code></pre></div>
<h2>Getting protobufs from the API</h2>
<p>This isn’t documented anywhere at all. In fact, I only found this buried in the <a href="https://github.com/google/google-api-python-client/blob/65f5dd745dbfe88a655231102040271817f0a128/googleapiclient/model.py#L317">source of the Python SDK</a>. In order to get protobufs from the API, you need to add this to your API calls:</p>
<div class="highlight"><pre><code class="language-text" data-lang="text">?alt=proto
</code></pre></div>
<p>Yep, that’s it. With that, the above call transformed into something less familiar.</p>
<div class="highlight"><pre><code class="language-text" data-lang="text">GET https://www.googleapis.com/gmail/v1/users/me/threads?alt=proto
HTTP/1.1 200 OK
Content-Disposition: attachment
Content-Type: application/x-protobuf
...binary...
</code></pre></div>
<p>Cool!</p>
<h2>Doing something useful with protobufs</h2>
<p>Here in lies the rub. In order to actually handle protobuf data, you’re supposed to have <a href="https://developers.google.com/protocol-buffers/docs/pythontutorial">access to the .proto file</a> that defines how the data is laid out. Gmail doesn’t publish the .proto definition for their API. In fact, I couldn’t find a single Google API that does publish a .proto file. The only Google .proto file I could find was for <a href="https://github.com/egirault/googleplay-api/issues/12">unofficially accessing the Google Play store</a>. Remember when I said no one uses protobufs?</p>
<p>But I’d come too far to be turned away. At this point, with some advice from a fellow Dropboxer, I set to trying to write a .proto file by hand. Turns out there’s a few resource that make this possible, though not something I’d ever want to have to do regularly.</p>
<h3>The Google API Discovery API</h3>
<p>It’s probably not suprising, but Google has an API just for discovering the details about its other APIs called the <a href="https://developers.google.com/discovery/">Discovery API</a>. I was hoping this would actually programmatically return .proto files but no such luck. Instead, it returns a <a href="http://json-schema.org/">JSON schema</a> for every Google API. This is actually what Google uses to <a href="https://code.google.com/p/google-api-objectivec-client/source/browse/trunk/Source/Services/Gmail/Generated/GTLGmail.h#21">generate code for all of their SDKs</a>.</p>
<p>For my list threads example, it gave a reasonably detailed response, that looked almost like what I needed, but not quite.</p>
<div class="highlight"><pre><code class="language-text" data-lang="text">GET https://www.googleapis.com/discovery/v1/apis/gmail/v1/rest
HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
...
"ListThreadsResponse": {
"id": "ListThreadsResponse",
"type": "object",
"externalTypeName": "caribou.api.proto.ListThreadsResponse",
"properties": {
"nextPageToken": {
"type": "string",
"description": "Page token to retrieve the next page of results in the list."
},
"resultSizeEstimate": {
"type": "integer",
"description": "Estimated total number of results.",
"format": "uint32"
},
"threads": {
"type": "array",
"description": "List of threads.",
"items": {
"$ref": "Thread"
}
}
}
...
</code></pre></div>
<p>Sadly .proto files have a catch: the ordering of fields must be specified using <a href="https://developers.google.com/protocol-buffers/docs/proto#simple">numbered tags</a>. This discovery service does not return the numbering, and it turns out, they’re not returned in the right order either. I needed to try another route.</p>
<h3>Decoding protobufs</h3>
<p>To decode protobufs on the command line, I installed protoc. The <a href="https://developers.google.com/protocol-buffers/docs/overview">protocol buffers docs</a> links to a Windows binary, but I used <a href="http://stackoverflow.com/questions/21775151/installing-google-protocol-buffers-on-mac">brew to install protoc on my Mac</a>.</p>
<p>We discovered (thanks, Kannan!), that protoc has a handy flag <code>--decode_raw</code> which will allow protoc to unbundle a protobuf stream and identify each field by its tag number. I used <code>curl</code> to pipe in the request:</p>
<div class="highlight"><pre><code class="language-text" data-lang="text">$ curl -X GET "https://www.googleapis.com/gmail/v1/users/me/threads?alt=proto" \
-H "Authorization: Bearer ..." | protoc --decode_raw
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 2725 0 2725 0 0 5745 0 --:--:-- --:--:-- --:--:-- 5736
1 {
1: "1473d91500a2b818"
2: ""
3: 8488797
}
...
2: "11516987623344274775"
3: 225
</code></pre></div>
<p>Behold, I had my tag numbers.</p>
<h2>Putting it together</h2>
<p>With that, I could build the simple .proto file needed to parse the response to this request.</p>
<div class="highlight"><pre><code class="language-text" data-lang="text">message ListThreadsResponse {
repeated Thread threads = 1;
optional string nextPageToken = 2;
optional int64 resultSizeEstimate = 3;
}
message Thread {
optional string id = 1;
optional string snippet = 2;
optional int64 historyId = 3;
}
</code></pre></div>
<p>With that, the fields are now labeled properly.</p>
<div class="highlight"><pre><code class="language-text" data-lang="text">$ curl -X GET "https://www.googleapis.com/gmail/v1/users/me/threads?alt=proto" \
-H "Authorization: Bearer ..." | protoc --decode=ListThreadsResponse gmail.proto
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 2725 0 2725 0 0 5745 0 --:--:-- --:--:-- --:--:-- 5736
threads {
id: "1473d91500a2b818"
snippet: ""
historyId: 8488797
}
...
nextPageToken: "11516987623344274775"
resultSizeEstimate: 225
</code></pre></div>
<p>We experimented with writing a hacky script to contact the Discovery API, using the schema and properties it returned layout the framework for a .proto file, but there’s still a manual step to fill in the index values.</p>
<h2>That’s a wrap</h2>
<p>All in all, it took longer than expected but was certainly educational. The next logical step would be to use Protocol Buffer’s built-in mechanism to generate client SDK code. Instead, I took my own advice from the beginning. JSON works just fine.</p>
2013 was the year of subscriptions2013-12-28T00:00:00-08:00http://sean.lyn.ch/2013/12/2013-was-the-year-of-subscriptions<p>Looking back at my purchases this year, I realized 2013 appears to be the year when subscriptions services finally crossed the personal tipping point.</p>
<ul>
<li>What would I do without <a href="http://www.amazon.com/Amazon-Services-LLC-Prime/dp/B00DBYBNEE">Amazon Prime</a>?</li>
<li>I finally converted to <a href="http://www.pandora.com/one">Pandora One</a> last year, but I’ve added <a href="http://www.rdio.com">Rdio</a> to the mix as well. As a result, I’ve effectively stopped buying albums with the exception of the odd indie band that hasn’t made it onto Rdio yet. There, I’m using <a href="http://music.google.com">Google Music</a> as my music locker, which thankfully added an iOS app to their stable this year.</li>
<li>My roommates and I split subscriptions to <a href="http://www.netflix.com">Netflix</a>, <a href="http://www.hulu.com/plus">Hulu Plus</a>, <a href="http://www.amazon.com/Prime-Instant-Video/b?node=2676882011">Amazon Prime Instant Video</a>, and <a href="http://www.hbogo.com/">HBO GO</a> covering any TV content we want perfectly and movies relatively well. As a result, there’s no need to even consider any less reputable channels for video. And <a href="http://www.google.com/intl/en/chrome/devices/chromecast/">Google Chromecast</a> has been a quantum leap in viewing experience; my media center Mac Mini and Roku are collecting dust outside of Amazon content. They’re so cheap, they make awesome gifts too. I’ve bought a half dozen at this point.</li>
<li>I effectively have a <a href="http://www.dropbox.com">Dropbox</a> subscription though being employed by them is a strong bias. Though I canceled my <a href="http://backblaze.com">Backblaze</a> subscription and went back to an external hard drive.</li>
<li>I fell in love with IRL subscriptions too. <a href="http://sockpanda.com">Sock Panda</a> makes me happy and I’ve added <a href="https://www.mistobox.com">Mistobox</a> for coffee to the list as well. I experimented with <a href="http://www.trunkclub.com/">Trunk Club</a> but wasn’t really happy with the experience (same thing happened with <a href="http://www.dollarshaveclub.com/">Dollar Shave Club</a> last year). I’m excited to find a similar service that solves the experience concerns in the not-too-distant future though.</li>
<li>Conspicuously missing is any subscription to pay for a mobile app. IAP subscription are available so I’m sure it’s also just a matter of time.</li>
</ul>
<p>So what changed? It suspect a mixture of factors rather than one primary cause. Wider range of services with more complete offerings and more confidence in their ability to deliver definitely helped. A personal premium on time this year almost certainly contributed as well. Still, very surprised by how quickly my attitude and adoption changed. Anyone know if there’s any macro trend data on the adoption of subscription services in general?</p>
Unattributed thoughts on company culture2013-08-16T00:00:00-07:00http://sean.lyn.ch/2013/08/unattributed-thoughts-on-company-culture<p>Can’t attribute as it came to me off-the-record, second-hand, and not verbatim, but too pithy not to capture:</p>
<blockquote>
<p>“All company cultures suck. As the CEO, you get to choose the ways it sucks.” </p>
<p>“Your company’s values are trade-offs. The best indicator of a really great value is that it could be reasonably argued against.”</p>
</blockquote>
A smartphone vacation in Indonesia2013-07-30T00:00:00-07:00http://sean.lyn.ch/2013/07/a-smartphone-vacation-in-indonesia<p>I wrapped a two week vacation to Indonesia. I took a factory reset Nexus S along with me as my internet lifeline. It’s been a few years since I last vacationed internationally and the entire experience was radically different this time, thanks substantially to massive penetration of high speed internet and smartphones. A few notes and observations on using both from my trip:</p>
<p><strong>Internet</strong></p>
<ul>
<li>I purchased an Indosat SIM card with 6GB of 3G data for the equivalent of $7.50 USD (it also included a few SMS and minutes for coordinating with drivers, the original purpose)</li>
<li>Free wifi blanketed us everywhere we went, airports, train stations, every hotel/hostel, and most restaurants. I have 19 wifi networks remembered.</li>
</ul>
<p><strong>Apps installed</strong></p>
<ul>
<li>Facebook</li>
<li>Twitter</li>
<li>Dropbox – Used favorites feature to cache itineraries, tickets, and receipts offline</li>
<li>Rdio – Offline caching worked great</li>
<li>Kindle</li>
<li>Instagram</li>
<li>Hipmunk</li>
<li>FlightAware – Not as good as FlightTracker Pro on iOS but helpful for our Eva Air flights</li>
<li><a href="https://play.google.com/store/apps/details?id=indonesia.flight&#038;hl=en">Indonesia Flights</a> – Really great flight aggregator for a lot of the domestic Indonesian airlines</li>
<li>foursquare – Surprisingly popular in Indonesia (Jarkarta airport was “swarming” when I landed). Great for finding restaurants</li>
<li>TripAdvisor – Good content but app is just a website wrapper and sucks</li>
<li><a href="https://play.google.com/store/apps/details?id=com.codegent.apps.tapandsay" title="Tap &#038; Say">Tap & Say</a> – Helpful phrase book, but despite what the description says, still requires an internet connection. Wouldn’t buy again.</li>
<li>Google Sky – Cool toy when spending evenings outside civilization</li>
<li>Skype WiFi – Useless. Need to research a better wifi SIP app</li>
</ul>
<p><strong>Android</strong><br>
Used 4.3 on a relatively old phone (picked it because it had a traditional SIM slot). Experience was slow and rapidly slowed with more apps, battery life was short, many apps performed poorly in low connectivity conditions.</p>
<p><strong>Technology in Indonesia</strong></p>
<ul>
<li>BlackBerry and candy bar phones still popular</li>
<li>Tons of tablet use among tourists</li>
<li>Nearly every restaurant had its own Facebook, Twitter, and email address (Yahoo popular, occasionally Gmail)</li>
<li>WhatsApp, Line, and other messaging apps heavily advertised/bundled with telco packages</li>
</ul>
On Google Apps scrapping the free offering2012-12-09T00:00:00-08:00http://sean.lyn.ch/2012/12/on-google-apps-scrapping-the-free-offering<p>From <a href="http://readwrite.com/2012/12/07/google-dares-businesses-to-switch-to-microsofts-office-365" title="Readwrite">Readwrite</a></p>
<blockquote>
<p>In a bid to make things “very straightforward,” Google axed the basic Apps plan, which offered free email, calendaring and documents, plus 5GB of generic Google Drive storage, to up to 10 users per month. All companies will now have to pay the $50 per year cost of Google Apps for Business.</p>
<p> </p>
<p>The change garnered a lot of coverage, but it isn’t that surprising. Google’s already convinced everyone that the service is worth (at least) the $50/year. While not surprising, it is exciting. I’m excited to see Google’s shift away can unblock some innovation in the email space. </p>
</blockquote>
<p>When GMail launched, it dominated a lot crappy incumbents. Sadly though, now GMail is the old king that isn’t innovating. While there’s a fair amount of innovation on the email client side (<a href="http://www.mailboxapp.com/">Mailbox</a>, <a href="http://mailpilot.co">Mail Pilot</a>, <a href="http://zeromail.com/">zeromail</a>, and the late <a href="http://sparrowmailapp.com">Sparrow</a>), they’re all still relying on Gmail as a backend because the free Google Apps offering essentially sucked the oxygen out of the room for any company building a simple, hosted email service for personal domains. Now that Google isn’t offering custom domain email for free, there’s a much more attractive business model available for one of these clients to jump on. Bonus points if a startup could build a rev share model that would financially support any of the clients.</p>
How Microsoft and Nokia can avoid smothering their spark2012-01-30T00:00:00-08:00http://sean.lyn.ch/2012/01/how-microsoft-and-nokia-can-avoid-smothering-their-spark<p>At CES this month, Microsoft finally accomplished the impossible. Suddenly, <a href="http://www.wired.com/gadgetlab/2012/01/windows-phones-ces-2012/">everyone was talking about the Windows Phone</a>. Of course, Microsoft owes much to Nokia for that result, given their gift of the acclaimed N9 hardware in the form of the Lumia 800. Unfortunately, nearly as soon as Microsoft/Nokia found traction, they immediately began to piss it away by introducing a raft of additional models with no release dates and vague technical differences. No sooner had they gain the limelight than they committed the cardinal sin of the mobile phone industry, ambiguous product line growth. I’m hoping it’s not too late for them to recover.</p>
<p>It’s my humble opinion that the N9/Lumia is the most beautiful phone hardware outside the iPhone. I’m intimately familiar with what Android has to offer, owning several Nexus-series phones myself, but their recent trend of monolithic form factors and <a href="http://cdn.ubergizmo.com/photos/2010/8/droid-x-review-bulge.jpg" rel="prettyPhoto[150]">hacky case tumors</a> means the award for best design was very much up for grabs. The Lumia is not flawless, it still has quirks, but it’s a beautiful device only requiring iterative improvement rather than a ground up redesign. And it’s largely because of the release of the Lumia 800 that Microsoft is finally getting some of the smartphone market mindshare. </p>
<p>The 800’s availability is pretty sparse, with no American carriers (Microsoft will begin selling it unlocked next month from their stores). So to even have the level of excitement for an essentially unreleased phone is an accomplishment in itself. When they announced the 800, they also announced its chubby younger brother, the 710, which targeted the lower end of the smart phone market. This was their first infraction, but with only two devices that look drastically different, they could be excused.</p>
<p>But at the same conference, while the attendees were having their very first hands on with the 800, Nokia went and announced the next version, the <a href="http://www.theverge.com/ces/2012/1/9/2694835/nokia-lumia-900-lte-windows-phone-ces-2012">Lumia 900</a>, with no date (it’s rumored to be March), effectively killing any chance all but the most wallet heavy of potential early adopters will be picking up an 800.</p>
<p>While the replacement of the 800’s pentile screen on the 900 is a welcome fix, the fledgling Windows Phone market would have been happily served by the 800 for at least a few more months. Don’t let the tech spec nerds fool you, LTE just does not have the coverage to be a deal breaker at the moment.</p>
<p>And then today, only weeks after CES, they slipped another model into the pipeline: <a href="http://www.theverge.com/2012/1/29/2756001/nokia-lumia-910-typhone-listing-europe">the 910</a>, rumored to be released only another two months later in May. The difference? An additional 4 megapixels on the camera.</p>
<p>In a matter of weeks, Nokia went from having the flagship Microsoft phone brand to having a technically ambiguous family of 4 models, half of which aren’t released nor do they have confirmed dates. As a result, any brand awareness for the Lumia 800 is in danger of becoming completely diluted. </p>
<p>The tendency for consumer electronics companies to do this is shocking. But their insistence on a massive catalog of indistinguishable devices is one of the primary reasons that these manufacturers continue to lose ground to Apple. </p>
<p>Admittedly, some companies are realizing their mistake. HTC, one of the worst offenders (you’re forgiven if you don’t know the difference between the HTC Bland, HTC Dull, and HTC Generic) as well as Acer have both said that the <a href="http://allthingsd.com/20111207/acer-ceo-were-going-to-stop-selling-cheap-unprofitable-crap/">low-quality, many-variations strategy is not working</a>. The confusion introduced by so many competing products with minor (if any) technical differences is a classic example of the <a href="http://en.wikipedia.org/wiki/Decision_theory#Paradox_of_choice">paradox of choice</a>. </p>
<p>Handset manufactures (as well as most large scale consumer electronics companies) need not rely only on Apple as the only model of success. Take a look at any car manufacturer. Any given company has a limited number of models, but with high value brand names. For example, the Honda Civic. Everyone knows what to expect from a Civic because it has decades of brand credibility. The average person can probably pick the Honda Civic out of a line up of all Honda cars. They also can give a reasonably informed explanation to how it differs from, say, the Honda Accord. No one, outside the editor of your favorite gadget blog, is going to be able to differentiate between the <a href="http://allthingsd.com/20120126/htc-to-give-up-on-quantity-and-try-quality/">51 different HTC models</a>.</p>
<p>Not surprisingly, the name of the product caries a lot of value with it. Consumers start to recognize it in multiple contexts: people on the street, friends that own it, TV ads and product placements, online buzz, and eventually, comparison shopping their next phone purchase. The name can also support minor technical variations: You can always customize your Honda Civic or your Macbook Air.</p>
<p>Now, here’s the trick. If you do it right, you end up with a recognizable brand name that has a lot of consumer value that you can then use to drive sales as you release hardware updates. What you don’t want to do is suddenly try and use that brand to sell a dozen of different devices, as you completely dilute the importance of the brand; it’ll go from “Awesome product a few of my friends have and love” to “generic term for every product that company sells”. Just look at the Motorola RAZR. It was launched in 2004 and was a massive success before smartphones began to take over. But the brand became diluted with half a dozen different models in various configurations, not to mention hangers-on in the form of the KRZR and ROKR (the ill-fated predecessor to the iPhone).</p>
<p>If you do it right, with each hardware update, you’re moving the legacy of that name forward. You don’t need to do a massive press conference the way Apple, but make a big deal that the new one is coming and why it’s better than the previous model (and it does have to be improved – a slightly updated camera doesn’t cut it). Samsung is actually getting the hang of this with the Galaxy. Microsoft needs to follow suit. </p>
<p>For Microsoft and Nokia, the recovery is easy: kill the multi model strategy and build brand recognition around a name or family of names. </p>
<ul>
<li>First, Pick the name for your flagship. Lumia doesn’t completely suck and already has some value.</li>
<li>Second, make it clear that the 710 is the “budget” brand. The MacBook vs MacBook Pro. The Civic vs the Accord. Lumia 710 vs 910 is too subtle.</li>
<li>Third, pay attention to the reviews of the 710. They’re certainly <a href="http://www.intomobile.com/2012/01/29/review-nokia-lumia-800-its-either-smartest-dumbphone-dumbest-smartphone/">not all positive</a>, but the reviewers are giving a lot of concrete and addressable feedback. Fix the problems, add the features that are obviously missing, and learn from the mistakes.</li>
<li>Finally, bet big. They may have gained some buzz, but Microsoft and Nokia still need to bet big to compete against the dual titans of iOS and Android. Given that you can’t even get the Lumia 800 from any US carrier, it’s obvious they still need to figure out all the partnerships and marketing. They’re going to need to be aggressive to get customer and carrier traction. Microsoft should be giving these to any developer that asks and Nokia should be cutting margins to get these into as many hands as possible. They need to be aggressive (On being aggressive in a crowded hardware market, see <a href="http://allthingsd.com/20110928/live-from-new-york-meet-the-amazons-kindle-fire/">the Kindle</a>).</li>
</ul>
<p>All signs indicate that Nokia and Microsoft have finally found their breakthrough device, their spark. For anyone that’s tried to start a bonfire before, you know how easy to smother that early flame. But with a focused strategy, they have the potential to grow the Lumia into a roaring fire.</p>
Android, the Facebook SDK, SSO, and You2011-07-01T00:00:00-07:00http://sean.lyn.ch/2011/07/android-the-facebook-sdk-sso-and-you<p>There seems to be near universal misunderstanding of Facebook’s Android SDK and the single sign on (SSO) feature <a href="https://www.facebook.com/blog.php?post=446167297130">Facebook added late last year</a>. I originally wrote a <a href="http://stackoverflow.com/questions/4848067/login-failed-invalid-key-error-with-facebook-sdk/6528363#6528363">response on Stack Overflow</a> detailing the fix but I didn’t realize the connection to SSO at the time. I’m hoping this post can summarize the problem and solutions for the mass of similarly confused developers who get stuck here.</p>
<h3>Background</h3>
<p>In November 2010, Facebook announced that they’re enabling Single Sign On in the Android SDK. Applications that take advantage of this feature will allow users to skip re-entering credentials and dive right into the action. What they do not mention is that SSO isn’t a feature developers opt into, it’s actually on by default. However, it only changes the way the Facebook SDK works <strong>IF</strong> the Facebook application is also installed. This causes the problem that most developers (including myself) see when they first set out to build an application.</p>
<h3>The issue</h3>
<p>The typical description of the problem goes something like this: You’ve downloaded the SDK and your application is running perfectly with shiny new Facebook authentication on the Android emulator. But when you deploy it to a device, it no longer works. The app loads but the Facebook login dialog disappears instantly. If you’re more familiar with Android development than I was at the start, you start up your copy of <tt>adb logcat</tt> while your application is running and you see logs that look something like this:</p>
<p><code>D/Facebook-authorize( 2194): Login failed: invalid_key<br />
W/System.err( 2194): com.facebook.android.FacebookError: invalid_key</code></p>
<p>At this point, you Google for solutions to the issue and quickly start pulling out your hair out at the number of people reporting this issue with no apparent fix. The problem is actually very simple, though not immediately obvious. The problem is that, when deploying your application to the device after developing on the emulator, you’ve inadvertently and implicitly enabled Single Sign On because your device has the Facebook application installed. This is why one of the reported fixes is to uninstall the Facebook application. Your emulator does not have the Facebook application installed (though the Facebook SDK includes it if you want to install it), but your device does, thus triggering the SSO code. And SSO has some special configuration requirements that non-SSO does not which causes the invalid_key error above.</p>
<h3>Fixing the Issue</h3>
<p>There are a few different ways to tackle this problem.</p>
<p><strong>1. The ugly: Uninstall the Facebook app</strong></p>
<p>Don’t do this. You’re not going to be able to ask your users to do the same anyway. The only reason this works is because the SSO functionality is triggered by the presence of the Facebook application and this simply removes the possibility of using SSO completely, which is also a crappy user experience.</p>
<p><strong>2. The bad: Opt-out of Single Sign On</strong></p>
<p>If you want, you can actually have your application skip SSO completely. You probably don’t want to do this, but it’s a reasonable solution if you’re convinced you do. To do so, you need to modify the code calling Facebook to specify that you want to handle auth on your own. You do this by passing <tt>FORCE<em>DIALOG</em>AUTH</tt> value into the <tt>authorize</tt> method’s <tt>activityCode</tt> parameter.</p>
<p><strong>3. The good: Set up Single Sign On properly (recommended)</strong></p>
<p>Unless you have a good reason not to, you should set up SSO. It’s a bit more work, but it’s the best experience for your users. </p>
<p>Buried in the Facebook documentation is a mention about hash codes. Although it’s not obvious in the documentation, Single Sign On requires applications to provide a Key Hash or certificate (I use them interchangeably) of the signature used to sign the application to Facebook. This is used as part of the validation with SSO. When applications are built by the Android development tools, they’re automatically signed using a debug keystore. You need to use this keystore to generate the certificate. Details about the Debug keystore are available in the <a href="http://developer.android.com/guide/publishing/app-signing.html#debugmode">Android Documentation – Signing Applications</a>.</p>
<p>In order to provide Facebook with information about the signature, you need to pull it from the keystore. On OSX, you do this in the terminal with the following command:</p>
<p><code>keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64</code></p>
<p>This generates a short string of characters (which may include characters such as ‘=’ or ‘/’) that identify the signature. This is the certificate or Key Hash as Facebook calls it. Once you have this, you need to give it to Facebook.</p>
<p>Find your application on <a href="https://developers.facebook.com/apps">Facebook’s Developer page</a> (or create a new one if you haven’t set one up already). Once you’re in the application summary page, choose ‘Edit’ on the Settings banner and then pick ‘Mobile’ on the left-hand side. Under the Android section, you’ll see a box for Key Hash. Paste the certificate string from the command above into this box and hit save. Give it a few minutes to propagate and try running your application again. The invalid_key errors should disappear. Keep in mind, when you sign your application for distribution, you’ll have to generate another certificate like you do here and provide that as well.</p>
<h3>SSO Weirdities</h3>
<p>SSO isn’t completely smooth sailing though, there are a few issues to watch out for.</p>
<p><strong>1. authorize() always shows a page, even if the user is authorized</strong><br>
As far as I’m concerned, this is a bug in the SDK. The workaround is to store the token after authorizing the first time and simply use that instead of calling authorize again while <tt>isSessionValid()</tt> is true (Stack Overflow has a great example of <a href="http://stackoverflow.com/questions/4495845/how-to-avoid-already-authorized-in-android-facebook-sdk">how to save the access_token using Android’s PreferenceManager</a>). However, unless you want to request an offline_access token, the token will only be valid every 24 hours. </p>
<p><strong>2. Different Access Token formats</strong><br>
The token received from SSO applications are of a different format. There’s a <a href="http://bugs.developers.facebook.net/show_bug.cgi?id=14037">bug open on Facebook’s bug tracker</a> about this, but they can’t seem to track it down despite it being easy to replicate. This isn’t a huge issue, but unfortunately, you won’t be able to parse the user ID of the Facebook User out of the SSO token the way you can from standard access token format</p>
<p><strong>3. UI is inconsistent between SSO and non-SSO</strong><br>
Non-SSO uses a nicer pop-over dialog to show the authentication panel while the SSO panel slides in from the right (and back out to the right after the user finishes). There doesn’t appear to be a way to change this UI, at least without hacking the SDK code directly.</p>
Checkpointing2011-05-16T00:00:00-07:00http://sean.lyn.ch/2011/05/checkpointing<p>To ensure the continuity of this blog’s timeline, let me announce that Friday last week was my last day at Google and I’ll be starting on a new project, the details of which I can’t go into yet, but I’m looking forward to when I can.</p>
<p>I’m not planning on talking any further on why I left Google as the blog post you tend to see from people leaving is almost cliche. But I will say that I absolutely loved my time with the company and could see myself returning some day. For now though, greener grass <img src="http://sean.lyn.ch/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /></p>
Southwest Hates Its Customers (‘ Data)2010-09-11T00:00:00-07:00http://sean.lyn.ch/2010/09/southwest-hates-its-customers-data<p>I’ve been a user of AwardWallet for a couple months now, a site that keeps track of many of my travel reward programs. You can think of it as Mint.com for loyalty programs. It turns out that I’m far more likely to participate in programs and actually be loyal to the brands if I can monitor my account status. AwardWallet isn’t perfect, but it serves a large need I have.</p>
<p>Unfortunately, Southwest either doesn’t understand this benefit, or doesn’t actually want its customers to use the loyalty program because they’ve blocked AwardWallet from collecting this information on my behalf. The team emailed me this week with the disappointing news:</p>
<blockquote>
<p>Dear Sean,</p>
<p>We are writing to inform you that unfortunately Southwest is no longer allowing us to pull data from their website anymore. You can update your balance manually and you can use AwardWallet to auto-login to Southwest’s website. From now on you need to track the expiration date of your Southwest miles manually.</p>
</blockquote>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">
we are writing to inform you that unfortunately Southwest is no longer allowing us to pull data from their website anymore. You can update your balance manually and you can use AwardWallet to auto-login to Southwest’s website. From now on you need to track the expiration date of your Southwest miles manual
</div>
<p>Southwest’s response to another AwardWallet user was equally frustrating:</p>
<blockquote>
<p>We regret your disappointment that Southwest does not participate with third party companies who offer frequent flyer information on their web sites. Our reasoning lies in the fact that we can only safeguard a safe and secure program by keeping our Customers flight credits and Awards within our own internal system. While Award Wallet’s intentions may be genuine, by allowing them to have access to Rapid Rewards Members’ account information, we could potentially jeopardize not only our program’s integrity, but our Members’ personal information.</p>
</blockquote>
<p>The fact that I have 11 Rapid Reward points (I only need 5 more for a free flight!) is not, in any world, hyper secure information. If I as a customer, choose to have that information aggregated in a way that provides value, that is my prerogative. I’m convinced they recognize this too and that their concern is almost certainly that I am giving some third-party my login name and password in order to collect this information. This I do recognize as a security issue, but it’s a problem with an easy and well recognized solution.</p>
<p>What I propose is a MicroFormat for APIs. I’d like to define a protocol to increase the use of loyalty program data with the follow features:</p>
<ul>
<li>REST API for querying both the current status and the history of transactions for any given rewards program.</li>
<li>Simple JSON data structure with extensible fields so that programs can customize to suit their needs</li>
<li>OAuth based authentication</li>
<li>(Optional) PubSubHubbub-based notifications for status updates</li>
</ul>
<p>If every loyalty program adopted this, web services and iPhone apps the world over could quickly expose this information to users in a meaningful way, and instantly make adoption of those programs a lot more valuable to their customers, and ultimately make those customers a lot more loyal.</p>
<p>I’d love to see Southwest actually push toward a solution that enabled this sort of usage. Looking at the <a href="http://awardwallet.com/forum/viewtopic.php?f=10&t=229">AwardWallet forums</a>, there’s obvious demand from power users. Seems to me, they might be the types of customers that Southwest would consider worth pleasing.</p>
Saying so long to Flickr2009-10-11T00:00:00-07:00http://sean.lyn.ch/2009/10/saying-so-long-to-flickr<p>My annual Flickr pro account renewal came up last month. Looking at my renewal history, I can see that every time I’ve renewed it, I’ve never done it proactively. I’ve always a month or so after my previous year’s subscription had expired. This year was no different. I let it expire, only to have to renew it again to unlock some of my older photos that I didn’t have a backup of (silly). This time around, I seriously considered leaving it unrenewed. I just don’t use it anymore.</p>
<p>I’m what I would call a long-term Flickr user. I’m relatively sure I had my Flickr account before GMail. I payed for the pro upgrade before I ever paid for generic web hosting. Flickr was great and I evangelized it to all my friends, as is evident in all the abandoned accounts on my Flickr friends list.</p>
<p>I was attracted to Flickr for three reasons:</p>
<ul>
<li>The ability to publish my photos for my friends</li>
<li>Hosting photos for my blog</li>
<li>Getting feedback from the community on the photos I took</li>
</ul>
<p>But four years later, the world has changed. Now all my friends use Facebook, because they don’t have to pay for it, because Facebook actually innovated on photo sharing by indexing by the people in the photo, and because it integrates into a tool my friends already use. For hosting photos, I can use the same web-storage I’m paying for already. Though the reality is that I simply don’t blog or photograph as much, and so neither of those are that important to me anymore.</p>
<p>The more revealing part is that, in those four years, Flickr hasn’t changed at all. The only event that brought me back to Flickr was the account merger with Yahoo. The only news I heard was the half-assed support for video and the addition of the Yahoo logo. Beyond that, it’s stagnated. Where is the Twitter short-links? Where’s the first party Facebook app? (<strong>Edit:</strong> found both after digging through the profile settings, foot appropriately in mouth). I’m asking partially because I’m a geek and I love playing with new features, but also because this complete lack on investment on Yahoo’s part has made it so worthless that almost all of the people who used to engage in the photos have now gone else. My pro membership doesn’t buy me anything.</p>
<p>Unless something major changes, this will be the last $24.99 (a number that, despite Moore’s law, has stayed constant this entire time) I give to Yahoo. I’m not rushing to Picasa Web either. They’re just as guilty of price stagnation as Flickr (though Face recognition is very cool). For now, I’ll stick with iPhoto and Facebook (which maintains their own iPhoto plug-in I might add). There’s plenty to do in this area, so I’ll be waiting for someone to come along and impress me.</p>
<p>Epilogue</p>
<p><span style="background-color: #ffffff;">For anyone trying to get their photos off of Flickr, take a look at <a href="http://www.malarkeysoftware.com/projects_PhotoGrabbr.html">PhotoGrabbr</a>, a tool for downloading entire Flickr albums for the Mac. I definitely won’t be dealing with photo lock next year.</span></p>
Playing with PubSubHubBub2009-07-13T00:00:00-07:00http://sean.lyn.ch/2009/07/playing-with-pubsubhubbub<p>This week I’ve been taking a look at the recently announced <a href="http://code.google.com/p/pubsubhubbub/">pubsubhubbub</a> by Brad Fitzpatrick and Brett Slatkin of Google. The duo proposed and implemented a protocol for implementing near-realtime notifications on top of RSS and Atom. The protocol describes three roles: A publisher, a subscriber, and a hub. The hub basically acts as an intermediary, receiving subscription requests from subscribers and forwarding update notifications from publishers to subscribers.</p>
<p>One of the first things I noticed about the protocol is that subscribers are required to have an internet accessible URL for validating subscription registration and receiving notification pings. This is not an issue for the Google Readers and FriendFeeds of the world, but this does leave desktop RSS readers out of the party. </p>
<p>Also interesting to note is that there’s nothing that requires the hub to be a separate entity from the publisher. In fact, it could be very desirable for the publish to own the subscription hub. Besides removing one notification roundtrip from the protocol, it would also give publishers more control over how often to ping users on updates. Nothing in the protocol requires that a notification be sent every time, so it would be possible to only notify a subset of users in real time (perhaps the ones that pay), and others on a regular basis. </p>
<p>Depending on how deep your RSS Trivia knowledge goes, this might sound awfully close to the <a href="http://cyber.law.harvard.edu/rss/soapMeetsRss.html#rsscloudInterface">rssCloud element</a>, but Brett points out that the key differentiator here is PSHB’s “<a href="http://code.google.com/p/pubsubhubbub/wiki/PriorArt">fat pings</a>“, that is, the entire updated content is sent as the ping to the user. </p>
<p>To reduce latency and polling, PSHB supports persistent HTTP connections from hubs to publishers, but it could use FriendFeed’s <a href="http://blog.friendfeed.com/2008/08/simple-update-protocol-fetch-updates.html">SUP</a> protocol to detect updates as well. </p>
<p>Though solving slightly different problems, it’s interesting to compare the SUP’s and PSHB’s stance on polling. SUP obviously relies heavily on polling, despite drastically reducing the amount required. While PSHB has strong <a href="http://code.google.com/p/pubsubhubbub/wiki/WhyPollingSucks">opinions against</a>. Polling is certainly less error prone, in addition to being less efficient. For example, how does PSHB handle dropped pings to subscribers? I admittedly haven’t dug too deep, but I assume a reasonable amount of state must be maintained in the hub to handle these cases smoothly.</p>
<p>Ultimately the most valuable contribution of the entire project might be the two outspoken Google employees behind it. Already they are seeing some adoption. The <a href="http://www.youtube.com/watch?v=ewQBgbysSOQ">pubsubhubbub demo at Real-Time CrunchUp</a> announced launched FeedBurner support and showed prototypes of Blogger and Reader support. Having evangelists inside the company puts early adoption in other Google products much more likely, which in turn will give the standard much more credibility.</p>
My Kindle’s Biggest Problem2009-04-19T00:00:00-07:00http://sean.lyn.ch/2009/04/my-kindles-biggest-problem<p>To be fair, the problem isn’t so much one of the Kindle’s. It’s more of a problem with books. I’ve had PDF books for years. PDFs were the cheaper method of getting textbooks for classes that were not always useful and they were often the only source of technical documentation in the days before Amazon (did I just date myself?). Over these same years, I bought many more books. To me, the physical copy of the book was absolutely preferred over reading on a computer. That all changed with the Kindle (and presumably for eBook readers before it). </p>
<p>After centuries, books are about to have their very first format transitions. Here comes that famous blogger hyperbole: Print is obsolete. </p>
<p>You’ve probably been through at least one of these before: Buying Blu-ray to replace DVDs that replaced VHS only a few years before it or upgrading from vinyl to cassette to CD to MP3 in a matter of a few decades). Each transition becomes increasingly costly for consumers as their libraries tend to get larger over time. </p>
<p>What remains to be seen is whether book authors will gorge on users paying to convert their library or, perhaps having felt the pain of format obsolescence for themselves, allow their fans to enjoy the content they already have a legal right to for free. I’m certainly being an idealist but I’m hoping its the latter. Time for some empirical evidence. </p>
<p><strong>The Experiment</strong><br>
I have a small number of books on a range of subjects sitting my to-read queue. All are in various stages of completion. I would rather continue to read using my fancy new device, but I’m very opposed to purchasing a new digital copy when I have a perfectly readable analog copy.</p>
<p>To this end, I propose the following experiment:</p>
<p>I will email each of the books’ authors with a simple proposition: I will return my copy of the book to the author (or give it to a friend, second hand store, whatever is the author’s preference), and in exchange, I will ask them to give me a digital copy of the book. I’d love if they were able to gift me the Kindle version, but I will take any digital version they have and do they heavy lifting to get it onto the Kindle. They are, or course, free to reject my offer (as I expect most will).</p>
I love my new Kindle2009-04-19T00:00:00-07:00http://sean.lyn.ch/2009/04/i-love-my-new-kindle<p>If I were to write a review, the title of this post would be the eventual conclusion. That said, let me bullet point out the pros and cons:</p>
<p><strong>Things I really like</strong></p>
<ul>
<li>Great Customer Service: My first one was defective when received (Back button was broken). A call to customer service had one automated menu, a real person, and a next-day replacement in under fifteen minutes</li>
<li>I can convert PDFs using Amazon’s converter</li>
<li>I can read anywhere, while only hauling a perfect sized tablet around</li>
<li>Cute female book nerds everywhere are stopping me to ask “Is that the new Kindle?”</li>
</ul>
<p><strong>Things I don’t like</strong></p>
<ul>
<li>Amazon is wasting the annotations feature by just dumping the results in a txt file</li>
<li>The bookstore’s coverage is relatively weak</li>
<li>I’m buying into the worst of DRM lock-in: I can’t give books to other people and I can’t read the files outside of my Kindle (and the Kindle app on iPhone)</li>
</ul>
Dear Facebook, I’ve got all the friends I want thanks2009-02-08T00:00:00-08:00http://sean.lyn.ch/2009/02/dear-facebook-ive-got-all-the-friends-i-want-thanks<p>When Facebook first added the “Friends You May Know” section on their homepage, I was relatively impressed. It did a good job of finding people in my social group. In the end though, I only found one or two people I had not yet added myself. After that, it was another useless piece of the homepage sidebar trying to get me to pimp Facebook to people I know; Invite Your Friends (aka Spam Your “Friends”) and Find Your Friends being the others (Even the ad slot is a friend inviter half the time).</p>
<p>The problem with the Friends You May Know feature wasn’t in the graph algorithm, it was with me. It was indeed identifying people I knew, but knowing them was not the same as being friends with them. I called it the People I Know, But Don’t Really Like box.</p>
<p>To fight back against The social graph analyzing Man, I started hitting <strong>x</strong> next to each of the recommendations. As I did I would battle back the algorithm as it ran out of new recommendations for the day, only return a few weeks later with a group of people I was a little less connected to. Slowly but surely the recommendations became meaningless. Until it finally hit rock bottom.</p>
<p>Yesterday, Facebook recommended Jessica to me. It explained that we both went to the same University so surely we know each other. Jessica and I had absolute no mutual friends. Not one. I was surprised that algorithm had become so desperate for me to grow my social graph that it had begun resorting to recommending complete strangers. I wondered what other strangers homepages were recommending becoming friends with me, or maybe I was the only one so hostile towards the recommendations.</p>
<p>I knew all of its efforts would be fruitless. I had already realized what the algorithm or the clever coder behind it simply did not consider: I had no more friends. Facebook has done such a good job that my friends list was simply, complete. I could imagine the meeting in Facebook HQ where some quiet intern asked “What happens when they run out of friends?” only to have their question waved off. “Inconceivable!”</p>
<p>Well I’m here to tell you Facebook, I have reached that state. Facebook – Please quit bugging me to add friends, I will as I make new ones. Instead, do something really cool with all that sidebar space. I’m sure you’ve got some great ideas. </p>
<p>And have some self-confidence. Just because my Friend list is growing does not mean I’m jumping ship for Twitter any time soon.</p>
I actually agree with Vallywag: No one uses Twitter2008-12-28T00:00:00-08:00http://sean.lyn.ch/2008/12/i-actually-agree-with-vallywag-no-one-uses-twitter<p><em>**Update from the future (Jan 2012):</em>* Not surprisingly, my prediction that follows didn’t stand the test of time. Three years later, I’m a strong advocate of many different uses of Twitter. I’m sure my past self would scoff.*</p>
<p>I’ve always been a bit confused about the reckless amount of hyper surrounding Twitter. The functionality it provides is nothing more than 90s era IRC with cute animated birds and a 140 character limit. I was convinced the people who live and breath Twitter were making general assumptions about the reach of Twitter based on their smaller social group. Turns out Vallywag thinks so too.</p>
<p>Said Vallywag post is titled “<a href="http://valleywag.gawker.com/5117018/do-you-twitter-how-adorable">Do You Twitter? How Adorable</a>” and it makes the point that Twitter has “consumed the media elite”, but their view of it’s success is distorted because they only see how their colleges use it. “By the numbers, though, Twitter is an inconsequential nothing.” </p>
<p>My Twitter page is essentially tweets from a handful of variably frequent posters and the few dozen remaining followers that do nothing other than add icons to my followers list. I do very little tweeting myself excepting the odd response at one of those aforementioned heavy Twits. </p>
<p>Twitter, for me, is just one more site I need to check every day. My followers/following list is without exception, a subset of the social graph I already have represented in Facebook or Google. The only thing Twitter serves to do is further segregate the conversation I have with my friends. </p>
<p>For my part, I’ve been building a small script that polls and synchronizes my status across Facebook, Twitter, and GTalk (I’d like to add Live Messenger too, but there’s no easy API to get/set, *hint* for those MSofties reading this). Of course, that only solves my side of the conversation. The other direction remains fragmented.</p>
Review: Virgin America2008-10-19T00:00:00-07:00http://sean.lyn.ch/2008/10/review-virgin-america<p>When I started writing this review, I was half way through my fifth flight on Virgin America in three weeks time. I felt knowledgeable enough to write an informed review on the entire VA experience. But as I started to flesh out my mental notes into something more concrete, I realized why I enjoyed my flights so much: The Virgin America plane is one big gadget.</p>
<p><strong>Red</strong> is the name of Virgin’s in-flight entertainment system, and the most featureful I’ve used in my travels. It has radio and an impressively complete Music library, Music Videos, Satellite TV, TV on Demand ($1.99 per), Movies on Demand ($7.99 per) , and Video Games. The Virgin Airbus is the first plane to pass the “Can you play Doom on it?” test (and all the cheat codes work!). One of the other really hyped feature of Red is the seat-to-seat chat and plane chat room, but I did not see a single person in the chatroom during any of my flights. I think this might be more “wow” than actually useful. On the other hand, a feature that is very useful is the ability to order drinks and food directly from Red at (almost) any time during the flight.</p>
<p>Despite the plentiful entertainment options, Red is very much still in beta. There were several points where the system was slow and unresponsive, once requiring a reboot. This must be a somewhat common occurance as flight attendants occasionally warn about the need to reboot during the take-off speech likening it to their passengers’ Windows PCs.</p>
<p>Some of the features aren’t built yet: Read, Shop, and Email keep telling me to try again on my next flight. Red allows you to create to create musical playlists, but there’s no payoff if your list disappears as soon as you get off the flight. It screams to be tied into a personal account (so much so that a login button is present in the home menu, with no functionality behind it).</p>
<p>I’m also convinced that several of the Satellite TV channels are pre-captured streams. For example, on all of my flights, the Sci-Fi channel seemed to be playing the same two episodes of Battlestar Galactica over and over, and the video feed didn’t seem to break down in turbulence like CNN would. Speaking of which, the satellite’s reception seemed to relatively poor compared to the similar system on WestJet flights. This wouldn’t be as big of a problem if they offered a fresher selection of on demand video at a cheaper price point (read: free). Geek style points for offering Diggnation and Boing Boing video for free though.</p>
<p>On the technical side, I have a supicion that Red is built on Linux. After rebooting, my screen faithfully displayed the familiar X Windows Server backdrop before moving into Red. Another sign? One of the games in the system is called Linux Circus.</p>
<p>Overall I’m very impressed with the system, but they’re going to have to iterate quickly on both the features and the content lest Red becomes a novelty rather than a necessity.</p>
Open New Window links in Safari as Tabs2008-09-25T00:00:00-07:00http://sean.lyn.ch/2008/09/open-new-window-links-in-safari-as-tabs<p>Without having to use Saft either! (Though I think this will only work on Safari 3.1)</p>
<p>Here’s the magic, just pump this into your terminal, restart Safari and you’ll be ready to go:<br>
<code>defaults write com.apple.Safari TargetedClicksCreateTabs -bool true</code></p>
Photog Predicament2008-09-02T00:00:00-07:00http://sean.lyn.ch/2008/09/photog-predicament<p>Another year, another reluctant Pro upgrade of my Flickr account. I’ve been taking less and less photos over the years (I partially blamed my camera: a DSLR which I recently sold). Despite Flickr adding a number of cool features, I just haven’t been compelled to keep up. Looking at my Flickr Friends, it looks like I’m not alone. For now, I’ve bought the upgrade to access some older pictures I no longer have copies of. Next year, I hope that I won’t be faced with the same locked in.</p>
<p>I’ve become compelled to move to Picasa Web Albums. Today, Picasa announced facial recognition integration to automate the process of “tagging” people, a function that has become the killer feature for Facebook’s photos. </p>
<p>But a couple things are holding me back from moving to Picasa: </p>
<ul>
<li>I’m at a loss as to why I can’t buy an unlimited account like I can on Flickr.</li>
<li>Picasa software doesn’t run on my Mac (Not a massive problem as there is a Picasa Export tool for iPhoto)</li>
<li>No one uses Picasa besides the Google crew</li>
</ul>
<p>I’m wondering if I have the wrong expectations for my web-based photo management. Perhaps I shouldn’t be treating the web layer as global storage and management so much as the presentation layer. Most of my albums on Flickr and Facebook are a subset of the photos I have in iPhoto anyway. Many pictures never make it out of iPhoto because they are blurry or just boring. It’s easy to see iPhoto (or Picasa) as the main library, Flickr, Facebook, and Picasa as just galleries. </p>
<p>The problem with this configuration is that, despite the web simply being a way to share photos, much of the metadata (titles, descriptions, comments, keyword, geo, and face tags) is scattered across the sites. I’d love if Picasa (or Flickr, or Facebook for that matter) became my defacto management layer, pushing content to all others and pulling metadata back. Maybe I’m letting my architecture astronaut side get the best of me.</p>
easy_install bug in Leopard2008-08-27T00:00:00-07:00http://sean.lyn.ch/2008/08/easy_install-bug-in-leopard<p>Leopard (OSX 10.5.4 but it looks like earlier versions were affected) seems to have some sort of bug that causes easy_install or setup.py install to crap out with an error like this:</p>
<blockquote>
<p>No eggs found in /var/folders/Ev/Evg2gG5nFyKz5eSgYhyKuk+++TI/-Tmp-/easy_install-Qm7ReE/simplejson-1.9.2/egg-dist-tmp-9qR_OW (setup script problem?)</p>
</blockquote>
<p>I ran into this on a number of different packages: simplejson (above), appscript, and others. The fix seems to be this seemingly unrelated bad boy <a href="http://bugs.python.org/setuptools/issue4">here</a> (discovered <a href="http://lists.ipython.scipy.org/pipermail/ipython-user/2008-August/005714.html">here</a>). The fix? This command:</p>
<p><code>sudo easy_install http://www.jaraco.com/ASP/eggs/setuptools-0.6c8_svn15fix.egg</code></p>
<p>Ugh.</p>
Downloading: A Look at the Past and Future of Progress (bars) – Part 12008-08-14T00:00:00-07:00http://sean.lyn.ch/2008/08/downloading-a-look-at-the-past-and-future-of-progress-bars-part-1<h2>Part 1 – The Past and Present</h2>
<p>The Download Window or Download Manager is the part of the interface that provides the user with information about the file or files currently downloading. This sort of interface is common in any application that involves downloading (or uploading) multiple files that take more than a few seconds to transmit. The download window you’re most familiar with is almost certainly the one included in your web browser. A typical day’s worth of browsing usually includes the downloading of a some document or data.</p>
<p>Despite the download view’s frequent use, it seems to be one of the most neglected parts of the browser. It has improved since early consumer browsers, but the download progress view still manages to trip up in many cases. Admittedly, it’s hardly the sexiest element of a web browser, but it certainly deserves more attention than it receives.</p>
<p>Join me on a quick trip in the way back machine to see just how little the download progress view has changed and where I believe it should be headed.</p>
<h2>The Stone Age</h2>
<p><a href="http://sean.lyn.ch/wp-content/uploads/2008/08/tsn87_032.gif" rel="prettyPhoto[50]"><img class="alignright captionbox size-full wp-image-58" title="Original Download Window" src="http://sean.lyn.ch/wp-content/uploads/2008/08/tsn87_032.gif" alt="" width="250" height="174" /></a>Things were brutish in the early days of the world wide web. Each downloaded file had its own window, and while most users weren’t downloading files any bigger than a few megabytes, dial-up connections guaranteed a transfer would take long enough that a user would inevitably ask, “How much longer?”</p>
<p>If you had multiple downloads going at the same time, not only would they take longer to complete, but your windows taskbar would be overflowing with download progress windows.</p>
<p><a href="http://sean.lyn.ch/wp-content/uploads/2008/08/bittorrent.jpg" rel="prettyPhoto[50]"><img class="captionbox size-full wp-image-60 alignleft" title="bittorrent downloader" src="http://sean.lyn.ch/wp-content/uploads/2008/08/bittorrent.jpg" alt="" width="240" height="150" /></a>This was the way browsers worked back then. Both Internet Explorer and Netscape Navigator offered this workflow. Even the first few versions of the Official BitTorrent client worked this way.</p>
<p>I put this style of functionality in the Stone Age, but it doesn’t mean that it is a thing of the past. Internet Explore 7, the newest version of the browser STILL believes that one download warrants one window.</p>
<h2 style="clear: both;">
The Bronze Age: One window to rule them all
</h2>
<p><a href="http://sean.lyn.ch/wp-content/uploads/2008/08/firefox-download.jpg" rel="prettyPhoto[50]"><img class="captionbox alignright size-medium wp-image-66" title="firefox-download" src="http://sean.lyn.ch/wp-content/uploads/2008/08/firefox-download-300x185.jpg" alt="" width="240" height="148" /></a>The concept of a download manager had been around in the stone age in the form of third-party plug-ins. Enterprising individuals quickly realized that a central place to track all those long-running downloads would be a feature Joe Surfer would pay for. It wasn’t until my first encounter with Firefox in 2004, however, that I found my built-in first download manager.</p>
<p>The concept of a download manager is straight forward: It is a place to manage all of your downloads. If you were to have multiple downloads running at the same time, you could see the status of all in one window. No more desktop and taskbar clutter (sort of).</p>
<p>I mentioned that Firefox was <em>my</em> first browser to include a download manager, but I am unsure if it was the first of all browsers. By the time I switched to OS X in 2005, Safari already sported one.</p>
<p>While the aggregation of all the downloads went a long way to simplifying the user experience, it was not yet the perfect user interaction. Download managers still required significant input from the user to manage: Download folders needed to be specified continually, history cleaned, windows lost, found again, and eventually closed.</p>
<h2>The Iron Age: The road to enlightenment</h2>
<p>This is where we stand today: On our way, but certainly not there yet. Many of the major players has given the standard download progress view its own twist. Let’s quickly touch on some of the progress each has made.</p>
<h4>Firefox 3</h4>
<p>Firefox 3 adds the ability to opt out of opening the download manager window completely when downloading a file. Instead, it shows you a simple summary of progress in the status bar. Alternatively, you can set the window to close automatically when the download is complete. And it allows you to set a default download location.</p>
<p><a href="http://sean.lyn.ch/wp-content/uploads/2008/08/firefox-download-bar.jpg" rel="prettyPhoto[50]"><img class="captionbox aligncenter size-full wp-image-63" title="firefox-download-bar" src="http://sean.lyn.ch/wp-content/uploads/2008/08/firefox-download-bar.jpg" alt="" width="408" height="116" /></a></p>
<h4>Safari 3</h4>
<p>Safari automatically downloads files to the user’s Downloads folder. If the user wants to download to a different directory, they can through the context menu.</p>
<p><a href="http://sean.lyn.ch/wp-content/uploads/2008/08/safari-context-menu.jpg" rel="prettyPhoto[50]"><img class="captionbox aligncenter size-medium wp-image-70" title="safari-context-menu" src="http://sean.lyn.ch/wp-content/uploads/2008/08/safari-context-menu.jpg" alt="" width="280" height="182" /></a></p>
<p>In OS X 10.5, the Downloads folder is configured as a Stack by default on the desktop. The stack acts as both a download history (by showing the files in cronological order, as well as a notification of completion (as it bounces when a file is added). This is the only truely compelling use of OSX’s stacks I’ve come across.</p>
<p><a href="http://sean.lyn.ch/wp-content/uploads/2008/08/stacks.jpg" rel="prettyPhoto[50]"><img class="captionbox aligncenter size-thumbnail wp-image-72" title="stacks" src="http://sean.lyn.ch/wp-content/uploads/2008/08/stacks-150x150.jpg" alt="" width="150" height="150" /></a></p>
<p>Unfortunately, with all this functionality, Safari still brings up the download manager. Settings can clear history automatically when a download completes but it can’t close the window (Yes, a third party plug-in can add this feature, but that’s beside the point)</p>
<h4>Opera</h4>
<p>Opera opens a separate tab with download status and history. I was impressed with this functionality as I’m not an active Opera user, but I’m concerned that there’s some possibility of the tab getting lost or confused with other web browser tabs. Seems to be a global concept that should be introduced into the interface some other way. I’m on the fence here</p>
<p style="text-align: center;">
<a href="http://sean.lyn.ch/wp-content/uploads/2008/08/opera-download.jpg" rel="prettyPhoto[50]"><img class="captionbox aligncenter size-medium wp-image-74" title="opera-download" src="http://sean.lyn.ch/wp-content/uploads/2008/08/opera-download-300x156.jpg" alt="" width="240" height="125" /></a>
</p>
<h4>Internet Explorer</h4>
<p>Despite leaving IE back in the stone age, it still has a feature that Safari, Firefox, and most BitTorrent applications lack: IE hides the downloads until they’re complete. If a file is on your desktop or in your download folder, you can be confident it’s ready for your use. Other browsers tend to leave their half-downloaded unmentionables in plain view.</p>
<h2>The Age of Satisfaction: Attainable?</h2>
<p>Here are a few take-aways from the features mentioned above:</p>
<p><strong>Convention over configuration</strong> – This has been emphasized heavily as a software development paradigm, but it applies to user interface as well: The browser should act on logic defaults without asking, but provide the user with the flexibility to change their mind. A perfect example of this is Safari’s downloading to the Download folder automatically, unless the user choose a different location through the context menu.</p>
<p><strong>Get out of the user’s way</strong> – Do not open additional windows unless specifically asked to (starting the download is not that request). Provide simple, passive feedback that a download has started and that it has finished. Only showing files that have completed downloading is passive feedback that they are ready to be used.</p>
<p>That does it for our summary of the past and present of the download manager in your friend neighbourhood web browser. Next week, I’ll post up a break down of the workflow from a user standpoint and use some of these take-aways to put together a few mocks of my ideal UI. They’re not completed yet, so please feel free to weigh in and influence the result.</p>
Innovation Place menu gadget and the state of iGoogle2008-08-06T00:00:00-07:00http://sean.lyn.ch/2008/08/innovation-place-menu-gadget-and-the-state-of-igoogle<p>I’ve been helping the local guys at VendAsta on their secret project for the last few months. It’s been a great experience working for a Saskatoon-based startup using a lot of really forward facing technologies. It’s also been very cool to work in Saskatoon’s homegrown tech park: Innovation Place.</p>
<p>Innovation Place has all the facilities you’d expect, including a most excellent cafe with daily specials. To help me make the most out of the cafe’s offerings, I hacked together a simple Google Gadget to do the heavy lifting. Fellow IP-ers feel free to add it to your own page.</p>
<p style="text-align: center;">
<img class="aligncenter" src="http://recurse.ca/gadgets/atrium-menu/menu-screenshot.jpg" alt="" /><br /> <a href="http://www.google.com/ig/adde?moduleurl=http://recurse.ca/gadgets/atrium-menu/menu.xml"><img style="width: 104px; height: 17px; border: 0px;" src="http://buttons.googlesyndication.com/fusion/add.gif" alt="Add to Google" /></a>
</p>
<p>I’ve done a few simple gadgets in the past, but this was a good refresher into the current state of gadgets. For those interested, here are a few thoughts on the space:</p>
<ul>
<li>The original Google Gadget API is being depreciated in favour of the gadget.* API specified in OpenSocial. You can take a look at <a href="http://code.google.com/apis/gadgets/docs/dev_guide.html">the new gadget API here</a>. I haven’t done enough digging to figuring out any substantial architectural differences, but please leave a comment if you come across one.</li>
<li>The new Gadget API is not supported on the current version of iGoogle. The<a href="http://google-code-updates.blogspot.com/2008/04/by-saurabh-mathur-igoogle-team-today.html"> iGoogle developer sandbox</a> does, however.</li>
<li>The old documentation used to recommend using Google Pages to store gadget assets. However, <a href="http://www.downloadsquad.com/2008/08/03/google-is-slowly-killing-page-creator-replacing-it-with-sites/">Google’s recent move to kill off Pages in favour of Sites</a> has removed this option for prospective developers. Perhaps Google App Engine could serve a similar purpose?
<ul>
<li>Related thought: Build an GAE application solely to host other people’s gadgets. Static gadgets are simple, but some thought would be needed on the tools required to host dynamic gadgets. Also a way to pass GAE hosting costs on to gadget developers. I’ll have to give this some more though.</li>
</ul></li>
<li>OpenSocial gadgets on iGoogle have a lot of potential. </li>
</ul>
Gripe: XML in Python2008-07-18T00:00:00-07:00http://sean.lyn.ch/2008/07/gripe-xml-in-python<p>I hadn’t even finished writing my post <a href="http://sean.lyn.ch/2008/07/confirming-everything-thats-ever-been-said-about-python/">announcing my new love of Python</a> when I stumbled into one of its skeleton-filled closets: XML.</p>
<p>The Python core libraries include six different methods for parsing and creating XML, none of which feel particularly Pythonic (here I am, three weeks into developing with Python and already I’m calling out core libraries as not being Python-y enough). I missed the low overhead methods I had used in other languages. Particularly for parsing XML, <a href="http://www.ibm.com/developerworks/library/x-simplexml.html">PHP’s simplexml</a> is hard to beat, and for building, it’s hands-down <a href="http://www.xml.com/pub/a/2006/01/04/creating-xml-with-ruby-and-builder.html">Ruby’s XML Builder</a>. Off I went, hunting for Python ports.</p>
<p>Warning: The following is a tangent.</p>
<p>This may be an unfair statement, but I get the impression that there’s a slight “Not built here” bias in the Python world. Python has a substantial number of best of breed functionality, both core and third-party, but my initial impression is that they’re a little reluctant to adopt solutions championed by other languages. Example: Where’s the Python equivlent to CPAN or gems?</p>
<p>Here’s my point: I found Python ports, but they lacked in the qualities I loved about Python. Maturity and Active Development.</p>
<p>First on my list was simplexml for PHP. It allows the developer to access attributes and text through variable and list combination. To get similar functionality in Python, I found <a href="http://nedbatchelder.com/code/modules/handyxml.html">handyxml</a>. Handyxml allows equally brief tree traversal and iteration of multiple items. Unfortunately, it hasn’t been updated since early 2004 and a lot of the dependencies have moved or are gone completely. As such, it required some modifications just to get it into a functional state. Not ideal.</p>
<p>The other functionality I missed was XML Builder in Ruby. XML Builder takes full advantage of blocks in Ruby to allow nesting of xml element creation that makes the structure of the resulting document blindingly obvious in the code. This is in stark contrast to the Java-esque series of createNode, appendNode that Python (and Java and Objective-C) love. I managed to dig up a recent port by Jonas Galvez of <a href="http://jonasgalvez.com.br/log/#2008-07-02T23:25:54-03:00">XML Builder for Python</a>. He took advantage of the upcoming ‘with’ statement in Python 2.6 to achieve the same effect. Though it had some problems handling unicode characters (remind me to submit a patch to github) and the documentation is minimal, I was able to get it up and running very quickly. Better.</p>
<p>I know from my digging in recent weeks that there’s been some talk about refactoring Python’s urllib/urllib2 code for Python 3 to simplify the module and remove duplication. I sincerly hope the XML libraries fall underneath the same knife, and that the solutions from Ruby and PHP are considered for a graph.</p>
Confirming everything that’s ever been said about Python2008-07-16T00:00:00-07:00http://sean.lyn.ch/2008/07/confirming-everything-thats-ever-been-said-about-python<p>As mentioned <a href="http://sean.lyn.ch/2008/06/setting-up-a-professional-python-development-environment/">earlier</a>, I’ve been working on a medium-scale project written in Python. It’s the first time I’ve used python beyond a few lines in a script. After a few weeks of working in Python I returned to an application I had been developing for the Mac in Objective-C over the weekend. It wasn’t until I made the switch back to a “traditional” static typing language that the sheer beauty of Python struck in full force.</p>
<p>It’s really not fair to pick on Objective-C here. A number of languages could sit in its place. Nonetheless, after working with Python for only two weeks, coding in Objective-C felt like being stuck in the middle of a traffic jam where all the other cars are driven by lobotomized chimps.</p>
<p>Every one of my intentions had to be slowly and laboriously explained in great detail to the computer lest I cause a massive digital pile up. To avoid, I was required to take several trips to Apple’s mediocre documentation before I assembled enough square brackets to build the Eiffel Tower. Even once the appropriate method was called, trying to break down the over-abstracted object return types to get the simple data I wanted resulted in so many code-compile-crash loops it hurt.</p>
<p>I wondered how much of my life I had already wasted prefixing all the class names with “NS”, or how many more times I would have to chase down some archaic memory error only to find that I had forgot to put a @ before my string.</p>
<p>Don’t get me started on strings in Objective-C either. I don’t know how the language designers at Apple can respect themselves when it takes almost 50 characters to do a replace (Actual Method Signature: stringByReplacingOccurrencesOfString:withString:), oh and you have to give up backwards compatibility with 10.4 if you want to use it.</p>
<p>This only showed me just how much I loved Python. String slicing. Unicode strings. Dictionaries and Lists everywhere. Generator Functions. List comprehension and filters. Easy to understand/parse syntax. Lots of Third-party modules. With simple APIs. That are open-source. And are actively maintained. Mature. And well documented.</p>
<p>I found myself writing far less code and accomplishing much more. In fact, I distinctly remember feeling excited about just how much functionality I had accomplished in such little time (Django is partly to blame for this).</p>
<p>I has used Ruby a reasonable amount before, but I didn’t fall head over heals largely because of the lack of maturity. The maturity of the documentation of both the core library and third-party modules is one of the most important features of a language for me, and something I missed tremendously coming from a Java background. In fact, I’ve re-written the ruby script that powered my <a href="http://www.google.ca/ig/directory?url=pitchforkreviews.googlepages.com/pitchfork.xml">Pitchfork Reviews gadget</a> to be Python. It took me about 30 minutes.</p>
<p>I’m in love.</p>
Setting up a Professional Python Development Environment2008-06-20T00:00:00-07:00http://sean.lyn.ch/2008/06/setting-up-a-professional-python-development-environment<p>This week I’ve started some development work that has placed me completely out of my comfort zone: Coding on Python on Windows XP. I’ve played with Python on a few small one off apps on my own, but this is the first large scale project I’ve taken on with Python as its base. So although I’m familiar enough with the language to get started, it’s the development environment for writing the code that has me at a loss.</p>
<p>I’ve been trying a myriad of different editors and IDEs trying to find the best tool with the most flexibility. Unfortunately, the two seem to be opposed. I believe this is because my short experience with each tool means the “best” is largely the easiest to use. Easiest to use means more often than not, flexibility is sacrificed for focus. I’ve been through Crimson Editor, JuffEd (which I am keeping around for simple text editing), GVIM, jEdit, Wing, PyScripter, and Eclipse with PyDev.</p>
<p>The other guys on my team are fans of VIM, but I haven’t been able to motivate myself to overcome its learning curve. Not that I have anything against purist coding, quite the opposite in fact. I find the most efficient way to write HTML, CSS, and JavaScript is with a text editor. Most of my PHP work has been done in TextMate (on OSX), but also on a smaller scale. I know I need a few more tools to assist in team collaboration, and I’d prefer having an IDE wrangle them all together.</p>
<p>So I came at it from another angle: What features am I looking for that the programs I’ve seen so far just didn’t manage to satisfy? Well here’s a quick list:</p>
<ul>
<li>See a projects worth of files (in the form of a Project/File browser)</li>
<li>Multiple files open at the same time, managed with tabs</li>
<li>Hotkey/button code execution</li>
<li>Run code through the debugger (not a requisite, but would be useful)</li>
<li>Integration with source control</li>
<li>Pull code documentation from files in project</li>
<li>“Jump to definition” navigation</li>
<li>Indentation management (already a peev)</li>
</ul>
<p>During my research, I found a lot of neat validation-style applications (for my reference: epydoc, pychecker, pylint, pyflake, <a href="http://svn.browsershots.org/trunk/devtools/pep8/pep8.py">pep8</a>, doctest, pyunit, nose, thumb.py, figleaf, coverage.py, pycover). Being able to tie some of these in to a validation process on build or, dare I say inline, would be inter-spectacular.</p>
<p>Does such a beast exist? I’ve spent enough time with Eclipse, I should be able to bludgeon it into doing what I want, but that’s hardly the elegant solution I was hoping for. Come on magical blogosphere, do your thing!</p>
Removing iTunes duplicates2008-06-15T00:00:00-07:00http://sean.lyn.ch/2008/06/removing-itunes-duplicates<p>I recently had to rebuild my iTunes library to solve some weird situation that was preventing my iPhone from syncing with iTunes after a reformat and upgrade. In the process I managed to add about 25 albums to the library twice. Instead of Apple noticing that the action is simply going to result in byte-for-byte duplicates of entire albums, it decides to continue with the addition and just append ” 1.mp3″ to all of the filenames. Why the genius coders over at Apple decided this was a reasonable outcome I’ll never know, but it frustrates a music library neat freak like myself to no end.</p>
<p>After trying to convince various AppleScripts to make iTunes clean itself up, I stumbled across these instructions on the blog of Todd George on <a href="http://www.togeo.com/togeo/wordpress/?p=47">how to find and remove byte-for-byte duplicates from iTunes</a>. It saved my sanity. Note that this simply removes the files from the filesystem, and not the entries from the iTunes library itself. Thankfully, Todd provides a link to a great method of <a href="http://www.paulmayne.org/archives/2007/11/how-to-remove-broken-or-dead-tracks-from-itunes/">finding the now dead entries in your library and removing them</a> WITHOUT any additional scripts or programs. </p>
<p>iTunes is happy again!</p>
World Browser War II2008-06-12T00:00:00-07:00http://sean.lyn.ch/2008/06/world-browser-war-ii<p>Like the invasion of Poland in 1939, it should be apparent to the world now that the second great browser war is upon us. Just look at this last week’s worth of news:</p>
<p>June 10th: <a href="http://www.appleinsider.com/articles/08/06/10/apple_seeds_iphone_build_5a331_os_x_10_6_build_10a96_safari_4.html">Apple releases developer preview of Safari 4</a><br>
June 11th: <a href="http://gearsblog.blogspot.com/">Google Gears 0.3 released with support for desktop shortcuts</a><br>
June 11th: <a href="http://azarask.in/blog/post/firefox-mobile-concept-video/">Firefox Mobile Concept Released</a><br>
June 12th: <a href="http://www.pcmag.com/article2/0,1759,2319851,00.asp">Opera 9.5 released</a><br>
June 12th: <a href="http://www.downloadsquad.com/2008/06/12/mozilla-sets-release-date-for-firefox-3-june-17/">Firefox 3.0 Final Release Candidate Released – 3.0 set for Tuesday June 17th</a> (<a href="http://www.dria.org/wordpress/archives/2008/06/12/655/">guide to new features here</a>)</p>
<p>It’s exciting times for a web developer. Though there have been <a href="http://blogs.msdn.com/ie/archive/2007/12/19/internet-explorer-8-and-acid2-a-milestone.aspx">rumblings</a>, one participant in notably absent from the conflict. Is Microsoft’s Internet Explorer the United States in this analogy or the Switzerland?</p>
iPhone SDK works fine on PowerPC2008-06-09T00:00:00-07:00http://sean.lyn.ch/2008/06/iphone-sdk-works-fine-on-powerpc<p>Well, to be fair, it’s pretty slow, and some other people have ran into some instability, but the iPhone SDK works just fine on my old iBook G4 allowing me to put off that inevitable new hardware purchase just a little bit longer. Thanks to <a href="http://blog.gordonturner.ca/">Gordon Turner</a> for the tip. Looks like this WWDC ticket just paid for itself!</p>
<p>How-tos are located <a href="http://3by9.com/85/">here</a> and <a href="http://www.tbradford.org/2008/03/iphone-sdk-beta-2-possible-ppc-fix.html">here</a> (do both, the second is a little bit of clean up detail omitted from the first).</p>
<p> </p>
I rolled up the rim and won! Tim Hortons Garmin Nüvi 2502008-04-21T00:00:00-07:00http://sean.lyn.ch/2008/04/tim-hortons-garmin-nuvi-250<p>Though it’s been a poor season of roll up the rim to win for myself, my parents managed to snag one of the Garmin Nüvi 250 GPSs. I’m heading on a Canadian coast-to-coast roadtrip this summer and my parents graciously offered their prize to help make sure I don’t get too lost on the way. </p>
<p>The 250 is very thin. The outside sports an SD card reader, mini-USB port, and power switch. Booting it up for the first time, I was surprised to find that Tim Hortons had gone to the trouble of branding the Garmin with a Tims logo at the start. My roommates joked that it might also have a “Find the nearest Tims” button. We were even more shocked to find that it actually does.</p>
<p><center>
<br /> <a href="http://www.flickr.com/photos/imlynch/2432618387/" title="Boot up by lynch, on Flickr"><img src="http://farm4.static.flickr.com/3286/2432618387_fc5c4a183d_m.jpg" width="240" height="166" alt="Boot up" /></a><br /> <a href="http://www.flickr.com/photos/imlynch/2432618389/" title="Tim Hortons Button by lynch, on Flickr"><img src="http://farm4.static.flickr.com/3210/2432618389_21563e96fb_m.jpg" width="240" height="176" alt="Tim Hortons Button" /></a><br /> <a href="http://www.flickr.com/photos/imlynch/2432618391/" title="Pretty Cool Huh? by lynch, on Flickr"><img src="http://farm4.static.flickr.com/3219/2432618391_29acb87e7f_m.jpg" width="240" height="180" alt="Pretty Cool Huh?" /></a><br />
</center></p>
<p><a href="http://garmin.blogs.com/my_weblog/2008/02/tim-hortons-pro.html" target="_blank">According to Garmin</a>, they’ve customized it to include more than 3000 locations. For me, it seems to display the ten or so closest results, the furthest away being 12 km (gives you an idea of the saturation of Tim Hortons in Southern Ontario). It’s a very cool feature, and makes these GPS prizes pretty unique for the winners.</p>
<p>I noticed that plugging the Garmin into my laptop to charge mounted the filesystem, which let me poke around for what makes the Tim Hortons GPS special. As far as I can tell, the main directory has a number of .<a href="http://www.gpspassion.com/forumsen/topic.asp?TOPIC_ID=83384" target="_blank">img files that store the map data</a>. By process of elimination, it looks like the Tim Hortons data is stored in a file called gmapoem.img. This is a <a href="http://www.gpspassion.com/forumsen/topic.asp?TOPIC_ID=99575" target="_blank">known filename for dealer customizations</a>, and a quick look through a hex editor of my copy shows a few “TIM HORT” strings in the mix.</p>
<p>Seems like any Garmin owners should be able to get the same “Tims button” by adding the gmapoem.img file. If there are any interested participants, leave a comment and I’ll send you a copy of the file to confirm this.</p>
<p>Beyond that, looks like this gadget has a number of avenues of customization and a features I haven’t discovered yet. As interesting things crop up, I’ll be sure to publish my findings.</p>
Transmission returns as the best BitTorrent client for OSX2008-03-29T00:00:00-07:00http://sean.lyn.ch/2008/03/transmission-returns-as-the-best-bittorrent-client-for-osx<p><a href="http://www.transmissionbt.com/">Transmission</a> has been a favourite BitTorrent client of mine for a long time. Its compact design, complete feature set and small memory footprint are much preferred over the bulky Azureus. Unfortunately, somewhere after v0.7, it lost its high-performance ways and I had to switch back to Azureus just to get my downloads to work. I’m happy to report that it’s back, better than ever post-v1.0 (Now at v1.10).</p>
<p>I recommend any Mac owner check it out for their BitTorrent needs. It’s now also available on Linux/*BSD so I suspect they can experience the same joy</p>
Apple will block any Music apps on iPhone/iTouch2008-03-20T00:00:00-07:00http://sean.lyn.ch/2008/03/apple-will-block-any-music-apps-on-iphoneitouch<p>When Apple announced their SDK for the iPhone, I immediately got caught up on Apple’s insistence that all applications must be distributed through their App Store, not only because developers have to pay $99 a year to put any application (free or not) on the store, or that Apple gets a 30% cut of any profits made, but also that they get veto power on any and all application.</p>
<p>Apple says this is for your own good. It allows them to protect you from any malicious applications. Of course, they can also block any SIM unlock programs. They got a little fascist with their “No Porn” declaration, and they left the door open to turn away any “unforeseen” application that doesn’t meet their high standards.</p>
<p>Turns out Music apps fall in that category. iPodNN reports that <a href="http://www.ipodnn.com/articles/08/03/19/music.vs.iphone.sdk/">Music functions are off-limits to iPhone SDK developers</a>. This means that I can’t use anything but iTunes to listen to my tunes, even if I’m not satisfied with the client (I’m not BTW), I can’t use anything but the iTunes Wireless store, even if Amazon wanted to open their store to the platform too, and I can’t use any interesting musical support applications like Last.fm to track my usage. That’s a whole lot of can’ts for something that’s supposed to revolutionize the platform.</p>
<p>I’m looking forward to the day when I can replace my iPhone with something Android-based and not feel like I’m being herded for my own good by Apple.</p>
The reason Microsoft is boned with or without Yahoo2008-02-15T00:00:00-08:00http://sean.lyn.ch/2008/02/the-reason-microsoft-is-boned-with-or-without-yahoo<p>News on the Microsoft front today is Steve Berkowitz, senior vice president of Microsoft’s online business group, getting the boot. His replacement: <a href="http://biz.yahoo.com/rb/080214/microsoft_management.html?.v=2">this guy</a>. His name is Brian McAndrews. He’s the former CEO of aQuantive, that big ad agency MS bought months ago.</p>
<p>Brian has a <a href="http://www.forbes.com/finance/mktguideapps/personinfo/FromPersonIdPersonTearsheet.jhtml?passedPersonId=938403">Forbes.com profile</a>, no Wikipedia page.</p>
<p>I cannot imagine how a company full of such delightful and intelligent folk can be led by management so disconnected with reality. I’m a generous guy, so I’ll wave the consulting fee this one time.</p>
<p>Microsoft, the reason your online division isn’t profitable is because your products are mediocre on a good day and no one is interested in using them, and not because you don’t have enough ads on them already. Putting an ad executive at the top of the division is about the worst thing you could possibly do.</p>
<p>Now those people protesting the merger on Flickr have something to be genuinely concerned about.</p>
Microsoft wants Yahoo! bad2008-02-03T00:00:00-08:00http://sean.lyn.ch/2008/02/microsoft-wants-yahoo-bad<p>Besides yesterday being the most undeserved snow day in Waterloo history, it was also MS’s turn to drop a mighty news making bombshell: Microsoft bid $44.6 Billion for Yahoo. I figured <a href="http://arbyte.us/blog_archive/2005/11/drevil_million_dollars.jpg" rel="prettyPhoto[37]">Dr. Evil would be appropriate</a>.</p>
<p>This is the sort of news that gets my geek blood pumping. An event like this sends millions of different wavelengths of possibility flying in every direction, interfering constructively and destructively in peaks of likely outcomes. The analysits are doing their absolute best to help point them out too: <a href="http://seekingalpha.com/article/62767-microsoft-yahoo-will-google-play-spoiler-and-bid-also">Will Google bid too?</a> <a href="http://seekingalpha.com/article/62765-news-corp-scrambling-to-bid-for-yahoo">Maybe News Corp. will</a>. What does Microsoft gain? Is this the end of Google’s dominance? Will Yahoo employees even want to work for Microsoft? It might be better than <a href="http://www.nytimes.com/2008/01/22/technology/22yahoo.html?bl&ex=1201150800&en=0019b93b4bb1c219&ei=5087">getting canned outright</a>.</p>
<p>To be fair, Yahoo has some great properties that Microsoft would be well guided to leave the hell alone. Let’s see here: Flickr, Upcoming, Yahoo Mail, Finance, Music, IM, etc. Of course, this would only compound the absolute most frustrating thing about working at Microsoft: If you’re working on a project, chances are there are at least two other groups in the company doing the same thing. Adding a parallel internet product offering stack is not going to make the situation better. Even if Microsoft’s essentially admitting defeat in the race for internet viewer keystrokes, you can be sure it’ll be Yahoo products that get the axe before equivalent Microsoft ones.</p>
<p>What I wouldn’t give to be back at Google when Marissa Mayer gives the “This is our position” talk to the PM corp. Or to be a fly on the wall as Jerry Yang decides what to do with the offer, or Steve Ballmer waits for the response. It’s hard to under emphasize the effect this offer will have on the tech landscape. I’d be wise to actually make the effort to organize my thoughts and the ones on the other news site. Somebody will write a book about this and make a whole lot of money. Might as well be me. I sure as hell didn’t make any when Yahoo!’s stock jumped 50% yesterday.</p>
OSX 10.5 not ejecting mounted .DMGs2007-11-08T00:00:00-08:00http://sean.lyn.ch/2007/11/leopard-not-ejecting-mounted-dmgs<p>I’ve found that Mac OSX 10.5 (Leopard) isn’t always ejecting mounted DMG files in the usual methods (i.e. dragging to trash, right clicking and choosing eject, you know, the way it should work).</p>
<p>I found the following command works until Apple fixes the bug. Next time, I’ll also try using Disk Utility (thanks to the guys on <a href="http://discussions.apple.com/thread.jspa?messageID=5794975">Apple support forums</a> for both tips).</p>
<blockquote>
<p>Open up a terminal, cd to /Volumes, get the name of a mounted DMG file, and try like this:</p>
<p>(in my case the volume was /MailTags2.2b4):</p>
<p>maggie:Volumes blloyd$ hdiutil detach MailTags2.2b4<br>
“disk1″ unmounted.<br>
“disk1″ ejected. </p>
</blockquote>
<p><a href="http://discussions.apple.com/message.jspa?messageID=5678263#5678263">Link to specific message</a></p>
Why iTunes should be genuinely concerned about Amazon2007-10-01T00:00:00-07:00http://sean.lyn.ch/2007/10/why-itunes-should-be-genuinely-concerned-about-amazon<p>A proper review of the Amazon music store is en route, but I wanted to separate the review of where it is now and where I think it’s going to be.</p>
<p>Amazon’s not building a music store so much as a platform. All of the elements are now in place to allow anyone to set up a simple music store interface that can be accessed by millions.</p>
<ul>
<li><a href="http://www.amazon.com/gp/browse.html?node=16427261">S3</a> – Amazon’s “in the cloud” storage service provides storage for any MP3 store owner’s collection.</li>
<li><a href="http://www.amazon.com/b?ie=UTF8&node=342430011">FPS</a> – Amazon’s online payment system geared specifically towards micro transactions let store owners charge as much or as little as they want.</li>
<li><a href="http://www.amazon.com/b/ref=gw_br_mp3/103-6105338-3271015?%5Fencoding=UTF8&node=163856011&pf_rd_m=ATVPDKIKX0DER&pf_rd_s=left-nav-1&pf_rd_r=0G1Y3J5SW5P7Q1MVKWTN&pf_rd_t=101&pf_rd_p=313702901&pf_rd_i=507846">MP3 Download Portal</a> – The store front, complete with search, previews, and reviews. </li>
</ul>
<p>You don’t even need to think of store owners on the scale of labels. A band can simply open up shop on Amazon and start selling their wares to interested fans, right along side the big names without having to reinvent the architecture.</p>
<p>The only stumbling block Amazon may face is the link between the website and the media player application. Amazon’s download manager is a good first step, but it needs to integrate further into all popular media player applications not just iTunes. Winamp, Amarok, Windows Media Player, and Songbird all come to mind. The less the user has to be concerned about the transition from purchase click to listen, the more likely they’ll click at all.</p>
<p>If Amazon positions itself correctly, it could do what so many online music stores before it couldn’t: Actually compete with iTunes.</p>
Yahoo Tech Talk: The JavaScript Programming Language2007-05-05T00:00:00-07:00http://sean.lyn.ch/2007/05/yahoo-tech-talk-the-javascript-programming-language<p>Douglas Crockford, Yahoo!’s JavaScript Architect, gives a great introduction to “the world’s most misunderstood programming language.”</p>
<p>It’s a four part-er so I’ve included the links for your benefit rather than a mass embedding of the videos:<br>
<a href="http://video.yahoo.com/video/play?vid=111593">The JavaScript Programming Language (1 of 4)</a><br>
<a href="http://video.yahoo.com/video/play?vid=111594">The JavaScript Programming Language (2 of 4)</a><br>
<a href="http://video.yahoo.com/video/play?vid=111595">The JavaScript Programming Language (3 of 4)</a><br>
<a href="http://video.yahoo.com/video/play?vid=111596">The JavaScript Programming Language (4 of 4)</a><br>
<a href="http://yuiblog.com/assets/crockford/javascript.zip">Presenation slides (Warning: ZIP link)</a></p>
<p>I highly recommend you watch it all. There is much in the way of background explaining just why features of JavaScript ended up the way they are, and a lot more to help Java veterans like myself create a proper mental model for JavaScript development.</p>
<p>Doug has also presented “Theory of the DOM” and “Advanced JavaScript” neither of which I have had the chance to take in yet. You can check them all out on <a href="http://video.yahoo.com/?t=t&p=douglascrockford">Yahoo! Video</a>.</p>
<p>Side note: I don’t like Yahoo! Video nearly as much as its competitors. The base player stalled out on me and wouldn’t let me advance to my previous place in the video when I restarted. I suspect it’s linearly buffering the content in the background and that was the issue, but there’s absolutely no indication that I’ve run out of buffered content or how much buffering has been completed.</p>
Installed: Camino 1.1 beta2007-03-11T00:00:00-08:00http://sean.lyn.ch/2007/03/installed-camino-11-beta<p>I have more web browsing software in my Applications folder than any sane person should have. The usual suspects of Safari and Firefox, Internet Explorer Mac 5 (just in case…), Flock, Opera, and OmniWeb. Missing for whatever reason was Camino.</p>
<p>Camino is a Mac-only browser implementation on top of the Mozilla core which powers Firefox. Essentially, you get the best of both worlds: The power of the Gecko rendering engine and the tight integration you’d expect from a Mac only app.</p>
<p>I can’t explain its absence. I may have tried an earlier version, who knows. In fact, it wasn’t until I watched Mike Pinkerton’s <a href="http://video.google.com/videoplay?docid=6765603919277760697">presentation on the history of Camino</a> that I decided to (re-)give it a go.</p>
<p>And I’m impressed so far. The load times are noticeably faster than Firefox, and the memory footprint seems smaller (though not as much smaller as I expected after dumping all of Firefox’s cross-platform interface stuffing). There are still some stability issues to be ironed out.</p>
<p>I’ve also filed my first feature request. As I wrote before, I am in absolute love with how Safari handles PDFs. Though Camino boasts about harnessing the true power of OSX, they still turn a blind eye to PDFs.</p>
<p>So I filed my first feature request bug with Camino. It promptly got marked as a duplicate. I didn’t think I’d be the first one to <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=91559">miss Safari’s perfect PDF functionality</a>. I hope anyone that stumbles upon this article will do both of us a favor and go “Me too!” the feature.</p>
<p>The reason they haven’t added the feature is that OSX’s PDFKit is a 10.4+ feature only and Camino boasts support for 10.2 and up. Legacy support is a sensitive subject depending on which side you’re on so I understand the Camino devs being hesitant to leave users behind. I just wonder how much of the user base is still that far behind? I don’t want to have to wait till Camino 2.0.</p>
<p>Interesting note: The dictionary that Camino uses for its in-line spell checking says the word “Camino” is incorrect.</p>
That’s all she wrote!2007-03-05T00:00:00-08:00http://sean.lyn.ch/2007/03/thats-all-she-wrote<p>The interview and offer round for my sixth and final co-op term has come and gone.</p>
<p>Summary: I wish all co-op terms were 6th round co-op terms.</p>
<p>I knew going in that this round would be different. With a year and a half of experience, and two “Outstanding” ratings from my last two terms at Business Objects, I was pretty confident I’d have some impressive offers. I decided to limit the number of applications to avoid being overwhelmed with interviews. This was a very wise move.</p>
<p>I applied to 13 companies (15 positions in total)</p>
<p>Amazon (Seattle)<br>
Apple x2 (California and Vancouver)<br>
Christie Digital Systems (Kitchener)<br>
Google x2 (Both in California)<br>
IBM (Germany)<br>
Infosys Technologies (India)<br>
Kaleidescape (Waterloo)<br>
Microsoft (Seattle)<br>
Nortel Networks (Ottawa)<br>
Oculus (Toronto)<br>
Pacific & Western Bank Of Canada (Saskatoon)<br>
Pandora (California)<br>
Sydus (Singapore)</p>
<p>Note: Pandora was not through JobMine (University of Waterloo’s co-op system)</p>
<p>Pandora didn’t actually have a co-op program when I approached them and I couldn’t get them rolling in time sadly. I didn’t hear back from Apple California, one of the Google positions, Infosys, and Nortel (probably because I got too frustrated with Nortel’s application site and didn’t submit my resume outside of Jobmine).</p>
<p>I had interviews with 10 of the companies. Some of them went better than others. I did better than I had hoped in the technical ones, which is always a nice sign.</p>
<p>Ironically, when it came to offer time, I got an offer from every company I interviewed with except Apple. This is ironic because Apple was by far my first choice and one that I had spent significant amount of time smoozing with.</p>
<p>I also had a few great compliments over the process:</p>
<ul>
<li>One of my interviewers said that I had “the most beautiful resume he had ever seen”</li>
<li>This was the first term that one of my interviewers had offered me the job straight up in the interview</li>
<li>After an interviewer had quoted their co-op weekly wage during an interview, they emailed me to offer me a substantial increase on that number if I took the position</li>
<li>A company strategically revoked an offer to me after they explained that “I was a highly desirable candidate,” and that I was “unlikely to accept the position.” Which, although the company was very interesting, was ultimately true.</li>
</ul>
<p>Each of the companies had a lot offer: Very interesting products and technologies, opportunities for travel, relocation to exotic locales, more than generous compensation, on and on and one.</p>
<p>I’d like to say it was a tough decision, but to be absolutely honest, once I knew what companies were giving me offers, there was only one choice:</p>
<p>Google</p>
<p>Even when people found out I just had an interview with Google, I had people coming up to me and congratulating me. Google is <em>the</em> tech company right now. To be honest, I don’t have any expectation to return after I graduate (though I don’t rule it out). I would really like to work for a smaller company or start-up come graduation time.</p>
<p>For me though, I need to see what all the fuss is about. Not just at Google but Silicon Valley, San Fran, everything. Though these things change quickly in my industry, right now, Google is my Mecca, and I got offered an all expense paid pilgrimage.</p>
Multi-touch interfaces (re)gaining relevance2007-03-02T00:00:00-08:00http://sean.lyn.ch/2007/03/multi-touch-interfaces-regaining-relevance<p>A lot of excitement surrounds multi-touch interfaces, partially because of the iPhone and partially because the technology is starting to get cheap enough to be realistic.</p>
<p>Here’s a collection of related links I’ve stumbled upon lately (and a few from the past)</p>
<p><a href="http://ted.com/tedtalks/tedtalksplayer.cfm?key=j_han&flashEnabled=1">Jeff Han’s original TED talk</a><br>
<a href="http://www.bassictech.com/blogs/bassictech_news_blog/archive/2007/01/20/remapping-the-universe-using-this-gui.aspx">More of Jeff’s work</a></p>
<p><a href="http://www.engadget.com/2007/03/01/apples-next-big-move-multitouch-displays/">Speculation that Multi-touch is Apple’s next big move</a><br>
<a href="http://tinker.it/now/2007/02/28/multitouch-table-experiment/">How to build your own Multi-touch interface</a></p>
<p>Multi-touch communities:<br>
<a href="http://www.multitouch.nl/">Multi-touch interfaces and usability</a><br>
<a href="http://nuigroup.com/">NUI Group</a></p>
Google Apps Premiers2007-02-23T00:00:00-08:00http://sean.lyn.ch/2007/02/google-apps-premiers<p><a href="http://googleblog.blogspot.com/2007/02/google-apps-grows-up.html">Google announced today</a> the roll out of the enterprise version of their Google Apps package: Google Apps Premier Edition. <a href="http://www.downloadsquad.com/2007/02/22/reaction-to-google-apps-premier-edition/">Download Squad</a> and <a href="http://www.saasblogs.com/">SaaS Blog</a> have pretty good round-ups on the reaction across the net, and the reaction has been wide spread.</p>
<p>Google’s not the first to tackle this problem. <a href="http://www.thinkfree.com/">ThinkFree</a> and <a href="http://www.zoho.com/">Zoho</a> already have mature offerings. Hell, even Microsoft has their <a href="http://officelive.microsoft.com/">Office Live Premium</a> ($39.95/month). Features vary (Zoho has presentations, MS handles mail and web only). There is obvious demand and interest for such a product. So why is has Google’s entry got enterprises lined up do hand over their data?<br>
<!--more--></p>
<p>Just the name.</p>
<p>Google’s Vice President of Engineering Doug Merrill says that “for the first time, consumer-grade applications are good enough that they can be used by enterprises,” but he’s wrong. They’ve been good enough for a while. For the first time, the applications are backed by a big enough name that enterprises are willing to trust the provider, especially now that the company is asking a fee for the service – a marked departure from the typical web 2.0 business plan.</p>
<p>But not everybody’s ready to dump their exchange server and climb aboard the Google Apps train. There are three problems Google is going to have convincing most companies to switch.</p>
<p><strong>Here’s the first:</strong> Google (or anyone else) is going to be hard pressed to match the flexibility of a thick-client productivity suite in a web browser. This is the number one reason people shrug off Google Apps. Some may counter and say “well, 80% of users only use 20% of the functionality,” but it’s never the same 20%. Chances are 80% of the users are going to be slightly annoyed that they can’t find [insert feature here], the other 20% won’t even consider it.</p>
<p>The fix? Well, it depends if you consider it a problem. Google doesn’t. Google has repeatedly said (even after the announcement of PE) that they aren’t aiming to take market share from Office. And there is absolutely no reason that the two can’t exist side-by-side.</p>
<p>I am willing to bet that within a year, Google will release a plug-in for Office that wires the current working Word/Excel/PowerPoint (presentations are coming – don’t worry) document right into Google Apps. Extrapolating, it’s only a matter of time before similar plug-ins are available for all the major productivity suites such as OpenOffice and iWork. Imagine no more file incompatibility issues, the filetype is always Google.</p>
<p><strong>Problem Two:</strong> A good number of companies will not feel comfortable having all their sensitive business data floating around outside their network.</p>
<p>Instead of sending your information out to Google, bring Google in with your information (if it isn’t already). Google already offers Google-in-a-box search appliances. There’s nothing stopping them from just installing Google Apps on one of their machines you’ve already got in your wired up to your existing network if that’s what you prefer.</p>
<p><strong>Problem Three:</strong> Connectivity</p>
<p>If your office makes the move to Google Apps and the connection to the web goes down, you’re effectively boned. And it’s even more frustrating if the outage is at Google’s end and out of your control. <a href="http://www.salesforcewatch.com/2005/12/user_reaction_t.html">Salesforce.com has already run into this</a>. Google’s 99.9% uptime may not be good enough.</p>
<p>But this problem has a solution on the way. Robert O’Callahan of Mozilla recently announced that <a href="http://www.readwriteweb.com/archives/firefox_3_offline_apps.php">Firefox 3 will support offline applications</a>. Properly instrumented, users may not even notice the disconnection.</p>
<p><strong>Where Google Apps will win</strong><br>
Features. New ones.</p>
<p>Google will easily convince CIOs everywhere with their $50/user-year price tag, but they’ll have a riot on their hands if the end users are frustrated by the experience. Google makes very user friendly software, but I’m more concerned about the temptation to try and match Word feature-for-feature and ending up with ones that translate poorly onto the web.</p>
<p>The key is to offer features that are useful, but that users can’t find anywhere else. Google’s already hitting this with their very well done Online Collaboration tool and the automatic revision history (something that should have been implemented in Office long ago).</p>
<p>I’m also excited to see what Google does with their APIs. Integration with the other SaaS movers and shakers such as <a href="http://www.salesforce.com/">Salesforce.com</a> or <a href="http://www.crystalreports.com/">CrystalReports.com</a> will be a tougher feature to match at the packed software level. Expect people to jump the MS ship just for that.</p>
<p>Heads up to opportunists: Learn Google Apps APIs as soon as you can. I have a hunch that integration and migration to Google Apps will be problems looking for solutions in no time at all.</p>
Interesting News Round-up2007-02-21T00:00:00-08:00http://sean.lyn.ch/2007/02/interesting-news-round-up<p><a href="http://www.michaelgeist.ca/index.php?option=com_content&task=view&id=1719&Itemid=125">Puretracks – Canadian Online Music Retailer goes DRM-less on indie offerings</a><br>
<a href="http://www.cbc.ca/canada/saskatchewan/story/2007/02/21/nb-moosehead.html?ref=rss">Moosehead tackles last Canadian holdout: Saskatchewan</a><br>
<a href="http://www.tuaw.com/2007/02/21/itunes-tip-sort-by-album-is-smarter-than-you-think/">How to get iTunes to sort your albums (almost) exactly how you want it</a><br>
<a href="http://www.autoblog.com/2007/02/21/ariel-atom-experience-coming-to-a-city-maybe-near-you/">Ariel Atom coming to Canada for a test drive</a><br>
<a href="http://daringfireball.net/2007/02/dynamic_scripting_languages">Dynamic languages hitting home on the desktop</a></p>
US media conglomerate not making nearly enough money2007-02-15T00:00:00-08:00http://sean.lyn.ch/2007/02/us-media-conglomerate-not-making-nearly-enough-money<p>The IIPA, a powerful group representing Software, Movie, and Music companies <em>in the states</em> wants <a href="http://www.theglobeandmail.com/servlet/story/RTGAM.20070214.wblacklist14/BNStory/National/home">Canada black-listed</a> alongside Russia, China, and Belize for not *modernizing* our copyright policy.</p>
<p>I believe that Canada’s copyright policy is acceptable and properly protects fair-use rights. My fellow Canadians should be damn happy the CRIA can’t just sue the pants off anyone who owns an iPod like the RIAA does in the states.</p>
<p>I can’t sum up how ridiculous this is enough to do it justice, so I’ll let poster “rumblin’rabbit” on the slashdot article do it instead:</p>
<blockquote>
<p>“So they want Bush to blacklist Canada, their biggest trading partner (last I heard), their NATO ally, whose troops are now fighting in Afghanistan against the Taliban, possessor of the second largest petroleum reserves in the world, and whose government is one of the very few who are not overtly hostile to the Bush administration?</p>
<p>Over video games?</p>
<p>Cool.”</p>
</blockquote>
<p>Let your MP know that you do not respect a Government that bows to every US whim. While you’re at it, ask them to can Bev Oda, before the <a href="http://www.michaelgeist.ca/content/view/1529/135/">media companies buy her soul</a>.</p>
<p>And would someone please <a href="http://www.michaelgeist.ca/">put Michael Geist in charge of copyright legislation</a>?</p>
Enterprise-y2007-01-05T00:00:00-08:00http://sean.lyn.ch/2007/01/enterprise-y<p>My Team Lead asked me to do a little digging into Service Oriented Architecture before my co-op term wrapped up. I got a copy of <a href="http://www.amazon.com/dp/0131858580">Service-Oriented Archiecture by Thomas Erl</a> from the library and starting flipping through it. Some CTO/CIOs don’t understand their developers disdain for Enterprise buzzwords, but I can sum this one up for them in one sentence I discovered in Erl’s text (top of page 37):</p>
<blockquote>
<p>“The application of service-orientation principles to processing logic results in standardized service-oriented processing logic.”</p>
</blockquote>
<p>At first glance, it reads like an impressive sales pitch. But at second, you realize there is absolutely no content whatsoever in that sentence. None. It is completely devoid of any useful information. Coders find beauty in simplicity. Enterprisiness is anti-beautiful.</p>
Much Ado About Agile Conference ’062006-11-19T00:00:00-08:00http://sean.lyn.ch/2006/11/much-ado-about-agile-conference-06<p>My very first tech conference has come and gone. Agile was about as good of a subject as any to start with. We use Scrum at work, but I walked into it by accident; I don’t have any formal Agile background, so it was great to get a little more feel for the depth and breadth of the area.</p>
<p>We don’t follow Scrums practices religiously, instead we concentrate on the principles. We’ve adopted the daily stand-up meetings and the concept of a product backlog, but we have tweaked it quite a bit to allow us to scale the team to the size it is now. I was comforted to hear that most people are using their own version of Agile rather than big bang adopting one laid out by the book.</p>
<p>For the most part, I stuck to the “People trump Process” track, which concentrated mostly on project management. A lot of good war stories, especially by Carl Schmidt (Riptown Media), although maybe it was just his fancy Mac presentation.</p>
<p>I was a little bit disappointed by the amount of concrete value of some of the presentations. For example, Linda Rising gave the Keynote for the second day on The Power of Retrospectives. Now, I’ve never heard of Retrospectives as a software technique, but it took me about half the presentation to realize all she was talking about was reflecting on past projects. She did talk a bit about a technique for using timelines to help, but I would have like to get more information on all the concepts that fall under the Retrospectives umbrella. If there are two books on it, then there’s got to be more meat to add to her presentation. I found Mary Poppendieck’s “Why Agile” was also a bit light on the concrete tools stuff, although the history of software processes was very interesting.</p>
<p>My first exploration of the “Tools and Techniques” track wasn’t until the second day with Scott Ambler’s “Agility in the Database” which I thoroughly enjoyed. I haven’t done a whole lot of database work, but I’m considering picking up his Refactoring Databases book as an idea of what sort of problems I may want to watch out for when I do any simplistic design.</p>
<p>Scott’s talk on “Time to Address the Uncomfortable Issues We’d Prefer to Avoid” was good, although I disagreed with a few points he had. I’ll address them in a separate post though.</p>
<p>All in all, well worth the student rate. Next year, maybe they’ll have more comfortable chairs.</p>
Motorola does something very right2006-10-31T00:00:00-08:00http://sean.lyn.ch/2006/10/motorola-does-something-very-right<p><img src="http://www.techtickerblog.com/wp-content/uploads/2006/07/motofone.jpg" align="left" height="144" width="144" />Yes, the RAZR has been an iPod scale hit. ROKR less so , though a step in the right direction. And my personal favourite, the SLVR, has been doing well for itself too.</p>
<p>But Motorola has completely outdone itself now with what they’re calling the Motofone, which is what I’ve been asking for all along: just give me a good, solid phone. No Video taking, Britney Spears playing, light show raving, king of none phone for me. I just want something to store my numbers and sound reasonable.</p>
<p>Motorola realized that I’m not crazy, built one, and then made it pretty, and now they want to charge me $50 straight up, not after handing over my first born to the cell phone companies.</p>
<p>Not only am I going to buy one as soon as it is available, but if there ever was a phone to start a co-op wireless network with, this would be it. I wonder if Nortel would want to donate a GSM tower…</p>
Ode to not the cell phone companies2006-10-23T00:00:00-07:00http://sean.lyn.ch/2006/10/ode-to-not-the-cellphone-companies<p>I hate cell phones. It’s unfortunate, because I am a huge gadget fan. I don’t hate cell phones for the technology and shinyness. I hate the bullshit that comes with them.</p>
<p>I hate when people drive while talking on their cell phones. I hate when people talk on their cell phones on the street loud enough for everyone to hear that they’re being dumped. But most of all, I hate cell phone companies.</p>
<p>Disclaimer: I own a cell phone. I have no land line in Vancouver so this is the only way my parents can get a hold of me. It’s a Rogers pay as you go phone. I was given the phone for free and bought the SIM card on Craigslist.</p>
<p>The local Rogers cell phone shop comes by our company every few months to offer employee pricing on plans and phones. I went down and talked to one of the guys who came to the building to take a look at the deals. At first, the deal looked quite reasonable. $20 a month for a quite a few minutes, free evenings and weekends, etc etc. I told the guys I’d think on it and would stop by their shop after work.</p>
<p>A did a bit of digging back at my desk and came up with some concerns. I liked the Motorola L7 they had on discount, but I really wasn’t looking to replace my iPod and for the price I know I’d be happy with the L2. If I wanted to go all out, I’d be looking at the SE 810i because of the 2 Megapixel camera. I also wanted to know what my final monthly bill would be, considering all the various rebates and promotions. I just wanted a single number. I went back to the shop with the intention of buying a phone and a 2 year plan. I left with nothing.</p>
<p>I asked, pointing to they flyer they had given me, “What are these fees you mention here in the fine print?” The guy I was dealing with said flat out, “Don’t worry about those.” Now I wish I was quicker on my feet because I should have said “So you’ll cover them with the deal then.” But I just stood there, awestruck. I mentioned I’d be looking at the L2 and I actually had to fight with him to stop trying to sell me the L7. Instead he just wanted to sell me the POS phone they were almost giving away with the plan, one that I wasn’t really looking forward to hauling around. I was told shouldn’t worry about needing caller ID or long distance either, just go with this plan now and then figure out later what I might actually need. After 15 minutes of trying to get straight answers from numb nuts, I thanked him for his time and left.</p>
<p>I know used car salespeople that aren’t that pushy. In fact, I don’t know one that is.</p>
<p>What kind of industry needs to bind their customers in 3 year terms in order to make profit? Why are customers so desperate to leave that they have to be legally tied to stay? How come looking for a cell phone carrier is really just a competition to see who sucks less? All of this frustrates me to no end. I’m a gadget guy, I like the idea of cellphones, but I cannot bring myself to deal with the high pressure scare tactics that the carriers employ on a daily basis.</p>
<p>I think car salespeople used to be synonymous with this kind of consumer experience, but they’ve grown past this stage. It’s time for a new provider to adopt the Toyota model. Or the credit-union model. Someone please give me an alternative to the lesser of three evils situation I’ve got right now.</p>
Tangerine goes Beta2006-10-20T00:00:00-07:00http://sean.lyn.ch/2006/10/tangerine-goes-beta<p>I wonder why it is that Windows apps have brutally straight forward names like MP3 Tagger and Windows Journal and Mac apps have names like Tangerine. Do Mac developers strive to make their names as unrelated as possible? I have to know these things if I’m going to become one <img src="http://sean.lyn.ch/wp-includes/images/smilies/icon_smile.gif" alt=":-)" class="wp-smiley" /></p>
<p>Here’s the money shot: Tangerine does cool stuff with your iTunes library that would have taken you way to long to do yourself. Sort of like SoundFlavor (I guess… my PC owning buddies have been rubbing that one in my face for a few days now). Get on the free beta <a href="http://www.potionfactory.com/blog/2006/10/18/introducing-tangerine/">here</a> or better yet, get yourself a license for blogging about it.</p>
<p>Tangerine is a tool that analyzes the songs in your iTunes music library by beat intensity (amplitude?) and allows you to create playlists by specifying ranges of BPM and intensity and then making arrangements of songs based on your parameters. For example, you can create a playlist that starts with slow tempo music and then builds in the middle, effectively making a perfect (and random) workout soundtrack.</p>
<p>But keep in mind, it’s beta software. It’s hard to tell at first though (I’m really impressed how fast it flew through my music collection).</p>
<p>Things to watch out for:</p>
<ul>
<li>Since Apple in their infinite wisdom decided to store album art work outside of files, it appears that any albums you’ve tagged with Artwork using the iTunes get album feature won’t properly display in Tangerine. It’s too bad too, the playlist view is very very cool. It would be even cooler without all the ‘?’. Hey, do Apple one better, want to go populate those BPM fields on my songs for me? I know I’m not going to…</li>
<li>Tangerine seems to have trouble with some of my songs. Sometimes it evaluates the BPM incorrectly (fast for slow, slow for fast), but worse is that I think it fails on some of my songs. Instead of indicating that, however, it just doesn’t show them in the library. I can only assume that’s why they aren’t here.</li>
<li>I really wish I could simply drag a song in and then have Tangerine generate a playlist based on that first song. Sort of like Pandora but for iTunes. I don’t really need songs that rise and fall over the course of the playlist, but if it’s raining in the morning. I’d love to be able to tell Tangerine just to give me a bunch of songs based on this one Sufjan Stevens track and throw it on my iPod. Which leads me to…</li>
<li>Yep it’ll save the playlists back to iTunes, but I wish I could save it directly to the iPod. Technically Tangerine should just be a plug-in to iTunes, but I think they’re quite limited by Apple’s API so I understand why it’s a seperate app. Still, I don’t want to have to switch between them if I can avoid it.</li>
</ul>
<p>As always, things are bound to change between now and 1.0. I’ll give you an update once it comes out. Definitely give it a sneak peak while you can though. The UI is tres pretty (as Potion Factory apps seem to be). Man, who needs all those Web 2.0 apps anyway?</p>
First details of Office 2007 for Mac2006-09-18T00:00:00-07:00http://sean.lyn.ch/2006/09/first-details-of-office-2007-for-mac<p>APC Magazine has brand spanking new deets on the next version of Office for Mac. Sounds like the new version will be adopting some of the new UI features from its windows cousin (which I have used and have been blown away by) as well as the new XML file formats. Check out the full <a href="http://www.apcstart.com/site/dflynn/2006/09/1511/exclusive-first-details-of-office-2007-for-mac-all-new-ui">APC article on the upcoming features</a>.</p>
<p>I really like the interview with Mary Starman, group product manager for Microsoft’s Macintosh Business Unit.</p>
<blockquote>
<p>At this early stage the product is known only by its version number as ‘Office 12′. “That won’t be the name it goes to market with — we’ll have something brilliant, like the year it launches, as the name!” laughs Mary Starman</p>
</blockquote>
<p>If the product manager is having this good of a time during an interview, working for the team must be quite the experience. Anyone from Microsoft for Mac interested in a co-op student next year?</p>
Digg jumps the shark2006-09-17T00:00:00-07:00http://sean.lyn.ch/2006/09/digg-jumps-the-shark<p><a href="http://www.flickr.com/photos/imlynch/244994265/" title="Digg Jumps the Shark"><img src="http://static.flickr.com/93/244994265_262fd928fa_m.jpg" alt=""></a></p>
<p>My opinion doesn’t hold much clout on the grand scheme of things, but what are blogs good for if not used as a shameless outpouring of unrespected opinion. Just watch, I bet I’m on the leading edge of this thing. So this is me officially declaring that Digg has <a href="http://en.wikipedia.org/wiki/Jumping_the_shark">jumped the shark</a>. </p>
<p>After weeks of being bombarded by “Apple does something” and “The Wii will have every feature ever” articles, after Kevin having to be un-democratic and skew the formula to benefit the lazy majority, Digg has become completely worthless. </p>
<p>Say Hi to Happy Days and Tom Cruise for me Digg.</p>
Review: Windows Live Writer Beta2006-09-15T00:00:00-07:00http://sean.lyn.ch/2006/09/review-windows-live-writer-beta<p>AKA The only reason I will be installing Crossover Office on any future Intel Macs. I’m not kidding, it’s that good. Don’t bother reading this, go get yourself a copy at the <a href="http://windowslivewriter.spaces.live.com/">Writer Homepage</a>.</p>
<p>Using Windows Live Writer feels like how it must have felt to use that very first version of Microsoft Word. All that ease of use pouring over you after years of being stuck with <em>edit</em>. How everything is fast and intuitive and not hidden in awkward commands or layers of documentation. Windows Live Writer is possibly the best example of “Do one thing and do it well.” </p>
<p>I cannot remember being this passionate about a Microsoft product since I used Encarta to breeze through my fourth grade report on Jellyfish.</p>
<p>But let’s start from the beginning. The beginning being my blogs, all three of them. One is a personal blog on a webserver running on WordPress, the second is a friend’s development blog I contribute to on Blogger (De-coded under links), and the third is CS & the City. None of my blogs are official Microsoft Live Spaces blogs and all of them were picked up without any hassle by Writer. All I had to provide is the URL, username, and password.</p>
<p>With this information in hand, Writer sets out to my blog, making a connection using one of a number of supported API (According to the website, Writer supports <a href="http://cyber.law.harvard.edu/blogs/gems/tech/rsd.html">RSD</a> (Really Simple Discoverability), the <a href="http://www.xmlrpc.com/metaWeblogApi">Metaweblog API</a>, and the <a href="http://www.movabletype.org/mt-static/docs/mtmanual_programmatic.html">Movable Type API</a>.) Once it has successfully connected to the blog, it writes a quick-test post and then downloads all the applicable styling information and related images so that when you write your post, you can write it in exactly the same style as it will appear in your web browser. Of course, you can switch to a normal word processor style view, or even HTML view to fine tune the markup. As Writer works now, however, it creates some of the cleanest markup I’ve seen from a Microsoft product (Frontpage anyone?).</p>
<p>I also love the fact that it picks up my categories I have set up on my WordPress blogs (although it doesn’t appear to let me add additional ones from Writer). It also lets me change properties of a post – enabling/disabling comments and trackbacks, adding trackbacks to ping, etc.</p>
<p>I do have a few pinch points I need to point out though.</p>
<p>The sidebar has links to a number of recently written posts as well as a link to create a new post. Unfortunately, clicking them will open up your new or existing post in a brand new window. Word learned this lesson years ago, and Firefox has more recently taught IE a thing or two. Tabs for posts would be a welcome addition and I can only assume it’s coming in a future version.</p>
<p>Spell checking is available, but it isn’t in-line like Word or Outlook. Now that I can get this functionality in the WordPress or Blogger console with Firefox 2.0, I don’t want to give it up. In the same vein, though Writer will automatically save draft versions of my post, it will not propagate them to my blog automatically. It gives me a button to do that (under the Publish drop down menu).</p>
<p>All in all, an incredibly solid product considering it’s in beta and it’s free. I’m really looking forward to where the MS developers take it and what third-parties do with the powerful SDK. I’ve already got myself a Flickr plug-in.</p>
<p>Last complaint? It’s not available on my Mac, yet. Come on, there <em>was</em> Windows Media Player for Mac! Why not a Windows Live Writer too? Especially if the developers add support for .Mac blogs. That would be a kick in Apple’s iPants.</p>
Offensive and Defensive Coding2006-09-13T00:00:00-07:00http://sean.lyn.ch/2006/09/offensive-and-defensive-coding<p>Today’s coding practices tip (as if this is a regular thing) comes from Michael Feathers at Artima Developer. He writes an article on the perils of playing pass the hot null in your code:</p>
<blockquote>
<p>“[using null checks] …just means that you’re dealing with bad code: you’re dealing with code where people are actively making extra work for themselves and making code brittle in the process.”</p>
</blockquote>
<p>Read the entire piece <a href="http://www.artima.com/weblogs/viewpost.jsp?thread=168511">here</a>. Something I’ll have to consider. I’d like to see him flesh out his argument for using null objects such as empty arrays and strings rather than nulls. I see his point that it can help handle the exceptional case graceful, but I think that nulls may have their proper place. It’s easier to check for a null than to check if a string .equals(“”).</p>
Agile development in-a-box2006-09-12T00:00:00-07:00http://sean.lyn.ch/2006/09/agile-development-in-a-box<p>I spent today reading up on <a href="http://ant.apache.org/">Ant</a> (Java Build Environment) and <a href="http://cruisecontrol.sourceforge.net/">CruiseControl</a> (Continuous Integration Framework). I’ve run across CruiseControl in a few past jobs, but never worked with it directly. I was actually quite surprised to find that it is an open source project as I’ve always found it to be sophisticated.</p>
<p>In my travels today I stumbled upon <a href="http://buildix.thoughtworks.com/">Buildix</a>. Buildix puts Subversion, CruiseControl, and Trac on a live disc (ala Knoppix). I’m really impressed with the integration of the layers. I would love to see Apple distribute this packaged with their servers. This would definitely set them apart in terms of development environments for small and medium sized dev shops.</p>
<p>Found at <a href="http://raibledesigns.com/page/rd?entry=buildix_cruisecontrol_trac_subversion_for">Raible Designs</a></p>
One year in: iPod Mini2006-08-28T00:00:00-07:00http://sean.lyn.ch/2006/08/one-year-in-ibook-and-ipod<p>Earlier this month I celebrated the one year anniversary of the arrival of my very first Apple: my 12″ iBook. Along with it, I received my second iPod, a blue second-generation 4 GB iPod mini.</p>
<p>I was hoping to give comparison battery numbers after a year of ownership. I was blown away by the battery life when I pulled it out of the box so I was quite interested to see how well it would do after a year. Unfortunately, the iPod didn’t last that long.</p>
<p>I started noticing issues in my iPod over the last three or four months. Random shut-offs and weird lock-ups started popping up. Not with any sort of frequency. At least not with enough frequency for me to be without it. In hindsight, putting it off only made it worse. With less than a month left on warrenty, I punched up Apple on the internet and requested a repair.</p>
<p>Unfortunately, Apple’s one-year warrenty policy on my iPod is, well, several shades of bullshit. Really, it’s just a gradual fade out of service possibilities. You get free phone support for the first 90 days. After that, you’re looking at $30 per phone call. If you have trouble with you iPod (as I did) you can send it back for repairs free of charge IF it’s within the first six months of ownership. After that, you’re looking at a $40 fee for shipping and handling. Really too steep considering how much it must ACTUALLY cost to my little iPod back to california. If the guys on eBay can do it for $10, I don’t see why Apple can’t.</p>
<p>Although Apple’s “support” is largely a money grab. I was quite impressed with how timely it was. Shipping a return-for-repairs package to me took two days. Shipping my iPod back, another two. Repairs were done in less than two and as we speak, my replacement iPod is in a DHL sorting facility on its way back to me. The process uses a nice web interfaces for checking the status and e-mails you updates when it is received and on its way back to you. Also DHL seems to do a lot better at keeping their updates on their tracking page relatively real-time. Purolator and Canada Post could take notice.</p>
<p>I also found a quality issue with the touch scroll wheel. It felt as if the wheel itself had spotty reception so the scroll functions were often jerky; I would scroll for some distance with no movement and then the highlight would jump to the item two away. I remember reading that the second generation minis had their scroll wheels optimized for power use so I suspect the feel here was a victim of the optimization as I’ve never come across it in the first generation minis.</p>
<p>On the positive side, I’m still on my original pair of ear buds. I managed to go through three during my year with the first generation mini.</p>
<p>For those interested, here are the accessories I’m using with my mini:</p>
<ul>
<li>Griffin iTrip mini</li>
<li>Apple Firewire + AC Adapter</li>
<li>Generic AC to USB adapter (charge using the iPod USB cable)</li>
<li>Generic headsup cellphone holder for car (mounts to air vents)</li>
</ul>
<p>Note: No case. I don’t feel like I need it and I’m using my iPod every day. You cannot say that about any other iPod except the shuffle. That’s why it will be a while before I upgrade my iPod mini.</p>
Odd Job Jack goes Creative Commons2006-07-27T00:00:00-07:00http://sean.lyn.ch/2006/07/odd-job-jack-goes-creative-commons<p>Odd Job Jack, a cartoon sitcom on The Comedy Network (Canadian TV channel) produced by Smiley Guy Studios, has <a href="http://www.oddjobjack.com/freejack.php">released all of the artwork for the TV series under the Creative Commons license</a>. As far as I know, this is the only show currently in production to do so. Futurama next? *crosses fingers*</p>
<blockquote>
<p>Master flash files and bitmaps of every piece of art used in this season of Odd Job Jack. Every character, prop, and background from every episode plus tutorials and other support material. All free to hack, use, remix under a share-friendly license.</p>
</blockquote>
<p>The content package weighs in at around 800 MB per episode and will be released weekly alongside its weekly broadcast. You can download the torrent which is being hosted on <a href="http://www.legaltorrents.com">Legal Torrents</a> and <a href="http://www.piratebay.org">The Pirate Bay</a> (Canadians love Sweden!).</p>
Waterloo throws touque into DARPA Grand Challenge ring2006-07-11T00:00:00-07:00http://sean.lyn.ch/2006/07/waterloo-throws-touque-into-darpa-grand-challenge-ring<p>Just like to announce that UW has started a team to develop a competitor for the <a href="http://en.wikipedia.org/wiki/DARPA_Grand_Challenge">2007 DARPA Urban Grand Challenge</a> (<a href="http://uwdarpagc.uwaterloo.ca/index.php">UW DARPA Team Page</a>).</p>
<p>First recruitment meeting will be Thursday, July 13 in RCH 301 at 6 pm.</p>
While my browser gently weeps2006-06-25T00:00:00-07:00http://sean.lyn.ch/2006/06/while-my-browser-gently-weeps<p>Over the past few months, I’ve been noticing Firefox having an increasingly difficult time on heavy AJAX pages like GMail and Flickr. It seemed to get worse with each security fix (1.5.0.4 right now).</p>
<p>I recently tried switching to the <a href="http://www.beatnikpad.com/archives/2006/06/04/firefox-1504">G4 optimized version of Firefox</a> lovingly created by Neil Lee at BeatnikPad, after Nicole put me onto his generous creations. Though I saw some benefits on a few sites, it didn’t manage to fix my slow gmail which was almost to the point of making it unusable.</p>
<p>So I switched to Safari.</p>
<p>After suffering through Firefox’s slow performance for so long, the switch to Safari was like night and day. It’s been great to reclaim my GMail account again and it has really brought life to a lot of my casual browsing. My favourite feature flavour of the week is Safari’s integrated PDF handling. I love clicking through a .pdf link and having the file open in my browser instead of having to download it first and then wait for some heavy weight program to load up in the background. Something I end up doing quite a bit during my school terms.</p>
<p>I found a few things I need the Safari guys to patch up for me though:</p>
<ol>
<li>When the PDF loads, it doesn’t immediately gain focus so I need to click on the page before I can use the up/down keys to browse around</li>
<li>When the PDF loads, use the “Auto size” feature you’ve got in the menu by default</li>
<li>Someone get me a “Home” button. How’d they miss one? How did I not know I would?</li>
<li>When the auto-complete list comes up as I’m typing in my URL, why can’t I click on one of the options to select it? I have to use the arrow keys!</li>
</ol>
<p>There is, however, still room for Firefox on my Dock yet. I don’t know what I would do without the Web Developer extension. But if the next version of Safari gets support for all sorts of neat extensions, it might spell the end for my foxy friend. Then again, Opera just released version 9 and Flock hit beta. Maybe it’s time to go shopping for a home browser.</p>
Larry Smith Insight2006-06-25T00:00:00-07:00http://sean.lyn.ch/2006/06/larry-smith-insight<p>Larry Smith is one of the best lecturers the University of Waterloo has to offer. The great thing about Larry is that he’s a bit of a geek. Even though he’s teaching economics, he gives the whole thing a CS-Engineering treatment that tends to result in a few increadible gems of insight. The following is a few I’ve caught over the past few weeks.</p>
<blockquote>
<p><strong>“The technology sector is driven by the market place, not by cool technology.”</strong></p>
<p><strong>Inventory control isn’t sexy, but it built Walmart</strong></p>
<p>[on the creation and eventual adoption of computerized inventory control in the 70s]</p>
<p><strong>The technology market place is inherantly chunky and if it continues to develop products that require massive investments, it will be more and more volitle.</strong></p>
<p>[on investment cycles and capacity planning]</p>
<p><strong>Look at VoIP. Vonage shares are dropping like a stone and Skype is giving it away. Too many railways, not enough demand.</strong></p>
<p>[on market saturation]</p>
<p><strong>“Companies institutionalize ambition.” Waterloo co-ops are some of the cockiest kids out there and cocky is synonymous with self-confidence.</strong></p>
<p>[on the importance of “animal spirits” in investment]</p>
</blockquote>
Bill Gates starts his slow walk away from Microsoft2006-06-17T00:00:00-07:00http://sean.lyn.ch/2006/06/billy-g-starts-his-slow-walk-away-from-microsoft<p>Bill Gates, founder and chief software architect at Microsoft, has <a href="http://www.microsoft.com/presspass/press/2006/jun06/06-15CorpNewsPR.mspx">annonced he will be leaving the company</a> to concentrate on his work with the charity he founded, the Bill & Melinda Gates Foundation. Bill will take two years to phase out his day to day role at the company. </p>
<p><!--more-->Gates stepped down as Microsoft CEO in 2000 to concentrate more on the product development. It was quite apparent that Gate’s frustration with the company’s legal woes and its “Evil Corporation” image drove him to concentrate on his passion: Product vision. And rightfully so. Gate’s vision grew Microsoft’s two man operation in the 1970s into a multi-national corporation employing tens of thousands with software that runs the majority of the world’s computers. Microsoft’s growth also made Gates the world’s richest man in the process.</p>
<p>In 2001, Microsoft released Windows XP, an all accounts success for the company. At the same time, Microsoft also attempted to diversify their product line releasing the XBox and more recently, the XBox 360, which found success in the US but continues to struggle in the important Japan market. Microsoft was slow to move on the digital music market place, however, and lost it to Apple’s iPod. A mistake that allowed the pearly-white company to dominate the digital music market and begin a renaissance of innovation. Microsoft is only <a href="http://today.reuters.com/stocks/QuoteCompanyNewsArticle.aspx?view=CN&storyID=2006-06-16T133645Z_01_WEN9632_RTRIDST_0_MEDIA-MICROSOFT-APPLE-URGENT.XML&rpc=66">now</a> attempting a proper challenge of the iPod’s dominance.</p>
<p>Even Microsoft’s core software market, Windows and Office, has struggled. Office 2003 had a slow adoption rate as business customers resisted pressure to upgrade because Office 2003 was seen as a minor change from older versions. Though, the upcoming Office 2007 has been thoroughly redesigned and boasts a number of positive pre-release reviews, it has been pushed back to be released close to the released of Microsoft’s next version of Windows: Vista. Vista has be plauged with two years worth of delays and continues to garner lack luster reactions from pundits. </p>
<p>Additionally, continual pressure from more agile competitors in Apple and Google as well as the open source community has caused Microsoft to become defensive as it plays the “catch up” game in a number of important markets. </p>
<p>These delays and botched products were bound to frustrate Gates at some point. And an innovator of his caliber is not one to enjoy playing catch up by copying rather than creating.</p>
<p>Though Microsoft has virtually unlimited resources, it has shown time and time again that it is unable to compete with more innovative competitors, even under the Gate’s guidance. Gates announced his replacement will be <a href="http://www.microsoft.com/presspass/exec/ozzie/default.mspx">Ray Ozzie</a>, an innovator in his own right, but only time will tell if the masses of Microsoft will rally behind their new leader. Without a strong and iconic captain like Gates, Microsoft is bound to become more over extended and disorganized. Some may argue that they have already reached this point. Gates’ departure may be a good indication. </p>
Using source control in Eclipse with OSX’s built-in CVS2006-05-24T00:00:00-07:00http://sean.lyn.ch/2006/05/using-source-control-in-eclipse-with-osxs-built-in-cvs<p>I've been using source control for a while now, but I've only recently discovered that my little iBook comes pre-installed with a working copy of CVS. In fact, Apple's developer site has a great article on <a href="http://developer.apple.com/internet/opensource/cvsoverview.html">how to set up CVS on OSX</a>.</p>
<p>Unfortunately, the article doesn't take the user beyond using CVS at the command line. Ideally, you'll want to connect to your CVS repository using a much more flexible GUI tool. I forcibly recommend using Eclipse. The integration of CVS directly into an IDE has been a long time coming, but I can't give it up now that it's here.</p>
<!--more-->
<p>There is, however, a trick to getting Eclipse to connect to the localhost repository. Enter the System Preferences menu by clicking [Apple] in the top left and selecting "System Preferences". Now select "Sharing" from the "Internet & Network" area. Under the "Services" tab, select "Remote Login" and press the start button.<br>
<strong>Warning:</strong> Not only will you be able to SSH into your own machine, but anyone else with your password can as well. Enable Remote Login at your own risk. Check out this article over at Mac Geekery called <a href="http://www.macgeekery.com/tips/security/basic_mac_os_x_security">Basic OSX Security</a> for more information on securing your Mac.</p>
<p>Once you've enabled Remote Login, you can test it by going to the Terminal and typing <code>ssh localhost</code>. You should be prompted for your password, and should get a welcome message if you enter it correctly. Type <code>exit</code> to return. Congratulations, SSH is working!</p>
<p>The final step is to commit your Eclipse project to your newly created CVS tree. Now you can do this from the command line, but it's even easier in Eclipse.</p>
<p>With your project open, right click on the project folder and choose "Share Project" from the "Team" menu item. Remember the Team menu item, this is where all your CVS functionality will be once you've got your project set up.</p>
<p><a href="http://www.flickr.com/photos/imlynch/152325956/" title="Photo Sharing"><img src="http://static.flickr.com/50/152325956_0a194fa4ff_m.jpg" alt="shareproject" height="240" width="195" /></a></p>
<p>Choose the "Create new repository location" option and click Next.</p>
<p><a href="http://www.flickr.com/photos/imlynch/152325954/" title="Photo Sharing"><img src="http://static.flickr.com/52/152325954_06abd7d27d_m.jpg" alt="newconnection" height="77" width="240" /></a></p>
<p>At this screen, you need to enter the location of the CVS repository you wish to commit to. The host should be "localhost" and the repository path should be "/usr/local/cvsrep" if you followed the setup tutorial to the letter. Change it to whatever values you are using. <strong>Make sure "extssh" is selected in the connection type drop down!</strong></p>
<p><a href="http://www.flickr.com/photos/imlynch/152325955/" title="Photo Sharing"><img src="http://static.flickr.com/44/152325955_270445f468_m.jpg" alt="setupconnection" height="240" width="218" /></a></p>
<p>At the next screen, I usually select "Use project name as module name", but feel free to enter whatever you like. After you choose your module name, click Next.</p>
<p>Eclipse will then connect to the server and create the module. When it returns, it will confirm with you the files that it will be committing in. Clicking Finish will finally bring up the Commit wizard which allows you to enter some text for a log entry. Something like "Initial check in" usually works great.</p>
<p>You should now be in Eclipse-y version control heaven! Enjoy the good life and happy committing!</p>
Now that you’ve switched… Switch everyone else2006-01-22T00:00:00-08:00http://sean.lyn.ch/2006/01/now-that-youve-switched-switch-everyone-else<p>Switching is just a matter of willpower and finances (Although the price premium is <a href="http://mikemchargue.com/2006/01/price-deathmatch-apple-macbook-pro-vs.html">not as a large</a> as people think). There are all sorts of arguments for and against the switch, all of which have been blogged to death so they won't be covered here. For the sake of this article, I'm going to assume you're come across that fork in the road and chosen the iPath as I did.</p>
<p>Of course, now that you've switched your personal machine, you probably feel motivated to spread the wealth to your friends and family. Alternatively, you're like me and you're sick of having to fix those old PC that belong to your friends and family. Stick with the spread the wealth one, trust me.</p>
<p>Here's how to approach switching all those other computer users in your life. Hell, it might even help make your own hypothetical transition a little more managable.</p>
<!--more-->
<p><strong>Step One: Be proactive – Start switching to cross platform applications NOW!</strong><br>
A year ago, I switched my parents from IE and Netscape Communicator to Firefox and Thunderbird for one reason: Sanity. IE virtually guarenteed that my parents computer would be so bogged down with spyware that the only fix was a fresh install of Windows 98. Then I'd have to scramble to find a copy of Netscape 4.75 so that I could get my Dad's main back to how he liked it.Little did I know, I was setting my parents up for an easy transition when it came time to replace the old Dell with a brand new Mac a year later. Their relationship with the computer revolved mostly around email and internet. Thus during the transition from Dell to Mac, the two most used applications on the computer didn't even change. All the bookmarks, addresses and old email transfered across in a matter of minutes. Your milage may vary of course, but the lesson is simple: Take an inventory of the most used applications and try to find cross platform alternatives. Firefox/Thunderbird are no brainers. They're both free and very capable, and Internet and Mail are going to be high up on the list. Word processing is a bit more compliated. Although there is a free, cross platform solution available, it isn't exactly light weight and lacks some of the user friendliness. If you unsuspecting switcher is an Office user, get them to bite the bullet and get a copy of Office for Mac.</p>
<p><strong>Step Two: Buy peripherals with cross platform driver support</strong><br>
This isn't as much of an issue as it used to be and really is just an extension of step one. I've been very impressed with the driver support of my Macs so far. All the printers that I've plugged in have printed without any complaint (or indication for that matter). When I switched my parents, I lucked out. Both their HP printer and Epson scanner worked like a charm. If you have to purchase a peripheral like this before you make the switch, double check that you have the option to hook it up to a Mac.</p>
<p><strong>Step Three: Don't force the issue</strong><br>
My Dad bought my Mom a brand new digital camera for Christmas. When I came home for Christmas he asked me to set it up on their ancient Dell. I know from experience that Windows 98 is not exactly the friendliest experience for the digital photographer. Windows XP would have worked resonably well, but I was very impressed with my experience using iPhoto. I knew my parents would agree.The point is that there's no reason to force a Mac on someone who's not interested or ready to receive it.</p>
<p><strong>Step Four: Buy for fit</strong><br>
Buying a Mac is like buying a suit. Make sure it's a comfortable fit. Don't sacrifice just to save money. If your switchee ends up with a low end Mac and doesn't like the experience because the hardware is limiting, they're going to blame the experience on the Mac rather than their configuration. We took a look at the Macs and decided the while the 17" iMac was more than enough machine, it was also a lot more likely to stand the test of time. The large harddrive, DVD burner and extra RAM meant that it will be capable for a few more years. Your milage may vary.</p>
<p><strong>Step Five: Buy them a book</strong><br>
There are all sorts of books available as an introduction to OSX ranging from extreme beginner to power user. As a "Welcome" gift, buy a book for your switchee. Not only will you help them discover new things about their new Mac, but you'll save yourself some time answering questions and give them a sense of independance.</p>
Zaphod for the win2005-11-21T00:00:00-08:00http://sean.lyn.ch/2005/11/zaphod-for-the-win<p>Two weeks ago, my friend Jarrett and I participated in the "A.I. Battle" put on by the University of Waterloo's IEEE group and sponsored by Microsoft. Most of the programming competitions hosted by the university are usually algorithm-based and solo, so the change of pace of the 'battle' was very well received and ended up attracting a ton of participants.</p>
<p>The competition consisted of a set of standardized game logic and a basic player class that each team had to extend in order to build their player. The goal of the game was to create a contiguous path from on side of the board to the other (top to bottom or left to right), while the other player tried to do the same. A pattern of squares on the board is already allocated to each player such that it advantageous for the first player to attempt to create the path vertically and the second player to attempt to create the path horizontally [<a href="http://ieee.uwaterloo.ca/web/events/ai_contest_results.php">IEEE contest page</a>].</p>
<p>Our bot "Zaphod" was basic in the sense that it did not try to pick blocks with the intent to block the other player. Instead, we worked on creating a dynamic path-finding algorithm that would judge the advantage of picking each square that it possibly could and then choose the one that gets us closer to our goal. This made it relatively resiliant to attacks as it tended to walk around most blocking attempts [<a href="http://sean.boysofsummer.ca/?p=491">more about our development process</a>].</p>
<p>Yesterday, the <a href="http://ieee.uwaterloo.ca/web/events/ai_contest/contest_results.html">IEEE group announced the winners</a> and our bot Zaphod placed fifth out of 44 entires. Only 9 points behind the winning bot. That makes Jarrett and I the proud recipients of one of the five prize packages (though we just get which ever package is left, ebay here I come) and our names forwarded off to the Microsoft recruiter for possible co-op terms. Hopefully they won't be too turned off by our poorly documented code. A big thanks to the guys in the IEEE group for putting on the competition, I'd really like to see this become a common thing.</p>
Startup is a dangerous word2005-11-15T00:00:00-08:00http://sean.lyn.ch/2005/11/startup-is-a-dangerous-word<p>I have a supervisor from a previous co-op emailing me to let me know that he is now working for a startup and that they are interested in getting me to help do some development part time, with the option of a full-time position in an upcoming workterm.</p>
<p>At the very least, the offer is quite the compliment. Though I have been working with Java since first year in Waterloo, this particular job was my very first workterm developing 'professionally' with Java. I felt confident that I was able to make the leap from academic to real-world during the workterm, but I'm glad to hear that my employer felt the same way. In fact, he was impressed enough to do a bit of a sell towards the end of the email. The more I look over his 'Why?'s, however, the interested I become.</p>
<ul>
<li><strong>Money</strong> – It's nice, but I'm increasingly finding that my time is much more valuable. Plus, it's a startup, the amount and frequency could be spotty.</li>
<li><strong>Resume Fodder</strong> – Yes, another development position on the ol' resume is good, but how does the addition of this position to my resume make me look to an employer. More may not necessarily be better in the case. If I took the position, I would be doing part-time development in my free time from my full-time job. A prospective employer may get the feeling that I don't actually commit myself to my job if I'm also working for some other company in the evenings.</li>
<li><strong>Fancy Job Title</strong> – If I accept a fulltime position for an upcoming workterm (which would be September to December 2005 at the earliest) in addition to my role as a developer, I would also be put in charge of any co-op initiative, a relatively ceramonial positon. A large number of co-op employers take advantage of current co-ops to hire the next term's group.</li>
</ul>
<p>I've been saying that I am really interested in working for a startup, but I think my expectations may not actually be representative of what's out there. Then again, it may be that it's the ideas that startups pursue that interest me and I don't find the idea of this specific startup that magnetizing. Are co-ops in a position to negotiate terms of employment with startups?</p>