In the late 1980's I started hacking BASIC on the Commodore 64, then on the IBM 286xt, BBS-ing, PovRay / PolyRay raytracing, and then HTML in 1994. This evolved into an array of projects, some of the coolest and most interesting are contained within. My hacking spectrum spans from scripting Photoshop to large-scale browser automation, client/server performance to rice-rocketing linux kernels.
Systems I have built have reached billions of users, and have processed ~1 trillion signals. Some of my best work has gone to the bottom of the ocean on crashed airplanes, or you may have interacted with it to buy things online or rent skis at a resort.
I love public speaking because it is challenging and does not come naturally to me. Over the years I've hosted roughly 100 meetups in San Francisco and LA centered around tech and entepreneuership, and have taken titles like "Socially Capable Geek", and "Geek Whisperer". As I became more ensconced with startup life, entrepreneuerial meetups became difficult so thought leadership through blog posts and public speaking became the better choice. I have highlighted some of these blogs and technical talks within this portfolio.
Currently, I'm focusing on engineering organizational transformation by scaling up systems, people, and processes. When there's time, I'm working with my architects proving new concepts and hacking the full spectrum from Apache Spark to D3.js. These activities are punctuated with serving as Camp Counselor, and Armchair Psychologist to my engineering org.
My obesession is with optimizing performance; wherever the gap may exist: individual contributor, team, org, client, server, device, etc... I'm a big fan of: test-driven-develoment, Readme-driven documentation, product and engineering management joined at the hip, and human-factors as they relate to user experience and organizational development.
My role at VideoAmp as technical co-founder has colloquially been "Fire Chief of Technology, and Lead Arsonist". It's my responsibility to keep the lights on, AND to spawn innovation.
I enjoy R&D, proving new concepts, plugging complex systems together, inspiring my fellow Hackers to self-organize and deliver BIG things, and put the best people in the right places.
It is my goal to build an environment where engineers have the opportunity to do the best work of their lives, and to be worth more in the marketplace during and after their time with the Company.
Along with programming & systems engineering I ❤ snowboarding, snowboarding, snowboarding, drumming, and the occasional glass of wine. I'm now based in Austin, TX.
HTML / XML / Javascript / jQuery / extJS
Shopping Mannequin 2007-2012
This shopping assistant was written in php/memcache/json and jquery and allows customers to dial in their dimensions, and then see a list of compatible products. The most often quesiton for snowboards-for-sale.com is regarding size, so we took the fitment information from all of our manufacturers and developed our own size compatibility that drives customers to the right products immediately.
Web-Based Live Chat for CSRs 2009
snowboards-for-sale.com provides live chat services to its customers with this browser-baseed live chat. The chat program runs over http and is visible to a wide range of customers.
Using jQuery on the client, and a php library implementing an XMPP client, this program logs all chats and binds them up to customer records in the company's CRM.
Marcros are embedded to send customers expanded faq's/instructions, and to send customers embeded images and hyperlinks.
Automatic CSS Sprite Generator 2010
Generates CSS sprites for large grid views of many products. Allows for very fast page loading time and saves tons of HTTP transactions, and makes our yslow score approach 100!
All images for a category are loaded, measured, and combined into a single large image with libGD and php. The dimensions and offsets for these images are recorded into a css file. For fast retrival, both assets are cached until images in the given category are changed.
Product "Registry Editor" 2005
Small, light-weight and client side transactional product edit tool. Allows client to stage multiple add/edit/delete operations at various levels within the product, then committing the changes with a single "Save" operation. The design of this tool enabled an associate to craft new business rules on the fly because they could create key-value pairs. On the programming side, an XML data structure exists that contains the key/value pairs. A programmer can then tie into the data structure to implement product-specific features.
Dynamic Order form 2004
An order form that auto-totals on the client-side with Javascript. The goal was to create an order form that gives the dealer an idea of their order before placing the order. This needed to be done without excessive technology, and in a format that could be easlily updated by a sales associate. The file is then emailed to the sales associate, and is imported into the accounting system as a sales quote.
Stored Query Builder 2004
This component allows you to build a custom query against a contact management database. This is very similar to the advanced search feature of many search engines. Using logical operators and sets of relational operators, the user of this tool can quickly construct a customized query.
Technologies involved in this project include client-side JavaScript objects, client and server-side XML, dynamic HTML & ASP, and COM+ on the server-side. As with the ACL manager, this component sends client-side XML to the server where it is disassembled with the MSXML parser.
Call Policy Manager 2003
This tool allows you to set call policies for a phone account. The concept is similar to allow/deny rules on a firewall.
The benefit of call policies on a toll-free number is that you can restrict excessive charges due to accidental / rogue
callers, i.e. an insistent telemarketer auto-dialer that calls you every day at dinner time.
Sample policy
Allow all calls
Deny from (213)
Allow from (213) 874
Deny from (213) 874-3214
Dynamic Form Builder 2001
A set of tools that allows a client to build custom forms for their online contact manager. The fields of a given form map to
fields in the contact manager. These forms are embedded in websites and are posted to the system containing the contact
manager. A hierarchical series of COM+ objects reflects the HTML implementation of <form> objects. These objects
build client-side JavaScript and HTML to represent a given form.
The most challenging aspect of this project was building an engine that dynamically creates
a client-side sanity checker using regular expressions.
ACL Manager 2001
NOTE: This was designed/developed pre-AJAX in 2001
The Access Control List manager allows the granting of data access permissions for users and user groups. This component tool features client-side JavaScript that builds a hierarchical XML string that represents the data-structure in an efficient manner. You will notice that when you click "Submit," the XML string will appear as an alert box. On the server-side (not demonstrated here), an XML parser library is used to serialize the XML string back into the necessary COM+ component method invocations.
Data-Bound Spreadsheet 2001
NOTE: This was designed/developed pre-AJAX!
A data-bound client-side spreadsheet. This simulates the experience of using Excel within any web browser that supports Javascript and DHTML. The changes to any cell are broadcast back to the server, and result in immediate updates to the database. Also, the UP/DOWN arrow keys toggle between rows. This is a fast, lightweight UI widget that can handle up to ~500 rows of data. For larger data sets, the cousin component
JXTable can be used which is written in Java and can safely handle tens of thousands of rows. Written circa 2001.
Java / Swing / XML
JXTree 2001-2005
A Java XML tree control built with Swing components and the JAXP API for XML processing. This project was conceived long before the rise of AJAX, and long before the slow and perceptual death of Java in the Desktop GUI. The tree provides many usable features such as context-sensitive right-click popup menus, drag-and-drop tree nodes, auto-scrolling drag operations, remote sub-trees in the form of XML, and drag-and-drop file uploads directly from the desktop. This component also uses XSD to validate the XML data structures as they are fetched from the network.
This client-side component is perfect for displaying hierarchically arranged data structures. This tree is user friendly, similar to Windows Explorer or the MacOS finder.
The JXTree control is the perfect widget for large application-based websites because it reduces the number of web pages required to complete an operation and it preserves state without successive page reloads.
This component, like its cousin JXTable, only requires knowledge of XML to use. Optionally, you can use XSDs on the server to validate the XML before it is retrieved by the client-side applet.
JXTable 2001-2005
This is the cousin component to JXTree and also uses Java 2, Swing and JAXP. The listview is the perfect tool for presenting large amounts of columnar data. This component provides intuitive usability similar to many desktop applications by implementing context-sensitive rightClick menus, singleClick / doubleClick / onChange events, and drag-and-drop operations compatable with the JXTree component.
Technologies for this component include XML, XPath, XSD and XSL. The transport from server to client is XML. The table's model is represented by XML. XSL is used to sort each column in ascending / descending order. XSD is used to validate the data during development and can optionally be disabled in production to enhance performance. Background threads work to load large data sets into the table's model. When the component receives events, XPath is used to retrieve data from the model layer.
Tree + Table
Drag-n-Drop File Upload Widget 2002
This tool allows you to drop one or more files from your desktop or filesystem directly onto the drop target. The file(s) are then uploaded to the server. Callback functions in Javascript are invoked upon success or failure of the transaction. The upload target is written with Java, and interfaces with Javascript. The image shown, the background color of the applet, and the callback functions are defined with applet parameters.
Java Screen-Pop Applet 2006
Used for the snowboards-for-sale.com backend toolkit, this applet pops up a window via Javascript when a phone call comes to the toll free number (888-777-7212) from the Earnware telephony system. When a call comes in, a custom call-flow menu is requested over HTTP from the Earnware telephony server to the snowboards-for-sale.com web server. This request calls a php script and performs an insert into the s4s call log and writes the unique id to a port on the servers localhost. The s4s support agent who is currently logged in tunnels a port over SSH from their desktop to this port on the server. The applet sits in the support agent's backend user interface and listens on this port. When a uniqueid is passed over the port, the applet will then launch a window containing the new call log record. The notes field is automatically focused, and the callerid and location of the caller is presented in the call window.
View Source Code
Java NNTP Reader 1998
Before there were file-sharing networks, there were the newsgroups and the NNTP protocol. I built a command-line multi-threaded NNTP client that reads specified newsgroups and compares message headers against a regular expression "wish list." Headers with that match are flagged for download and a separate thread downloads and reassembles multi-page attachments.
This project was a valuable experiment with JDBC, sockets, regular expressions, multi-part MIME attachments, while learning the NNTP protocol.
PHP / MySQL
Linux-based In Flight Entertainment Systems : Thales Avionics 2009 to 2011
Developer/Systems Engineer & technical lead for in-flight entertainment systems written in XHTML / Javascript/ jQuery / php / mysql. Working within the boundaries of older client/server hardware and long useful life cycles, this project stretches the envelope of performance due to limitations of processor, disk, ram and network resources.
Responsible for optimizing performance of existing "flying" applications with a range of techniques, such as a "thick-client" architecture in Javascript, client-side & server-side caching, php profiling, and sql optimization. Other areas included: system integrations and bash shell scripting, mysql database administration, php middleware & integration (and troubleshooting) of the client's c/php middleware, acting advisor and developer to 3rd party apps, and helped fix poorly-performing legacy applications.
Snow Valley Ski Resort Rental Management System: 2010
Developed the resort's specialty kiosk-based ❉ ski rental management software ❉ to optimize the resort's rental shop workflow and management procedures. Pieces of this project included a welcome-kiosk where customers would checkin and receive a printed hard-copy of their information with a barcode, which they would bring to a Ski/Snowboard technician. The tech would use custom user-interface and a barcode scanner to check-out merchandise taged to their barcoded information form. At the end of the day, the shop manager would run a report to see any merchandise which did not return, and have information available to contact the customer and/or charge them for lost or stolen equipment. Project was built on top of Ubuntu running Chrome in Kiosk mode, with OpenVPN, php, and mysql.
snowboards-for-sale.com 1998 to 2011
snowboards-for-sale.com was a specialty online snowboard shop powered by LAMP and open source technologies. The company delivered stellar customer service and an amazing selection of snowboarding accessories at very competitive prices.
The shop used technology to provide a spectrum of services to fully support the customer selection experience, procurement, fullfillment and CRM functions.
On the customer-facing side a shopping mannequin aids the customer in their selections; based on body measurements, also Live Chat connects customers to CSRs in their local IM. On the backend, a robust and custom-built CRM platform the company by providing functionality for sales reporting, SEO console, product management, customer-service, and order lifecycle management functions. 100% of the company's functions are built in-house.
The site is integrated with the XML APIs provided by UPS, USPS, Endicia, and Google. A custom SEO console called "
positionator" is used to track placements linking to snowboards-for-sale.com from Google, Yahoo and Bing; the main revenue generators for the site. Numerous reports exist to track sales trends, web surfing habits, and search engine positions.
Read More
The backend area of our site is a perpetual work in progress because we are constantly optimizing our business process. Some of the optimizations in our backend engine that have saved us hundreds of man-hours include:
- Conversion Tracking from all search engines and affiliates.
- A realtime log viewer that uses the bash shell, tail and awk. Allows us to watch customers, hijack into pending orders, and to trackback to referring URLs in real-time.
- Product availability monitoring and accounts payable monitor with the Burton 'BIN' web-based SAP interface.
- Automated merchandise return processing employing barcoding and bluetooth laser scanners.
- Integration with UPS, FedEX, Endicia, and USPS XML APIs to provide accurate shipping costs and order tracking information for our customers.
- One-click shipping with UPS which allows us to efficiently process hundreds of packages per day in the peak season.
- Automatic production of website images, given a URL to the hi-res version. Image is downloaded, a bounding box is automatically calculated to strip all surrounding whitespace, and a 'magic wand' snips out the remaining white, then a thumbnail and large size is saved as Gif89a. This feature alone saves us hundreds of hours in Photoshop per year.
- Custom position tracking for thousands of URLs on Google, Yahoo, Bing. Reports of 'movers and shakers' and historical positional data for every query. This data is seen below.
- Tight integration with the Earnware Telephony API. Allows us to 'screen pop' our customer records before we answer the phone, and see where our caller is calling from. All calls are recorded and and synchronized over to our system, attached to customer records, and archived in .wav format.
- Cubic volume calculator for our inventory in order to organize and plan for incoming shipments.
- A vehicle configurator for snowboard racks built from the manufacturer's CSV data. Allows us to recommend rack attachments for a given vehicle.
- Geographical sales reports and customer overviews with GoogleMaps API integration. Allows the company to view market share by region, product types by state, and geographic/seasonal patterns.
Positionator, SEO Radar 2001 to 2008
Positionator is a web-based position tracking software designed to track a portfolio of organic positions online. It was conceived and built in 2001 for snowboards-for-sale.com, and has been modified and maintained to date. Positionator tracks a list of terms on Google, Yahoo, and MSN daily. Reports are created around this data which show trends and movement on each respective search engine. Additionally it provides a historic context to how long many of the positions have been in the portfolio.
Positionator also reports on many types of interesting statistics such as movement of terms, rank of competitors, and market share of sub-segments. A geographically distributed set of agents run continously to record and aggregate data based on a client's wish-list of terms to track. These are centralized in a single reporting server which aggregates and reports on a frequent basis.
Kiwi Motorcycle's Catalog 1998 & 2006
Kiwi Mike is a world leader in reproduction motorcycle parts for Indians and winner of many bike building accolades; including Sturgis 2006. As a company Kiwi Motorcycles specializes in building custom Indian Motorcycles, servicing and repairing existing motorcycles, and selling parts.
The Kiwi Motorcycles catalog contains over 40,000 specialized parts and accessories for Harley Davidson and Indian Motorcycles. The site interfaces with an outside B2B system which manages product availability, time in transit, and order procurement functions.
The front-end site involves wrapping or spidering the product content off of the distributor's web site, processing that with DOM+XPath in php and then persisting it to mysql. Categories and product relationships are maintained by slowly and continually spidering the source website for content updates.
Project taken over and modified by CSU San Bernadino in Fall 2008
autos.nytimes.com 2003-2005
Served as primary architect and developer-lead for the Automotive Classifieds platform provided by Adicio (FKA Careercast) to the New York Times Online, San Diego Union Tribune, and Orange County Register. Complicated aspects of the project included feed processing from various data sources including print and web, fuzzy make/model matching against an industry-specific database, developing an Object Oriented PHP API to support lifecycle methods for posting and management, implementation of advanced SQL techniques to facilitate an intelligent vehicle search with MySQL 4.1. The project was on tight deadlines as the initial clients needed to terminate existing contracts with other vendors on a drop-dead date. Work happened over the summer of 2004 and the site launched in September of 2004. Adicio now hosts many newspaper clients on this platform and provides one of the industry's leading turnkey print-to-web automotive classifieds solution.
I returned to the company in the Spring of 2006 for a 3-month contract. Projects involved integrating GoogleMaps API 2.0 and several industry-standard photo API's for automotive user interfaces which powered two "Automotive Configurator" and "Automotive Comparator" applications. GoogleMaps tool attached to region-based searches and pin-pointed the results on a map.
NOTE: In Q1 2007 The New York Times switched their automotive platform to another provider.
superbuytires.com 2000 to 2009
A leader in wheels and tires on the web, SuperBuyTires is rated in the top 15-20,000 websites in terms of traffic and popularity. This site achieves millions of page-views per day in the peak season. Though the site is already well known among car dealers and wheel enthusiasts, it also holds key search-engine placement due to careful formatting and word-smithing. SuperBuyTires attributes over 95% of its sales to their website, and by extension the website's placement on Google, Froogle, Yahoo and Msn.
A customized content publishing system was built to handle large amounts of data-entry in Excel. Bulk updates happen on a daily basis for price changes, and a web-based admin console exists for data corrections, customized reporting, and management of dealers and affiliates. This web admin is built with JX a Java XML UI library I began in 2002. The site is built in PHP / MySQL, XML+XSLT and hosted on Apache in Linux.
The e-commerce aspect of this site is integrated with the MAS500 accounting package by Best Software. Orders are syncronized from the website to MAS500. Syncronization of the SKUs from MAS500 to the webserver happens on a periodic basis.
Dave's List 2006 to present
Craig's List is a great site for php contractors like myself. There are lots of great LAMP contracting opportunities available. The problem is that the jobs are spread across 3 categories on the site: 'eng', 'sof' and 'web'. On top of that, I am equidistant between Los Angeles, Orange & San Diego Counties. So rather than reading 9 different pages from Craig's List, and another 5 from Monster, "Dave's List" reads and aggregates all of the RSS feeds representing categories on the Los Angeles, Orange County and San Diego sites. It brings them into one document, sorts each post by date, and removes cross-postings; all in about 130 lines of code.
In addition to Craig's List the aggregator also pulls from other job sites like Monster that offer RSS/RDF feeds. Because the data changes periodically, a conditional GET (HTTP 304 NOT MODIFIED) mechanism was built to save time fetching the feeds.
Project was done in 45 minutes and uses php, RSS, and XSLT.
tinycrud 2003 to 2009
Tinycrud is a w3c-based ORM framework for php/mysql employing XSLT, XPath, XSD, and DOM to generate mysql stored procedures and php classes.
tinycrud is designed to bootstrap the repetitive tasks in building an object-oriented php application by creating default lifecycle functions, including html forms, php classes and mysql stored procedures.
ASP / COM+ / SQL Server
efastparts.com 1998-2000
A manufacturer-direct ecommerce site for a variety of producers of after market automotive parts. Interesting technologies included incorporating an industry-standard automotive database to provide a hierarchical listing of all makes, models and years of vehicles. This database was also used to maintain a compatibility index for parts to cars. Other technologies included the integration of EDI into the participating members manufacturing sites. This interchange allowed members to more accurately predict the demand of products on a real-time basis.
enjoythedrive.com 1998-2000
An automotive info-tainment web site developed for SEMA, this site features thousands of articles and glossary terms that are
cross-linked
together. Designed to increase consumer awareness in after market parts for automobiles, this site provides users with information
about a variety of different topics. Also, a very large database of products and manufacturers allows the user to find SEMA members.
A weighted search engine makes it easy to find relevant articles, manufacturers and glossary terms quickly.
This site also features targeted advertisement banners. I developed ad server application to tag collections of banners to
relevant pages based upon keyword matches and page groups. Using a campaign-based metaphor similar to the print publication
industry, sales agents use a robust backend to tag banners to campaigns. The campaigns are then staged and committed when
payment is received.
Other interesting projects included web applications such as a dynamic calendar of events, a "customize your ride" interface that
uses dynamic image composition on the server-side, a weighted search engine that incorporates rule-sets and scoring based
upon SQL full-text indexing, and an "Ask the Experts Forum."
ralphs.com 1998-2000
Ralphs.com, the web presence of Ralphs Grocery Company, was a high-profile account of our agency circa 1998. It was my duty to administrate web and database servers and to oversee the programming team in development of the site. Some interesting applications that I developed included an admin console for publishing weekly coupons, a database-driven store locater, recipes online, several pilot ecommerce projects, an advertisement placement backend, and many weekly/monthly promotions.
Responsibilities for the Ralphs account included estimating design and programming projects and interfacing with Ralphs' agency and top company executives with regard to campaigns & promotions.
csuchico.edu / videomaker.com 1994-1998
"Webmaster" for College of Communication's website.
Studied with an emphasis in Human Computer Interaction, Web Design and Alternative User Interface technologies. Independent study in 3D User Interfaces, HTML and web based Content Management Systems.
A-student in CSI Animation courses on the Silicon Graphics Indy workstation and Onyx render farm running Alias Wavefront. Beta-user for Sense8 Software's "WorldUP" 3D User-Interface IDE used for designing simulation systems.
"Webmaster" for Videomaker magazine building automated web publication systems for magazine content. Designed and built an ad-management platform in Cold Fusion and SQL Server.