2019 (old posts, page 2)

Today I work with the snake I've got

A Mapbox coworker, Lo Bénichou, introduced me to Motivational Skeletor memes yesterday. I'm showing this one to all my colleagues struggling with Python packaging and "where the hell is _tkinter?".


Mountains lions captured, Horsetooth reopens

Good news for local runners like me: Horsetooth Mountain Open Space is open again.

Over the weekend, Colorado Parks and Wildlife officers captured two juvenile mountain lions at Horsetooth Mountain Open Space. Wildlife officers will be moving the mountain lions to a wildlife rehabilitation facility. Colorado Parks and Wildlife plans to release the mountain lions back into the wild at a future date. A full report will be given on Thursday, Feb. 14.

"We have removed additional lions that we believe are siblings of the lion involved in last Monday's attack," said Mark Leslie, northeast region manager for Colorado Parks and Wildlife. "The Front Range of Colorado plays home to many of Colorado's wildlife and we have an expanding urban interface and increased recreation pressure. The interaction between wildlife and people is going to increase and we need to find a way to balance the needs of people and the needs of wildlife."

With the assessment completed, Larimer County officials have decided to reopen Horsetooth Mountain Open Space to the public today.

I heard a rumor about this yesterday, but didn't want to blog it without hearing more.

Training week eleven recap

I'm training using a standard periodization, three weeks of increasing volume followed by one week dedicated to recovery, family, open source projects. Week eleven has been my biggest ever. Not huge numbers by some standards – you should see what some local runners are doing on Strava – but I'm just getting started in trail running.

  • 12 hours and 10 minutes running and hiking
  • 56.2 miles
  • 6575 feet D+

I went for 20 miles on Saturday and 15 today. 35 is my biggest two day total and 56 is the most I've ever done in a week. I don't feel bad right now. If the Quad Rock 50 were a two day stage race, I think I'd be ready to go next weekend. I did miss two strength and conditioning workouts last week, which perhaps accounts for the relative freshness of my legs. An early meeting at work cut out my favorite Friday heated Vinyasa yoga class, and I was fed up with driving around in the snow on Wednesday and skipped my usual small group class at Become Fit. I did have an intense hill workout on Wednesday morning at Lory State Park. I went hard up the Timber Trail for 5 minutes, walked for a minute to recover, and then ran again. 5 repeats in all on 8% singletrack, in 10° F and snow. There's been a lot of cold and snow this week, but the weather improved dramatically for the weekend. Fort Collins runners have been lucky in this sense.

Saturday, there was a group run planned at Horsetooth Open Space, with a lot of climbing. The space was closed to let rangers and wildlife folks get a handle on the mountain lion incident aftermath, so we all went out on the more gentle Blue Sky Trail instead. Seeking a little more climbing to boost my total over last week's, I drove to Bobcat Ridge Natural Area this morning and did a double climb of Green Ridge. The first one was foggy, cold, and gloomy. The clouds broke as I turned around at the bottom of the steep Powerline Trail and my second climb was in full sun with nothing but blue sky overhead. Truly beautiful and inspiring.


Frosted pines in the morning gloom


Frosted pines in the afternoon sun

Rasterio 1.0.18

Rasterio 1.0.14 made the package more correct in how it treats the spatial reference systems we use to share and analyze gridded spatial data, but it also introduced several bugs. I made three releases this week, two of them to fix regressions caused by 1.0.14. "EPSG:3857" and "+init=epsg:3857" are interpreted differently by GDAL and in 1.0.14 we accidentally flipped from the former to the latter, obsolete representation of EPSG spatial reference system number 3857.

1.0.14 also broke the Python pickle protocol for CRS objects, something we didn't know until users who have been sending dataset profiles, which contain a CRS object, between processes using the multiprocessing module ran into exceptions. There is a workaround for this and it will be fixed next week in Rasterio 1.0.19. In case you're wondering what CRS pickle data looks like, it's just a thin wrapper around a WKT string.

>>> from rasterio.crs import CRS
>>> import pickle
>>> pickle.dumps(CRS.from_epsg(3857))
b'\x80\x03crasterio.crs\nCRS\nq\x00)\x81q\x01X\xa4\x02\x00\x00PROJCS["WGS 84 / Pseudo-Mercator",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],PROJECTION["Mercator_1SP"],PARAMETER["central_meridian",0],PARAMETER["scale_factor",1],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["X",EAST],AXIS["Y",NORTH],EXTENSION["PROJ4","+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs"],AUTHORITY["EPSG","3857"]]q\x02b.'

Update to 1.0.18 as soon as you can and get the benefits of 1.0.14 without the bugs.

Runner survives mountain lion attack at Horsetooth

From https://cpw.state.co.us/aboutus/Pages/News-Release-Details.aspx?NewsID=6832:

CPW and Larimer County DNR are investigating a mountain lion attack on a trail runner at Horsetooth Mountain Open Space on Feb. 4. The runner is recovering and the juvenile lion will be necropsied by CPW.

Whoa. It's quite possible that this cat has watched me on this same trail. I run up there by myself often and tell myself that I'm too big and too sweaty to be considered prey. But I'm always wary. No earbuds, ever, and I make sure to look up when traversing possible ambush spots. I'm glad the runner was alert and reacted to save their life. I hope I would have done the same thing. I feel sorry, too, for the mountain lion, which would be alive if it had kept its attention fixed on deer. Horsetooth Mountain Open Space would be less special without its wild cats and now there is one fewer.

Training week ten recap

I ran just 5 days this week, with one bike ride for cardio exercise and one rest day, but still increased my distance and climbing numbers.

  • 9:26 running time
  • 49.1 miles
  • 6519 feet D+

I did not smash my pole to road PR as planned on Wednesday because of an emergency pit stop, but was on pace to do it, and had a satisfying hill workout overall. Saturday, I joined a big group of local runners at Horsetooth Mountain's Soderberg trailhead for a Quad Rock training run and managed to hang with the slower group for 18 miles and 2 summits at a pace that would make the race time cuts with plenty of time to spare. It was much the same route that I ran with David Bitner three weeks ago. There was less snow, but more ice. I fell once on my butt and right hand and jammed my shoulder. It stiffened during the remainder of the run and has stayed sore, but not so sore as to stop me from running today. I went out for a short long run by myself at Pineridge and Maxwell to top up my miles and did get a new pole to road PR by a small margin. I think 26.4 might be my most miles in a weekend ever. Among the many people on the trails were folks from yesterday's group run.


Not great photo of a great mountain view from the top of the Westridge trail

Pole to road

I don't want to write too many work related blog posts here without some running content, so I'd like to add that tomorrow I plan an upside-down pyramid workout at Maxwell Natural Area and will attempt to run Strava's pole-to-road segment, 0.9 miles and 353 feet of climbing, in less than 10 minutes. Then I'm going to trot back down and head up in 8, 6, 4, 2, and 1 minute intervals. Faster as I work down the pyramid, if I can manage it.

Earlier today I went out at lunchtime and ran around Pineridge Natural Area's singletrack and service roads in personal record time without pushing very hard, so I'm feeling good about tomorrow's hill workout. I'd love to feel this rested and healthy on the morning of the Quad Rock race in May.

Rasterio 1.0.15

Rasterio 1.0.15 is on PyPI. It's the first really usable release of the package in 2019. I bungled 1.0.14, so am not counting that one as usable. There is one barely noticeable, but rather big change in the 1.0.15 Python package, and a more noticeable change in the binary wheels that we're publishing for the package.

First of all, the time had come to expand the range of spatial reference systems supported by Rasterio. Before 1.0.14, the package was strictly tied to PROJ4 and could not handle spatial reference systems outside of that module with complete fidelity. Rasterio 1.0.15 has switched to using OGC WKT (version 1) as the canonical representation of spatial reference systems. The Python API remains the same, but we have higher fidelity and more interoperability. The one small change in the API is that rasterio.crs.CRS.to_string() may return a string that looks like PROJCS[blah,blah] or GEOGCS[yada,yada] instead of +proj=utm ... or +proj=latlong .... The result of rasterio.crs.CRS.from_string(rasterio.crs.CRS.to_string()) hasn't changed, so I am not counting this as an API change. Don't use microformats in your API's return values is another lesson, I suppose. A byproduct of this work is that integration of new features in PROJ versions 5 and 6 will be much easier to realize in future versions of Rasterio. New features like local and engineering coordinate systems.

The more major change is that the binary wheels for Linux and OS X that we are publishing to PyPI include GDAL 2.4.0. There are many bug fixes in this release and many new fixtures, some of which I've never tried. I hope that users find this a positive addition. Vincent Sarago showed me how to add HTTP/2 support to libcurl and I have done so for the Linux wheels. I have not done the same for the OS X wheels because I am not sure how to make curl and SSL on OS X completely sound and interoperable with what the fruit vendor ships.

As always, the project is indebted to Even Rouault for help with building, configuring, and debugging GDAL. Rasterio has also enjoyed new help from Alan Snow and Dan Little on spatial referencing and Google Cloud issues.

Share and enjoy.

Why do computers stop and what can be done about it?

I have no formation in computer science and will forever be catching up on reading classic papers from the field. Bill de hÓra posted a reading list on his blog and I'm taking advantage of it. I've read a few of the papers ("The Law of Leaky Abstractions", "As We May Think") and seen references to others, but some are completely new to me. "Why do computers stop and what can be done about it?" caught my eye. What a title. Jim Gray nailed it.

The paper outlines a playbook for highly available computer software systems in general terms. Gray wrote it for all software engineers, not only for users of a particular language or product. I didn't know that concepts like failing fast, shared nothing, heisenbugs, and fail over were established 30 years ago. I found the description of them from the time that they were fresh fascinating. Gray wrote this paper in a simple and straightforward style and I'm grateful for that. I've read a number of AWS product sheets this week and they are opaque in comparison. Do AWS Glue or Step Functions use strategies from Gray's playbook? Do they operate on different principles? It's difficult to tell.

I remember well the search for Jim Gray when he went missing at sea in 2007. I didn't plan to write a blog post about one of his papers on the 12th anniversary of his disappearance, but that's what has happened. Read the paper if you haven't, I almost guarantee that you'll find at least a few interesting insights and rules of thumb.