home
connor
Projects
3d-blacksburg
about

About

The 3D Blacksburg project is an initiative to build a 3D model of the town of Blacksburg, Virginia (home to Virginia Tech). The finished model will contain combined information on terrain, structures, and infrastructure. Potential applications for the 3D model include tourism, city planning, and emergency response team support.

I worked on this project while I was doing undergraduate research at Virginia Tech's CAVE lab.

My Contributions

My work on the project focused mostly on collecting existing models of buildings around Blacksburg from various sources and using them to produce a combined, interactive model of the town's building layout.


getout.do
about

About

getout.do is a web application that helps active people find local activity groups and log and analyze their group and individual performance. The target audience for the site is athletics clubs, school sports teams, and workout groups.

My Contributions

As technical founder, I designed and built the majority of the site. I also directed the integration of contributions from outside developers.


grammatica
about

About

Grammatica is an open-source LL(k) parser generator. It is similar to tools like yacc. It was written in Java, and generates parsers in C#, VB.NET, or Java.

While I was on internship with ABB, my team was using grammatica to generate parsers for a custom language used in some robotics parts. I worked on improving this project in order to make the generated APIs more maintainable for my team.

My Contributions

I contributed major changes to the way the API for working with parse trees was generated. This allowed the resulting parse libraries to be easier to use and maintain, and to correspond to the input grammar file more closely.


nvapi
about

About

NVAPI is a REST API that I wrote for one of my clients. The purpose of the API is to wrap the client's legacy database and provide data access to third-party applications. The API also serves as a translation layer due to poor naming and lack of documentation on the legacy database.

The API includes functionality for handling payments through the PayPal PayFlow Pro payment gateway. It was written in ruby using sinatra, was documented with yard, and was tested using rspec.

Because this project was an internal tool which was not released as a product, there is no project site available.

My Contributions

I wrote the API from an extremely minimal (few dozen SLOC) base until the first release.


recollections
about

About

Recollections is an enterprise tracking system for e-scrap recycling plants. It is implemented as a rails web application, and sold using the software as a service model.

The data collected by a Recollections customer is used to generate customized reports using a number of analysis vectors. These reports are used for plant operation efficiency improvements and government compliance reporting (to qualify companies for state tax incentives and to prove mandatory recycling quantities). The data is also used to analyze material flow, locate and fix workflow blockages, optimize the product breakdown processes, and automate parts of shipping and invoicing.

My Contributions

My contributions to Recollections included an improved material pricing model, significant improvements to the software's custom report builder, and a number of canned reports (mostly state compliance reports). I also handled customer service calls and worked directly with the director of compliance at a major recycling company (I have agreed not to reveal the name of the company) to build various reports.


vandam
about

About

VanDAM is Netflix's internal digital asset management software used for marketing assets. It is used to track, collect, share, and organize many different types of assets, including videos, audio, documents, and interactive files such as flash media. It has global reach and is used throughout the marketing process at Netflix, and is also used by the network of agencies Netflix works with to produce digital media.

My team at Netflix was responsible for enterprise software development, and VanDAM was one of the products we developed. The software is a completely custom solution with integrations to a number of other Netflix services as well as third-party services.

VanDAM is built as an Ember.js frontend and a Rails backend.


Sources
accessible-hash
README.md

Accessible Hash

Gem Version Build Status Code Climate Dependency Status

Description

Accessible Hash is a simple wrapper around the built-in Ruby Hash that behaves like a HashWithIndifferentAccess and also allows object.attribute style access.

Install

Manually:

gem install accessible-hash

or with Bundler (add to your Gemfile):

gem 'accessible-hash'

Usage

require 'accessible-hash'

foo = AccessibleHash.new(bar: 'baz')
foo['bar']  # => 'baz'
foo[:bar]   # => 'baz'
foo.bar     # => 'baz'

git
https://connor.prussin.net/accessible-hash.git
formatted-date
README.md

Formatted Date

Formatting extensions for ruby time classes.

Gem Version Build Status Code Climate Dependency Status

Description

Formatted Date extends the ruby built-in Date, Time, and DateTime classes to allow easier access to consistent output formats.

Install

Manually:

gem install formatted-date

or with Bundler (add to your Gemfile):

gem 'formatted-date'

Usage

require 'formatted-date'

Date.formats = {long: '%A, %B %-d, %Y'}
date = Date.new(2014, 6, 11)
date.long            # => 'Wednesday, June 11, 2014'
date.long(date + 1)  # => 'Yesterday'
date.long(date)      # => 'Today'
date.long(date - 1)  # => 'Tomorrow'

Extended Classes

This gem extends the Date, Time, and DateTime classes to provide named formats. Formats are specified by setting the formats class variable for each class. They are called by simply using dot notation; this gem uses method_missing to provide dynamic methods so as long as the format is in the formats hash, it will be available.

Alternatives

When generating formatted strings, this library will try to replace date and time parts with such short alternatives as Today, Tomorrow, Yesterday, Midnight, and Noon. This behavior can be suppressed on a per-format basis by using appropriate parameters in the formats hash.

The Formats Hash

For each key-value pair in the formats hash, the key specifies the name of the format, and the method used to format the object. Make sure the format name does not clash with any method names on the objects, or you will be unable to use the format.

The values are generally hashes, but can be strings for Date objects. If the value is a string, it is passed on to strftime when getting the formatted object. If it is a hash, then the keys expected are (for Date objects):

  • format: the format string used for strftime
  • alternatives: false if you don't want the format to be replaced by the words Today, Tomorrow, or Yesterday, as appropriate.

For DateTime and Time objects, the values must be hashes. The keys of these hashes are:

  • date: the strftime format for the date part
  • time: the strftime format for the time part
  • glue: text to put between between the date and time parts (e.g. 'on'), surrounding spaces added automatically
  • alternatives: false to suppress using alternatives like Today, Midnight, or Noon, :date to only use date alternatives, and :time to only use time alternatives
git
https://connor.prussin.net/formatted-date.git
resume
README.md

LaTeX Resume Class

Description

This is a LaTeX document class intended for use when writing resumes. It is loosely based off parts of the Resume class developed by RPI, but has been rewritten from ground up. To keep the class file minimal, only one style is supported---please see my resume for an example of the produced format. The source of my resume is included in this repository as an example.

Usage

Instruct LaTeX to use the resume class in the preamble of your document:

\documentclass{resume}

Letterhead

The letterhead provided by this document class prints the resume author's name, a horizontal line, and two address sub-headers, one floated left and the other floated right. To put a letterhead in your document, use the letterhead command.

\letterhead{<Name>}{<Address 1>}{<Address 2>}

Sections

Each section will generate a small-caps header in the left margin. Use sections exactly as you would in any other LaTeX document:

\begin{section}{<Header>}
...
\end{section}

Experience

The experience macro produces a section with a header containing information about the experience and a list of statements regarding the experience. The experience macro is used as follows:

\begin{experience}{<Job title>}{<Company>}{<Dates>}{<Location>}
    \item <Statement describing experience>
    ...
\end{experience}

Projects

The project macro is similar to the experience macro, but it does not expect a title or location. Use the project macro as follows:

\begin{project}{<Project name>}{<Project sub-title>}{<Dates>}
    \item <Statement describing project>
    ...
\end{project}

Activities

The activity macro lists activities, positions held, and dates.

\activity{<Activity title>}{<Positions held>}{<Dates>}

If no positions were held, use the macro as follows:

\activity{<Activity title>}{}{<Dates>}

Note the inner {}.

Awards / Honors

The award macro is similar to the activity macro, but does not include an argument for officer position.

\award{<Award title>}{<Dates>}

git
https://connor.prussin.net/resume.git
token
README.md

Token

Gem Version Build Status Code Climate Dependency Status

Description

Token is a library that generates and verifies cryptographically secure, signed string tokens.

Install

Manually:

gem install token

or with Bundler (add to your Gemfile):

gem 'token'

Usage

Setup

The Token class defaults to using the AES-246-CFB cipher with a randomly generated key and initialization vector, and the payload format as a single integer value. These defaults can be overridden as follows:

require 'token'

Token.cipher = 'AES-256-CFB'
Token.key    = OpenSSL::Cipher.new(Token.cipher).random_key
Token.iv     = OpenSSL::Cipher.new(Token.cipher).random_iv
Token.format = 'L'

You can reset the class to its default payload format and default cipher with a new random key and initialization vector by using Token.reset.

Generate a Token

When tokens are generated, two parameters must by specified:

  • A payload. By default, this is a single integer value.
  • The Time after which verification of this token should fail.

An example of generating a token is:

in_one_day = Time.now + 60 * 60 * 24
token      = Token.generate(0, in_one_day)

Verify a token

When verifying a token, the token is checked to ensure that it is not expired.

token = Token.generate(0, Time.now + 2)

Token.verify(token)  # => 0
sleep 2
Token.verify(token)  # raises Token::Error

Modify the Payload Format

By default, the payload of the token is a single integer value. This is useful when you are handling login, as it can specify the ID of the user with the token. However, sometimes applications require tokens with more intricate payloads.

To change the format of the payload to contain multiple values or different formats, modify the format parameter. This parameter should be in the same format as expected by Array.pack. The default value is 'L'.

Token.format = 'LCCCCA*'
ip_address   = '0.0.0.0'.split('.').map(&:to_i)
token        = Token.generate([15, ip_address, 'foo'], Time.now + 5)
Token.verify(token)  # => [15, 0, 0, 0, 0, 'foo']

Note that if the format only contains a single field, then the payload argument to Token.generate can be a scalar. Otherwise, the argument must be an array. The array will be automatically flattened when generating the token, and verify will always return a flat array or scalar.

Instances of the Token Class

You can create instances of the Token class and use the instances to generate and verify tokens. This is useful if you use tokens for multiple purposes in your application and each purpose uses different cryptographic parameters or payload formats.

key   = OpenSSL::Cipher.new('AES-128-CFB').random_key
iv    = OpenSSL::Cipher.new('AES-128-CFB').random_iv
tok   = Token.new('AES-128-CFB', key: key, iv: iv)
token = tok.generate(0, Time.now + 5)
tok.verify(token)  # => 0

If you call Token.new without any arguments then it will create a Token class with the default cipher, a random key, and a random initialization vector.

git
https://connor.prussin.net/token.git
public_key.gpg
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v2.0.22 (GNU/Linux)

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
=Xw5/
-----END PGP PUBLIC KEY BLOCK-----

Keyserver

Recognized commands

Try clicking on file names!

Hello. I'm Connor, and I'm a habitual learner.

I pay the bills by writing code, but what I really do is learn and grow.

I currently live in Campbell, California.

I enjoy building things. Information on some of the code I've released, as well as some of the projects I've contributed to, can be found on this site.

I'm always interested in finding new adventures. Do you think you may have one? Contact me!

Welcome

You have found the personal website of Connor Prussin.

Don't Panic.

/home/connor