jc blog - tales of a modern-day nomadic hunter-gatherer

Follow jcomeau_ictx on Twitter This is the weblog of Intrepid Wanderer. You never know what you might find here; graphic descriptions of bodily functions, computer programming secrets, proselytizing for the antichrist, miscellaneous ranting and kvetching, valuable information on living off the land... if you don't share my rather weird interests you may want to try slashdot instead.

You can consider my Del.icio.us links an extension to my blog, as are my LifeTango goals and my other to-do items. My to-buy list is also public, but only for sharing any useful ideas that might be there; I'm not requesting charity, neither do I offer it.

You can find me easily in google searches, as jcomeau, jcomeau_ictx, or jcomeauictx. There are lots of other jcomeaus, but AFAIK I'm the only jcomeau_ictx out there so far.

If you want to comment on anything you see here, try the new Facebook comments, reachable by clicking the "[comment]" link at the end of each post. If for some reason that isn't working, go ahead and email me, jc.unternet.net. You know what to do with the first dot. Make the 'subject' line something reasonably intelligent-looking or it goes plunk! into the spambasket unread.

This RSS feed may or may not work. Haven't fiddled with it in forever. RSS Feed


I don't recommend using rebaseall. It didn't trash Cygwin but apache fails to start, and doesn't even get as far as outputting the usual errors about the libraries. Instead it gives this oh-so-informative message:

jcomeau@notebook ~
$ /usr/sbin/apachectl start
/usr/sbin/apachectl start: httpd could not be started

Next time I'll just keep using rebase, one DLL at a time, until I get the programs working, like I did the first time I got apache working. Using a grenade instead of a rifle sometimes has unfortunate consequences. [comment]


Back on the road - currently at one of the Chula Vista Starbucks, drinking Sulawesi (one of their less obnoxious coffees) and hacking. Problems with my Cygwin upgrade - about to run the 'rebaseall' utility to see if I can fix the remap errors. If it fubars everything, you won't see this anytime soon... [comment]


Well, here I was updating my Cygwin installation; a slew of new packages were available, and in particular a long-awaited (by me) fix for Lilypond which puts lyrics into the generated .midi files. So I went to the kitchen to put on some coffee. You know those big 5-gallon plastic bottles, you put them upside-down onto this dispenser, and push down on the handle to fill your glass. But with a coffee-maker carafe, this gets tedious, so you flip it up as you're getting your filter and other supplies. But the damn thing is so slow that it's not done even then, so you go back to whatever you were doing just to check one little thing.

But then your friend logs in, and you see his name pop up in MSN Messenger. Naturally you forget everything at that point and just start text-chatting away. Well, next thing I knew there were 5 gallons of water on the floor. Bummer. Well, my serapes are absorbing it now, and here I am back at the computer.

As Cygwin was downloading, I noticed a package called 'aspell'. I had been looking for ispell on my machine the other day, and couldn't find it. I was pretty sure there was some other spell checker included with cygwin, but apropos spell didn't find anything.

So anyway, I look up how apropos gets it input from the 'whatis' database, which is created by /usr/sbin/makewhatis from the manpages. But aspell has no manpage, so I created a one-liner in /usr/man/mann/aspell.n. No good. /var/cache/man/whatis still didn't have an entry after running makewhatis. So I fixed it the old-fashioned way. I fired up vi and put an entry in that file:

aspell               (n)  - spell checker to check and correct spelling

I know there's redundancy in there but I wanted to make sure it matched on both spell and spelling. So anyway, next time I forget aspell I can type apropos spell and find it easily.



Just woke up from an afternoon nap and remembered something I meant to type in when I woke up hours ago, first thing this morning when some idiot knocked on our door and broke into my dreams.

Before I describe this dream I was having, let me lay a little groundwork so you don't completely freak. There was this movie somewhere between 10 and 20 years ago (how's that for ballpark?) where these people were taking some liquid to let them live eternally, except it didn't really; it let them appear to live, but in fact when one of them went to the doctor, her body temperature was so low the doc realized she was dead (this is all from memory, so details might be wrong... I don't want to stop and google it or I'll lose my train of thought). Anyway these two bimbos were pushing each other around for some reason on some stairs, and they both fall down and, being brittle, fall apart with their heads rolling around but still talking.

So now that you have that stupid but non-gory idea in your head, let me describe the snippet of the dream that I remember. It's about this custodian at the Fort Lauderdale main Post Office named Eddie. I'm not sure he's fictional or real, but I remember a white guy with longish hair, a little older than me so probably a VietNam vet, who always greeted me pleasantly. Well, anyway, he was in my dream. At least, parts of him were. I was with a group of people, and his head and hands were on the floor. There was no blood, but they hadn't been sliced off neatly; they had been torn off, apparently by something of immense brute strength. But Eddie was talking! So I was embarrassed by my friend Eddie, and told him, with as firm a voice as I could muster, "Eddie, pull yourself together!"

Well, that's it. That's what was so important I had to tell you. You may now return to your regularly scheduled entertainment. [comment]


Oops, just saw that clicking on the jarfiles gave you a screenful of garbage, sorry about that. Fixed now.

By the way, on Apache servers to which you don't have root access, but are allowed such via .htaccess, you fix this type of problems with the AddType directive. I have several such distributed throughout my site, e.g.:

AddType application/x-x509-ca-cert .cacert
AddType application/octet-stream .jar
AddType audio/x-ms-wma .wma


I finished a web-enabled prototype of the WaterBird gameboard. I have yet to see some interest from Charles Cameron, however he's busy with so many projects it could be a year before he gets around to looking at it.

I wasn't going to do anything more on it until I got his approval, but I was so close to a working prototype I just couldn't drop it. I hope that's OK with him; I get nervous working on other people's ideas without their permission.

Anyway, now that that's off my mind for a little while, I really ought to see if I can make some progress with my storefront. It ought to be simple, but I keep running into little crappy issues with python, gadfly, and the NetBSD system on which the site is hosted, and all these little devils in the details are tying me in knots.

I've got only a few more days of steady coding before I'll be on my way, so don't expect a lot of updates meanwhile... [comment]


Just catching up with slashdot, and noticed this advisory on, among other things, an easy way crackers can cause BGP route flapping by resetting router connections! Wonderful! Makes me glad glad glad to be out of that business! [comment]


I forgot to mention, if you decide you need to carry a flight bag, don't just leave it unprotected while you're sleeping. I keep a coiled rope around my waist, connected with a cheapo carabiner from Wal-Mart (remind me someday to post the details), and hook the extending handle of the flightbag to my waist with it while sleeping. I've done that since that evening in Long Beach when that frickin kid almost walked off with my stuff. I also try to keep one arm around it while sleeping, but you can't count on that so make sure if someone grabs it you'll wake up.

Also, learn how to protect yourself. If a group gangs up on you, you're probably dead meat, but you should be able to fend off one or two attackers. If you've still got some cash, check out Hikuta, a deadly martial "art" that doesn't take years to learn. Warning: website is text-browser-hostile. But just 'cause his website sucks doesn't mean he can't kick your ass. Right, Kubler Al? :^) [comment]


I never realized how many people - smart, educated working people I mean - are only a paycheck or two away from being homeless. In my case, I've been able to see it coming for a while now and have been practicing. So let me recap a few key tips for my possibly-soon-to-be-homeless compadres.

First, forget about sleeping at night, unless you want to move to an area where there are no people, and even then, remember there are still natural predators who will be very happy to make you their early breakfast. No, night sleeping is for those who have the luxury of watchmen. Out on the street you have to watch out for yourself. So sleep during the day, in a public place like a park or a beach. Wear a hat or a serape (or both), and cover your face from the sun with it. The rest of your skin should already be covered, to protect you not only from the sun but from weater, insects, snakes, thorns, whatever. I have, from the feet up: moccasins, thick wool socks (extra pair in my cargo pockets), warm-up suit pants as underwear (cotton-lined), cargo pants, two wool sweaters, the inner one long enough to tuck down between the warm-up pants and cargo pants, making a mosquito-proof seal; a wool scarf whose ends tuck down under the outer wool sweater, similarly protecting most of my neck; and on top of all that, the fishermen's vest that holds all my valuables, followed by (not one but two!) two serapes, one synthetic, the other wool - the nice one my lady got me for my birthday. If you're male and have the necessary genes active, grow a full beard to protect the rest of your face.

Get a rolling flight bag to hold whatever "stuff" is absolutely necessary. If you still have a job, keep some things at the job, like your work clothes; show up early and dress in the rest room. Hell, bicyclists do it all the time, why can't you? If you don't have a job, maybe you don't even need the flight bag. I need it for my laptop, but most of it would be empty except for the solar oven. I recommend American Tourister, others are cheaper but this can for sure take the abuse.

So if you're sleeping during the day, what do you do at night? Whatever. If you've got a little cash, hang out in coffee shops or bars. Learn computer programming and get a wifi-enabled laptop, you can hack all night; some places let you plug into their power. If you're broke, try to fish or hunt. Panhandle if your conscience allows it, I can't. I might try singing on the street (busking) though, if I absolutely have to. You have to eat. Survival manuals say you can live for a week without food, and it's true, but they also say it's hard to maintain your will to live when you're constantly hungry. Learn what wild and freely-available domesticated plants are edible and stuff your face whenever the opportunity arises.

More as I think about it; remember, I'm intending to turn this into a book someday. Maybe entitled Homeless with Dignity: Nomadic Survivalism in the 21st Century. Whadda you think? [comment]


Working on a java applet for Charles Cameron's HipBone game, specifically the WaterBird board. This is not a paying job, just an interesting challenge. Took me a whole day just to get the design to show more or less correctly, now going to try and get some sleep before adding the dialogs to flesh out the actual game. Current sources are at ../src/java/com/jcomeau/hipbone/, go ahead and play with them but consider them as GPL until Charles and I work out the licensing terms.

Yes, I know the code sucks. This is just the prototype; it will be done over with real classy classes later! Meanwhile, would you like meatballs with that spaghetti? [comment]


Finished my 5th job at RentACoder.com. The pay may not be so great, but the customers are a joy to work with, particularly this one guy, who gave me another bonus on top of what I charged for the job.

(image: W.A.S.T.E. trail) Finally emptied my James Bond 007 camera of the last 2 weeks' or so worth of photos. This is an example of what I call a "waste trail", referring of course to Thomas Pynchon's W.A.S.T.E. mail carriers in the story The Crying of Lot 49. These footpaths of course can be found all over the world but, to me, they have a particular mystical significance in Southern California since I read that novel a few years ago. This particular one is in Southern San Diego approaching the Otay River along Beyer Boulevard.

(image: perfect lawn) Not far from the previous photo, I took this snapshot of the East side of Beyer, showing a perfect lawn of Carpobrotus Acinaciformis or another succulent. On a 45 degree slope, who would want to cut grass? If the other benefits of succulents didn't sell you in my previous rant, surely the thought of having such a nice lawn with close to zero maintenance will? Here's another shot of a Delosperma, this one with a bright orange-red flower.

(image: Rosarito open sewer) The shame of Rosarito: a foul-smelling brook that runs past the Smart & Final out to the ocean. It seems to be raw or minimally-processed sewage, possibly with industrial chemicals as well. I haven't followed it to its source to find out, but one would think something so obviously wrong would have someone investigating, if that someone weren't being paid off not to. I'd like to see the Mayor of Rosarito here every Sunday taking a public bath; betcha it would get cleaned up pronto.


Yesterday was my birthday. Now, don't go saying "why didn't you remind me" or even "happy birthday!". I'm not into that, remember I didn't even want my brother-in-law to know when it was. I just wanted a quiet day with my lady, and, more or less, that's what I got.

We went to Puerto Nuevo, a quiet little town about 20 miles south of Rosarito, famous for its lobster. We decided to try a different restaurant, as we'd gone to the same one for the last three times we had visited; the first one we tried today was where a guy told us for $11 we could get a special with lobster, rice and beans, chips and salsa, and a Margarita. Pretty much the same special as everywhere, and the price was reasonable; so we went in. Oh no, said the waiter, no special today, minimum price is $18 per person. So we left. We went down to the end of the street, and they didn't even have a special, minimum $15 per person, drinks not included. We walked back up the hill on the next street. Just about where we would have crossed to go to our usual hangout, the guy says $12 for four halves (2 full lobsters) including everything, even the Margarita. Too good to be true? Yes, but it wasn't until the end that we found out they had added on a dollar; and when I complained, they fixed it. So, total for 4 lobsters, with an extra beer each, was $28.50. She left a $3 tip and I thought we were going home.

No, she wanted to look at the serapes, which we had noticed at the bottom of the hill in one of the curio shops. Most of them were of the same synthetic crap that I've been wearing since I bought it from the girl on the LA trolley, thinking it was wool. And when the girl in the shop tried to tell me something obviously synthetic was 100% wool, I'd had enough. Lied to 3 times in the space of a few hours! My lady stayed, but I walked up the hill and started the hike back to Rosarito. No taxi for me, I didn't want to deal with anybody. I wanted to go back to New Mexico, or at least to living on the street back in Long Beach. I figured if she wasn't back home by the time I got there, in about 6 or 7 hours at a slow walking pace, I would just put my laptop back into my flight bag and roll off down the road to Tijuana. Not blaming her, of course, for the incidents of the day, but also couldn't worry about her when I have my own inner peace and tranquility to worry about.

At least an hour passed, maybe two, and several taxis had passed; I figured she was probably, and rightfully, pissed off at me for leaving like that, and had passed me on the road by now. I had been holding back my bladder, but here was a gully where I could relieve myself without the whole world observing, so I walked down a ways and did so; came back up and kept walking. Another half mile or so, and saw a taxi stopped up ahead. There was someone outside of it, apparently trying to cross the street but there was too much traffic. As I got closer I realized it was her! I ran across the street and to the taxi, we kissed and I got in. On the way back home she showed me a beautiful wool serape, nice tightly-woven material that she had bought for me. She had talked the shop owner down from $80 to $30.

So, it seems, I was doomed to a happy birthday after all. Later we went to Papas & Beer in downtown Rosarito and watched the mechanical bull throw a bunch of slightly inebriated kids while we sipped our Pacifico Clara. The guy with the microphone was getting people to remove various articles of clothing in exchange for a beer, but that was too far away for me to see.

So, I got a good night's sleep, and it looks like I'll be staying the rest of the month unless the world gets too much for me again. So let's see if I can get into this program for my RAC customer, and get the damned thing done. [comment]


All right, so what's my take on A9.com, the "new" search engine, portal, or whatever from Amazon? Is it gonna be bigger than Google? Are people gonna say "wait a minute while I a9 that?" Fuggedaboudit. I use Netscape as my primary browser for obvious (security-wise) reasons. Do a search in A9 using Netscape. Now try and back up with the Netscape back-arrow to the A9 homepage or to whatever you were on before that. Hrmmph. It works today, it didn't yesterday. They must've fixed it. Well, anyway, now I don't have a good reason not to use it. So let's give it some time and I'll make up my mind someday. Maybe.

Got another RentACoder job, a quickie from a former customer who wants something added on. Cuñado seems pissed at me, I think because I called him Pavarotti and he sensed I was being sarcastic. Or because he found out I lied to him about my birthday? Anyway I can't be bothered, got to do this programming; I'll go back across the border if I have to, to keep away from domestic stress. [comment]


One of my Brainstorms compadres, J. D. Lasica, just had an article published at MindJack. Looks like a cool site, might try submitting a story or two there myself.

Still hacking on my storefront/IPN operation. This is turning into a fulltime job, for antichrist's sake. Kind of lagging though, not giving it my full attention, as often happens when I try to do some quick job and it turns out more complicated that I thought. [comment]


In the process of developing and testing my storefront, I had to write a unix 'mail' program for cygwin, so I could test locally the same way it will run at freeshell.org. Use it if you wish... but one major kludge is its creation of the 'From' address; it takes the username and appends 'com' to it. So if your username is 'Fred Flintstone' it will break as it tries to send From: Fred Flintstone@Fred Flintstone.com. I'll possibly fix that someday, but don't hold your breath because it works for me (jcomeau at jcomeau dot com). [comment]


This Paypal shopping-cart/IPN shit is getting complicated. All those "how-to" articles that dismiss the details with a handwave and a contrived example or two are just a waste of time. If I finally get this working I ought to publish a real how-to on it. Not saying I will, but I ought to.

Coffee. Chocolate. Program.

Sometimes I get annoyed at what an impostor I am. I use vulgar language and say "God damn" but something inside me disdains that, or in the latter case even fears it. I call myself a hunter-gatherer, but in fact I would probably die if left to my own devices; I can forage, sure, and I've learned quite a lot about edible foods both in the wild and inside city limits, but when it comes to hunting I'm a near-total ignoramus. And since my stomach starts complaining after only a few hours without meat, just foraging isn't going to suit me very well. I might survive for a while, but productivity would probably go down the tubes, and would I maintain my will to live? Not sure.

Like my websites and my programming, my life is very much a work-in-progress. Each day that I wake up alive is another chance to learn something new, to accomplish something great. I love being a nomad. Even when I'm at the house I live as if I were just passing through, and she seems to have learned to be content with that. I don't miss the ratrace at all. Keep your 6-figure incomes and your stress overloads. I'm takin' it one day at a time, thank you very much.

OK, so I'm starting to ramble. Not much connectedness here. Doesn't matter. I'm just a character in a Pynchon novel, remember? I just opened an item in Howard Rheingold's brainstorms forum, Life Stories article 454, for feedback on this blog, if you're so inclined. You can always email me, too. [comment]


Making very little progress in my CSV module. Thinking of rewriting the IPN script in Python so I can use gadfly, which does support indices, but not safe concurrency (apparently doesn't flock() the files). But that may not be good enough either, so I may just be killing time on that route.

(image: loquat tree) Found out what those "stange peaches" are: loquats! With a little help from my friends. Going to see if I can grow some here at the house so I don't have to schlep my butt all the way to San Ysidro to steal them off someone else's tree.

That Prior Art site I mentioned is good, but charges $155 per document submission. That's a little pricey, I might hold out for someone to make a free site along those lines. Or build one myself. Yeah, right. Like I've built any of the other sites I've been promising.


Hey! I just found something I've been searching for! A prior art database where I can (maybe, haven't checked it out well yet) post my brilliant ideas to ensure that they remain in the public domain. I was hoping that something like this existed, or that someone else would implement it (I emailed someone at GNU about it a few weeks ago to see if they might be interested, but no reply), and now I effing found it!

This is great. Let me check this out and get back to you later. [comment]


I think that asshole who was trying to get me kicked off RAC failed; he sent me an email this morning telling me, in so many words, that my ideas wouldn't work, and saying that other programmers were working with him to suggest plans that would work, and weren't asking for any money in advance. Well, goody-good-good for him. I quote:

We have found that this solution will not work:

DNS data is cached, so each request through our "proxy" DNS will not be logged.

If he had read my suggestion carefully, he would have seen that I wasn't saying he should proxy the DNS, he should proxy the fucking website by modifying their DNS record so that www.targetcompany.com instead goes to his server; then he could log the request, use LWP or whatever to fetch or post the request to the target server, and return the results. That would probably be the cheapest, most reliable solution other than simply parsing logfiles on each server, which is a kludge but would probably work well enough. Well, he and those compassionate programmers who like to work for free can now have a circle jerk for all I care.

What pisses me off most is not him, it's my own failure to see through his bullshit in the beginning. I actually though he was a cool guy at first, perhaps a programmer himself, but I got suckered by his marketroid skills. Once you learn a few buzzwords and have made conversation with a few people in a field, you can shoot the shit pretty well up to a point, and have people fooled (especially abnormally trusting individuals like myself) until the time for actual knowledge emerges (as it always does) and suddenly you're the turd in the punchbowl. I've been that turd in the past, and I don't enjoy the feeling, so sometime around 25 years ago I decided not to bullshit about things I don't know. Not saying I haven't done it since then, but I've been a lot more careful to avoid it.

Well, end of rant. Remember those strange peaches I mentioned finding in San Ysidro? Well, I brought a few of them home with me this last trip, and ate the last of them last night. And this time I ate two of the seeds (there are two to 5 fairly large seeds in each, about the size and shape of a dried bean), and guess what? They had the pleasant cyanide taste of peach pits! I used to eat those all the time as a kid. These are so much easier, since there's nothing to crack open. I could probably get a fatal dose (50 to 60mg) without trying too hard if I'm not careful. [comment]


About all I really accomplished today is a rewrite of the script I use to update my websites from my laptop. For small updates, it now uses a few seconds rather than a few minutes. For large updates, it is about twice as slow. I can live with that, as I rarely update more than a few pages a day.

Peeve: the jobs at RAC that say "this should be quick and easy for a programmer who knows ..." and then set a max bid of $20 or so. Yes, it's quick and easy because I've gone through hell to learn this shit, and you want it for a lousy 20 bucks? I've even seen such with a $4 max. That means the programmer gets exactly 1 dollar, because RAC keeps a minimum of $3. May the gods help me if I stoop so low as to bid on these projects. Panhandling might be more honorable. [comment]


Ugh. DBD::CSV doesn't support primary indices. I could have gotten around lack of transactions by having a separate table for sales, and done:

INSERT INTO SALES (item) VALUES ('uniqueitem66344');

And if it had just been sold it would return an error if 'item' were a primary key. But with CSV (comma-delimited files) it happily accepts a million entries with the same primary key value.

So I'll have to write a better CSV before I can do automated sales on the web. Shit. Well, it'll be good experience.

Why don't I use mysql, you may be asking? Because on freeshell.org it costs extra, and there's no 'lifetime fee' option as there is for ARPA membership. I try not to involve myself in anything that requires regular payments. The only thing I can think of in that category is my property taxes in New Mexico, currently $8 per year. Oh yeah, and my domains. [comment]


Haven't even had a chance to upload the previous blog, and here I am yammering away again... so far this day has been less than productive. All I've done so far is spend a lot of money (relative to what I spend usually; you'll probably laugh) - let's see, $1.25 for the taxi (that included a tip, which I don't normally do, but I didn't want the hassle of waiting for my 15 cents change), then $2.16 for two double cheeseburgers from the McD dollar menu, then at the first Starbucks I hit in Chula Vista, about $4 (that's where I wrote the last blog), then about $32 at the Wal-Mart bordering National City, for a pair of rollerblades and a battery-powered drill/driver; then another $2.16 at McDs, and now $1.15 for green tea at the H street & Broadway Starbucks, plus 25c tip. That's over $10 just for food. The rollerblades? I've got to learn how to use them; I've tried, unsuccessfully, over the past few years but now maybe I have the time and freedom to really get into it. They'll do until I develop something better. Plus, I don't need all 4 wheels; I can use one pair to repair the AT flightbag. The drill/driver is also to repair the flightbag; unfortunately I broke off the stupid little 1/16" drill bit when pulling the drill out of the plastic case. There may be enough left of it to use in drilling out the rivets though. I also have an idea to use the motor to drive the flightbag while I ride along behind on the rollerblades. Maybe.

What I'd really like to do is build - now get this - an inflatable parasail, out of ripstop nylon, somehow with many different cells so that if some are punctured the rest will still hold the helium, and use that to fly around with. Make it somehow so I can flap the "wings" to move around. No, I don't want one of those noisy mosquito harnesses. The beauty of this is, if I build it right, I can also use it as a raft on the water and as a hammock or sleeping pad on land. Shoot, maybe even wear it as a poncho or serape too, when not flying, floating, or sleeping!

Nomadic peoples have to be inventive; when you carry your world around with you, everything has to be dual-purpose or better. Otherwise you end up like those homeless people with two or more shopping carts full of stuff, who can't move more than a block every half hour! Hell, if I could come up with a computer that would meet my needs (I saw that about the Recon on Slashdot yesterday, but it's a little pricey for me), I'd ditch the laptop and the flightbag in a heartbeat.

Well, let me stop yammering and work on my IPN script so I can get serious selling some stuff on my website, so I don't have to keep working for pennies on RAC or have to (gasp!) get a job. Maybe some software, those succulent cuttings I mentioned before, and whatever else I can come up with. [comment]


Here I am back in the Matrix enjoying a Starbucks espresso brownie with one of their shitty coffees. Really the only one I like is Guatemala Antigua, the unbitterest coffee in the world. Pure flavor, no bite. But they only serve it when the waxing crescent moon is a pastel shade of lavender.

(image: strange peach) Snapped a few pics on the way here. Last time through I picked a couple of these fruits, which roughly resemble peaches, and took them to my wife's house, so she could ask the construction workers at the house if they knew what they were. The first one she asked took it, popped it in his mouth, and gulped it down. So I didn't find out what it is but found out, more importantly, that it is edible. So I tried a largish one on the way up Beyer Boulevard in San Ysidro. It even tastes something like a peach, but a big difference is the seeds; it has more than one, usually 3, and not enclosed in a shell like a peach pit. But the size of all of them summed together is, proportional to the size of the fruit, about the same as the pit of a peach is to its fruit.

I also tasted some tiny peaches growing in a residential neighborhood in Las Vegas a couple of years ago or so. But they were real peaches, just in miniature; these are obviously a different subspecies or even species altogether, but they have some similarities: fuzz, color, and flavor.

(image: delosperma with yellow flowers) Walking further North, I saw (for the second time) this glorious carpet of some succulent, which appears to be a miniature of the delosperma shown on the right. Delospermae are a succulent similar to the carpobrotus I edibility- tested some time ago, but instead of the triangular cross-section of C. Edulis et. al., the fleshy leaves of the Delosperma have a rougly elliptical cross-section. Many of these have very bright, almost fluorescent-appearing, colors, like the purple carpet of tiny succulents, but this Delosperma's flower is a rather bland shade of yellow. Note that I have not tested this for edibility.

Why do I keep harping on succulents? I just think they would make such an improvement over grass lawns. Think of the benefits: they're edible. They act as a firestop. They don't need cutting, and only occasional trimming; and you can put the trimmings in your salads! They prevent erosion on slopes. They grow in areas where grass cannot survive, as they can hold moisture for weeks or even months at a time; basically, you water them for the first two weeks after you plant the cuttings (yes, they propagate easily from cuttings; you just stick part of the stem in the dirt, that's it!), and you never need worry about them again unless you have an exceptionally prolonged drought. They crowd out other species and form contiguous carpets of green and, when flowering, bright colors to please the eye. The only drawback I can see is that sheep may not be willing to eat them. But if you don't have sheep in your yard that shouldn't be too much of a concern. Having been a night worker/day sleeper for many years, anything which can obviate the annoying buzz of a lawnmower at 8AM on a Saturday morning is something I want to market. That reminds me, I want to start selling these succulents on my website and on eBay. Remind me sometime, will you?

You remember the American Tourister flight bag I told you had had it back in Deming? Well, it's still rolling! Every now and then I spray the wheels with WD-40, and that seems to keep it happy. I love quality products, I wish more companies loved making them.

I had more ideas of things I keep meaning to blog on the way here, but as usual, I've forgotten them. I'll probably remember as soon as I get rolling again.


Just got an email from my customer allowing me to share the code you see in the previous entry; that's why it wasn't uploaded till just a few minutes ago, as it would not have been kosher to give away what someone else paid for without their permission. Thanks, JT! My handful of faithful readers appreciates it!

I forgot to post this base64 decoder. While I was waiting to find out which Perl modules weren't on the customer's server (he's in England, so the time gap meant there was about 8 hours a day with no communication), I was attempting to guess which ones I'd have to code myself; a basic rule of Perl programming is that at least one critical module won't be on the customer's server, and if they don't own it (few do), it ranges from difficult to impossible to get the owner to install it. On Linux it wouldn't matter too much, if you have enough space you can install it without any special privileges beneath your own home directory. I don't know how to do that with Windows, if it's even possible.

So anyway, I guessed the base64 decoder might not be on the system. I was wrong, it was there, so I didn't need this:

jcomeau@notebook ~/rentacoder/perlpop
$ cat base64decode
$base64 = join('', ('A'..'Z', 'a'..'z', '0'..'9', '+', '/', '='));
foreach $line (<>) {
 $line =~ tr/$base64//c;
 while($line =~ /(\S{4})/gc) {
  $code = $1;
  $size = 3;
  $size -= $code =~ tr/=/=/;
  $bits = 0;
  foreach (split('', $code)) {
   $bits = ($bits << 6);
   if (($index = index($base64, $_)) < 64) {
    $bits += $index;
  print substr(pack('N', $bits), 1, $size);

Don't know how bug-free it might be; try it out if you like and let me know if it fails. It accepts input from stdin or from files, and outputs to stdout, so you can use it with pipes. Water pipes, corncob, briar, it doesn't matter. Unlike many decoders, it doesn't complain about whatever you feed it; if a line isn't a multiple of 4 bytes, it quietly discards the remainder. [comment]


Just finished another job at RAC. This one was in Perl; funny, all 4 jobs so far have been different languages! C, PHP, Java, and Perl.

This had some interesting problems, and my customer was very helpful; he told me about these two lines to use which give you PHP-style error messages in the page, even if the bug is a compile-time problem such as a missing module:

use CGI::Carp 'fatalsToBrowser';
use CGI ':standard';

As you may have guessed from the above paragraph, two of the modules I wanted were missing and the customer's host would not install them: Mail::POP3Client and Image::Size. So I had to code both the JPEG size finder and a pop3 client routine in low-level Perl. Yummy. Took me an extra day, but then the customer was nice enough to pay me double! No, I'm not telling you how much "double" is. Suffice it to say it's nothing like the $100/hour I normally charge. As I may have mentioned before, I'm bidding against guys from Eastern Europe, India, Africa, etc., places where a dollar still means something. Luckily, here in Baja a dollar is still pretty good too.

This was the second time I've written a POP3 state machine in low-level socket code. The first time was a few years back, at Dialtone, can't remember what for exactly but it had to do with my Rubegoldbergian monitoring or automation setups. I think it came out a little less klunky this time.

Another Windows server snag I didn't know about: it doesn't chdir you to the CGI script directory, you have to do that in the script. Bugger. The server didn't allow setpgrp(0, 0) either, so the parent process had to hang around until the child completed. Here's how I got around those two problems, not saying it's elegant nor the best way to do things:

    print "<!-- trying to setpgrp(0, 0)...\n";
    eval "setpgrp(0, 0)"; # make this a top-level process on its own
    print " $@ -->\n";


sub cdcorrect {
 if ($ENV{'SERVER_SOFTWARE'} =~ /IIS/) {
   (File::Spec->splitpath($ENV{'PATH_TRANSLATED'}))[0, 1], '')) or
  die "Cannot change to script directory: $!\n";

Luckily they had the File::Spec module installed, that would have been a lot nastier than it already is.

Determining the size of a JPEG: I dumped a few of them, found the height and width at the weird offset of 0xa3 from the start of the file. I hardcoded that as the seek() value in the program. Splat! As soon as another, different image was downloaded the program broke. So I had to poke into it a little better. Without googling, I tried to figure it out myself, remembering that JPEG format follows the IFF spec to at least some degree. So the first count word (16 bits) should be, in big-endian byte order, at offset 4. I found out that by following those chunk sizes, and looking for a byte of 8 just past the size word, I could find the height and width (in that order) as the next two 16-bit values following the 8. Does that make any sense? Here's the routine:

sub imgsize {
 my($file, $type, $pointer, $chunk, $size, $width, $height);
 foreach $file (@_) {
  open(JPEG, $file) or die "cannot open: $!\n";
  binmode(JPEG); # necessary on Windows!
  $pointer = 4; # location of first size word
  while (!eof(JPEG)) {
   seek(JPEG, $pointer, 0) or die "cannot seek: $!\n";
   read(JPEG, $chunk, 7) or die "cannot read: $!\n";
   ($size, $type, $height, $width) = unpack('nCnn', $chunk);
   if ($type == 8) {
   } else {
    # take into account the size of the size word itself, 2;
    $pointer += ($size + 2);
 return ($width, $height);

All of this can be assumed to be in the public domain at this point. I'll never use them again myself, in all likelihood; I almost always rewrite stuff clean the next time I need something.

Well, I'm already getting the old 'boxed-in blues'; I'll probably go to San Diego tomorrow and get some stuff I need. Then 3 more weeks or so and it's back to Deming! [comment]


I took ebay's advice and requested the guy's phone number before leaving feedback. Just got off the phone with him; told him why I was going to leave negative feedback (lack of communication) and he seemed to think he did the best he could do. Maybe he did. Guess I'll just leave neutral feedback after all. Why should he be blamed for my lack of a valid mailing address in Western U.S.?

I'm being a lot more picky about jobs I take on rentacoder.com now that I've got the 'top coder' rating; I don't want something unless I'm very sure I can accomplish it within the deadline. As a result, I haven't been able to get any more work. Got a bunch of clients trying to pick my brain for free though. [comment]


I am leaving negative feedback on eBay for the first time. I hate to do it, because the problem is partly my fault, but since the guy doesn't answer his emails I need to get his attention somehow.

Back on March 9, I bought a pair of USB speakers from eBay user craftsnflowers for $3.95, plus $4.95 shipping. I had to email him twice with my General Delivery address because he didn't see my first email. He did answer the second, and so I replied again with the general delivery address in San Ysidro, CA.

Turns out San Ysidro doesn't accept GD. Bummer. Should have checked first. My fault. But also, he (Rodney Finnestad) must have been told by the sending P.O. that San Ysidro is not a valid GD destination address. Maybe he never checked his email so he didn't see my reply. Perhaps he sent the speakers to my Florida address, which I won't be returning to for another few months, in all likelihood.

Anyway, I sent him another two followup emails asking him what's the story and never got a reply. I think he maybe has some kind of spamtrap setup that's not letting him see his email. Whatever the problem is, he'll have to fix it or he's going to keep getting bad feedback from pissed-off customers.

I'm not that mad, though I wish I had the speakers; they're probably in Florida waiting for me. [comment]

view blog for 2024-07
view blog for 2024-06
view blog for 2024-05
view blog for 2024-04
view blog for 2024-03
view blog for 2024-02
view blog for 2023-10
view blog for 2023-09
view blog for 2023-08
view blog for 2023-07
view blog for 2023-06
view blog for 2023-05
view blog for 2023-03
view blog for 2023-02
view blog for 2023-01
view blog for 2022-12
view blog for 2022-11
view blog for 2022-10
view blog for 2022-09
view blog for 2022-08
view blog for 2022-07
view blog for 2022-06
view blog for 2022-05
view blog for 2022-04
view blog for 2022-03
view blog for 2022-02
view blog for 2022-01
view blog for 2021-12
view blog for 2021-11
view blog for 2021-10
view blog for 2021-08
view blog for 2021-07
view blog for 2021-06
view blog for 2021-05
view blog for 2021-04
view blog for 2021-03
view blog for 2021-02
view blog for 2021-01
view blog for 2020-12
view blog for 2020-11
view blog for 2020-10
view blog for 2020-09
view blog for 2020-08
view blog for 2020-07
view blog for 2020-06
view blog for 2020-05
view blog for 2020-04
view blog for 2020-03
view blog for 2020-02
view blog for 2020-01
view blog for 2019-12
view blog for 2019-11
view blog for 2019-10
view blog for 2019-09
view blog for 2019-08
view blog for 2019-07
view blog for 2019-06
view blog for 2019-05
view blog for 2019-04
view blog for 2019-03
view blog for 2019-02
view blog for 2019-01
view blog for 2018-12
view blog for 2018-11
view blog for 2018-10
view blog for 2018-09
view blog for 2018-08
view blog for 2018-07
view blog for 2018-06
view blog for 2018-05
view blog for 2018-04
view blog for 2018-03
view blog for 2018-02
view blog for 2018-01
view blog for 2017-12
view blog for 2017-11
view blog for 2017-10
view blog for 2017-09
view blog for 2017-08
view blog for 2017-07
view blog for 2017-06
view blog for 2017-05
view blog for 2017-04
view blog for 2017-03
view blog for 2017-02
view blog for 2017-01
view blog for 2016-12
view blog for 2016-11
view blog for 2016-10
view blog for 2016-09
view blog for 2016-08
view blog for 2016-07
view blog for 2016-06
view blog for 2016-05
view blog for 2016-04
view blog for 2016-03
view blog for 2016-02
view blog for 2016-01
view blog for 2015-12
view blog for 2015-11
view blog for 2015-10
view blog for 2015-09
view blog for 2015-08
view blog for 2015-07
view blog for 2015-06
view blog for 2015-05
view blog for 2015-04
view blog for 2015-03
view blog for 2015-02
view blog for 2015-01
view blog for 2014-12
view blog for 2014-11
view blog for 2014-10
view blog for 2014-09
view blog for 2014-08
view blog for 2014-07
view blog for 2014-06
view blog for 2014-05
view blog for 2014-04
view blog for 2014-03
view blog for 2014-02
view blog for 2014-01
view blog for 2013-12
view blog for 2013-11
view blog for 2013-10
view blog for 2013-09
view blog for 2013-08
view blog for 2013-07
view blog for 2013-06
view blog for 2013-05
view blog for 2013-04
view blog for 2013-03
view blog for 2013-02
view blog for 2013-01
view blog for 2012-12
view blog for 2012-11
view blog for 2012-10
view blog for 2012-09
view blog for 2012-08
view blog for 2012-07
view blog for 2012-06
view blog for 2012-05
view blog for 2012-04
view blog for 2012-03
view blog for 2012-02
view blog for 2012-01
view blog for 2011-12
view blog for 2011-11
view blog for 2011-10
view blog for 2011-09
view blog for 2011-08
view blog for 2011-07
view blog for 2011-06
view blog for 2011-05
view blog for 2011-04
view blog for 2011-03
view blog for 2011-02
view blog for 2011-01
view blog for 2010-12
view blog for 2010-11
view blog for 2010-10
view blog for 2010-09
view blog for 2010-08
view blog for 2010-07
view blog for 2010-06
view blog for 2010-05
view blog for 2010-04
view blog for 2010-03
view blog for 2010-02
view blog for 2010-01
view blog for 2009-12
view blog for 2009-11
view blog for 2009-10
view blog for 2009-09
view blog for 2009-08
view blog for 2009-07
view blog for 2009-06
view blog for 2009-05
view blog for 2009-04
view blog for 2009-03
view blog for 2009-02
view blog for 2009-01
view blog for 2008-12
view blog for 2008-11
view blog for 2008-10
view blog for 2008-09
view blog for 2008-08
view blog for 2008-07
view blog for 2008-06
view blog for 2008-05
view blog for 2008-04
view blog for 2008-03
view blog for 2008-02
view blog for 2008-01
view blog for 2007-12
view blog for 2007-11
view blog for 2007-10
view blog for 2007-09
view blog for 2007-08
view blog for 2007-07
view blog for 2007-06
view blog for 2007-05
view blog for 2007-04
view blog for 2007-03
view blog for 2007-02
view blog for 2007-01
view blog for 2006-12
view blog for 2006-11
view blog for 2006-10
view blog for 2006-09
view blog for 2006-08
view blog for 2006-07
view blog for 2006-06
view blog for 2006-05
view blog for 2006-04
view blog for 2006-03
view blog for 2006-02
view blog for 2006-01
view blog for 2005-12
view blog for 2005-11
view blog for 2005-10
view blog for 2005-09
view blog for 2005-08
view blog for 2005-07
view blog for 2005-06
view blog for 2005-05
view blog for 2005-04
view blog for 2005-03
view blog for 2005-02
view blog for 2005-01
view blog for 2004-12
view blog for 2004-11
view blog for 2004-10
view blog for 2004-09
view blog for 2004-08
view blog for 2004-07
view blog for 2004-06
view blog for 2004-05
view blog for 2004-03
view blog for 2004-02
view blog for 2004-01
view blog for 2003-12

Valid HTML 4.01 Transitional

Valid CSS!