Fri Jan 4 21:03:31 EST 2013
building dtwenty.org
767 days ago, I commented on a HN submission about a random number generator:
3.) Providing random numbers as an advertisement for your fine line of hardware random number generators. Here it doesn't matter how much money you make [providing the numbers], you just want people to buy the hardware that made them. Oddly enough, none of the random number services (and there are quite a few) do this, for some inexplicable reason. There's not even an argument-from-proprietary technology, since HRNGs are supposed to generate perfectly random noise, and there's no way an attacker could stage a replay attack.
I left it there, because I was lazy. But last month, notorious badass Maciej Cegłowski created The Pinboard Co-Prosperity Cloud.
What is it?
The Pinboard Co-Prosperity Cloud is a startup self-incubator. Six successful applicants will receive a modest amount of funding and as much publicity as I can provide for their sustainable and useful business idea.
Is this a joke?
It is not a joke.
What are the requirements?
You must have a good idea that you are capable of building, a willingness to build it, and a plan for making it mildly profitable.
How much funding will I get?
Each successful applicant will receive $37. This will cover the cost of six months of hosting at prgmr.com and a productivity-enhancing hot beverage.
So I entered. Ha ha why not?
The more I thought about it though, the more I realized that I wasn't getting the joke. The idea was trivially simple. I already had a web server. I didn't need all that mad cash. I could just... build it.
So I did. It's right here. (EDIT 2013/3/22: I let the domain name lapse, and moved the content to bbot.org)
It was amazingly easy, even though this was pretty much my first major (har) piece of programming. I had never used python, javascript, or jquery before.
Web programming in the year 2012 has the smooth, well polished feel of something that has had the sharp edges worn off by the passage of thousands of other people. Getting nginx to talk to the WSGI server was a snap. Installing bottle.py was easy. JQuery was no problem.
Any time I had a problem, googling the error message would return a helpful, relevant page, explaining how my "build it as fast as possible, while learning as little as possible" design methodology had screwed me over again.
At the time, of course, it seemed a vast edifice of impossible complexity, but in retrospect it was painless. "It's easy to do if you know how to do it", maybe.
The only difficulty I faced was the hardware random number generator. The numbers had to come from it, since that was the whole point of the site; but my server was a virtual machine on the east coast, and my HRNG was sitting on my desk.
The "money" solution would be to buy a rackmount server, plug the widget into it, then slot it into a colo, but I didn't have money, and instead I had to be creative.
I couldn't just run the web server locally, since my ISP blocks port 80. Enter the ugly hack: I plugged the entropykey into a spare laptop, ran the application server on that, then ran a SSH tunnel to my web server, which communicates with the front end via JSON. It works, at the cost of an extra 150ms of latency per roll.
There's room to improve, of course. You could probably list off a dozen features dtwenty.org needs without pausing to draw breath, (starting with "make it less ugly") but, the ideal of the minimum viable product shines bright.
The second biggest problem after integrating the HRNG was the ad copy that makes up most of the page. It was originally twice as long-- ruthless editing has reduced to it merely "too long" from "far, far too long." This too could use improvement.
But! It's done and it works! Programming is fun.
Sun Dec 9 23:49:30 EST 2012
"How would I get started" and the problem of truth
I've been meaning to write about Hacker News again, but have held back, since it's a pretty boring subject outside of HN's rather shallow pool of users. But recent events have forced my hand.
Last night on Hacker News, someone asked a simple question with a complicated answer: “I want to build a cable company. How would I get started?”I’m really disappointed in the universally pessimistic and generally unhelpful answers this question received. Some people pitched some interesting ideas and helpful analysis, but most of the replies reinforced the notion that Hacker News readers are predominantly male know-it-alls and on the average, a bunch of snarky dicks.
Lots of emotional content here, but not much meaning. The attitude behind these two paragraphs becomes clearer if we look at some other quotes:
In startups, the big winners are big to a degree that violates our expectations about variation. I don't know whether these expectations are innate or learned, but whatever the cause, we are just not prepared for the 1000x variation in outcomes that one finds in startup investing.That yields all sorts of strange consequences. For example, in purely financial terms, there is probably at most one company in each YC batch that will have a significant effect on our returns, and the rest are just a cost of doing business. [1] I haven't really assimilated that fact, partly because it's so counterintuitive, and partly because we're not doing this just for financial reasons; YC would be a pretty lonely place if we only had one company per batch. And yet it's true.
To succeed in a domain that violates your intuitions, you need to be able to turn them off the way a pilot does when flying through clouds. [2] You need to do what you know intellectually to be right, even though it feels wrong.
It's a constant battle for us. It's hard to make ourselves take enough risks. When you interview a startup and think "they seem likely to succeed," it's hard not to fund them. And yet, financially at least, there is only one kind of success: they're either going to be one of the really big winners or not, and if not it doesn't matter whether you fund them, because even if they succeed the effect on your returns will be insignificant. In the same day of interviews you might meet some smart 19 year olds who aren't even sure what they want to work on. Their chances of succeeding seem small. But again, it's not their chances of succeeding that matter but their chances of succeeding really big. The probability that any group will succeed really big is microscopically small, but the probability that those 19 year olds will might be higher than that of the other, safer group.
The probability that a startup will make it big is not simply a constant fraction of the probability that they will succeed at all. If it were, you could fund everyone who seemed likely to succeed at all, and you'd get that fraction of big hits. Unfortunately picking winners is harder than that. You have to ignore the elephant in front of you, the likelihood they'll succeed, and focus instead on the separate and almost invisibly intangible question of whether they'll succeed really big.
"Why I now, unfortunately, hate Hacker News"
raffi 114 days ago | linkMost companies fail. It's a safe bet to predict failure. It's pretty lame to celebrate that failure from the sidelines.
Vision is not "how is this guaranteed to fail?" but how could it possibly succeed despite the odds?
A core tenet of hacker ethics, the zeroeth law perhaps, is being right, having correct perceptions regarding the universe. A map that matches the territory.
Under this ethical system, the above statement makes less than no sense. The most likely outcome is failure... but you shouldn't predict failure?
However, the way startup financing is currently organized, a VC fund can shrug off a dozen miserable failures to chase the one Google or Intel.
The purpose of Hacker News is to advertise Y Combinator startups, such as 9gag. The purpose is not to act as a prediction market. In fact, since one of the major routes of of startup profitability is being purchased by another company, accurate predictions of value are contrary to Y Combinator's interests. Y Combinator wants valuations as high as possible.
Someone starting a new cable company in 2012 is very likely to fail. This is the correct prediction: it is the outcome with the highest probability.
But a new cable company which somehow isn't immediately crushed, would have an enormous customer base, and could potentially make billions and billions of dollars.
To someone steeped in the Bay Area Startup lottery culture, this isn't an insanely stupid idea at all. It's almost a safe bet. With the force of millions of dollars behind you, being right is irrelevant.
Mon Oct 15 18:24:59 EDT 2012
why does nanoblogger generate broken links
(Attention conservation notice: I found an obscure bug in my blog publishing software. You are unlikely to care about it.)
Why the hell does my site have so many broken links?
I'll spare you the grimy details of the hour of troubleshooting, and jump right to the
punchline. Nanoblogger 3.4.2 has a bug which generates bad relative links
when you do ./nb update all
Nanoblogger is no longer updated, so this isn't a problem that can be
solved by upgrading. I didn't want to dive into the parsing engine, so I had
to find a workaround, which turned out to be pretty simple: just update it a
year at a time. ./nb update YYYY works
perfectly. (ex. ./nb update 2012) I've only got six years of
archives, so all I had to do was run it six times.
I'm posting this incredibly boring post in the hopes it'll save one of the six other users of nanoblogger some confusion in the future.
Sat Oct 6 15:26:52 EDT 2012
wherein I write a guest post
I just did a guest post for the Armchair Brandology blog:
A modern nation, like a corporation, is a machine made of humans. Its genetic code is ideas, encoded as words on paper.
Such immaterial entities are exquisitely sensitive to language, and how it's used. Sticks and stones may break your bones, but words can kill a nation.
So the Senkaku/Diaoyu Islands are purposely branded so that there's no way to refer to them without implictly taking a stand. Like how the abortion debate is framed as "pro-choice/pro-life", except that both sides in this argument have nuclear weapons.
You should check it out!
Sun Sep 30 07:13:13 EDT 2012
escape.sh
I've pasted a lot of IRC logs into a lot of HTML documents, which is always a pain, since angle brackets are obviously a special character in HTML, which means I have to do a search and replace with the equivalent entity codes. I usually did this manually, using whatever graphical text editor was handy.
But that's Not The Hacker Way. I'm editing a text file produced by one program, so another program will accept it. String processing isn't a job fit for a human. This is something that should be done by a third program.
Thus:
#!/bin/sh
#
# escape.sh - Escapes angle brackets in text files
#
# Turns angle brackets into < and > HTML entities.
# With --irc, replaces the first 8 columns (the timestamp) with an
# opening angle bracket, using an ugly hack.
#
# This is free and unencumbered software released into the public domain.
if [[ $* == *--irc* ]]
then
sed -i 's/>/\>/g' $2
sed -i 's/^......../\</g' $2
else
sed -i 's/</\</g' $1
sed -i 's/>/\>/g' $1
fi
Then I stuck it in my $PATH with sudo cp escape.sh
/usr/local/bin/escape This way you can run it from any directory
just by doing escape example.txt
(It's not actually very Unixy-- it doesn't play well with pipes, and wildcard expansion in a directory will blow it up.)
Have fun!
Sat Aug 25 19:00:25 EDT 2012
ntpblogging II
So now bbot.org is a Stratum 2 NTP Pool server. (Its wiki page.)
Joining the pool is pretty easy: You create an account, give them your server's IP address, wait for the monitoring server to decide you're stable enough (~8 hours) and boom, you're in.
(The interface is a bit awkward: you paste the address in there, you don't click the "Add a server" link, which apparently doesn't do anything.)
I found four upstream servers by pinging 0.us.pool.ntp.org repeatedly, and choosing the one that were closest to me. Since bbot.org is in a datacenter right on the internet backbone, close can be very close:
# ntpq -np
remote refid st t when poll reach delay offset jitter
==============================================================================
-72.26.198.240 209.51.161.238 2 u 273 1024 377 2.320 3.100 1.201
+69.164.217.193 128.59.59.177 3 u 825 1024 377 3.713 0.239 0.371
-108.61.73.243 209.51.161.238 2 u 237 1024 377 3.174 -1.069 0.398
+128.113.28.67 18.26.4.105 2 u 383 1024 377 6.828 0.382 0.141
*128.118.25.5 .WWV. 1 u 426 1024 377 11.537 0.225 0.310
I had hoped that <10ms ping times would result in magically low offset numbers, measured in the tens of microseconds, but apparently jitter becomes a bigger problem when you get that low.
My reference stratum 1 server is wwv.tns.its.psu.edu, an open-access tier 1 server that John Balogh runs. Thanks John!
Sat Aug 4 06:52:57 EDT 2012
ntpblogging
So I was farting about trying to figure out how to ask a NTP server what it thinks the time is without having to edit ntp.conf on the client machine, when I discovered that NTP is like SSH— any machine with it installed acts as a server.
So now both of my machines get their time from bbot.org:
magnesium:~ $ ntpq -np
remote refid st t when poll reach delay offset jitter
==============================================================================
+76.72.161.27 138.236.128.112 3 u 44 64 377 81.174 -2.459 1.158
+209.177.158.233 134.21.35.167 3 u 42 64 377 62.137 -3.428 1.459
-64.34.171.122 198.60.22.240 2 u 42 64 377 85.527 -7.019 2.248
*69.50.219.51 209.51.161.238 2 u 36 64 377 54.501 0.361 45.780
bbot@neon:~ $ ntpq -np
remote refid st t when poll reach delay offset jitter
==============================================================================
+76.72.161.27 138.236.128.112 3 u 60 128 377 80.328 0.690 10.561
*67.23.181.241 128.4.1.1 2 u 35 128 377 82.895 1.003 7.373
+69.167.160.102 204.9.54.119 2 u 70 128 377 75.712 4.162 12.724
+50.16.231.185 192.5.41.40 2 u 26 128 377 87.617 -0.344 64.595
(The legend for the inscrutable linux bullshit can be found in ntpq’s manual file)
(Of course, at the moment I took these screenshots, neither neon or magnesium were syncing to bbot.org…)
The magic incantation to ask a NTP server for the time is sntp,
$ sntp 0.pool.ntp.org 2012 Aug 04 01:30:15.000857 + 0.001475 +/- 0.083787 secs
Which will return, (if you’ve got a machine with accurate time) a tiny drift number (1.4ms) swamped by a giant lake of uncertainty. (83.7ms) This is because sntp can only request a single packet, which means it doesn’t have a good idea of the jitter between you and the remote machine. The NTP daemon manages to extract accurate time from the storm of random network noise by requesting lots of packets, then doing a lot of clever things. You can sanity-check sntp by going to time.is, which for any Linux machine will tell you that your clock is bang-on accurate. (NTP on Windows will only get the clock within 1000ms of the true time, by design. Microsoft assumes that their users aren’t pedantically obsessive nerds who absolutely positively must have the most accurate computer clocks possible. The same assumption can’t be made of Linux users.)
Tue Jul 17 05:00:18 EDT 2012
how to pass the washington state driver's test on your second try
I've been spending a lot time recently negotiating various state agencies to acquire licenses, and I figured I would write up what I did, because this is a goddamn blog.
Electrician's License
This was more or less easy. I have a weirdo subtype: Nonresidential lighting maintenance and lighting retrofit (7A). Getting this required two years of on-the-job experience, having the supervising electrician witness that I had that experience on a form, getting that form notarized, paying a fee, and then taking two tests.
In the United States, all the states have been bullied into adopting a uniform electrical code, imaginatively titled the National Electrical Code. Every couple years it is updated to phase out certain old practices of electrical work, and institute new safety methods. The individual states often lag by a year or two when adopting: the latest version is NEC 2011, but Washington is still on NEC 2008, for various amusing political reasons.
One of those is money. The NEC, despite being, essentially, law; is actually produced by a for-profit industry association, which means the code will cost you money, and not a small amount of it: NEC 2011 costs $75. Perniciously, when a state updates to the latest version of the code, every single electrician in the state has to buy a new copy, and take various courses on the updated rules. The perverse incentive for the NFPA is to issue updates as often as possible, to extract the maximum amount of rent from their legal monopoly.
The licensing tests are open-book, but I didn't want to give the NFPA my money, so I pirated a PDF copy of NEC 2008, and studied that.
That's the first test. The second test is on 19.28 RCW, the Washington State law governing electrical work.
Both of these tests are administered by PSI Exams, a company that apparently exists solely for state governments to outsource test administration to. Presumably there's all sorts of kickbacks and bribe-taking involved here too, I didn't really want to dig too deeply.
So. I paid my fees, scheduled the test, and studied the Law. Finally, the big day came. I took the test, and passed the NEC portion, but failed the RCW portion.
The proctor printed out the sad evidence of my laziness and incompetence, and handed it to me. I looked at the paper, read it, then instantly forgot the information.
This was one of the most egregious failures of rationality in my adult life, so listen carefully: Somehow, after all that, I became convinced that I had failed the NEC portion, not the RCW.
This is partially explainable by the fact that the NEC part had pitched a couple slowballs over the plate regarding wire marking trivia. These would have been really, really easy to answer if I had a paper copy of the NEC with me... but I was trying to save money! Whoops. So I got those wrong, but still passed the test. My failure haunted me, somehow metastasizing in my head to "I flunked the entire test".
Wrong.
There's a waiting period before you can retake the test. In the time I purchased a physical copy of NEC 2008, and studied the heck out of it. I show up for the retest, code in hand, ready to trounce this test. I sit down at the computer... and the test is for 19.28 RCW.
I am confused. I complete the test, easily passing it. (It picked a different random set of questions, ones I knew the answers to this time, apparently.)
I pick up my book, walk out of the testing room, and tell the proctor that there is A Problem. I've been given the wrong test! I am absolutely, unshakably certain that I had failed the NEC part the first time, not the RCW part. A Mistake Has Been Made.
The proctor is not having a good day. To be precise, she is not having a good first day on the job. She is not familiar with PSI's computer system, but figures out that I had taken the test that had been assigned to me. She calls PSI technical support (for apparently, the fifth time that day) and we investigate. The conclusion is reached that everything is working fine.
I am still not convinced, but this is obviously not the place to resolve it. (The PSI testing center is a single, two-room office suite in a office park in a Seattle suburb) I'm holding things up for other people who actually took the right test, so I drive home, dreading what is obviously going to be a couple hours of phone hell, navigating the bowels of a giant bureaucracy to correct a weird computer error. This is going to really, really suck.
I get home, open a beer, and spend 10 minutes on hold. I finally get a rep, tell her my name, social security number, blood type, and secret fear; she accesses my file, and tells me that I've passed both tests. I am now a 7A licensed electrician.
"Really?"
"Really."
"Oh."
I thank her. I hang up. I feel like biggest idiot in the entire world, the dumbest man who has ever, or will ever, live.
So that's how I got my electrician's license. How I got my driver's license is similar in the broad strokes.
Driver's license.
In Washington state, if you're over 18, all you need to get a learner's permit is to pass a knowledge test, and pass a simple eye exam. I spend half an hour waiting for my number, while watching a lot of alarmingly old people renew their driver's licenses.
I pass the knowledge test with ease, (It's taken on a computer, which uses a CRT-based touchscreen! Blast from the past.) and receive my learner's permit on April 3rd, 2012.
I don't know much about learning to drive, but I've read a little about learning how to fly, so I keep a logbook.
Over the next month, I rack up 269.35 miles, and a number of hours that I really don't want to go through and add up, watch the instructional videos produced by the DoL, until finally I decide that I'm ready to take the test. It is scheduled for May 14th, 2012.
This is what it looks like when you fail a driving test. I got a 78/100, the passing score is 80/100.
Highlight:
"So, have you ever conducted a test where the guy hit someone?"
"I can't answer that."
"Oh."
So how did I fail the driving test? It's easy: during the test, a specific phrase is used. It is, "rejoin traffic."
When I took the test, it was a beautiful, sunny summer day. 70F, not a cloud in the sky. Driving tests are (almost always) conducted on empty side streets, since of course this is a driving test, and the driver may fuck up.
The street is empty. The proctor says, "rejoin traffic". I glance into a mirror and, duh, see nobody, so I just drive into the street.
No! Wrong! You're supposed to be pretending that there is traffic. They are looking for three specific things:
- Checks mirror.
- Physically turns around and checks blind spot.
- Turns on turn signal.
If you miss any of those, you lose the maximum 4 points on that test, failing the section entirely. Do that often enough, and you fail the test.
Don't do that. Perform those three actions. Even better: say them out loud ("Mirror, blind spot, turn signal") Driving instructors like to be talked to, they want to hear you thinking through things. I also repeated instructions back to them, ("Turn left at the upcoming intersection" "Turning left, roger") which you probably don't have to do, but they didn't seem to mind.
I passed parallel parking perfectly... except for signaling.
Minor point loss: at a stop sign with a blind corner, you're supposed to come to a complete stop before the white line, creep forward until you have visibility, come to another complete stop, then go.
Something I was warned about by a friend who also recently took the test: the rules for parking on a hill are somewhat esoteric. (You have to point your wheels in a certain direction, depending on circumstance) Study them carefully, or else you'll be dinged the full 4 points on that test.
Note: a perfect score on the driving test means that they'll never touch the scoring form. If they write anything at all, it's because you screwed up, and they're deducting points. (If you ask the instructor what you did wrong, they may or may not answer. I think they're not supposed to, but if it's clear that you're going to pass, they may bend the rules. This means that they won't help you when you actually need it, but oh well.)
There's a couple of commonsense tips:
- Drive slow. By default, I drive slowly enough to annoy my mother, so that wasn't really an issue, but still.
- Bring a book to the DMV. Or something, anything. I had to keep myself entertained for a couple hours. Don't be like me. Be smart.
- Don't argue with the driving instructor. That cannot possibly help. Unless it's a very obvious, and very trivial mistake, ("Your headlights aren't on." "Actually, they are." "Oh.") then disagreeing with them isn't going to end well for you.
Anyway, I passed the test with trivial ease on my second try. Anticlimax ending!
Wed Jun 13 23:35:54 EDT 2012
biolite camp stove
So John Biehler just reviewed the Biolite camp stove. The gist is that it's a little wood stove which uses a thermoelectic junction to generate electricity that could be used recharge your phone, or whatever. At $129, it's a cute little gadget, that also happens to demonstrate why the TEC effect isn't used for commericial power generation.
Let's look at the numbers:
Fire power output (peak): 3.4 kw (lo) 5.5 kw (hi) USB power output: Max continuous: 2W @5V, Peak: 4W @5V
Assume that it only manages the maximum continuous power on the "hi" mode. This gives us 2W/5500W = a magnificent final thermodynamic efficency of .036%
Thu Jun 7 19:13:25 EDT 2012
Bad Transcript: Prometheus (2012)
I heard from my sources that Prometheus was not good, so I endured what was probably the worst cam I've ever seen to bring you a Bad Transcript for it.
Spoiler alert: yes, it really is that bad.
Mon Jun 4 18:10:12 EDT 2012
cod blops 2
So like any other good drone, I've been watching the E3 presentations, which also means I saw the pretty bland gameplay demo for Call Of Duty: Black Ops 2.
If you watch that trailer, which you shouldn't, you'll get the basic gist, which is that it's 2025, the Army is 50% drones, but surprise surprise, the Russians or someone hacks them, and now you gotta shoot them with bullets. Despite the premise, the gameplay demo showed the player shooting a lot of foreigners with various gadgets. So, a typical Modern Warfare game, like the last five COD games.
This actually a neat premise, kinda like the EMP level from MW2, which they're bungling pretty badly. Here's what it should be like:
First level: Typical hand-holding level. You still have all your fancy gadgets, and are on a mission in Columbia or something, killing the natives. Game makes a bunch of imperialism and "gosh with all this modern weaponry we have, it's like we're on easy mode!" jokes.
Second level: Oh no, we've been hacked! Bad news, Mason: the new guns don't work either. We'll have to use these WW2 museum pieces... the same guns from Call Of Duty 1!
Third level: Old West guns!
Fouth level: The robot factory! You've got to make it to the control room to shut down the production line, or else you'll be hit by endless waves of combat robots coming right off the conveyor belt.
(Explaining the joke: this is how combat works in every CoD game, endlessly respawning enemies that constantly come at you until you hit a checkpoint.)
Fifth level: We're out of ammo... we'll have to use swords! Sudden genre shift!
Sixth level: The hackers are hosting C3 inside a WoW-clone! Mason, take this level 60 warrior we bought off a Chinese gold farmer, and go kill them. Another sudden genre shift!
Seventh level: I don't know. The last five games have ended with killing the viewpoint character, and I don't know how to one-up that.
Tue May 1 13:25:01 EDT 2012
come on up, get your extremely impractical ideas here
So I've got a dumb idea, and in the hopes of getting it out of my head, I'm going to write a blog post about it.
In 2006, Daniel Rutter wrote about the "genset" option for the t/zero vaporware electric car. The basic idea was this: A plug-in hybrid, but with the gasoline engine on a trailer. If you're taking a short trip, then you don't take the genset with you, because you don't need the weight. If you're going on a long trip, then you hook up the trailer, and enjoy the long range and fast refueling that a gasoline engine gives you. (Note that this scheme means you'll have a fairly large genset sitting around at home, which spends most of its time not being used.) This is part one.
Part two: Heat engines have a surprisingly low maximum theoretical efficiency. The endoreversible heat engine efficiency equation is thus: (units are absolute degrees, Kelvin or Rankine)
The problem is that the Earth just isn't cold enough. Room temperature is 300 Kelvin! You're not going to want Th to go much above 830K, or else you'll be producing nitrogen oxides in the exhaust. This gives a final endoreversible efficiency of 0.40. That's the maximum thermodynamic efficiency, and there ain't no way to beat thermodynamics.
You can bend the rules a little, though. It's impossible to extract any more mechanical work from the waste heat, but it's still heat, you can use it for things that don't need low-entropy heat sources. Like, say keeping a house warm, or heating water.
This is called Cogeneration, and depending on how you do it, you can get up to 90% total thermal efficiency. A popular home cogeneration system is the MicroCHP furnace, a natural gas turbine that provides hot water and forced-air heating from its waste heat outflow. It can also run as a backup generator during power outages, in which case it vents waste heat outside.
The synthesis of these ideas is obvious: Make a plug-in hybrid whose engine is a cogenerating furnace built around a multi-fuel gas turbine.
A brilliant idea! There are some problems.
1.) MicroCHP turbines are designed to run on natural gas only. The "multi-fuel" version would be a second generation product. The first gen would have problems: the natural gas fueling infrastructure in the United States is a lot more sparse than the liquid-fuels infrastructure.
2.) The turbine is going to want a lot of cooling. Does a trailer get enough airflow?
3.) How well does the turbine tolerate road vibration?
4.) There's a user design problem: for a cogenerating furnace to work well, you want it at the center of your house, where all the waste heat goes to keeping you warm. This essentially means that every user of this car has to have an insulated, attached garage, or else they'll be losing some efficiency.
5.) There's a user interface problem: You can drive out of the garage with the trailer attached easily enough, but you'll then have to back into the garage, trailer first, and then reattach all the connections. Manually. Every time you want to use it.
6.) There's a use-case problem: Every time you drive away with the turbine, you drive away with the house's sole source of heat and hot water. Fine with a single-occupancy home, might be a problem for a family.
7.) It is certain that in the near future, cripplingly heavy taxes will be applied to fossil-fueled vehicles. Will this count as one? Maybe?
8.) This idea isn't terribly original. There's a lot of prior art here. Getting a patent will be an uphill battle.
So, there. Eight reasons why I'm talking about this idea in a blog post, rather than a room of serious men in suits.
Wed Apr 25 07:48:40 EDT 2012
looking ahead to our glorious future
The youth vote still supports Obama, but in a chastened, conditional way. In hindsight, Obama's 2008 campaign looks like an indulgent fantasy in which the major conflicts in life simply don't exist. There may be no white America and no black America, no blue-state America and no red-state America, but one thing is clear: There is a young America and there is an old America, and they don't form a community of interest. One takes from the other. The federal government spends $480 billion on Medicare and $68 billion on education. Prescription drugs: $62 billion. Head Start: $8 billion. Across the board, the money flows not to helping the young grow up, but helping the old die comfortably. According to a 2009 Brookings Institution study, "The United States spends 2.4 times as much on the elderly as on children, measured on a per capita basis, with the ratio rising to 7 to 1 if looking just at the federal budget."
[...]
Cynicism rises to fill the emptied space of exaggerated and failed hope. It's all simple math. If you follow the money rather than the blather, it's clear that the American system is a bipartisan fusion of economic models broken down along generational lines: unaffordable Greek-style socialism for the old, virulently purified capitalism for the young. Both political parties have agreed to this arrangement: The Boomers and older will be taken care of. Everybody younger will be on their own. The German philosopher Hermann Lotze wrote in the 1870s: "One of the most remarkable characteristics of human nature is, alongside so much selfishness in specific instances, the freedom from envy which the present displays toward the future." It is exactly that envy toward the future that is new in our own time.
And we will not talk about any of it. We will keep mum. We will hold our tongues lest we seem ageist, lest we seem bitter, lest we seem out of touch, lest we seem pessimistic, lest we seem divisive.
[...]
A generation now means an economic cohort — a moment in the cycle of rising and (mostly) falling economic data. The UK has 21.8 percent youth unemployment, France 22.8 percent, Hungary 26.1 percent, Italy 28.2 percent, Spain 47.8 percent. Around the world, young people are beginning to be defined by their unemployment: the mileuristas of Spain, "those who earn less than a thousand euros"; the NEETs of England, "not in employment, education, or training"; the hittistes of Tunisia, "those who lean against the wall." Revolutions or unmanageable riots have inevitably followed the rise of masses of bored, underemployed young people.
(Don't forget Connor Kilpatrick's list of objections over at The Exiled.)
"Depression is a choice" and "Two quick responses"
We are in a depression, but not because we don’t know how to remedy the problem. We are in a depression because it is our revealed preference, as a polity, not to remedy the problem. We are choosing continued depression because we prefer it to the alternatives.
Usually, economists are admirably catholic about the preferences of the objects they study. They infer desire by observing behavior, listening to what people do more than to what they say. But with respect to national polities, macroeconomists presume the existence of an overwhelming preference for GDP growth and full employment that simply does not exist. They act as though any other set of preferences would be unreasonable, unthinkable.
But the preferences of developed, aging polities — first Japan, now the United States and Europe — are obvious to a dispassionate observer. Their overwhelming priority is to protect the purchasing power of incumbent creditors. That’s it. That’s everything. All other considerations are secondary. These preferences are reflected in what the polities do, how they behave. They swoop in with incredible speed and force to bail out the financial sectors in which creditors are invested, trampling over prior norms and laws as necessary. The same preferences are reflected in what the polities omit to do. They do not pursue monetary policy with sufficient force to ensure expenditure growth even at risk of inflation. They do not purse fiscal policy with sufficient force to ensure employment even at risk of inflation. They remain forever vigilant that neither monetary ease nor fiscal profligacy engender inflation. The tepid policy experiments that are occasionally embarked upon they sabotage at the very first hint of inflation. The purchasing power of holders of nominal debt must not be put at risk. That is the overriding preference, in context of which observed behavior is rational.
[...]
Affluent retirees depend heavily on asset wealth; Social Security cannot cover the lifestyles to which they’ve grown accustomed, and the expenses and commitments they’ve accumulated.
Affluent older Americans hold a large proportion of their wealth in bonds and cash-like instruments (bank CDs, money market accounts). They also maintain significant positions in stock funds that might “do better when the economy does better”. But, unsurprisingly, retirees keep the wealth they most depend upon in safer, fixed income vehicles. The proportion they keep in stock funds tends to increase with wealth. [2] Since they can’t clip coupons, retirees rely upon asset sales and redemptions for income. They try to manage the pace of sales so they don’t outlive their capacity to maintain their lifestyles.
Retirees living on asset wealth are very exposed to inflation. It’s an error, a fallacy of composition, to assume that the existence of hedges and “sophisticated vehicles” means that somehow everybody can be protected. Every debt contract imposes inflation risk that some party must bear. Stock markets get the press, but most financial claims on capital are structured as debt, all of which must be held, directly or indirectly, by some human (usually an old or rich human).
[...]
So people who intend to live off their nest eggs rely first and foremost on the “safety” of bonds. Expansionary policy is a hazard for them.
Many Do the Math posts have touched on the inevitable cessation of growth and on the challenge we will face in developing a replacement energy infrastructure once our fossil fuel inheritance is spent. The focus has been on long-term physical constraints, and not on the messy details of our response in the short-term. But our reaction to a diminishing flow of fossil fuel energy in the short-term will determine whether we transition to a sustainable but technological existence or allow ourselves to collapse. One stumbling block in particular has me worried. I call it The Energy Trap.
In brief, the idea is that once we enter a decline phase in fossil fuel availability—first in petroleum—our growth-based economic system will struggle to cope with a contraction of its very lifeblood. Fuel prices will skyrocket, some individuals and exporting nations will react by hoarding, and energy scarcity will quickly become the new norm. The invisible hand of the market will slap us silly demanding a new energy infrastructure based on non-fossil solutions. But here’s the rub. The construction of that shiny new infrastructure requires not just money, but…energy. And that’s the very commodity in short supply. Will we really be willing to sacrifice additional energy in the short term—effectively steepening the decline—for a long-term energy plan? It’s a trap!
Tue Apr 17 08:11:59 EDT 2012
gcc why you gotta hurt me so
I got tired of being apparently the last person in the world not to know C++. So I'm struggling through one of those stupid "Teach yourself X in only one hour a day" books, and because I'm me, I'm wasting a lot of time haring off on pointless tangents. Like, for one example, the auto operator.
From "The Biggest Changes in C++11 (and Why You Should Care)":
In C++03, you must specify the type of an object when you declare it. Yet in many cases, an object’s declaration includes an initializer. C++11 takes advantage of this, letting you declare objects without specifying their types:
auto x=0; //x has type int because 0 is int
auto c='a'; //char
auto d=0.5; //double
auto national_debt=14400000000000LL;//long long
This sounded like a new and innovative way to shoot yourself in the foot, so I gave it a try. And it works great! For those examples, and those examples only.
auto Array[5] = { 1, 2, 3, 4, 5 };
You'd think it would be pretty obvious that I want a five element array, initialized with 1 ... 5, right?
$ g++ -pedantic -std=gnu++0x -Wall -Wextra -Werror foo4.cc
foo4.cc:5:33: error: unable to deduce ‘std::initializer_list [5]’ from ‘{1, 2, 3, 4, 5}’
C'mon, man. Please?
(There's also a really neat GCC feature called designated initializers, which offers an abridged syntax for initializing an array with sequential values. C only, sucker! Anyone using C++ can fuck off, apparently.)
GCC is also really bad at reading minds:
auto a = 3;
auto b = 2;
int main()
{
cout << a / b << endl;
}
Which, of course, outputs:
$ compile foo5.cc && ./a.out 1
This is because an operation on an int will always output another int. I didn't really think it would be smart enough to use floats here, but I had hope.
Fri Mar 30 15:29:30 EDT 2012
fun with animated images
(Crossposted from my tumblr. Hey, read this other thing, too!)
It’s probably more noticeable to me, since I had been staring at them for hours while working on them, but the quality goes down dramatically:
Whenever I post the animated version of something, I don’t know, I just hate seeing all the work I tried to do get all grainy and flat. :’\
GIF is a fairly old format, standardized in 1989, and therefore has some quirks characteristic of its time. One of those is its support of color.
GIF is palette-based, it can display any color in the 24-bit RGB colorspace, but the actual bitmap only has 8 bits of intensity, which means the final image can only have 256 different colors. This is not obvious with flat-shaded illustrations, but becomes very obvious with gradients. Here’s a 24-bit PNG:

And the same thing, converted to GIF:

Imagemagick tried very hard to make up for the difference in gamut using dithering, but that can only go so far.
You would reasonably expect that GIF would go the way of all the other dinosaur image formats, like XPM and PPM, except for one thing: it’s the only reasonably popular image format that supports animation.
You would expect PNG, the GIF replacement, to support animation: and indeed it does, as the MNG format, first released 11 years ago.
(This is territory I don’t quite know as well: if I get anything wrong, speak up.)
As you may have noticed by the fact that it’s older than most Tumblr users, yet you’ve never heard of it, MNG hasn’t exactly taken the world by storm. There’s a couple reasons why:
1.) Many, many, many are the clever tricks that can be used to compress video. GIF uses hardly any of them, MNG uses quite a lot. This means that its reference implementation is unusually large compared to most static image compression formats, simply because it does so much.
2.) They named it MNG. When you’re writing something that uses GIFs, but doesn’t support GIF animation, then your software is broken, and your users will complain. You can explain to them that your software doesn’t actually need to use GIF animations, that the spec is a mess, and also that coding it would be really hard and you don’t wanna, and they will nod along, then dump your half-assed piece of shit, and go give their money to your competitors. Therefore, if you support GIF, you have to support GIF animation.
MNGs, however, aren’t PNGs. Different name, different library. MNG support doesn’t come free with importing libpng. Two separate and different things, with no possibility of confusion on the user’s end, and absolutely no incentive to support it on the developer’s end.
3.) Programmers generally don’t like GIF animations. It’s terribly inefficient at compressing video, it can’t contain sound, most implementations don’t provide playback controls, it unnecessarily complicates a lot of image-display code that would otherwise be very simple… Basically, it poorly solves a problem that doesn’t exist. Why not just use a real video format, like AVI?
Additionally, GIF is often used by uneducated users to do stupid things. (eg: gifsets on tumblr, which replicate the functionality of a 10 second Youtube video by using 10 times the bandwidth; Blingee) If there’s anything programmers hate more than sunlight, it’s people solving problems badly. Witness the widespread hate for Visual Basic and Access. (Both Microsoft products, hmm.)
4.) Up to the year 2003, Firefox could actually decode MNG. But because of #1, this required using a lot of code to support a feature used by essentially nobody, and the Firefox team is under constant fire for their awful, bloated codebase, even though any modern web browser has to be enormously complex. So they ripped out that code and added a small hack to the PNG decoder that would recognize a series of PNG files pasted together as an image format. (See also!) This is the APNG format.
This minor hack is quite similar to something Netscape did back in 1996, with the release of Netscape Navigator 2.0. Originally, GIF animations only played once. (Loops didn’t exist) The manifest uselessness of GIF animations, combined with the general jankiness of the implementation, meant that essentially nobody used them, like how nobody uses the physical units in CSS.
But! GIF has an Application Extension Block, which allows programs to set custom attributes in a somewhat standardized way. This allowed Netscape to add a field that specifies how many times you want the animation to repeat. (0 to 65535, 0 for “forever”. The field’s an unsigned short, of course.) This is also why every GIF animation on the internet contains the string NETSCAPE2.0.
The architecture astronauts of the libpng group were outraged. Those dirty software vendors had taken a perfectly functional piece of standards compliant code, and thrown it away just because it was huge and useless. Then they had the incredible effrontery to replicate one of the worse excesses of the Browser Wars! The bastards were siding with the Visual Basic crowd, rejecting a technically superior product for boring reasons of practicality.
Therefore libpng rejected the APNG extension, to show those jerks who’s boss. So here we are in the year 2012, stuck with 80s technology, because nobody can agree to use software that doesn’t suck.
This reminds me of an old truth about computers, which is, that computer novices hate computers.
As in, they hate the machine. Everywhere the novice looks, he is faced with bewildering complexity. Vast bulwarks of obtuse, impenetrable metaphors confront him at every turn, making even the simplest task complex. Even when he figures out how to force the machine to do what he wants it to do, by trial and painful error; vast and invisible forces can at any time rip the rug out from under his feet, and force him to begin again. Software updates, computer viruses, bit rot, inexplicable configuration changes, even mundane hardware failure. The computer is cyclopean and faceless, a machine paradoxically both indifferent and supremely malevolent. The computer doesn’t care about you want to do, and when it breaks, it breaks because it hates you. The ancient mistake of anthropomorphizing: the novice doesn’t understand the rules, and so sees intent where there is none.
The expert, on the other hand, likes computers. They do what you tell them. In a real and fundamental way, software can be perfected. There is no room for bugs in 2+3=5, and this can be extended to any piece of software. It’s all just math.
In fact, the only thing that stands in the way of the perfectability of software is the humans.
Any time the expert encounters a bug, or a mangled sentence, or a broken piece of software, she knows that a human did this.
When the HTML5 <video> tag is rendered useless by political infighting between Apple and People Who Aren’t Assholes, it’s not the fault of the computers. It’s the fault of the humans.
When Android phones executed everything typed into them as root, this was the fault of humans. When a Patriot antimissile battery missed an incoming SCUD, resulting in the deaths of 28 soldiers, this was the fault of humans.
Why are programmers such miserable bastards all the time? It’s because they get maybe two solid hours of flow a day, and then have to descend from the platonic plane of pure math to deal with all the other stupid, willfully ignorant humans.
Sun Mar 18 07:22:43 EDT 2012
fun facts
Two things on Wikipedia today which I found mildly amusing.
Did you know: The numeral system which the Western world refers to as "Arabic" numbers, are actually called "Indian" numbers by the Arab world? The numeral system used by Arabs is the Arabic-Indic system, which shares a couple glyphs with Hindu-Arabic numerals, but, hilariously, represent completely different numbers? ٩ is 9, logically enough, but ٦ is 6, ٥ is 5, and ٤ is 4!
Furthermore, did you know that India has a whole pile of numbering systems, presumably just to confuse foreigners?
Also, everybody older than 18 remembers the Y2K panic; when on January 1st, 2000, two digit year representations rolled over, and widespread chaos was predicted to occur when various computer systems would stop working. Of course, thanks to a great deal of money being spent, this did not happen. (Though there were some pranks.)
Slightly more au courant nerds are aware of the year 2038 problem, when 32-bit Unix timestamps roll over. But did you know: there are a whole bunch of these problems?
In 2036, the timestamps in the NTP protocol, which has been used for the last 25 years to synchronize the clocks of more or less every server on the internet, will roll over. On September 17, 2042, the internal clock used by IBM mainframes will roll over. (System/360 has a number of delightful idiosyncrasies, thanks to 40 years of cruft.) The year field used by the Windows FAT filesystem will roll over in 2107. Four digit years will roll over in the year 10,000. Fun!
Various minor errors have resulted from Y2K-like problems, but on other dates. Taiwan uses a calendar with year 1 set to 1912, which meant they saw their first three digit year in 2011: the Y1C problem. Some Unix programs threw errors on the Unix Billennium, when Unix time hit 1000000000 on September 9th, 2001. (The events of two days later slightly overshadowed this.)
Did you know: It's a miracle anything works at all?
Sun Mar 11 22:00:39 EDT 2012
fun with spiders
So I grepped my logs for everything that asks for robots.txt, and the results were interesting.
Firstly, there's a lot of spiders out there!
$ grep "06/Mar" spiders.txt | wc -l 69
When an article isn't trending, or I haven't posted lately, bbot.org does about 1200 hits and 300 uniques a day. Some spiders request robots.txt multiple times, but cloaked spiders don't request robots.txt at all, so it's a wash. This means that fully a fifth of my traffic is from machines.
This is odd, because in terms of actual traffic, Google is the only game in down.
The traditional social contract between search engines and site owners is that you let them download your site, and in return, they drive traffic to you. This contract is broken, and has been for years. Google provides 99.98% of search traffic.
Microsoft, Yahoo, Gigablast and Blekko maintain fabulously comprehensive databases, updated regularly, which nobody ever uses. (DuckDuckGo strips referrer headers from their outgoing traffic, so they might be super popular, I have no way to know) This doesn't even count the foreign-language search engines, like Baidu, Soso Naver, Daum, or Yandex, who I also never ever see traffic from, since my site's in English.
Now, I don't use robots.txt, but still. What a waste of time and money!
Spiders can be roughly grouped into three groups: Google, Everybody else, and spammers. Brandwatch, Sitexploration, Seoprofiler, Linkdex, and Metadatalabs are all "SEO tools", which want to charge you money to get reports on their vague guess at how many people link to you. Spotinfluence even wants you to sign in via Facebook to begin using their site, and if you're dumb enough to do that, you deserve whatever they do to your profile.
Some spiders don't take no for an answer.
208.115.113.85 - - [01/Mar/2012:14:09:51 -0500] "GET /robots.txt HTTP/1.1" 404 169 "-" "Mozilla/5.0 (compatible; Ezooms/1.0; ezooms.bot@gmail.com)" 208.115.111.69 - - [01/Mar/2012:15:37:17 -0500] "GET /robots.txt HTTP/1.1" 404 169 "-" "Mozilla/5.0 (compatible; Ezooms/1.0; ezooms.bot@gmail.com)" 208.115.113.85 - - [01/Mar/2012:18:24:34 -0500] "GET /robots.txt HTTP/1.1" 404 169 "-" "Mozilla/5.0 (compatible; Ezooms/1.0; ezooms.bot@gmail.com)" 208.115.111.69 - - [01/Mar/2012:19:56:54 -0500] "GET /robots.txt HTTP/1.1" 404 169 "-" "Mozilla/5.0 (compatible; Ezooms/1.0; ezooms.bot@gmail.com)" 208.115.113.85 - - [01/Mar/2012:22:02:14 -0500] "GET /robots.txt HTTP/1.1" 404 169 "-" "Mozilla/5.0 (compatible; Ezooms/1.0; ezooms.bot@gmail.com)"
Some really don't.
107.21.161.122 - - [06/Mar/2012:09:46:53 -0500] "GET /robots.txt HTTP/1.0" 404 169 "-" "linkdex.com/v2.0" 107.21.161.122 - - [06/Mar/2012:09:46:53 -0500] "GET /robots.txt HTTP/1.0" 404 169 "-" "linkdex.com/v2.0" 184.73.70.151 - - [06/Mar/2012:14:31:17 -0500] "GET /robots.txt HTTP/1.0" 404 169 "-" "linkdex.com/v2.0" 184.73.70.151 - - [06/Mar/2012:14:31:17 -0500] "GET /robots.txt HTTP/1.0" 404 169 "-" "linkdex.com/v2.0" 107.20.100.1 - - [06/Mar/2012:22:27:30 -0500] "GET /robots.txt HTTP/1.0" 404 169 "-" "linkdex.com/v2.0" 107.20.100.1 - - [06/Mar/2012:22:27:31 -0500] "GET /robots.txt HTTP/1.0" 404 169 "-" "linkdex.com/v2.0" 107.20.100.1 - - [06/Mar/2012:22:54:24 -0500] "GET /robots.txt HTTP/1.0" 404 169 "-" "linkdex.com/v2.0" 107.20.100.1 - - [06/Mar/2012:22:54:25 -0500] "GET /robots.txt HTTP/1.0" 404 169 "-" "linkdex.com/v2.0"
I'm not sure what the rationale is for using such a short timeout is, or asking multiple times. Presumably if a robots.txt request returns a 404, and has been doing so for the last two years, one isn't going to appear five hours later. Google, on the other hand, only checks to see if I've changed my mind twice a day.
While I've got my logs open, I'd like to complain about this: (original domain replaced with .su)
91.229.175.130 - - [11/Mar/2012:19:52:39 -0400] "GET /clubwearguru.su/blog/clubwearguru.su/archives/clubwearguru.su/2009/clubwearguru.su/07/clubwearguru.su/index.htmlhxxp://bbot.org/clubwearguru.su/blog/clubwearguru.su/archives/clubwearguru.su/2009/clubwearguru.su/07/clubwearguru.su/index.html HTTP/1.0" 404 169 "-" "Mozilla/4.0 (compatible; ICS)"
This appears to request a valid page on my server, but with a domain inserted after every /. Does this actually work? Do people really automatically post their server logs online? The mind boggles.
If you liked this, you should donate! bbot.org is out of money, and is not long for this world otherwise.
Fri Mar 9 19:27:50 EST 2012
donate or die 2012
Well. So it's come to this. (Again.)
Last year I ran out of server money, and had to beg for funds. However, I'm no more employed than I back then, and I'm out of cash. Again.
Midnight and p4ch3c0 stepped up with incredibly generous donations, but in the intervening 14 months, they have ascended bodily into Heaven, to hang out with the other saints, and the Catholic church has canonized their Earthly remains. So I can't shake them down for any more money. I tried talking to the Pope, but I could feel the force of his disapproving frown over the telephone, so no dice there.
Bitcoin address: 1MjsXQNNXJNTbqis7yWVsShTiLa95aV6Mv
bbot.org has no ads. It is entirely reader-supported.
Tue Mar 6 20:27:23 EST 2012
not to mention road salt's going to kill it after a decade
So CarTalk recently featured a question from a guy who wanted a diesel car that would last 60 years, and 500,000 miles. (804,000 kilometres) The Tappet Brothers said he was crazy, that it was a dumb idea, but didn't actually answer the question.
Now, it is a dumb question, but I'd like to try a stab at it.
First of all, forget diesel. In fact, forget anything fueled by hydrocarbons. If you've glanced at the television in the last decade, you'd know that fossil fuels are a real bad long-term bet.
This means going electric, and (in 2012), paying a fairly steep price premium. Electric cars are also a mixture of good and bad news, from a maintenance standpoint.
The good: Many, many fewer moving parts. An internal combustion engine is an unholy pile of camshafts, crankshafts, pistons, gears, and fans; many of which run at high speeds, close tolerances, and very high temperatures. Maintenance is ongoing, and nontrivial.
In comparison, an induction motor has one moving part: the rotor. Over the course of 804,000 kilometres, you'll be going through a bunch of shaft bearings, but that's more or less it, for the motor. Plus, the extremely wide torque bands of electric motors mean that the gearboxes only need one or two gears, and if you use hub motors, and are willing to sacrifice high speed, you can run direct drive. This means the only consumable items on an electric car are the tires, the windshield wipers, and:
The bad: The battery.
We've been trying to figure out a good way to store electricity for the last century, and so far, haven't made a whole lot of progress. The best of the best, lithium-ion, is both heavier, and more expensive, per joule than gasoline. They're prone to bursting into extremely vigorous lithium-metal fires when abused, slowly discharge themselves when left alone, and have surprisingly short lifetimes when heavily used. (Say, in a car) Deep discharges also burn battery lifetime, say, if you bought an electric car that advertised a hundred kilometre range, and tried to actually drive a hundred kilometres.
Replacement costs are ball-punchingly steep: most of the cost of an electric car is in the battery pack, so replacing it is like buying most of a brand new car. If you drive it very, very gently, and never let it get below 50% charge, you'll probably be buying a new battery every 150,000 kilometres. At ~US$30,000 a pop, that adds up.
There's a degree of amortization here: over time, battery technology will get better, but it's anybody's guess as to how much better it will get.
In the article, Tom and Ray list off about a dozen features in today's cars that didn't exist 60 years ago. Power/ABS brakes, fuel injection, modern suspension technologies, etc etc. This is a bit disingenuous: there's very little room left for improvement, the gasoline car of 2012 is about as good as gasoline cars will ever be, except for one thing.
The self driving car has been a staple of science fiction for the last, well, 60 years, but we're getting close. Real close. My wild-ass guess is that between DARPA and Google, the technology for driverless cars will be ready for prime time in five years.
The wildcard here is the legal side. We could have cars that drive themselves flawlessly, but without laws that let them operate on the street, they'll be useless.
Assuming we leap that hurdle, the big driver (ah ha ha) for autonomous car adoption will be insurance companies. And after driverless vehicles become common, we'll see laws that ban manual operation of vehicles anyplace where an out-of-control car could injure someone else.
So, no, buying a car today that would be useful for 60 years is not going to be easy.
Wed Feb 29 17:16:59 EST 2012
protip
Chainsawsuit 2012/02/29, "thanks sybelifex":
(Optipng made this file 45.46% smaller, by the way. For a webcomic, that'd, what, reduce the total bandwidth bill by half?)
Alright, Kris, this is the third comic you've done now about drug ads, and I'm gonna let you in on a little secret, here: That list of side effects is legally mandated.
The Food and Drug Administration, shock of the century here, regulates direct to consumer drug advertising. They've got a bunch of boring legal documents about this.
From "Consumer-Directed Broadcast Advertisements":
The purpose of this guidance is to describe an approach that FDA believes can fulfill the requirement for adequate provision in connection with consumer-directed broadcast advertisements for prescription drug and biological products. The approach presumes that such advertisements:
[...]
Present a fair balance between information about effectiveness and information about risk.
Include a thorough major statement conveying all of the product’s most important risk information in consumer-friendly language.
They don't throw in that long list of side effects just for shits and giggles. They do it because it's the law! Jokes about side effect disclosures are about as hilarious as, "Wow, what's the deal with the Surgeon General's Warning on cigarette packs?" or "Isn't it weird that bottles of bleach are labeled poison? Isn't that weird?
This ignores the fact that "side effect jokes" have been done a million, billion times before. This is not the cutting edge of humor. Leave that dead horse alone. It no longer requires beating.
