Projects

Our past projects cover a diverse range of technologies and markets, but many have involved web-based technologies, such as web services and AJAX front-ends, which were used for business process automation, for things like affiliate marketing or complex order workflow management. We’ve also done numerous projects in the area of data processing, including using map-reduce parallel processing on distributed grid computing.

We’ve worked for clients located throughout the United States, with a majority located in California, but we have extensive experience with distributed development teams, and refined communication systems to make this run smoothly, so we can accommodate clients located anywhere in the world.

You can read about some of our past projects below, or see the list of technologies we’ve worked with before.

Select Projects

  • Build a new Perl application
    • CIDC - web service to collect affiliate sales data
    • Ticketmaster - web-based workflow application
  • Startup development
    • Solfo - web-based account management application
  • Maintain your legacy Perl application
    • Shopzilla - migration of their merchant-facing portal; enhanced and stabilized a legacy data feed processing application

CIDC

CIDC needed a web service back-end that would collect user account and marketing data from sales affiliates of their online gaming service. We delivered to them a web service, built on Apache, Plack, and Dancer, which interfaced to their Informix database storage via RoseDB ORM. We also delivered a sample client application, to help their affiliates integrate with the new service, and during the course of the project, a framework comparison report, along with architecture, API, and other documentation.

We implemented the web service using an MVC web framework (Dancer). Some may consider this unorthodox, but the MVC architecture is ideal for web services, especially the “controller” portion, which makes it easy to define and route web-service calls to the corresponding business logic.

One of the challenges was supporting multiple encoding formats. The RPC messages needed to support data serialized as either XML or JSON, so the business logic needed to be agnostic to—and decoupled from—the encoding format used for the RPC messages. We created a custom Dancer plug-in based on RPC::XML (which implements the XML-RPC protocol), but designed the plug-in so that it could be extended to support any other RPC protocol (like JSON-RPC), and so that it did not depend on how the web-service requests were routed or processed.

Another challenge was creating a data validation framework, built on Moose objects and Data::Domain validation rules, that permitted setting validation rules for a data object’s fields in the same place as the fields’ other metadata. Frequently, data validation rules are defined in a separate module from the fields themselves, even though the two work closely together and thus ought to be coded closely together. With this validation framework, as the data objects changed over the life of the project, they only needed to be updated in one location, and it would be clear to future developers reading the code how the field validation interacted with the rest of the data-object structure.

We also had to contend with the problem of handling arbitrarily large quantities of data transmitted via RPC. We addressed this issue by designing the API such that large numbers of data records would be split into batches of 10,000 or fewer records, but permitted a client to submit an arbitrary number of batches. We also optimized the storage layer (RoseDB) to perform database record insertions in batches.

Like many projects, this project made extensive use of CPAN modules, which in addition to the previously mentioned modules, included Moose::Role, XML::LibXML, Test::Class, Test::Pod, Test::Pod::Coverage, Test::More, Test::Deep, and Test::Exception.


Ticketmaster

Ticketmaster was developing a web-based workflow application to coordinate events and ticket sales between numerous stakeholders. The application used a Perl back-end (Combust MVC framework) on top of MySQL via Class::DBI ORM, and on the front-end, a substantial (10K LOC) client-side application, built on a custom JavaScript/AJAX framework. Ticketmaster's in-house developers prototyped the front-end for this project, but turned the final implementation of the full system over to an outside team that included us.

While not a legacy project, by the time we started working on it, the codebase was showing signs of technical debt. So we took steps to improve software quality while continuing to deliver new features. We extensively refactored both the back-end and front-end code bases, making heavy use of unit testing (using Test::Class and the prove test runner) for the back-end code, and performed coverage analysis. We created test fixtures for some of the project's web service methods (using LWP) that wrapped problematic database queries so they could be benchmarked and optimized. We worked with a QA engineer supplied by the client, and provided oversight on the QA process, such as "smoke testing" checklists, and writing test cases. We also assisted with UI testing automation using Selenium, and tracking test cases in Test Link.

This project used a number of other CPAN modules as well, including SOAP::Lite, JSON, Date::Parse, Text::CSV, Gearman, Test::More, and Test::MockObjects.


Solfo (YellowBot)

For Solfo, a startup providing a web-based yellow pages directory (YellowBot), we worked on their advertiser account management application, which used a Perl back-end (RoseDB, Combust) on top of MySQL, with the ExtJS AJAX framework as the front-end. As part of that work we expanded the unit test infrastructure to use Test::Class and created pure unit tests with Test::MockObject. We also created unit tests for the JavaScript UI code that executed on the development server using the Seamonkey JavaScript engine wrapped by a Perl module, and driven using the same Test::Class/prove unit test framework used for the Perl code.


Shopzilla

Shopzilla runs an e-commerce search engine, and we helped with several Perl-related projects:

We assisted them with the migration of their merchant-facing portal (mod_perl, Apache::XPP, XML::LibXML, Test::Class, Sybase) used by merchants to bid on advertising, report on advertising performance (ROI tracking), and respond to customer reviews. They were migrating the portal to a new platform. This included implementing numerous REST and SOAP web service clients, and enhancing code to handle UTF-8 and other character encodings as part of localization work.

We substantially enhanced and stabilized a legacy tool used to process product feeds for affiliate publishers (part of Shopzilla's affiliate marketing program). This tool processes many gigabytes of data per day, uses a map-reduce parallel processing architecture, and runs on a cluster of machines. It sourced data from web services (REST), files, and Sybase, and output XML via XML::LibXML.

Also, for an earlier stage in Shopzilla’s data feed, we performed similar migrations to use more modern web services instead of direct database or flat-file data sources, and we implemented a typical legacy application enhancement: expansion of an ID field to use a larger data type to avoid running out of digits.


Hire The Perl Shop to tackle your Perl development challenges.