Monthly Archives: December 2007

PHP-CGI improvement

Theoretically, PHP-CGI processes on security level 1 sites should be faster now. I’ve put PHP in a tmpfs file system. It loads from RAM/Virtual Memory instead of from the hard drive, so page loads should come a couple milliseconds faster. I’ve also compressed the executables so they take up less of this tmpfs system.

Ad Order Entry 2Ad Order Entry

One of the largest projects I’ve ever undertaken, an advertising order entry system that expanded into a full-on production management system for my current employer.  Most of it’s features center on print advertising, but it has insert tracking as well as online ad functionality.  At the time of writing AOE2 is being retired soon, but it’s among the projects I feel the most proud of as I was its principal author. Constructed with a mess of custom and 3rd-party modules atop Drupal 6.

A list of general functions it provides:

  • Integrated with billing system through the use of feed exports.
  • Automating repetitive ad production processes.
  • Facilitates workflow with automatic emails and notifications. Such as ad proof notifications and reminders when some action is needed. With the aide of a 3rd party solution, it can even call a customer when their proof is ready.
  • Provides production reporting, such as what ads are ready to be plated.
  • Integrated local scripts provide additional functionality.


Ad Tracking Screenshot

Ad tracking display, edited for confidentiality

Preprint Tracking

Preprint Tracking Screen, edited for confidentiality

Publishing Pages Display

Publishing pages display showing all ad positions currently ready.

PDF GeneratorsPDF Generators

I’ve written several PDF generator projects, using both TCPDF and an rsvg tool called svg2pdf.  I didn’t feel each one warranted it’s own project entry here though, so they’ll be aggregated here until such time I actually manage to get my academic worksheet generator to minimum viable product status.  In which case the worksheet generator will have it’s own project entry.

Advertising Contract Generator

This project collects contact information; additional terms and conditions; and advertising rate settings. It then produces a printable, multipage contract with rates and conditions included.  After it was developed, it was subsequently integrated with Ad Order Entry.  This uses the mentioned SVG to PDF conversion with PDFtk to join the individual pages.

The information collection form.

The information collection form.

Heading of a contact created by the generator.

Heading of a contact created by the generator.

Print Listings Generator

The listings generator creates multiple single-page PDFs that can be laid out in InDesign.  It actually has several different listing types, but they’re all pretty similar.  It uses a grid layout and allows for reserving spaces for standard ad placements.  Premium listings typically include a photo and some more prominent sizing and styling.  This project now uses TCPDF because TCPDF is capable of specifying colors in CMYK colorspace, so text uses only black ink and other colors can be limited to fewer plates.  This is important with an old offset printing press as RGB black becomes a mixture of all four ink colors in print, and can make fine text completely unreadable if the plates don’t match up perfectly.  The listings generator is written in PHP on CakePHP 1.3.

Pizzeria Fondi Listing

This advertising proof shows the difference between a standard listing and a premium listing created for dining.



Supercell Screenshot

Ah Supercell, the first Ludum Dare jam I ever participated in. This little game was lovingly crafted in C with the help of the SDL libraries. Collaborating to write a game in C with source control was certainly a learning experience, but it was all kinds of fun.  I also worked to make the ports to other operating systems, though I’m pretty sure the Mac OSX version only runs on specific versions of Mac OSX.  This project once again reminded me that it’s important to initialize chunks of memory that get allocated.

Ludum Dare page: