Review of Wicked: The Life and Times of the Wicked Witch of the West by Gregory Maguire

Wicked: The Life and Times of the Wicked Witch of the West (Harper Fiction)

I started out loving everything about this book. Elphaba’s (the wicked witch) childhood and youth and adolescence are a beautiful coming-of-age story about a girl coming to terms with being obviously different than everyone else (she’s bright green). Then Elphaba goes off to college, where the story just keeps getting better and better, until Elphaba and her friends go to the weird trippy night club where a bunch of really far-out stuff goes down. Then in the next chapter, we skip forward a few months, the tight clique has disintegrated, and all the characters have been permanently changed and disconnected from each other.

I spent the rest of the book hoping we’d get some explanation for what happened, but we never go back. We never get any details about that night, only a few cryptic elliptical references. Instead, the story follows a monotonic downward trajectory towards an end everyone already knows is inevitable. This is a major bummer. By the end of the book, I was just glad the story was finished.

Finally, almost all the interesting plot and action and characters have nothing to do with the Dorothy plot line. By the time Dorothy and the Wizard show up in any meaningful way, the book is almost finished. I suspect McGuire is a closeted fantasy writer, but ashamed of it because of his “real literature” aspirations. McGuire only transplanted his story into the Oz universe as a marketing gimmick and/or post-modern commentary.

In the end, this book has a lot of the traits that make Harry Potter appealing: it reclaims the fantasy genre from the Dungeons and Dragons geek domain and the characters deal with problems that are at once alien and also very human.

Here’s a pretty Amazon link that includes my referrer ID:

Final harvest from the garden for 2007

On Saturday, December 15th, I pulled up the last row of carrots from the garden. I had set up my cold frame around them about a month ago, when the snow started falling. The cold frame is really just a big wood box with heavy-duty cellophane across the top. It works like a miniature greenhouse, and it keeps the snow off my plants. So, it let the carrots grow for another month when everything else had frozen.

Anyway, here’s a few pictures. This one shows the carrots before getting washed:

Photo0255.jpg

After scrubbing the dirt off, they look like food:

Photo0268.jpg

And in this picture I lined them up like little people.

Photo0281.jpg

I set the oven to 400 degrees, sliced all the carrots into little discs, tossed them in lots of olive oil, salt, pepper, and thyme, then spread them out over a cookie sheet. Once the oven was ready, I put the cookie sheet in and set the timer for an hour. Then I went outside to shovel my driveway.

By the time I finished shoveling snow, the carrots were ready. I ate all of them while standing over the sink. They were so delicious I couldn’t stop eating in order to take any pictures.

I have more gardening pictures on flickr, including a lot more carrot pics.

Ubuntu Gutsy twill package breaks the showforms command

On one computer named snowball, I installed the ubuntu twill package, then tried to test my webapp:

$ twill-sh -u http://coleridge:8181/login2
==> at http://coleridge:8181/login2

-= Welcome to twill! =-

current page: http://coleridge:8181/login2
>> showforms
current page: http://coleridge:8181/login2
>> show




Login 2

Login 2



current page: http://coleridge:8181/login2
>>

The page clearly contains a form, but twill’s showforms command doesn’t display it. Fortunately, I found this post on the twill mailing list and so I didn’t waste too much time scratching my head. Then on this other box, coleridge, I installed twill using easy_install, and all was well:

$ twill-sh -u http://localhost:8181/login2
==> at http://localhost:8181/login2

-= Welcome to twill! =-

current page: http://localhost:8181/login2
>> showforms

Form name=login2 (#1)
## ## __Name__________________ __Type___ __ID________ __Value__________________
1 user_name text (None)
2 passwd password (None)
3 1 None submit (None)

current page: http://localhost:8181/login2

Sidenote: snowball is my new computer. She is a beaut; a 600mhz Compaq Presario with 60mb of ram, and a hard drive that makes clicking sounds when anything happens. I think Clinton was still in office when she was manufactured. I’d like to thank my son for helping decorate her with some very cool Godzilla stickers.

Photo0250.jpg

Installing on such an old machine meant I had to monkey a fair amount with some kernel modules, which is always a blast, and I am now much more aware of how much every program really costs in terms of CPU utilization and memory footprint.

Funny comic about python

This about sums up my experience:

XKCD Python comic

Absurd nitpick: I’m not a fan of modules that execute code on import. I would prefer that importing antigravity doesn’t automatically do anything, and if I want to use antigravity, then I have to call a function or something like that.

My .screenrc is a testament to obsession over meaningless details

Most every time I start a new screen session, I set up four windows using particular window names. After several hours of reading the screen man page and trying stuff out, I discovered how to automate the process. I added this section to my .screenrc:

screen -t ipython 0 /usr/bin/ipython -p matt
screen -t code 1 # This is where I use vi.
screen -t psql 2 /usr/bin/psql -U mydbusername mydb
screen -t irssi 3 /usr/bin/irssi

You can use the -c option when you start screen to specify a file other than $HOME/.screenrc. So I might write a bunch of different .screenrc config files and then I can choose what ever one I want. I can already imagine a .screenrc customized for doing python work, and another one customized for writing rants, and another one for doing sysadmin work.

A few other useful screen options:

  • screen -S sessionname will start a screen session and name it sessionname.
  • screen -ls will list all the screen sessions already running. Those session names are helpful in this case.
  • screen -r sessionname will attach a screen session that you specify.

A few examples of how to use :g in vim

This vim tip of the day is really good. I use the :g/pattern/d command occasionally, but there is a lot more possible. Here’s the tip:


VimTip 227: Power of :g
http://vim.sourceforge.net/tip_view.php?tip_id=

:g is something very old and which is very powerful. I just wanted to illustrate the use of it
with some examples. Hope, it will be useful for someone.

Brief explanation for ":g"
-------------------------
Syntax is:
:[range]:g//[cmd]
You can think the working as, for the range (default whole file), execute
the colon command(ex) "cmd" for the lines matching . Also, for all
lines that matched the pattern, "." is set to that particular line (for
certain commands if line is not specified "." (current line) is assumed).

Some examples
-------------
Display context (5 lines) for all occurences of a pattern
:g//z#.5
:g//z#.5|echo "=========="
<< same as first, but with some beautification >>
Delete all lines matching a pattern
:g//d
Delete all blank lines (just an example for above)
:g/^\s*$/d
Double space the file
:g/^/pu =\"\n\"
:g/^/pu _
<< the above one also works >>
Copy all lines matching a pattern to end of file
:g//t$
Yank all lines matching a pattern to register 'a'
0"ay0:g//y A
Increment the number items from current line to end-of-document by one
:.,$g/^\d/exe "normal! \"
Comment (C) lines containing "DEBUG" statements
g/^\s*DEBUG/exe "norm! I/* \A */\"
A Reverse lookup for records
(eg: An address book, with Name on start-of-line and fields after a space)
:g/?^\w?p "if only name is interested
:g//ka|?^\w?p|'ap "if name and the lookup-line is interested
:g//?^\w?|+,/^[^ ]/-1p "if entire record is interested
Reverse a file (just to show the power of 'g')
:g/^/m0

Foot note 1: use :v to negate the search pattern
Foot note 2: Some explanation of commonly used commands with :g
:2,8co15 => Copy lines 2 through 8 after line 15
:4,15t$ => Copy linesa 4 through 15 towards end of document (t == co)
:-t$ => Copy previous line to end of document
:m0 => Move current line to the top of the document
:.,+3m$-1 => Move current line through cur-line+3 to the last but one line
of the document
Foot note 3: Commands used with :g are ex commands, so a help search should
be,
:help :
eg. :help :k

Response to SEO video blog by Sage Lewis

Sage Lewis runs a website marketing firm in Akron and he posts video commentaries on YouTube. I really like how candid he is in his posts.

Anyhow, he made one post called “Search Engines Optimization Expectations”.

I typed out what I believe are his main points below.

  1. A brand-new domain takes six months to a year to start showing up in Google.
  2. Getting good positions in Google is really hard. The key is links pointing into your site from external sites, and that happens when you have good content.
  3. Google owes you nothing, and you can’t buy your way to the top of the rankings.
  4. You have to have content and lots of it. You have to be a resource and you have to be relevant.
  5. You have to use phrases in your content. If you want to appear in searches for the term “franchise” you need to be talking about franchises in your site.
  6. It takes as long as it takes. The more competitive, the longer the delay.
  7. You do it until. Keep working it until works.
  8. Kill off multiple domains.
  9. Don’t hide content. No white-on-white content, no hidden DHTML, etc. The key is good content.
  10. Trust SEO for at least a year. It takes a while to get results.

I agree with most of this. There doesn’t seem to be any secret shortcut to the top of search ranks. The most reliable way there is by hosting content that other people want to find, and presenting it in a search-engine friendly format. I feel like his remarks support my belief that search engine ranking is an efficient market.

However, I don’t think I really understand what he means by “you do it until”. Does he mean that you must keep shoveling money into the SEO consultants accounts indefinitely? That seems a little self-serving.

Additionally, I also don’t know if it is really true that Google time-delays new domains. I started up this blog recently, and I nearly immediately started showing up at the bottom of the first page for Google searches on certain terms. Go do a search on lua metatable examples or python logging or cleveland heights hookah bar and you’ll likely find this blog somewhere high up there.

All the search engines publish descriptions of what any web designer should do to maximize chances of getting a premium spot. What else can an honest SEO consultant offer me besides holding my hand while I implement these practices?

If I remember my theory correctly, a firm operating in an efficient, perfectly competitive marketplace should expect to earn no better (and no worse) than any use of the same labor and capital. In other words, ZERO ECONOMIC PROFIT.

Like I said at the beginning, Sage Lewis seems like a cool guy. I think this post is brilliant.