Another monster book from McSweeney’s. This time around it’s a wide ranging historical montage of America around the turn of the last century when we were fighting wars in Cuba and the Philippines, and reconstruction was giving way to Jim Crow in the South.
The book has several main characters and dozens of minor ones, all struggling to make it in a society that is very much against them getting ahead. Several are forced into joining the Army to fight first the Spanish and then the native population in the Philippines, others work back-breaking jobs and rarely come out ahead.
It’s a great portrayal of racism, classism, and imperialism in America, and it’s sad to realize that more than one hundred years on from the story, we’re still struggling with the same issues.
I enjoy historical fiction, so I really liked the book. It’s also gorgeous, with a rich gold-leaf embossed cover and sewn binding. If you’re thinking of reading it, I’d get the hardcover. It’s heavy (and expensive), but instead of a mass market “hardcover,” you’re getting a real book the way they used to be made.
Today is the first time in a long time that I’ve been able to take both Nika and Piper out on the trails. For me, this is a turning point in a very long, stressful illness that Piper is still recovering from.
A couple months ago Piper got what we can only assume was an abscess inside her chest cavity. The result was that her chest filled with fluid and made breathing very difficult for her. The original diagnosis, made before she started having any real symptoms, was cancer, and we were preparing for the worst. Thankfully, Andrea didn’t give up on her, and several fantastic veterinarians in town didn’t either.
She spent some time in a hyperbaric chamber to get her oxygen levels up, and she had the fluids drained from her chest several times. Eventually, she had surgery to insert a pair of tubes into her chest, and we spent the next two weeks flushing her with fluids, every six hours. There’s a photo of the setup below. The procedure was to hook the saline bag to the input port on one side of her chest and put in 250 ml of fluid. Then we’d switch sides, and open the drain port on the side that had just been filled. Repeat until a liter has gone in and come back out again. The whole procedure took more than an hour, four times a day. At the same time, she was getting pain medication and antibiotics.
In the beginning, even after we had a good diagnosis, she was so sick that I don’t think anyone had much hope that she could be saved. She was too weak to stand without help and had a head tilt that seemed to indicate she’d gone septic. But as soon as we got some of the fluid out and the antibiotics started working on the infection inside her she improved dramatically.
Throughout all of it, Piper was fantastic. She went up on the couch to get treatment, went into her kennel at night, and handled all the trips to the vet without complaint or struggle.
She still has to take antibiotics for at least six months to make sure the infection really is gone, and it’s been a cold couple months because her chest was shaved prior to the surgery, but it’s all worth it. Seeing her running around on the trails today with Nika was a pleasure, and I think she enjoyed it too.
The last couple days have seen a lot of overflow on Goldstream Creek, causing it to rise more than two feet. The water moved fast enough and it's been cold enough at night that it froze into a pretty good surface for ice skating. Many years ago we lived in a cabin at the edge of a pond near the railroad tracks and we bought ice skates so we skate on the pond. Turns out the number of days where the pond is frozen and not completely covered by snow is virtually zero, so we rarely got a chance to use them. But here, it seems that at least once or twice a year the overflow on the Creek or the DNR pond east of us will run over the snow and freeze into reasonably smooth ice.
I attempted to shoot a video while ice skating on the Creek today. It's not the greatest video, but it does give you some idea of what it looks like. After it freezes and before the overflow starts later in the winter, I spend a lot of time walking Nika and Piper down here. During breakup, the water rises to just below the bottom of the bridge, and then recedes to between four and five feet lower than where I'm skating by the middle of summer. The bridge I duck under is where I do my river stage measurements for the National Weather Service.
We closed on a new piece of property last week and I’ve been exploring it on the ground and with Google Maps. There’s already a well-established non-motorized trail along two side of it, and based on the satellite imagery, it looks like there’s a partial trail approximately through the middle. I found it on the ground yesterday, and today I made an attempt at figuring out a way to connect the two trails. There’s still a foot of snow on the ground, so it’s wasn’t easy going, but I did snowshoe my way around. I’d hoped my snowshoe tracks would have hardened enough to walk it in boots this evening, but the snow had turned to sugar instead. Hopefully it’ll harden tonight when the temperature drops.
I’ve been on and off carrying my .22 rifle over the past couple months looking for grouse and snowshoe hare (hares?). I haven’t seen any grouse since I started carrying, but both last week and today I’ve seen hares. So far I’ve seen three on our property, and each time I saw them, I wasn’t carrying my rifle or my bow. The hare I saw this morning may have been laughing at me. Hares have a very clever strategy for eluding predators: when startled they run a short distance through the brush, freeze for ten to twenty seconds, then run again. For predators that are focused on movement, I think the momentary pause allows the hares to disappear due to their excellent camouflage. For a human hunter it’s a challenge because just as you get the animal in your sights, it bolts. And since you’re looking through your sights or scope, it’s much harder to pick them up after they’ve left the view. Anyway, the hare today was 20–30 feet away, in plain sight, and showed no sign that it considered me a threat. It kept right on eating alder shoots, preening, and at one point even got up on it’s hind legs and looked around. It would have been an easy target for my bow.
Had I been carrying it.
Today I went for a walk on the Creek with Nika and Piper and it occurred to me that the iPhone ought to be able to tell me not only where I am (which it does quite well with the Google-driven map application), but on whose property I’m walking through. It took me a little time, but I now have a webapp (http://swingleydev.com/gis/loc.html) that can do this (don't bother clicking on the link unless you're on an iPhone or other GPS-enabled device).
The result is a pair of pages. The first one shows you your current location, speed, and heading. With a press of a button (and a delay while the database finds the property owner) you can see the Borough information on the property you’re currently inside (assuming you’re in the Fairbanks North Star Borough—this page doesn’t do non-Borough residents any good).
Here’s how I set it up:
My web hosting provider doesn’t have a new enough version of PostgreSQL to run PostGIS, which means I need to use the spatially-enabled version of SQLite3, called Spatialite. To get the parcel database from the shapefile to Spatialite requires the following steps. Some parcels are eliminated in this process, but it’s a small fraction of the parcels in the database:
Download the parcels shapefile:
$ wget ftp://co.fairbanks.ak.us/GIS/tax_parcels.zip
Unzip it and insert it into a spatially enabled PostgreSQL database using ogr2ogr. Crash the process immediately:
$ unzip tax_parcels.zip $ ogr2ogr -f "PostgreSQL" -t_srs EPSG:4326 -overwrite -skipfailures PG:"dbname='test'" tax_parcels.shp
Fix the column definitions:
sql> DELETE FROM tax_parcels; sql> ALTER TABLE tax_parcels ALTER COLUMN sqft_calc TYPE numeric (22,12);
Re-import the data:
$ ogr2ogr -f "PostgreSQL" -t_srs EPSG:4326 -append -skipfailures PG:"dbname='test'" tax_parcels.shp
Convert the geometry column to MULTIPOLYGON:
sql> ALTER TABLE tax_parcels DROP CONSTRAINT "enforce_geotype_wkb_geometry"; sql> ALTER TABLE tax_parcels ADD CONSTRAINT "enforce_geotype_wkb_geometry" CHECK (geometrytype(wkb_geometry) = 'MULTIPOLYGON'::text OR wkb_geometry IS NULL OR geometrytype(wkb_geometry) = 'POLYGON'::text); sql> UPDATE tax_parcels SET wkb_geometry = ST_Multi(wkb_geometry); sql> ALTER TABLE tax_parcels DROP CONSTRAINT "enforce_geotype_wkb_geometry"; sql> ALTER TABLE tax_parcels ADD CONSTRAINT "enforce_geotype_wkb_geometry" CHECK (geometrytype(wkb_geometry) = 'MULTIPOLYGON'::text OR wkb_geometry IS NULL); sql> UPDATE geometry_columns SET type='MULTIPOLYGON' WHERE f_table_name='tax_parcels' AND f_geometry_column='wkb_geometry';
Re-import the data (there will be thousands of errors, but this insert should add the MULTIPOLYGON rows that weren’t inserted the first time around):
$ ogr2ogr -f "PostgreSQL" -t_srs EPSG:4326 -append -skipfailures PG:"dbname='test'" tax_parcels.shp
Get rid of the illegal polygons:
sql> DELETE FROM tax_parcels WHERE NOT ST_IsValid(wkb_geometry);
Convert to spatialite:
$ ogr2ogr -f "SQLite" tax_parcels.sqlite PG:"dbname='test'" -dsco SPATIALITE=YES
sqlite> SELECT street_add, owner_firs, owner_last, owner1, owner2, owner3, mail_add, ci_st_zip, round(acres_calc, 1) as acres, ’$’ || total as total, ’$’ || land as land, ’$’ || improvemen as improvements, pan, sub, block, lot, road_water, lot_size, units, neighborho, primary_us, tax_status, tax_year, mill_rate, business, year_built, situs_numb, situs_name FROM tax_parcels WHERE Intersects(GEOMETRY, SetSRID(MakePoint(lon, lat), 4326));
Again, implementing this would be a lot easier if I could install PostGIS on the server and use PHP to access the data directly. Because I can’t, spatialite and CGI do the trick.
Update: I added a few more steps to convert the initially imported POLYGON layers to MULTIPOLYGON, which then allows us to include the MULTIPOLYGON rows from the shapefile.