This Space for Rent

Jan 31, 2011

Cute baby picture of the day

Silas & his friend Abby stop for a snack at the frozen yogurt joint

Stopping for frozen yogurt on the way home.

Jan 30, 2011

Domestic vermin picture of the day

Easyshare Mavis

The domestic cat really ties the room together.

Jan 29, 2011

Okay, now this is getting silly

Ridiculous things to do with a front rack

A somewhat impractical thing to carry on the front rack.

1 comment

Trouble comes in twos

Well, my grand plan yesterday was that today would be a good day for an R200, but that plan died the true death when it took me until 1am to finish tweaking the MLCM’s handlebars. So I decided that this would be a good day to just do an R100 in the afternoon, so I zipped out and up the Springwater Trail at a pretty good speed (despite many slow sections where I had to creep around small children doing field experiments with brownian motion) and got up to the edge of Boring in about 65 minutes, where my plans to continue up to Sandy and then return via Ten Eyck and Bull Run Road were abruptly aborted when a drive-side spoke went snap as I went stomping up the steepish hill at the east end of Telford.

So, after wrapping the fractional spoke around a couple of still-intact ones, I turned around and rolled back into town so I could replace the offending thing (and if I was very lucky, maybe go out again before daylight vanished.) But when I reached 82nd, I tried to rotate the pedals backwards while I waited for traffic to clear, only to have the chain hang up in the derailer.

Huh. That was funny. But it became a little bit less funny when it happened again at 17th & Tacoma, and a lot less funny when I looked at the rear derailer (in my case, the only derailer, but it happens to be the one by the rear wheel, so “rear derailer” counts) and saw that it was canted quite a bit off towards the wheel.

Needless to say, I did not make it out again. When I got home, I checked out the derailer by shifting it from 42×32 down to 42×11, and got the chain jammed between the (woefully bent out of line) derailer hanger and the cassette at ×11. So after replacing the broken spoke (my LBS provided a few spare spokes when I had the rear wheel built, but my woeful lack of organization has resulted in them becoming hidden somewhere in the basement. So I took a straight-gauge spoke off the old el-cheapo 700c wheel I bought to test whether skinny 700c t[iy]res were faster than the 650b wheels that were originally under the MLCM (answer: yes, they were considerably faster, even with el-cheapo wheels and tires) and used it instead) and cleaning the chain, cassette, and derailer pullies (it’s amazing just how much crud gets onto them even with fenders. I may have to buy or build a partial chaincase to cover the chainwheel and the chain at least as far back as the rear wheel rim to try and reduce the amount of crud that gets splattered up onto the chain,) I had to take my precision derailer hanger adjustment tool and adjust the hanger so (a) the derailer stands vertically and (b) the hanger doesn’t capture the chain when shifted into ×11.

I’m not particularly happy with the durability of the SRAM x-5 derailer, either. There’s a lot of play in that thing these days (the shift pulley arm is loose enough that I can easily move it ±10° out of line, and when I unbolted the derailer part of the mounting bolt assembly spontaneously disassembled and fell to the floor.) I did buy it used, of course, but it didn’t feel nearly as loose when I first put it onto the MLCM, and I’ve only ridden the bicycle 6-7000 miles since then :-(

On the bright side the handlebar tweak seems to have made a positive difference. I’ve messed up my right wrist somehow so it’s still uncomfortable to ride in the drops on that side, but the left hand is much happier with the somewhat squooshier and larger diameter handlebars now. And rotating the brake hoods down means that my hands don’t try to jam themselves into the valley formed by the hood & the bars.

And in the grand scheme of things, I’d much rather have a spoke snap when I’m 17.5 miles out from home instead of being 45 miles out and on the other side of a steep drop down into the Sandy River ravine.


Bicycle tweak of the day

handlebar tweak of the day

The cloth tape + rubber I had on the MLCM’s handlebars weren’t providing enough cushioning for non-bicycle-gloved hands, and the brake levers were rotated too high, so I went in this evening and stripped the cloth tape off to replace it with some boring old Selev cork tape (tied down with string, then shellacked to within an inch of its life.)

Hopefully this will be less uncomfortable on longer loops. If it’s not, I’ll just have to buy another B135 and revert back to my original handlebar configuration.

Jan 28, 2011

Friday Dust Mite Blogging™

late mite mite

Almost forgot that it’s friday and it wouldn’t be friday without Mites!

Old reliable

The Trek leans up against the wall at Llewellyn School

The Trek may not be nearly as sprightly as the MLCM is, but these days it’s a lot more comfortable because I haven’t been playing handlebar games with it (the MLCM needs to have the cloth tape stripped off, the brake hoods rotated forward about 10°, and the bars rewrapped with cork. Right now the hoods are high enough to force the heel of my palm down into the bars when I’m riding on the hoods, and the cloth+rubber tape is hard enough to make my carpel tunnels ache when I’m riding in the drops or on the tops.)

Too bad it squeaks like it’s got a mouse colony in it :-(

Jan 27, 2011

Great oogly-boogly! (#2)


Battlefish #1, by Silas

Great oogly-boogly! (#1)


Some sort of ninja robot that Russell drew.

Jan 26, 2011

New Code!

Discount has been pushed up to version 2.0.5 with a short laundry list of tweaks;

  • Rework the TOC code so that it uses an a name= anchor instead of hx id= (because the id= may pick up css unexpectedly.)
  • in linkyformat(), don’t pass in &imaget for image formats; pass in null instead and add a paranoia check to default the link type to &imaget if the passed-in footnote is null.
  • tweak the librarian generator so it doesn’t require ln -s for static libs
  • Repair a defect in the way >%class%es are handled; css class names are {-_A-Za-z}{-_A-Za-z0-9}* (plus some unicode characters which I don’t support yet.)

None of these (except the librarian generator, which blew up on Plan9 builds because Plan9 doesn’t do symbolic links) are tremendously important bugfixes, but it makes the code a little bit less annoyance-ridden so the next big change I do (possibly markdown extra-style footnotes?) will have all of its defects shining out all by themselves. So it’s not going to be a case where your server leaps, flaming, from the rack and plunges down to the rooftop between the dormitory towers, but it’s still New Code! and, as such, should find a nice place to settle on your PC.

Jan 24, 2011

Domestic vermin picture of the day

Dubious lap-cat

Mavis helps me program by anchoring me to the desk.

Jan 23, 2011

YAFYE picture of the day

A yellow menace freight scoots by behind a screen of trees

A grain train attempts to hide behind (the leafless branches of) a tree.


A  hideously upturned stem

Flipping the stem does give me additional height, but, gosh, it sure looks awful.

It seemed like a good idea at the time…

Wetlands between Newberg & Gaston

As I already mentioned, the weather was supposed to be good yesterday, so I thought it would be a good plan to not let it go to waste by not going out for my monthly R200 (should really be a biweekly R200, but the weather this time of year makes it difficult to schedule non-rainy loops) and what better loop than the traditional UGB200.bis? (and as a variant to the long tedious crawl up Skyline, I decided that I would vary the return by cutting down Germantown Road, then going across the St. John’s bridge and taking Willamette Blvd (etc) down to Division, where I’d return to my regular route for the run back to the ultimate control.

So if I left at 7am, I should be able to run the loop in 10-11 hours, getting back sometime between 5pm and 6pm with lots of time to stop for pictures and/or fud.

But it was cold at 6:30, so I went through my morning routine as if I’d been dipped in molasses, and didn’t actually make it out the door until 8:18am (after, of course, promising that I’d be back between 5 and 6pm.) And that meant that the only chance I had to finish up by the scheduled time was to just not stop, but to ride the 201.4km loop in one fell swoop.

So I did that – the only stops I did on the loop were for stop signs and traffic lights, plus one stop on the east side of Canby to strip off layers, one stop in Canby to wait for a train, a brief stop at Champoeg to shoot some sheep, and one stop at the intersection of Skyline & Germantown to relayer and turn on my flashy taillight for the last 15 miles to home (BTW, Germantown Road is terrifying after 9 hours and 110 miles of riding. It’s not extraordinarily steep, but it’s twisty as hell, and all wet in the traditional western Oregon style. It’s nice to come in on Willamette Blvd instead of on Skyline, but I’m not so sure I’d want to inflict the approach to Willamette Blvd on anyone else.) And I rolled in the door at 6:09pm, after creeping around the loop in 9h51 (9h35 moving time, and the remaining 16 minutes being the photo stops, clothing stops, and waiting at stop signs and traffic lights) and pretty much immediately collapsed into a heap.

I am getting more used to climbing; the formerly annoying climb up to Upper Highland road doesn’t seem to be very noticable anymore (alas, my getting-used-to-climbing does not include getting good at it. But perhaps that has something to do with not doing any loops longer than 50 miles for the past two months?)

And in the all-so-important department of equipment, I’d like to mention that the front rack and rando bag survived the loop without falling off/falling apart/scattering things all over the road. Unfortunately this is made up by my needing to raise my handlebars a little bit (the shape of the gary bars I’m using now puts my hands ~ an inch lower than they normally sit on the old nitto b135s, which means I end up leaning on them more than I want to. So I guess I need to consider the feasability of flipping the stem over (it’s currently -17° if it’s flipped that raises the bars about an inch and a half, so I could play some games with the headset spacers to end up with it only being an inch higher. It will look hideous, of course, but a new stem and/or fork would put me back about $100, and I’d rather spend that money on food, because eating is a part of my lifestyle that I don’t wish to change.)

Jan 22, 2011


The CBC fails to get the oncoming train into focus

The weather forcast said that today would be a nice sunny day, so I jumped at the chance to go and ride the UGB 200.bis before the next batch of rain moves in, but I (a) didn’t get out the door until 8:20am (I was planning on a 7am departure. Ha ha) and (b) was sufficiently crushed by the climb up to Upper Highland road so that I didn’t get down to Canby until about 11:45, which meant that (unlike many of the other times I went through town and heard the whistle blow when I was about a mile away) I could turn around and proceed back two blocks to wait for the train to arrive.

Freight trains move at a pretty good clip through Canby, and this P&W train was no exception. Unfortunately that meant that the CBC couldn’t actually focus on the train, but instead did the camera equivalent of plopping down on the middle of the rug and cleaning its butt.

And did I mention that the CBC doesn’t have a viewfinder, but only has a nice reflective LCD screen, so you can’t even see what you’re trying to take pictures of while it’s exploding its tiny little brain in front of you.


Jan 21, 2011

Friday Dust Mite Blogging™


Dust Mite contaminates our food supply.

Tidying up the place, software-style

After finding INST0063 and INST0065 yesterday, I discovered that some other code had mysteriously vanished during the move (automod, which was also sitting off an ftp directory.) I knew where the backup for that code was, so I dug out the tapes and, while pulling the offending modules off, discovered that there was a full set of mastodon backups also sitting on that tape.


So now I’ve got all of the recent bits of Mastodon Linux back, and the disk images for INST0063, 0064, 0065, and 0066 are now sitting on the mastodon website (The net-downloadable parts of 0066 and 0067 are still just sitting on the backup tape, because they’d pretty much eat up all the remaining disk on the server and I don’t want to spend the additional US$6/month to go to a bigger disk plan.) And this meant I needed to update the website to look more like my other software package pages, which I did.

Now I suppose I should get back to thinking about what’s going to go into INST0068.

Domestic vermin picture of the day

Buckeley is on guard

After several year where the meaningless room became less of a playroom and more of a junkroom, I finally decided to clean it out and make it into my office (aka “coalesce all of my junk into one place to give myself a fighting chance of being able to do projects without having to move things around to do it.”) And this afternoon I finally did the first stage of the project, which was to move my desk and chairs into the room.

So one of the chairs is at my desk so I can sit in front of the computer, but the other one was tucked into the only open spot near the wall, which happens to be right next to the radiator. Which means that it’s a nice cozy warm spot that’s just the place for a guard cat.

Jan 20, 2011

Bicycle picture of the day

an elderly miyata props up a tree

An old Miyata props up a tree at Llewellyn this afternoon. 56cm frame?

Jan 19, 2011

New Code!

I lost all of the Mastodon disk images and tarballs sometime last year when I was in the throes of moving from a co-lo to a virtual server, and thought that they were gone for good, but just today when I was digging through a pile of CDs on my bedside table I found copies of two fairly modern releases (INST0063 & INST0065) sitting there as if they were contented polycarbonate clams.

So I brought them downstairs, copied them onto my macbook (yayy for Unix, even if it is FreeBSD with a severe case of Linux envy,) and then started an rsync to get them over to my website, where they will hopefully stay.

And if that doesn’t count as New Code!, well, what does?


Bicycle picture of the day

Bicycle Clock

The MLCM stands under the clock at Llewellyn School today.

Jan 18, 2011

Cute baby picture of the day

Russell & Silas busy with homework at Staccato Gelato

The Bears were very busy. So busy that they didn’t notice the camera until it was too late.

Jan 14, 2011

Friday Dust Mite Blogging™

Dust Mite, Frog, and Bagel pudding

Alas, the heavy glass lid keeps the Dust Mite away from the bagel pudding.

New Code!

Discount, after a loooong period of bug attraction through beta releases, has finally been pushed up to version 2.0.4 with a large collection of bugfixes and tweaks, and a somewhat smaller collection of new features. The new features are possibly the most interesting things here; one of them is support for building libmarkdown as a shared library on MacOS, Linux, and FreeBSD (the first and the last are tested by me, the middle is tested by David Banks, who contributed the makefile patches that I subsequently hacked into the current shared library support,) and the other is support for php markdown extra-style definition lists, which are just as hideous as discount-style definition lists, but which are supported by more markdown implementations than mine are.

The minor tweaks are to handle edge cases in the language – there are some edge cases that I handled differently from the reference implementation, and I was mishandling unterminated <style>/html blocks (I handled them as blocks without a closing element, which is wrong) – and to clean up the return values from some of the function calls that allocate buffers.

The full list of changes is listed below:

  1. add shared library support
  2. correct some typos
  3. Add manpages for the example programs makepage(1) and mkd2html(1)
  4. Initialize the random number generator and tag list separately, just in case someone really wants to do multiple initialize/deallocate cycles.
  5. Add a library destructor function (mkd_shlib_destructor()) to discard the kw array before unloading a shared library.
  6. Put in a bunch of useless code to make gcc STFU.
  7. Be more picky about what comes before a ^ if we’re superscripting
  8. Unclosed html/style blocks revert to being regular old markup. True, the markup will contain the opening tag (and most of the other html from that block) but it will be regular old markup with additional garbage added in.
  9. Null-terminate the strings generated by mkd_line(), mkd_css() and mkd_toc().
  10. Flip the order of arguments to mkd_generatecss(); should be 1,size, not size,1
  11. It turns out that non-toplevel paragraphs consume adjacent code blocks :-(
  12. Rework (again) indentation inside list items. Indent should never be > 4 for enumerated lists; this means that I have to test and cut back large indents and change my test cases to account for leading whitespace on deeply (2 spaces + enumerated marker + 1 space) indented items.
  13. Add a raft of testcases to cover the new features + bugfixes.
  14. Add markdown extra style definition list support
    • Add a configuration flag (--with-dl={discount|extra|both}) to select which way to do definition lists. Put a DL= into version.c so the user can see how this (compile time because it’s a beta) is configured.
    • If dl is turned off at compile time, mark it off in version.c

There are a few edge cases left untouched (I discovered a defect in the way I do regular footnote links, which will require some code cleanup to repair in a less-kludgy-than-normal way) and some users have requested php markdown extra-style footnote support and I’ve mocked up an implementation that I’m thinking about adding, but neither of those are going to emerge anytime soon. So if it’s New Code! you’re looking for, this is the one that you want to try out.

Jan 13, 2011

rainy day bicycle

The MLCM at Llewellyn on a rainy afternoon

After a few fairly cold days, it has warmed up. Unfortunately this warmth has been accompanied with lots of rain, so the mlcm and I have spent a goodly part of our days being fairly damp.

It can dry off, but I’m unsure about what’s happening to the inside of its (framesavered) tubes.

Jan 11, 2011

railroad picture of the day

Passing 1202

I chased a northbound Portland Traction train up to the Ross Island Bridge, but the chase was nowhere near as wild as this picture I took would seem to indicate (the curse of the cheap point-and-shoot camera is that when the lighting conditions are variable you can almost hear the whining as the tiny little squirrels try to spin their wheels up to computational speeds.) No, I was going a whopping 15mph when I caught up to the train and tried to snap this photo.

Jan 10, 2011

A cold and sunny day

Switching in the Ross Island lagoon

But the employees at Ross Island Sand & Gravel were still busy moving barges around inside the Ross Island lagoon.

Jan 09, 2011

Down by 17th & Tacoma

Cloudbreak over Goodwill

The CBC is not a very good camera in the whole dynamic range department, but blown highlights can make for an interesting photo nevertheless.

Jan 08, 2011

railroad picture of the (yester)day

ATK 65 departs from Union Station with a Seattle-bound Cascades

Amtrak twinkie #65 pulls out of Portland Union Station with a northbound Cascades. This was an interesting train, because instead of the traditional F59 + F40 sled, it was instead top-and-tailed by a pair of twinkies.

Advantages of a front rack

The MLCM embraces its destiny

You can use it to carry donuts!

Jan 07, 2011

It comes as no surprise that p-clamps are not the most robust way to attach a rack

Now that I’ve finished the rando bag I’ve used it on several shopping trips to bring back bagels, bulk tea, and miscellaneous pieces of china (It’s been about 30 miles of travel, with about ½ mile of that being on gravel roads.) When I got home from my second shopping trip of the day today, I pulled off the rando bag (the bottom is starting to sag already, which is not particularly surprising because I’ve not yet cut and fitted a chunk of coroplast to it) and took a brief look at the rack to see how it has been faring.

It has tipped downwards about ¼th inch at the end; just far enough so that the front fender was proud of the rack in the center. And why did this happen? Well, it looks like when the rack is loaded and I hit a bump the p-clamps start walking down the fork legs.

Hmm. This is not a particularly desirable state of affairs. I wonder if it’s time to sell some more spare bike parts so I can go out and buy a cheap chromoly fork that comes with mid-blade mounting points? (I’d see if any of the local framebuilders would braze on some mounting points, but this is Portland and I’m afraid that it would cost more to have someone braze things onto a fork than it would cost to buy one, even if I then had to turn around and paint it red to match the rest of the mlcm.

I think for a short term solution that I’ll just scrap an old inner tube and wrap a layer of rubber around the fork blades between the p-clamp and the fork. That will beef up the diameter of the leg and get the p-clamp more tightly clamping so it will keep from sliding down on longer rides.


Friday Dust Mite Blogging™

Dust Mite Rack

It’s almost the perfect size for a Dust Mite.

YAFYE picture of the day

UP 5420, et alii

Under the Hawthorne bridge viaduct this afternoon.


MLCM & Rando bag

The bicycle luggage isn’t matchy-matchy anymore!

I should probably sew up another saddlebag, but this time in red fabric, but that runs into the problem that I’d need to get a few more yards of the purple fabric to make more bias tape out of (or just go out and buy a 100 yard reel of the stuff, which probably wouldn’t cost any more but would mean I’d be stuck with a single colo(u)r of tape for the rest of my natural life.)

Jan 06, 2011

The proper size for a rando bag

Just the right size for a dozen bagels

Sure, I can use it for randonneuring, but the important thing is that it needs to be large enough to carry bagels back home.

Jan 05, 2011

Creeping towards completion

Getting closer to being an actual bag (front 3/4ths view)

After missing the December 31 deadline (so I could use it on a January 1st R200 which I obviously didn’t do due to lack of a proper handlebar bag) the big rando bag has been under construction at what can best be described as a leisurely pace. But even with that constraint it’s almost to the point where I can throw it onto the bicycle and take it out for a test ride. I need to sew the seams that attach the sides to the front, and then I need to tape the raw edges of the fabric, and then that’s it for the carcass (unless I want to sew a light/blinkie mount onto the front outside pocket flap.) I’ll need to eventually sew up a lining (and figure out a way of detachably mounting it) but I don’t need a lining to actually use the bag, and I need to go out tomorrow and get bagels anyway.

A couple of things I’ve discovered sewing up this bag:

  1. All the nice pretty curved edges are a real pain to tape. My home-made edging & bias tape just doesn’t want to curve around corners unless I hand-sew them (or operate the sewing machine by hand.)
  2. Making my own tape is probably the wrong choice. I’ve got a little hand-operated tape maker which allegedly can be pulled along a strip of fabric with an iron chasing after it to permanently crease the fabric, but I was doing it on nylon fabric, which needs to be pressed until it’s cold before the crease will take. So it ended up taking about 10 minutes to make one foot of tape. Repeat that a dozen times and you’re talking real time.
  3. Narrow tape may look very nice, but it’s a bit of a pain to sew with a sewing machine, because it keeps wanting to pucker up and shift away from the sewing needle.

The next bag I make will revert to traditional square flaps and use a wider commercial tape. But that’s not going to happen for a few weeks, because I need to test out this one first.

Jan 04, 2011

railroad picture of the day

OPR 1202 sits on the McBrod Ave lead

I was heading on down to the Mill End Store to pick up some grommets (and, as it turned out, some wool and interfacing so I can sew up a woolen cycling cap or two) but when I saw the SW1500 sitting out on the McBrod Ave lead all by itself, I just had to screech to a stop and take this picture before continuing on.

New Code! (part 2)

Discount has been shoved up to version 2.0.4beta4 because I needed to correct a defect I introduced when I added the invisible null termination chrome to mkd_css() and mkd_toc(). The new defect was that the data segment would become corrupted (either by memory overrun or an attempt to free unallocated memory?) sometimes when there was no css to be found (and since mkd_toc() uses the same sort of logic to add the null terminator, it was only just a matter of time.)

Nothing fancy, but it will reduce the number of mysterious core dumps by one or two, so it’s the sort of New Code that you might actually want to install.

New Code!

Postoffice has been updated to version 1.5.5 with the addition of one new feature – I’ve added the “msp” option, which tells postoffice to listen on port 587 as well as port 25.

This is a fairly hasty release; I had to write it in a hurry because my local ISP (Qwest) decided just yesterday to “upgrade” my net connection by blocking outgoing traffic through port 25 without even so much as a note telling me that they were going to do it. So I had to sit down and crank out a quick upgrade that allows me to continue to send mail now while I work on making the release happier for later.

So it’s New!, and it’s Code!, so if you’re running postoffice and you want to be able to send mail through the server even if you’re parked at your local branch of CAFÉ, this is the New Code! for you.

As for me, I’ll just be sitting over in the corner gibbering quietly to myself.

Jan 03, 2011

New (beta) Code!

Discount has been shoved up to version 2.0.4beta3 with a small collection of bug fixes (most of the bugs were reported by (and most of the chrome was suggested by) Gustavo Lopes as fallout from a project he’s working on that uses a shared library version of discount) and a new feature (code, which I brutally extended to provide MacOS support, provided by David Banks) in the form of shared library support (which I am now using here on gehenna and on my MacOS box.)

There are a bunch of bugfixes here:

  1. In mkd_css(), don’t check that *res is non-null.
  2. if definition lists are turned off, note that in version.c
  3. unclosed html & style blocks now revert to being plain old markdown instead of being accepted as unclosed blocks of html or style.
  4. Add a mkd_shlib_destructor function so people who use it as a run-time load(and unload)able shared library can clean up the dynamically allocated html tag list before unloading the library.
  5. repair markdown extra-style dl handling so that skipped blank lines are garbage collected.
  6. Flip the order of arguments to fwrite() inside mkd_generatecss(); it was size, 1 (write 1 element size bytes long; fwrite will return 1 or 0) and it should be 1, size so I can get back the number of bytes actually written.

And some chrome:

  1. Add prototypes for mkd_initialize(), mkd_shlib_destructor(), and mkd_deallocate_tags() to make gcc stfu.
  2. null terminate the buffers generated by mkd_css(), mkd_toc(), and mkd_line() (in the same fashion as elsewhere; the null termination is allocated, but the returned size doesn’t count it. This way a fwrite() writes out the proper number of characters, but a naive fputs() won’t charge off into terra incognito.)
  3. Be more picky about what comes before a superscript “^”; alphanumerics plus “)” are good, other nonspace characters are not.

The single feature is that shared libraries (MacOS, FreeBSD, and Linux only) are now supported through the --shared flag to It’s a fairly rough implementation – I don’t support versioned shared libraries on FreeBSD or Linux, and only support it via a fairly horrible hack on MacOS – but it does actually work and it allows you to (if you wish) enter the modern world of Unixy DLL hell.

So why not try it? It’s really new, and you can be on the bleeding edge of watching your programs explore the frontiers of software development from the comfort of the edge of your seat.

Jan 02, 2011

It seemed like a good idea at the time…

An accidentally asymmetric front flap

… but it turns out that making a nicely curved front flap meant that I couldn’t actually line it up properly when I sewed it onto the bag. Oh well, if it bothers me too much I can always do some field cosmetic surgery on it.