Conversations With Delphine

Blake and I usually tidy up the living room every night after the girls are in bed, but last night we were just too tired and couldn't be bothered.

This morning Delphine was appalled when she came into the living room.

"It's so messy! It was messy ALL NIGHT! You guys were supposed to tidy up!"

I think 4:30 has just officially become "Tidy-Up Time". "You guys" indeed!

Some questions from a new Mac user.

Cc:-ed to the MacPython list, because they might know.

Hello,

I'm trying to get Subversion bindings for my installed version of MacPython (/Library/Frameworks/Python.framework/Versions/2.4/) This seems to mean that I want to install Subversion, and if so, I would like to get it hooked up to Apache so that I can connect to http://svn.latte.ca/ (or whatever) on my work computer and access my home repository.

Now, I can install the subversion python bindings using DarwinPorts, but that won't hook into the Framework version of Python, so I've downloaded the Subversion 1.3.2 sources, and I can build them, but they complain about my version of Apache. Specifically, about apxs being too old.

Do I really need to upgrade apache to Apache 2 to get this all working?

Is there a good way of replacing the default Apache with Apache 2, or is that a really bad idea because the Software Update will get horribly confused?

Is there another place I should be asking these questions?

Thanks,
Blake.

Books in August

The Highly Sensitive Child: Helping our children thrive when the world overwhelms them by Elaine Aron. After Delphine decided she hated music class because the leader was too loud, a friend recommended I read this book. It is about the 15 to 20 percent of children who are apparently highly sensitive, and how to parent them effectively without making them miserable.

So is Delphine highly sensitive? Kind of... she's unusually sensitive to noises, and to the emotional state of others. Combine the two and logically you could determine that she is very sensitive to noisy expressions of emotion, as we saw at the music class and as Baba's friend Ann found out. (She had cause to gasp loudly in surprise in Delphine's presence once; Delphine cried a lot, and ever since then Delphine has periodically mentioned, "Ann shouted, and then I cried. Why did Ann shout?")

It does make her easy to discipline by shouting at her, but I'm not a big proponent of the "Discipline by Scaring the Shit out of your Child" method, so I try to avoid it. (Easier said than done, since shouting is what I do when I'm angry, and getting angry is what I do when I'm depressed, and depressed is what I get alarmingly easily, it seems. More about that later, though.)

Delphine's not sensitive to other things that the book discusses though; she doesn't care if her food touches, and she isn't bothered by tags on clothing or seams on socks or tactile annoyances of that nature. Thank goodness, because it seems like it would be irritating to have to work around those kinds of sensitivities. I am quite sympathetic to Delphine's sensitivities because I think I share them (I will read the adult version of the book sometime and see) and so I can quite easily understand her and figure out what is going to upset her, especially now that I have read this book and know what patterns and situations to watch for.

I wouldn't read this book if you don't think you have a sensitive child, because that would be borrowing trouble — if you don't have to worry about this stuff I would strongly recommend you don't. But if you think your child might be sensitive, or seems to react disproportionately to certain situations, this book is probably worth a look.

Vices of My Blood by Maureen Jennings is a murder mystery set in Victorian Toronto, which is just brilliant. I love getting a picture of what Toronto was like in the past, and Jennings does a great job painting that picture. The characters are appealing and the mystery was good; what more can you ask?

How To Read Literature Like A Professor: A Lively and Entertaining Guide To Reading Between The Lines by Thomas C. Foster. I am frankly a little pissed off that I haven't read this book before. I have been hinting around needing a book like this for ages — when I read How To Read and Why by Harold Bloom, I thought it really failed to discuss the How part. This book does.

The book is a high-level discussion of the symbolism found in literature: every trip is a quest; eating is always significant, usually of communion or trust among the eaters; weather is usually about something other than weather; and so on. Foster also discusses sonnets, and briefly (one chapter each) touches on Shakespeare, the Bible, Children's Literature, and mythology (mainly Greek) as precursors or fodder for allusions or roots or — there must be a word for this but I can't think of it — anyway, stuff that writers allude or refer to in order to enrich their text. Foster discusses intentionality (did the author really mean that to be a symbol/allusion/pattern? Answer: yes.) and irony, and then caps the whole thing off with a short story to practice your newfound skills on.

I love this book. I might buy a copy. It makes me wish I had read it before I read Cat's Eye because I am sure I missed a whole lot in that book by just reading for plot. But I have the rest of my life to try and read more deeply.

It made me think, though. First, reading like a professor seems like a lot of work; you have to keep track of symbols, you have to look for patterns, you have to try and figure out where you have seen this story or this character before, you are always looking for the next layer or layers of meaning below the simple action and dialogue in the story. And is it worth it? Do you really get that much more out of the book? I guess you do, or else no-one would bother.

And then, after you have been doing that for a few years and get good at it and do it automatically, mustn't it be horribly disappointing when you pick up a normal book, a potboiler someone left at the cottage or something, and you keep trying to find depths of meaning that just aren't there?

Like when you are used to watching Buffy and Firefly, and you watch a regular show and you realize that the enticing hints being dropped will never be picked up on, that the characters really are as one-dimentional as they seem, that the really obvious foreshadowing is actually just plain foreshadowing and not the clever misdirect you assumed it would be.

It must be like when you drink Manischewitz kosher wine and at first it tastes like sweet grape juice and you are waiting for the hit of spiciness or mellowness or depth that you would get if it were a good wine, like maybe ice wine... but instead it just turns sour and flat.

And another thing. The short story he gives as an example to practice on. It's a lovely story and being the simple-minded lass I am, I enjoyed it for the characters and the plot and the setting. Then I re-read it and tried to find the symbolism and allusions and the meaning, and I came up with a couple of pretty good insights. Then I read the professor's interpretation, and as it turns out the end of the story is a big huge, kind-of-obvious reference to Persephone's journey into Hades which I entirely missed, not surprisingly because I know nothing about Greek mythology (although Foster did helpfully present the myth earlier in the book, so I can't entirely plead ignorance.)

But now I have this idea that reading like a professor is like solving a riddle, and that in this case I have failed. I know that isn't entirely true; I'm sure that having been able to see that allusion contributes to one's appreciation of the story and therefore it is valuable, but I enjoyed the story for what I got out of it without making that connection. But I can't help but feel like I got it wrong, somehow, and that I have to "solve" each piece of literature as if it were a mathematical problem.

Thus I conjure up an image of myself poring through heaps of classics trying to figure out the hidden meaning, and triumphantly snapping each one closed and setting it aside as I "decode" it. "Figured out that one! Next!" Which I am sure is not the point.

Snakes on an Apple!

As I mentioned before, we got a Mac Mini. It's been a bit of a pain getting it all set up, but I think we're finally done. The web server is moved over, along with all the websites. The mail server is moved over, and I took the opportunity to delete my mother's account. (That's not as bad as it sounds. She had it redirecting to GMail anyways, and the error message says as much. Of course, since I haven't told her about it yet, this will probably come as a bit of a surprise.) Uh, and that turned out to be all the servers I was running. Well, I was running CherryPy, and some other stuff, but it wasn't particularly important, and I've found better ways of doing it, for the most part.

But that's not really why I'm posting here. I'm posting here because I got some cool Python stuff working under the Mac, and I wanted to share it. Specifically, I (or rather, my wife and I) wanted to have a window showing on the login screen, displaying the weather. After several bits of trial and error, and liberal "borrowing" from Dethe Elza's Pastels project I finally got something which would do what I wanted. First, the code:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
from AppKit import NSObject, NSApplication, NSTimer, NSApp, NSURL
from AppKit import NSURLRequest, NSWindow, NSTitledWindowMask
from AppKit import NSClosableWindowMask, NSMiniaturizableWindowMask
from AppKit import NSResizableWindowMask, NSBackingStoreBuffered
from BeautifulSoup import BeautifulSoup
from PyObjCTools import AppHelper
from WebKit import WebView, WebDataSource

import os
import stat
import time
import urllib

width, height = 620, 540

def Window(title, width, height, view=None):
    window = NSWindow.alloc().initWithContentRect_styleMask_backing_defer_(
        ((0,0),(width,height)),
        NSTitledWindowMask |
        NSClosableWindowMask | 
        NSMiniaturizableWindowMask |
        NSResizableWindowMask,
        NSBackingStoreBuffered,
        False)
    window.setTitle_(title)
    if view:
        window.setContentView_(view)
    window.orderFront_(window)
    return window

class MyAppDelegate(NSObject):
    def update( self, timer ):
        y = urllib.urlopen( str(self.wUrl) ).read()
        b = BeautifulSoup( y )
        self.view.mainFrame().loadHTMLString_baseURL_(
            """<html><head><title>test<title>%s<head>
            <body>%s<body><html>""" %
            ("".join( [str(x) for x in b.head.findAll( 'style' )]), b.body.div.div.div.div.div),
            self.wUrl )

    def applicationDidFinishLaunching_(self, notification):
        rect = ((0,0),(width, height))
        self.view = WebView.alloc().initWithFrame_(rect)
        self.window = Window('Pastels Test', width, height, self.view)
        self.window_delegate = MyWindowDelegate.alloc().init()
        self.window.setDelegate_(self.window_delegate)
        self.wUrl = NSURL.alloc().initWithString_(
            "http://weatheroffice.ec.gc.ca/city/pages/on-143_metric_e.html")
        self.update( None )
        timer = NSTimer.scheduledTimerWithTimeInterval_target_selector_userInfo_repeats_(
            1800, self, 'update', None, True )

class MyWindowDelegate(NSObject):
    def windowWillClose_(self, notification):
        NSApp().terminate_(self)

def main():
    app_delegate = MyAppDelegate.alloc().init()
    NSApplication.sharedApplication().setDelegate_(app_delegate)   
    AppHelper.runEventLoop(installInterrupt=True)


if __name__ == "__main__":
    while True:
        if os.stat( "/dev/console" )[stat.ST_UID] == 0:
            # If the console is owned by root, start the app.
            main()
        else:
            # Otherwise, sleep until it is.
            time.sleep( 10 )


And next, the launchd plist file that keeps it running:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
"http://www.apple.
com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>  
    <key>Label</key>
    <string>ca.latte.update.login.weather</string>
    <key>ProgramArguments</key>
    <array> 
        <string>/path/to/test.py</string>
    </array>
    <key>ServiceDescription</key>
    <string>A program to pop up the weather in a box</string>
    <key>LowPriorityIO</key>
    <true/>
    <key>RunAtLoad</key>
    <true/>
    <key>OnDemand</key>
    <false/>
    <key>Nice</key>
    <integer>1</integer>
    <key>StandardOutPath</key>
    <string>/path/to/loginWeather.out</string>
    <key>StandardErrorPath</key>
    <string>/path/to/loginWeather.err</string>
</dict>
</plist>

And there you have it. Way cooler than my previous attempt, which tried to write using sudo defaults write /Library/Preferences/com.apple.loginwindow LoginwindowText -string "parsed weather info here".

If any of you have any questions, I'ld love to answer them as best I can. Just comment, and I'll see what I can dig up. By which I mean email Dethe, and ask him. ;)

Why?

Delphine (still) asks us why a lot. Sadly, sometimes I don't have a good answer, which sort of led to the conversation we had this afternoon.

[First scene. Two cactuses are dancing.]
Delphine: "Why are the cactuses?"
Me: "Well, uh, they just are. Questions about why a thing is don't really have answers."

[Next scene. A goat has paint on himself.]
Delphine: "Why is he dirty?"
Me: "..."
Delphine: "He's dirty cause he was painting."

So, I guess some questions about why a thing is something are easy to answer but some questions about why a thing is something have no good answer. Can anyone tell me what the difference between the questions is, and how to explain it to a three-year-old without using words like "intrinsic", or "just because"?

Assaulted Women Need Your Help

The short-term goal of all this running foolishness is to run the 5K event in the Toronto Waterfront Marathon on September 24th, in aid of the Assaulted Women's Helpline. Initially my friend Michelle talked me into doing the 5K walk because she is involved with the helpline, and then I decided to upgrade to the run. And now I have to collect pledges, which I hate doing. I sent out email, and I am posting here, and hopefully that will earn me enough pledges to get me off the hook.

It makes it easier that this is a pretty compelling cause. If you want some idea of why the helpline is needed, go to their chilling page on how to erase your online tracks. Can you imagine living under that kind of scrutiny, with someone who believes they are entitled to that kind of control over you, and having no way out? It makes me angry just thinking about it.

So if you want to pledge some money for a good cause, or just to express your astonishment that I am actually running anywhere for any reason, here's my online pledge page. Thank you!

Running With A Friend, and Some Other Things

I went running last night with my friend Michelle, my real-life inspiration for all this perspiration. It was the first time I have been running with someone else, apart from the clinic. It was easier than running alone; the time goes a little faster. We chatted about this and that and she gave me some hard won running tips. (Breathing is good!) She is training for a half-marathon which means she runs for, like, multiple hours at a time, and is doing hill training and real athletic things like that. That's so cool!

Since I was running with company (company, moreover, with a fancy interval-timing watch) I decided to try three-and-ones for the first time. The first set was fairly hard but we slowed down a little and the rest were quite doable, if a smidgen on the long side.

Running with someone was fun, but running alone is nice, too — it's good to have some time alone with myself. I think it will be less pleasant as I increase my running time; I imagine it will be harder work and I will find it more difficult to keep my mind off the pain, or maybe the boredom. Perhaps that is when I will treat myself to an iPod.

I'm back in a Learn To Run clinic again; last Saturday was the first meeting. Obviously, since I attended the first two weeks of the last clinic before my injured knee forced me to drop out, it was all familiar material. The run portion was a cakewalk for me since it was two minutes walking, one minute running, although we were running a little faster than I have been. I hit it off with another girl and we ran quite far behind everyone else. She was embarrassed but I didn't care; better to run slow and keep running than to run fast, save face, and hurt yourself.

Cordelia at Ten Months

Cordelia is talking. She says "Cat". Okay, she says "Gah!" But she says it a lot, when she sees a cat. "Gah! Gah gah gah!" And she grins, and claps her hands. She loves the gahs.

She isn't walking yet, but she stands with aplomb, holding things in her hands, picking them up, putting them down again, drinking from her sippy cup while holding something in her other hand and not falling over, all at the same time.

She has an excellent sense of humour, with a particular taste for the absurd; silly hats, funny faces, things where they are not supposed to be give her pleasure and result in infectious throaty chuckles. She also likes it if you run towards her making silly noises and then nibble her on the neck. But then, who doesn't? Try it on your boss sometime.

She is a bit mischievious; the other day I was on the computer while she played and Delphine was napping on the big bed. I suddenly noticed that Cordelia was heading into our bedroom to torment Delphine, so I pushed my chair back and said "uh-uh"; Cordelia immediately squealed with delight and accelerated, her little hands slap-slap-slapping on the hardwood. "Chase me!" Little monster!

She sleeps quite well, provided she is not disturbed. I put her down after a short ritual at about 6:30, and she sleeps until 6:00 the next morning, with maybe one or two breaks to howl a couple of times, then back to sleep. She's fairly easily woken, so we have had to move Delphine's bed into the office/living room. Poor Delphine goes to bed in the big bed and then when we come to bed we move her into the office; she has been squeezed out of her own bedroom altogether. I guess that's the price you pay for being the one who sleeps well. It will be nice when they each have their own room.

Cordelia doesn't like to be spoon-fed, so I feed her finger food as much as I can; toast, crackers, cereal, beans, zucchini, cooked carrot, fruit. She gets a fairly good variety, most of which seems to go on the floor. But she's still nursing three or more times a day, so I am not too worried about it.

It seems weird that she is almost a year old. I am glad; I am looking forward to having two walking, talking, going-to-the-bathroom-all-by-themselves kids. But it still seems kind of soon, somehow. This baby is growing up much faster than the last one did.

The English Language is Putty In Her Hands

Yesterday Delphine and Cordelia and I went out to run some errands. On the way home Delphine said, "Do you remember the Vikings? In Daddy's movie?"

I didn't remember, but she went on to tell me the story of the Vikings, most of which I missed but which ended with "They went home. The end."

Then she decided she was going to be a Viking, so she put on her imaginary Viking helmet and charged around happily shouting "Vike! Vike! Vike!"

Coming Back

(Return path marked in green.)

Based on my experiences with tricky detours heading up to Balm Beach, I thought that I should just take nice straight routes home, and see how that worked out. So I took Highway 6/27 straight into Barrie, then Concession Road 10 to Bradford, then Yonge Street stright to Finch Station.

As I said in the previous post, there was some craziness on the trip back. The weather prediction was a 40% chance of thunderstorms. I figure those are better odds than you would get at a casino, and I don't really have any other way to get home, so it didn't really affect my planning. I got to Barrie in record time, and figured that if the rest of the trip was that easy, I would have nothing to worry about. After an Iced Capp at Timmy's I made my way onto Concession Road 10, and kept on keeping on. Sure enough, 20 minutes out of Barrie, the skies opened, and a torrential downpour started. For most of it I was reduced to peering out of one mostly-closed eye, seeing only a few tens of feet ahead of me, since the rain was apparently pelting its way through my sunglasses, to hit me in the eyes. I suppose, in retrospect, that that was a good clue to me that I should have pulled over to the side of the road, and waited it out, but at the time, I figured I should just keep on riding, over to the edge more so that cars wouldn't hit me, because who knows how long the rain would last, and I didn't want to be stuck standing there for hours. Well, the rain didn't last that long, but it did manage to completely soak me, and my shoes didn't dry out that night, nor the next. Having said that, the wet shirt and shorts did manage to keep me comfortably cool for the rest of the ride.

South of Barrie, I stopped in Bradford for a rest, gave Amy a call, and went on South down Yonge. It was getting a little hillier, and so I tried to take it a little easier, stopping every now and then. I met a nice kid who was taking the bus to his job at Canada's Wonderland. He was hoping for a thunderstorm, so that he could sit around and do nothing, and still get paid. Heh. He was also quite impressed at my trip so far. Finally, I saw the CN Tower. What a rush that was. I worked out at one point that I could describe my trip as "Go as far north as you can see. Then look north again, and go as far north as you can see. Lather. Rinse. Repeat." I never did manage to keep track of how many times you would have to do that, but it's sort of a neat idea. Maybe next year.