Since this is my personal site and I'd rather not mess w/ design issues if I can afford not to, I've decided not to support IE6. I encourage you to check out another browser. Why not Firefox?
My Portfolio
I am primarily a web programmer working in PHP and its prominent frameworks (CodeIgniter, CakePHP, PEAR), Javascript (both straight and using the jQuery framework) and Ruby on Rails. I've used these tools to create advanced web applications for clients, big and small.
In addition to my web programming, I have also contributed code to various open source projects. This code has ranged from bug fixes to the web frameworks I use to homegrown desktop applications. I am also available for contract iPhone application programming.
A partial list of my PHP, Ruby on Rails and Open Source work can be found right below.
PHP
Center for Responsive Politics Mobile Site
OpenSecrets.org is a nonpartisan guide to money’s influence on U.S. elections and public policy. By collecting campaign contribution data and making it avaiable to the process, it helps make the democratic process more transparent.
For this project I created a mobile optimized version of the site using the CodeIgniter framework.
OpenRegs.com
OpenRegs.com is an alternative to the federal government's Regulations.gov regulatory dockets database. That site can be confusing and difficult to use for average citizens and experts alike. The goal of OpenRegs.com is to make the proposed and final regulations published in the Federal Register easy to find and discuss, so that citizens can become better informed and more involved in the regulatory process.
The site was built using the CodeIgniter PHP framework. Every morning the site pulls in an XML copy of the previous day's updates to the Federal Register. Then, using a number of heuristics, the site adjusts for the typos and non-standard formating that frequently appear in the government's data. The software then builds a local version of the data, and repackages it so that users can track agncies, proposed rules and topics of their interest through the site and through RSS feeds.
StimulusWatch.org
StimulusWatch.org is a Web 2.0 crowdsourcing application designed to aggregate public knowledge about proposed federal stimulus spending projects. Visitors to the site are encouraged to view spending proposals in their area, vote them up or down, edit each project’s wiki with any relevant information they can contribute, and to discuss the project in the site's forums.
The project has gained some national attention, and we anticipate it will become an important presence in the upcoming national discussions on federal spending policy.
The site was built using the CodeIgniter PHP framework and follows the MVC design pattern. The site also includes integration with a hosted instance of MediaWiki through CURL and some screen scraping, clever caching to keep the server load reasonable, the Disqus forum system, and several PEAR classes for Excel file generation and input validation, among other things. The code strictly follows the CodeIgniter style guide so that as other programers join the project we can have a common, attractive and familar set of code to work with.
Hogensen Strategies
Hogensen Strategies is a national Voter Contact consulting firm that has extensive experience winning political and issue campaigns. The firm needed an attractive and easy to maintain site to advertise their previous clients and electoral successes.
The site is build around the CodeIgniter framework, the Tripoli CSS standard, and follows the MVC pattern of code separation to maximize code reuse and minimize potential bugs.
Visual and Critical Studies at The School of the Art Institute of Chicago
The Master of Arts in Visual and Critical Studies program is designed for students interested in the scholarly and creative investigation of the production, dissemination, and impact of visual images, objects, experiences, and practices. The program needed a WIKI-like site where department students and facutly could create pages to demonstrate their research and work. The site also needed to serve as a common place for department members to read about upcoming symposia, events and projects.
The site is built using the CodeIgniter framework. The database work is done using industry standard practices, including fully adhering to the MVC patterns, using ORM classes to handle relations and escaping SQL data, salting and hashing passwords to increase site security, and working around the risks of native PHP sessions in a hosted environment.
The site also utilizes the TinyMCE and jQuery javascript libraries.
volcano!
volcano! is an excellent Chicago based, Beefheart / Dirty Projectors / 60s Soul inspired band. The site allows for the group to manage their upcoming shows, display videos, stream songs to visitors, manage a blog, and other related activities through an easy to use web interface.
The site is built using the CodeIgniter framework, several PEAR classes and follows the MVC and OO programming patterns. The site also uses the jQuery javascript framework to ease making the photo gallery cross-browser compatible.
Village of Brookfield (IL)
Brookfield, IL is a Chicago area suburb. The city's government needed a site where they could communicate easily with Brookfield residents. This included displaying news items and events, making meeting minutes and audio recordings easily accessible to visitors and mailing list, amongst other functionality. The city's bylaws require that content be updatable in Dreamweaver, so use of dynamic content needed to be handled in a way that limited the use of database and sever side programing.
The final site uses the CodeIgniter framework. The framework's MVC pattern made it easy for the village to edit the sites layout. Most of the dynamic content is fed out of XML files, so that content could be edited in Dreamweaver or third party tools, which necessitated using some tricks to get around limitations that come up in iterating over large XML files in certain versions of PHP5's XML extension.
The events calendar system is built around a custom class to handle the creation of moderately-complex repeating events, and uses AJAX on the front end so that navigating it is quick and pleasant for visitors. The news section ended up using a database solution incorporating the tinyMCE javascript rich text editor, so site administrators can create attractive and richer content for the city's residents.
FX Only
FX Only is a site dedicate to tracking the performance of foreign currency funds. The site allows its users to input performance and amount data for the currency funds they're administrating, and the application generates various statistics to compare and track the funds.
The site is built using the CodeIgniter framework and necessitated the creation of several custom statistical classes for comparing fund data and caching the results to minimize redundant calls to the database. The site also generates graphs dynamic graphs based on the funds' performances, and intellegently caches these to reduce strain on the server. In addition to manually entering data for each fund, user's upload spreadsheets to the application, and it will parse the spreadsheet accordingly.
Jumble
Jumble is the Chicago Tribune's signature word game. Site visitors can browse for merchandise related to the game, download old Jumble puzzles in PDF form, and play new online variants of the game.
The site was built using the CodeIngiter PHP framework and the MVC programming paradigm, is database driven, and makes through use of the jQuery framework to create an attractive but easy to navigate experience for the visitor.
Client Time Management System
AIS is a Chicago area technology consulting firm that needed a time management system that clients could use to create and monitor support tickets. Approved clients can log into the system to see the status of support tickets they submitted to AIS staff, or use the site as their own time management system, allowing their employees to create, edit, approve and comment on task internal to the company.
The site is built around a custom PHP framework that utilizes an ActiveRecord-inspired ORM database classes and object-oriented MVC design using the Smarty PHP templating engine. There are multiple levels of users, allowing clients to create limited sub-accounts for their employees and clients, several nice javascript tricks to hide and collapse data as needed to make viewing tasks more plesant.
The project also included creating an email sorting program that, based on the email's recipient, subject iine and content, creates tasks out of emails, makes an intellegent guess about who should be managing the task, assigns the task to the user, and sends notification emails the user and support-requester about task's status. The result is a great deal of saved effort on the part of the system's adminsitrators.
iPhone / OSX
OpenRegs.app
Take the Federal Register with you wherever you go! With the OpenRegs app for the iPhone and iPod Touch you can find recently issued notices of final and proposed rulemaking. Browse by agency or comment periods closing soon or recently opened. You can mark individual regulations with a star and then easily view a list of all your starred regs. Regulations can also be emailed to a friend or to yourself for later reference. Best of all, it's free!
ToneTune / ToneTuneLite
ToneTune is a multiple tuning fork that helps you tune the strings on your stringed instrument to the correct pitch by ear without searching through hard-to-find books or the web. We have many more tunings for instruments than the competition, and a more intuitive interface.
Simply select your instrument and tuning, and tap the graphic to get the right pitch for each string. It can even play all the notes in sequence, as many times as you like.
ToneTune was a contract project for Stanton Studio. More information available at the ToneTune website, maintained by ToneTone's owner.
KittenApp
KittenApp is a fun application for iPhone and iPod Touch that lets you take your kitten with you wherever you go.
From the description on the AppStore:
KittenApp gives you the chance to take kittens with you!
With KittenApp you can have the fun and relaxation of kittens anytime you want. You can pet the kittens on the screen to hear them meow, or pet them a bit slower to hear and feel them purr in your hand.
KittenApp comes with three adorable preloaded kittens and includes the ability to use any photo from your library instead.
KittenApp! For the kittens in all of our lives!
PESTabBarAddition
PESTabBarAddition is a pair of classes I wrote to make it easy to customize the tabbed iPhone interface. Its a common complaint that you can't change the color of affect on the icons in the tab bar, or use text instead of images, or use different views for selected or unselected states, or make anything but the most trivial changes to the basic UINavBar. These classes make it easy to do that with no coding. They're licensed under the BSD liense, so do what you'd like to them, no worries.
Its a bit hackish. Heres how it works:
- you just remove the system icons from the UITabBar through Interface Builder
- You pass the classes an array of arrays that contain an on and off state UIViews
- The classes superimpose the UIViews you pass it on top of the UITabBarItems and pass any touches they receive up the responder chain, so the tabs still work like normal.
Ruby on Rails
This Site
This site uses Ruby on Rails. It makes extensive use of all of the standard features Rails programmers should know about, including rendering using partials, extending the basic generated models, custom helpers, many levels of migrations as the site's needs have grown, authetication sessions, and other non-flashy but imporant concepts in the framework.
Sonic Weapon Fence
Sonic Weapon Fence is a band I'm in. We perform songs based on the TV show LOST. I put this site together for the group using Ruby on Rails. I even did the design (which explains something). It utilizes basic authentican features with two different permission levels.
From the Forums
From the Forums is a community site based I started a while ago with a co-worker based around the idea that lots of people love to read the silly things other people write in forums. The site allows visitors to collect, post and comment on funny or interesting forum posts from other websites. The site is built with Ruby on Rails, utilizes the “acts_as_authenticated” and "attachment_fu" plugins, and allows visitors to create personal profiles, track their site usage stats, add new posts to the site and comment on current ones
Open Source
FormBug
FormBug is an extension to Firebug I wrote to make testing form-intensive websites more plesant. Currently it does just four similar things:
- Populate Form: Selected from the right-click context menu. It searches up the DOM tree for a form, and if it finds one it fills in all the "checkbox," "radio" and "text" inputs, selects and textareas with default values.
- Populate all Forms: Does the above, but for all forms in the current tab
- Serialize Form: Works like populate form above, but instead of filling in values, it displays what the selected form would submit to the server in mock json format in the Firebug panel
- Serialize all Forms: Does the above, but for all forms in the current tab
- Inspect Form: Provides an interactive popup to inspect the current state of forms on the page
Learn more on the FormBug page
Misc.
- Patch to Christian Yates' Finder Style jQuery Column View plugin to make the plugin work in jQuery's noConflict() mode and to add a 'last_child' option to treat all end linksĀ as anchors instead of displaying the 'title' attribute in the next column.
- Patch to Joey Mazzarelli's JS date parsing library to add support for MSSQL date formats 9 and 109
- UnTumbled, a Firefox extension that hides the 'Tumblarity' feature from the Tumblr dashboard
CommandIgniter
CommandIgniter is my first draft of something similar to the command line tools in Ruby on Rails towards that. Its nowhere near as complex or as feature-ful as Rail’s tool, most notably in that its not interactive, but its a lot better than nothing.
To use, unpack and install CommandIgniter.php in the application/libraries/ directory and run as follows on the command line:
Basic Usage
php system/application/libraries/CommandIgniter.php project/find/1
- Model : project
- Method : find
- Argument : (string) “1”
The above will return the result of passing the argument 1” on the “find” method on the “project” model.
php system/application/libraries/CommandIgniter.php books/delete/1/yes, do it
- Model : project
- Method : find
- Arguments : 1, “yes, do it”
Advanced Usage
php system/application/libraries/CommandIgniter.php futureselves/find_all_by/[active=yes,age=28]/me/future
- Model : futureselves
- Method : find_all_by
- Arguments: array(‘active’ => ‘yes’, ‘age’ => ‘28’), “me”, “future”
php system/application/libraries/CommandIgniter.php store/buy/13 -l Paypal AuthorizeNet
First load the libraries “Paypal” and “AuthorizeNet” from the “application/libraries” directory, and then call the model “buy” from “store” model with the argument “13”
IgnitedRecord Upload Behavior
IgnitedRecord is an ORM library for the CodeIgniter PHP framework. IgnitedRecord includes the ability to associate models with behavors, a la Ruby on Rails. I wrote an upload behavior that allows for uploading, updating and syncronizing database file data in your tables without writting any additional code.
For example, you can configure the behavor to always watch for file data uploaded from an input with name "gallery_photo." Everytime a row from that table is saved or updated, and the script sees and upload from a file input with name "gallery_photo", the behavior will upload the file for you, make sure its named appropriatly, look to see if your table has any related fields (eg 'file_type', 'image_width', 'file_name' etc), and if so populate them with the appropriate data for the uploaded file. All that is for free!
Note that the behavior isn't perfect. Because of limitations in the IgnitedRecord library, the behavior does not reliably delete files from on the filesystem on deleting a row from the database. Coming additions to IgnitedRecord promise to make this improvement possible.
jQuery imageScale Plugin
imageScale is a simple plugin for jQuery that will resize a collection of images to be no bigger, or no smaller, than a given height and width. Images are then resized in proportion to match the new sizes. The plugin also accepts only passing a single height or width, in which case the plugin will only resize in that direction.
Its not very complex, but it makes doing a common, repetitive task effortless.
Metacity-Setup
Metacity-Setup was a small program that allows the user to easily configure some settings of the Metacity window manager. It was written in C and used gConf to change Metacity's settings. By the time development of the program ended, its features included allowing the user to install and change themes, change the display font, switch how the window manager focused windows and set the number of workspaces.
Tools that allow users to configure Metacity are now a standard part of the GNOME2 desktop. When Metacity first came out though, GNOME was still using Sawfish as its default window manager. Users looking to try Metacity had to use cryptic commands like the following to configure the window manager:
gconftool-2 --direct --config-source xml:readwrite:/etc/gconf/gconf.xml.mandatory
--type int
--set /apps/metacity/general/num_workspaces integer
Metacity-Setup provided users had a simple, point-and-click interface to make the same changes.
Metacity-Setup became a moderate hit and was adopted by several major distributions, including Mandriva, Gentoo, Slackware, Debian, and even Fink, the Mac OSX package manager. Other programmers contributed patches to add functionality.
Thankfully, there is no more need for Metacity-Setup. Comparable tools are now included with the basic GNOME desktop, making my third-part solution redundant. However, the program still remains a useful tool for those looking to run the Metacity window manager without having to install the rest of the GNOME desktop.
Here are some screenshots of the program (an early verison and a later version) and the final published version of the code.
Pigeon CD Recorder
Pigeon was a CD recording program I wrote for Linux. It was written in C and aimed at integrating with the GNOME2 desktop environment. When the program first came out, it incorporated several technologies that were just beginning to reach wide use among Linux programmers.
To the best of my knowledge, Pigeon was the first released CD recording program for the GNOME2 desktop. It used many of the desktop's technologies, which allowed it to integrate nicely. Pigeon used an early version (0.6) of the gStreamer libraries to decode audio files. In addition to recording music files to CD, this allowed Pigeon to record the audio of certain movies to a CD, a feature I believe is unique to the program.
Pigeon was a well behaved GNOME2 citizen. It used the project's then newish technologies like gConf and GTK2 widget set for layout. Alas, and thankfully, more recent programs have taken Pigeon's place for linux CD recording.
Here are some images of the program (versions 0.2, 0.3 and 0.4) and the last verison of the code.
Pear Spreadsheet_Excel_Writer Package
Pear's Spreadsheet_Excel_Writer Package allows PHP programmers to easily render data in an Excel file that visitors can download. I've used to package for several sites that wanted an convenient way to send data to their users.
While encorporating that functionality into a site I came across a bug in the 0.9.1 release. The package tests to see if the server has write permissions to the server's temporary directory. There is then code in place to either write to the temporary directory if possible, or to keep the relevant data in the server's memory if not. However, the package's Workbook class was not consistantly keeping track of where the package should be storing data, which resulted in several ugly but non-fatal errors when creating spreadsheets. I submited a patch to the package maintainer to correct this problem.
TableSorter jQuery Plugin
TableSorter is a plugin for the jQuery javascript framework. It provides an elegant way to sort tabular data in an attractive and quick manner. I've used it in a number of sites for clients. Version 2.0.2 introduced the ability to automatically detect that a table column included numbers with digits in them, and to sort accordingly. So, for example, it would know that the number 9.23 was less than the number 92.3.
However, the auto-detect feature was broken because of a problem in the regular expression used to detect the column's datatype. I submited a fix to the problem which the author approved of, and which will likely be included in the next published version of the script.