We went on a short trip to Lassen Volcanic National Park over the weekend.
Tag Archives: travel
Channel Islands National Park
We visited Channel Islands National Park last weekend. I’ve put up some pictures in the Channel Islands page. Overall it was not our favorite park, the hiking felt very similar to hiking the hot, dry, sun-scorched trails of Mt. Diablo, but with less shade. On the plus side we did get to see a blue whale and her calf. We may try kayaking if we go again.
Python templates with Jinja2
When I initially wrote the car usage tracking web app I hard coded the html into the python script that worked with the data. This is alright for prototyping a D3.js visualization, but it’s a real mess having the page layout and text intermingled with the python code. Luckily there exists a large number of python templating engines that make it easy to fill in variables in an html layout with data from a python script. In this case I used Jinja2.
Here is what part of the python script looked liked before refactoring using Jinja2.
# print info from current fill up and table with all fillups print "<p>Miles driven: %s" % (float(data[-1][-4]) - float(data[-2][-4])) print "<p>Your mpg was: <b>%.2f</b>" % float(data[-1][-1])
Jinja2 allows for passing variables from python in the form of a dictionary, where the key in the dictionary is specified in the html template (surrounded by double curly braces i.e. {{ key }}), and will be replaced with the value associated with that key. It allows simple logic such as for loops, which I used to produce the table of past data:
<table> <tr> {% for cell in header %} <td><b>{{ cell }}</b></td> {% endfor %} </tr> {% for row in fillups %} <tr> {% for cell in row %} <td>{{ cell }}</td> {% endfor %} </tr> {% endfor %} </table>
In the python script, the code to produce the template looks like this:
import jinja2 env = jinja2.Environment(loader=jinja2.FileSystemLoader( searchpath='templates/') ) template = env.get_template('mpg.html') display_dictionary = {} # code that fills in display_dictionary with the values to send to the template print template.render(display_dictionary)
It’s also possible to save the rendered template as a static html file:
output = template.render(display_dictionary) with open('../index.html', 'w') as f: f.write(output);
Where dispdict is a dictionary containing variables like mpg, milesdriven, etc. The keys to this dictionary are in the template, awaiting replacement the the correct value. The code ends up being much cleaner this way: the data calculation is separated cleanly from the html that defines how it is displayed. Now that I’ve gotten familiar with Jinja2 I plan to use it from the beginning in future projects. I’ll probably further refactor the code to generate a static html file each time the data is updated, since creating the page each time it is visited is not necessary in this case.
The all the code for the car usage tracking web app is up on github (link).
Car usage tracking
Since we bought a new car last year we’ve been keeping a detailed log of every trip to the gas station, including odometer reading, calculated mpg, and location. Over the weekend I wrote a simple web app to visualize the data and provide an interface to update the data. I’ve put a few images from the results below. The page itself is up here. The code is available on github (link).
I think it’s neat to visualize the effects of various road trips on the odometer reading, the two trips to Utah being very steep. Those parts of the graph remind me of the profile of many of the geologic features we went to Utah to see. Also of note is the prolonged steep section over the summer when I was commuting to an internship. Now if anyone asks what kind of gas mileage our car gets, I can just give them a link.
I used D3.js, a JavaScript library for “data driven documents”, especially useful for making plots in a browser. I hadn’t written any JavaScript before, so it was a great learning experience and I’m really happy with the results. My usual approach is to generate and save the plots in python using matplotlib, then serve those files. I’m excited to use D3.js to create other visualizations on the web.
I used python scripts to update the data and output the html table seen on the page.
Again, here are the links:
- Live page: https://www.frankcleary.com/mpg/
- Code: https://github.com/frankcleary/mpg/
Yelp Wordmap
In L.A. I found myself in a situation I’ve encountered before: Trying to find a place for dinner in a large and unfamiliar city. I want to experience the city, but preferably avoid the dodgy parts. It’s difficult to narrow down the options in a such a case. Luckily I’d seen a post on the Yelp engineering blog about their neat wordmap page, so I decided to turn there. Since it was approaching sunset I choose to look for places where people commented on the views, and found a few patches of density along the coast, about 20 minutes from our hotel:
We headed down there and drove around until the sun set (the views were great!). Then we ended up eating at Fish Camp (which of course we vetted on Yelp first), and it was good.