Author Archives: Jordan

First Flowers in Macro

I purchased a macro tube (~$30) for my trusty Olympus OMD-EM10. Started playing around with the macro effect in the back yard. The macro effect is so strong, and it really has the power to transform a typical backyard into an extraordinary place.

The macro tube worked quite well. The depth of field was vanishingly small and I found it difficult to get enough of the flower in focus. Slight movements of my hand were enough to take the flower out of focus. This was not helped by the fact that auto-focus was not functional.

WindViz – Browser Based Visualizer for NREL Wind Toolkit HSDS API

I created a visualizer for the wind toolkit dataset at the National Renewable Energy Laboratory (NREL) using client side ES6 compiled through Babel and Webpack. NREL supports and maintains a dataset called Wind Toolkit. This is a large dataset which is hosted on NREL’s supercomputer, Peregrine. The public is entitled to free access of this dataset, but its large size presents a practical challenge to people who may want to use it. In order to provide easier access to this dataset, my colleagues at NREL implemented an API on Amazon AWS, developed with the HDF group, which provides fast access to rectangular slices of the data (this work was featured on the AWS Big Data Blog). The motivation behind WindViz was to create a visualizer to demonstrate this API.

WindViz - Wind Toolkit Visualizer Screenshot

Rasterization of the windspeed data (to create the green and blue heat-map) presented a major challenge, since the coordinate system of the Wind Toolkit data is in Lambert Conic instead of Web Mercator. This meant that any rasterization algorithm would have to operate in the Lambert coordinate space before being projected into Web Mercator.

Part of the project specification stated that it must operate as client-side only Javascript. This was the first time I’d played around with “modern” Javascript. After experimenting with React.js and Aurelia, I decided to keep it simple and just a one-page HTML document animated by Javascrit. I design most of this code around the Leaflet.js library.

The code can be viewed through the Github repository. An interactive demo is hosted through Github pages.

Moby Trips

Launched a new app for Moby, Systems inc. called Moby Trips (download from the iTunes Store). This app builds upon Simple Location Sharing by adding features such as waypoints (pins), photos, and recording your path via GPS. The app uses the same, flexible, nodejs backend which powers Simple Location Sharing. I’m continuing to work on this app in my free time, so any feature suggestions are welcome!

Two interesting challenges I ran into were the manor in which iOS’s Asset Library class handles deleted files, and keeping the server and iOS client synchronized throughout areas of patchy cell service. Next time I may try to use Meteor’s Open DDP protocol to overcome this challenge, as REST wrangling became much more trouble than expected.

Future improvements include synchronization of the data across multiple devices, a more comprehensive HTML5 viewer, the ability to enable and disable live streaming, and exporting of your data to various formats such as GPX and Open Street Maps.

Moby Simple Location Sharing

Moby Simple Location Sharing is an app for iOS and Android which helps you share your live location with friends. This project contains several components, including a node.js backend, two apps, and two websites in HTML5 (the viewer app and the homepage). Try it out from Google Play or the iTunes Store!

Screenshot of the Moby Simple Location Sharing iOS app.

Screenshot of the Moby Simple Location Sharing iOS app.

Relisten

I’ve been working on a side project, Relisten.  This is a web application for Facebook and Spotify users that aggregates listening history into weekly playlists that can be “relistened” through Spotify. The app came from my usage of Last.fm and the realization that no such tools exist for data on Facebook.

Relisten was an exercise in using the Facebook javascript API and HTML5 localStorage. The technical goal of Relisten is to achieve a fully functional web application without any server-side processing. Facebook data is retrieved from your own browser and stored locally, allowing for an intrinsically scalable app.

Rendering Trees with Meteor.js + Handlebars

Handlebars is currently the only template engine integrated with Meteor. Notably absent from Handlebar’s feature set is the ability to pass context between blocks. Furthermore, the scope of a parent block is absolutely inaccessible from the child’s context (no super, no this.parent).

One can get around any restriction imposed by Handlebar’s markup by writing a custom block helper. The theory behind block helpers is to keep logic separate from the design markup. Every block in Handlebars (if, each, with, list…) calls a block helper behind the scenes. The block helper is a function which takes the block’s HTML content as an argument, as well as any arguments listed in the block’s declaration, and uses these arguments to return a string which is rendered in place of the block. It’s sort of like a macro.

In the case of a tree, using a block helper is absolutely the way to go.

DSP Experiments

I spent the final days of the summer exploring the Fourier transform with Nicolas Avrutin by writing an image <-> audio converter in Python/Numpy. This was more an exercise in learning Numpy, but the result is pretty cool:

This is the spectrograph of an 18 second audio file generated by our script. The ghostly vertical lines are due to interpolation issues, translating an image sampled at a certain rate into an image with far fewer pixels columns than necessary. Color represents intensity of the sound.

We implemented a full color version by using a three channel WAV file (usually used for surround sound or secondary language purposes). We had to write a custom spectrograph generator, as SOX will not combine the channels into a color image. Here’s SOX’s spectrograph:

And our own spectrograph:

Work has been halted on this project while Nick and I deal with school, but this could be used to embed a faint image into music.

ORM Models for restful APIs

I wrote a nifty class which wraps URLLib behind an interface for RESTful web services. The result is a set of one-liners that can be used to import data from compatible APIs.

The goal of this project is to easily import and process data from disparate APIs without needing to read thousands of pages of poorly written documentation. Just import the models you need and hit the ground running.

Think of it as Yahoo Pipes, but local and in Python instead of a graphical programming language.

Single Rule L-System Fractal Generator in Python for Autocad

My first assignment at Cooper Union was to make something in AutoCad, a program used by engineers worldwide to draft architectural plans and machine parts. I decided to write a script in Python that generates the lines of an L-System fractal (as described in The Computational Beauty of Nature by Flake) I used the SDXF library for Python to write the AutoCad DXF file format. You can check out my source code here -> autol.py

Subversion Repository Index Page

Back when I was working on my FRC robotics team’s website, I wrote a simple page to display all of the subversion repositories related to my team. Realizing that there were no existing simple subversion repository index page generators, I decided to make one with human readable code and post it here.

See it in action!   http://svn.jperr.com

Download svnindex.py

The code was developed and tested using Python2.6, but I see no reason why it shouldn’t work in Python3.0. Likewise, I’ve developed and tested this using UNIX based machines (Mac 10.6 and Debian Linux), but it should work under Windows. The script requires the command line “svn” client to be installed and accessible by the user under which Python runs, and you must have the standard python “time” and “commands” modules installed. 99.9% of Python installations will have them pre-installed.

All you need to do to get svnindex.py running on your site:

  • Download svnindex.py (link above)
  • Modify the settings at the top of the file
  • Set up a daily cronjob to run the generation script. Something like `python /path/to/svnindex.py` works just fine.