Latest Work
Finest at Sea
- Webform
- Product Browser
- Reciepe Collection
- Site Search
- Twitter Integration
Regional Geriatric Program of Toronto
- Site Search
- News
- Events
- Webforms
- User Proiles
- Audience Driven Navigation
Stuwalk Energy
For over 25 years, Stuwalk Energy has supplied and operated a vast network of public and private cardlocks in remote areas of Northern BC. They offer both traditional and unique distribution methods—fleet trucks, rail delivery and off-road bush trucks—that get fuel where it needs to go. Stuwalk focuses primarily on the natural gas extraction industry, but also serves the fuel needs of local communities.
- Responsive design
- Site rebuild
- Product catalogue
- Map view for all locations
Onetribe
Onetribe is a small body jewelry company based in Richmond, Virginia that specializes in short-run, one-of-a-kind designs. Founded in 2003, they view body modification as an art form, preserving the handcraft techniques and educating the general public about the rich social, cultural and artistic history. And by using natural and economically sensitive materials, Onetribe is a model for conscientious, socially engaging and environmentally responsible business.
Project Features:
- Drupal 7 e-Commerce
- Blog
- FAQs
- Custom Products Browser
- e-Commerce Discounts
- Customer Loyalty Discounts
- Webforms
- User Profiles
American Institute for Economic Research
After having some difficulty migrating to Drupal, American Institute for Economic Research (AIER) enlisted Drupal Connect's help in redeploying their website. AIER used Joomla! for their previous website, whose content needs to move to their new platform. AIER also sells print books and accepts donations. Some donations grant access to certain AIER membership levels, which have various perks. Constant Contact is used for email subscription management and marketing.
Solutions
To make things quick and easy, Drupal Connect migrated all of their content over with the same categories and users. The "Archive" items are a collection of PDF files (many scanned and OCRed) with content dating back to 1937! This content was imported separately to keep things clean and intact. Now that everything has moved over, AIER intends to further refine their content to better the user's overall experience and searching abilities. Ubercart was used to allow for easy scalability and automation of certain purchases. AIER now has the ability to configure donation membership tiers with automatic Drupal Role assignments. Drupal's Constant Contact module was quick to install and configure. Several Views were created to make content displays and reports easier to manage.
View Website
Smosh
Drupal Connect faced several significant obstacles:
- Data Migration: the production database contained over one million users and hundreds of thousands of forum posts from two systems, Drupal 6 and Invision Power Board (IPB). Data was kept partially in-sync through an awkward bridge where all log-in and authentication data was handled by IPB.
- System Design: a mandate to remove IPB entirely and replicate all possible forum functionality in Drupal.
- Performance & Stability: although the site had Varnish, CDN, memcached, and MySQL replication, it was not properly configured and crashed frequently under heavy load.
- Drupal Development: code clean-up and refactoring galore! Drupal Connect inherited a partially-started development code branch as the production code-base was "unusable."
- Aggressive timeline: deployment was scheduled four weeks out from the start of the project.
Solutions
- Mapped data between the two systems and migrated all users, profile data, etc.
- Removed IPB and all supporting code, while maintaining 90% of the forum functionality.
- Ported the site to Pressflow, properly configured Varnish setup, and rewrote of several pages to enable caching.
- Properly configured MySQL replication.
- Removed the hard-coded, inflexible push CDN code and enabled origin-pull CDN support, while also syncing the huge 10GB file system.
- Added Apache Solr search support.
- Audited the development code-base and removed, rewrote, and refactored significant portions of the site.
Results
Alloy relaunched Smosh on its servers within the four-week timeline in June 2011, while seeing peak traffic numbers. The site has had rock solid stability and there is still room for growth on current hardware.
View Website
Greenopolis.com
In the early fall of 2010, DrupalConnect began working on Waste Management Inc.'s high-profile, high-traffic collection of recycling and green-living sites, collectively under greenopolis.com, as part of a long-term reorganization and revitalization effort.
ThinkGreenRewards.com
Drupal Connect recently redesigned Waste Management's new, flagship community recycling program, Think Green Rewards. ThinkGreenRewards.wm.com has a beautiful, modern design with an intuitive UI that makes for a pleasant UX across the site's broad demographics. DrupalConnect employed all of the latest theming techniques with jQuery, image sprites, and css3 on top of a 960 grid with a stylish font via cufon for an elegant and bold Web presence.
Theming Technologies
- Custom theme
- 960 grid system
- jQuery
- CSS3
- Image Sprites
- Proprietary font usage via cufon
Greenopolis.com
We hit the ground running, committing code early on, and put out our first release within two weeks. We brought in additional resources to facilitate top-notch and on-time deployments, focusing on developing new code and fixing and enhancing old code. Two main areas stood out as great concern for our client:
Development Milestones
- Major refactoring to the backbone of the sites—the consumer recycling transaction processing
- Automating the integration of recycling data from Waste Management facilities
- Developing thousands of lines of new code
- Maintaining thousands of lines of legacy code
- Extending and customizing of Ubercart and views
High Traffic
- Pressflow 6.19
- Load-balanced web servers
- MySQL Database Cluster
- Memcached
- Gluster FS
- APC
- Varnish
- 20k visits per day
Global Aviation Alliance
Global Aviation Alliance contacted Drupal Connect in October 2010 for a site build. GAA has partnered with several companies to provide pilot training, legal services, and crew staffing at a discounted rate once a user becomes a member. It hired Drupal Connect to build out the infrastructure in order to facilitate these partnerships on the Web.
Challenges
- Dynamically priced products - GAA needed the ability to be able to query a database, gather the pricing data for the services for which the customer was requesting a quote, and then sell that product to the customer for that price.
- Webforms and Ajax - GAA had several Webforms that had one field dependent upon another.
- Custom Workflows - Many custom workflows for over nine distinct user roles.
Solutions
Drupal Connect built the site on Pressflow, utilizing many contributed modules to meet the project's requirements. We also developed nine custom modules to handle Webform and Ubercart overrides where needed. As part of these custom modules, Drupal Connect also created a custom “Approval Queue” that allowed Global Aviation Alliance’s partner to log in and approve or disapprove a potential member based on internal validation status rules.
Custom Drupal Theme
Drupal Connect also implemented a custom design and theme implementation for GAA to provide a great user experience:
- jQuery & jQuery UI
- Fancybox
- Custom Flash animation for the front page
- Image Carousel implemented in jQuery
Online Technology Industry Magazine
Drupal Connect was hired in December 2010 to assist with a major upgrade from Drupal 5 to 6 of a respected online technology industry magazine. The specific areas our team was tasked to address were performance and scalability issues, which required expert-level Drupal experience and were critical to the overall success of the project. This case study describes only some of Drupal Connect's work on the project, specifically that led by Lead Developer Ryan Palmer to address the performance and scalability issues.
Environment
- Apache 2.x, PHP 5.2.x, MySQL 5.x
- Memcached for Drupal cache and sessions
- Barracuda load balancer distributing traffic across two Web nodes
- Web nodes running NFS for sites/default/files. 16Gb RAM each.
- Dedicated MySQL server
Application
- Drupal 6.x
- 190+ modules in use (180 at launch)
- ~33 custom modules (12 features), ~55,000 lines of custom code, excluding features
- 1 custom theme: 14,000+ lines of CSS, 1,300 lines JS, 142 templates
Content
- ~150,000 nodes
- ~18,000 taxonomy terms
- ~10,000 users
- 25 content types
Throughput and performance design requirements
- 40,000 page requests per day
- Page generation under 1s per page
Analysis Tools
- XHProf - PHP profiling tool developed at Facebook
- jMeter -- load and performance testing. test profile built to measure performance and throughput based on 9/3 anon/auth mix for various parts of the site (article pages, answer pages, various landing pages). Uses a real session cookie to simulate being authenticated
- apache bench -- good for specific urls, measuring throughput
- Firebug/Google Chrome network analysis
Concerns
- Application performs poorly, inconsistently
- Anonymous page load time not acceptable
Application baseline
XHProf was used to improve baseline Drupal application performance by analyzing callgraphs and reports from various high-level administration pages. This takes the custom theme, primary menu, site-wide blocks, most third-party services and all content out of the equation and in theory should represent general application overhead. This was especially important considering the high number of modules used on this project, and the unpredictability of contributed modules and pre-existing custom code. Once slow or otherwise problematic PHP functions and processes were identified, steps were taken to optimize MySQL queries, cache third-party data services, cache views, cache objects (users, nodes, terms, etc.), or otherwise optimize them.
Per-path performance
Based on our jMeter testing suite, client feedback and first-hand experience, certain site sections were identified as being slow. Whether issues were persistent or intermittent, XHProf reports were captured and performance issues were addressed using the same methods described above.
Specific caching strategies:
Blocks: blockcache module was used to specifically set block cache settings, and block cache expiry times. This did require a patch to Drupal core. Example code for setting block cache expiry @ 5 mins in an update hook: /**
* Implements hook_update_N().
*/
function example_blocks_update_6000() {
// Force these blocks to expire after 15 minutes.
foreach (array('example_most_articles', 'example_most_articles_side', 'example_most_blogs', 'example_most_blogs_side') AS $v) {
variable_set('bc_life_example_blocks_'. $v, (15 * 60));
}
}
?>
Object caching: Memcached was leveraged for fast object storing, with smart expiries: /**
* Load the user object from cached values
* @param $uid
* The profile owner's user id or an array of values (name, mail, uid).
* @return $account user object
* Cache results for 60 minutes
*/
function example_user_load($uid) {
static $example_users;
$hash = md5(serialize($uid));
$cid = 'example_user:'. $hash;
if ($example_users[$hash]) {
return $example_users[$hash];
}
elseif ($cache = cache_get($cid)) {
$example_users[$hash] = $cache->data;
return $cache->data;
}
else {
$account = user_load($uid);
cache_set($cid, $account, 'cache', time() + (60 * 60));
return $account;
}
}
?>
Views caching: for certain problematic views, it became preferable to clear caches based on node authorship and administrative actions rather than time-based expiry. Query and rendering cache times were set far higher than usual (1hr or more) and hook_nodeapi, hook_form_alter and submission callbacks on administration interfaces were used to clear views caches: /**
* Implementation of hook_form_alter();
*/
function example_articles_form_alter(&$form, &$form_state, $form_id) {
switch($form_id) {
case 'nodequeue_arrange_subqueue_form':
if ($form['#subqueue']['qid'] == 3) {
$form['#submit'][] = '_example_nodequeue_arrange_subqueue_form_3_submit';
}
break;
}
}
/**
* Submission callback to clear a cache upon nodequeue 3 form submission
*/
function _example_nodequeue_arrange_subqueue_form_3_submit(&$form, &$form_state) {
cache_clear_all('views_default:editor_picks:en');
}
?>
Content delivery optimization
Where possible, all standard Drupal measures were taken to optimize front-end loading performance. Pre-existing circumstances meant that JavaScript aggregation was not possible, so steps were taken to amalgamate files manually. Anonymous page loading performance was determined to be unacceptable, largely due to the module overhead of the application. In fact, a near linear relationship was found between the number of modules enabled and the baseline performance of the application. The suggestion was made by Drupal Connect at the 11th hour to implement a reverse proxy cache (Varnish) to cache anonymous pages plus static assets to both dramatically improve anonymous page loading times and take the load off the very heavy apache processes for the serving all static assets. Varnish was installed by the client and configured by Drupal Connect, to operate per front-end server and between the load balancer and apache. Varnish was configured to cache aggressively and effectively, and Drupal was optimized to send proper headers, avoid sessions for anonymous users, etc. The end result was an average 95% "cache hit" rate and an anonymous page load time of 30ms (front page tested with ab, 95th percentile, n1000, c5), considered by all involved to be an exceptional outcome. The memory footprint of Varnish was large (2Gb+ per server), but CPU usage was less than 1% on each machine even while serving 95% of all traffic.
Lessons learned
- More modules = slower performance. The relationship was found to be nearly linear for baseline performance.
- Caching strategies should not be an afterthought. Views & block caching should be enabled from day one.
- Sometimes Drupal core needs to be hacked to achieve aggressive caching objectives. Drupal 7 should be more robust in this regard.
- Where practical (memory does cost money), Varnish should be used to serve all anonymous traffic.
- BUT, Drupal must be built with the assumption that anonymous users must not have SESS cookies.
Camouflage Data Masking
One of the most crucial features of an enterprise-level Drupal deployment is integration with third-party Web services, especially third-party buisiness analytics tools such as Eloqua and CRMs (customer relations management systems) such as Salesforce. Particularly when e-commerce is involved, clients need to build workflows keyed to specific user interactions - for example, a user logging in, a user adding a product to their cart, a user downloading a file - where data about the user and about their activity is submitted to the third-party service. Moreover, these workflows need to be adaptable to changing business requirements.
The most common approach to such requirements is to leverage Drupal's internal APIs in a custom module. However, this approach limits the ability of the site manager to respond quickly to changing requrements, since custom modules usually require the involvement of a developer to modify them. It also requires a significant outlay of time and labor in development and QA. In general, Drupal Connect developers always look to existing, proven technologies when architecting solutions to even the most complex requirements.
When we built a new site for Camouflage Datamasking Specialists (http://www.datamasking.com), we accomplished the above requirements by leveraging the Rules module, which allowed us to hook into common user events related to log-in, registration, purchase, and file download to submit data to the Eloqua business analytics service. Using Rules, we were able to build complex workflows based on several available profile types the user had filled in, what areas of the site the user had accessed previously, and whether or not they had agreed to the terms of service.
Because we used Rules, site administrators were able to adjust the workflows as their business needs changed simply by creating new conditions and tying them to the desired actions within the Rules administrative interface. The only custom code required for the integration was the implementation of a Rules action for sending gathered data to the Eloqua analytics service as a CURLed form submission (Eloqua has an API, but Camouflage was not set up to be able to use it). Implementing the action was straightforward using Rules' API, minimizing the time and cost of development, QA, and maintenance.
University System of Ohio
This website is an online resource connecting future Ohio college students with detailed information on how to prepare, apply, and pay for an education at Ohio’s public universities, community colleges, and adult career centers. It includes interactive communication tools such as chat, a “find answers” database, and email to engage prospective students.
Future phases will add more personalized services for student users, including high-tech college planning tools that make it easy for students to identify low- cost pathways to degrees and view interactive profiles on college credit transfer. The evolution of the Web student portal will be a dynamic process with input from key stakeholders.
View Website
