This post has been superseded by an update, and it exists for historical purposes only
As the first blog post on Spatial Awareness, I’d like to introduce what’s on the Productivity page of the site as of 3/5/19. With future posts I’d like to keep closer to the stated theme of “geographic simulation and analysis,” but I think this is a useful start for now.
There’s an almost overwhelming variety of productivity oriented software available, with many sharing common features. I choose to use Taskwarrior despite it having a steeper learning curve and nonexistent marketing budget. I appreciate being able to manage my to-do list directly from the terminal instead of having to use a GUI. Also, while most of Taskwarrior’s alternatives offer their own API’s, Taskwarrior benefits from being especially interoperable, allowing one to customize usage to their specific objectives.
Right now, my main objective is to put something eye-catching on my brand new website and have some fun while doing so. I guess it wouldn’t hurt to have this something also help to impose some regimentation and accountability on how I spend my time now that I’ve submitted my master’s thesis. Hence, the Productivity page was born. This not only serves as an accessible “to do” list but also as a visual indicator of whether I should be working hard to continue a productive streak, working hard to make up for slacking, or taking a breather to maintain a work-life balance. I have a series of scripts that update this page every few minutes according to my current task list. The first part of this, as of the time of writing, appears as such:
Taskwarrior assigns a numeric “urgency” value to each task you create. This is calculated using variables such as when the task was created, when it’s due, what other tasks depend on it, and a user-assigned ordinal “priority”: low, medium, or high. The page’s first part shows is a list of my 10 most urgent tasks according to Taskwarrior’s algorithms.
One of my favorite aspects of Taskwarrior is how it handles recurring tasks, which I have tinted red. Currently I have “water plants” occurring once a week and “submit application” each day. This is helpful for setting long term goals; if I want to hold myself to submitting an application every day, I know to submit two the following day if I decide to spend one working on the website. I see this feature being even more helpful for less intense, longer term goals such as practicing a language or completing free online coursework. Tasks that should not “build up,” like taking out the trash, can be set to expire after a certain point.
The second part presents two bar charts conveying the rate that I add and complete tasks through Taskwarrior. I first imagined these being histograms, aggregating the two values for each chunk of time. ggplot2 didn’t feel like making histograms with temporal data, instead displaying individual bars for each day. For most applications this would be undesirable, as for the second chart the bars are incredibly thin, and I imagine it wouldn’t be too difficult to fiddle with the data to make more traditional histograms work. But I decided not to fiddle. They still succeed in expressing the overall patterns of my Taskwarrior usage. In addition, if I am to take the whole accountability aspect of this project seriously, using *real* histograms for the second chart could make one day of frantic usage within an otherwise barren week appear identically to a week of healthy, consistent task management. This is a rather extreme example, but still I think the daily bars might be able to show finer grain details of my habits even at a yearly scale.
This is all accomplished using two main scripts, one in Python and the other in R. You can see the R code here and the Python code here. I have a systemd timer run a shell script that first syncs my local machine’s Taskwarrior client with my Taskserver hosted by Inthe.AM. Next, it exports the (now synced) list of tasks to a JSON file. This file is read and used by the R script to create the two charts. Finally, the Python script puts together the text portion of the page, reads the two images, and puts it all on the site.