My fetch

No comments:
My supernatural animal companion would almost certainly be a camel. Ill-tempered, intelligent, and totally adorable, just like me!


What bands are appropriate for live music?

No comments:
  1. Sigur Ros. NO!
  2. Yeah Yeah Yeahs. YES!
  3. Postal Service. Probably not.
  4. Tom Petty. YES!
  5. Jesca Hoop. Yes.

The girl at Native Foods

No comments:
She is beautiful. Very short blond hair, lovely big, sad eyes, and full lips. But I realized today that I can't put her into a story. I can't describe her well enough to even put her into a song. It's as if the singularity of her wowing appearance has prevented my creative faculties from functioning. And I don't know enough about her to go on reality. Is she a princess? A damsel? A fighter? A gentle healer? Or perhaps a barwench? Or an office worker, or a stay-at-home mom? Or perhaps an academic? Introvert? Extrovert? Does she challenge the world intelligently and with heartfelt energy? Does she succumb to the listless malaise that sometimes afflicts youth when no clear path presents itself? Is she doomed to an ordinary existence? Is she cursed to live in interesting times? Is she a student? Is she a lesbian? A drug addict? A philosopher?

Here is what I think.

I think she is an artist. I think she stays up late at night, singing folk songs around a campfire with friends. I think she only takes one hit of the joint that gets passed around. She doesn't say much, she is in fact very quiet, but she keeps a journal and tries to releive her constant worry of the world through writing about it, but it doesn't really help. She is bored by her job, but likes the people she works with. She loves dogs, but is ambivalent about babies. She likes boys with tatoos and long, matted hair. She doesn't like boys approaching her unless invited, which she does with her eyes, which everyone tells her are beautiful. She talks with her mom on the phone when she's lonely. She thinks with nostalgia of her childhood and worries that they were the best days of her life. She was the youngest child and has already rebeled in the usual ways and found it dull. She has an older brother, who moved to Chicago. She missed him a little bit, and wonders what the future holds for her.

Through the looking glass: the wonderful world of widgets

1 comment:
I was playing around with Sproutbuilder which is a really cool TTW WYSIWYG widget authoring tool. Now that's pretty cool, but it opened my eyes to a bunch of other synergistic tools, like gigya, which is something called a "widget network". Presumably this means "widget distribution network". Anyway, it appears that this is the tip of the iceberg.

You may wonder, what is so interesting about widgets? Constrained space design! Being efficient with the pixels you get is a kinda cool problem.

What does it mean for a company to issue new stock?

No comments:
Meryll Lynch will sell $8.5B in new stock. What does this mean for the existing ML shareholders? It means that new investors will be getting a piece of the company, but they'll be paying for it, which means old investors really are getting something in return for the stock dilution - cash. As an investor you only want this deal if your company needs a liquid cash shot in the arm, such that if it can't get it then your (undiluted) stock becomes worthless anyway.

The best deal for existing owners involves issuing the lowest number of shares at the highest price such that it's enough to save them. How do you determine these numbers? Seems to me that these numbers are largely a function of the current share price, outstanding stock count, and the estimated cash needed to solve the problem. And I have no idea what that function is.

The buyer wants the most shares at the lowest price, because in the event of a recovery the upside is much larger.

Another way to analyze the correct price for a new stock issue is to look at a hypothetical buyout. If the company recovers successfully, how much would ML be worth to a buyer (assuming 100% of sellers would be willing to sell at approx market rate)? (I believe this number is called "market capitalization".) Let's say that ML is worth $20B now but has every reason to believe it should be worth $100B, which it was 6mo ago (I'm totally making these numbers up). If there are 1B outstanding shares, should an investor think about buying at $20 or $100, or something else? Well, $100 makes no sense as there's no profit in it, even in the best case. $20 is a good number because their shares will be worth the same as everyone elses when they "hop on board" and stand to lose (or gain) exactly the same. However, $28.5 may make more sense: that's because if ML's value is $20B then gets $8.5B in cash, the company is, strictly speaking, worth $28.5B. So perhaps the new investors should spend $28.5/share!

So I guess assuming the sale goes well, it's actually a really really good thing for ML owners to get that cash - they see an immediate increase in stock value, and have the jet fuel needed to get past a rough spot and toward that $100B mark.

Earthquake

No comments:
Just had an earthquake. Felt pretty big - initial jolt, then an extended period of gentle swaying (over a minute - indeed we may still be swaying).

How to Server-side Google Analytics

4 comments:
There are many users who surf the web without a JavaScript enabled client - particularly users of the mobile web, and some portal users. The question arises: how do you track visitors with Google Analytics (hereafter "GA") that don't have a JavaScript enabled client? I recently took a stab at this problem by reverse-engineering urchin.js and re-writing it in Java. But it didn't work. This is my attempt to rectify the situation.

A bit of background: GA is normally installed on a site via a piece of JavaScript that executes onload. The script (which used to be called urchin.js and now is ga.js) examines the page and generates an HTTP request for a GIF from GA with lots of URL parameters. Based on those parameters (and probably the request headers) GA recieves all of its data. So our problem is in correctly constructing that URL.

But figuring out how to correctly construct that URL is tricky, and it's mostly undocumented. Google has taken pains to wrap the API in object-oriented JavaScript - but this is little help if you need to call that API from another language. Plus, the script is "minified" - and therefore unreadable.

After a little research I found a troubleshooting page that describes the HTTP request URL in more detail.

This is very helpful, but not sufficient for creating server-side verstion of the ga.js script. In particular the following questions are begged by the documentation:
  1. Most of the fields have to do with e-commerce, and can be ignored for basic analytics. Are they really optional?
  2. The fields that describe client capability are more problematic - can they be omitted?
  3. What use GA makes of the request headers, especially when the information is duplicated in URL parms?
  4. Why are encoded cookies sent at all? Can they be omitted?
  5. What is the "X10 data parameter"?
To answer these questions I will be constructing URLs with a text editor, sending them with curl, and seeing what impact it has on the GA reports. (Hopefully there won't be much latency or testing will be slow!)

[It occured to me while writing this that other mobile web developers must run into the same issue, so I search for "mobile analytics". Some interesting hits. But remarkably it seems like other folks concentrate on doing things like log file analysis. I personally think that's a bad idea. It also occured to me that we could use another analytics software, like the open source piwik, that has a more open tracking API. However switching analytics providers is only a last resort.]

[Google is probably wise to not provide server-side access to their analytics - they'd have to support a few more languages, and integration is a lot more difficult making the support load higher.]

The stuff that got stolen this weekend.

1 comment:
Well, it appears that there's been a theft this weekend. All told, I'd estimate I lost about $9k worth of stuff:
  1. Photography equipment. Canon 20D + 5 lenses (two of them L lenses), flash, photo backpack, memory cards. Worth about $5k.
  2. Cash. $2k. I feel particularly stupid about this. I had this much cash because I'd returned a computer to Costco, and sold another via craigslist, and was meaning to deposit it in the bank.
  3. Perhaps worst of all, my father's Rolex. It was a rather beat up Submariner, I've worn it perhaps twice, but it was an heirloom. Worth $2k possibly.
  4. An unopened iPod Touch that I'd been meaning to sell on craigslist. $300.
Oddly, they didn't take my laptop (an older Thinkpad) or my Bose Waveradio, or my CDs or even my 21" monitor. I know everything was in place Saturday, but I suspect that they hit me on Sunday when I was out because they didn't take my (brand new) MacBook which was here all day Saturday, but not Sunday. It's telling that they took only stuff that was highly portable (the camera and lenses were in a backpack).

Goodbye camera!



I filed a police report, registered serial numbers and the police have promised to dust for prints, but frankly I doubt they'll find anything - I have very little hope that my stuff will be returned, or the thief caught.

How do I feel? Pissed, mainly. I'm pissed at the loss, and pissed at myself for my stupidity - I left the door unlocked, thinking that my 2nd floor position would protect me, and believing in the basic decency of human beings. The camera and cash are replaceable - the watch is not.

Life kinda sucks right now.

Questions about Newport Backbay

No comments:
Went kayaking in the Newport back bay today, and noticed a few things:
  1. There is grass growing in the saltwater. It doesn't look that healthy, but it's green and living. How does it live?
  2. The soil underneath is very dark and oily. Why?
  3. There's a lot of trash in unusual places. Why?
  4. There was a bird that flew close to the surface of the water, with it's mouth open, the lower half in the water. It had orange coloration around it's beak. What kind of bird was that?
  5. There was another bird eating a fish. It was white with dark coloring around your head?

Jing: A SnagIt alternative for Mac OS X

No comments:
Wow! One of the big things I've been missing in the switch to OS X is an alternative to the excellent SnagIt, by TechSmith. And I have found it in Jing - a free (SnagIt costs $50) utility that is actually much better than SnagIt. Sweet! (Interestingly TechSmith makes both products.)

There are a couple of features that I rather like above and beyond SnagIt:
  1. A nifty sun on the upper left of the screen that invokes it.
  2. In-place editing of the image
  3. Coordination with IM, web, blog, and email. (capturing and sharing video is particularly slick)
  4. History! (This is an incredibly useful feature that shows all the captures you've recently done, whether to disk or to clipboard.)
Alas, there are two important features missing.
  1. Crop.
  2. Capture window contents.
There are some other SnagIt features that I barely used, like funky capture profiles (capture to printer), scrolling capture, and no doubt a few other things.

But overall I'm pleased.

[I would use Jing to show you how it works, but unfortunately it doesn't capture itself! ]
[I found jing by googling "screen shot osx" and reading a macrumors.com page.]

Top 10 concepts every programmer should know - a response

No comments:
Alex Iskold of RWW blogged about what programmers should know. (Alex was a software architect with IBM). Here was my comment:

Know a craftsman by his tools. A programmer (text editor) cannot create a whole system - he requires at least a graphic designer (Photoshop), a business person (Phone), and an admin (bash & vi). They make it pretty, sell it, and keep it running respectively.

Furthermore, there is a useful distinction between front-end and backend programmers. The front end guy must know HTML CSS JavaScript regex XML JSON HTTP TCP/IP plus a handful of JavaScript libraries, coding conventions, browser quirks, and a few specific JavaScript libraries, and some human interface guidlines. A good design sense doesn't hurt, either. He'll be using a text editor + firebug + http proxy + a small set of command line tools like curl. (This could also be a Flash or GWT specialist).

The back-end guy must know Java (or Perl or Ruby or whatever) plus a variety of core libraries (like Collections, JDBC) and a variety of application frameworks (SpringMVC, Rails, etc), and of course be a SQL expert. He knows about REST, caching, and scaling. The more he knows about the OS (process overhead, security, etc) and network architecture, the better. This is the guy you seem to be describing in this article. He'll be using Eclipse and a database client, like SQLyog, and the build system.

The admin's primary goal is to keep the application running, but he has a lot of programmer-like qualities, mainly for doing ad hoc scripts. He should know everything about the db, the os, and the network. He lives in SSH, the command line and in configuration files. This is the cloud computing specialist (although certainly the backend programmer should know something about it, too).


In the end I think that a laundry list like this isn't very useful: there's too much genuine specialization in programming these days (and quite a lot of fake specialization).

I left out some important roles though. Here they are.

There are other roles, like QA, support, product manager, project manager, team lead, and IT. Of these four product managers are rather an interesting role because a lot of people don't really understand why they are needed. What need do they fill? They are the distillation of "focus". They don't necessarily come up with the product, but whatever the definition turns out to be they work to make sure everyone understands the product, and makes sure that feedback gets to the right ears as development progresses, and after the product is released. They may also be tasked with tracking the performance of the product. If the team is focused (and small), and the performance of the product is obvious enough, a product manager isn't needed. The focus of the product manager is "functional clarity" and should be a great communicator, detail-oriented and understand the domain well.

The project manager serves a similar purpose as the product manager, but instead of answering "what?" they answer "when?", and takes action when things slip. Usually the team gives the PM a schedule they are comfortable with, and inform the PM about their progress as needed (usually at fixed checkpoints). Again if the team doesn't have a problem keeping schedules, a project manager isn't needed. The focus of the project manager is "the schedule" and might use a tool like MS Project. Ideally they've presided over similar projects so that they can spot missing or risky elements in the schedule.

Another role that is sometimes a bit confusing, is the team lead, or development manager. It's a confusing role because, at first glance, it seems like a conflict with the PM roles. This person hires, fires, mentors, grows, gives kudos and criticism, and assigns responsibilities, and chooses architecture. They are an experienced technical person with lots of skill and ability, and good communication skill. If a programmer has a technical problem, or if they make a technical mistake, the lead should help out. The lead also sets the tone for the culture, and has authority to define coding conventions and process. Setting policy, representing the team elsewhere in the company, and conflict resolution are key qualities. If the team has consensus on policy, and is always willing and able to help each other out, and no-one is ever hired or fired, no team lead is needed. Sometimes the technical aspects of this role are seperated into a high level technical role and delegated to a title like an architect.

You will notice that there is no mention of who defines the product in any of these roles. The prod manager clarifies. The proj manager babysits and worries. The team lead gets it done. Who is the product definer? The answer is: the guy with the money. They may choose to delegate that authority, and it often gets redelegated. Typically the investor picks a board who picks a CEO who might in turn delegate product definition to the product manager (for example). Or he may put a more complex policy in place for product definition. But in the end, the investor has some idea as to what they are investing in, and will generally be happy if they get what they paid for. (Of course they might also be happy if they get something they didn't pay for but which turns out to be wildly successful.)

Everyone wants to define the product. QA does, support does, even the sysadmin has a few ideas and pet peeves. The users sure as heck do. The product manager role exists to protect the development team (and everyone else) from constantly changing priorities, features, and demands. The risk for the prod man is that the CEO (or the board) will set a product definition policy and then repeatedly break it, undermining the prod man's authority and effectively making their role worthless. It often happens that product managers devolve into fall guys for inefficient and indecisive management. Basically, the people with the money have to have discipline.

Who should define the product? That's the million dollar question! At least in the software business, it's should be the person with the best grasp of the market (what's needed) and of the technology (what's possible). If you add to that the ability to get it done, and some money, you have a business. The definer has to understand the users and filter through their feedback. They have to understand what can be done. They have to understand the psychology of consumerism, and the entire gestalt of the product and it's position in the market, and in the mind of the user. And they have to be able to delegate! A completely specified product is the product itself, so it's impossible for a person to define everything for a complex product. In particular, the development team will need to make lots of little decisions, and possibly a few big ones, as they flesh the product out. (I commonly see two points of failure here: dev is not given authority to define product details, or dev is not being willing to define product details.)

How are products defined? If products were cheap enough, and the market large enough, we could create every possible product, release them all and go with the one that 'sticks'. We can make the product cheaper, and subsitute an expert opinion for the market, and approximate this approach using mockups and prototypes. So, the money champions an idea, requests a prototype, they give and get feedback on it, iterate, then finalize it with the product manager and authorize development. The users then get the "final" product and a similar, if slower, iteration occurs.

(This means there's a highly desirable pressure to minimize the distance between a mockup and production code - a great opportunity for architectural innovation!)

OMG what was Adam Sandler thinking?

No comments:
Adam Sandlers comedy album Stan and Judy's Kid is the worst thing I've ever had the misfortune to hear. Not only is it slow, it is incredibly profane (expected) and incredibly unfunny (not expected). I'm a huge fan of Sandler's, and just love "What the Hell Happened to Me?" and a few of his other works - but this was just terrible. What's funny about a drunk Bostonian murdering his friends? Or a peeper getting caught by the police (really, that's it)? Or a smooth talking black man who seems to be successful with women - right until he refers to his penis with a stupid (usually disgusting) euphemism?

I literally threw this CD in the trash - I'm not even going to sell it back to a used CD store. The fewer of these things in the world, the better!

Micro Templating from John Resig: a code review

5 comments:
John Resig (author of jQuery) wrote a little script that implements client-side templating in JavaScript. This is of particular interest to me because I had to write something similar a few weeks ago. This code has a bunch of interesting idioms and features in it. It's unreadably short (IMHO) but here's a breakdown, statement by statment (generally going from outside in):
  1. (function(){})(); This is a new idiom to me; it's just a terse way to define a function then execute it. Contrast this with the YUI idiom that is YAHOO.namespace = function(){}; which usually attaches to a browser event at some point to start things off.
  2. var cache = {}; A private data area. It's a hash because you have to index the cache on the input string. This is an example of memoization.
  3. this.tmpl = function tmpl(str, data){...}; A somewhat verbose way to declare a function, but it combines with #1 to install a function on the global object. Generally, this isn't a very good idea, as there can be namespace collisions there.
  4. return data ? fn(data):fn; This is currying, I guess. (Return the transformed data, or the transformation if there is no data).
  5. var fn = expr0 ? [expr1] || [expr2] : [expr3]; This is idomatic JavaScript. Well, the expr1 || expr2 is idiomatic - it's a common way to say "if expr1 doesn't work, try expr2", very similar usage in perl. The nesting inside a ternary operator, and with complex multi-line expressions, just adds to the fun.
  6. !/\W/.test(str) - \W matches non-word characters. This is a handy way to say "if str only has word characters". Knowing what this means requires both regex and RegEx knowledge, if you know what I mean. (I personally hadn't run across the RegExp.test() method before). [Thanks for the correction!]
  7. new Function("obj", [method body]); I didn't know this, but JavaScript allows an alternate method of doing meta programming, the Function constructor, which doesn't require eval(). The Function() constructor takes arbitrary numbers of string arguments, the first of which are interpreted as names of declared parameters, the last being the function body. In this script, you call it by assigning to a var then calling the var as a normal function. Neat.
  8. var p=[],print=function(){p.push.apply(p,arguments);}; No idea what this does. push() is an array function that returns a number, so I'm not sure how "apply" is even defined here!
  9. with(obj){p.push(' - I know what this does, but not sure why it's here. Seems like p will have only element at this point. Yes, I realize this is the "outer push". Egads!
  10. split().join() is a fast way to do static replacement (according to John).
  11. with(obj){}; Flanagan's book (JavaScript: The Definitive Guide) warns against using "the with statement". However Resig uses it here so that the template expressions are evaluated relative to the data object. (Anyone who's coded in VB knows the with statement - I personally really liked it and wish it was in Java and was usable in JavaScript)
So, there are some moving parts here that I don't completely understand, especially the use of push() inside the with() expression. I mean, why bother with that? I'm pretty sure the answer will come eventually, but for now I find myself puzzled, just like when the post-doc TAs would skip like 10 steps doing that line integral. I'm pretty sure it has something to do with that wierd print assignment.

Of Linux Haters and the GUI problem

No comments:
Just ran across this rather unusual blog, that purports to hate Linux. But it really reads like a series of letters from a jilted lover who would probably be taken back in a heartbeat. (Cue Joan Jett's "I hate myself for loving you"). Of course, this end of the relationship is a human, the other is the rather nebulous cloud of "FOSS" - or free open source software, so a reconciliation may be fundamentally doomed.

That said, these 'letters' are profane, funny, technical, and insightful. Nothing on the internet highlights as clearly the irrational attachment to FOSS in general and Linux in particular that some people have. (Indeed, one could spend a lifetime making fun of people's irrational attachments. And some do.) The key theme, at least for me, is that there is a jolt of rightousness that comes with using FOSS that can render one's perspective dangerously opaque to weaknesses. (I see the same thing with the iPhone.)

What's really interesting to me, though, is that his posts focus heavily on UI issues. For example, in a post of about Samba he complains that he's had to learn smb.conf 20 times over the years, but then quickly forgot it. I know exactly what he means. He then talks about his options for a GUI, Fedora and Webmin. But wouldn't it be cool if you could create your own GUI for this kind of stuff? Or even better some record of what you did?

I ask because I think the poster is wrong - the problem is not silos. Breaking down silos can be a good thing, but there's no reason why file sharing ought to be coupled to a GUI toolkit (as he seems to be advocating).

You may be thinking, well, even if there was such a thing it would be a mess - so many GUIs, it's the whole "there are too many choices" thing all over again. However, I'm pretty sure that would sort itself out, as great GUI creators would rise to the top, and thanks to decoupling, could be tried without fuss.

The piano problem

No comments:
Too many people own pianos. The piano sits there, a worse than useless piece of furniture. I say "worse than useless" because it is an unusually heavy item so it is difficult to move, and also because it implies that there may be some skill in playing it, even when there is not.

This state of affairs is great for piano manufacturers, and not so great for those wealthy enough to purchase a piano. So why do people buy pianos even when they can't play them? Two reasons: vanity and hope. Vanity because the piano is a status symbol, a traditional sign of success and an ostentatious display of wealth. Hope because people might believe that one day they might learn to play.

The piano problem isn't limited to pianos - it is just the poster child for "consumption as a substitute for self-improvement". The health industry is filled with exercise equipment manufacturers and gym memberships and diet plans and athletic shoes that all feed off of a similar psychology. I suppose that cars are also a good example (e.g. the SUV that has never seen a dirt road, let alone a true off-roading experience).

Alas, I feel the piano problem all too acutely because I wish I had a piano, and I actually play. I have a particular fondness for the Yamaha GC-1 baby grand - I like it even more than some much more expensive pianos. It's feel, it's sound...so wonderful. It's truly a work of art. And the thought of all the pianos in the world sitting there unplayed just breaks my heart.


Hellboy II: Disappointing

No comments:
Hellboy 2 is getting good reviews, and I don't know why. I went into the theater completely prepared to enjoy it, wanting to like it, and excited to see it. But in the end it was a series of beautifully rendered but disjoint fantasy vignettes that happen to be set in the Hellboy universe.

This movie was, at least in part, ruined by the excellence of it's trailers. I found myself anticipating pieces of the trailer at several points of the movie. This was a problem. Each scene was kinda ruined because rather than just watching the scene, I found myself waiting for a particular moment. It's the difference between listening to a lecture, and listening to a lecture with your hand raised. For example, when Red & Co. got their special eye pieces to see trolls, I knew they'd find that old lady troll who says "how do you see me?". When they get to North Ireland, I knew there would be a stone giant popping out of the ground. When they got to that creature with wings I knew it would have a face without eyes, but the wings would have eyes. And when Hellboy fights with that one creature, I knew at some point they would punch each other's fists.

Anyway, I really like John Hurt in basically anything, even a bit role (although he looked like he was having more fun in the last Indiana Jones flick, they wasted him I feel). Good to seem him back (in a flashback) here. Selma Blaire was looking unusually attractive. I prefered the previous movies voicing of Abe. Ron Perlman does a fine job as the title character - although I fear for the health of his skin. Does that poor guy ever get a job that doesn't involve hours of makeup before every shoot?

The script at times veered into obnoxious predictability that may delight a 12-year old, but bored me. The "romantic" scenes were particularly bad here. I've no doubt this style is consistent with the comic book, but some concession should be made to adult sensibility for a major motion picture, I feel.

There were some hints of interesting theme here regarding man vs "the natural order", but this is addressed far too briefly to actually be interesting. The plot, such as it was, revolves around an elvish plot to retake the earth from the irresponsible human caretakers using the implacable Golden Army as a tool. This offered some pleasant ambiguity about the "bad guy" - was the elven prince really that bad for wanting to take the earth back from it's irresponsible caretakers? Apart from a single, brief moment of doubt, it turns out that the prince really is that bad because freeing the earth means killing all humans. The ambiguity was resolved too quickly with without enough effort to be interesting. (The "moment of doubt" was realized when Prince Nuar unleashed a "forest elemental" to kill Hellboy, but before Red can blow the creature away, the prince makes a case for not killing it - he whispers into HB's ear that it is "the last of it's kind, like us." Of course, the Prince is really offering HB the choice between pulling the trigger and blowing a big baddie away and becoming Buddhist, and HB really likes pulling triggers, so it wasn't a smart move on Nuar's part to put HB in that situation. Of course, it might have helped if Nuar really had given Red a way out - for example, told the elemental that it no longer needed to kill Hellboy.)

It's a fun film suibtable for replay at a house part, perhaps, but I lament that it didn't hang together better and explore the nature theme in more depth.

iPhones observation at Jury Duty

No comments:
The iPhone seems to be everywhere. At jury duty yesterday I noticed a fair percentage (10% perhaps) with iPhones. Lots of people were playing with their cell phones, but the iPhone seemed the most prominent smart phone. On TV was Oprah - talking about the new iPhone. It's a perfect consumer-frenzy storm.

The jury duty "poll" seems particularly relevant as it's a very broad cross-section of society. After all, all we have in common is "being a citizen".

(Laptops were also interesting: most people had commodity PC laptops running Windows 2000 or XP. There were two MacBooks, my own and one other.)

Jury Duty

No comments:
Well I have to say that so far jury duty is actually pretty slick. There's top notch wifi access, bad coffee, and public-library level quality seating. It's like a coffee shop where no-one talks to each other. (Which is a pity because where else do you get to connect with people on a purely "citizen" level?)

The only thing is - I forgot the little detachable thing to my power supply (missing thingy pictured)! I really ought to keep one of those things in my bag. I'm sure there's one available not too far from here. Not sure if they'll let me leave though.

More thoughts about Mac usability: Dock versus Taskbar

No comments:
So far, my experience with the Mac has been quite nice. However, I
continue to struggle with the lack of keyboard shortcuts and keyboard
customizability. I also am trying to get my head around the Dock (Mac)
versus Taskbar (Windows), and Apple-Tab (CTRL-Tab for windows)
switching between windows/applications.

Ok, so there's a HUGE difference between PC and Mac which takes a
while to sink in: the Mac Dock (and the accompanying keyboard
shortcuts) are designed to switch between applications. The Windows
Taskbar (which is actually a persistant Explorer.exe process) is
designed to switch between windows.

Unlike Windows Vista which seems to want to do away with menus
entirely (which is a bad idea), the Mac puts menus front and center.
In fact, menus are such a strong inter-application convention that the
menu bar on the Mac is always on top and is always in the same place
and follows the current application. This is rather odd for a Windows
user, who is used to each application maintaining it's own title and
menu bar. It turns out in the Mac that the menu bar is often the best
place to quickly check which application you're in - this is opposed
to Windows where each Window identifies itself. A subtle issue arises
on a Mac when looking at an open, but inactive window - how do you
figure out what it is? You can go off of clues based on it's content,
however that's a relatively time consuming task.

Which menu and title management system is better? I'd have to give the
edge to Windows here, because the eye has to travel less distance in
Windows to identify the application. Also, the mouse and eye travels
less to activate and peruse menus. The pity is that the OSX method
saves no real-estate - Mac apps still require title and menu
equivalents: Mail, for example, has a title (the subject of your
message) and a command bar (which has menu-like qualities).

Windows has a slight edge, too, in that you can install an OSX
Dock-like utility if that's what you like. I'm not familiar with a
Taskbar addition for OSX. It's only a slight edge because I've found
those kinds of utilities to be either unstable, or more likely, not
terribly well integrated into the OS. Whether or not the Dock is the
perfect way to manage many running applications, it is implemented
well and is very consistent with the rest of OSX.

I'm also rather surprised that OSX doesn't have a feature that's been
available in Windows for a very long time, which is document preview
when alt-tabbing (it's available for XP as a TweakUI addon, and
natively in Vista). This is especially surprising since OSX features
document preview in the Dock!

Closely related to these issues is the matter of long-running
applications and their representation. In Windows, such applications
are conventionally given an icon next to the "clock", which is called
the "system tray"), and do not have any window associated, and do not
appear during an alt-tab switch. On the Mac, such applications (like
Skype, iChat, Mail, Cisco's VPN client) appear in the Dock as any
other application, and also appear in the Apple-Tab list. I believe
that Windows has a clear advantage here, even if it means making an
arbitrary distinction between "Background" and "Foreground"
applications.

One final way in which I feel the Dock is inferior to the Taskbar is
the lack of minimize/maximize repeatability. On the Mac, windows can
be minimized to the Dock (by default with the "Genie" animation). They
can be restored by clicking on them. But when restored, a Mac window
has no representation on the dock, unlike in Windows. So if I want to
maximize a window, take a look, then minimize it again, I have to
click the title bar, click the dock, then click the title bar again -
my mouse has to move. In Windows, I can click on the Taskbar
representation to achieve the same affect. Basically, the Taskbar
maintains a representation for all windows, whereas the Dock maintains
representations for only minimized windows. The Dock gives me no easy
way to "peak" at a non-visible window.

I think that the Dock could be improved in a few simple ways. The
easiest would be to designate a section of it for "background"
applications - this would have the effect of taking many apps out of
apple-tab switch order, and perhaps also making them less prominent on
the dock. (What's wierd is that there already is a section of the
screen like that, on the upper right, however this is mostly for OSX
usage, but certain apps like Skype and Adium use it too). But the key
weakness to the Dock, lack of per-window access and control, is tied
up with the universal menu bar, and the lack of per-window application
identification. That would need to change for a solid Taskbar
implementation on the Mac, and I suspect (but don't know) that this
assumption is baked into every Mac application at a very deep level.
That said, it might be enough just to enumerate open windows and forgo
per-window identification - even that would be useful.

The bottom line is that while I can live with the Dock (and I'll try
to post workarounds as I find them), I much prefer the Taskbar. I'm
kind of interested in seeing how hard it would be to write one. (It's
kind of interesting that there are so many 3rd party apps for
launching applications on OSX, like Butler and Quicksilver, but none
for managing already opened apps.)

[Update: there is another work-around for the per-Window control
problem: ensure that your applications only have one window! Terminal
with it's tabs, Firefox with it's Tabs, Photoshop and it's MDI
interface all do the trick.]

Posting from Email

No comments:
One thing that blogger doesn't tell you is that you must email from the exact email address associated with the blog in order for it to post!

I have a crush on Grace Kelly

No comments:
Of all the classic movie stars, Grace Kelly is by far my favorite: beautiful, intelligent, sophisticated - and possessing of that rare femininity that isn't displaced by a strong personality. A kind soul has collected a bunch of Grace Kelly and placed it online. Her voice sounds amazing! Oh, to have known her as a young woman, or at all.

People are Strange

No comments:
I'm working at my favorite coffee shop, near the beach, and once again wonder at the strangeness of people. A group of young people on my side of the street see a friend, a young girl, on the other side of the street. They yell joyfully, incoherently. The girl sees them, and responds with that wordless, surprisingly high-pitched sound that either means "I'm in severe danger" or "hi", depending on context. I have to wonder, what ever happened to using words?

Another observation sitting here: it's remarkable how few people seem to know how to parallel park. Yesterday I watched a guy try to park for about 10 minutes. That may not sound like a long time, but it's an eternity when parking. I found the dramatic triangle between him, his girlfriend, and the parking spot strangely compelling.

Dashcode for iPhone web development

No comments:
Interestingly Apple is applying the Dashcode IDE to iPhone web development. Although Dashcode was designed for makeing Dashboard widgets, this makes a lot of sense - I've written before how similar mobile and widget development is.

The nice thing about Dashcode is that you can get a working prototype going quickly. And it has lots of juicy iPhonish assets right out of the box - saving considerable Photoshop time.

The naughty thing about Dashcode is that it's just not a very good IDE, and the code it generates is rather awful, especially for mobile deployment. I mean, if you want to write a mobile app that degrades to a non-Javascript version, you are essentially out of luck. Additionally, the pages it creates are really heavy, and feature lots of inline JavaScript (which can't be cached.)

Granted, I just discovered Dashcode yesterday, but so far it looks like I'll just be pulling assets out of it and using my old stand by tools.

(Sorry about the lack of hyperlinks - feeling a bit lazy. Use Google!)

More MacBook goodies

No comments:
I'm not too thrilled with the Dock. But to make up for it, at least I have Quicksilver and Fink. Roughly, these are (significantly better) versions of Google Desktop and Cygwin, respectively.

What continues to astound me is the dearth of window management options on the Mac - everyone seems to think that the only problem with the Dock is it's launching functionality!

FreshBooks - looks like a nice invoicing solution for freelancers

1 comment:
Invoicing clients is not my idea of a good time - I'm a programmer, not an accountant. FreshBooks is a service that allows me to create and send invoices with relative lack of pain. (Looks like a Rails app, too). I'm going to try it out and see how it works.

As nice as FreshBooks looks, I'm actually looking for a more comprehensive solution that includes planning and time tracking. However, my needs are quite specific and it's something I'll probably end up writing myself.

MetaBlog: making the case for blog-through-the-mail

No comments:
ScribeFire has turned out to be quite unreliable, at least for long term storage of notes. At work I left my computer on for about 10 days, with Firefox (and Scribefire) open. When I came back, a memory leak (I think) had rendered the computer unstable and I had to force quite Firefox, and reboot the machine. When it came back up, Scribefire informed me that my notes file had become "corrupted".

Not good. I had a lot of work stored in those notes - mainly research, links, and a rather large idea bin.

There are other problems with Scribefire, such as it's inability to consume the Tab key for increasing indent (a problem which just recently arose). This is a critical problem for someone like me that uses nested lists alot.

I've come to a few realizations, in no particular order: Blogging through email is the key. This allows you to store 3 copies of your work, even in draft: a local copy, a draft copy on the email server, and a draft copy on your blog. Now that's a backup strategy. In addition, if you have multiple blogs, keeping track of where you're blogging to can be tricky - Scribefire was never very good at keeping all that straight. Finally, a single source of posts is easily searchable, and that's quite nice. Some difficulties that arise include tagging (some blogs are better than others - I still haven't found a way to indicate categories or tags in a blogger email). But of course a huge benefit is that the data remains in easily re-published form - you could publish your work to a different location if need be.)

On occasion you may want to post through the web or even with a tool like Ecto or Scribefire. The solution here is to funnel the post back into your email, with email notifications.

Now, this is all well and good, but Scribefire has a few really compelling features worth emulating - browser embedding foremost among them. An email client with strong composition tools embedded in the browser? What exists? A search reveals "not much".

Another feature that I would like to see in Scribefire is a "post to multiple blogs". This feature would either publish a copy to many blogs (not optimal) or publish to one, then publish a link to the others. This would be handy for those "globally interesting" entries that also have more specific applicability.

Tonight, I won

No comments:
Tonight, I won, and yet there is little joy in the victory. For some reason on this night of all nights, it hit me that poker is a game that rewards aggression, and is indeed not a wholesome game. This particular reason for decrying the game are substantially different from the other reasons that I've heard - that it is a sin against God, etc. No, I object to the game for the simple reason that it rewards and reinforces bullying and dominating behavior. In essence it reenforces the opposite behaivors that are generally desirable in a human being.

Now, there is something to be said for differentiating between a "game" and "real life", and some poker apologists might very well claim that I am failing to make the distinction here. But I wonder, if real money is on the line (hundreds, thousands of dollars), and if money is only obtained through the expenditure of effort in real life, then is not the game leveraged against "real life" and so becomes a part of it? I'd argue yes: once non-trivial sums are involved, one is risking (sizable) chunks of a real life.

This is different than other games in which one might be quite cut-throat (for example, Monopoly or Chess), but because there is no money riding on the match there is no moral difficulty. There is only a pleasant sort of competition and a match of intellect, and perhaps a somewhat frivolous waste of time, but there is no true conflict.

To be more specific, poker rewards aggression in that, once you have the "big stack" it is the "correct" play to become very aggressive and attempt to "steal" blinds and such. The theory is sound: the big stack is risking the same amount on an absolute scale, but much less on a relative scale than his opponents. On average it is better for the big stack to overbet his hand (under certain conditions) knowing that, on average, his opponents will not be able to take the proportionally greater risk.

And this is all find and dandy, until real money is on the line. Then all of a sudden the big stack is simply using his greater sum of money to make even more money, a concept which seems, on it's face, quite abhorrent. (I can't help but wonder where in real life does this financial dynamic exist? Are there places where simply having lots of cash allows you to make a lot of cash? I'm absolutely positive that there are.)

Anyway, I won a bunch of money based on these principles, and I don't feel very good about it. I played "correctly", having a big stack and generally being very agressive. I was caught once or twice, but on average I continued to build my lead, and finally won the game.

And the victory is as ash in my mouth.

The MacBook Keyboard

2 comments:
There are, alas, some keys missing from this keyboard. There is only one delete key, but no backspace. There are no page up page down keys. There is no home or end key (very handy in a text editor). It's funny how you aren't aware of the shortcuts you use until you lose them, such as CTRL+Arrow (move word), or even CTRL+Backspace (delete word) - yes, you can do these with the Option key, but it's funny how off putting the change is. I'm used to doing sequences like "CTRL+X CTRL+V CTRL+Left Arrow".

Home and End are actually very handy ways to get to the beggining and end of a text field - or a document. They are also missing. Sigh. Hopefully I will find a keyboard remapper and map some of the function keys to these badly needed additions. And in the meantime, there is a guide that tells you what shortcuts exist.

Client-side image compositing using background images

No comments:
I long for a day when such hacks will be unnecessary, hopefully when IE (particular lt 7) goes into obscurity. Anyway, that's an interesting hack because it uses background images rather than z-order. The basic idea is the same, though - you make an image appear rounded by placing a "frame" over it which is transparent, only letting a circular bit show through.

Vista vs. OS X Leopard

No comments:
I've had a bit of a wild ride this last week on my quest to find a good computer with 4G (or more) of usable RAM, and a better CPU, primarily for software/web development. (Eclipse + FF + MySQL + everything else is a bit of a hog.)

My first thought was to go with Vista 64-bit running on a quad-core speedy machine. The first machine was very fast, but very big and noisy, so it went back almost immediately. The second machine was a very nicely made Gateway machine running Vista Home Ultimate 64 bit edition. The machine was good enough that I was able to keep it long enough to realize how bad Vista really is.

The key problems with Vista were very poor driver support, very poor application support, and file manager and system preferences that are impossible to navigate and butt ugly. And then the sheer sum of minor niggles was very long - UI elements were moved apparently at random, and most menu bars were removed. Many of my utilities from XP wouldn't run. I spent some time trying to address these issues individually, but in the end I gave up, mainly because I knew it didn't have to be this hard.

It's true that I could have installed Linux (probably Ubuntu) on this machine and been happy. But then I realized how crazy the whole idea of moving to a desktop was (I like to move around too much), and how important usability was, and how there's a little company in Cupertino who makes products for people like me called Apple Computer.

And you know what? I bought one (white MacBook 2.1GHz 1G 120G Penryn, home-upgraded to 4G, 200G 7200RPM). And I'm quite happy so far. The system is pretty and quiet and unobtrusive (very different than most PCs! Even the Thinkpad, by far my favorite PC, has a rather muscular, angular look in comparison). But what is really a breath of fresh air is the OS, OS X Leopard. I've come to understand why we pay people to improve the usability of software products - they earn their money, many times over, both literally and, I would like to think, spiritually. I mean, after all, isn't it nice to create things that leave people feeling happier, or, at the very least, no worse off than when they started using the product?

I think the key ingredient to Apple's success is simply this: they got the drivers right. To have a relatively stable platform to develop for has got to be wonderful. As any web developer knows, it is a sheer delight to write an app that only has to run on a single, modern browser (that isn't IE). I am sure that the same holds true for operating system programmers. One can really optimize the experience when you know approximately what hardware the user has to work with. And this frees programmers and UI people to do what they do best: a strange combination of "thinking outside the box" and obsessing over details that yields beautiful, functional software.

There are several simple things that Apple gets right with OS X. For example, the whole "disk image" thing, or dmg, for installing software is really sweet. The Windows notion of treating zip files as psuedo folders (introduced in XP SP1, I think) is brain dead in comparison. Having a real command line is huge for programmers (and end users benefit too because a happy programmer makes happy programs). I can't tell you how glad I am to get past Cygwin - not that Cygwin itself was bad (it's been too useful for me to call it that), but that terrible terminal and the file system skew drove me batty.

What's really interesting (and wonderful) is the sheer lack of things I have to install. For example, I no longer have to install ctrl2caps because you can remap the caps lock key using built-in and easy to use system preference dialogues. I've not had to install a firewall, anti virus (although I may install that), spyware blocker, or any of those sysinternals utilities designed to help make up for and recover from Window's deficiencies (although I have to add that a process explorer equivalent would go nicely). I don't have to install any "helper" software for multi-display or network setup (e.g. the Thinkvantage utilities that come with the Thinkpad) - the built in stuff works about 10x better anyway.

Then there are the pile of peripherals I don't need to buy or configure. Wifi is built in of course, but so is bluetooth and a webcam - and the last two are far from common on PCs. I won't need a firewire adapter if I get into video. And there are a bunch of utilities I don't need, like CD burning software because the Mac software just works. I don't need to install a better Explorer because Finder works. I may not install Thunderbird because Mail works (well, a lot better than Outlook anyway). I don't need DVD playing software because the Mac utility just works. (And I can't say the same for the Windows equivalents).

That is not to say the Mac is not without it's issues. Some sort of media reader would make a lot of sense (particularly an SD card slot). But more seriously, the way the mouse moves needs to be more adjustable. I'm used to a very linear mouse response curve, and the Mac seems to demand that you use a lot of acceleration - I do hope to find a solution for this as my hand is already aching. It would be nice to have some sort of docking port for the Mac, so that the tangle of cords (well, the power and external monitor cord, anyway) would be both hidden and easy to (re)connect. A second mouse button on the laptop itself would be greatly appreciated. I would like an easier way to move windows around, along the lines of the (sadly buggy) NiftyWindows for Windows. And there are some Windows things, like the excellent Fiddler debugging proxy and SQLyog, that I know I'll have to run in a VM (I hear Parallels is good), if at all.


jQuery on a CDN - finally

No comments:
Google was kind enough to host jQuery on a CDN (they also have prototype, mootools, dojo and a few others). While they have a fancy loader script that offers conveniences like optional minification, you can also get the script the "old fashioned way", with something like this:

http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js

In truth jQuery just isn't that big (about 15kb) so this isn't really useful for saving bandwidth - it's more useful for improving first-time user usability by reducing their wait time by maximizing simultaneous downloads. Most modern browsers are limited to two connections to a given server, and so spreading the load across many servers is a Good Thing. I'm not sure if this limit has a name, or even an RFC. I do know that the limitation is designed to prevent unintentional DOS attacks.

While I don't see anything particularly nefarious about this, I would like to point out that Google and the Mozilla Foundation (who employ John Resig, author of jQuery) are extraordinarily friendly, and I'm glad Google is performing this service.