Archive for March, 2005

Firefox Extension Sidebar Removal

March 31st, 2005 by daryl

I’m writing a Firefox extension that includes a sidebar. Firefox conveniently remembers the status of things like sidebars and toolbars when you close the application down. So if you have a sidebar displayed when you close out of Firefox, when you restart Firefox, the sidebar is still displayed. This is handy until you uninstall the extension and shut down Firefox with the sidebar still visible, as documented in this bug. What happens in this case is that when you restart Firefox after uninstalling the plugin, it comes up with a blank sidebar. In order to get rid of the sidebar, you have two basic options:

  • Reinstall the extension, restart Firefox (the sidebar will display the extension’s data again), close the sidebar, close Firefox, open Firefox back up, and uninstall the extension.
  • As documented here, you can go to localstore.rdf in your profile, hunt for a line dictating whether or not the sidebar appears, and delete it before restarting Firefox.

Neither of these options is particularly user-friendly. So I googled around a bit and found this post by Alex Sirota, which provided some general information about writing a cleanup script for an extension. Alex also responded to a further inquiry about writing an uninstall script and pointed me to an extension of his in which he’s implemented just such a thing. His script didn’t do the sidebar fix, but it helped me get to where I could call sidebar uninstall code when the browser shuts down.

So all that was left was to figure out how to edit localstore.rdf once I had determined that a given extension was unloading and had been slated for uninstallation and then make this code run on uninstall. The code listed below is kind of wacky because I’m using two different methods for manipulating datasources. In the first part, I’m manipulating the extensions datasource directly because I scraped the code from Alex’s extension. In the second part, I’m using the RDFDS library available at XUL Planet. Eventually, I’ll probably go back and use one method or the other, but this works for now. So without further ado, here’s the code:

function unload_overlay(){
    //Get various things needed to deal with RDF.
    var RDFService = Components.classes["@mozilla.org/rdf/rdf-service;1"].getService(Components.interfaces.nsIRDFService);
    var Container = Components.classes["@mozilla.org/rdf/container;1"].getService(Components.interfaces.nsIRDFContainer);
    var extensionDS= Components.classes["@mozilla.org/extensions/manager;1"].getService(Components.interfaces.nsIExtensionManager).datasource;

    //Get nodes and arc needed to figure out whether the given extension is slated to be uninstalled.
    var root = RDFService.GetResource("urn:mozilla:extension:root");
    var nameArc = RDFService.GetResource("http://www.mozilla.org/2004/em-rdf#name");
    var toBeUninstalledArc = RDFService.GetResource("http://www.mozilla.org/2004/em-rdf#toBeUninstalled");

    Container.Init(extensionDS,root);

    //Now iterate over the elements to find the toBeUninstalled value for the extension in question ("Extension Name," which you should change to match your extension name).
    var found = false;
    var elements = Container.GetElements();
    while (elements.hasMoreElements()) {
        var element = elements.getNext().QueryInterface(Components.interfaces.nsIRDFResource);
        var name = "";
        var toBeUninstalled = "";

        var target = extensionDS.GetTarget(element, nameArc ,true);
        if (target) {
            name = target.QueryInterface(Components.interfaces.nsIRDFLiteral).Value;
        }

        target = extensionDS.GetTarget(element, toBeUninstalledArc ,true);
        if (target) {
            toBeUninstalled=target.QueryInterface(Components.interfaces.nsIRDFLiteral).Value;
        }

        //If we find the right value, set the found flag to true.
        if (toBeUninstalled && (toBeUninstalled == "true") && (name == "Extension Name")) {
            found = true;
        }
    }

    //Ok, our extension is slated to be uninstalled, so do some more stuff.
    if(found==true){
        try{
            //Here we're using the RDFDS class, so the code for this should be pulled in at some point. 

            //Get the localstore datasource
            var ds=new RDFDataSource("rdf:local-store");

            //Get the sidebar-box node.
            var node=ds.getNode("chrome://browser/content/browser.xul#sidebar-box");

            //Get that node's properties and remove all targets, which typically include "src," "width," and "sidebarcommand"
            //Removing all properties apparently causes the node itself to be deleted, which is the result we're actually going for.
            var properties=node.getProperties();
            while(properties.hasMoreElements()){
                prop=properties.getNext();
                node.removeTarget(prop.getValue(),node.getTarget(prop.getValue()));
            }

            //Now save and refresh the datasource.
            ds.save();
            ds.refresh();
            //alert('Uninstalling sidebar');

        }
        catch(e){
            alert(e);
        }
    }
}

In order to cause this code to be run when the browser unloads, you need to add the following line somewhere in your js:

addEventListener("unload", unload_overlay, false);

So here’s essentially what goes on in this script:

  • The extension includes a browser overlay, so any unload listeners added within the extension are added to the browser as a whole.
  • Thus our unload event listener is added to the browser as a whole, causing unload_overlay() to be called any time the browser is closed.
  • The browser has to be closed in order for extensions to be installed or uninstalled.
  • Accordingly, when we uninstall the extension and shut down the browser, unload_overlay() is called.
  • Unload_overlay() checks the extensions rdf to see if our extension has been slated for uninstall (in which case its toBeUninstalled value will be set).
  • If so slated, the code finds the sidebar-box node in the localstore.rdf datasource and deletes it.
  • This prevents the sidebar from being displayed on the next load.

I should probably add code that checks for the src attribute of the sidebar-box element in localstore.rdf and deletes the node only if it’s set to the current extension’s source. Currently, the uninstall code will probably delete any sidebar that’s open upon browser close, which might not always be a valid action (say a user keeps his or her bookmarks sidebar open; this might close that, which would be a pain for the user).

At any rate, here’s a draft of a way to circumvent the Firefox sidebar bug listed above.

Lennie’s Week in Review

March 25th, 2005 by daryl

Cartoon of Lennie and DaddyThings Lennie’s done this week, some of them quite possibly repetitive from previous entries:

  • Had cartoonish image made of her Daddy and her for Daddy’s work from one of Daddy’s favorite photos.
  • Said something close to “Andy” (her uncle)
  • Said “Deda” in reference to her Aunt Fleda
  • Continued to say something moderately close to “kitty cat” when looking at the cat
  • Started pointing at things (I taught her to do this)
  • Said something pretty close to “duck” when looking at the ducky shower curtain rings in our guest bathroom. (She did this on several occasions during potty time with Daddy, which occurs any time I’ve got her and have to pee, when I just take her in there and make the best one-handed effort I can)
  • Said Abbey last week on the way to the airport to go to New York, which utterance thrilled Aunt Abbey, who was kind enough to take us to the airport and was sitting in the backseat next to Lennie and who absolutely melted.
  • Returned from her first airplane ride. Daddy didn’t board an airplane until he was 21 years old, so Lennie’s got a jump.
  • Stood up unassisted for a pretty substantial time. This happened while we were in New York, and we’ve got it on video. Uncle Willem was playing with her and had her standing up. When she seemed pretty stable, he let her go, and she stood there unwobbling like a real person for upwards of ten seconds. We’ve got it on video, and, let me tell you, it absolutely rocks. Just this week, I’ve started to be able to see her as if she were a real child rather than a beetle-ey sort of baby. I can for the first time almost picture her toddling around, and it’s weird and awesome and a little sad because she’s well on her way now to eating without help and driving and dry humping with unworthy little assholes of boys whom I’ll have to uncharacteristically intimidate. For now, let’s just celebrate the milestone and deal with this other standing-baggage later.
  • She’s crawled two or three steps a time or two over the past couple of weeks, but tonight, she crawled pretty much across the room. She was going for the poor kitty cat (which, let me note that though she has said something pretty close to “kitty” and “kitty cat,” she usually says “DUH-dn-Duh,” which label she applies to other things as well), and she crawled from my big chair over maybe five feet across the living room to the poor unsuspecting DUH-dn-Duh, who was none too pleased to receive the hand-smacky attention. So but she crawled, and this was real crawling, the kind that you can write about and put down in the scrapbook as the official crawling.

That’s all that comes to mind right now. Words in her vocabulary so far (and let me note that when I say “words,” I mean big-hand-quotes “words,” as in things loosely equivalent to words) are as follows in aproximate order of appearance:

  • Mama
  • Dada (referring not to the avant garde art movement but to me)
  • Ella (usually “Edda”)
  • light (Mleeka was flipping the light off and on and saying “light” over and over again, and Lennie mimicked it twice; this one might not really count.)
  • kitty cat
  • Abbey
  • Andy
  • Deda
  • Bo (for Uncle Bowman and really more like “Bah,” but close enough, unless it in fact refers to sheep, an entirely plausible possibility given Lennie’s fondness for Lela the stuffed sheep, which was given to her by my former coworker Debbie Miller.)
  • duck (more like duh, but there’s a definite word-thing association there, so it counts)

A year or two ago, a friend of mine who had had a baby recently told me that the baby herself was the best thing she had ever done. I didn’t really have the perspective to be able to understand it at the time, but tonight, as I was indulging in a solo potty time with Daddy, it occurred to me that, yes, my lovely lovely child is the best thing I’ve ever done, barnone, hands down, and nuff said.

Anecdotal Jar of Parodies

March 24th, 2005 by daryl

Wallace Stevens wrote a now-famous poem entitled “Anecdote of the Jar.” It goes as follows:

I placed a jar in Tennessee,
And round it was, upon a hill.
It made the slovenly wilderness
Surround that hill.

The wilderness rose up to it,
and sprawled around, no longer wild.
The jar was round upon the ground
And tall and of a port in air.

It took dominion everywhere.
The jar was gray and bare.
It did not give of bird or bush,
Like nothing else in Tennessee.

I’ve always had problems with this poem and with Stevens generally, though he did write plenty that is, if not especially coherent, at least interesting lexically and from the standpoint of imagery and tone. When I think of Stevens, I think of a man reciting nonsense in very serious tones. Because it’s hard to make much sense of lots of Stevens’s stuff and because his diction is diverse and often unexpected, I read some of his stuff to Lennie a few months ago. I figured it was just a way of exposing her to sounds other than my usual vocabulary at little risk of getting bogged down in meaning. Strange, I guess.

Anyway, in the last couple of months, I’ve read two tributes or parodies or something relating to the poem, and they’ve both irritated me because it was as if they were trying to be more clever than they in fact turned out to be. It was as if they were trying to get by with an inside joke, but the Stevens poem is so well known that it’s not really an inside joke. It’s like being very proud of a painfully obvious punchline. What’s more, both have a sort of titular pun clanging around in them, making the arm-waving “look at me, this is my version of Stevens’s poem” feel of the poems that much worse.

The first example I encountered was by Robert Wrigley in Lives of the Animals, which I treat here. He also seems to wink in the direction of Yeats in the stanza I quote below:

And though I wander around it, my widening gyre,
my careful forensic finds no line, no
other post anywhere, only this, which,
because it is wood, will fall,
the slovenly wilderness at last
avenging its mystery, its jarring illogic –

In retrospect, I actually like the poem, and it provides a pretty decent sort of answer or response to Stevens’s poem, but the “jarring” pun and the self-consciousness of it sort of turn me off.

Similarly, in the April 2005 volume of POETRY (which is uncharacteristically thick and full of poetry in comparision to volumes from the last year or two, which have been prose-heavy without any extra thickness), Lauren McCollum acknowledges Stevens openly but goes on with the not-oblique-enough-to-be-subtle punning, as follows:

His spare hand tore at the wilderness
as if it were a metaphor or something
that couldn’t be as it seemed

I was jarred with the whole of my state…

It’s still an ok poem (Wrigley’s is better), but would have been better without the obvious references, which seem rather like somebody stating the obvious without knowing it’s obvious and thinking they’re pretty darned smart for having managed it.

Being a PHP Lumberjack

March 24th, 2005 by daryl

I wrote an article months ago that has finally appeared at Digital Web Magazine. If you’re not a beginning-to-intermediate PHP developer, you probably won’t find it very interesting. This is the second in an occasional series (find the first here) I’m doing for Digital Web on PHP.

Standing

March 22nd, 2005 by daryl

So last night, a couple of times, Lennie stood unassisted (as in holding on to nothing; in the open air and hands-free) for 10 or more seconds. She had done it earlier in the day or week, but I counted it a fluke. The repeat performance makes me think maybe it’s not a fluke so much as a sign of things very soon to come. A couple of times yesterday, she also crawled a few little steps. Time to move everything in our house to shelves above the four-foot mark.

Notes from New York

March 21st, 2005 by daryl

Walt Whitman's DeskThis will be brief. We’re in New York visiting Mleeka’s brother Willem, who’s got a three-week-old baby. While here, we’ve done some touristy things. One day, we ventured out and found a whaling museum (lots of very cool scrimshaw) and Walt Whitman’s birthplace, which we got to ten minutes before closing. This left us just enough time for us to run in and quickly scan a few artifacts, take a picture of Walt Whitman’s desk (complete with period boombox), and ask the none-too-knowledgeable museum employee to confirm my recollection that Robert Green Ingersoll spoke at Whitman’s funeral.

Another day, we went into Manhattan, where we visited the American Natural History museum (lots of cool dinosaurs, a turtle skeleton nearly the size of a Volkswagon, a huge fake whale, and other stuff), Central Park, and the Metropolitan Museum of Art (one day I’ll take down my thoughts on how more raw skill goes into making a single medieval helmet than into the whole of modern art, however much I like modern art). We also managed to walk right by the Empire State Building, which I was surprised to see had glass and neon along the lower floor, where I expected imposing concrete slabs. And yesterday, we drove over to Staten Island (we’re pretty far east on Long Island) to visit Mleeka’s Uncle John and Aunt Betty. Otherwise, we’ve done a lot of sitting around and playing with babies and, in my case, working.

Lennie’s had a rash and what look like hives or heat bumps that could be caused by the extreme heat in Willem’s apartment (heater’s broken and the place stays at 80+ degrees, forcing us to run the AC or have windows open in the middle of winter), an allergy to the multiple cats, or something she’s eaten. She’s started saying “DA-dn-Da” a lot, and I’m convinced she’s trying to say “kitty cat.” She came pretty close to articulating “kitty cat” before we came to New York, but she seems to have lost that. The rhythm of “DA-dn-Da” is pretty much identical to that of “kitty cat,” though, and over the last day or so, she’s been saying it a lot when I’m running her around chasing the cats and cooing “kitty cat.” So I think that’s it.

We’re here tonight and then fly back home to Knoxville tomorrow night. It’s been a good visit, but we can hardly wait to get back home.

Light, Kitty Cat

March 14th, 2005 by daryl

So today I’m locked up in the office working, and in comes Mleeka and asks if I have any idea what my baby just did. “Crapped her pants,” I think? Ah, but that’s an every day occurrence (except that she’s actually been crapping on the potty every morning lately, so maybe I’m being unfair to her) and Mleeka was awfully excited, so it had to be something good. Turns out she said “light.” They were in the bathroom flicking the lights off and on, and Lennie apparently blurted out “light” after Mleeka did one time.

Later, Lennie and I were hanging out in the bathroom, probably playing with the lights to see if I could entice her to speak again, and the cat was hovering around the sink because he’s finicky and likes to drink running water, and she said something that sounded sort of like “Kitty Cat” (which is what we call the cat when talking to her, though we call him devilspawn out of her hearing because he’s pretty evil). She might just have been jonesing for a Kit Kat Bar, but I’m rather inclined to think she’s about to just have a language explosion.

Add to that the fact that she, in just the last week or so, has become about as mobile as one can become without actually walking or crawling and we’ve got a bona fide kid on our hands. More on her mode of transportation. She now gets on all fours with her butt way up in the air. It’s like she’s really good at touching her toes or something. She’ll scoot around on her butt or crawl backwards as far as she can go in one direction. Then she’ll do this butt in the air maneuver and rotate so that she’s aimed in another direction, and she takes off again. For quite a while this evening, she just lunged around all over the big open spot in the living room until she became frustrated. I sort of figured she was worked up because she has this new mobility but nothing really satisfying to do with it. It’s like getting a new car but having nowhere to go.

We head to New York on Wednesday to visit our new niece, and I figure that by the time we get back, we’ll have a walking, talking baby.

XUL Tree Variables

March 12th, 2005 by daryl

XUL TreePictured here is part of what I’ve been working on for the last few days. I won’t go into much detail, but it’s a Firefox extension to improve the bookmark experience (does anybody actually use bookmarks? I save them but seldom have the heart to go back to the horrible user interface to retrieve them). Essentially, the project lets you label the bookmarks and have them closer at hand (in a sidebar) while browsing. It’s similar to del.icio.us but provides a nice integrated user interface and should eventually have a lot of bells and whistles that make it just an absolute singing joy to use. But it wasn’t easy.

The picture shows a tree, which is a XUL element useful for maintaining lots of information efficiently. You’ll recognize the tree from email programs, the Windows explorer, (conceptually) Web site navigation in many cases, and other places. Trees can be a pain to work with in XUL in particular because they’re populated by data in the RDF format. And there are all sorts of weird things about using RDF with trees. For example, you use a template to do so, and this makes it so that you can’t actually directly manipulate individual tree cells as elements in the document object model. They don’t exist. If you try to iterate down the XML defining the tree, you have no access to the elements that the RDF populated the tree with, so you can’t really perform operations on the elements. Additionally, a treecell keeps only a label and a value applied to it, and there are no functions for grabbing other attributes you may wish to store for a tree cell. In my case, I need a title and a value (the link itself) for displaying and clicking on a bookmark. But I also need to know what label has been applied to a given bookmark so that I can manipulate it. And since there’s no way I can divine to store a third value associated with a given treecell, I’m kind of up the creek.

Or not. It occurred to me that I could just add another treecell to the row and not display it. So where, before, an excerpt of my template looked something like this:

            <action>
                 <treechildren>
                    <treeitem uri="?category">
                        <treerow>
                            <treecell label="?label" value="?url" src="chrome://bookmarks/skin/buttons/document.png"/>
                        </treerow>
                    </treeitem>
                </treechildren>
            </action>

Now it looks more like this:

            <action>
                 <treechildren>
                    <treeitem uri="?category">
                        <treerow>
                            <treecell label="?mycategory" value="?mycategory"/>
                            <treecell label="?label" value="?url" src="chrome://bookmarks/skin/buttons/document.png"/>
                        </treerow>
                    </treeitem>
                </treechildren>
            </action>

I’ve added a treecell that contains the category associated with the given link. I then tweak my column headers to look like this:

        <treecols>
            <treecol id="category" hidden="true" label="Tag" flex="1" ignoreincolumnpicker="true"/>
            <treecol id="url" label="Bookmarks" primary="true" flex="1"/>
        </treecols>

The “ignoreincolumnpicker” attribute prevents the header from being displayed in a little button that lets you pick which columns to display in the tree. That’s just an extra precaution, though, as there’s an attribute on the tree tag itself named “hidecolumnpicker” that defaults to false and that I’ve set to true.

While this method actually does exactly what I need it to do, I’m not altogether satisfied with it because it feels a little jury-rigged. Trees should be for display of data rather than for manipulation of it. It seems as if there should be some way to store other values within a tree cell or tree row that can be extracted, but in most of a day’s wheel spinning, I could find none because the elements of an RDF-generated tree are moving targets that you can’t directly manipulate. In any case, this method seems to work for now, and I’m sticking with it barring feedback from any gurus who can point out something obvious that I’m missing.

The Diet Begins Today

March 7th, 2005 by daryl

Hulking Mass of a ManSo today I begin reducing my fat intake. As you can see in the picture, I’m not exactly weeble-shaped (though when I wobble, I don’t fall down), but my weight’s high enough that I’m up a bracket in both life and health insurance (if only they could see me rather than imagining me to be rotund and gelatinous). And the jeans I bought in December that were a size up from last year’s jeans and still a little uncomfortable are on the verge of not fitting. So it’s time to do something about it.

All through college, I weighed in at a respectable (but what seemed then a very high) 185. I’ve got broad shoulders and sort of hulking, fairly muscular (against all odds, as I do nothing to maintain them) legs. About a year after moving to Knoxville, I had to get a physical for a new job, and I was shocked to discover that I had shot up to 220. Being happy and settled and not walking 5 miles a day around campus tends to have that effect on people. I hadn’t really noticed that I was that big. I coasted at that weight for a while, not really all that worried about it.

One day, it occurred to me that though I didn’t really think about it that much, I was a little self-conscious about what were emerging as little pre-man-titties (they weren’t real man titties, but they were getting a little soft and you could tell they were heading in that direction). I started watching for the fat content in the foods I was eating. A Stouffers lunch I favored (barbecued chicken strips with cheesy potatoes), it turned out, had 30 or 40 grams of fat, and it was a tiny meal not quite sufficient even for a little lunch. And I’m supposed to take in something like 60 grams of fat a day. So I was getting most of my fat for the day in this tiny meal and then going home and eating a no doubt gigantic meal two or three times as fatty as the lunch. I stopped eating those lunches pretty much immediately. And I cut out the Coke or two I was having daily (empty calories). And I stopped having seconds or thirds at most meals. And I got barbecued or baked chicken rather than fried, and I had one plate at the buffet rather than two or three.

Once I was used to the routine, I really didn’t mind it at all, and I began to feel better about myself. Pounds began to drop. Actually, I didn’t weigh myself (didn’t have a scale), so I don’t know that pounds dropped, but I was visibly thinner, and I cinched in two holes on my belt and got unsolicited comments from people who didn’t know I had changed my eating habits that I was looking much thinner. All of this was positively reinforcing and made me want to maintain my healthier lifestyle.

A reminder about man tittiesI think it was when I got my last job that things started going downhill again. At first, we’d go out to Ruby Tuesday once or twice a week, and I’d get the big drippy hamburger. Then I started drinking Cokes again, and just generally became less conscientious about what I ate. I was a two-plater at the buffet again and would pile on seconds or thirds of things that tasted good to me. And so at a recent doctor visit, I stood on the scale and was just shocked and embarrassed to discover that I was a whopping 235.

I thought about trying the whole low-carb thing because my sister-in-law’s doing that and has dropped a little layer of chub that a couple of years of being happy and settled had put on her. But I can’t see myself sticking to a diet without pasta and bread. So, though I’ve feinted without very much conviction in the direction of losing weight a couple of times over the last year or two, I’m going to try really hard again to watch the fat intake and see if I can drop some weight (I really need to drop 50 pounds), lest I wind up looking like the Meatloaf character in Fight Club. Wish me luck and conviction, and if you see me with a doughnut, slap my hand and comment on how voluptuous my man titties are looking.

Eating and Speaking and Pottying

March 6th, 2005 by daryl

Just to catch up a little on what Lennie’s doing lately. Her big things are eating and speaking. Although we tried months ago getting her to eat non-booby food, she just wasn’t into it. For a few weeks, if we could get 5ML (that’s one dose of an antibiotic, to give you an idea of how little volume we’re talking here) of some sort of mushed up food into her a day, we were just overjoyed. Last weekend, I was trying again to spoon feed her (she likes to hold a spoon while you feed her, incidentally, and she’s actually pretty good for brushing her teeth, which she does at bedtime and if she’s fussy while I’m brushing my teeth in preparation for going out), and when I sort of prodded at her mouth with the spoon, she opened up. It was a definite and intentional attempt to open up and accept the food I was giving her. This is a big change from her raspberrying the food in an orange or green spray with a dour look right back into my face. Over the last week, she’s really started eating very well. There’s very little fighting over it, and she just gulps down what we give her. She’s especially partial to pears.

We’ve tried some real solid foods over the last few weeks as well because she likes putting whatever she holds into her mouth. So we give her a big old chunk of Granny Smith apple or the fat end of a carrot, nothing she could swallow whole, though she manages at times to chip away at the food with her little bottom teeth until she breaks off dangerous pieces. Last night, she got a taste of mango and loved it. Loved as in when Mleeka took the mango away from her for a minute, she screamed absolute bloody murder. She had a lot more of that at lunch today.

She also likes plastic. The other day, I was playing absently with her among her ton or three of toys in the living room while Mleeka was working in the kitchen. She started coughing (not an uncommon occurrence) and was smiling at me while she coughed (also not uncommon; c’mon, coughing is funny). Then she kept coughing, and suddenly, it was more like choking, and then I looked in her mouth, and there was a piece of thin wadded up plastic from some wrapper or something jammed in the back of her throat. I started to stick my hand in to get it, but my hand’s too big. Mleeka came in and saved the day, and that, my friends, is why I’m not allowed to be alone with the baby anymore.

(That’s a lie, the being alone with the baby thing. I had three or four hours alone with her yesterday, and, it being a nice day, we resurrected our old habit of going out on the swing. Now she can sit beside me on the swing rather than just sitting on me, and it’s really a lot of fun. As had been her habit when she was brand new, she did eventually sit on me and fall asleep, and let me tell you, that’s just one of the best things in the world.)

For a couple of weeks now, Lennie’s also been trying to speak a little more coherently. She says “Ella” in that kid way where the ells are replaced with a back-of-the-throat double-U sound that typing “ewwa” doesn’t capture (hence the weird periphrastic description). And she doesn’t just say it at random. It’s usually when she’s on the floor with Ella and Ella decides she’s tired of being tugged on or bludgeoned by her chunky friend. Mleeka caught it on video the other day, and it’s a crystal clear double-U-replacing-ell pronunciation. (Before you feel too sorry for Ella for having Lennie pound on her, consider that we’ve got video from a month or two ago of Ella slowly and deliberately palming Lennie in the middle of the forehead and executing a really rather well-done floorward shove.)

Lennie also says mamamamama a lot, but she’s been doing that for a long time. I don’t think she associates it with Mleeka specifically (though of course there is an association there) but uses it more as a way of saying “something’s wrong here and I want somebody to fix it.” And that somebody is usually Mleeka. So she is thinking of Mleeka as the fixer of things gone horribly wrong, but I suspect she uses mama as a more generalized term. When she says dadadadada, of course, it’s the bright sonic reflection of a pure and deep and abiding love the likes of which no one — not Helen and Paris, not Romeo and Juliet, not Nick and Jessica — could even begin to conceive of were they orders of magnitude more capable of understanding emotion than even the most sensitive of people.

Finally, Lennie pottied in a toilet yesterday. Mleeka got this little toilet thingie months ago that looks sort of like a fancy little helmet with a piece to protect the bridge of your nose (you have to turn it upside down and put it on your head to see this, and it would really work much better with an adult-sized potty of the sort; my head, at any rate, doesn’t fit in the bowl). It’s contoured to form a pretty good seal with a baby’s butt and legs, and the idea is that you start training babies to pee in it when they’re really young. You’re not really training them to use the bathroom in it at so young an age, actually, so much as you’re trying to watch for the cues they give when they’re about to go; you’re laying the foundation for real potty training at an appropriate age. When you see these cues, you plop the baby on the toilet and reinforce the behavior with applause, money, promises of fame, and so on. Lots of people have great success at this. It’s really not that we’re jerk parents with these bizarrely unreasonable expectations that our kid could potty train a year or two before anybody else’s; it’s just a way of building an association between the sensation of pottying and the eventual accepted method and venue for pottying. So after giving up on this months ago because it just wasn’t working out, Mleeka broke the potty/helmet back out again yesterday, and we sat Lennie on it for a few minutes. I gave her a book to read while she was there (might as well give her a true representation of what the experience will be like when she’s older), and after about five minutes, we pulled her off the potty to put her diaper on her. We were really hoping for a poopy, and it was clear that that hadn’t happened (side note: Mleeka did this on the living room floor with no protection between the potty/helmet and the carpet, so I was secretly — heck, not even secretly; I was open about it — happy that there was no poopy). But when Mleeka moved the potty/helmet aside, it sloshed. There was pee in it. And on that note, I’ll end this little chronicle.