on seeing half a movie

April 25th, 2010

For years–before I had Netflix, before Netflix even existed–I looked all over town for a film that came highly recommended called The Gospel According to Matthew. I finally found it one day at Video Rodeo and checked it out. It was amazing–I was enthralled with this film like I’d been with few others. About halfway through, Jesus came walking over the water onto land, opened his mouth to say something to Matthew, and the DVD froze.

I tried cleaning the disk, tried fast forwarding past the scratched part, tried to jump past it with chapter selection, tried to watch it on a different DVD player. Nothing would make the DVD play past the halfway point.

Back at the store they said they’d probably never get a replacement for it–the film was available only as part of a very expensive Pasolini boxed set. They offered me a free rental but that wasn’t what I wanted–I wanted to see the rest of the film.

Years later, the film has been released on its own and the library has a copy. I checked it out some time back, brought it home, and left it on the desk, unwatched, until I had to return it. The film was fixed in my mind as perfect film, and I was worried I’d revisit it and find that it wasn’t.

Today I was watching Slumdog Millionaire, mostly because it’s one of the very few films on the IMDb top 250 that I haven’t yet seen. Early on I decided it was kind of predictable how all of Jamal’s trivia knowledge stemmed from various unpleasant situations in his past, and my mind began to drift off–thinking of Danny Boyle’s films, thinking of British colonialism and liberal guilt, thinking of how the film was described as a crowd pleaser but I thought it was kind of shallow. Thinking, actually, that Jamal wouldn’t have escaped his childhood without carrying some serious baggage, and that his character would most likely be inclined towards detached hookups or clingy abusive relationships.

About halfway through the film, Jamal was hanging out with Latika, Salim had just left, and the DVD froze. When the DVD unfroze, Salim was holding a group of men at gunpoint. The DVD played another three minutes or so and froze again.

Nothing I try will make this DVD play all the way through.

I’m not sure if I’ll watch the rest of it, but in this case it’s not because I think it’s a perfect film. Rather, it’s hitting me as a moderately entertaining watch which isn’t offering me anything new. I feel certain that Jamal will prove himself innocent to the policeman’s satisfaction, that he will walk away with his millions, that he will find Latika, and that they will be reunited happily ever after. I feel certain, too, that Jamal and Latika won’t be immediately robbed–by Salim or anyone else–and won’t have to deal with mountains of taxes, or mountains of bribes to various corrupt officials, that they’ll never be implicated in Amman’s death though Salim probably will, and will suffer it silently, and that the film’s ending will be superficially satisfying.

And I feel certain, finally, that millions of rupees are a poor compensation for a childhood of being raised in the slums, having witnessed a parent’s murder, having been tricked into childhood serfdom and barely escaping being deliberately blinded, having witnessed a second murder (even if it was of a reprehensible character), and having been tortured during questioning for having done nothing wrong.

I wonder if a better film might have been made with that same character, with that same background, with a resolution of not becoming rich but instead of coming to peace with the past and laying it to rest.

PSA: automatic formatting of holds lists

April 2nd, 2010

Some time back I read an article talking about how libraries all over the country were individually recreating the wheel, duplicating effort instead of building on someone else’s. There were various reasons for this mentioned: that some librarians didn’t want to feel obligated to maintain code put out in the public, that some were embarrassed about code they considered subpar, that some workplaces didn’t allow for that sort of sharing, etc.

In Florida, the work done by state and county employees, as well as municipalities, is all considered in the public domain. So in a spirit of sharing, in the hopes it will help someone outside our district, here’s this code I wrote in PHP to format holds lists generated by Sirsi-Dynix (a good system not to have, IMO).

The code is far from perfect, but on my laptop–with my laptop doing the processing, not sending the list out and waiting for a response–a 100-page report gets accepted, processed, and returned streamline in literally just a few seconds. So I’m considering it good enough to call “done” and move on.

The script can of course be modified or extended to fit your own needs, according to your own departmental breakdown and/or stack arrangement. The important thing is that I think it can give a starting point on how to approach the problem of overly verbose lists (it turns a 102-page report into a 66-page one).

With those caveats:


<?php
// check whether the form's been filled out
$list = ($_POST['list']);
$dept = ($_POST['dept']);

// removing extra line breaks at beginning and end
$list = trim($list);

// checking to see if there's actually a list
if (empty($list))
	{
	header("Location: workflows.php?status=notext");
	}

else {
	print "<html>\n<head>\n";
	print "<style type=\"text/css\">";
	print "body {\n    font-family:'Arial', 'Helvetica', sans-serif }";
	print "</style>";
	if ( (empty($_POST['dept'])) || (!isset($_POST['dept'])) )
		{print "<title>Holds list: All</title>";}
	elseif ($dept == 'youthserv')
		{print "<title>Holds list: Youth Services</title>";}
	else // Adult Services
		{print "<title>Holds list: Adult Services</title>";}
	print "</head>\n<body>\n";
	}

$jmedia = array();
$easies = array();
$jnonfic = array();
$jfic = array();
$ya = array();

$anonfic = array();
$av = array();
$afic = array();
$avhs = array();

$detritus = array();

// removing extra spaces throughout
$list = preg_replace('/( ){2,}/', ' ', $list);

// remove repeating header
// remove HOLD PICKUP LIST
$orig = "/HOLD PICKUP LIST/";
$list = preg_replace($orig, "", $list);

// remove Production date
$orig = "/Produced ([A-Za-z]{3}) ([A-Za-z]{3}) ([0-9]{1,2}) [0-9]{2}:[0-9]{2}:[0-9]{2} ([0-9]{4})/";
// first try to store this as a variable for later output
preg_match($orig, $list, $matches);
unset ($matches[0]);
$produced = implode(" ", $matches);

// now remove Production date from header
$list = preg_replace($orig, "", $list);

// remove Production library
$orig = "/Library\:[ ]+[A-Za-z]+(\-[A-Za-z]+)?/";
$list = preg_replace($orig, "", $list);

// Converting line breaks
$list = preg_replace("/( )*\n+/", "<br />", $list);

// Removing extra line breaks
$list = preg_replace("/((<br \/>)+\s+(<br \/>)+\s*)+/", "<br /><br />", $list);
$list = preg_replace("/<br \/><br \/><br \/>/", "<br /><br />", $list);

// to get those stray extra line breaks (tried this other ways. no go.)
$list = preg_replace("/<br \/><br \/>[ ]+/", "<br />", $list);

// Removing copy number
$list = preg_replace("/copy\:[0-9]{0,4}/", "", $list);

// Removing type
$list = preg_replace("/type\:[A-Z]{3,}(\-[A-Z]{2,})?/", "", $list);

// Removing location
$list = preg_replace("/location\:[A-Z]{4,}\s{0,}<br \/>\s{0,}/", "", $list);

// Removing pickup library
$list = preg_replace("/Pickup library\:[A-Z]{3,}(\-[A-Z]{2,})?/", "", $list);

// removing line break between callno. and author
$callno = '/(<br \/><br \/>)([A-Z0-9\.\*\,#&-]+)([ ][A-Z0-9\.\*\,#&-]+)([ ][A-Z0-9\.\*\,#&-]+)?([ ][A-Z0-9\.\*\,#&-]+)?([ ][A-Z0-9\.\*\,#&-]+)?([ ][A-Z0-9\.\*\,#&-]+)?([ ][A-Z0-9\.\*\,#&-]+)?\s?<br \/>/';
$replacement = '$1$2$3$4$5$6$7$8 / ';
$list = preg_replace($callno, $replacement, $list);

$listarr = explode("<br /><br />", $list);

// first 'if' here does branch holds
if ( (empty($_POST['dept'])) || (!isset($_POST['dept'])) ) // branch
	{
		foreach ($listarr as $key => $value)
		{
			// group jmedia
			// send off CD JAZZ so all later CD J[A-Z] are in JFic
			if (preg_match('/^CD JAZZ/', $listarr[$key]))
			{array_push($av, $listarr[$key]);}
			elseif (preg_match('/(SOFTWARE|DVD|VIDEO|CD) J[0-9]+/', $listarr[$key]))
			{array_push($jmedia, $listarr[$key]);}
			elseif (preg_match('/^(SOFTWARE|DVD|VIDEO) (E|J)/', $listarr[$key]))
			{array_push($jmedia, $listarr[$key]);}

			// group easies
			elseif (preg_match('/^E /', $listarr[$key]))
			{array_push($easies, $listarr[$key]);}
			// grabs CDs and Cassettes in area
			// must have grabbed E DVD and VHS first
			elseif (preg_match('/^([A-Z]+[ ])?E [A-Z]+/', $listarr[$key]))
			{array_push($easies, $listarr[$key]);}
			elseif (preg_match('/SNUGGLE/', $listarr[$key]))
			{array_push($easies, $listarr[$key]);}

			// group JNonfic
			elseif (preg_match('/^J[0-9]+/', $listarr[$key]))
			{array_push($jnonfic, $listarr[$key]);}
			// for the rare Jnonfic cassette.
			// CDs will be assumed in media section.
			// must have grabbed DVD and VHS nonfic first
			elseif (preg_match('/ J[0-9]+/', $listarr[$key]))
			{array_push($jnonfic, $listarr[$key]);}
			elseif (preg_match('/JBIO/', $listarr[$key]))
			{array_push($jnonfic, $listarr[$key]);}
			elseif (preg_match('/^BRAILLE J/', $listarr[$key]))
			{array_push($jnonfic, $listarr[$key]);}

			// group Jfic
			elseif (preg_match('/^J[A-Z]+/', $listarr[$key]))
			{array_push($jfic, $listarr[$key]);}
			// grab CDs and Cassettes
			// can't use just '/ J[A-Z]+'/ because
			// it grabs from all genres and callnos
			elseif (preg_match('/(CD|CASSETTE|DIGITAL|L\.P\.|TALKBOOK) J[A-Z]+/', $listarr[$key]))
			{array_push($jfic, $listarr[$key]);}

			// group YA
			elseif (preg_match('/^YA /', $listarr[$key]))
			{array_push($ya, $listarr[$key]);}
			elseif (preg_match('/ YA /', $listarr[$key]))
			{array_push($ya, $listarr[$key]);}

			// grab adult nonfic and bio
			// assumes no adult genres begin with E, J, OR Y
			elseif (preg_match('/^(\*)?BIO/', $listarr[$key]))
			{array_push($anonfic, $listarr[$key]);}
			elseif (preg_match('/^(\*)?[0-9]/', $listarr[$key]))
			{array_push($anonfic, $listarr[$key]);}

			// group adult CDs, CASSETTES, DVDs
			// grabbed CD JAZZ first
			// E, J, YA grabbed already and exited if/then
			// so it should be no problem
			elseif (preg_match('/^(CD|CASSETTE|DIGITAL|DVD|VIDEO|SOFTWARE|TALKBOOK) [A-Z]/', $listarr[$key]))
			{array_push($av, $listarr[$key]);}
			elseif (preg_match('/^(CD|CASSETTE|DIGITAL|DVD|VIDEO|SOFTWARE|TALKBOOK) (\*)?[0-9]/', $listarr[$key]))
			{array_push($av, $listarr[$key]);}

			// group adult fiction, genre, L.P., N.R., VF
			// assumes no adult genres begin with E, J, OR Y
			// BUT: E, J, YA grabbed already and exited if/then
			// so it should be no problem
			elseif (preg_match('/^((L\.P\.|N\.R\.|VF) )?[A-Z]/', $listarr[$key]))
			{array_push($afic, $listarr[$key]);}
			elseif (preg_match('/^(VF) (\*)?[0-9]/', $listarr[$key]))
			{array_push($afic, $listarr[$key]);}

			// things not grouped elsewhere
			else
			{array_push($detritus, $listarr[$key]);}
		}
	}

// this below to give E/J/YA items only.
elseif ($dept == 'youthserv')
	{
		foreach ($listarr as $key => $value)
		{
			// group E/Jmedia
			// do nothing for CD JAZZ so all later CD J[A-Z] are in JFic
			if (preg_match('/^CD JAZZ/', $listarr[$key]))
			{}
			elseif (preg_match('/(SOFTWARE|DVD|VIDEO|CD) J[0-9]+/', $listarr[$key]))
			{array_push($jmedia, $listarr[$key]);}
			elseif (preg_match('/^(SOFTWARE|DVD|VIDEO) (E|J)/', $listarr[$key]))
			{array_push($jmedia, $listarr[$key]);}

			// group easies
			elseif (preg_match('/^E /', $listarr[$key]))
			{array_push($easies, $listarr[$key]);}
			// grabs CDs and Cassettes in area
			// must have grabbed E DVD and VHS first
			elseif (preg_match('/^([A-Z]+[ ])?E [A-Z]+/', $listarr[$key]))
			{array_push($easies, $listarr[$key]);}
			elseif (preg_match('/SNUGGLE/', $listarr[$key]))
			{array_push($easies, $listarr[$key]);}

			// group JNonfic
			elseif (preg_match('/^J[0-9]+/', $listarr[$key]))
			{array_push($jnonfic, $listarr[$key]);}
			// for the rare Jnonfic cassette.
			// CDs will be assumed in media section.
			// must have grabbed DVD and VHS nonfic first
			elseif (preg_match('/ J[0-9]+/', $listarr[$key]))
			{array_push($jnonfic, $listarr[$key]);}
			elseif (preg_match('/JBIO/', $listarr[$key]))
			{array_push($jnonfic, $listarr[$key]);}
			elseif (preg_match('/^BRAILLE J/', $listarr[$key]))
			{array_push($jnonfic, $listarr[$key]);}

			// group Jfic
			elseif (preg_match('/^J[A-Z]+/', $listarr[$key]))
			{array_push($jfic, $listarr[$key]);}
			// grab CDs and Cassettes
			// can't use just '/ J[A-Z]+'/ because
			// it grabs from all genres and callnos
			elseif (preg_match('/(CD|CASSETTE|DIGITAL|L\.P\.|TALKBOOK) J[A-Z]+/', $listarr[$key]))
			{array_push($jfic, $listarr[$key]);}

			// group YA
			elseif (preg_match('/^YA /', $listarr[$key]))
			{array_push($ya, $listarr[$key]);}
			elseif (preg_match('/ YA /', $listarr[$key]))
			{array_push($ya, $listarr[$key]);}

			// officially do nothing for these, so $detritus will work
			elseif (preg_match('/^(\*)?BIO/', $listarr[$key]))
			{}
			elseif (preg_match('/^(\*)?[0-9]/', $listarr[$key]))
			{}

			// officially do nothing for these, so $detritus will work
			elseif (preg_match('/^(CD|CASSETTE|DIGITAL|DVD|VIDEO|SOFTWARE|TALKBOOK) [A-Z]/', $listarr[$key]))
			{}
			elseif (preg_match('/^(CD|CASSETTE|DIGITAL|DVD|VIDEO|SOFTWARE|TALKBOOK) (\*)?[0-9]/', $listarr[$key]))
			{}

			// officially do nothing for these, so $detritus will work
			elseif (preg_match('/^((L\.P\.|N\.R\.|VF) )?[A-Z]/', $listarr[$key]))
			{}
			elseif (preg_match('/^(VF) (\*)?[0-9]/', $listarr[$key]))
			{}

			// things not grouped elsewhere
			else
			{array_push($detritus, $listarr[$key]);}
		}
	}
else // ($dept == 'adultserv')
	{
		foreach ($listarr as $key => $value)
		{

			// CD left out:
			// must test for CD JAZZ first
			if (preg_match('/^((CASSETTE|DVD|VIDEO|L\.P\.|SOFTWARE|DIGITAL|BRAILLE) )?(E|J|YA)/', $listarr[$key]))
			{}
			elseif (preg_match('/^SNUGGLE/', $listarr[$key]))
			{}

			// grab adult nonfic and bio
			elseif (preg_match('/^(\*)?BIO/', $listarr[$key]))
			{array_push($anonfic, $listarr[$key]);}
			elseif (preg_match('/^(\*)?[0-9]/', $listarr[$key]))
			{array_push($anonfic, $listarr[$key]);}

			// group adult CDs, CASSETTES, DVDs
			// grab CD JAZZ first b/c later range skips it
			// must have seen E, J, and Y first and exited if/then
			elseif (preg_match('/^CD JAZZ/', $listarr[$key]))
			{array_push($av, $listarr[$key]);}
			elseif (preg_match('/CD (J|YA)/', $listarr[$key]))
			{}
			elseif (preg_match('/^(CD|CASSETTE|DIGITAL|DVD) [A-Z]/', $listarr[$key]))
			{array_push($av, $listarr[$key]);}
			elseif (preg_match('/^(CD|CASSETTE|DIGITAL|DVD) (\*)?[0-9]/', $listarr[$key]))
			{array_push($av, $listarr[$key]);}

			// group adult VHS, SOFTWARE, TALKBOOK, V.F.
			// must have seen E, J, and Y first and exited if/then
			elseif (preg_match('/^(VIDEO|SOFTWARE|TALKBOOK|VF) [A-D]/', $listarr[$key]))
			{array_push($avhs, $listarr[$key]);}
			elseif (preg_match('/^(VIDEO|SOFTWARE|TALKBOOK|VF) [F-I]/', $listarr[$key]))
			{array_push($avhs, $listarr[$key]);}
			elseif (preg_match('/^(VIDEO|SOFTWARE|TALKBOOK|VF) [K-X]/', $listarr[$key]))
			{array_push($avhs, $listarr[$key]);}
			elseif (preg_match('/^(VIDEO|SOFTWARE|TALKBOOK|VF) (\*)?[0-9]/', $listarr[$key]))
			{array_push($avhs, $listarr[$key]);}

			// group adult fiction, genre, L.P., N.R.
			// must have seen E, J, and Y first and exited if/then
			elseif (preg_match('/^((L\.P\.|N\.R\.) )?[A-D]/', $listarr[$key]))
			{array_push($afic, $listarr[$key]);}
			elseif (preg_match('/^((L\.P\.|N\.R\.) )?[F-I]/', $listarr[$key]))
			{array_push($afic, $listarr[$key]);}
			elseif (preg_match('/^((L\.P\.|N\.R\.) )?[K-X]/', $listarr[$key]))
			{array_push($afic, $listarr[$key]);}	

			// things not grouped elsewhere
			else
			{array_push($detritus, $listarr[$key]);}
		}
	}
// end removals

// clean up detritus so later if/then will work
$detritus = implode("<br /><br />", $detritus);
$detritus = trim($detritus);

	if ($dept == 'youthserv')
	{
		print "<p>HOLDS " . $produced . " // <strong>Media</strong><br />\n";
		print implode("<br /><br />", $jmedia);
		print "\n<br /><br />HOLDS " . $produced . " // <strong>Easies</strong>";
		print "<br />" . implode("<br /><br />", $easies);
		print "\n<br /><br />HOLDS " . $produced . " // <strong>JFiction</strong>";
		print "<br />" . implode("<br /><br />", $jfic);
		print "\n<br /><br />HOLDS " . $produced . " // <strong>JNonfiction</strong>";
		print "<br />" . implode("<br /><br />", $jnonfic);
		print "\n<br /><br />HOLDS " . $produced . " // <strong>YA</strong>";
		print "<br />" . implode("<br /><br />", $ya);
		print "</p>";
	}
	elseif ($dept == 'adultserv')
	{
		print "<p>HOLDS " . $produced . " // <strong>Nonfiction</strong><br />\n";
		print implode("<br /><br />", $anonfic);
		print "\n<br /><br />HOLDS " . $produced . " // <strong>A/V</strong>";
		print "<br />" . implode("<br /><br />", $av);
		print "\n<br /><br />HOLDS " . $produced . " // <strong>Fiction</strong>";
		print "<br />" . implode("<br /><br />", $afic);
		print "\n<br /><br />HOLDS " . $produced . " // <strong>VHS</strong>";
		print "<br />" . implode("<br /><br />", $avhs);
		print "</p>";
	}
	else // branch
	{
		print "<p>HOLDS " . $produced . " // <strong>E/J Media</strong><br />\n";
		print implode("<br /><br />", $jmedia);
		print "\n<br /><br />HOLDS " . $produced . " // <strong>Easies</strong>";
		print "<br />" . implode("<br /><br />", $easies);
		print "\n<br /><br />HOLDS " . $produced . " // <strong>JFiction</strong>";
		print "<br />" . implode("<br /><br />", $jfic);
		print "\n<br /><br />HOLDS " . $produced . " // <strong>JNonfiction</strong>";
		print "<br />" . implode("<br /><br />", $jnonfic);
		print "\n<br /><br />HOLDS " . $produced . " // <strong>YA</strong>";
		print "<br />" . implode("<br /><br />", $ya);
		print "\n<br /><br />HOLDS " . $produced . " // <strong>Nonfiction</strong>";
		print "<br />" . implode("<br /><br />", $anonfic);
		print "\n<br /><br />HOLDS " . $produced . " // <strong>A/V</strong>";
		print "<br />" . implode("<br /><br />", $av);
		print "\n<br /><br />HOLDS " . $produced . " // <strong>Fiction</strong>";
		print "<br />" . implode("<br /><br />", $afic);
		print "</p>";
	}

if ((!empty($detritus)) && ($detritus != "<br /><br />"))
	{
		print "\n<p><strong>Entries that didn't get grouped:</strong>";
		print "\n<br />The following items were on the holds list but couldn't be placed.";
		print "\n<br />If you're seeing this message it's because there is a bug in the program.";
		print "\n<br /><br />Please copy everything below this line and ";
		print "<a href='mailto:";
print "/* YOUR EMAIL ADDRESS GOES HERE */";
print "?subject=HOLDS " . $produced . " for ";
		if (($dept == 'youthserv') || ($dept == 'adultserv'))
			{print $dept;}
		else {print "branch";}
		print "'>email it to "
print "/* YOUR NAME GOES HERE */"
print "</a>.  Thank you!";
		if (($dept == 'youthserv') || ($dept == 'adultserv'))
			{
			print "<br /><br />\n<em>These items may or may not be part of your list:</em>";
			}
		print "<br />" . $detritus . "</p>";
	}
print "</body>\n</html>";

Big thanks to AskMe for their help in figuring out how to approach this project.

movie annoyances

February 26th, 2010

Ladies, if you’re ever being strangled, don’t act like a doomed heroine in a movie and attempt to push the person off you. Instead, just poke him in the eye, especially if you have long fingernails. On the verge of being killed is no time to be polite or squeamish.

Other movie annoyances:
Person A is being chased by Person B, passing a number of things which could easily be knocked over into the path of the pursuer, but not knocking them over. (Absurd–I figured this one out on the fly, while actually running from someone, in middle school. It works beautifully.)

Person A is being chased by Person B, both of them carrying weapons. Person A runs around a corner and keeps running, rather than running around a corner, crouching low, and preparing to shoot/stab/grandslam the pursuer.

reading: 2009

January 27th, 2010

Way back in my undergrad days, when I was incredibly depressed and rudderless and desperate for some sense of meaning or achievement, I started keeping track of what books I read and what movies I watch.

It’s something I’ve stuck with because the items on the list turn out to be convenient fenceposts along my memory: I watched this with her; I saw this one right after I moved; I watched this one abroad with family, etc.

At any rate, as a librarian it’s worth some reflection on the books I’ve read.

Death Note vol. 5 – 12
Surely You’re Joking, Mr. Feynman
The Adventures of Barry Ween, Boy Genius: 2.0
Skim
The King of Mulberry Street
Deogratias
I Know Why the Caged Bird Sings
Good As Lily
Bound by Law?
The Complete Concrete
The Book of Lists: Horror
Squirrel Mother
The Bloody Streets of Paris (graphic novel, not prose)
The Pride of Baghdad
Stray Bullets v. 1
Dignifying Science
Queen Bee
Fax from Sarajevo
Aya
Nation
Notes for a War Story
Mom’s Cancer
Sentences
Into the Volcano
Astro City: Life in the Big City
Ghost World
Artemis Fowl (graphic novel)
Rapunzel’s Revenge
Yossel. April 1943
Y: the Last Man, v. 1 -10
Dogs & Water
The Eternals
Blue Pills
Same Difference & Other Stories
Artemis Fowl (prose)
Artemis Fowl: The Arctic Incident
Artemis Fowl: The Eternity Code
Artemis Fowl: The Opal Deception
Superman for All Seasons
Tales from the Brothers Grimm (graphic novel adapation)
Artemis Fowl: The Lost Colony
Why I Killed Peter
Artemis Fowl: The Time Paradox
Invincible trade paperback: v.1 – 11 (and, later, Ultimate Invincibles 1-4)
Jellaby: Monster in the City
Fade
Queen & Country: Operation Broken Ground
Swallow Me Whole
Chicken with Plums
Don’t Look Behind You
The Graveyard Book
The Artemis Fowl Files
Street Angel
Blueberry Girl
Crazy Hair
House
Debbie Harry Sings in French
Grammar of the Shot
Hatter M: v. 1 in the Looking Glass Wars (graphic novel)
Creatures of the Night
The Facts in the Case of the Disappearance of Miss Finch
A Wrinkle in Time
A Wind in the Door
The Book of Genesis Illustrated by R. Crumb
The Strain
The Beast of Chicago: the Murderous Career of H.H. Holmes
The Secret Science Alliance and the Copy Cat Crook
Johnny Hiro
G-Man v. 1: Learning to Fly
Diary of a Wimpy Kid: Greg Heffley’s Journal
Diary of a Wimpy Kid: Rodrick Rules
Daredevil: Echo / Vision Quest
Asterios Polyp
The Boy Who Harnessed the Wind
Monster
Little Brother
Smax
Animal Man
The Professor’s Daughter
The Goon: Chinatown
Channel Zero
Desperadoes: a Moment’s Silence

When I read Nation in May I thought it would be the best book I read all year–and it was, until December, when I read The Boy Who Harnessed the Wind, which turned out to be one of the best books I’ve read ever.

On this list, it’s worth noting the works which hinge on older technology or culture in a way that serves as a detriment to the story: the Complete Concrete suffers from its cultural references, many to people younger kids wouldn’t know; Johnny Hiro is moving in that direction; the plot of Channel Zero relies on obsolete technology; and while I enjoyed Little Brother, I expect that in twenty years it will look quaint.

Smax and Animal Man were both terrible books by good comics authors, and from the Neil Gaiman books I read this year–all of which struck me as slight, including The Graveyard Book, which won the Newbery–I’d like to say that I’m done with his work. But I’ll probably keep reading them as they come out, in vain hope that they’ll be worth it.

The Strain was a terrible book co-written by a decent director (Guillermo del Toro).

Diary of a Wimpy Kid didn’t amuse me, at all. To me, it just seemed like the same joke over and over (look: Greg Heffley is self-centered and oblivious!) and I chose not to read the next two books although I’d already bought them. The library was happy to have them.

The Artemis Fowl books are good individually, with probably The Opal Deception the strongest among them, but reading them all within a short span makes their weaknesses show: each one depends entirely too much on that same tired ace up Colfer’s sleeve.

Y: The Last Man was very good, in spite of some spots that strained suspension of disbelief, but the ending was crap. It, like Asterios Polyp, works much better if you ignore something big that happens at the end (except with Y there are two of those somethings, one pointlessly cruel and the other frankly impossible).

Invincible was another good find. It’s a rare treat to find a fresh voice in superhero comics which isn’t in the vein of Alan Moore or Frank Miller, too macho to show warmth and too cynical to show hope.

Of all these, it looks like less than 20% were written or co-written by women authors (and since most of the books here are comics, it just reinforces the notion–correct, in this case–that comics are a boyzone). Interestingly, I liked 3/4 of the books by women, which has the men beat by far.

The memoris ranged from good to very good. The non-memoir non-fiction books were more uneven. And I still don’t know what to make of Crumb’s Genesis, except that I wanted to like it more than I did.

aches and maths

January 24th, 2010

3 x-rays of the left hip
3 x-rays of the left knee
1 person wishing for a lead apron, though he has
no plans to have children

the final scene in the restaurant in The Sopranos

November 14th, 2009

I was late to The Sopranos, only starting it this year and finishing it a week or so ago.  I started the series with great enthusiasm then continued watching it with slightly less enthusiasm once season 3 finished and it began to seem likely that the following seasons would also be uneven.

Fortunately, “uneven” for The Sopranos meant that the episodes would generally range from good to great, with the occasional clunker thrown in (usually written by Michael Imperioli and featuring some well-meaning but ultimately academic and tiresome treatise on one “big issue” or another).

Where the series succeeded for me most was in its characterization and in its steadfast refusal to meet expectations: each character had his or her own motives, which we could typically understand even though the characters themselves typically couldn’t, and plotlines continued, petered out, or picked up again almost at random.

Tony, for all his bluster and machismo, was afraid of most confrontations, even when (as at the end of Season 6) avoiding them would obviously come back to hurt him; and for all his claims to wanting to change, what Tony really wanted was to grouse a bit and feel justified remaining the same. Janice was flighty and damaged, codependent and abusive, the kind of person who can’t feel good unless she’s making someone else feel bad. Carmela was interested most of all not in morals, spirituality, or any other set of principles, but in living a life of luxury, regardless of its source–in appearing more wealthy than everyone else in her circle of friends.

These three characters–as indeed, almost all of the characters on the show, including the priest–were not as straightforward and consistent as they’d like to seem; almost every character was instead driven by hidden, unrecognized motives. That gap between self-perception and others’ perception remained one of the chief sources of conflict throughout the series.

The plotting was a draw too, especially in its willful digressions, whether into dreams (mostly Tony’s, sometimes Carmela’s) or into secondary and tertiary characters’ lives (such as Kennedy’s and Heidi’s brief exchange after clipping Christopher’s SUV). And then there was the broader approach to plotting, which made it look a lot like everyday life: plot threads were often left dangling, as in the case of the snitch Tony killed in Season One, or in Tracee’s murder, or in the attempted murder of the Russian from “Pine Barrens”). Sometimes the other shoe simply would not drop.

Characters carried out important business along with mundane events: talked percentages and killed rivals between soccer games and ricotta pies. As a whole the series made use of that absurd conjunction so effectively shown at the end of Goodfellas, with Henry Hill coked up, paranoid, and worried about his spaghetti sauce.

For all its willingness to experiment with story, to lay out expectations and sometimes refuse to meet them, the series was largely traditional in its approach to film grammar. New scenes would have establishing shots then move into a series of midshots or closeups in such a way that it reinforced the characters’ physical position relative to each other while the audience was mostly focused on what they were saying. The editors knew about “the line” and rarely crossed it, and while there were some continuity errors, the editors obviously were aware of jump cuts and generally avoided them.

In other words the film grammar was, with very few exceptions, so traditional as to be invisible. The directors and editors had already shown ample knowledge of Shot/Reverse Shot, including several times in that last episode. Here are two examples I jumped to at random:

Tony climbs the stairs, sees Janice outside on the deck:

Tony on the stairs

Shot

Tony sees Janice

Reverse Shot

Phil’s assassin stands over him, shoots him again:

phil's assassin vlcsnap-2009-11-08-18h01m06

Shot

Phil is shot again

Reverse Shot

In each case we’re given a shot of someone looking at something, followed by what that person is looking at.  Tony’s shots give a first person POV; the assassin’s lean towards first but actually aren’t (his head would have to be to the right of his right arm).

The writers spent much of episode two and three of Season 6 showing us Tony’s dream while in a coma. The dream was both metaphorical and metaphysical and featured such obvious symbolism as Tony, in his Kevin Finnerty persona, arriving at a brilliantly lit house, being told that he can’t take his briefcase inside, and responding that he can’t leave it behind since his whole life is in it.

So the first shots of the final scene seem strange for a number of reasons: there the series’ consistent appreciation for characters’ internal lives, David Chase’s admission that he had the ending in mind since Season One, the long gap between Season 5 and Season 6, and the fact that David Chase both wrote and directed the last episode, as well as the series’ general mastery of traditional film grammar.  I was a bit puzzled over what might be just a minor, meaningless edit in that scene where Tony arrives at the restaurant.  These are the first four shots:

Shot

Shot

Reverse shot

Reverse Shot

Shot

Shot

What?

What?

Is Tony really at a restaurant awaiting his family? Is he dreaming? Is he dying (that is, was Phil’s crew honest in their statement that Tony could have Phil killed without any repercussions)?

I find it hard to believe that, having spent so long planning Season 6 and thinking about the series’ ending, David Chase simply forgot to get ample coverage of the diner scene. Maybe the edit doesn’t mean anything–David Chase could be called any number of things, but subtle about violence is not one of them.  Maybe Chase just wanted a jump cut there.

Whatever the reason for this strange edit, I’m sure that, if asked about it, Chase would refuse to explain.

danger, Will Robinson!

October 31st, 2009

Today on the way home from work I saw a man riding a bicycle one-handed.  He was holding the left side of the handlebars, which had two plastic bags of groceries slung over it makingit difficult if not impossible to stop suddenly.

In his right arm–in the crook of his elbow, pressed against his side, legs dangling–he held a toddler.

Computer updates

October 24th, 2009

The C: drive on the old computer is completely toast.  Any time I tried to boot it it reported a disk read error–it couldn’t even get far enough into the booting process to offer the option of booting into Safe Mode, and the drive also wasn’t responsive enough to allow reformatting it and making a clean install.

I took the old C drive out and moved the D down the cable, removing that tiny plastic rectangle making it the secondary internal drive (I just can’t get into that whole “master” and “slave” terminology), then reformatted the drive and reinstalled Win2000.

After that I changed my mind and decided I’d send it out with Ubuntu on it (I’m giving the computer to a local school to use for parts in their tech classes), but the Ubuntu disc kept taking me to the login screen without any install options.  I poked around a bit, tried various options, and finally gave up without finding how to install Ubuntu from the CD I’d burnt.  I’d expected the installation to be intuitively obvious, not forgetting my last experience with Linux so much as hoping that it was no longer representative:  I’d heard many good things about Ubuntu, especially about how user-friendly it was.

Maybe the actual UI in Ubuntu is a big improvement over the typical Linux interface (at least for people who don’t build their own boxes and “sudo make me a sandwich”), but the installation process is actually harder than it was for me with Caldera Linux way back in 2001.

I have no explanation.

July 20th, 2009

These are the things that have broken in the last four weeks: the computer, the hair clippers, the back brake cable on my bike, the back derailleur cable, and–just now–the shredder.

I should be Buddhist?

cooking

July 11th, 2009

My ex gave me a vegetarian cookbook for my 21st birthday, 12 years ago. About a year ago, I realized that I’d had the book for over a decade and had cooked only about six of the recipes. So then I decided I’d make it a project to cook everything in it. It’s the kind of thing no one ever does, but I that it would serve as a nice compliment (as well as teaching me how to cook).

For awhile I was diligently cooking a new recipe a week, then for the last couple of months I’ve been lazy.

Today I counted up the results on where I am so far. I’ve cooked just over a third of the recipes, most of them soups or dinners. There are just over 100 recipes left.

At one new recipe a week, I should be able to wrap this project up in two years. Realistically, though, it will probably take me four or five: sometimes I just cook an old favorite and sometimes I don’t cook at all.

« Newer posts - Older posts »