Thursday, August 28, 2008

Something Else I Obviously Don't Understand

off slashdot: http://blog.wired.com/gadgets/2008/08/bell-labs-kills.html

So Microsoft is now the only corporation I know of that still does basic research. How are they able to do this?

Is it because fundamental physics research is that much more expensive than computer science research (and Alcatel-Lucent can’t make up the difference)? Is it because Alcatel-Lucent is (probably myopically) profit-focused? Is it just because Microsoft is huge? Some combination of the above?

Tuesday, August 26, 2008

To Everyone Who's Been Trying To Contact Me Over AIM

I frequently maintain two connections to my Jabber server: one from work, and one back on my personal laptop, which I’ll just call “home”.

The Jabber server runs an AOL Instant Messenger transport that proxies an AIM login session as another Jabber server, which is how I connect to AIM these days.

However, something is going wrong, and messages aren’t being correctly routed. In order of decreasing probability:

  • The AIM transport (pyAIM-t, for those of you who are interested) isn’t routing the messages to the correct Jabber connection.
  • The resource priorities I have set up (basically, which Jabber connection “gets the messages”) are wrong. I don’t think this is the case, as “normal” Jabber traffic is correctly routed, but I’m always willing to entertain the idea that I’ve screwed up.
  • Something entirely different.

The upshot: If I’m not at work and you message me over AIM, I won’t get them until the next work day. If it’s really urgent, use Jabber/GTalk/whatever: trythil@ninjawedding.org, as I know that works. (Or call me, e-mail me — anything you have.) In the meantime, I’ll try to figure this out.

Post on that mysterious “second interaction problem” coming soon.

Monday, August 25, 2008

That Mysterious Second Interaction Problem

(in transit)

Monday, August 18, 2008

On Interaction Design - A Simple Fault

Here’s a screen from an application I’m building at work. For ease of reference, I’ll call this screen Figure 1.


Figure 1: Requisition screen.

You can’t complain about the design unless you’re willing to send me a comment on how I can fix it. Besides, I’m going to be complaining about it anyway.

Some simplified definitions:

  • A requisition consists of a collection of samples and study data.
  • Samples are matter taken from a body: various tissues, blood, urine, etc.
  • Study data includes the study identifier, some patient information, and some information for billing purposes.

The interface in Figure 1 uses tabs to break up the sample and study data datasets. This provides a sparse, cleanly-laid-out UI. But is it too sparse?

Yes. It is. Here’s the problem (as I observed it) from user testing. It’ll probably help to have the screen figure up as you read the below text, unless you already know what the problem is.

Users would progress in a downward motion through the form. This was expected. After that, they’d click “Save Changes”, which is a quite logical thing to do, considering its position relative to the form.
This is permitted — neither the application logic nor the data model places any restrictions on data entry order — but it’s not the interaction model that I had in mind. I thought that users would progress through each tab first and then press “Save Changes”.

The upshot of all this is that users became confused about sample entry, and wondered why entering samples required two trips to the same page. After I explained that clicking “Save Changes” saved data for both tabs, they immediately understood the implications and began to use the interface in the way that I initially thought they’d use it.

(An aside: Why did I even use tabs the way I used tabs? Well, to be honest, it’s based off of my own experience. When I see a page of tabs, I go through each tab, provide the data, and then assume that any controls outside the tab apply to all datasets. Whether or not this is how the majority of computer users think is irrelevant; the real lesson here is that trusting your own experience in UI design is a very bad idea. Because you’re always wrong.)

Anyway. The fact that they didn’t use the interface in the way I meant it to be used meant that I had a problem. My test group wasn’t everyone who would use the application; there would be future users, as well, and they would be starting out from square one, just like my test users did. They’d probably do the same thing, and hit the same frustrations. What to do?

The obvious solution is to document the application, but I didn’t want to burden the application with lots of inline documentation. That’s too hard to read, and it clutters the UI with stuff that people will read once and never read again (which makes said documentation useless). Besides, I don’t like the idea of applications that try to force you to match their expectations. Man-machine relationship and all that.

A much better solution is really, really simple, and I bet that everyone reading this has already come up with it.

I’m going to put “Next” buttons at the bottom of each tab, and put the “Save Changes” button on the last tab. In this way, it’s possible to let advanced users use their own workflow (which is one thing that tabs facilitate) which guiding novice users with a gently-defined procedure (which is one thing that tabs, by themselves, are totally inappropriate for).

There’s another UI problem in this same page (second tab, really) that I’ll write about later. I’m interested to hear, though, how many people reading this immediately saw my design as problematic. (I obviously didn’t.) If so, how do you know? What principles do you use for UI design?

There’s a couple books I’ve got on my to-read list for this sort of stuff (since it’s obvious that I don’t know jack about UIs), but personalized insights would be great, too.

Sunday, August 17, 2008

More From The Air And Water Show

Just a few more photos from the Chicago Air and Water Show, taken just today. Click on thumbnails for larger image, etc.

There was a pretty huge crowd there. It’s a little hard to tell in this photo, but there were people extending all way from Navy Pier to North Avenue Beach.

The Air Force Heritage flight, displaying a selection of the most historically significant planes of the U.S. Air Force.
From top to bottom: P-51 Mustang, F-4 Phantom, F-15 Eagle, and the F-22 Raptor.

A few pictures of the the Aeroshell Aerobatic Team.

Friday, August 15, 2008

The Little Things

Work update:


I mentioned the Air and Water Show yesterday. Turns out we have a pretty fantastic view of the aerial bits; here’s a photograph of this afternoon’s Blue Angels’ performance, taken from inside the office:

You can really feel the planes zooming by.

The show is scheduled to run until 9 PM (UTC-0500). Currently, there are F-22s screaming over the lake; it’s pretty awesome. Especially when they ramp up the speed and the floor vibrates.

Thursday, August 14, 2008

A Quick Note

The Blue Angels are here for the Chicago Air & Water Show.

The show doesn’t officially start until tomorrow, but the Angels are performing air acrobatics outside.

The show occurs over North Avenue Beach and Navy Pier; the location of my office isn’t too far. Or, if you’d like a map, click here.

Needless to say, I am getting very little done today.

Sunday, August 10, 2008

ARSS

Reading slashdot comments today introduced me to the ARSS.

If you’re familiar with Metasynth, this program performs a job similar to it (i.e. synthesizing audio from images). However, ARSS can also run that synthesis in reverse, and it has two nice things going for it:

ARSS has no integrated editor yet (all examples presented by its author are made with Photoshop), but it’s still a neat piece of software.

Friday, August 08, 2008

Probably Overdoing It

+----------------------+-------+-------+---------+---------+-----+-------+
| Name                 | Lines |   LOC | Classes | Methods | M/C | LOC/M |
+----------------------+-------+-------+---------+---------+-----+-------+
| Controllers          |    66 |    47 |       4 |       5 |   1 |     7 |
| Helpers              |     9 |     8 |       0 |       0 |   0 |     0 |
| Models               |    88 |    79 |      16 |       1 |   0 |    77 |
| Libraries            |     0 |     0 |       0 |       0 |   0 |     0 |
| Model specs          |   606 |   492 |       0 |       0 |   0 |     0 |
| View specs           |   417 |   336 |       0 |       0 |   0 |     0 |
| Controller specs     |   238 |   180 |       0 |       0 |   0 |     0 |
| Helper specs         |    33 |    21 |       0 |       0 |   0 |     0 |
+----------------------+-------+-------+---------+---------+-----+-------+
| Total                |  1457 |  1163 |      20 |       6 |   0 |   191 |
+----------------------+-------+-------+---------+---------+-----+-------+
  Code LOC: 134     Test LOC: 1029     Code to Test Ratio: 1:7.7

Sunday, August 03, 2008

OAuth, OpenID, and Rails - Oh My!

For work, I’m investigating some solutions to provide a consistent interface to a rather large and diverse collection of applications we’re running. All the applications require authentication and have different authorization levels. Many of these applications are Ruby on Rails Web applications. Others are written in ColdFusion. (And I’m sure there’s some PHP and J2EE apps floating around.)

We’d like to stick to developed standards as much as possible, mostly because rolling our own code and protocols would be risky and costly. (And, unless going our own way was the only option, it would also be stupid.) To that end, I’ve built a small proof-of-concept application suite that demonstrates integration of OpenID and OAuth. OpenID is used for authentication; OAuth is used to authorize Web services. The suite is built off the work of a lot of people:

In other words, I did pretty much zero work. Still, I haven’t seen something like this available on the Web, so I’m putting my stab at it up. Maybe someone will find it useful.

The code can be found at http://code.ninjawedding.org/oauth.git. (You’ll obviously need the git suite.) The OpenID + OAuth integration is in branch openid.

Like any quickly-produced demo, there’s a sequence of steps that one should follow to avoid hitting the dark corners of untested functionality. Be sure to read the WALKTHROUGH file in the source repository root.

Oh, and I welcome any comments on the sloppiness of this code. :P It was pretty hastily thrown together; although you can probably grok the basic concepts involved pretty quickly, I wouldn’t use this code in a production environment. (It was my first try. Always throw away the first try!)

Cooking Journal - Chicken Curry with Rice, and Other Stuff

Did this on a suggestion by pbtc_pero.

I’m not really sure what to say about it, procedure-wise. Cook rice, cut up chicken and vegetables, stir-fry, add water, stir in curry mix and go. (It did work.) But, really, what else is there to say? :P

Well, okay, I guess I can write about the vegetables. I didn’t use potatoes and carrots: nothing against them, it’s just that I didn’t have taters and carrots handy. So I used green pepper and onion instead. Worked out pretty nicely.


Not sure how well known this is, but here’s a useful, quick way to fill up a rice cooker that my mom taught me. Maybe others will find it useful, too:

Put your index finger into the water at the thickest point of the rice. Don’t dig into the rice; just touch the surface. When the water level comes up to just below the first crease in your finger, you’ve got enough water.

This has worked out great for me for quite a while. It produces really nice, moist rice (but not like, say, congee) and removes the need for a measuring cup. The technique may require some adjustment based on local humidity: for example, in Chicago and Indianapolis, I put less water in than I would put in (say) Colorado.

One thing I didn’t add is cumin, but adding more to the curry powder (which probably already had cumin or something cumin-like) might have just been overkill.

Next thing to try, I guess, is to make curry from scratch; i.e. not using prepared mix. Takes a bit longer, though.

Saturday, August 02, 2008

Not Quite a Standard Song List

So there’s this In The Groove 2 machine near me that has a few, uh, custom modifications:

I like it.

Email Test

Can someone send mail to trythil+hobix@member.fsf.org and trythil@member.fsf.org?

I have no idea if the first forwarding address is working. If it’s silently dumping mail on the floor, I’m probably losing comments left and right.

Friday, August 01, 2008

Coincidences

One of my co-workers is a regular ACen and Otakon attendee. (He’s been attending ACen for about four or five years.)

This isn’t particularly remarkable in and of itself; lots of people go to anime conventions. As he remarked, it is a little weird that he’s never seen me at ACen before, but, well, ACen’s pretty huge and it’s not that odd to not run into someone there, even over the span of years.

The more remarkable part is that he’s not only familiar with anime music videos, but also a fan of them. More remarkable than that is that he’s seen AMV Hell 0. (I have no idea what his reaction to it was.)

But, no, the really remarkable part is that he’s an AMV editor, or at least talks like one. (He doesn’t know I’ve been involved with AMVs before. Yet, anyway.) I don’t know his username on a-m-v.org.

I think it’s interesting. How often do you cross paths with people who share such geeky (to be frank) interests?

Well, maybe it’s actually pretty common in tech industries, I don’t know. I’m actually hoping it is common — someone with no especially geeky interests probably wouldn’t do so well in high-tech.