Took my last antibiotic pill last night. That's round 6 for this sinus infection. The fact I had a sore throat before I'd even run out of pills isn't filling me with confidence, but oh well. Hopefully it's an unrelated (viral) cold.
Woke up tired. Took a nap for 4 hours. Woke up tired again, but this time covered in cats. So there's that.
This episode of Bleach is trying to be comedy, and none of the cultural references translate unless you're japanese. I can tell they're parodying specific things, just not what. The entire episode is designed to be an aside and not affect the main plot at all. (I think it's a special for their 50th episode.)
Hmmm, episode 52 introduced new credits again. Ah, "if you continue you may die before you reach $PLOTPOINT". It's Ichigo being addressed. Hands up everybody who remembers his limit break.
Ooh, did red haired guy pick up Ichigo's limit break? Nope, apparently not... Ah, I see, he's channeling Ichigo. Well, that works. I'm starting to think a flashback montage right before an attack is a bad sign in this context.
Do Japanese people really throw random english phrases in conversation whenever they want to emphaisze something? I suppose it's a bit like english speakers with Latin and french...
So where did I leave off yesterday? I found out that the reason the "FORK=1 ./smoketest-all.sh" script was failing was that formatting a dozen virtual partitions (to create the "hdb" images to mount on /home inside each qemu instance) was causing so much I/O contention that the timeout was elapsing before each test could actually start. At a guess, mke2fs has some fsync() calls in there, and having an 8-way server with 32 gigs of ram doesn't help if flushing to disk is the bottleneck.
The easy way to deal with this is to add an option to _not_ create the hdb images, because in this case they're not needed... Ok, done.
Oh wow. Carnegie Melon actually has a process improvement process, with presentation slides. That's so meta it's almost recursive. (I'm reminded of Dilbert, "you can't just jump into the pre-meeting meeting cold".)
Came up in the context of a not-job-offer. (Recruiter sending me a posting to see if I'm interested in interviewing for it. I should do this thing.)
Ok, Obama's speech at the Radio and TV correspondents dinner was totally, totally upstaged by John Hodgman's follow-up.
There really, really, really should be an easier way to do this:
function genocide()
{
local KIDS=""
while [ $# -ne 0 ]
do
KIDS="$KIDS $(pgrep -P$1)"
shift
done
KIDS="$(echo -n $KIDS)"
if [ ! -z "$KIDS" ]
then
genocide $KIDS
kill $KIDS
fi
}
I suppose I should probably call it something other than "genocide", even though that's what it does to a process tree.
On an unrelated technical note, I wonder how close wifi is to taking over? Nobody offers ethernet jacks you can plug your laptop into anymore. (Well, a few hotels and such have them left over, but nobody's installing new ones in public places.) Homes wired up for ethernet don't seem all that common either, most people just get a wireless router, plonk it next to their cable modem, and call it a day. They don't bother running cat5 through the walls.
But offices are still full of ethernet. Servers need the bandwidth (both for raw speed terms and for density). Wireless is also less attractive when you're worried about security.
But the question is, where does the money go? Who buys so much of a technology that it becomes a ubiquitous dirt cheap commodity? I don't have enough information to know what the financial incentives are for upcoming generations of technology. The existing wired stuff is already amortized: 10baseT is essentially disposable, 100baseT is dirt cheap, and Gigabit is less than a dollar per device. There's 10 gigabit in the wild, I haven't really heard much about it in the past couple years but I assume it's still doing its thing.
Usually I can predict where a technology is going over the next few years, but here it just hasn't come up in a while. I haven't seen a lot of demand. For normal consumer use 802.11g (54 megabits/second) is fast enough for half a dozen people to watch HDTV resolution video simultaneously, and that seems to be about where demand stops at the moment. It's "good enough".
Gigabit ethernet is a little over 100 megabytes per second. My laptop hard drive is doing about 60 megabytes/second. So the cheap wired consumer networking is faster than cheap consumer storage devices, and although you can get a RAID NAS cheap these days, it'll be a while before anybody outside of a data center can really make use of 10Gig ethernet.
Meanwhile I vaguely recall 802.11g is 54 megabits/second, which is a bit more than 6 megabytes per second, although possibly a router retransmitting it in between means half of it's devoted to sending it to the router and half of it's devoted to receiving it from the router; it should be possible to send it point to point but I dunno if that's what normally happens. I should run some benchmarks...
On the one hand, my laptop hard drive is almost 10 times as fast as the theoretical maximum of 802.11g. On the other hand, my extra-fast cable modem (for which I pay extra) maxes out at a megabyte and change per second, so the wireless is at least 3 times faster than that. So it's a bottleneck going between two local computers, but not going to the internet.
The upcoming 802.11n standard claims to be 600 megabits/second, with typical throughput around 144 megabits/second. (That's from wikipedia so take it with a grain of salt.) So somewhere between 100baseT and gigabit.
When I was over at Mark's cat-sitting and grabbing the Mythbusters episodes and kitten porn anime (which has more than one episode devoted to litter box training) it was only doing a megabyte or two per second. Downloading a whole directory of episodes took an hour, while plugging in gigabit ethernet would have given me up to ten times that speed. But I just didn't bother to rustle up a cat 5 cable and find a place to plug it in; I wasn't in enough of a rush to make it worth the effort. 802.11n would make plugging in gigabit cat5 even less attractive, although I'd have to buy a new laptop and a new router to make use of it, and would that come with 10gigE for its wired option?
My question is, will wired ethernet stop getting sufficient financial incentives to keep ahead of wireless? I'm not interested in what you can do by throwing money at the problem (I could wire up my home with fiber if that was the case). Will 10gigE get commoditized to the point it displaces gigabit the same way 100baseT drove 10baseT to extinction and gigabit is now doing to 100baseT? Or will 10gigE remain a premium product costing extra, and not installed by default in new budget laptops? In which case, 802.11n will outcompete gigabit cat5 in just about all consumer installations.
Dunno. I haven't got enough information, and am not entirely sure where to go to look it up...
The xfce terminal program lets you change font size (either with the preferences toolbar button, or the edit->preferences menu entry), and when you do this it affects every open terminal. Both KDE and Gnome's terminal programs let you change this per-window.
Having a dozen different implementations of each major piece of functionality isn't much use when they're not designed to mix and match. I'm using kmail with xfce but when I click on a link it pops up abiword, not a browser. (The way you change kde file type associations is through the web browser, konqueror. No, it doesn't make any sense, but it's what you do. Unfortunately, if you install Konqueror on a non-kde desktop, it crashes when you try to bring up its preferences dialog.)
Oh, and the first time I tried to change the font size, all my open terminal windows (with multiple tabs) closed instantly:
[145829.419872] xfce4-terminal[3417] general protection ip:7f7d8a9d4e9d sp:7fff93cb7700 error:0 in libvte.so.9.5.0[7f7d8a9b6000+11f000]
Wheee...
I learned a new thing about how shell scripts work! (Translation, I spent a couple hours trying to understand a really strange bug that bit me.)
In shell script, a for loop works like:
for i in one two three do echo $i; done
The problem with that is if you want multiple related arguments (for i in "one 111" "two 222" "three 333"), you have to split them yourself, which is fiddly. (You can do it with awk, with cut, and a couple other fiddly ways that tend to be brittle.
The dirty trick to get around it is to do this:
echo -e "one 111\ntwo 222\nthree 333" | while read one two do echo $one $two done
The problem is when you try to set a variable in the loop for use after the loop, or return from a shell function inside the loop. The problem is the second half of the pipe runs in a subshell (it's a separate process), and the entire body of the loop is considered the second half of the pipe. So you're setting variables in the subshell or returning from the subshell, and that has no affect on the parent process.
That's subtle and fiddly and evil. I understand why it's doing it, but it took me by surprise anyway.
Watching mythbusters season 1. Highly entertaining. (One of the episodes you can get on dvd through netflix mentioned the rocket car, but the dvds didn't actually contain that episode. Crazy, eh? It's such a chopped down subset, with the individual episodes edited differently than they actually aired. You have to go to bittorrent to get the real ones.)
When it gets to be 5:30 am, and meanings get reversed and then unreversed in the same bisect, it's hard to work out which of good or bad your next bisect should be. Screw up once and your result is useless.
Resuming the next morning isn't a whole lot of fun either. Where did I leave off? (And now you know why I keep this blog!)
For bonus points, the squashfs bug occurs intermittently. I've run a kernel with it twice and had it run to completion the first time and die with the squashfs bug the next. That's going to be fun to track down if 2.6.30 still has it once I've got the boot bug out of the way.
Tracked the bug down and posted about it on the list. It turns out that there's a new config symbol I need to switch on (which is described in the commit message). So all that work was to change a single config symbol. (Not even a code patch.)
Par for the course, pretty much. If it seems like I'm doing a huge amount of work for very little progress... It's pretty much all like this. (Pretty masochistic hobby if you stop and think about it. Oh well.)
It occurs to me that I'm primarily blogging about what happens when I'm on the computer, which probably gives a distorted account about what I do during the day. I don't blog about reading books (finished Guns, Germs, and Steel, rereading Wee Free Men) because I'm not doing it with the computer in front of me.
Several people pointed out to me in email that I can go "git archive HEAD" to export the current version. The reason that didn't work when I tried it? Because "head" doesn't work, it must be all upper case, even though "master" is lower case. (Yeah, that's git.)
I also read the man page for git bisect. (git help bisect == man git-bisect, therefore if the git man pages aren't installed, which they aren't by default, git has no help.) Anyway, it turns out there is a way to specify a skip result from the run script, which is to exit with the magic error code 125. No rhyme or reason behind it, because this is git, but it's nice that there is a way. (I'm still not using it, since it's trivial to do by shell script.)
The part that isn't trivial is that my script has so far done bad, good, bad, skip, skip, skip, skip, skip, skip, skip... It may go through all 1398 remaining revisions individually? Now it's done it twelve times. It takes several minutes per run, I'm watching Bleach while it does this...
Bleach continues to be weird, not that I expected different. Up to disk 12 now. Episode 46 was a giant gratuitous flashback for secondary characters, and now 47 is apparently internal politics on the part of the antagonists, and now we're back to protagonist boy Ichigo dueling with the antropomorphic personification of his sword. (Yes, really. While werecat woman watches.) Episode 48, more internal politics with long dramatic swaths of recycled footage and the same three songs, and now the catgirl is wondering why Ichigo isn't levelling up during training (because she hasn't pushed him to limit break yet, you've got to beat him silly before he levels and the current session hasn't even drawn blood yet). Well of course they shortened the deadline, that's plot 101. And now episode 49, and it's flashback land again. "Don't worry, it's just a reconnaisance mission". Oh yeah, to quote ghostbusters "this chick is toast"...
And the video froze again... And the disk icon won't let me eject it because "mount volume" is where eject normally goes. (Why would that be related? I want to eject the unmounted volume, why does the gui not give me that option? Make it orthogonal, guys. Of course the eject button on the actual drive still doesn't work.)
I still need to buy a mac. It might also be buggy crap, but then if I complained about it there would be someone to complain to who wouldn't imply its lack of quality was somehow be _my_ fault. Also, the mac has had an impressive improvement trajectory since the introduction of MacOS X, while Linux has pretty much been treading water on the UI front.
Back to Bleach. Ah, whatserface didn't die, just the red shirts. Ok, hang on, she's posessed? And slaughtering everybody. It's kind of odd the huge power disparity amoung the soul reapers, the nameless ones are one hit kills. ("If we help him, what will become of his pride?" Sigh, they've gone all insanely japanese again. And he's dead because of it. Oh _now_ you're willing to kill him. Sigh.)
Ok, this bisecting isn't getting anywhere, it's gone through well over a dozen iterations of skip and every one it looks at still build breaks with:
/home/landley/firmware/thingy/build/temp-powerpc/alt-linux/arch/powerpc/include/asm/highmem.h: In function 'kmap_atomic_prot': /home/landley/firmware/thingy/build/temp-powerpc/alt-linux/arch/powerpc/include/asm/highmem.h:98: error: implicit declaration of function 'debug_kmap_atomic'
What I probably need to do is grab the current revision it's looking at and the last known "bad" one (which reproduced the error I'm looking for, meaning _this_ error was fixed), find the fix, make a patch, and bisect between the last known "good" and "bad" applying the patch to each iteration that's horked by this bug.
This brings up another annoyance about git: "good" means the old version for the bisect and "bad" means the new version. If you're looking for where something was _fixed_ so you can apply the patch yourself, you have to call the broken one "good" and the fixed one "bad", which is not only really easy to confuse but tends to screw up the next few bisections you do because you can't what "good" currently means when the definition keeps changing every couple of searches. (And if you answer a single question wrong during a bisect the result is useless. You have to remember to test the last one yourself to make sure it reproduces the problem you're looking for, and test all the parent commits to make sure they don't.)
Since you have to _start_ a bisect with one good and one bad, git should be able to tell from that which one means "before" and which one means "after". But that would fall under user interface issue, meaning it's the user's problem. They give you 160 bit hexadecimal hash codes you can cut and paste from window to window, that should be enough for anybody, right? After all, needing to understand how a piece of software was implemented in order to use it builds character. Sigh.
I'm sure at some point in the future the git developers will silently change all this. Knowing them, instead of autodetecting before and after they'll add a --reverse-bad-good flag you have to pass in by hand. Either way it'll be my fault for not keeping up with all the random changes they make to the user interface.
Anyway, back to _this_ bisection. I've got the last commit bisect found that manifests the problem I'm actually interested in, and I can grab any of the commits it's been stuck on which show the problem I'm _not_ interested in (but which git bisect skip is too stupid to get past), and then bisect those two find the patch that _fixed_ it, then apply that patch to re-test broken versions in the original bisect and hopefully actually make _progress_.
This is another fun case of "good" and "bad" having to be redefined, since each is showing a different bug:
git bisect good 18b41f1cd537168a886c43237297692ba8d0a143 # shows build break git bisect bad a0e0404fb06164100991cacf8e055f6b30f87cc9 # shows hang
So here, "good" means "the bug I'm trying to find the fix for in the short term", and "bad" means "the bug I'm ultimately trying to find a fix for". Wheee... I hate git.
And hey, one of the intermediate commits shows the squashfs bug, but not the build break. (It's e0cf8f045b2023b0b3f919ee93eb94345f648434 and yes, that's how git expects you to refer to it. You can use any arbitrary consecutive subset of those digits, but assuring you're using enough to avoid collisions with any of the tens of thousands of other hash codes the tree is made up from is your problem.)
Anyway, that commit shows _NEITHER_ of the bugs I'm looking for (it instead shows a third bug unrelated to either do; did I mention that the general testing level of non-x86 kernels is crap?), and that's progress! The last "good" showed the build break, so this is after that was fixed. The last "bad" showed the hang, and this is before that was introduced. So depending on what I answer here, I could track down either the fix for the build break or the introduction fo the hang, but since what I want is the hang and this proves that it wasn't introduced in the range of commits covered by the build break, I can answer "good" here and change what I'm looking for (mid-bisect) to track down that hang!
Did I mention git's user interface sucks rocks and it's essentially unusable if you don't know how it was implemented?
Late. Tired. Cranky. Feeling kind of nauseous actually (15 penguin mints in one night may be a bit much, even of the chocolate ones). Finish up in the morning...
Bisected a powerpc problem and reported it upstream. Found out I'd bisected it wrong, and that the list I was supposed to report it to is A) not on kernel.org but on ozlabs instead, B) unlisted in their index.
Wrote a script to automate the bisection. Somebody pointed me that git's had yet another random feature bolted to the side of it in a hap-hazard fashion that I might have been able to use instead. Decided I didn't care. (And I decided that _before_ I found out that there's no way to indicate a "maybe" response to git bisect run, which makes it kind of useless because I've hit two unrelated bugs already in the bisect. One build breaks the kernel, the other one screws up squashfs some time after the root filesystem is mounted. The one I'm looking for is distinguishable in the kernel boot messages, before init runs.)
Ok, current Ubuntu's uselessness factor continues to rise. Attempting to suspend my laptop, I get the pop-up "Request to do policy action: multiple applications have stopped the policy action from taking place. vlc: Playing some media. vlc: Playing some media."
First, no running software should be able to the system from suspending. Second, there are no copies of vlc running anymore, they exited before I tried to suspend but this status _leaked_.
Right, BIG HAMMER TIME. Ooh, it' s been a while, what do I need to do... switch to a text console, become root, "echo -n mem > /sys/power/state"...
Back from suspend. (It worked.)
Ok, here's my objection. It's not that the system was just complaining about nothing, it's that a sus
The status leaking might be because doing something simple like extracting a linux tarball paralyzes the rest of the system for a minute or more at a time. (For example, in the above sentence, vi hung after the "m" in system and nothing else I typed displayed until the period after "time". I could have typed _way_ more in that gap, but I stopped because cursoring back up to fix typos three sentences back is annoying.)
This means that a bisect script which uses "git archive" to feed a tarball into my build system can't just run in the background and be ignored, it makes the rest of the system INSANELY unresponsive. Firefox also hangs for upwards of a minute at a time (not only can I not scroll the page, but if I move another window over it it won't _redraw_). And it hangs like this about every 3 minutes. On a dual core 1.7 ghz laptop with 2 gigabytes of ram.
Yes, the "Linux on the Desktop" people have been trying for 15 years now, and this is what you've come up with. Moore's Law says they've now got 2^12th times as much memory, processor power, and disk space as they started out with and this is still the best they can do. (How many years did they waste insisting that the display driver (X11) needs to run as a normal process so normal system load can freeze your mouse pointer, making it hard to even queue up actions for the system to do when it stops playing with itself?)
An invocation I've found useful:
git archive $(git show | head -n 1 | awk '{print $2}') --prefix=linux/ | bzip2 > ~/firmware/thingy/packages/alt-linux-0.tar.bz2
It would of course be nice if "git archive" could just spit out the current version without having to be told what version that _is_, but this is git we're talking about. There's probably a way 300 lines into a seemingly unrelated man page, but you'll never figure it out yourself.
In that way it's very much in the spirit of vi or emacs. You don't learn
how they work by playing around with it. You learn by grabbing a
spellbook and reading through hundreds of pages of
incomprehensible jargon in ancient dead languages to become worthy of
discovering the mystic incantion you will NEVER figure out otherwise. And
in reality, you learn about 5 functions it does and ignore the other million
settings on the Sonic Screwdriver unless you're the guy who _built_ it.
And this is why I vastly prefer Mercurial.
I am way, way, way off a day schedule again.
The reason powerpc is giving me so much trouble is that too many different things have changes since the last time I had it working. The qemu version is different (largely because of laptop hard drive failure and subsequent reinstalls), the linux kernel version I'm building (and thus trying to boot) is different, the compiler I'm building it with is different (4.2.1 instead of 4.1.2), and my build scripts have changed. When I run across any particular symptom, _and_ of that could be the cause. (Or it could be one of the other things that changed like the busybox tools developing a subtle sed bug, been bitten by that before.
Dug up the mailing list thread from last time a random openbios change broke powerpc, and it says svn 6657 used to work. That translates to git 2d18e637e5ec, so let's fire that up and build it verbatim... And it works. Yay.
But in this case "works" means it boots the _old_ binaries. The ones I'm currently building don't give me any output at all, which implies the serial console is horked. Hmmm...
Now I'm iterating through different versions of my build scripts (much faster) to see where I introduced whichever tool broke it. (That way I'm only testing along one axis.) The 0.9.6 release worked. The last version right before I switched to gcc 4.2.1 worked, so it wasn't the infrastructure changes since then. Commit 752 (first "expected to work" version after the compiler switchover fallout had shaken out) worked. So it's not the compiler. Now we go more slowly. Next commit (753) updated busybox version... and that worked, so it wasn't busybox screwing up the build tools. The actual kernel switchover to 2.6.30 was 754... Which doesn't build because the powerpc config needs the gratuitous new symbol to avoid build breaks. Ok, tweak that, and...
invalid/unsupported opcode: 00 - 12 - 00 (00009024) 0000938c 0
Now it's failing with a _reason_, which is an improvement. But it's definitely the kernel update that's doing it.
Of course now we're back to "two changes which can't be separated" territory; is the new kernel horked or does the config need to be changed more? (These are sort of aspects of the same question, but still...)
Now I need to bisect through kernel versions, of course. (Bisecting through things that take several minutes to build is way slower than it seems, because I switch to other windows and get distracted and don't come back promptly. It can take me an hour to go through three versions if other things are interesting enough that I forget what I was doing...)
Non-computer things today. (Ok, read through some webcomic archives.) Did rather a lot of laundry.
Ok. Dug up the release binaries of system-image-powerpc, which was known working with some previous version of qemu as of 3 months ago (albeit with some patching). The two new problems (the -hda argument actually setting /dev/hdc, and init segfaulting with the kernel trying to access memory it shouldn't) are both in the old binary, which means qemu is what changed.
Bisecting through qemu revisions that need to be patched to have any chance of booting anything sucks. Especially when different ranges of the history need different patches...
Ok, 179a2c1971 can't find _any_ hard drive with this bios, 2fbc409571 can. Looks like 513f789f6b18 might be the relevant change between those... And it is. That's where qemu switched from using hardwired layout info to querying openbios (and hence the device tree) for it. The new layout has hda/b and hdc/d swapped (the primary and secondary IDE controllers, apparently), and the panic due to accessing some invalid resource seems similar. (It's not the kernel, I'm testing a binary that used to work.)
Went to the doctor and got another cat scan (we have four at home, but the one they have is specially trained) which showed that I still have a sinus infection but A) not as bad, B) in a totally different place. I'm callin this progress! Got another 10 days of antibiotics. Feeling better already, although that's probably the placebo effect.
Went over to Mark's in the evening and fiddled with getting the nightly cron job stuff working. Played whack-a-mole with things that almost, but not quite, actually work. (I hate git. The tarballs git archive creates contain no version information, ala mercurial's .hg_archival.txt file. For years the busybox tar command complains about some weird comment record when I extract these tarballs, but when it comes to actually trying to _get_ version info, nothing.)
I asked on the busybox mailing list, and they suggested they could tweak their cron script that creates 'em to put a version string in the directory --prefix. Better than nothing, I suppose. My build scripts are carefully designed to _ignore_ this information at the moment, of course. Sigh...
Mark had a series of videos called "Chi comes home" (and a second season called "Chi's new address") which are hard to describe. "Kitty porn" comes pretty close. Kitten porn in this case. Or perhaps "Kawaii diabetic attack". I DARE you to get through even the opening credits with a straight face, let alone a full episode. (There are 104 of those in the first season. That's episode 2. Yes, it's a series of 3 minute cartoon videos about a kitten, and it is horrible yet awesome. I have not yet shown Fade because she might go into shock.)
The first episode isn't quite representative of the series, since it's the kitten wandering away from its mother and hence three minutes of way too cute _angst_ instead of pure uncut refined cuteness like the others. Although if you want angst done inexplictably well, there's a blog telling the story of a homeless family of sims. It's a father and daughter pair of sims set up on an empty lot with no money and nothing but 2 park benches as "home", allowing Sims 3's "free will" option to dictate their behavior as much as it can (everything but aspirations and opportunity pop-ups), and writing up their story with screenshots and prose. It is FAR more emotionally involving than it has any right to be, although you really have to start at the beginning to appreciate it.
There's a weird sort of yin/yang in the above two paragraphs, now that I come to think of it.
Felt totally out of it this morning. Slept through an hour of Fade and two cats trying to wake me up. (Well, sluggished and didn't get out of bed, anyway. Only actually _slept_ through part of it.) Went out and got rather a lot of Fade's old games mailed (she's culling the herd of her gaming collection, I've got a big bag of stuff to donate to the next convention with a gaming room, too). Then we went to the Kolache factory and I smashed a taillight in my car against a dumpster backing out. (That was enough to convince Fade to drive, despite her massive aversion to driving.)
Went home meaning to nap, but by that point I was up. I work based on momentum, even when "work" isn't relaly an operative word. Lurch, perhaps.
This was, however, enough to get me to make a doctor's appointment for the darn sinus infection that's been screwing up my sleep. Maybe the _sixth_ round of antibiotics will do something useful.
Got the perl removal patches resubmitted for 2.6.31. (It's technically still the merge window, let's see if they make it in this time.)
Even though the changes from 2.6.29 were one minor cosmetic tweak and rediffing so the offsets matched up, it took hours to do this because I'd totally forgotten how (and I had to write up new descriptions). My own cannonicalize.sh script seems to have gotten lost sometime in the past 3 months, so I had to write a new one. (It puts a patch in the cannonical format for linux-kernel. Yes, it has my name and email hardwired into it, it's my script.)
Now at Starbucks. Still bisecting the qemu powerpc stuff. Building qemu is slow...
Hey, my daily google alert thingy just pointed me at my Firmware Linux page on the impactlinux website. Um, yay?
So bisect narrowed down 9d479c119b42b8a548f8d79a8e5a1c1ce2932d91 which was the openbios update that made the sucker start booting again, but which was _after_ whichever change swapped hda and hdc. (And presumably whatever caused the powerpc image to start panicing with a null pointer dereference right after userspace got control even when you work around that.)
It's possible the panic is a kernel change and not a qemu change, but lemme try 0.10.1 with the other openbios and make sure I can reproduce the problemt here before trying to bisect the kernel build.
Mark's epic adventure in iPhone recovery made slashdot, and from there has been picked up by several other sites. If you're going to carry around an orwellian tracking device with an ambient audio pickup (hello, speakerphone mode and no LED to tell you when the microphone's powered up?) you might as well get some use out of it.
Speaking of slashdot, I see that blue-ray still sucks. Apparently 9% of americans own a blu-ray player, but 11% have HD-DVD (a format that's been dead for a year). The really odd part of that survey is that only 7% of respondents said they owned a blu-ray player, apparently the other 2% didn't even realize (or care) heir PS3 plays the things.
Of course 83% of the population owns some kind of DVD player, so conventional DVD sold 6 times as many disks as blu-ray last year, and that's with the blu-ray people rebuying all their _old_ videos in blu-ray reissues.
Yeah, I stand by what I said the last few times I mentioned this topic: digital video files trump this. The CD doesn't matter much once you've got an ipod or similar, and attempts to introduce a new physical media music format wouldn't get much attention these days. Video is at most 10 years behind audio, the writing's been on the wall for _years_. Even DVD barely made it in time.
(A digital disk you could burn 250 gigabytes of arbitrary files on for under $1 might be interesting, but by the time any of the formats supply that capacity or that cheapness, flash will have won.)
Apparently Kwaj has a web page now. Doesn't say anything about visiting, but it shows pictures of George Seitz middle school and such. (And says it handles kindergarten and first grade now. Ivy closed? And goes up to 6th grade, when it used to only go up to 4th and then you went to the high school. I'm trying to figure out if I just don't _remember_ Macy's west, but I think it wasn't there yet...)
Last night my laptop did one of those "everything freezes but the mouse pointer" things so I had to power cycle my laptop and lost the debugging context for powerpc. (Ubuntu 9.04 is like Windows 95 when it comes to reliability. Oh well.)
This morning (up before noon!) I'm rebuilding powerpc with gcc 4.1.2, and if the behavior differs I'll build the various packages with each toolchain and see _which_ package is having a behavior difference. (It's also possible that it stopped working when I reinstalled Linux at the start of the month, which means the qemu it's using now and the one it used to have are very different. This is really to see which of those two ratholes to go down.)
And it's the qemu one. Ok, fire up git... And I have to go --disable-werror now because the Werror disease has spread to qemu. (Different gcc versions produce different warnings. Differently patched distros produce different warnings, such as not checking the return value of asprintf(). Apparently that's a warning now. So is ignoring the return value of chdir("/"). Maybe that's an Ubuntu thing, I dunno, but in general -Werror is _useless_ these days.
Repairing my desktop again while it builds. I don't know why some of the things I add to the xfce taskbar survive reboots, but others don't. This is the... 5th time I've added the CPU governor plugin, I think? (The battery icon doesn't show you current CPU speed, or let you change it, which is one of the main ways to control battery life. You have to go dig up a separate control for that.)
I suppose I don't really mind having a separate little fiddly plugin for everything. What is it about volume controls that Linux desktop developers have such trouble with? The KDE one was good: that had a little speaker in the tool bar that gave you a slider pop-up when you clicked on it, and went away when you clicked on anything else. The Gnome one had a slider pop-up that never went away unless you explicitly clicked on the speaker icon a second time to dismiss it, and displayed above everything else. That was annoying.
The Xfce one doesn't have a pop-up, instead it creates a new window every time you click on it. Did I mention that creating a new window takes about 5 seconds, during which you have no acknowledgement that anything is happening until the new window suddenly appears? Did I mention that you can have a half-dozen of these old volume windows lying around if they fall to the back of the z-order instead of getting closed? Did I mention they take up almost 1/4 of the screen for what is essentially a single control slider? Yeah, I know. Oh well.
I want the xfce general desktop with the kde volume control. Even if I could mix and match them (they don't seem to have a common docking API), the KDE thing would suck in 100 megabytes of shared libraries to twiddle the volume. The "let 1000 flowers bloom" approach only works if there's some way to integrate the result, and after 20 years of X-based GUI development we've got nothing in that department.
Ok, so the first problem is that -hda is showing up as /dev/hdc. That's odd. Is this because I'm using the -git version of qemu? I think I was using the 0.10.1 release before, lemme try building that...
Great, 0.10.1 dies in the bios (I traced this down once; doing so sucked), and in current -git the bios is fine but the emulated hardware has at least two obvious things wrong with it. Maybe I can git bisect a sweet spot where everything worked...
Meanwhile, upgraded the kernel to 2.6.30. The perl removal patches are unchanged except for applying at an offset now. I am officially nervous about this, but can respin and resubmit them Monday morning.
Biked to The Donalds, smelled the usability upon stepping inside, went across the street to Wendy's where I can breathe. I need to find a good regular work environment, I miss Metro and at home I'm mobbed by cats. (After about a half hour, a homeless guy wandered through Wendy's and hovered over me for several minutes, possibly watching the Bleach DVD over my shoulder, but for some reason despite being visibly filthy to the point of looking shiny and sticky, he didn't have a noticeable smell. Neither did Expletive Woman half an hour later. *shrug*)
So, smoketest-all.sh is reporting that armv5l, armv6l, i586, i686, mips, mipsel, and x86_64 are passing. This leaves m68k, powerpc, powerpc-440fp, sh4, and sparc reporting failure.
Sparc's been broken forever, and m68k isn't supported by qemu yet. I checked sh4 by hand and the problem is it's so slow the new timeout logic is triggering (which is realy a minor qemu problem, very slow emulator for that target). Run by hand with no timeout, it works. It just takes over a minute to boot up and compile "hello world". (It seems to be some kind of timeout in the emulated hardware, actually. Once hello world is built, it runs essentially instantly.)
The powerpc target seems to be building fine, it just won't run. Or more accurately, the kernel boots but it can't find the hard drive to mount the root filesystem. This sounds familiar. But how did chaning the _compiler_ break this? (Build break due to pointless extra error checking rejecting a construct that used to compile just fine, I can at least understand. But this is a change in _behavior_.)
Hey, the sound just died on my DVD, 17 minutes into playing it. Backing up a bit didn't help, fiddling with the volume control didn't help, killing and relaunching VLC didn't help... Sigh. Time Invoke Knowledge a non-technical end user wouldn't have: dmesg has no clues, check and see if the youtube videos I predownloaded have audio... And the flash plugin rectangles are grey and unresponsive... but the netscape plugin isn't dead. Ok, killall npviewer.bin, relaunch vlc... yup, and the sound is back.
When a single failed program can stop any other program from producing sound (but the volume and mute controls insiste everything is fine), it's not really a "mixer", is it?
Hey, after half an episode of running around Ichigo got stabbed and is near death. Finally. That means he gets to use his limit break, which is to level up. This is why he constantly takes on purples. (And now a dream sequence training montage on the importance of levelling your equipment and not just your character. Yes, I'm up to disk 10.)
Beautiful, now most of an hour later the VIDEO died. (Frozen and not repainting, when I drag the window off the edge of the screen and back the obscured portion comes back solid black) But the sound is continuing fine! I'm actually giggling from the MST3K-style horribleness of this crap. I mean honestly, it's staging its failures to cycle through every aspect of its functionality. Luckily a simple restart of VLC fixed that one...
Slept horribly last night. My sinus infection is making me tired all the time (it's like swelling in my head is cutting off circulation or something), but when I lie down it hurts so much it wakes me up. I've been through a half-dozen courses of antibiotics on this thing already over the past couple years, but it looks like I need to go back and be insistent about it because this is ridiculous.
Biked out to Whataburger for exercise shortly before midnight. Apparently when my bike got hit by a car, the seat broke so the little metal tab holding the front down came unhooked, and now it flips up to the back, which is disconcerting when you're sitting on it and lean back slightly. Grabbed a pair of pliers and got it semi-fixed for now, but I need to take it back to the bike shop to get something more permanent.
Counted about 15 graffiti tags on the ride, pondered taking a spray bottle of paint stripper, gloves, and a scrub brush with me in a plastic bag next time, but that would pretty much take up the night because I'm not really _looking_ for them. I'm sure I'd find a lot more if I was. (I'm also slightly concerned that if the spray bottle leaked the paint stripper might eat through the plastic bag and get on other stuff in my backpack, such as my laptop. I don't THINK it would, but...)
Got here and realized I left my little bluetooth USB key at home. (Yes, this laptop still doesn't have built-in bluetooth. Insert $NEEDTOBUYAMAC rant, I know.) So no internet at the moment. My plan to start posting on livejournal again doesn't mean I'd stop posting here, just that the longer coherent-ish pieces like the history things should have a place I can link to 'em instead of buried in a long file with #anchor tags.
Right before I left home, I fought with my laptop for 20 minutes to get it to suspend so I could head out. It kept timing out the freezer after 20 seconds and booting back up to the desktop, first complaining that the nspluginviewer.bin wouldn't freeze. (Well, actually some white text flashed by on the display to quickly to read it, and then gave me the desktop back with no explanation. As with any user interface issue on Linux you have to know to fire up a shell prompt and run dmesg.)
So I figured out what dmesg was trying to say (the multi-page stack dumps didn't actually help here, they were just a distraction from the list of processes it couldn't suspend at the end) and killed all instances of nspluginviewer. Next it complaining cifsd wouldn't freeze, so I tracked down a dead samba mount that hadn't prevented it from freezing when I was at Mark's place earlier today, but was suddenly a problem now. (At a guess, the samba thread only blocks uninterruptibly waiting for a response from the server when it doesn't hear back from it, so when I was behind Mark's firewall it happily suspended because the server said it was ok, but when I wasn't it wouldn't. I gloss over 5 minutes of trying to get it to umount when one of my open terminal tabs had a shell prompt open with the current directory under that mount point. Well, actually the terminal tab had a root prompt at /, but if you exited _that_ the parent process was a shell prompt with its current directory under the /mnt in question. Linux: smell the usability.)
Fade has suggested that rather than buying my sister a new laptop, we just send her Reepicheep the eeepc, freeing Fade up to buy an iPhone. She's got the eeepc for school but hasn't actually needed a laptop in any of her classes (literature major), and has wandered back to using her mac laptop the rest of the time she's not on The Monolith.
The fact that there exists a "Sims 3 for the iPhone" (which she's been told is "the best Tamagochi ever") might be a factor in Fade's decision. I suspect she'd plead the 5th if I asked.
Her buying an iPhone would continue the trend of Fade having way cooler hardware than I do. She gets all the new tech toys, while my laptop is on its second set of ram and third hard drive. (Speaking of which, I suspect that the "Ubuntu eats hard drives" issue is not limited to the hitachi drive the laptop came with. I should set the hdparm -B 255 thing in the init scripts again. Er, make that the acpi resume scripts, since just putting it in the init scripts isn't enough. SMELL THE USABILITY.)
Next time I'm connected to the internet I should probably track down and install the tool to tell me whether or not Linux is slowly destroying my hardware again. I think it was smartctl or some such? I've upgraded ubuntu three times since this issue first surfaced, but it's not like I can expect Ubuntu to actually fix something as trivial as a literally hardware-destroying bug given a mere 2 years to do so. (I suppose on twitter this would be "#smelltheusability".)
I'm gradually wandering back into BusyBox development, although this currently consists of posting on the list a lot and getting into arguments with the other developers. (Yeah, par for the course I know.)
Some prominent TODO items I have, off the top of my head:
There are 8 zillion other things on the todo list (biking here was "get exercise"), but those are the "might feel like working on them if I sit down to do something now.
So, attacking the FWL broken architectures. x86, x86_64, and mips (but not mipsel) are working. Let's see what's wrong with armv5l, that's usually a fairly reliable one:
CC networking/dnsd.o networking/dnsd.c: In function 'process_packet': networking/dnsd.c:428: error: lvalue required as unary '&' operand networking/dnsd.c:430: error: lvalue required as unary '&' operand
Oddly enough, I'm pretty sure that's _not_ the same error that happened on securitybreach (the 8-way gentoo server), but let's get it working here first before debugging it there.
Step 1, try to build busybox from the command line with the cross compiler. So:
cd ~/busybox/git mkdir ../temp git archive master | tar xvC ../temp make allyesconfig KCONFIG_ALLCONFIG=~/firmware/firmware/sources/trimconfig-busybox PATH=~/firmware/firmware/build/cross-compiler-armv5l/bin:$PATH make CROSS_COMPILE=armv5l-
And it... built to the end just fine. Ok, what I built was more or less current -git, rather than the release version. (I only have one outstanding patch, for pgrep, and that's almost certainly not relevant here.) So maybe they fixed it, and maybe this just isn't reproducing it. (I note that git tag -l doesn't even show a 1_14_0 tag, the newest is 1_13_4, but I think that's an artifact of the svn->git conversion. I should ask on the list.) So, try again with the busybox 1.14.0 tarball the build was using, and...
Yes, it reproduces the error, and the git version of busybox doesn't. Do a diff between the git networking/dnsd.c and the one in 1.14.0 and... they're identical. So something in some header changed. The error is happening on a call to move_to_unaligned32(), and that's defined in include/platform.h so let's see what the diff is between those two...
And the file is _full_ of unnecessary whitespace changes. BRILLIANT. Ok, try again with diff -b...
Well, that explains why x86 and x86_64 work:
#if defined(i386) || defined(__x86_64__)
Now I'm wondering why mips worked. (Presumably the guts of gcc 4.2.1 didn't complain about the lvalue thing on mips.) Which brings up the question of why mipsel _didn't_ work... yup, it's complaining about the same lvalue thing.
Ok, all architectures brought down by the same busybox bug, which seems to be fixed in source control. It's git 3be23086 in the busybox repository thing, applied on April 17th. (I note that "git blame" is kind of useless if something else, like a pointless whitespace change, has touched the file since. With mercurial you can subtract one from the commit number you want to see before and do an "hg annotate -r commit filename". But you can't do previous/next math on git commit hashes. Smell the usability.
It's possible that twitter is reducing my incentive to blog. But where else do you learn that Adam Savage of Mythbusters appeared in a Billy Joel video when he (Adam) was 16?
My problem with pkill's weird error message was that smoketest.sh goes through the normal sources/includes.sh setup and thus sets the $PATH to use the build/host tools if they exist, meaning it was the _busybox_ version of pkill spitting out that error message, and that indeed didn't implement -P. Went and implemented it, then caught up on the busybox list (since the start of the month, anyway).
Now I'm plotting and scheming how to migrate busybox to the toybox infrastructure for early setup and option parsing, since if I'm going to do significantly more work on busybox I don't want to _know_ there's a better way to do stuff and not use it.
Toybox let me work out some significantly better infrastructure for doing a swiss-army-knife program, and proved that whatever claim Bruce Fscking Perens may have had to early Busybox (even if Red Hat's Nash didn't do exactly the same thing, even if he hadn't clearly gotten the idea from gzip without attribution, and even if there wasn't any of his code left by the time I bothered to check (well he'd pissed me off, but he's good at that)... Anyway, toybox proved that I can, and did, reimplement at least that much from scratch. (And properly from scratch rather than merely gluing together applets other people wrote.) So I no longer need to worry about that Schlemiel.
And without the _aversion_ of Bruce Disease, doing toybox as a separate project doesn't make all that much sense. BusyBox has a ten year headstart, a couple dozen reasonably active developers, and is easy to incrementally improve.
That said, I did a lot of good work in toybox, and a lot of what it _does_ do it does better than busybox. I want to fold that back into busybox, and that's a pretty big task in and of itself.
That said, I need to get the perl removal patches for the linux kernel updated to apply to 2.6.30 and submitted during the current merge window (which is a week old already). And before I do _that_ I need to test it on all the FWL arches which means I need to figure out why only x86, x86_64, and mips are currently building with gcc 4.2.1 and fix it. And to do _that_ I needed smoketest-all.sh to stop hanging on sparc, which is why I needed pkill to work to asynchronously enforce a timeout on qemu-system-sparc.
Got a bit frustrated about the stack getting longer as new tangents kept inserting themselves in a "getting tomato juice to Colnel Potter" fashion. (MASH reference, don't worry about it. "Swallowed the spider ot catch the fly" would also work.) But this has been my normal working methodology for as long as I've been working on Firmware Linux. (Since my initial research for it involved pestering people in person at Atlanta Linux Showcase in 1999, you could say I've been doing it for a decade now.)
Huh, that'll probably confuse people's rss readers. Yesterday's entry was mis-dated (today's the 15th) and I just fixed it.
So yesterday I got x86_64 building all the canadian stuff with gcc 4.2.1, and checked it in. Then I told the 8-way server to build all the targets and went to bed, and today I find that half the architectures went boing.
Sigh. I _really_ need to get linux-2.6.30 building today so I can update whatever may have changed in the perl removal patches and submit that upstream, but this is being stroppy. Armv5l died with this during the cross-static build of uClibc:
libc/stdio/_READ.c: In function '__stdio_READ': libc/stdio/_READ.c:39: error: 'LONG_MAX' undeclared (first use in this function) libc/stdio/_READ.c:39: error: (Each undeclared identifier is reported only once libc/stdio/_READ.c:39: error: for each function it appears in.) make: *** [libc/stdio/_READ.os] Error 1
But usr/include/limits has it? So what exactly is it complaining about?
But first, I need to get smoketest.sh to kill its child processes. I want a "kill --recurseive 12345" that takes out all the child processes and their children and so on, but apparently I've hit yet another thing that the standard unix tools never bothered to implement.
I am so _sick_ of fighting the shell. The sparc target hangs when you try to test it, so testall.sh gets hung up on that one. I can run a background process that does "kill $(jobs -p)" after a timeout, or does a "pkill -P $$", I can set a trap "pkill -P $(jobs -p)" EXIT, and so on. But so far, nothing but "killall qemu-system-sparc" actually kills the qemu instance.
I'm running a script that's running a script that's calling qemu, and the child processes don't get killed when the parent process goes away. After the qemu instance hangs it doesn't get killed when its parent shell script gets killed by a signal, and the traps I'm putting in won't propogate down to it. (The buggy error messages don't help: "pkill -P pid" complains "no signal P" when the pid in question has already exited, which is _not_ helpful...
Such crap. Such total crap. This is not the bug I'm trying to fix, I keep hitting OTHER bugs that won't _let_ me get to the bug I'm trying to fix. And then I hit othe bugs when trying to debug that.
Linux is buggier now than it was under Red Hat 9. Why am I bothering?
Friday I bought Mark a steak dinner as a bribe so he'd get my cell phone internet working again. I also copied zillions of bittorrented files he had lying around, partly because there's no other way to get _all_ the episodes of mythbusters or MST3K because the first only put out a random subset of the episodes on DVD and the second had licenses expire between the intial broadcast and the invention of DVD. (I have netflix. I'd happily get this stuff through there, the way I'm doing with bleach. I just can't. And as when Hulu stopped being fun due to stupid watermarking and ads over the video, I'm fine with that.)
I spent the whole of yesterday watching Fade play "Sims 3" and reading through the archives of A Girl and her Fed.
Today I made it out of the house by 5pm to head out with my laptop and finally get some work done. The 2.6.30 kernel is out (and yes I typed "0.9.30" on my first attempt, but at the rate uClibc gets release out and the kernel _does_, that won't be a problem for long), so I need to try it and see what needs updating in the perl removal patches and the miniconfig stuff. (I need to fix miniconfig to open menu symbols when I switch on menu contents. Actually I need to write up a _list_ of all the projects I'd do if I had more time and energy, and hope somebody else finds them interesting and does them for me...)
Wandered to McDonalds, but barely made it in the door before two different homeless people passed me (one waiting in line for a drink refill, the other just passing the line at right angles) and I was driven back outside by the smell. It's June in Texas, not bathing or even changing clothes for several days results in _weapons_grade_ stench.
The smell wasn't a problem in previous years, I guess the facilities Rebecca told me about offering free showers to homeless people have finally been overwhelmed by the increasing numbers of them in this city. Rebecca sells flowers on Guadalupe, she's been there since the dot-com crash. Last I talked to her she had a special low-income housing apartment, but for most of that time she lived in various homeless shelters. That's what being homeless in Austin used to mean, it meant you spent your nights in a homeless shelter. But the shelters seem to have been overwhelmed by sheer numbers.
I'm aware the concept of homelessness isn't new, even to Austin. Heck, a homeless crossdressing man named "Leslie" ran for mayor the first couple elections after I arrived, and came in third. He was a fixture around town, and got free drinks on 6th street. (I met him, but never smelled him.) Back when I lived on Far West and bought the second condo next to me, I rented it out ot a guy who used to be homeless but had put his life back together. (Admittedly he totally trashed it and it took $20k worth of work to make the place sellable again, but that wasn't _entirely_ his fault. Long story.) Reese was homeless for a while, and I let her live rent free with me for most of a year while she went through a 12 step program. (Last I heard she was properly medicated, employed, and getting married.)
But it used to be an issue like flooding that the city could deal with, not a problem that had overwhelemed the city's coping mechanisms. Now there's bands of homeless people camping on Guadalupe. They hang out at the south edge of the parking lot at 25th street (up to half a dozen at a time there), and another group in front of the closed "Intellectual Property" bookstore store at 24th street (usually not more than 4 at a time there), and a large group of a dozen or more on the front steps of the church across from the Dobie Mall. And those are just the ones I pass regularly on my way around campus. (Oddly, the Guadalupe "drag rats" didn't used to be _homeless_. Most of them were _students_ who panhandled for extra money, and as a way of being edgy without dressing goth.)
I gave up on The Donald's and am across the street at Wendy's now. Not quite as fond of the food (their dollar menu leans very heavily towards the breaded and fried, and they don't have diet doctor pepper, but the #5 combo is decent and frostys are a nice change). But I can't breath in the McDonalds and for some reason this Wendy's hasn't been nearly as heavily colonized by homeless people presumably looking for someplace air conditioned to wait out the heat of the day.
There used to be a homeless man called "Jennifer" at this Wendy's, all day every day for about a year. (Imagine Richard Simmons with long hair, a dress, and a pair of the fake rubber breasts british soccer players seem to find funny, although in this case they were probably implanted prosthetics rather than strap-on ones.) I stopped coming here because I couldn't work, because he NEVER STOPPED TALKING. To everyone and anyone in here, or failing that talking back to the TV (and managing to be significantly louder than it).
According to the Austin Chronicle, he died over the winter. Apparently, he was a homeless rights and transgender issues advocate constantly poking the Austin city council, so his death was newsworthy enough for the Chronicle to devote a column to it. (I didn't actually know he was homeless, just lonely. It's hard to get a Michael-Jackson level of screwed up by plastic surgery without having had money at some point, and he never had trouble buying food. I also don't remember ever smelling him, and he could get pretty close when he was talking at you.)
I also want the city council to do something, I'm just not entirely sure what, or how to go about asking them.
Homeless shelter showers apparently aren't the only part of Austin infrastructure to get overwhelmed recently. I've heard that Austin has a "graffitti unit", and Google came up with this, but I've never seen them actually do anything.
Biking here to Wendy's (less than 10 blocks) I counted around 35 separate instances of grafitti tags. And that's _after_ I decided to keep it out of the alley behind my condo. (Noticed another one there today, although I think I just missed last week rather than it being fresh.) They're on edges of the sidewalk, lamp posts, walls, dumpsters, the back of real estate signs, the front of traffic signs... All over really. None of it "artisic", just tagging: each instance is some clueless twit needing to pee on a fire hydrant to mark territory, and being unequipped by nature to do so.
The switch from small amounts of artistic grafitti (heck, property owners commissioned it as advertising and the people who did it had _art_shows_) to large amounts of random tagging started shortly after Hurricane Katrina, back when the feds bussed several thousand displaced people here and dumped them. Perhaps that's just a coincidence, but whatever the reason it didn't used to be a _problem_. I didn't notice it at _all_ my first few years in the city, and it still wasn't significant when I bought my current condo in 2003, but now it's everywhere.
Anyway, now I'm trying to actually use the cell modem, and I'm intermittently getting this:
HTTP ERROR: $CODE$ $MESSAGE$ RequestURI=/2009/06/edinburgh-in-august.html
That was from journal.neilgaiman.com, but I got the exact same error from a URL on www.ameriblog.com, differing only in URL. At a guess, t-mobile is using some kind of funky squid-like web cacheing proxy thing, which is overloading. This isn't the _only_ strange web-only error I've seen, another page spontaneously lost its mime type and asked me if I wanted to download "next.php" for what was happily recognized as an HTML page when I hit reload. But this lets the cat out of the bag about WHAT the problem is: t-mobile has a piece of software trying to "help" rather than keeping its fingers out of my packets. Wheee...
I can probably work around this by tunneling to another machine and convincing my network layer (or at least Firefox) to use it as a socks/proxy thing. (ssh -Nf -D 127.0.0.1:8080 remotemachine.com) It's sad that I have to go to extra lengths to get a dumb TCP/IP network to _act_ like a dumb TCP/IP network, and just transmit packets without trying to understand their content. But that's the modern ISP for you. Oh well.
I dug up my old copy of neverwinter nights, but character generation was such a slideshow (mouse position updating about once a second, which is kind of hard to use with a touchpad) I gave up. It worked fine on my previous laptop, which also ran Linux. (This game is so old that it was back when people bothered to put out Linux versions of games. World of Warcraft even had a Linux client during its beta. Back when people thought Linux on the desktop might actually matter someday.)
Alas, without 3D working, even with the faster processor, it's just unplayable.
So back to watching "bleach" dvds and banging on FWL, at The Donald's (where the apple pies seem to have fixed themselves, dunno if it was just a bad batch, if I was consistently getting them dehydrated, or if corporate changed its mind).
The prerequisite system-image.sh is checking for is the existence of the root-filesystem-$ARCH directory, and that's not a particularly useful test. Sure if the cross compiler didn't build, that shouldn't exist, but if the root filesystem build died halfway through...
The problem is, what specifically can I test for in the root filesystem directory that says it completed successfully? I _want_ to be able to pack up fairly arbitrary contents, so setting a flag file at the end of the build is exactly the kind of dependency between stages I _don't_ want them to have.
The root-filesystem.sh script has a natural dependeency: it can't build without the appropriate cross compiler. It doesn't care where that compiler came from, just that it's in the $PATH. The system images don't. I could add a flag to indicate that it _failed_, but that's a bit non-obvious for comfort. (When it's not asynchronous, return codes work fine, which is why this hasn't come up before.)
I'm torn between trying to properly fix this (although I have no idea how) or just hacking temporary tests into the scripts (yet again) to abort at the point I want to see the output. I guess it depends on what I'm trying to fix next. Eh, bop it on the head with a brick for now, get back to beating the behavior I want out of my old enemy, gcc.
So gcc/config.cache needs to contain "gcc_cv_as_hidden=yes" and "gcc_cv_ld_hidden=yes". I could just prepopulate the cache with this, but _why_ is the test failing? (It doesn't seem to log that part.) Hmmm...
Ah. It decided the assembler name it's using is "". That's just BRILLIANT. Right, explicitly set AS_FOR_TARGET, which for some reason 4.1.2 didn't need but 4.2.1 does. You'd think there would be a way to just specify the darn prefix for all these tools, but no...
I dug up my old copy of neverwinter nights, but character generation was such a slideshow (mouse position updating about once a second, which is kind of hard to use with a touchpad) I gave up. It worked fine on my previous laptop.
I suspect I should dust off my old livejournal account and move things like yesterday's "I got hit by a car and am grumpy, so here's why I gave up on desktop Linux" rant there. And the big long posts about how knowing computer history makes the FSF seem far less sympathetic. (Basically drama. Livejournal's good for drama. Perhaps that's why the Russian mafia bought it?)
Kenneth Hunt corrected me that Tim McInnerny played Percy in Blackadder, and Hugh Laurie didn't show up until the third series. We watched the first series through netflix a year and change back, but it's been probably a decade since I've seen the rest, which are still in the queue...
Banging away on FWL, moving everything over to gcc 4.2.1 (last GPLv2 release). Been needing to do that forever, yes it breaks stuff, trying to fix it. Need to refactor the hell out of the stage intro code to make debugging buildall.sh easier, though...
When did all this code become so _complicated_? It's just a darn build script. Where can I simplify...
Breakfast at Einstein's, then decided to bike south to the Chick-fil-a location near SJG to try to work off some of the calories from the con this weekend. (Making lots of peanut butter and jelly sandwiches, cutting them into quarters, and filling aluminum trays with them? Marvelous idea. A german restaurant with a live polka band indoors? Not so much.) Going down The Drag I got hit by a car that turned right out of the Schlotzky's parking lot without looking, but luckily I'd seen the "how the stuntmen do it" things (my behind the scenes at hollywood hobby came in useful) and rolled up on the hood like you're supposed to, and my laptop landed on top of me. The bike, alas, wasn't so lucky, and the front tire was all wobbyly afterwards, and I had to spend $60 getting it replaced. Didn't actually make it out towards Chick-fil-a until around 5:30 pm.
Reason #9437 why Linux on the Desktop sucks rocks: every couple hours, the wireless network will suddenly stop working, with no warning. Generally, it means this happened:
[15163.962304] iwl3945: Microcode SW error detected. Restarting 0x82000008. [15163.962326] iwl3945: Error Reply type 0x00000005 cmd REPLY_TX (0x1C) seq 0x0000 ser 0x0000004B [15163.964337] iwl3945: Can't stop Rx DMA.
And under Ubuntu 9.04 _that_ means you're going to reboot soon. In previous Ubuntu versions, you could "modprobe -r iwl3945" and then insert the module back in, and you'd get your wireless back. But in 9.04, if you try it your kernel will panic. New and improved!
This is why I've given up on Linux on the desktop. Each new release breaks things that used to work, and this has been true for TWENTY YEARS now. On a personal level, why should I "get out and push" if the people steering wind up in a ditch or going off a cliff every single time?
Open source does not competently handle user interface issues because "shut up and show me the code" is not a useful response to aesthetic issues or usability problems. It's an inherent structural problem withour development model. Suppose a user notices something obviously STUPID, like the fact that the default action on battery drain is "shut down" and quickly suspending when you get the "system is about to shut down" pop-up just means that when you plug it into AC power and resume, you get to watch it shut down then. They complain about it. We filter out that kind of complaint as noise, and tell them "you fix it". Become an expert in our little area, then submit your fix to us and spend months iteratively convincing us to take it. Or else leave us alone you useless freeloader.
These problems are built-in to our development model. Coding disputes can be handled via objective tests, benchmarks, code size metrics, and so on, which can conclusively end arguments with numbers and proofs and logic. Dealing with more abstract issues, we fork ourselves to death with a thousand competing implementations, each of which does a couple things better than anyone else, meaning it does everything else worse.
This feeds into the way "this is a horrible default that bit me" is met with "here's how you can customize your personal copy, to fix it _for you_". No attempt at a general solution is made, because maybe somebody WANTS that behavior even if most people get bit by it. Creating a usable environment requires huge customization effort, but isn't it great how customizable our system is? You can build your own desktop. You must do so, since the default environment sucks so badly you really have no alternative. But there are so many different ones to choose from, if you just spend three years studying your available options you'll eventually find that special one built just for you. Don't like Totem? Try VLC! Don't like Pidgin? Try Jabber! Don't like Thunderbird? We've got _hundreds_ of alternatives...
So it's easy to _leave_, but hard to actually get anything _fixed_. Users who can't or won't back up their reports with scientific metrics are ignored. Or those who don't regularly perform regression testing, or who aren't going to spend six months following up on an issue, or who can't swap out individual components of their system with ones they built from source (after having upgraded everything to the latest version because fixes aren't made to the old versions; you need to be exposed to all the new bugs at once to test any fixes for your old bug)...
And even if you _do_ try to fix these things, you can't keep up. Pointing /bin/sh at dash was _new_ breakage that older Ubuntu didn't have. KDE 3.x->4.x was new breakage. Losing syntax highlighting in vi and the ability to cursor around in insert mode was new breakage. Kmail getting eaten by Kontact and then its user interface changing so hugely in the most recent release I spent 2 hours finding the "sort by thread" option: new breakage. The same network hardware this laptop has had for 3 years now breaking in new and exciting ways: new breakage. The fact 3D support no longer works for my intel graphics card (it worked fine in 8.10): new breakage. (Although a 64-bit dual core 1.73 ghz processor can just about keep up with software rendering to display video, as long as the system's otherwise idle and the window size is small enough. Even then youtube stuff flickers like mad with the "hidden" under-layer of youtube navigation buttons showing through intermittently due to the compositing happening in a single live buffer, and it tends to go all slideshow at the drop of a hat anyway. Oh, and swapping windows it sometimes leaves uninitialized memory garbage on the screen for several seconds, and sometimes the event that would redraw over it _times_out_ and it's left there in the window's buffer. Even if I drag another window over it, the garbage comes back because the redraw is from a double buffer that's got uninitialized memory in it. Kmail does this all the time with its toolbar buttons.)
There's no "steady improvement". There's no indication of clear agreed-upon _goals_, just random lateral thrashing. I keep having to either abandon existing infrastructure that stops being supported, or personally go to great lengths to keep the older stuff working in newer contexts.
Because of what I do, I mostly notice this with technical things that end users only ever notice as "black magic that failed". On a technical level it's epidemic, such as the way the IDE devices became part of the SCSI layer so device ordering is now fundamentally horked in a way it didn't used to be. (SCSI throws all devices in a big bucket and gives 'em a stir, so your USB devices and your SATA devices draw from the same pool of device names, in first come first serve order. Yes really. Back under the IDE world, /dev/hdc wouldn't move without a screwdriver.) Or the emergence of unnecessary layers like the whole HAL/dbus thing, so that your web server goes "HAL says I'm not connected to the network, so I can't let you talk to that web server you're got running on the loopback interface". (Why does it CARE? The TCP/IP layer has had a "no route to host" error for 30 years now, so if there's no network this fact should be instantly apparent when you try to use it. Adding a separate layer capable of vetoing network access is damn stupid, and whether it actually works or not is a side issue to it having no reason to _exist_ in the first place.) And don't get me started on how hideously unstable and undocumented the sysfs exports have been over the past 20 kernel releases. So on a purely technical level, the people steering Linux haven't filled me with confidence in the soundness of their judgement.
And of course there's social/process things too. The GPLv2 vs GPLv3 split didn't help anybody do anything: we're still paralyzed by infighting against our zealot arm which undermines everything the rest of us try to do, in the name of "Purity". (Similarly, I stopped cooperating with the SFLC after the FSF hijacked them.)
On the social front, the people who insist that openness is inevitable and in future all scarcity will vanish have apparently never studied history. Capitalists try to corner the market on things that were previously free _all_the_time_. Capitalism is a marvelous mechanism for managing scarcity, and in the absence of scarcity to manage, capitalism creates it artificially so it has something to manage. For example, Austin is now ringed with privately managed toll roads. I hate this, but they're still there, and they're building more. Individual instances come and it go as people play whack-a-mole with the latest incarnation, but there isn't going to be some magic day when people stop TRYING to corner the market and make a killing.
But technical and social issues aside, an awful lot of the time I notice that my Linux desktop simply doesn't work at an end-user level, and then have to invoke programmer-fu to try to work around it.
My desktop is Linux. My desktop doesn't work. Most of the time I just want to USE the thing to surf the web, watch videos, read email, edit text, and it breaks repeatedly and I have to duct tape it back together to get minimal functionality out of it. (I STILL haven't gotten the bluetooth association between my laptop and cell phone set back up. On Fade's Mac, it took about five minutes starting fromm scratch, most of which was figuring out where in the config menus to find the appropriate settings page.)
These little "end user issues" come from everywhere in the infrastructure. The network spontaneously dying so only a reboot can fix it is a kernel issue. The 3D support not working anymore is an X11 issue. When I press the eject button my my DVD, it gives me a pop-up message 'Failed to eject "/org/freedesktop/Hal/devices/storage_model_CDRWDVD_DW224EV". Given device "/org/freedesktop/Hal/devices/storage_model_CDRWDVD_DW224EV" is not a volume or drive." and that's HAL/dbus breakage. All of those are brand new failures in 9.04, on the exact same hardware that originally came running Ubuntu 6.10 from the factory. (It has more ram and a bigger hard drive since then, but that's it.) Installing a new version of ubuntu breaks stuff that used to work, every time.
The largest chunk of infrastructure I've had to abandon recently is KDE. I'm now on Xubuntu because the KDE developers did one of those "throw out all the progress we've made and start over" things that resulted in a KDE 4.x so hideously unusable that even Linus Torvalds (who has mocked the gnome developers for years as Just Not Getting It) has abandoned KDE and gone to Gnome. (In Kubuntu 8.10, KDE 3.x was no longer an option, and 4.x simply did not work.) I tried Gnome for a bit (couldn't stand it, and then the system's network configuration spontaneously ate itself so badly I had to reinstall to talk to the network again, and I went back to 8.04 for a while), and now I'm using XFCE instead.
This is just within Ubuntu, the only distro that's still _trying_ for the end-user desktop. I used to use Red Hat, but they abandoned the desktop and went off to the enterprise market. (When the call went out for a company to stand up and defend decss so Linux could play DVDs, they yanked MP3 playback support from Red Hat 8 and bogged off to the enterprise workstation market, discontinuing their consumer version entirely one version later.) I didn't so much abandon Red Hat as get abandoned by it. Then I used Knoppix, but while its "boot from CD" gimmic made it a great platform to demo Linux on various hardware it never actually transitioned to running from the actual hard drive at all well. So I abandoned Knoppix in favor of Ubuntu, then Kubuntu, then Xubuntu, which are all more or less from the same group. There are other distros I could use if I tire of Cannonical's offerings, but that's just another manifestation of "all of these suck, so we keep trying new ones".
This means I'm now using the third place desktop (gnome, kde, xfce) on the third place operating system (windows, macosx, linux). My configuration's market share doesn't even register, and NEVER WILL. I'd say XFCE was even in _fourth_ place behind the desktop the subnotebook distros (like Easy Peasy) are using for eeepc clones, except that we lost that niche (as it scaled up past rounding error, all the new seats it added were Windows) so it's comparing one flyspeck with another and the result just doesn't matter either way.
Since I've never been able to recommend Gnome with a straight face, and can no longer recommend current KDE, I'm now back in the OS/2 position where the desktop I use isn't one I can honestly recommend to anyone else. I use a weird custom system nobody else has ever heard of, and I may never actually meet another user of this particular setup in person. I might as well still be using an Amiga.
Embedded Linux is still moderately fun, but I used to do Java under OS/2
the same way. What the code you produce runs on, and the development
environment you produce it in, are two different things. Linux itself
will be around as long as Java (which is the new Cobol), but the Z80 processor
lasted 30 years and DOS could do just about everything embedded Linux does.
Cisco still sells IOS, and Solaris and even Xenix still have their users.
In a way, the embedded niche is where old techologies go to die. (And
every supercomputer worth the name is a hand-rolled bespoke job.) Maybe
the openmoko Google phone will stop being "technology in
search of a use case" and start to matter as much as the iPhone or blackberry
one of these days. I'm not holding my breath, the cell phone companies
have no incentive to give up control when they can sell _ring_tones_ for
profit and people buy them.
It's been "the year of the Linux desktop" every single year since 1998. We are the boy who cried wolf, and even if it did start to get interesting in future nobody will ever care, or pay any attention.
This is why I need to buy a mac laptop to do my embedded Linux development on.
We stayed an extra night at the Hypericon hotel, which meant we got an extra evening with Fade's friends from the Road to Amber mush.
I'd write a con report, but it would be about hanging out with Fade's online friends IRL, and not about the con at all: Ann is _totally_hot_ and apparently moving to Siberia for the next few years, Em is a Linux security geek whom I could have happily geeked out with at great length if either of us had wanted to talk shop instead of getting away from it all, I keep forgetting the name of the bouncy lady I fed half I tin of Penguin Mints to (I mean the thin bouncy lady, the large bouncy lady showed far less enthusiasm for them and only got 2 or 3 mints although I've forgotten her name too), the radio announcer guy was fun but _loud_ which came up when he was GM-ing the unrelated Amber LARP (I was a pseudo-NPC in charge of Arden, and helped 4 people get their victory conditions although only 3 of them kept them through to the end of the game) and I was trying to discuss secret plans with him, there were two bald guys who were both fun to hang around but I couldn't tell 'em apart (Fade insists one of them is black, but I honestly couldn't tell; no really)... Despite several threats to shave Fade's head (a plan Fade was not opposed to when she got sufficiently drunk) it didn't happen because nobody had the right equipment with them...
Part of the problem figuring out who was who (despite name tags) was that my previous vague acquaintance with these people was via the characters they play online (I'm not on the mush, but I watch over Fade's shoulder a lot), and each of them has about 3 characters, including Fade. (One reason I can remember Ann more easily is that she only has one character, although in all honesty the "totally hot" part helped too.) I did notice that all the male characters are played by women, and all the female characters are played by men. (I believe I spotted one exception all weekend, out of over a dozen characters.) Oh, and the in-game marriages don't line up with real-life marriages, and one guy was married to two or three women (by which I mean his various female characters were married to different male characters belonging to different female players)...
So yeah, people. Fun group. I now know what it must have been like for Fade to get dragged along to Ottawa Linux Symposium. Smile and nod. :)
Driving back to Austin. We hit the road around 10am, might get home by midnight.
Can't do much compiling because the laptop battery won't stand for it, but I've confirmed that the move from gcc 4.1.2 to gcc 4.2.1 is what broke the static toolchains. Which means I have no clue WHAT is wrong because too much stuff changed. Much debugging to come, but now I must drive again...
Fade went off to the Hermitage, which was Andrew Jackson's house, to see how they spun our most bigoted genocidal president to date. (Em read the book about Andrew Jackson that was covered on the daily show a few months back.)
I was vaguely interested in coming along, but slept instead. The hotel room has this MARVELOUS bed, I've been taking longish naps all weekend. It is fluffy. Didn't actually get up until almost 2, by which time the convention was winding down.
Poking at the FWL buildall.sh script. It's broken in several different ways, but the most fundamental one is that its debug output is horrible.
The main problem is that buildall.sh does things that build.sh doesn't, because doing a canadian cross requires multiple architectures, and build.sh builds one architecture through from start to finish. This means if I want to test any of the stuff that only buildall.sh builds, I need to test it in a different build environment that produces horrible debug output.
The horrible debug output is because it has to be able to background a lot of processes (to support FORK=1), and doing anything asynchronously makes logging and flow control fundamentally harder. Also, buildall shouldn't stop the whole build script because one architecture fails, and you have to go out of your way to make it build just _one_ architecture.
There are several ways I could address this. I could teach build.sh to handle the special case of building this extra stuff for the host architecture, which is the one instance where you don't need two architectures because the two match. I could add the option to buildall.sh to die after the first error. But ideally, I want buildall.sh to stop blanking the temp directory for later stages after earlier stages fail.
I taught the individual stages to exit when they haven't got their prerequisites, and even added an option to suppress that error. But they still blank the temp directory from include.sh, before I can make specific prerequisite tests. Moving the cleanup out of common code to solve the flow control issue would require me to duplicate it in every stage. It sucks either way, really.
The reason all all this is important is that the canadian cross stuff (or an equivalent set of prerequisites) is required to do an --enable-shared compiler, which is required to build uClibc++. (It's an unpleasant set of circular dependencies, based on the fact that libgcc_s.so is a completely horrible idea. The compiler should not add shared library prerequisites to its output, especially not for a library that links against libc.so. It wouldn't have been so bad if --disable-shared built libgcc_eh.a, but that would have been _smart_ and we're talking the gcc developers here.)
It also turns out that the reason I've been having such trouble with soft-float on arm is that they decided to add the soft float stuff to libgcc_eh.a, so it only gets built for --enable-shared. (I.E. the --disable-shared compilers have been gradually crippled by the gcc developers ever since the start of the 4.x series. Wheee...)
The new kmail continues to deteriorate in the name of "helping". Now it's replacing _this_ with this, and I don't want it to, and there's no way to switch it off that I can find in the config menus.
I continue to be annoyed by the perceived need to replace :) and similar with a graphic of a smiley face. I await software that replaces the word "blue" with a color change and the word "house" with a picture of a house (or perhaps a picture of Hugh Laurie, depending on context. Yes, lord Percy Percy from Black Adder got a lot smarter and more sarcastic and began walking with a cane as he got older).
The hotel internet has melted down. It was having dhcp issues (the lease timeout is 4 days, well duh), each floor has its own router and it's not always recognizing returning computers... And now the whole thing's gone catatonic and you can't even assign yourself an IP and ping the router with it. (You can still associate with the access point, but there's nothing to ping.)
Luckily, I have many windows open with previously loaded material to read. So far, I'm really liking this blog, which slashdot linked me to a couple days ago.
At a convention, and what do I do? Program on my laptop, of course.
Figured out why gcc 4.2.1 was going nuts (if you pair gcc-core in one version with gcc-g++ in another version, it gets unhappy). Now building everything with that, so I can beat soft-float out for armv4.
The mercurial git->hg converter is still broken (at least with the busybox repository). Need to bug the list about it...
And once again, buildall.sh is going "boing". Sigh. It's sad how brittle binutils and gcc are, what I'm trying to do is fairly straightforward and I have to supply a dozen separate overrides of its assumptions to do it.
Driving to Hypericon, in Nashville Tennessee...
Since the mercurial git->hg converter Ubuntu 9.04 ships is toast, I'm trying to build the current hg release from source, and install it. I did the standard "make" and it complained, you have to explicitly say "make all" (which is stupid). Then I did a make install and the result couldn't find its libraries. Ok, export PREFIX=/usr and make install... and that doesn't work. The mercurial makefile explitly sets PREFIX=/usr/local so you have to override it on the make command line. Ok... And it still can't find its libraries.
Ok, did it hardwire in a path? Do I have to set the PREFIX before the build and not just the install? Try that... Nope.
The build is dying because it can't find "asciidoc" to convert documentation with. It says that's optional, but the make is exiting with an error, perhaps it didn't build those libraries because they come after that? Ok, try installing asciidoc... And aptitude wants to install 36 packages to give me that. Sigh. 133 megabytes, decompressing to 277 megs. Ok, on Central Market's internet connection, this is going to take a while...
And _that_ wasn't it either. Right, go look at the darn python path...
Ok, Mercurial installed it into /blah/blah/python2.6/site-packages, and ubuntu has /blah/blah/python2.6/dist-packages. Sheesh. Symlink time.
Tomorrow Fade and I head to the wilds of Tennessee for Hypericon.
Wow, the mercurial git->hg converter is kind of unpleasant. I just re-converted the busybox git archive, and the resulting archive has commits in it twice, the log of commits isn't remotely chronologically sorted, annotate shows that every line belongs to the same commit... The git user interface is horrible, but I'm not sure a better UI into a fundamentally worse archive is an improvement.
Possibly I can write my own converter that won't suck? (I wonder if I can sort the commits by timestamp and apply them in that order?)
Part of the problem is that the archive has the files moving several times, moving everything out of the "busybox" subdirectory up one level. (Sounds like the initial svn->git conversion was broken.)
Oh wow, the repositories aren't the same. I did an "hg update" to get the most recent version of the files in the mercurial archive... and it bears no resemblance at all to the ones in the git archive. These are _years_ old.
Time to go grab the development version of mercurial, build it from source myself, and then bother the mercurial developers if this is still happening in the current release...
Sigh, in the meantime I need to work with git, so I have to go look at the git howto I wrote where I worked out how to do more or less everything I needed to. (I removed it from kernel.org because some idiot complained at length that the stuff I documented wasn't the bits he'd have bothered to document, and I didn't feel like arguing with him. But I dug up a copy for my own use because _I_ still need the thing, I donn't use it often enough to remember this stuff and the documentation has that "elaborate yet impenetrable" quality of 1990's man pages...
Random bug in VLC: if you enable deinterlace, it kills the old window and pops up a new window. The new window has no subtitles in it, you have to disable subtitles and then re-enable them to get them back.
I'm used to Linux desktop software being buggy. This is normal.
Broke down and set kmail back up, and caught up with the accumulated week of back email. (Mostly spam, of course.)
And kmail has lost the ability to thread messages in 9.04? There used to be a folder->thread messages option in the pulldown menus, and now it's gone. And I can't find any replacement. That's just brilliant.
Reinstalling various things. I have no idea why the "hg convert" extension spontaneously disabled itself. I had the "hgext.convert=" line in my .hgrc, and it got commented out somehow. Apparently, installing mercurial from a dpkg goes through your existing .hgrc and comments out extensions you have enabled. That's deeply stupid; if I have an .hgrc possibly the data in it _means_ something, eh? Once again, Linux developers are _sure_ they know what I want to do better than I do. I need a mac. (They're probably as arogant, but far more likely to actually have good UI suggestions.)
Looking at the busybox "patch" command to see what would be involved in replacing it with the toybox one. (Either as a patch I maintain locally, or something I can push upstream to the busybox guys.) Their version is 254 lines, and mine is 361 lines. On the other hand, mine does a heck of a lot of stuff theirs doesn't (starting with supporting offsets, which is why I need it).
Ideally I'd make it config down to be as small as the old one, but it wasn't really designed that way. Hmmm...
Another thing is that after using the toybox infrastructure for a while, the busybox infrastructure looks HILARIOUSLY clunky. Put a prototype for the applet's main function on the line above the declaration of that main function. (Why?) And of course pass in argc and annotate the fact it isn't used. (Um... Ouch?)
So I found a new way to break toybox, and I don't want to put out yet another single patch bugfix dot release. If I don't want to bother with it anymore, then I need to push stuff upstream into busybox.
I pretty much just need patch, oneit, and netcat. I need my version of patch, because the busybox one can't apply anything at an offset. I need my version of netcat because the one they've got doesn't seem to have working -l support. And I boot the resulting system under oneit, which I suppose could be standalone.
The big part is that if I start working on busybox again, I'm going to have a huge urge to clean stuff up...
I tried to build qemu from source, but the version of the source I had died with a build break halfway through. (I have horrible luck with random source control snapshots, part of the "I break everything" schtick.) So I thought "ok, git update time"... except that it hung. Why did it hang? Because savannah.nongnu.org is down. That was yesterday. It's still down.
Luckily, the mailing list archive is still up (yeah, my personal email still isn't reinstalled yet. I need to break down and go back to kmail...) and there's good news. Now that the project has a new maintainer, not only did they migrate off cvs but they may finally leave savannah as well. Yay!
Watching Obama's weekly address. (He's really going to the well for his supreme court nominee.) What I'm really noticing the little flag pin on his suit and tie, and can't help but wonder if he's wearing bright red tennis shoes along with it to complete the ensemble. (Or is that just british?)
Yesterday visit to McDonalds has turned me off to The Donald's for a while, not least because I had to move to the other side of the restaurant to get away from the impressively intense smell of a homeless guy when I first arrived (I could still smell him on the other side of the building, just not as _much_). Then a second homeless guy visited the bathroom three times (passing right by me each time, and he didn't smell any better). Then third guy struck up a nice conversation, which remained interesting for almost ten minutes until he took the obligatory right turn into crazy when I mentioned Warren Buffett and he started telling me how the bible insisted nobody would ever be smarter than King Solomon and that some Rozencrantz family secretly ruled the world. (At which point I went home.)
Today I'm at Big Bite, and their strategy for driving off homeless people
is the same as Jimmy Johns' (which was the same as Metro used to use): be
very, very loud to at least prevent them from sleeping in here after
midnight. This one's a "sports bar" (a bit like Cain and Abel's), showing
a football basketball game on five different large
screen TVs. I found a corner booth where I don't have to look at
any of 'em, but it's still loud enough that my noise cancelling headphones
aren't cutting it.
Attempting to listen to a podcast where Seannan McGuire (the lady whose livejournal I started following after she wrote a marvelous Barry Ween fanfic) is interviewing Jenn Brozek (the ex next door neighbor of Andy Weir, who wound up in his now completed webcomic as an international jewel thief with a time traveling daughter. Both Jenn and Seanan are also published science fiction authors. Jenn's an editor. Seanan's a filker with several albums out, and draws an intermittent webcomic. Interesting people, generally.
The two of them wound up at baycon together, and BayCon Podcast #4 is Seanan interviewing Jenn. It's a small internet, innit?
On an unrelated note, an interesting thing about VLC is its starting size is the actual width and height of the source video, in pixels, with 1:1 scaling. (The other players I've used just remembered the previous size relative to the rest of the desktop.) This makes it clear that the _reason_ Obama's podcasts look way the heck better than the msnbc ones is the white house podcasts take up the whole desktop, and the msnbc ones are a tiny little window in the corner. (DVDs take up maybe about half the screen.)
Mark poked me last night about several FWL todo items, so I guess I should tackle them...
Let's see, I got the nightly snapshots building with uClibc-git, I need to test those to make sure they're all working, then upload 'em to the binaries directory on uclibc.org. Once I've got the those working, I need to figure out which ones I can switch to nptl, probably adding new targets for those (ala armv5l-nptl).
And I should really deal with sparc. And I should switch over to gcc 4.2.1 as the stable version and make it always build libgcc_eh.a even when it's --disable-shared (which would be a _better_ way to fix the arm soft float issues, and also fix...
Ok, THAT was annoying. The display froze. The mouse still moved, and the audio of the video I was watching continued to play, but the video itself was frozen and nothing on the desktop responded to the mouse pointer or being clicked on, the keyboard was dead (ignoring ctrl-alt-F1 and ctrl-alt-backspace), and the power button didn't suspend. Luckily, holding the power button down for 10 seconds powered the sucker off, since that's not under Linux's control. And thus I was able to reboot.
That was crazy, the kernel was obviously still working because the audio playback would have stopped if it wasn't (and the mouse would have stopped moving), but all user I/O was frozen. Why on earth did this get redesigned? What idiot decided to route the power button (acpi event) and the desktop (X11) through a single point of failure? (Sounds like the darn "input core".)
Great, now my laptop can choose to just hang on me at any time. "Xubuntu 9.04: there are no nontechnical end users I hate enough to inflict it upon."
I need to buy a mac.
On the bright side, the desktop icon for the bleach DVD has an "eject" menu item if I right click on it, so I can workaround the fact the button on the actual drive doesn't work. (I note that the button on the drive was yet another thing that caused no reaction from my frozen desktop before the last reboot, but then if it had and the graphics were horked how would I know? The mouse pointer is a hardware sprite, just like the commodore 64 used to have...)
Sigh. McDonalds has been having serious trouble with inflation eating away at the "dollar menu". At the start of the Bush administration, a dollar was something like twice what it is now, and in 2007 and 2009 inflation was double digits annually. (It's slowed down quite a lot since the election, although the banking crisis and resultant collapse of gas prices had something to do with that.)
So a few months back, they replaced the double cheeseburger with the "McDouble", which only had one slice of cheese but was otherwise the exact same thing. (And left the double cheeseburger on the menu at about 40 cents more, getting lots of people to order it and pay extra until they noticed the change.) But the McDouble is still a heck of a deal, and my only complaint was the unannounced bait and switch.
But now they've screwed up the apple pies, and I am sad. They've been offering them 2 for a dollar for a while now, or 98 cents for one. (I'm aware this makes no sense.) I'd be fine with dropping the two pies for a dollar thing and the dollar item becoming a single pie. But that's not what they did, instead they took some of the filling out of each pie (not sure how much, somewhere between a third and a half), making them look deflated and bowed on the bottom, and screwing up the ratio between filling and crust so they now taste like crust without enough apple in 'em.
Sigh. They can't add 5 or 10 cents to the cost of the thing because a dollar is a big psychological price point and it would no longer be a "dollar menu" item so they'd lose an extremely successful marketing group. But quietly making the pie INEDIBLE is not a solution, people. Grrr.
(I dunno, maybe I'm wrong and the last few times I've been into this McDonalds every pie I've gotten is seriously dehydrated are something, in a way that doesn't make the crust crunchy. But it takes the fun out of ordering the pies.)
Ooh, vlc does go forwards and backwards with the left and right cursor keys, you just have to hold down shift, alt, or control to indicate whether you want a 2 second, 9 second, or 1 minute jump. (The hotkeys menu under preferences list all of this. So far I just remember shift and hit the appropriate cursor key several times.)
Of course what I really want to do is find a way to tell it to lock the aspect ratio on resize, so that when I grab the bottom right corner I don't have to fiddle with it to get the black bars on the edges to go away.
So according to Wonkypedia (I.E. I wonder if it's true), the Model T could use both gasoline and ethanol for fuel, but ethanol was knocked out as a viable fuel by prohibition. So the dominance of gasoline as our current automotive fuel is yet another side effect of prohibition. (Makes you wonder what the side effect of the War on Drugs are. Other than the obvious ones like the new Al Capone types currently taking over Mexico, the price of paper going through the roof because we can't make it out of hemp anymore, and so on...)
One of the main failures of Xubuntu, or possibly Desktop Linux in general, is that you can't easily pick and choose which apps you want to run. Yes, that "failures" and "can't" rather than "features" and "can".
Xubuntu comes with "movie player", which is actually a program called "totem" although it never anywhere tells you that. (You have to use ps to see the name of the running process to figure that out, and this is intentional. That's a bit like saying "web browser" and never revealing whether you're running IE, Firefox, Opera. Did I mention the Gnome developers consistently make horrible user interface decisions and then defend them to the death? Why the xfce guys are humoring the Gnome guys' poor decision making skills is an open question...)
If you press the eject button on the dvd drive, it pops up a window saying "Failed to eject "/org/freedesktop/Hal/devices/storage_model_CDRWDVD_DW224EV", and tells me that name is not a volume or drive. I have to go to a console and run "eject /dev/sr0" as root to get the disk back. This is unrelated breakage, it's because the "hardware abstraction layer" was a horrible, horrible idea Linux copied from Windows NT (see Gnome == stupid, above). But I can't tell modern software _not_ to use it.
Totem is an inferior dvd player to Kaffeine, the one Kubuntu used back in 8.04. (So the rest of what I'm talking about is a regression vs what they got working back in KDE 3, which was rendered useless when they moved to the unusable KDE 4.) Totem auto-launched when I inserted a DVD (not even popping up a "what do you want to do" menu), and then told me it couldn't access the dvd player. Turned out to be just a race condition, and on relaunch it accessed it fine. (Kaffeine did not have this race condition.)
Then it turns out that it doesn't seem to deinterlace the dvd by default. (Note I already went through the magic dance to get decss support working, which is non-obvious and something the mythical nontechnical Linux desktop users would have to phone a friend to get to work.) Google implies that back under 7.04 you could find a deinterlace option under the "view" menu, but there isn't one there under xubuntu 9.04. That menu has "fullscreen", "fit window to movie", "zoom in", "zoom reset", "zoom out", "aspect ratio", "switch angles", "show controls" (the play button and such at the bottom, no deinterlace option among them), "select text subtitles", subtitles (a sub-menu, not only redundant but it isn't aware of the actual subtitles this bleach disk has, which I navigated the DVD menu to switch on), and "sidebar" (which is read-only, showing things like the duration, resolution, and frame rate). Kaffeine puts the duration as a label ont he slider at the bottom.
Kaffeine not only had "interlace" actually as a labeled option in the menus, but when I hit "i" it said it was toggling interlace. I _think_ I enabled some kind of deinterlacing by pressing all the letter keys in sequence (accidentally fullscreening and quitting and such along the way), but A) it never notified me I was doing so, so who knows what key it was, B) the deinterlacing algorithm it's using is crap. It's better than nothing, but still full of artifacts.
Of course the problem with installing Kaffeine is it's bolted to the KDE desktop, using the QT widget set and kobjects and so on. We have so many redundant implementations of exactly the same infrastructure, and they're all slightly incompatible so can't be substituted for each other. It's like windows "dll hell", only built into the OS.
So I tried installing "vlc", another dvd player that google recommended, which presumably doesn't have these unnecessary dependencies on pieces of infrastructure it shouldn't care about. It installed fine. It seems to play the dvd. But when I put in the dvd, totem still pops up. I uninstalled the package "totem", which made no difference. There's 8 gazillion other sub-packages (totem-common) and such, several of which imply it's tied into the guts of mozilla. (This seems odd since mozilla's using the binary-only flash plugin to display essentially all video, because nothing else really works.) Ok, remove totem-common, let it randomly rip out three other packages to "resolve dependencies"...
Ok, now it does nothing when I insert a disk, and I can pull up vlc by hand from the menu to play the disk. I can live with this. (This has no menus, the whole window is displaying the video. You right click on it to get options, and video->deinterlace has seven options under it. It defaults to "disabled", yet even that seems to be deinterlacing the picture slightly better than totem was. I set it to "blend", although what I really want is "just deinterlace properly, don't bother me with implementation details since I'm not a DVD playback codec designer". (This is a really common failing of Linux software, you have to know how it's implemented in order to make it work.)
Except that with both kaffeine and totem I could use the cursor forward and back keys to skip ahead or go back in the disk, and also get slider bar along the bottom. With vlc, I can jump to the start of episodes, and that's it... Ah, I see. There's a progress bar on a separate window. I guess that's reasonable...
I still need to buy a mac, so I don't have this much upgrade hassle every 6 months. I have to make the "to kmail or not to kmail" decision again, and until then I don't have an email client...
How do the ubuntu developers get stuff this simple wrong?
When I fire up totem and tell it to play a podcast, it says it hasn't got the plugin and offers to search for it. It comes up with a window that says "GStreamer ffmpeg video plugin" and "GStreamer plugins for mms, wavpack, quicktime, musepack". Ok, fine. There's the pointless step of clicking checkboxes to select them, which pops up a dialog about legal disclaimers (clicking a checkbox should not pop up a dialog, that's horrible UI design), and then I tell it install, it grinds for a bit, and then says "Software installation failed". It won't tell me what the problem was, and there's no way to get extra information. The three buttons are "retry", "add/remove more software", and "close".
Oh, and did I mention it won't tell me the package _names_, just the description fields? If I want to do this from the command line (and thus have at least a _chance_ of better error messages), I have to figure out that "GStreamer ffmpeg video plugin" is _probably_ the "gstreamer0.10-ffmpeg" package. I still have no idea what the _second_ package is.
You could write a "user friendliness fail howto" out of this. Automation that completely hides how the underlying thing works is not useful if it means your car runs out of gas and it refuses to say so (or even that gas is a thing it might ever need).
So Xubuntu 9.04 is _almost_ usable. But not quite.
My hard drive developed a bad sector yesterday (with the block remap list full), so I took advantage of the extended warantee I bought and had Fry's replace it. Fresh hard drive, so I thought "might as well try 9.04".
Although the /etc/acpi scripts are all there, it doesn't seem like xfce actually uses them. Instead, I had to root around in applications->settings->power management->general to find a pulldown menu to change the behavior. Ok, fine, I can live with that. Except when it resumes, it asks me for a password. I don't want this, and a half an hour of searching leads me to conclude the config menus haven't _got_ an entry for this. So how do I turn it off? Google suggests that I install the gnome configuration editor (for xubuntu?!) and edit apps->gnome-power-manager->lock. Except that neither aptitude nor their gui thing will install "gconf-editor". The gui thing finds it, but then says it's not supported on amd64. (Brilliant. What, I'm supposed to build this from source? I grepped in /etc/gconf for the word "power" and it wasn't under there, so this apparently isn't a hand-editable .rc file.)
Ah, aptitude remove gnome-screensaver seems to have done the trick. (Well, actually it left me with a totally black screen on the next resume until I found and killed the gnome-screensaver process that was left running after the uninstall. But I found the thing to blow off with the shotgun.)
Oh yeah, "ready for the end user desktop". That's Linux. (I really need to buy a macintosh. I'm now using the _third_ most common desktop because the other two suck too badly for words. This one _mostly_ has the advantage of simplicity, except when it doesn't.)
So to make xfce/xubuntu resume without a password, uninstall gnome-screensaver and then killall gnome-screensaver or reboot. Right.
Computer tied up most of yesterday backing stuff up, and today restoring it. Being able to do 10 megabytes/second through a USB cable isn't that impressive when you're backing up and restoring 300 gigabytes to a terabyte drive.
Sigh. Every few years, they do it again. "There's too many divergent implementations of X out there, I'll write my own and assume everybody in the world will switch to its obvious superiornessity." The result is n+1 implementations of whatever it was. (Might be nice to test against, but just testing against 3 or so existing implementations accomplishes about the same thing anyway.)
So this "linuxcon" thing up in portland, which the Linux foundation put together? It turns out it's "colocated" with the plumber's conference, but is a separate registration. Plumber's conference attendees get a 30% discount... off of a $300 registration fee.
That kind of discourages me from attending either one, to be honest. If Mark and I hadn't already submitted a talk proposal to the plumber's conference, I wouldn't bother with it, and now I'm kind of hoping they turn us down. (I'm a hobbyist, and they're double-dipping. I've only ever bothered to attend any of these things as a speaker. I pay my $50 at the door for things like Penguicon and armadillocon, but even the "discounted student price" of $100 is more than I'd want to pay for a hobby thing. I'm already spending my own money to travel there, and for lodging. If you don't know how to trade a room block for function space you're not really a hobbyist event, are you?)
Found the problem, it was a bug in toybox; if I export $CC it'll use it, overriding $CROSS. Oops. I need to push stuff upstream into busybox if I'm not going to properly finish this sucker...
A cc wrapper that cherry picks arguments to send on to sub-commands turns out to be a bit fiddly to implement, unless I don't want to implement the same option parsing code in two places. (Luckily the rathole I went down after breakfast turns out to be a red herring: all the linker options are in a separate namespace, cc needs -Wl, to pass them through, so the wrapper doesn't need to care.)
Something broke x86_64, the "strip" command isn't recognizing runnable binaries that the host "strip" command can strip just fine. Oddly, I tried the binary in the release directory and _that_ didn't work either, despite the release building. I have no idea what's up with this, trying to track it down now. (Once again, I broke something _retroactively_.)
A little while ago I promised to explain:
So if open source used to be the norm back in the 1960's and 70's, how did this _change_? Where did proprietary software come from, and when, and how? How did Richard Stallman's little utopia at the MIT AI lab crumble and force him out into the wilderness to try to rebuild it?
Two things changed in the early 80's: the exponentially growing installed base of microcomputer hardware reached critical mass around 1980, and a legal decision altered copyright law to cover binaries in 1983.
The shortage of customers was changed by the microcomputer, which was based on the microprocessor. Intel invented the microprocessor around 1971 (largely by accident; here are interviews with the engineer who designed it, the one who implemented, the customer they did it for, and their boss at the time
who is most widely known for having a law named after him), but it took Intel three revisions (4004, 8008, 8080) to come up with a usable chip, which was at the heart of the MITS Altair, the first microcomputer (and the original home of the S/100 bus and CP/M operating system so widely cloned later, including somewhat indirectly by the IBM PC).The first computer to sell 1 million units was Comodore's Vic 20, introduced in 1981 and beating the Apple II to the million unit mark by a few months. So within five years of the Apple II's introduction, you could potentially sell a million copies of the same software. This allowed the concept of "shrinkwrapped" software to emerge, which you could write once and then sell many identical copies of without even recompiling. Initially this supported small companies consisting of a programmer and perhaps a small support staff (WordStar, Richard Gariott's "Alkabeth"), but exponential growth in the hardware market led to matching growth in the potential software market.
The first "killer app" (a software program compelling enough to drive sales of the system it runs on) was Visicalc, the first spreadsheet. It was produced by a two person company, Dan Bricklin and Bob Frankston, operating out of Bob's attic. The first version shipped in October 1979, and was the main reason that Apple's less than 50k units its first two years were followed by a million more. (Another fun quote in that article, by Bob Frankston: "it's worth noting that back in 1979 people viewed the keyboard as an impediment to using computers. After all, only secretaries could type...") Oddly enough the book "On the Edge", which is about commodore, gives great behind the scenes information on early Apple and Visicalc stuff. The fact commodore bought the company that made the processor inside early Apple machines has a little to do with it, but mostly it was a darn small industry at the time and everybody knew everybody else...
So the reason something like Visicalc couldn't happen before 1980 is there was no customer base to sell shrinkwrapped software to, not even enough to support individual programmers operating out of their bedrooms unless they had a day job doing something else. You could make a living as a consultant writing bespoke software on commission, but your customers told _you_ what to write, and owned the result which of course included the source code.
The other thing about microprocessors is they were more uniform. The old "wire up a breadboard" computers weren't just produced in lower volume, they were more easily modified at a fundamental level.
The MIT AI lab where Richard Stallman learned to program was started in the 1950's with a pair of prototype computers, built by a recent graduate named Ken Olsen when he interned at Lincon Labs in Boston. Both were unique, each the only one of their kind ever built. The first was the MTC (Memory Test Computer), which only had only four instructions and was built for a single purpose: to stress test early "core memory" and prove it could work reliably under load. The second was the TX-0 (Transistor Experiment 0), Ken Olsen's pet project to prove that transistors could be made reliable enough to build a computer and memory out of them. (Early transistors were so sensitive to static they were even less reliable than vacuum tubes, Olsen came up with a way to buffer them so they could survive normal handling and operation.) Both prototypes were heavily modified and upgraded by the students at MIT, because although they weren't very powerful they weren't shared, either. Each belonged entirely to the AI lab 24/7, so the students there didn't have to make an appointment to use it or get permission to modify it.)
Olsen went on to found Digital Equipment Corporation to commercialize his new transistor memory, and hired a bunch of his fellow MIT graduates to do so, finding the most useful ones came from the AI lab that had received his cast-off prototypes. (The book "Hackers" by Steven Levy covers the founding of the MIT AI lab. This marvelous interview with Ken Olsen covers the TX-0 from the Lincoln Labs end, plus early transistor memory experiments, and goes on to chronicle the rise of DEC.) The TX-0 was the only one of its kind, and when Olsen founded DEC he hired a bunch of MIT graduates and sent one of the first PDP-1 systems to the MIT guys to train future graduates so he could hire them too. (The MIT guys soon wrote the first shoot-em-up video game, "spacewar" for the PDP-1, which became DEC's main sales tool for showing off the new system. DEC eventually sold around 50 PDP-1 systems.)
When DEC built its first mainframe (the PDP-6, they which shipped a total of 36 machines in its entire production run), MIT of course got one. When DEC upgraded the PDP-6 to the more powerful PDP-10 (about 700 total ever made), MIT's system was upgraded. That PDP-10 was the machine Richard Stallman did all his work on at MIT.
All of these systems, from the TX-0 to the PDP-10, were heavily modified by the MIT guys, to add new instructions and capabilities. The fact that MIT not only wrote its own operating system from scratch but customized its computer hardware to add extra instructions and registers, really wasn't that unusual under the circumstances; everybody did it back then. The computers were made by wiring together individual diodes and resistors and such on a bread board. Wiring in a few more wasn't a big deal. But it meant that programs written for a single machine ran _only_ on that machine, or perhaps one or two others that had been similarly hand-modified.
Microprocessors were different in that you couldn't customize their circuitry the way you could a breadboard full of chips and wires. There weren't just more of them but they were also more uniform, thus software didn't need to be ported between different machines of the same model, it could run out of the box. That was something new.
Only with the arrival of millions of identical microcomputers, based on mass-produced microprocessors instead of expensive hand-wired breadboards, (see the books "Soul of a New Machine" and "A few good men from Univac" for more descriptions of that era) could you write a program once and then sell the exact same program to lots of different people without porting (or even recompiling) it for each one of them. That's why the software in the 1960's and 1970's was either custom stuff individually comissioned from consultants, or it was produced by hardware manufacturers in an attempt to sell their hardware, or it was produced by the people who had the computers for their own use, and shared through user groups like DECUS and the CP/M Users Group Northwest. All this stuff came with source code.
But in 1980 Apple Inc. had a record-breaking IPO (the largest in history at the time) based entirely on sales of the Apple II. This triggered IBM to rush out its own microcomputer (the IBM PC) in hopes of squashing Apple before it grew too big to contain. (That's an interesting story in its own right, but a side track to the rise of proprietary software. Robert Cringely's book about it, "Accidental Empires", is fairly accessible and was made into an even more accessable PBS documentary called "Triumph of the Nerds".) In 1982, "The Personal Computer" was Time Magazine's Man of the Year. Exponential growth that continues long enough shakes the entire world.
The copyright issue changed in 1983, when the Apple v Franklin ruling extended copyright protections to binary code. (The writing was on the wall in that case over a year earlier, but the decision had to be upheld on appeal before commercial interests could seriously act on it.) Before that decision, source code was copyrightable but binaries weren't, so companies shipped source code to _increase_ their ownership of the code in the eyes of the law. If you just shipped precompiled binaries, you had no rights the law would recognize.
The first real "voice in the wilderness" about proprietary software was a kid named Bill Gates, with his 1976 "letter to hobbyists". Except that nobody took it seriously. (Richard Stallman claims not to have even heard about it at the time.) People only listened at the time because MITS paid to run the letter in a dozen magazines, and he wrote the letter because the world _wasn't_ like he was describing, like he wanted it to be so he could profit from it.
William H. Gates III ("Trey" to his friends) was a rich kid and the son of a lawyer who dropped out of Harvard (pre-law) to start a software company with a techie friend of his (Paul Allen). Gates's Micro-soft was founded (in 1975) in hopes of not merely selling software to the emerging microcomputer market, but explicitly cornering that market. Except that their tiny company could only afford starvation wages, to the point that both of its co-founders, Paul Allen and Bill Gates, took day jobs at their main client, MITS for the first few years of the company, and their third employee (the guy their "letter to hobbyists" credits with actually writing Altair BASIC, although their official history now differs), was a part-timer they had to lay off.
They referred to their strategy companies as "riding the bear", attaching themselves like a remora onto one dominant hardware manufacturer after another, grabbing the software crumbs falling from that hardware market and switching to the next when it lost its position. First they rode the Altair's manufacturer MITS, then switched to Tandy as their meal ticket when MITS went under. Finally they landed a lucrative contract with IBM (because Gates' mother was on the board of directors of the Red Cross with IBM's CEO and thus IBM could do business with "Mary's Boy" even though IBM wouldn't ordinarily approve such a tiny company as a vendor because it might not stay in business long enough to complete the contract; see the book "Big Blues" for details). Along the way, they sold their software (mostly BASIC) to Commodore and eery other company that would buy it.
Ironically, the first software product of micro-soft was Basic (a language developed at Dartmouth college in 1964 and freely appropriated by micro-soft). Because it was the only high level programming language MITS offered for the Altair, it quickly became the lingua franca of early 8-bit microcomputers, starting with the Altair clones from companies like Imsai but spreading to the Comodore 64 and Apple II and even IBM's PC. The thing about Basic is it was an interpreted language, where the source code _was_ the program and you ran it directly. Books and magazines distributed BASIC programs by printing source code could type into your own computer. Again, all code written in early 8-bit BASIC was open source, because _not_ being open siply wasn't an option. The language itself enforced it.
Gates was the type of person to not only see a market opportunity in bottled water, but then consider drinkable tap water as a threat to his business and respond by trying to make tap water undrinkable.
In his 1976 letter to hobbyists, Gates was incensed that microcomputer users mostly wrote their own software, and shared their programs freely with others. Users saw Gates as the type of person to not only see a market opportunity in bottled water, but then consider drinkable tap water as a threat to his business and complain about it. Back in 1976, he wasn't laughed off the stage: he was completely ignored.
It's a bit like the recent Time magazine article about how newspapers must start charging for online content by a guy named Walter Isaacson. It's considered a laughable idea today, when the norm for internet content is free access. But if that changes, Isaacson will look like a prophet.
What users didn't expect in 1976 was that Gates and others like him would respond not only with FUD (such as "shrinkwrap licenses" which were laughably unenforceable at the time) but by trying to change the law. Apple's 1980 IPO attracted Wall Street's attention to the booming computer industry, the sharks smelled money in the water, and proprietary interests have lobbied continuously to change the law for their own financial gain ever since. (Note it's still ongoing: the software patents blowup happened in the 1990's, and the Digital Millenium Copyright Act at least claimed to make shrinkwrap licenses enforceable in 1999. Today Rupert Murdoch (owner of Faux News) is trying to implement Isaacson's ideas.)
The thing about Gates is repeated failure didn't discourage him. Here's a 1980 phone interview with a young Bill Gates (audio, transcript, context) who was incensed that a recently published book about TRS-80 programming had printed an annotated dissassembly of the TRS-80 ROMs, so hobbyists could understand their machines better. Gates insisted those roms were his property, and nobody else had the right to look at them (let alone print out annotated disassembly and sell it for profit), and he lobbied congress to that effect. The entire interview is Gates talking about his attempts to change copyright law, back in 1980, into what he wanted it to be.
Similarly, when Microsoft belatedly noticed the internet in 1995, it tried to replace it with MSN, the Microsoft Network. (Remember that in Windows 95, the "unremovable" icon wasn't Internet Explorer, it was MSN. When that strategy didn't work, they bought a browser called Spyglass and renamed it Internet Explorer and made _that_ the unremovable icon, in a second slightly more successful effort to at least partially de-commoditize the internet.)
But back in the early 80's, it wasn't Microsoft that succeeded in changing the law, it was Apple. The Apple v Franklin lawsuit was Apple's response to a company (which became Franklin Ace, makers of the Speak-N-Spell) that cloned the Apple II. Franklin's computers ran Apple software, and they used Apple's ROM code verbatim in their competing product in order to do that. The courts decided that Franklin had gone too far, and that copyright must extend to cover binary code to prevent that sort of thing.
Part of the reason AT&T agreed to be broken up in 1983 (implemented in 1984, but agreed to in 1983) was to get out from under the antitrust regulation imposed on it by a 1956 consent decree, forbidding it from entering any other business beyond its telecommunications monopoly. It nominally owned Unix, by then a widely used operating system, but couldn't enter the booming computer industry as a heavily regulated telephone monopoly. When Unix first leaked out of Bell Labs in 1973, there was nothing to commercialize because there was no market. In between, the computer industry _changed_. Unix was open source from day 1, and developed a vibrant community in the 1970's based on this. (It didn't have a name for open source because it didn't need one, there wasn't any non-open-source software to speak of. When copyright first became an issue for software, the term commonly used for unencumbered software was "public domain".) When AT&T suddenly started enforcing its newly acquired copyrights, and charging _extra_ for source code, it was an enormous shocking change.
AT&T wasn't alone in this, of course. IBM's Object Code Only (OCO) policy was announced February 8, 1983 (more on this), but software predating that commonly came with source code, and often even that source wasn't copyrighted. This is why the Hercules S/370 emulator has plenty of old public domain software to run, including things like the MVS operating system (see also here). Yes, even IBM's mainframe operating systems worked by different rules back in the 1970's.
RMS tells his own story (in his own words, href=http://oreilly.com/openbook/freedom/ch01.html>biographical version) about a Xerox printer he couldn't get the driver source to. This came as a shock to him because previously, giving source code to any software was a matter of course. The world was changing under him, and he didn't like change.
So when Richard Stallman founded the FSF in 1983, the same year DOS 3.0 came out, he was reacting to the recent and ongoing rise of proprietary software. Microprocessors created an exponentially growing hardware market, the Apple vs Franklin decision gave software authors vastly expanded copyright powers, and a gold rush ensued (similar to the dot-com boom of the 90's) that hired away all the "hackers" from the MIT AI lab to work in a pair of start-up companies attempting to commercialize LISP. While his fellow students graduated and took jobs out in the booming commercial computer industry, Stallman stayed in academia as a perpetual grad student, and hid away from the problem as long as he could.
The big change that forced Stallman out of his comfortable nest at the MIT AI lab was the obsolescence of the operating system he used, which was tied to specific hardware that was discontinued.
Over the course of three decades (1950's, 60's, and 70's), the MIT AI lab upgraded from the tiny Memory Test Computer all the way to a PDP-10 mainframe, keeping ahead of Moore's Law (which Gordon Moore first documented in 1965). Just as the PDP-6 became obsolete and was upgraded into the PDP-10, the PDP-10 itself was over a decade old by 1980, and ripe for replacement.
To replace it, DEC prototyped a new machine called the "Jupiter project", which was roughly compatible and would thus allow PDP-10 software to be easily ported to the new system. But there were only 700 PDP-10 systems ever sold, and their newest computer (the VAX, an upgrade to the PDP-11) was selling thousands of systems per _week_.
The VAX was completely incompatible with the PDP-10. The PDP-10 (like the PDP-6 before it) was a 36-bit machine with 6 bit bytes, the VAX (like the PDP-11 before it) was a 16 bit machine with 8-bit bytes. Porting assembly software from one to the other essentially required a complete from-scratch rewrite.
By 1980, Ken Olsen's DEC had now been producing and selling its own computers for 2 decades, and could hire programmers familiar with them from anywhere, so he no longer needed the MIT AI lab as a source of labor. The industry was standardizing on 8 bit systems and leaving 6 bit systems behind, and the 700 customers with PDP-10 systems were already a rounding error compared to the 600,000 PDP-11 systems eventually sold, and the VAX looked to be even more successful. Thus DEC decided to focus on 16-bit systems, told its PDP-10 customers to migrade to a VAX instead, and cancelled the Jupiter project in 1983.
With the cancellation of Jupiter, the operating system the MIT guys had written over the years, a giant pile of hand-coded assembly proudly named the "Incompatible Timesharing System" (which gives you a good idea of the AI lab's "hacker" culture), was now tied to a dying hardware architecture which would not be upgraded. The writing had been on the wall for years; no new students had bothered to learn the obsolete ITS or PDP-10 programming for a while, and the booming computer industry in Boston hired away the graduates who had been maintaining ITS, until eventually Richard Stallman was the last holdout clinging to the old ways as a perpetual grad student. When MIT announced they were retiring the now-obsolete and unmaintainable PDP-10/ITS system, Stallman's carefully insulated little bubble of ivory tower academia popped, forcing him to respond.
Richard Stallman is not and never was a visionary. He's a reactionary conservative trying to cling to the past, and when the rug was finally yanked out from under him he set about rebuilding that past as best he could. Some of the things he fought to preserve were indeed worth preserving, but looking at him as any sort of guide to the future is ludicrous. He's never been about the future, except to warn against it.
There are of course more questions (why would an ITS guy switch to Unix, why was the FSF as successful as it was, how do lisp and microkernels show the dude is totally totally not a visionary, who _else_ was doing this, and where did it all go wrong), but again they'll have to wait because this is already long enough.
Fade and I met Mark at the insurance office on Far West this morning (for a definition of morning that occurred after noon, but still), to finally get health insurance through Impact Linux. Apparently, getting insurance for two employees and a spouse is collectively about twice as expensive as getting insurance for three employees. THIS MAKES NO SENSE. (Yes, I'm sure there are actuarial tables involved, but it's still crazy.)
Wondering if hiring Fade to do some web design for us counts as gaming the system.
Went swimming afterwards (Fade's new bathing suit continues to work), and then finally painted over grafitti in the alley. (They got it again last weekend. Watched three hispanic teenagers wander through the alley the next day gleefully pointing out instances of grafitti I hadn't even noticed to each other, and slap each other on the back, but of course that proves nothing...) The actual paint part for the Quatros parking wall went fine, but I ran out of paint stripper for the wooden fence, telephone pole, and dumpsters. Need to get more...
Listening to the mp3 of Barack Obama's phone call with the space shuttle Atlantis up in orbit (linked from the whitehouse twitter). Early on Obama said "You've excited my 10 year old and my 7 year old", and I decided tha twas about right. After listening to a sitting president talk to astronauts in space, I'm wondering if I can track down a similar mp3 of a racecar driving cowboy talking to firefighters who are in the process of fighting dinosaurs, just for comparison purposes to calibrate the "we have cool jobs that kids want to grow up to do" level of this conversation.
Ooh, and this one is an mp4 file (video, not audio). Darn good resolution on the video. (In general I like the whitehouse twitter, but they have huge problems with the 140 character limit...)
So I wrestled with the design of the new qcc wrapper for a while, unsure quite how I wanted to proceed, but now it's turning into a variant of ccwrap that breaks down stages. It calls cpp to do preprocessing (and that's the stage that gets
The advantage of doing it this way is it both partitions the task nicely (eliminating duplicate code, so multiple different stages have to understand about library paths and such) but also lets me test against the existing gcc stuff before I've built the new replacements. (Writing a wrapper I can't _test_ makes plugging in other functionality a real pain, because if it doesn't work it's not immediately obvious _why_. It's also no fun preprocessing C code you can't compile, or building .o files you can't link...)
The Chocolate Penguin Mints arrived! (We ordered 36 tins.)
I have eaten too many of them already today. (They're caffeinated, although apparently not as much as they used to be.
Poking at the UT non-credit course schedule. They've got a pdf version of the current catalog.
So I'm designing the top level "cc" wrapper to call cpp the -M options are all aspects of cpp, not cc1. At the moment, I'm just trying to get it to call all the gcc tools in order (cpp, cc1, as, ld, strip) without telling one of the multi-function tools to do anything one of the single function tools can do. (So even though cc1 can preprocess, and ld can strip, I'm having the specific tools that only do that do that.)
I'm also writing it to not pass on any option it doesn't understand, so if I haven't immplemented support to grab "-M" then it'll barf when given -M, instead of passing it on to cpp.
Then I can swap out this wrapper for the one in FWL and make sure it can build the whole system, and maybe gentoo from scratch on top of it.
At some point in the future, I'll probably want to coalesce stuff back together. It's possible to implement the compiler as up to six processes (cpp | cc1 | as | ld | strip, all called by cc) but passing preprocessed data from cpp to cc might not be a win vs just keeping each translated line in the processor's cache and dealing with it immediately, and outputting assembly source and then assembling it is _definitely_ slower than generating the machine code directly (although the _capability_ is still needed to support -S, which the kernel needs in order to create some of its header files).
But that's all future optimizations, which can at least wait until I get around to actually implementing the code that needs to be optimized. (I'm not too worried about anybody calling cc1 directly, and if calling cpp directly was particularly common Ubuntu wouldn't have split it out into its own package which I've never needed to install to build anything I've tried. Builds do call ld directly and expect it to strip, but that's a question of outputting _less_ stuff.)
Still vaguely uninspired about programming. Poking at qcc, but admittedly somewhat listlessly. (Currently Linux isn't seeming like a fun hobby at all; I deleted my old git howto rather than defend it against some idiot who insisted any portion he didn't understand needed to be removed from it. Apparently "I don't understand what you're saying, not that I've actually tried the technique you described to see if it worked" means "you must be wrong". *shrug* Deleted the whole thing, which seemed easiest way to give him what he was technically asking for. There are at least three other git howtos out there written by people who care. Talk to the 404.)
Followed Fade to the library this morning and got a book, Keith Olbermann's "Truth and Consequences". I was somewhat surprised he'd found the time to write a book, but apparently it's mostly transcripts of his special comments with introductions. (About 2/3 of the way through now.)
Various other errands during the day. Went out with Fade to buy a bathing suit, hit a mall.
Up to DVD 5 in bleach, which is the one where they loose track of astral form vs physical form. (Or at least he spends most of an episode with his body being doctored for wounds received as a soul reaper, despite never having established the Matrix-like "your body makes it real".)
Not that this is the first series that's needed a continuity advisor. (Red Dwarf's books tried to justify Lister having his appendix out twice, but glosses over the fact that the first Joke Lister makes upon being revived is "Three million years? I've still got that library book!" and later in the first season "I've never read... a book." Yeah, it's a comedy and these are jokes of opportunity, possibly self deprecating humor on Lister's part, and the MST3K mantra certainly applies to most of the series. Still...)
Bleach remains fun, when it doesn't go into DragonballZ territory. (Watching people yell at each other for 10 minutes isn't fun, and these people would do well to study the video game concept of "logarithmic difficulty increase", although World of Warcraft has some similar funky balance issues. I can't be _too_ upset that individual members of the strongest 10% of Soul Reaperdom could each slaughter the remaining 90%, so why the heck are they sending _those_ guys out into the human world to fight hollows? If you stop and realize that a single Stormwind guard could solve all of Westfall's problems in an afternoon, "it's required by the plot" is really the only explanation required, or offered.
There are a few tricks to understanding the series. They level by something like an XP system (or as they say, "spiritual power increases fastest when the soul is in danger"), but Ichigo's limit break is to level, so when he's almost killed he goes "ding" on his next attack (which heals him out of limit break territory). Orihime's power is based on the Mythbusters Mantra: "I deny your reality, and substitute my own" (which makes her potentially even more of a walking deus ex machina than Ichigo, although she levels more slowly). When cornered and otherwise close to levelling, all of 'em do big long "bribe the GM with a backstory solliloquy to get character development XP" to push 'em over the edge. Don't expect to get any of the jokes, the entire cultural background they're based on is different (although the ones parodying other anime series/tropes you at least have a chance on).
Currently watching the episode where Protagonist Boy regains soul-reaper-dom
after starting his heartless hollow transformation. His limit
break kicked in and screwed up the cutscene, and he wound up with the "hollow"
and "soul reaper" flags both set. :)
So I'm writing a fresh implementation of ccwrap.c for qcc,
Wow the gcc option parsing is crap. -static and --static do the same thing, "gcc -cv hello.c" says that -cv is an unrecognized option but "gcc -c -v hello.c" is just fine... "-Lpath and -L path" are synonyms, but "-lpthread" and "-l pthread" are not...
Rather a lot of "hmmm" moments. I'm starting by reading ccwrap.c and writing a new front end "qcc" command line interpreter, which creates appropraite command lines to call cpp, cc1, as, and ld as necessary. (This means none of those commands need to know about standard paths for include files or libraries.) Note that the existing ccwrap.c calls the gcc front-end which does a lot of command line rewriting of its own. This is a harder problem, breaking up the command into stages and calling the sub-commands directly. Another issue is whether or not those sub-commands should ever call each other, or whether the way they're called should string together "cpp | cc1 | as" manually.
The issue I'm facing right now is since none of those sub-commands deal with standard includes or standard libraries, it seems silly to feed them --nostdinc and --nostdlib. (The qcc versions won't _have_ the logic for that stuff.) But the gcc version of cc1 does do that unless called in such a way that they don't have anything to do, whigh gets us bac to the "cpp | cc1 | as > out.o" thing. (On the bright side, that would distribute the work over more processors on smp systems. Is there enough work in preprocessing for this to have any benefit? The existence of ccache implies so. But the communications overhead might make it a net loss anyway. It's easy to program and keep it nicely modular, but it's not that hard to keep it in one process, either...)
Anyway, from command line option parsing standpoint, cpp needs to understand "-D -U -I -o -M* -d* -nostdinc" (and possibly also "-include -iprefix -withprefix -system"). And ld needs all the stuff from "-static -shared -L -l -Wl," and such. So presumably if qcc is dispatching right, the cc1 command line parser doesn't need to know about either...
The question is, of course, how to come up with command lines that gcc would understand, which don't require the same code to be written twice in qcc, and which doesn't impose unpleasant communication overhead between processes. (Partitioning the task! A design issue...)
Lunch with Mark, who pointed out a couple of obvious bugs in FWL so I could fix 'em. (Canadian cross broke the ability to override CROSS_TARGET. Ah. Fixed now, I think. And I need an /etc symlink to /usr/etc because putting /etc/resolv.conf in sources/native winds up adding /usr/etc/resolv.conf (or /tools/etc/resolv.conf with a different config).
The PPC board cisco sent him has a dead debug adapter (maybe another bent prong? Hardware problem, not my area...) and although qemu has a bamboo board emulation what it doesn't have is a ppc 440 processor emulation. I tried to walk him through how to tweak qemu to possibly get the bamboo board to do _something_ (plug in a ppc 405 processor emulation, which is a bit like plugging a 386 into a 16-bit PC, but it should run 440 software). But it turns out it's not loading the device tree blob properly, which means I have no idea how anybody's ever managed to use the bamboo board emulation to do anything. He said he'd ask on the list...
Walked home from up near Mark's. Six hours of walking. I'm out of shape.
Got a design document posted to the qcc mailing list. It's rambling and a bit incoherent in places, but it's a start.
I asked Mark to create a new qcc list so I can post design documents and such from the new project. Have not yet posted such a design document, but wrote a longish notes file yesterday.
Currently frowning at ccwrap.c and rewriting it from scratch in preparation of slotting the options.c material into place. There needs to be a cc applet that rewrites the command line (so "cc hello.c" becomes a much longer command line with -I and -L entries and mentions of crt1.o and such) and then calls a cc1 applet that does actual compiler thingies. But whether it should literally create a new command line and call another main function with its own command line parser, or whether it should just set up data structures internally which the other command line parser could also do, is an open question. (Leaning towards the first. Simplicity vs code duplication is one of those tradeoffs that makes you want to step back and think about the problem at a higher level because there should be a way to get them to not fight like that...)
Part of it is "should this wrapper still be able to call out to an external compiler, ala gcc?" The current wrapper tweaks $PATH because gcc won't be able to find its own sub-commands otherwise, which clearly _isn't_ required for a qcc thing calling another applet internally via a busybox built-in command style multiplexer pseudo-exec. But if the other 90% of it _does_ work that way, is losing that functionality good? (Especially if I'm going to be writing low hanging fruit like ld and ar and such first, and possibly handing off to some other cc for test purposes...)
Another thing is that ccwrap.c has c++ support, and qcc doesn't (and probably won't any time soon, since tinycc never did). If it's doing c++, it needs to call out to an external c++ compiler. (At least something like cfront.)
Eh, worry about it when I've got more code written...
Twitter is down for maintenance. (Fidget. Fidget.)
I admit the #fixreplies thing is an impressive #twitfail. They spun it as a user interface improvement, except that it used to be a configurable setting which already defaulted to "off". They removed the _option_, with no warning, and called it a UI improvement. That's what we call rolling a crit-fail on your intelligence check: When you have Neil Gaiman retweeting Stephen Fry pointing to an article about how stupid your policy is (both of those people are in the 10 most followed twitterers list), you have officially screwed up.
It turns out that the change was due to technical limitation in the database scalability or some such (which means they can't put it _back_ easily), which in some ways makes it worse. This was actually a _marketing_ crit fail. If they'd said at the start "we had to yank it because it didn't scale, the code's unmaintainable or it bogs the servers, we're working on a new implementation", that's one thing. But the actual quote from their "small-settings-update" announcement was, "Today's update removes this undesirable and confusing option." I never even _used_ the option that was removed, so my config hasn't been affected by this, and I'm still kind of annoyed at being patronized like that. I don't want them fiddling with the UI "for my own good", nor do I want them insisting they know how I'd prefer to use their service better than I do. They earned the wall of flame coming back at them right now.
They've been dancing around an apology ever since, but have yet to actually do a Mea Cupla for treating their users like idiots. Nor have they promised not to crash around like tone-deaf elephants in future, perturbing the UI of a service millions of people use with no warning or beta test site. That's an easy way to get millions of people to find or set up other microblogging sites, which would mean I'd need an rss aggregator to follow microblogs. Once upon a time, the livejournal friends list was all you needed. Now as Jeph Jaques says, "Can you believe people still have Livejournals?"
It's inevitable that the idea of microblogging diffuse beyond a single website, the way free website hosting isn't just "geocities" anymore and free blog hosting no longer means "livejournal". In a lot of ways livejournal was doomed by RSS aggregation. But right now, there _isn't_ a way to do @replies across sites, and until we come up with one and spam-proof it, twitter still has a structural advantage. But making their entire userbase see them as poor custodians of the service they use probably just shortened their time of dominance by about a year.
Elsewhere, I'm trying to remember when reading Linux Weekly News became a chore. About a year ago, I think. My May 9th entry isn't a sudden development, more a buildup of annoyance leading to a narrowing of interests (or at least avoiding the bits I don't want to deal with), which isn't healthy long-term. Life's too short to spend it doing things that aren't fun (at least more than necessary to get back to the fun bits; yay delayed gratification but not 40 years worth). But I used to read linux-kernel and lwn.net for fun.
Sigh. I've done this before. I need a project. I get enthusiastic about _projects_, not about abstract technologies. I'm still banging at qcc but it hasn't "caught" yet (mostly because I'm still in the research phase instead of writing code). FWL isn't quite a chore yet but "stuck with gcc 4.2.1" and "caught between busybox/toybox" are a couple largeish design flaws...
Oh well. Back to turning QEMU into a C compiler...
It's been less than a week, and I forgot the horrible password UT insisted upon, which needs numbers and punctuation. Thanks for restricting the keyspace in the name of improving security. You realize that windows viruses will keylog it from everybody stil running Windows, right? Admittedly this being a college (with an apple store in the student building and everything), that may be a statistically small enough percentage they don't care...
Tomorrow: get it reset, and then use standard password security enhancement technique #1: write it down. (Admittedly, using a post-it note on my monitor is less convenient with a laptop, but I suppose that's merely advisory. Like the duct tape in the carrier pigeon IP rfc...)
Reading the tinycc source, collecting bits easy to yank for qcc. Got curious and browsed alloca.S. Wow, I need to brush up on my assembly.
I was a bit confused why "alloca.S" didn't compile from the command line, but then I wandered through the makefile and noticed there's no rule to build it. So I looked at the git version of tcc-grischka, and although they've got an alloca.S there too _it_ never gets compiled either.
So my original plan of "tweak and test build" to see if I can "pop %eax" instead of "pop %ecx" then "move %ecx,%eax" and so on... Kind off derailed by the fact that the original code I'm reading doesn't work, and the last time I actually tried to _author_ x86 assembly code (rather than figure out what debugger output is doing wrong) was... 1994, I think? Yeah, time to brush up...
(Hence my desire to get online and download an x86 assembly tutorial. I've got books on it at home, just not with me. And a reference != a tutorial...)
Oh _that's_ cute. Although gcc won't compile alloca.S, tinycc itself _will_. Ok, at some point I need to figure out what's wrong here, but for now...
And it died because I haven't got the 32-bit development files installed. Right. Come back to this when I have internet access...
Why am I *ahem* "not a fan" of the FSF? Ok, I'll explain.
I'm not sure you can be a computer historian and not hate the Free Software Foundation, because they're not who they say they are, they claim credit for things other people did, and these days their agenda has become counterproductive and harmful.
The US was founded by revolutionaries, hence the name "Revolutionary War". The founding fathers tried out all sorts of new ideas, and often took multiple attempts to get it right; replacing the articles of the confederation with the constitution, then adding a big batch of amendments to the consitution in the bill of rights, swapping in the electoral college when the first method blew up in their faces, going back and forth about whether or not to have a central bank, eventually needing a civil war to finally resolve the whole slavery issue...) The US founding fathers would be the _first_ to say they were imperfect people just doing the best they could.
These days, the founding fathers are primarily invoked by ultra-conservatives, often while fighting against things like desegregation, women's rights, gay marraige, bikinis, and so on. They're about as far from revolutionaries as you can get. (As Mark Twain said, "Conservatism is the blind and fear-filled worship of dead radicals".) If you couldn't do it in their grandfather's day, you shouldn't be able to do it now (so throw out that cell phone and don't use antibiotics). You wouldn't think this attitude would come up much in the computer industry, but human nature is the same everywhere, and thus we have the Free Software Foundation.
The main reason I can't stand the FSF is they're ultra-conservatives masquerading as revolutionaries. While that's always a possibility when "the revolution" drags on for 30 years and the ideals they're fighting for fossilize in their proponents heads, that's not what happened here. The FSF actually started that way.
The FSF was founded as a conservative reactionary movement. Back in 1983 Stallman's goal was to stop (or at least personally avoid) the rise of the brand new proprietary software industry, and return to the glory days of the 1970's.
Whether or not a return to the past was a _good_ goal is a separate issue; there was nothing visionary about attempting to roll back the clock, so the people who see RMS as a "visionary" today are _badly_ misinformed. He is not a visionary leader, he was taking us back where we'd already _been_. If anything this makes him _less_ qualified to predict the future, because his most conspicuous trait is that he doesn't like change.
Unfortunately, this doesn't stop him from trying to predict the future, proclaiming dire warnings about it, and attacking others who have a different ideas about what's ahead. Nor does it prevent hordes of impressed followers (who don't know anything about computer history and think this future/past he's describing is great) from hanging on his every word.
So why is "free software" older than proprietary software? The proprietary software industry didn't exist back in the 60's and 70's for two reasons:
First, until the early 80's there wasn't a critical mass of customers to sell proprietary software to.
The MIT AI lab where Richard Stallman learned to program was started with a computer called the TX-0, a unique system built as a prototype by Ken Olsen, the guy who went on to found Digital Equipment Corporation. (The book "Hackers" by Steven Levy covers this in a lot of detail, as does this marvelous interview with Ken Olsen.) That was followed with a DEC PDP-6 mainframe, which the shipped a total of 23 machines in its entire production run. The lab was later upgraded to a PDP-10, of which about 700 total ever made. The fact that MIT modified its computers to add extra instructions and wrote its own operating system from scratch really wasn't that unusual under the circumstances; programs written for early mainframes and minicomputers often wouldn't run on any other machine in the world even if they hadn't been modified by their users, simply because their component selection and configuration was unique.
For most of the 1970's, the best-selling computer in the world was the PDP 8, which was introduced in 1965 and sold a grand total of 50,000 units during its entire production run. The PDP8 was displaced as bestseller by the Apple II, which was introduced 1977 and over the next two years sold a combined total of 43,000 units. But that was enough to put it on top: in 1980, when Apple had its IPO, it had 50% market share of the computer industry (according to the PBS series "Triumph of the Nerds").
So if you tried to sell "shrinkwrapped" binary software back in the 1970's, the largest possible market you could hope for on any platform was _less_ than 50,000 copies, and even that's only if you targeted the most popular platform in the world and somehow managed to sell a copy for every single computer of that type ever produced.
The second reason the proprietary software industry didn't exist in the 60's and 70's was that copyright law didn't cover compiled binaries. Human readable source code was copyrightable (as an original work of human authorship), but binaries produced by a compiler or assembler were "just numbers", and the law didn't explicitly allow them to be copyrighted. So if you wanted to claim any copyright on your program, you were _required_ to ship source code. Shipping source code gave someone _more_ control over the result than just shipping a binary.
Thus publishing source code (with copyright notices) became official policy throughout the computer industry (DEC, AT&T, IBM)... They actually had fewer rights if they _didn't_ publish their source code. (When Unix came out in 1974 what was special about it wasn't that it came with source code; that was normal. What was special is that the source code was in a high level language that minimized porting effort to move it from machine to machine, instead of the assembly language all the other operating systems were written in.)
Software in the 1960s and 1970s was either produced by hardware manufacturers to help sell their hardware (who happily gave out the source code, generally written in assembly language), or else it was produced by the people who bought the computers for their own use (who had no incentive to withold source code from _themselves_). Users sometimes hired consultants to a write custom software for them (in which case the source code was one of the deliverables), but back then the only way to use a computer was to learn how to program it, so users wrote most software themselves or had someone on staff to do it for them. The vast majority of software in the 1970's and earlier was written by the users, who naturally shared the results through early user groups like DECUS and the CP/M Users Group Northwest.
So how did this _change_? Where did proprietary software come from, and when, and how? How did Richard Stallman's little utopia at the MIT AI lab crumble and force him out into the wilderness to try to rebuild it?
I should probably hold off until next time for that. This has gotten a bit long. :)
Ok, I know what to do with my tinycc fork now. :)
The obvious way to replace gcc is with qcc, the QEMU C Compiler. Take tinycc, break it up the rest of the way, and slot it into the qemu source code (in a qcc subdirectory) so it can build an "$ARCH-qcc" from each current "qemu-$ARCH", using tcg (the Tiny Code Generator) as a backend.
I'd held off on gluing tcg to tinycc because forking tcg wouldn't be fun (or productive). It's still under active development, any changes I need to make to it must go upstream or they'll become a maintenance nightmare. Pushing the compiler front-end upstream into qemu makes noticeably more sense, if they'll take it. (But they already _do_ all the hard parts...)
Right now qemu application emulation can parse ELF executables and shared libraries, so qcc's linker needs to use that code (and teach it to handle .o and .a files). So in addition to redoing the code generation backend, the linker needs significant work to merge it into qemu.
I split my fork's option parsing logic off into its own file a year ago, and I still need to do the swiss-army-executable thing on it and merge it with the ccwrap.c in FWL.
That's a lot of work. Trying to figure out what order to do stuff in...
Anyway, providing a decent replacement for gcc means the only GPLv3 piece of software that actually matters is Samba, and the kernel has built in smb client support so a simple server could probably be exported from that. (It might not support Windows 95, but I can't really say I care. Current samba isn't exactly embedded code right now, is it? Oh, and the dirty trick to ignore all the case insensitivity issues: export a vfat filesystem. :)
Not quite back to my normal levels of enthusiasm (or at least bloody minded
stubbornvindictive problem solving), but any realistic chance
to rip out one of the foundations of the FSF's power base is always
invigorating.
Still apathetic about programming in general.
Linux on the desktop is dead. Ubuntu 8.04 doesn't work with Netflix or Hulu or Youtube's television options. 8.10 was a disaster. And now 9.04 doesn't work with Intel 3D, not only the most common one but the one that used to be recommended for use with Linux. Meanwhile, Apple's market share finally hit double digits. (Whether or not Windows 7 sucking less than Vista counts as damning with faint praise or is actually significant, I reserve judgement on.)
GPLv3 has fatally split the community. The last GPLv2 version of gcc is 4.2.1 which is increasingly obsolete (doesn't do armv7 and up, meaning no thumb 2), and there's still no replacement compiler. Neither PCC nor LLVM/Clang has turned into anything useful yet, and tinycc development is just painful to watch.
Actually, tinycc development is _hilarious_ to watch in a black comedy way. Grischka admitted that he didn't take most of my code because he didn't understand it, and now _three_years_ years later he's slowly reproducing some of the obvious refactoring I did literally back in 2006. At this rate it might only take him 3 more years to get to the point my fork was at when I abandoned it.
It's painful to go back to work on BusyBox both because of lingering Bruce and because I like the toybox infrastructure so much better. And there's a lot of cleanup work to do, starting with removing the forest of #ifdefs littering the code now.
But convincing people that conceptual bloat and what you can measure with bloat-o-meter are not the same thing is exhausting. (A wrapper script around mdev is a better design decision than trying to shoehorn firmware loading into something that wasn't meant to do that. It's not mdev's job to do every possible hotplug activity, and complicating the hell out of the config file syntax is not the answer. Also, removing the mmap config file parser in favor of much slower and more complicated code that allocates memory for each line of text in the config file (and then frees it again), and does this again and again for every single device during "mdev -s"... That was wrong. I don't care if it's shared with other applets, it's still wrong.)
The reason for mdev in the first place was I disagreed with the design of udev, and that there should be an obvious and simple way to do it. I had to fight the kernel guys (Greg KH and Kay Sievers) who thought that sysfs was a private export and not a stable userspace API, so anybody trying to write their own code to do this rather than using udev was obviously crazy. More recentlly I had to fight the kernel guys (pretty much Peter Anvin) who are rewriting the kernel build system in perl. In addition to not needing an additional large prerequisite package which would rule out sane languages like Python or Lua, perl is a specific programm, not a language. It has no standard, merely a single implementation (just like Microsoft Word or Microsoft Excel). Whatever that implementation does is Perl, and it's never successfully been reimplemented (despite the Perl 6 guys trying for over a decade now). That's not a language, that's a legacy hairball.
Sigh. I feel like I'm fighting the entire Linux community, and I'm tired of it. Yeah, you can duck into the embedded world and avoid most of that, but in a proper embedded system you don't care what it's running. Might as well be DOS. The current most interesting embedded device (the iPhone) has MacOS X.
When this laptop dies, maybe I'll buy a mac. (About half the kernel developers are already doing their kernel development on macs, from what I can tell...)
In the same way that toll boths tend to cause traffic jams at rush hour, the login screen at chick-fil-a has been going "The service is initializing, please try again later" for fifteen minutes now. (And for years phone company engineers quietly said that tracking long distance usage for billing purposes was the single most expensive part of the phone call. There's a theme here...)
Been totally uninsired to work on computer stuff for a few days now. Taking a break.
Wandered through UT yesterday to see what would be involved in going back to classes. Tuition's now $4500/semester. Before books. It was something like $1200 back in the late 90's. That's the "edumacation" president for you.
Turns out Disney continues to be evil. (Who could have predicted that?) They were an early pioneer of unskippable commercials on DVDs, now they're removing special features from rental dvds. (Perhaps that explains why the Lilo and Stitch Fade and I got through netflix last night didn't have any commentary?) As always, the correct response to this sort of thing is to just grab the full version off of BitTorrent.
If Disney hadn't been gradually turning evil and senile for years, this would probably be ignored. After all, another disk we watched last night (Master and Commander) has a special edition which Netflix doesn't carry. But this reads as part of a pattern; Disney is an evil money-grubbing entity trying to infinitely extend copyright terms and so on, but they drove creative people like Katzenberg away (the guy behind the run of movies from The Little Mermaid through The Lion King, and now the K in Dreamworks SKG), and wound up having to buy Pixar to have any new content anybody wants to see.
The Mouse has turned into The Godfather in his old age, but when his "offer you can't refuse" is (according to the interminable previous on the Lilo and Stitch disk) "The Jungle Book 2", "Return to Atlantis 2", live action "Inspector Gadget 2", a live action "Berstein Bears" movie, "101 dalmations 2"... I think "out of ideas" happened back around the "Peter Pan 2" movie (which wasn't direct to video, but should have been). When I hear the word "disneyland" these days, the first thing that comes to mind for me is that Blagejovich and his hair went there last month to celebrate his indictment. Six flags is way closer.
Much cleaning of the condo before Fade gets home.
Poked at build strace a bit in the evening. This is a weird program. Building natively under armv5l, it went:
In file included from syscall.c:129: linux/arm/syscallent.h:435:3: error: #error fix me linux/arm/syscallent.h:457:3: error: #error fix me
I'm guessing that strace 4.5.18 doesn't support the 2.6.29 kernel, at least not on an arm host. (Instead of failing by saying unknown syscall at runtime, it fails by refusing to build. That's nice. I note that 4.5.18 is the most recent version on strace.sf.net and that page has no link to a mailing list...)
The source code's README says:
You can get the latest version of strace from its homepage at http://www.liacs.nl/~wichert/strace/ .
Which is 404 and according to archive.org has been since 2006.
I'm not sure "maintained" is a word that applies to this package.
Mark pointed out that the Gentoo guys have patches for this, and apparently have for some time. (Apparently there's been nobody upstream to send them _to_? Dunno.) Oh well, yay it's fixed, moving on...
The adjective to describe today has probably been "virtuous", largely by accident. Cleaned portions of the condo, picked Mark up from the airport, swam, biked, ate healthy (at Jimmy John's right now)...
Poking at a dropbear build script under the native root filesystem for a nightly cron job. Alas, dropbear went to autoconf for some inexplicable reason, so of course it sits there making stupid tests (very slowly):
checking for gcc... gcc
Yes, gcc is called gcc. If you were checking for "cc" (the standard name required by SUSv3; SUSv4 seems to require "c99" now), that might make some of the later tests less silly.
checking whether we are using the GNU C compiler... yes
Um, why do you care, and what was the first test for, then?
checking for C compiler default output file name... a.out
You can specify -o all the time so this never matters. Same with suffix of executables and suffix of objects files, but you can also just accept that there are exactly three interesting build platforms these days (Linux, MacosX, Windows) and you're under no obligation to support all of 'em anyway.)
checking whether the C compiler works... yes
During the build, you'll notice pretty quickly if it doesn't. You'd also get a better error message saying _why_.
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
A) This is required by the Single Unix Specification, B) there's a gcc that doesn't accept -g?
checking for gcc option to accept ISO C89... none needed
Again, your very first test was for gcc, then an explicit "are you really gcc and not another compiler pretending" (no idea why), and now it's doing this kind of crazy stuff.It just goes on and on like this. But that's not the funny part. Here's the funny part:
checking for deflate in -lz... no configure: error: *** zlib missing - install first or check config.log ***
You have to explicitly say --disable-zlib. What exactly is the POINT of running ./configure if you have to explicitly tell it on the command line what your environment contains?
Of course when you do that it then goes on for a long time checking "is the strip command called strip" and so on, explicitly checking whether or not our C compiler has "memcpy"... and then at the end it tells us to edit options.h to select the options we want.
Sigh.
Saw Fade off the airport for Penguicon. (I'm not going this year, the con chair and I don't get along, it's probably better for the event if I stay out of his hair while he's wearing the con chair hat.) I feel bad I won't get to hang out with Garrett and Christian and Tracy and Heather and so on, but oh well. Maybe next year.
Found my credit union debit card (jacket coat pocket, of course; things always get lost there when it gets warm), which saved me a trip this morning.
Lunch with Stu and Beth at the Lakeline Mall. Lasted until around 4, much shooting of the breeze was perpetrated. Went to Fry's to pick up a TV input switch so we can hook up the Praystation, the Whee, and the Ex-box to the same TV. Looked at new TVs while there. Did not buy one.
Read "No more dead dogs", which was good. (I have a weakness for young adult books; they spend less time trying to be "original" and more trying to be _good_.) Looked around the shelves for something else to read, decided I wanted to read "A bad spell in Yurt", found book 5 in the series, book 4, and then another copy of book 5, but no 1-3. Collated bookshelves a lot. (Most of our Terry Pratchett books are now in one place; they fill 2 shelves and involve not just paperbacks but 4 different sizes of hardcover).
Trying the new "Big Bite" place on 24th street for dinner. Not really noteworthy except that it's theoretically open really late and has less intrusive music than Jimmy John's. (Half the time Jimmy Johns' music is _good_, but it's too loud to hold a conversation and too loud for my noise cancelling headphones to make a dent in. Not a good work environment. I suppose that's the point.)
Alas, Big Bite only has diet Pepsi, which is like a hangover remedy designed by Franz Kafka. (It has not yet been featured in a "Steve, Don't Eat It!" but I feel it should.) Alas, they don't have diet mountain dew (the only real excuse for the Pepsi product line). Jimmy Johns is open until 3am and has diet coke. The Wendy's in Jester is open until 4am and has Coke Zero. The McDonald's is open until either 10 or 11 (it varies based on ambient humidity) and has Diet Dr. Pepper and 2 apple pies for a dollar, so I wind up going there rather a lot.
This is a truly uninspired burger. I'm not sure how they managed to get something this bland out of what seem like perfectly reasonable ingredients, the texture of which suggests they were comptently prepared. Hmmm... Did they put _any_ salt on it? Nope, doesn't seem like they did. The mayonaise undermines the result a bit (maybe I made a mistake asking 'em to hold the pickle, the mayo has nothing sharp to mute). And I like big fluffy soft bread but this bun doesn't go with this burger. Too much squishy and tasteless tomato (obviously picked rock hard green and allowed to ripen in a warehouse). The cheese is either mozarella or one of the blandest whitest most tasteless american cheeses I've encountered, which is saying something...
I'm not entirely surprised. A place that advertizes 30 different types of hamburger, pizzas, gyros, grilled chicken sandwiches, cheesesteaks, wings, wraps, subs including eggplant or shrimp parmesan... It _might_ just be overextending itself and not do any of that particularly well. But it was worth a shot. They'll probably pare down the menu in a few months.
And I must admit, the free internet makes up for a lot.
Ok, I know I'm weird, but I'd just _assumed_ the Penguicon guys had a video link set up so Wil could address opening ceremonies (and maybe even voip-phone in a panel or two) from home if he couldn't physically make it to the con again. USB web cameras are what, $15 these days? After a Red-sox-like streak had established itself, it just seemed like common sense to me. (Although I admit my money was on "meteor strike" this time. And no, the third time isn't "hindsight".)
Rather than turn this into armchair quarterbacking, here's a Plan For Getting Wil To A Future Penguicon. (I don't know who future Penguicon runners might want to invite, but in case they someday decide to try again with Wil, and he's up for the abuse, here's how I'd go about it.)
Step 1: Go ahead and send Wil a cheap USB web camera, one that works with macintosh laptops. (This is a gift, he can keep it. Also note that most macs have one of these suckers built in. Send him a spare _anyway_.)
Also send Wil a badge that says "Sir Not Appearing At This Con". (Make him promise he will wear it through the entire weekend of Penguicon, wherever he happens to be during that time. Demand pictures. Yes, this will be his badge if he does, by some fluke, wind up attending. Ribbons for him to hand out to Penguicon attendees, possibly by mail, are left as an exercise for the reader.)
Step 2: Keep a second webcam on site in case Wil winds up bedridden in his hotel room (or a local hospital) instead of bedridden at home, so he can still occasionally say hi. This has the added benefit that it could potentially be used to record panels downstairs if it isn't otherwise needed. (Hey, gotta plan for everything, even the possibility of success...)
Step 3: make a case for inviting him back a fourth time. Start by ripping the Monty Python and the Holy Grail clip about Swamp Castle, everything from "They said I was daft building a castle in the swamp" through "but the fooourrth one stayed oop!". (It's short enough it probably falls under fair use, especially with what we're going to do with it.) Have Wil use his web camera to record himself describing his first three attempts to get to Penguicon. Intercut the "burned down, fell over, and then sank into the swamp" bits with Wil's description of his previous Penguicon weekends. When competed, post this video on the Penguicon web site. (This will also be played during opening ceremonies. If necessary, use the corresponding scene from Babylon 5 about the previous stations for the next attempt.)
Note that using the webcam for this rather than some other video camera has the advantage of testing out the webcam to make sure it works and is set up properly ahead of time.
Step 4: Fly him in early.
The first few years of Penguicon we flew all Guests of Honor in on Thursday wherever possible, so there was some failover in the plan. This gave the guests time to unwind, because "travel and perform the same day" is hugely stressful (as those of us who ever travel for business know). The travel itself is also less stressful when you're _not_ on an immediate deadline. (Yeah spending an extra couple hours waiting after a missed connection sucks, but there's no rush, you're not missing any panels, you can relax.)
Given that this is a third fourth attempt, fly him in on
_Wednesday_, and arrange some local event for him for Thursday so he isn't
wasting his time. (Reading/signing at a local bookstore or two, perhaps?
Is there a local radio program that interviews authors? Or if Detroit has
anything at all like the Alamo Drafthouse he might want to introduce a special
showing of one of his movies. It's a big city he doesn't get to much and
we're springing for the extra hotel room day, ask him for suggestions. Maybe
he wants to go to the zoo; up to him. The point is, it's ok to ask him to
allocate us a little more time as long as he can make good use of it. I
believe Terry Pratchett used the extra time to sit quietly in his hotel room
and write the "you all meet in a tarvern" scene near the start of Monstrous
Regiment, which he read for us the next day one of his talks, and we were all
pretty happy with this arrangment...)
(The Thursday night dinners with just the GoHs and concom are a nice fringe benefit of the "bring 'em in early" approach, but they're also entirely optional. I only ever actually made it to one of those myself, tended to be busy a lot right before the con for some reason...)
Step 5: Offer odds on the web page. (Possibly Lloyds of London could help here, I dunno how that works.)
Suspense! Drama!
Step 6: Recuit help.
Inviting Guests of Honor is always a question of getting good combinations that would work well together; people who are already friends, or fans of each other's work, or would go well on panels. (This part worked well this year, and Andrew Hackard stepped up to fill in for Wil.)
None of this would have actually prevented him from getting sick, of course. But it would allow the whole process to fail in the most entertaining possible manner. :)
(Actually, It occurrs to me that the logical way to get Wil to a future Penguicon is don't announce it. Do it in secret. Fly him in quietly, sneak him into the hotel, and then have Ninjas carry him into opening ceremonies (bound and gagged, if possible, and untie him on stage). Schedule either "Robert Wesley" or "Stephen E. Whitfield" (various pen names used in Star Trek) on Wil's panels and swap him in for those... Somebody on twitter suggested that we should declare he's been reconned into previous Penguicons and that this is actually his Xth appearance at the con...)
Eventually decided that building under emulation was the way to go after all, even for three small packages. For one thing, I'm not trying to get strace to cross compile. For another, it's nice to have a smoke test of the build environment to catch things like the fact that the current buildall.sh is leaving prefixes on the _native_ toolchain. (Sigh.)
Nothing to say today. Not dead. Fed Mark's cats. Did I do anything of interest? (Thinks...)
Oh yeah, Dealt with the mortgage guy. Had to create a handwritten letter confirming I'd transferred money from savings to checking within the same account, which is at the same bank I applied to for a mortgage, then had to sign and fax said letter. It was an emergency, which will probably delay the closing date, which would cause the sellers to walk since it's already been delayed twice and the end of the month was a hard deadline for them. I told the mortgage guy, who then went on a rant about how he was doing me a favor wasting his time on this small loan that they'll make no money on.
I think when I move out of this place, wherever we go next I'm going to try to arrange to pay cash. May take a while, but this whole mortgage thing just isn't worth it.
Grumpy today. Didn't get enough sleep.
Ah Subway, home of the $5 footlong and the $4.86 6 inch sub. The message here isn't that their footlongs are a good deal, it's that everything else on their menu is very inefficiently priced.
I miss the days when menus actually listed everything they sold and how much it cost. Apparently this is too "texty" for a modern audience. I thought McDonalds was bad ("Does that ice cream machine behind you still work? So where's the ice cream on the menu?" They _rotated_ one of the signs until ice cream showed up. Oh yeah, I should have spotted that back inside the wall somewhere, obviously.) But the McDonalds menu is totally coherent compared to Subway, which doesn't mention the existence of roast beef sandwiches, nor the 6 inch option. You have to remember them from years ago when the menu did include them. (Don't get me started on the "Fresh Fit" sub the kids meal contains but which isn't mentioned anywhere else on the menu, nor the menu's implication that Jared is the founder of Subway.) And you wonder why I haven't been here in most of a year?
Here now because it's next to the H&R block location that's still open after tax day, although that doesn't open for another 45 minutes. More paperwork for my sister's house, now they want a K1 form for Impact Linux. (Why? It's a shell company with no assets, it passes consulting money to Mark and myself and lets us buy health insurance in a different way. According to the K1 I finally got printed out, it had 81 dollars in it at the end of last year. Half of which was mine, apparently.)
And they want everything handwritten and faxed. (Because obviously you can't fake a fax in photoshop, save it as a bmp, and send it out via a fax modem. Nobody has a fax modem anymore, and the software you'd need to drive it runs under DOS which is a pain to set up the emulator for.) I keep having to fax things from Kinko's. I've spent at least $200 on faxes so far during this process.
So I want to build static busybox, dropbear, and strace binaries for each target. This is easy to do; I can think of at least three different ways off the top of my head. It's so easy I can sit down and write a script to do this with no references or research. Which means it's one of those class of problems where figuring out the _right_ way to do it makes my brain hurt and I get writer's block for days.
I can just fire up the native build environment, wget the source, untar it, cd into the new directory, make defconfig, make, and copy the binary back out. (Building dropbear first makes copying the binary back out noticeably easier.)
In practice, the config I want to build isn't _quite_ an actual defconfig, I switch a lot of stuff off that doesn't build on various targets (m68k hasn't got taskset) or without strange host support (selinux is evil). So I need to grab that trimconfig file out of FWL, but I can wget it straight from that URL if I like. (Put "tip" in for the version number and it auto-updates.) So I don't quite need to grab the full FWL infrastructure, but it's not entirely independent either.
Next, grabbing the dropbear source again every night is a bit impolite to the download servers because it's not going to change that regularly. Desite my desire for it to grow stunnel support, the project is mostly complete and in maintenance mode. The FWL infrastructure has cacheing already; the download and setupfor functions handle this transparently. So if I _do_ grab the FWL infrastructure, I get this pretty much for free.
I can also cross compile both of these packages, which is quick and easy and ignores the whole point of the project (that building natively under emulation is the way to go, and cross compiling is a transitional stage you get through as quickly as possible). But in each case, I've got a package that's already set up to cross compile and which produces a single static binary as its output, and the rest of the nightly cron job is a cross compiling so I've already _got_ a cross compiling build environment set up. It's even got the FWL stuff sitting there ready to use, and if I jump into the emulator I have to re-download FWL and set it back up if I want to use it.
So there's a simple way to do this which has obvious flaws, and a more complicated way to do this that probably isn't worth the complication, and this is the kind of thing that makes my brain hurt.
There are some actual fiddly bits. The download.sh script deletes everything out of packages that it doesn't know about. (This is to automatically zap old versions of the packages after you upgrade download.sh. It's actually a bit of a pain, because it means that things like qemu (which are speculatively downloaded) or alt-packages (which are sometimes downloaded and sometimes not) get deleted and then have to be re-downloaded, or else are downloaded and kept around when they don't need to be.)
I don't want to add dropbear to download.sh to unconditionally download it every time, and I'd like to move strace out too. Have some kind of cron.sh call download.sh stuff. But then I have to use a different download directory (not "packages") or the extra files will get wiped every time the original download.sh script runs. And the problem with _that_ is that the original download.sh is already downloading busybox, and having the second directory download a second copy of the busybox tarball is kind of icky.
Did I mention that root-filesystem.sh already builds busybox, and could easily be taught that BUILD_STATIC=1 applies to busybox? Except that it would build a lot of _other_ stuff (like uClibc), and would thus be an inefficient way of building that one binary (unless I wanted to have all the root filesystems it built be static), which I don't. So this is either going to be duplicated or is going to have too much fiddly configuration shoehorned into it, and both suck. Sigh...
Again, it's the _little_ things that screw me up. The ones that don't really _matter_ in the larger scheme of things, but are nevertheless _ugly_, that I go round and round on...
Don't mind me, I'm having an aesthetic reaction to a simple problem. FETCH THE CHAINSAW!
In a lot of ways programming is an art instead of a science. Debugging, especially. "I don't know what it's doing wrong" is pretty much a requirement for a bug: very few programmers intentionally write the code wrong, so it's misbehaving either because what you wrote didn't match what you had in your head or because what you had in your head didn't take something into account.
An awful lot of reworking is because "no, this isn't right" without being tied to a specific bug. You redesign some bit to make it better (often simpler and relying on fewer assumptions now that you understand which parts are actually important), and as a result bugs you haven't actually hit yet go away. And then when somebody hits a bug in an older version and ask you which patch fixed it you can't really answer because you never saw that bug. And sometimes "which patch fixed it" was a redesign, where the memory leak went away when you switched to mmap(), or the bug was in the translation module and now you've changed the other parts of the program to all talk the same language so there isn't a translation module anymore...
I bring this up because software suspend in Ubuntu 8.04 semi-regularly corrupts the vfs cache if the filesystem is active when it suspends (such as running a build that'll take another 15 minutes to complete and I don't want to wait that long just now, but I don't want to abort the build either). And I know the kernel in 8.10 didn't do that once in all the months I was using it (which is why I forgot about the problem), but doing the Ubuntu upgrades when I installed this laptop (at which point the release was almost a year old) didn't fix the bug; the old kernel is still susceptible to it. Which patch along the way to the new kernel fixed it? Probably not that simple...
I wonder what's involved in getting a Gentoo desktop with kmail on an xfce base and a working Flash plugin. Highly _unlikely_ to be particularly simple, but it's something I could much more easily tweak myself once I got it that far... (This is probably a bit like saying "It's hard to get a tank platoon 200 miles behind enemy lines, but once you do things get much easier".)
Wait until Mark gets back to town. Definitely.
So I'm fiddling with upgrading the system images to gigabit ethernet (e1000). I just did i686 and it's slightly faster, but not much. Maybe 3.5 megabytes per second. When I do a "dd if=/dev/zero of=blah bs=1M count=100" and time it, it seems to be getting maybe 11 megabytes/second. Hmmm, when I do a wget of a 120 megabyte file and add "-O /dev/null" it also gets about 11 megabytes/second. Right, there's some sort of emulated PCI bus contention going on. Whee. Still, sending stuff to/from distcc might go faster now, which would be good.
Finally wrestled canadian cross building of static toolchains into submission. Lots of darn fiddly little things to get right (one of the fiddlier, strangely enough, was making sure that the prefixes of everything wound up in the right places. For example, you can't get uClibc to produce an "i686-ld" or "i686-readelf", you have to rename 'em after the fact. And a "cc -> gcc" symlink actually has four possible states, and "i686-cc -> gcc" isn't the one you want. Some darn _weird_ errors result if you just try to run and debug this; visually inspecting the bin directory of the cross compiler is much easier. As opposed to debugging gcc, where visual inspection tells you nothing and the useful thing to do is find a failing command line and run it with -v and under strace to see what it's actually _doing_.
So now Mark can set up the cron job and build nightly binaries, except that I have to get uClibc's nightly snapshots working again. (Every time I ignore them for a month, when I come back they don't build anymore until I've tweaked the config of a half-dozen platforms and come up with fresh patches. Might be different this time, but it seems unlikely.)
Oh I'd forgotten about that bug. Occasionally software suspend on 8.04 will catch some weird race condition having to do with a dentry that's active during the suspend, and will wind up turning every access to that dentry into a segfault. (Sometimes it does one of those non-fatal panics and tells you it's a null pointer dereference in the vfs, sometimes it just kills your process with segfault and no explanation.) I remember the first time I tried to explain source control to Fade, and show her mercurial, Python spontaneously developed this affliction to screw up my demo. Now kaffeine's got it, so I can't catch up on my podcasts until I reboot. Sigh.
Hundreds of open browser tabs, unlikely to get 'em closed this week. Rebooting with the network off means they'll all be 404 and I won't be able to read cached data offline until I reload it. Rebooting with the net on will reload them all, meaning Konqueror will eat 100% of the CPU because tabs that aren't selected still run their javascript (which is a bad thing, but seems to be intentional).
And the dying thing is /usr/lib/libXdmcp.so.6 which is taking out amarok too, so I can't listen to mp3s either. Let's see, if I use Konqueror to navigate to an mp3 file and click on it... It tries to launch amarok. Idiot. It has built-in mp3 playing capability, and the flash plugin can also play mp3, but no, it wants to launch an external player. Brilliant.
Oh well, at least the stupid "Are we human, or are we dancers" song I was trying to drown out has gone off the radio now. (Because no human can dance you moronic whiny git.) Now it's gone to some other song by the same guy who did the original song Weird Al's "you're pitiful" is based on. It's a whiny falsetto theme on this station. The noise cancelling headphones, they do nothing.
The radio has now moved on to "Every time you go away, you take a piece of me with you". The frightening part is that this is is an enormous step _up_. (At the very least, I'm no longer contemplating surreptitious ways to damage the PA system here. And no, it's not the theme from the "Saw" movies. Don't think it is, anyway, despite the title I never saw 'em.)
I should look at Xubuntu now that 9.04 is out. Not looking forward to that. Should get my todo list as tamped down as possible first.
Still procrastinating about updating my resume.
Ooh, a Let's Play that Yahtzee did back before Zero Punctuation.
Watched the first disk of "Avatar, the Last Airbender" today. I previously thought it was an anime, but it's apparently a Nickelodeon production in a vaguely Japanese style (up to and including Japanese characters in the intro credits. I have no idea why. The practical effect of this is I can't turn the horrible english voices off and go to subtitles with Japanese voices that at least convey reasonable emotions whether or not I can understand a word. Nope, the english voice acting _is_ the original. I can only hope they improve as they get used to the characters...
I spent the first episode hoping the brother would die. The second episode _almost_ involved whatserface and the avatar guy leaving the rest of the cast behind (including the idiot brother) to go off on their own, but no. End of the disk, he's still there, which is sad. (I liked the voice actor when he was voicing Ron Stoppable, who was not a mysoginistic faux authority figure constantly blaming other people for his own screw-ups.) Still, Babylon 5, Star Trek TNG, and Star Trek the Motionless Picture (where "Nomad" has gone before) all started horribly and got better. The water bender girl and Aang's are both nice. And the bad guy's mentor is great.
Also watched the rest of the first Torchwood disk (episode 2, Death By Sex), the other commentary for Gosford Park (which is still way too complex for me to follow even half of it, and based on cultural details of a society farther from mine than the Yonomamo). And now I'm watching Bleach disk 3 (still episodes I've already seen back before Hulu stamped Watermarks all over the screen) which remains inexplicably Japanese in places, stopping for speeches about nature imagery in the middle of fight scenes.
A year or so back, while unpacking the boxes we'd kept in storage back in Pittsburgh, I found an old wristwatch that was still running. The pastic on one of the front buttons was missing, and when I held down the button to light up the face, or when it tried to beep, the display went blank because the battery just wasn't up to either activity. But it kept good time, and it wasn't nearly as uncomfortable to wear as the last couple of cheap chinese watches I'd picked up at wal-mart (one of which gave me a more or less sprained wrist after a week, and the other gave me a rash). My last good watch before that had gotten smashed against a table.
Last night, I noticed that my watch had fallen 15 minutes behind, when it usually kept good time. Today, there are no numbers on the face at all, it's totally dead. I feel I should have some kind of memorial service, for a watch that came out of retirement to give me one more year.
It was a good watch. I shall miss it.
Broke down and implemented a proper little setsid program in C, and made system-image.sh build it and call it. In theory I could have added this to toybox, but the build doesn't _depend_ on toybox being there. I could also have upgraded the busybox version to do this, and still might, but again the build shouldn't depend on the host setsid being buybox. (You can skip host-tools.sh.) And the host setsid on Ubuntu is forking a background process and returning immediately, which is useless for my purposes.
So yeah, spent a couple hours yesterday fighting with the shell in an attempt to avoid writing 9 lines of C code. (Because I shouldn't have NEEDED to, darn it.)
*blink* *blink* My watch appears to have had an Inigo Montoya moment. It's back from the dead and keeping time again. It was going all disco for a bit there flashing and being generally nuts, but it settled down after about 5 minutes and now it's working just fine. I have no idea what's up. Perhaps it got water in it? Perhaps the battery is doing some strange chemical thing I'm unaware of? It's entirely possible it's gone undead on me, and/or is posessed, but as long as it's functioning properly I have no immediate reason to complain about this...
Weird. Welcome back, wristwatch. (Had to reset it. It was off by about 2 hours, but other than that...)
So the work our big client asked us to do this week does not, in fact, have a budget attached, and thus is not billable. (I guess that means it's not work product then?) Nothing billable for us to do next week, either. Meaning Mark and I probably need to update our resumes so we can look for work that _is_ billable. (I haven't objected to going down to half time due to a lack of enough assigned work, and I'd personally happily take a few months off except for the whole "buying my sister a house" thing, which makes this bad timing. Oh well. Closing should be at the end of the month, this doesn't affect that.)
Alas, the original problem with running a business comes back to haunt me: I have no trouble doing the technical work, but the sales work of finding clients isn't something either Mark or I are good at.
Ok, I haven't seriously poked at Firmware Linux in a week. Time to pick up the shovel again.
So where I left off is I rewrote buildall.sh to take advantage of the canadian cross stuff, and everything broke. The actual canadian cross part broke, but more fundamentally the old buildall functionality broke. One reason is that when system-image.sh dies, it tends to take down the script that ran it because it does a "kill 0" which takes out the current process group. Hence the first system-image.sh to fail stops buildall.sh from trying any of the later ones, and right how hw-uml is failing because user mode linux is still horked, as usual.
The way build.sh works around this is by running it via setsid (the "set session id" command explicitly creates a new process group), but needing to do that is icky. It would be nice if system-image.sh could do that internally somehow, I just need to figure out how.
I can't put system-image.sh's logic in a shell function and call that via setsid because setsid isn't a shell internal command, and a regular command can't do anything useful with the name of a shell function on its command line because it can't call _back_ into the shell that just forked and execed it as a child process. (I hit that one _all_the_time_.) I could do something incredibly ugly with "here" documents but the cure's worse than the disease there, especially with what it does to syntax highlighting, which admittedly has never worked in Ubuntu because Ubuntu hates vi for some reason and goes out of its way to break it; another reason to switch to Gentoo or something someday.
So my next attempt is to add this to the start of system-image.sh:
if [ -z "$SYSTEM_IMAGE_SETSID" ] then export SYSTEM_IMAGE_SETSID=1 exec setsid "$0" "$@" fi
The reason that's unacceptable is now ctrl-c does nothing when system-image.sh is running. I took the exec out and added "exit $?" on the next line, but that made no difference.
The _odd_ thing is that when I call the sucker from build.sh via setsid, _that_ handles ctrl-c just fine. So what's the difference here? I tried 'setsid /bin/bash -i -- "$0" "$@"' and that confused the _heck_ out of the tty. (Ctrl-c gave me a shell prompt back, but didn't kill the running script.)
Tried calling setsid through the built-in "time" function, since that was the only difference I could see from what build.sh was doing vs this thing calling itself. No difference...
Ok, so I commented out the additions to system-image.sh and put the setsid back into build.sh and now _that_ isn't letting ctrl-c work anymore either. Which is strange because I'm pretty sure I tested that when it went in and it was providing the correct behavior. (I.E. kill system-image.sh and its children, but not the calling shell.)
I want "kill this process and all child processes, recursively". There should be a way to do that. (The gnu implementation of ps has --ppid, but the busybox ps is kind of a joke.)
Grrr. I need a way to call tcsetpgrp from the command line. Why isn't bash doing this when I call it from setsid? Because its process already is a session leader? Except that 'echo | setsid xargs -- /bin/bash blah' isn't interruptible either, and there bash is forced to be a child process of what setsid calls.
I'm using 'kill 0' because neither 'kill %1' nor 'kill `jobs -p`' work from signal context. It can't access environment variables either, so I can't save the PID and have it call that. I suppose I can reset the signal handler with an explicit list of PIDs to kill after every job I launch (make a function for it)... Except that _that_ doesn't work because killing the child process isn't recursive, it doesn't kill the sub-processes like "make" it was running (even though it wasn't a _background_ process for that shell, so you'd think the shell would do it, but no it depends on the terminal control group to propagate the signal).
Tried killing the pid of the background process as a negative number (which I believe should kill its process group), but it claims it isn't a process group. Tried running the background process through setsid to force it to _be_ a process group, but that didn't work either. (Hang on, does busybox know it's ok to do this? Does the bash builtin kill know? Trying $(which kill) and... no help. It's parsing the negative number as a signal number, so try "kill -11 -$(jobs -p)" and... it says no such pid, but with the negative number this time. Huh, I thought they'd added that support to the kernel years ago. (Try without the setsid on the child process... Nope.))
This _really_ should not be this hard. I really, really, really don't want to have to write C code for this.
Ok, spent another ten minutes installing an atexit handler in the outer instance of the script, sending a signal 11 to the child session running under setsid, catching that particular signal in there, and calling 'kill 0' if it gets it. Set up a little test where the child just waited 5 seconds, like so:
if [ -z "$SYSTEM_IMAGE_SETSID" ] then echo Need to recurse export SYSTEM_IMAGE_SETSID=1 setsid "$0" "$@" & trap "echo dying now, kill $(jobs -p); kill -11 $(jobs -p)" EXIT wait4background 0 exit 0 else # If we exit before removing this handler, kill everything in the current # process group, which should take out backgrounded kernel make no matter # how many child processes it's spawned. trap "echo die lots now; kill 0 -QUIT; exit" 11 echo do not recurse sleep 5 echo done exit 0 fi
The above _WAITS_FOR_THE_SLEEP_TO_END_ before delivering the signal 11.
*BOGGLE* It sends the signal. And the shell doesn't process the signal until its child process exits. WHAT THE...?
Sigh. The reason this doesn't work:
if [ -z "$SYSTEM_IMAGE_SETSID" ] then echo recurse now export SYSTEM_IMAGE_SETSID=1 setsid /bin/bash -- "$0" "$@" & trap "kill $(jobs -p) 2>/dev/null" EXIT fg exit $? fi
Is that it says "no job control" when it hits fg. Presumably because the shell isn't interactive. I can replace the last two lines of the if block with "wait4background 0" and "exit 0", but then I lose the error return code of the background process.
EPIC FLAIL!
(Well, actually as development sessions go for me, this is pretty tame. Still frustrating, though.)
Sigh. Domestic disputes, gotta love 'em. (You can stop reading now, nobody but me will care about this entry.)
My condo complex has designated parking spaces, and my neighbor's been parking over the line of their space for a while now. Annoying, but not a big deal. Today my neighbor came to yell at me because my car, parked entirely inside the lines of my space, was preventing them from pulling out.
I say "yell" because they did, and because they brought a friend with them, and claimed I'd had them towed twice (which was news to me; I asked Mark and he said he didn't tow anybody when he was here either).
I have towed cars that parked completely _in_ my space, but not for being over the line and not since last September. (It's an autumn ritual around here, as each new year starts at UT and the renters figure out which spaces are reserved and which aren't.) If somebody tows you without authorization, what you do is contact the towing company (only one services this garage, number's on the sign over the door), then you get the paperwork related to the tow which identifies who did it and has their signature. Then you sue them.
For once, the cell phone camera came in handy! (Ok, I had to borrow Fade's phone becuase my battery was low, and then I had to spend half an hour fiddling with bluetooth to figure out how to get the pictures off. But that's par for the course.) Here's the space they leave on the left, and the space they leave on my side. (This is after I moved my car to the right edge of my space, otherwise you couldn't see between 'em very well. I tried a close up, but the lighting makes it really hard to see. If you're looking for the line it's under the tires of the car on the left.) This was actually fairly mild "over the lines", he's been over by lots more, it's just this time he decided to demand that I move my car to give him more space. (Yeah, I know...)
The hilarious part was that they say they've been complaining about me to "Mrs. Thompson" for a while now, who I assume is the person they rent from. (I own my condo, they rent.) I took the pictures so I could send 'em to the condo association if it comes up again. (Which is McNeil property management, still no "Mrs. Thompson").
Fairly unmemorable day, otherwise. Baked a cake last night to use up the rest of the whipped cream. (Making whipped cream from actual cream is a good thing. Strawberries and cream turn out to be _much_ nicer than plain strawberries, which is why we ran out of strawberries.)
The internet continues to be entertaining. I hadn't previously seen someone moonwalk en pointe, for example.
[In the last 12 months] the combined earnings of the 500 dropped 85 percent, from more than $645.2 billion to $98.9 billion. Think about that profit number again: One company, AIG, lost more than the combined profits of the other 499 companies in the Fortune 500.
Spent the weekend highly uninspired to do anything. Spent monday too tired to had at least 3 multi-hour naps which means I slept through most of the day.
Back to vaguely uninspired today, which is an improvement. This is probably some kind of cold.
I'm submitting patches to busybox again. Why am I submitting patches to busybox again?
I suppose once somebody did a dance mix cover of "The Time Warp" it was inevitable that a music video made entirely out of clips from Dr. Who would be set to it and put on Youtube. This is the internet after all.
That's not even a particularly remarkable one. The weird science one makes better use of the Dr. Who material and matching it to the music, as do this one, and this one. There's often significant variation on the same songs, with straight takes and and ironic takes. And some were just extended versions of what wound up in the show, although you sometimes realize how carefully cut the original song was for broadcast TV. (Yes, the part of the song that wound up on TV was explicitly advocating murder, but didn't mention _sex_.) Bumped into some songs I'd totally forgotten, and I've even found some new music doing this.
Of course Dr. Who isn't the only show with with music videos. (Although Harley/Ivy is almost cannon, as is Bonnie Tyler/Hiro Nakamura really. (Although innocently looking for that brings up unwanted Luke Ski stuff, a bit like Penguicon really. Yes, I've had more than one panel scheduled next door to his "concerts", and after six years his material gets old. Nice guy in person.)
Saw "Monsters vs Aliens" today, which was entertaining but made me appreciate Coraline more. Coraline was _elegant_ in its use of 3D, when the tunnel expanded into the distance it was _supposed_ to be otherworldly, when the hands of the "piano that plays you" stepped out they _were_ intruding on coraline's space and being meanacing in a foreshadowing way. The needle coming out at the start and poking the audience in the eyes was supposed to be unsettling, as was the rest of that scene. But it would all work in 2D as well.
Today's movie wielded its 3D like a blunt instrument, and a lot of them would just be silly in 2D. Making a paddle ball fill the screen near the start of the movie was just pointless showboating. Monsters spent a lot of time using 3D very intentionally. Coraline simply _was_ 3D, and made it look effortless and natural.
Some of it's technical stuff. Several times Monsters had a bright 3D object on a dark background, and a halo filtered through the polarized lenses. I never noticed that _once_ with Coraline. (I'd also heard that one of the failure modes of 3D is that rapidly shifting depth of focus for an hour gives you eyestrain. Never came up in Coraline, happened a lot in Monsters.) A movie should makes me _notice_ the technical tricks it's doing, even when it's doing them reasonably well, because it defeats the purpose. Use the tricks to tell a story, not to show off the tricks.
I remember one of walt Disney's famous quotes was "Change the trick". This came up in an old a making of Who Framed Roger Rabbit documentary I watched, where they showed around 10 seconds of footage of a human actor riding in cartoon taxi (chase scene), and in one shot the human was on a crane with the buggy painted over it, in the next he was on a miniature vehicle with the buggy painted over it, and in the third both the buggy and the human were animated (but they were going down a dark alley so it was harder to notice the human wasn't the actor; and they still used his voice). All in the space of ten seconds. The point was so that you _couldn't_ figure out what they were doing because they kept doing different things. (See a man in a rubber suit, look again and it's now a puppet, look again and it's audioanimatronic...)
CGI eliminates a lot of this from a technical perspective, but not the need for it from a storytelling perspective.
By the way, either Ginormica's grandfathers are The Doctor and Death, or the name "Susan" attracts superpowers. Somebody should ask The Invisible Woman about this.
Cable modem's out again. Time Warner. Yeah.
Wandered over to Mark's place, fed his cats, rebooted the server. Apparently there was a power failure at Mark's place long enough for the UPS to drain, and when it came back it hung trying to get ipv6 information from a dhcp server that wasn't giving it. It hung for at least 12 hours waiting for this, but continued immediately when I unplugged the darn router (toggling the cat 5 connection status). (Note: we're not using ipv6, this is just Gentoo being weird.)
Then Fade and I headed to Epoch to use their internet, and spent the rest of teh evening there.
Poked at the canadian cross toolchain (translation: hit it with a rock) and made it work. Now I'm ripping build.sh a new one to add static cross compiler building to that.
So the problem with the canadian cross toolchains is that the pathing is horked. AGAIN. Yet another thing for the wrapper to EXPLICITLY WHACK WITH A HAMMER. Except that I probably need to patch the source to _not_ let it look at the wrong areas _first_ before falling back to $PATH. (And when it's _not_ canadian crossed, the path logic works DIFFERENTLY. Or maybe it's some targets.) Other than that, the sucker seems to work. Or at least it builds a hello world that runs under qemu.
(Ok, technically it doesn't run under qemu-mips, but that's because the current mips application emulation hangs attempting to run a hello world statically linked against uClibc. But that's not the toolchain's fault, and it runs fine under qemu system emulation just fine.)
I'd hoped to drop off Mark at the airport _before_ rush hour started, but it starts at 6am and his plane didn't leave until almost 8, so it was either deal with rush hour traffic or get him to the airport 3 hours early. Got home and slept for about two hours before Fade got up, then the phone rang with some guy who was unclear about whether or not he wanted to offer me a job, who said he'd sent me an email (and was calling to tell me he'd sent an email), but no actual email ever arrived. Email about existing work did though, so I dealt with that before going back to bed. It was noonish by that point so I didn't really sleep well, and wound up getting up earlier than I really wanted and being vaguely unproductive until after dinner. (I can work on a day schedule, or on a night schedule, but some variant of consistency does help. My internal clock flashing 12:00 leaves me a bit zombie-ish to focus on technical work. You can bury the problem with enough caffeine, but that's not a long-term solution.)
I'm so glad I got my taxes done last month. Today would really suck otherwise.
I need to re-rip Billy Joel's greatest hits, track down my genesis CD with "land of confusion" on it, and a bunch of other stuff.
"If and when the president does make his Afghanistan announcement, you can be assured that we here at The Rachel Maddow Show will cover it with an almost ridiculous, over the top, obsessive interest in the details. I'm sorry, I can't stop myself." - Rachel Maddow, 3/26/09.
I want to have Rachel Maddow's baby. I'm aware that there are a number of reasons this isn't likely: I'm male, I've never actually met her, I'm married to somebody else, Rachel's gay and in a stable relationship with a woman in the northeast somewhere... Little things like that...
The canadian cross stuff seems mostly building now. Dunno if the result works yet, and there's still a bunch of polishing stuff to do. (The strip pass at the end is going to be fun to untangle...)
Went in to the mortgage guy's office down off of Bee Caves to sign lots of paperwork for my sister's house. Hopefully, that's the last of it until closing. (Between paying taxes, funding IRAs, and the down payment and closing costs for my sister's house, I seem to have used up most of my ready cash, _and_ acquired a new $615/month bill. Oh well.)
Fade sounded distinctly forlorn when I called home around dinnertime, so I felt compelled to go make her less forlorn. (This involved sandwich, fruit, three different types of caffeine, and a cookie. She seems less forlorn now.)
More fiddling with transcoding software, banging on qemu summaries, and back to working on the canadian cross stuff too.
Gotta take Mark to the airport at 4am, so he can go visit Eric and Cathy for two weeks.
Went to vist the investment guy this morning to actually do something with the Roth IRAs Fade and I set up last week. The S&P 500 fund Wells Fargo has eats 5.75% of your investment up front, right off the top, as a management feet. (Ouch.) I wanted to buy a share of Berkshire Hathaway Class B stock (currently around $3k) and put the rest in the S&P 500 fund, but I wound up putting it all in the fund because to do that they'd have to transfer the money into a self-managed account which would take at least a day meaning I'd have to come back _again_. (Yeah, I know this is how they make their money.)
Fade went with the managed fund the guy recommended.
Being diplomatic seems to primarily be a question of what you _don't_ do. For example, I let two different people have the last word over on the crossgcc mailing list. (The guy who took the position that the only truly "embedded" systems are the ones with 64k of ram or less, which by extension there's no such thing as embedded Linux. He stopped emailing me when I stopped replying to him, unlike the guy who claimed my response to him was flame bait, and then continued to reply to it for a couple more pages of text, and post follow-up emails. Has yet to notice he's arguing with himself. About automobiles. Yes, really.)
This comes to mind because I'm trying to be diplomatic about the qemu mailing list summaries, and there's a guy named Ian Jackson who is so consistently wrong that I feel compelled to point it out in my summaries as one of the things you'd notice if you read every message. I mean he's good natured about it. He seems to mean well. A lot of "don't ask questions, post errors" progress happens because of him. (And it's entirely possible I'm being influenced by the fact he's the main guy trying to push Xen code upstream into the qemu repository, which is the first thing that made me question his judgement.) He certainly knows more about the guts of qemu than _I_ do...
But I started my summary in the middle of this thread because I couldn't think of any way to gloss over the start of it that didn't sound like "The thread started with Ian being wrong again, and while various people were correcting him..."
Sigh. I reserve the right to be honestly wrong myself. I _need_ it in domains like the linux kernel mailing list, where I know I'm outclassed in terms of domain expertise. I really don't want to be hard on this guy, but I also don't want to quote anything he says without some kind of disclaimer, which has caused me more than one bout of writer's block summarizing.
Also researching video conversion software, primarily ffmpeg. My first largeish conversion with it resulted in badly out of sync audio (bad enough to be distracting after a couple minutes, accumulating to something like 7 seconds difference at the end of an hour long video). Wondering if that was a version-specific bug, or if I invoked it wrong? Dunno.
Ok, my working style's gotten some pretty deep groves in it. I just got to a good stopping point with the rebuild.sh and indexsections.py files for Qemu Weekly News (hey, I'm up to the end of January, 2008! Woot!). And I went, "ok, time to check these into source control"... and I haven't got source control for 'em. (Well they don't develop, except for those two pieces of infrstructure, one of which is from the old kernel docs I spent half of 2007 poking at, each data file gets finished and should never change again after that.)
Seems silly to set up a mercurial instance for two files, and/or to check in lots of static files.
Fade's been busy with online appointments for 6 hours so far today. (This is fairly normal.)
My attempt to come up with a paper for the Linux Plumber's Conference hit the snag that the scope of everything I tried to write was just too big. Even my _outlines_ spanned multiple pages, and just kept getting bigger. (I suppose I could try again tomorrow, but mostly I want to sit down and spend a couple _weeks_ writing documentation, not a couple hours. So many tangents...)
Spent rather a lot of the day doing qemu mailing list summaries instead. Lots of funky editorial decisions there, but they're mostly "should this thread be included or not, and how much". The scope of each week is "threads starting between this date and this date", and from there it's a question of _removing_ stuff, not adding it...
For example, currently I'm trying to figure out if this thread is worth covering. Four posts between two people, riffing off a LWN thread that already implemented something, wondering if qemu could do a better job and deciding "no". Long term result for qemu: none really. Is it likely to come up again? Dunno, probably not. Is it good background material explaining how qemu wound up the way it did? Well, sort of, but not very.
Or how about these two, where somebody asks a very good question... and never gets an answer.
Yeah, all this is totally subjective, but most editorial jobs are.
Darn it. Making a canadian cross work in root-filesystem.sh is harder than it looks. (Right now the same compiler builds libgcc.a and crtbegin.o as builds the gcc executable. I need to specify _different_ compilers for that. Ideally, those should be a separate build target, except re-running ./configure between build targets would be hilariously ugly. Once again, the autoconf step makes simple things hard...)
Good to know Moore's Law continues apace. Also nice to see idiots punished.
Saw The Last Unicorn with author Peter S. Beagle at the Drafthouse, with Mark. (Who has shaved his head. Mark has, I mean.)
The drafthouse was deeply disorganized about this (he's introducing the movie! No, he's doing a Q&A afterwards! No, he's just signing stuff in the lobby! Wait, no, the Q&A is starting, after 1/3 of the audience left because they were explicitly told it wasn't. Right. (In their defense, this was an encore presentation. The wednesday showing sold out, and the author was still in town, so... Still, the drafthouse guy who announced to the audience that we should all go out to the lobby because the Q&A had been yesterday? Bad form.)
It was a good Q&A. Lots of fun writing things which he said he'd answer differently in an academic environment (where he didn't have beer; he introduced himself as a "beer snob", hence his enjoyment of Austin and The Drafthouse which serves more different types of beer than many pubs). Very honest, lots of "that symbolism was entirely subconscious, it just felt right. I was writing it to see how it turned out, sometimes you get away with that and sometimes you don't." Somebody pointed out how much he'd packed into two sentences they quoted and how other authors would take a half-dozen pargraphs to say as much, and he immediately pointed out "I wrote those six paragraphs first". Marvelous bit about how hard writing the screenplay for the Rankin/Bass adaptation of Lord of the Rings was ("I told him I've been writing for days and I haven't reached the Riders of Rohan yet, and Arthur groaned and collapsed on the desk... He'd forgotten about the Riders of Rohan"), and how some things just don't translate well to animation. He thought a live action version of The Last Unicorn with modern CGI could follow the book more closely. And that it hadn't occurred to him when he was writing it that Prince Lyr would grow up to be King Lyr, just that the name sounded right. And that making the cat a pirate wasn't actually his idea (although he loved it), he just put a cat in the book because there was a cat curled up on his desk when he was writing the book; more or less the same cat.
His business manager (I've forgotten his name) was also there, and answered my question about "Do all unicorns turn into anime chicks?" by pointing out that the next project the Japanese animation team Rankin/Bass hired to do The Last Unicorn went on to do immediately afterwards was "Nausica, valley of the Wind" and they formed the core of Studio Ghibli. (So yeah, there's a *reason* the unicorn transforms into a girl with big eyes and a small mouth, naked transformation sequences that never quite show any actual anatomy, and so on.) The Japanese guys apparently submitted redesigns for most of the characters, and the rankin/bass guys agreed to some changes and kept the original for others. Apparently the witch Angela Lansbury voiced was one of the Japanese designs. (As far as I can tell, Almathea pretty much looks like her voice actrees with more hair, but the style's a bit of a giveaway.)
I hadn't realized how much of an all-star cast it was. Rene Auberjonois voiced the skeleton before he was even on _Benson_, let alone played Odo on Deep Space 9. Mia Farrow went on to play Supergirl two years later (she still can't sing, though). Prince Lyr was voiced by Jeff Bridges (Flynn from Tron, most recently the bad guy in Iron Man... he could _almost_ sing). Christopher Lee voiced King Hagard (more recently he was Count Dooku and Saruman).
Bought two books and had Mr. Beagle sign both.
Ah, I'd forgotten how kmail treats mbox files with more than 32767 messages in them. (At least in Kubuntu 8.04 LTS.) Decide the sucker is corrupted, pop up a window announcing it's going to rebuild the indexes (losing the read/unread/flagged status of all existing messages) with only one button that doesn't let you tell it _not_ to do this thing, and then loop endlessly popping up the window again with no way to cancel it because the thing still has more than 32767 messages in it. Bravo, kmail. Bravo.
The way out is to kill it (except you have to kill kontact, not kmail, because they sucked it into a Microsoft Office style bundle), copy the mbox file to a backup, open the original with vi, delete the first 100,000 lines or so and trim it to the start of a message, save and exit, delete all the hidden files starting with the same name as the mbox file (the indexes), restart kmail, and let it regenerate them then.
Simplicity, elegance, scalability... Yeah.
Of course this wouldn't have any application to brainwashing at all. (SO glad the shrub administration's worked its way through the guts of the nation.)
At home, awaiting the cable guy.
Poking at Sparc, which I last seriously fiddled with back in november. Last night I re-fixed the sparc ELF type glitch, but as to why the dynamic linker isn't working, I dunno. The kernel seems to have built fine with that toolchain...
Implemented BUILD_NICE and BUILD_VERBOSE in FWL. The first makes build.sh automatically nice down the rest of the builds, the second feeds V=1 to the Linux, uClibc, and BusyBox builds. (Yeah, you can do the first from the command line and the second's a trivial patch to the scripts when you're debugging something. But it's nice to be able to make the first persistent in .config, and the second transient from the command line. A convenience, nothing more.)
Ooh, I accidentally hit "i" in Kaffeine (I thought I the vi window had focus), and it turned "deinterlace" on, which is actually something I'd been trying to figure out how to do. (Otherwise the bleach dvd it's showing looks terrible whenever things move around on screen to fast.)
But why would deinterlace ever _not_ be on? (Isn't interlacing an artifact of CRT scanning which even modern LCD and plasma televisions need to compensate for?
Weird Al's Don't download this song remains a work of genius. (I admit I feel slightly guilty about listening to an mp3 I ripped from a legally purchased album instead of listening to the Youtube version or something, but I'm way too lazy to actually _investigate_ the file sharing networks...)
Distinctly under the weather today. Fade said she felt blah a couple days ago, now I've got it. (Very mild upset stomach, zero energy.) Not really feeling like doing anything specific, so I cleaned the kitchen. (Always a good option when nothing particularly seems worth doing at the moment.)
The cable modem's out. (There's that marvelous service Time Warner wants to charge extra for.) Somewhat inconvenient to look up time warner's number without internet access. I'm spoiled. Have to go dig up the phone book... And it's a "signal issue". A guy has to come look at it, some time tomorrow between 8 am and 9 pm.
Checked the other local wireless access points. I could associate with a couple but they route packets either. Dunno what that means. Heading down to Thundercloud, I haven't had breakfast yet anyway.
Removed mlocate and updated my "next time I reinstall" list. (Having a cron job start up and hog the disk when I resume my laptop is silly, especially for a service I never use.) I should probably poke at Xubuntu 9.04 when it comes out.
Hanging out at Epoch with Fade. Yay coffee shop internet...
Long design discussion going on with Yann Morin, maintainer of
crosstool-ng (and the guy who wrote insmod modprobe for
busybox long ago, which is where I know him from). I belatedly remembered
to cc: it to the FWL mailing list.
The fact that off the top of my head I can find a dozen objects to the design of crosstool-ng isn't really a big deail, because finding objections to software designs is just about a superpower with me. I object to my own designs; toybox is stalled because the design needs work (possibly a complete rewrite in lua), and Firmware Linux fundamentally should just be four packages: kernel, C library, compiler, command line tools. I was trying for linux, uClibc, tinycc, and toybox for a while there, but the tinycc development community and I had an unhealthy relationship and I broke it off. The linux kernel needs a "hello world" variant we can build up from with the boot wrapper code, early_printk, and _nothing_else_. But I haven't got time to investigate and restructure it.
A few other things currently wrong with FWL, off the top of my head and by no means even CLOSE to exhaustive:
The distcc accelerator needs a far more obvious way to tell it's working. The cc1 instances are too short lived to show up much on "top", and it's transparent enough you're not quite sure it's _there_.
The uClibc build doesn't distribute via distcc, something to do with the build flags.
The whole of build-static-toolchains.sh is horrible. I know I've redone it 5 times, but it's still horrible. The hdc stuff might help, now that squashfs 4.0 is out.
Distributing via distcc is TOO DARN SLOW. It doesn't parallelize enough. I need to switch to the virtual gigabit adapter, use tcc -E for the preprocessing, get the multiple qemu instance clustering thing implemented... And possibly rewrite distcc from scratch.
Several targets don't work. Sparc's been hosed for years, I've never been able to test m68k, still can't test arm big endian, armeb is incomplete and has no test environment.
The uClibc++ build is darn fiddly, and retrofitting it into the cross compiler is horrible. It breaks easily, not reliable... Ugh.
I never even _tried_ to use gcc's sysroot thing. After _five_ previous attemps by gcc to fix its path logic by adding another layer on top of the existing crap, I never even considered the idea that the correct approach to fixing gcc's path logic is to take the decision out of gcc's hands entirely.
Similarly, I don't have an equivalent to the multilib stuff yet. I can make ccwrap.c take the same command line arguments and dispatch, but in theory using gcc's built-in mutilib stuff could save some space rather than building shared infrastructure again for every target variant. But that would involve trusting gcc to be able to find its own ass with both hands, which I just don't.
The whole "seven packages to rebuild" is a bit of a lie when I'm using toybox unconditionally. Admittedly I could police my patches so they never need to apply at an offset, and thus use busybox patch, but that's a huge pain. I should push my patch implementation upstream into busybox. And fix their netcat -l, and even if they don't want oneit I can do it as a busybox patch locally. At this point, I'm unlikely to push toybox to a complete busybox replacement for the same reason I haven't gotten qemu weekly news up to date. Not quite "not enough hours in the day", but "not enough energy when I do have time". But I should either finish this or replace it.
Too many config options. I don't want to use menuconfig, but at least GFS should be able to set these suckers.
What _is_ the relationship between GFS and FWL? They're not quite separate projects and not quite the same project. It's ugly, needs to be clarified.
I'm stuck with the GPLv2 versions of stuff because I don't do GPLv3, and the FSF has abandoned GPLv2. Those package versions are going to go obsolete, badly. (Ok, gnu tar went 5 years without a release, so it's not on _that_ short of a timeline, but it's been 2 already, even if I upgrade to 4.2.1.) I need to find replacements for all the Free Software Foundation's code, but with tinycc development stuck and pcc and llvm still not able to build a linux kernel (and showing no interest in that as a goal)... I don't have the time or expertise to take tinycc back up and glue qemu tcg onto it myself, but if I don't what's my alternative? My recent exchange with grischka turned me off to banging on mainline tcc again because I don't respect his technical judgement as a maintainer, and thus don't feel like trying to argue him around to my point of view on anything significant. The amount of work he's putting into it is less than I'm _currently_ putting into toybox. But doing my own tinycc fork is just so MASSIVELY unrewarding as long as that other fork exists and takes the credit for anything I do, whether or not they even bother to merge it.
host-tools.sh is too complicated and has too much stuff in it. (Again the "seven packages" thing is more an ideal than a reality; e2fsprogs, squashfs... and building or symlinking qemu is just _UGLY_.)
run-from-build.sh is a great big layering violation. It includes sources/include.sh which means qemu needs to be in host-tools.sh which is just awful.
mini-native.sh is a horrible name, I should rename it to native-rootfs.sh or something, thus confusing everybody familiar with the current name.
The scripts are full of bash dependencies everywhere, without a decent bash replacement. I should at the very least teach busybox ash to understand {curly,bracket} syntax and >(executable redirects) and then teach build.sh to use ash out of build/host. Then try to build everything with ash instead of bash. The roadblock here is somewhere between my vanity (I _can_ write a new shell from scratch, that would be much better than this, but as with qemu weekly news will I live to see it completed?) and laziness (interacting with other developers is harder than just doing it myself; a variant of the old "reading code is harder than writing it" failing, and the fact that if I start messing with ash I'll find SO MUCH STUFF that needs fixing that I'll go off into the weeds for months ripping ash a new one. I just know it).
My FWL documentatioon sucks, I need to rewrite it again. A lot. The README is too long and doesn't say enough, documentation.html is just incoherent and incomplete AND too long AND not thorough enough...
AAAAAAHHHHHHHHHH!!!!!!!!!!!!!
Did I mention that years ago I learned not to be bothered by the fact that everything I write sucks?
No really. I _expect_ it to suck, from my point of view, because I know what's wrong with it and how it could be better. It could always be better. All you can do is find the point of _least_ suck, which is a local peak at best. But you have to just botch something together, make do with it as best you can, and move on to the next crisis. Fake it with style. If you're lucky, you can come back and make it suck incrementally less later, but as with optimizing there will ALWAYS be a bottleneck. All you really do is move it around, in an eternal game of whackamole.
This is the "better to wield a flamethrower than to curse the darkness" approach to creative endeavor. When wielding a chainsaw against infinite quantities of suck, you have to get your satisfaction out of the wielding part, not any resulting lack of suck. A cat does not play with a string because they expect to finish off the string. (Ok, that's one depends on the cat.)
Rereading The Velveteen Stories. Already re-read Velveteen vs the Isley Crawfish Festival, Velveteen vs Andy's Coffee, and Velveteen vs the Flashback Sequence (parts one and two). Now reading Velveteen vs the Old Flame (while listening to Weird Al's "do I creep you out", seemed appropriate somehow).
Hey, I forgot the kde system monitor thingy, which graphically shows me how much of the system's going to non-nice tasks (ala qemu) and how much is going to nice tasks (ala distcc). And yup, distcc tasks aren't consuming any noticeable amount of CPU even though I've got a build-static-toolchains.sh running. Now what's gotten screwed up...
Brittle. Evil. Do not seamlessly fall back to local compiling, FAIL NOISILY SO I CAN SEE IT'S NOT WORKING. Grr. When the distcc trick is enabled, the _only_ things gcc should be doing locally are preprocessing and linking, no compiling.
I should just break down and teach ccwrap to do this. At least I know exactly how that sucker works...
Ah. Doh! My fault, it's building mini-native, so it's using the cross compiler it just built, which means the the distcc config on the host compiler isn't being used.
Grrr. Ok, time to fix this properly. I need to teach mini-native.sh to canadian cross.
This is what our new couch looks like, except for the actual couch part, and there are more cats, and the word balloon is merely implied.
The gcc source code is one of the most horrible codebases I've ever encountered. The layers of unnecessary indirection are painful to _describe_, let alone wade through.
I'm trying to make arm big endian work. I've been trying for two days. I figured out what needs to change hours ago (the line #define SUBTARGET_EXTRA_LINK_SPEC " -m armelf_linux -p" in gcc/config/arm/linux-elf.h needs to change armelf_linux into armelfb_linux for big endian versions), but figuring out how to come up with a patch that works for both big and little endian is a FLAMING PAIN.
I refuse to conditionally apply patches. The same code should work for all targets, anything else is stupid. But gcc is just so horrible. This is creating a built-in spec file, which gets parsed at runtime. The information available at compile time and the information avilable at runtime aren't on _speaking_ terms with each other.
First, they implement their own totally unnecessary language (spec files), and resolve things at runtime using that language. There's no need for it to _exist_ except that they couldn't make anything simpler work and their reaction to failure is to add more complexity and layers.
So I'm tring to determine the default endianness at compile time. The default endianness is determined at _runtime_ by the global target_flags, which is initialized from the global structure targetm.default_target_flags in gcc/opts.c. The targetm structure turns out to be "struct gcc_target" which is defined in gcc/target.h. That's a big ginormous struct definition, going on for pages and pages. The global instance targetm is initialized by target specific code, in this case residing in gcc/config/arm/arm.c, but every target's initialization boils down to the same line: struct gcc_target targetm = TARGET_INITIALIZER; and TARGET_INITIALIZER is a giant macro defined in gcc/target_def.h.
The _ugly_ part is that TARGET_INITIALIZER is this mess:
/* The whole shebang. */
#define TARGET_INITIALIZER \
{ \
TARGET_ASM_OUT, \
TARGET_SCHED, \
TARGET_VECTORIZE, \
Going on for, I kid you not, _80_lines_. So at first glance, the only way to figure out which of the 8 gazillion sub-macros results in a given field is to count the members of struct gcc_target in gcc/target.h and then count in to the corresponding line in TARGET_INITIALIZER. Then go track down what that macro does. All the while hoping that none of the initialization macros results in more than one structure (and there are a LOT of sub-structures in targetm).
Except that the first three of those macros each initialize large structures, and the fourth turns out to be the one I'm looking for. (Go figure, it's not part of a structure but at the top level.) So TARGET_SECTION_TYPE_FLAGS is #defined earlier in the file to default_section_type_flags... which is a function? It's in gcc/varasm.c as a single line wrapper around another function, default_section_type_flags_1 (I don't know why), and that sets it to either SECTION_CODE or SECTION_WRITE... Darn it, looks like I went down a strange blind alley again? Those are defined in gcc/output.h and don't mention endianness... That's for elf sections, I want the elf header.
Ok, I got on this trail because I added a #warning RUTABEGA right before the #define I need to add an #ifdef around, and when I cut and paste the first compiler invocation make spat out that produced that warning, removed its -o stanza and added -dM -E instead, one of the lines it spit out was:
#define TARGET_BIG_END ((target_flags & MASK_BIG_END) != 0)
Which looked promising. MASK_BIG_END is (1<<5) so that's not very useful, and I just traced target_flags to a dead end. Wheee. Either I missed a curve while tracing it through, or there's more than one target_flags (even though it's a global).
I hate the free software foundation. All of their code is like this. They never clean up and remove anything, they just make it bigger and more unnecessarily convoluted, with each release. I have wasted DAYS tracing through this crap. As usual, I already know the change I need to make and have no _clue_ how to get their code to do it sanely (or at least consistently).
This would be easier if it wasn't the compile time "string1" "string2" combining thing. You can't put runtime logic around any of that, because adjacent strings only concatenate automatically at commpile time; after that you have to allocate memory and do strcat().
Oh it _can't_ be that easy, can it?
Sigh. Should have known. This is FSF code. The correct response isn't to add stuff to it, the correct response is to rip stuff out:
--- gcc-core/gcc/config/arm/linux-elf.h 2009-04-04 23:41:52.000000000 -0500 +++ gcc-core2/gcc/config/arm/linux-elf.h 2009-04-05 04:36:41.000000000 -0500 @@ -36,7 +36,7 @@ #define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm6 -#define SUBTARGET_EXTRA_LINK_SPEC " -m armelf_linux -p" +#define SUBTARGET_EXTRA_LINK_SPEC " -p" #undef MULTILIB_DEFAULTS #define MULTILIB_DEFAULTS \
The linker knows what machine types it supports, and has a default which is correct. As long as we don't try to override that default, life is less screwed up.
(Did I mention that binutils was only nominally maintained by the FSF for many years, and _actually_ maintained by Cygnus, which was bought by Red Hat? They had their own fork and everything. This is probably why binutils is generally less stupid than code more actively intefered with by FSF zealots who couldn't code their way out of a paper bag yet are very firm about religious idology. Alas, the fork went to GPLv3 when the base did, and is thus useless.)
So yeah, arm big endian builds now. I should try to come up with a test environment for it...
Oh, and squashfs 4.0 came out. Need to make squashfs packaging work properly now...
So, a little _practical_ advice about the time warner thing. According to The Statesbeing, Austin does have another cable modem service provider, Grande Communications, which has explicitly stated they have no plans to cap bandwidth. The obvious thing to do is switch away from the idiots and start buying service from non-stupid people.
So it looks like the question becomes "how can we get out of our TWC contracts", and _that_ is a question best handled by small claims court or a class action suit if they're going to be stroppy.
The sad part is if they were _actually_ threatening to cap our bandwidth, I.E. slow down the connection once we'd passed a certain activity threshold, I don't think anybody would really mind. People are describing this as a cap, when it's actually "extra random charges for using the service you sold us for a flat fee". So if they let us download the first gigabyte each day at 3 megabits/second, then packet shaped us down to 128k/second after that (or perhaps some more gradual, less noticeable tail-off)... Well it would be _annoying_ but not reason for widescale organized protests. But no, they want the opportunity to present us with unexpected bills for $200 or more. They don't want to provide less service for what we pay them, they want to charge us more money for what they're giving us now. Potentially, 10 times as much. This is because they are GREEDY BASTARDS.
"You ate too much from the buffet, pay us three times what the sign says" is not going to win you a lot of repeat customers.
Phone TWC, turns out our contract's expired so we can switch at any time. Bad news: Grande doesn't service this location yet. (But they offer service two blocks north, and have another six months to install new lines, so here's hoping.)
Good to see grassroots mobilization against Time Warner's stupidity. It's also becoming a political issue. Lots more links here and here.
I repeat: Time Warner needs to pull back a bloody stump from this attempt. They won't learn if it doesn't hurt. Regulate the hell out of 'em, _and_ I'm looking around for other ISPs.
I already emailed the address in that last link to ask what their procedure is for getting out of our contract early. If they don't have one, or if they try to charge extra for it, that's grounds for a class action lawsuit right there...
Fade bought an Xbox 360 today. I see it as a Netflix viewer with HD capability for when we upgrade the TV. She actually plans to play games on it (although the guy at the store warned us that the Law Offices of Small and Limp, Esquire designed the thing with a milimeter or so of clearance between the laser and the surface of the platter, so if a cat walks by while it's got a disk in use it'll destroy the disk. Brilliant. I repeat: netflix viewer).
Considering that watching five movies a month in HD via netflix puts us over the bandwidth cap if we do _nothing_ else with the connection, leaving time warner becomes pretty much essential from a purely pragmatic standpoint.
Falling over now.
When I first heard that Time Warner was going to charge people extra for using too much bandwidth, I thought "april fool's joke". Alas, it isn't. They really _are_ being evil and stupid. Time to find a new ISP... (There are a number of dsl options.)
I'm sorry, but Time Warner needs to pull back a bloody stump from this, for educational purposes. (If it was just me, I'd cancel and be happy with my cell phone internet, but Fade needs a stable connection.)
Got email from Yann Morin today, who ready my March 7 blog entry and wondered if I wanted to discuss design issues with him. (I'm game, waiting to hear back if he wants to do it in email or on the crossgcc list.)
We have a couch. It is orange. I should take a picture of it.
Mark and I rented a u-haul, got the couch installed (a small phrase which contains a lot of incident), and then moved the rest of his stuff out of the old apartment into his new garage. (Most notably the washer and dryer.)
Now at Mark's pulling what's turning into another all-nighter, switching between working on the crosstool-ng patches Cisco wanted and getting FWL 0.9.6 ready for release. (I was hoping to have a FWL release out _before_ the end of the month, but as midnight approaches it's not looking likely.)
No I didn't pull two all-nighters in a row, I did an all-nigher sunday night, and now I'm pulling an all-nigher tuesday night. (Monday night was at home, Fade and I watched the rest of the Schoolhouse Rock DVD and )
It's a bit odd to be copying things I got working in FWL months ago into into a completely different open source toolchain project (which is also mostly a single person endeavor). The fact it took me about an hour to get FWL to produce such a toolchain and over a week to get crosstool-ng to do it doesn't enter into it, apparently. They want what they want, and are willing to pay to get what they want. I don't understand _why_ they want it, but it's their money...
I suspect I've been drinking too many energy drinks.
Very long day. Up overnight at Mark's last night, finishing up many things, then came home and slept a lot.
There's a release candidate set of binaries up at the new snapshots directory. We plan to start doing nightly builds, but it hasn't quite started yet.
Busy week. Mark and I got together yesterday and banged on FWL and GFS, and we're in pretty good shape for a release. Made a read only root filesystem work. Squashfs isn't working (needs updated userspace tools that aren't out yet), but in theory one tweak to download.sh and that's in.
Just wrote up the past 4 weeks of reports for FWL. Posting them to the list to give Mark something to put in the bloggy thing on impactlinux.com.
Lots and lots of little FWL tweaks preparing for a release. The static toolchains now build under qemu, in parallel even.
The 2.6.29 kernel's network flakes out under load. Nothing in dmesg, no obvious error. It just... stops, suddenly. Luckily, there's a fix. Here's hoping 2.6.29.1 ships by monday...
Ok, there are times when I wonder what other programmers are smoking.
An "archiver" is a type of program that combines a bunch of individual files into a single file. Tar and zip are examples of archivers. This is not a new concept.
The "genext2fs" and "mksquashfs" programs are essentially archivers, because they do what archivers do. But they're not _implemented_ as archivers, and thus their command line argument parsing is missing obvious functionality.
For example, with tar I can list a bunch of files and directories to put in the archive. If I want to rebase my root directory, there's the tar "C" option or I can "(cd dirname; tar blah blah blah) > filename.tar". (It's even smart enough to spit the progress indicator to stderr so it doesn't wind up redirected into the tarball.) This functionality is many years old, and quite standardized.
But genext2fs takes exactly one input source: a directory. That's it. You can't feed it a list of files, you can't specify more than one directory, and it does the "cd into that directory so the directory itself doesn't show up in the output" thing without giving you the option for it _not_ to do that.
The mksquashfs program is less stupid. You can specify multiple input files and directories, but everything you specify on the command line gets squashed to the top level directory. I.E. if you specify "build/sources" it tries to put it as "sources" at the top level. That's not how archivers work.
Of course this isn't nearly as weird as when I'm trying to figure out what _I_ was thinking when I wrote code. Toybox patch broke again, so I have to untangle it and fix it. (Patch shouldn't be this fiddly.) I was most of the way through rewriting it to handle a patch it turned out I didn't need to apply. I shouldn't discard that work (because it addressed a real problem, just one that turned out not to be pressing), but I hadn't finished debugging it yet... Do I even still have the old test case? Wheee...
Much frowning at what TT.state means in various contexts. Managed to the state in patch_main() a local variable, which helped a lot. That leaves TT.state mostly being used by do_line()...
I have to cut a new toybox patch with the bugfixes to the "patch" command, and fix the resize2fs stuff so it doesn't screw up GFS. But tomorrow, I think...
Fade and I went to Lax today and bought a couch. It's orange, because the green ones just weren't as comfortable. (We can put a throw over it or something.)
I'd forgotten Konqueror's "Crash and take all tabs with you" behavior. It's sad new Ubuntu releases break more stuff than they fix, because it _does_ fix stuff. Still, Gnome. *shudder*
More testing, fixed a number of small bugs. Squashfs does not work, because the most recent release version of mksquashfs produces a squashfs 3.1 file and the kernel only supports squashfs 4.0. Sigh. (Also, it needs the misc filesystem config symbol to be enabled, I need to fix kconfig so that when KCONFIG_ALLCONFIG switches on a symbol, the menu containing that symbol also gets switched on. No point HAVING the symbol in ALLCONFIG, eh?
Finished the README and checked it in. Now banging on the static cross compiler auto-build script (which is 99% of the cron job). Lots of little corner cases...
It's 2:10 in the morning and IHOP is _full_. Biked here, but it's so loud my noise cancelling headphones can't keep up. (Yay exercise, anyway...)
Still poking at the FWL manifest file. When I first wrote do_readme() it was called from a file that didn't source include.sh (just functions.sh), so the PATH=build/host bit didn't come up. Calling it with the trimmed $PATH does not combine well with UNSTABLE support or fetching the mercurial revision of the build scripts.
Oh, hang on, this needs to go in download.sh, because that's where package versions are defined. It needs to go at the end, which means it won't get zapped by download.sh because download.sh's job will be to regenerate it.
Worried about Mark.
Spoke to the new mortgage guy today. Need to fill out a web form this evening. He's traveling tomorrow, but he might be able to get me a preapproval letter from the road. Aiming for a closing date of around April 20th.
Heard back about the ppc 440 board, some kind of glitch was found in the prototypes and they're fixing it before sending us one.
Ok, todo list for the release:
Ok, the new config entry you have to enable to get qemu application emulation to test run a hello world binary at the end of cross-compiler.sh is CROSS_SMOKE_TEST.
Ok, the sparc thing is because the linux 0.9.29 kernel unified the sparc 32 bit and 64 bit architectures. This broke uClibc the same way the x86/x86_64 unification did, because kernel_types.h in uClibc is too brittle for words (and I still don't understand why it reproduces chunks of asm/posix_types.h instead of just #including it).
Writing a MANIFEST file to the top level of mini-native turns out to be darn fiddly. I've already got a do_readme() in sources/functions.sh but the problem is that that to figure out what version of the actual FWL scripts we're building from, you need the "hg" command. Two problems with this: 1) hg might not be installed on the host, and there's no guarantee you're building in a mercurial repository instead of a downloaded tarball anyway, 2) even if it is there, host-tools.sh edits hg out of the $PATH.
Note that I can generate must of the _rest_ of the package versions even with a trimmed $PATH, because it's based on the packages/* filenames. (Except for the alt versions, which need either mercurial or subversion.) But knowing which FWL scripts built this system image seems kind of important.
I actually _can't_ solve the general case, because there are times when the info isn't available, so leaving this field blank sometimes is inevitable. For example, when you download a tarball snapshot from the mercurial web viewer, it includes a .hg_archival.txt file which contains the big long 320 bit hash code for the commit, but not the actual revision number. (And without mercurial and the repository you can't translate one to the other.) You're unlikely to have a mercurial repository without mercurial installed, so trying to parse data out of .hg is silly (and nontrivial anyway).
For release tarballs I can include a pregenerated MANIFEST with values adjusted by hand. (Where to put it's a bit iffy, can't be packages because it'd get deleted by cleanup_oldfiles, sources is now all stuff checked into source control, can't put it in build because "rm -rf build" is how you "make clean" on this project. Putting it at the top level is clutter but I'm not seeing a better alternative right now...)
As for building out of a repository, if you run ./host-tools.sh when there isn't a build/host directory, then we know that $PATH hasn't been adjusted to exclude hg so we can try to create a MANIFEST then. But that's kind of disgusting, because running host-tools.sh is supposed to be entirely optional. This would be a non-obvious side effect, plus it wouldn't know when to rebuild MANIFEST because package upgrades (or at least switching USE_UNSTABLE around) aren't tied to rebuilding build/host. The lifetime rules are all wrong. This is ugly.
I suppose that when there's a .hg directory in $TOP I can symlink hg into build/host. That's ugly too, but possibly _less_ ugly than the alternatives. Hmmm....
Sigh. I always get hung up on the small stuff, because that's usually where it's least clear what the best approach is.
Faxed an updated purchase agreement to my sister's realtor, upping the purchase price by $2k because we missed the closing date and the place is costing them money to keep. (So now it's $77k.)
I'm annoyed at my credit union, which strung me along for 3 weeks before noticing they're not certified to originate loans in the state of Minnesota.
My laptop is bluetooth associating with my cell phone again! Yay! (So the problem was that Ubuntu 8.10 is incompetent, and can't do things that Kubuntu 8.04 could just automaticall do from the gui. Gee, what a surprise.) I need to dig up my cell modem config and set up wvdial again, but that shouldn't be too hard. Need to edit the list from the 23rd to include installing the bluetooth package and setting this stuff up...
So current qemu-arm doesn't work unless you "echo 0 > /proc/sys/vm/mmap_min_addr", as root. The kernel broke it. Wheee. Meaning I need to add a config option for it, because it's a policy issue that FWL does not require root access on the host, ever.
And sparc was broken by the uClibc 0.9.30.1 upgrade. Fun.
The ppc440 board has yet to arrive.
I don't understand why "fiscal conservatives" vote Republican. The federal deficit got run up by Regan (among other things merging social security into the main budget and "investing" it all in treasury bonds, turning it from a retirement fund into our largest entitlement program), then Bush I spent more money in 4 years than Regan did in 8, then duh-bya borrowed unimaginable amounts of money from China, never vetoed a single spending measure, kept things like the wars in Afghanistan and Iraq off the main budget so it _looked_ smaller than it actually _was_.
In contrast, Clinton balanced the budget and actually paid it down. Obama's made reducing the deficit a priority and is current making sure we get a better bang for the buck even with crisis management. (The Democrats care what they spend money _on_. This isn't new.)
Which of these two groups are accomplishing what fiscal conservatives claim to beleive in? Why on _earth_ would they vote for the people who ran up the national debt? (And oversaw a series of entirely avoidable financial disasters from the whole enron/worldcom/arthur andersen collapse through the mortgage industry collapse, and no-bid contracts to Haliburton for everything from Iraq through Katrina.)
So I'm adding an option to build qemu to host-tools.sh, and it wants to use "strip" during install. Here's why that's problematic, starting with some backstory:
What host-tools.sh does is populate a directory (build/host) with host versions of the same build tools the target system will contain, and adjusts $PATH to point only to that directory. It also builds a few other things (like distcc and genext2fs) that may not be installed on the host. The reasons to do this are A) it provides evidence that the target system can probably successfully rebuild itself (since these tools are what it built with in the first place; if nothing else you find most problems early), B) it isolates the build from variations in host system, so you don't get different system images when building on ubuntu/fedora/gentoo, C) we're building everything from source, even the tools we build with. :)
The exception to this is the host toolchain. In order to build from source, you need something to compile _with_, and it's the host's job to provide a toolchain you can compile host binaries with. (We build a known cross compiler that produces _target_ binaries, but not for building host binaries. If the one supplied to us by the environment doesn't work, something is wrong.)
So instead of trying to build a host compiler from source, it creates symlinks to the existing one in build/host:
for i in ar as nm cc gcc make ld
do
[ ! -f "${HOSTTOOLS}/$i" ] &&
(ln -s `PATH="$OLDPATH" which $i` "${HOSTTOOLS}/$i" || dienow)
done
I.E. the seven binaries it's creating symlinks to are ar, as, nm, cc, gcc, make, and ld.
Notice it's _not_ creating a symlink to is the host's "strip". It doesn't build one from source, either. (It's in binutils.) This lack is intentional: a common cross mistake when cross compiling is to use the host's "strip" to strip target binaries. This can sort of work sometime, because usually your target's using ELF too (although it could be using another format like binflat), and on some targets the sections will match up. And on others you get subtle bugs that are a pain to track down (like the bugs I got when stripping the *.a and *.o files).
So if something we're cross compiling accidentally calls the host strip instead of the target strip, I _want_ the build to break so we notice the problem. Easy way to do that, don't have the host strip in the $PATH.
So I can add "strip" to build/host. It's easy. I just don't _want_ to, it's not there for a _reason_.
Except that qemu refuses to install without "strip". It's possible to build pre-stripped binaries (-s option to gcc), but qemu isn't doing that. It's possible to just install the binaries verbatim (with debug symbols), but qemu won't do that.
What qemu is doing is using the busybox "install" command with the -s option, which shells out to strip. I could patch busybox to not do that, but the way the patch infrastructure works is that setupfor patches the package every time, both the version we build for the host and the one for the target. The target's doing a native build, it has a native "strip", so using install -s is ok in that context and breaking it is bad.
I could temporarily add a symlink to "strip" right before qemu, and then remove it afterwards. That's too ugly for words. Not going there.
So I'm down to modifying how qemu installs. I can patch the qemu source to remove the -s, or I can just do the install by hand. Doing the install by hand has the benefit that I can skip installing the docs and stuff (which I really don't want in build/host anyway, that _should_ just be the executables except that qemu can't run without the pc-bios directory).
That's why I reimplemented qemu's install as a "find" and two instances of cp, and now you know.
The reasons I'm building qemu from source now is:
Because I can. (I.E. It's now possible to build qemu from source without requiring gcc 3.x on the host,)
Older version of qemu don't support lots of the targets we now make system images for.
The current release (0.10.1) needs patches to support powerpc and sh4.
Having it in build/host makes life easier for run-from-build.sh.
It turns out that the smoke test at the end of cross-compiler.sh (using qemu application emulation to run a target "hello world") hasn't worked for a _long_ time. (Oops. It skips it if the appropriate qemu target isn't installed, and if it's not in build/host cross compiler won't ever find it...)
I also note that host-tools.sh only builds qemu from source when HOST_BUILD_EXTRA=1. (It takes longer than building a complete system image, this sucker's expensive to compile.) If that variable isn't set, it symlinks it from the host the way the host toolchain is.
Ok, reinstalled my laptop with Kubuntu 8.04 LTS. (Because Ubuntu 8.10 refused to unhork itself, and it now has so many redundant and conflicting layers of unnecessary infrastructure that I don't have a _clue_ what actually triggered its descent into madness.)
The checklist for turning a fresh install into something useful:
Sigh. Done... And kmail has been hung trying to launch for 10 minutes. (Eating 100% cpu, albeit only on one processor.) That's probably not a good sign... Nope, it worked its way through. Regenerating the indexes, perhaps?
The 2.6.29 kernel and qemu 0.10.1 both dropped while I was out. Of course.
I'm trying to figure out if I hate SELinux or Ubuntu more. Last night, in the middle of some light web surfing and programming (as my normal user, not root), my laptop decided to go nuts, with the video card showing snow. A quick hard boot later, and everything seemed well... except that I couldn't talk to the network. Suspecting a heat problem, I gave it the night to cool off, and now it's morning and the network problem hasn't changed.
The _weird_ part is that the wireless card is associating with the access point, and can see the ~2 dozen other access points in the area, so it's both sending and receiving fine at the hardware level. Dropping down to root, I try to ping the access point:
root@driftwood:~# ping 192.168.2.1 PING 192.168.2.1 (192.168.2.1) 56(84) bytes of data. ping: sendmsg: Operation not permitted ping: sendmsg: Operation not permitted
That's as root. I can't sendmsg _as_root_. What the? When I'm logged in as root, I can format the hard drive. I'd BETTER be able to talk to the network.
Possibly it's the network card giving bad errors. Intel's wireless driver still has a horrible binary blob, last I checked. And it's crapping all over dmesg:
[ 16.469066] iwl3945: Intel(R) PRO/Wireless 3945ABG/BG Network Connection driver for Linux, 1.2.26ks [ 16.469074] iwl3945: Copyright(c) 2003-2008 Intel Corporation [ 16.469224] iwl3945 0000:0b:00.0: PCI INT A -> GSI 16 (level, low) -> IRQ 16 [ 16.469244] iwl3945 0000:0b:00.0: setting latency timer to 64 [ 16.469277] iwl3945: Detected Intel Wireless WiFi Link 3945ABG [ 16.677223] iwl3945: Tunable channels: 11 802.11bg, 13 802.11a channels [ 16.696606] phy0: Selected rate control algorithm 'iwl-3945-rs' [ 17.072806] iwl3945 0000:0b:00.0: PCI INT A disabled ... [ 71.102667] wlan0: associate with AP 00:18:f8:ef:8f:44 [ 71.109791] wlan0: authenticate with AP 00:1a:70:80:4a:53 [ 71.112691] wlan0: authenticate with AP 00:1a:70:80:4a:53 [ 71.112713] wlan0: authenticated [ 71.112719] wlan0: associate with AP 00:1a:70:80:4a:53 [ 71.312096] wlan0: associate with AP 00:1a:70:80:4a:53 [ 71.315455] wlan0: RX AssocResp from 00:1a:70:80:4a:53 (capab=0x401 status=0 aid=1) [ 71.315464] wlan0: associated [ 72.445119] IN= OUT=wlan0 SRC=192.168.2.100 DST=224.0.0.22 LEN=40 TOS=0x00 PREC=0xC0 TTL=1 ID=0 DF PROTO=2 [ 72.504279] IN= OUT=wlan0 SRC=192.168.2.100 DST=224.0.0.251 LEN=144 TOS=0x00 PREC=0x00 TTL=255 ID=0 DF PROTO=UDP SPT=5353 DPT=5353 LEN=124 [ 72.524281] IN= OUT=wlan0 SRC=192.168.2.100 DST=224.0.0.251 LEN=351 TOS=0x00 PREC=0x00 TTL=255 ID=0 DF PROTO=UDP SPT=5353 DPT=5353 LEN=331 [ 72.780310] IN= OUT=wlan0 SRC=192.168.2.100 DST=224.0.0.251 LEN=351 TOS=0x00 PREC=0x00 TTL=255 ID=0 DF PROTO=UDP SPT=5353 DPT=5353 LEN=331 [ 73.036289] IN= OUT=wlan0 SRC=192.168.2.100 DST=224.0.0.251 LEN=351 TOS=0x00 PREC=0x00 TTL=255 ID=0 DF PROTO=UDP SPT=5353 DPT=5353 LEN=331 [ 73.236524] IN= OUT=wlan0 SRC=192.168.2.100 DST=224.0.0.251 LEN=327 TOS=0x00 PREC=0x00 TTL=255 ID=0 DF PROTO=UDP SPT=5353 DPT=5353 LEN=307
And so on for quite some time. As far as I can tell, that's a log of all the packets userspace tried to send and got permission denied for. (I can only assume this is the stupid selinux permission stuff. I haven't figured out how to switch it _off_ yet. I haven't go the selinux userspace packages _installed_. I may need to reinstall at this point.)
Off to Mark's to grab a boot CD and rule out a hardware problem, although the fact dhclient can get a dhcp address would seem to do at least some of that...
So I want to make build-static-toolchains.sh run multiple qemu instances in parallel. It should be possible to make hda read only, provide a separate hdb for each instance, and even run genext2fs on build/sources to create a read-only hdc.
There's a couple infrastructure problems here. The first is that FWL has a bad relationship with mke2fs, tune2fs, and fsck.ext2. Busybox no longer provides them (it did circa 1.2.2, but the implementations were horrible and got removed). It's currently only used by run-from-build.sh, and I really don't want to suck in e2fsprogs in host-tools.sh for that. But gentoo doesn't put /usr/sbin in a normal user's $PATH, and that's where they live, so I have to jump through hoops to access them. Right now said ugly hoop jumping (adding /sbin:/usr/sbin to $PATH if mke2fs isn't found) is limited to run-from-build.sh, but the need for multiple hdb instances is a second use for this.
So I can't rely on them being easily accessible on the host, I don't want to build e2fsprogs in host-tools.sh. The long term fix is to add them to the lua toybox, but that's not immediately useful.
I could move the $PATH mangling to sources/include.sh (grab those three binaries the way I grab the host toolchain), but the adjusted path in build/host doesn't contain qemu. (Now that 0.10.0 builds with gcc 4 I'm pondering adding qemu back to host-tools.sh, but that's a separate issue.) Adding things to $OLDPATH is ugly because then it's not the old path anymore.
The OLDPATH thing is actually kind of annoying because I need to use genext2fs and qemu from the same context in build-static-toolchains.sh, and right now no $PATH is guaranteed to have both of those. Sigh. I could get away with this before, but it was wrong and it's coming back to bite me. And to be honest, right now I need to apply two patches to qemu 0.10.0 (to get ppc and sh4 working)... Ok, time to clean up host-tools.sh.
It turns out Grischka is using a
Hmmm... Building qemu in build/host is nontrivial, because qemu wants to install a pc-bios directory and needs to know where to find it. (Which means that you provide a $prefix and it throws stuff under there. I want the binaries to go in "build/host" and it wants to put them in "$prefix/bin".) There isn't currently really a place to _put_ the pc-bios directory. I could compensate by supplying -L to qemu, but then it has to know if it's running from host-tools.sh or from the host system. (I suppose I could throw logic to detect this case into run-from-build.sh, but what I'm trying to do here is simplify that...)
Maybe having a build/host/pc-bios directory isn't _too_ disgusting. (It means the qemu we build would have a hardwired absolute path, but build/host never really claimed to be relocatable, did it?) I'm not sure what happens if you try to run "pc-bios" out of $PATH if it's a directory. Shouldn't come up much, but still...
Also, the qemu build is _long_, and hugely memory intensive. (Mostly due to translate.c, which causes cc1 to peak at over 20% memory usage on my laptop according to top, which is about 400 per instance. When two of 'em happen at once with -j 2, the sucker can go totally swap happy.) If all you want to do is build a cross compiler or a system image, and not run the result locally, building that is painful...
Ok, just built it with -j 2, with 728 megs free according to /proc/meminfo so the sucker has no excuse to swap. Totem is eating 12% of one CPU (catching up on my podcasts, currently countdown), and the system otherwise idle. (Killed npviewer.bin just to be sure.) How long does qemu 0.10.0 take to build...
real 16m42.256s user 26m51.669s sys 1m55.315s
Yeah, that's about how long it takes to run the entire rest of the build. If this goes into host tools, it needs a config option. (Darn it, symlinking all the qemu-system-* into build/host is being evil. Tab completion can give me a list of everything in $PATH starting with a known prefix, ala "qemu-system-[tab][tab]". But doing this from the command line... How? I can't do it with "which", can't do it with "whereis". I suppose I can run the $PATH through sed and iterate, but that's kind of disgusting...
Sigh. Actually implementing this is easy. Figuring what the right thing to do actually is: hard.
Went outside and painted over the fresh grafitti in the alley. Got a mild case of heatstroke and sunburn (remembered that Fade's bike had some spray sunblock on it after about an hour of painting in direct Texas sunlight), managed to whack the front of my right shin quite impressively in the process (they can swell up; good to know), got paint all over one of the dining chairs, destroyed two paintbrushes, and destroyed our broom. But I got it done, and I'm pretty happy with the result. (I'm getting better at this, hopefully next time I have to do it it won't take 2 hours and will cause less collateral damage. 1pm was not the optimal time to start this, even in March. Diet Rockstar energy drink was not the optimal beverage to stay hydrated, switching to tea for the second half worked much better. Oh, and we still don't have duct tape but we _do_ have blue painter's tape. My leg hurts.)
I want to up Netflix to at least 4 disks. (Mark has 8, it apparently costs him $45/month which is what he was spending on cable.) There are tons of Doctor Who DVDs out now, including some really good episodes I want to show Fade. (Invasion of Time is out! Woo!). Especially since Hulu started being stupid with blatant watermarks over the video you're trying to watch. (Ok, Fade can watch a lot of these videos online on her mac. I expect that'll be really nice in about 3-5 years. But for right now having more disks to choose from means we'd watch them more often.)
Looking at the non-credit courses at UT. Turns out the second wave of them start right after spring break, I.E. next week. This means I didn't wmiss the remedial scribbling class I wanted to take (ahem, "Drawing I), it starts tuesday. I'm also interested in "Aerobics - Lunchtime" (1010.601, 18 meetings, MWF Mar 30-May 8, 12-1 pm). I'm a bit confused about "Xtreme Abs", which claims to run from 7:30-7:45 twice a week. 15 minutes? Um... ok? I wonder if Fade would be interested in the Ballroom Dance class (two sections, one meets mondays and one meets wednesdays, both starting next week). I might be interested in "Japanese for beginners" if it wasn't the same time as the drawing I course.
Watching various Ted talks. Adam Savage is geekier than me, and I am deeply impressed. It's interesting that Don Norman has wandered from usability to aesthetics, but the talk was so-so. Dan Ariely is a behavioral economist, which is a specialization I didn't even know existed, and gave a _marvelous_ talk. I also really liked Dan Gilbert's (long) talk about how everybody sucks at math in the real world (enumerating common mistakes).
Sigh. A large "Viz Media" watermark has shown up over all the bleach episodes on Hulu. I don't know when this started (it wasn't there last time I was watching them), but it's intrusive and distracting, and after an episode and a half I realized it's taken all the fun out of watching them. And since I refuse to reward the importer by giving them money for making something more annoying, I guess that means either give up on the series or track down fan subs on bittorrent. (I actually prefer to watch this legally... up until the point where they get abusive.)
Darn it, Hulu's doing it for everything now, including The Colbert Report. Well that sucks. So much for watching things on hulu. (They have a whole page to put stuff on, and they feel the need to obscure the video itself. That's too stupid to live. Yes, the watermark is far more annoying than the commercials are. I choose to watch the commercials to support the people legally providing me with the video, but standing between me and the video when I'm trying to watch something is just RUDE.) I can watch ted talks and msnbc's podcasts and all sorts of other stuff WITHOUT prominent annoying watermarks.
Ok, so it's not viz being stupid, it's hulu being stupid. So check netflix and see if bleach is there... Yup, 16 disks. Ok, add that to the queue (I've seen several of them already, but Fade hasn't). And worry about it later.
SxSW is over and I didn't see a bit of it. Andrea headed out around midnight. I was having bad sinus trouble so she gave me a sudafed, warning me it might keep me awake, which instead put me to sleep.
The qemu 0.10.0 release doesn't work out of the box for powerpc or sh4. The patch for sh4 -append hasn't been merged yet, but is easy to apply. The powepc issue I tracked down yesterday is something in openbios. A workaround is to skip -nographic, but that makes the emulator much less useful because you can't script it through stdin/stdout.
Greg Ungerer's done a marvelous job hand-holding a git newbie like me. (Ok, I didn't know how to fetch a branch. It hadn't come up before.) Confirmed his m68k fix works, and hopefully it'll make it into 2.6.29.
The sh4 native building issue was fixed by narrowing --strip-unneeded. That was a weird symptom, but it explains why the cross compiler worked but the native compiler didn't.
Finally got Stephen Dawkins' 610 kernel tested (he hasn't got a debug adapter so he sent me a kernel to test with mine... back on the 10th. Oops.) It didn't work. In theory you can tftp new firmware into a router that's in the process of booting, it stops and waits about 3 seconds for you to do this, then continues booting with the firmware it's got if you don't. In practice, I've never managed to hit the window (not that I'm sure I'm even attempting it correctly).
Catching up on my podcasts, watching Rachel Maddow's February 16th show (yeah, a touch behind) where she's covering Kim Jong Il's birthday. Am I the only one amused that the miracles the government of North Korea is attributing to Kim Jong Il (his birth caused pear and apricot trees to sprout in winter, and this year his birthday created a halo around the moon) are pretty much the same as the Roman government attributed to Jesus (he smote a fig tree and his birth was marked by a star). Then again I categorize "the mother of all battles" and El Shrubbo's "mission accomplished" banner together. Obviously, all this propoganda is the result of Intelligent Design, by His Noodly Appendage.
It occurs to me that around half the eating I do is for social reasons. I went out to dinner with with Andrea at Whataburger last night (having just cooked and eaten chicken), I'm meeting Mark for dinner at Texadelphia (having just eaten leftover chicken and an apple), I regularly enjoy going out to restaurants with Fade, biking out after midnight the only places that are open are restaurants...
So, according to qemu svn 6658, the OpenBios image got updated from OpenBios svn 450 to OpenBios svn 463. So how do you build openbios? Hmmm, let's see, no ./configure, the README says it's config/scripts/switch-arch, which supports "cross-ppc". Ok, try that and run make. (I haven't supplied a cross compiler yet but presumably it'll complain when it gets to that point...) And it builds fourth stuff for a while, and then dies with:
Building OpenBIOS on amd64 for ppc Building...error: tail: cannot open `/build.log' for reading: No such file or directory make: *** [build] Error 1
Well of course it can't access a file out of the root directory, I'm running the build as a normal user. And V=1 does nothing. No obvious way to make it verbose, actually, so time to grep for occurrences of "build.log" in the source... Ah, the bug is actually that the error reporting tries to "tail $$$dir/build.log", and that dir should only have two $ on it. Queue up an email to blue swirl about it, fix my local copy, and... It's looking for powerpc-linux-gnu-gcc, and it's getting that from the TARGET=powerc-linux-gnu- prefix in config/examples/cross-ppc_rules.xml... and there isn't an obvious way to override it at configure time. It's generating obj-ppc/Makefile but calling it via recursive make so overriding it on the make command line won't even work. Great. Ok, edit my copy to be just powerpc-, make clean, re-configure, set the $PATH to point to the powerpc cross compiler, re-run the build, and...
Wow, I think it worked. (I usually expect packages to put up WAY more of a fight...) obj-ppc/openbios-qemu.elf is 271368 bytes, the 1.0 release version in qemu is 271336 bytes and "file" says it's a 32-bit ppc ELF...
Biked to the north Chick-fil-a location last night. Adrienne called (locked out) while I was there. It's at least an hour and a half bike ride each way (closer to 2) so she drove up to get the key. I only got about 45 minutes of work done because they closed at 10, but yay exercise.
Thinking of biking to the south chick-fil-a location today. Made it as far as the Starbucks on 15th street.
Mark fingered the --strip-unneeded line as screwing up all sorts of stuff. In his case, breaking the ncurses build. In my case, it's the reason static linking wasn't working. (It might also be the reason that sh4 wasn't able to compile anything, but I can't be sure because qemu 0.10.0 won't run sh4 either. I vaguely recall I'd patched something in qemu to make it work, need to track down and redo that...)
Ok, installed svn on securitybreach, and now binary searching to see where qemu broke powerpc. Let's see, 6591 works, 6776 is broken, 6650 works... It's svn 6658 that broke it. Poked the #qemu channel on freenode and the qemu mailing list. Apparently it only breaks -nographic. Go figure.
Huh. So Dell responded to the Macbook Air by coming out with the Dell Adamo, a system which costs $200 more than the Macbook, has a slower processor, less powerful graphics chip, weighs a pound more, is slightly wider, /bin/bash: indent: command not found
I've been dropping "span" tags in my blog for something like a year now, meaning to write a cgi filter that'll actually use 'em, and for some reason today I keep doing "spam" tags instead. (Blame my email...)
Interesting. Time magazine estimates that if California legalized pot, it could balance their state budget by $2.3 billion/year. That's $1.3 in tax revenue and $1 billion saved in enforcement. (It's california's most lucrative agricultural crop, earning $14 billion/year.) Legalization would be personally inconvenient since I continue to be allergic to the stuff, but other than that it seems kind of obvious, possibly inevitable.
Dropped Adrienne off at SxSW this morning (she overslept; I simply hadn't set the alarm), then returned yet another fax to my sister's realtor, and now hanging out at the coffee shop next to Kinko's on 26th street. The barista is _stunningly_ cute. (Somewhat distracting, actually.)
Wendy at the credit union poked me about hazard insurance for Kris's new house, and I phoned and left a message with the Nationwide office on Far West.
Tested a new m68k tree from Greg Ungerer. Didn't fix the problem (uClibc build dies trying to generate the syscall list due to headers exported by make headers_install #including files it didn't install), but I got him the error message and hope for a reply.
Replied to an email about my tinycc fork (unrelated to resubscribing to the mailing list, this is a college professor at Tufts who says he and his postdoc wanted to hook my old fork up to a different backend. Could be interesting. (I still think qemu's tcg is the logical backend for the thing, but _any_ work to genericize it so the frontend and backend talk through some kind of defined interface can only help matters.)
Critiqued Pavel Machek's filesystem requirements documentation some more.
Wrote up a quick summary of last week's 440 work and sent it to Mark so he can do Impact Linux invoicing.
Heard back from the insurance guy, need to talk to an insurance guy in Minnesota. Right, called him, gave him the contact info for the mortgage lady so she can tell him what kind of insurance I need.
Tracking down how I broke the powerpc target, checking the revision history and building old versions until I find the one that doesn't work. (This would go faster if I didn't keep running out of disk space. Yeah, I managed to fill up the new bigger drive.)
I'd hoped to go to some of the free SxSW interactive parties tonight, but after being beaten to death by interrupts over the weekend I just haven't got the energy. Might go bike to someplace to huddle with my laptop...
Didn't get to update my blog yesterday. It's 8pm and I'm keeping Mark waiting while I stop at a restaurant to eat for the first time today.
Too overscheduled. Really in danger of burning out. I am now officially swap thrashing. I spend so much time being interrupted and context switching that I'm getting NOTHING DONE.
Adrienne's visiting and I have no time to spend with her. She's free for dinner tonight as soon as she finishes her nap; she came back from the conference exhausted. She's skipping the SxSW parties tonight, many of which I could go to if I had time because they're free. I really wanted to see the vintage coin-op video arcade they had (free to everybody, no badge required) at the convention center, but I never had time and it was only there for three days ending today.
Fade made it off to the airport early this morning. I didn't get to spend a lot of time with her this week, but she's only gone for a week.
Mark's wanted to meet me every evening for four days now (both because he needed help moving slightly _farther_ out of town, and because he needs help with a big documentation task Cisco assigned him with; Mark doesn't really do documentation). He's my friend and I want to spend time with him, and the technical stuff is even billable time, but with traffic it's an hour drive each way to his apartment. (Between errands, visiting Mark, driving Adrienne around, and driving Fade around, I've gone through an entire tank of gas this week. That's kind of unusual.)
I'd hoped Adrienne's visit would inspire me to clean the condo (which would have helped Fade's pre-trip stress too), and I did manage a couple hours, but I just didn't have time to finish it.
The mortgage on my sister's new house was approved, although the closing had to be rescheduled for sometime later this month (I forget when, but it's not this week and I think it's in my email). I need to go get some kind of house insurance ASAP (I forget what kind, but it's in my email). Still haven't manage to do so, maybe I'll find time tomorrow. (I need to call Kris and see how she's doing. Maybe I'll find time tomorrow.)
I've haven't had a chance to open the Lua book since the last time I wrote about it. Yes I know Gentoo From Scratch is blocked on a new useradd (because mark doesn't want to install an old version of shadow utils for some reason) and useradd is a toybox thing and toybox is blocked on me learning lua to rewrite it. I'd _love_ to have time to learn lua this week. It's very hard to do in 15 minute increments. Maybe I'll find time tomorrow.
Spamalot was in town all this past week and I missed it. I missed David Schwimmer mocking Showgirls at the drafthouse. I missed the start of the drawing class at UT I wanted to take this semester. Lawrence Lessig is in town for SxSW, maybe I'll find time to meet him tomorrow.
I've made trivial progress tackling my todo list for the FWL 0.9.6 release I wanted to do tomorrow. Maybe I'll find time tomorrow.
Went out to Whataburger last night and carved out a couple hours to poke at the 440 toolchain, because I'll have to do a progress report about that tomorrow. (I'm calling this week half-time because even with poking at two different crosstool variants I can't say I managed more than 20 hours.) I duct taped something into a FWL target that _might_ look like 440 toolchain in the right light, and fired up "qemu-system-ppc -M bamboo", and found out that the 440 processor isn't _implemented_. It's just a stub, the bamboo board just emulates the system-on-chip peripherals and otherwise uses a 405 processor emulation. (I'm embarassed this took me until yesterday to discover, but I didn't have anything to _test_ before then.)
I'd love to go visit the doctor to get antibiotics for the sinus infection that's preventing me from sleeping for more than a couple hours at a time. I've meant to go ever since I got back from Pennsylvania. (Of course the paperwork for better health insurance never got filled out anyway.) Maybe I'll find time for both tomorrow.
There are so many other things that have fallen through the cracks. Solar asked me to cut new FWL binaries on friday, and Vladmir Dronnikov's wanted those for months. Haven't found time. I need to set up the nightly build cron job, which means I need to fix static linking, see "FWL todo list" above. It's just a simple binary search regression test, I could sit down and figure it out in an hour or so. (Might be when I fiddled with the wrapper, might be when I started stripping the libraries.) And the m68k guys sent me a link to an atari emulutor that can apparently run a m68k kernel (aranym.org) but I haven't looked at it yet, nor have I followed up on the m68k headers_install issue in 2.6.29. Maybe I'll find time tomorrow.
I need to poke Eric about the C++ paper (he says he emailed me a draft earlier this week, but I didn't get it, and he's not getting my email either; sounds like a local delivery routing issue on grelber we need to track down). I haven't been to Starbucks in weeks. I need to get some exercise, and a haircut. My current car insurance card expired on the 5th (I think they sent us a new one, but dunno where it is). I need to hire a lawyer to show that Stafford idiots that when they gave me a "failure to show proof of insurance" ticket I did, in fact, have insurance (the card fell under the passenger seat). I need to deliver those shirts to Reese. I haven't spoken to Stu in weeks, I need to resubmit the perl removal patches, I may _never_ get QEMU weekly news updated...
Sigh. I don't even REMEMBER most of the things I have to do, they're just piling up into a big wave. But Mark called, and I guess I've kept him waiting long enough. Off to do documentation...
Ok, got some documentation edited over at Mark's, took Adrienne to dinner around 1 AM at the 24 hour IHOP (after visiting a 24 hour wal-mart and walgreens trying to find a supplemental battery pack for her smart phone), going to bed in hopes of getting up early in the morning and tackling backlog. May just turn my phone _off_ all day to avoid interruptions.
Lua books (2): check. Roxette "Look Sharp" album (to which I learned C): ripped, converted to mp3, and shoehorned into rockbox (which has the most horrible user interface, but oh well). Soda refills (Einstein's this time): check.
Not a bad language, really. It's firmly in the whitespace agnostic camp, not even requiring semicolons (which to be honest, aren't usually needed in C either; the compiler tells you when you've dropped one). It uses "end" in place of closing curly brackets, and makes it mandatory instead of having magic single line contexts after if statements and such. 21 reserved keywords. -- starts a single line comment, --[[ and --]] are multi-line comments. Variables are created by assigning to them, and reading a nonexistent variable return "nil" (instead of throwing an exception, ala Python).
I love this Album. Yeah it's old, but it's great to program to. (Joyride's ok too.)
Ok, I'm to section 1.3 in "Programming in Lua" and I've hit the first place I want to smack the author: "Global variables do not need declarations. You simply assign a value to a global variable to create it... if your variable is going to have a short life, you should use a local variable." Ok, _HOW_? YOU'VE NEVER MENTIONED LOCAL VARIABLES BEFORE NOW. This section offers no way to distinguish between local and global variables. I'm GUESSING it's a scope issue, but that's just a guess. Throwing me a forward reference here would be very reassuring; the author did not do this.
Wow Rockbox really is a horrible music player. (It works fine, it's just a pain to pause and unpause when I get a soda refill. Plus putting music _into_ it requires an act of congress.) I miss the KDE one. After several months of daily use, I think I can confidently say that I hate everything about Gnome. (I still have my little orange "iPod Klepto" around here somewhere, but apparently it's not in my backpack. Presumably in the car. Bit fiddly to use my giant noise cancelling headphones with a device that's maybe 1/20th their size, but it's got the "big prominent pause button" thing down. Hopefully there's a way to get it to play things in order rather than random shuffle. I'll have to look into it.)
Dear Gnome console developers: putting the close button for the last tab right above to the up arrow for the scroll bar is DEEPLY STUPID. The Konsole people figured out not to do that _years_ ago, and I just closed 3 tabs I wanted to keep in a slightly misaligned attempt to scroll up. (This is unrelated to the above statement that I hate everything about Gnome, which predated me doing this.)
The original crosstool only _claims_ to have support for the 440. If you actually try to build it, the thing breaks trying to build the first package (gcc 3.3.6, which is _really_ strange because I _told_ it to build gcc 4.1.1, which is the latest version it has). Looked at its config and it _seems_ the magic is --with-cpu=440 for gcc. Dunno if I need to tell binutils something (it didn't try to build binutils before trying to build gcc 3.3.6... I don't get it either).
Broke down and resubscribed to the tcc mailing list a couple days back to ask if CVS was dead yet. No official response so far, but I replied to the one guy who commented with a big long rant about what tcc SHOULD be doing. (Do the busybox swiss-army-executable thing and replace binutils, grab TCG from QEMU and use it as your code generator, clean up the path mess, try to build real packages... The usual. The kind of things I was working on when I left. Progress made so far: zero. Oh well.) They'll probably say CVS isn't dead, and then I'll go away for 6 months again. It's a bit like groundhogs day: I pop my head up, see CVS, and go away for 6 more months.
Once again searching for a 68k emualtor to run the m68k target on, since qemu's 68k support is just coldfire. I found the "uae" and "xmess-x" packages in Ubuntu, which in theory might both be able to load and run a 68k Linux kernel, but both projects are too insular to actually have obvious contact info for anybody I can ask about them. The m68k linux site is all about using real hardware, and doesn't mention a single emulator. Sad, really...
Punt that as a tangent I haven't got time for right now, focus back on clearing the deck for the new ppc440 target.
Downloaded the original crosstool, which already has 440 support, albeit only for glibc and last updated ~3 years ago.
The last time I tried to get gcc 4.2 working was over a year ago, but I seem to be making the same mistakes in the same order. (Up to and including setting ac_cv_path_RANLIB_FOR_TARGET="$ARCH-ar" instead of $ARCH-ranlib.) Oh well, I vaguely recall the debugging steps I did last time, so it's not taking nearly so long to fix. (Checking my old blog doesn't help, the granularity of what I blathered about wasn't high enough. I thought I had the old patch saved somewhere, but if so I can't find it.)
I'm pretty happy staying with gcc 4.2.1 until a gcc alternative comes around because the FSF seems to have gone completely insane:
We are also concerned about recent attempts to implement the C front-end of gcc in C++. We believe that is a bad decision in general (due to demanding C++ as bootstrapping environment) and would like to get rid of the gcc dependency for these reasons.
You'd think even the FSF wouldn't be crazy enough to rewrite their C compiler in C++, but you'd be wrong...
Sigh. Once again, moving to gcc 4.2.1 fails to fix _anything_. The "duplicate .personality directive" thing with arm eabi is still there, now m68k is broken... No, that was broken by the 2.6.29-rc7 kernel.
Note to self: updating multiple things at once is a bad way to debug anything. Fix stuff and commit it, THEN upgrade the next thing. (This is why I'm holding off on moving sources/packages up a level so "sources" is all stuff stored in mercurial without other files mixed in there.)
Trying to close down for a FWL release, but I still need to install 4.2.1, get the 2.6.29 kernel working smoothly, fix arm eabi, fix sh4 native building, fix native static linking (which is blocking the nightly cron job), fix the "new" pthreads implementation in uClibc, add a PPC440 (bamboo) board, fix sparc, redo the USE_UNSTABLE stuff, move sources/packages up a level, make sure uClibc 0.9.30.1 didn't break anything...
My tax appointment turns out ot be at 2pm, not 10am. Oh well, it means I got Fade up in time for class even though the power apparently went out last night and the alarm clock was all flashy this morning.
I do not understand Firefox. When I type into the URL bar it has a pulldown guessing things I might want to do based on browser history. (This is fine, Konqueror's been doing this for me for 5 years, I'm glad they caught up.) But when I hit "d" (and nothing else), its first suggestion is "http://freefall.purrsia.com" which hasn't got a d in it. (It's one of the ~2 dozen webcomics I follow.) The description for that is "Freefall 01702 March 9, 2009" which hasn't got a d in it either. This entry is by no means the most frequently visited site I go to (it only updates monday/wednesday/friday, Schlock Mercenary updates every day including sundays), it's neither the first nor the last entry in my daily webcomic trawl, (it's usually after Misfile and Questionable Content but before Girl Genius and Irregular Webcomic... none of those are on the list it shows.)
The second entry is www.wapsisquare.com, which hasn't got a d in it either but the title string it remembers is from Friday which has a d (and that d is underlined by the dropdown thing)...
Sad, really. That's got a d in it too.
Yay, managed to panic the kernel and reboot my laptop. (Once again, the ipw3945 driver went catatonic, and an rmmod/insmod cycle brought the whole thing down. I realize it's now called "ipl3945", but am ignoring it because the rename was pointless and stupid. It's the Intel Pro Wireless 3945. That's the product's name. I don't care if Intel calls it the Purple Gorilla, I just want CONSISTENCY.)
I wonder if anybody's written a sequel to Fear of Forking incorporating the effect of distributed source control. With new tools, the friction of moving patches between trees is greatly reduced, allowing properly managed forks to diverge farther before resyncing between them becomes problematic. (This has sped up development considerably.)
I also wonder if anybody's written a proper text essay covering the points in the time based releases video. It's a great talk, but it takes an hour to watch; a good text version could convey the information much more concisely.
For both of the above, read "I wonder if anybody's written" as "I hope I'm not going to have to write this up myself, because I haven't got time for this."
The Donald's is offering free cinnamon rolls with any "McCafe" purchase on Wednesday. Still trying to strap rockets to that pig and get it airborne...
Sigh. I have an adversarial relationship with cash. Last night (this morning?) when I biked to Ihop at 3am, I had a $20 bill left over when I left. I have no idea where it's gone. Using my debit card to buy the 2 for $1 apple pies seems _silly_, but...
I keep forgetting about various things I've done until something reminds me of them. (No, I'm not talking about finally having picked up my new glasses from the mall, although they are nice.) I emailed Mark a link to my 3 waves articles (linked from the end of this page) due to a conversation we had on Friday. It's an ancient thing that I just assume my friends already know about, but apparently not.I haven't written for The Motley Fool in almost a decade, don't have anything to do with Penguicon anymore, haven't done much with Liquid Nitrogen in a couple years, am not currently involved in any intellectual property lawsuits that I'm aware of, haven't taught college courses in a long time, and so on. (Oh, and my chain mail making equipment keeps getting taken out of my backpack every time I go flying somewhere, just remembered and put it back.) I don't sing or play the piano anymore.
Of course I start new things all the time too. Busybox is receeding into ancient history, but toybox is likely to get relaunched in Lua once the books mark ordered come in.
I'm also pondering writing a webcomic. I can't draw, but that doesn't seem to be a requirement (at least not initially, and even the ones who could draw tend to improve. And sometimes they could draw some things better than others, and there are some obvious ways to cheat...)
Still, huge time commitment. Goes on the todo heap. (Been on the todo heap for years, but Penguicon was on the todo heap for 3 years before it actually happened.)I should catch up on this first, though. And find somebody to hand this old thing off to.
Speaking of which, if I was still involved with Penguicon I'd try to get Lawrence Lessig and John Conyers on a panel to talk about copyright. The reason that's particularly relevant is that Conyers is a congressman from Michigan's 14th district (I.E. Detroit), so if the Penguicon guys wanted to lobby against him in the primary it would _mean_ something, so he'd want to listen to them. And Lessig would want to bend his ear something fierce, and that would be worth seeing.
But I doubt the current lot would think of it, or bother to do anything about it if they did. Oh well.
Today while emailing the Armadillocon panels guy, I wound up looking at some of the comments about the video of me throwing Liquid nitrogen into a swimming pool years ago. Back when the Penguicon concom were doing the "Oh no, nitrogen, it'll kill us all" thing (hint: before it was deployed at Penguicon, which was after we'd done it at Linucon _twice_) I wrote up an analysis of how dangerous it really is, at least from a suffocation standpoint. (Summary: not as much as you'd think, although you can always drown in your bathtub if you try.)
It's amazing to watch people deeply, deeply clueless about something, with no firsthand experience, try to warn others about the dangers of it. Liquid nitrogen is about as dangerous as boiling water, which isn't to say it can't hurt you, but fleeing in terror is probably not a measured response to the situation. No, the pool wouldn't freeze solid from one bowl of LN2. No, it wouldn't cause your arm to shatter. (Flash-freezing _anything_ bigger than a grape is hollywood theatrics, even if you discount the ledenfrost effect. The specific heat of the material isn't that high, the quantities involved are fairly small, and there are properties like "thermal conductivity" (read "insulation") that come into play to prevent anything more than surface burns. I've been stung by LN2, but it never even left a red mark. My friend Reese had a whole bowl dumped in her lap (by somebody who was looking at the pretty girl and not where he was pouring during an ice cream making session) and she wound up with a nasty looking burn down her thigh (somewhere between first and second degree, some blistering but not much); she said she'd gotten worse spinning fire. And Mark grabbed a runaway vapor hose whipping around when the phase separator shattered at the first Linucon (it's sort of a metal sponge on the end of the hose that keeps the pressure contained so liquid comes out instead of a 3000 psi stream of gas; somebody let go of the hose after filling a bowl and it whacked against the side of the metal tank while still frozen from use, and it shattered). Mark had to hold on to the hose (no glove) with one hand while turning the tank's nozzle off with the other, and the last joint of his middle finger on that hand swelled up and essentially turned into a giant blister, but it healed with no permanent damage.
Yes, I was wearing flip-flops in the video. I always wear flip-flops, but in this case they turn out to be recommended because shoes can trap the liquid against your skin, or absorb it. The _TOWEL_ was the most dangerous part about what I was doing because it could absorb LN2 and hold it against my skin (rather than letting droplets skitter off like water on a hot griddle). But I didn't have anything better (the metal was painfully cold, think Minnesota in February), small splashes would evaporate (room temperature is over 200 degrees celsius hotter than liquid nitrogen, it boils instantly on contact with _anything_), and if it started to sting my hand badly enough it felt like I'd get an actual burn I could always I dump the bowl on the ground and step back. (That would give a similar cloud of fog, but not as much as the pool. The fog's water vapor, don't you know. Nitrogen's as transparent as you'd expect something making up 78% of the atmosphere to be.)
People who have little or no firsthand experience with fire think if you touch a match to a log or a person it'll go up in a blaze instantly, when in reality you can pinch out a candle flame with your fingers and getting a campfire lit can be serious work in damp places like michigan. Liquid nitrogen's the same: yes it's cold, no it's not magic, no matter what hollywood likes to show.
Several of the commentors confused it with liquid helium (according to the guy at the UT cryolab that's far more dangerous, no Ledenfrost effect to speak of so little droplets stick to your skin and burn it; also several times more _expensive_ than LN2), and with liquid oxygen (that stuff's a fire hazard and again significantly more expensive, but I have heard of people making ice cream with it and they said it tasted fine. Gasoline's a fire hazard and we pump our own gas, so..).
Off to watch more bleach, then maybe actually get out and bike today. Tomorrow morning I have to collect documentation to get to the mortgage lady for the house I'm buying my sister, and then tackle crosstool-ng some more.
I need to write a pod2man replacement in lua, so I can remove the use of perl from the documentation build of various packages. (Man pages are legacy, but still hanging around...) Yes, qemu svn 6785 concerned me a bit when I first saw it. Even BusyBox uses pod2man. Camel's nose under the tent flap. Just a _little_ deficit spending...
Fade and I went to see three museums today, each of which was very very small and proudly displayed the kind of things you tend to see hanging on restaurant walls.
Watched Fade play a lot of Neverwinter Nights 2 today, now watching more bleach and pondering a bike ride. (Yay exercise, now that the pollen count's down to something measurable.) But then I couldn't watch bleach episodes...
Downloaded crosstool-ng. It insists I install libtool and makeinfo (well, texinfo) before it'll finish its ./configure. That's just sad. An obsolete documentation format nobody uses anymore, and a tool that makes non-ELF systems pretend to be ELF systems (and is thus a NOP on ELF systems).
Ok, installed the vestigial organs it complained about, but now I don't see any way to tell it what target I want to build a cross compiler for. The ./configure's --help option doesn't mention it. There's no "make help" target. Typing "make" by itself makes a file called "ct-ng" and some docs files... It's another makefile. What an odd roundabout way of building.
So the documentation files are in man page format. (Why?) And start with:
crosstool-NG makes it easy to build cross-toolchains, and allows you to take all the juice out of your target by configuring the different com‐ ponents of the toolchain accordingly to the targeted processor.
What does it mean to "take the juice out of your target", I wonder?
It mentions a menuconfig, but there's no "make menuconfig" target. Tried "make -f ct-ng menuconfig" but that complained about being unable to find the current directory's files under "/usr/local/lib". So I have to install this source at an absolute path in order to use it? That's kind of insane...
Ah, it expects me to "make install" the _source_code_ so it can then build from this absolute path. Sigh. (I am now repeating "I'm reinstalling this laptop when xubuntu 9.04 comes out" like a mantra. As mantras go, it's a bit long.)
It doesn't autodetect $CPUS, it has you set it by hand in menuconfig. Lots of other things I use --options for, it sets in menuconfig (including things like "exit after downloading source code" where menuconfig seems an outright INSANE way to do it). It has a "Use obsolete features" selector but even when I don't select that it defaults to binutils 2.16.1 (and lets me select) and kernel 2.6.26 (and lets me select up through 2.6.27 something). Oh wow, it's got a config option for the gcc "-pipe" flag. Is this an implementation detail the user should be bothered with? And what's up with "Kernel verbosity" here?
Heh, yeah I heard that gcc 4.3 now needs additional random external libraries (gmp and mpfr). Yet more reason to look into other compilers that aren't maintained by crazy people. I don't think gcc 4.2.1 (the last GPLv2 release) was afflicted with that, though.
Why does this thing have config options with only one entry? "C compiler (gcc)"... is a menu with one thing you can select. "Toolchain type (cross)" is another one.
Ok, it's configured for generic powerpc. I'll have to dig up 440 options later (and make a uClibc config for it), but let's see if the build can download the source tarballs first...
Huh, "Directory '' does not exist. Will not save downloaded tarballs to local storage". That's kind of crazy. Ok, tell it "walrus"... and it complains that doesn't exist either, I have to mkdir walrus for it. It's also complaining I "did not specify the build system". What does that even MEAN? Isn't crosstool-ng a build system for cross compiler toolchains?
[ERROR] Build failed in step 'Extracting and patching toolchain components' [ERROR] Error happened in '/usr/local/lib/ct-ng-1.3.2/scripts/functions' in function 'CT_DoExecLog' (line unknown, sorry) [ERROR] called from '/usr/local/lib/ct-ng-1.3.2/scripts/functions' at line # 564 in function 'CT_ExtractAndPatch' [ERROR] called from '/usr/local/lib/ct-ng-1.3.2/scripts/build/kernel/linux.sh' at line # 25 in function 'do_kernel_extract' [ERROR] called from '/usr/local/lib/ct-ng-1.3.2/scripts/crosstool.sh' at line # 430 in function 'main' [ERROR] Look at '/home/landley/x-tools/powerpc-unknown-linux-uclibc/build.log' for more info on this error.
Where the heck did /home/landley/x-tools come from? I never asked for that. It's making random directories in my home directory... (Ah, it's part of the default .config, CT_PREFIX_DIR. That's _INSANE_.
They really expect this sucker will only ever be run on a dedicated build system.
Here's a message Linus Torvalds wrote back in 2000 railing against something similar. Hardwiring absolute paths into your build system is a BAD IDEA, and this is not a new observation. (The phrase "locality of reference" comes to mind...)
But it's worse than that. It's not just that I am _in_ a directory, so if you need to put the output somewhere, here (or a subdirectory of here) is the logical place. No, it's that the build is already reading .config relative to where I am, so I have to build in this directory. The dependency on the current directory already exists, and they add an absolute hardwired output path on TOP of that. MADNESS!
Ok, so that directory contains a build.log (why not just spit it out to stdout???) that says:
[ALL ] bzip2: Compressed file ends unexpectedly; [ALL ] perhaps it is corrupted? *Possible* reason follows. [ALL ] bzip2: Inappropriate ioctl for device [ALL ] Input file = (stdin), output file = (stdout)
That was while attempting to decompress the linux-2.6.27.6 kernel tarball it just downloaded. Left to its own devices, this build script couldn't competently download and extract a tarball.
Where's the corrupted tarball? The "walrus" directory it complained about is empty, "find" says it's in targets/tarballs. So I hit ctrl-c to kill the build because it complained it wouldn't save the tarballs locally until I created a directory, and it kept the partially downloaded tarball, and then didn't notice it was
This is really horrible. How do people use this thing? (I guess there's a reason somebody's willing to pay _me_ to fiddle with it rather than do it themselves...)
And the frightening part? This package is apparently considered a huge improvement over the original crosstool. THE MIND BOGGLES!
By the way, all the problems I'm complaining about here? My build system handled them properly before I ever _looked_ at this thing. But _this_ is the one everybody uses as the standard, and I've been asked to beat a GPLv2 ppc-440-uClibc toolchain out of it. Right...
I deleted everything out of targets/tarballs and reran the build. So far I've gotten "4:43" ( a minute and second counter) of a twirling bar "progress indicator" that doesn't actually indicate progress, just that the sucker hasn't hung yet. No indication of what file it's downloading, how long left to go... The default output of "wget", by the way, is a progress bar. This thing has to go out of its way to screw it up. And does.
And then it died because I hadn't provided a uClibc .config. Ok, sort of valid gripe, but the amount of expertise required to _use_ this tool approaches the amount of expertise required to _create_ the tool...
Random bleach comments: I vaguely recall from the first time I watched this thing that around episode 17 they started having real trouble keeping their contexts straight. (He got stabbed in astral form, and then his physical body's being patched up. Except I thought it was established that they don't have "the matrix" style manifestation of physical wounds from astral combat, what with Kon posessing him half the time he's away and all... Oh well, they'll have fewer contexts to keep track of a few episodes from now.)
So UML works if you enable CONFIG_EXPERIMENTAL. It became a requirement in 2.6.28, and apparently I'm the only person anywhere who noticed. Fun.
Met with the mortgage lady this morning. She needs four different types of additional documentation. Track it down tomorrow...
Conference call with Vito and Stefan, got a concrete assignment (PowerPC 440 toolchain with current uClibc) for the next two weeks. Yay. Meeting with Mark this evening to go over documentation.
And the cable modem went out. Sync light flashing. Called them and they're sending someone today on an "emergency basis", but they have no idea when. Whoever it is will call an hour ahead of time, though. Three hours later, Fade and I are out at Schlotzky's because there is internet here and we have laptops, and my phone is a cell phone.
Hey, QEMU finally had its 0.10.0 release. (The first one that builds with something other than gcc 3.x, thanks to TCG.) Of course to find out about it, you have to either subscribe to their mailing list or magically know where their new website is, which strangely enough isn't this, isn't this, and weirdly enough isn't even this. Um, yeah.
Sigh. Spamalot is coming to Austin next week, but the website's "get tickets" link is broken. Fade's having midterms and then spending the following week (spring break) in Tokyo, so the entire week's pretty much shot for her. Oh well, maybe when Avenue Q gets here in April...
Eric has a Google Phone, which I saw when I was up visiting him in Pennsylvania, and I was vaguely pondering getting one to play with. It's a Linux programming environment with a keyboard, Arm based, even runs Lua according to Christian, and I wouldn't have to switch off of T-mobile to use it. But it turns out that they're too stupid to live, and I have now permanently lost interest in ever developing for that platform, ever. (Maybe if I were directly paid to work on something specific, but for fun? Let it die. I'd rather get an iPhone and jailbreak it, less hypocrisy all around.)
At Starbuck's, sans internet for the moment, pondering my todo list.
No idea what's up with Cisco anymore, but I've got email in to ask. (I'd hoped being away for a couple weeks off meant they'd have a clear idea what they wanted me to do when I got back, with work queued up for me, but apparently not. Out of sight, out of mind, I guess.)
Now at Thundercloud, meeting Fade for lunch.
On the FWL front, armv4l, i586, mips, mipsel, and x86_64 currently boot and build a threaded "hello world" with the native toolchain, using uClibc 0.9.30.1 and linux-2.6.29-rc7. This means armv5l, i686, m68k, powerpc, sh4, and sparc aren't, and need to be fixed.
Two of those failures (m68k and sparc) have been completely broken all along, so there's nothing new there. The armv5l problem is that I'm halfway through converting it to eabi, and the toolchain isn't liking me, and the problem with sh4 is that the native toolchain still isn't finding _init and _fini out of crti.o (but the cross toolchain is; go figure). The powerpc problem seems to be a kernel thing; it's just not booting. (Or possibly it's booting fine but not attaching the serial device to /dev/console.)
The i686 problem is that I switched it to the "new" pthreads instead of the "old" pthreads. Yes, uClibc has two complete pthreads implementations, and is about to gain a _third_ threading implementation (NPTL), and Bernhard doesn't see this as a problem. I tried to eject the "new" one (which never worked) before 0.9.30 came out, but Bernhard wouldn't go for it. Now Denys and I are trying to eject the "old" one, which involves debugging the "new" one. So debugging there...
Looking at why hw-uml doesn't work. User Mode Linux 2.6.28 doesn't work when built on an Ubuntu 8.10 host. I've tracked it down to one of the changes that went in between 2.6.27 and 2.6.28-rc1, so now it's time to binary search between hg 110878 (works) and 118520 (broken).
Binary searching with Mercurial is fairly straightfoward. I wrote about it last year, it's mostly just binary searching the sequence numbers of a range, the tricky bit is if you track it down to a commit that's a merge, look at the the two parent commits and figure out which one of them exhibits the problem. 114000 worked, 116000 worked, 117500 worked, 118000... doesn't build, it has an error in the block layer. Well, that can be configured out if we're using hostfs (and we enable CONFIG_EMBEDDED)... And it doesn't boot init if I switch it off. Did it _used_ to work with the block layer switched off? (Check 114000 again... Nope, hostfs doesn't work without the block layer. I wonder why that is?) Ok, 117961 is the start of a branch... and that works. 117980 fails. 117970 works. 117975 worked, 117978 failed, 117977 worked. It's 117978. Which is WEIRD because that only affects kconfig files. Ok, so what impact does it have on the .config? The symbol "CONFIG_3_LEVEL_PGTABLES=y" goes away. That sounds kind of important... Yup, there's the bug. The kconfig "lack of visibility means it doesn't get written out" insanity strikes again. Still stuck with that design flaw, after all these years...
Poked the kernel list. Might be fixed before 2.6.29 ships, but really, has NOBODY used UML on x86-64 since 2.6.27? This broke in 2.6.28-rc1, and was broken in 2.6.28, and is still broken in 2.6.28-rc7. As far as I can tell, it doesn't work at ALL on x86-64. I know KVM and lguest and the other dozen virtualization schemes has taken a lot of the wind out of UML's sails, but they only ever ran on platforms (ppc, x86, x86-64), ppc was never fully merged that I know of, and then x86-64 being dead for almost two releases... That's not a sign of health.
Plane back to Austin, offline all day. Read "Graceling" instead of trying to pull my laptop out of my backpack. (Decent book, awaiting sequel.)
So one easy way to bypass the VFAT patents on long filenames being asserted in the tomtom case is to use UDF instead. That's the file format used by DVDs, which turns out to be writeable just fine when put on a writeable media such as a USB key, and should be supported by windows and mac out of the box just fine.
The problem is, the people who wrote the Linux mkudffs command didn't zap the FAT file allocation table at the start of the device, so if you plug in a device that used to be fat formatted but which you've reformatted UDF using that broken command, it gets autodetected as FAT and you see the old root directory. (If you then try to do anything with those files, bad things happen.)
Yeah, somebody thought that through.
So I now have a USB key that gets automounted as FAT by the stupid HAL when I plug it in, and then I have to umount it and "mount -t udf /dev/sdb /root/disk" to see the actual _files_ on it. I need to look up the fat file format and lobotomize it with a hex editor. (Also, there's supposed to be a mkfs.udf link so mkfs -t udf can find stuff, but there isn't.)
I suppose this gives my backups accidental not-quite-cryptographic protection. (It's in a hidden partition! Oooh!. That would be... steganography? No. How about "horrible, broken indexing"? Yeah, that one.)
Had two energy drinks today. Got a drop of the paper back to Eric. (Yes, once again I'm heading home with the thing unfinished. We made lots of progress, there's just so much to do...) I have a third energy drink in the fridge, but I think I'll hold off on drinking that just now lest the Cheeseburgers of Icann start demanding veangance. (Caffeine plus sleep deprivation is _fun_! Wheeee... Grape mimes drink alike!)
So uClibc 0.9.30.1 is out, and built for all targets in FWL. (I'm told C99 math is broken on PPC, but I have no idea if it worked before.)
LLVM 2.5 shipped. I should really go poke at that, but the todo list runneth over. Still need to track down what's up with sh4 and arm eabi, get gcc 4.2.1 working. Need to check in with Mark and Cisco when I get back to Austin. Appointment for taxes on tuesday, financing a house for my sister on thursday...
Sigh. It's not that I intend to violate GPLv3, it's that it's a complicated fiddly language which I haven't got the interest in studying it as deeply as I have GPLv2. I don't want to _deal_ with it. It's incompatible with GPLv2, there was no pressing reason to _replace_ GPLv2, most of the packages I deal with (starting with the kernel) still use GPLv2, and I'd really like the whole mess to go away, but this means completely weaning myself off of FSF software. Luckily, they don't really _do_ software development anymore, so it's not as hard as it sounds. 95% of the problem is "the standard toolchain", which is only interesting because it's _standard_. (Yes, the FSF is doing what Microsoft does: "We suck at this whole 'software' thing, but everybody uses us, so deal with it. Now open wide while we leverage our dominance to cram the rest of our agenda down your throat.")
Got the new toybox mailing list set up. Christian expressed interest in poking at Lua. (So did Eric, we're all thinking it would be a good learning experience.) But when I cc'd the old list at them.com, it bounced. (Ah. I moved the Firmware Linux list, but forgot to move the toybox one. Right.)
The ball's in Eric's court on the C++ paper. I got the updated outline to him... day before yesterday, I think. And yesterday I went through the first 4 sections or so to align them with the new outline, and delivered diffs to him. Alas, Wesnoth put out a release today, which ate his brain. Plus he spent half of yesterday blogging a patent analysis of the Tom-Tom thing, and didn't have the focus left to work on the paper afterwards.
So of course today Slashdot links to a much shallower analysis done by Bruce Fscking Perens, which made Eric sigh and shake his head a bit on the way out to dinner. Oddly enough I sympathize: I walked away from Penguicon and thus let Matt take it over, Eric walked away from OSI thus let Bruce took it over, but we still move in the same circles. Unavoidably, we run into whoever's playing dress-up in our old clothes and roll our eyes at how badly they do it. But we left and life goes on. (Still, it's nice when you get a _competent_ successor, the way Denys is doing a great job on BusyBox, and Eric seems happy with the current Fetchmail guys...)
Both the sh4 and arm eabi issues have a 50% chance or so of magically fixing themselves if I upgrade from gcc 4.1.2 to gcc 4.2 (which I think is the last GPLv2 release). Given a choice between armv4l soft float and armv5l EABI, I think the second's more interesting anyway. Hopefully none of the other platforms will regress...
Darn it, it looks like gcc 4.2.1 was the last GPLv2 release. I'd hoped that the bugfix-only dot releases wouldn't be gratuitously relicensed, but this is the FSF we're talking about. They don't really _care_ about software, software is just a means to an end for them. What they really care about is cramming their political agenda down people's throats, and these days they've become so extremist that GPL version 2 isn't restrictive enough for them anymore. (I'm aware of the license exception that says building with gcc shouldn't contaminate the output, but I'm distributing build tool binaries and I refuse to get any GPLv3 on me the same way I refused to deal with Sun's CDDL. Of course it would be HILARIOUS if the SFLC sued me personally over my pet open source project, I could make that a real PR gold mine for them given our history. But I'd really rather not go there.)
So Red Hat's finally moving from Xen to KVM. That's only about a year and a half overdue. (Xen is massively overcomplicated, intrusive, and only paravirtualization. KVM is a QEMU accelerator, it's essentially a successor to KQEMU that relies on the new VT extensions in newer x86_64 processors (and powerpc has an equivalent). So you can't run it on older hardware, but how much older hardware has the speed and memory to spare to run instances of virtualized operating systems? And in theory KQEMU is more or less a drop in replacement on the older systems, but I've never gotten that sucker to work...
According to IDC demand for computers was down in Q4 of 2008, and expected to drop sequentially for Q1 and Q2 of this year too. The only up news is Intel's atom, showing the continuing shift to netbooks seriously picking up steam.
I need to make a genext4fs command. In lua, as part of the new toybox. The filesystem is out and stable as of 2.6.28...
So Livejournal's broken again. If you log into livejournal, your login expires after 24 hours. When your login expires, the next livejournal post that gets opened responds to the dead cookie by redirecting you to the login page.
The problem with this is if you leave your laptop running overnight (or suspend/resume), the first livejournal tab you open in the morning gets eaten by the login page. There's no trace of the URL you were trying to go to. If your browser was restoring state from the last time firefox crashed, or you did a "right click open in background tab" and then closed the original window before looking at the tab, you've lost that page. (Not a big deal, it _is_ just a livejournal page after all. But ordinarily this is safe because even if it didn't _load_ you still have the URL in the bar. The page has to go out of its way to wipe it, and now Livejournal does.)
Yet another way the crazy Russians manage to screw up anything computer related. I'm definitely noticing a theme here. (I know there _are_ some good Russian programmers, but most of them seem to move to another country as quickly as possible.)
Got about half the outline done yesterday, working on finishing it today.
Pushed some patches upstream into uClibc. Getting some blowback, which is mildly amusing considering the continuing lack of a 0.9.30.1 release and that current uClibc svn does not _compile_. Oh well.
Current qemu has an "-hdc fat:/path/to/directory" option that's actually quite nice. The emulator reads the files and makes a read-only FAT filesystem out of 'em. You them "mount -o ro -t vfat /dev/hdc1 /blah" and you can read all the files in that directory. Alas, you can't write to it. (And if you forget to mount it read only, then _try_ to write to it, the virtual drive goes catatonic and the linux kernel running inside the emulator starts spamming the console with disk error messages. But that's pilot error.)
So in theory I only need the netcat trick to get data back _out_ of the kernel. Although another trick I could do is call genext2fs and try to create an hdb image that already contains all the build files, and then run the emulator with that one.
The problem is, genext2fs hasn't got an "extract" mode. I tend to view this sort of thing as an archiver: take a directory of files and turn it into a file, and vice versa. That's an archiver. Alas, the genext2fs people do not, and I've been too distracted with other things to get back to my own gene2fs implementation. (Which now needs to understand ext4, and 64 bit support, and so on. I never even got around to teaching it about the ext3 journal (which is actually just a file dangling from a reserved inode) and htree support.)
The _other_ reason I haven't been banging on toybox much lately is I'm considering porting the whole mess to lua. The project that introduced me to busybox all those years ago, tomsrtbt, implemented the rest of its command line utilities in lua. This from a project that was attempting to cram as much functionality as possible into a 1.7 megabyte floppy image; it used a high level language analogous to Python for _size_ reasons. It had the smallest interpreter I'd ever _seen_ and the compiled binaries were crazy tiny as well. Ever since it's been on my to-learn list, but when I first poked at it most of the documentation was in Portugese, because it's from Brazil. Plus the way to learn it was to buy a book, and I never bought the book.
Last week I asked Fade if she could buy the book. (Ok, now there's two of them, but that's what I get for waiting.)
Made the mistake of mentioning politics in front of Eric again. His reply went on for 15 minutes, was Godwined almost immediately, and involved (accidentally) spitting on me at least twice. *shrug* That's why I try not to do that.
Good progress on the C++ paper. We have plenty of material but it's not properly organized (too many back references and forward references and arguments we want to make with no obvious place to put 'em), so we're doing an outline.
I have a fax to return to my sister's realtor. (Still buying Kris a house.) Got delayed a bit because they tried to put the closing on the 4th. I fly back to Austin on the 4th, I'll be incommunicado rather a lot of the day, and won't get to talk to my credit union until the 5th. Not useful.
Huh, seem to have missed a day somewhere. I suspect half of yesterday's entries were actually about Monday. Oh well.
Eric and I are grinding away on the C++ paper. I'm also grinding away on a cron job to build cross compiler toolchains and system images from the nightly uClibc snapshots. Plus I'm sticking printfs into the binutils code to try to figure out why arm EABI isn't working, trying to puzzle out what's up with sh4 native builds, and if I get time I still need to track down and beat sparc into submission..
The usual.
I miss working on tinycc sometimes. When it was linking things wrong, I'd added a -v options (and -vvv) that made it print out what it was DOING. The binutils ld does not have such an option. The closest I can do is run it under strace, except that strace is annoying to cross compile so I need the native compiler working in order to build it..
The binutils build is spitting out a dozen pages of errors the first time it tries to link anything. It's quite impressive. It's not finding libc, which is odd because when I build a hello world command from the command line, it works fine. So _sometimes_ gcc is finding libc, and other times it isn't. This is kind of annoying.
The working linker invocation is:
/usr/bin/../libexec/gcc/i686-unknown-linux/4.1.2/collect2 --eh-frame-hdr -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -L/usr/bin/../lib -L/usr/bin/../gcc/lib --dynamic-linker /lib/ld-uClibc.so.0 -rpath-link /usr/bin/../lib /usr/bin/../lib/crti.o /usr/bin/../gcc/lib/crtbegin.o /usr/bin/../lib/crt1.o /tmp/ccYO0sf5.o -lgcc --as-needed -lgcc_s --no-as-needed -lpthread -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/bin/../gcc/lib/crtend.o /usr/bin/../lib/crtn.o
The failing linker invocation is:
/usr/bin/../libexec/gcc/i686-unknown-linux/4.1.2/collect2 -v -m elf_i386 -static -o ld-new -L/usr/bin/../lib -L/usr/bin/../gcc/lib -rpath-link /usr/bin/../lib /usr/bin/../lib/crti.o /usr/bin/../gcc/lib/crtbeginT.o /usr/bin/../lib/crt1.o ldgram.o ldlex.o lexsup.o ldlang.o mri.o ldctor.o ldmain.o ldwrite.o ldexp.o ldemul.o ldver.o ldmisc.o ldfile.o ldcref.o eelf_i386.o ei386linux.o ../bfd/.libs/libbfd.a ../libiberty/libiberty.a -lgcc -lgcc_eh -lc -lgcc -lgcc_eh /usr/bin/../gcc/lib/crtend.o /usr/bin/../lib/crtn.o
And this worked a few months ago.
Oh, hang on. It's -static. Uh-huh, libc.so is working, but somehow I've screwed up libc.a. Right...
Eric posted his GPS rant. He _does_ do embedded development. :)
Eric's been downloading a season's worth of an old black and white science fiction series via bittorrent. It's in its third day. This is because Verizon's FIOS detects the use of bittorrent and throttles upstream bandwidth to about 4k/second when it's in use. Since the FIOS connection is shared by everybody in the house, all downloads become insanely slow because so many of the reply packets are being dropped.
This is why I didn't consider getting a Verizon cell phone when I left sprint. I refuse to give a dime to a company that aggressively stupid.
Made uClibc-svn build under FWL again, at least for i686. (Needed one patch, which I committed to the repository.) Now building all targets to see what else breaks...
Pushed a second longstanding uClibc patch upstream while I was at it. And the need for four of the others seems to have gone away (I know I complained about the underlying issues on the list for most of them at one time or another)... I think that means that now the svn uClibc should build with no patches at all. That's kind of impressive. (Have to wait for another nightly snapshot to cycle round to make sure.)
Slept poorly last night. Woke up around 8am with my old "something wrong in my head somewhere" symptoms (pinkies going all pins and needles until I slept on the other side for a bit, to get the chest pains I once went to the ER for). Couldn't get back to sleep for a couple hours. Considering I went to bed at 5am, that was bad. Cathy woke me up to go to breakfast at 11am, I've been a bit distracted and grumpy all day because this is the third day I haven't gotten to bed until 5am.
I feel I'm being antisocial by not keeping a sufficiently day schedule. Need to get to bed earlyish tonight, but at night after everybody goes to bed I spend five more minutes with my laptop and it's quiet and I get stuff done and I look up and it's 5am...
Got Eric another draft of the C++ paper today. He still hasn't quite merged all of the one I sent him last time, but I wrote more material anyway. (He's also writing a rant about how GPS standards are screwed up.)
Poking at sh4 some more. I'm not sure if running the sh4 system image under qemu is insanely slow because the kernel .config is wrong (I know it's not finding the realtime clock, perhaps there are related delay sources) or if it's just that the qemu target is not remotely optimized yet. I need to figure out how to profile it. Build strace inside the thing, perhaps, but when building "hello world" takes 15 seconds, that's kind of iffy...
Nobody's responded to my post to the uClibc list about the linking issue. I tried hexediting the ".init" and ".fini" in crti.o into "_init" and "_fini", but it didn't affect the linker funkiness. I'm comparing the crti.S source against the assembly of other platforms, and against crt1.S in sh to see if anything jumps out at me. Other than "@function" and "%function" (synonyms?), and not being in an .init or .fini section, I really don't see a difference. I haven't figured out why the cross compiler works but the native compiler doesn't, either. I may wind up sticking printf() calls into gcc to try to track down what the heck's going on. Probably not today, though.
Mark's installing Ubuntu and Fedora images on securitybreach (the 8-way server). I asked him to poke at kvm, but apparently you have to enable whatever cpu extensions it needs in the BIOS. I have no IDEA how that is supposed to make sense.
Why does Ubuntu keep spinning up my cd-rom drive? Yes, I have Weird Al's "Straight Outta Lynwood" in there. I've had it in there for weeks. But I'm not playing it, I ripped the tracks I want off of it ("Do I Creep You Out" is inspired), and the case is in Austin so I can't exactly put it away at the moment.
There's probably some random hal/dbus thing that's going "you have multiple scsi drives, I can't tell them apart, let me scan all of them to see where your swap partition is" or something crazy like that. It spins it up about hourly, it hums away to itself for aminute or so, and then it spins back down. This is annoying, but it's about 15th down the list of annoying things in Ubuntu.
I removed Pulseaudio from Cathy's machine for her yesterday, because she was having the random sound failure problem I was. Earlier today Eric hit "underscores in the text screwing up the diff" which turned out to be Ubuntu once again converting the second space of two consecutive spaces into a some kind of unicode excape (hex 0xc2a0). I think it happens when I cut and paste text between windows (yes, even into vi). I wrote a little program to remove them from things, I just didn't run in this time because I hadn't noticed. Yes I'm aware it shouldn't do that. It shouldn't default to an insane $LANG value (en_US.UTF-8) that makes the "sort" command case sensitive either. (The workaround is "export LANG=C". I told Eric to type "set" to see that value and he was surprised at the 4500+ lines of crud that scrolled by. It's ubuntu, it's insanely bloated with stuff that's serves no obvious purpose except to complicate the system and randomly break.
When I first told him most of the developers I knew responded to Ubuntu 8.10 by looking for another distro, he didn't understand why. It's not a very good development environment, and it's getting _worse_ with each new release. Pointing /bin/sh at dash and vimrc.tiny were just the tip of the iceberg.
Nontechnical end users switching off of Windows do not get Linux machines. They get Macs. The main objection to Apple taking over the PC space is you have to buy their hardware, but when full-time senior Linux kernel hackers buy Mac hardware as their primary systems, that's a hard argument to really get behind. (Mark's current system is a mac laptop, he runs Linux under vmware.)
Fiddled with my wwwsend.sh script to publish my qemu, busybox, and uClibc patchlist directories on my web page. (Because fiddling with svn is too much like work, and attaching patch files to messages when discussing them gets old. Besides, if I restart qemu weekly news I need to be able to link to the patches under discussion...)
Got a draft of the C++ paper to Eric, relaxing a bit now. (Still not fully recovered from a month of Pollen.) Playing lots of gemcraft, poking at various things.
One of those things in the sh4 target for FWL, which doesn't natively compile "hello world" because it can't find _init and _fini. These symbols live in crti.o, which is there and being linked in according to gcc -v, but when I objdump -d the file it has ".init" and ".fini", where the i686 equivalent has "_init" and "_fini". Hmmm...
Poking at uClibc/libc/sysdeps/linux/sh/crti.S it has ".hidden _init" and ".hidden _fini" lines that look suspicious. I don't know sh4 assembly (and to be honest I'm still a bit fuzzy on the funky gnu assembly syntax that's vaguely AT&T based instead of what Intel uses (that's been on my todo list longer than learning Lua), but if I remove those two lines... no difference. Sigh. Ok, ask the list.
Speaking of Lua, Eric bumped into this over on the wesnoth project, after the attempt to port chunks of it to Python died because its proponent managed to piss even Eric off. (Are all Russian programmers crazy? I note that Denys Vlasenko was very insistent that he's Ukranian, not Russian.) Anyway, somebody else showed up proposing to port it to Lua instead, which is cool.
Lua is an interesting little language. It's sort of like an anorexic version of Python: it's a similar sort of scripting language but incredibly minimalistic. The interpreter is tiny, the programs compile down to tiny bytecode, and the whole thing's basically a fairly thin wrapper around chunks of C code. I first encountered it in tomsrtbt (the floppy distro that first introduced me to BusyBox almost a decade ago now), because half of the commands in later versions of tomsrtbt were implemented in Lua, and the whole distro was a 1.7 meg floppy image. Seemed cool, learning it went on my todo list. Unfortunately, the documentation didn't have a quickstart last I checked. (You could read the reference manual, which I vaguely recall was a PDF of a book. I see they now have more than one book you can read, but nothing like a quickstart or introduction to the language. On the bright side, more of the website's in english than when last I checked. The language is from Brazil.)
Looked for a Lua book at the bookstore at lunch, but they didn't have one. Bought the Waiter Rant book instead.
Eric was unaware of the LP64 standard (or the rationale, or the insane legacy reasons why this is broken on Windows).
Yay, Christian Michon and Jason Azze both sent me copies of my missing December blog entries, which I've finally spliced together into something that probably bears a passing resemblance to the original blog file.
I slept until 3 today. (Eric had dental surgery this morning, and collapsed to sleep off the anesthetic when he got back. I'm still recovering from pollen.) Cathy's been sick the whole time I've been here, and today got diagnosed with an ear infection, so she has antibiotics. Fade tells me she's sick too. I am currently the _healthy_ one. It's a strange feeling.
Cathy got me another box of the Traitorous Joe's triple ginger cookies dipped in chocolate (milk chocolate this time). I have a box (I've eaten about 1/3 of it already), and Fade has a box which Cathy plans to mail to her as soon as she's feeling better. (It's a small box, but makes up for it in sheer caloric content, and of course deliciousness.)
I spent most of yesterday and a lot of today dealing with a backlog of "things I had no brain for this past month". I'm now mostly caught up, I think. I need to give Gentoo From Scratch more of a workout, but running it paralyzes my laptop.
Linux is great at scheduling multiple CPU hogs, but sucks at dealing with even one I/O bandwidth hog. I've tried the CFQ scheduler and I've tried deadline and they're just different _kinds_ of suck, the problem is the queues are too deep. The disk has to do 3-5 seconds of work for my I/O to make it to the top, and if it's blocked on page faults (because the disk cache evicted pages my executable wasn't using because I hadn't moused over that Firefox tab and triggered its cursor-freezing decision recently) then it generally faults in ONE page, waits three seconds, faults in the next page, waits three seconds... This can easily turn into 30 seconds of pain on a really unhappy system.
Now imagine the disk cache disk cache putting enough memory on processes that they start seriously swapping. (Because, let's say, genext2fs was told to create a 1 gigabyte file and it's too stupid to make it sparse even with -z.) Once the system goes INTO swap crazy, with firefox and kmail open, it's not coming back out. I eventually gave up and hit ctrl-alt-backspace to kill the whole desktop, and it took about 3 minutes for everything to go away. It was that bad.
I don't think I believe in Linux on the Desktop anymore. Let Apple have it, if we can't figure this out after 19 years of trying, we deserve to lose here. (I didn't feel this way before I was forced to switch to gnome, if I switch to an XFCE system I might start to have hope again. I really miss Konqueror. Even on a system that ISN'T loaded, Firefox regularly goes out to lunch for 30 seconds at a time while it runs its garbage collector. This is triggered by crazy things like scrolling the screen or mousing over hotlinks.)
Anyway, in the long run I can redo the bottlenecks in GFS to make it _not_ beat my laptop to death. Right now we're just focusing on getting it to work, though. Polish comes later. The real problem is that my laptop maxes out at 2 gigs of ram (apparently I can't install more than that without buying a new one), and my working set of open windows is rather close to 2 gigs anyway. Add in a 256 meg emulator instance and 4 distcc nodes running gcc and it goes all pear shaped. (It works fine if I just let it run, but if I try to do _other_ things with the laptop during this, the responsiveness sucketh mightily.
Banging on the C++ paper now. (Ordinarily I don't read Eric's blog and Eric doesn't read my blog. We don't get along when we discuss politics, and his blog is mostly about politics. But there's a reference to the paper last time we were working on it. Most of what I've been doing is re-reading the old drafts and trying to figure out where I was going next when we left off.)
DARN IT!
On the 16th I copied this year's notes.html file over notes-2008.html, and rsynced it up to the website before noticing. I _think_ I have a backup of it somewhere. (Let's see, that one goes up through August 28th, that one goes up through October 20th...)
If you wondered how out of it the pollen made me: there's a clue.
Ironically, the google cache has notes-2006.html, notes-2007.html, and the current one, but not 2008. Archive.org last updated _any_ link to my blog in February 2008.
Hanging out at Eric and Cathy's, sort of working on "Why C++ is not my favorite programming language" but so far mostly just recovering from The Great Pollen Apocalypse of 2009. (Yay recovering. I'm in favor of it. Slept most of yesterday after my plane got in, and then slept until almost noon today. Kind of needed it.)
Found a backup that goes to the end of November, that's something...
I need to write my own top command. The normal one does NOT do what I normally want to do. The ability to sort processes by memory usage is nice (although more control over the different _types_ of memory usage would be nice). But really, in addition to CPU usage I want to sort by I/O wait. If I have two processes bogging the hard drive (usually because one is doing a "find . -name blah | xargs grep blah" or something similar, and the other is a compile or some such that turns into a disk bandwidth hog when disk cache grows to evict its working set and it goes all swap crazy), then the rest of the system GRINDS TO A HALT. And it's not grinding to a halt due to CPU hogs, it's grinding to a halt because Mozilla swaps just mousing over its tabs. (My laptop can only hold 2 gigabytes of ram, not _nearly_ enough for Firefox to successfully wallow in the mud or whatever it is pigs do when failing to display web pages.)
So yeah, top should sort by iowait, it doesn't, need to write one.
My sister is getting a house, it seems. (Well, I'm buying it and renting it to her, but the principle's the same.) The offer she asked me to make got accepted, and there's much faxing expected in the near future. It's odd that an amount that wouldn't buy a one bedroom condo in Austin gets a 4 bedroom 2 bath house in New Ulm Minnesota. I keep thinking of Austin as a cheap place to live. It's not, really.
Plane leaves at 8:10 am, so I'm staying up.
The Linux Symposium guys just emailed out their "Mid-Feb Reminder!" It's kind of sad that I'm not going to OLS, CELF, or Penguicon this year. I feel I should go to _something_, maybe in the second half of the year.
For CELF I simply missed the paper submission deadline (I was busy), and I've only gone to that when I'm presenting. Possibly I should look into submitting a paper to the CELF Europe thing in November. (This year's page isn't up yet but here's last year's.) Mark and Solar wanted to do something on Gentoo From Scratch for this year's CELF, maybe one or more of them would be up for the European one?
OLS has been slowly deteriorating for years, ever since the Kernel summit peeled off and half the kernel guys stopped coming. Not exactly their fault, nor is the fact that they're moving out of Ottawa. (The facility they've held it in is being renovated this year, and there apparently isn't another one in town big enough.) I'm reminded of when Atlanta Linux Showcase moved out of Atlanta. (Anybody remember ALS? Anybody? Beuler?) Oh well, good luck to 'em. But I'm not traveling to Canada for it this year.
And of course I'm not going to Penguicon this year, because Matt Arnold finally became con chair, and he's the reason I stopped trying to help organize the thing in the first place.
(Imagine somebody who invented the "director of communications" position so he could be the face of Penguicon, taking over the website (which was our main interface to the world our first year, and getting interviewed instead of the con chair. Imagine this person organized opening and closing ceremonies last year and gave himself more screen time in each than the con chair got in both combined. Imagine that this person has lost more than one job due to his devotion to Penguicon, which was the first convention he ever attended. Now imagine how he reacts to somebody who can legitimately say "actually, I co-founded Penguicon". He doesn't just react that way to me, of course, at last year's con he had a circle of his friends standing around mocking Tracy. She went off and got a nursing degree, and isn't currently involved in the concom anymore either.)
I'm sure Penguicon will do fine this year, out of sheer momentum if nothing else. Elizabeth Bear's going back, Wil Wheaton's finally promised to show up, and I'm not trying to stop anybody _else_ from going. Fade's flying up to attend it. (I was pondering hanging out at Haven during that weekend, and need to arrange for somebody else to throw a dead dog party there if I don't, but if I set foot in the con hotel during Matt's year he'll get all territorial and start behaving... strangely. There has been rather a lot of unnecessary drama with Matt and Matt's friends over the years, mostly unremarked because airing dirty laundry doesn't help. But I know from experience he's not always entirely rational where I'm concerned (just because I haven't made things public doesn't mean I haven't got years of email archives). Deep down I suspect that anybody capable of drawing attention away from Mr. Penguicon "Must Be Stopped", and that's not healthy in the long run, but it's not my problem anymore either, and I could easily be over-analyzing something that's merely a personality conflict. I'm just sad it screws up my wedding anniversary...)
So that's three events I attended last year (four if you count the HP thing), and for unrelated reasons I'm not going to any of 'em this year. (I'm still racking up more frequent flyer miles than ever, but that's for work and visiting Eric and such.)
On the bright side, I finally heard back from the Armadillocon con chair (I know her because she ran Linucon's art show), and she's putting me in touch with the head of programming. So that could be fun. (Stu and I decided not to try to launch a new con during the big Economic Meltdown thingy. Mostly because Mark wanted to launch Impact Linux instead, and I wouldn't want to do a fresh con in Austin without Mark.)
The new version of distcc builds with -Werror. You'd think they'd know better; you can never predict what useless new errors gcc will decide to random generate each new version.
And distcc's ./configure requires -disable-Werror (mixed case) where binutils' ./configure required --disable-werror (all lower case). That I don't expect better from: autoconf is pure evil.
At the airport. Associating with the "free public wifi" access point here causes NetworkManager to hang the whole gnome desktop. The mouse still moves, but nothing I click on matters and the keyboard is totally locked. Telling the system to suspend starts to do so, but hangs waiting for the desktop processes to quiesce. And of course, hard powering off the system and rebooting, it re-associates again immediately on login. So ctrl-alt-F1, login as root, killall NetworkManager (yup, mixed case) before it has a chance to lock up the system. (And then experiment to confirm that's what was causing the problem, requiring another reboot or two...)
Year of the Linux desktop. Nontechnical end users. Oh yeah. I think we can just give up on that one at the 20 year anniversary of Linux, don't you? (Is this "the ipw3945 driver sucks", "NetworkManager sucks", or "The Gnome Desktop Sucks"? Answer: Yes, all of the above.)
Now I have no preloaded web pages to read on the flight. Darn. Not quite awake enough to program (they have caffeine on the flight, but not in the waiting area). I had to leave my chain mail equipemtn at home because the Security Theatre people are convinced I'm going to take over the plane with a pair of flat nose jewler's pliers (I've lost 3 pairs the way and my current set were a birthday present from Fade), but of course the laptop, router, and dozens of feet of cable aren't a threat. Right. (Can't garotte anybody Cat 5, after all...)
Yay podcasts.
And gnome's volume control insists there are no sound cards. Totem is currently playing sound, just quietly. When I right click on it and "open volume control" I get a window with a slider that does indeed turn up the volume, but the icon still insists there's no sound card.
Dear Gnome: give up already, will you?
The new distcc version is detecting that the build $PATH has python in it, and then failing because Python.h isn't in /usr/include. Because python-dev is packaged up seperately, and may not be installed. Wheee.
So trim the $PATH. If it can't find Python, it can't make stupid assumptions about related packages. (Well, it would be more of a stretch, anyway.)
I'm testing Mark's Gentoo From Scratch project.
Actually implemented the SNAPSHOT_SYMLINK option I mentioned on the 10th. A bit more work needed to make HDA read only for the static toolchain build script.
One more day until I can get away from all the pollen. (I note that when I booked that flight, I hadn't identified the pollen as the reason I was feeling horrible, but getting away from it is a marvelous side effect.)
I note that there are people out there who feel more strongly about Cedar pollen than I do. It leads to silly titles.
So the uClibc 0.9.30.1 rollup patch didn't apply with toybox patch because svn isn't signaling that it wants to create a file (by having the old file be /dev/null or dated the epoch), it's just trying to add hunks to a currently nonexistent file. Ordinarily, you don't want to do this because if you apply a patch at the wrong -p level you don't want to create a whole parallel hierarchy of files containing random junk.
Deferring file opening to the first hunk requires shuffling around far more code than I'm comfortable with, but we just haven't got enough information to see if it's one of these broken svn patches until then. (Ideally we'd read _all_ the hunks and make sure there only _is_ one, but that queing up more pending state in memory than I want to do.)
I've done the resuffling, but I screwed up the state machine and now it's writing duplicate lines into the output. Possibly I should have #defines for all these TT.state values.
Hanging out at Wendy's, hopped up on cedar pollen and antihistamines, but getting work done.
Antihistamine vs air filters isn't a good trade. Hoping a pill would compensate for leaving said air filters may not have been the greatest move, but I'm getting pretty tired of the inside of my condo. I did some work from the bedroom with the door closed today, with Aubrey meowing pitifully right outside the whole time. (Her turn to prevent me from working, apparently.)
Reviewed the pending patches for uClibc-0.9.30.1. Two of them are required to build with 2.6.28 kernel headers, two of them are long and complicated patches that may not qualify as part of a "bugfix only" release, and then rest are harmless. (One of them is a comment typo fix. I'm not sure that's really dot release material either, but at least it's harmless.)Unfortunately, gluing all those patches together into an uberpatch gives me something toybox patch won't apply but the gnu one will. (Sigh. TANGENTS!) This is because svn sucks and produces bad patches that don't signal they're creating a file. Quoting the patch man page:
You can create a file by sending out a diff that compares /dev/null or an empty file dated the Epoch (1970-01-01 00:00:00 UTC) to the file you want to create. This only works if the file you want to create doesn’t exist already in the target directory.
Unfortunately, the gnu version accepts broken patches that _don't_ do this, such as those produced by svn, so I have to as well. It seems like I have to hold off on opening the file until I've parsed the first hunk, so I can figure out that I need to create a file if the first hunk has no context lines, and the minus range is 0,0 (meaning the starting line in the old file is 0 and the starting length of the old hunk is also 0). Hmmm...
Mark poked me about arm-eabi, so I'm converting armv5l over. Apprently the python guys didn't want to take his arm-oabi fix patch because they don't support oabi anymore. (Meaning Python no longer cares about armv4, which is still shipping new hardware. Oh well, maybe we can support it.)
Argh. I really hate C++. Guess how arm eabi decided to break? During the mini-native build of gcc-core/libstdc++-v3/libsupc++/eh_alloc.cc of course:
/tmp/cccqYVZh.s: Assembler messages: /tmp/cccqYVZh.s:262: Error: duplicate .personality directive
Sigh. Made it spit out the assembly code in question, assembled it and reproduced the error, glanced through it but was not enlightened. All Google found about this were some unanswered questions, and that Paul Brook would probably know. Have to poke him during daylight hours.
So, I need two patches to qemu svn. One makes sh4 -append work, and the other makes cursor keys work in emulated systems.
The other thing I needed to do was remove the built-in command line from the sh4 kernel; apparently it only looks for the one supplied by the bootloader if it hasn't got one built in. The sh4 kernel still isn't finding its realtime clock (so it thinks it's Jan 1, 2000), but I'll worry about that later.
The sh4 emulation is _really_slow_, I think there's large delays getting inserted somewhere. (Something I/O related, perhaps? It boots up to the "freeing init memory" bit pretty quickly, but then pauses there for 10 seconds before giving me a command prompt.) Also, the sh4 native compiler isn't linking anything corectly because it can't find _init or _fini symbols. Still: progress!
Saw Coraline again today. Very well done movie, with lots of little subtle things I hadn't noticed the first time, such as when The Other Boblinski is falling apart he sounds obviously drunk (as he was accused of in the other world by Coraline's real mother), or how when Wybie, the cat, and coraline all turn their heads to one side near the end, I think the 3D stereoscopy turns about 45 degrees to the side too in expectation that at least some members of the audience will do the same thing. (3D with polarized glasses only works if your head is straight up and down. Turn it sideways and it goes all 2D again because the offsets are now vertical and your eyes just compensate for that rather than perceiving it as depth.)
Overwhelmed by pollen after going out to movie/mall/Fry's. We aired the place out with the window fan while we were away (after a few days closed up it gets a bit stuffy in here), but it's taken the filters a few hours to catch up after we closed everything up and turned the central air back on.
Food gets a bit boring after a few days of being totally unable to taste anything. Other than "salty", "sweet", and "bitter", the sense of taste is mostly smell at point blank range, and my sense of smell has not had a chance to recover...
Sigh. I had a longish entry for both today and yesterday typed up, but then Ubuntu 8.10 decided that my network card was going to spontaneously lose connection to the wireless hub, and when I told it to reenable networking it went "kernel panic". And of course the .swp files vi makes stopped working back around... oh, 7.10 was it? (Back about when you started having to "ln -sf vimrc /etc/vim/vimrc.tiny" each new install to pull vi out of its artifically braindead mode they put it into to punish us for not using Emacs. Dude, it's 2009, vi has supported the cursor keys in insert mode for 20 years now. I'm aware that historical versions PREDATE THE INVENTION OF CURSOR KEYS, but that's really not relevant anymore, is it?)
So yeah, Ubuntu's getting sad enough I may have to switch my laptop to Gentoo or something. Ubuntu is focusing on being an accurate Windows replacement to the exclusion of being a feasible development environment. I can't switch to Fedora, that's just Red Hat Enterprise Rawhide and not a real distribution in its own right. (They should rename it "Pointy Hair Linux" and be done with it.) Not SuSE, that's a Fedora Wannabee and a wholly owned subsidiary of Microsoft. What else does that leave? Debian lost me forever back in 1998. Slackware never scaled beyond one guy. Knoppix never grew past a live CD, and stalled. That pretty much leaves Gentoo.
What have I been doing. Went to the mall yesterday and worked from the food court again. Bought some very expensive air filters for the air conditioner on the way home, and they _worked_, and I can BREATHE again, and I actually got SLEEP last night, and I slept until 3 pm because I needed it. Met Mark for dinner at Fuddruckers and we updated our todo lists. There was more. Oh well.
Banging on sh4 a lot, because it _almost_ works in qemu svn. Finishing useradd. Reveling in being able to breathe again as long as I don't go outside. Catching up on work.
The usual.
How long is this whole pollen bumper crop thing supposed to last, anyway?
Strangely, Miso Soup seems to have a significant medicinal effect, but it only lasts so long...
Later, out at lunch at the highland mall, I've noticed that I have no sense of smell. None at all. I got a little "snack sandwich" which is covered in garlic, and seasoned breaded potato wedges, and I can't taste either one and they smell like nothing. Even my diet Dr. Pepper barely registers. I could taste the sushi and miso soup at breakfast, but now: nada. (I'm afraid to drink the bottle of tea in the side pocket of my backpack. I _think_ it's the fresh one I had with me in the car rather than one left over from yesterday, but I right now I really can't tell. Tap water normally has more taste than this.)
I never used to have to worry about the gender of trees. I feel like arranging for one of those "Y: The last man" things to occur to Texas' Cedar population, but am not quite sure how to go about it yet. More planning is required, and the acquisition of some serious herbicides, and possibly expolsives. (Living a block downwind of Pease Park isn't helping here, but I'm out at the mall now, in air conditioning. Something like recovery should occur eventually, you'd think. I'm no longer coughing and sneezing as much, but I think my nose is in shock.)
Ha. The sandwich was able to make its presence known anyway. (Licking largeish lumps of garlic off one's fingers afterwards is a bit of a giveaway; I AM GARLIC. BOW BEFORE ME, CEDAR! Sandwich wasn't a total waste, then.)
Poking at the sh4 image Shin-ichiro Kawasaki put up. It almost works for me. Trying his way to boot it before fiddling with mine, I had to make a couple minor tweaks to his qemu command line (the kernel name he packaged and the one his README said were different), but I eventually got a login prompt (in what looks like a vga window). Alas it refused to load the USB keyboard his command line specified, so I couldn't actually type anything. Rebuilding qemu with current snapshot to see if that helps. I forgot how long qemu takes to build (even with -j 3)... Nope, still can't add the USB keyboard. Hmmm...
Ah, that's a known problem mentioned in the original post to the list. (Duh.) No, the problem I _should_ be worried about is that the serial console isn't working. (Which would neatly bypass the need for a USB keybaord, but alas, doesn't if it won't work.) And the scripts/extract-ikconfig thing from the linux kernel source isn't finding a config.gz in this zImage, despite the README saying it should, so I can't get the .config out to start playing around with that way, either.
Darn. Tantalizingly close to working. Oh well, poke the list and move on until I get email back.
I note there's a working sparc test image up, except that uses glibc and my problem has been getting uClibc to work. (It would be nice to compare the kernel .config too, but proc has no config.gz in that image.)
I am sick. Presumably still pollen. Really looking forward to spending two weeks up in PA starting next Tuesday.
Mark who once said "Beware the Tokamak, my son" when captioning photos of things he bumped into around UT. It's a type of reactor that uses a magnetic bottle to contain plasma hot enough to eat through any physical material we've currently got. That by itself is sufficiently "star trek" to be cool. Upgrading a fission reactor into a fission/fusion hybrid reactor that uses fusion to break down the nuclear waste the fission produces, and basically sends the materials back and forth between the two until they stop being radioactive (getting energy out of each stage) is even cooler, and something I'll believe actually works when I see more widespread deployment.
But naming the invention that allows the hybridization to happen the Super X Divertor is just grandstanding. (They could have at least used an established name, like Interoceter, Oscillation Overthruster, Flux Capacitor, Heisenberg Compensator...) That sounds like a badly translated Japanese name, and is bound to attract Gamera or Godzilla or maybe Team Rocket...
I've gotten used to this whole "Living in the future" thing. Living in a "tinfoil and ray-guns" B movie is still somewhat unexpected.
Ok, there is deep and abiding suckage in attempting to cross compile libstdc++.
So the ./configure stage for libsupc++ builds on the ./configure stage for C, but it needs something _else_ to be cross compile aware. What, exactly, that something is, remains an open question, but animal sacrifice is near the top of the short list.
It tries to grab xgcc (which is a host compiler) as both the C and the C++ compiler to build libsupc++ with. This A) doesn't work at a theoretical level, B) explicitly specifies insane paths, and dies later in ./configure unable to build, well, _anything_.
I can use config.cache to manually feed it the target C compiler, but if I do that configure dies because first it figures out it's not using a native compiler, then disables certain tests, next it throws some highly verbose warnings about it, and finally sits down in the mud and throws a tantrum when it wants to run one of those tests and can't. (Specifically it tries to figure out if libm contains some symbol or other, which is a target libc thing that gcc didn't need and which hasn't been _built_ yet when we build gcc because you need a target gcc to build it.)
If I leave the C compiler alone and instead feed config.cache $ARCH-g++ as its c++ compiler, it happily builds stuff with it (assuming I move everything down after uClibc++ is built and installed, because yes it's trying to use the libc header files, even though I'm _just_ building libsupc++ and not the full libstdc++), and then it links the result with the C compiler (which is still a host compiler and is at _best_ producing the wrong elf signatures).
Ignoring both of these issues for the moment, the build can make it as far as the uClibc++ build... where it dies because it hasn't got libgcc_eh.a. Because the cross compiler was built --disable-shared (and thus that stuff is in libgcc.a), and if we _hadn't_ done that there would be a fun chicken and egg problem with the libc.so.6 reference that libgcc_s.so leaks.
I could play whack-a-mole with this for another week, nailing every stray idiocy in place, but it would be simpler to just build gcc a second time with a completely different configuration, which is essentially what I'm doing during mini-native.sh already, which is why building uClibc++ after _that_ stage works. As much as I hate the enormous layering violation of having mini-native.sh install files into the cross compiler, the _simple_ alternative is to cut and paste that entire build into the cross compiler, and it's a toss up which is uglier.
So large amounts of ugly fiddly code duplicated in two places, vs important functions being done at the wrong time from the wrong place. (There are times when I REALLY hate C++.) As always, when faced with a choice between two hideously unpalatable options, the answer probably involves beat a third option out of the situation with a bazooka and some duct tape.
Ok, here's the least disgusting alternative I can come up with: make a tarball of the uClibc++ files out of mini-native and copy 'em into the cross-compiler from another script entirely. It's ugly, but it avoids both duplication of the build logic and having mini-native.sh modify its cross compiler. (It's ugly however you look at it, but that's the _least_ ugly option I can come up with.) And it means that creating a static cross compiler after the fact doesn't require building mini-native again, so it doesn't impose quite as horrible sequencing issues.
I think all I actually have to do is "cp $TOOLS/lib/lib*c++* $CROSS/lib"... Except that won't work because according to ldd, libuClibc++-0.2.2.so wants libgcc_s.so.1.
Nuts to your white mice.
[Goes to play "Mr. Do" under Mame for a bit.]
Ordinarily, when I order a Hot Chocolate at Starbucks, when the ask me the size I just say "egregious" and mime a vertical "the fish was _this_big_" with both hands. Every time I do this, they give me whatever the 20 ounce is called ("Vingt"). This time I just said I wanted a large, and they gave me the smallest one ("Alegretto").
Lesson for the day: feeling too under the weather to properly invoke sarcasm means I don't actually get what I want.
Ok, three obvious choices for uClibc++:
Once again, all the choices suck but I've already got my third option if I can just figure out which one it _is_...
I'd look at an option 4 (just copy libuClibc++.a into the cross compiler and force static linking) except that libuClibc++.a is 685k and the shared version is 159k. (Why is that? Ah, if I strip it the result is 255k, which makes more sense. Although it still looks like libgcc.a is getting sucked in, which you'd think the things building _against_ it would already do? Send email to Garrett asking what's up, and move on...)
Ok, if I retroactively copy the -lgcc* files over, and the rebuild the wrapper with -DGIMME_AN_S, is there anything else in the toolchain that's going to care? (I don't think so...) So I think I can retrofit a --disable-shared toolchain to be --enable-shared fairly cheaply, meaning the third option in the above list seems least disgusting.
Thunderstorm tonight, impressive one. Tore off the awning on the pizza place across the street from Starbucks (well, rotated it 90 degrees and punched a hole in it, anyway), and upended lots of chairs and tables on Starbucks' patio. Looked distinctly tornado-y for a bit, but decided it wanted to upend a medium sized lake on the city instead, and had a schedule to keep. On the bright side, the pollen is already noticeably reduced. (Probably pick up again in a few hours, the trees are still at it.)
Ok, what's involved in doing read-only hda mounts? I want to build static cross compilers, for all targets, in parallel. Meaning I want to fire up lots of instances of qemu and run them in parallel to take advantage of SMP. I'd like to have them share the same root filesystem image, meaning it should be a read only disk (or perhaps an initramfs). Ideally I'd like to decompress all the source into that as well, meaning setupfor needs to use symlinks instead of hard links.
So, modification to setupfor to add a SNAPSHOT_SYMLINK config option, modification to run-emulator.sh to add a read only option (technically --no-rw), and then a new wrapper script to create an image with all the source. Should the new wrapper run qemu read/write, extract the source, and then exit, or should it extract the source outside the emulator and run system-image.sh again to repackage? (It can be made to work either way...)
Still feeling horrible. Fade points out it's probably the cedar pollen being at record highs. She gave me a decongestant, we'll see if that makes things better or worse.
Had an eye appointment to get new glasses. (A few months back I found out that the coating on the surface of my existing glasses is soluble in bug spray. This was not a good thing.) Apparently, my retinas are still fine, good to know. (Which also means I haven't got any diabetes symptoms, which is also a good.)
Bugs in things I thought were done. The uClibc++ build during the cross compiler is dying because the ./configure part of the libstdc++ build (part of the gcc build) breaks. Once again, autoconf is horribly brittle and doing stupid things, and doing them _differently_ in contexts that have no obvious reason to be different. (Butterfly effects.)
It's too bad there's no a more automatic way to set environment variables. I tried "THING_{ONE,TWO,THREE}=42 set" and it told me "THING_ONE=42: command not found". Alas. (Yeah, I find corner cases.)
Three hours later, still fiddling with libstdc++. I could just cut and paste the relevant chunks of the native gcc build to the end of the cross-compiler.sh stage, but duplicating such a large, complex, and _ugly_ chunk of the script is kind of painful. (The gcc ./configure invocation in mini-native.sh is _nine_lines_long_, and is basically the result of me hitting ./configure over the head with a wrench until it stops moving. Not that the six line version in cross-compiler.sh is much of an improvement, but having _two_ of them in cross-compiler.sh would suck.)
I could teach mini-native.sh to install uClibc++ in two places (retrofitting it into the cross compiler), but that's an ugly tricksy layering violation that does something non-obvious and is just horrible. I tried moving the entire uClibc++ block (including the libstdc++ build) after the uClibc build (the error is about being unable to build binaries, the compiler ./configure is calling can't find headers and it can't find libraries to link against), but that didn't help.
One problem is that I can't just cd into the subdirectory and run ./configure in there. I have to call it through the makefile and the best granularity I can get is "make configure-target-libstdc++-v3", and the makefile isn't passing on environment variables so I can't override things the way I'm doing for the other ./configure phases.
This means it's inheriting a lot of the config settings from the gcc build, which makes sense on one level because things like sjlj-exceptions have to match up with what the compiler's doing. (This is a flaw in the C++ language: it's full of non-obvious magic and fiddly sharp edges that have to match up in the ABI du jour. This is the fundamental problem that makes it hard to build a separate C++ library the way you can with a C library because the ABI isn't simple or well-defined. Of course the g++ guys have made zero effort to work around this problem, and happily glued it together into even more of a big hairball.)
But this also means that the second ./configure invocation is using the temporary compiler (xgcc) that the gcc build hacked together, which can't link anything because it can't find a C library or headers. Which might almost make sense if that was a _target_ compiler, because when gcc is initially built, uClibc hasn't been built yet because you need a cross compiler to build it. (There's a fundamental sequencing issue here, and I really don't want to build stuff twice.)
But xgcc is a _host_ compiler. (Of course before I worked this out, I tried moving the entire uClibc++ block (including the libstdc++ build) after the uClibc build, which didn't help.)
Once again, the "config.cache" mechanism allows us to manually answer the questions ./configure is asking. In this case, the questions are "what's our c compiler" and "what's our c++ compiler". I'm not quite sure if this is the host compiler or the target compiler it wants. (I think xgcc is a host compiler, but what does it need that _for_?) Feed it "gcc" and "g++", and... it's ignoring the existing values and overwriting them.
I really, really, really hate autoconf.
So this morning, unsuspending my laptop, sound is gone. (I don't know why.) Since I ripped out the horrible pulse audio thing, that can't be the problem, apparently alsa lost its cookies. So the obvious fix is to rmmod and insmod the sound module again.
So what's the name of the sound module?
snd_hda_intel 489264 7 - Live 0xffffffffa0386000 snd_pcm_oss 52608 0 - Live 0xffffffffa0378000 snd_mixer_oss 25088 1 snd_pcm_oss, Live 0xffffffffa0370000 snd_pcm 99208 4 snd_hda_intel,snd_pcm_oss, Live 0xffffffffa0333000 snd_seq_dummy 11524 0 - Live 0xffffffffa02c3000 snd_seq_oss 42368 0 - Live 0xffffffffa0273000 snd_seq_midi 15872 0 - Live 0xffffffffa026e000 snd_rawmidi 34176 1 snd_seq_midi, Live 0xffffffffa0259000 snd_seq_midi_event 16768 2 snd_seq_oss,snd_seq_midi, Live 0xffffffffa024a000 snd_seq 67168 6 snd_seq_dummy,snd_seq_oss,snd_seq_midi,snd_seq_midi_event, Live 0xffffffffa0234000 snd_timer 34320 4 snd_pcm,snd_seq, Live 0xffffffffa022a000 snd_seq_device 16404 5 snd_seq_dummy,snd_seq_oss,snd_seq_midi,snd_rawmidi,snd_seq, Live 0xffffffffa0224000 snd 79432 19 snd_hda_intel,snd_pcm_oss,snd_mixer_oss,snd_pcm,snd_seq_oss,snd_rawmidi,snd_seq,snd_timer,snd_seq_device, Live 0xffffffffa020a000 soundcore 16800 1 snd, Live 0xffffffffa01f8000 snd_page_alloc 17680 2 snd_hda_intel,snd_pcm, Live 0xffffffffa01ed000
That's right, those crazy (read "insane") kernel developers shattered the sound module into 15 separate pieces. No idea which one of them is broken, and no obvious way to cycle this subsystem short of rebooting. (And that's separate from the hal/dbus/udev crap layered on top.)
Ubuntu becomes more like Windows every day. It's sad. Eric and I wrote about this years ago. If you have a module that cannot be used on its own, possibly it's not very useful to have it _be_ on its own?
Specifying WRAPPER_TOPDIR=/blah in mini-native when the native compiler is _also_ using the wrapper _does_not_work_. You wind up with uClibc++ (first build after that) trying to link a host binary against the target crtbegin.o. Yes, this broke FWL's ability to rebuild under itself, and it turns out to be tricky to fix. I have two different instances of the wrapper and I want different behavior out of them. I think I need to add the architecture to the variable names, WRAPPER_TOPDIR_armv4l=/blah.
Ok, 18 miles per gram is kind of impressive, even for elastic carbon nanotubes.
Ok, Mark pointed out that mke2fs isn't in the $PATH when run-emulator.sh tries to call it on a gentoo host, which I'd bumped into before, but had forgotten about. Not quite sure how to properly fix it. Gentoo doesn't put /sbin:/usr/sbin in the $PATH for non-root users, which is sort of the point of having those be separate from /bin:/usr/bin in the first place, but means that lots of stuff normal users can call (ifconfig is another one I've missed) isn't available unless you call it by absolute path.
I vaguely recall that Red Hat used to do this years and years ago, but Red Hat abandoned the desktop market so long ago the details are a bit fuzzy. (Fedora is Red Hat Enterprise Rawhide and nothing more. Deal with it.)
Adding a symlink to build/host is not a proper fix, nor is calling the tool at an absolute $PATH. I guess I need to put a test in run-emulator.sh and add /sbin:/usr/sbin to the $PATH if it can't find mke2fs. (That's a fairly specific fix rather than a generic one, but for the moment I'm only encountering a specific problem. I can always genericize it later.)
Ok, so if "groupmod -g" changes the gid of a group, what happens to users who have that as a default group? Do their user entries get updated? The man page implies no, but testing the command says yes.
Note to self: when debugging new user fiddling utility implementations, accidentally running "rm /etc/passwd" as root: bad thing. However, if you find yourself having just done this, remembering that you have a terminal you just did a "cat /etc/passwd" in and that you can cut and paste from: good. (Not panicing, also good.)
Merging Mark's distcc fixes. (I broke it in at least two places since the last time I properly tested it.) Now I'm running a build with distcc enabled, and the binutils build is dying. The reason binutils is dying is that the host-tools.sh step sets $PATH to point to just the build/host directory (filtering everything out), and distcc looks for the second occurrence of the name it's called as (such as gcc) to find the local version of each utility. And host-tools doesn't _leave_ a second occurrence in the $PATH. (Kind of the point of it.)
Yeah, that's not going to work: what host-tools.sh is trying to do (filter the environment, simplify it, remove anything non-obvious) is incompatible with distcc at the _design_ level. Right. So I can add explicit support for distcc to host-tools.sh, or I can just skip the host-tools stage when building under distcc. (For right now, just skip it.)
I ate a 4-pack of Cinnabon "minis" yesterday and felt fine, but a single Starbucks hot chocolate gives me an upset stomach. This is a distinct trend (the salted caramel is worse, but not by much), and I don't know why.
Playing with the pliers Fade gave me for my birthday, working on the "1A" rings from Rosco Inc. (The size 1 rings are 1/4 inch wide and around 20 gague wire, this is the next size down from that. Darn fiddly.) I have 4 rows done. Making chain mail, of course.
I realize I'm unlikely to be able to hire the Mormon Tabernackle Choir to sing "My dog's better than your dog". I probably won't get Ralph Nader to say "Luke, I am your father" into a Microphone. (I did once get Neil Gaiman to say "By Grabthar's hammer, you shall be avenged" into the microphone after his reading of "Crazy Hair" at Penguicon 2004, but the Science Fiction Preservation Society never got us copies of the recordings of anything they recorded.)
However, it shouldn't be _that_ hard to get a classically trained soprano (one of the ones that sounds like she's inhaled helium and has so much vibrato in her voice you can't understand a word) to sing Yashimi vs the Pink Robots. (I mean, Alanis Morisette already did "my humps" and put the video up on Youtube.
This is a sign I need to get involved with another convention, to ground out these impulses. Alas, the armadillocon concom still doesn't seem to actually exist.
Fiddling with my cell phone/laptop connection again. (The bluetooth daemon segfaulted when I unplugged my USB bluetooth key, I had to re-run it.) At the store, the guy's blackberry could see my phone, and vice versa. My phone can see two other devices at starbucks ("jupiter" and "grace"). My laptop can see those same two devices. The only thing each of them can't see is the other one. I've blanked both of their histories so they shouldn't have any residue from previous association: no dice. I've run "buletoothd -n -d" to see the debug output, but it's not telling me what devices it sees, just "discovery session activated". Great, that's COMPLETELY USELESS. Tried disabling and re-enabling bluetooth in my phone: nope. Unplug/replug the bluetooth key (and relaunch the daemon): nope.
This is simulatenously hideously overcomplicated, totally opaque, and too brittle for words. And worst of all, it won't tell me _why_ it's failing. Not really impressed with the Ubuntu bluetooth infrastructure at the moment.
It is difficult to surreptitiously cook bacon. (Well it is.)
Went to see Coraline today, in 3D down at the theatre next to the Highland Mall. Excellent movie. (Nightmare before christmas was Tim Burton partnered with Harry Sellick, this was Neil Gaiman and Harry Sellick.) Fun watching them implement a 3D rendering engine failure using claymation. (The bit where they walk away from the house and there's nothing there.)
Fade got me a hematite ring. The last one I had I got at a gas station driving through Utah, and broke when it fell onto the pavement out in front of Eric and Cathy's place in Pennsylvania. (They're strongish, but very brittle.)
Got the useradd stuff refactored, which got me unblocked on it. (It was turning into a big tangle of complexity doing all those commands at once. Now, much less so.) Hopefully I'll get it done this weekend.
Mark's gotten a bunch of work done on parallelizing the build, starting by figuring out that I broke distcc again, and fixing it. (He says Python builds much much faster now.) Alas, in the evening the server ate itself. :( Dell's "dual power supplies" meant "twice as many chances for one to blow out", and their power distribution board designed to prevent surges from frying the other components apparently didn't. He plans to ask for a new one on Monday.
I am reminded that once one is married and no longer trying to meet interesting and attractive members of the opposite sex, one suddenly finds oneself meeting interesting and attractive members of the opposite sex, specifically at Starbucks. (I'm trying to figure out if this means something is deeply screwed up about humanity as a species, or whether western culture is to blame. I'm guessing both, although I'm not ruling out aliens taunting us either.)
Slept till noon, feeling much better.
I'm now working on the useradd, usermod, userdel, groupadd, groupmod, groupdel, chage, passwd, and groups commands all at once. (They're 90% the same infrastructure.) Right now they all depend on "useradd", I should figure out a cleaner way to configure that, but _after_ I get it working.
I'm not doing pwconv/pwunconv/grpconv/grpunconv because I'm only supporting one or the other at a time.
The server arrived! Mark set it up, and boy is it fast. I need to set up cron jobs on it, but lemme finish useradd* first...
Upset stomach. Tried biking to the north Kirby Lane location (up near 183 and 620), but turned back less than halfway there and went to the original Kirby Lane location (on Kirby Lane) instead. Having some garlic mashed potatoes (very good, can't finish 'em, feel nauseous).
I really hate Firefox. My laptop has 2 gigs of ram and Mozilla's clogged it all up. (Ok, I' trying to download 350 megs of podcasts, viewing a video, and running a build, but according to top the reason my desktop keeps freezing is Mozilla eating all my my memory (and using 57% of the CPU, for reasons unknown).
I miss Konqueror. Among other things, it didn't freeze to the point where it wouldn't even redraw its windows for more than 30 consecutive seconds on a regular basis. Tying it to KDE was sad. Webkit is based on Konqueror so Safari or Chrome would give me a Konqueror derivative and let me get away from Firefox. Maybe when I reinstall for Xubuntu when the next release comes out.
I should also try the deadline I/O scheduler. CFQ can get really unhappy when something in the background uses a lot of disk bandwidth.
[Hours later]
Did not sleep at all well. Something's screwed up in my head (maybe sinus infection, maybe a pinched nerve in my neck, maybe a head cold, quite possibly all three). But when I slept on my left side the little finger on each hand (and half of the finger next to it) went all pins and needles, then numb. When I slept on my right side, my left leg did something similar. When I slept on my back, my ears rang really loudly. That's just _weird_. (Also led to switching positions every fifteen minutes all night, which is not restful.)
Met Mark for lunch. He's made good progress on Gentoo From Scratch, by which I mean he's got a kconfig generator working from the portage ebuild data (albeit his first implementation's in perl, and it doesn't include dependency info yet). I thought Gentoo had longer and more elaborate descriptions ala the help in rpm and .deb files (which have multiple paragraphs for most packages), but apparently not. Sadness. Possibly the other repositories can be mined for some of it? I should ping solar.
Met with bank people about mortgageness. The _taxes_ on a new place as big as Fade and I were looking at would be around $675/month, plus another $100/month for insurance, and then the mortgage on top of that. This is not counting repairs and general upkeep to the place (currently covered by the condo association fee). That's... disturbing. I think holding off on getting a new house is called for.
I also got an approval letter so I can buy my sister a place. The downside there is that the _smallest_ mortgage my credit union will do is $50k and they want me to put 20% down, so they can't give me a mortgage for a place as _cheap_ as the ones Kris has been looking at. (There are apparently some very nice places in rural minnesota going for under $60k.) And no, you can't get a mortgage for more than the place is worth and use the rest for repairs. I asked.
Longish nap in the evening to try to get my concentration back, but it didn't help. I suspect I'm writing today off as a sick day. (Well, half day. I got maybe 4 hours of productive work in.) Hopefully I can catch up later this week. Groggily poking at useradd in the meantime.
I'm reminded of the part in The Art of Unix Programming where Eric talked about "Bernstein Chaining", which I pointed out during my editing pass was a horrible name for something that guy didn't invent. The technique Eric was pointing out was running the rest of your command line via the fun little trick of exec(argv[offset], argv+offset), the way "nice", "nohup", "detach", "setsid", and so on have been doing for decades. After I pointed out a few preexisting counterexamples, he decided it the name only applied to using it for security purposes... the way "su", "sg", and "chroot", do? And this isn't counting tools like ssh that wash a command line through a shell. (Did Bernstein do sudo, and if not does it also predate his stuff?)
Catching up on my podcasts, according to Russell Tice the NSA was recording every domestic communication for the past several years. No warrants, no disclosure, no oversight, no limits. Gee, what a surprise. (We didn't prosecute J. Edgar Hoover for doing that, so what's their downside?)
Mark's been amused that for years now I've said "hello office of domestic surveilance" into my cell phone when I think I've just said something that triggers an automated word searche that might flag an actual agent to listen to fifteen seconds of the recording. (Yeah I throw a little chaff into the radar. Force of habit. As Cory Doctrow pointed out, the best defense against universal surveilance is flooding it with noise so it's useless in practical terms. All those "automated filter and search" things are about as useful as net-nanny software. It's an AI-complete problem to do it right.)
What annoys _me_ is that my new phone has the "it can be remotely switched on to listen in speakerphone mode when it seems like it's off" feature all the new ones have, and when they do that it drains the darn battery. I can't _prove_ that random sampling of the population is the reason this phone usually has a couple _weeks_ of standby time, but sometimes it inexplicably goes from three bars to dead in an afternoon when I'm not using it, and not at the edge of signal range so that it would be searching. (Not only was this capability documented years ago, but there was a BATMAN movie using it as a plot point.) Privacy issues aside, nerfing my battery life should require a warrant.
Again, my biggest disappointment about Obama: voting for FISA during the primaries. My father works for the defense industry and has a reasonably impressive security clearance, my grandfather worked for the NSA for many years because he got into cryptography during World War II and couldn't get back _OUT_. (They threatened to draft him for the Korean war if he didn't voluntarily sign back up, and he was stuck there until retirement age. He still won't tell me what happened to him in Iraq in 1982, just that he's deeply pissed about it because he was NOT a field agent and should not have been used as one.) I stay way the heck away from all that stuff for a _reason_...
Lest I come off as a paranoid tinfoil hat type, I point out that an undirected federal bureaucracy remains largely ineffective no matter how much information it has. The feds already have your tax records, bank records, they _issued_ your social security number, they run the post office, and so on. Yeah, the pack-rats want ever more, but mostly they just shove it in big boxes and never look at it again. Just having it is the important thing.
Most of us just aren't very _interesting_, but boy are we chatty. The current lot of surveilance monkeys have a ways to go to be nearly as proactive as the documented activities of J. Edgar Hoover, let alone some of the cold war excesses. Collecting information and being able to do anything useful with it are two completely different things. Data mining turns out to be subject to Sturgeon's Law in spades (great way to find false correlations and random coincidences) and beyond that it information overload just sifting through the publicly available stuff. (I pity anybody assigned to sort through the contents of my hard drive. I sometimes have trouble with that, and I'm the one who filled it up in the first place. I'd spring clean, but they keep selling bigger ones... I'm far more worried about the Nigerian spammers and Russian organized crime guys trying to get my credit card information or zombie one of my boxes than I am about intelligence agency du jour. Who's more likely to figure out what they've got and act on it within my lifetime?)
Last I paid real attention to this (years ago) the spy agencies were most interested in tracking other spy agencies (China, Israel, the FBI and CIA spying on each other, etc), and the people most likely to effectively pay attention to civilians were the corporate espionage types (who accomplished more with less than any of the government-backed ones). Yeah, 9/11 made the US spies broaden their horizons (which is another way of saying "lose focus"), but data hoarding is not the same as extracting useful timely intelligence.
Their stockpiles might be of interest to historians if the information survives and gets declassified in 50 years, though. We _know_ Hoover had Einstein's phone tapped, but alas future generations didn't get to hear the tapes...
(Yes, this is what I think about when I have a cold and am too groggy for decent technical work...)
Jean Wolter, who insists "I am not that interesting as a user for you" because "I use [Firmware Linux] to get a chroot build environment for x86", has repeatedly reported an outright design flaw in host-tools.sh until I finally figured out how to fix it. (I'm not sure users _get_ more interesting than that.)
I'm outright proud of myself for avoiding the use of a gender-specific pronoun in the above sentence. The language is against me here. At least we don't assign gender to radios and boots and such. (Ok, we have "mister potato".)
It's too bad there isn't a reliable way to find good anthropology classes. I actually enjoy reading this sort of thing.
Looking at useradd default values, and how to override them. (The actual plumbing and security implications aren't bothering me so much. Reproducing the poorly thought out user interface, however: nontrivial.) I guess the reason for -g is that if you specify -g again it overrides what's already there. It seems like -U is the default (create a new group for each user), then specifying -g would switch it off, and it does. And if you specify "-g 42 -U" it fails and spits out a usage message. (Yes, group 42 exists, it's "shadow". No, I don't know why shadow has a group, it's pretty much designed to be accessible root only.) So why does -N exist? (Specifying it without -g sets the gid to "100", which is a group called "users" which isn't used by any existing user.)
Ok, how to cut back some of this complexity overgrowth... Part of the problem is that /etc/default/useradd is a default command line, later commands need to be able to override it. So if you specify -g in the default command line, having another -g on the command line should override this, and they way I set it up -g and -G are A) equivalent, B) append to the list of groups this user is a member of. Huh.
I've already got one config variable (USERADD_FIRST_UID) specifying the first UID to auto-allocate. I can make -N use that, and -g override them both. So you don't need -g in /etc/default, so I _could_ still have it append, but I suspect I should only take the last -g (but multiple -G).
I can also make a config entry to enable support for -UN, and make it the default if it's supported. So you don't have to specify -U in the default command line either (which is good if -g needs to override a default behavior of -U but the old useradd bombs if -g and -U appear on the same command line.)
Come to think of it, do you really need /etc/default? If I'm already making the mostinteresting options selectable at compile time... Parsing a command string into an argv[] isn't free, then appending the existing options to it... Hold off for now and see if it's really needed later.
Ha! "useradd 42" was _not_ rejected. I can create users whose names are numbers, but not the corresponding uid. While I admit I need to be root to be able to do this, I can see a user named "0" confusing various portions of the sysstem. (It won't let me create a negative uid.)
Kirby lane for breakfast with Stu, looking at the suspicous grey stains on my bread and wondering if it was moldy. I ordered a portabello mushroom sandwich: yes, it has fungus on it. (Not awake yet.)
Where I left off last night: /etc/default/useradd provides defaults. The logical thing to do is just let it have command line arguments that get parsed before the ones provided on the command line. (No point having the same data in two formats.)
Where this gets tricky is that the command line options are parsed by the toybox infrastructure before it gets to the useradd_main(). It's easy to feed in new options _after_ parsing the command line ones, but overriding defaults means going the other way. My first impulse was to add a flag to tell the common infrastructure not to parse the command line, but I've already got a way to do that: it skips option parsing for the command if the command's option string is NULL. So feed in a NULL option string, then manually call the option parsing logic with the real option string from the useradd_main().
Wondering if I should bench various I/O schedulers for FWL native builds. Under the emulator, processor time is expensive and I/O sucks so both CFQ and NULL schedulers have distinct downsides. (I've been leaning towards NULL because the host has an I/O scheduler already, but if it reduces the number of system calls the emulator makes... Hard to tell. Probably have to bench it. Later.)
I'm 37 today. This is mildly disturbing.
Stressful weekend. Not sure why. It's not birthday stuff (I actually forgot until last night), I'm just doing a bit of a red queen's race right now with various technical projects.
Vaguely pondering a new laptop. (Mine still works fine, but it doesn't have the hardware extensions kvm wants, and maxes out at 2 gigs ram.) Except I'm reluctant to spend money on hardware just now because Mark spent over $5k of our company's money on hardware this month: $2k reimbursing his own laptop purchase and over $3k on a new server. (I admit an 8-way 2.5 ghz 64 bit system with 32 gigs of ram is kind of cool. Neither Stu nor myself could talk him out of buying Dell, only experience will do that, but at least I talked him out of getting SAS drives instead of SATA. Too bad FIOS isn't a viable option in Austin.)
The reason I'm pondering a new laptop is the existing Petalogix build (the one we need to get FWL to create a new toolchain for) requires Red Hat Enterprise (or its near-clone Centos). Stu installed a copy to play around with that build, and yesterday he gave me the Centos livecd image he'd used, which I just booted under qemu. It took about 10 minutes to get to the desktop. That's mostly because RHEL is a pig, but partly that unaccelerated qemu is slow. (And I've never had any luck with kqemu.)
Of course the Centos livecd hasn't got development tools on it, and it won't actually _install_ without network access. (See "pig". A cdrom just isn't enough space. Right.) Alas, Starbucks still has AT&T brand lack of internet access. (Failing to provide internet since 1995!)
Back working on useradd.
It would be really nice if the usleep() man page mentioned how many microseconds were in a second. (I could look it up if I currently had internet access, but again; Starbucks.) I think it's a million? (Makes a quick a.out... Yup, looks like.)
I'm fairly certain I can get away with "if (--len != '+') len-=5;" because the if() has to act as a sequence point. (I know that "len -= (len++);" won't do what you expect because even though the order of operations is darn clear from the _language_, it turns out the optimizer is free to reorganize things insanely when you assign to a variable twice in the same statement, and len++ counts as assigning to it...
Ooh, Cringely's column is
Evening, back online, catching up with email. Booked a flight to go visit Eric and Cathy up in PA (I leave on Feb 17 and return March 4), so hopefully we can finish the C++ paper and a follow-up to the 64 bit transition. Finally set up my Southwest airlines frequent flyer thing ("Rapid Rewards") and fed it the last few trips I've taken (so much for "Rapid"). Apparently I need 9 more to qualify for a free ticket...
Got email about tinycc (somebody on windows who can't get the sucker to build under Cygwin, wondering if I could help; alas, not really my area). Glanced at the tinycc mailing list archives to confirm that the CVS archive is still twitching. Wandering off to let it decompose another few months. (I deal with CVS when paid to do so. Pretty much by definition "something I do for fun" and "fiddling with CVS" are mutually exclusive. Thus I leave tinycc to rot until the CVS goes away, if only because the project itself goes the way of DOS. I tend to check back in every three months for some reason, although these days it's mostly due to external poking. (I could just start replying to the messages about it with "They get rid of CVS, I come back. Until then #%*(&%# off." But it seems impolite somehow...)
Broke down and ordered another $300 worth of "splenda quick pak" things before they go away. (They were discontinued a while ago, but splenda.com still has some in stock, and they're less than half the price they used to go for in the store.) It's premeasured 1 cup packs, which is A) perfect for making a gallon of tea, B) not bad for making a pumpkin pie either. I've gone through half the previous order I did, and I dread trying to make tea after I run out (opening ~3 dozen individual splenda packets and dumping them in the tea is not much fun, nor particularly accurate), so I just ordered a bunch. (Let's see a "pack" is 24 envelopes, a case is packs, and I just ordered 10 cases... I think I just ordered 960 cup-equivalents worth of splenda. Let's say I use 2 per week (between tea and various baking uses), 52 weeks/year... That ought to last us a while... That's just under a decade. I can live with that.
Dragon got out. (Came back a few minutes later.) Kiggy knows where the food is.
Out to IHOP for Breakfast with Fade, then headed over to Stu's place to work on the petalogix/xylinx report. In the evening we all went out to Mr. Sinus (Me, Stu, his daughter Beth, and Mark. Fade decided against coming along.) They were mocking The Matrix this time.
No real technical work accomplished today (other than the start of writing a report). Too much running around doing other things...
Vaguely pondering a new laptop. (Mine still works fine, but it doesn't have the hardware extensions kvm wants, and maxes out at 2 gigs ram.) Except I'm reluctant to spend money on hardware just now because Mark spent over $5k of our company's money on hardware this month. ($2k reimbursing his own laptop purchase and over $3k on a Dell server Stu calls "a mistake". I don't really care as long as it works, but $3200 on depreciating hardware makes me wince. At least I talked him out of getting SAS drives, and I admit 8-way 2.5 ghz 64 bit processors with 32 gigs of ram is kind of cool. Too bad FIOS isn't a viable option in Austin.)
Dear useradd: you're doing it wrong.
Ok, the whole useradd/adduser split is silly, but what's almost as silly is useradd having both -g and -G. The first takes a single group name, the second takes a comma separated list of groups. Why not just have the first one take a comma separated list of groups, which can have a length of one entry? (Is it because comma might be in a group name? Punctuation other than underscore in a group is iffy at best, and -G already doesn't support it. A colon would violate the file format notation entirely, unless there's an escape sequence? The "man 5 passwd" page doesn't mention one...)
Right, so toygox useradd -g should take a comma separated list of groups, and -G should just be a synonym for it. I once wrote code for the busybox "mount" command to merge different comma separated lists, but it's probably less effort to just write it again than dig it up and port that. (Yes, even though I wrote it.) And while I'm at it, the easy thing to do might be to break down the various comma separated lists into a llist of individual entries. (Yeah, not quite optimal for nommu systems, but it should mostly work even there. It's a short-lived applet, we're fragmenting memory a bit but not pinning it.)
Hmmm... Given that compilers are now doing all sorts of funky inline-and-optimize tricks for C code across functions and even across files in "build at once" mode, what would be involved in having a source version of libc installed, and building against that to give the compiler more information to work with? (At least for statically linked programs?)
Obviously this would be useless until after "make" went away, because the dependency information about where to find each function (and the functions that one depends on) just isn't there at the moment, not when you break the one big library into hundreds of individual source files. You'd need something more like ctags and a build system with a brain, which make profoundly is not.
Still, it's an interesting thought. Yet another tangent I haven't got time to follow up on...
Chris Steel emailed me about mips:
I see from your development log that you're trying to get qemu to emulate a MIPS board with more than 256MB of memory. Not sure this is ever going to work due to the way that MIPS memory works.
The 32 bit addresses use the top 3 bits to determine if you're in kuserg (user space) kseg0 (uncached physical address) kseg1 (cached physical address) or kseg2 (some kind of MMUed kernel space, but I've never had to use that one). This limits the physical memory space to 512MB. Since most boards want part of this for mapped IO, they usually limit physical memory to 256MB.
So fiddling around with alternatives to the malta board, not likely to accomplish much.
If it is just _physical_ memory being limited, then I could put a 512 meg file in /dev/shm, feed it in as -hdc to qemu, then mkswap /dev/hdc it use it as swap space. (Swapping to ramdisk isn't ideal, but it's something.) On the other hand, if the virtual memory address range is similarly limited... I should ask him.
Made another stab at getting my cell phone internet to work, but I can't even get Ubuntu 8.10's bluetooth to pair with the phone. (The KDE variant worked great. The Gnome walkthrough wizard simply can't find it, although it found some other device at Einstein's named "barbara". (Mine's "Walrus".) Fiddled with the menus and as far as I can tell the thing should be announcing itself, but it isn't. Maybe I should go to the T-mobile store and make sad eyes at them?)
Oh, this is promising. From dmesg:
[188912.179445] usb 1-1: USB disconnect, address 3 [188912.180160] btusb_intr_complete: hci0 urb ffff88003e5a0d80 failed to resubmit (19) [188912.183540] btusb_send_frame: hci0 urb ffff880029436240 submission failed [188916.822489] __ratelimit: 1 callbacks suppressed [188916.822507] bluetoothd[4911]: segfault at 46425f4282 ip 00007f85b89d86c5 sp 00007fffc1322b90 error 4 in libdbus-1.so.3.4.0[7f85b89c6000+3c000]
Bravo, dbus, you unnecessary layer of infrastructure you. I came up with the idea of power cycling my phone after removing the bluetooth USB dongle, but plugging the bluetooth dongle back in is now being completely ignored. That would appear to be why. Great. A hotplug layer that can't handle device removal. That's just STELLAR.
(Eight hours later, the desktop inexplicably froze for 15 seconds, and when it came back it had switched window manager themes. I have no idea why. This one's even uglier than the default one. Oh well, that's Gnome for you.)
Ah, correction. There's one busybox suit still in progress, the one Olivier Hugot is doing in France, where Erik and I teamed up with Harald Welte of gpl-violations.org and some other guys. (Just got a status update on that today. The SFLC isn't directly involved in that one.)
Last night I sent Mark a kconfig tarball so he can give Gentoo From Scratch a pretty user interface, but that won't keep him occupied for long. Poking at useradd to unblock him going forward (lots of packages portage can't build without that). Writing a message to the FWL mailing list about it though, because it's confusing.
Got a bug report that the toybox 0.0.8 release has an x86-64 kconfig/config binary in it. Oops. My release script does a "make defconfig" and doesn't do a clean afterwards before tarring it up. Um, right. Fix release script, cut a 0.0.9 release (which is just a repackaging of 0.0.8 without this thinko.)
Cleaning up all the 2.6.28 miniconfigs. i686, i586, and x86_64 were fairly straightforward, and both arm variants already worked (I really need to switch armv5 over to EABI, and v6 and v7 up too). Sparc was also using scsi so it's broken the same way it's been. I still haven't got a working qemu board for sh4 or m68k, and I need to fix powerpc or find an alternate board.
But mips is being stroppy. Mark send me a config that works, but it's based on the malta defconfig so it's got lots of unnecessary stuff switched on. The one I tried to put together didn't work, and I have yet to figure out why. Binary search comparing the two now, and... I think it's CONFIG_PCI_QUIRKS. I don't now _WHY_, but I'm going to stop fiddling with it for the moment.
I should poke at qemu. It would be nice if -kernel could always handle an elf image (vmlinux), since the kernel always makes one no matter what your target is. (Other formats are generated from the vmlinux.) It would also be nice if it had an option to feed in a binary device tree (the bamboo board now has the infrastructure, I should hook it up from the command line). Finally, qemu needs infrastructure to _parse_ a device tree and set up a board from it. That one's decidedly nontrivial.
Ooh, Miklos Vajna sent me a powerpc config that qemu can boot as a g3beige! (The svn version of qemu, now using actual openbios instead of open hackware, can -kernel boot a 2.6.28 vmlinux built from that. As a power mac instead of a hacked up prep with custom boot rom.) That is deeply, deeply cool.
Argh. Catching up on podcasts, the Jan 15th countdown contained Bush's farewell address in full.
Dear El Shrubbo: September 11th wasn't something you did. It was something that happened TO you. (And not even directly to you, the people it happened directly to are _dead_.) At best, it was something you failed to prevent. Talking about receiving momentoes from survivors in your farewell address is just pathetic; apparently the abject failure ever since wasn't your fault, it was society's fault, it was the environment you grew up in... Yeah. Not buying it. Go away now. ("Murdering the innocent to advance an ideology is wrong, every time, every where." Uh-huh, two words for ya sparky, "collateral damage". Or perhaps "civilian casualties". Well into six figures of 'em in Iraq, more in Afghanistan, although lots of those were merely crippled for life rather than killed. Still, the point is that your black and white view of the world DOES NOT WORK. Neither side consists of holy infallible warriors, what you have to do is pick the best available options and accept the consequences of your actions. If you don't understand that there _are_ downsides to just about every course of action in the real world (let alone what they are and how to mitigate them) you aren't qualified to handle any real power, period. I know you're a recovering alchoholic who switched your addiction to religion just like the 12 step programs encourage, surrendering yourself to a higher power and all. But dude, you ain't God. Deal with it. You're not Superman ("fighting for truth and justice"). You're aren't even Spider-man (he's smarter than you). You might be "the Punisher", if such a job could be delegated from behind a desk. "Unshakeable faith". "Never, never, never..." Drop the absolutes already, the real world is BIGGER than that. AAAAAARGH!)
SO glad that idiot's tenure is over. The cleanup continues... (The daily show mocked this speech _marvelously_.)
Whee, gnome's lost its marbles. 30 second delays on all sorts of actions, such as redrawing terminal windows and selecting pulldown menu items. It's not out of memory or anything, it seems ot have lost track of a semaphore? Sigh... Killing and restarting NetworkManager from the command line made it less unhappy, whatever it was.
Went to see the local LUG that meets down on tenth street on Thursdays. Remembered why it's been years since I've been there, and why Stu stopped going. There were only four other people there. They started by telling me all the people who'd died since the last time I was there (they're not the youngest bunch). Then one of them wanted to argue, with "about" being an optional extra. Yeah, not going back any time soon. I should look at one of the other three LUGs in town and see if it's less dead...
I haven't made any secret that the Cisco thing cost the SFLC my support, and today the disentanglement went through. (I asked them not to file any new lawsuits on my behalf, and they said "Ok, we will follow those instructions.") So that's it for the busybox lawsuits, unless Erik wants to do something on his own.
Overwhelmed with todo items. Trying to clear a few.
Mark says that Gentoo From Scratch is blocked on useradd, so when I asked him about it he sent me an example of it failing to use getent. Ok, looking at getent: it's a GNU extension that's not in SUSv4. Its description in its man page is:
The getent program gathers entries from the specified administrative database using the specified search keys. Where database is one of passwd, group, hosts, services, protocols, or networks.
Um... ew. Ok. Mostly it looks like they're running grep for "$2" against /etc/"$1", and there's only six options for $1, so it's basically a smallish shell script. Test a few corner cases... Done.
Poking at Linux network block devices. Downloaded the userspace package from nbd.sf.net, it's kind of sucky. (They added autoconf to build two executables, each of which is basically one source file. It has a ./configure stage for this spits out 107 lines of crap. Why?) This could theoretically allow real hardware to run builds without attached storage, and qemu could work the same way. But in practice, real hardware can usually take a USB drive: the real limiting factor for most of 'em is memory, you can't even necessarily give them a swap partition because beyond a certain point the page tables for it eat more physical ram and make the shortage worse.
At some point if I start to care, it looks like it wouldn't be too hard to implement nbd-server and nbd-client in toybox.
The qemu mips emulation is also being stroppy. The malta board maxes out at 256 megs, so I'm looking around for other mips boards that might be able to hold more memory. The "-M mipssim" option of qemu looked promising, so I created a hw-mipssim target and melted down the kernel's mipssim defconfig into a miniconfig, booted it... and it turns out to be hardwired to 32 megs (in arch/mips/mipssim/sim_mem.c function prom_getmdesc). Which is sad, because qemu lets me feed in a megabyte and I can specify "mem=1024M" on the kernel command line... it just ignores it. For that matter, specifying a command line at all involves modifying the one hardwired into the kernel, because the one passed in by qemu's "-kernel -append" combo isn't used. Oh, it also hangs calibrating the delay loop (init/calibrate.c function calibrate_delay, the "while (ticks==jiffies);" line never advances). I might be able to work around that by specifying lpj=12345 on the command line, but have no idea what value to feed it...
Before heading to california I was in the middle of switching FWL over to the 2.6.28 kernel as stable, and pieces are all over the floor as I'm coming back to it a week later. The config symbols for generic IDE hard drive support changed (you now need CONFIG_IDE_GD and CONFIG_IDE_GD_ATA), which broke every platform except arm (which is using SCSI, due to the board being emulated).
I thought I'd come up with a new i686 target already, but didn't replace the target's miniconfig. Ok, fixed i686 and i586, I'll fix the others in the morning.
Alas, the USB cable I grabbed was the "big usb to little usb" one used by a lot of cameras and such. This is not the cable my cell phone uses to charge from my laptop; T-mobile did a proprietary special instead. Sigh. Cell phone battery just died after a phone call from Vito and Stephen, asking why they can't get ahold of Mark. (Answer: He's asleep. I got to bed at 5am after meeting him at Whataburger to go over a big digression we're trying to get off our plates so we can get back to focusing on FWL and GFS, and he came out of it with at least 4 largeish todo items he planned to tackle before going to sleep.)
Met Fade for Lunch between classes (drove her to Zen), and now meeting Stu for Coffee at the north Kirby Lane location. I have my laptop, but I'd _meant_ to have my cell phone working too. Grrr...
Tonight I have to work at home because the next stage involves loading test kernels into the 610n hardware until it confesses. Can't exactly drag that out with me, doesn't run on battery and too many cables anyway. (But I found my debug adapter! Yay! I was blocked on that for a while. Now I just need to find the darn power supply for the thing, which I think is upstairs. Yeah, we've been testing on Mark's router a lot...)
Reading my old messages to linux-kernel, trying to find the one where I submitted broken-out patches with my changes against the stock linux Kconfig. They didn't merge 'em, but I'm thinking of grabbing the toybox kconfig to use in GFS, and first I should update it to the current kernel, and to do _that_ I need to figure out what changes I made to the thing almost three years ago. (They're mostly the ones I put into busybox, so I could poke at that source control too, but I've tweaked 'me a bit since. Not much since I broke them up nicely and sumitted them upstream to the kernel, though. Just re-applying that to current kernel kconfig would be the easiest way to migrate. If I can find where I submitted 'em, from a previous laptop...)
Am I the only one to think the Reason the republicans are giving Attorney General candidate Eric Holder a hard time might be because the Attorney General would be the guy responsible for prosecuting laws broken by the previous administration, and this guy hasn't said he _won't_?
Obama is being the good cop. He wants to work with the Republicans. He's delegating the bad cop duties of prosecuting blatant wrongdoing to his Attorney General. This seems like it might be relevant, somehow? Maybe?
Yeah, catching up on my podcasts. Behind the times, I know...
So qemu svn 6419 explains why 256 megs has been our memory limit on qemu's mips emulations:
mips: limit RAM size to 256MB on malta and qemu boards This avoid crash when a bigger RAM size is requested (the devices are mapped at 0x01000000).That covers Malta and r4k. The other three options are Magnum, Acer Pica 61, and MIPSsim. Never heard of any of 'em, really. Let's see what the 2.6.28.2 kernel's arch/mips/configs directory has... No mention of pica or magnum, but there's a mipssim_defconfig. (Which is somewhat out of date, but I'll try squashing it to a miniconfig and throw it into a hw-mipssim target and see what happens...
Today on Guadalupe, a big truck with the "Monster energy drink" logo on it was handing out free caffeine. (Yay!) They gave me a... coffee flavored energy drink. (Um, give it to Fade, I guess? Or Mark?)
How do the cats get cat hair all over my keyboard when the lid is closed? I am _impressed_.
Walking down Guadalupe to The Donald's was an adventure today. Einstein's arcade closed a year or so back, and the place has been abandoned ever since. After a few months it got grafittid, shortly after which it developed a sign in the front window saying "leased". Last fall a banner went up top saying some yogurt shop was planning to move in, but no actual yogurt shop has yet materialized. Today I noticed that one of the bottom window panes was smashed in, with broken glass behind it. This apparently isn't recent because a piece of plywood got put over it, and then dislodged again by whichever homeless person broke in to sleep there in the first place, presumably due to the cold.
A couple blocks later, I stopped to chat with the nice old homeless lady (too many adjectives, I know) who sells flowers on guadalupe next to what used to be the other arcade (Le Fun) before the Cult of Scientology raised their rent too much. (They own the whole building, and offer "free IQ tests". If you take them up on it, you flunked.) I can never remember if her name is Rachel or Rebecca, I should just ask again but I've done so at least three times already. (The mnemonic for one is the junior phoenix from X-men and the mnemonic for the other is the given name of "Newt" from Aliens, but that doesn't help me remember which one applies here.) For once I was carrying cash, so I bought three dollars worth of flowers.
A minute later (while probably Rebecca and I were still talking), a man came up trying to panhandle from both of us. His story is that he was relocated to Austin by Katrina and then abandoned by FEMA, and he has a wife and three kids living in an abandoned/condemned apartment building scheduled to be demolished soon. Rebecca more gracefully extracted herself from the situation than I did. I gave him some airline peanuts I had in my backpack, and the flowers (for his wife), pointed out I don't normally carry cash and had given all the bills I had to Rebecca, and continued on to McDonald's.
A block later there's a church which allows homeless people to congregate on its steps. There were eight of them, and a dog. I got hit a third time, and managed to find another fifty cents under my keys, then made it to McDonald's.
I think my mistake was both that I walked instead of biked, and that I'm wearing a shirt with buttons and a collar. (Well I'm out of T-shirts. I was carrying cash because I thought I should really do laundry, but I only found a little over $3 worth around the condo and I have a half dozen loads of laundry to wash and dry. Need to hit an Asynchronous Transfer Mode.)
But it's also that Austin ain't the city it was pre-Bush. My first four years here, I literally didn't see a single homeless person. I remember what a _shock_ it was when I saw someone panhandling at a street light near the start of Bush's first term, around the dot-com/worldcom/enron implosions. (I'd seen it in Baltimore and New Jersey and such, but Austin just hadn't had that.) Now I can't walk to McDonald's without running a gauntlet. (There were always "drag rats" on Guadalupe, but they used to be college students panhandling for spare change between classes. It was literally a hobby.) Ever since Katrina, when FEMA imported and abandoned several thousand additional homeless people into Austin (and far more to Houston and Dallas), this city seems a bit overwhelmed. It just hasn't got the facilities to cope.
I'm currently looking out the McDonald's window to a sign that says "NOTICE This Property Is Protected by 24-HOUR VIDEO SURVEILLANCE All Violators Will Be Prosecuted". I never noticed that before.
I really hope Obama helps the nation in a big way, but local impact is second derivative. We haven't cleaned the republicans out of state or city government, and it'll take a while for national changes to trickle down to Austin.
Apropos of nothing, I note that the hot chocolate from McDonalds' built-in cafe thing is astoundingly mediocre. It's a bit weak, the variety of chocolate they used is kind of bland, and they scalded the milk. Serviceable, but not worth coffee shop markup prices.
Right, programming stuff.
Toysh needs infrastructure changes to break the current 1:1 mapping between lines of input and commands to run. There's already a little bit of support for multiple commands per line ("one; two", "one | two", "one && two"...), and fleshing that out is fairly straightforward. But what I glossed over the first time is that commands can stretch over multiple lines (by ending with a backslash, by ending with pipe or logical operator, if statements, loops...) The command and pipeline structures have some support for this, but the function calling convention is wrong: handle() returns void. It needs to be able to let its caller know it couldn't complete and needs more data.
Ok, rename handle() to parse_and_run(), make it return a struct pipeline * and accept one in its arguments as well. Teach parse_pipeline to return NULL when it ran out of data without finishing its current set of connected commands (which is what a pipeline really is, since && and || set up a similar logical grouping without actually being pipes).
Ok, new fun corner case, what should a shell's -c option do if it gets an unfinished command? Trying bash -c "echo hello \\" just gives me "hello" (without even a trailing space, according to wc). It's apparently appending a blank line internally for \ continuations, but erroring out for &&. (Specifically, bash -c "echo hello &&" gives me "bash: -c: line 1: syntax error: unexpected end of file". That's a lot of colons.)
Meanwhile, dash -c "echo hello \\" outputs "hello \", for 8 characters according to wc as opposed to bash's 6. (Trailing newline.) Dash also errors out for a trailing &&, with "dash: Syntax error: end of file unexpected".
Actually, loathe as I am to admit it, dash seems to be a lot more sanely implemented. Bash has a different error message for bash -c "echo hello <" (two lines this time, "bash: -c: line 0: syntax error near unexplected token `newline'" and "bash: c: line 0: `echo hello <'". So why is this line 0 for that, and line 1 for the other line?)
Sigh. This was all clear in my head back in 2006, but now that I come back to work on it again I don't remember why I'm only harvesting exit codes if TOYSH_FLOWCTL or TOYSH_PIPES are enabled. (Goes to read the descriptions of those config options... Ah, flowctl is for if/while/for statements and pipes covers && and || and such. So yeah, without those the shell can't _use_ them. Admittedly $? might care too, but the shell couldn't act on the result...
Toysh started as an exercise in how far down you could strip a shell, and wound up being noticeably smaller than busybox lash. But in making everything configurable, you get a darn useless shell if you disable all of it.
Some time over the past week I got fed up and force uninstalled pulse audio. This turned out to be a bit of a trick because the ubuntu-desktop package depends on it, but that's just a metapackage so I let it uninstall that too and everything worked fine. And suddenly, all my sound stuff started working properly again. No more guaranteed silence after a suspend and resume unless I did cleanup with "kill" and "pavucontrol". No more problem starting a second app trying to use the sound and suddenly everything going silent. No more apps suddenly going silent for no reason in the middle of playing something.
Pulse Audio is a mixer that can't mix, and it's unnecessary since the ALSA layer does its own mixing. (So once again, it's a piece of unnecessary infrastructure that's supposed to do nothing, and fails to do it correctly. Did I mention that Gnome is the official desktop of the FSF?)
What I didn't know was that it couldn't uninstall competently, either.
Today, Fade and I went to Fry's to get her iMac upgraded from 1 to 4 gigs of ram, and I had them look at my laptop too (although they didn't have the memory it needed to bring it above 2 gigs in stock or something). To prepare for this, I actually shut it down instead of suspending.
When I got home, I booted it up, and gnome died. I got a pop-up window saying my session lasted less than 10 seconds and this was probably a bad thing. (No hint of a desktop, it went straight to this screen.) When I clicked on the only button it provided, it dumped me back at a login screen, which auto-logged me in after 10 seconds, to give the pop-up window again. There's no obvious way to STOP it from auto-logging me in (although the timeout goes up to 30 seconds if I type something), so I can't get it to just stay at the login screen. (Thanks Gnome developers!) I can however get it to stay at the "your session lasted less than 10 seconds" warning box, so ok.
Being a Linux geek of longstanding, I ctrl-alt-F1 and log in from a text console. Check dmesg: nothing. Some strange residue in /tmp, is the .gnome directory in ~landley horked, what's up with this? And where the heck does gnome log these sort of things. Shouldn't that pop-up window have showed me what the actual _problem_ was? Go back to the pop-up window. It doesn't have more than one button, but it _does_ have a small print "view details" checkbox. Click that... and it immediately responds (why is it a checkbox and not a button then?) by opening a sub-window and showing me the problem. A few lines of noise, ending with:
Couldn't exec /usr/bin/pulse-session: No such file or directory.
Come on guys, I uninstalled this through dpkg, not by ripping it out by hand, exactly to AVOID this kind of thing. Sheesh. (And why is it trying to exec something out of the $PATH via an absolute /usr/bin/blah path anyway? And why is the failure of an _optional_ service preventing the whole desktop from launching? Lack of sound is no reason to essentially brick the machine from a nontechnical end-user's perspective. Even Red Hat just did a pop-up warning about an inability to initialize the sound card, the last thing I saw kill the desktop bringup because something trivial was missing was Windows 98! (Back around 1999 Reese deleted fonts she wasn't using to free up space on her hard drive, but it turned out one of the help pages referenced one of 'em, and I got called in to figure out why her computer was booting into safe mode with no explanation. Ubuntu has now reproduced this experience for me.)
Layers of broken here. Layers. Something that shouldn't have existed in the first place because it did _nothing_ (or more accurately, failed to do nothing correctly) also failed to clean up after itself in a way that caused something way too brittle for words to die on startup rather than just warn and move on, and then the failure was auto-retried to death. And I didn't find out about it until I rebooted the machine days later.
Long story short (too late!) I deleted the /etc/X11/Xsession.d/70pulseaudio that dpkg left behind, and suddenly everything just worked again. (It somehow seems repetitive for X to have its own /etc/init.d directory. Why on earth would the sound mixer service be launched from X rather than from init? I also find it strange that /etc/rc.2 is a directory full of numbered symlinks into init.d but Xsession.d has the actual files _and_ they're numbered, but oh well...)
Dear Gnome/Ubuntu: you're doing it wrong. Linux should not work like an eggbeater. Intricately interlocking complexity may seem like an elegant design to you, but when a single piece of sand in the gears makes the entire thing grind to a sudden halt, and you can't even find where the sand _is_ unless you know how every single piece fits together... How exactly does this qualify as "good design"?
Darn it, and shutting down ubuntu without killing kmail first corrupted kmail's indexes. (The process was killed while it was saving its state.) Meaning I've lost track of which messages I'd marked read and which ones were to-do or important, and all the windows I had open to reply to (which ordinarily pop back open when I re-launch the program) are gone. I had something like 30 of them, pending half-finished emails to write...
I already hated gnome, but I think I'm working my way to "loathe"...
Hello from the Phoenix airport, during our hour and a half layover.
Only had one bite of the bread pudding and threw away the leftovers. (When you're not even hungry in the morning, you ate waaaaay too much last night.)
We got paid. Yay money. We can afford to buy a build server now.
Mark and I have decided to start a weekly technical blog over on impactlinux.com, where we can summarize what's happened with FWL and GFS and such. (I've actually been doing it anyway for a few weeks now, but that was just something to send in with our invoices. I should clean those up and post them on the website...)
Home. Yay home. (I'm amazed that the gnome network manager auto-associated with the airport wireless in phoenix but not my router at home.)
Ok, it's crazy season again:
From: "Taxproficient@[deleted]" Taxproficient@[deleted] To: "rob@landley.net"can you please tell me how to remove busy box from a system denying me access to it? this is going on for beginnng six yrs please help [first name and phone number deleted] thank you with all my heart Sent from my iPhone
I didn't edit anything outside the square brackets.
Do people in other fields get this sort of thing? If I'd volunteered for Habitat for Humanity in a lumber yard, and somebody tracked me down two years after I left and claimed that some of the lumber I handled has locked them out of their house for the past six years... This would be _unusual_, right?
I suspected that this person's first language wasn't English, except that the phone number has a South Dakota area code. (Is it possible to voluntarily immigrate to South Dakota from outside the US? Where from? Siberia? It's negative 33 degrees there right now according to the weather map.)
I'm not upset, and I'm not trying to make fun of the guy, but I get these kind of things on a semi-regular basis and it's always time consuming to tease out the information I need just to figure out what they're talking about, let alone how to actually help them (if I even can). Eric got enough of this he wrote a "how to ask smart questions" document, which I suppose is nice if they read it before they email you. (Pointing them at one seems a bit of a brush-off: if they can't communicate clearly in english asking them to read a lot of it may be a bit of a stretch. Then again, he's at least mildly famous and I'm not, so he gets even more email than I do, and needs coping mechanisms for the volume. I have yet to write up any form letters.)
Last day in Orange County, plane back to Austin leaves tomorrow morning.
Tired. Busy. Received many conflicting todo items.
Never did get permission to see the base files that the 185k patch applied to (going back and clearing more stuff with legal, not gonna happen before we head back), so I'm back poking at the OpenWRT patches. Mark's off doing something else at the moment so I'm going through the OpenWRT patches again to reproduce Mark's familiarity with them. Apparently OpenWRT has a fix to this DRAM issue somewhere in the pile (I did not know that), although spotting patches we need to add is easy; elimintating stuff we _don't_ is the hard part. (At least it is when there's no "obvious crap" filter like the past two days of filtering. All the OpenWRT patches do _something_, the question is whether it's something useful.)
I also need to build a stock 2.6.28 kernel and see if I can get it to do anything on this hardware. (I was working against a 2.6.25 base last time, and most of the patches I was playing with were either for hardware we don't need for an initramfs shell prompt via serial port, or it already got merged.)
The California offices have free diet mountain dew, and Kona coffee, which Mark really likes. I should try it some day. The caffeine is keeping me upright.
Evening. Hotel. Brain-fried. Words. Thingy.
Watched about half of "300" on HBO (switching channels a lot). Yeah, it's a comic book all right. I think the humans were the protagonists and the monsters from "Doom II" were the bad guys. Where they got a cave troll is anybody's guess, although I'm guessing Ra brought them. (The bad guy from the "Stargate" movie was calling himself "Xerxes" this time, apparently this covers the time period he was on earth the first time.)
Yeah, we went back to Claim Jumper's. We thought "maybe we can get a small". Didn't happen. Garlic cheese toast again, and this time I got the tri-tip steak thingies (so good). This togo box has half a giant sweet potato (covered with butter, brown sugar, and cinnamon), some excellent mashed potatoes, and a large pile of my half of the bread pudding in a to-go container. Absolutely zero urge to eat any of it so far.
So of the 185k patch, I wound up keeping 7837 lines total, and it turns out it's not complete. You know how OpenWRT has a directory full of files it adds to the kernel source, and then has a bunch of patches applied on top of that? (Yes, the patches modify files out of the directory of ones they added, and yes the patches add entire new files.) Well, it turns out they got that from broadcom. OpenWRT seems to have started out based on the Linksys source release (which upstream came from broadcom), and they never questioned their initial design assumptions, so all these years later they're still doing strange and horrible things.
Oh, and it doesn't apply to a stock 2.6.22 kernel. It applies to the 2.6.22 kernel off of linux-mips.org. Yeah. (Dear Broadcom: you're doing it wrong.)
So diff the old linux-mips.org kernel against the old kernel.org kernel, turn the directory of files into a second patch, appent the stripped down _third_ patch on top of that, compile and boot the entire mess to make sure that the 177k lines of patch I deleted didn't accidentally contain anything interesting, and THEN start trying to figure out what all this stuff actually does and how to transplant the interesting bits to the 2.6.28 or 2.6.29 kernel.
We went to "in and out burger" for dinner tonight. They do burger and fries, and that's pretty much it, but they do it quite well. (For once, no leftover bag, and I'm just fine with this.)
Back in the hotel, playing Mr. Do under Mame. No more brain today.
It's over. Thank goodness.
I'm enjoying the cornonation coverage, what little of it I've been able to watch on the TV in Stephen's cubicle. (Cisco's keeping me busy today, and the Linux flash plugin's never reliably been able to watch MSNBC content; if it starts playing it keeps going, but sometimes you reload a half dozen times and it never starts, and this is one of those days.)
I stayed up way too late last night watching the pre-game. My hotel room has cable. No Daily Show, but MSNBC was rerunning Keith and Rachel over and over (in a way, this is a vindication of them too), and the history cannel did a thing on the history of the white house, biography did one on Obama followed by one on Gandhi, and even BBC america was running a very interesting series on US history that I should track down and throw in netflix. (It's called "The american future", they were having a marathon.)
Evening now, and they're rerunning the coronation. (Yes, I'm willing to watch Faux News for this if they're the only ones showing it.) Switching away to watch some of the other biographical specials on Obama on A&E and such (MSNBC is doing a good one; hopefully this means Keith and Rachel get some sleep, they looked a bit punchy earlier today).
Heh. I liked Obama's little unapologetic smirk when he repeated his full name during the oath, despite the justice just using just his middle initial. (No, you're not getting away with that here; the president's middle name is "Hussein", deal with it.)
It's nice to actually feel patriotic again.
Cisco gave me a ginormous (6.5 megabyte, 180k+ lines) patch that's the diff between stock 2.6.22 kernel and the broadcom one they're running on the 610n. Most of this is serious crap: they apparently did a global search and replacing removing all comments containing the "fixme", "workaround", or "xxx". They removed any #if 0 segments, and trailing whitespace lines at the end of files. They updated every one of those magic CVS version comments (often reverting them, everything everywhere is now version 1.1.1.1), and similarly changed a lot of instances of dates to August 3, 2007. Oh, and they changed some indentation and wordwrapping too.
Spent several hours deleting pages and pages of noise out of this patch during the day, and now up late at the hotel, listening to reruns of the coronation coverage while deleting more unneeded patch hunks.
The trick is that if a hunk _only_ deletes code it's almost certainly zapping comments or whitespace, and if it's only modifying code lines it's almost certainly redoing whitespace or zapping comments at the end of lines. The interesting bits all add at least one line that wasn't there before. (There are occasional exceptions to this, but you can mostly spot the patterns and thus hold down the "d" key and scan the hunks as they're scrolling by for anything you don't recognize. If you overshoot, there's "u" to undo, which alas only has a hundred or so lines of backup you can do, which occasionally isn't enough if a long file has one viable hunk after several screens full of crap. So I save every time I get to a good stopping point and want to look up at the TV.)
I've deleted about 80k lines so far, and kept about 6500 lines of actual code changes that might possibly be relevant. Once I've got a reasonably coherent patch, I need to build it, test it on the hardware, try to port it to something more current than 2.6.22... Might just post what I've got to linux-mips as an "FYI", since Cisco's now got permission to open source this.
Last night Mark and I went to a place called "Claim Jumper's" for dinner. The appetizer was garlic parmesan onion rings, which were marvelous and enormous. I had the new england clam chowder in a bread bowl for the main course, which was good but the menu showed their beef stew in the bread bowl, and that's really what it was designed for I suspect. The top of the loaf the chopped off was toasted with cheese and served on the side, and that was really good too. Mark had bread pudding for dessert and I had the red velvet cupcake (which despite the name was enormous, and had a large lump of whipped cream/cream cheese frosting on top and chocolate syrup all over the place). I took half the cupcake home, took it to work in the morning, and finished it for lunch.
Tonight we went back to Claim Jumper's, split the garlic cheese toast as an appetizer (better than the stuff that came with the bread bowl last night) and both had the "whiskey chicken" main course (ooh, that was good). I got another red velvet cupcake thing (it's like 2 pounds, it's huge) and Mark got the bread pudding again, which I tried a bit of and wound up eating rather a lot of. I took a large to-go box back to the hotel with chicken and mashed potatoes and bread pudding, and ate it around midnight. I think I've eaten my entire week's worth of food already, and it's wednesday. (I still have a bag of Ritz chips left from the plane, which I ordinarily love but just haven't ever been hungry for. Mark and I are sharing a car and for insurance reasons I'm the only one allowed to drive it (he's under 25, it's darn expensive to get him rental insurance) so I have to drive him out for food, meaning even though I was fine with the red velvet cupcake for lunch I wound up going to Panera Bread with him anyway and so I had half an Asagio roast beef sandwich I couldn't finish at lunch on top of the Claim Jumper's leftovers. (I ate that too, around midnight. Well it was good.)
2am now. California time. I need to be up in 6 hours...
Trip to california, on our three hour layover in Phoenix Arizona, at "Jackalope Flats", some kind of bar thing in terminal C of the airport. Having a truly inferior diet coke, which tastes like somebody boiled a dirty sword in it. (David Mandala told me that the water in phoenix was ridiculously hard, but when the flavor shines through soda and a slice of lime that's kind of intimidating.)
Wireless internet claims to be available... And it is. Cool.
Wondering if I should care about the EFF's campaign to end phone locking...
YES! Squashfs got merged! (Finally!) Happy dance! (Well, virtual happy dance what with toe and airport and all.)
At the hotel. Still no internet here, but Cisco should have it in the morning. Out with mark to "Claim Jumper's" for dinner (really good, if a bit expensive). Catching up on podcasts some more. (I like the way Rachael Maddow is giving bartending advice.)
Building all targets with current scripts under 2.6.28, and poking at a toybox 0.0.8 release.
The next time I'm responsible for programming at a convention Neil Gaiman is attending, I have to schedule time for him to experiment with liquid nitrogen ice cream recipes. (Cranberry Mango sounds like it would be interesting. Or perhaps work some lime in there. Sea salt was suggested by Kingdom Hearts II, but I don't know anybody who's tried it yet.)
Oh, and next time Eric's in Austin I need to drag him to Firehouse subs. (Or just let Mark do it.) They have a wall of hot sauces.
Somehow, kmail has decided that that my outbox folder has 2 new message(s) in it despite only having 1 total message(s) in it. And the "send queued messages" thing in the file menu is often greyed out when there's stuff to send, so I have to go to the outbox menu, double click a message to edit it, and then click send in the new window. I really need to find a new email program that doesn't launch half of KDE behind the scenes just to be an email client. It gets _really_ slow at times because of this.
Toe feeling much better. Still probably broken, but no longer in constant pain. Which is good, because I need to get stuff done before heading to California tomorrow, and that was _really_ distracting. (I'd hoped getting a mortgage pre-approval letter thingy might be one of those things, but Monday's a holiday and then I'm in california for a week. Fun.)
Fun comment from one of Rachel Maddow's guests, Ben Nelson, (D) Nebraska, on January 6th: "This administration has equated democracy with having elections. You cannot have a democracy when one of the parties running has a militia." (Referring to the election of Hamas and the resulting fun in the middle east.) The later line "China, where copyright laws go to die" was a better one-liner.
Ok, added mkswap. I should do swapon too, but I have a note that I need to redo readlink, except I don't remember _why_. Rummage, rummage... Ah. It's because the realpath() function out of libc only supports "NULL" as the buffer when using glibc. For uClibc, it won't allocate its own buffer, it provides no feedback about how long the buffer should be, and silently truncates with no error when given a buffer too short. So yeah, the uClibc version of readlink() is more or less useless. So, implement my own, or fix uClibc's readlink? (I note these solutions will probably overlap.)
Playing with Ubuntu's usb-creator (which claims it can turn a bootable ISO into a bootable USB key). The progress bar claims to be 101% complete. I have my doubts.
Ow. Ow ow ow ow ow ow ow ow ow.
Ow.
I may have broken a toe.
Fade and I spent most of today seeing houses for sale north of UT, about half a mile northeast of where we are now. With mortgage rates this low and the current condo mostly paid off, trading up to something with 3 bedrooms, 2 baths, and a yard for the cats seems like a good idea. Modulo being able to get a mortgage, which has always been interesting with my "work when something interesting comes along, take half a year off to do open source" job history.
When we got home, Fade wanted to go to the alcohol store because she's stressed out about the idea of moving again (especially having just signed up for a semester of classes within easy biking distance of where we currently are). She walks about twice as fast as I do, and she had me carry one of the bottles on the way back, and I also had the energy drink I'd bought, so I slipped on mud on the sidewalk with both hands full while trying to keep up, and came down with my entire weight on my right big toe.
This hurt, a lot.
On the bright side, it bled enough to get most of the mud off. Walking home was not fun. Big bag of ice on it right now, which wasn't fun to apply either. Too swollen to tell if it's actually broken or just really unhappy with me right now.
I'd planned to spend the evening programming (hence the energy drink), but my foot hurts too much to concentrate.
I'm trying to figure out how to cleanly printf() an off_t value. I know about PRIu64 for uint64_t, but there doesn't seem to be an equivalent macro for off_t. What am I supposed to do, typecast it? Just use a uint64_t all the time?
Nope, can't concentrate.
The best comment on Steve Jobs' announcement I've seen so far, from Eric Burns of websnark:
Of course Steve Jobs needs to take time off. The Lich process takes weeks to fully finish, and the Phylactery soulbind takes days to set.
Poking at the uClibc locale data thingy. Figured out how to get a current glibc localedata directory tarball (2.8 and 2.9 didn't ship tarballs, you have to grab them from Red Hat's source control).
I'm still fighting with initramfs. It turns out that if you don't enable CONFIG_BLK_DEV_INITRD in the kernel .config then you don't get initramfs support anymore. (They changed this back in February 2007, now it hardwires in "init/noinitramfs.c" instead.) So it worked fine on i686 where this was enabled in the miniconfig, but not in mipsel which didn't have it. Wheee...
Got it to work. Now to debug why the toybox df command isn't showing initramfs. Easy way to do this is to build toybox natively within an initramfs, and since next week's demo is mipsel I'm doing this under mipsel emulation. And wow, building under mips emulation is _insanely_ slow. (Much slower than building under arm emulation was.) I don't know if something's weird with qemu, or something's weird with gcc on a mips host, or what. It actually seems to be a gcc issue; the shell and makefile are working reasonably, it's seems to be native gcc being Unhappy. (Possibly running from initramfs is confusing its memory estimation algorithms...?) It could also have something to do with using qemu-svn instad of the last release version, TCG is new and not necessarily tweaked yet...
Nope, it's got to be gcc. Extracting a 200k bzip2 file seems to run at a semi-reasonable rate...
Ah, the reason df isn't reporting anything for rootfs is it's getting a total size of 0 for the filesystem. (It filters those out by default, so you don't see /proc and /sys and such.)
So today I bought a "monster energy drink" (citrus flavored), drank the whole thing, started thinking clearly, and finally fixed initramfs. (I have not made any tea in a week. I've been blocked debugging initramfs for a week. These facts may be related.)
So initramfs is working. Actually supplying the "console=" argument in the version of the script that gets _run_ is useful. (Poking through the code to see why an option you're not passing isn't getting parsed? Balancing the wrong tree.)
The toybox df command is broken. Need to fix that. And finish up the half-finished mkswap and swapon implementations I'm adding. That should be enough to cut a toybox release, clearing the way to upgrade the kernel to 2.6.28...
Met with Mark and Stu for lunch. Alas, I was operating on four hours of sleep so don't remember much. Apparently the trip to California's been rescheduled for tuesday-thursday, so I leave monday and come back friday.
Debugging early kernel boot without a working console is evil. (I miss User Mode Linux, where you could stick a printf into the source code and it didn't need a working console for you to see it. Alas, UML doesn't seem to like uClibc, so adding it as a hardware target is more time consuming than just hitting the qemu version of initramfs directly with a large rock until it gives in.)
Another long, frustrating day of debugging something that wouldn't speak to me, but I finally got it to confess.
So the problem I've been having turns out to be that putting /dev/conosole in initramfs and trying to use serial console is Unhappy. This took many many hours of staring at blank screens to track down. Eventually after spending yet another day frowning, guessing, reading source code, I just booted the vga virtual terminal and _that_ worked. I have an initramfs shell prompt; the wrong _one_, but it's booting, and it's in initramfs.
The console subsystem is the problem. It's got a /dev/console which is readable and writable and c 5 1, and when I don't feed it a console= argument it happily writes out to the VGA virtual terminal. (Why am I compiling _in_ the VGA virtual teriminal? I need to strip down .config a bit, it seems.) And once I've booted up to a prompt, if I mknod a /dev/ttyS0 that's c 4 64 and echo to it, I get serial output just fine. If I say console=/dev/ttyS0, I get nothing. If I add /dev/ttyS0 to the initramfs, it doesn't help either.
Right, NOW I can add printk() calls to the darn kernel to see what the heck it thinks it's doing. In the morning, anyway...
Met with Mark for lunch, got the demo of Gentoo From Scratch, got a fresh todo list.
Here's an extract from an email I sent earlier today, apologizing for being overworked:
Right now I need to get initramfs packaging working, finish debugging the new hardware target mechanism for FWL, figure out what the heck's wrong with trying to use User Mode Linux as a fake hardware target for test purposes (I'd hoped to use that as a test platform for initramfs but it's turned into its own bottleneck, segfaulting before boot and refusing to statically link against uClibc), get powerpc working in the 2.6.28 kernel so I can finally leave 2.6.25 behind, upgrade the broadcom patch to work with 2.6.28 (some of it got merged so the current patch doesn't apply), upgrade trx packaging so it's adding the extra 32 byte header that the wrt610n needs, test out the uClibc-svn version, reimplement squashfs packaging and get the appropriate patch from the .git tree and report feedback to the kernel list in hopes of helping get it merged, make travel arrangmets to go to Cisco next week with mark, work out what Mark and I are demoing for the Cisco guys, get the xylinx toolchain paperwork signed and sent to that guy in australia for the toolchain work Stu is doing through Impact Linux, meet Stu for dinner and get a status report on that project...
That's what I remember off the top of my head. I'm know I'm forgetting all sorts of stuff. That's not counting the todo items for me Mark posted to the impact list (all those extra flags various commands need), or the two new todo lists he sent me during lunch (where we went over GFS and argued about the design a bit). Oh yeah, and I promised the uClibc guys I'd get some converted locale data for them. And the Neuros guys sent me some set top box hardware I haven't had a chance to _look_ at (took it over to Mark's so he could poke at it a bit, but I haven't got an HDTV to hook it up to yet). The micasaverde.com guys seem to have given up on me, I have their hardware sitting under my kitchen table but haven't had time to look at it in two weeks; their bug was almost certainly load-spike driven memory exhaustion, which they didn't want to hear but it was probably the truth. Couldn't easily _prove_ it under a 2.4 kernel, though.
So yeah, I'll try to work cmake and dvv in there. Sorry for letting this drop on the floor so long...
Since then, the trip to California has gotten dates attached: monday-wednesday next week, meaning sunday and thursday are taken up with travel. (Travel takes a day. You can work with your laptop at the airport and on the plane, but trying to stick it in at the beginning or end of a day of doing other things just doesn't work. Maybe under Obama it'll start to again; he might dismantle the TSA completely.)
Things I forgot to mention: put out a toybox release. New one: dig through the openwrt (or old linksys build) infrastructure and see what kind of kernel image it's building if it's not a vmlinux and it's not a bzImage. (Done.) I'd like to push my miniconfig stuff upstream into the kernel...
Feeling just a touch overwhelmed with todo items.
Catching up on podcasts. I think the December 23 episode of Rachael Maddow's show was better than her end of the year awards ceremony.
Ooh, David Lang pointed me at Firefox's about:config entry "toolkit.networkmanager.disable", which if set to true rips out something firefox should never ever ever have implemented in the first place. Thanks!
Working on a hw-uml target to build User Mode Linux, which is fun to debug things like initramfs with. (A preposition is an excellent word to end a sentence with. And we start sentences with "and", and have been known to boldly split infinitives that everybody has split before.)
I'd like to tell UML that its base arch is i686, but I can't see a way to specify that. Digging in the makefile... I have to specify "SUBARCH" on the command line, which means I should add a LINUX_FLAGS like GCC_FLAGS and BINUTILS_FLAGS. Except this is a side issue, the x86_64 ARCH=um build just went:
fs/hostfs/hostfs_user.c: In function 'set_attr': fs/hostfs/hostfs_user.c:302: error: implicit declaration of function 'futimes' make[2]: *** [fs/hostfs/hostfs_user.o] Error 1
I am _so_ glad that I don't depend on this crud anymore. Ok, try 2.6.28... Ah yes, I need USE_UNSTABLE=toybox in order to apply the patches to USE_UNSTABLE=linux. And at least part of the broadcom patch is already there in 2.6.28, so just symlinking it doesn't apply (yank it for now)...
And 2.6.28 has the exact same bug. So in three releases, an obvious build break hasn't been fixed. I guess both the other users of User Mode Linux gave up on it too? Ah, no, it's a uClibc thing. So UML won't build against any release version of uClibc or older versions of glibc. Right.
Ah, updating qemu-svn and rebuilding fixed the powerpc segfault I was seeing. Cool.
Wow User Mode Linux is crap. I built an x86-64 version and it paniced before giving me a shell prompt. I tried to build an i686 version and it went "no, you're building on a 64 bit host, you must be building a 64 bit version". The top level Makefile unconditionally calls "uname -m" and parses its output; switching it to ?= isn't good enough because it's recursive makefiles that don't pass all the environment variables through. So it cannot be cross compiled without patching the source, or providing a special uname that lies.
Patched out uname -m and just hardwired in "i386", and that worked but then the link died trying to statically link against uClibc. Which is weird, because it dynamically links against it just fine?
Renamed package-mini-native.sh to system-image.sh, which is something I've been meaning to do for a couple weeks. Now the tarballs and the scripts producing them all have the same name, but it'll be a while before I stop typing "pack[tab]" to try to open the file. (I'd have a similar problem still putting around "2006" on my checks, except Fade does the bills requiring mailing things, so I mostly pay for things with a debit card or cash).
So in theory the "kill" command can specify jobs instead of PIDs. (This is why there's a shell builtin version instead of kill.) Jobs are things you background with & (or with ctrl-z and the bg command), and they're numbered just like pids are. The first one is #1, just like PID #1. So "kill 1" would try (and fail) to kill init.
The bash man page says "jobspec", but grepping for each instance of jobspec
it never once says what a jobspec _is_. The "bg" command accepts just
raw numbers. Luckily,
And after all that, it doesn't help. Jobs aren't visible to subshells, so attempting to kill jobs from a signal handler doesn't work. Luckily, I solved this problem before (for the distccd called from run-emulator.sh): 'trap "kill $(jobs -p)" EXIT' does what I want because the $() inside the "" is evaluated when the trap is set, so it resolves to process ID numbers before the subshell gets run. The problem is, you have to run that line _after_ you background the process, so there's a one line window where they can hit ctrl-c and not kill the background process. Still, at this point I don't really care, it's primarily an aesthetic problem that's hard enough to hit I'll stop fiddling with it and move on.
Sigh. Except it's not working. Killing the pipeline doesn't kill the make process that's a child of it. (I could trivially "killall make" but that's the wrong solution; other make processes could legitimately be running as the same user on the system; forkbomb.sh comes to mind.)
And "killall -g $(jobs -p)" isn't working because the busybox killall command doesn't understand -g. I can't do it myself with ps and grep because the busybox ps command doesn't show parent process IDs (or any parent/child relationship, really). Groveling around in /proc myself seems a bit overkill somehow.
The pipeline in question is (make blah-blah-blah || dienow)& and although I could turn that into (exec make blah-blah-blah)& and thus eliminate the subshell, then it wouldn't be able to report an error exit back to the rest of the build.
Ah, according to SUSv4 "kill 0" takes out the current process group, and THAT does what I want. Right.
Mark told me the name of the kernel file I need to grab for hw-wrt610n,
but I don't remember it and the .config I have only seems to be building
vmlinux. He also told me the name of the file that adds the extra
header to the trx image, but I don't remember which one it was. (I'm
guessing addpattern.c which produces a 32 byte structure, rather than
This is why I like to have things emailed to me: I forget otherwise...
The gnome xterm highlights URLs when you mouse over the, but when you right click on one it doesn't light up the "copy" option (you have to drag the mouse and highlight just like any other text to get that), instead it has a "copy link address". What's the point here?
Sigh. The 24 hour places around UT play loud annoying rap after midnight, to keep homeless people from trying to come in and sleep in the booths. I need much better sound cancelling headphones; removing 20 decibels from (c)rap is not nearly enough.
Should I find it ironic that there's a 24 hour donut shop down the street from Kirby Lane that I've never seen a single police officer in, but Kirby Lane has two tables of 'em right now? The police in Austin eat healthy, it seems.
Ok, this might be a disruptive technology that breaks the size limitations on the displays for mobile devices. (It needs something to project on, but that's easier to come by, or transport for that matter.) Ok, it probably doesn't work very well in direct sunlight but neither does my laptop's backlit LCD here in Texas.
Elze would prefer I link to her website rather than her flicker photoset. (Judging by the photos, she has a more interesting life than I do.)
I recall having written a simplified mkswap.c, although the one in busybox 1.2.2 isn't it and it isn't in toybox... Ah, I checked it in as busybox svn 15704. A reminder that "last release before Bruce made working on the project intolerable" is not the same as "where I actually stopped working on it".
This comes up because I have various changes I need to make to busybox and I'd just as soon replace the appropriate applets with toybox instead, but one of those is ash, and reviving toysh is a biggish unsticking. The point I'm stuck at is that argument parsing happens in the wrong order for handling multi-line options (which includes everything from here documents to if statements). So I have to back up and redo plumbing before moving forward. Eh, it happens.
Lunch with Mark and Fade at Schlotzky's, now hanging out at Epoch. Some Dell engineers at the next table said that IE 8 is based on Mozilla 5. (The frightening part is they would know.)
Teaching FWL that a target can have a BASE_ARCH, where only packaging varies (new kernel, same root filesystem). (End result is that $ARCH is set as normal, and $ARCH_NAME is the one you called. Which was, in fact, already the case.) I'm trying to figure out if creating cross-compiler-$ARCH -> cross-compiler-$ARCH_NAME symlinks (and so on) are worth the complexity here. (The problem is that the path $CROSS is set by the build and cross-compiler.sh just uses it. It got abstracted away, now I need to manipulate it. Maybe I should just link the tarballs...)
On the other hand, the end of cross-compiler.sh does a "cd $BUILD; tar -f blah.tbz blah" so those paths aren't _really_ abstracted away, are they? CROSS is the path to the cross compiler you build things with.
Hmmm, doing parallel builds with a BASE_ARCH is kind of tricky. Assuming that everything with a BASE_ARCH will have a hw- prefix (it's hardware) then I need to teach buildall to build all the non-hw targets first, and then do the hw ones. And replicate the build.sh trick t