Whatever will I do without trashy TV?!?

Well, it’s official. I just cancelled my cable service, effective January 23rd. I found that for the past few weeks, I really haven’t been watching anything worth while, and $96.22/month is a lot to spend to have the only thing on be the HD version of American Gladiators. (No, seriously, that’s what I’m watching right now. Pity me.) I’ld like to say that it’s the writer’s strike, and the resulting lack of decent shows, or that I’m getting smarter and the shows are appealing to me less and less, but really it’s just gotten too expensive for the value I’m getting out of it. Heck, maybe I’ll take half of that money, and buy a couple of DVDs every month. But we’ll probably use it to pay down the Line of Credit that financed the deck.

I can’t remember the last time I didn’t have cable of some sort, and so I’m not really sure how I’ll be occupying my time. Reading books? Reading the Interweeb? Programming? It’s a blank slate. It’s all up in the air. And if I end up spending all my time at my sister’s house, watching her TV, then we’ll know I’ve got a bad addiction, and should seek professional help.

Oh, I should also mention that the person on the other end of the line was really nice. She tried to figure out a way for me to pay less, and still get the channels I wanted, (the best deal was $19.95/month for channels 2-28 and 59-70, but that was only for 6 months, and it’s still $20/month I would rather spend elsewhere,) but totally wasn’t pushy about it and was fine with me cancelling the service outright. I picked up the dial phone when they called me back for the customer satisfaction survey, and so couldn’t complete it, but I did want to make a mention of how helpful she was, and how well it all went.

Sprinting on DrProject.

On Friday and Saturday afternoon this week, I took some time out of my day to go down to the University of Toronto and participate in the DrProject Code Sprint. It was a lot of fun, and I managed to fix a couple of bugs, and get a better understanding of one of the hairier parts of DrProject. At least I hope it’s one of the hairier parts of DrProject, since if the whole codebase is as ugly as the wiki parts, we’re in some serious trouble. To be fair, it’s a not-entirely-deterministic parser for a not-entirely-deterministic language, so when something goes wrong, it’s kind of, uh, tricky to figure out what’s just happened. For example, after parsing a link surrounded in square brackets, the following character seems to be treated as text. Why? Who knows. As someone new to the wiki parser, I’ld love to have the code be simpler to understand, but I’m starting to suspect that the complexity is inherent in what it’s trying to do.

The two bugfixes/feature additions I did, although they seem sort of unrelated, both work together to let people create a bibliography/set of footnotes to pages, which is something Greg said that he’s been wanting for a while, so that was kind of cool. It’s nice to be able to go somewhere, be surrounded by smart people, and concentrate on making something better without interruptions.

Speaking of the bugfixes, they were:

  • adding support for dl/dt/dd in the wiki syntax, which turned out to be surprisingly hard, since it seemed to be the first bit of syntax that wanted to either return more than one tag or insert a tag into the already-generated stream, so I had to figure out which option to go with, and how to get it working, and
  • coming up with and implementing a wiki syntax for creating and referring to anchors in a page, which I think I did a pretty decent job on. The syntax uses [wiki:#foo] as an anchor, and [wiki:MyPage#foo] as a link to that anchor

How to break web applications.

I’m watching a video on my new iTouch about how to break web applications, and it presented the idea that Javascript is the same as stack overflows which are also the same as getting free phone calls by whistling a note into a payphone…
They're all examples of bad things happening when you intermingle code (javascript/return addresses/command tones) and data (html/arrays on the stack/your voice). I guess it’s sort of expensive to set up two connections for every connection, but that seems to be the only way to avoid stuff like this, which has apparently been happening for years.

I don’t think there’s a lot I can do with this new idea, but it seemed interesting, so I figured I’ld record it for posterity.

Bazaar on the iPod Touch.

Because I was curious, and because it has Python, I figured I'ld give it a try, and see what happened...
The results are:

# ./bzr selftest
testing: /private/var/root/bzr-1.0/bzr
   /private/var/root/bzr-1.0/bzrlib (1.0.0 python2.5.1.final.0)

bzr: ERROR: exceptions.ImportError: No module named pyexpat

Traceback (most recent call last):
  File "/private/var/root/bzr-1.0/bzrlib/commands.py", line 802, in run_bzr_catch_errors
    return run_bzr(argv)
  File "/private/var/root/bzr-1.0/bzrlib/commands.py", line 758, in run_bzr
    ret = run(*run_argv)
  File "/private/var/root/bzr-1.0/bzrlib/commands.py", line 492, in run_argv_aliases
    return self.run(**all_cmd_args)
  File "/private/var/root/bzr-1.0/bzrlib/builtins.py", line 2659, in run
    coverage_dir=coverage,
  File "/private/var/root/bzr-1.0/bzrlib/tests/__init__.py", line 2373, in selftest
    suite = test_suite()
  File "/private/var/root/bzr-1.0/bzrlib/tests/__init__.py", line 2531, in test_suite
    suite.addTest(loader.loadTestsFromModuleNames(testmod_names))
  File "/private/var/root/bzr-1.0/bzrlib/tests/TestUtil.py", line 89, in loadTestsFromModuleNames
    _load_module_by_name(name)
  File "/private/var/root/bzr-1.0/bzrlib/tests/TestUtil.py", line 96, in _load_module_by_name
    module = __import__(mod_name)
  File "/private/var/root/bzr-1.0/bzrlib/tests/test_bundle.py", line 32, in <module>
    from bzrlib.bundle.bundle_data import BundleTree
  File "/private/var/root/bzr-1.0/bzrlib/bundle/bundle_data.py", line 42, in <module>
    from bzrlib.xml5 import serializer_v5
  File "/private/var/root/bzr-1.0/bzrlib/xml5.py", line 26, in <module>
    from bzrlib.xml_serializer import SubElement, Element, Serializer
  File "/private/var/root/bzr-1.0/bzrlib/xml_serializer.py", line 47, in <module>
    from xml.parsers.expat import ExpatError as ParseError
  File "/usr/lib/python2.5/xml/parsers/expat.py", line 4, in <module>
    from pyexpat import *
ImportError: No module named pyexpat

bzr 1.0.0 on python 2.5.1.final.0 (darwin)
arguments: ['./bzr', 'selftest']
encoding: 'ascii', fsenc: 'utf-8', lang: None
plugins:
  launchpad            /private/var/root/bzr-1.0/bzrlib/plugins/launchpad [unknown]
  multiparent          /private/var/root/bzr-1.0/bzrlib/plugins/multiparent.pyc [unknown]
*** Bazaar has encountered an internal error.
    Please report a bug at https://bugs.launchpad.net/bzr/+filebug
    including this traceback, and a description of what you
    were doing when the error occurred.

Doing a bit of googling led me here (or rather, the google cache of that page). which says:

# 1/ The python installation from the installer ("unjailed iphone") does not come with the pyexpat module.

So, that's a little surprising.

I tried to install easy_install, to try an "easy_install pyexpat", but because I'm missing a Makefile, that fails with the following:

# python ez_setup.py
Downloading http://pypi.python.org/packages/2.5/s/setuptools/setuptools-0.6c7-py2.5.egg
Traceback (most recent call last):
  File "ez_setup.py", line 229, in <module>
    main(sys.argv[1:])
  File "ez_setup.py", line 163, in main
    from setuptools.command.easy_install import main
  File "build/bdist.linux-i686/egg/setuptools/__init__.py", line 2, in <module>
  File "build/bdist.linux-i686/egg/setuptools/extension.py", line 2, in <module>
  File "build/bdist.linux-i686/egg/setuptools/dist.py", line 5, in <module>
  File "build/bdist.linux-i686/egg/setuptools/command/__init__.py", line 13, in <module>
  File "/usr/lib/python2.5/distutils/command/bdist.py", line 29, in <module>
    class bdist (Command):
  File "/usr/lib/python2.5/distutils/command/bdist.py", line 37, in bdist
    "(default: %s)" % get_platform()),
  File "/usr/lib/python2.5/distutils/util.py", line 78, in get_platform
    cfgvars = get_config_vars()
  File "/usr/lib/python2.5/distutils/sysconfig.py", line 493, in get_config_vars
    func()
  File "/usr/lib/python2.5/distutils/sysconfig.py", line 352, in _init_posix
    raise DistutilsPlatformError(my_msg)
distutils.errors.DistutilsPlatformError: invalid Python installation: unable to open /usr/lib/python2.5/config/Makefile (No such file or directory)

And that was the end of that. Interesting, though...

Oh, yeah, and I ended up going with the iPod Touch (hereafter referred to as the iTouch) to replace my Palm TX. It's not the perfect device, as the above stack traces show, but it's pretty good, and a fair bit closer than the Palm TX was.

A Day in Our Life, 2007

I am feeling overwhelmed these days, recently by the holidays but even before that by the structure and stricture imposed by having to get the girls to their various schools. For some reason I thought having the girls at school would mean more free time for me, but as it turns out, not so much. All this to say that unfortunately blogging has dropped down to the bottom of my priority list, somewhere below cleaning the toilet and flossing, although above sweeping the basement floor and writing letters to politicians. This is mainly unfortunate not because I am depriving you, my public, of my wisdom, but because the girls are so damn charming these days and it's a pity I'm not writing it down because I'm sure they will go through less charming periods and it would be nice to have this stuff to reminisce about.

One of my problems is that there is so much to write about: what Cordelia's like, what Delphine is like, what my life is like, Delphine's identity issues (why must a four-and-a-half year old have identity issues!), the weather, the neighbours' tacky plastic light-up nativity lawn ornaments. I have to choose something.

So here's what our days are like. Sometime in the morning Cordelia wakes up, usually between six and six-thirty. By this time Delphine is mysteriously already in bed with us. She used to get in bed on Blake's side — he would snuggle with her and then take her back to bed. Then he started complaining about that because he finds it really hard to get back to sleep after an interruption, whereas I can usually drop right back off again. Fine, I said, Delphine should come and see me when she wakes up in the night. Which is apparently every night. So we got her to do that. The only problem is, I sleep so soundly that I don't even wake up and she ends up sleeping with us all night, which wouldn't bother me but apparently we crowd Blake. Not sure what the resolution to this problem is, but I hope when Delphine gets her new bed and comforter she will stay in her own bed. Maybe we'll make a rule or something.

So anyway, Cordelia wakes up, sometimes crying and sometimes singing. She's still sleeping in a crib, so I get up and get her and she comes back to the big bed for a "snuggle", meaning she nurses for a bit, yes she's still nursing, we're going to stop any time now! Really! Usually Delphine and Cordelia get into a bit of a spat because Cordelia's hitting Delphine (she likes to thump something while she's nursing, or kick something) or because Delphine said "Hi Cordelia" and Cordelia didn't say hi back, or something. Delphine's often a bit testy in the morning. Sometimes she's really gorgeous and cheery and patient with Cordelia; I never know which Delphine I'm going to get.

Anyway, after all the foolishness with the snuggling and fighting is over, Delphine and Cordelia take their leave and Blake and I grab a few more minutes of blissful rest. The girls used to go off and play but I found it hard to get them to focus on getting dressed and coming for breakfast after they had gotten into a game, so a few weeks ago I imposed a rule that states that you have to be dressed before you can play, and if you play before you are dressed I will confiscate whatever you are playing with for the rest of the day. I am so mean. It works, though, they get dressed now. Delphine dresses herself and then she helps Cordelia get dressed. Sometimes Cordelia looks pretty wild; the other day she was dressed in a blue, pink and green horizontal-striped shirt, a shades-of-pink diagonal striped summer dress over top, and her black and yellow striped bee tights from Hallowe'en. I guess to a 4.5 year old, three kinds of stripes qualifies as matching. Cordelia doesn't care what she wears yet, except some days when she mysteriously insists on one particular garment.

Once the girls are dressed they and I stumble downstairs and I throw together some breakfast, usually toast or cereal. I always feel that there should be some other food groups, maybe fruit, but I can't face fruit first thing in the morning — too tangy — so I always forget to offer it to the girls. I should perhaps try a little harder.

If it's a Tuesday or Thursday then Cordelia has nursery school, so there is usually a moderate rush to get out the door. Nursery school is a fifteen minute walk away; fifteen minutes there plus fifteen minutes back, twice, makes an extra hour of walking, twice a week, which is great for my waistline but kind of messes up my schedule, especially around lunchtime, but I will get to that.

If Cordelia has school, we drop her off by nine and then Delphine have the morning to ourselves. It would be nice if we spent that time with quality bonding activities like reading or playing at the park or, I don't know, tennis or something, but in reality usually I have a million errands to run on the way home, then we get home and I have a bunch of chores to do before we turn around and go pick up Cordelia at 11:30.

If Cordelia doesn't have school we typically just putter around the house; the girls do colouring or sticking, or they build things with blocks, or they make train tracks, or they do imaginary things with dollies. They also like to disassemble the sofa and use its cushions to make forts or big piles, especially in combination with the plexiglass nesting side tables I bought at Caban years ago. I didn't imagine at the time that they would one day become houses and tunnels and beds.

While the girls are playing I'm usually doing jobs; neverending laundry, sweeping, cleaning the kitchen, more laundry. Sometimes I clean the bathroom. I'm sure there are lots of other housework activities I should be doing, but somehow I never get to them between walking people places, doing laundry and cooking.

If it is Tuesday or Thursday at 11:30 and we have just picked Cordelia from school, we have to hurry home to have lunch in time to turn around and go back out the door to take Delphine to school by 12:45. Now that it's winter and we have to do the snow pants/jacket/boots/hat/mitts/scarf thing our turnaround time is fairly long and there's not a lot of time for making and eating lunch. Lunchtime on Tuesdays and Thursdays is not pretty at my house, and it often involves peanut butter sandwiches. It's a complete protein!

After Delphine is safely deposited at school, it's time for Cordelia's nap. She's usually tucked in by 1:20 and then I have almost an hour and a half of unaccompanied time yawning ahead of me. This would be more exciting if there weren't the fairly predictable round of laundry and sweeping and tidying to do, but sometimes I catch a short nap, or read a bit, or even play on the internet for a while. (It has taken me four sessions to write this entry, and I am only finishing it today because the girls are at Baba and Zaida's for supper.)

I almost always have to wake Cordelia up at 2:45 to give her time to get her wits about her and have something to eat before we leave to pick up Delphine at 3:15. Delphine plays in the schoolyard with her friends for a while and we're back home by 4:00, whereupon I make dinner which we eat at 5:00 (no, it doesn't take me an hour to make dinner but I have to give myself an hour to deal with interruptions and crises on the way). Bathtime happens around 5:45, followed by bedtime (pajamas, teeth, books and tucks) and if we're lucky everyone is snug by 7:00. 7:30 at the latest. Blake usually gets home sometime in the middle of bedtime, which the girls think is great because he always has time to snuggle with them in the big bed, or read an extra book.

That's when the real fun begins, or so the girls suspect. In reality the evening involves clearing up after supper, cleaning the kitchen, more laundry, any other chores that absolutely can't be completed with children present (like wrapping Christmas gifts!), and then finally we can collapse in front of the TV for a few minutes (maybe hours) until I have to get to bed, which is before ten or else I am too crabby the next day. Here's what we watch on TV these days: Dirty Jobs, Chuck, America's Funniest Home Videos, Battlestar Galactica, The Tudors, Kid Nation (until it ended), and sometimes Design Inc.. The Daily Show when it's not on strike. We love TV but I think we're going to cancel cable; it's just too expensive for the few shows we watch, and for all the millions of channels there is almost nothing to watch on an spontaneous basis; if we don't have anything saved on the PVR we're pretty much screwed. So we're going to switch to downloading or (more likely) reading books.

Life is pretty full and busy and there's not much time to breathe, and that's with me home all the time. I don't know how people with jobs do it (apart from if I had a job I would damn well pay someone to do all the housework). My days are pretty much preordained starting at around 11:30 am until 7:00 pm, and this is the first time that being a Mum has really felt like a job in the usual sense. Previously I've had all kinds of things to do and lots of demands on my attention, but I've been able to more-or-less define when I did stuff and what I did (apart from the obviously non-negotiable diaper changes and naps and stuff), but now I need to be up and out and getting things done whether I feel like it or not.

Not that I am complaining; the structure certainly doesn't hurt and it certainly passes the time and keeps me honest. My chief complaint right now is with the weather; I hate wresting little Cordelia into snowpants and boots because it takes forever and it's hard on my back. I can't wait until she's old enough to do that stuff herself, which should be next winter. (Never mind that, there are still mothers who try and help their kindergartners with snow pants!) In general we are all pretty happy with our lots in life; Delphine loves school, Cordelia loves school, they mostly love each other, Blake likes his job and I like mine, we love each other and we're mad about the girls. Can't ask for much more that!

Christmas Concert!

Delphine had her first Christmas Concert on Friday so I took the day off, and Amy and I went to watch. Here they are — Delphine is the one in the red dress and silver tinsel crown:

Higher resolution versions are also available.

Malted Barley Flour Review

At the Royal Winter Fair this year, Amy picked up a small bag of malted barley flour, because she likes the taste of malt, and because we have a recipe for malt bread which calls for malted (not barley) flour. We’ve since tried to use it in a few different loaves, and while I quite enjoy the taste, as little as a quarter of a cup will make the bread twice as dense as usual, and incredibly sticky to boot.

It seems like it would be a useful thing to have, so that if you had a bread that you knew was going to be a little dry for some reason, you could just add a pinch of the stuff, and moisten it right up, but I still haven’t figured out how little to put in to get a slightly-moister bread which doesn’t adhere to the knife. If I do, I’ll be sure to post a comment, but until then, if you manage to get some malted barley flour, be exceedingly sparing in your use of it, and I’ll continue experimenting and picking bread out of my teeth.

A Year in Proven... uh, Davisville Village

Today marks exactly one year since we moved into our little house. A year ago this evening we were sitting amid piles and piles of boxes, still fretting from our run-in with surly movers and our inability to locate toothbrushes or pyjamas for the children. Last Christmas was a cluttered mess with no decorations except for a tiny pre-decorated tree. The months ahead would be full of frozen convenience food because our stove was unusable (although very funky!), dim lighting, long walks to daycare, and the crustiest old linoleum I had ever seen. When I look back at it now I wonder how we possibly got through it, but at the time it seemed all right. Kind of.

So after slogging through a long and unChristmassy December in the new house, we interviewed a few contractors. Mostly they didn't seem to want to have anything to do with us, probably because I got a list of recommendations from a friend of contractors from the suburbs, and I bet they don't care to bother with little houses with no driveway and tiny doors and muddy access lanes when they can find a million suburban clients with huge houses and lots of land to park their dumpsters on. But we finally found a guy who was really nice and seemed helpful and smart, and seemed to understand what we wanted, and who cost a billion dollars. We were very sad. We looked at our reno plan and started making cuts, and got into big fights; Blake wanted to take down the walls and make do with the kitchen, I thought I couldn't possibly make do with the kitchen and the walls were aesthetic and could wait. We cried. Well, I cried. It sucked.

Then finally Andy made us meet with Stephanie and her company, and they agreed to do the whole job for about half the price the other dude was asking. Half the price. We had to make sure they hadn't made a mistake about what we wanted, their price was so low. Well, the fact was they were doing a huge favour for Andy because he's such a swell guy; they made us promise never to tell anyone else what they charged us because they would go out of business if they did any other jobs at that rate. (It's good to have a really charming father-in-law!) So we didn't have to compromise. We got it all: we took down the walls on the main floor, we got a whole new kitchen, we tiled the front hall, we redid the electrical in the whole house and painted. It all took only a couple of months, and to Stephanie and her team's credit, they did everything to the exact same high standard that they set for their richer clients, because they take personal pride in doing their jobs properly.

In fact, just last week I discovered that the trained monkeys who installed our Ikea kitchen had neglected to install the forced air vent. They didn't just forget, they actually saw that it should be done, didn't do it, and willfully assembled the cabinetry so that the venting was very hard to install, because that was the easy thing for them to do. Cory had left a piece of venting there to show them where they would need to work around, and they took it out and tossed it aside, and then installed a cabinet with the legs directly in front of the vent hole in the wall. So last week when I realized there was no heat in the kitchen, I emailed Stephanie. She sent Cory in, Cory arrived with his tools, assessed the situation, figured out a solution, implemented the solution, tidied up and was out of there in a couple of hours. No bill, no invoice, nothing; it was considered part of the original reno, which is already paid for.

Stephanie has also sent members of her team back to repair and paint cracks in the walls where the new drywall settled, to fix a sticky latch on a gate, and to clean up some foam caulking stuff which someone had spilled on the floor. Stephanie believes in leaving a perfect site, no matter how long it takes.

The reno wasn't a lot of fun to live through. We set up a makeshift kitchen (microwave, toaster oven and fridge) next to the laundry sink in the basement and spent our days there, in the tiny corner of the living room which was cordoned off with a plastic sheet, and at Baba and Zaida's house. Oh, that sucked and it was a very long eight weeks but it passed as inexorably as any other eight weeks, and one day it was over; appliances installed, plaster dust vacuumed up, paint dried. Suddenly we were normal people with a normal (mostly) house. What bliss! What joy!

Now we have a house with lots of space on the main floor (well... relatively speaking), a bright, sunny, organized kitchen which gets a lot of use, tons of electrical outlets and lights, and a huge back deck. I'm really starting to like this house. I did suffer a pang of jealousy sitting in my friend's south-facing living room. We don't have any south-facing windows, and the west windows are in the kitchen and Delphine's room, and they're really pretty small. So we don't get that ocean of warm sunshine we used to get in the condo, and I miss that on sunny winter days. I hope that a couple of skylights will make the house brighter. One day.

A year ago today, cold, frustrated, tired, missing the condo and wondering what the hell we had done, I consoled myself with the thought that in a year everything would be normal and happy again, and I was right. Yesterday we spent the whole day putting up our (really rather huge, in this place) Christmas tree, spangling the mantelpiece with tinsel and lights and tiny china Santas (and a menorah, poor thing), and stringing J'Anne's beautiful handmade stockings all up the staircase. The house is warm and cozy and full of love and giggling little girls, and I could hardly be any happier.

Choices, choices...

So I hit the Apple Store in the Eaton Center again today, to play with the iPod Touch a little more, and now I’m kind of sad that I did. There seem to be a few things about it that I don’t know if I can deal with. First, the screen apparently uses a capacitive screen, which basically means that you need to use your fingers to touch it. No slightly-longer-than-normal thumbnails, no left-over spare stylii, nothing that could make the large surface area of my stubby fingers slightly smaller. This turned out to be a little annoying when I was trying to type. I would probably get used to it if it weren’t for the second problem. Very few of the apps seem to support landscape-mode text input. Where by "very few", I mean "only Safari". The keyboard in portrait-mode is just a little too small for my fingers. Bah, who am I kidding? The keyboard in landscape-mode is just a little too small for my fingers. The keyboard in portrait-mode is way too small for my fingers.

So, I can’t really type on it. That’s a fairly big problem. But at least I can download videos and music from my website, so that when I’m at the office, and I see that my long DVD-to-iPod conversion has finished, I can grab a copy of it over HTTP to watch on the commute home… But when I tried it, it was a total no-go. None of the avis worked, which isn’t totally surprising, but the mp3s in the same directory also gave me the “Safari is unable to download this file”. WTF?!? An MP3 player that can’t play MP3s? The biggest downside of this whole trip is that I can’t really think of a good way around either of those problems. I mean, I guess text editors will come out which allow landscape-mode keyboards, but it’s going to be annoying every time I go to enter a new appointment, or contact. And I don’t have any idea what I could do to get around the no-downloading stuff. So I guess I’m back to looking at other options (and maybe ending up asking Jeremy for my SD Card back). And no, I don’t think the Nintendo DS is a reasonable replacement. It’s too… game-y. Not enough like an actual PDA.