Jul 30 2019
Jul 30

Testing integrations with external systems can sometimes prove tricky. Services like Acquia Lift & Content Hub need to make connections back to your server in order to pull content. Testing this requires that your environment be publicly accessible, which often precludes testing on your local development environment.

Enter ngrok

As mentioned in Acquia’s documentation, ngrok can be used to facilitate local development with Content Hub. Once you install ngrok on your development environment, you’ll be able to use the ngrok client to connect and create an instant, secure URL to your local development environment that will allow traffic to connect from the public internet. This can be used for integrations such as Content Hub for testing, or even for allowing someone remote to view in-progress work on your local environment from anywhere in the world without the need for a screen share. You can also send this URL to mobile devices like your phone or tablet and test your local development work easily on other devices.

After starting the client, you’ll be provided the public URL you can plug into your integration for testing. You’ll also see a console where you can observe incoming connections.

Resources

Jun 20 2019
Jun 20

We’ve been starting many of our projects using Acquia’s Lightning distribution. This gives a good, consistent starting point for and helps speed development through early adoption of features that are still-in-the-works for Drupal 8. Like other distributions, Lightning bundles Drupal Core with a set of contributed modules and pre-defined configuration.

While Lightning is a great base to start from, sometimes you want to deviate from the path it provides. Say for example you want to use a Paragraphs based system for page components, your client has a fairly complex custom publishing workflow, and you also have different constraints for managing roles. Out-of-the-box, Acquia Lightning has a number of features you may find yourself in conflict with. Things like Lightning Layout provide a landing page content type that may not fit the needs for the site. Lightning Roles has a fairly hard-coded set of assumptions for role generation. And while it is a good solution for many sites, Lightning Workflow may not always be the right fit.

You may find yourself tempted to uninstall these modules and delete the configuration they brought to the party, but things are not always that simple. Because of the inter-relationships and dependencies involved, simply uninstalling these modules may not be possible. Usually, all looks fine, then when it comes time for a deployment things fall apart quickly.

This is where sub-profiles can save the day. By creating a sub-profile of Acquia Lightning you can tweak Lightning’s out-of-the-box behavior and include or exclude modules to fit your needs. Sub-profiles inherit all of the code and configuration from the base profile they extend. This gives the developer the ability to take an install profile like Acquia Lightning and tweak it to fit her project’s needs. Creating a sub-profile can be as easy as defining it via a *.info.yml file.

In our example above, you may create a sub-profile like this:

name: 'example_profile'
type: profile
description: 'Lightning sub-profile'
core: '8.x'
type: profile
base profile: lightning
themes:
  - mytheme
  - seven
install:
  - paragraphs
  - lightning_media
  - lightning_media_audio
  - lightning_media_video
exclude:
  - lightning_roles
  - lightning_page
  - lightning_layout
  - lightning_landing_page

This profile includes dependencies we’re going to want, like Paragraphs – and excludes the things we want to manage ourselves. This helps ensure that when it comes time for deployment, you should get what you expect. You can create a sub-profile yourself by adding a directory and info.yml file in the “profiles” directory, or if you have Drupal Console and you’re using Acquia Lightning, you can follow Acquia’s instructions. This Drupal Console command in Lightning will walk you through a wizard to pick and choose modules you’d like to exclude.

Once you’ve created your new sub-profile, you can update your existing site to use this profile. First, edit your settings.php and update the ‘install_profile’ settings.

$settings['install_profile'] = 'example_profile';

Then, use Drush to make the profile active.

drush cset core.extension module.example_profile 0

Once your profile is active and in-use, you can export your configuration and continue development.

Jun 11 2019
Jun 11

Every once in a while you have those special pages that require a little extra something. Some special functionality, just for that page. It could be custom styling for a marketing landing page, or a third party form integration using JavaScript. Whatever the use case, you need to somehow sustainably manage JavaScript or CSS for those pages.

Our client has some of these special pages. These are pages that live outside of the standard workflow and component library and require their own JS and CSS to pull them together.  Content authors want to be able to manage these bits of JavaScript and CSS on a page-by-page basis. Ideally, these pages would go through the standard development and QA workflow before code makes it out to production. Or perhaps you need to work in the opposite direction, giving the content team the ability to create in Production, but then capture and pull them back into the development pipeline in future deployments?

This is where Drupal 8’s Configuration Entities become interesting. To tackle this problem, we created a custom config entity to capture these code “snippets”. This entity gives you the ability to enter JavaScript or CSS into a text area or to paste in the URL to an externally hosted resource. It then gives you a few choices on how to handle the resulting Snippet. Is this JavaScript, or CSS? Do you want to scope the JavaScript to the Footer or the Header? Should we wrap the JavaScript in a Drupal Behavior?

Once the developer makes her selections and hits submit, the system looks at the submitted configuration and if it’s not an external resource, it writes a file to the filesystem of the Drupal site.

Now that you’ve created your library of Snippets, you can then make use of them on your content. From either your Content Type, Paragraph, or other Content Entity – simply create a new reference field. Choose “Other”, then on the next page scroll through the entity type list till you get to the configuration section and select JSnippet. Your content creators will then have access to the Snippets when creating content.

By providing our own custom Field Formatter for Entity Reference fields, we’re then able to alter how that snippet is rendered on the final page. During the rendering process, when the Snippet reference field is rendered, the custom field formatter loads the referenced configuration entity and uses its data and our dynamically generated library info to attach the relevant JavaScript or CSS library to the render array. During final rendering, this will result in the JavaScript or CSS library being added to the page, within its proper scope.

Because these snippets are configuration entities, they can be captured and exported with the site’s configuration. This allows them to be versioned and deployed through your standard deployment process. When the deployed configuration is integrated, the library is built up and any JS or CSS is written to the file system.

Want to try it out? Head on over to Drupal.org and download the JSnippet module. If you have any questions or run into any issues just let us know in the issue queue.

Apr 05 2019
Apr 05

In this project we had built a collection of components using a combination of Paragraphs and referenced block entities. While the system we built was incredibly flexible, there were a number of variations we wanted to be able to apply to each component. We also wanted the system to be easily extensible by the client team going forward. To this end, we came up with a system of configuration entities that would allow us to provide references to classes and thematically name these styles. We built upon this by extending the EntityReferenceSelections plugin, allowing us to customize the list of styles available to a component by defining where those styles could be used.

The use of configuration entities allows the client team to develop and test new style variations in the standard development workflow and deploy them out to forward environments, giving an opportunity to test the new styles in QA prior to deployment to Production.

The Styles configuration entity

This configuration entity is at the heart of the system. It allows the client team to come in through the UI and create the new style. Each style is comprised of one or more classes that will later be applied to the container of the component the style is used on. The Style entity also contains configuration allowing the team to identify where this style can be used. This will be used later in the process to allow the team to limit the list of available styles to just those components that can actually make use of them.

The resulting configuration for the Style entity is then able to be exported to yml, versioned in the project repository and pushed forward through our development pipeline. Here’s an example of a Style entity after export to the configuration sync directory.

uuid: 7d112e4e-0c0f-486e-ae36-b608f55bf4e4
langcode: en
status: true
dependencies: {  }
id: featured_blue
label: 'Featured - Blue'
classes:
  - comp__featured-blue
uses:
  rte: rte
  cta: cta
  rail: '0'
  layout: '0'
  content: '0'
  oneboxlisting: '0'
  twoboxlisting: '0'
  table: '0'

Uses

For “Uses” we went with a simple configuration form. The result of this is form is stored in the key value store for Drupal 8. We can then access that configuration from our Styles entity and from our other plugins in order to retrieve and decode the values. Because the definition of each use was a simple key and label, we didn’t need anything more complex for storage.

Assigning context through a custom Selection Plugin

By extending the core EntityReferenceSelection plugin, we’re able to combine our list of Uses with the uses defined in each style component. To add Styles to a component, the developer would first add a entity reference field to the the Styles config entity to the component in question. In the field configuration for that entity reference field, we can chose our custom Selection Plugin. This exposes our list of defined uses. We can then select the appropriate use for this component. The end result of this is that only the applicable styles will be presented to the content team when they create components of this type.

<?php

/**
 * Plugin implementation of the 'selection' entity_reference.
 *
 * @EntityReferenceSelection(
 *   id = "uses",
 *   label = @Translation("Uses: Filter by where the referenced entity will be used."),
 *   group = "uses",
 *   weight = 0
 * )
 */
class UsesSelection extends SelectionPluginBase implements ContainerFactoryPluginInterface {

  use SelectionTrait;

  /**
   * {@inheritdoc}
   */
  public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
    $form = parent::buildConfigurationForm($form, $form_state);

    $options = Styles::getUses();
    $uses = $this->getConfiguration()['uses'];

    if ($options) {
      $form['uses'] = [
        '#type' => 'checkboxes',
        '#title' => $this->t('Uses'),
        '#options' => $options,
        '#default_value' => $uses,
      ];
    }
    return $form;
  }

  /**
   * {@inheritdoc}
   */
  public function getReferenceableEntities($match = NULL, $match_operator = 'CONTAINS', $limit = 0) {
    $uses_config = $this->getConfiguration()['uses'];

    $uses = [];
    foreach ($uses_config as $key => $value) {
      if (!empty($value)) {
        $uses[] = $key;
      }
    }

    $styles = \Drupal::entityTypeManager()
      ->getStorage('styles')
      ->loadMultiple();

    $return = [];
    foreach ($styles as $style) {
      foreach ($style->get('uses') as $key => $value) {
        if (!empty($value)) {
          if (in_array($key, $uses)) {
            $return[$style->bundle()][$style->id()] = $style->label();
          }
        }
      }
    }
    return $return;
  }

}

In practice, this selection plugin presents a list of our defined uses in the configuration for the field. The person creating the component can then select the appropriate use definitions, limiting the scope of styles that will be made available to the component.

Components, with style.

The final piece of the puzzle is how we add the selected styles to the components during content creation. Once someone on the content team adds a component to the page and selects a style, we then need to apply the style to the component. This is handled by preprocess functions for each type of component we’re working with. In this case, Paragraphs and Blocks.

In both of the examples below we check to see if the entity being rendered has our ‘field_styles’. If the field exists, we load its values and the default class attributes already applied to the entity. We then iterate over any styles applied to the component and add any classes those styles define to an array. Those classes are merged with the default classes for the paragraph or block entity. This allows the classes defined to be applied to the container for the component without a need for modifying any templates.

/**
 * Implements hook_preprocess_HOOK().
 */
function bcbsmn_styles_preprocess_paragraph(&$variables) {
  /** @var Drupal\paragraphs\Entity\Paragraph $paragraph */
  $paragraph = $variables['paragraph'];
  if ($paragraph->hasField('field_styles')) {
    $styles = $paragraph->get('field_styles')->getValue();
    $classes = isset($variables['attributes']['class']) ? $variables['attributes']['class'] : [];
    foreach ($styles as $value) {
      /** @var \Drupal\bcbsmn_styles\Entity\Styles $style */
      $style = Styles::load($value['target_id']);
      if ($style instanceof Styles) {
        $style_classes = $style->get('classes');
        foreach ($style_classes as $class) {
          $classes[] = $class;
        }
      }
    }
    $variables['attributes']['class'] = $classes;
  }
}

/**
 * Implements hook_preprocess_HOOK().
 */
function bcbsmn_styles_preprocess_block(&$variables) {
  if ($variables['base_plugin_id'] == 'block_content') {
    $block = $variables['content']['#block_content'];
    if ($block->hasField('field_styles')) {
      $styles = $block->get('field_styles')->getValue();
      $classes = isset($variables['attributes']['class']) ? $variables['attributes']['class'] : [];
      foreach ($styles as $value) {
        /** @var \Drupal\bcbsmn_styles\Entity\Styles $style */
        $style = Styles::load($value['target_id']);
        if ($style instanceof Styles) {
          $style_classes = $style->get('classes');
          foreach ($style_classes as $class) {
            $classes[] = $class;
          }
        }
      }
      $variables['attributes']['class'] = $classes;
    }
  }
}

Try it out

We’ve contributed the initial version of this module to Drupal.org as the Style Entity project. We’ll continue to refine this as we use it on future projects and with the input of people like you. Download Style Entity and give it a spin, then let us know what you think in the issue queue.

Mar 11 2019
Mar 11
Photo by Bureau of Reclamation https://www.flickr.com/photos/usbr/12442269434

You’ve decided to use Acquia DAM for managing your digital assets, and now you need to get those assets into Drupal where they can be put to use. Acquia has you covered for most use cases with the Media: Acquia DAM module. This module provides a suite of tools to allow you to browse the DAM for assets and associate them to Media entities. It goes a step farther by then ensuring that those assets and their metadata stay in synch when updates are made in the DAM.

This handles the key use case of being able to reference assets to an existing entity in Drupal, but what if your digital assets are meant to live stand-alone in the Drupal instance? This was the outlying use case we ran into on a recent project.

The Challenge

The customer site had the requirement of building several filterable views of PDF resources. It didn’t make sense to associate each PDF to a node or other entity, as all of the metadata required to build the experience could be contained within the Media entity itself. The challenge now was to get all of those assets out of the DAM and into media entities on the Drupal site without manually referencing them from some other Drupal entity.

The Solution

By leveraging the API underlying the Media: Acquia DAM module we were able to create our own module to manage mass importing entire folders of assets from Acquia DAM into a specified Media bundle in Drupal. This takes advantage of the same configuration and access credentials used by Media: Acquia DAM and also leverages that module for maintaining updates to metadata for the assets post-import.

The Acquia DAM Asset Importer module allows the site administrator to specify one or more folders from Acquia DAM to import assets from. Once configured, the module runs as a scheduled task through Drupal’s cron. On each cron run, the module will first check to see if there are any remaining import tasks to complete. If not, it will use the Acquia DAM API to retrieve a list of asset IDs for the specified folders. It compares that to the list of already imported assets. If new assets exist in the folders in Acquia DAM, they’re then added to the module’s Queue implementation to be imported in the background.

The QueueWorker implementation that exists as part of the Acquia DAM Asset Importer will then process it’s queue on subsequent cron runs, generating a new Media entity of the specified bundle, adding the asset_id from Acquia DAM and executing save() on the entity. At this point the code in Media: Acquia DAM takes over, pulling in metadata about the asset and synching it and the associated file to Drupal. Once the asset has been imported into Drupal as a Media entity, the Media: Acquia DAM module keeps the metadata for that Media Entity in synch with Acquia DAM using its own QueueWorker and Cron implementations to periodically pull data from DAM and update the Media entity.

Try it out

Are you housing assets in Acquia DAM and need to import them into your Drupal site? We’ve contributed the Acquia DAM Asset Importer module on Drupal.org. Download it here and try it out.

Mar 06 2019
Mar 06

Using Paragraphs to define components in Drupal 8 is a common approach to providing a flexible page building experience for your content creators. With the addition of Acquia Lift and Content Hub, you can now not only build intricate pages – you can personalize the content experience for site visitors.

Personalization with Acquia Lift and Content Hub

Acquia Lift is a personalization tool optimized for use with Drupal. The combination of Acquia Lift and Content Hub allows for entities created in Drupal to be published out to Content Hub and be made available through Lift to create a personalized experience for site visitors. In many instances, the personalized content used in Lift is created by adding new Blocks containing the personalized content, but not all Drupal sites utilize Blocks for content creation and page layout.

Personalizing paragraph components

To personalize a Paragraph component on a page, we’ll need to create a new derivative of that component with the personalized content for export to Content Hub. That means creating duplicate content somewhere within the Drupal site. This could be on a different content type specifically meant for personalization.

To make this process easier on our content creators we developed a different approach. We added an additional Paragraphs reference to the content types we wanted to enable personalization on. This “Personalized Components” field can be used to add derivatives of components for each segment in Acquia Lift. The field is hidden from display on the resulting page, but the personalized Paragraph entities are published to Content Hub and available for use in Lift. This allows the content team to create and edit these derivatives in the same context as the content they’re personalizing. In addition, because Paragraphs do not have a title of their own, we can derive a title for them from combination of the title of their parent page and the type of component being added. This makes it easy for the personalization team to find the relevant content in Acquia Lift’s Experience Builder.

In addition to all of this, we also added a “Personalization” tab. If a page has personalized components, this tab will appear for the content team allowing them to review the personalized components for that page.

Keeping the personalized experience in the context of the original page makes it easier for the entire team to build and maintain personalized content.

The technical bits

There were a few hurdles in getting this all working. As mentioned above, Paragraph entities do not have a title property of their own. This means that when their data is exported to Content Hub, they all appear as “Untitled”. Clearly this doesn’t make for a very good user experience. To get around this limitation we leveraged one of the API hooks in the Acquia Content Hub module.

<?php
/**
 * Implements hook_acquia_contenthub_cdf_from_drupal_alter().
 */
function mymodule_acquia_contenthub_cdf_from_drupal_alter(ContentHubEntity $cdf) {
  $paragraph = \Drupal::service('entity.repository')->loadEntityByUuid($cdf->getType(), $cdf->getUuid());

  /** @var \Drupal\node\Entity\Node $node */
  $node = _get_parent_node($paragraph);
  $node_title = $node->label();

  $paragraph_bundle = $paragraph->bundle();
  $paragraph_id = $paragraph->id();

  $personalization_title = $node_title . ' - ' . $paragraph_bundle . ':' . $paragraph_id;

  if ($cdf->getAttribute('title') == FALSE) {
    $cdf->setAttributeValue('title', $personalization_title, 'en');
  }
}

/**
 * Helper function for components to identify the current node/entity.
 */
function _get_parent_node($entity) {
  // Recursively look for a non-paragraph parent.
  $parent = $entity->getParentEntity();
  if ($parent instanceof Node) {
    return $parent;
  }
  else {
    return _get_parent_node($parent);
  }
}

This allows us to generate a title for use in Content Hub based on the title of the page we’re personalizing the component on and the type of Paragraph being created.

In addition to this, we also added a local task and NodeViewController to allow for viewing the personalized components. The local task is created by adding a mymodule.links.task.yml and mymodule.routing.yml to your custom module.

*.links.task.yml:

personalization.content:
  route_name: personalization.content
  title: 'Personalization'
  base_route: entity.node.canonical
  weight: 100


*.routing.yml:

personalization.content:
  path: '/node/{node}/personalization'
  defaults:
    _controller: '\Drupal\mymodule\Controller\PersonalizationController::view'
    _title: 'Personalized components'
  requirements:
    _custom_access: '\Drupal\mymodule\Controller\PersonalizationController::access'
    node: \d+

The route is attached to our custom NodeViewController. This controller loads the latest revision of the current Node entity for the route and builds rendered output of a view mode which shows any personalized components.

<?php

namespace Drupal\mymodule\Controller;

use Drupal\Core\Access\AccessResult;
use Drupal\Core\Entity\EntityInterface;
use Drupal\node\Controller\NodeViewController;
use Drupal\Core\Session\AccountInterface;

/**
 * Defines a controller to render a single node.
 */
class PersonalizationController extends NodeViewController {

  /**
   * {@inheritdoc}
   */
  public function view(EntityInterface $node, $view_mode = 'personalization', $langcode = NULL) {
    // Make sure we're working from the latest revision.
    $revision_ids = $this->entityManager->getStorage('node')
      ->revisionIds($node);
    $last_revision_id = end($revision_ids);
    if ($node->getLoadedRevisionId() <> $last_revision_id) {
      $node = $this->entityManager->getStorage('node')
        ->loadRevision($last_revision_id);
    }
    $build = parent::view($node, $view_mode, $langcode);
    return $build;
  }

  /**
   * Custom access controller for personalized content.
   */
  public function access(AccountInterface $account, EntityInterface $node) {
    /** @var \Drupal\node\Entity\Node $node */
    $personalized = FALSE;
    if ($account->hasPermission('access content overview')) {
      if ($node->hasField('field_personalized_components')) {
        $revision_ids = $this->entityManager->getStorage('node')
          ->revisionIds($node);
        $last_revision_id = end($revision_ids);
        if ($node->getLoadedRevisionId() <> $last_revision_id) {
          $node = $this->entityManager->getStorage('node')
            ->loadRevision($last_revision_id);
        }
        if (!empty($node->get('field_personalized_components')->getValue())) {
          $personalized = TRUE;
        }
      }
    }
    return AccessResult::allowedIf($personalized);
  }
}

The controller both provides the rendered output of our “Personalization” view mode, it also uses the access check to ensure that we have personalized components. If no components have been added, the “Personalization” tab will not be shown on the page.

Mar 04 2019
Mar 04


Bitbucket Pipelines is a CI/CD service, built into Bitbucket and offers an easy solution for building and deploying to Acquia Cloud for project’s whose repositories live in Bitbucket and who opt out of using Acquia’s own Pipelines service. Configuration of Bitbucket Pipelines begins with the creation of a bitbucket-pipelines.yml file and adding that file to the root of your repository. This configuration file details how Bitbucket Pipelines will construct the CI/CD environment and what tasks it will perform given a state change in your repository.

Let’s walk through an example of this configuration file built for one of our clients.

bitbucket-pipelines.yml

image: geerlingguy/drupal-vm:4.8.1
clone:
  depth: full
pipelines:
  branches:
    develop:
      - step:
         script:
           - scripts/ci/build.sh
           - scripts/ci/test.sh
           - scripts/ci/deploy.sh
         services:
           - docker
           - mysql
         caches:
           - docker
           - node
           - composer
    test/*:
      - step:
         script:
           - scripts/ci/build.sh
           - scripts/ci/test.sh
         services:
           - docker
           - mysql
         caches:
           - docker
           - node
           - composer
  tags:
    release-*:
      - step:
          name: "Release deployment"
          script:
            - scripts/ci/build.sh
            - scripts/ci/test.sh
            - scripts/ci/deploy.sh
          services:
            - docker
            - mysql
          caches:
            - docker
            - node
            - composer
definitions:
  services:
    mysql:
      image: mysql:5.7
      environment:
        MYSQL_DATABASE: 'drupal'
        MYSQL_USER: 'drupal'
        MYSQL_ROOT_PASSWORD: 'root'
        MYSQL_PASSWORD: 'drupal'

The top section of bitbucket-pipelines.yml outlines the basic configuration for the CI/CD environment. Bitbucket Pipelines uses Docker at its foundation, so each pipeline will be built up from a Docker image and then your defined scripts will be executed in order, in that container.

image: geerlingguy/drupal-vm:4.8.1
clone:
  depth: full

This documents the image we’ll use to build the container. Here we’re using the Docker version of  Drupal VM. We use the original Vagrant version of Drupal VM in Acquia BLT for local development. Having the clone depth set to full ensures we pull the entire history of the repository. This was found to be necessary during the initial implementation.

The “pipelines” section of the configuration defines all of the pipelines configured to run for your repository. Pipelines can be set to run on updates to branches, tags or pull-requests. For our purposes we’ve created three pipelines definitions.

pipelines:
  branches:
    develop:
      - step:
         script:
           - scripts/ci/build.sh
           - scripts/ci/test.sh
           - scripts/ci/deploy.sh
         services:
           - docker
           - mysql
         caches:
           - docker
           - node
           - composer
    test/*:
      - step:
         script:
           - scripts/ci/build.sh
           - scripts/ci/test.sh
         services:
           - docker
           - mysql
         caches:
           - docker
           - node
           - composer

Under branches we have two pipelines defined. The first, “develop”, defines the pipeline configuration for updates to the develop branch of the repository. This pipeline is executed whenever a pull-request is merged into the develop branch. At the end of execution, the deploy.sh script builds an artifact and deploys that to the Acquia Cloud repository. That artifact is automatically deployed and integrated into the Dev instance on Acquia Cloud.

The second definition, “test/*”, provides a pipeline definition that can be used for testing updates to the repository. This pipeline is run whenever a branch named ‘test/*’ is pushed to the repository. This allows you to create local feature branches prefixed with “test/” and push them forward to verify how they will build in the CI environment. The ‘test/*’ definition will only execute the build.sh and test.sh scripts and will not deploy code to Acquia Cloud. This just gives us a handy way of doing additional testing for larger updates to ensure that they will build cleanly.

The next section of the pipelines definition is set to execute when commits in the repository are tagged.

tags:
  release-*:
    - step:
        name: "Release deployment"
        script:
          - scripts/ci/build.sh
          - scripts/ci/test.sh
          - scripts/ci/deploy.sh
        services:
          - docker
          - mysql
        caches:
          - docker
          - node
          - composer

This pipeline is configured to be executed whenever a commit is tagged with the name pattern of “release-*”. Tagging a commit for release will run the CI/CD process and push the tag out to the Acquia Cloud repository. That tag can then be selected for deployment to the Stage or Production environments.

The final section of the pipelines configuration defines services built and added to the docker environment during execution.

definitions:
  services:
    mysql:
      image: mysql:5.7
      environment:
        MYSQL_DATABASE: 'drupal'
        MYSQL_USER: 'drupal'
        MYSQL_ROOT_PASSWORD: 'root'
        MYSQL_PASSWORD: 'drupal'

This section allows us to add a Mysql instance to Docker, allowing our test scripts to do a complete build and installation of the Drupal environment, as defined by the repository.

Additional resources on Bitbucket Pipelines and bitbucket-pipelines.yml:

Scripts

The bitbucket-pipelines.yml file defines the pipelines that can be run, and in each definition it outlines scripts to run during the pipeline’s execution. In our implementation we’ve split these scripts up into three parts:

  1. build.sh – Sets up the environment and prepares us for the rest of the pipeline execution.
  2. test.sh – Runs processes to test the codebase.
  3. deploy.sh – Contains the code that builds the deployment artifact and pushes it to Acquia Cloud.

Let’s review each of these scripts in more detail.

build.sh

#!/bin/bash
apt-get update && apt-get install -o Dpkg::Options::="--force-confold" -y php7.1-bz2 curl && apt-get autoremove
curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
apt-get install -y nodejs
apt-get install -y npm
cd hive
npm install
npm install -g gulp
cd ..
composer install
mysql -u root -proot -h 127.0.0.1 -e "CREATE DATABASE IF NOT EXISTS drupal"
export PIPELINES_ENV=PIPELINES_ENV

This script takes our base container, built from our prescribed image, and starts to expand upon it. Here we make sure the container is up-to-date, install dependencies such as nodejs and npm, run npm in our frontend library to build our node_modules dependencies, and instantiate an empty database that will be used later when we perform a test install from our codebase.

test.sh

#!/bin/bash
vendor/acquia/blt/bin/blt validate:phpcs --no-interaction --ansi --define environment=ci
vendor/acquia/blt/bin/blt setup --yes  --define environment=ci --no-interaction --ansi -vvv

The test.sh file contains two simple commands. The first runs a PHP code sniffer to validate our custom code follows prescribed standards. This command also runs as a pre-commit hook during any code commit in our local environments, but we execute it again here as an additional safeguard. If code makes it into the repository that doesn’t follow the prescribed standards, a failure will be generated and the pipeline will halt execution. The second command takes our codebase and does a complete Drupal installation from it, instantiating a copy of Drupal 8 and importing the configuration contained in our repository. If invalid or conflicting configuration makes it into the repository, it will be picked up here and the pipeline will exit with a failure. This script is also where additional testing could be added, such as running Behat or other test suites to verify our evolving codebase doesn’t produce regressions.

deploy.sh

#!/bin/bash
set -x
set -e

if [ -n "${BITBUCKET_REPO_SLUG}" ] ; then

    git config user.email "[email protected]"
    git config user.name "Bitbucket Pipelines"

    git remote add deploy $DEPLOY_URL;

    # If the module is -dev, a .git file comes down.
    find docroot -name .git -print0 | xargs -0 rm -rf
    find vendor -name .git -print0 | xargs -0 rm -rf
    find vendor -name .gitignore -print0 | xargs -0 rm -rf

    SHA=$(git rev-parse HEAD)
    GIT_MESSAGE="Deploying ${SHA}: $(git log -1 --pretty=%B)"

    git add --force --all

    # Exclusions:
    git status
    git commit -qm "${GIT_MESSAGE}" --no-verify

    if [ $BITBUCKET_TAG ];
      then
        git tag --force -m "Deploying tag: ${BITBUCKET_TAG}" ${BITBUCKET_TAG}
        git push deploy refs/tags/${BITBUCKET_TAG}
    fi;

    if [ $BITBUCKET_BRANCH ];
      then
        git push deploy -v --force refs/heads/$BITBUCKET_BRANCH;
    fi;

    git reset --mixed $SHA;
fi;

The deploy.sh script takes the product of our repository and creates an artifact in the form of a separate, fully-merged Git repository. That temporary repository then adds the Acquia Cloud repository as a deploy origin and pushes the artifact to the appropriate branch or tag in Acquia Cloud. The use of environment variables allows us to use this script both to deploy the Develop branch to the Acquia Cloud repository as well as deploying any tags created on the Master branch so that those tags appear in our Acquia Cloud console for use in the final deployment to our live environments. For those using BLT for local development, this script could be re-worked to use BLT’s internal artifact generation and deployment commands.

Configuring the cloud environments

The final piece of the puzzle is ensuring that everything is in-place for the pipelines to process successfully and deploy code. This includes ensuring that environment variables used by the deploy.sh script exist in Bitbucket and that a user with appropriate permissions and SSH keys exists in your Acquia Cloud environment, allowing the pipelines process to deploy the code artifact to Acquia Cloud.

Bitbucket configuration

DEPLOY_URL environment variable

Configure the DEPLOY_URL environment variable. This is the URL to your Acquia Cloud repository.

  1. Log in to your Bitbucket repository.
  2. In the left-hand menu, locate and click on “Settings.”
  3. In your repository settings, locate the “Pipelines section” and click on “Repository variables.”
  4. Add a Repository variable:
    1. Name: DEPLOY_URL
    2. Value: The URL to your Acquia Cloud repository. You’ll find the correct value in your Acquia Cloud Dashboard.

SSH keys

Deploying to Acquia Cloud will also require giving your Bitbucket Pipelines processes access to your Acquia Cloud repository. This is done in the form of an SSH key. To configure an SSH key for the Pipelines process:

  1. In the “Pipelines” section of your repository settings we navigated to in steps 1-3 above, locate the “SSH keys” option and click through.
  2. On the SSH keys page click the “Generate keys” button.
  3. The generated “public key” will be used to provide access to Bitbucket in the next section.

Acquia Cloud configuration

For deployment to work, your Bitbucket Pipelines process will need to be able to push to your Acquia Cloud Git repository. This means creating a user account in Acquia Cloud and adding the key generated in Bitbucket above. You can create a new user or use an existing user. You can find more information on adding SSH keys to your Acquia Cloud accounts here: Adding a public key to an Acquia profile.

To finish the configuration, log back into your Bitbucket repository and retrieve the Known hosts fingerprint.

Oct 24 2018
Oct 24

Award Program Showcases Outstanding Examples of Digital Experience Delivery

Vienna, VA – October 24, 2018 – Mobomo today announced it was selected along with NOAA Fisheries as the winner of the 2018 Acquia Engage Awards for the Leader of the Pack: Public Sector. The Acquia Engage Awards recognize the world-class digital experiences that organizations are building with the Acquia Platform.

In late 2016, NOAA Fisheries partnered with Mobomo to restructure and redesign their digital presence. Before the start of the project, NOAA Fisheries worked with Foresee to help gather insight on their current users. They wanted to address poor site navigation, one of the biggest complaints. They had concerns over their new site structure and wanted to test proposed designs and suggest improvements. Also, the NOAA Fisheries organization had siloed information, websites and even servers within multiple distinct offices. The Mobomo team was and (is currently) tasked with the project of consolidating information into one main site to help NOAA Fisheries communicate more effectively with all worldwide stakeholders, such as commercial and recreational fishermen, fishing councils, scientists and the public. Developing a mobile-friendly, responsive platform is of the utmost importance to the NOAA Fisheries organization. By utilizing Acquia, we are able to develop and integrate lots of pertinent information from separate internal systems with a beautifully designed interface.

“It has been a great pleasure for Mobomo to develop and deploy a beautiful and functional website to support NOAA fisheries managing this strategic resource. Whether supporting the work to help Alaskan Native American sustainable fish stocks, providing a Drupal-based UI to help fishing council oversight of the public discussion of legislation, or helping commercial fishermen obtain and manage their licenses, is honored help NOAA Fisheries execute its mission.” – Shawn MacFarland, CTO of Mobomo 

More than 100 submissions were received from Acquia customers and partners, from which 15 were selected as winners. Nominations that demonstrated an advanced level functionality, integration, performance (results and key performance indicators), and overall user experience advanced to the finalist round, where an outside panel of experts selected the winning projects.

“This year’s Acquia Engage Award nominees show what’s possible when open technology and boundless ambition come together to create world-class customer experiences. They’re making every customer interaction more meaningful with powerful, personalized experiences that span the web, mobile devices, voice assistants, and more,” said Joe Wykes, senior vice president, global channels at Acquia. “We congratulate Mobomo and NOAA Fisheries and all of the finalists and winners. This year’s cohort of winners demonstrated unprecedented evidence of ROI and business value from our partners and our customers alike, and we’re proud to recognize your achievement.”

“Each winning project demonstrates digital transformation in action, and provides a look at how these brands and organizations are trying to solve the most critical challenges facing digital teams today,” said Matt Heinz, president of Heinz Marketing and one of three Acquia Engage Award jurors. Sheryl Kingstone of 451 Research and Sam Decker of Decker Marketing also served on the jury.

About Mobomo

Mobomo builds elegant solutions to complex problems. We do it fast, and we do it at a planetary scale. As a premier provider of mobile, web, and cloud applications to large enterprises, federal agencies, napkin-stage startups, and nonprofits, Mobomo combines leading-edge technology with human-centered design and strategy to craft next-generation digital experiences.

About Acquia

Acquia provides a cloud platform and data-driven journey technology to build, manage and activate digital experiences at scale. Thousands of organizations rely on Acquia’s digital factory to power customer experiences at every channel and touchpoint. Acquia liberates its customers by giving them the freedom to build tomorrow on their terms.

For more information visit www.acquia.com or call +1 617 588 9600.

###

All logos, company and product names are trademarks or registered trademarks of their respective owners.

Mar 02 2018
Mar 02

Drupal is a very popular open source Web Content Management system. One of its key characteristics is that it owns both the back-end repository where content is stored and the front-end where content is rendered. In CMS parlance this is typically called a “coupled” CMS because the front-end and the back-end are coupled together.

Historically, the coupled nature of Drupal was a benefit most of the time because it facilitated a fast time-to-market. In many cases, customers could just install Drupal, define their content types, install or develop a theme, and they had a web site up-and-running that made it easy for non-technical content editors to manage the content of that web site.

But as architectural styles have shifted to “API-first” and Single Page Applications (SPAs) written in client-side frameworks like Angular and React and with many clients finding themselves distributing content to multiple channels beyond web, having a CMS that wants to own the front-end becomes more of a burden than a benefit, hence the rise of the “headless” or “de-coupled” CMS. Multiple SaaS vendors have sprung up over the last few years, creating a Content-as-a-Service market which I’ve blogged about before.

Drupal has been able to expose its content and other operations via a RESTful API for quite a while. But in those early days it was not quite as simple as it could be. If you have a team, for example, that just wants to model some content types, give their editors a nice interface for managing instances of those types, and then write a front-end that fetches that content via JSON, you still had to know a fair amount about Drupal to get everything working.

Last summer, Acquia, a company that provides enterprise support for Drupal headed up by Drupal founder, Dries Buytaert, released a new distribution of Drupal called Reservoir that implements the “headless CMS” use case. Reservoir is Drupal, but most of the pieces that concern the front-end have been removed. Reservoir also ships with a JSON API module that exposes your content in a standard way.

I was curious to see how well this worked so I grabbed the Reservoir Docker image and fired it up.

The first thing I did was create a few content types. Article is a demo type provided out-of-the-box. I added Job Posting and Team Member, two types you’d find on just about any corporate web site.

My Team Member type is simple. It has a Body field, which is HTML text, and a Headshot field, which is an image. My Job Posting type has a plain text Body field, a Date field for when the job was posted, and a Status field which has a constrained list of values (Open and Closed).

With my types in place I started creating content…

Something that jumped out at me here was that there is no way to search, filter, or sort content. That’s not going to work very well as the number of content items grows. I can hear my Drupal friends saying, “There’s a module for that!”, but that seems like something that should be out-of-the-box.

Next, I jumped over to the API tab and saw that there are RESTful endpoints for each of my content types that allow me to fetch a list of nodes of a given type, specific nodes, and the relationships a node has to other nodes in the repository. POST, PATCH, and DELETE methods are also supported, so this is not just a read-only API.

Reservoir uses OAuth to secure the API, so to actually test it out, I grabbed the “Demo app” client UUID, then went into Postman and did a POST against the /oauth/token endpoint. That returned an access token and a refresh token. I grabbed the access token and stuck it in the authorization header for future requests.

Here’s an example response for a specific “team member” object.

My first observation is that the JSON is pretty verbose for such a simple object. If I were to use this today I’d probably write a Spring Boot app that simplifies the API responses further. As a front-end developer, I’d really prefer for the JSON that comes back to be much more succinct. The front-end may not need to know about the node’s revision history, for example.

Another reason I might want my front-end to call a simplified API layer rather than call Drupal directly is to aggregate multiple calls. For example, in the response above, you’ll notice that the team member’s headshot is returned as part of a relationship. You can’t get the URL to the headshot from the Team Member JSON.

If you follow the field_headshot “related” link, you’ll get the JSON object representing the headshot:

?

The related headshot JSON shown above has the actual URL to the headshot image. It’s not the end of the world to have to make two HTTP calls for every team member, but as a front-end developer, I’d prefer to get a team member object that has exactly what I need in a single response.

One of the things that might help improve this is support for GraphQL. Reservoir says it plans to support GraphQL, but in the version that ships on the Docker image, if you try to enable it, you get a message that it is still under development. There is a GraphQL Drupal module so I’m sure this is coming to Reservoir soon.

Many of my clients are predominantly Java shops–they are often reluctant to adopt technology that would require new additions to their toolchain, like PHP. And they don’t always have an interest in hiring or developing Drupal talent. Containers running highly-specialized Drupal distributions, like Reservoir, could eventually make both of these concerns less of an issue.

In addition to Acquia Reservoir, there is another de-coupled Drupal Distribution called Contenta, so if you like the idea of running headless Drupal, you might take a look at both and see which is a better fit.

Dec 01 2015
Dec 01

This week a lot got undone, broken, recovered and then some.

Worked on the product backlog, not quite ready for public consumption yet but getting there, sprint backlog for the week:

  • Shop for VPS
  • Setup VPS 
  • Migrate to VPS
  • Fonts – via CSS
  • Sort out Contact Form (emails not working)
  • Sort our Domain name and DNS stuff (may need an expert’s assistance)
  • Backlog grooming – WIP

Acquia Cloud Professional would be nice, would make life much easier, support would be kick ass (and needed) but is out of my budget! time to count the pennies and find a candy store that fits the budget. Bluehost.com or DigitalOcean.com…. went with DigitalOcean, gives an SSD, quite a bit of computing power on a budget, has no developer tools though, will need to get devops help and learn some devops stuff myself (kind’a and kind’a not looking forward to that) but hey you get what you can afford!

  • Added an SSH key, instructions easy enough to follow
  • Am in as root! (nice!)
  • its an Ubuntu VPS, LAMP stack, phpmyadmin installed
  • explored setting up DNS and nada – haven’t got time for this, my sprint capacity is significantly reduced this week and possibly the next too! can’t wait, time to call in devops help, Asim enlisted to help set up DNS for agileforpeace.com for the VPS and opensocial.agileforpeace.com for my social transformation site (thank you Asif)
  • With not much to do, dived into CSS architecture (for Drupal 8)… 10 mins later… need to find an idiot’s guide to CSS in Drupal!
  • Had good wins today, the fear of the terminal is dissipating.
  • Need to migrate my site from Acquia Cloud to the new VPS environment.
  • Installed backup and migrate, activated it and disaster strikes! backup and migrate broke the site and can not access the extend page to uninstall.

Drupal8-brokenbymigrateDrupal8-brokenbymigrate

  • Looked up uninstall backup_migrate using Drush since I could not access the extend page – nada!
  • But if I go to an invalid URL it seems to work but can’t access anything in the admin menu, insanity!

Drupal8-brokenbymigrate01Drupal8-brokenbymigrate01

  • Tried disabling using Drush (drush dis -y backup_migrate && drush pm-uninstall -y backup_migrate), did not work, tried a bunch of stuff, whatsoever google threw up as candidate solutions.
  • Decided to take the simplest option and restored the site from backup on Acquia insight, easy enough.
  • I’ll take the small win and call it a day!
  • Started day 4 with a nice surprise, my first contribution! wooHoo.. the joy of little things!
  • It was a tough start, forgot my admin password again (blistering barnacles)! and remained locked out for the a good part of the timebox! tried a number of suggested means to recover the admin password using Drush, it was one fail after another! eventually reached out to @Dakku for help and it turns out its a pretty simple process!
  • Attempted migration from the DB back up – something migrated but not quite, need to figure out what went wrong, the theme didnt quite work even though its Bartik straight out of the box, am beginning to have doubts about maintaining a VPS by myself.

Open Social Broken 001Open Social Broken 001

  • Am back in but am out of time, more on day 5.
  • bulbbulb In terminal type: cd /var/www/html/yoursite.dev/docroot/sites/default
  • Once in the directory, type: /usr/local/bin/drush8 uli
  • You will get a return value that looks like: /user/reset/1/1448057351/JY2957SilWctPfNfN1gUQ2bT5lS-NvCwjt3heDqdu5A.
  • Copy everything from “/user/….” onwards and paste it after your domain in the address bar in the browser e.g. http://yourdomain.com/user/reset/1/1448057351/JY2957SilWctPfNfN1gUQ2bT5l...
  • Go to that url, this is a one off password change process, you can reset your admin password.

Decision time! I can spend time building my site in D8 with dev tools to support me (on Acquia Cloud) or I can build without them and pick up needed devops skills to manage my VPS; time being the deciding factor am ditching the VPS route and will continue with Acquia Cloud, as for affordability found out as an Acquian I get an environment as an employee benefit! wooHoo! Though it seems this week was not as productive but got a couple of nice wins and picked up some more Drush (the fear of the terminal is dissipating! BTW DrushCommands.com is a pretty epic resource).
Retro time

      • Shop for VPS
      • Setup VPS –
      • Migrate to VPS (theme isn’t working)
      • Fonts – via CSS
      • Sort out Contact Form (so that it sends out emails)
      • Sort our Domain name and DNS stuff (may need a subject matter expert to assist)
      • Backlog grooming – WIP

Having decided to stay on Acquia Cloud I can focus on the site backlog in week 5, (mental note: need to pick up the MVP backlog items soonish).

One more option to look on her packing at it levitra vardenafil it of course to take not so simply because a form another and there is a wish to hold in hand her not so strongly. You can carry by me on a wide field.

Nov 20 2015
Nov 20

More a log than a guide, but you get the idea! its a lengthy log this week, a lot got undone, done and then some. Backlog for the week:
  • Fonts
  • Contact Form (customise it)
  • Translations (Lingotek)  
  • Take the site online 
  • Toy around with Drush
Not part of the backlog, decided to update core, followed the instructions to the letter, used Drush and broke the site completely! ha! ‘A little learning is a dangerous thing; drink deep, or taste not the Pierian spring’ … and yes did not back it up did see Drush had created a back up but have failed to locate it! was going to take it online anyhow, so decided to rebuild on Acquia CloudSite folder on DT02Site folder on DT02 Would be interesting to see how long it takes to rebuild it! good organisation should make the task a tad bit easier! Revisions made to node/1 were not in the .txt file, extracted them from node_revision_body from the database (a little learning can be a useful thing too) – a small win on a rough day!
  • Logged into Acquia Cloud, spun up a free subscription, installed D8.rc3, and got cracking! 
  • Only downer is can’t add contrib modules without figuring out how to SFTP, or using Drush. For now staying clear of Drush! fear of the terminal is back!
  • Set up path aliases, was a quick and easy introduction and gets rid of the node/n in the address bar, of course good for SEO and all that jazz.
  • I know there is an easier way to justify text alignment via CSS but that’s going to take some time to get to grips with so taking the long but short cut with HTML to <p style=”text-align:justify”>.
  • It was a good day, a forced refresher on getting sh*t done and it took less than 2 hours to get the site back on track a little ahead of the previous version too! wooHoo! 
  • Tested the contact form but it won’t work, a bit of digging around and seems SMTP Authentication Support needs to be installed, am after a quick win today, decided to install and toy with Lingotek instead.
  • Dang it! can not upload to Acquia Dev Cloud, dug around, need SFTP or SSH access, ok set up my SSH Public Key, downloaded FileZilla, followed the instructions and nada! time to put the fear of thescreen-grab-lingotekscreen-grab-lingotek terminal behind me (again) bounced around from page to page but finally got in WooHoo! installed LingoTek in the wrong place Blistering Barnacles!
  • Tried to uninstall LingoTek, could not (commands I’m seeing online don’t work for me), Ok so the next best thing is to install LingoTek in the Dev folder but nothing in the sites folder! Bizarre! or may be not!
  • Anyway reading up on Drush and installing modules on Acquia Cloud and WTF! there is aenable live devenable live dev simpler way to do so! Why is this nugget buried so deep! Evidently all I needs to do is go to my Sites/Cloud and ‘Enable Live Development‘ 
  • That done time to check out LingoTek, copy link address, install, enable, wait, enable dependencies, enable job done! Lingotek Translation itself, lemon squeezy!

LIngo Tek grab 04LIngo Tek grab 04

  • Ending day 2 on a colossal WIN, I have translations for basic pages and articles in Arabic, Bulgarian, French, Hindi, Spanish and Urdu, the main and footer menus are not translated as yet, neither do I have language select buttons/icons enabled, to access the languages I have to go by the language code in the URL and its not perfect I still need our Peace Through Prosperity volunteers to check and edit  multilingual content but they’ll  have less to do. LingoTek kicks ass!
  • Time to take on the font challenge!
  • Noticed whilst on my local environment I was having problems installing modules, kept getting error messages that told me nothing other than it’s an error (FFS!), however haven’t been getting many of those on the Cloud.
  • AnyHoo, for fonts decided on Google Webfont Loader API, comes highly recommended by @Dakku and has a D8 recommended release out too, so what could go wrong. Installed, enabling took ages and it works but… there are only two font added to the library of fonts  (not exactly a library!), all a bit anti-climatic!
  • Not quite what I expected, font attempt five or is it six now is a fail! uninstalled the Google Webfoot Loader API and am going to start exploring the CSS route one of these days. 
  • Its Menu translation day – why hasn’t LingoTek got an automated workflow for menu item translations? got it done but what a pain! suggested improvement for LingoTek: have multiple language translations for a menu item on the same page please! a lot of unnecessary back and forth in the workflow.
  • Decided to spend time on CSS so that I need not rely on modules to change fonts and to get the menu translations in place between day 4 and 5, SMTP set up and the contact form will have to wait its seems a bit complicated and will need help on this in the know, as a starter have bookmarked CSS architecture (for Drupal 8) and Drupal 8 Theming Fundamentals to my reading list.
Its a big day, the WIP site gets opened up for demo on the blog!  Retro time!
  • Fonts – tackled again, failed, avoided (need dragon glass to tackle this one)
  • Contact Form (customise it)
  • Translations (Lingotek)
  • Take the site online
  • Toy around with Drush
  • Backlog grooming
..and disaster strikes! somehow managed to lock myself out! can’t recall the password! dang it! it was such an awesome run! need help on this, tried SSH, can SSH but getting access denied for getting DB backups and hesitant to do too much using Drush, remember day 1’s lesson well. Added @Dakku to the Site ’Team’ on Acquia Cloud and its all good.  Week three has been an epic adventure! am clearly trying to run before I can walk but am finding the platform is coaxing me to do so! what little surface I have scratched has opened up a whole bunch of stuff to add to the open social backlog and am getting pretty confident quite a bit of it could be handled by myself! yes humility is a must have EM trait!. Week four will start with an upgrade to Drupal 8.0.0 WooHoo…! in the mean time feast on this…..in seven languages! Open Social Transformation PTP03Open Social Transformation PTP03

One more option to look on her packing at it levitra vardenafil it of course to take not so simply because a form another and there is a wish to hold in hand her not so strongly. You can carry by me on a wide field.

Nov 12 2015
Nov 12

More a log than a guide, but you get the idea! Day 1’s timebox went on user stories and sprint goals (1 week sprints btw); this sprint’s goals are;
  • main menu,
  • footer menu,
  • social (Twitter) feed
  • static content for pages
  • font face
  • Favicon
The allocated time b/w days 2 and 5 are 3 hours in total, so lets see how I fare this week. Started with aesthetics in the hope they’d be the easy wins. 
  • Changing font face – fail: Googled and it appears all I need to do is change the font type in a style.css filesite building D8 font issuesite building D8 font issue , first fail was there is no style.css in the Bartik components folder, did find font types in the elements.css file, edited it, added Arial and nada!
    Went on a module hunt, found font-your-face – installed, did not work, looked up the documentation and does not show up under admin/config/settings/user interface. packing in on the should’ve been an easy win and moving to the next item on my backlog.
  • Favicon success – downloaded Favicon, installed and it has a configure link under extends, first module I’ve come across that links its settings/config page from the module description link from the Extends page (good UX, thank you dave-reid). Initially the .ico file upload didn’t work, thought it might be a cache issue, cleared cache (mysite/admin/config/development/performance) did not work, decided to try renaming the file name and wooHoo! it works. Decided to call it a day with a small win.
Bartik Block RegionsBartik Block Regions

Newbie tip bulbbulb

I took a screen grab of ‘Bartik’s block regions demonstration’, printed it and pinned it to the wall and added it to desktop 2 as a wallpaper – am sure over time I’ll know whats where but for the time being its proving to be a good idea.

WooHoo, its a Saturday and though still working on a project (not really a weekend) am going to take some out for this.
  • Twitter feeds turned out lemon squeesy, with a work around, Twitter widget in a block instead of waiting for maintainers to sort their D8 modules out, thanks Dakku. Five mins into it and job’s done, there is a now a Twitter feed widget on the site! WooHoo! got carried away added a Twitter search box on #peacebuilding and #entrepreneurship, two big wins in less than 10 mins, am on a roll!
  • Next up was Social sharing, searched selected Easy Social, downloaded, installed, read the documentation, fail…. another 10 minutes invested into it… fail fail! should have quit on a win but anyhow failed fast enough to have some time to spare on other backlog items. 
  • So over to Footer menu it is. Added a bunch of menu links but not quite what I had in mind: 
Footer 001Footer 001 Got undone on finding any attributes to the menu setup that allows for external links to be opened in a new window, dug around and found its not possible without a module to manage menu attributes, It took a little bit of time, found one that is D8 ready, and guess what… does not work! fail! Went through the Readme file nothing under admin/configurations tried getting to the  setting using /admin/config/user-interface/extlink and nada! blistering barnacles! Back on the footer menu fumbled around and wooHoo that’s more like it, now to split them out: Footer 0020Footer 0020 Am wondering if I am going about searching for modules the wrong way round for it seems like an awful waste of time trawling through different contrib modules trying to see if they are D-8 ready or not, thought there is this site that lists the status of the top 100 contrib modules it doesn’t cover all of them and when using Google the ones that do turn up are those on D.O and there is just so much noise there! All the contrib modules I have installed and all of the ones that tell me in their Readme file that I will find config links under Admin/configurations –  none have turned up on that page, and when I have tried getting to the  setting using /admin/config/modulename/settings have had no joy either! this pattern suggests something is going wrong with my install! maybe!?” cleared cache too and still nada! more blistering barnacles!! I had a partial win with Footer Menu blocks, am going to take that and come back to this another day.

Its day 4, its shorter, need to stay focused on getting a win.. need it today.

  • Decided to go with the contact form, was easy enough apart from the fact that I could not figure out how to edit the tables for the default form, that’s a ‘nice to have’ so stuck to the ‘must have’ scope and extended the default form as required with custom fields. It was simple, took a bit of toying around but did not need to reach out or Google any how to’s. its a good win, was quick enough so decided to take on a couple of one more task.
  • #OpCleanup; decided am going to clean up all these modules that don’t work, err no uninstall button, its Google to the rescue, a little strange that to uninstall the modules I have to go here: /admin/modules/uninstall and there is no link to it from the extend page! may be I am missing something here. With another win and on a roll decided to look into this unexpected error I’ve been getting intermittently when installing contrib modules:
  • Found a page on D.O on the issue and responded to by a colleague! hello Eric! but the details’way too technical for my current knowhow or lack of! am going to wait till 19th Nov, assuming Dev Desktop will see an update the same day and reinstall Drupal 8 and see if that changes anything, failing that will be badgering some of my TA colleagues.
Was a washout! not enough hours in the day to fit everything! quick retro;
  • main menu,
  • footer menu,
  • social (Twitter) feed,
  • static content for pages,
  • font face
  • Favicon

Did not get to put in anymore than 2 hours over the week, got to >80% of my backlog, broke through last week’s blocker, got stuck on something allegedly trivial, that’s a good week! Looking forward to week 3, I’ll be jumping in font first! 

Peace Through Prosperity Open Transformation ProjectPeace Through Prosperity Open Transformation Project

End of week 2 this is where I am at, not bad!

One more option to look on her packing at it levitra vardenafil it of course to take not so simply because a form another and there is a wish to hold in hand her not so strongly. You can carry by me on a wide field.

Mar 01 2015
Mar 01

DCLondon-2015-01DCLondon-2015-01 #DCLondon 2015 was nothing short of Epic, Drupal Camp London has in its own right become a mini-Con, with community members flying in from not only across Europe but the US, India, Australia and New Zealand it is hard to call it just a London camp!

London is the centre of the multiverse!
Drupal Camp London 2015Drupal Camp London 2015 It was awesome catching up with old friends, some new ones and finding an engaging audience for my session on using Empathy maps, content touch point analysis to develop a robust content strategy.

Bummed about not being able to catchup with everyone though!!

I’d like to reiterate my two asks from the community this March:

1) Like, Follow and spread the word on Bringing Peace Through Prosperity, it goes hand in glove with our activist nature and desire to make this rock a better place today, tomorrow and beyond.

2) Drupal Camp Tunis needs our support to bring their local community into the wider fold, the organisers at DCTunis are looking for speakers and support.

And a HUGE thank you to everyone who attended my session…

See y’all at the next Camp!

One more option to look on her packing at it levitra vardenafil it of course to take not so simply because a form another and there is a wish to hold in hand her not so strongly. You can carry by me on a wide field.

Oct 27 2013
Oct 27

Drupal

Drupal

There were four drupal camps  for 2013 on my radar… three firsts in Lahore, Karachi, Dubai and Islamabad’s second camp, and as with most plans.. things got skewed after Lahore!

Back in March at Drupal Camp Lahore we had the unpleasant experience of an individual announce himself as a contender for  ‘douche of the community’ award!  spewing out bigoted, racist opinions about fellow community members  from Bangalore whilst we had the Bangalore community with us over Skype…  you can read the details here. Unfortunately that was not the last we heard from the ‘Douche’, instead of apologising and seeing the errors of his ways the ‘Douche’ having been taken to task by several members of the local community announced his own camps in Karachi and Dubai soon after, with dates to coincide to those organised by ourselves. So we called it a day in the summer and postponed Drupal Camp Karachi to November and Dubai thereafter. Yes… I am venting, am a little annoyed for there has been malice at work from the very start to sabotage the efforts to nurture a single cohesive community in Middle Earth.

Being the first in Karachi or Dubai was not the objective, doing it right was and remains! now on to the upside! Having my summer schedule blown wide open was great! I spent August in the high Atlas in Maroc, summited Tizi Agouri and M’Goun and came back rested and with fire in’me belly for the fall camps! 

DrupalCon_Prague_Logo_2013

DrupalCon_Prague_Logo_2013

September was Drupal Camp Belgium in Leuven and then of course the highlight of all things OS for the year DrupalCon Prague and catching up with friends from all over the rock and making some awesome new ones!

October has been a month of careful planning and absolute frenzy! all good though.

DCPKHI_Logo

DCPKHI_Logo

For Drupal Camp Karachi  the local organising committee and I roped in [email protected] and together they have worked tirelessly to ensure Karachi camp would be worthy of  Karachi’s Drupal Community and the awesome city Karachi is (the economic hub of Pakistan and the third most populated city proper on the rock). The venue is the Institute of Business Administration (IBA), folks at IBA jumped on board with epic enthusiasm from the get go! Karachi camp has a little under 400 delegates registered, 13 speakers from 11 different countries! Karachiites have been awesome! and the credit goes to [email protected] and the local organising committee. I have no doubt Karachi Camp will be epic in proper Karachi style.. on the 2nd of November 2013.

With Karachi sorted, well almost sorted it was time to turn my attention to Dubai, and little surprise the Douche was all over D.O with a Drupal camp in Dubai and had it been properly executed I would have conceded that my job has been done and any further efforts to that end redundant, but that was hardly the case. So Ahmed from Acquia and I ignored the meetup dressed up as a camp and ploughed ahead with Drupal Camp Dubai.

facebook_page

facebook_page

Once again the credit goes to local community members Massoud Al-Shareef, Hani Hejazi, Marwa Ezzat from KnowledgeWARE Technologies who have been epic! with neither Ahmed or me on the ground in Dubai the team from  KnowledgeWARE came to our aid and stepped in where we physically could not! thank you for making it happen! Drupal Camp Dubai is scheduled for the 9th of November at the American University in the Emirates with a strong contingent of local Drupal rockstars and international speakers!

Stay tuned…

Mar 31 2013
Mar 31

Drupal CampKick off for Drupal Camp Pakistan in Lahore was a strange affair! unfamiliarity with the local culture of the metropolis meant we went through a steep learning curve in the morning!

Registration opened at 0900 and by 1000 only half a dozen people had turned up! We were told by the University reps none of the students would be turning up till 1130 – there were classes going on but did not expect industry to be sleeping in!

The few locals who did turn up on time, near on time were quite relaxed… ‘this is a Saturday in Lahore’ we were told, relax.. ‘you said 0930 reg closes right, so they’ll be running an hour late for sure’. All but one took kindly to the norm of his city folk, we ended up getting blame for not organising things properly! I guess the expectation was that we ought to either kick off on time with 8 people in a room that accommodates 100 or to go around waking people up, dressing them, feeding them and bringing them to the camp! WTF!

UNhappy DrupalerOur sincere apologies to Ali Ahmed for deciding to wait for the masses before we kicked the camp off. As forecasted by the locals the Lahoris started trickling in past 1000 and we kicked off at 1015 with a call to Jacob Singh across the border in Bangalore. Jacob had arranged for us to connect with a Bangalore Drupal meetup over Skype (Thank you) and that got me super excited… the prospect of connecting the two neighbouring communities is on every doves mind! this was going to be awesome… well it was until we introduced a local Trainer to the group in Bangalore! and in the interest of politeness I will not name this individual but he really f**ked it up!  This bafoon went off on an idiotic nationalistic rant as far removed from the spirit of community as pluto is from the third rock! it took him 15 seconds to sabotage what was going to be a historic moment for the two communities! It took me a moment to step in and push the fool aside and try and recover from it, 40 local Drupalers and me were in a total state of shock! The look on everyones faces called for a public lynching! I and the 40 odd Pakistani Drupalers in the room have to hand it to the guys in Bangalore for their maturity for brushing aside the idiots comments, thank you Anil and the Bangalore meet up group! I guess every community has an idiot amongst them.

Having been taken off guard, felt like I’d been thrown out of a plane without a parachute, I cut the call with the Bangalore Drupalers short and it was time to set some freaking ground rules!
I took the fool to task as did all the locals. I did not travel 6000+ KM from London to Lahore via Dubai and Islamabad, running on less the 8 hours of sleep over the last 72 hours…. for this! What was heartening was the audience in mass was was calling for blood! LOL letting him know publicly that he is a racist, the fool tried to recover with stupid logic that only a fool can conjure up! The positive from the drama was a racist fool was unveiled and now the local community knows who to avoid like the plague.

Enough of the fool,  rest of the session was spent on a very constructive discussion on borderless communities, OS playing its part to transcend differences of all sorts… and why complete strangers were taking time off from London, Gent, Brighton, Bangalore to Helsinki on a Saturday to share their experiences, and how grateful the locals were for it. It was time to move on…. it was pleasant to hear in a room of 50 odd people by now no one else shared the bigot’s views.

If you are reading this post you know who you are, climb out of your cave of ignorance fella’

Drupal Camp

Fouad Bajwa – innovation is driven from within

Our next speaker was a local open source advocate, Fouad Bajwa who adapted his discussion well to pick up where I left off.. on individual mind-set and culture being the biggest barriers to innovation and growth.

I would have gone into a live commentary of every session as I did from the Islamabad camp but we were not provided wifi access,  bandwidth had been dedicated for the Skype calls… the submarine cable issue under the Suez Canal had not been sorted out, connectivity though fair still wasn’t it’s awesome self and it was more important for our speakers to have all the bandwidth dedicated to the calls…  reporting back to the community could wait till I was back in Islamabad!

Jennifer Tehan's session on backend usability was the most popular session amongst the advanced track

Jennifer Tehan’s session on backend usability was the most popular session amongst the advanced track

Given a late start we had to shuffle things around, by lunch time we had 70 folks in attendance as opposed to the 118 registered for it! and in majority it was the industry that failed to show up! as classes finished more and more students came around to the camp, few already dabbling with Drupal, most plain curious.

Drupal Camp Kubair Shirazee

Me being my Evangelical self

Post lunch we broke off to separate tracks, I went on evangelising and fielding some tough questions on why Drupal from a very informed bunch of CS students near graduation, the advanced tracks did not see the numbers for the industry failed to turn up! the training sessions were well attended and about 40 odd students went through the Hello Drupal sessions.

Amar Mahboob from Kubaku Tech - Flown in from Karachi to attend

Amar Mahboob from Kubaku Tech – Flown in from Karachi to attend and speak at the Camp

All in all Drupal Camp Pakistan in Lahore was a mixed bag… as far as our objectives went, we ticked the introduce Drupal to students box, we ticked the train upwards of 30 students box (we trained 41 to be precise), we ticked the get academia involved box but failed to get the industry to turn up in mass and network with potential future Drupalers!

The most interesting conversations I had was with a number of Professors and associate professors who turned up to feed their own

Deen of IT dpeaking to the mostly student audience - make the most of what the industry shares with you

Deen of IT (Dr Abdul Aziz) speaking to the mostly student audience – make the most of what the industry shares with you

curiosity, of them one needs a special mention Bilal Arshad, who is spearheading the university’s links with industry and has invited us back to the university to evangelise about Drupal and other emerging technologies on a regular basis. This part of the rock certainly needs more folks like Bilal to align the academic curriculum to the practical needs of the industry as well as global demand for talent and skills.

Our closing was spectacular, the Deen for IT from the university turned up impromptu to talk to what was in majority his students and big up our efforts for bringing the camp to his school and insisted that students drink deep from the Drupal spring and maintain contact with those they met from Industry on the day.

Lastly acknowledgements!

Thank you Fida, Atiq, Khurram, Umair and Ahmed from team ikonami for their hard work in organising the camp, its site and everything else before, on the day and after! excellent show cranes – mighty proud of the team. Thank you to our project managers for allowing the team to take time off to organise  the Camp.

Thank you Jennifer, Stefan, Aaron, Dominique, Jacob, Ronald, Fouad, Amar, Anil Sagar (and the Drupalers in Bangalore), Shakeel and Atta for taking time out on a Saturday to share your knowledge and experiences with the community in Lahore! we all appreciate it immensely! it was a shame Mr Purkiss had to cancel bu Steve had a good reason for it.

Thank you Acquia, AberdeenCloud, Kubaku and ikonami for supporting the Camp with their sponsorships.

And lastly, thank you Dr. Muhammad Iqbal, Bilal Arshad, Armaghan and the IT department at University of Central Punjab for hosting the camp and their assistance on the day!

Jan 29 2013
Jan 29

When we first announced the Spark authoring experience initiative for Drupal in May of last year, we chose Drupal 7 as our target in order to develop the features and get them in front of testers as quickly as possible. After DrupalCon Munich in August, the team shifted efforts towards Drupal 8 core instead, in order to more directly improve the experience of Drupal itself. Since then, we have successfully worked with the community to drive home a redesigned and mobile-friendly toolbar, support for draft revisions, in-place editing, numerous mobile improvements, and have WYSIWYG and unified in-place editing on the way.

This has kept the team pretty busy, however, and so the Drupal 7 version of Spark has not been receiving many updates in the meantime. Olivier Friesse (noisetteprod) of Radio France graciously offered to sponsor work to help things along. Thanks to this sponsorship, we were able to have Théodore Biadala (nod_) of Acquia's Professional Services team spend 3 weeks on getting the in-place editing feature production-ready for Drupal 7, including:

  • Full backport of Drupal 8 code, including Create.js/VIE.js integration
  • Integration with CKEditor module to provide WYSIWYG support for rich text areas, which resulted in numerous upstream improvements
  • Removed requirement on jQuery 1.7 so that Edit module can work on stock Drupal 7 installations without jquery_update module
  • Removed requirement on PHP 5.3 so Edit module can also work in PHP 5.2 environments
  • Basic support for Views/Panels in-place editing
  • Numerous bug fixes to help further stabilize the code base

Working towards a stable release for Drupal 7 naturally identified bugs with the Drupal 8 implementation of inline editing, which are being tracked in this issue: https://drupal.org/node/1894454.

In short, the needs of Radio France have brought tremendous value for the entire community, in both Drupal 7 and Drupal 8. If you'd like to try out the work that we've done, download the 7.x-1.0-alpha7 release of Spark or Edit 7.x-1.0-alpha6!

Thanks once again, Olivier and Radio France, for your support! If other companies would like to sponsor further work on Spark, please let me know.

Jan 14 2013
Jan 14

For Acquia, 2012 was a great year. In many ways, it's been our best year.

Last year, we saw more evidence of Drupal continuing to become a growing part of the mainstream. While this trend has been apparent for some time, in 2012 we were being adopted at a faster rate by more and more enterprise businesses and government agencies. Acquia, in many ways, has risen on the tide of this acceptance. Maybe we helped build this momentum. And along the way, as we've grown, we have worked to keep the philosophy of open source as the guiding philosophy of Acquia.

The Open Source Way

The concept of being guided by the philosophy of open source, which I call the Open Source Way, is reflected in Acquia's approach to our products and services. For example, we believe it is important to provide the capability to easily transfer data from one platform or solution to another, and not be shackled to proprietary vendors' platforms. The solutions we offer, whether PaaS or SaaS, allow innovation and agility by following the open source way, eliminating lock-in. We've coined the terms OpenSaaS and OpenPaas to refer to this.

This approach has resonated with enterprise business. This is reflected in our growth metrics for 2012. Our growth was reflected in our sales bookings, which grew at a record rate. We finished the year with 15 consecutive quarters of revenue growth, surpassing even our own aggressive goals.

Acquia grew by more than 160 employees last year, and now totals about 280 staff. In addition to Acquia's base in Burlington (Boston, MA), we have 28 employees in the UK office, 14 in our new Portland office, and 82 working remotely. Success poses many challenges. Hiring so many people is difficult. On one recent Monday, we have about 20 new staff undergoing orientation in our Burlington office. We've met the challenge of hiring, though, and we've assembled a staff of talented, passionate people. They are the reason for Acquia's success.

Our core strength is our ability to accomplish the aggressive goals we set for ourselves. This ability is the result of both the collaboration and the passion the Acquia staff brings to everything we do. Acquia's culture, in which collaboration and passion are key, also reflect the Open Source Way. We bring this passion and collaboration to our customers as well, and we work hard to ensure every customer's success. In 2012, the number of customers renewing with us was up, returning that commitment and loyalty.

Landmarks and trends

As we moved through 2012, we saw the growing acceptance of cloud computing. No longer was it "should we be on the cloud", but businesses asked "how best to move to the cloud". More often, the open, elastic cloud computing offered by Acquia was the answer. Platform as a Service (PaaS) and Software as a Service (SaaS) both continue to gain further acceptance and grow, again providing that ability to react to business needs rapidly, putting a larger portion of resources into building exactly what is needed when it is needed, rather than investing in expensive infrastructure and maintenance. The success of our cloud products means that Acquia will continue to invest and expand in this area in 2013, especially as we saw the trend last year that having many microsites, often one for each product or service, is quickly becoming the rule rather than the exception.

Other landmarks in 2012 were the growing number of health/pharma businesses moving to Drupal and the cloud, joining financial services companies and government agencies also making the move. Until recently, these industries were wary of open source and cloud-based services, fearing that these solutions weren't secure or reliable enough. The reality that the cloud can also be fault-tolerant and highly available, and that security and government compliance requirements can be met with confidence, opened up the cloud to more and more enterprise businesses in 2012. Their move to the cloud in 2012 reinforced the fact that freedom of innovation and agility of open solutions are driving factors for large-scale business as well as smaller organizations.

As the public moves rapidly to mobile platforms of all kinds, including smart phones and tablets, the need to provide a great user experience on these platforms is becoming increasingly important. UX also became important in 2012 as marketing rather than IT became the driving force behind more and more websites. Acquia responded with the creation of our Spark team, which took shape as a five-person team made up of some of the world's best Drupal experts.

Also in 2012, Acquia acquired Mollom, a company I created to address the challenge of managing social spam on websites. With the tremendous growth of user-generated content as part of the social media explosion, unwanted content has become a more important issue to take on. As a SaaS tool, Mollom fits in with Acquia's existing services.

Drupal community

In 2012, Acquia continued to invest in the worldwide Drupal community in a number of important ways. First, we sponsored over 82 Drupal events around the world in 2012. These events brought new people into Drupal and helped existing Drupal users learn new techniques. We employ more than 110 Drupal specialists, most of whom are significant contributors to the larger community. We've sent our Drupalists to more than 30 of these events (as well as hosted sprints ourselves at Acquia) to collaborate with others in the community on important problems for Drupal.

We also grew Acquia's Office of the Chief Technical Officer, or OCTO, in 2012. OCTO includes a dedicated team who work on Drupal full-time, on projects that include:

  • Drupal core architecture issues.
  • Authoring experience improvements via Spark.
  • Spearheading process changes that help the community work better together.

And finally, Acquia has sponsored other key contributors in the community to take on critical work, including the configuration management initiative, web services, and "Views in Core".

Looking forward

This year, like 2012, will be a key year for Acquia as we continue to develop products and services built on the open source philosophy.

Life-cyle management applications will be an increasing focus for Acquia in 2013. These applications will help craft great digital experiences by providing the tools to monitor and optimize digital content.

Of course, we'll continue to nurture and expand our vision of OpenSaaS and OpenPaaS. We'll continue to make the move to PaaS even easier, providing solutions that offer all of the functionality needed, but in a simplified package. We'll accomplish this by combining PaaS, Drupal services and Application Performance Management to produce comprehensive solutions that continue to make Acquia a no brainer when it comes to choosing a PaaS provider. PaaS platforms that embrace an open ecosystem provide faster business value, as many of our customers have discovered. We are working with our growing number of partners to help them build customer solutions on our open cloud platform.

As we start down the road of 2013, we enter the year just having raised $30 million in Series E financing, the single largest financing we have done to date. As we have grown and matured during 2012, these funds will assure sustained growth and success in 2013. No matter how rapidly we grow, or how large the Drupal community becomes, Acquia will put its open source philosophy at the core of all the work it does. In the end, the people of Acquia and the Drupal community, following this philosophy, are building the future of the digital experience. The Open Source way.

Jan 07 2013
Jan 07

A major focus of usability efforts in Drupal core has been around making it easier to edit things on your site. In Drupal 7, we introduced the Contextual links and Overlay modules to make it simpler for content authors and site builders to jump directly to the parts of the administration that relate to the things they see directly on the page, such as blocks or menus. Drupal 8 has now upped the ante with the new in-place editing feature, which allows for direct modification of content on your site, within the context of the page it is displayed on.

The next logical step is to take in-place editing to the next level by unifying contextual editing paradigms: combining the concept of "edit mode" with the ability to contextually edit more than just fields on content, in order to allow for contextual editing of everything on the page, in a mobile-first way.

Specifically, we need to address the following challenges:

  • Conflicting patterns confuse users: There are contextual gears to edit content, local tabs to edit content, and "Edit mode" to edit content. These patterns need to be streamlined.
  • Tasks are not intuitive enough: Seemingly simple tasks can often result in "pogo-sticking" around in the admin backend trying to locate where to change a given setting.
  • Unnecessary information slows users down: Drupal forms tend to be long and full of advanced/confusing options, which can overwhelm users trying to complete simple tasks.
  • Interactions don't work with smaller devices: With Drupal 8's Mobile Initiative, it is critical that these tools be as easy to use on the desktop as they are on a smartphone or tablet.

Here is a video showing what we'd like to propose for solving these problems in Drupal 8 core:

We've now performed several rounds of internal usability testing on this functionality, and it has tested really well so far, with a high emotional value: in general, people can't believe this is Drupal. :-) Check out the prototype yourself at https://projects.invisionapp.com/share/U2A4IAGX.

I'm very excited about these changes, and feel that if we can get this into Drupal 8 it could be game-changing. But what do you think? If you like it, we'd love help with implementation and reviews in the core issue at http://drupal.org/node/1882482.

Dec 07 2012
Dec 07

I'm proud to announce Acquia's newest member of the team, the LEGO Druplicon, courtesy of DataFlow (now ONE Agency). It all started on a hot August day at DrupalCon Munich. On that day, I stopped by DataFlow's booth to look at this amazing piece of art. Obviously I am a bit partial to the Druplicon and the innovative and creative ways people around the world are creating branding for Drupal.

Little did I know some lucky DrupalCon attendee was going to win the Druplicon by guessing how many bricks DataFlow used to build it. After asking a couple of questions, such as “Is it a solid structure or hollow?”, I entered my guess (along with 94 other Drupalists). My mathematical equation brought me to the answer of 12,222 blocks, which was 9 blocks over the correct number of 12,213. I won!

DataFlow went to great lengths to ship the delicate, yet massive structure from Belgium to the United States. After contacting numerous courier companies and hearing the Druplicon needed a special Visa, VAT and insurance documents, as well as it needed to be fumigated (sigh, it's just LEGOs), they found one company that was willing to take on the task. About a month and half later, a pallet jack wheeled into our office and dropped off a 4 foot crate.

Unfortunately due to my travel schedule I wasn't able to open the crate for about a week, which created quite the buzz around the office. We had to schedule the unveiling and make sure we had a crowbar and hammer on hand to open it. Coincidentally this was on my birthday, so it was quite the gift!

I'm happy to report that the 12,213 LEGO Drupalicon made it intact (just a few pieces came loose) due to the wonderful packing material of Belgian toilet paper! I probably don't have to buy toilet paper for a year now. :-)

Lego druplicon Lego druplicon Lego druplicon Lego druplicon Lego druplicon

A huge thanks goes out to DataFlow who spent the time replicating the Druplicon in LEGOs, as well as shipping it over the Atlantic. We are in the process of finding a permanent spot for it in the Acquia office, so it's on display for everyone to see.

Dec 06 2012
Dec 06

For four years now I've been an advisor for Akiban, a Boston start-up building a new class of NewSQL/NoSQL database. I'm excited that after 4 years of hard work, Akiban launched their first Drupal customer solution in the Acquia Cloud. A great opportunity to talk a bit more about what Akiban is doing, and why I'm excited to help their team.

The early phase strategy for Akiban is to augment existing deployments (for example MySQL) to enhance query performance among other capabilities. Our mutual customer was facing performance, concurrency and availability challenges with some custom Drupal report code. The report was built in Drupal as a module, and involved a series of complex joins making performance unpredictable, frequently resulting in slow query performance and periodically crashing the whole site. Using Akiban's database, the customer is realizing 66x performance improvement over their existing implementation, without any significant change to the Drupal application.

One of the core benefits of Akiban is query acceleration. The Akiban database can run along side of MySQL server in "augmentation mode" comparable to master-slave configuration. Akiban implemented a simple Drupal patch which allows the reporting queries to be redirected to the Akiban server. While Akiban’s solution requires data duplication, it also means that there is virtually no intrusion on the day-to-day running of the site.

The report module remains as originally designed but now the problem queries are redirected to the Akiban server. Akiban’s core technology is called Table Grouping. Table Grouping enables for the physical grouping of tables while preserving a logical layer allowing developers to continue to use SQL. This grouping eliminates complex traditional joins while preserving the use of ANSI SQL. In addition, Akiban can create cross-table indexes thus accelerating formerly slow queries. As a result, with the reporting queries now directed to Akiban server, the report performs 66x faster.

The Akiban team refers to Akiban server as a new class of database that accelerates SQL and NoSQL data by 10-100x, while allowing developers to access data in both traditional SQL and RESTful environments (SOAs). Compared to other database technologies, Table Grouping provides an innovative way to store and query structured and semi-structured data.

Akiban's Padraig O'Sullivan is working on a module for Drupal 7, and while there is still some work to be done to test and optimize it, he has already enabled Akiban to run as the source database for Drupal 8 in development. Something to keep an eye on. If you want to test out Akiban yourself, head over to akiban.com and download it.

Nov 29 2012
Nov 29

It's a lot of money but we're on a big mission. We believe that Drupal is uniquely positioned to provide a single, unified platform for content, community and commerce applications. We believe an Open Source platform like Drupal is the best way to keep up with the evolving web. We believe we can take on a large variety of proprietary competitors across different industries. We know it is true because we've seen Drupal invade enterprises and overturn their established web technologies. We believe Acquia is breaking new ground with our combination of cloud products and business models.

We've made good strides towards this mission. Drupal continues to grow faster than proprietary competitors. And as Acquia, we have grown to 250 employees and are well on our way to posting around $44 million in annual revenue this year on $60 million in bookings. Specifically, Acquia's revenue has grown at 250% CAGR over the past 3 years, making us the fastest growing software company in the US according to Inc. We added more than 100 employees in the past 12 months. We've seen some incredible growth across the board.

But we also believe we are just getting started. We are in the middle of a big technological and economic shift in how large organizations build and maintain web sites. We believe that Drupal and Acquia are poised to come out as the dominant player.

We'll use the additional funding to continue to go after our mission. We're set out to build a successful, high-margin, highly defensible software company. Expect to see us use the money to accelerate our sales and marketing efforts, to continue our international expansion across Europe and Asia Pacific, to grow each of our product teams, and even to build more products. Part of our funding is also to make Drupal more relevant and easier to use by digital marketers and site builders - and things like Project Spark are a critical element of this. As Acquia builds products, we're committed to contributing to the Drupal project - to drive adoption of Drupal and make it more competitive with proprietary CMS players.

Press coverage:

Sep 20 2012
Sep 20

I've acquired other companies, but the sale of Mollom to Acquia, was the first time I sold a company of my own. Being the seller felt quite different. It's a interesting mixture of satisfaction tinged with loss. During the negotiation phase you feel joy and excitement. Then you feel frustration as you go through the due diligence process. It's a lot of work. Eventually, the day you hand over the keys you feel like you sold your baby. At the same time, you feel a sense of achievement.

Selling Mollom was a life-changing moment. Not because it was a big financial transaction (it wasn't), but because it proves that I was able to bootstrap and grow a company, steer it to profitability, and successfully exit. It was a great experience, because I know that at some point, I'll have the desire to do that again.

Aug 21 2012
Aug 21

Wow!

Today it was announced that Acquia is the eighth company on the Inc 500. This means we are the eight fastest growing private company in the United States. With nearly 7 million private companies in the US, being honored as number eight is an enormous accolade. In addition, we are the first software company on the list, making Acquia the fastest growing software company in the US. The current print edition of Inc Magazine also has a two page profile on Acquia.

This honor is attributed to each and every Acquian. I’m so proud to be part of such a hardworking and dedicated team! Go Acquia! Go Drupal!

Aug 14 2012
Aug 14

We're excited to announce that Mollom has been acquired by Acquia.

For the foreseeable future, Mollom will continue to be offered as it is today. I will continue my role as general manager of Mollom, Ben will continue to lead the development of our products and the Mollom team will remain unchanged. If you are a user or customer of either Mollom or Acquia, everything will remain exactly the same.

When Ben and I started Mollom almost 5 years ago, we wanted to do something important. While most people were trying to figure out the social web, we were paddling out ahead of the wave, knowing that many websites would soon have to deal with increasing amounts of spam and content moderation. In the past five years, we have helped tens of thousands of people fight spammers on their websites, including some of the world's leading organizations.

We have blocked almost a billion spam messages since we started. It has been very rewarding for us to see that we have helped make the web a slightly better place. At the same time, we also built a healthy business. We successfully bootstrapped Mollom, and organically grew a team of 6 people.

The social wave keeps on growing; we're helping more and more people and organizations every day. But now that social wave has grown so big, we can't rest on our laurels. There are more business opportunities to explore, some of which we have been working on for a while.

At the business level, it made a lot of sense to merge Mollom into Acquia. Ben and I were looking to raise capital for Mollom to help fund future product development and expand our operations. It was clear that it would require a long-term commitment of my time – just at the point when I wanted to focus more on promoting Drupal globally and driving Acquia's growth and expansion. By having Acquia acquire Mollom, I can still be a part of Mollom, and Mollom could receive the resources to accelerate our efforts and create an even more exciting future for Mollom. It also allows me to double down on Drupal and Acquia. In short, I'm really excited to have Mollom as part of the Acquia family.

Keep an eye on us!

Jul 23 2012
Jul 23

We’re happy to announce that Exaltation of Larks is sponsoring, co-organizing and offering pre-camp training at DrupalCamp LA this July 27-29th. We hope that you join us!

Pre-Camp Training

The class that we’re offering is all about Drupal Best Practices, and it’s being offered together with Chapter Three on July 27th at 60% off our usual price. This is one of our most popular classes and is one of our favorites, too.

If you’ve taken one of our previous paid classes, you can use coupon code ALUMNI to get an additional 10% off! (In order to use this code, you’ll need to be logged in with your existing account at https://www.larks.la/training)

You don’t need to be registered for DrupalCamp LA to take our class, but why not sign up at http://2012.drupalcampla.com/user/register today? This gives the conference organizers an accurate headcount, and makes it easy for you to pick out your sessions and add your comments to the session proposals.

Presenting at DrupalCamp LA

Speaking of sessions, all of our session proposals were accepted this year and here’s what we’re presenting:

We’ll also be leading BoF (birds of a feather) sessions on coworking and timebanking, which are two topics we’re eager to share and hear from others about.

Meanwhile, several of our partners, including Chapter Three, Acquia and Build a Module, are also represented at DrupalCamp LA this year:

Upcoming Classes in and Around Los Angeles

Can’t make it to DrupalCamp LA? We have several upcoming trainings that we’ve scheduled throughout the Summer and into the Fall, from introductory Drupal Site Building and Layout and Theming to Module Development and Web Services and APIs.

read more

May 31 2012
May 31

The goal of the Spark distribution is to incubate authoring experience improvements in a Drupal 7 and Drupal 8. It was announced earlier this month, and since then we've been hard at work on initial research and design.

The Spark team's primary focus is on improving Drupal's content authoring and editing experience, and the first feature we're prioritizing is in-place editing: the ability to edit content, menus, etc. directly on the page, without the need to navigate to a separate edit form. Think of it as "true" WYSIWYG.

Members of Acquia's design team spent time analyzing how some of the most widely adopted Open Source as well as proprietary CMSs do in-place editing. We then prototyped some initial ideas, and performed usability testing on those prototypes to see what works and what doesn't. After a number of iterations, we're happy to report that the usability testing has validated Spark's general design direction. People loved the prototype. Now is a good time for us to share our initial prototype and to solicit further feedback from the community so we can shift gears into implementation.

The following 5-minute video walks through the HTML/JS prototype, and also provides a bit of background on the Spark project:

Our goal is to deliver this functionality in a contributed module for Drupal 7 first and foremost, which will live at the In-Place Editing project on drupal.org. This module will be bundled into the Spark distribution. Depending on how it is received, I hope we can also target this functionality for Drupal 8 core.

From a technical architecture standpoint, we are currently in the process of selecting the WYSIWYG editor to use in Spark for in-place editing of HTML content. For now, we plan to focus on supporting only the Filtered/Full HTML text formats in order to get us to something testable faster.

Later, we are hoping to branch out into other areas of authoring experience too, including helping with the content creation form improvements that the Drupal usability team has been spear-heading, as are well as the layouts UI work being actively discussed in the usability group. The Drupal usability team is doing an incredible job with these issues, and once fully staffed, I would like to see the Spark team help implement these improvements for Drupal 8 and backport them to Drupal 7 so we can ship it with the Spark distribution. (Did I mention that the Spark team is hiring? ;-))

As you can see, things are starting to move along quite nicely. Please join the discussion in the Spark issue queue if this functionality sounds exciting to you and you'd like to help!

May 01 2012
May 01

At DrupalCon Denver, I announced the need for a strong focus on Drupal's authoring experience in my State of Drupal presentation. During my core conversation later in the week, I announced the creation of a Drupal 7 distribution named "Spark" (formerly code-named "Phoenix"). The goal of Spark is to act as an incubator for Drupal 8 authoring experience improvements that can be tested in the field.

I hope for Spark to provide a "safe space" to prototype cutting-edge interface design and to build excellent content tools that are comparable with the experience of proprietary alternatives. While not a final list, some initial thinking around the features we want to experiment with is:

  • Inline editing and drag-and-drop content layout tools ("true" WYSIWYG)
  • Enhanced content creation: auto-save, save as draft and more
  • Useful dashboards for content creators
  • Mobile content authoring and administration support

The vision behind the Spark distribution is to be "the Pressflow of Drupal authoring experience". Pressflow provided a "spoon" of Drupal 6 with various performance enhancements that made their way into Drupal 7 core while it was in development. The same improvements were made available to Drupal 6 users so they could easily be tested in the field. With Spark, we want to test authoring experience improvements in Drupal 7 on real sites with real users and real content. We also want to target the best improvements for inclusion into Drupal 8 core.

I'm excited to announce that Acquia will fund the Spark distribution. Core developers Gábor Hojtsy and Wim Leers will work on Spark full-time starting in late May. They will work along side Angie Byron (webhchick), Alex Bronstein (effulgentsia), myself and other members at Acquia. While we have some promising candidates so far, Acquia is still seeking applicants to join the Spark team (with a strong preference to candidates located in or willing to move to the Boston area):

The Spark team will collaborate with the Drupal usability and the core development teams.

Mar 29 2012
Mar 29

Acquia works with many large enterprises that bet on Drupal. These organizations are doing amazing things with Drupal and innovating by breaking through prior limitations. However, in talking to our customers, we noticed that there is limited knowledge sharing and discussion happening among the heaviest Drupal users. Similar problems are often solved multiple times independently, and in incompatible ways. And since few of these large companies are vocal and active in the community, the expertise gained from solving these problems isn't making its way back into the software that all Drupal users rely on.

To help solve these issues, I'm announcing a new program called "Large Scale Drupal" as part of my group at Acquia's Office of the CTO.

Large Scale Drupal is a group of large enterprise Drupal users who meet regularly to discuss and collaborate on common problems. We provide a forum for enterprise users, listen to their needs, prioritize them as a group, and then figure out a proper way to address those needs through knowledge sharing, white papers, training and development. The intent is not to keep the outcome of these meetings just within the group. We want to share what we learn in the Large Scale Drupal group with the specific intent of it becoming a contributed project to Drupal. Once contributed, anyone is welcome to discuss and assist to the project.

So what are these projects? These are common needs for large enterprises that are considered large and complicated Drupal problems. Through a consensus-driven process our first project is working on creating a better content staging system geared toward supporting a publishing workflow. We've already started having detailed discussions and working on some of the basic architecture. We are connecting Large Scale Drupal program participants with members of the community to help advance projects like Workbench, and build new contributions like a site preview system. This program will add to those systems by helping define the needs of the users, funding some of the work, and contributing patches to the code.

The goal of these projects is to foster knowledge sharing and collaboration among members of the group and the community. The Large Scale Drupal members get the benefits of sharing their development costs with other members. The community benefits by gaining new contributions to Drupal, and an influx of expert talent into the Drupal contributor pool. Both the contributions of these companies, and the expertise that they bring to the table will help Drupal remain a long-term viable project.

I'm excited to work with the Large Scale Drupal program members to get them more involved in Drupal and become active contributors to the community. I have a big vision for Large Scale Drupal; something I hope to write more about later. For now, I wanted to announce and bring awareness to the program.

Feb 11 2012
Feb 11

Acquia Insight

Posted on: Saturday, February 11th 2012 by Brandon Tate

Site performance is usually something developed on a per issue basis. Meaning, your site was popular but your code couldn’t handle the popularity! Thankfully, Acquia Dev Cloud and Managed hosting options provide a pretty neat little tool that can help you out with site performance and SEO. It’s called Acquia Insight. The information provided is broken down into two areas called SEO Grader and Insight.

SEO Grader

An area that is commonly overlooked when creating a site is how well your site performs in the SEO world. Once you log into the Acquia Network there will be a link on the left hand side called “SEO Grader”. Clicking this will take you to the overview page that gives you brief look at how your site is doing. If you have any critical issues with your site, you’ll see them here with an exclamation mark beside it. Clicking the “Analysis” link under the SEO Grader menu will give you a more in depth look. Here is it broken down into sections called Page Structure, Crawlability, Findability, User Experiences and Best Practices. Each section will list issues with your site and each issue has a problem explanation and solution provided so not only do you understand why its effecting your site, you also understand how to fix it. As well, each issue has the ability to be ignored since not everything listed will be relevant to your site.

Insight

As a developer, the insight section is very helpful since it gives me an overall look at my sites performance in terms of code, server configuration and MySQL statistics. Once logged into the Acquia Network there is a link for “Insight”, clicking this gives you an overview page with your overall score as well as access to the Code, Server and Statistics information pages from here.

The Code section allows you to see every module you have installed on your site and the files it contains. If any files within a module have been modified you can click into that module and see a code level diff view of the file which allows you to identify any possible problems. The Server section gives you an overview of the PHP information and server. The Statistics section provides you with MySQL statistics that allows you to see things like your cache hit ratio, queries in cache, slow queries etc. Each statistic here has information as to what the stat is relating to and a possible solution if the stat is on the wrong side of the fence. For instance, if your slow queries number is high, you can view the MySQL slow queries log on the server and fix the queries that were slowing your site down.

If you click the “Analysis” link under the Insight menu, you can access the Performance, Security and Best Practices sections. As with the SEO Grader, you can access a list of issues with your site and each issue has a problem / solution provided to help you out.

Email Alerts

Acquia Insight allows you to receive emails concerning Performance, Security or SEO issues as they arise. This is helpful since you can’t always be checking in on your site as it lives out its life cycle. Acquia provides a slider tool to configure which emails you receive (Critical, Warning, Notice or All)

Lifecycle

Over time the performance of a site can degrade and issues can arise from use. Normally, if your not keeping watch these degradation issues will occur at the worst times and usually wreak havoc for a live site. With Insight, it provides a graphical view of your Insight score which allows you to foresee issues as they can occur over time.

Best Practices

I really enjoy the fact that Insight allows you to become a better developer since it provides best practices and highlights issues with problems / solutions. So overtime you’ll notice your sites will perform better out of the box because you’ve been learning from this helpful tool and implementing these solutions beforehand.

Conclusion

Overall I enjoy Acquia Insight and all its capabilities. It provides helpful information and allows you to monitor, troubleshoot and tune for optimal performance. If that isn't enough for you and you want more information about your sites performance, Acquia has another service available with New Relic that provides an extensive web monitoring and management tool that can be easily setup through the Acquia Network interface as well.

Jan 05 2012
Jan 05

It's that time of year again! In good tradition, here is my retrospective on Acquia's accomplishments for 2011. (You can also read my 2009 and 2010 retrospectives.)

In this post, I'll provide some more detail on what Acquia accomplished in 2011; I'll discuss our business as a whole, our products, our relation with the Drupal community and my role within the company. I have a separate blog post to reflect on how Drupal fared in 2011.

Acquia business retrospective

In 2011 we saw record bookings and continued momentum. We finished the year with 11 consecutive quarters of revenue growth and beating our plan.

Acquia, along with our partners, had more and more engagements with big and well-known organizations, like Paypal, Twitter, Al Jazeera, World Economic Forum, the U.S. House of Representatives, and many more.

Most importantly, customer satisfaction and renewals continued to climb, and are best in class compared to other companies in our industry. Rapid customer growth has resulted in surging ticket counts, now numbering in thousands each month. Sustaining high levels of satisfaction and servicing these tickets has proven to be challenging at times. As a result, we significantly evolved our customer on-boarding process, customer communication, and account management, and we've continued to invest in hiring many great people.

Because things went so well, we decided to accelerate sales and marketing and raised more money mid-2011. We raised $15 million in a fourth round of funding. Our previous investors affirmed their confidence by participating in this round, and they were joined by Tenaya Capital.

In January 2011, we also launched Acquia Europe and overachieved our goals there. We now have about 20 people in Europe.

We ended up growing the company from 80 full-time employees to 175, and growing our bookings by 230%. Mid-way through 2011, our existing office space simply couldn't contain us any longer, so we burst out at the end of August and moved to a bigger 35,000 square feet (3,250 square meter) office where we have had a lot of fun.

Despite our success in growing our staff, the availability of quality candidates continues to be the number one challenge for our continued growth. We're trying to help change that. Together with our partners, we delivered 200 training classes worldwide and we've launched an internal training program called Acquia U, to provide immersive training to a select group of new entry level employees (recent college graduates and career changers).

We've also grown Acquia through the acquisition of companies started by talented people within the Drupal community. This year, Acquia acquired two Drupal companies: security specialist Growing Venture Solutions and migration expert Cyrve. We wanted to do these acquisitions because they create a win-win-win situation for the Drupal community, our partners, and our customers.

Acquia product retrospective

On the product side, Acquia achieved everything in line with the product strategy and vision that I outlined in early 2011. If you're not already familiar with Acquia's products, it's worth reading that post first for context.

We rebooted the Acquia Network. We added two of our own services to the Acquia Network with the new Insight and SEO Grader tools, which provides active site testing for security, performance, and search engine optimization best practices for all of your sites.

In addition to adding our own services, we also added complimentary services and tools from our partners, including New Relic (performance monitoring), Drupalize.me (over 200 hours of Drupal video training from Lullabot), Blitz.io (load testing), Utest (crowd sourced manual testing), and Mobify (mobile delivery of Drupal sites). Lastly we re-built the Acquia Library, our knowledge base on everything Drupal and Acquia. Everything combined, we made massive improvements to the Acquia Network.

We also launched Dev Cloud, a single-server version of Managed Cloud. We now deliver over 4 billion page views a month and 70 terrabytes of data from our Drupal-tuned cloud platform. Our operations team now manages over 2,500 servers through Amazon EC2, up from 500 servers in 2011 and 100 at the end of 2010.

A major low-light was the famous Amazon outage in April 2011. Even though only two enterprise customers were affected, out of a couple hundred at that time, we made fairly significant changes to our roadmap to limit future outages. We've since added features to Acquia Cloud like multi-datacenter failover (both multi-region and multi-availability zone across continents) to increase the service level agreement (SLA) we provide to levels beyond what Amazon provides directly.

2011 was also the year that we commercially launched Drupal Gardens at DrupalCon Chicago after spending considerable design and engineering time on the new Views 3 user interface. Since then, Drupal Gardens has added many requested features and now is hosting over 75,000 Drupal 7 sites including some really large enterprise customers, though we can't talk about them quite yet.

We also did a lot of other things; from relaunching Acquia.com on Drupal 7, to adding support for Drupal 7 and Drupal 8 to Acquia Dev Desktop, to improving both Acquia Commons and COD.

All in all, 2011 was a very productive year for our engineers and product managers.

Community and Acquia

In everything we do, we try to raise the tide for the Drupal community at large. In 2011, we continued our long track record of giving back to the larger Drupal community.

Roughly 30% of our engineering time flows back to the Drupal community and resulted in numerous improvements, including core bug fixes, contributed module porting, and usability improvements to modules such as Date, Media, and Views. We participated in the University of Minnesota usability testing, in addition to performing more than 20 internal usability tests on Drupal and Drupal Gardens whose results have been fed into the community.

In total, Acquia sponsored over 58 community events in the last 3 months of 2011 alone, and covered travel and accommodation costs for dozens of Acquians to contribute in person to the success of these events around the world. We also took the lead in organizing and running several of them.

Our marketing team contributed great sales and marketing collateral to the Drupal Association (creative commons-licensed), to help others in the community to promote and grow Drupal.

In addition, we also had some struggles …

Acquia is obviously interested in helping to make Drupal the best it can possibly be and we're proud of major contributions we make to the Drupal project. For example, due to concerns about the lack of Drupal marketing, we launched the Drupal Showcase site as a resource to enable the community to help market Drupal. And since the adoption and growth of Drupal is vitally important, I, supported by the rest of the Acquia leadership team, made a decision to fund a major usability initiative during Drupal 7's development.

However, some of these community investment decisions have backfired on us, and caused community backlash and criticism. Sometimes over smaller things that are easily corrected, as in the case of the Drupal Showcase (moving it from an acquia.com sub-domain and adding a field for attribution), and other times because of questions and concerns about Acquia's influence, as in the case of Drupal 7 usability.

Acquia is in a position where not only can we give back, we want to give back. And furthermore, I feel that corporate sponsorship (not just from Acquia) is important to Drupal's continued growth and success. But when major investments into Drupal like these backfire, it definitely gives us pause in continuing to make these kinds of large investments. Nevertheless, I'd love to contribute more and bigger changes to Drupal, particularly Drupal core, in a constructive and healthy way. As Acquia, we'll continue to refine how we work with the community to find the right balance. As a community, we need to figure out how to better embrace corporate sponsorship. Something to brainstorm about together in this new year.

On a more personal note ...

As Acquia and the Drupal community have grown, so have the demands on my time. Acquia's growing at a phenomenal rate; we're creating a product portfolio with multiple product lines; the Drupal Association is undergoing major changes; Drupal 8 development is underway; I'm traveling around the world evangelizing Drupal 7; and more. To meet all of these demands, I needed to create more time. To do so, I created Acquia's Office of the CTO (OCTO).

I made some amazing hires to be part of OCTO. It is kind of a dream team to work with on a daily basis. Together, we've been very focused on accelerating Drupal growth (enabling distributions on drupal.org, streamlining the contribution process), Drupal 8 (launching initiatives) and Acquia (driving the acquisition of GVS and Cyrve, creating recommendations on Drupal and mobile, researching new product ideas, and working with some of the largest Drupal users in the world).

This was definitely a highlight for me, as it has allowed much more velocity around these important aspects of what I do. We hope to extend OCTO in 2012 with additional people.

In summary …

In general, I'm very optimistic about Acquia's future in 2012. The decisions we've made early in the company's life, despite skepticism by some, have proven to be correct. Enterprises want commercial-grade support and cloud computing. Open Source, Software as a Service (SaaS) and Platform as a Services (PaaS) continues to be on the rise. More than ever, I'm convinced that Platform-as-a-Service (PaaS) and Software-as-a-Service (SaaS) will become the de-facto standard for building and hosting web applications, especially in combination with Open Source web applications. The question is not if it will happen, but when and how fast. When it happens, Acquia will be in a great spot.

We've always been very transparent about our goals and roadmap (Acquia 2009 roadmap, Acquia 2011 product strategy), so in the next month or two, I'll provide more information on Acquia's goals for 2012 and beyond.

Of course, none of this success would be possible without the support of our customers, partners, the Drupal community, and our many friends. Special thanks to all those who helped organize my many visits to India, Brazil, Australia, France, etc. Thank you for your support in 2011, and I look forward to working with you to find out what 2012 will bring!

Jan 03 2012
Jan 03

Tips for Acquia Hosting Development

Posted on: Tuesday, January 3rd 2012 by Brandon Tate

Here at Appnovation, we frequently use the Acquia hosting platform for our clients. The Dev Cloud and Managed Cloud are impressive platforms that fit well for many Drupal sites being built today. I’ve listed some items below that have helped with the overall build quality and ease of use for these platforms.

Utilities - Drush aliases

Anyone who develops with Drupal should know about Drush by now. Acquia has gone ahead and installed Drush and the Drush aliases on your Acquia Hosting account automatically. For example, you can run the command “drush @sitename.stg cc all” from your local computer to clear all the caches within the Drupal site without having to log into the server for it to work! You can find the aliases under Sites > Managed (or Dev) Cloud > Utilities. After downloading the file to your $HOME/.drush/ directory and setting up an SSH key, you're good to go.

Enabling Git

Acquia uses SVN as its primary repository system. However, some of us like to use Git for its enhanced speed over SVN. Not a problem since Acquia supports both. Switching to Git is easy and can be found under Sites > Dev Cloud > Workflow. At the top of the page you’ll find an SVN URL by default with a gear icon located next to it. If you click that icon a drop down will appear and the option to switch to Git will be displayed. Simply click this link and your repository will switch from SVN to Git. For Managed Cloud platforms, you just have to request Git by filing a support ticket through Acquia and they will switch it for you.

Pressflow

Acquia Dev Cloud and Managed Cloud implement Varnish to speed things up. To take advantage of this I recommend you use Pressflow. The installation and setup is the exact same as Drupal and Pressflow is 100% compatible with Drupal core modules. There are some issues with contrib modules, so make sure you check the functionality of these modules before assuming they work. Once Pressflow is installed and setup on the Acquia server, you’ll notice you have a new option under Performance called “external”. This allows Varnish to handle caching instead of Drupal’s stock functionality.

Mobile sites and Varnish

I recently worked on a site that was using Varnish to speed up the performance. The site was also configured to use a different theme when a mobile device was detected. I was using the global variable $custom_theme to switch the theme when a mobile device was found. However, when this solution was implemented with Varnish we noticed that sometimes the mobile site would get served to a desktop browser and vice versa. The problem was that Varnish was caching the page and not hitting the code to determine if the device was mobile or not. To correct this, we needed to switch from using the global $custom_theme variable to using Drupal’s multi-site folder architecture. To do this, you need to add a mobile site folder (m.domainname.com) to the sites directory within Drupal. Then within the settings.php file add the following line.

$conf = array('theme_default' => 'mobile_theme');

This will force the site to use the mobile theme. Next, you’ll have to add the domain to the Acquia Hosting platform which is located under Sites > Managed (or Dev Cloud) > Domains. After that, you’ll have to get in contact with Acquia support so that they can configure Varnish to detect mobile devices and redirect to the correct sites folder.

Memcache setup

Memcache is another technology that speeds up the performance of Drupal. To enable this, you must download the Memcache module from Drupal.org. After this, you can add the following lines into your settings.php file.

if (!empty($conf['acquia_hosting_site_info']) && !empty($conf['memcache_servers'])) {
  $conf['cache_inc'] = './sites/all/modules/contrib/memcache/memcache.inc';
  $conf['memcache_key_prefix'] = 'domainname';
  $conf['memcache_bins'] = array(
    'cache' => 'default',
  );
}

First, I’d like to point out the memcache_key_prefix which must be unique across the different environments such as development to production. This prevents the cache tables from overwriting each other. Next, the memcache_bins key allows you to cache specific cache tables from Drupal. In the example above, I’ve left it to "default" but you could cache specific tables such as views, blocks etc.

Workflow - Lock out the files folder

Acquia has a drag and drop interface that allows the developer to drag the codebase, files and database between development, staging and production environments. This allows you to easily migrate your site between any of the servers. One thing I want to point out is, once your site is on the production server, its a good idea to lock the environment by setting it to Production Mode. This prevents the files directory and database from being overwritten and also allows you to pre-release the site to the client, allowing them to add content while you update the code base. To do this, go to Sites > Managed (or Dev) Cloud > Workflow. There will be a “Prod” section with a gear beside it, clicking that gear will provide a link to switch the site to Production Mode. This can be easily reverted as well by clicking the gear and reverting the site to Pre-Launch mode.

Those are some tips that I’ve discovered over my use of Acquia that have eased the development and deployment of a Drupal site on their hosting platforms. If you have any questions or tips of your own, feel free to comment.

Dec 16 2011
Dec 16

I usually use linux, but for various reasons I've needed to use windows lately and so I figured I would setup Xdebug, Acquia Dev Desktop, and Netbeans in Windows.  I didn't see much for guides out there but its really pretty easy.

Step 1 - Install Acquia Dev Desktop:

You can install either the D6 or D7 one, because really they are the same and you can just add D6/7/yourflavor to it using its "import" button.

I installed this to "C:\acquia-drupal" and "C:\sites\acquia-drupal".  That way I don't have to worry about the spaces when configing my php.ini files.  Spaces in file directories always seem to cause me issues.  Like so:

Step 2 - Install Netbeans

I just went for the php version.  Once its installed you can download any plugins you want.

Step 3 - Setup Netbeans

This is pretty easy, I just basically followed: http://drupal.org/node/1019816.  Some of the options shown on that url are missing in my netbeans, so I just ignored them.

Also, install whatever plugins you want (git is a good one) from W.  To do this I had to run netbeans as administrator (in windows 7), everytime after that I didnt, but to get it going the first time I had too.

Step 4 - Add your project and config it for debug

The Drupal.org link above shows you how to add a project.  One tweak I would do after you add the project, right click your project > properties > Run configuration > Advanced > Do not open webbrowser.

Step 5 - Setup PHP for xdebug.

I noticed Acquia Dev Desktop had the xdebug extension already in the "C:\acquia-drupal\php5_2\ext" folder so I didn't even have to download it.

All I did was edit my php.ini file.  I added this to the bottom:

[debug]
zend_extension_ts=C:\acquia-drupal\php5_2\ext\php_xdebug-2.1.2-5.2-vc6.dll;
xdebug.remote_autostart=off
xdebug.remote_enable=1
xdebug.remote_handler=dbgp
xdebug.remote_host=localhost
xdebug.remote_port=9000

You can find a link to your php.ini file opening your Acquia Dev Desktop Control Panel and clicking on Settings, then config tab, then the "edit" button next to the php.ini file.

After you add the above to the php.ini file, stop and start the Acquia Drupal Stack.  Now, go back into setting, config tab, and click the phpinfo link.  This will open a page where you can see if xdebug is setup and working.  If you see anything about xdebug on that page, its probably working.

Step 6 - Install the easy Xdebug plugin for FireFox

This will put 2 little icons in your lower right of firefox, a bug-looking-thing and a green square.

Step 7 - Setup Breakpoints and debug

Boot up Netbeans, Acquia Drupal Stack, and Firefox. 

In firefox, go to the php page you want to debug. 

In netbeans, add breakpoints to where you want to stop.  Then click to the debug button in netbeans:

In firefox, click the green bug (lower right from easy Xdebug) and reload the page.

TADAAA, Netbeans will stop at the breakpoints and show you variables and such.  Very cool.

Conclusion

So there you go.  Pretty quick and easy to get up and running.  If you have any questions just let me know.  I'm not a pro at this stuff but I'll sure try and answer whatever you throw at me.

Nov 16 2011
Nov 16

Given that there live one billion people in India, many of which great engineers, one can only imagine what would happen if Drupal gained serious traction there. To that extend, I decided to make a trip to India, and spent last week there with Jacob Singh and Ron Pruett from Acquia. The purpose of the trip was to increase awareness of Drupal in India in 3 ways:

  1. by organizing DrupalCamps to help create a grassroots community of volunteer developers, freelancers and small to medium-sized Drupal shops (bottom-up strategy),
  2. by talking to the large system integrators that will employ hundreds of Drupal developers (top-down strategy),
  3. by doing traditional PR with the media and press.

Together with Acquia's partners, we organized 3 DrupalCamps: nearly 300 people showed up in Delhi, 200 people showed up in Mumbai and 350 people showed up in Hyderabad. In addition, I gave a fourth keynote at ISB, India's premier business school, where about 150 people attended. At each of these events, more people showed up than originally expected. More importantly, this implies that there must be thousands of Drupal developers in India alone, especially since we didn't visit many other big cities like Bangalore, Pune, Chennai, etc.

DrupalCamp Deccan registration

Furthermore, we met various large system integrators in India: Accenture, Capgemini, Wipro, Virtusa, Cognizant, and more. Each of these are multi-billion IT sevices companies that employ thousands of engineers in India. Most of them have 1,000+ employees in their content management practices alone. Many are using Vignette, Liferay, Adobe CQ5, OpenText and Alfresco. Joomla! and WordPress seemed non-existent with the large system integrators, but all of them were eagerly starting to build a Drupal practice. The size of their Drupal teams ranged from 30 to 120 Drupal people, with all of them trying to hire 5 to 15 new people a month. All of them were rather bullish about Drupal and were hearing about it directly from their clients across the globe.

In general, I'd say that the Drupal community is about 3 or 4 years behind with the Drupal community in North America and Europe. However, they are catching up fast and it won't take long before many of the world's biggest Drupal projects are delivered from India.

Our ears perked when we learned time after time that well-known Drupal sites that we assumed were developed in the US or Europe were primarily delivered from India. And it didn't stop there; we learned that the Indian teams are also instrumental in the sales and pre-sales process. They are often responsible for making the CMS platform decisions for all of their clients regardless of country or industry. In other words, a lot of decisions are made in India and it is of strategic importance that the large system integrators have a good understanding of Drupal. They recognize this is important to their success, and all want to invest in training to build more capacity and to increase the expertise of their existing teams.

DrupalCamp Deccan attendees

Interestingly, the Indian culture is big on software training and professional certification, more so than anywhere else in the world. All Drupal companies -- small or large -- asked about training and professional certification.

Another highlight is that at DrupalCamp New Delhi, about 15 Drupal companies from Delhi met for the first time. Later the same day, we helped organize the first CXO event for Drupal executives. In many ways, these were formative meetings that reminded me of early DrupalCon meetings. For the first time, they got to know each other, explored how to work together, started sharing best practices and toyed with the idea of specialization. I've seen this movie before, and I know what happens when a community of passionate developers start working together. Exciting times are ahead.

Last but not least, I gave about 15 press interviews, many of which resulted in an article in an Indian newspaper or IT magazine.

Press coverage

After 5 days of intensive travel and back to back meetings in three cities, I left India feeling excited about the size of the opportunity for Drupal. It is impossible to grasp the magnitude of the technology community and the influence India is gaining ... without having been to India. There are a lot of reasons to pay close attention about how the local Drupal community will evolve. I like to believe my trip helped accelerate Drupal's growth in India.

This trip wouldn't be possible without the help of Acquia's partners. Special thanks to Azri Solutions, Blisstering and Srijan who helped make the journey more than successful.

Schedule
Oct 11 2011
Oct 11

Zivtech's Senior Developer, Howard Tyson, recently conducted a Node.js webinar with our Drupal partner, Acquia.

The webinar and description are below:

Bring real time interactivity to Drupal with Node.js integration:

Drupal is a powerful, flexible platform for building applications, but not something that handles realtime notifications easily. Node.js is a breath of fresh air in the Open Source web server landscape. It makes writing applications that handle thousands of open connections at the same time easily.

The Nodejs module integrates Drupal with Node.js, allowing for the best of both worlds. Realtime chat, push notifications and help desk functionality can all be easily added to your Drupal site via the Nodejs module, without the usual scalability and performance issues associated with these technologies on the LAMP stack.

This webinar addresses:

  • Why realtime?
  • Why use Node.js?
  • How does the Nodejs module integrates Drupal and Node.js
  • Current features of the Nodejs module
  • Where the Nodejs module is going

Howard Tyson, Senior Developer at Zivtech has been developing Drupal powered websites since 2006. Howard contributes to Drupal and co-maintains the Nodejs module, Version Control API among others.

Contributor(s): 

Howard

Sep 23 2011
Sep 23

Zivtech's Senior Developer, Howard Tyson, recently conducted a Node.js webinar with our partner Acquia.

The webinar and description are below:

Bring real time interactivity to Drupal with Node.js integration:

Drupal is a powerful, flexible platform for building applications, but not something that handles realtime notifications easily. Node.js is a breath of fresh air in the Open Source web server landscape. It makes writing applications that handle thousands of open connections at the same time easily.

The Nodejs module integrates Drupal with Node.js, allowing for the best of both worlds. Realtime chat, push notifications and help desk functionality can all be easily added to your Drupal site via the Nodejs module, without the usual scalability and performance issues associated with these technologies on the LAMP stack.

This webinar addresses:

  • Why realtime?
  • Why use Node.js?
  • How does the Nodejs module integrates Drupal and Node.js
  • Current features of the Nodejs module
  • Where the Nodejs module is going

Howard Tyson, Senior Developer at Zivtech has been developing Drupal powered websites since 2006. Howard contributes to Drupal and co-maintains the Nodejs module, Version Control API among others.

Aug 04 2011
Aug 04

I’ve been waiting a long time to tell you something.

Several months ago, Treehouse was signed on by (Top 100 Federal Prime Contractor) Energy Enterpise Solutions as the development partner for Energy.gov’s massive, eleven-site Drupal relaunch.

Today, I am ecstatic to announce that the platform is live!

The Energy.gov relaunch represents a huge step in the ongoing progression of major government agencies moving to Drupal; these agencies have included the US House of Representatives, The White House, and the Department of Commerce, among others. As with other federal and state projects, the Department of Energy has proven to be an enthusiastic supporter of the Drupal community, with the project yielding numerous patches and even a new module or two to be contributed back to the community.

New Energy.gov homepage

The project was executed by an all-star team that included not only Treehouse but also the design and usability gurus at  HUGE and Drupal support mavens at Acquia, all brought together by Energy Enterprise Solutions. Cloud-based hosting is provided by BlackMesh.

Running on Drupal 7, the multisite platform gives the Department of Energy the tools they need to both provide a more engaging, enjoyable user experience and realize operational efficiencies.

Highlights of the project include:

  • Easy sharing of content between sites on the platform. Editors can now write content that is easily deployed to multiple sites, rather than each site having its own completely distinct resources.

  • Data visualizations and mapping. Our devs cooked up some very cool things in rendering data visualizations and maps (using the super-slick MapBox). You’ll see more on this in the next week or so as they put together blog content about the technology implemented.

  • Major editor empowerment. Along with creating content that can be applied anywhere within the platform’s network, it is now actually possible for editors to create new sites without relying on the development team.

  • Drupal breakthroughs. Innovations in using Drupal include sophisticated workflows using a state machine, and the new Bean module (currently available as an alpha release). As with the data renderings, you’ll hear more about these innovations in the coming weeks.

  • Independence. The Department of Energy now owns their site platform; its open source code means that they will no longer have to rely on a single vendor for support or site updates.

Finally, a big thank you and congratulations to Cammie Croft and Liz Meckes at the Department of Energy. It has truly been a pleasure working with the DOE team on this project.

As the CEO of Treehouse, I couldn’t be more proud of our team, nor more awestruck by what they have achieved. This project is as much of a milestone for us as I hope it is for the Department of Energy, and I am very hopeful that it will lead to more such projects with our public agencies in the future.

Keep an eye out for tech details from our team in the coming weeks. Trust me, it will be worth the read. ;) In the meantime, check out Energy.gov and join us on Twitter (@treehouseagency)!
May 02 2011
May 02

Last year Telenet successfully migrated its knowledge base and business site to Drupal. As a member of the Ausy/DataFlow group I'm proud to announce that Telenet today launched its multisite search using Drupal.

We continued on the Apache Solr based solution we had already created for the knowledge base while Robert Douglass was hired to work on a Nutch/Solr implementation to crawl the (for now) non-Drupal based sites in the company's portfolio. This powerful combination results in a multilingual multisite search that features autocompletion, spell checking and file indexing.

Contributions were made to the following projects:

Mar 26 2011
Tom
Mar 26

On thursday Northpoint, who recently became an Acquia partner gave a presentation on "Mobilizing Your Organization With Drupal". The webinar was presented by myself and Matt Dorman.

For who want to review the slides, or missed the webinar, here is the presentation.

View the discussion thread.

Mar 22 2011
Tom
Mar 22

logo acquiaFor who is following this blog and the Mobile Tools module, has noticed some spike in my contributions the last days ...

I would like to have a more even distribution of my contributions, but day to day work brings my focus often for longer periodes to different domains (like the Marthastewart new solr integration).

However, for the upcoming Acquia Webinar that I will co-presenting this coming thursday, I did an extra effort to work on the module and write some documentation. With thanks of course to Northpoint to give me the time to work on these projects!

So, if you want to learn more about Drupal and mobile and hear me talking about Mobile Tools, tune in tomorrow to the Acquia webinar:

If you already have questions up front, you can post them as comments!

View the discussion thread.

Mar 02 2011
Mar 02

On March 15 and 16 I'll provide the follow-up training on the introductional Module Development course I gave during the Drupal Dev Days. Learn how to get custom functionality using Drupal’s hook system, as well as how to extend or alter contributed module functionality in this two-day Acquia Drupal Module Development training.

Pages

About Drupal Sun

Drupal Sun is an Evolving Web project. It allows you to:

  • Do full-text search on all the articles in Drupal Planet (thanks to Apache Solr)
  • Facet based on tags, author, or feed
  • Flip through articles quickly (with j/k or arrow keys) to find what you're interested in
  • View the entire article text inline, or in the context of the site where it was created

See the blog post at Evolving Web

Evolving Web