Google Webmaster Tools - Part 2: Key areas in more detail
In my first post I gave an overview of Google Webmaster Tools.
In this second post I am going to look at some of the key areas that I have found useful when reviewing a site listing in Google from a Drupal developers point of view.
These area of interest are: Crawl Errors, Fetch as Google and Sitemaps.
Crawl detailsOnce logged in to Google Webmaster Tools and selected the site I want to deal with, I have found the ‘Crawl’ section (on the left hand side) to be one of the most important areas.
Here you can get information on what site pages Google has crawled, including various errors and details about how many URLs have been indexed from your sitemap.xml file.
Crawl Errors
This section is broken into the different types of errors:
- Server error
- Soft 404
- Access denied
- Not found
- Not followed
- Other.
Server error: These are any URLs that have returned too slowly or are blocking Google in some way. This would typically be pages causing errors on your site, so they should be dealt with fairly urgently.
Soft 404: These pages are interesting. They are like ‘Not found’ pages, but they aren’t strictly invalid pages as they aren’t returning a 404 header response. Google’s 'help' details these pages as:
‘A soft 404 occurs when your server returns a real page for a URL that doesn't actually exist on your site. This usually happens when your server handles faulty or non-existent URLs as "OK," and redirects the user to a valid page like the home page or a "custom" 404 page.'
In some cases, these pages could be search pages which take in various query parameters to determine the search criteria. As the search content changes, the results of certain criteria may return no results.
This type of page can also be seen as a ‘soft 404’ page.
Google recommends setting up your robots.txt file to not index such search pages as the content could be misleading. If you are providing a sitemap.xml file this should contain all of your sites content for Google to index.
Access denied: These are fairly obvious - they are pages that Google can not access.
This might be due to authentication being required or just that Google is being blocked from seeing the page. It's worth keeping an eye on these pages as it might be that you have an error on a page that is preventing Google from accessing it etc.
Not found: These are also fairly obvious - they are pages that Google can not find or are returning a 404 header response.
This might be due to the page changing URL or just that the page no longer exists. It is worth keeping an eye on these pages as it might be that you have removed some pages and you didn’t realise that there was a link on a page on your site (or indeed on someone else's site) that is linking to that page.
In the event that the URL has just changed, but the page that this was referring to still exists, it is advisable to provide a redirect from the old URL to the new URL so that Google can reindex the correct URL. This should be done using a 301 redirect and can be achieved using a htaccess file.
Not followed: These are pages that Google tried to follow but couldn’t for some reason.
Other: This is more of a ‘catch all’ for any pages that couldn’t be accessed but don’t fall into any of the categories above.
What can you do with the list of URLs?
Within each of the above sections, if there are any URLs found, a list will be presented. Clicking on one of the URLs will open up further useful information:
- Error details: When this error was first detected and why etc.
- Linked from: Where this URL is linked from (either your own site or external sites)
- ‘Fetch as Google’: Useful button to see what Google actually sees when it visits the URL
You can also mark URLs as being ‘fixed’, i.e that they should no longer appear in that list.
This will remove them from the list, but if Google detects them again they will get added back.
However, if your content has been ‘fixed’ the URL will automatically be removed from the relevant list when Google crawls that site, you removing it seems to be more for your own sanity and ease of seeing what is still to be sorted out.
Fetch as GoogleThis is a useful little section that enables you to enter a page URL for your site and see what Google sees for that page when it is crawling the site.
SitemapsIf you have provided a sitemap.xml file to Google than this will provide further details on the number of the pages that the sitemap contains against the number of pages that Google has actually indexed.
Google says that it won’t guarantee to index all the sites pages, so don’t expect this to match up, but it does give you a good indication on the number of pages that Google is actually aware of.
Other resourcesTo be honest, I haven’t looked through all the items in here yet, but the main one that I have used is the Pagespeed insights.
This is a great little tool that analyses your site URL and tells you how it can perform better and faster. This is always worth having a look at to see how your site is performing, as sometimes small changes can make a big difference.
In Part 3...I will analyse how data from Google Webmaster Tools helps me understand sites better and improve their standing in Google, complete with examples.
Follow @deeson_labs for all the latest blogs!
Read moreGoogle Webmaster Tools - Part 2: Key areas in more detailBy Mike Davis | 30th June 2014
A lightweight default content solution for Drupal 7 install profiles
As you may have read last week, we're starting up a Drupal 8 CX initiative which will feature a site for tracking the status of Drupal 8 module ports.
We'll be displaying a curated list of modules that we've identified as priorities for Drupal 8. But in order for others to build their own site to track their own priorities, we're building the site using an install profile.
Because I'm using an automated phing task to 'burn and reinstall' the site on a regular basis, I needed a simple lightweight solution for default content - for things like blocks (using bean) and basic nodes.
Read-on to see my approach.
Speedy install to pinpointing slow performance
![](http://web.archive.org./web/20140630184321im_/http://flink.com.au/sites/default/files/styles/large/public/field/image/xhprof%20in%20action.png?itok=hdlvyrvc)
XHProf is a great server-side performance profiler. And as we say in our Drupal community… "there is a module for that". Great as it is, the Drupal XHProf module comes with little documentation. So finding out how and where to install some of the unmentioned bits and pieces can be a chore. Especially when you find yourself faced with downloading and compiling various components on a machine that doesn’t have the full gamut of tools like pecl, apt-get or Homebrew, etc ready to go.
So this is what I normally do for Macs, greatly facilitated by Cameron Tod's very handy page.
o Let’s start on familiar Drupal grounds. Install the XHProf module. The module allows you to easily flick profiling on and off, without the need for defining an additional virtual host and accompanying special domain. The module also comes with some nice touches like selecting the verbosity of the XHProf output and not running XHProf on admin pages.
o The page ..../admin/reports/status/php on your Drupal site will tell you which PHP configuration file (php.ini file) your site has loaded. Edit that php.ini, adding these lines:
extension = xhprof.so
xhprof.output_dir = ...
On a Mac, typical candidates for filling out the above dots are /Users/USERNAME/Sites/xhprof/runs or /tmp/xhprof. Whatever you choose, make sure to create that directory or the xhprof module will spit the dummy. Keep in mind that the /tmp directory is automatically cleared upon startup, so you’ll have to create /tmp/xhprof again after a reboot.
o On https://github.com/cam8001/php-xhprof-mamp select the pre-compiled version of xhprof.so that corresponds to the PHP version you found above. Drop the xhprof.so in /Applications/MAMP/bin/php/php5.x.x/lib/php/extensions/no-debug-non-zts-200xxxxx/, replacing the x'es with your PHP version and date. If you've done this correctly then after restarting MAMP and refreshing the page .../admin/reports/status/php will display a xhprof section.
o In a Terminal window type these commands:
cd ~/Sites
curl http://pecl.php.net/get/xhprof > xhprof.tgz
tar -xzf xhprof.tgz
mv xhprof-* xhprof
mkdir xhprof/runs
# or: mkdir /tmp/xhprof
o Visit .../admin/config/development/xhprof and tick the “Enable” box. Accept the remaining defaults for now. You can revisit these later.
o Visit the home page, or any other page of your site. Scroll UP to see a link “XHProf output” at the very bottom of your browser window. Click that link and a list of the top 100 suspects should come up.
Happy profiling!
In a follow-up article we'll demonstrate how XHProf can help you discover where exactly server-side performance is lost on your site and a handy module that came out of that.
File under:
Planet DrupalI Was Mentored in Drupal by "dumbluck"
The Drupal community web site has a profile field to list "My mentors"
For example, on my profile I say I was mentored by:- robbiethegeek - how to appreciate Drupal awesomeness and its limitations
- Alex UA - how to run a business providing Drupal services
- forestmars - how to be involved in the Drupal community
- smerrill - how to be an engineer with platform tools like Jenkins, Vagrant, Redis
- snugug - how to make web sites responsive
- ericduran - how to experiment with new doodads like HTML5, Android
- zroger - how to use Drupal hooks and APIs in code
I started thinking about my dumb luck picking Drupal as a tool about 9 years ago. I was looking for a Content Management System that made sense.
I was awfully interested in a project called PAWS (PHP Automatic Web Site) -- and it's a good thing I didn't ride that horse, which was long ago put out to pasture.
A client asked me to convert his static PHP site so that he could manage the content in the include files without editing code. I built my first Drupal 4.x site, with the crazy hack of creating a node for every include, and then printing the includes/nodes inside a main node (Panels, sort of, which did not exist in Drupal then). I also customized the front end of the TinyMCE wysiwyg editor to add buttons to apply his brand's pink and blue colors. The client smoked a lot of pot, drifted away, came back a year or two later for more work -- without a database. Oh well, not the first - or last - time the db was lost by a client.
That experience convinced me that a lot could be done with Drupal that I had not been able to do without a lot of custom coding just to build the base web application. Other projects with early versions of WordPress and Mambo (predecessor to Joomla) left me unimpressed with their extensibility. I have often said since then that "WordPress is like the smaller sibling of Drupal, but Joomla is the evil cousin."
Then Earl Miles conjured up his merlinofchaos wizardry for Sony Music, creating Views and Panels and Ctools, and that was around the time that a lot of developers took notice of Drupal. I was profoundly convinced that Drupal had outgrown being a CMS enabling writers to (more or less) easily edit content without (much) coding, and had become a Content Management Framework that could perform elegant and dynamic manipulations of the content in its database.
So I had to add dumbluck to my mentors - not just for my early experiment hacking the node system, but for each solution that I was able to implement afterwards, because my choice of Drupal provided me with an extensible framework allowing complex algorithms for presentation of content, and the Drupal project improves with every contributor's enhancements.
I think I'm dumb, maybe just happy
I noticed in preparing this post that some Drupal user profiles are accessible by username, eg. https://www.drupal.org/u/decibel.places and https://www.drupal.org/u/robbiethegeek, while others, like merlinofchaos and smerrill, are only accessible by their UIDs https://www.drupal.org/user/26979 and https://www.drupal.org/user/77539 respectively.
Lightweight Autosave for Drupal with Garlic.js
Out of the box, Drupal 7 does not have autosave capabilities. The complexity of the kinds of content you can create is probably the reason for this, but that doesn't change the fact that it's a bummer. There are efforts underway to change this for Drupal 8; whether they will actually make it in is another question.
Read moreDrupalCon Austin
The entertainment industry is not for the faint of heart.
Need I mention Alec Baldwin, Lady Gaga, Harvey Weinstein, the Kardashians, Christian Bale... and my very own doppelgänger, Howard Stern?
Which is to say that after a lengthy career toiling in the dungeons of music (rock-band performances at CBGBs, recordings at Electric Lady), television (Emmy Award), and, lately, film (screenplay optioned by Danny Devito), I’ve developed a very thick skin and a willingness to plunge headlong into the unknown, brushing aside or knocking down obstacles in my path, and taking on jobs and responsibilities for which I was eminently unqualified.
Which brings us to DrupalCon Austin.
But first, some back-story.
At my initial interview for the copy editor job at Drupal Watchdog, I was careful to explain that, although familiar with the open source movement and knowing what Drupal was for, I neither wrote code nor had the foggiest notion about how to build a website.
On the other hand, I could put stuff into good English.
They hired me.
Merely a few Watchdog issues later (and still Drupal-ignorant), I decided I should have my very own website and, of course, it should be built on Drupal.
Ta-da!
That evening, on my third martini, I fired off an e-mail to Jeremy (Jeremy Andrews, Drupal Watchdog publisher) proposing I write an article about a Drupal newbie who embarks on his very own website. Jeremy was encouraging and so “Baby Steps” was born.
Naturally, the article was in the form of a screenplay. It starred a character named Ronnie Ray – a martini-drinking, somewhat clueless (but somewhat aggressive) screenwriter. After he read it, Jeremy laughingly mentioned that my article was surely the first time in history that the words “Drupal” and “post-coital” had been uttered in the same breath.
He also requested that “Baby Steps” become “Baby Steps #1”; the first of a regular Watchdog column.
(Yes, I know: Austin. Relax, we’re getting there.)
Desperately Googling material for “Baby Steps #2,” I stumbled across the Drupal Association website and the template for a “Letter to Your Boss,” explaining why it was important to send you to DrupalCon Austin.
Hey, I already knew why it was important send me to Austin: a great music scene, a plethora of hipsters, and terrific craft beers.
So, that evening, 30 minutes into Cocktail Hour, I filled in the blanks of the “Letter to Your Boss” and shot it off to Jeremy...
Within weeks I was on my way to Austin.
Okay, here we are, Austin!
My Sunday evening arrival was a downer: the airline misplaced my luggage and by the time I arrived at the hotel it was too late for a Sunday-night-only Austin institution: chicken-shit Bingo. (Patrons get a Bingo card; a chicken is led into a cage with bars across the bottom with a large Bingo card under the bars; eventually, the chicken drops a chicken-size load and... well, you get the picture.)
Monday I got to meet many of my Drupal Watchdog stalwarts: the-ever-good-natured Jeremy Andrews; coffee savant Jeff Shelten; brilliant Narayan Newton; kooky genius Morten DK; the rarely-seen-in-public “Chx”; Peta Hoyes, Tag1’s beloved Organizing Force; and my reliable wingman for the next few days, Bob Williams. (Thanks, Bob!)
But by Tuesday morning, after Dries’ opening remarks and after attending a session about Drupal something-or-other, it became painfully clear that, Drupal-wise, I had blundered too far, too fast, too deep.
On the positive side, everyone I encountered seemed of boundless good cheer and enthusiasm; there were smiles galore and everywhere you turned small knots of people with DrupalCon name-tags and Drupal t-shirts congregated, introduced themselves, and engaged in animated conversations.
Plus there were the perks: Free yummy lunches! Open-bar parties! Funky little music clubs with no cover or minimum! Jazz! Blues! Rock! Wow, I was loving Austin.
Yet meanwhile, the question kept burning into my guilty, hung-over, coffee-stoked brain: How do I justify my existence here?
Then it struck.
“Jeremy, what if I interview some of these Drupalists, ask them where they’re from, what they do, why they came here, what they expect – you know, to try and get a sense of the Drupal community.”
Jeremy readily agreed, showed me how to set my iPhone to record, and I was off to the races.
The upshot: Not only did I get a sense of the Drupal community, but after transcribing, editing, and submitting the interviews, Peta responded that I had “captured the breath, depth, weirdness, and energy of the Drupal Community... The interviews are light, humorous and insightful. I would like to find a way to use them.”
Use them? Hmmm...
What about in the next issue of Drupal Watchdog?
And so, Ronnie Ray had blundered into another column. *
And a blog post.
* Look for “Baby Steps #3: Lost in Austin” in the next issue of Drupal Watchdog, arriving late-September – in time for DupalCon Amsterdam.
Tags: Baby Steps Austin DrupalCon Watchdog Drupal Association bingo humorNavigating Entity URIs: A Practical Example
At ThinkShout, most of our modules are based around the Entity system. After all, like most developers, we are big abstraction nerds. Entities enable some rad abstraction in Drupal land: our Registration module lets you registration-enable any fieldable entity; the new version of MailChimp lets you sync any fieldable entity with an email address with your MailChimp lists; and our Salesforce module lets you sync any entity with a Salesforce object.
Did you notice the little restriction I worked into my first two examples there? MailChimp and Registration are only for “fieldable entities”. There are a lot of reasons for this, but one of the conveniences of fieldability is that it gives you a natural place to add your entity-specific stuff, like a registration form or a MailChimp list signup dialogue: display it with field API!
Salesforce is different. It isn’t field-based. Instead, an individual “Salesforce Mapping” entity describes a synchronization relationship between a Drupal Entity Bundle (like a node content type of “Event”) and a Salesforce Object Type (like a “Campaign”): there’s no need for any entity-side configuration -- or at least, there didn’t used to be.
Recently, we began implementing a suite of Salesforce sync administration tools to help resolve the inevitable issues that arise with two complex systems trying to pass data back and forth. One of the features of this tool is the ability to change the Salesforce Object that a particular Drupal entity is connected with (change a specific Event to map to a different Campaign). Another is to view the synchronization history for any Drupal entity.
We started out by implementing a central administrative UI to provide access to locate and edit all these Synchronization Object instances.
The UI is handy: searchable, filterable, sortable. Sometimes Drupal makes stuff really easy!
Can we be real for a second, though? If I have an Event syncing with a Salesforce Campaign, and I want to look at the sync history, does it make sense for me to go to a special part of my site and track down that Event with some weird unique UI?
Hardly. Just put a tab on my Event Node, dude!
Great idea! Shouldn’t be too hard, right? We’ll just do a hook_menu, load up all our of Salesforce Mappings, and add a menu item to their Entity Bundles based on their URI:
<?php
/**
* Implements hook_menu().
*/
function salesforce_mapping_menu() {
$items = array();
// Load our Salesforce mappings and loop through:
$mappings = salesforce_mapping_load();
foreach ($mappings as $mapping) {
// Create a dummy entity to load the URI:
$entity = entity_create($mapping->drupal_entity_type, array('type' => $mapping->drupal_bundle));
$uri = $entity->uri(); // Danger Will Robinson!
$path = $uri['path'] . '%' . $type . '/salesforce_activity';
// Figure out which argument has our entity ID in it:
$entity_arg = substr_count($path, '/') - 1;
// Use the URI and entity arg to generate a nice menu item:
$items[$path] = array(
'title' => 'Salesforce activity',
'description' => 'View Salesforce activity for this entity.',
'type' => MENU_LOCAL_TASK,
'page callback' => 'salesforce_mapping_object_view',
'page arguments' => array($entity_arg, $mapping->drupal_entity_type),
);
}
return $items;
}
This worked great in development, but as soon as we tested on a production site, it exploded. Why? This line:
<?php
$uri = $entity->uri();
Sadly, this method doesn’t work for every Drupal Entity. Nodes, for example, and Commerce Orders, don’t respond to $entity->uri(). They like:
<?php
$uri = entity_uri($entity)
Grr. Ok, easy fix right?
<?php
$uri = method_exists($entity, 'uri') ? $entity->uri() : entity_uri($type, $entity);
And yes, this is pretty good. But for some reason, our tab still wasn’t appearing on Commerce Orders. On closer inspection, this is the URI we were getting from our function call on Commerce Orders:
<?php
array(
‘options’ => array(
‘entity_type’ => “commerce_order”,
‘entity’ => {stdClass}
),
)
Notice something missing? Yeah, there’s no ‘path’ index for the next line to use:
<?php
$path = $uri['path'] . '%' . $type . '/salesforce_activity';
Thanks for nuthin', flagship example of how to use the Entity system! I’m sure the Commerce team has a good reason for leaving the ‘path’ piece of URIs empty on raw Entity objects: almost all Commerce Entities behave this way. But it’s not very helpful for us!
We could potentially resolve this by loading a random object and parsing its URI's 'path' to extract an abstract version, or by offering a patch to Commerce. Perhaps the latter option would be ideal, but we decided a work-around would be more expeditious: we really don’t want to break Commerce on a live site.
Instead, we decided to override the entity data for the important entity types in a local module:
<?php
/**
* Implements hook_entity_info_alter().
*/
function my_module_entity_info_alter(&$entity_info) {
// Replace ‘commerce_order_ui_order_uri’
$entity_info['commerce_order']['uri callback'] = 'my_module_uri_order';
}
/**
* URI callback wrapper to ensure a proper ‘path’ index for Orders.
*/
function my_module_uri_order($entity) {
// Call the original uri function and fix only if necessary:
$uri = commerce_order_ui_order_uri($entity);
if (is_null($uri)) {
$uri = array(
'path' => 'admin/commerce/orders/',
);
}
return $uri;
}
This solves the issue for Orders. A similar technique can be used for any Entity Type that fails to offer a proper ‘path’ index for its URI.
The only entities left to deal with are those that don’t offer any URI at all: entities without a direct management interface. Field Collections are a common example. Fortunately, we started out with a Universal Admin UI: it seems reasonable to hang the Salesforce Object administration interface off this Admin page. Here’s the final, complete hook_menu implementation for our Salesforce Mapping UI:
<?php
/**
* Implements hook_menu().
*/
function salesforce_mapping_menu() {
$items = array();
$items['admin/content/salesforce'] = array(
'title' => 'Salesforce Mapped Objects',
'description' => 'Manage mapped Salesforce objects.',
'type' => MENU_LOCAL_TASK,
'page callback' => 'salesforce_mapping_object_overview_page',
'file' => 'includes/salesforce_mapping_object.admin.inc',
'access arguments' => array('view salesforce mapping object'),
);
// Define SF activity local tasks for all mapped entities.
$defaults = array(
'file' => 'salesforce_mapping_object.admin.inc',
'file path' => drupal_get_path('module', 'salesforce_mapping') . '/includes',
);
$mappings = salesforce_mapping_load();
$mapped_entities = array();
foreach ($mappings as $mapping) {
// We grab the bundle now because it becomes inaccessible for some entities
// after it is put into the loop below:
$mapped_entities[$mapping->drupal_entity_type] = $mapping->drupal_bundle;
}
foreach ($mapped_entities as $type => $bundle) {
$entity = entity_create($type, array('type' => $bundle));
$uri = method_exists($entity, 'uri') ? $entity->uri() : entity_uri($type, $entity);
// For entities without their own menu items, we hang the UI off the universal
// Salesforce object admin page:
if (empty($uri['path'])) {
$path = 'admin/content/salesforce/' . $type . '/%' . $type . '/salesforce_activity';
$menu_type = MENU_NORMAL_ITEM;
}
else {
$path = $uri['path'] . '%' . $type . '/salesforce_activity';
$menu_type = MENU_LOCAL_TASK;
}
$entity_arg = substr_count($path, '/') - 1;
$items[$path] = array(
'title' => 'Salesforce activity',
'description' => 'View Salesforce activity for this entity.',
'type' => $menu_type,
'page callback' => 'salesforce_mapping_object_view',
'page arguments' => array($entity_arg, $type),
'access callback' => 'salesforce_mapping_entity_mapping_accessible',
'access arguments' => array('view', $entity_arg, $type),
);
$items[$path . '/view'] = array(
'title' => 'View',
'type' => MENU_DEFAULT_LOCAL_TASK,
'weight' => -10,
);
$items[$path . '/edit'] = array(
'page callback' => 'salesforce_mapping_object_edit',
'page arguments' => array($entity_arg, $type),
'access arguments' => array('edit salesforce mapping object'),
'title' => 'Edit',
'type' => MENU_LOCAL_TASK,
'context' => MENU_CONTEXT_PAGE | MENU_CONTEXT_INLINE,
) + $defaults;
$items[$path . '/delete'] = array(
'page callback' => 'drupal_get_form',
'page arguments' => array('salesforce_mapping_object_delete_form', $entity_arg, $type),
'access arguments' => array('delete salesforce mapping object'),
'title' => 'Delete',
'type' => MENU_LOCAL_TASK,
'context' => MENU_CONTEXT_INLINE,
) + $defaults;
}
return $items;
}
Now we can find what we need from two natural directions: by thinking about Salesforce Sync Objects or just by thinking about the entity we want to deal with. The inconsistent responsiveness of Drupal Entities to the uri() request is frustrating, but not impossible to work around. Hopefully, you find this article helpful -- and if you maintain a module that creates its own entities, please test out the uri() function before your next release!
Drupal 8 alpha 13 on July 2nd
The next alpha for Drupal 8 will be alpha 13! Here is the schedule for the alpha release.
June 30th-July 1st, 2014 Only critical and major patches committed July 2nd, 2014 Drupal 8.0-alpha13 released. Emergency commits only. July 3rd-5th, 2014 Disruptive patch windowJewish Federation of Greater Philadelphia
![Jewish Federation of Greater Philadelphia Website by eCity Interactive](http://web.archive.org./web/20140630184321im_/https://www.drupal.org/files/styles/case588x306/public/JFed1.jpg?itok=oQDRO8cQ)
The Jewish Federation of Greater Philadelphia seeks to enrich the lives of Philly’s multi-generational Jewish community. They work for social justice, educate about Jewish life and tradition, and have even strengthened the Jewish community living in Israel and around the world.
In order to better engage the community they were trying to help, the Federation needed a new website to effectively communicate their work and successes, both locally and abroad. eCity Interactive helped create and cultivate a brand identity via this website that clearly articulated the Federation’s impact on the community as well as convey the importance of getting involved, be it financially or through volunteer work.
Key modules/theme/distribution used: ZenViewsPanelsDisplay SuiteMediaFeedsLocation FeedsLocationGMap ModuleBeanProfile 2RulesSchedulerSearch APITaxonomy menuHierarchical SelectCalendarWebformWebform ReportOrganizations involved: eCity InteractiveTeam members: hessam61The WalkHub distribution now has a recorder!
If you’ve installed your own WalkHub you’ve been able to use the Walkthrough recorder for a few weeks now. But yesterday after adding a few UX improvements we’ve now also released the Walkthrough recorder on WalkHub.net. With it, it is now extremely easy to create Walkthrough tutorials:
Drupal 7 Jammer Module
![Drupal 7 Jammer Module - Daily Dose of Drupal episode 156](http://web.archive.org./web/20140630184321im_/http://codekarate.com/sites/default/files/styles/large/public/media-youtube/p7OEJMb5W_E.jpg?itok=OX9aIoEL)
In this episode of the Daily Dose of Drupal we go over the Jammer module. This simply module allows you to show/hide content type elements from various roles.
Greater Los Angeles Drupal Partners with Microsoft BizSpark
We're excited to announce our partnership with Microsoft BizSpark, a program that provides support to software entrepreneurs.
For a limited time, Greater Los Angeles Drupal members can sign up and receive the Ultimate MSDN subscription (worth up to $13,000 in software licenses) and $150 / month of Windows Azure. Rumor has it that the BizSpark benefits may change in July, 2014, so we encourage you to sign up as soon as possible.
To qualify, you must be:
- Actively engaged in development of a software-based product or service that will form a core piece of its current or intended business
- Privately held and in business for less than 5 years, and
- Bringing in less than US$1 million in annual revenue
This program is not for consultants or agencies. For any questions about eligibility, see Microsoft's Support & FAQs.
Inside the MSDN subscription is Azure, Visual Studio and more, all of which can be used by Greater Los Angeles Drupal startups and entrepreneurs who are developing apps (either web or mobile). If you haven't considered Azure for your startup, see the Microsoft Azure page on Wikipedia for a quick overview.
To get started, contact us and select "Microsoft BizSpark Program" on the the webform. Telling us about your startup is optional and be sure you have a Microsoft ID (outlook.com, hotmail.com, etc.). A Microsoft representative will follow up with you with a personalized link so that you can sign up without the usual waiting period.
This is the second time Microsoft has sponsored Greater Los Angeles Drupal. In November, 2011, Microsoft sponsored Droplabs' Drupal Job Fair and introduced our developer community to their WebMatrix development tools. Thanks, Microsoft! We're grateful for your support.
Tags: MicrosoftBizSparkstartupsPlanet DrupalWebMatrixAzureBooting D8CX
Now that we're nearly down to single figures for beta-blockers a few of us have started organizing around a D8CX initiative similar to that run during the Drupal 6->7 update. Talk on irc over a month-or-so led to a formal kick-off meeting to set down some goals and get some action items.
What is D8CX I hear you say
Back in the Drupal 6 -> Drupal 7 cycle the D7CX initiative promoted/assisted contrib modules porting from Drupal 6 to 7.
The CX stands for 'Contrib experience', ie its about ensuring the best contrib-module experience for building sites with Drupal 8.
Attendance
Present at the meeting were Nick Waring (nickwaring89) (PreviousNext), Dave Reid (davereid) (Lullabot), Tim Plunkett (tim.plunkett) (Acquia) and myself (larowlan) (PreviousNext). Apologies were received from Angela Byron (webchick) (Acquia), Michael Schmid (schnitzel) (Amazee Labs) and Kim Pepper (kim.pepper) (PreviousNext). Although Kim did drop in for the last few minutes.
Goals
Introductions aside we turned our attention to the group's goals which were agreed as follows:
- Promoting the status of Drupal 8 ports of key contrib modules
- Establishing a curated list of modules to report on
- Facilitating communication to wider the community of key contrib module maintainers' needs (eg testing, funding, sprinters)
- Providing a centralized location/point of call for those willing to help/sponsor to make first contact
Tools/Process
We decided that our primary objective should be to reboot a site similar to drupalcontribstatus.com (via wayback machine). We discussed re-purposing d8cx.org but @webchick kindly offered the drupalupgrade.info domain.
Screenshot of drupalcontribstatus.com from Internet Wayback Machine
Proposed features
We settled on the following feature-set for the site:
- Dashboard on home page showing status/% of modules with links to more detail
- Call to action 'get involved'.
- Possible 'pledge/chip-in/sponsor' links where module maintainers identify a need?
- For each selected module
- Status (none/dev/alpha/beta/rc/full)
- Percent complete (manually set)
- Status description (text)
- Upcoming sprints
- Links to crowd-sourcing campaign if applicable
- How to help blurb (priority tasks)?
- Maintainer details/bio
- Port team/sponsor details/acknowledgements/thanks
- Latest news/updates
- News feed (of updates/progress) for syndication (twitter/rss)
In addition we planned to have regular (fortnightly) meetings to discuss progress.
Promotion
We discussed proposed ways to promote the work being done and our status as follows:
- groups.drupal.org/core post to announce initiative and goals with details on how to get involved (you're reading it - spooky)
- Regular blog article on port status/milestones reached (eg module x reached beta) - see news feed feature above
- Regular podcast/lightning talk? (hangouts on air) Regular catch-up with selected maintainer to flag where they're at and where audience can help?
- @schnitzel has proposed a session on D8 Contrib Module status for a session at DC Amsterdam
Education
One of the key items identified is that Drupal 8 might mean some significant refactoring of modules during porting. To this end a Contrib mentoring session similar to core mentoring was proposed, essentially contrib office hours where maintainers/those helping with ports can come to irc and ask questions like 'how should I do this?' 'what happened to y?' 'what's the best way to architect x?'. This is informally happening in #drupal-contribute already but a dedicated Q/A session at regular timeslot(s) via irc made sense. The caveat here would be that the knowledge captured/shared during these sessions be distilled into handbook/documentation pages and/or the examples project. Yes, you must take a blood oath to do so. Seriously.
Action items
Meeting action items were as follows:
- Decide on a domain and organize hosting (@timplunkett).
- Start building the site functionality (@larowlan)
- @nickwaring89 kindly volunteered to co-ordinate site updates/collaborate with maintainers to gauge their needs/status
- Post minutes on g.d.o/core (@larowlan)
- Start building a list of candidate modules to report on(@davereid, @kim.pepper)
- Assess state of upgrade status for support querying 8.x status (@larowlan, @webchick)
- Reach out to other large Drupal shops/service providers to seek their involvement in the initiative (@timplunkett, @kim.pepper)
- Reach out to module maintainers of modules identified(@nickwaring89)
Next meeting
Next meeting 10pm UTC Wednesday 9th of July. This is a rough time-slot for European community members but falls around 8am for Australia and at the end of the working-day for the US. We aim to move to a rolling schedule that would allow the three time-zones of participants (Europe, US, Australia) to be able to reasonably attend two of every three meetings.
Want to get involved?
Get in touch with nickwaring89 to register your interest in getting involved.
AttachmentSize Screenshot 2014-06-27 14.23.17.png88.72 KBLinking to revisionable files in Drupal 7
Our client had some very specific requirements for their project. They needed to be able to insert links to files and they needed to keep the same URL for those files even if the file changed. Those familiar with Drupal will know that by default, Drupal will suffix the newer version of the filename with _0, _1 etc which obviously breaks the URL. Here's how we worked around the issue...
Weaving Community with TimeBanks USA: Drupal and Time-Based Alternative Currencies
TimeBanks USA is a 501c3 nonprofit organization that promotes and supports timebanking. Timebanking was created by Dr. Edgar S. Cahn, who founded TimeBanks USA in 1995.
Timebanking is a tax-exempt alternative currency system that works like this: if I spend one hour helping you build your website, I earn one credit, or time dollar. You can then turn around and exchange that time dollar by giving it to someone who fixes your refrigerator, coaches you on your resume, or gives you a ride to the airport.
“The possibilities are endless,” according to TimeBanks USA. “An hour of gardening equals an hour of childcare equals an hour of dentistry equals an hour of home repair equals an hour of teaching someone to play chess.” It’s different from bartering, because this type of timebanking is based on services (and not goods) between members of a network.
This wasn’t the first time Exaltation of Larks has worked with alternative currencies. We created a virtual economy for Digital Dollhouse, a casual game where girls are empowered to become their own interior designers. In this virtual world, it’s possible to trade or regift items like dolls, plants and pets, and work with an in-game currency named ddCoins.
In addition to our work with TimeBanks USA, our experience with timebanking includes working as volunteers with two Los Angeles-area timebanks: Arroyo S.E.C.O. Time Bank and the West LA timebank cleverly named Our Time Bank. Our Time Machine project is an experimental Drupal installation profile for communities and organizations looking for turnkey timebanking software for their members and participating businesses and organizations.
TimeBanks USA founder Dr. Edgar S. Cahn has spent more than four decades striving for social justice. He began his career working for the Kennedy administration, focusing on alleviating poverty and hunger. He then opened the Citizens Advocate Center, an organization dedicated to protecting the rights of community groups as they interacted with the government. In 1972, Dr. Cahn founded the Antioch School of Law, whose curriculum was designed to teach students to practice law for the greater good of society.
Here at Exaltation of Larks, we have enormous respect for Dr. Cahn: at the age of 80, he is still a rabble-rouser and hell-raiser who is fighting to change the world, and we’re proud to provide him with the technical assistance to further this goal. Dr. Cahn is a true visionary and we hope to work with — and write about — him and his partner, Chris Gray, TimeBanks USA’s CEO, more in the future.
TIMEBANKS USA’s ROLE IN TIMEBANKING
TimeBanks USA supports timebanking in myriad ways, including offering onsite trainings nationwide; organizing an annual timebanking conference; hosting webinars and teleconference calls; and consulting individually with clients. The organization helps members connect with local timebanks or create their own.
One of the parts of TimeBanks USA infrastructure is a large scale social networking platform named Community Weaver, which has a software-as-a-service subscription model. There are more than 400 timebanking websites all around the world that rely on it to help manage and organize their timebanking processes, community activities and other needs.
TIMEBANKS USA’s NEEDS
Exaltation of Larks performed a substantial security and performance audit on Community Weaver, a complex Drupal multisite system. We helped TimeBanks USA fix critical issues affecting one of their essential online organizational tools — their Community Weaver software. This software platform runs a quickly evolving and iterating network of Drupal websites, so it was vital that the software could be updated and developed sustainably and seamlessly, yet without overriding the autonomous decision-making processes of each chapter website.
In addition, we worked with TimeBanks USA to develop a project plan for version 3.0 of Community Weaver and raise the funds to build it; we addressed problems arising from the system’s simultaneous use of both WordPress and Drupal; and we helped streamline the organization’s decision-making process.
TimeBanks USA needed extensive rework on their Community Weaver software, specifically with regard to security, performance and usability issues. Community Weaver is an online organizing and tracking tool for timebank members: it records time exchanged, displays service offers and requests, keeps track of memberships, and displays announcements for the community. Any local timebank can subscribe to TimeBanks USA’s software-as-a-service (SaaS) system to manage their members’ work. TimeBanks USA hired Exaltation of Larks to audit and rework Community Weaver 2.0, with the plans to eventually migrate all their technology, online memberships and e-commerce data to version 3.
TimeBanks USA was also experiencing security problems with its self-hosted WordPress website, which was outside our original scope of work. TimeBanks USA used our emergency support system and we quickly mobilized to resolve this new issue. We determined that security had been compromised and implemented several solutions to tighten it up, from checking the code integrity to updating MySQL access and hardening file permissions.
In addition to our work with TimeBanks USA, we worked with the Arroyo S.E.C.O. Time Bank, one of the many timebanks affiliated with TimeBanks USA. Arroyo S.E.C.O. serves neighborhoods in the eastern and northeastern Los Angeles area, which meant the Larks who were in the Downtown Los Angeles area could work with them one-on-one.
OUR SOLUTION
We began by tackling the security issues found in Community Weaver. Fortunately, TimeBanks USA had an in-house Drupal developer, who we worked with on a massive infrastructure audit, focusing on security and performance. This multisite installation had been built by its previous developer with development practices that were common in 2007, before Features and configuration-in-code became popular. We identified which multisite instances had been modified by their local chapters’ coordinators — which meant examining data structures, views, and content types across hundreds of Drupal websites — and which had unsafe code or configuration. We found security vulnerabilities through the entire stack, from the Drupal systems and websites down to the server operating system, all of which we documented, prioritized and / or resolved.
This was an extensive audit that had both technical and political ramifications. Each chapter is run by its coordinators and volunteers and sometimes in completely different ways than other chapters. In a multisite environment, making technical decisions for the entire fleet of hundreds of websites would impact all local chapter websites that had been modified for their own business cases.
We worked in conjunction with TimeBanks USA to devise policies and joined them on many global community conference calls — open to all coordinators of all the timebanks in the world — to describe our technical approach and to solicit feedback. Our task was to provide technical leadership for the entire organization. We needed a set of standards for sustainable development of this enormous network, but we also needed to respect each individual chapter’s right to make its own decisions.
The project plan we provided included time estimates to address the security problems we found. TimeBanks USA’s tech coordinators reviewed our list of most-needed fixes and then we consulted with a local timebank coordinator and Community Weaver user to make sure these fixes matched their timebank’s list of essential tasks.
We worked with several popular web hosting providers, including Drupal-as-a-service platform companies, to negotiate competitive pricing on behalf of TimeBanks USA. Due to their unique system and web application architecture, we recommended SoftLayer based on their features and pricing.
The unfortunate multisite architecture that the prior developers had devised had the result of creating exponential complexity precluding any proper maintenance and further development on the system. We navigated our way through thousands of lines of uncommented custom code. We also found that the Linux server environment was an abandoned and unsupported custom distro. In both cases, we replaced as many unknown components as possible with stable, peer-reviewed alternatives and we documented the rest. We also stabilized the system by locking down the kinds of changes that individual coordinators could make to their individual timebank chapter websites, thus reducing future maintenance costs.
We fixed several security issues in the system by altering file permissions, MySQL accounts, and text input filters. We used PHP Filter Lock, a module we developed that disables the text form fields that contain PHP code, thereby mitigating the risk of CSRF and XSS security threats on websites that have the core PHP Filter module enabled.
On the same server as the Drupal multisite network was a WordPress marketing website. This in itself is not a problem. Exaltation of Larks’ position is that WordPress is great for simple websites and Drupal is great for complex systems and web applications. Having both on the same server created unnecessary security issues, however. The WordPress installation was technically able to overwrite anything on the Drupal side as well as access the Drupal database. We changed all MySQL usernames and passwords and locked down the file permissions so that the WordPress website could no longer be overwritten or be a risk to other software on the server, including Community Weaver.
Next, we worked with TimeBanks USA to develop the requirements for the next version of Community Weaver. The materials we developed included specifications for a fully featured mobile app, a business plan with financials and pitch deck, and more, and were designed to help TimeBanks USA secure additional funding. In the meantime, we trained a member of their community to maintain the software so they could further reduce their total cost of ownership.
Exaltation of Larks also provided TimeBanks USA with communications strategy consulting services. We performed a 360-degree organizational audit and came up with a more streamlined decision-making process. We created flowcharts of all the key players and stakeholders at TimeBanks USA and highlighted the points at which they had both strengths and weaknesses, and made recommendations where more efficiency was needed.
COMMUNITY INVOLVEMENT
Timebanking has evolved very differently in other parts of the world in ways that no one could have predicted. Nowhere is this emergent behavior more apparent than in highly populated cities, where the numbers, density, and different practices around timebanking create vastly different needs. One such advanced timebank is the Arroyo S.E.C.O. Time Bank in Los Angeles, which has thousands of members across dozens of separate neighborhoods. They needed several custom workflows implemented on their individual timebanking website to manage the scale that had resulted from their impressive growth. By its very nature, the timebank had no money for further development on their individual website.
Barnraisings are a concept taken from Amish culture, where the community comes together to build a barn for a newly married couple who wouldn’t be able to afford the time or expense of building a barn on their own. In the context of web development, barnraisings are like code sprints where the programming community gets together with a deserving nonprofit, and works with them to create or improve their software. For the development community, this is a teaching experience, and newer developers get to learn from seasoned veterans about client relationships, requirements gathering, project planning and the tools used for effective teamwork. The nonprofit brings food — usually excellent food — and everyone benefits.
Starting in April, 2012, the Larks partnered with Droplabs and arranged three separate barnraisings to build new features for the Arroyo S.E.C.O. Time Bank. Not only was a good time had by all, the team built functionality that the Larks turned into Features-based modules that could then be securely distributed to the other timebanks, to be turned on, or not, according to the wishes of each individual timebank coordinator. Features built included a custom registration workflow, neighborhood-specific blogs, and structured data types for content, among others.
PROJECT OUTCOME
Previous to Exaltation of Larks coming on board, TimeBanks USA had been working with a different development company. The Community Weaver software proved challenging to rework and over the 2 years we worked together we ensured that key security and performance problems with the software were resolved.
TimeBanks CEO Chris Gray says of the project: “Given the importance of the software for the mission and vision of TBUSA, and given how much we had to learn, this was a very intense experience for us.”
In addition, with the help of the volunteers at the barnraisings, we added several new features to the Community Weaver software, including a blog post content type and RSVP feature that integrates with the Signup module. These features directly benefit all the hundreds of TimeBanks chapters around the world that use the same Drupal distribution of Community Weaver.
“All members of the Larks team, from the principals to the project leader to the programmers, demonstrated that they cared deeply about the quality of the work undertaken,” Chris Gray said. “[They] provided many hours of consultation to this endeavor. We are truly grateful for those contributions. Under challenging circumstances, they provided highly professional services to TBUSA. We greatly appreciate the professionalism of the Larks and the ongoing willingness to go above and beyond.”
![](http://web.archive.org./web/20140630184321im_/https://www.larks.la/sites/all/files/timebanks-timebanking-larks.png?1403812766)
![](http://web.archive.org./web/20140630184321im_/https://www.larks.la/sites/all/files/timebanks-home-larks.png?1403812766)
![](http://web.archive.org./web/20140630184321im_/https://www.larks.la/sites/all/files/timebanks-community-weaver-larks.png?1403812773)
Branch Naming
Having a good workflow is important. A workflow that is repeatable and consistent makes your life easier.
I create a branch for every Drupal core issue that I work on and use the issue’s node id as a branch name. For example:
git checkout -b 2284103
This system has many advantages, especially if you work on multiple patches. It’s also quite easy to implement. If you are reading an issue on Drupal.org, you already have the branch name. From there, it’s as simple as copying and pasting from the url. If you have git shell completion installed, you can change your command prompt so that you know which issue you are working on by glancing at the terminal prompt.
Closing the Drupal Education Gap
Demand for Drupal talent is high… Really high. A good Drupaler can find work on some of the most notable sites in the world next to other great minds and in good working conditions. Drupal is taking the world by storm, converting government agencies, Fortune 500s and many more on a daily basis. But this popularity has come at a price. The existing talent pool is just too limited to support Drupal’s popularity without serious investment in developing a greater pool of talent, and that something the existing community has got to own and make happen.
So What is Acquia Lift, Anyway?
I’ve spent a disproportionate amount of my time over the last year thinking and talking about Personalization in Drupal (just ask my wife), and I’ve had the privilege of working with a brilliant group of people to help design and build a solution for it. Since we launched Lift in February, I’ve also given a large number of demos and discussed Lift in great detail with organizations large and small, learning ever more about what the needs are in the market, and stealing..err..borrowing ideas from them as I go along.
This post marks the first of a multi-part blog series where I hope to distill everything I know about Acquia Lift as a product, as well as personalization, testing and targeting more broadly as we implement these tools.