2012–2013 Portfolio
Jim DeVona jim@anoved.net
Ground Track Generator In early 2012 I wrote a command line program called Ground Track Generator. As the name suggests, it generates series of coordinates representing the ground track of specified satellites over a specified period. Coordinates and related information can be output as a shapefile (for use with GIS) or as a comma separated value table. Satellite orbital parameters are input in the form of “two-line element sets” ( TLEs) such as those available from CelesTrak.com or Space-Track.org. I wrote Ground Track Generator because I wanted a way to obtain satellite location data suitable for geographic analysis. Many existing sources provide satellite location data, but few in a format directly compatible with general-purpose desktop GIS. The output and behavior of the program are configurable with numerous options. It is therefore appropriate for use as part of a scripted toolchain. Ground Track Generator is implemented in C++. It utilizes Dan Warner’s SGP4 Satellite Library for orbit modelling and the Shapefile C Library for output. In retrospect, I believe the program’s design would be more robust if it were not so tightly coupled to a particular orbit model and output format. A future iteration of Ground Track Generator might better be structured as an interface between a set of orbit models (including but not limited to SGP4) and a set of output formats (including but not limited to shapefiles or comma separated value tables). Links github.com/anoved/Ground-Track-Generator The project repository contains the Ground Track Generator source code, examples, and supporting files as well as a complete revision history. github.com/anoved/Ground-Track-Generator/blob/master/Examples/README.md This tutorial introduces the program through a series of increasingly complex examples. It includes screenshots of each example as well as an options reference. anoved.net/2012/03/making-gtg/ I wrote this blog post to recount the initial process of creating Ground Track Generator. I discuss problems encountered, resolutions, and interesting examples.
An example image from the Ground Track Generator tutorial. The attributes associated with each point of the track are displayed in the table; the point corresponding to the selected record is highlighted in yellow. Screenshot of QGIS with a Natural Earth Data base layer.
The first image I shared showing Ground Track Generator’s output on a map. pic.twitter.com/HSq6R558 At right, example ground track images. At top, overlay symbology shows satellite elevation above horizon for an observer in NY. An excerpt from the Ground Track Generator usage message (printed on the command line with gtg --help).
At bottom, tracks on an orthographic projection.
Where’s That Sat? I created “Where’s That Sat?” as a fun follow-up to Ground Track Generator. It is a Twitter “bot” (an automated reply program) that responds to queries about satellites by posting their current coordinates with a link to more details. It serves primarily as an accessible example of what Ground Track Generator can do. Where’s That Sat is comprised of three pieces: a Twitter account; a Ruby script that monitors the account, runs Ground Track Generator in response to valid queries, and post replies; and a web page with an embedded map and Javascript that parses and displays the satellite status information associated with the links posted on Twitter. The Ruby script and a supplemental script which updates the satellite orbit parameters are designed to be run periodically by a scheduling utility like cron. The bot currently runs on my personal computer, but could be installed on any server supporting Ruby and cron jobs. The bot is capable of a variety of interactions. It can respond to mentions (tweets addressed to @WheresThatSat), direct messages (private tweets from followers), and any tweet that names a designated satellite. It can also post unprompted reports about designated satellites. However, in compliance with established etiquette as well as Twitter API usage limits, it is now configured only to respond to mentions. All of the information displayed on the map page is encoded as a parameter of the reply link. This takes advantage of Twitter’s automatic t.co URL shortener to embed a considerable amount of data in each tweet. As a result, no other server-side storage is required; the web site consists only of static HTML and Javascript files. Links twitter.com/wheresthatsat The public interface to “Where’s That Sat?” wheresthatsat.com The Where’s That Sat web site provides information about the bot, including a list of recent responses as well as examples and information about advanced query options. wheresthatsat.com/satellites.html The list of recognized satellite names and aliases. github.com/anoved/WheresThatSat The master branch of the project repository contains the Ruby scripts. github.com/anoved/WheresThatSat/tree/gh-pages This branch of the repository contains the web site.
Above, a sample interaction with @WheresThatSat. Twitter replies state the satellite coordinates at the time of the query and include a link to a map with more details about the satellite’s path (see below).
Above, the wheresthatsat.com landing page. The site highlights recent responses with an embedded Twitter widget.
Shapetcl In late 2012 I began developing Shapetcl, a Tcl extension implemented in C that provides an interface to the Shapefile C Library. It permits Tcl programmers to work with shapefiles using a set of idiomatic methods that represent coordinate and attribute data in a fashion consistent with Tcl convention (structured lists). As both a Tcl programmer and a geographer, I imagined that a simple way to read and write shapefiles (a rudimentary GIS file format) in Tcl would be useful for many future projects. There are alternatives, but I wrote Shapetcl as the tool I imagined. As an exercise in crafting a useful and correct tool, I wrote detailed documentation and a suite of over 250 scripted tests for Shapetcl. Technical writing is challenging but valuable as an aid to articulating my own understanding of the code. The tests verify that that the extension behaves as expected under a variety of conditions – that invalid input generates an appropriate error message, for example – and help ensure that new features do not cause unintended changes to exhisting behavior. Links github.com/anoved/Shapetcl The Shapetcl project respository. github.com/anoved/Shapetcl/wiki/Documentation An HTML version of the extension documentation. github.com/anoved/Shapetcl/tree/master/demos Miscellaneous scripts demonstrating how to use Shapetcl. Some used in tests.
At left, an excerpt from the Shapetcl documentation. Written in Doctools markup and exported to various formats (including HTML, shown here) for consistency with the layout of other Tcl package documentation.
package require shapetcl set shp [shapetcl::shapefile "map.shp"] puts [$shp info count]
Above, a minimal example that prints the number of features in a shapefile named map.shp.
Above, a screenshot of tkdump.tcl, a Shapetcl demo. The script displays any given shapefile in a Tk canvas. It makes multiple assumptions about the shapefile’s coordinate format and extent. It is an intentionally simple example of how to read and display shapefiles with Shapetcl.
Above, a screenshot of the output of another demo script, directions.tcl. This script queries MapQuest for directions from one point to another. It outputs the results as a polyline shapefile with each step of the driections represented as an attributed line segment.
Small Projects github.com/anoved/ReadingListReader Reading List Reader A small Python library for Mac OS X that provides access to the contents of your Safari Reading List (a special queue of bookmarks representing articles to read later). Includes assorted scripts to export articles to other services github.com/anoved/Safari-Reading-List-Recipe github.com/anoved/Calibre-Recipe-for-Strange-Horizons github.com/anoved/Pinboard-Recipe github.com/anoved/McCalibre Calibre Recipes and Stylesheets Calibre is an ebook management program extensible with Python scripts. I wrote a few periodical “recipes” to generate ebooks from various sources: • Safari Reading List Recipe compiles an ebook of articles in your Safari Reading List. It is the predecessor of the Reading List Reader library above. • StrangeHorizons.com is a weekly speculative fiction magazine that is published as a web site. I wrote a recipe that generates an ebook version of the current issue; although unofficial and unsupported, it received the editor’s blessings. • Pinboard.in is an archiving and bookmarking site. You can use it to tag pages to read later. My Pinboard recipe creates an ebook from these links. McCalibre is a multi-column stylesheet for Calibre’s ebook reader window. It presents text as a series of narrow adjacent columns, as in a newspaper, instead of the vertically scrolling view more commonly used on computers. github.com/anoved/arcencode anoved.net/2013/03/an-arcencode-example/ Arcencode is a Tcl implementation of a coordinate compression algorithm used by MapQuest and Google Maps to encode a series of points as a string.
from readinglistlib import ReadingListReader rlr = ReadingListReader() rl = rlr.read()
Above, a minimal Reading List Reader example. The variable rl ends up containing a list of articles.
Pinboard Recipe: links from the web page are converted to an ebook.
McCalibe presents text in Calibre’s ebook reader as a series of columns.
Brick Blueprint In summer 2012 I created “Brick Blueprint”, an online store offering custom LEGO® instructions for models of my own design. Unlike instructions sold by other vendors in the custom model market, Brick Blueprint models could be built entirely with pieces from particular designated LEGO® sets, encouraging creative re-use and minimizing required investment in additional parts. (Whereas other vendors largely cater to collectors and adult fans, my intended market was families with children.) I was unprepared or perhaps unwilling to pursue the marketing necessary to make Brick Blueprint a viable business. After setting up the storefront, establishing a production pipeline, and populating the shop with a test series of some two dozen small models, I decided to suspend operations. I later released the models for free. The Brick Blueprint shop was built with Shopify.com using FetchApp.com to manage product (PDF) storage and delivery. Shop templates were customized to complement the color scheme and style of the “blueprint” instructions. Digital models and instructions were produced with Bricksmith, LDView, and LPub, programs compatible with the LDraw.org standard for LEGO® CAD software. Cover images were compiled in Apple Pages using a layout template. Final instruction PDF files were assembled with Apple Preview. All files (initial LDraw model, final instructions, and all intermediate stages) are retained in an organized directory structure. Information about each model was entered in a FileMaker database, also used to create the Shopify product listsings. Links flic.kr/s/aHsjBM39vU Instruction images for the initial run of Brick Blueprint models are available here. These images are concatenated from the original PDF instructions. Note that the brickblueprint.com domain name currently redirects to this gallery as well.
LEGO® is a registered trademark of the LEGO Group, which does not sponsor, endorse, or authorize these instructions.
Above, the Brick Blueprint web site. Recently released designs were featured on the front page. The catalog could also be browsed by collection; collections were comprised of all models built with pieces from the same LEGO速 set.
Above, sample Brick Blueprint instructions. At left, brick-built versions of a few small designs, including the model above.
Art In early 2012, I posted a series of “Weekend Artifacts” on my web site. The objective was to establish a creative routine by making a public commitment to set aside a bit of time each week to do a drawing or other art project. The effort lasted for a couple months. A few “Weekend Artifact” experiments with different methods or media (time lapse drawing videos and small clay sculpture) were particularly successful in that they inspired further experimentation with the same form. In November, I participated “NaNoDrawMo” – a riff on NaNoWriMo, or National Novel Writing Month, a popular November challenge to write 50,000 words. The proximate goal of NaNoDrawMo is to produce 50 drawings (consider the adage “a picture is worth a thousand words” as applied to a 50,000 word novel). The ultimate goal, of course, is again to stimulate a creative routine. A valuable effect of the rapid pace set by the challenge is to dispel worries about the quality of each piece. Indeed, many of my NaNoDrawMo drawings are crude, but the challenge prompts me to move on from frustration quickly and try other approaches. The result is a handful of creative drawings I might not have otherwise made. Most recently, I have continued to play with producing time lapse videos of my sketches. As a person who makes drawings, I have often claimed that what I find most interesting about drawing is the process of drawing, rather than the final result. I am intrigued by the potential of video as a way to share this process with others. Furthermore, I find the videos useful as a source of constructive self-critique. I have a clear interest in portraiture. A perennial goal is to explore other subjects. Links anoved.net/tag/weekendartifacts/ My “Weekend Artifacts” and commentary. flic.kr/s/aHsjCFkwUk My gallery of NaNoDrawMo 2012 drawings. anoved.net/tag/timelapse/ Time lapse drawing video clips. anoved.net/2012/10/clay-faces/ A few more experiments with small sculpture.
Three “Weekend Artifacts”: a pencil potrait, a Play-Doh bust, and a “liquid graphite” Sharpie portrait.
Three graphite portraits from NaNoDrawMo. On paper, polycarbonate, and stone.
Still frames excerpted from a pair of time lapse potrait sketch videos.
Books Here are the books I read in 2012: • • • • • • • • • • • • • • • • •
A Storm of Swords, by George R. R. Martin The Long Run, nonfiction, by Mishka Shubaly The Handmaid’s Tale, by Margaret Atwood Perdido Street Station, by China Miéville The Man Who Fe! To Earth, by Walter Tevis Nonzero, nonfiction, by Robert Wright Control Point, by Myke Cole The Thief of Always, by Clive Barker Wedding of the Waters, nonfiction, by Peter Bernstein Earth, by David Brin Triplanetary, by E. E. “Doc” Smith Little Brother, by Cory Doctorow Lord of Light, by Roger Zelazny Pride and Prejudice, by Jane Austen From the Dust Returned, by Ray Bradbury The Eye of the World, by Robert Jordan True Grit, by Charles Portis
I read these short fiction anthologies, not including some I did not complete: • Earthmen & Strangers, edited by Robert Silverberg • Pump Six and Other Stories, by Paolo Bacigalupi • Some of the Best "om Tor.com 2011, edited by Patrick Nielsen Hayden and Liz Gorinsky I patronize a number of podcasts and magazines that publish short fiction, but I do not keep diligent records of every story I read or listen to from such sources. My Kindle screen cracked. I repaired the device with a replacement display. (Of the titles named above, I read five as e-books. I subscribe to digital edition magazines.) Links Thinking Critically About Tokien: anoved.net/?p=3842 Lord of Light, Ilium, and Mythology in SF: anoved.net/?p=4206 Imperative Precautionary Haiku Reviews of the Stories in “Earthmen & Strangers”: anoved.net/?p=4451 Haiku Review of Nightmare Magazine #1: anoved.net/?p=4568
From left, novelists Margaret Atwood, China Miéville, David Brin, Myke Cole, E. E. “Doc” Smith, Roger Zelazny, and Damon Knight (author of a short story collected in Earthmen & Strangers, which I reviewed).
Kindle display artifacts indicative of breakage.
Disassembled Kindle, revealing cracks. At right, the unpowered replacement display panel.
Bikes In early July 2012, I spent a week touring central New York state by bicycle. I stayed with friends or family three nights, spent one night in a motel, and camped twice. I rode the Erie Canal trail for part of the trip and found the path quite enchanting. My route followed a number of scenic bodies of water in addition to the canal; namely, Otsego Lake, Oneida Lake, and Cayuga Lake. The last two legs of the trip (south from Seneca Falls along Cayuga Lake to Ithaca and on to Binghamton) I previously rode in 2010 on my first bike tour. The bike I rode on the tour is a bike I built in early 2011. As of March 2013, it has over 3400 miles on the odometer; excepting the 300 or so accrued by my tour and a handful of 50 mile overnight trips, that mileage represents local transportation. In 2012 I also refurbished a recumbent Catrike tricycle acquired from a friend. Links flic.kr/s/aHsjAAdixE A few random snapshots from my July tour. flic.kr/s/aHsjzpEjh7 Photos of my refurbished Catrike.
Running In 2012 I competed in the Binghamton Bridge Run half marathon (1:37:57) and the Vestal XX (1:33:29, an improvement over my 2011 result of 1:36:17). I ran my first marathon in 2011 (Philadelphia; 3:29:55) and intend to run at least one more in 2013. When training, I run five or six days a week and maintain a daily mileage diary.
Approaching Erie Canal lock 20 near Utica, NY.
Drying clothes at Verona Beach, on Oneida Lake.
My campsite at Buttermilk Falls SP in Ithaca, NY.
An “on ramp� to an arboreal segment of old trail.
My tour took a counter-clockwise route through central New York: Binghamton, Oneonta, Cooperstown, Utica, Rome, Syracuse (skipping across town), Seneca Falls, Ithaca, and back to Binghamton. I visited friends and family.
At right, the Catrike C2000 recumbent trike I refurbished with a variety of new components.