summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2017-01-07 23:03:02 +0200
committerLars Wirzenius <liw@liw.fi>2017-01-07 23:03:02 +0200
commit812228489f9a4c0a15cc4a8a83ded660f154525b (patch)
treeb062184dfba49e808c0561bd49c8af934d74127e
downloadnoir.liw.fi-812228489f9a4c0a15cc4a8a83ded660f154525b.tar.gz
First chapter and site infra setup
-rw-r--r--.ikiwiki/indexdbbin0 -> 9715 bytes
-rw-r--r--.ikiwiki/lockfile0
-rwxr-xr-xbuild.sh8
-rw-r--r--ikiwiki.setup15
-rw-r--r--index.mdwn22
-rw-r--r--negotiation.mdwn612
-rw-r--r--style.css181
7 files changed, 838 insertions, 0 deletions
diff --git a/.ikiwiki/indexdb b/.ikiwiki/indexdb
new file mode 100644
index 0000000..6f21d15
--- /dev/null
+++ b/.ikiwiki/indexdb
Binary files differ
diff --git a/.ikiwiki/lockfile b/.ikiwiki/lockfile
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/.ikiwiki/lockfile
diff --git a/build.sh b/build.sh
new file mode 100755
index 0000000..347e4fa
--- /dev/null
+++ b/build.sh
@@ -0,0 +1,8 @@
+#!/bin/sh
+
+set -eu
+
+html="$HOME/sites/noir.liw.fi/html"
+
+ikiwiki --setup ikiwiki.setup
+sync-noir
diff --git a/ikiwiki.setup b/ikiwiki.setup
new file mode 100644
index 0000000..a069287
--- /dev/null
+++ b/ikiwiki.setup
@@ -0,0 +1,15 @@
+# IkiWiki::Setup::Yaml - YAML formatted setup file
+
+wikiname: Hacker Noir
+srcdir: /home/liw/sites/noir.liw.fi/src
+destdir: /home/liw/sites/noir.liw.fi/html
+html5: true
+add_plugins:
+- goodstuff
+- meta
+disable_plugins:
+- smiley
+- rawhtml
+- html
+timeformat: '%Y-%m-%d %H:%M'
+exclude: 'favicon\.ico'
diff --git a/index.mdwn b/index.mdwn
new file mode 100644
index 0000000..6c71f69
--- /dev/null
+++ b/index.mdwn
@@ -0,0 +1,22 @@
+<!-- [[!meta title="Hacker Noir"]] -->
+
+# Wat?
+
+"Hacker Noir" is a story about software development. It's incomplete,
+but being written by [Lars Wirzenius][]. Finished chapters are
+published here about once a month, and announced on [Lars's blog][].
+
+[Lars Wirzenius]: http://liw.fi/
+[Lars's blog]: http://blog.liw.fi/
+
+# Chapters
+
+* [[Negotiation]]
+* to be continued
+
+# Legalese
+
+All content on this site is copyrighted by Lars Wirzenius, and
+licensed under a <a rel="license"
+href="http://creativecommons.org/licenses/by-sa/4.0/">Creative Commons
+Attribution-Share Alike 4.0 Unported License</a>.
diff --git a/negotiation.mdwn b/negotiation.mdwn
new file mode 100644
index 0000000..33694c8
--- /dev/null
+++ b/negotiation.mdwn
@@ -0,0 +1,612 @@
+# The initial negotiation to start project
+
+We were sitting in the conference room in our little office.
+The mood was tense. The whole team was present, since we
+were considering taking on a new project for a new client.
+
+"Why the RUDE WORD are we talking to these people again? We already
+rejected them last year!" Robin is our architect and lead
+developer. She's experienced and by far the most opinionated
+of us. After a lifetime of working in software development,
+and being belittled, harrassed, and disrespected by
+colleagues, bosses, and everyone else, she's the least
+inclined of us to compromise.
+
+"It's been months since our latest client, and the company
+bank account is getting low. We need income, and we need it
+soon, or we won't be paying salaries by Christmas." I love
+Robin, but she does need things to be spelled out clearly,
+from time to time. Luckily, that's what I'm good at, and
+patience is part of my job. "These guys are flush. They just
+got a ton of VC money last week. They're also desperate.
+Their whole current product line is broken, and not likely
+to survive another security catastrophy. If we play our
+cards right, we can earn enough of a fee to cover our
+salaries for several months."
+
+"I'll grant you the money aspect, but we don't usually
+accept clients that are difficult to work with. Am I alone
+in having my spidey sense tingling?"
+
+"No, I'm apprehensive as well." Andrew is our senior
+developer. He's always calm and composed, and as unflappable
+as the Alps in a summer breeze. "Last time we rejected them
+partly because they're a Silicon Valley style brogrammer
+startup, and all that entails."
+
+"I know someone who works there. They're at least not openly
+racist or sexist." Nina, our sysadmin and operations
+specialist, is also the company cynic.
+
+Robin sits up, worry lines smoothing on her face. "Nina, if
+you say they might be tolerable as a client, I'm willing to
+reconsider our rejection of them." Nina draws the right side
+of mouth into a smile, which doesn't reach the left side of
+her mouth. An evil glint shows up in her eyes.
+
+"I'm not saying they're good. But we should look at them and
+give them a chance."
+
+I raise both of my hands, hands flat, palms outward, in a
+sign that everyone should be calm. In Andrew's case, that he
+should stay calm, since he's never anything else. "I sense a
+rough consensus that we should give them a second chance. I
+suggest that I meet them to discuss the project, and to
+explain our ground rules. After that, we can discuss the
+situation. If it doesn't look good, we can reject them
+again. If necessary, we can vote. As usual, everyone has a
+personal veto and can stay out of the project, if the rest
+of us accept it. Deal?"
+
+That's a thing we established when we set up a company with
+Robin. We're contractors, and while that means we have to
+accept clients and client projects, both ¤obin and I have
+plenty of experience working for unpleasant people. Every
+new job, and every new client, brings a new group of people
+who need to be taught basics of software development
+processes, or basic human dignity. Several years ago we
+started our own company and one of our core values is that
+we don't work for asses, and we reject potential clients if
+we don't like them, either entirely or each team member
+separately. This has made our lives much better, but we only
+get away with it by being really good at what we do.
+
+I get nods from everyone, except Robin. She looks thoughtful
+for a few moments, and looks around the table at everyone,
+then finally also nods. Everyone stands up and leaves the
+conference room to continue their day. We're between paying
+projects, so there's practice runs and stdying and
+experimentation with new tools going on. I stay, to finish
+the meeting minutes for our internal wiki, and to send an
+email to Sam at SmartHomes, Inc, the prospective customer,
+to set up a meeting.
+
+
+-------------------------------------------------------
+
+I had chosen Cafe Aalto as the place to meet. It's well-lit,
+not crowded, and serves a marvellous hot cocoa. A bit noisy
+from time to time. Also, it's located so it's easy for
+everyone to come there. I'd brought Robin with me so that we
+could go over hardcore technical details. I'm not entirely
+non-technical, but I quickly get out of depth once we leave
+the big picture level. That's OK, since my role in the team
+is facilitator, project manager, and customer interface, and
+it's enough for me to understand the tech on a conceptual
+level. Robin and I had walked from our office, and had
+occupied a corner table, for some extra quiet, and Sam had
+soon joined us.
+
+I prefer to meet clients on neutral ground, rather than in a
+meeting room at either their office or ours. People are more
+relaxed and more amenable to having their mind changed that
+way.
+
+This cafe isn't ideal. It's got a hard acoustic environment,
+so things echo a bit, and there's usually a bunch of
+Japanese architecture students studying the building, since
+it's designed by Alvar Aalto, the famous Finnish architect.
+
+Sam from SmartHomes isn't relaxed, but that's probably not
+because of harsh echoes of other people's discussions. He's
+nervous for his company, and under quite a lot of stress.
+He's quite visibly upset. "What's going on? I thought we'd
+talked already, and had an understanding. We need some work
+done, and you are available. Why are we having another
+meeting? Why aren't you working and piling up billable
+hours? We're not paying for idling away in meetings."
+
+Robin was changing her posture, shifting in her chair. I
+could hear the anger bubbling in her, so I rushed to cut her
+off before she said something to drive Sam so far up a tree
+I wouldn't be able to talk him down. "I think there's some
+misunderstanding. You and I met, and we talked, and I got a
+general understanding of what you want, but I did say I have
+to talk this over with my team. I've now done that, but some
+issues were raised that need to be discussed with you. I
+brought Robin here to aid that discussion, and for technical
+depth in case it's needed."
+
+Sam took a deep breath, which clearly calmed him down a bit.
+"What kind of issues?"
+
+"To start with, your company doesn't have a strong
+reputation for technical quality. On the contrary, generally
+speaking your stuff is spoken of as cheap crap. We prefer to
+make quality stuff that lasts."
+
+"That is exactly why..." I cut him off. This part is going
+to be painful enough without having to hear him explain his
+side. "Please, let me explain our issues completely before
+you defend youself. Here is the situation as we understand
+it. You produce a line of gadgets for so called smart homes,
+which mean controller, sensors, and displays to automate
+parts of the functionality in a home, so that those living
+there can adjust lighting and heating via their smartphones,
+even when not at home, and can see temperatures, energy use,
+and so on, again also when not at home. Pretty basic IoT
+stuff, in other words, except you've managed to capture a
+large share of the market, which puts you in a potentially
+very nice position, financially."
+
+Sam nods. I continue.
+
+"Unfortunately, your stuff is of low quality. At least three
+times in as many years your gadgets have been cracked, and
+used in botnets, to participate in the largets distributed
+denial of service attacks the world has seen. This has been
+noticed by the media, and you have enough egg on your face
+to feed a shipful of hung-over Englishmen who want
+breakfast. The general theme among those who write about
+these things seems to be that if you don't get the security
+of you gadgets fixed in the next generation, it's over for
+you. You've been working on this for months now, but your
+whole corporate culture is against you and you're failing to
+solve your technical problem. That's why you need us, or
+someone, to solve them for you."
+
+"That's quite blunt."
+
+"I prefer to be blunt. It lets us find the real problem, and
+discuss that, instead of dancing around your sensitive
+feelings."
+
+"Fair enough. I wouldn't have phrased things quite so
+starkly as you did, and I don't think we're quite as
+desperate as you say, but let's ignore that. What do you
+suggest? And why wouldn't you work for us?" Sam as clearly
+not as stupid as he looked. He'd taken my criticism quite
+well, much better than most of the prospective clients I had
+to get blunt with. So far, so good.
+
+"The main issue we have is in fact your corporate culture.
+You're a startup, in the worst Silicon Valley style. Almost
+all your people young and male, and you have a strong macho
+culture. Long hours, hard work, hard play, all the hallmarks
+of being manly men who win. You got a big pile of venture
+capital cash recently, and that won't help. Your culture,
+and the way your people behave, was bad enough last year,
+when we talked the first time, and that was why we turned
+you down then. In fact, your company projects a strong
+brogrammer image, and we usually avoid dealing with such
+people."
+
+"I see." Sam wasn't taking things nearly as well as earlier.
+He was clearly very upset, even his hands were shaking. I
+was counting on him to be desperate enough to save his
+company to let us do things our way, and for that, I needed
+to shake him so he was properly scared. Had I gone too far?
+No, he was upset, but controlling himself. He stopped the
+shaking by forming fists with his hands. His knuckles were
+white. He was breathing slowly, deliberately, and deeply.
+
+"I can't I'm happy to hear this, of course."
+
+"Would you like to discuss possible ways in which we can
+deal with this and find ways in which we can work together?"
+
+"Yeah, we'd better do that. What do you suggest?"
+
+"You said you know the reputation of our company. I know it
+too. We're small, but we deliver what we promise. We're
+challenging to work with, and we require a lot from our
+clients. The client needs to conform to our requirements,
+instead of the usual other way around. We do things
+differently, and we don't compromise on our methods, and we
+charge a lot, but we deliver. As long as we deliver, nothing
+else matters to our customers. With me so far?"
+
+"Yeah, that reputation is why we want you."
+
+"One of the cornerstones in a customer relationship for us
+is that both sides can trust and respect each other. On our
+side, we can't be productive if we feel we're not treated
+well, or if we can't be blunt when that's needed. On your
+side, if you don't trust us to deliver, there's no point in
+tolerating our excentricities or us challenging you to do
+better."
+
+"We don't believe in blind trust, so our standard contract
+includes a code of conduct, regular reviews of the situation
+with the possibility of amending the contract, and a
+commitment by you that you'll provide certain things so we
+can work efficiently."
+
+"What kinds of thinga?"
+
+"Most importantly, someone from your side who acts as a
+product owner in the Scrum method sense. Someone who knows
+what the product should do, can make decisions about any
+unclear aspects, and is available full-time for this.
+Otherwise we end up waiting to get answers. There are also
+some practical details about work space, chairs, tables,
+lighting, 24/7 physical access, and Internet connectivity,
+but those are only important if you insist on us working
+from your premises."
+
+"I'm sure we can have a product owner. The practical details
+can surely be arranged, but we would like to have on our
+premises. It's easier if we can talk in person, than doing
+everything over email or video calls."
+
+Robin has also, by this time, calmed down a lot, and so when
+she indicates she wants to say something, I give her a
+little nod of encouragement. "We prefer to work from our own
+office, but we've worked on customer premises before. It
+sometimes hard when customer IT isn't co-operative, but we
+have ways of working around that. If we can occupy a large
+meeting room, bring our own chairs, and arrange our own
+Internet connectivity, we'll be OK. We'll bring our own
+servers and set things up in the conference room so we're
+comfortable."
+
+I jump in. "Let's assume we can sort that out. I'll email
+you, Sam, our standard contract and you can review it with
+your people. Now, sincew we Robin here, should we talk about
+the technical problems that you need to solved? I know
+you're not a techie, and before we take on this project,
+we'll want to talk to your people in detail about this, but
+we can get started. I think Robin already has some ideas for
+you to consider. Robin?"
+
+"Yeah, so I've reviewed your public documentation for your
+products. Alxo, a bunch of magazine articles and blog posts.
+Did you know there's a whole blog dedicated to describing
+how shitty you products are?"
+
+"I know. We've spent a small fortune on lawyers to shut it
+down."
+
+"Well, that's one of the first steps to take. Stop attacking
+your critics, it just makes things worse for you. I also
+spent an evening at a friends house getting some hands-on
+time with a couple of your products, and I'm not happy."
+
+Sam's shoulders are hanging. His voice seems defeated.
+"Why?"
+
+Robin is clearly having a good time now. "It took me only
+half an hour to get into a root shell. You have a telnet
+port open, and as soon as I figured out that, and googled to
+find a list of you hardcoded root passwords, I was in.
+That's 1970s security, it's not nearly acceptable today.
+From my research, you also have no upgrade system, so as
+soon someone finds a security hole, your users have to buy a
+new gadget to get it fixed. Another thing that is no longer
+acceptable in modern times.
+
+"Based on this short black-box evaluation, and pending
+discussion with your techies, my initial suggestion is that
+you need a completely new platform for you next generation
+products, one that's built to be secure and updatebele. We
+have that. You also need processes for preparing and
+distributing updates to you users, and to take on the
+reponsibility of providing the updates. We can help with
+that, but you'll need to do the bulk of the work. You also
+need to port your actual applications to the new platform,
+and that's probably not something we can do for you."
+
+"This sounds like you want us to start all over from
+scratch. That's going go be a hard sell to our investors."
+
+I smile an evil smile. "They're going to like bankruptcy
+even less. If you want help convincing the investors and
+stockholders, or your management or developers, well, we can
+help with that too."
+
+"You're so very helpful."
+
+------------------------------------------------------------
+
+Robin, Nina, and I are at the SmartHome, Inc, headquarters, in a
+large, lavish board room. Mahongany walls, a large oval table, comfy,
+well-padded leather chairs, a huge monitor, and power, network, and
+display sockets in the desk surface at every seat. All three of us are
+plugged in, and prepared to give a talk to the senior techies about
+what we think their problems are, what our own platform is like, and
+what we offer to do for them. This could go either really well, or
+really badly. We've decided for a strategy of shock and awe.
+
+The SmartHome techies arrive in three clusters, and seat themselves in
+the opposite end of the table from us. Most of them seem sundued, with
+a couple of exceptions, who mostly seem belligerent.
+
+I nod at Nina, who opens her laptop and starts typing. I stand up and
+face the audience. "Hello, everyone, my name is Anna Carter, you may
+call me Mrs. Carter. I'm the friendly face of The Team, and Sam has
+asked us to help you develop the next genaration os SmartHome
+products. You may know that SmartHome products have a bit of a bad
+reputation when it comes to quality and security. To confirm this,
+I've collected some quotes from recent product reviews, and from
+Twitter."
+
+The audience shifing in their seats. I can see several of them getting
+ready to jump to the defence of what they've built, or have had a hand
+in building. To keep the upper hand, I tap the keyboard on my laptop,
+and my first slide appears on the big monitor, accompanied with Joan
+Jett singing "I don't give a damn of my bad reputation" via the sound
+system.
+
+"Here is a screenshot from the latest review of SmartHome products in
+Ars Technica. I've highlighted the important bit." Ars is one of the
+tech news publications with a strong reputation and general respect.
+The highlighted quote reads, "The latest version of SmartHome's hub
+still has bad security. Our review sample had been infected by a
+botnet when we received it."
+
+I let the quote sink in for about three seconds, and change to the
+next slide, which has quotes from Twitter. The kindest is perhaps one
+saying a SmartHome hub is the perfect way to let you neighbour's kid
+control your lighting.
+
+"There's more quotes, but they just continue the theme, and I'd prefer
+to not show the ones that are just name-calling and discussing the
+ancestry of SmartHome developers." I glance at Nina, who nods.
+"Instead, I'll let Nina give a short demonstration." I use the remote
+control to show Nina's screen on the monitor.
+
+Nina stands up. Not that it matters much, she's short, and standing on
+the floor seems as high up as she was sitting in the chair. No matter.
+"Hi, I'm Nina. Just Nina. I'm the sysadmin in the team. I like to play
+with security stuff, and I've just owned your office." She taps a key.
+The room lighting turns off, as does the monitor. "Your office is
+stuffed with your products, and that's good. Dogfooding is always
+sensible." She taps another couple of keys. There's a click-clack from
+the board room doors. "Except when your dogfood is insecure and can
+control your locks and your heating. I've changed the password for
+you."
+
+The SmartHome techies are looking at each other.
+
+"Please look at the big monitor." There monitor shows a window with
+buttons like "board room locks", and "heating". "You should know that
+application. It's the open source HomeApp application, which someone's
+written to control your gadgets. It's quite popular, and it's included
+in Debian, so it's readily available. Works quite well, and requires
+practically no configuration. I installed it before we came here, and
+I took over your office devices just now. I didn't even have to try."
+
+"Now wait minute! You can't do that!" Olaf, one of the seniors stands
+up. His face is red, his movements are abrupt, like stop-motion
+animation. Nina stands still. "I just did."
+
+"But how? It's all firewalled and password protected." The stop-motion
+old guy clearly doesn't believe what Nina is saying. He shakes his
+head.
+
+"First, I'm inside your firewall, rememher. My laptop is on your guest
+wifi. The wifi password is printed in the wall. It's just like
+vampires. Firewalls do not help when you keep inviting people into
+your home. Second, while your gadgets indeed do have a password, and
+it isn't the default factory default, it's the same password as for
+wifi. Which you print on the wall. Also, it's the third result if you
+google for 'smarthome office wifi password'."
+
+The old guy sits down. His face is now quite pale. The room has
+started to heat up. Everyone else loosening their ties, or removing
+sweaters.
+
+I stand up. "This, gentelemen, is an demonstration of how bad your
+security is. It took Nina only..." I look at her. "Fifteen seconds." I
+shake my head. "Only fifteen seconds to own your office. She now
+controls locks, and heating. Shall we ask her to open the locks and
+turn the heat down?"
+
+The SmartHome techies mumble variations of "yeah". I shake my head.
+"No. One you has to stand up and politely ask Nina to do those thing.
+Alternatively you can take back control of your office in some way.
+But you have to do it from this board room. Remember, the doors are
+locked."
+
+One of the younger techies gets up, and walks to the doors, and
+attempts to open them. They stay locked. He pushes them with his
+shoulder, but the doors are solid, and don't budge. He turns around,
+faces Nina, and bows deep, Japanese style. I'm not familiar with
+Japanese culture much, but I know Nina is. I make a mental note to ask
+her later if the guy is showing proper formal submission.
+
+"Please, Miss Nina, if it pleases you, could you open the doors and
+turn down the heating to normal."
+
+Nina stands still, looking at the guy. She tilts her head to the
+right, and hums, but doesn't make a move to do as asked. I speak, to
+make sure the SmartHome guys understand they're being humiliated.
+"What's the magic word?"
+
+The guy looks puzzled for a moment, then speaks. "Please?" Nina lazily
+turns to her laptop, and taps a key. The door locks click-clack again.
+The big monitor also shows that the turned off the heating.
+
+I look at the old guy. He's still sitting in his chair, with his hands
+flat on the table. "Is there something you should say, sir?" He
+doesn't seem to hear me, but before I have time to repeat myself, the
+young guy at the doors speaks. "Thank you, Miss Nina and Mrs. Carter."
+
+"I'm glad someone has been brought up right. But no, I mean isn't
+there something you have forgotten, something you should ask Nina?"
+
+The old guy is poked in his side by the colleague sitting next to him.
+They put their heads close to each other and whisper. The young guy
+saves them, again. He does another Japanese style bow. "Er, Miss Nina,
+could you tell us the new password, please? If it pleases you."
+
+Nina is clearly enjoying the situation. "Sure. I'll save you the
+hassle of having to physically reset all the gadgets. The new password
+is 'iabasaisfa', which is short for 'I am bad at security and I should
+feel bad'. All lower case."
+
+The SmartHomers being now properly cowed, I walk the through the rest
+of my presentation, which is the same things I told Sam at the cafe,
+except dressed up with fonts and stock photos. We have a reasonable
+discussion, and they admit all their faults.
+
+"Next up, I'll explain what we can do for you." I launch into a
+description of the platform we, The Team, have developed for IoT
+devices. "The platform requires a hardware platform supported by Linux
+and Debian, and gives you a secure updating mechanism, for both the
+operating system and your application, application runtime
+environments based on containers, and direct communication channels
+between devices that don't require access to a central server in the
+cloud."
+
+The old guy has recovered, and in true techie style, after his ego
+isn't bothering him anymore, dives straight into problem solving mode.
+"That'll require us to rewrite all our code running in the gadgets,
+right?"
+
+I nod. "Yes, it'll require a lot effort. I believe your management is
+willing to invest in that. It's that or bankruptcy. Further, you can't
+just do a straight port, all your software will need to be reviewed
+and possibly redesigned and rewritten from scratch. It'll be
+difficult, but if we succeed, you'll have a new product generation
+that is far ahead of your competitors. We, the team, will help you get
+through this, starting with adapting our software platform to you
+hardware platform, and helping you rethink the application layer."
+
+-------------------------------------------------------
+
+Back at the Team HQ, we have another meeting. Everyone's present.
+"Welcome, everyone. It's time to discuss SmartHome as a client again,
+and make a decision. Robin, you had objections last time. What do you
+think now?"
+
+Robin smiles. "Oh, I'm still giggling at how Nina completely owned
+them. They totally soiled their clothing."
+
+Nina is also smiling, but staying quiet. I nod at them both. "Yeah,
+that went well. Nina, do you want to tell about that?"
+
+"Nothing much to tell. We went in, and broke through their bad
+security, took control of their gadgets, and humiliated them."
+
+"Hah. Nina, you're a bit laconic as a storyteller, aren't you?"
+
+Robin was almost laughing out loud. "She doesn't tell it at all. They
+were scared of her, she could've had them stand on their heads. Of
+course, if we work with them, that may turn out to be a problem. I'm
+sure they hate our guts now."
+
+I shrug. "We had to get their attention and then have them focus on
+actually understanding how bad they are. We managed that, at least.
+Anyway, Robin, how do you feel working with them?"
+
+"They're still brogrammers, and I don't think that will ever change.
+However, after today, they know we can humiliate them at will, and I'm
+willing to assume they're behave out of self-protection, if nothing
+else."
+
+"We can't pull stunts like this again. Their fragile male egos won't
+be able to take it, I fear. We'll need to work constructively with
+them. And we need to deliver on our promises. But that's OK. We're The
+Team. We're the bitches who keep promises."
+
+Robin nods, and looks around the table. "How about the rest of you?
+Yay or nay?"
+
+Bertram, the junior developer, isn't sure. "Looks to me like there's
+mostly work here for porting our platform to their hardware. I'm
+mostly useful at the application level. Is there a role in this
+project for me?"
+
+Robin takes over. "That's an excellent point, Bert. Here's how I think
+we divide this up. Nina sets up and maintains a lab with their
+hardware so we have something to work with. Andrew does most of the
+porting, with help from Bert and possibly others. It'll be a good
+learning experience for Bert. I and Nina help them redesign their
+applications to run on our platform, and review everything so it's
+secure and sensible. Anna, you keep track of everything and make sure
+we have what we need to work smoothly, as usual. OK?"
+
+Bertram still isn't sure. "I've never done any porting work like this.
+I'm worried it'll be too much for me."
+
+"I understand. However, the difficult bit is getting Linux to run on
+the devices, and that should already be done. The rest is our own
+stuff, and that should be straightforward. And if you get stuck,
+remember that you're not alone."
+
+"Well, if you're sure I won't ruin everything, I guess I'm OK."
+
+I stand up to signal an end to the meeting. "This looks like a rough
+consensus. I'll tell SmartHome we're going to help them. Nina, I'll
+ask Sam to provide us with some development hardware. What do we
+need?"
+
+Nina shows up two hands with fingers spread out. "There's four of us
+who'll be developing, times two devices each, plus a couple spare.
+That's ten devices. Don't forget all power supplies, cables, and
+documentation."
+
+"Will do. Anything else?"
+
+Nina continues. "I'm sure the cases they come with are as crap as
+usual. We'll want to take out the guts and put them into more sensible
+cases, and add remote controlled power switches to those, and serial
+consoles. I want to put the re-cased devices in the kind of mini-rack
+we usually use for these kinds of things, and make sure we can control
+all of them remotely, so we don't need to have developers sit next to
+the rack."
+
+The team nods. One of our secrets is that we spend some effort early
+in each project to make sure the developers can work as comfortably as
+possible. Nina's mini-rack is a 10U movable rack, with
+computer-controlled power units, a serial port concentrator, and
+programmable network switch that lets us manage piles of embedded
+hardware much more easily than having them sit on developer desks.
+There's a couple of wifi access points, also fully controlled
+remotely. Basically we can program everything so that the devices can
+be updated, reset, and generally put through their paces, without
+having to have a human push buttons, connect cables, or otherwise
+handle hardware. This becomes importand when the project reaches a
+phase where we want to verify that the devices survive being
+forcefully rebooted by cutting power every few seconds for a week.
+Nobody wants to do that by hand. It's a thing Nina built for a project
+a few years ago. She now builds a new one pretty much for every new
+project. It's not exactly cheap, but it saves a ton of manual work and
+also let's us avoid a lot of bugs, which saves a ton of debugging
+work, and thus time. We have a reputation of delivering quality, and
+this is one of the ways in which we achieve it.
+
+"OK, Nina, if there's anything you to buy, you know what to do."
+
+"Are we working from our office, or theirs? Should I ready the
+portaserver?"
+
+The portaserver is another of Nina's builds. It's like the mini-rack,
+but has normal servers, which we use to run continuous integration
+services, version control, a wiki, an IRC server, and so on. We have
+one that power our office infrastructure, and because it's portable,
+when a project requires us to work somewhere else, we can bring it
+with us. This again saves us a ton of trouble. Instead of convincing
+customer IT to give us access to their servers, for example, we just
+bring our portaserver, connect it to power, and we're ready to hack.
+
+"Sam indicated we should work at the SmartHome office, but I'll check
+that. For now, assume we will need to go there and prepare the Towel."
+The Towel being the name of the office portaserver. It's our third.
+The first one, "Moomin", grew old enough to be replaced with a new
+generation of hardware. The second one, "Loki", having suffered a
+minor accident involving a drop from the third floor, a tank out
+practicing urban warfare, and a squad of very frightened conscripts.
+The third generation is rather more shockproof and has "don't panic"
+written on each side in large, friendly letters.
diff --git a/style.css b/style.css
new file mode 100644
index 0000000..0bf082b
--- /dev/null
+++ b/style.css
@@ -0,0 +1,181 @@
+html {
+ background: white;
+ font-family: serif;
+ margin-left: 3em;
+ margin-right: 2em;
+ margin-top: 2em;
+ width: 60em;
+}
+
+form#searchform {
+ font-family: monospace;
+ text-align: right;
+}
+
+div.actions {
+ font-family: monospace;
+ text-align: right;
+}
+
+div.actions ul, div.actions li {
+ display: inline;
+}
+
+div.pageheader {
+ font-family: monospace;
+ margin-bottom: 2em;
+}
+
+div.pageheader span.title {
+ display: block;
+ font-size: 200%;
+ font-weight: bold;
+ font-family: sans-serif;
+ margin-top: 0.5em;
+}
+
+div#pagebody {
+}
+
+div.pagefooter {
+ font-family: monospace;
+ margin-top: 3em;
+}
+
+div#pagebody {
+}
+
+span.date {
+ font-family: monospace;
+}
+
+div.inlineheader span.header {
+ display: block;
+ font-family: sans-serif;
+ font-size: 150%;
+ font-weight: bold;
+}
+
+div.inlinepage {
+ margin-top: 3em;
+ margin-bottom: 3em;
+}
+
+div.inlinefooter {
+ font-family: monospace;
+}
+
+div.sidebar {
+ display: none;
+ float: right;
+ max-width: 10em;
+ margin-top: 0;
+ margin-bottom: 0;
+ margin-right: 0;
+ margin-left: 1em;
+}
+
+.floatTR {
+ float: right;
+ margin-left: 1em;
+ margin-bottom: 1em;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ font-family: sans-serif;
+ font-weight: bold;
+ margin-top: 2em;
+}
+
+h1 {
+ font-size: 150%;
+}
+
+h2 {
+ font-size: 120%;
+}
+
+h3 {
+ font-size: 100%;
+}
+
+ul li, ol li {
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+}
+
+div#comments div.feedlink {
+ margin-top: 2em;
+}
+
+div.comment {
+ margin-top: 2em;
+}
+
+div.comment-subject {
+ margin-bottom: 1em;
+ font-size: 120%;
+ font-family: sans-serif;
+}
+
+div.comment-header {
+ margin-top: 1em;
+}
+
+div.archivepage {
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+}
+
+span.archivepagedate {
+ font-family: monospace;
+}
+
+
+
+/* The following are for openid logins in Ikiwiki. Copied from
+ ikiwiki. */
+
+input#openid_identifier {
+ background: url(wikiicons/openidlogin-bg.gif) no-repeat;
+ background-color: #fff;
+ background-position: 0 50%;
+ color: #000;
+ padding-left: 18px;
+}
+/* openid selector */
+#openid_choice {
+ display: none;
+}
+#openid_input_area {
+ clear: both;
+ padding: 10px;
+}
+#openid_btns, #openid_btns br {
+ clear: both;
+}
+#openid_highlight {
+ background-color: black;
+ float: left;
+}
+.openid_large_btn {
+ padding: 1em 1.5em;
+ border: 1px solid #DDD;
+ margin: 3px;
+ float: left;
+}
+.openid_small_btn {
+ padding: 4px 4px;
+ border: 1px solid #DDD;
+ margin: 3px;
+ float: left;
+}
+a.openid_large_btn:focus {
+ outline: none;
+}
+a.openid_large_btn:focus {
+ outline-style: none;
+}
+.openid_selected {
+ border: 4px solid #DDD;
+}