Showing posts with label usability. Show all posts
Showing posts with label usability. Show all posts

Sunday, March 22, 2015

Actual home automation: building the helpful dumb house

Robots aren't anywhere close to being able to automate the annoying aspects of our lives.

I've gotten another Raspberry Pi, and the first one is working well with Oscar - other projects like TheThingSystem and Ninjablocks have falled by the wayside a little.

The only things I've got that I can feasibly automate include an automated cat feeder; or maybe an outdoor vertical garden.
Neither is really solving a proper life problem - not the same way that watering timers do.

After thinking about it for a while, the issue isn't making the full leap to automation. A modern flushing toilet is an incredible piece of automation - gone is the requirement to deal with waste daily, and when linked to a modern sewage system; the benefits to health, labour and much more are a very good trade-off.
All of this is reduced to a simple mechanical button and a charge from your council.

Building collaborative agents that can reason about the best rules to apply in the best situations is a very hard problem. Simple triggers like "motion detected in room X" firing "switch on light" need contexts and bounds: there's no point switching on a light if it is daylight; or put better; the ambient light provides a suitable visibility.
Dealing with multiple actors at once and building models of their "comfort" is way, way beyond what we can do - the sensors we have and means to deal with their input are far far to limited.

Maybe this isn't such a bad thing. Many people have recently ridiculed light switch apps on phones - a simple mechanical trigger coupled with a human solves the room lighting problem in a residential house really well.

So by that token, what can we do with more limited sensors, automated schedules and basic rules that can be reduced to a user hitting a button; or not?
I think the answer goes back to Oscar and TODO list systems like Trello - higher level decision making is almost always going to require a person; and the decision making should be for difficult or relevant tasks.
Trello and others solve the communication amongst a group of humans problem really well - it ends up being a really rough service bus.

What can we do to take advantage of that?

Observation 1: The federal government is really stuffing up the South Australian economy, with doubt around renewable energy projects, car manufacturing support ending, defence projects being on-again, off-again.

Observation 2: A lot of skilled labour is looking for new opportunities, through things like Airtasker or Gumtree. Many of these folks aren't 100% tech saavy, but are tech saavy enough. They aren't going to earn a living, but they are going to be able to take small opportunities. Provided that doesn't inflict an opportunity cost on them (being unable to find full time work because they are too busy chasing small scale work).

Observation 3: Service provider hubs are cropping up like wildflowers. The next evolutionary steps for a lot of them are going to be APIs - be it internal APIs for mobile apps or public APIs. Uber has forced all of the taxi companies in South Australia to compete with apps - they aren't pretty, but they are an evolutionary step.
In the Philippines, the taxi based culture is very prevalent - aggregators have sprung up with a few major 'platforms' allocating work across companies.

Google Now is the best implementation so far of 'Helpful Agent' that I've seen, recognizing when there is travel happening and prompting with directions, food, etc.

We can surely take the google now approach to sensing when something is happening; and prompting a user for decisions. The candidates should be recurring.

To that end I think my next project is going to be "Raspberry Pi that polls users for feedback constantly".
The idea for anyone who has flown through Singapore's Changi airport is pretty familiar - How would you rate the cleanliness of this room? Poor, OK, Great? on a touch screen.
Combine that with an agent that offers to post a job to Airtasker for a one-off clean, and you are really onto something.
Apps like http://www.moodpanda.com/ exist, as do a lot of fitness apps (Google health, Up, etc); even for your dog (Whistle; which I have found to be very effective) - people have done a lot of data collection in the past.
Automating that and focusing on the problem areas in your home is going to create a much smarter sensor. You don't need to build an entire AI to understand a model of the real world if you optimize the questions correctly.

This will not get us smart houses, but potentially helpful dumb houses. I think that's a pretty worthy goal.






Saturday, September 08, 2012

Improvements to rabbitvcs

RabbitVCS is handy for those making the jump from TortoiseSVN in windows. I usually make do with svn log / git log and the command line, but as part of my new work there's often horrible user names (think completely numeric) and commit messages that are just a pain to trawl through.

So, I've turned to RabbitVCS to fill in a gap. I managed to heckle the maintainers, and a release was put out not long after. Neat, I thought - but I saw their issue tracker, and saw patches languishing without love.

I started out with triage, and highlighting patches that could be implemented. Even then, it still wasn't working for me. I added a few bug fix patches; posted to the mailing lists, etc - a few got accepted, but overwhelmingly there was silence.

Unfortunately when I get interested in hacking away at something, I'll put in a few hours - uploading static .diff files and abandoning them in my local working copy was getting a bit annoying, and I suspect the folks on the devel lists were unprepared for a patch flood.

So... I've mirrored it, and then forked it onto my github account. I've put it back to the developers that I'll keep mirroring, and help them migrate if they so choose.


I give you 6 distinct bug or feature requests.

  • Filter log dialogs by typing in text
  • Copy log messages to clipboard using a context menu or ctrl + c
  • Refresh commit dialogs
  • Hit escape / ctrl + w / ctrl + q to close dialogs (well, most of them, there's a lot and it's boring to implement).
and there are less bugs overall.

I learnt a fair amount about python's GTK libraries, which turned out to be all pretty straight forward if a little tedious to work with at times - text buffer wants to force me to use an iterator, rrrr.


That aside, to get your hands on the latest:
$ git clone git://github.com/CloCkWeRX/rabbitvcs.git
$ sudo python setup.py install

And the first time you do this, you'll need to fix permissions on the config
$ sudo chown -R you:you ~/.config/rabbitvcs/

To test, it's pretty simple - go find a Git or SVN repository, and type:
$ rabbitvcs

If you spot errors, check the latest bugs and report. Hopefully either folks will swap over to the new github home without much angst (I'll transfer it to a github org of theirs if needed), or the patches will get applied against SVN.



Thursday, August 09, 2012

Rosewater Post Office

Why can't you open an hour earlier one day a week? No one who works in the city can possibly collect a package from you and get to work on time.
Alternatively, stay own an extra hour once a month or even open on the weekend.
When delivery companies ignore the instructions re placement of parcels and just deliver it to the nearest post office, that parcel is trapped until the owner has a half day off of work.
You need a half day because it takes a hour to get in to the city by bus, and after the peak transport windows slam shut, you have to wait about half an hour for that bus, if it deigns to arrive at all.

Starting at lunch never looks that good.

Others when faced with this problem have had packages delivered to work places - but this is not viable with bulky packages, or things where you need to wander through the city and onto a bus carrying heavy items.

So we have established the quick fix around opening hours, but what about the longer term?
Part of the problem is Web applications that don't provide delivery instruction capture.
In my view there should be a way to register a default delivery preference.
Australia Post has the trust and national reach to provide a service like this, and courier companies would undoubtedly like the idea of understanding what to do, rather than hauling the item off to the post office.

Here's how it works. The parcel delivery that fails is indicated by a card telling you where to go to get your package. On the back of it is a Qr code, and a plain text id plus link.
This token is secure, and let's you sign up. Your address its pre known.

You fill out the default instructions and agree to what ever you need to about sharing the info with third parties, and liability.

When you collect your package, the auspost agent certifies your id and the account is live.

You get annoyed at the first package, but not at the next.

Downsides - modern houses need a climate controlled secure delivery point, where authorised items can go in but other things cannot. Letter slot in the door 2.0.
This enables food delivery and other bulky items.
I am not an architect, but variations on dog doors, or a keyed deposit box seem to be a good starting point for what this could look like.

The second one is if you move house, your packages are left with the next occupant.
While this is an issue for mail, most people making purchases of a substantial nature are less likely to ask for it to be sent to the wrong place.

This seems doable. In fact, everyone who ever had their mail redirected already did the days capture part of this concept.

Sunday, June 17, 2012

Why is there no apparent way to close this notification?

Gnome 3, you mostly work. The one thing I  can't stand though is this notification you continually give me:
It's whenever my USB HDD is detected - which seems to be somewhat randomly. I don't really care if it's connected or not, but why don't you go away when I want you to?

I never want to eject. I rarely want to Open with Files. Instead, I want the notification to vanish.

Where's the control for that? There isn't one. Instead, I have to "Open with Files". Every. Login.

The notification doesn't vanish either - it stays on screen for as long as it likes.

Any folks who can help me trawl gnome's bugzilla for existing issues like this, please do comment.

I have got:


...but those don't have much momentum

Wednesday, June 13, 2012

Details

One of the things said to me as I left RP Data/ValEx was "Dan, you are into way too much detail".

I've been told that time and time again, but never had a good counter argument. It's hard to explain why making a link between two public websites which took about 12 months of championing to achieve is important; or fixing the login form to redirect you back to the original URI you were viewing are worthwhile.
I know from experience that small usability fixes like this can pay off in big ways - I've just had difficulty explaining what and why those matter.

I may finally have an answer: sweat the small stuff.


Tuesday, May 29, 2012

Xbmc remote experience

Samsung galaxy ii trumps ipad in almost everything.
It has more apps and better integration of my google and other services.
The only thing it needs is the auto discovery of xbmc hosts in the official app. The ipad has xbmc constellation which is just a touch nicer. The ui is better as is the volume controls.

Sunday, November 13, 2011

Why is Gwibber so slow?

Gwibber seems horribly slow and CPU intensive. From what I've read, there is much finger pointing and little actual solution - just vague hand waving about desktopcouch being a terrible backend.

Development seems dead in the water. How have we ended up at this point? Why don't I have ways to integrate TweetDeck or any other client as well? Why does gwibber-service need to run all of the time?


Friday, March 18, 2011

Rabbit VCS

James points me to Rabbit VCS.

"total clone of tortoise... I'm so happy right now."

Friday, October 01, 2010

Queries

I ran across a thread related to queries, CBA and ValEx.

As someone who is building this particular functionality, it's interesting to see what effect it has on the average person.

Monday, June 28, 2010

Most Ridiculous Design Ever

At work, we've got roaming profiles. I've just spent 20 minutes logging on, because I have a 7-8gb shared mailbox in my outlook.ost; and that makes things unhappy.

What beggars belief is how you move your outlook.ost.

Call me stupid; but I rather thought we'd mastered the basics of a "move" file within our operating systems.
Apparently, the outlook 2007 team has some reason to make that impossible to do - the user interface fights you every step of the way.

Unless you disable a tonne of options which should have no bearing on your ability to move, copy, or change the location of your offline mailboxes; Outlook will not let you touch this setting.

Ridiculous.

Sunday, May 16, 2010

Playdeb, and ubuntu wishlist items

I'm a huge fan of playdeb. The fact there is an apt URI handler available in ubuntu makes everything trivial - and I'd encourage lots of existing games to simply link to playdeb for a stable version.

What does annoy me though - because software installation in ubuntu is nearly flawless as it is - is that I can't have two package managers running at the same time.

Why not? Why can't I queue up several things to install? I can do that in windows; why do I have to wait around and install things one at a time?

If another package manager is working; why not prompt me with a question; rather than an error? "Another package manager is working, would you like to queue this installation task until after it has finished?"



There's some inklings about this, but most miss the point - Bug #74134 wants to make the failure more user friendly; but why should it fail at all?

I've opened a blueprint for it; which is probably a dupe; but I couldn't find anything specifically.


I imagine this to roughly look like the below for apt (if apt were magically written in PHP):

$stdin = fopen("php://stdin");
$path = ...; // /path/to/apt/lock/file/majigger
if (!is_writable($path)) {
print "Another package manager appears to be working; would you like to queue this installation? [Y|n]";
$ans = fgets($stdin);
if ($ans === "n") {
exit(0);
}

while (!is_writable($path)) {
sleep(1);
}
}
install($package);


Perhaps you'd want to cover a few more edge cases, or make it unit testable, but you get the idea. It doesn't seem to hard either for others, like update-manager or synaptic - probably beyond papercut size though.

Saturday, June 20, 2009

Usability niggles, Ubuntu

Ubuntu's next release will have one hundred paper cuts as a focus - fixing usability issues for users.

Here's my best pet peeves.

  1. On windows, if I paste in a URL in an "open file" box, windows will fetch it for me, write it somewhere temporary, and give me that temporary path. Gnome is inconsistent - I can put a URL into a the 'Run' dialog, but gedit doesn't let me open it. However, if I start gedit from the command line, it will open it - gedit https://edge.launchpad.net/hundredpapercuts/
  2. 'Choose another application' when opening a file from firefox gets me to try and look around for the path of an application. As a newer user to linux, I often have to fall back to the terminal, and use things like 'which gedit' to get the right path. If the run dialog can work out which application I want, why can't firefox.
  3. With gedit, if I open a file which does not exist, it does not let me create said file - it just errors at me.


https://bugs.edge.launchpad.net/hundredpapercuts/+bug/18995





Reblog this post [with Zemanta]

Saturday, January 31, 2009

GEdit usability nitpicks

I like ubuntu/gnome's gedit for simple jobs when I'm not in the mood to wrestle vim.

Here's my pet peeves from a usability point of view

gedit 2.24.2 annoys me with:
1. Find and Replace across multiple documents should exist. Editplus does this with an 'all open documents' tickbox
2. If I open a filename which doesn't exist; don't show me an error. Create a new document, and when I save, create the file.
3. Give me a 'always reload when changed on disk' preference. I'm sick of clicking the buttons.



Reblog this post [with Zemanta]

Sunday, March 30, 2008

PEAR installation process

PEAR needs to think about its usability for newcomers.

Who are our audience?


I would say they fit into several broad categories.

First, the web designer who is learning PHP.
This person isn't used to anything much more than javascript, has lots of basic php language questions, and wants to do possibly nasty things with the language.

Second, the system administrator - this person knows just enough php to know they don't want to know anymore, relies on a range of tools - from cpanel to phpmyadmin.
They are setting up a shared environment, typically. They just want results, and they want them fairly quickly.

Third, the just setting out as a seasoned developer. This person is working in PHP5, and is half a heartbeat away from leaping on the rails-bandwagon. They are looking for frameworks, quick code and things which are visually fun. They are usually working as a full time developer.

Fourth, the ultra seasoned developer. This person is working in PHP5, has a background in Java or other languages, and wants to Do The Right Thing. They are usually working as a full time developer - they use unit tests, design patterns, and are often willing to provide patches.

Probably categories three and four overlap markedly.

Scenarios


Ultra seasoned developer has a specific design problem - database abstraction


The last 3 projects they have worked on have used the mysql extension, ADODB, and others.

They type in 'database abstraction php'; and among the results is PEAR::DB.

The first few links are newbie tutorials, and thus skipped.

When viewing the PEAR::DB homepage, they note it is unmaintained, and MDB2 should be used.

Wanting to know more, they click into the documentation, and read the end user docs.

From here, they see a few samples of code.

Convinced to at least try it out, they then turn to install it.

Newbie has been told to RTFM and learn about PEAR


Using newfound google prowess, the newbie discovers pear. They have been told to go and read the manual about mail(), and want to know how to send attachments.

They land at http://pear.php.net/ and click around a little bit.

They eventually discover the Packages section.

Here, they eventually find a package they want - PEAR::Mail.

They get to the package homepage.

They hit the download button, and are given a .tar.gz - being mostly a windows user, this stumps them.

A system admin at a small web hosting company has had a user complain that fictionalbb doesn't work: it has some error about HTML/QuickForm.php


The system admin pastes the error message into google, and lands on a forum post.

The forum post tells them they need to install HTML_QuickForm, and it's this thing called a PEAR package.

They land on pear.php.net. They give up after a short period, as there doesn't appear to be anything useful.

Instead, they type 'ubuntu html_quickform howto' or 'redhat fictionalbb install' into google.

Somewhere, they locate a forum post, which eventually leads them to the right answer.

How can we make these user stories better?


First, when you land on the front page, there should be a clear direction.

landing-branding

Ask the user what they are trying to accomplish, and direct them to the resources they need.


Second, make the package download page more useful.
download
If you have no idea how to install pear, you are going to end up trying to download.

This page should provide you with more direction, and links to 'installing pear'



Third, when they land on the package documentation page, give them an instant teaser.

documentation

Show the table of contents right there and then, rather than hide it away.

Provide a spot for useful external articles to make the selling process better.

If the user can read and understand right there and then, they'll be happier.

Sunday, March 23, 2008

How to make OpenID really rock (user signup process)

Robby finds himself asking why come I have 75 openids, and why can't I just transfer my details from site to site?

Well Robby, this is for you.


First, you need to grab XML_GRDDL. It's fairly stable at the moment, and a PEPR proposal.

For now, do a

pear install http://xmlgrddl.googlecode.com/files/XML_GRDDL-0.0.4.tgz

... but if it gets through PEPR, this will be easier.


Be warned, you'll need version of PHP 5.2.5+ unless you can compile php with a decent version of libxml / libxslt.

You also need the XSL extension.

Open up your favourite editor.

Paste in:

require_once 'XML/GRDDL.php';

/**
* Example: Fetch multiple URLs about a specific user
* and get useful information out.
*/
$urls = array();
$urls[0] = 'http://flickr.com/people/clockwerx/';
$urls[1] = 'http://www.linkedin.com/in/clockwerx';
$urls[2] = 'http://www.last.fm/user/CloCkWeRX/';
$urls[3] = 'http://clockwerx.blogspot.com/';

//For each URL, pretend it has these urls in <head profile="foo" />
//These look for hcard, hcalendar, etc.
$profiles[$urls[0]][] = 'http://www.w3.org/2002/12/cal/cardcaletc';
$profiles[$urls[1]][] = 'http://microformats.org/wiki/hresume-profile';
$profiles[$urls[1]][] = 'http://www.w3.org/2002/12/cal/cardcaletc';
$profiles[$urls[2]][] = 'http://www.w3.org/2002/12/cal/cardcaletc';
$profiles[$urls[3]][] = 'http://www.w3.org/2002/12/cal/cardcaletc';

//Set what kind of transformations we're interested in.


$options = XML_GRDDL::getDefaultOptions();
$options['quiet'] = true;

$grddl = XML_GRDDL::factory('xsl', $options);
$results = array();
foreach ($urls as $n => $url) {
$data = $grddl->fetch($url);

$data = $grddl->prettify($data);

$modified_data = $grddl->appendProfiles($data, $profiles[$url]);

$stylesheets = $grddl->inspect($modified_data, $url);

$rdf_xml = array();
foreach ($stylesheets as $stylesheet) {
$rdf_xml[] = $grddl->transform($stylesheet, $modified_data);
}

$results[$url] = array_reduce($rdf_xml, array($grddl, 'merge'));
}

print "We scuttered " . count($urls) . " urls and found these results\n";
foreach ($results as $url => $rdf_xml) {
print $url . "\n";

$sxe = simplexml_load_string($rdf_xml);
$sxe->registerXPathNamespace('vcard', 'http://www.w3.org/2006/vcard/ns#');
$sxe->registerXPathNamespace('ical', 'http://www.w3.org/2002/12/cal/icaltzd#');

print "We found the following pieces of information, choose which are yours:\n";
$xpaths = array();
$xpaths["Formatted name"] = '//vcard:fn';
$xpaths["First name"] = '//vcard:givenName';
$xpaths["Last name"] = '//vcard:familyName';
$xpaths["Email"] = '//vcard:email';
$xpaths["Homepage or URl"] = '//vcard:url';
$xpaths["Workplace name"] = '//vcard:organization-name';
$xpaths["Photo URL"] = '//vcard:photo';
$xpaths["Locality"] = '//vcard:locality';
$xpaths["Position/Title"] = '//vcard:title';

foreach ($xpaths as $name => $xpath) {
$results = $sxe->xpath($xpath);
if (empty($results)) {
continue;
}

print $name . ": ";
foreach ($results as $node) {
print trim((string)$node);
$attributes = $node->attributes(XML_GRDDL::RDF_NS);
if (!empty($attributes['resource'])) {
print trim((string)$attributes['resource']);
}
print "\n";
}
}
//print $rdf_xml . "\n\n";
print "\n";
}


Save it, run it.

You *should get*:

---------- PHP ----------
We scuttered 4 urls and found these results
http://flickr.com/people/clockwerx/
We found the following pieces of information, choose which are yours:
Formatted name: DanielO'Connor
First name: Daniel
Last name: O'Connor
Homepage or URl: http://clockwerx.blogspot.com/
Locality: Klemzig
Position/Title: Web Developer

http://www.linkedin.com/in/clockwerx
We found the following pieces of information, choose which are yours:
Formatted name: Daniel
O'Connor
Adelaide Institude of TAFE
PEAR member
LIXI Members member
First name: Daniel
Last name: O'Connor
Homepage or URl: http://http;//clockwerx.blogspot.com
http://www.valuationexchange.com.au
Workplace name: PEAR
Valuation Exchange
Fresh FM
Self-employed
Adelaide Institude of TAFE
PEAR member
LIXI Members member
Locality: Adelaide Area, Australia
Position/Title: Developer at Valuation Exchange
Contributer
Software Developer
Web Developer
Freelancer

http://www.last.fm/user/CloCkWeRX/
We found the following pieces of information, choose which are yours:
Formatted name: Daniel O'Connor
NoBloodForOil
Homepage or URl: http://clockwerx.blogspot.com
Photo URL: http://userserve-ak.last.fm/serve/160/682792.jpg
http://userserve-ak.last.fm/serve/50/690470.gif

http://clockwerx.blogspot.com/
We found the following pieces of information, choose which are yours:
Formatted name: Daniel O'Connor
Email: mailto:daniel.oconnor@gmail.com
Homepage or URL: http://clockwerx.blogspot.com/
xmpp:daniel.oconnor@gmail.com
Workplace name: Valuation Exchange


Output completed (30 sec consumed)


Now, how neat is that. You can grab any url which publishes microformats, grab out the hcards from it, grab the information from those, and viola! A pre-populated signup form.


Why is this neat?
* If an OpenID url has Microformats, bam! You can read it.
* If you are a bit more hardcore, you can hook up xOperator and a triplestore to this information.
* Or you could use it in Drupal.

There you have it, ladies and gents: semantic web in a box, with practical applications for user signup.

Sunday, October 28, 2007

Thunder! Lightning!

Since I last wrote about Lightning things have really moved along.

Recently we saw the release of Lightning 0.7 for Thunderbird - this is a significant step towards matching, then beating outlook.

I can't seem to find a screenshot, but most of the rough edges which existed in the previous release have disappeared, the UI seems polished, and the experience while using it is... pleasing.

So if you want to try this but can't really find an excuse to do so, why don't you use thunderbird + imap + gmail, and then add your google calendar too. Try it for a week, and blog about how you got on.

Sunday, October 21, 2007

Wanted: Ubuntu's update manager, a select all button

I don't know about you, but I'm really keen on doing really short bursts of activity and getting instant feedback.

I'd rather install 15 packages separately if they are substantial downloads than wait for them to all go at once. Infact, I'd often want to only install 3 or 4 and ignore others until later.

Its for that reason that the ubuntu update manager drives me nuts, and to the command line. If it had a 'select all/select none' toggle, I could easily clear the default select all, and life would be better.



So where do I go to whinge about this, and how do I do it?

Tuesday, August 14, 2007

pySerial and Roomba

Roomba
So when I'm not looking for the ghost in the machine, I seem to be spending a fair amount of my time pining for a Roomba.

It isn't even because I have a low-mess problem that obviously needs robotification (I mean, who doesn't have one of those), but because the damned thing comes with an open interface.

With a little bit of expense, I could remote control my Roomba with nothing more than a laptop, really long serial cable, and a whole bunch of Python.

From there, it's only a hop, skip and a jump to a day of internet fame with a wiimote roomba, and then it's on to rule the world program away my household hygiene issues.

The biggest obstacles I seem to have is only the worst website in the world and simply not having much of a decent idea for exactly what I would use my roomba for...

So lets hear it: 3 best applications for a robot slave you can come up with.

Sunday, August 05, 2007

All Text Must Be Selectable

While reading a bit about pidgin UI design, it was pointed out there is some text which isn't selectable (copy and paste) in the conversation window.

I don't know how it's 2007, and half our lives are on the internet; but application designers are still missing this very easy and very useful feature on the odd occasion.

Everything should be selectable!

Thursday, August 02, 2007

My best friend, the ghost in the machine.


Is it a ghost in the machine or my best friend, Dave?

The Washington post has a good piece up about the human connection with military robots - worth the read if you design anything.

This has to be my favourite part:

When Greg Harbin was piloting one of the first Predators over Bosnia from his desk in Hungary, he wasn't actively trying to become the first UAV operator in history to be awarded a medal. He was trying to avoid becoming the first UAV pilot to incinerate a schoolyard full of children.

The then-32-year-old Air Force captain's bot was "dead square right over the city" of Mostar, looking for snipers, when its engine conked out. As it spiraled down, still carrying 2,000 gallons of fuel, Harbin could see on his screen, through the cross hairs of the nose camera, that "it was dead-centered on that school. If I'd allowed that thing to hit into that school, could you imagine?" he recalls. "I would be the first guy in the history of the world to kill somebody with an unmanned aircraft."

Using the kind of fancy flying he'd learned as a fighter pilot, and only the 15 minutes' worth of battery power he had left, he miraculously pulled the bot out of its spiral and found an airstrip run by the French. To make sure the barely-under-control bot didn't hit all their transport planes, he intentionally crash-landed it on their runway. "The French were pretty funny on the radio. They didn't know what it was. They videotaped the whole thing."

But that's not the significant part.

As he was struggling to bring the bot down without an engine, he could see "the ground coming real fast." He dropped the landing gear, flared the wings, pushed the stick forward and then started fumbling around at the bottom of his desk chair.

He had bonded so tightly with the machine hundreds of miles away that he was searching for the lever that would allow him to eject.



It reminds me very much of a story by Colin Kapp: Gottlos. Worth the read if you can find it...