Search Results: "ana"

10 November 2005

Joey Hess: BBS

Sometime over the years, I've managed to forget, or block out, most of my memories of the time in high school when I used BBSes, before the internet. Even though I still have friends from back then, and even, come to think, host a rack of computers at the house of a guy who was once a sysop. Those couple of years (how many?) are mostly a blank, and not something I think about much. I can't remember the first time I used a BBS. I can remember clearly and crisply the first time I used a unix system. A bit of it came back when I didn't pirate the BBS Documentary, an epic 8 part series of interviews with the people who brought us the likes of XMODEM, fidonet, pcboard, and ansi art. Highly recommended. Amazing how just looking at so many of the people immediatly reminds me of the BBSers I knew at the time. Its producer, Jason Scott, also runs textfiles.com, a huge collection of all sorts of text files from the 60's through 90's, which mostly originate from old BBSes. His historical bent in preserving and documenting this stuff really appeals. I poked around the net today, managed to find some docs about one BBS I remembered using, and nothing about a couple of others. Logged into a telnet BBS or two and remembered just how angry fruit salad and silly to use those systems really were, and also how much they probably contributed to my enduring enjoyment of unix, muds, and email. I thought it would be nice to not forget about this stuff, and so I coded up a reminder, merging the ancient plain text files with what's currently new and spiffy (weblogs natch), and creating this webblog which has a random text file posted to it each day. Of course, the subjects range from anarchy, to programming, to phone phreaking, to porn, so view at your own risk, just as if it were 1992, and you were were dialing a number your war dialer had found while you were away at school. Would you like to play a game?

David Nusinow: Modular Server Debs!

I've been relatively quiet lately because I've been plodding along, working on modular packages for Xorg. For those who don't know, the next release of Xorg will actually be two releases of the same code. One release, 6.9, will be based on the old monolithic build system. This system requires me to build every single part of Xorg whenever I want to update any one part. This means that whenever I push out an Xorg fix, no matter which component it's in, you have to download all the other components even if they are 100% identical to the previous version already on your hard drive. We've all lived with this for a long time, and while it's not pleasant, we all seem to get by. The packaging apparatus for this system is mature, stable, and well understood, if complex. That's why I've been able to get the 6.9 release candidate packages out to experimental fairly quickly after they are released.

The other release happening is for 7.0, which is obviously a major version number bump. The actual code you run for 6.9 and 7.0 is 100% identical, but the build system has been totally rewritten around the venerable autotools (you know... configure /make/make install). Each piece has been split out from the others so that you can build any one component without building all the others. This means that if we want to ship a driver update, you don't have to download all of the fonts and other things that weren't touched. That also means that you won't have to install the drivers for cards you don't own if you don't want them. Furthermore, it lowers the barrier for things like hacking on X significantly.

The problem with the modular tree is that the packages for it are brand new. Ubuntu shipped modularized versions of the libraries, and I've already stolen those, fixed them up for Debian, and built them locally (they're sitting in our svn repo, but running them won't get you anything at this point.) The server and driver packages are brand new, and I've been taking the packages from Ubuntu's development branch and working on them for Debian. Today was a milestone day because in addition to the libs, with Daniel Stone's constant help I've finally managed to build packages for the modular X server itself. Now I can't run it yet (I haven't packaged the drivers and a few other bits) but the fact that I managed to produce what will be a functional server package is a huge step, and constitutes the cornerstone of the whole thing.

Once we can create packages that can actually run on at least the machines of the XSF, we can start looking at getting the packages in to the archive. Since these aren't well tested like the monolithic packages, we'll have to do a lot of polishing to get them to the same level of quality. My goal is to get that done for etch though, and I think we can do it. Exciting things are happening, and I'm hoping that the modular packages will encourage more people to hack on X, leading to even more exciting things. Build that momentum.

Jordi Mallach: Discovering Montr al

It's been a week since I arrived in Montr al, and had not had a free minute to blog about it. There's tons of things to write about, the activity and fun has been mostly non-stop. The travelling wasn't perfect, as always I could not sleep a single minute. Instead, I watched Charlie and the Chocolate Factory, which I had wanted to see for some time and was nice, and Batman Begins, which was positively surprising, being a Batman movie. When I arrived at Montr al's airport, the fun started soon enough. Coming from Spain and having this scary looking face and beard didn't help much to survive customs. When I got in the line and handed my arrival card, I was sent to the immigration office straight away. I was asked what I was coming to Canada for. "To a computer conference", I said. Well, having no "invitation" or anything for this conference made me a quick suspect. After being freed, I walked on my way out, and on the next control, I had my bag searched. And again... "Do you have any document about this conference?". And then, to the real baggage inspection room. As the guy started opening my bag, I suddenly remembered about the fuet I was carrying for Vicente, while I had said, confidently, "No I don't carry any food" in my card. Luckily he saw I was carrying a DragonLance book, liked it and let me go. The next thing was, while waiting for the bus that should take me to Downtown Montr al, my first conversation with a non-airport staff Canadian. So this old woman in her seventies comes along... and the first thing she says... "I hate those fucking moslems". I try to not look too much like "WTF!?" and without replying, listen to this totally moronic and racist monologue about how moslems in Canada come to the country to not work and live of the country's welfare. "Why should they work? They stay at home, and watch TV and fuck. That's all they do. The more kids they have, the more money they get. I don't believe in welfare". So I got on the bus quite shocked. After a bus trip and lots of walking due to forgetting I had to get on another one, I got into the hotel, and started meeting all the people. My first dinner was with Gustavo, Salgado and Carlos, and I felt I wanted to die, I couldn't keep my eyes open. The conference started next morning for me, and has been the usual dynamic as always, only that now it's the first time that I really find myself somewhat useful during the sessions. :) Meeting mdz and kiko happened that morning. That was when all kinds of stuff started to happen. Why do I have to get such bad influences?


Kiko and I managed to not fall over while taking all of these pics in Mont Royal

9 November 2005

Antti-Juhani Kaijanaho: W00T! 10.000 words!

I've reached the one-fifth mark in my quest to write a novel in a month. I'm five thoudand words behind of the linear pace, though. NaNoWriMo 2005 Participant

Junichi Uekawa: assembly output for x86_64.

I compiled a C program which just gives out 'hello world', and analyzed the gcc assembly output.I suppose subq/addq for rsp is for int parameter; or it couldbe an ABI requirement.It is surprising that pointer is movl'd to edi (32-bit) forthe puts parameter.To set eax=0 (for the return value), xorl (32-bit) is used.I wonder what happens to the higher 32-bits.Maybe it's time to seek for the CPU reference.

Matthew Palmer: Redhat Considered Harmful

I try hard not to hate Redhat, I really do. I don't visibly grimace when someone says "I'm running $REDHAT_DERIVED_DISTRO", and my first solution to "I can't get this to work on $REDHAT_DERIVED_DISTRO" is almost never "just install Debian,Ubuntu ". But Redhat makes it so hard to not beat them with a stick. For instance, I'm working on building a SOE for a client, and so I've got a bunch of scripts (calling random poorly documented and hard-to-find utilities) to help me do that. Naturally, I'm pruning the package list, which requires me to rebuild the list of packages which are on the CD. No problems, I can handle that. Oh, but the tool that builds the package list can't deal with the correct "ordering" of packages in the list. Why is ordering important? Because, and this will make you laugh, the installer can't actually deal with dependencies. Yes, that's right, anaconda will install your packages in any old order you specify, regardless of what is actually needed. Brain-damaged, certainly, but I've dealt with Windows, so this is ultimately a minor setback. The tools for building the packages lists are in a certain package, which I dutifully install. They then proceed to fail horribly. Why, do you ask? Because the script requires python modules from another package. Gee, wouldn't be handy if there was a mechanism by which a package could specify that it needed another package to operate? OH WAIT, THERE IS -- IT'S CALLED DEPENDENCIES, FOR $DEITY'S SAKE! YOU WROTE THE GODDAMN RPM SPECIFICATION, REDHAT, WHY CAN'T YOU ACTUALLY USE SOME OF IT'S FRIGGING FEATURES! But wait, there's more! Installing the package which contains the module doesn't actually make the module accessable to anything else on the system, because the module is installed in some god-forsaken, out of the way location, where Python fears to tread. You need to specify PYTHONPATH to make it work. Apparently someone was sure that specifying absolute paths in scripts (instead of letting the system search it's environment) was a bad idea, but didn't have problem with not putting modules in standard, well-known locations. Then, of course, the (other) tool segfaults. Why? Because it's reading an empty file. Wow. An empty file causes this thing to fall over in a screaming heap. Not "Sorry bub, but your file's empty" just an unceremonious segfault. Wow. Thanks. And that's even before we get around to actually doing an install...

8 November 2005

Erich Schubert: On a binary driver interface for Linux

Some japanese companies have requested that the Linux kernel gets a "stable" (whatever) kernel interface for binary drivers. The obvious reason is, that they want to be able to add (illegal!) closed source drivers to the linux kernel. This is a bad idea for a couple of reasons, that have been discussed in a couple of places. Instead I want to show you a couple of examples to illustrate that. First of all, let me name the binary, closed-source drivers of ATI and Nvidia. They totally suck. They are unreliable, cause system crashes, don't work with power management and so on. Is this the type of driver you want? Commercial driver development is not capable of supporting the development speed and models of opensource. Other examples to show you the problems with all the closed source stuff include many wireless access points such as the isl3893 platform or broadcoms AR7. They duefully released the kernel code they used and maybe some drivers, but even the kernel code they touched is broken to large extends (that's why Intersil/Conexant doesn't support https on their isl3893 accesspoints, because they broke their libc in a way they can't get SSL to work on it any more). Now let me give you a good example: USB. There the interface to the hardware was openly and clearly specified, also for many many uses. The result is, that today basically any memory stick and digital camera adhers to this standard, and there is only one driver for it. Thats why they "just work". So instead of requesting a binary driver API in the kernel, these japanese manufacturers should instead start an industry initiative just like USB to standardize on a common stable hardware interface so we don't need a different driver for every hardware. Our real problem is that no hardware is like the other, and nothing is properly documented. And hardware manufacturers earn their money with hardware and haven't got much expertise on software...

Martin F. Krafft: Call from Ghana

I just received a call from Ghana. Supposedly I was sent a very special offer yesterday about a business transaction of a whole lot of money. Wow -- actually I only guessed this for I could barely understand a word of the babble. I filter spam, no really, I do. And those mails that get through currently get auto-replied with my telephone number, for I shouldn't be typing <slaps himself>. I have no clue whether one such auto-reply prompted the scammer to call me at this unholy hour. How curious. I told the guy to resend the mail. I mean, www.419eaters.com will dig this (This is not a promise I will carry through... and sorry for the false link. 419eaters.com directs elsewhere than www.419eaters.com does...) Damn, and now I feel somewhat trist witnessing what some people go through just to survive.

Mike Hommey: Bones scattered all about

I’m not sure I have to be proud of the fact that my name has a meaning in klingon.

Clint Adams: Feel the zsh of the rhythm of the night

Say, for example, that you were a rabid Miami Sound Machine fan, but you were subjected to grave trauma, and now you are so emotionally handicapped that a mere reminder will send you into hysterics. Perhaps you keep your diary in multiple files in a directory somewhere, and you decide that you want to revise history and wipe out any files that mention Gloria Estefan.
rm $(grep -l "Gloria Estefan" diary/*)
That's pretty easy, but, maybe you want to preserve as much as you can stomach, and you've learned that you can handle seeing Gloria Estefan every once in a while. So you only want to delete files that have Gloria Estefan more than once.
rhythmisgonnagetyou()  
[[ $(grep -c "Gloria Estefan" $REPLY) -gt 1 ]] 
 
rm *(+rhythmisgonnagetyou)
Of course, you can make it much more complex.

Alexis Sukrieh: Backup Manager 0.5.9b is out

A new release of Backup Manager has just been published: 0.5.9b
This release provides DVD burning support with growisofs and two new
methods for generating archives: one for backing up SVN repositories
(with svnadmin), the other for making generic archives based on the
output of a given command. Some bugs have also been closed, the
generated MD5 files are now compliant with the md5 program.
The Debian package will come soon…

Clint Adams: Covered in chicken blood

Some of the greatest Flash cartoons ever made have been unearthed again. Alas! Plenty of them are still lost. Also, a frightening Journey thing.

7 November 2005

Antti-Juhani Kaijanaho: Klingon Hommey

As I wrote earlier, I am trying to learn the Klingon language. Today, I caught up on Planet Debian postings and saw one of my fellow developer's name in a completely new light: Hommey is interpretable as Klingon. Hom means 'a bone', and -mey is the general pluralizer. Normally Hom would be pluralized by -Du', because it's a body part, but when -mey is used, it implies that the bones are used not as parts of a body but in some other usage (as weapons or something like that). In a poetic context, Hommey can also mean bones scattered all about.

Clint Adams: Which way did it go?

I only have two things to say to this. This and this.

Simon Law: Jeff Bailey Love Day


Jeff Waugh escaped
Originally uploaded by magicfab.
Two Sundays ago, Jim and I walked down to Ubuntu Love Day. The Ubuntu Below Zero conference is being held at the Holiday Inn in Chinatown. That's the one with the fake Chinese tiles on the roof, which is sort of tacky. We found our way downstairs to the conference room and sat down. The previous night's revelries still had quite the effect, so I'm afraid I drifted in and out while listening to people speak. I thought I had rid myself of this habit, but apparently university has trained me to consider digital projectors as sleeping aids. I'll have to do something about this one day. I got to see some fairly interesting people: Mattias Klaus, whom I met earlier at Jeff Bailey's place; Fabio Di Nitto, who is incredibly jolly; Chris Peterman, who was with his classmates from Clarkson; Colin Watson, whom I thanked for working so hard on Debian; Jeff Waugh, who dressed up as an inmate; and plenty of others. Oh, I managed to meet Andrew Mitchell in person, but we failed to have a proper CHUG meeting while we were all in town. We broke for lunch, which was held in the hotel restaurant. A buffet, with some Chinese-style dishes, was being served. There, we had to negotiate with the unilingual (Cantonese) staff to find out what Jeff could eat. We had a special order of plain white rice brought for him and we were informed that it was safe for him to eat the stir-fried vegetables. I suggested to Jeff that he ought to keep a phrasebook on him whenever he travels. On each page, one per language, there should be a written description of what he can and cannot eat. Then, he just has to show this to waiters who don't speak English or French.

Stocking the buffet
Originally uploaded by magicfab.
For reference, the characters that mean "vegetarian" in Chinese are and . Most of the time, they mean "vegan", but there are some places where eggs and oysters are considered vegetarian. After lunch, Mark Shuttleworth gave Jeff a very nice birthday speech. He also gave Jeff a nice bottle of wine, which was very nice. And Matthias came up to give Jeff a bottle of fish-oil pills, which was very odd. Then, there were two Birds Of a Feather sessions, involving how to make an Ubuntu package and how to be an Ubuntu advocate. Being upstream to both these issues, I sat in the middle of the room and listened to both presentations at once. This was quite interesting, and slightly taxing. After this was done, we broke up once more. The plan for the evening was to meet for dinner in the hotel lobby. This transformed to meeting outside the front door. Jim, [info]wlach, and I showed up and were greeted by this mass of people. Since there were stragglers and I knew where dinner was to be held, Jeff took a group of nineteen people in the metro. I followed about ten minutes later with a group of eighteen. We met up on St-Denis, and by this time we had lost some of the more impatient, and more hungry, people. Eventually, a group of twenty-three were milling about outside Le Nil Bleu. Angie had made arrangements for us to be served a set meal, and they had agreed to seat twenty-five of us. I went inside to let the staff know that we had arrived. When 20:30 came around, we were let into the restaurant and seated. I think the kitchen was still preparing food, because we had to wait about an hour before being served. Unlike my previous experience there with Jeff, the food was quite good this time and the service was very attentive. We enjoyed ourselves very much, and Jeff seemed to be having a very excellent birthday dinner. Some of the guests were not so happy, because the food was a little spicy for their European palates. Since gratuities are not standardised around the world, we discovered that some people had not tipped. To cover the embarassment, Angie and I made sure that the wait-staff were adequately compensated for their efforts. I'll be sure to go back to this restaurant again, but with a more significant crowd to ensure good service. After eating, a group of us including Matthias and Tollef went up to B l K , which was just a little north on Mont-Royal. That's a really interesting bar with beautiful tiled floors and ostrich heads on the walls. We enjoyed the lovely music, had a very good conversation there, and laughed until we were all exhausted. Since the Canonical people had to be awake for the 09:00 keynote speech the next day, they left early. Jim and I bid goodnight to them before we staggered home.

6 November 2005

Clint Adams: Dead uncle Allotheria

flurble, would you rather have a pet badger or a pet koala? Update: Matt gave this an index of 2 . Update: She picked koala. Reasoning is implied here.

Clint Adams: OpenMG

The file extension for OpenMG appears to be .omg. Four people will find this amusing.

Clint Adams: RFC 2396 URL encoding in Z-Shell

Stolen from Bart Schaefer. Isn't it so pretty?
urlencode()  
    setopt localoptions extendedglob
    input=( $ (s::)1  )
    print $ (j::)input/(#b)([^A-Za-z0-9_.!~*\'\(\)-])/%$(([##16]#match)) 
 

5 November 2005

Anthony Towns: Britney's Memory Management

One of the things about the whole money thing and free software is the question of whether it’ll take all the fun and spontaneity out of hax0ring. As it turns out, that doesn’t even work when you try; so instead of doing dak work last weekend, like I’d planned and like the market was indicating, I ended up hacking on britney until about 5am Sunday morning, leaving the dak stuff to be spread over the week, instead. (After the last post, dak might seem cursed, but trust me it’s not. More on that RSN, but not just yet) For those playing along at home, britney is the name of the scripts used to update Debian’s testing distribution; basically it automates some of the hard problems of Debian release management. Naturally, this is a pretty tricky job – there’re over 200,000 packages in Debian unstable (spread across eleven architectures), with fairly complicated sets of interdependencies amongst them. It gets complicated enough, in fact, that the core analysis britney undertakes isn’t just too processor intensive to do in perl or python, it’s too memory intensive to use standard malloc for its data structures. (Cynical and Coding, and the UQ CS228 class of ‘98 will probably have some idea of the fun to come at this point…) The problem is that britney uses an absurd number of linked lists to resolve dependency issues, with each entry in the list being an independent block of a dozen or so bytes; and adding the usual malloc overhead to this can effectively double the memory usage. Worse, britney also likes to reuse memory quite a lot, does a fair bit of backtracking, and generally acts like the prima donna she is. Up until last week, britney’s memory was managed by the use of a parallel bitfield indicating whether memory was free or not: so britney would first allocate a 128kB block using standard malloc, note it’s all free, then every request for 12 or 52 bytes would result in some bits being twiddled; and every free would twiddle the bits back, so they could be reused later. This means two things: one is that the free invocation has to include the size of the memory to be freed as well as the address, and the other is that finding an appropriate sized block of freed memory can be awkward, leading to some degree of fragmentation. This fragmentation seemed to lead to britney having a gradual memory leak, which would mean that if the release managers were doing some complicated transitions gigabytes of memory would end up being used and OOMing; or, since britney runs on ftp-master and it’s probably not a good idea to have the OOM killer start on the machine that ensures the Debian archive’s integrity, the ulimit is reached, and britney aborts unhappily. Unfortunately, though, the use of a “roll your own” malloc means you can’t use the standard memory checkers to see what’s going on, so you’re left with guessing and hoping. And as a consequence the memory leak’s been around for ages, causing fairly regular minor annoyance. This changed last week when Micha Nelissen (neli) got into the act:
<neli> why does it need so much memory ?
<aba> neli: because it needs to check how the changes affect the installability count
<neli> aba: ok…but still does not seem like a big deal
<neli> how large trees are we talking then?
<aj> it has to do a lot of backtracking
<aj> how large is the longest dependency tree in debian?
<neli> backtracking only takes time, not space, right?
<aj> you need a list of things to backtrack over
<aba> neli: it also consumes memory, at least with the current dpkg-implem ntation
<aba> (well, there are ideas how to avoid this memory fragmentation, but that’s something else)
<aj> (it’s not actually memory usage, it’s memory fragmentation)
<neli> hmm, bad memory manager ?
<aj> imperfect, *shrug*
After poking around at getting britney to run locally, and doing some basic analysis on how it was used, neli decided to rewrite the memory manager to use chunk-size pools – so that a separate pool would be used for 4 byte allocations, for 8 byte allocations, for 12 byte allocations, etc. That’s possible due to two factors: one is that the special memory allocation is only needed for data structures which are all made from fairly small sizes, and are a multiple of the word size. It also means that fragmentation can be avoided completely – since you can use the “free” elements to store a free list taking up no extra space. Happily, that change also made the memory allocation much simpler. (It also shows the benefits of a fresh look at code; I’d been thinking of doing something similar for ages, but always been stopped because I couldn’t figure how to make it cope with the various different sized blocks I’d need. As it turned out though, I’d solved that problem ages ago when I wrote a separate allocator to deal with strings, which would’ve required my malloc to cope with a much larger variety of sizes) What it didn’t do was actually solve the memory leak. Which was pretty confusing, since the old memory checker had some tests to ensure that memory wasn’t really being leaked, and if the memory’s not being lost due to a missing free, or being lost to fragmentation, where is it going? At this point, the real benefit of having a simpler malloc implementation came across; because suddenly it was plausible to add some debugging code to allocate a separate pool for every memory allocation, and to report how much memory is being used at any point, per line of code. That gave me output like:
pool 8B/1:751; 1962683 used 1965960 allocated (99.8% of 22 MiB)
So I knew that line 751 (of dpkg.c), was allocating 8B chunks, had used up to 22MiB in the past, and was currently using 99.8% of that. (Actually, I made an off by one error initially, so the “8B” above is actually 12B, as you can see if you divide 22MiB by 1965960) That let me see two “leaks”. One turned out to be fairly easy to diagnose; as an optimisation, when I say “package foo is installable”, I note that “but we used bar to see that, so if we later update/remove bar, note that we’ll have to see if foo is still installable”. So the datastructure for bar ends up with a linked list of all the packages, foo, that relied on it. But I don’t check that list for dupes, so if I note that both bar and baz were required for foo to be installable, then update bar, when I recheck foo, I’ll add it to both bar’s and baz’s lists; which is fine for bar, whose list I cleared when I updated it; but not so fine for baz, because it’s now got two entries for foo. Having already added a check for dupes when trying to see if my guess was right, extending that check to skip the addition was pretty easy. The other leak required a little more investigation. It was in a fairly tight loop which could reasonably be using a fair amount of memory; but by the end of the loop it should all be freed. Adding some more debug code to the allocation functions confirmed the problem:
<aj> pool 8B/11:1231; 1618157 used 1703936 allocated (95.0% of 13 MiB, 9.05% current)
<aj> so it looks like ~9% of those allocations are never freed to me
<aj> 9.05% = used/alloc
<aj> where used is incrememnted on b_m, decremented on b_f
<aj> alloc is incrememneted on b_m, never decremented
The code was meant to either add the allocated block to a larger list that’s being traversed, or to free it immediately – the problem turned out to be that there were some nested ifs, and an internal if was lacking an else that should have freed the block. Fixing that changed the results to:
pool 8B/11:1228; 160 used 131072 allocated (0.1% of 1 MiB, 0.01% current)
Which both dropped the leak – only allocating a maximum of 130,000 nodes instead of almost 2,000,000 – and resulted in almost all the allocations that had ever been made, having been freed once britney had been running for even a fairly short while. As it turned out, though, the cure for the first leak was worse than the disease – checking for duplicates in a linked list turned out to take too long, and the memory wasted in that section wasn’t that big a deal. Using a red-black tree or similar instead would’ve been a solution, but so far doesn’t seem necessary. There haven’t been any OOMs since, happily; and even better, the reduced bloat seems to have made the overall checking a bit faster. Sweet.

4 November 2005

Matthew Palmer: When Technology Goes Wrong

A dramatic title for a not so dramatic post. The Sydney suburban train network runs several sorts of rolling stock. The newest of these are the much-maligned "Millenium Trains", which bring local train users (all 18 of them) into the 20th century. One of the features of these technological masterpieces is an irritatingly obsequious voice which announces the current and next stations on the train's journey, and an LED board displaying the same info. So far, so good. Of course, I was a little curious as to how the boards and little-miss-noisy were kept in-sync with where they were. I was thinking transponders, maybe something that the train guard did. Then, last week, I found my explanation. This train announced each station as being the preceding one. So, we'd stop at Central, l-m-n would announce "This train will stop at Museum". We stop at Green Square, l-m-n says "This train will stop at Central". And so on. At least the voice and the board were in sync, even if the voice and reality were eyeing each other off at quite some considerable distance... My goal now is to find a train which is announcing stations for the wrong line completely, rather than just one station behind on the current line -- but considering I only get these new-fandangled millenium trains a couple of times a week (they spend the rest of their time in the sheds being fixed, apparently) it may be a while.

Next.

Previous.