Planet Drupal

Subscribe to flux Planet Drupal - aggregated feeds in category Planet Drupal
Mis à jour : il y a 23 min 18 sec

EchoDitto Tech Blog: OS X 10.10 Yosemite Local Development Environment: Apache, PHP, and MySQL with Homebrew

lun, 22/12/2014 - 22:38

OS X 10.10 Yosemite comes with Apache and PHP pre-installed, but it's not in a great configuration, requires root to make lots of changes, and can introduce issues with file ownership and permissions. We prefer to use Homebrew to avoid these problems and because it's easier to keep up to date with newer versions of each component and extend customization. We can also set things up to be fully automatic so you can create new websites locally without needing to edit any configuration files.

With the arrival of Yosemite, some of the changes previously used in 10.9 for setting up Apache, PHP, and MySQL with Homebrew don't work quite the same. This guide will walk you through using Homebrew to install Apache, PHP, and MySQL for a "MAMP" development environment. We'll also use DNSMasq and Apache's VirtualDocumentRoot to set up "auto-VirtualHosts" so you don't need to edit configuration files when starting new projects. Finally, we'll add a firewall rule to allow the default http port 80 to be used without running Apache as root.

The following steps are intended for use on a Yosemite system without any previous attempts to use Homebrew for Apache, PHP, or MySQL. If you have attempted to install a similar stack and run into conflicts, or you've upgraded your operating system from 10.9 and things broke, the final section has some troubleshooting pointers. If that fails, leave a comment and I'll try my best to help you out.

At the conclusion of this guide, you'll be able to create a directory like ~/Sites/project and access it immediately at without editing your /etc/hosts file or editing any Apache configuration. We'll configure PHP and MySQL to allow for enough flexibility for development.

Because some of the commands span several lines, each command will be in a separate code block. This means you should copy and paste each code block in its entirety as a single command.

Before diving in, yes, this is a lot of steps. You can do it faster and pay money for something like MAMP Pro, but this is more fun, and you may learn something along the way! And, while you can simplify things with Vagrant or other virtual machine format, some people prefer to run things on "bare metal" and not have the overhead of a virtual machine.

Homebrew Setup

If you've not already installed Homebrew, you can follow the instructions at the bottom of I used to include the command in previous walkthroughs, but it could change after posting, so definitely always check their website to install it properly.

If you do not have git available on your system, either from Homebrew, Xcode, or another source, you can install it with Homebrew now (if you already have it installed, feel free to skip this step to keep the version of git you already have):

brew install -v git PATH Variable

In previous guides on 10.9 and earlier, I added a change to $PATH in ~/.bash_profile to ensure that Homebrew-installed applications would run by default over similar ones that were already installed on OS X. Thankfully, Yosemite's $PATH order is different than earlier OS versions and now includes the default Homebrew location of /usr/local/bin in front. If you installed Homebrew to a custom location, or are not seeing /usr/local/bin at the beginning of your shell's $PATH, check out the file /etc/paths or the directory /etc/paths.d/.


Install MySQL with Homebrew:

brew install -v mysql

Copy the default my-default.cnf file to the MySQL Homebrew Cellar directory where it will be loaded on application start:

cp -v $(brew --prefix mysql)/support-files/my-default.cnf $(brew --prefix)/etc/my.cnf

This will configure MySQL to allow for the maximum packet size, only appropriate for a local or development server. Also, we'll keep each InnoDB table in separate files to keep ibdataN-type file sizes low and make file-based backups, like Time Machine, easier to manage multiple small files instead of a few large InnoDB data files. This is the first of many multi-line single commands. The following is a single, multi-line command; copy and paste the entire block at once:

cat >> $(brew --prefix)/etc/my.cnf <<'EOF'   # Echo & Co. changes max_allowed_packet = 1073741824 innodb_file_per_table = 1 EOF

Uncomment the sample option for innodb_buffer_pool_size to improve performance:

sed -i '' 's/^#[[:space:]]*\(innodb_buffer_pool_size\)/\1/' $(brew --prefix)/etc/my.cnf

Now we need to start MySQL using OS X's launchd, and we'll set it to start when you login. First, create the ~/Library/LaunchAgents folder if it doesn't already exist, copy the startup plist into it, and then start MySQL:

[[ ! -d ~/Library/LaunchAgents ]] && mkdir -v ~/Library/LaunchAgents ln -sfv $(brew --prefix mysql)/homebrew.mxcl.mysql.plist ~/Library/LaunchAgents/ launchctl load -Fw ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist

By default, MySQL's root user has an empty password from any connection. You are advised to run mysql_secure_installation and at least set a password for the root user:

$(brew --prefix mysql)/bin/mysql_secure_installation Apache

Start by stopping the built-in Apache, if it's running, and prevent it from starting on boot. This is one of very few times you'll need to use sudo:

sudo launchctl unload /System/Library/LaunchDaemons/org.apache.httpd.plist 2>/dev/null

The formula for building Apache is not in the default Homebrew repository that you get by installing Homebrew. While we can use the format of brew install external-repo/formula, if an external formula relies on another external formula, you have to use the brew tap command first. I know, it's weird. So, we need to tap homebrew-dupes because "homebrew-apache/httpd22" relies on "homebrew-dupes/zlib". Whew:

brew tap homebrew/dupes

A slight deviation from my prior walkthroughs: we'll install Apache 2.2 with the event MPM and set up PHP-FPM instead of mod_php. If those terms mean anything to you and you're curious as to why I decided to go this route; it's because: 1) switching PHP versions is far easier with PHP-FPM and the default 9000 port instead of also editing the Apache configuration to switch the mod_php module location, and 2) if we're therefore not using mod_php, we don't have to use the prefork MPM and can get better performance with event or worker. As to why I'm using 2.2 instead of 2.4, popular FOSS projects like Drupal and WordPress still ship with 2.2-style .htaccess files. Using 2.4 sometimes means you have to set up "compat" modules, and that's above the requirement for a local environment, in my opinion.

Onward! Let's install Apache 2.2 with the event MPM, and we'll use Homebrew's OpenSSL library since it's more up-to-date than OS X's:

brew install -v homebrew/apache/httpd22 --with-brewed-openssl --with-mpm-event

In order to get Apache and PHP to communicate via PHP-FPM, we'll install the mod_fastcgi module:

brew install -v homebrew/apache/mod_fastcgi --with-brewed-httpd22

To prevent any potential problems with previous mod_fastcgi setups, let's remove all references to the mod_fastcgi module (we'll re-add the new version later):

sed -i '' '/fastcgi_module/d' $(brew --prefix)/etc/apache2/2.2/httpd.conf

Add the logic for Apache to send PHP to PHP-FPM with mod_fastcgi, and reference that we'll want to use the file ~/Sites/httpd-vhosts.conf to configure our VirtualHosts. The parenthesis are used to run the command in a subprocess, so that the exported variables don't persist in your terminal session afterwards. Also, you'll see export USERHOME a few times in this guide; I look up the full path for your user home directory from the operating system wherever a full path is needed in a configuration file and "~" or a literal "$HOME" would not work. This is all one command, so copy and paste the entire code block at once:

(export USERHOME=$(dscl . -read /Users/`whoami` NFSHomeDirectory | awk -F"\: " '{print $2}') ; export MODFASTCGIPREFIX=$(brew --prefix mod_fastcgi) ; cat >> $(brew --prefix)/etc/apache2/2.2/httpd.conf <<EOF   # Echo & Co. changes   # Load PHP-FPM via mod_fastcgi LoadModule fastcgi_module ${MODFASTCGIPREFIX}/libexec/   <IfModule fastcgi_module> FastCgiConfig -maxClassProcesses 1 -idle-timeout 1500   # Prevent accessing FastCGI alias paths directly <LocationMatch "^/fastcgi"> Order Deny,Allow Deny from All Allow from env=REDIRECT_STATUS </LocationMatch>   FastCgiExternalServer /php-fpm -host -pass-header Authorization -idle-timeout 1500 ScriptAlias /fastcgiphp /php-fpm Action php-fastcgi /fastcgiphp   # Send PHP extensions to PHP-FPM AddHandler php-fastcgi .php   # PHP options AddType text/html .php DirectoryIndex index.php index.html </IfModule>   # Include our VirtualHosts Include ${USERHOME}/Sites/httpd-vhosts.conf EOF )

We'll be using the file ~/Sites/httpd-vhosts.conf to configure our VirtualHosts, but the ~/Sites folder doesn't exist by default in newer versions of OS X. We'll also create folders for logs and SSL files:

mkdir -pv ~/Sites/{logs,ssl}

Let's populate the ~/Sites/httpd-vhosts.conf file. The biggest difference from my previous guides are that you'll see the port numbers are 8080/8443 instead of 80/443. OS X 10.9 and earlier had the ipfw firewall which allowed for port redirecting, so we would send port 80 traffic "directly" to our Apache. But ipfw is now removed and replaced by pf which "forwards" traffic to another port. We'll get to that later, but know that "8080" and "8443" are not typos but are acceptable because of later port forwarding. Also, I've now added a basic SSL configuration (though you'll need to acknowledge warnings in your browser about self-signed certificates):

touch ~/Sites/httpd-vhosts.conf (export USERHOME=$(dscl . -read /Users/`whoami` NFSHomeDirectory | awk -F"\: " '{print $2}') ; cat > ~/Sites/httpd-vhosts.conf <<EOF # # Listening ports. # #Listen 8080 # defined in main httpd.conf Listen 8443   # # Use name-based virtual hosting. # NameVirtualHost *:8080 NameVirtualHost *:8443   # # Set up permissions for VirtualHosts in ~/Sites # <Directory "${USERHOME}/Sites"> Options Indexes FollowSymLinks MultiViews AllowOverride All Order allow,deny Allow from all </Directory>   # For http://localhost in the users' Sites folder <VirtualHost _default_:8080> ServerName localhost DocumentRoot "${USERHOME}/Sites" </VirtualHost> <VirtualHost _default_:8443> ServerName localhost Include "${USERHOME}/Sites/ssl/" DocumentRoot "${USERHOME}/Sites" </VirtualHost>   # # VirtualHosts #   ## Manual VirtualHost template for HTTP and HTTPS #<VirtualHost *:8080> # ServerName # CustomLog "${USERHOME}/Sites/logs/" combined # ErrorLog "${USERHOME}/Sites/logs/" # DocumentRoot "${USERHOME}/Sites/" #</VirtualHost> #<VirtualHost *:8443> # ServerName # Include "${USERHOME}/Sites/ssl/" # CustomLog "${USERHOME}/Sites/logs/" combined # ErrorLog "${USERHOME}/Sites/logs/" # DocumentRoot "${USERHOME}/Sites/" #</VirtualHost>   # # Automatic VirtualHosts # # A directory at ${USERHOME}/Sites/webroot can be accessed at # In Drupal, uncomment the line with: RewriteBase / #   # This log format will display the per-virtual-host as the first field followed by a typical log line LogFormat "%V %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combinedmassvhost   # Auto-VirtualHosts with .dev <VirtualHost *:8080> ServerName dev ServerAlias *.dev   CustomLog "${USERHOME}/Sites/logs/dev-access_log" combinedmassvhost ErrorLog "${USERHOME}/Sites/logs/dev-error_log"   VirtualDocumentRoot ${USERHOME}/Sites/%-2+ </VirtualHost> <VirtualHost *:8443> ServerName dev ServerAlias *.dev Include "${USERHOME}/Sites/ssl/"   CustomLog "${USERHOME}/Sites/logs/dev-access_log" combinedmassvhost ErrorLog "${USERHOME}/Sites/logs/dev-error_log"   VirtualDocumentRoot ${USERHOME}/Sites/%-2+ </VirtualHost> EOF )

You may have noticed that ~/Sites/ssl/ is included multiple times; create that file and the SSL files it needs:

(export USERHOME=$(dscl . -read /Users/`whoami` NFSHomeDirectory | awk -F"\: " '{print $2}') ; cat > ~/Sites/ssl/ <<EOF SSLEngine On SSLProtocol all -SSLv2 -SSLv3 SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW SSLCertificateFile "${USERHOME}/Sites/ssl/selfsigned.crt" SSLCertificateKeyFile "${USERHOME}/Sites/ssl/private.key" EOF ) openssl req \ -new \ -newkey rsa:2048 \ -days 3650 \ -nodes \ -x509 \ -subj "/C=US/ST=State/L=City/O=Organization/OU=$(whoami)/CN=*.dev" \ -keyout ~/Sites/ssl/private.key \ -out ~/Sites/ssl/selfsigned.crt Start Apache

Start Homebrew's Apache and set to start on login:

ln -sfv $(brew --prefix httpd22)/homebrew.mxcl.httpd22.plist ~/Library/LaunchAgents launchctl load -Fw ~/Library/LaunchAgents/homebrew.mxcl.httpd22.plist Run with port 80

You may notice that httpd.conf is running Apache on ports 8080 and 8443. Manually adding ":8080" each time you're referencing your dev sites is no fun, but running Apache on port 80 requires root. The next two commands will create and load a firewall rule to forward port 80 requests to 8080, and port 443 requests to 8443. The end result is that we don't need to add the port number when visiting a project dev site, like "" instead of "".

The following command will create the file /Library/LaunchDaemons/co.echo.httpdfwd.plist as root, and owned by root, since it needs elevated privileges:

sudo bash -c 'export TAB=$'"'"'\t'"'"' cat > /Library/LaunchDaemons/co.echo.httpdfwd.plist <<EOF <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" ""> <plist version="1.0"> <dict> ${TAB}<key>Label</key> ${TAB}<string>co.echo.httpdfwd</string> ${TAB}<key>ProgramArguments</key> ${TAB}<array> ${TAB}${TAB}<string>sh</string> ${TAB}${TAB}<string>-c</string> ${TAB}${TAB}<string>echo "rdr pass proto tcp from any to any port {80,8080} -> port 8080" | pfctl -a "" -Ef - &amp;&amp; echo "rdr pass proto tcp from any to any port {443,8443} -> port 8443" | pfctl -a "" -Ef - &amp;&amp; sysctl -w net.inet.ip.forwarding=1</string> ${TAB}</array> ${TAB}<key>RunAtLoad</key> ${TAB}<true/> ${TAB}<key>UserName</key> ${TAB}<string>root</string> </dict> </plist> EOF'

This file will be loaded on login and set up the 80->8080 and 443->8443 port forwards, but we can load it manually now so we don't need to log out and back in:

sudo launchctl load -Fw /Library/LaunchDaemons/co.echo.httpdfwd.plist PHP

The following is for the latest release of PHP, version 5.6. If you'd like to use 5.3, 5.4 or 5.5, simply change the "5.6" and "php56" values below appropriately.

Install PHP and PHP-FPM. Excluding snmp is a workaround for a problem specific to Yosemite:

brew install -v homebrew/php/php56 --with-fpm --without-snmp

Set timezone and change other PHP settings (sudo is needed here to get the current timezone on OS X) to be more developer-friendly, and add a PHP error log (without this, you may get Internal Server Errors if PHP has errors to write and no logs to write to):

(export USERHOME=$(dscl . -read /Users/`whoami` NFSHomeDirectory | awk -F"\: " '{print $2}') ; sed -i '-default' -e 's|^;\(date\.timezone[[:space:]]*=\).*|\1 \"'$(sudo systemsetup -gettimezone|awk -F"\: " '{print $2}')'\"|; s|^\(memory_limit[[:space:]]*=\).*|\1 512M|; s|^\(post_max_size[[:space:]]*=\).*|\1 200M|; s|^\(upload_max_filesize[[:space:]]*=\).*|\1 100M|; s|^\(default_socket_timeout[[:space:]]*=\).*|\1 600|; s|^\(max_execution_time[[:space:]]*=\).*|\1 300|; s|^\(max_input_time[[:space:]]*=\).*|\1 600|; $a\'$'\n''\'$'\n''; PHP Error log\'$'\n''error_log = '$USERHOME'/Sites/logs/php-error_log'$'\n' $(brew --prefix)/etc/php/5.6/php.ini)

Fix a pear and pecl permissions problem:

chmod -R ug+w $(brew --prefix php56)/lib/php

Until this pull request is merged, set the location of php_ini in pear to $(brew --prefix)/etc/php/5.6/pear.conf:

pear config-set php_ini $(brew --prefix)/etc/php/5.6/php.ini system

The included Opcache extension will speed up your PHP environment dramatically, and it's already installed, but needs to be enabled. We'll also bump up the opcache memory limit:

sed -i '' "s|^\(\[opcache\]\)$|\1"\\$'\n'"; Load the opcache extension"\\$'\n'""\\$'\n'"|; s|^;\(opcache\.enable[[:space:]]*=[[:space:]]*\)0|\11|; s|^;\(opcache\.memory_consumption[[:space:]]*=[[:space:]]*\)[0-9]*|\1256|;" $(brew --prefix)/etc/php/5.6/php.ini

If you're not using PHP 5.5 or 5.6 and wish to add the opcache extension: See

Finally, let's put the PHP-FPM launchd plist file in place and start PHP-FPM now:

ln -sfv $(brew --prefix php56)/*.plist ~/Library/LaunchAgents launchctl load -Fw ~/Library/LaunchAgents/homebrew.mxcl.php56.plist

Optional: At this point, if you want to switch between PHP versions, you'd want to stop PHP-FPM by unloading the plist above, run brew unlink php56, repeat all of the above PHP steps for php55/php54/php53, and loading the new plist. No need to touch the Apache configuration at all!


A difference now between what I've shown before, is that we don't have to run on port 53 or run dnsmasq as root. The end result here is that any DNS request ending in .dev reply with the IP address

brew install -v dnsmasq echo 'address=/.dev/' > $(brew --prefix)/etc/dnsmasq.conf echo 'listen-address=' >> $(brew --prefix)/etc/dnsmasq.conf echo 'port=35353' >> $(brew --prefix)/etc/dnsmasq.conf

Similar to how we run Apache and PHP-FPM, we'll symlink a launchd plist to ~/Library/LaunchAgents and start:

ln -sfv $(brew --prefix dnsmasq)/homebrew.mxcl.dnsmasq.plist ~/Library/LaunchAgents launchctl load -Fw ~/Library/LaunchAgents/homebrew.mxcl.dnsmasq.plist

With DNSMasq running, configure OS X to use your local host for DNS queries ending in .dev:

sudo mkdir -v /etc/resolver sudo bash -c 'echo "nameserver" > /etc/resolver/dev' sudo bash -c 'echo "port 35353" >> /etc/resolver/dev'

To test, the command ping -c 3 should return results from If it doesn't work right away, try turning WiFi off and on (or unplug/plug your ethernet cable), or reboot your system.

Great! So, what did I do?

We set up Apache to run on boot on ports 8080 and 8443 with auto-VirtualHosts for directories in the ~/Sites folder and PHP-FPM via mod_fastcgi. The OS X firewall will forward all port 80 traffic to port 8080 and port 443 to port 8443, so we don't have specify the port number when visiting web pages in local web browsers or run Apache as root. MySQL is installed and set to run on boot as well. DNSMasq and some OS X configuration is used to direct any hostname ending in .dev to the local system to work in conjunction with Apache's auto-VirtualHosts.

What do I do now?

You shouldn't need to edit the Apache configuration or edit /etc/hosts for new local development sites. Simply create a directory in ~/Sites and then reference "http://" + that foldername + ".dev/" in your browser to access it.

For example, download Drupal 7 to the directory ~/Sites/firstproject, and it can then be accessed at without any additional configuration. A caveat - you will need to uncomment the line in Drupal's .htaccess containing "RewriteBase /" to work with the auto-VirtualHosts configuration.

What if this "auto-VirtualHost" doesn't work for [other project]?

If you need to create a manual VirtualHost in Apache because the auto-VirtualHost does not work for your configuration, you will need to declare it before the auto-VirtualHosts if you're also going to use .dev as the TLD. Otherwise the auto-VirtualHost block will be accessed first. I have a commented-out sample for a manual VirtualHost entry in "~/Sites/httpd-vhosts.conf" you may use.


The commands above can be run on a fresh Yosemite system without issue as I've tested with fresh installs in VMware. Nearly every problem I've heard about has been related to upgrading from 10.9 or earlier, or switching to this style of setup from another or similar setup. The easiest thing to do would be to brew uninstall each component referenced above, delete all related config files in $(brew --prefix)/etc and ~/Library/LaunchAgents, and start over. If that's a bit heavy-handed, check each of the configuration files edited in this guide and look for duplicate entries or typos.

You can also check log files for error output:

  • Apache: $(brew --prefix)/var/log/apache2/error_log, or run httpd -DFOREGROUND and look for output
  • PHP-FPM: $(brew --prefix)/var/log/php-fpm.log
  • MySQL: $(brew --prefix)/var/mysql/$(hostname).err
  • DNSMasq: no log file, run dnsmasq --keep-in-foreground and look for output

Leave a comment if you have any questions or problems!

Tags: drupalmamplocal development environmentphpapachemysqlhomebrewdnsmasq
Catégories: Elsewhere

Drupal Association News: Six Things We Learned About Drupal in 2014

lun, 22/12/2014 - 18:59

What a year.

I suppose there is a temptation to say that toward the end of every year but really, WHAT A YEAR FOR DRUPAL.

Here are six things we learned in 2014:

1. There is no challenge too large or complex for Drupal

If there were any remaining questions about Drupal’s ability to scale, they should be more than answered with’s migration to Drupal. The site is one of the largest in the world, serves more than 100 million unique visitors per month, and contains more than 20 million pages of content. There were many other big wins for Drupal in 2014, including becoming the CMS of choice for the Australian federal government and NASA.

2. Drupal is still very popular among beginners and hobbyists

Drupal may be a top solution for large, complex sites, but it is also still popular among beginners and hobbyists. In 2014, the Drupal Association-backed Global Training Days program saw significant growth in participation around the world. Thirty-five countries hosted 170 free or low-cost Drupal training courses designed as an introduction for beginners and hobbyists. Additionally, about a quarter of DrupalCon attendees in 2014 identified themselves as “beginners.” Why is this important? See the next item.

3. Learning Drupal is a smart career move

It’s no secret that Drupal skills are in high demand and have been for some time. In fact, 82% of employers we surveyed during the summer indicated they plan to hire Drupal talent within the next 6 months. Forty percent of hiring managers say they are in “constant” hiring mode for Drupal talent. Few career paths experience that kind of demand.

4. Drupal is free, but it’s also very valuable

If you want to get a feel for the value of technology markets or ecosystems, pay attention to where investors are placing bets. In 2014, big bets were made in the Drupal ecosystem. Within the space of a month, Acquia raised $50 million and Pantheon raised more than $21 million. That kind of confidence by investors requires strong businesses built on mature technologies like Drupal.

5. Signs point to broad adoption of Drupal 8

In our recent Drupal community survey we asked respondents whether they had plans to adopt Drupal 8. More than 80% of Drupal service providers and organizations using Drupal said Drupal 8 is firmly planted on their roadmap. Another 10% said they had plans to evaluate it (look for all results from the survey in the next few weeks). Drupal 8 sessions at 2014 DrupalCon events were among the most widely attended talks. Plus, the momentum toward a final release is building with Drupal 8 now in beta and efforts like the Drupal Association’s “Drupal 8 Accelerate” funding program. Drupal 7 catapulted Drupal into the mainstream. Where will Drupal 8 take the project?

6. The project and the community are strong

The year saw the two highest-attended DrupalCon events ever in Austin and Amsterdam. The number of contributors has topped 2,400 and it's still growing. And here is an interesting number compiled by the Drupal Association engineering team: more than 18 thousand unique people had 10 or more contributions on and its subsites in 2014. “Contributions” in this case could include anything from commenting on an issue to providing a translation, to writing a module. The project also weathered a severe security vulnerability under the leadership of the Drupal Security Team. The year showed just how durable and stable the project and community are.

There were many other triumphs during the year -- too many to list. But all taken together, they point to an exciting 2015 and beyond. I don’t know about you but I’m very excited for the future.

Catégories: Elsewhere

Dries Buytaert: Attitude beats experience

lun, 22/12/2014 - 17:23
Topic: Startup lessonsBusinessAcquiaDrupal AssociationDrupal

The older I get, the quicker the years seem to fly by. As I begin to reflect on a great 2014, one thing is crystal clear again. People are the most important thing to any organization. Having a great team is more important than having a great idea. A good team will figure out how to make something great happen; they'll pivot, evolve and claw their way to success. I see it every day at Acquia, the Drupal Association or the Drupal community. I'm fortunate to be surrounded by so many great people.

By extension, recruiting is serious business. How do you figure out if someone is a great fit for your organization? Books have been written about finding and attracting the right people, but for me the following quote from Dee Hock, the founder of Visa, sums it up perfectly.

"Hire and promote first on the basis of integrity; second, motivation; third, capacity; fourth, understanding; fifth, knowledge; and last and least, experience. Without integrity, motivation is dangerous; without motivation, capacity is impotent; without capacity, understanding is limited; without understanding, knowledge is meaningless; without knowledge, experience is blind." — Dee Hock, founder of Visa.

Most hiring managers get it wrong and focus primarily on experience. While experience can be important, attitude is much more important. Attitude, not experience, is what creates a strong positive culture and what turns users and customers into raving fans.

Catégories: Elsewhere

Acquia: Drupal & PHP: Linking Islands, the podcast – part 2

lun, 22/12/2014 - 17:12
Language Undefined

Part 2 – Larry Garfield and I had a long chat in front of my camera at DrupalCon Amsterdam to warm him up for writing "Building Bridges: Linking Islands" in the Future of PHP guest blog series on In this second part of our conversation, we touch on Drupal's specialist value-adds over and above straight PHP, what defines community, sustainable contribution and services v products businesses, rebuilding Drupal's foundations to make a better project for everyone, the php[world] conference and Drupal 8 itself as manifestations of all the good changes coming with PHP interoperability, how communities are building bridges between their islands and sharing innovation, and how to do the Drupal Hug™.

Catégories: Elsewhere

Mediacurrent: Drupal Strategy Tactics and Tools for 2015

lun, 22/12/2014 - 16:48

As if the holidays are not busy enough, for many of you it’s also crunch time in planning your marketing and digital efforts for 2015.

To ease some of the pressure, we can help get your Drupal website in tip-top shape with a detailed kick-starter package that takes the guesswork out of forming a revenue generating digital strategy. 

Highlights include: 

Catégories: Elsewhere

INsReady: Watch Drupal 8 Release Progress on Your Android Wear

lun, 22/12/2014 - 16:14

Recently, I started building new projects on Drupal 8. Everyday, I spent some time on checking the progress of a few D8 issues that I needed and the overall D8 progress. I thought it might be fun to have some progress numbers to show up on my Moto 360 Watch, and it's almost Christmas, so I decided to build my own Watch Face for Android Wear to monitor Drupal 8 Release.

The version 1.0 release of this watch face looks like the picture below

Development Story

Thanks to Drupal 8 Release Project, the app can easily get a few things down from the Internet:

  • The current number of critical issues
  • The current number of major issues
  • yesterday number of critical issues
  • yesterday number of major issues
  • Overall estimated Drupal 8 release date

The watch face logic and component is straightforward:

  • It has a simple (analog) watch.
  • Every 6 hours (this interval is set by Drupal Release Date Project to crawl, the watch sends the signal to the companion handheld device to download the new data.
  • The handheld device uses Retrofit library (built by Square) to efficiently access Drupal Release Date Project API and parse the JSON data.
  • The handheld device calls the Data Layer API (the actual communication is over Bluetooth), and then to sync the data to Android Watch.
  • The Android Wear app draws data on the watch face.

Try the App
The source code of this project is at ReleaseWatch
The Watch Face App is available on Google Play.

Merry Christmas! and if you have ways to improve or extend the project, please use the comments below to enlighten me!

Files:  ReleaseWatchPhoto.pngTag: Android WearWatch FaceDrupal 8BluetoothRetrofitDrupal PlanetGoogle Play
Catégories: Elsewhere

Cheppers blog: Apache Solr and Drupal - Part II: How to set up Drupal and Solr to search in attachments

lun, 22/12/2014 - 15:49

In our previous blogpost we presented how to install and set up Apache Solr. But what do you do when you need to search in files as well?

For a recent project I had to enable users to search the content of attached files mainly in .pdf format. The Apache Solr with Tika seemed to be a good solution.

Catégories: Elsewhere

Propeople Blog: Propeople, Blink Reaction and Bysted: Creating A New Agency for the Digital Age

lun, 22/12/2014 - 15:00

Earlier today, Propeople (together with our parent company, Intellecta) made two big announcements that I am really excited about. The first is that Blink Reaction is joining our larger Intellecta family, and will be merging with Propeople - creating the largest professional Drupal services company in the world! The second piece of news is that Propeople is also merging with Bysted, one of Denmark’s foremost creative agencies. Together, these two deals are strategic in starting an exciting new chapter for Propeople.

Intellecta’s purchase of an 80 percent stake in Blink Reaction also means that Blink Reaction will be operating under my direct management. Our companies will initially operate as independent units but will join together as a new company under a unified brand by the deal’s completion on March 31st, 2015. This new agency will have a truly unique international reach - with 350+ employees worldwide, working across 9 countries. The new agency’s global footprint and working capacity will be unmatched in the Drupal space.

It is an honor to lead the start of a whole new chapter for Propeople and Blink Reaction. I hold the company that Nancy Stango (Founder and CEO of Blink Reaction) and her team have built in very high esteem, and can’t wait to see what we’ll be able to achieve together.

Welcoming Blink Reaction into the Intellecta family will greatly expand our technical capacity, specially when it comes to the development of digital solutions built on Drupal. At the same time, bringing Bysted into Propeople will bring our creative, design, and strategy offerings to new levels. Both of these developments will prove to be strategic in charting the future direction in which Propeople is heading.

This future direction is driven by the vision of being a full-service agency for the digital age. Propeople is an agency that has had a truly technical upbringing; this is at the core of our identity, manifests itself through our entire organization’s culture and touches everything that we do.

The majority of the prominent agencies in the larger digital space tend to come from strong creative or communication backgrounds. The fact that Propeople comes from a technology background is a significant distinction in a world where technical matters have become increasingly more important for organizations as they develop their brand’s digital presence. And I’m not just talking about the importance of coding - but the larger way that analytics, data, and integrations with a variety of systems seem to be the common threads running through everything that a company does.

Today marks an important milestone for me, the Propeople team around the world and our customers. I, for one, can’t wait to get started!

Check this option to include this post in Planet Drupal aggregator: planetTopics: Business & Strategy
Catégories: Elsewhere

Yuriy Gerasimov: Panels control panes render sequence

lun, 22/12/2014 - 12:05

Panels standard renderer has very flexible undocumented feature of controlling the sequence of panels being rendered.

By default you have possibility to use 'render first' and 'render last' in your content type definition so you already can control what pane should be rendered for example last. Undocumented part is more interesting that is hook_panels_panes_prepared_alter() that runs after all panes were set up. So you can alter the array of panes in which way you can control sequence of panes being rendered. This feature is super handy when you have dependent panes.

Example can be if you have several panes with list of news articles. Lets say one block displays 3 items and another block displays other 5. But the problem is that editors can place blocks independently and you do not know whether you have two blocks on the page or only one. But you know that block that have 3 items should be rendered first and then block of 5 so first block has more recent news articles. Using properties 'render first' and 'render last' you can do the trick. When you render 3 items block you can save some static variable so when you render 5 items block you can check that variable and if previous block set it to TRUE you need to shift your list to 3 items so you won't duplicate news articles in both lists.

Meanwhile if you have multiple combinations of similar blocks you can use hook_panels_panes_prepared_alter() and control which block renders first and then you will still have very nice lists of articles.

I would like to thank Andrii Tiupa for pointing me to this brilliant feature.

Tags: drupalpanelsdrupal planet
Catégories: Elsewhere

3C Web Services: An introduction to Drupal Hooks

dim, 21/12/2014 - 22:48
Drupal Hooks are extremely powerful and are one of the main attractions for many people to Drupal. These hooks allow you to view, change and work with various data at specific points of time in Drupal’s processes.
Catégories: Elsewhere

Michael J. Ross: A Drupal Night Before Christmas

sam, 20/12/2014 - 18:06


'Twas the night before Christmas, here at the North Pole,
and I feared our big deadline was a hopeless goal.

Our long lists of boys and girls, and addresses too,
were now vexing to manage — a redo overdue!

The data were buried in a mess of spreadsheets,
and the elves were crying "Help!" in emails and tweets.

They cursed and they swore when Excel crashed once more.
(So a mansion in Redmond I vowed to ignore.)

When outside the workshop there arose an odd noise,
I waddled from my old desk with more hope than poise.

Out in the snow was parked a snazzy flying car
with shiny blue paint that reflected the North Star.

The driver emerged and my dark worries did cease
because I knew right away it must be "Saint Dries".

I welcomed them all — a team led by the tall gent
with spiky hair-icicles and Belgian accent.

I told them our sad tale of a data nightmare,
of flat files, scattered papers, and flaky software.

The content mismanagement was too much to bear,
but they assured my poor staff we need not despair.

"Replace that tangle of one-off utilities
with a website using Drupal's abilities."

They spoke no more praise but began working like mad,
and soon produced wireframes that looked totally rad.

They chose modules with care, these downloads they came.
The team typed happily as they called them by name:
"Now Token and then Rules!
Next Views and CTools!
Then JQuery Update!
Plus Backup and Migrate!
download and install!
Add them to the website!
Enable them all!"

We gave them plenty of our taxonomy tags,
such as "toys" and "dolls" and "coal" and "bags".

The cool website they built would surely save the day,
and cookies and milk is all they asked for in pay.

They left in their car, like a streaking water drop,
when its flux capacitor gave a thunderous pop.

And I heard them exclaim as they faded from sight,
"Merry Christmas to all, and to all a Drupal night!"

Catégories: Elsewhere

Pixeljets: Building scalable IT system for delivery from US to Russia: Drupal, Symfony2 and Yii2 compared

sam, 20/12/2014 - 14:15

I was not posting to the blog for a long time, and finally it’s time to share my experience with new project. This post will also cover some badly structured thoughts about PHP frameworks :)

As part of Qwintry team, we’ve built a great b2b product in logistics sphere - Qwintry Logistics - delivery from US to Russia - and it was built on a new PHP framework, so it was a big deal for us - lots of new experience, and it’s great that it was not just experience but a business success as well :)

read more

Catégories: Elsewhere

Oliver Davies: Include a local Drupal settings file for environment configuration and overrides

sam, 20/12/2014 - 12:16

At the bottom of settings.php, add the following code:

$local_settings = __DIR__ . '/settings.local.php'; if (file_exists($local_settings)) { include $local_settings; }

This allows for you to create a new file called settings.local.php within a sites/* directory (the same place as settings.php), and this will be included as an extension of settings.php. You can see the same technique being used within Drupal 8's default.settings.php file.

Catégories: Elsewhere

Wunderkraut blog: A Medium like editor for Drupal

sam, 20/12/2014 - 10:19

The editor used to edit posts at is a real slick, and I find it interesting and intuitive. Davi Ferreira have made an open source clone of it, so it could easily be used in other places.

@cweagans have done great work to get the Medium editor in it's own module, but I would rather myself have it inside the WYSIWYG API. so I took some parts of his work and did a patch, so if somebody else finds it interesting to get this editor to work with WYSIWYG API, please try it out, test, review, throw stuff at it...

As a first step I just added the text editing part, with further plans on try it to get it to work with Asset for images, videos etc.

Catégories: Elsewhere

Drupal Association News: Drupal Association Board Meeting: 17 December 2014

ven, 19/12/2014 - 20:46

This week we held our last board meeting of the year, and we covered a lot a of ground. Unlike November, where we had a relatively short public meeting, this session took the full two hours to get through. We covered a lot of topics, from DrupalCon Amsterdam to updates from the Working Groups. As always, you can review the minutes, the materials, or the meeting recording to catch up on all the details. Here's a summary for you as well.

Operational Update

The month of November was short given the US holiday (Thanksgiving), but we still have a number of initiatives that we managed to push significantly forward. Among them:

  • Licensing Working Group: We recently put out a call for volunteers for the Licensing Working Group, whose charter was approved at the November board meeting. If you are interested in licensing issues, we hope that you will consider applying. The Licensing Working Group will play a pivotal role in helping contributors navigate what is and isn't allowed quickly and in keeping our code GPL compliant and safe.
  • Social capital and the Driesnote: In Amsterdam, Dries laid out a vision for the future of contribution in our community. We also began sharing a plan for in 2015 at DrupalCon Amsterdam that aligns with that vision. We have been laying the groundwork over the last few months, working on commit messages and profile improvements that will make it possible to illustrate not just code contribution, but the many kinds of contribution that individuals (and soon, organizations!) make in the Drupal community.
  • 2015 workplans: Association staff have been very busy preparing workplans for 2015 as well. The DrupalCon team has been rethinking food and fun at DrupalCons based on recent survey feedback. The team has been working on the roadmap. Our revenue team has been planning for solidifying the new revenue programs we launched this year (like Drupal Jobs) and planning for new opportunities as well.
  • DrupalCon Latin America: We are all very excited to get to Bogota for DrupalCon Latin America next February. Everything is on track for this event from a logistics standpoint. We have speakers and space and now all we need are more people. We are planning for 400 people to be there and have about 90 registered so far. Normally, we would have a much higher percentage of tickets sold at this point, but with a very minimal price increase between rates, and with the holidays, we suspect we will see more registrations closer to the date of the Con.
Marketing & Branding Committee Update

We're coming up to a pretty pivotal time for Drupal marketing. As we near a Drupal 8 release, the Marketing and Branding Committee can help lead the community in making this the biggest Drupal release ever. In the meeting, the Board voted to approve the appointment of Gina Montoya of Blink Reaction as the new Chair of that committee. Congratualtions and thank you Gina!

DrupalCon Amsterdam Wrap

Over the last few Cons, we have worked hard to collect more data about our attendees and their experience and to analyze that data to understand what's working and what's not. We looked at a LOT of data for DrupalCon Amsterdam, and shared what we learned and what we will be applying to future Cons. In short - the Con was very successful financially, but we continue to struggle to collect session evaluations and, frankly, the food was terrible. We are very sorry about that. Basically, until the last two weeks before the Con, ticket sales looked slow, so we modified the catering order to mitigate the budget loss we were facing. When the upsurge in ticket sales began, it was too late to change our box-lunch order. We will definitely be rethinking food overall. It's one of the single biggest expenses at DrupalCons, and we know it's one of the best ways to keep attendees happy. Check out the complete overview.

2015 Budget and Leadership Plan Highlights

The board approved the 2015 Budget and Leadership Plan in executive session at the previous board meeting. We reviewed the highlights this month in the public board meeting. If you're interested in even more details, you can watch the recording of the webcast that we presented on Thursday, 18 December.

Governance Updates Board Term Limits

The Board of Directors operate under a set of rules that govern issues like how the board is structured, the length of terms, etc. This set of rules is codified into the organization's Bylaws. Like any good governance document, and like any good governance group, it makes sense to review how the group operates and what rules might need to be changed in order to provide a better framework for governance. The Governance Committee of the board is charged with ensuring that the board is operating at its best, and making recommendations when things could work better.

In the original bylaws of the organization, terms for Class Directors (nominated and approved by the board, not community-elected seats), are set at 3 years, with a limit of 3 terms. That means that any Class Director could serve a total of 9 years on the board. This is not absolutely a problem, but we do know that board operate best when members are energetic and fully committed, and when new ideas and perspectives can be added to the mix. Nine-year terms work against both of those concepts. To solve for this, the board voted to change the bylaws and limit service to two 3-year terms, or 6 years total. A board member does have the option of taking a year off at that point and could be re-appointed after a year of downtime. We are currently updating the bylaws document to reflect this vote and will update the Association site when this work is complete. 

Community Elected Candidates

One other issue that has been raised by the board is preparing community-elected board members for their service on the board. This class of directors exists to provide a balance of perspective on the board, and everyone understands that many community-elected board members will likely have little board experience prior to their service. The board wants to ensure, however, that these members can jump into their term easily and figure out how to advocate for their agenda quickly. To that end, the boad agrees that it makes sense for candidates to at least have some experience with the mechanics of the Association Board. The Governence Committee recommended that a requirement of board meeting attendance would be a low-threshold to meet, and would expose candidates to how the board operates. The proposal was that, starting in the 2016 elections, candidates will need to attend a minimum of 3 board meetings, which can be tracked by Association staff.

This proposal was voted on and adopted by the board. However, I do want to note that it was not a unanimous vote; we had 2 nay votes. The point was made that currently, all board meetings are held at noon pacific on the third Wednesday of the month. That time slot is during waking hours for the US and Europe. It's early in Australia, but doable. However, anyone in Asia, in particular, can't participate in those awkward hours. The suggestion was made that we shift some of our meeting times to accomodate these other time zones if we are going to make attendance a requirement for running. There was general agreement with this sentiment, but no clear conclusion about how to actually make that happen. The board decided to call the proposal to vote now and work out the logistics of shifting board meeting schedules at a later date.

Working Group Updates

Lastly, we got updates from all of the Working Groups: Software, Content, and Infrastructure. In addition to the work they are pursuing related to the roadmap, Working Groups are also reviewing their charters. With more than a year of operations under their belts, and with a full tech team on staff at the Association, it's important to take a look at how things have changed and ensure that charters are still in alignment.

Goodbye 2014!

It has been a big year for the Association and the Drupal community. I want to take this opportunity to thank the Drupal community for all your support for the Association. It's a joy to come to this job every day and work together to take on the challenges and opportunities we face. Your generosity, smarts, and sense of humor makes it all that much more rewarding. I can't wait to see what we tackle together in 2015!

Flickr photo: Matt Westgate

Catégories: Elsewhere

3C Web Services: How to: Drag &amp; Drop Multiple Image Upload for Drupal 7

ven, 19/12/2014 - 19:26

Drupal 7 provides a file field that allows for uploading files and images to your Nodes but it is limited in functionality. The core file field only allows for uploading one file at a time and does not permit drag and drop functionality. Hower, with a few modules and a little bit of configuration we can easily provide this functionality to your site.


First download and install the following modules:

Catégories: Elsewhere

Drupal Association News: Meeting Personas: The Drupal Master

ven, 19/12/2014 - 18:00

This post is part of an ongoing series detailing the new personas that have been drawn up as part of our user research.

Chris Luckhardt is a familiar face in the North American Drupal scene. An active member of the Toronto Drupal community and a frequent attender of camps, meet-ups, conventions, and more, Chris is a Drupal master in many ways, and an expert in others.

“I’m a Drupal specialist and I do photography on the side,” Chris says of himself. “I tend to do a lot of everything, which is why I call myself a specialist — because I specialize in different elements of Drupal. My favorite areas of Drupal are site building, dev-ops, and front-end development, and I do a lot of agile and scrum project management."

An Industry Veteran

Chris began his Drupal journey with Drupal 6, back in 2008. He’d already worked in web technology for a while, like with Microsoft's proprietary ASP and C#, dabbled in open source products like PHP, and worked with Linux, Apache, and mySQL.

“I knew that open source values aligned very well with my personal philosophies,” Chris said. “I’d worked on some proprietary software, and by the time I’d finished one particularly bad DotNetNuke project I decided I was going to move on in my career and go totally open source. Around that time, Drupal 6 came out and it coincided with a DrupalCamp Toronto event that was happening. It must have been Toronto's third or fourth DrupalCamp. James Walker, who had a hand in forming the Toronto Drupal group, was there, and I talked to him about what I was looking for in an open source solution to work with. He said, 'yeah this is the right option based on everything you’ve told me,’ and that was how I got started. I’ve considered him a mentor for years.

“I took the time to learn Drupal properly,” Chris continued. “I went to a few Lullabot workshops back in the day, took on some projects, and the rest is history. We all started at one point,” he said of his fellow Drupal users.

“For me, learning things the Drupal way was the biggest challenge, as opposed to coming in and doing some PHP coding. What helped me learn — and what helps me to this day —  is the user group meetings. I think by far being involved in the community is the most important thing. It's the gateway — asking questions and seeing presentations is really valuable. Of course, the issue queue is the best way to self-learn, but in my opinion the best learning happens from talking to people, because someone has stumbled across your problem before."

Drupal: Powered by People

Chris has been active in Drupal for years, both professionally and in the larger Drupal community. “Come for the code, stay for the community is the number one reason why I use Drupal,” Chris said. “There are so many other amazing developer communities out there, like PHP, HTML5, Javascript, Angular... I’ve dabbled in all of those and they’re all fantastic, but there’s just something about our community that is very representative of open source technology and community building."

When it comes to that community, Chris is concerned about how to grow it both locally and globally. “We have a very specific problem here in Toronto, but I think everyone has dealt with it too. We have a batch of old-school Toronto Drupal user group members who date back to 05-08, and we have an influx of new people. This means we have a set of introductory and beginner users — you know, people who come in like, “what’s a Drupal?” — and then we have the advanced users branching into all sorts of wild territory with Drupal.

"It’s hard to cater to both groups in one meet-up and even at our DrupalCamps that we plan every year. We recognize, if we try to cater to the introductory users we’ll turn away the advanced users, and they won’t be interested in coming out, but if we do really advanced sessions and training at our meet-ups, the new people show up and they won’t have any idea what’s going on.

“Between James and myself, we decided to address the problem by doing an introductory presentation and then a more advanced presentation during our meetups. For bigger events, it’s a little different. I created the schedule at the last DrupalCamp, and I engineered it so that there would be enough difference between overlapping session timeframes that it would work to the benefit of both the introductory and the advanced attendees…though unfortunately there's not much middle ground."

Linguistic Barriers to Entry

Chris’ other observation about problems with growing Drupal is the language barrier. “I was presenting at a DrupalCamp in Kyoto, and someone raised his hand and said, 'I want to learn Drupal, but I don’t understand Views. How do I learn it?’ So I told him that there are tons of tutorials on YouTube, and he responded, 'But...they are all English.' It occurred to me that those videos show you what to do, but if you don’t understand the spoken information -- why would I click this button, why would I do that -- the vocalization aspect is incredibly important. So there’s a real serious lack of Japanese documentation for people to learn Drupal— and not just Japanese, other languages, too. There’s some work being done by the Japanese community organizers around translating some of the books, like Emma Jane and Angie’s books, so it’s a start.

“So, the biggest challenge I see with Drupal and is how to manage the education… And, actually, sometimes I feel bad about calling myself a Drupal master because the learning curve never stops. It only becomes less dramatic with years of experience."

To see how we plan to address some of the challenges Chris has identified, keep an eye out for conclusion to our Personas series, or look at the results of the user research we’ve performed on

Personal blog tags: user researchpersona interviews
Catégories: Elsewhere

LevelTen Interactive: Video: Better Content Formatting Using CK Editor, Bootstrap &amp; Drupal

ven, 19/12/2014 - 17:56
*/ /*-->*/

Creating and promoting content is crucial for your business, and it can be very frustrating at times.... Read more

Catégories: Elsewhere

Annertech: Code that makes Programmers Perform

ven, 19/12/2014 - 16:36
Code that makes Programmers Perform

Code that performs well should be an assumption, not a requirement. I've never had a client ask me, “will your code make my site run slower?" Clients just assume that I'm going to deliver a codebase that does not hold things up.

Catégories: Elsewhere

Mediacurrent: New Year&#039;s Resolutions: Drupal Edition

jeu, 18/12/2014 - 22:46

Lose weight. Eat better. Run a 5K. Travel more. These are resolutions we all make year after year. But this year, we challenged our team to think outside the box and inside the drop. Now that 2014 has come and gone, and we prepare to countdown to 2015, we asked our team what they are looking to accomplish in Drupal in the New Year.

“Get more of my modules out for D8.” - Andrew Riley

Catégories: Elsewhere