The notion of fluid roles than can be resolved to specific items can be applied across a surprisingly broad range of domains. The resolution process generally involves using contextual constraints to pin down the exact item filling a given role. Here are some examples: the role of head-of-state in any democracy can always be resolved to a specific person but usually changes every few years after an election; the 49ers home stadium is currently Candlestick Park (or whatever its being called these days) but if they were to move to another city then that role would start being filled by different stadium; noon is a time of day whose absolute position in time depends upon the timezone in which it is resolved; independence day is a holiday that falls on a different day in every country that celebrates it and doesn't even exist in some;
The process of disambiguating roles seems to involve the application of constraints in a recursive manner. For a given role, we can know in advance the constraints required to resolve it. However, some of those constraints may themselves be defined by other roles, which would have to be resolved first. As long as we can define a dependency tree for this purpose, resolution should be straightforward. Sometimes this may not be possible because a pair of roles may have mutually dependent constraints. Usually this can be avoided when constructing the tree if some of the problem roles have multiple options for their constraint set. Sometimes, however, resolution may have to be performed iteratively.
The advantage of using fluid roles instead of fixed values is that you don't need to manually update anything when the value assigned to a particular role changes because it can be dynamically resolved as needed. This is the same principle behind the use of DNS to resolve unchanging domain names to potentially volatile IP addresses.
The current incarnation of Bugzilla uses a single page to display both the current state of a bug report as well as the discovery and discussion history that lead to it. For nontrivial bugs that have been around for a while this usually means that somebody who hasn't been following them since the beginning needs to read the entire discussion before grokking the current state. Although some of the current state may be captured in structured form using the fields that appear at the top of the page, that is usually insufficient information to properly understand the nature of the bug.
There is a solution to this problem that has been successfully applied to the domain of wikis: the talk page. This is a means of divorcing the state from the history so that it is easy to glean the currently known information about an issue while still having an avenue to continue investigation/discussion and preserving the history of this discourse. Applying such an approach to an issue tracking system like Bugzilla would eliminate the clutter on bug reports without requiring us to forgo the benefits of revising issue details as new facts come to light and opinions change.
Yesterday I was helping a kid edit an essay at the Pirate Supply Store - it's a front for a writing clinic - and couldn't help but notice some interesting characteristics of the manner in which he used the computer.
Like many people, he was using webmail as online storage. Surprisingly, he was using his mom's Yahoo/SBC account instead of having one of his own. I've heard that Google was surprised to discover how many people type entire domain names into their search box instead of the browser's address bar but watching this in person is still pretty weird. The kid typed "yahoo.com" into the Safari search box, which brought up Yahoo as the top hit. That's when it got even more bizarre. Google had conveniently provided links to the commonly used subsections of Yahoo in the search result. The first of these was Mail, on which I expected to see the kid click. Instead he just clicked on the main link and went to the yahoo home page before eventually logging in and arriving at his inbox.
The next observation to surprise me was the difficulty he had selecting text with the mouse. I'd previously assumed that any middle-school kid in San Francisco would be an expert mouse-user and he certainly displayed no other signs of impeded dexterity so I am tempted to attribute this difficulty to unfamiliarity with basic usage of a mouse. My hunch is somewhat supported by his complete surprise at my introduction of the scroll-wheel to his arsenal of mouse-using techniques. Later on I noticed that he tended to backspace his way through multiple words upon realizing that he'd mistyped one instead of just repositioning the cursor. Admittedly, I have seen this behaviour in expert computer users as well.
Made me wonder how much exposure kids really get to computers in school and how many kids in this city lack access to one at home. Maybe desktop computers are just getting old though, since he seemed to have no trouble using his cell-phone. Finally, I can't help but wonder if there's a way to make the enormous number of people currently using webmail as storage to start using the more effective tools we now have available for storing dynamic textual documents on the Web.
I spent half my day tracking this down so I am going to share it here.
When renaming a member function of a class, it is vital that you examine all classes that inherit from it to ensure that, should any of them override this function, you rename it there as well. Failure to do so can result in all sorts of nastiness.
Since both Google and VMware do regular tech-talks, some people at both companies thought it would be cool to give tech-talks at each others campuses. Today we had a pair of googlers on site to talk to us about using fuzzers to find security holes. It was a very interesting and the high attendance suggests that this might prove to be an enduring tradition. On Wednesday my teammate BenGwill be speaking at the Googleplex.
I upgraded my Ubuntu desktop from Edgy to Feisty today morning and upon logging in was greeted by this dialogue box. It didn't take me long to decide that I wanted to use the pc104 model, since that corresponds to my hardware. I was then stumped by the choice facing me because there was no clear relationship between the keyboard model descriptions and the buttons available to press.
Update: evidently the Gnome folks are aware of this already, although it's sad that it hasn't been fixed yet when somebody else already blogged about it over a year ago.
While designing user interfaces at VMware, we take great care to ensure that all the text we display is succinct, clear and relevant. We do this because people simply don't read long swathes of text that aren't interesting or entertaining. Wouldn't it be wonderful if legal text was held to the same standard? ...if the entire body of tax law had to fit within a few thousand words instead of several million? ...if product license agreements were restricted to a few hundred words instead of being dozens of pages long?
If ignorance is not going to be accepted as an excuse for violating the law then it seems only fair that the law ought to be redesigned so it takes human cognitive limitations into account.
Update: evidently the Brit gov't agrees with me.
VMworld was this week and I had a pass for Thursday. Although only attendees from Wednesday were supposed to attend the VMworld party that night, I was able to masquerade as somebody else and go anyway. I'm glad I went because the party was incredible; I've never seen anything like it in my life; it was as though they'd brought Vegas to us. Outside there were several free carnival games with little prizes and Smash Mouth was playing. Inside they had several different rooms that had been turned into representatives of various colourful SF neighbourhoods and they each had different forms of food and entertainment. The entertainment included stand-up comedy, karaoke, a mariachi band, 80's arcade games, costumed dancers, a jazz band, etc. And everywhere there was an open bar with a variety of beers and wines.
On Thursday morning I was on duty at the "genius bar" to answer questions about Workstation, although most people were, unsurprisingly, interested in Virtual Infrastructure. I also went to a bunch of breakout sessions. The most amusing of these was the panel discussion at the end where technical heads of several competing companies made snarky comments at each other for an hour; final verdict: Infiniband is kicking 10gigE's ass.
Altogether I was impressed by how well the conference was organized; we even had a booth for attendees to check into their flights! And a professional cartoonist had been hired to produce humorous illustrations of various virtualization-related terms, which were hung all over the place as decorations.
Sometime this morning the much vaunted Facebook platform fell flat on its, er, face. It began with error messages warning of site maintenance but eventually devolved into the server being unreachable altogether. There was no advance warning and, even after several hours, there's no official word on what happened or when we can expect it to be fixed. This is simply unacceptable for a platform with several million users around the world.
It would appear that, in its quest for world domination, Facebook forgot about architecting for reliability and high-availability. Maybe they should start looking into a more fault-tolerent system than whatever they have now ;-/
In the mean-time, there's a hilarious parody of Facebook for you to watch.
It seems to have come back online around 9am PST, although it's still a tad wobbly. I'm expecting an explanation of what happened.
Dear LazyWeb,
A few weeks ago my Blackberry 7290 began acting up. It keeps claiming that the battery is out of juice or displaying an "error 411" message and rebooting. I can barely use it any more. Buying a replacement battery hasn't helped at all either. Searching the Interwebs indicates that the radio is defective and RIM doesn't seem to offer any options of getting the device replaced, especially since it's no longer protected by the initial 1-year warranty.
Since I'm no longer bound by a contract with T-Mobile, I've been thinking of getting an iPhone to replace my ailing crackberry but
morethanreal suggested waiting for the 2nd revision of the iPhone. I could switch to Virgin Mobile instead, since they don't require a contract, and wait for the next iPhone.
What shall I do? I need to decide by Saturday.
-Quik
VMware recently bought me one of the new Core 2 Duo revisions of the X60 with 2 gigs of RAM. Although it came with XP installed, that wasn't of very much use to me as a Linux developer so I installed the latest version of Ubuntu Linux on it instead. To ensure the security of any source code on the machine, I am storing it inside a TryeCrypt disk.
Unlike the last time I tried running Linux on a Thinkpad (Fedora Core on a T42p over 2 years ago) or Ubuntu on a laptop (Dapper on an Aluminium Powerbook about a year ago), this time both power management (suspend-to-RAM and hibernate) and wireless networking actually work. The UI for connecting to a wireless network isn't as intuitive as that of OS X but no worse than that of Windows XP. Then again, OS X Tiger doesn't allow explicit hibernation.
The relatively low XVGA screen resolution (1024x768) on the 12 inch LCD has been frustrating after getting used to the high res displays I have on my desktop systems at home (1920x1200) and work (1600x1200x2) but I suppose that's the price of portability - the X60 is incredibly light at barely over 3 lbs - and a long battery life (nearly 5 hours on a regular battery). I can even deal with the lack of a touchpad. My only real gripe is that I can't adjust the screen brightness without crashing X11.
Update: I was able to get the screen brightness adjustment buttons on the keyboard to work (by unloading a kernel module that was causing the problem) but have discovered that the ethernet card drivers don't seem to like it when I suspend the system.
There's an idea I've been mulling over for a few years now and, having discussed it informally with many people, I believe that it is worth describing in detail to solicit further evaluation. It describes a system for prioritizing tasks and allocating resources to accomplish them in a utilitarian manner.
The system is designed around a collection of tasks. This collection is viewable by all participants and any participant may submit new tasks for addition to it. Depending on the use context, it may be prudent to have gatekeepers filtering incoming submissions. Each task in the collection has a bounty associated with it. This bounty should be linked to a reward system so that participants have an extrinsic incentive to successfully complete tasks. The value of a bounty is dynamic but should usually increase monotonically. The bounty of all tasks may increase uniformly with age but this natural growth of the bounty may be expedited by participants pledging their resources towards the bounty of tasks they particularly wish to see completed.
At some point, a task will be claimed by a participant who feels the bounty is worth the effort required to accomplish the task. When a claim attempt is made, all sponsors of the task will be contacted and asked to place their previously pledged resources in escrow until the task has been accomplished. Once the necessary quantity if resources have been placed in escrow, the task is assigned to the claimant, who is then responsible for providing regular progress updates on it. If these updates cease for a predetermined length of time then the sponsors may withdraw their resources from escrow and the task will be returned to the unclaimed state.
Once the claimant has completed the task, each sponsors must approve it before their resources are released to the claimant. If there is a dispute about the level of completion, all involved parties may engage in discussion and further work may ensue. Otherwise, the claimant may choose to relinquish the unclaimed portion of the bounty. To discourage sponsors from turning into deadbeats, their resources are held in escrow until the claimant decides to relinquish them. Likewise, claimants are discouraged from tying up resources in endlessly disputed conflicts by having all their currently assigned tasks viewable before sponsors agree to place pledged resources into escrow.
I believe that this system will tend to deliver task completion at the lowest price on the market while letting participants effectively pool resources to accomplish shared goals. One thing that I haven't figured out yet is a way of incorporating tasks which have an expiration date because my proposed conflict resolution method doesn't handle that well.
As a consequence of going through Waterloo's revolutionary co-op program, I had several amazing work placements during my time as an undergrad. On some of these I was fortunate to have been mentored by stellar software developers like Michael Valenta and Tom Ball. Now I have an opportunity to pay it forward; I'm mentoring an intern this summer.
He's going to be working on the addition of GDB support to the Eclipse plugin I wrote for Workstation 6.0 so that C++ developers can take advantage of it as well. That would nicely complement the Replay feature in Workstation 6.0 that allows developers to easily track down bugs that are hard to reproduce by letting them jump back in time after encountering such a bug and then step through the code path that was just executed.
There's nothing quite like having a new person around to highlight all the weird internal jargon being used in an organization. My strategy for dealing with this is to add brief explanations of every term that confuses him to the wiki so that in future people can just look them up on there. Wikis are awesome that way.
Update: On his first time participating in our weekly Starcraft session, he destroyed everybody else in about 15 minutes!
There are many aspects of software design that may be considered when creating a new application, library or communication standard (e.g. API, data storage format, wire protocol): scalability, flexibility, portability, usability, extensibility, localizability, consistency, measurability, interoperability, security, reliability, availability, maintainability, efficiency, etc. In theory it would be wonderful to account for every one of these in the original design but in practice we are constrained by market pressures and resource limitations. This makes it necessary to prioritize certain aspects in the initial design and iteratively focus on others during subsequent refactoring. I think that a good approach would be to focus on a very small number of aspects for each major release, adding functionality in minor releases (e.g. 1.1) and fixing outstanding correctness issues in revisions (e.g. 1.0.1). [My personal inclination is also to prioritize fixing correctness issues over functionality additions and design improvements.]
This leaves open the question of which aspects are best suited to being prioritized for the initial release. The important thing to realize here is that, for software that is not merely a clone of other mature software that already serves the needs of a particular domain, it is very likely that the future usage patterns cannot be accurately predicted. A flexible architecture is therefore of paramount importance. Designing for change should take top priority so that future changes can be made quickly in anticipation of user needs and market direction or in reaction to unexpected events. In keeping with this strategy, it is also a good idea to design the software to be easily upgradeable by its users.
The second most important aspect for nascent software is determined by the need for users. Software that isn't being used is no better than software that was never written. If you want your software to be used then you should take user needs and biases into account when designing it. Naturally, this means identifying your target user base, although you should be open to usage beyond that initial target. When selecting an initial target user base, it is a good idea to focus on a narrow set of users with whom you have some existing familiarity. Once you pick a user base, you should observe how they go about their lives and find a problem they regularly encounter that is worth solving and for which you have an idea for a better solution than they one they currently employ. Make careful notes of the constraints they face, the ease with which their current solution is applied and the utility it provides. This is your competition.
Contrary to their own privacy policy, Performancing appears to have allowed an unscrupulous 3rd party to obtain the unique email address I used when registering for an account with them:
From: Microsoft - Corporation <ciasiabvue@charter.net>
Date: April 15, 2007 12:11:19 PM PDT
To: undisclosed-recipients:;
Subject: RE: Microsoft And AOL Award Team
Reply-To: microsoftpromo@microsoftpromo.cjb.net
[2 lines removed to protect my email address.]
Received: by 10.100.12.7 with SMTP id 7cs269082anl; Sun, 15 Apr 2007 12:16:08 -0700 (PDT)
Received: by 10.67.116.2 with SMTP id t2mr3736531ugm.1176664568335; Sun, 15 Apr 2007 12:16:08 -0700 (PDT)
Received: from neur0soft.com (neur0soft.co.uk [80.175.29.76]) by mx.google.com with ESMTP id c24si10617831ika.2007.04.15.12.16.07; Sun, 15 Apr 2007 12:16:08 -0700 (PDT)
Received: by neur0soft.com (Postfix, from userid 1012) id CF2741A797; Sun, 15 Apr 2007 20:16:08 +0100 (BST)
Received: from smtp.easydns.com (smtp.easydns.com [205.210.42.52]) by neur0soft.com (Postfix) with ESMTP id CE4E51A78C for <quik@neur0soft.co.uk>; Sun, 15 Apr 2007 20:16:07 +0100 (BST)
Received: from mtai01.charter.net (mtai01.charter.net [209.225.8.181]) by smtp.easydns.com (Postfix) with ESMTP id 63A2B559FC for <performancing@quikbox.ca>; Sun, 15 Apr 2007 15:15:53 -0400 (EDT)
Received: from aa01.charter.net ([10.20.200.153]) by mtai01.charter.net (InterMail vM.7.08.02.00 201-2186-121-20061213) with ESMTP id <20070415191120.VJYV1533.mtai01.charte
Received: from fepweb08 ([10.20.200.58]) by aa01.charter.net with ESMTP id <20070415191119.HCBD8690.aa01.charter.ne
Return-Path: <quik@neur0soft.com>
Received-Spf: pass (google.com: domain of quik@neur0soft.com designates 80.175.29.76 as permitted sender)
Received-Spf: pass (forward1: domain of ciasiabvue@charter.net designates 209.225.8.181 as permitted sender)
X-Spam-Checker-Version: SpamAssassin 3.1.0 (2005-09-13) on williaf2.miniserver.com
X-Spam-Status: No, score=0.9 required=3.2 tests=ADVANCE_FEE_1,UNDISC_RECIPS autolearn=no version=3.1.0
X-Original-To: quik@neur0soft.co.uk
X-Greylist: Passed host: 209.225.8.181
Message-Id: <596299373.1176664279931.JavaMail.root@f
Mime-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 7bit
X-Priority: 3 (Normal)
Sensitivity: Normal
X-Originating-Ip: from 190.170.20.175 by mail.charter.net; Sun, 15 Apr 2007 15:11:15 -0400
X-Chzlrs: 0
The xterm application, which is distributed with most X11 implementations, sports a -e flag that accepts a command followed by a sequence of arguments, all of which are space-delimited. I'd been exploiting this feature to ensure that when I programatically executed console apps inside a Linux VM, the user could interact with them. All I had to do was run xterm with the -e flag and follow that with the location of the console app and its arguments (e.g. xterm -e "xeyes -center red"). Everything had been working fine when I tried this on modern Linux distros but today one of the QA people tried it on Redhat 8, which was released in 2002, and saw a nasty error message complaining that the execvp syscall could not find the specified file.
Curious about the cause of this problem, I tried manually running xterm under strace with the same arguments. This revealed that the xterm binary in XFree86 4.2 that was part of Redhat 8 simply tries to call execvp with the entire quoted string as the first argument. Since that string contained space-delimited arguments appended to the binary's name, it couldn't be resolved as a valid pathname by execvp. That made sense but it didn't explain why it worked in newer releases of xterm. Trying the same thing with the xterm binary on my Ubuntu 6.10 system revealed that xterm now falls back on passing the entire quoted string to the shell for execution if the call to execve fails. Since bash knows to deal with the space-delimited arguments, that works fine.
I was trivially able to solve the problem by removing the quotes.
It struck me today that an election isn't all that different from an auction so I tried to see how many commonalities I could factor out.
An election typically involves a number of entities who usually (but not necessarily) have an equal number of votes and a (usually smaller) number of candidates vying for a smaller number (frequently just one) of winning spots. The voters try to influence the outcome of the election by casting votes in favour of candidates and the candidate(s) with the most votes win(s).
An auction typically involves a number of entities who have varying quantities of resources (usually money) and a number of items (frequently just one) for which the entities iteratively place monotonically increasing competing bids until none of the bidders wishes to raise their standing bid. At that point, the available items are awarded to the highest bidders.
In both situations, there are a number of participants using scarce resources (votes or money) to determine the subset of competing options (candidates or buyers) that gets selected from the available pool. One potential difference is that votes are usually not reusable but money is.
Variants of the typical processes (e.g. Dutch auctions or instant runoff elections) may introduce other discrepancies into this generalization.
We're doing a "book club" type deal with a product manual at work so I needed to print out a section of the manual and mark it up with red pen. However, when I tried to print it out on my Linux system, it wouldn't work. Not particularly shocked, I asked a coworker to print it from his Windows machine, since mine isn't configured to print. When he brought up the Print dialog, I noticed that there was a checkbox labelled "collate" beside the text field for specifying the number of copies to be printed. Not entirely sure what it meant, we clicked the little interrogation mark in the title bar and then on the checkbox to bring up a tooltip. The tooltips contents made my eyes roll: "this checkbox allows you to specify whether or not you want your pages to be collated."
It turns out that enabling collation prints out each copy of the entire document in sequence, instead of having all copies of each page together. I tried hard but haven't been able to think of a reason why somebody might not want their pages collated. Something tells me this checkbox was added with little thought to the user's needs.
Back at Waterloo when I was taking a course about the theory of computation, I wondered how relevant it would be to the sort of programming I'd be doing during the course of my career. That question was answered a few weeks ago when I actually wrote a state machine to solve a problem that involved dealing with a series of daisy-chained callbacks from the functions provided by the asynchronous library I'm using.
Yesterday I discovered a concurrency issue in my code. In order to execute bytecode on the guest OS after building it on the host OS, my Eclipse plugin shares the project folder with the guest before launching the app inside it. Now, in order to provide developers with maximal flexibility, the plugin allows them to debug multiple instances of an application on the same VM simultaneously. However, because the plugin cleans up after itself when the application terminates by removing any shared folders used by the application, it's entirely possible for one instance of an application to remove shared folders currently in use by another.
What I needed was a way to ensure that shared folders would only be removed when there were no applications left using them. The obvious approach was to use reference counters via a map of shared folders to counters. But I had to ensure that the value of this counter wouldn't be mangled by read-write overlaps from multiple launches. The desired behaviour sounded strikingly similar to what I'd learnt about semaphores in school, except I wanted to increment the count when using a folder and decrement it when I no longer required it. This is the reverse of the textbook use-case for semaphores, which were designed with resource contention in mind. Fortunately, it seems that Sun's implementation of semaphores actually handle my use-case just fine.
After a relatively painless experience upgrading my Ubuntu desktop from Dapper to Edgy, I was feeling a little adventurous. I've also been curious about the recent release of Solaris 10 so when I heard that we now have a feature-complete build of VMware Tools for Solaris, I decided to try installing it inside a VM. I copied the 3 gig DVD ISO of 64-bit Solaris 10 onto my local disk, created a new VM in Workstation and booted it off the DVD image.
The installer began by asking me the usual questions (language, timezone, network config, etc.) and then move onto package selection. This is where it became confusing. There are 3 distinct stages of package selection and considerable overlap amongst them! The 3rd stage gave me ample opportunity to mess around with the choices I'd made earlier. What a usability nightmare! It reminded me of using dselect back in 2000. With all the emphasis Sun put on making Gnome more usable a few years ago, you'd think some of that would have permeated to the Solaris installer team...
The other user-experience gaffe in the installation process was that, despite having asked me for the language, timezone and network settings at the onset, upon booting Solaris for the 1st time I was required to enter all this information a 2nd time (in a completely different UI). It's a lot to tolerate for the chance to play with Dtrace and ZFS.
Navigate: (Previous 20 Entries)