Planet Drupal

Syndicate content
Drupal.org - aggregated feeds in category Planet Drupal
Updated: 12 min 37 sec ago

Acquia Developer Center Blog: 246: Don't miss Drupal Camp London 2017!

Wed, 02/08/2017 - 17:54
div class=field field-name-field-podcast-image field-type-image field-label-hiddendiv class=field-itemsdiv class=field-item evenimg typeof=foaf:Image class=img-responsive src=https://dev.acquia.com/sites/default/files/styles/blog_node_image/public/podcast/images/home_drupalcamp_london_2017.png?itok=Adi2X3E6 width=340 height=260 alt=Drupal Camp London homepage: http://drupalcamp.london title=Drupal Camp London homepage: http://drupalcamp.london //div/div/divdiv class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item even property=content:encodedp A conversation about the event and why you should be there, too, this time around with Ben Wilding and Waliur Rahman, members of the 2016 Drupal Camp London organizing team. /p p Come along March 3-5, 2017, to Europe's biggest (best?) community event on the calendar! /p p Tickets and information here: a href=http://drupalcamp.londonhttp://drupalcamp.london/a /p piframe width=640 height=360 src=https://www.youtube.com/embed/2iwPsB_lQfE frameborder=0/iframe/p /div/div/divdiv class=field field-name-field-podcast-audio field-type-file field-label-hiddendiv class=field-itemsdiv class=field-item evenaudio controls=controlssource src=https://dev.acquia.com/sites/default/files/podcast-audio/drupal_camp_london_2016.mp3 type=audio/mpeg //audio/div/div/divdiv class=field field-name-field-skill-level field-type-taxonomy-term-reference field-label-inline clearfixdiv class=field-labelSkill Level:nbsp;/divdiv class=field-itemsdiv class=field-item evena href=/skill-level/beginner typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=Beginner/a/divdiv class=field-item odda href=/skill-level/intermediate typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=Intermediate/a/divdiv class=field-item evena href=/skill-level/advanced typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=Advanced/a/div/div/div

Acquia Developer Center Blog: Drupal 8 Module (Distro!) of the Week: Open Social

Wed, 02/08/2017 - 16:51
div class=field field-name-field-blog-image field-type-image field-label-hiddendiv class=field-itemsdiv class=field-item evenimg typeof=foaf:Image class=img-responsive src=https://dev.acquia.com/sites/default/files/styles/blog__190_x110_/public/blog/drupal_8_logo_isolated_cmyk_72_2_27.png?itok=qda6XtwK width=140 height=85 alt=Drupal 8 logo title=Drupal 8 logo //divdiv class=field-item oddimg typeof=foaf:Image class=img-responsive src=https://dev.acquia.com/sites/default/files/styles/blog__190_x110_/public/blog/youth4peace_.png?itok=l3Gs7meo width=140 height=85 alt=United Nations Youth4Peace platform, built on Drupal 8 Open Social title=United Nations Youth4Peace platform, built on Drupal 8 Open Social //divdiv class=field-item evenimg typeof=foaf:Image class=img-responsive src=https://dev.acquia.com/sites/default/files/styles/blog__190_x110_/public/blog/brand_image_0000_pic_2.jpg?itok=VecWV-q0 width=140 height=85 alt=Open Social brand image title=Open Social brand image //divdiv class=field-item oddimg typeof=foaf:Image class=img-responsive src=https://dev.acquia.com/sites/default/files/styles/blog__190_x110_/public/blog/activity_stream.png?itok=kNlry5WQ width=140 height=85 alt=Open Social activity stream title=Open Social activity stream //divdiv class=field-item evenimg typeof=foaf:Image class=img-responsive src=https://dev.acquia.com/sites/default/files/styles/blog__190_x110_/public/blog/events.png?itok=9eBpI8gr width=140 height=85 alt=Open Social events title=Open Social events //divdiv class=field-item oddimg typeof=foaf:Image class=img-responsive src=https://dev.acquia.com/sites/default/files/styles/blog__190_x110_/public/blog/gos_notification-animation.gif?itok=UL7hmzKU width=140 height=85 alt=Open Social notifications title=Open Social notifications //div/div/divdiv class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item even property=content:encodedp emstrongThis week: a href=https://www.getopensocial.com/Open Social/a, a community-building distribution/strong // Drupal 8 has more and more features available practically every day. Alongside module migrations and new projects, the Drupal community’s latest major release also offers new ways of solving common problems. Some functionality has moved to Drupal core and new modules have taken up the torch along the way. In this series, the Acquia Developer Center is profiling useful solutions--modules, themes, distros, and more--available for Drupal 8./em /p /div/div/divdiv class=field field-name-field-blog-tags field-type-taxonomy-term-reference field-label-inline clearfixdiv class=field-labelTags:nbsp;/divdiv class=field-itemsdiv class=field-item evena href=/tags/acquia-drupal-planet typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=acquia drupal planet/a/divdiv class=field-item odda href=/tags/open-social typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=open social/a/divdiv class=field-item evena href=/tags/intranet typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=intranet/a/divdiv class=field-item odda href=/tags/community typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=community/a/div/div/div

Deeson: Delivering great work is easier when the client is having fun

Wed, 02/08/2017 - 12:01
img src=https://d3suqxyr95ccqd.cloudfront.net/sites/default/files/styles/image_400_width/public/lead_image/startup-593343_1920.jpg?itok=1yA5Tknz width=400 height=265 alt=Collaboration is a key ingredient to any successful project title=Delivering great work doesnamp;#039;t mean you canamp;#039;t have fun /img src=https://d3suqxyr95ccqd.cloudfront.net/sites/default/files/styles/image_600_width/public/lead_image/startup-593343_1920.jpg?itok=SJNhO4Vm width=600 height=397 alt=Collaboration is a key ingredient to any successful project title=Delivering great work doesnamp;#039;t mean you canamp;#039;t have fun /pI know putting the words “fun” and “work” together is a strange concept for some people, but I think it can be achieved. Teams that have fun collaborate better and strong collaboration is a key ingredient to any successful project./p pFun could mean different things to different people, so for the benefit of this article let's just say that ‘fun’ means the team get along and enjoy what they are doing./p pHere are a couple of ideas on how to inject some fun into your projects./p h2Kick off with some games/h2 pDeeson believe it's worth investing in the human foundations of our relationship and play a game on the kick off day. Not just any game, but a game which can have a meaningful pay-off further down the line or help foster a good relationship, for example one which might help the client get used to working in an agile manner. The a href=http://www.allaboutagile.com/agile-games-ball-point-game/tennis ball game/a is a good example of this./p h2Create a sense of shared identity/h2 pComing up with a name and a ‘brand’ for a project, something short and snappy ideally, is a fun way to create a shared sense of identity and ownership between the project team. Once the project name has been decided, the designer could create a logo for the project which can then go on all presentations and documentation./p pYou could even go one step further and have some merchandise made; mugs are great, but things like t-shirts and stuffed toys work too. The items should only be available to the project team. This will get the whole team engaged with the project./p h2Add some bounce to the process/h2 pWhen working in Scrum, the team has a stand-up every morning to say what they did yesterday, what they are doing today and if they have any blockers. Now although the guidelines say that you shouldn’t invite the product owner to a standup. However, in an agency to client situation, this could mean the product owner could feel left out. So invite the product owner along to standups and encourage them to take part. The ideal standup would be everyone in the same room giving their update, but if this is not possible then have a video call, this makes it feel more personal./p pWithin a sprint there will be a few meetings, but try and make one of them in person. Sprint planning is a good meeting to have in person, as its easier to discuss things with everyone in the same room than having everyone on a video call./p pWhen having meetings use a timer and the a href=http://cirillocompany.de/pages/pomodoro-techniquepomodoro method/a, so have a set goal for the next 25 minutes and then have a 5 minute break to get a drink or talk to the team and client about non work related things./p pWhen in sprint planning, you can add a gaming element by using planning poker cards. These cards have the double benefit of being quite a laid back way of estimating tasks, but it also eliminates unhelpful bias and allows the team to make individual and impartial decisions on the length of time needed to complete a story./p h2Clear communication enables strong relationships/h2 pHaving a team retrospective really helps a team to bond. In this meeting it's always worth considering the prime directive. Regardless of what we discover, we understand and truly believe that everyone did the best job they could, given what they knew at the time, their skills and abilities, the resources available, and the situation at hand./p pThe outcomes of the retrospective should be discussed and if any changes are needed, then they should be made and tried out on the next sprint. We won’t want anyone on the team being unhappy or annoyed as this could damage the relationships that have been built./p pIt can be useful to try some different approaches to retrospectives to keep them fresh. For example, you could get use the a href=http://(http://retrospectivewiki.org/index.php?title=Sailboatsailboat/a retrospective./p h2Most importantly - celebrate together!/h2 pIf a team is doing all of the above then I would say that they are on the right track. But after all the hard work and effort you’ve put in, it’s a good idea to let your hair down and celebrate a major release or significant project milestone. Get the project team together to either have a meal or a drink and take time to reflect on what’s been achieved by the collective./p pBreaking down the ‘client vs agency’ dynamic, and helping everyone become part of one team, is a key step towards having fun and delivering great, innovative work.  /p

Third Grove: Boston Herald Drupal Case Study

Wed, 02/08/2017 - 09:00
span property=schema:name class=field-name--titleBoston Herald Drupal Case Study/span span class=field-name--uid rel=schema:authorspan lang= about=https://www.thirdandgrove.com/user/3 typeof=schema:Person property=schema:name datatype= xml:lang=antonella/span/span span property=schema:dateCreated content=2017-02-08T08:00:00+00:00 class=field-name--createdWed, 02/08/2017 - 03:00/span

Drupal CMS Guides at Daymuse Studios: Products Product Types in Drupal Commerce Module Guide

Wed, 02/08/2017 - 02:49
div class=field field--name-field-image field--type-image field--label-hiddendiv class=field__itemsdiv class=field__item evenimg typeof=foaf:Image src=https://www.daymuse.com/sites/daymuse.com/files/product-type-vs-products-drupal-commerce.jpg width=1560 height=880 alt=Products vs. Product Type in Drupal Commerce title=Products vs. Product Type in Drupal Commerce //div/div/divdiv class=field field--name-body field--type-text-with-summary field--label-hiddendiv class=field__itemsdiv class=field__item even property=content:encodedpOur first a href=/guides/drupal-commerceDrupal Commerce Module Guide/a begins our e-commerce site creation tutorial. We need to understand what emProduct/em and emProduct Types/em are and how to implement them./p /div/div/div

Deeson: Getting started with Drupal 8 and Composer

Wed, 02/08/2017 - 00:00
img src=https://d3suqxyr95ccqd.cloudfront.net/sites/default/files/styles/image_400_width/public/lead_image/drupal-8-composer.png?itok=89E7hg5e width=306 height=306 alt=Drupal 8 and Composer image title=Drupal 8 and Composer /pAt Deeson we are constantly looking for ways to improve the way we work, iterating on past projects to incorporate new techniques and best-practices./p pWe starting playing with Composer recently, as a tool for speeding up Drupal module updates. There were a few quirks, but it generally worked./p pThen we discovered the a href=https://github.com/drupal-composer/drupal-projectDrupal Composer project/a, which makes it much simpler to manage Drupal core as well as modules./p pThis is great! We can use Composer to install and update Drupal core, modules and themes, and all in a consistent manner; anyone can run Composer and end up with the exact same set of code./p pSo now we can start excluding some of the off-the-shelf code from our Git repository (contrib modules, themes, and libraries.) This slims down our repositories and speeds up development for the whole team./p pCombined with our approach to a href=https://www.deeson.co.uk/labs/site-configuration-strategy-or-how-manage-your-settingsphp-filesmanaging settings/a we’re really starting to limit the amount of custom stuff in the docroot now./p pHaving recently completed a site using this approach I started thinking: “Why do we even need the docroot in Git?”/p pSo we got rid of it! One of the many benefits of working in a href=https://www.deeson.co.uk/blog/how-teams-work-deeson-2017self-managing teams/a!/p pWe now have a very flat repository structure where the entire docroot is compiled during deployments. The project repository contains a CMI config directory, settings.php, modules and themes directories, and the all-important composer.json which manages everything that isn’t project-specific custom code./p pInternally we use a href=https://bitbucket.org/product/features/pipelinesBitbucket pipelines/a to manage building and deploying our projects. /p pEvery commit triggers a pipelines build. The docroot is built, tests are run, and if all goes well, it gets pushed to the hosting platform./p pWe have put together a small Composer script which simply symlinks the modules, themes and settings into the docroot when running composer install. The rest of the build is vanilla composer./p pOur composer.json is based on the version provided by Drupal Composer, but with a change to the post-install-cmd and post-update-cmd hooks./p prequot;scriptsquot;: { quot;drupal-scaffoldquot;: quot;DrupalComposer\\DrupalScaffold\\Plugin::scaffoldquot;, quot;pre-install-cmdquot;: [ quot;DrupalProject\\composer\\ScriptHandler::checkComposerVersionquot; ], quot;pre-update-cmdquot;: [ quot;DrupalProject\\composer\\ScriptHandler::checkComposerVersionquot; ], quot;post-install-cmdquot;: [ quot;@drupal-scaffoldquot;, quot;DrupalProject\\composer\\DeesonScriptHandler::createRequiredFilesquot; ], quot;post-update-cmdquot;: [ quot;@drupal-scaffoldquot;, quot;DrupalProject\\composer\\DeesonScriptHandler::createRequiredFilesquot; ] }/prepHere we have replaced the script handler plugin with our own customised version, which creates the symlinks mentioned above during composer install and composer update. We also run the Drupal Scaffold plugin on every Composer install or Composer update, to ensure that all of the extra Drupal files like index.php and update.php exist in the docroot./p pTaking the Drupal docroot out of our project repositories has required a shift in the way we think about developing Drupal projects, but ultimately we believe it has streamlined and simplified our development workflows./p pWe have turned this approach into a Drupal 8 Quick Start template, which can be used to very quickly get up and running with Drupal 8 using a composer-based workflow. The project is a href=https://github.com/teamdeeson/d8-quickstartavailable on Github/a. PRs welcome!/p

Agaric Collective: Help kick the door for new contributors to Drupal back open (and get credit for it)

Tue, 02/07/2017 - 22:15
pimg src=http://agaric.com/sites/default/files/styles/medium/public/ba-baracus-a-team-opening-door-kicked.png?itok=J2wYLbcG style=margin: 0.2em 0em 0.2em 1em; float: right; width=270 height=286 alt=Mr. T as B.A. Baracus kicking open a wide door in the opening credits of the A-Team. //p pAfter years of giving a href=http://agaric.com/blogs/door-new-contributors-drupal-still-lockeda terrible initial experience to people who want to share their first project/a on Drupal.org, the a href=https://www.drupal.org/node/2666584Project Applications Process Revamp/a is a Drupal Association a href=https://www.drupal.org/drupalorg/blog/recognizing-more-types-of-contribution-in-the-Drupal.org-Marketplacekey priority for the first part of 2017/a./p pA a href=https://www.drupal.org/node/2850494 title=Plan the process for incentivizing code review after project apps revampplan for incentivizing code review of emevery/em project, not just new ones, after the project applications revamp/a is open for suggestions and feedback./p pWhich makes it excellent timing that a href=https://www.drupal.org/node/2810485right now/a you can get credit on your Drupal.org profile and that of your organization, boosting marketplace ranking, for a href=https://www.drupal.org/project/issues/projectapplications?order=last_comment_timestampamp;status=8reviewing the year-old backlog of project applications requesting review/a. The focus is on a href=https://www.drupal.org/docs/7/security/writing-secure-code/overviewsecurity review/a for these project applications, but if you want to give a thorough review and then give your thoughts on how project reviews (for any project that opts in to this quality marker) a href=https://www.drupal.org/node/2850494 title=Plan the process for incentivizing code review after project apps revampshould be performed and rewarded going forward/a, now's the time and a href=https://www.drupal.org/project/issues/projectapplications?order=last_comment_timestampamp;status=8here's the pressing need/a./p

InternetDevels: Drupal 8 SEO Checklist module: your reliable website optimization adviser

Tue, 02/07/2017 - 17:18
div class=field field--name-field-preview-image field--type-image field--label-hiddendiv class=field__itemsdiv class=field__item evenimg src=http://st1.internetdevels.net/sites/default/files/public/blog_preview/drupal_8_seo_checklist_module.png width=937 height=622 alt=Drupal 8 SEO Checklist module: your reliable website optimization adviser //div/div/divdiv class=field field--name-body field--type-text-with-summary field--label-hiddendiv class=field__itemsdiv class=field__item evenpemTo do: improve your Drupal website’s SEO/em. This sounds like a pretty big task when it’s written out like that on your list! ;) Big tasks are easier to cope with when they are divided into clear, smaller steps. Great news! You can have a smart adviser, named SEO Checklist module, who can stronggive you this list of steps and prompt you how to fulfill them/strong./p a href=http://internetdevels.com/blog/drupal-8-seo-checklist-moduleRead more/a/div/div/div

Flocon de toile | Freelance Drupal: Create an action for custom mass updates with Drupal 8

Tue, 02/07/2017 - 16:00
div class=field field--name-body field--type-text-with-summary field--label-hidden field--itempDrupal 8 makes it possible to carry out certain mass actions on the site's contents, such as publishing or unpublishing massively contents, positioning them at the top of lists, etc. It may be useful to provide to certain user profiles some customized actions related to the specificities of their site, such as highlighting certain taxonomy terms, changing the value of a specific field, and thus avoiding heavy and tedious update operations to users on each of the content to be modified./p/div

Drupal Association blog: Drupal in Europe - Community Survey

Tue, 02/07/2017 - 15:17
div class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item evenpstrong id=docs-internal-guid-baf0c0f6-18c0-bbf1-7563-aa538bdb6fb1TL;DR If you are a European community member, please take our a href=https://www.surveymonkey.com/r/SYCZSVX rel=nofollowcommunity survey/a about Drupal in Europe./strong/p pAfter 6+ years working at the Drupal Association and knowing so many members around the world, it’s easy for me to think I know what is going on with the Project. But, it is a big world and each region, country, and local market has unique, evolving needs./p pTo avoid assuming the best way to help the community, I am asking for your input. I'm gathering insight one region at a time. I’ll share the feedback with staff and the Drupal Association Board to refine how we serve the community./p pI’m starting first with our European community. This is so it's well timed with our DrupalCon Europe planning. In fact, the Drupal Association Board meets on 23 and 24 February where we will strategize how we can best support the European community. We’ll use your input to drive that discussion./p pI’m collecting input in a few ways. Recently, I held roundtable discussions with various community organizers. Now I’m opening up the discussion to all who Drupal in Europe. Please tell me how the Drupal Association can best support Drupal by taking this a href=https://www.surveymonkey.com/r/SYCZSVX rel=nofollowcommunity survey/a strongbefore February 16th./strong/p pThanks for sharing your thoughts and needs. I look forward to hearing from you./p/div/div/div

2bits: How to configure Varnish Cache for Drupal with SSL Termination Using Pound or Nginx

Tue, 02/07/2017 - 13:49
div class=field field-name-body field-type-text-with-summary field-label-hidden view-mode-rssdiv class=field-itemsdiv class=field-item evenpSecure Socket Layer (SSL) is the protocol that allows web sites to serve traffic in HTTPS. This provides end to end encryption between the two end points (the browser and the web server). The benefits of using HTTPS is that traffic between the two end points cannot be deciphered by anyone snooping on the connection. This reduces the odds of exposing sensitive information such as passwords, or getting the web site hacked by malicious parties. Google has also indicated that sites serving content exclusively in HTTPS will get a small bump in Page Rank./p pHistorically, SSL certificate issuers have served a secondary purpose: identity verification. This is when the issuing authority vouches that a host or a domain is indeed owned by the entity that requests the SSL certificate for it. This is traditionally done by submitting paper work including government issued documentation, incorporation certificates, ...etc. /p pHistorically, SSL certificates were costly. However, with the introduction of the a href=https://letsencrypt.org/about/Let's Encrypt/a initiative, functional SSL certificates are now free, and anyone who wants to use them can do so, minus the identity verification part, at least for now. /p pImplementing HTTPS with Drupal can be straightforward with low traffic web sites. The SSL certificate is installed in the web server, and that is about it. With larger web sites that handle a lot of traffic, a caching layer is almost always present. This caching layer is often Varnish. Varnish does not handle SSL traffic, and just passes all HTTPS traffic straight to Drupal, which means a lot of CPU and I/O load. /p pThis article will explain how to avoid this drawback, and how to have it all: caching in Varnish, plus serving all the site using HTTPS. /p pThe idea is quite simple in principle: terminate SSL ibefore/i Varnish, which will never know that the content is encrypted upstream. Then pass the traffic from the encryptor/decryptor to Varnish on port 81. From there, Varnish will pass it to Apache on port 8080. /p pWe assume you are deploying all this on Ubuntu 16.04 LTS, which uses Varnish 4.0, although the same can be applied to Ubuntu 14.04 LTS with Varnish 3.0./p pNote that we use either one of two possible SSL termination daemons: Pound and Nginx. Each is better in certain cases, but for the large part, they are interchangeable./p pOne secondary purpose for this article is documenting how to create SSL bundles for intermediate certificate authorities, and to generate a combined certificate / private key. We document this because of the sparse online information on this very topic./p h2Install Pound/h2 div class=codeblockcodeaptitude install pound/code/div h2Preparing the SSL certificates for Pound/h2 pPound does not allow the private key to be in a separate file or directory from the certificate itself. It has to be included with the main certificate, and with intermediate certificate authorities (if there are any). /p pWe create a directory for the certificates:/p div class=codeblockcodemkdir /etc/pound/certs pcd /etc/pound/certs/p/code/div pWe then create a bundle for the intermediate certificate authority. For example, if we are using using NameCheap for domain registration, they use COMODO for certificates, and we need to do the following. The order is important./p div class=codeblockcodecat COMODORSADomainValidationSecureServerCA.crt \ br /  COMODORSAAddTrustCA.crt \ br /  AddTrustExternalCARoot.crt gt;gt; bundle.crt/code/div pThen, as we said earlier, we need to create a host certificate that includes the private key./p div class=codeblockcodecat example_com.key example_com.crt gt; host.pem/code/div pAnd we make sure the host certificate (which contains the private key as well) and the bundle, are readable only to root./p div class=codeblockcodechmod 600 bundle.crt host.pem /code/div h2Configure Pound/h2 pWe then edit /etc/pound/pound.cfg/p div class=codeblockcode# We have to increase this from the default 128, since it is not enoughbr /# for medium sized sites, where lots of connections are coming inbr /Threads 3000 p# Listener for unencrypted HTTP traffic br /ListenHTTPbr /  Address 0.0.0.0br /  Port    80br /  br /  # If you have other hosts add them herebr /  Service br /    HeadRequire Host: admin.example.combr /    Backend br /      Address 127.0.0.1br /      Port 81br /    Endbr /  Endbr /  br /  # Redirect http to httpsbr /  Service br /    HeadRequire Host: example.combr /    Redirect https://example.com/br /  Endbr /  br /  # Redirect from www to domain, also httpsbr /  Service br /    HeadRequire Host: www.example.combr /    Redirect https://example.com/br /  Endbr /End/p p# Listener for encrypted HTTP traffic br /ListenHTTPSbr /  Address 0.0.0.0br /  Port    443br /  # Add headers that Varnish will pass to Drupal, and Drupal will use to switch to HTTPSbr /  HeadRemove      X-Forwarded-Protobr /  AddHeader       X-Forwarded-Proto: httpsbr /  br /  # The SSL certificate, and the bundle containing intermediate certificatesbr /  Cert      /etc/pound/certs/host.pembr /  CAList    /etc/pound/certs/bundle.crtbr /  br /  # Send all requests to Varnishbr /  Service br /    HeadRequire Host: example.combr /    Backend br /      Address 127.0.0.1br /      Port 81br /    Endbr /  Endbr /  br /  # Redirect www to the domainbr /  Servicebr /    HeadRequire Host: www.example.com.*br /    Redirect https://example.com/br /  Endbr /End/p/code/div pDepending on the amount of concurrent traffic that your site gets, you may need to increase the number of open files for Pound. To do this, edit the file /etc/default/pound, and add the following lines:/p div class=codeblockcode# Increase the number of open files, so pound does not log errors like:br /# HTTP Acces: Too many open filesbr /ulimit -n 20000/code/div pDo not forget to change the 'startup' line from 0 to 1, otherwise pound will not start./p h2Configure SSL Termination for Drupal using Nginx/h2 pYou may want to use Nginx instead of the simpler Pound in certain cases. For example, if you want to handle redirects from the plain HTTP URLs to the corresponding SSL HTTPS URls. Pound cannot do that. It redirects to the home page of the site instead./p pAlso, if you want to process your site's traffic using analysis tools, for example Awstats, you need to capture those logs. Although Pound can output logs in Apache combined format, it also outputs errors to the same log, at least on Ubuntu 16.04, and that makes these logs unusable by analysis tools./p pFirst install Nginx:/p div class=codeblockcodeaptitude install nginx/code/div pCreate a new virtual host under /etc/nginx/sites-available/example.com, with this in it:/p div class=codeblockcode# Redirect www to no-www, port 80br /server {br /  server_name www.example.com; p  # Replace this line with: 'access_log off' if logging ties up the diskbr /  access_log /var/log/nginx/access-example.log;br /  br /  # Permanent redirectbr /  return 301 https://example.com$request_uri;br /}/p p# Redirect www to no-www, SSL port 443br /server {br /  listen 80 default_server;br /  listen [::]:80 default_server ipv6only=on;/p p  server_name example.com;/p p  # Replace this line with: 'access_log off' if logging ties up the diskbr /  access_log /var/log/nginx/access-example.log;br /  br /  # Permanent redirectbr /  return 301 https://$host$request_uri;br /}/p pserver {br /  listen 443 ssl default_server;br /  listen [::]:443 ssl default_server ipv6only=on;/p p  server_name example.com;/p p  # We capture the log, so we can feed it to analysis tools, e.g. Awstatsbr /  # This will be more comprehensive than what Apache captures, since Varnishbr /  # will end up removing a lot of the traffic from Apachebr /  #br /  # Replace this line with: 'access_log off' if logging ties up the diskbr /  access_log /var/log/nginx/access-example.log;/p p  ssl on;/p p  # Must contain the a bundle if it is a chained certificate. Order is important.br /  # cat example.com.crt bundle.crt gt; example.com.chained.crt  br /  ssl_certificate      /etc/ssl/certs/example.com.chained.crt;br /  ssl_certificate_key  /etc/ssl/private/example.com.key;/p p  # Test certificatebr /  #ssl_certificate     /etc/ssl/certs/ssl-cert-snakeoil.pem;br /  #ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key;/p p  # Restrict to secure protocols, depending on whether you have visitorsbr /  # from older browsersbr /  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;/p p  # Restrict ciphers to known secure onesbr /  ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256;/p p  ssl_prefer_server_ciphers on;br /  ssl_ecdh_curve secp384r1;br /  ssl_stapling on;br /  ssl_stapling_verify on;/p p  add_header Strict-Transport-Security max-age=63072000; includeSubDomains; preload;br /  add_header X-Frame-Options DENY;br /  add_header X-Content-Type-Options nosniff;/p p  location / {br /    proxy_pass                         http://127.0.0.1:81;br /    proxy_read_timeout                 90;br /    proxy_connect_timeout              90;br /    proxy_redirect                     off;/p p    proxy_set_header Host              $host;br /    proxy_set_header X-Real-IP         $remote_addr;br /    proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;br /    proxy_set_header X-Forwarded-Proto https;br /    proxy_set_header X-Forwarded-Port  443;br /    br /    proxy_buffers                      8 24k;br /    proxy_buffer_size                  2k;br /  }br /}/p/code/div pThen link this to an entry in the sites-enabled directory/p div class=codeblockcodecd /etc/nginx/sites-enabled pln -s /etc/nginx/sites-available/example.com/p/code/div pThen we add some performance tuning parameters, by creating a new file: /etc/nginx/conf.d/tuning. These will make sure that we handle higher traffic than the default configuration allows:/p div class=codeblockcode  br /worker_processes       auto; pworker_rlimit_nofile   20000;/p pevents {br /  use epoll;br /  worker_connections 19000;br /  multi_accept       on;br /}/p phttp {br /  sendfile           on;br /  tcp_nopush         on;br /  tcp_nodelay        on;br /  keepalive_timeout  65;br /  keepalive_requests 10000;br /    br /  client_body_buffer_size 128k;    br /}/p/code/div pWe now have either Pound or Nginx in place, handling port 443 with SSL certifcates, and forwarding the plain text traffic to Varnish./p h2Change Varnish configuration to use an alternative port/h2 pFirst, we need to make Varnish work on port 81. /p pOn 16.04 LTS, we edit the file: /lib/systemd/system/varnish.service. If you are using Ubuntu 14.04 LTS, then the changes should go into /etc/default/varnish instead./p pChange the 'ExecStart' line for the following:/p pPort that Varnish will listen on (-a :81)br / Varnish VCL Configuration file name (/etc/varnish/main.vcl)br / Size of the cache (-s malloc,1536m)/p pYou can also change the type of Varnish cache storage, e.g. to be on disk if it is too big to fit in memory (-s file,/var/cache/varnish/varnish_file.bin,200GB,8K). Make sure to create the directory and assign it the correct owner and permissions./p pWe use a different configuration file name so as to not overwrite the default one, and make updates easier (no questions asks during update to resolve differences)./p pIn order to inform systemd that we changed a daemon startup unit, we need to issue the following command:/p div class=codeblockcodesystemctl daemon-reload/code/div h2Add Varnish configuration for SSL/h2 pWe add the following section to the Varnish VCL configuration file. This will pass a header to Drupal for SSL, so Drupal will enforce HTTPS for that request./p div class=codeblockcode# Routine used to determine the cache key if storing/retrieving a cached page.br /sub vcl_hash { p  # This section is for Poundbr /  hash_data(req.url);/p p  if (req.http.host) {br /    hash_data(req.http.host);br /  }br /  else {br /    hash_data(server.ip);br /  }/p p  # Use special internal SSL hash for https contentbr /  # X-Forwarded-Proto is set to https by Poundbr /  if (req.http.X-Forwarded-Proto ~ https) {br /    hash_data(req.http.X-Forwarded-Proto);br /  }br /}/p/code/div h2Change Apache's Configuration/h2 pIf you had SSL enabled in Apache, you have to disable it so that only Pound (or Nginx) are listening on port 443. If you do not do this, Pound and Nginx will refuse to start with an error: Address already in use./p pFirst disable the Apache SSL module./p div class=codeblockcodea2dismod ssl /code/div pWe also need to make Apache listen on port 8080, which Varnish will use to forward traffic to./p div class=codeblockcode  br /Listen 8080/code/div pAnd finally, your VirtualHost directives should listen on port 8080, as follows. It is also best if you restrict the listening on the localhost interface, so outside connections cannot be made to the plain text virtual hosts./p div class=codeblockcodelt;VirtualHost 127.0.0.1:8080gt;br /...br /lt;/VirtualHostgt;/code/div pThe rest of Apache's configuration is detailed in an earlier article on a href=/articles/high-performance-drupal-with-apache-mpm-worker-threaded-server-and-php-fpm.htmlApache MPM Worker threaded server, with PHP-FPM/a./p h2Configure Drupal for Varnish and SSL Termination/h2 pWe are not done yet. In order for Drupal to know that it should only use SSL for this page request, and not allow connections from plain HTTP, we have to add the following to settings.php:/p div class=codeblockcode// Force HTTPS, since we are using SSL exclusivelybr /if (isset($_SERVER['HTTP_X_FORWARDED_PROTO'])) {br /  if ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') {br /    $_SERVER['HTTPS'] = 'on';br /  }br /}/code/div pIf you have not already done so, you also have to enable page cache, and set the external cache age for cached pages. This is just a starting point, assuming Drupal 7.x, and you need to modify these accordingly depending on your specific setup./p div class=codeblockcode// Enable page cachingbr /$conf['cache'] = 1;br /// Enable block cachebr /$conf['block_cache'] = 1;br /// Make sure that Memcache does not cache pagesbr /$conf['cache_lifetime'] = 0;br /// Enable external page caching via HTTP headers (e.g. in Varnish)br /// Adjust the value for the maximum time to allow pages to stay in Varnishbr /$conf['page_cache_maximum_age'] = 86400;br /// Page caching without bootstraping the database, nor invoking hooksbr /$conf['page_cache_without_database'] = TRUE;br /// Nor do we invoke hooks for cached pagesbr /$conf['page_cache_invoke_hooks'] = FALSE; p// Memcache layerbr /$conf['cache_backends'][]    = './sites/all/modules/contrib/memcache/memcache.inc';br /$conf['cache_default_class'] = 'MemCacheDrupal';br /$conf['memcache_servers']    = array('127.0.0.1:11211' =gt; 'default');br /$conf['memcache_key_prefix'] = 'live';/p/code/div pAnd that is it. Now restart all the daemons:/p div class=codeblockcodeservice pound restartbr /service nginx restart # If you use nginx instead of poundbr /service varnish restartbr /service apache2 restart/code/div pCheck that all daemons have indeed restarted, and that there are no errors in the logs. Then test for proper SSL recognition in the browser, and for correct redirects./p h2For The Extreme Minimalist: Eliminating Various Layers/h2 pThe above solution stack works trouble free, and has been tested with several sites. However, there is room for eliminating different layers. For example, instead of having Apache as the backend web server, this can be replaced with Nginx itself, listening on both port 443 (SSL), and 8080 (backend), with Varnish in between. In fact, it is possible to even remove Varnish altogether, and use a href=http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_cacheNgnix FastCGI Cache/a instead of it. So Nginx listens on port 443, decrypts the connection, and passes the request to its own cache, which decides what is served from cache versus what gets passed through to Nginx itself on port 8080, which hands it over to PHP and Drupal. /p pDon't let the words 'spaghetti' and 'incest' take over your mind! Eventually, all the oddities will be ironed out, and this will be a viable solution. There are certain things that are much better known in Apache for now in regards to Drupal, like URL rewriting for clean URLs. There are also other things that are handled in .htaccess for Apache that needs to gain wider usage within the community before an Nginx only solution becomes the norm for web server plus cache plus SSL. /p pApache MPM Worker Multithreaded with PHP-FPM is a very low overhead, high performance solution, and we will continue to use it until the Nginx only thing matures into a wider used solution, and has wider use and support within the Drupal community to remain viable for the near future./p /div/div/divsection class=field field-name-taxonomy-vocabulary-2 field-type-taxonomy-term-reference field-label-above view-mode-rssh2 class=field-labelTags:nbsp;/h2ul class=field-itemsli class=field-item evena href=/tags/drupal-planetDrupal Planet/a/lili class=field-item odda href=/tags/varnishVarnish/a/lili class=field-item evena href=/tags/poundPound/a/lili class=field-item odda href=/tags/nginxNginx/a/lili class=field-item evena href=/tags/sslSSL/a/lili class=field-item odda href=/tags/httpsHTTPS/a/li/ul/sectionsection class=field field-name-taxonomy-vocabulary-1 field-type-taxonomy-term-reference field-label-above view-mode-rssh2 class=field-labelContents:nbsp;/h2ul class=field-itemsli class=field-item evena href=/contents/articlesArticles/a/li/ul/section

Vardot: Install Apache Solr 5.x for a Drupal Website on Ubuntu

Tue, 02/07/2017 - 13:24
a href=/blog/categories/how-toHow to/a span class=read-timeRead time: 2 minutes/span pTo install Apache Solr and run it with a Drupal website on an Ubuntu server. Follow these steps:/p h3Install Java/h3 pYou need to make sure you have Java installed.br / To check run this command:/p pre java -version/prepIf it's not installed, simply install from packages:/p pre sudo apt-get -y install openjdk-7-jdk jetty/prep /p h3Install Latest Apache Solr 5.x/h3 pDownload the latest zip file release 5.x.x from a href=http://mirror.cc.columbia.edu/pub/software/apache/lucene/solr/http://mirror.cc.columbia.edu/pub/software/apache/lucene/solr//a/p pUnzip the downloading: /p pre unzip solr-5-x-x.zip;/prepMore the unzipped folder to where is should be:/p pre sudo mv solr-5-x-x /usr/local/solr cd /usr/local/solr /prep /p h3Configuring Apache Solr for your Drupal site/h3 pMake a copy of the Solr core to be used for Drupal sites/p pre cp -r example/ drupal//prepCreate cores for your sites. Every core is an instance of a Drupal site:/p pre cd drupal/multicore sudo cp -r core0 emMYSITENAME/em /prepEdit the strongsolr.xml/strong to add your new core:/p pre sudo vim solr.xml/prepand add a new core similar to:/p pre lt;core name=emMy Site Name/em instanceDir=emMYSITENAME/em /gt;/prep /p pReplace the default Solr configuration with the Drupal  Solr configuration provided from the a href=https://www.drupal.org/project/search_api_solrSearch API Solr Search/a module./p pre sudo rm -r emMYSITENAME/em/conf sudo cp -r /emPATH/em/emTO/em/emDRUPAL/em/sites/all/modules/contrib/search_api_solr/solr-conf/5.x /usr/local/solr/drupal/multicore/conf/emMYSITENAME/em/conf /prep /p pStart Solr/p pre cd .. java -Dsolr.solr.home=multicore -jar start.jar/prep /p pCreate Solr user/p pre sudo useradd -d /usr/local/solr -M -s /usr/sbin/nologin solr sudo chown -R solr:root /usr/local/solr/prep /p h3Add Solr as a Service/h3 pDownload the stronginit.d/strong script to start Apache Solr. Thanks to a href=https://2bits.com/2bits/a./p pre wget http://2bits.com/sites/2bits.com/files/solr-init.d.sh_.txt sudo mv solr-init.d.sh_.txt /etc/init.d/solr /prepEdit the file to suit your environment and change the strongSOLR_HOME=/opt/solr/example/strong environment variable (line 18) to strong/usr/local/solr/drupal/strong/p pre sudo vim /etc/init.d/solr/prepReplace line 18 to be:/p pre SOLR_HOME=/usr/local/solr/drupal/prep /p pMake the service to work properly:/p pre sudo chmod a+rx /etc/init.d/solr sudo update-rc.d solr defaults/prep /p h3Access Solr/h3 pYour Solr URL will be: stronga href=http://localhost:8983/solr/#http://localhost:8983/solr/#/a/strong/p pIf you want to setup authentication for Solr, please follow: a href=http://2bits.com/articles/configuring-apache-solr-4x-drupal-password-authentication.htmlhttp://2bits.com/articles/configuring-apache-solr-4x-drupal-password-aut.../a/p Tags:nbsp; a href=/blog/tags/drupal typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=Drupal/a a href=/blog/tags/solr typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=Solr/a a href=/blog/tags/setup-guide typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=Setup Guide/a a href=/taxonomy/term/236 typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=Drupal Planet/a div class=field field-name-title-field field-type-text field-label-above clearfix div class=field-label Title:nbsp; /div div class=field-item even Install Apache Solr 5.x for a Drupal Website on Ubuntu /div /div

Drupal Modules: The One Percent: Drupal Modules: The One Percent — Contact Emails (video tutorial)

Mon, 02/06/2017 - 22:39
span class=field field--name-title field--type-string field--label-hiddenDrupal Modules: The One Percent — Contact Emails (video tutorial)/span div class=field field--name-field-screenshot field--type-image field--label-hidden field__item img src=http://gogrow.org/sites/default/files/styles/large/public/2017-02/contact_emails.png?itok=v3nTNM_R width=480 height=228 alt=Project page screenshot typeof=foaf:Image class=image-style-large //div span class=field field--name-uid field--type-entity-reference field--label-hiddenspan lang= about=http://gogrow.org/user/24 typeof=schema:Person property=schema:name datatype= xml:lang=NonProfit/span/span span class=field field--name-created field--type-created field--label-hiddenMon, 02/06/2017 - 15:39/span div class=field field--name-field-episode field--type-integer field--label-inline div class=field__labelEpisode/div div class=field__item18/div /div div class=clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__itempHere is where we bring awareness to Drupal modules running on less than 1% of reporting sites. Today we'll investigate Contact Emails, a module which allows a single contact form submission to be sent to multiple users each of which contains unique subject and body fields./p/div

Drupal @ Penn State: Web components, Polymer and decoupling design in Drupal

Mon, 02/06/2017 - 21:54
pspan class=capsUPDATE/span: You should also read this great post from a href=https://www.mediacurrent.com/blog/4-benefits-decoupled-architecture-enterprise-digital-marketersMediacurrent: Benefits of decoupled architecture/a/p

Acquia Developer Center Blog: Contribution Stories: Distilling Acquia experience into products and open source tools.

Mon, 02/06/2017 - 18:20
div class=field field-name-field-blog-image field-type-image field-label-hiddendiv class=field-itemsdiv class=field-item evenimg typeof=foaf:Image class=img-responsive src=https://dev.acquia.com/sites/default/files/styles/blog__190_x110_/public/blog/cameron_tod_mugshot_bw_0.jpg?itok=9LYrrY0K width=140 height=85 alt=Cameron Tod title=Cameron Tod //div/div/divdiv class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item even property=content:encodedp strongHow Acquia distills tens of thousands of hours of client work into products and open source tools for Drupal./strong Drupal gets better when companies, organizations, and individuals build or fix something they need and then share it with the rest of us. Our community becomes better, stronger, and smarter when others take it upon themselves to make a positive difference contributing their knowledge, time, and energy to Drupal. Acquia is proud to play a part, alongside thousands of others, in making tomorrow’s Drupal better than today’s. /p /div/div/divdiv class=field field-name-field-blog-tags field-type-taxonomy-term-reference field-label-inline clearfixdiv class=field-labelTags:nbsp;/divdiv class=field-itemsdiv class=field-item evena href=/tags/acquia-drupal-planet typeof=skos:Concept property=rdfs:label skos:prefLabel datatype=acquia drupal planet/a/div/div/div

ThinkShout: The 2017 ThinkShout Front-End Stack

Mon, 02/06/2017 - 14:00
pFront-end development is full of challenges - changing design trends, browser idiosyncrasies, client demands, and ever-evolving web standards to name a few. Over the last few years though, a new challenge has emerged. Which development stack should you choose?/p pOnce upon a time, front end development didn’t really have a “dev stack.” You had markup in files, maybe output from a CMS, a stylesheet, and some jQuery if you felt like getting fancy. Now though, the array of options can be paralysing. Pre-processors, post-processors, task runners, and package managers have made many aspects of development faster, but which ones are best? Where do you start?/p pHere at ThinkShout, under the watchful eye of a href=/team/eric/Eric Paxton/a, our Senior Front End Engineer, we’ve been trying out the various options whenever we take on a new project, to see how well it fits in our theming process. We’re pretty busy, so this covers a lot of ground quickly. We’ve been careful to a href=/blog/2016/07/the-hidden-power-of-documentation/fully document/a the tools used in the past so that we don’t bedevil the maintenance folks. (We are often the maintenance folks)./p pThe last few builds have seen our dev stack settle down to a flexible tool set that is easy to setup and maintain, while providing us with excellent modern theming tools. Let’s dive in!/p h2 id=getting-started-languages-handlers-and-package-managementGetting Started: Languages, Handlers, and Package Management/h2 pAt the bottom of a development stack are the languages used, the language handlers, and the package managers that allow you to include pre-built tools and libraries in your project. Some of these are interchangeable, but it solves a lot of problems if everyone uses the same fundamental tools./p pIn our case, we use a href=https://www.ruby-lang.org/en/Ruby/a and a href=https://en.wikipedia.org/wiki/JavaScriptJavaScript/a as the base languages, and a href=https://github.com/rbenv/rbenvrbenv/a and a href=https://nodejs.org/en/Node/a as their handlers. By using Ruby and JavaScript, we get access to an extremely wide array of applications, tools, plugins, and more. Once these are installed (Using an OS package manager! In this case, a href=http://brew.sh/Homebrew/a (since we all use Macs), we add package handling for these languages: a href=http://bundler.io/Bundler/a and a href=https://www.npmjs.com/NPM/a respectively. This gives us the following base:/p ul liRuby via rbenv, managing gems using Bundler/li liJavaScript via Node.js, managing packages using NPM/li /ul pNow we can specify Ruby Gems and Node packages in a Ruby Make file (code class=highlighter-rougeRakefile/code), and a complex project setup is as simple as running code class=highlighter-rougerake install/code once from the theme directory, and starting the task watcher using code class=highlighter-rougerake serve/code. (To be more precise, we use the Rakefile to install the Ruby Gems as defined in the Gemfile, and the Node modules as specified in the code class=highlighter-rougepackage.json/code file)./p pThe complete project setup for a new developer would be the following:/p div class=language-html highlighter-rougepre class=highlightcode~: brew install rbenv ~: gem install bundler ~: brew install node ~: brew install npm; ~: cd ~/path/to/theme/directory ~: rake install ~: rake serve /code/pre /div pAfter that, any new projects would only need the last three lines run./p pThe key to making this work is to have a code class=highlighter-rougeRakefile/code, a code class=highlighter-rougeGemfile/code and a code class=highlighter-rougepackage.json/code set up in our project’s theme so that code class=highlighter-rougerake install/code works properly. In our case we use the Rakefile to first run code class=highlighter-rougebundle install/code, which installs the appropriate gems and their dependencies:/p pRakefile:/p div class=language-ruby highlighter-rougepre class=highlightcodespan class=ntask/span span class=ss:install/span span class=kdo/span span class=nbsystem/span span class=s1'bundle install'/span span class=o//spanspan class=sr/ this runs the Gemfile contents! system 'npm install -g browser-sync' end /span/code/pre /div pGemfile:/p div class=language-bash highlighter-rougepre class=highlightcodespan class=nbsource/span span class=s1'http://rubygems.org'/span gem span class=s1'sass'/span gem span class=s1'sass-globbing'/span /code/pre /div pThis a href=http://bundler.io/v1.3/rationale.htmlgenerates/a a code class=highlighter-rougeGemfile.lock/code listing all of the installed packages/versions./p pThe code class=highlighter-rougenpm install/code lines in the Rakefile setup tools that we’ll discuss later. Our next layer in the stack are the SASS tools that Bundler installed./p h2 id=sass-at-thinkshout-please-pass-the-bourbonSASS at ThinkShout (please pass the Bourbon)/h2 pIn the middle of our stack is [SASS](http://sass-lang.com/. We use SASS in a fairly simple way at ThinkShout, installing it with [sass-globbing](https://rubygems.org/gems/sass-globbing. This allows us to set up directories that allow any files using the appropriate code class=highlighter-rouge_filename.scss/code syntax to be included in the build. We also tend to keep the directory structure fairly minimal:/p pcode class=highlighter-rougestyles.scss/code:/p div class=language-css highlighter-rougepre class=highlightcodespan class=k@import/span span class=s2'lib/bourbon/bourbon'/spanspan class=p;/span span class=k@import/span span class=s2'lib/neat/neat'/spanspan class=p;/span span class=k@import/span span class=s2'lib/normalize/normalize'/spanspan class=p;/span span class=k@import/span span class=s2'global/*'/spanspan class=p;/span span class=k@import/span span class=s2'layout/*'/spanspan class=p;/span span class=k@import/span span class=s2'modules/*'/spanspan class=p;/span /code/pre /div pThe first thing we include is the a href=http://bourbon.io/Bourbon/a mixin library. This includes coding shortcuts such as the a href=http://bourbon.io/docs/#px-to-rempixels-to-rems/a syntax code class=highlighter-rougerem(24)/code. This allows us to read a design’s pixel spacing and it converts them to the appropriate rem values. The a href=http://bourbon.io/docs/Bourbon Docs/a are excellent and well-maintained as well. Never worry about browser prefixes or fallbacks again./p pNext up is the Bourbon-related grid framework, [Neat](http://neat.bourbon.io/. A simple but powerful grid that uses semantic markup and easy-to-read terminology such as code class=highlighter-rouge@include span-columns(9)/code. No extra wrappers, no specific classes to add, and it’s extremely robust. We haven’t run into any cross-browser issues in over two years of using it, which says a lot, and since it’s only applied as you specify, it’s easy to break out of the grid if you need to./p pNext up is [normalize.css](https://github.com/necolas/normalize.css, a modern update to the old CSS reset stylesheets. Not really much to add to that except it’s emreally/em well commented, so make sure you change it from code class=highlighter-rougenormalize.css/code to code class=highlighter-rouge_normalize.scss/code so that you don’t bloat your final code class=highlighter-rougesite.css/code file./p pThe code class=highlighter-rougeGlobal/code directory has the following:/p div class=language-bash highlighter-rougepre class=highlightcode_01.vars.scss _02.mixins.scss _03.extends.scss _04.base.scss /code/pre /div pThe _01, _02, etc. prefixes take advantage of the sass-globbing’s alphabetical file inclusion. All our site variables (colors, font weights, and so forth) are in code class=highlighter-rougevars/code, our custom mixins are next, then extends. Base has all of the base markup styles:/p div class=language-css highlighter-rougepre class=highlightcodespan class=ntbody/span span class=p{/span span class=nlfont-size/spanspan class=p:/span span class=nrem/spanspan class=p(/spanspan class=m16/spanspan class=p);/span span class=nlfont-style/spanspan class=p:/span span class=nbnormal/spanspan class=p;/span span class=nlfont-weight/spanspan class=p:/span span class=err$/spanspan class=nregular/spanspan class=p;/span span class=nl-webkit-font-smoothing/spanspan class=p:/span span class=nantialiased/spanspan class=p;/span span class=nl-moz-osx-font-smoothing/spanspan class=p:/span span class=ngrayscale/spanspan class=p;/span span class=p}/span span class=nth1/spanspan class=o,/span span class=nth2/spanspan class=o,/span span class=nth3/spanspan class=o,/span span class=nth4/spanspan class=o,/span span class=nth5/spanspan class=o,/span span class=nth6/span span class=p{/span span class=nltext-rendering/spanspan class=p:/span span class=noptimizeLegibility/spanspan class=p;/span span class=err///span span class=errFix/span span class=errthe/span span class=errcharacter/span span class=errspacing/span span class=errfor/span span class=errheadings/span span class=p}/span span class=ntp/spanspan class=o,/span span class=nta/spanspan class=o,/span span class=ntul/spanspan class=o,/span span class=ntol/spanspan class=o,/span span class=ntetc/spanspan class=o.../span /code/pre /div pThe layouts directory usually has a code class=highlighter-rouge_layouts.scss/code file, which covers the basics of site layout. Since we use Drupal, we’ll often add a code class=highlighter-rouge_regions.scss/code as well to specify layout for the various Drupal-generated content zones on a site. These files are where we use the Neat framework the most./p pFinally, we have the code class=highlighter-rougemodules/code directory - where most of the theming takes place. These are usually named by content type (code class=highlighter-rouge_basic-pages.scss/code, code class=highlighter-rouge_articles.scss/code, etc.), though there are often files such as code class=highlighter-rouge_forms.scss/code and code class=highlighter-rouge_homepage.scss/code as well. Sometimes we don’t even have to use our a href=http://thesassway.com/intermediate/using-source-maps-with-sasssource maps/a to know where code is!/p pOne of our good habits is to start with our mobile-first, responsive code class=highlighter-rouge_01.template.scss/code file:/p div class=language-css highlighter-rougepre class=highlightcodespan class=o///span span class=ntDefault/span span class=o//span span class=ntMobile/span span class=o///span span class=ntTablet/span span class=o(/spanspan class=nt580px/spanspan class=o)/span span class=k@media/span span class=nall/span span class=nand/span span class=p(/spanspan class=nmin-width/spanspan class=p:/span span class=err$/spanspan class=ntablet/spanspan class=p)/span span class=p{/span span class=p}/span span class=o///span span class=ntLarge/span span class=ntTablet/span span class=o(/spanspan class=nt768px/spanspan class=o)/span span class=k@media/span span class=nall/span span class=nand/span span class=p(/spanspan class=nmin-width/spanspan class=p:/span span class=err$/spanspan class=nlg-tablet/spanspan class=p)/span span class=p{/span span class=p}/span span class=o///span span class=ntDesktop/span span class=o(/spanspan class=nt1228px/spanspan class=o)/span span class=err$/spanspan class=ntmax-width/spanspan class=o:/span span class=nt1440px/span span class=k@media/span span class=nall/span span class=nand/span span class=p(/spanspan class=nmin-width/spanspan class=p:/span span class=err$/spanspan class=ndesktop/spanspan class=p)/span span class=p{/span span class=p}/span /code/pre /div pWhen you want to add another theming module, you just make a copy of the template and your progressive breakpoints are included! (The code class=highlighter-rouge$max-width: 1440px/code is there in a comment because it’s handy)./p pAll of this gets handled by a task in our Rakefile, which sets a watcher for changes to any SASS file and compiles them into a single code class=highlighter-rougecss/style.css/code:/p div class=language-ruby highlighter-rougepre class=highlightcodespan class=ndesc/span span class=s1'Watch sass'/span span class=ntask/span span class=ss:sasswatch/span span class=kdo/span span class=nbsystem/span span class=s1'sass -r sass-globbing --watch sass/style.scss:css/style.css'/span span class=kend/span /code/pre /div h2 id=pulling-it-all-together-browsersyncPulling It All Together: Browsersync!/h2 pFinally, at the top of our stack, we have a href=https://browsersync.io/Browsersync/a. Eric Paxton, our Senior Front End Engineer, wrote an a href=https://thinkshout.com/blog/2016/04/syncing-up-with-drupal8-and-browsersync/excellent overview/a of why we use this amazing tool, what it does, as well as how to install it in detail for Drupal 8./p pIn our stack it’s as simple as another task in that Rakefile:/p div class=language-ruby highlighter-rougepre class=highlightcodespan class=ndesc/span span class=s1'Running Browsersync'/span span class=ntask/span span class=ss:browsersync/span span class=kdo/span span class=nbsystem/span span class=s1'browser-sync start --proxy local.dev --files css/*.css --no-inject-changes'/span span class=kend/span /code/pre /div pAnd adding the following (generated by running code class=highlighter-rougebrowser-sync start/code) to the site’s code class=highlighter-rougelt;headgt;/code :/p div class=language-javascript highlighter-rougepre class=highlightcodespan class=clt;!--/span span class=olt;/spanspan class=nxscript/span span class=nxid/spanspan class=o=/spanspan class=s2__bs_script__/spanspan class=ogt;/span span class=c1//lt;![CDATA[ document.write(lt;script async src='http://HOST:3000/browser-sync/browser-sync-client.2.12.3.js'gt;lt;\/scriptgt;.replace(HOST, location.hostname));/span span class=c1//]]gt;/span span class=olt;/spanspan class=sr/scriptgt; --/spanspan class=errgt; /span/code/pre /div pThis also sets a watcher on the CSS, and refreshes every browser you have open to code class=highlighter-rougelocalhost:3000/code or the local network IP address it generates upon running code class=highlighter-rougerake serve/code./p pThe last part of the Rakefile implements the tasks we set up:/p div class=language-ruby highlighter-rougepre class=highlightcodespan class=ndesc/span span class=s1'Serve'/span span class=ntask/span span class=ss:serve/span span class=kdo/span span class=nthreads/span span class=o=/span span class=p[]/span span class=sx%w{sasswatch browsersync}/spanspan class=p./spanspan class=nfeach/span span class=kdo/span span class=o|/spanspan class=ntask/spanspan class=o|/span span class=nthreads/span span class=olt;lt;/span span class=noThread/spanspan class=p./spanspan class=nfnew/spanspan class=p(/spanspan class=ntask/spanspan class=p)/span span class=kdo/span span class=o|/spanspan class=ndevtask/spanspan class=o|/span span class=noRake/spanspan class=o::/spanspan class=noTask/spanspan class=p[/spanspan class=ndevtask/spanspan class=p]./spanspan class=nfinvoke/span span class=kend/span span class=kend/span span class=nthreads/spanspan class=p./spanspan class=nfeach/span span class=p{/spanspan class=o|/spanspan class=nthread/spanspan class=o|/span span class=nthread/spanspan class=p./spanspan class=nfjoin/spanspan class=p}/span span class=nbputs/span span class=nthreads/span span class=kend/span /code/pre /div pThis has the emmagical/em effect of opening a new browser window to code class=highlighter-rougelocalhost:3000/code when you run code class=highlighter-rougerake serve/code, and reloading it every time you save any of your SASS files. It also scrolls all open windows together, even when you open up things on your phone using the local network proxy, which it helpfully provides as output:/p div class=language-html highlighter-rougepre class=highlightcodegt;gt;gt; Sass is watching for changes. Press Ctrl-C to stop. [BS] Proxying: http://site.dev [BS] Access URLs: ------------------------------------- Local: http://localhost:3000 External: http://172.16.5.235:3000 ------------------------------------- UI: http://localhost:3001 UI External: http://172.16.5.235:3001 ------------------------------------- [BS] Watching files... [BS] File changed: css/style.css write css/style.css write css/style.css.map /code/pre /div pThis is really the cherry on top of the dev stack - after using it for a little while, you’ll wonder how you ever got along reloading everything manually./p h2 id=stack-overviewStack Overview/h2 pIn summary, here’s that front-end stack:/p ul liRuby via rbenv, managing gems using Bundler/li liJavaScript via Node.js, managing packages using NPM/li liSASS with globbing, set up in a simple directory structure/li liBourbon Mixin library/li liNeat Grid system/li liNormalize.css as _normalize.scss/li liA simple module template containing responsive breakpoints/li liBrowsersync/li /ul pNone of this is carved in stone of course, and it gets slightly tweaked for every new build based on the project requirements, such as internationalization, the base CMS (Drupal, WordPress, or Jekyl in our case), and the desire to try out something new, which is fairly constant. After all, that’s how we got to the stack we have today!/p

Janez Urevc: Possible solution for knowledge sharing in the Drupal 8 media domain

Mon, 02/06/2017 - 10:48
spanPossible solution for knowledge sharing in the Drupal 8 media domain/span spanspan lang= about=https://janezurevc.name/users/slashrsm typeof=schema:Person property=schema:name datatype= xml:lang=slashrsm/span/span spanMon, 06.02.2017 - 10:48/span div class=field field--name-body field--type-text-with-summary field--label-hidden field--itempDrupal 8 has very good media handling support. Media team has (and still is) working hard to make Drupal the best CMS in the world when it comes to managing media. We have many modules in the contrib space that solve most of the common use cases in the domain. There is one problem though; there are many of them and some of them are quite complex and abstract. I've noticed that many times users struggle to completely understand what each module is responsible for, which features it comes with and specially how they all together fit into the bigger picture./p pThere are so-called feature modules (such as a href=https://drupal.org/project/file_browserFile entity browser/a, a href=https://drupal.org/project/mediaMedia/a, a href=https://drupal.org/project/content_browserContent browser/a, a href=https://drupal.org/project/media_entity_browserMedia entity browser/a, ...) and distributions (such as a href=http://www.md-systems.ch/en/projects/portfolio/np8NP8/a, a href=https://drupal.org/project/thunderThunder/a, a href=https://drupal.org/project/lightningLightning/a, ...) which ship with default configuration for the 80% use case. They are plug and play solutions, but it is also possible to use them as a base for learning and research of the ecosystem./p pBut unfortunately that's not enough. While some people learn the quickest by exploring existing solutions (myself included) that isn't the case for everyone. A lot of people need more guidance and those are the users that we're currently not supporting as much as we should. In order to drive further adoption of the media ecosystem and Drupal 8 itself we need to solve this knowledge sharing problem that I believe we have./p pI was thinking about this problem a lot lately and I think I came up with an idea that could help us solve it./p pstrongIt is a book/strong./p pA strongproblem solving oriented/strong book which would guide users through the ecosystem, explain individual parts and, most importantly, offer stronga bunch of recipes/strong for the common problems. It wouldn't be one of those 800+ pages technical books (who has time to read that?!). Rather it would be a strongcompact source of information/strong which you can have on your desk and stronguse it when you run into a problem/strong. We all want to build websites and the purpose of this book would be to help you do that as fast and as efficiently as possible./p pBook would produced by the people that designed and built the Drupal 8 media ecosystem, which would ensure stronghighest levels of quality/strong. It would be strongreleased under a a href=https://en.wikipedia.org/wiki/Creative_CommonsCreative commons license/a/strong with its sources publicly available on GitHub. Printed and compiled eBook versions would be sold through the standard channels./p h2Why copyleft?/h2 pI honestly believe into the free sharing of knowledge in our society. My opinion is that the strongonly way to evolve our civilization is to freely share the knowledge/strong that we have. There are also practical reasons besides the philosophical one. Making the book publicly available ensures that it will be likely updated as the ecosystem and Drupal itself evolve and change. This wouldn't necessarily be the case if the standard copyright license would be used./p h2Great idea! Why didn't you realize it already?/h2 pI am glad that you agree! :) Well... it is not that easy. Producing a real book is not emthat/em simple and it also comes with quite some expenses. There is the cost of the content production, proofreading, design, print, shipping, ... I've done a back of a napkin calculation and estimated that strongwe'd need around 20.000€/$21.500/17.000GBP/strong to do it./p pMy idea was to start a strongcrowdfunding campaign/strong to raise this amount. Backers would, depending on the perk level, get an eBook, print edition or both. Besides that they'd also get early access to the repository with the ability to provide feedback during the process of writing./p h2Now I need your feedback/h2 pI need to stronghear from you/strong. Is this something that would benefit the community? Is there any better way to educate users about the ecosystem? Would you prefer an online video course instead of a book? In-person training? Something else? Would you be prepared to back the crowdfunding campaign? If yes, what amount would you be prepared to invest?/p pPlease stronguse the form below/strong to share your thoughts. Thank you! I appreciate it./p /div div class=field field--name-field-related field--type-entity-reference field--label-above div class=field--labelEnjoyed this post? There is more!/div div class=field__items div class=field--itema href=https://janezurevc.name/join-us-next-drupal-media-sprint-mountain-camp-davos hreflang=enJoin us at the next Drupal Media sprint at the Mountain camp in Davos!/a/div div class=field--itema href=https://janezurevc.name/playing-sculpin-static-site-generator hreflang=enPlaying with the Sculpin static site generator/a/div div class=field--itema href=https://janezurevc.name/results-drupal-8-media-sprint hreflang=enResults of the Drupal 8 media sprint/a/div /div /div

fluffy.pro. Drupal Developer's blog: Ctools: custom access plugin

Sun, 02/05/2017 - 18:12
div dir=ltr style=text-align: left; trbidi=ondiv dir=ltr style=text-align: left; trbidi=onLast time we#39;ve learned how to a href=http://www.fluffy.pro/2017/02/ctools-custom-content-type-plugin.html target=_blankcreate custom ctools content type plugin/a. In that post we#39;ve already created a module bexample_module /bwhere we defined the plugin. This time we will learn how to create custom ctools baccess/b plugin. This type of ctools plugins can be used as a bselection rule/b for a panel variant or as a bvisibility rule/b for a panel pane. Please, read a href=http://www.fluffy.pro/2017/02/ctools-custom-content-type-plugin.html target=_blankprevious post/a before continue reading this. There is described how to create a module and integrate it with ctools.br/div/diva href=http://www.fluffy.pro/2017/02/ctools-custom-access-plugin.html#moreRead more »/a

fluffy.pro. Drupal Developer's blog: Ctools: custom content type plugin

Sat, 02/04/2017 - 14:37
div dir=ltr style=text-align: left; trbidi=ona href=https://www.drupal.org/project/ctools target=_blankCtools/a content types are an alternative to standard Drupal blocks. They are more comfortable and powerfull than blocks. Ctools content type plugins also known as bpanel panes/b. In this post you will learn how to create a configurable ctools content pane plugin.br/diva href=http://www.fluffy.pro/2017/02/ctools-custom-content-type-plugin.html#moreRead more »/a

Freelock : Ways to measure your website’s effectiveness

Sat, 02/04/2017 - 00:11
div class=field field-name-body field-type-text-with-summary field-label-hiddendiv class=field-itemsdiv class=field-item evenpWe've worked with many clients over the years, who all have very specific website development needs. While some clients may share common goals, each may approach those business goals in different ways. But, time and time again, we usually start by asking a client in what ways are they measuring their website's effectiveness. In this 4 part series, I'll discuss identifying purpose and overcoming obstacles, complaints of current site capabilities and establishing budget, metrics to success and selecting a vendor, then finally risk tolerance and disaster recovery planning./p/div/div/div