Web design and software portfolio
See the following pages for examples of past projects. I specialise in...
- Liquid layout and responsive design. I figure your site should work with whatever window and font sizes the user chooses and on all devices.
- Supporting all currently maintained web browsers.
- W3C Standards compliance. I am reluctant to use proprietary extensions or plugins. Proprietary features are prone to obsolescence, can have poor usability and integration with the rest of the web page, and may not be available on all platforms. See this Wikipedia article for more information.
- Frameworks: Qt, Django
- Content Management Systems: Drupal, Plone, Joomla
- Databases: PostgreSQL, MySQL, SQLite
- Apache web server configuration
- Linux system administration, configuration and system programming.
GIY Green It Yourself 🔗
GIY Green It Yourself is a site devoted to helping people save energy and reduce waste in their everyday lives. Most of its content is in the form of instructional videos and accompanying text, but it also has a blog and newsletter subscription.I built this site in Drupal, based on a graphic design supplied as mockup images. This is the first site I've done since the Australian Cyclist system where I've worked with an external graphic designer. This involved a degree of "going with the flow" on my part when deriving the user interaction design, but I think the result is good - and the client is happy too!
Flying Furniture Cycles 🔗
In order to simplify the store owner's task of updating stock levels and prices, I developed a Drupal module that allows the stock data to be exported to comma-separated values files, manipulated with a spreadsheet, then imported back into the store. I've subsequently contributed this module to the Ubercart contributed modules repository, where it seems to have been quite well received.
While Ubercart provides a fairly comprehensive shopping cart system, many of the high-value products in this store are ordered from the manufacturer or distributor on demand, so I developed a product inquiry system for these cases. Any stock that isn't marked as "active" has its "add to cart" button replaced by an inquiry form that requests the customers contact details. Those details, along with the customer's product option selections and price information are saved as a product-inquiry webform and emailed to the store owner for further action.
XY Online 🔗
XY online is a pro-feminist website focused on men, masculinities, and gender politics.
They wanted an easily maintainable and flexible website with a distinctive new look to replace an existing static site that was falling into disrepair.
I used Drupal as the content management system and designed the theme and the new logo using Inkscape. The web page background has a top-to-bottom as well as left-to-right gradient that scales to arbitrarily large window sizes without using any large background images.
Drupal is a very good content management system. It's written in PHP, which means it can be hosted under most hosting plans.
National Computational Infrastructure 🔗
For the National Computational Infrastructure I used Plone as the CMS. I designed the logo and artwork around the orange spiral (on the right above) which was the dominant feature of NCI's predecessor's logo.
The banner occupies the entire width of the browser window, with the thick part of the curved orange underline extending as required. The image on the left of the page is an upturned Alpha CPU.
NCI provides high-performance scientific computing resources trough its National Facility. I adapted the NCI artwork for the National Facility web pages, which are a mixture of static, PHP and Python generated pages.
Plone is probably the best engineered CMSs, but its hosting requirements are greater than those of Drupal and Joomla, and the learning curve for theme developers is steeper.
Australian Cyclist 🔗
Before the days of good open-source content management systems, I wrote one from scratch for Australian Cyclist magazine. In this case the graphic design for the public pages was done by frenchc u r v e. At the time (2003), the closest thing to an open-source CMS that was available was phpnuke, and it became fairly clear to me that it would be more work to adapt phpnuke than it would be to write a CMS from scratch.
The system had a number of unique features, but probably the most notable was the authentication system. Like many CMSs, this one used MySQL as its database, but instead of storing the database password in a configuration file on the web server (like most CMSs do), I invented a better system. I set up 2 database users. The first was for anonymous read-only access, and was used when people browsed the site. The other was the read-write password to be used by content editors. Each content editor had their own username and password, and this information was kept in a "users" table. The trick here was that the value stored in the password field was actually the database read-write password encrypted by a hash of the editor's password. To log in, an editor entered their username and password, and the system would look up the user using the read-only database password, and attempt to decrypt the read-write password using the typed password. If the decryption was successful, the user was allowed access to the editors' interface - all without storing a plaintext database password anywhere. The decrypted read-write password was then re-encrypted using session-specific random data and stored in a browser cookie.
PBS job table 🔗
This is something I wrote in my day job at the NCI National Facility. It displays the layout of jobs (computing tasks) running on a supercomputer cluster, and uses AJAX techniques to allow the user to inspect the performance of individual jobs.
This system is written in Python, using bindings to the PBS batch system API, and uses the Mochikit AJAX toolkit. It requires no per-cluster configuration, and uses RESTful URLs to specify the cluster of interest.
Open-source contributionsHere are some of my contributions to open-source software over the years:
- Contributed the Stock & Price CSV Updater 2 module for the Ubercart shopping cart system.
- Fixed a bug in the nss_ldap name-service library that was causing applications to hang.
verify_forkin PubCookie, a website authentication system.
- Fixed a bug that was crashing procps , one of the standard system utilities under GNU/Linux.
- Added some enhancements to cURL , a widely used command-line utility for retrieving web pages.
- Fixed a bug in the GRASS GIS digitizer code that was stopping it from working under Solaris 2.x
- nfrcp, a souped-up version of the traditional unix
rcpcommand. It uses a multithreaded, double-buffered reader and writer to speed up file copies, and can maintain a database of checksums so that file corruption can be detected. For more details, see the manual page.
License Shadowing Daemon, a mechanism for controlling the
scheduling of jobs on a supercomputer cluster when application software
licenses are involved.
LSD consists of a server process (the daemon) and a client-side library. The daemon maintains the state of the system and communicates with the job schedulers and license servers. It also has a built in web server so its state can be easily inspected. The client side library is called by the job schedulers to communicate with the daemon. For more details, see the manual page or the slides from a presentation I gave during development.
Mancini. Mancini is designed to handle the administration of users and projects for organisations that provide access to large-scale computational and data-storage resources for a large user community.
Mancini is written in Python, using the Django web-application framework, and consists of
A web application, served by a web server as a WSGI (Python) application
A database that holds information about users, projects and other things.
One or more "agents" (daemons) that look in the database for actions to carry out. This is the way that users get added to LDAP, directories get created on filesystems etc.
Mancini was designed to limit the amount of havoc that can be wreaked in the event of a database or web application compromise. In particular, the web application does not have access to any stored credentials that allow the addition or modification of entries in the LDAP name service.