Feed aggregator

Lullabot: Building Social With "Open Social"

Planet Drupal -

Matt and Mike sit down with Taco Potze and Mieszko Czyzyk, as well as Lullabot Director of Technology, Karen Stevenson, to talk about the new Open Social Drupal distribution. We talk about the new features of Open Social, as well as the business model, developing in Drupal 8, and the pros and cons of distributions in general.

Building Social With "Open Social"

Lullabot -

Matt and Mike sit down with Taco Potze and Mieszko Czyzyk, as well as Lullabot Director of Technology, Karen Stevenson, to talk about the new Open Social Drupal distribution. We talk about the new features of Open Social, as well as the business model, developing in Drupal 8, and the pros and cons of distributions in general.

Acquia Developer Center Blog: Drupal 8 Content Workflow Initiative - Part 2

Planet Drupal -

Jozef Toth talks about the Drupal 8 CWI - I got the chance to follow up on my conversation with Dave Hall and Dick Olsson about the Drupal 8 Content Workflow Initiative (Podcast: Drupal 8 Content Workflow Initiative - Part 1). This post includes the video and full transcript of our conversation, as well as links to many of the people and topics we touched on!

Mentioned in the conversation
Video interview - 27 min.

Full transcript

jam: My standard joke in all the podcasts lately ... and I apologize because I’m doing it over and over again ... but welcome to glamorous Nové Zámky in the Slovak Republic. Jojo Toth and I just had quite a nice weekend in Bratislava, the capital of Slovakia, at the DrupalCamp CS. Among other hats, you’re the head of the Slovakian Drupal Association.

Jozef: Yes.

jam: Talk about who you are, what you do, and talk about DrupalCamp CS.

Jozef: My name is Jozef and I work as a user experience designer at Pfizer, and as you said, part of what I do as my volunteering time is leading or trying to help with the organizing of DrupalCamps in Slovakia and also organizing the entire Slovak Drupal community. I’ve been working with this for about seven years now, and we had five camps total so far, and many good events, smaller meet-ups, trainings.

jam: One of the really interesting parts of the Slovak DrupalCamp - so in real time, it’s June the 1st today that we’re speaking. The camp was at the end of May. One of the interesting things that happened at the camp was the launch of the Czech Drupal Association at the – well, the CS Camp is supposed to be unified, right?

Jozef: Yes.

jam: Is everybody still friends between the Czech Republic and Slovakia? Is it okay to do that sort of thing?

Jozef: Yes. I would say that most people are still very good friends. Actually I think it’s more like brothers, and definitely to me it feels that way. Really, from the beginning when we started organizing camps, our two communities which are not really big, we cooperated a lot together, did a lot of events together. Slovaks have been active in Czech Drupal Forum. Czechs have been active in the Slovak Drupal Forum, so it was just natural that for the last two years, we’ve decided to do a joint event and now it’s officially not DrupalCamp Slovakia, but CS which is Czechoslovakia. Actually, what you have on your T-shirt is Drupal Without Borders, so we were sort of reuniting Czechoslovakia again through Drupal.

jam: Okay. Are you going into politics next?

Jozef: I might consider that. I’m so sorry. I can’t deny nor confirm that.

jam: Now you and I have known each other for a number of years. I am absolutely certain that we worked together the first time in 2011. I’m not sure if we had met before that, but you used to run - among other things, you used to run a design agency, and we worked together to produce among other things a really fun infographic about the Drupal Security Process which I’m still really, really proud of and I’m going to link to again because it’s cool.

jam: How and when did you discover Drupal?

Jozef: That is a long story, so to make it short, and it was a long time ago, I think it’s like 11 years now. I was traveling on a train to my daily job where I was basically doing designs and trying to create some websites – some static websites, and my friends kept asking me, “Can you create a website for me?" then another friend, another friend ... I ended up looking for something which can help me to do it in a more sustainable way I would say, so I wouldn’t have to reinvent the wheel every time when I create a website so I discovered the word “content management system,” and then I discovered Drupal and I was actually comparing it to several other options. What really helped me was I found a very good resource. It was like a training blog post, “How to Build Your First Drupal Website,” and it basically convinced me that Drupal is the way how I should move forward and it’s been a successful journey so far.

jam: Your background is in design, so I imagine people were asking you for websites because you would make them pretty.

Jozef: Yes.

jam: All of these years you’ve been doing Drupal and by my count, that’s got to be at least six, eight?

Jozef: Since 2007, so it’s ...

jam: Wow. Nine years now. You don’t consider yourself a coder or a developer. From your perspective, with your design background and so on, what’s your favorite thing about Drupal and what made you stick with it all these times? When I say that, you made websites with Drupal, you had a Drupal agency, and now you work for Pfizer still on Drupal, so all this time that’s been a really common thread. What’s your favorite thing about it? Why did you stick with it?

Jozef: It may sound funny, or maybe everybody is telling that, but one of the things was actually the community because really I made very good friends in the community. I also found people or members of the Drupal community being these nice, good people, so when I had any issues or I didn’t know what to do or where to look, I knew that I can reach out to these people or ask on these forums and they would very quickly be people who would answer my questions. Definitely, community was one thing which kept me working with Drupal, but also the flexibility of Drupal where it was capable of supporting very small websites which I was building for my friends, to large portals or even distributions which we were building for probably the largest known non-profit organization which exists in the world. This big scale of different products which can be built with Drupal was another thing which definitely kept me.

jam: Your specialty over time has become UX especially. What are your thoughts about Drupal 8’s architecture in terms of the loose coupling between the backend where all the business logic happens and the ability to add any number of front ends whether they’re apps or other front-end frameworks and so on?

Jozef: Actually, this is one of the things which I am probably the most excited about Drupal 8. Obviously you were able to do something similar with previous versions of Drupal, but it just really got so much easier here, and I’m really excited to see how - for example, the market or the use cases will explode now, how we’ll see many different, not only iPhone or the mobile applications, but really how Drupal will be powering many different used cases which we haven’t really even maybe dreamt of or dreamed of ... Connected devices, wearables, applications in different systems which maybe are not even applications right now, but I think that it can really help disrupt some of the industries or some of the new ideas even. I really enjoyed the demo which Dries showed in New Orleans, and I really think that this is one of the key strengths of Drupal.

jam: Yes. I’m really excited about the "web beyond websites" - I’m starting to think of it that way whether it’s the internet of things and wearables, and we still all have computers and telephones and what have you. How the internet is connecting all of that and how Drupal as this web-services-content-management-engine can be behind that and power that sort of things, and that demo that Dries did in New Orleans was really, really cool essentially if I recall the details correctly, it was a store that’s kind of monitoring its inventories and pushing out specials and offers to entice people to come in and shop, and then people could also place orders through their Amazon Echo that would shoot through Drupal and go to the logistics system and there was never a front end, but it was all powered by Drupal and APIs.

Jozef: Yes, and awesomesauce.

jam: And awesomesauce! One of the things that Dries set up and made happen in many ways during the Drupal 8 initial – the long initial release cycle was the idea of initiatives. For the first time when he announced Drupal 8, he announced some sort of a roadmap that was more than, “Give me what you people need and we’ll put it together,” and said it needs to be mobile-first and it needs to be fully restful and web-services-oriented and a whole series of things: the configuration management initiative, and all these different aspects, and they went really well and now he’s come up with this idea of, “Let’s keep going with initiatives,” but he’s looking for the community to source the ideas again. The very first one of those that’s set up is the Content Workflow Initiative and you’re part of that along with a few other people. I spoke with Dick Olsson and Dave Hall about this in New Orleans. Why don’t you give me your perspective on what the initiative is, and what its goals are?

Jozef: Basically, I think the easiest way how to describe it is trying to make some of the things which people are, or Drupal users were always trying to do with Drupal and had to use several other tools for that basically just making their life easier. By adding parts of, let’s say Workbench Moderation to the core and just maybe changing some very small details from the user experience, I think it’s just making Drupal 8 out of the box more intuitive and more user-friendly when it comes to content authoring, content editing, and workflows around content.

jam: Who’s the target audience for the improvements that the Content Workflow Initiative is thinking about, and how are they going to benefit from sort of what you’re doing?

Jozef: The Workflow Initiative is oriented on content editors, people who maybe as part of their daily job work with content. They do moderations, authoring, publishing, and doing some edits, et cetera.

jam: Right. And to be fair, once we’ve architected and built a website, these are the people who live and breathe and work in the products that we’ve produced like day in, day out. They end up living with our sites much, much longer and more intimately than we ever do, right? You’re trying to make their experience better?

Jozef: Yes. We are basically trying to make their professional life easier.

jam: Would you say, as a UX person, do you have a – one of the reasons that usability and documentation is hard for regular developers and users is that a lot of us get used to how something work very, very quickly and then we just do it. As a UX person, how do you catch yourself from just getting used to a solution because it’s always been that way and keep your eyes fresh looking for improvements?

Jozef: You said in the beginning that I don’t consider myself being really a programmer or a developer or a coder. Actually, I think sometimes it helps when working with Drupal, and basically with many other tools or solutions as well because I can probably see some of the user interfaces from a completely different perspective than a developer who basically just wants to – and I’m not trying to decrease the value of developers obviously here – but their focus is on basically putting this item in that place. What we as user experience designers try to do is to help them maybe place it in a position, or on the place where people are usually looking for that, or we are in different situations, we are trying to come up with a position where people should be trying to look for that. I don’t know if this answers your question.

jam: Yes. I like the point about having a different perspective. I recall trying to introduce people to Drupal back – it doesn’t really matter, but [in the Drupal] five, six, seven days and it was perfectly obvious to me why one particular menu item was under a "Content" and another one was under "Structure", and another one was maybe under "People" or "Users" or whatever we called it that month, because I was aware of what subsystem was generating this bit of interface and then it makes perfect sense to group things by subsystems. Now, if you don’t know the underpinnings of Drupal, that doesn’t have to make any sense at all to you, right? That’s a good point.

Jozef: Yes. Obviously I love Drupal. I know there are thousands of developers who basically volunteer for uncountable number of hours, and work on it. As you said, I really love how it can basically fill the needs of an amazing amount of people. It’s like we have this 95% done, and we just need this finishing touch on that. It’s like when you produce a car, you let people drive it and test it and if there are few small things which just needs to be improved, and then they improve it and the final product is there for everyone to use. This is how we can help how user experience designers can contribute even when they are not developers.

jam: This is something that’s really interesting to me about your situation. You are part of a group that is potentially going to make a significant impact on Drupal Core itself going forward over the next couple of years as Drupal 8.2, 3, 4, 5 come out. Talk about being a contributor to Drupal Core who’s not a coder, and tell me how many other non-coding core contributors do you think there are at this point?

Jozef: I definitely think the number could be higher. Are you asking me about a specific number?

jam: Or your impression ...

Jozef: Yes. Through the years, when I was working with Drupal, I think the number should definitely be higher. We know that Drupal was basically a development-centric product if I can call it that way, and it’s incredible to see that actually the more when I’m attending DrupalCons and sprints there, we are always seeing an increase of people who are not developers, who are for example, just testers or they write documentation, or they are training others or even designers, people who want to bring in some maybe more strategic ideas to the board, but I think this number could still be higher and more people could get actually involved in contributing.

jam: Do you have any trouble getting developers to trust you on this soft stuff about the button placement or the user interface stuff? Did you have to work to get an effective working relationship going?

Jozef: No. What I found is that when they trust you or when they know you, they trust you with your judgment and they actually ask, especially when I work with my colleagues at Pfizer, they often come to me for recommendations for some of the work which they are working on, and I think it’s really important that we have this trust between the two worlds which exist: developers and basically everybody else because together we can make a very good product together. Also for several years or when I started to work with Drupal from the beginning, I realized that probably my biggest skill will never be developing or programming. I was looking for other ways how I can contribute to Drupal, and sometimes it has been difficult or I couldn’t find really a way how maybe a designer can help, and probably the problem was that I was just not looking enough.

jam: I think that that’s a parable for anybody who’s involved in Drupal. “I can’t contribute” is probably not true. Everyone in our community has at least something - some unique skill or knowledge, and in my experience everyone who’s tried has been able to make a difference. And literally there are people – I like the example of the Drupal community in India which is an amazing bunch of people and it’s really sprung up. It’s really exploded in the last five years, and right out of the gate they’ve got contributors who run camps or know where to get T-shirts printed right, or a whole set of other skills. It’s a very, very rich experience and I remember the early days of Drupal community when it was developers only like you were saying.

Jozef: When I actually started to look for opportunities, suddenly I saw that there are so many things which I can do even just helping with maybe marketing of Drupal. We started designing some of the infographics which actually, like the first one, I got an email from some university teacher if he can put it into a textbook because he liked that so much, and I also had the privilege to help designing Drupal 7 logo and then design the Drupal 8 logo as well, so the opportunities are there. We just need to sort of find our way into the community. There is also the "usability" tag in the issue queue which people can just look through and find design-related issues which they can help.

jam: You and Dick Olsson and Dave Hall all work for Pfizer, and Pfizer has a big investment in Drupal – probably thousands of websites. You’ve got time at work to work on this initiative. How does this content workflow initiative, how does that benefit Pfizer?

Jozef: Basically, many of the solutions which are a part of the content workflow initiative, they already exist as a contrib. modules, and you can find or learn more about it at drupaldeploy.org. There is a list of modules which work with Deploy, and we at Pfizer use many of these or even many of these have been created as a part of the work which we do to manage our own websites and how we deploy content across different workspaces or websites.

jam: Give me some examples of specific improvements that you’ve identified that you want to bring into this.

Jozef: Yes. Part of the concept for the workflow initiative is having workspaces. This is actually somewhere towards the end of the roadmap which we have for the workflow initiative, but it’s also one of the most visible places where people can see the results and the idea is that you have a collection of content entities which is a workspace, and you can synchronize content entities between these two workspaces. Sometimes when you work with a lot of data, a lot of information, a lot of content, and you need to do the same thing at some other workspace or website, let’s say, then it’s, for example, confusing, “Am I on this website or am I on this website?” One of the things which the initiative is proposing is to have a workspace switcher, for example where you can quickly see which workspace I’m currently working on, what moderation state it is in, and there is a very easy to use dropdown toolset how you can actually moderate the workspace itself. Another area is when you are, let’s say a content author and you work together with editors as a team, you may not have enough permissions for example to do the actual deployment, so you can submit your work, what you did for review, and then somebody else will review it. If it’s okay, he will deploy it. To know that something that like this happened, I came up with the idea of having notifications, so it can be a small icon maybe with a number in the toolbar which you can expand and see notifications related to your work, and actually I think this is something which would be beneficial to let’s say, entire Drupal, not only just the Workflow Initiative, but there are many things where notifications can be useful, like for example, showing you that your site is not secure or you need to update your modules.

jam: That is exactly the very first thing that occurred to me, plus new comments, comment moderation, spam, all that sort of thing too, right?

Jozef: Yes. I’m actually surprised that there isn’t a central notification place in Drupal.

jam: You’ve just embedded the notifications API, you realized?

Jozef: Yes.

jam: Cool. Hey, thank you so much for taking the time to talk with me. Thanks again for a wonderful Drupal Camp in Bratislava, and I am looking forward to seeing you again somewhere soon, maybe DrupalCon Dublin?

Jozef: Yes.

jam: Perfect. Wonderful. Thanks, Jojo.

Drupal Security Release process infographic

Jozef and I put this together a few years ago. I think it has held up well over time.

Podcast series: Drupal 8Skill Level: BeginnerIntermediateAdvanced

Fixing the mixed content problem with Automatic HTTPS Rewrites

Cloudflare Blog -

CloudFlare aims to put an end to the unencrypted Internet. But the web has a chicken and egg problem moving to HTTPS.

Long ago it was difficult, expensive, and slow to set up an HTTPS capable web site. Then along came services like CloudFlare’s Universal SSL that made switching from http:// to https:// as easy as clicking a button. With one click a site was served over HTTPS with a freshly minted, free SSL certificate.

Boom.

Suddenly, the website is available over HTTPS, and, even better, the website gets faster because it can take advantage of the latest web protocol HTTP/2.

Unfortunately, the story doesn’t end there. Many otherwise secure sites suffer from the problem of mixed content. And mixed content means the green padlock icon will not be displayed for an https:// site because, in fact, it’s not truly secure.

Here’s the problem: if an https:// website includes any content from a site (even its own) served over http:// the green padlock can’t be displayed. That’s because resources like images, JavaScript, audio, video etc. included over http:// open up a security hole into the secure web site. A backdoor to trouble.

Web browsers have known this was a problem for a long, long time. Way back in 1997, Internet Explorer 3.0.2 warned users of sites with mixed content with the following dialog box.

Today, Google Chrome shows a circled i on any https:// that has insecure content.

And Firefox shows a padlock with a warning symbol. To get a green padlock from either of these browsers requires every single subresource (resource loaded by a page) to be served over HTTPS.

If you had clicked Yes back in 1997, Internet Explorer would have ignored the dangers of mixed content and gone ahead and loaded subresources using plaintext HTTP. Clicking No prevented them from being loaded (often resulting in a broken but secure web page).

Transitioning to fully secure content

It's tempting, but naive, to think that the solution to mixed content is easy: “Simply load everything using https:// and just fix your website”. Unfortunately, the smörgåsbord of content loaded into modern websites from first-party and third-party web sites makes it very hard to ‘simply’ make that change.

CC BY 2.0 image by Mike Mozart

Wired documented their transition to https:// in a series of blog posts that shows just how hard it can be to switch everything to HTTPS. They started in April and spent 5 months on the process (after having already prepped for months just to get to https:// on their main web site). In May they wrote about a snag:

"[…] one of the biggest challenges of moving to HTTPS is preparing all of our content to be delivered over secure connections. If a page is loaded over HTTPS, all other assets (like images and Javascript files) must also be loaded over HTTPS. We are seeing a high volume of reports of these “mixed content” issues, or events in which an insecure, HTTP asset is loaded in the context of a secure, HTTPS page. To do our rollout right, we need to ensure that we have fewer mixed content issues—that we are delivering as much of WIRED.com’s content as securely possible.”

In 2014, the New York Times identified mixed content as a major hurdle to going secure:

"To successfully move to HTTPS, all requests to page assets need to be made over a secure channel. It’s a daunting challenge, and there are a lot of moving parts. We have to consider resources that are currently being loaded from insecure domains — everything from JavaScript to advertisement assets.”

And the W3C recognized this as a huge problem saying: “Most notably, mixed content checking has the potential to cause real headache for administrators tasked with moving substantial amounts of legacy content onto HTTPS. In particular, going through old content and rewriting resource URLs manually is a huge undertaking.” And cited the BBC’s huge archive as a difficult example.

But it’s not just media sites that have a problem with mixed content. Many CMS users find it difficult or impossible to update all the links that their CMS generates as they may be buried in configuration files, source code or databases. In addition, sites that need to deal with user-generated content also face a problem with http:// URIs.

The Dangers of Mixed Content

Mixed content comes in two flavors: active and passive. Modern web browsers approach the dangers from these different types of mixed content as follows: active mixed content (the most dangerous) is automatically and completely blocked, passive mixed content is allowed through but results in a warning.

CC BY 2.0 image by Ben Tilley

Active content is anything that can modify the DOM (the web page itself). Resources included via the <script>, <link>, <iframe> or <object> tags, CSS values that use url and anything requested using XMLHTTPRequest is capable of modifying a page, reading cookies and accessing user credentials.

Passive content is anything else: images, audio, video that are written into the page but that cannot themselves access the page.

Active content is a real threat because if an attacker manages to intercept the request for an http:// URI they can replace the content with their own. This is not a theoretical concern. In 2015 Github was attacked by a system dubbed the Great Cannon that intercepted requests for common JavaScript files over HTTP and replaced them with a JavaScript attack script. The Great Cannon weaponized innocent users’ machines by intercepting TCP and exploiting the inherent vulnerability in active content loaded from http:// URIs.

Passive content is a different kind of threat: because requests for passive content are sent in the clear an eavesdropper can monitor the requests and extract information. For example, a well positioned eavesdropper could monitor cookies, web pages visited and potentially authentication information.

The Firesheep Firefox add-on can be used to monitor a local network (for example, in a coffee shop) for requests sent over HTTP and automatically steal cookies allowing a user to hijack someone’s identity with a single click.

Today, modern browsers block active content that's loaded insecurely, but allow passive content through. Nevertheless, transitioning to all https:// is the only way to address all the security concerns of mixed content.

Fixing Mixed Content Automatically

We’ve wanted to help fix the mixed content properly for a long time as our goal is that the web become completely encrypted. And, like other CloudFlare services, we wanted to make this a ‘one click’ experience.

CC BY 2.0 image by Anthony Easton

We considered a number of approaches:

Automatically insert the upgrade-insecure-requests CSP directive

The upgrade-insecure-requests directive can be added in a Content Security Policy header like this:

Content-Security-Policy: upgrade-insecure-requests

which instructs the browser to automatically upgrade any HTTP request to HTTPS. This can be useful if the website owner knows that every subresource is available over HTTPS. The website will not have to actually change http:// URIs embedded in the website to https://, the browser will take care of that automatically.

Unfortunately, there is a large downside to upgrade-insecure-requests. Since the browser blindly upgrades every URI to https:// regardless of whether the resulting URI will actually work pages can be broken.

Modify all links to use https://

Since not all browsers used by visitors to CloudFlare web sites support upgrade-insecure-requests we considered upgrading all http:// URIs to https:// as pages pass through our service. Since we are able to parse and modify web pages in real-time we could have created an ‘upgrade-insecure-requests’ service that did not rely on browser support.

Unfortunately, that still suffers from the same problem of broken links when an http:// URI is transformed to https:// but the resource can’t actually be loaded using HTTPS

Modify links that point to other CloudFlare sites

Since CloudFlare gives all our 4 million customers free Universal SSL and we cover a large percentage of web traffic we considered just upgrading http:// to https:// for URIs that we know (because they use our service) will work.

This solves part of the problem but isn’t a good solution for the general problem of upgrading from HTTP to HTTPS

Create a system that rewrites known HTTPS capable URIs

Finally, we settled upon doing something smart: upgrade a URI from http:// to https:// if we know that the resource can be served using HTTPS. To figure out which links are upgradable we turned to the EFF’s excellent HTTPS Everywhere extension and Google Chrome HSTS preload list to augment our knowledge of CloudFlare sites that have SSL enabled.

We are very grateful that the EFF graciously accepted to help us with this project.

The HTTPS Everywhere ruleset goes far beyond just switching http:// to https://: it contains rules (and exclusions) that allow it (and us) to target very specific URIs. For example, here’s an actual HTTP Everywhere rule for gstatic.com:

<rule from="^http://(csi|encrypted-tbn\d|fonts|g0|[\w-]+\.metric|ssl|t\d)\. gstatic\.com/" to="https://$1.gstatic.com/"/>

It uses a regular expression to identify specific subdomains of gstatic.com that can safely be upgraded to use HTTPS. The complete set of rules can be browsed here.

Because we need to upgrade a huge number of URIs embedded in web pages (we estimate around 5 million per second) we benchmarked existing HTML parsers (including our own) and decided to write a new one for this type of rewriting task. We’ll write more about its design, testing and performance in a future post.

Automatic HTTPS Rewrites

Automatic HTTPS Rewrites are now available in the customer dashboard for all CloudFlare customers. Today, this feature is disabled by default and can be enabled in ‘one click’:

We will be monitoring the performance and effectiveness of this feature and enable it by default for Free and Pro customers later in the year. We also plan to use the Content Security Policy reporting features to give customers an automatic view of which URIs remain to be upgraded so that their transition to all https:// is made as simple as possible: sometimes just finding which URIs need to be changed can be very hard as Wired found out.

Would love to hear how this feature works out for you.

Annertech: DrupalCon Dublin: Hear Me Roar

Planet Drupal -

DrupalCon Dublin: Hear Me Roar

DrupalCon Dublin is just around the corner (since I live in Ireland, I mean that literally!). DRUPALCON: HEAR ME ROAR! (or at least speak, along with some other Annertechies). At DrupalCon we'll be speaking on a number of topics (interesting aside: we're the only Irish agency with any speakers at this year's DrupalCon). Here's a quick roundup of our talks and why you won't want to miss them:

Aurelien Navarre: How to audit Drupal 8 to determine the number of active users?

Planet Drupal -

When drupal.org reached 1 million registered users, I wondered what was the percentage of really active users.

I'd love to know how many of those 1M http://t.co/uVCABrlDEf accounts are actually active. Say, users who've logged in within the past year.

— Aurelien Navarre (@AurelienNavarre) October 11, 2013

Thinking about it more, I figured this would totally be a legit site audit metric to get for business owners. Say you have an e-commerce platform and you want to engage inactive users by giving them a discount or you wish to know if your community is really growing, there are many reasons to get such data and probably you could even create a good contrib module for that.

But if you're like me and prefer a quick and easy one-liner, then read on.

In Drupal 8, finding when a given user account last accessed the site is a bit different from Drupal 7, as you now need to query the {users_field_data} table.

mysql> SELECT uid,access FROM users_field_data WHERE uid = 1; +-----+------------+ | uid | access | +-----+------------+ | 1 | 1474319299 | +-----+------------+ 1 row in set (0.00 sec)

Problem is we can't really make anything out of this Unix timestamp. Sure you can use an Epoch converter or use the date command as below:

$ date -d @1474470084 Wed Sep 21 15:01:24 UTC 2016

But what if we'd do it on the fly, within our MySQL query? Enter MySQL's from_unixtime() function. The value is expressed in the current time zone but we don't really care here.

mysql> SELECT uid,from_unixtime(access) FROM users_field_data WHERE uid = 1; +-----+-----------------------+ | uid | from_unixtime(access) | +-----+-----------------------+ | 1 | 2016-09-19 21:08:19 | +-----+-----------------------+ 1 row in set (0.00 sec)

Okay, this is much better. We no longer have to switch context and have our human-readable date. Now, since we want to get basic usage stats, we can also choose to reformat the output to better GROUP BY later. I went with %Y (year) only but it's flexible and you totally can get fancy if you will.

mysql> SELECT uid,from_unixtime(access, '%Y') AS last_access FROM users_field_data WHERE uid = 1; +-----+-------------+ | uid | last_access | +-----+-------------+ | 1 | 2016 | +-----+-------------+ 1 row in set (0.00 sec)

We've now narrowed-down things enough to actually get our final MySQL one-liner. What we're doing below is simply to group user accounts so that we can calculate the number of 'active users' (which year they last logged in) and break it down accordingly.

mysql> SELECT COUNT(uid) AS number_of_users, from_unixtime(access, '%Y') AS last_access FROM users_field_data GROUP BY from_unixtime(access, '%Y') ORDER BY last_access DESC; +-----------------+-------------+ | number_of_users | last_access | +-----------------+-------------+ | 210 | 2016 | | 106 | 2015 | | 6 | 2014 | +-----------------+-------------+ 3 rows in set (0.00 sec)

If you're getting the below error, make sure to read the MySQL 5.7 documentation. Using GROUP BY has changed in MySQL 5.7.5+ and its usage is now stricter.

ERROR 1140 (42000): In aggregated query without GROUP BY, expression #1 of SELECT list contains nonaggregated column 'database.table.column'; this is incompatible with sql_mode=only_full_group_by

Unimity Solutions Drupal Blog: Drupal for Digital Publishing

Planet Drupal -

Today, the Newspapers & Magazine industry is turning towards digitization to cater for Millennial and Gen Z. The publishing industry is keen to choose Open Source Technologies such as Drupal as their CMS platform over other native applications. This blog shares with you Key Requirements of Digital Publishing and How Drupal could be a best choice for Digital Publishing Solutions through PPT. Leveraging on sophisticated features of Drupal 8 Publishers can now deliver right content to audience at right time on right device.

Issue 258

The Weekly Drop -

Issue 258 - September, 22nd 2016 From Our Sponsor Introduction to Drupal 8 Object-Oriented Coding

Object-Oriented Programming (OOP) in Drupal 8 adds benefits such as code reuse and encapsulation, allowing users to build better maintainable and structured code. Developers must make themselves familiar with how this is done in PHP: namespaces, PSR-standards and general OOP concepts may all be new. This webinar will teach you about the most important OOP concepts used in Drupal 8.

Articles Can Drupal Outdo Native Applications?

Dries Buytaert shares his thoughts on how the web can compete with native applications.

Drupal 8 on Cloud9 IDE Giving Clients What They Need - Not What They Want Sponsored

If you give your clients exactly what they ask for... they might not be as happy as you think! Instead, give them what they *need*.

Tutorials Creating a Dynamic Email Template in Drupal

"Creating a plain text email with Drupal is a simple task. However, when you want to send a nicely designed message with a logo, an article, a linked button or any other unique design with dynamic content personalized for each user, it can get complicated."

Custom Permissions in Drupal 8

"In Drupal 7 you had to use the hook_permission() where you provided the name and description of roles. In Drupal 8, however, we have now a separate YAML file that declares your custom roles. This is a cleaner and more standardized way of declaring what our module provides."

Drupal 8 Improvements for Developer Productivity: PHP, Symfony, and More Sponsored

With support for object-oriented web development, PHP, Symfony, and more, Drupal 8 has been architected for developer productivity and makes development easier than ever before. Learn how to setup the tools to make Drupal 8 and Symfony development that much easier, such as debugging with Dev Desktop2, Xdebug, and PHPStorm as the IDE, using Drush and Drupal Console, and more.

Enhancing CKEditor in Drupal 8

A nice look at customizing CKEditor on your new Drupal 8 site.

How to Add Audio Files to Drupal 8 Sites How to Define Variables in Twig Templates to Use as Custom HTML Classes

Learn how to do this common Drupal 8 theming task.

How to Force Search API to Reindex a Node / an Entity Most Commonly Used Hooks in Drupal 7 Redirecting Node Pages in Drupal 8 Using Panels to Override Existing Pages in Drupal 8 Projects Module Release: 'Pop-Up Question Redirect'

"The Popup question redirect module allows Drupal site builders to show website visitors a pop-up in which a question can be asked. If the visitor clicks "Yes" they will be redirected to a given webpage."

Releases Coder 8.x-2.9 Diff 8.x-1.0-Beta1 Features 8.x-3.0-Beta9 Linkit 8.x-5.0-Beta3 Openpublic 7.x-1.10 require_login 8.x-1.10 Token 8.x-1.0-Beta2 Video Exporting and Importing Taxonomies Podcasts DrupalEasy Podcast 185 - Amigurumi Long Beans (Ted Bowman - D8 Outside-In) The Secret Sauce, Ep. 32: Documentation and Training News Drupal Core Announcements: Core Topic Discussions at DrupalCon Dublin

"DrupalCon Dublin includes a full track of core conversations where you can learn about current topics in Drupal core development, and a week of sprints where you can participate in shaping Drupal's future."

Jobs List Your Job on Drupal Jobs

Wanna get the word out about your great Drupal job? Get your job in front of hundreds of Drupal job seekers every day at Jobs.Drupal.Org.

Featured JobsLead Drupal Developer

Great Ormond Street Hospital Childrens Charity London/London/GB

Drupal Developer for Stanford Web Services

Stanford University Stanford/CA/US

Drupal and/or Symfony developer

One Agency Leuven/BE


Jeff Geerling's Blog: Change the displayed username in Drupal 8 ala Realname

Planet Drupal -

Recovering from surgery finally gave me time to update my last D6 site—a 7 year old private photo and media sharing site with nearly 10,000 nodes and 20+ GB of content—to Drupal 8. Drupal 8 has become a lot more mature lately, to the point where I'm comfortable building a site and not having the foundation rot out from beneath as large ecosystem shifts have mostly settled down.

One thing that I thought would have the simplest implementation actually took a little while to figure out. I needed to have users' full name display instead of their usernames throughout the site. For D6 (and for similar D7 use cases), the easiest way to do this was to enable the Realname module, configure it a tiny bit, and be done with it.

In Drupal 8, however, Realname doesn't yet have a full release (see this issue for progress), and the way usernames are generated has changed slightly (see change record hook_username_alter() changed to hook_user_format_name_alter()).

Microserve: Ditch your gender perceptions and inspire inquisitive minds!

Planet Drupal -

Ditch your gender perceptions and inspire inquisitive minds! Sep 22nd 2016

I recently read a report by Deloitte which stated that, by the end of 2016, fewer than 25% of information technology jobs in developed countries will be held by women. That’s quite bleak, especially for women and young girls who are thinking about starting and developing a career in IT.

That got me reading on the topic of “women in tech” a little more. It’s a well-known topic and a lot of people have suggested potential reasons for this gap: an unconscious gender bias brought about by tech being a “boy’s club”; very few female role models in the tech industry; but perhaps most interestingly, the concept of a “brogrammer” culture: competitive male developers who are in it to prove they’re the best in a macho, masculine way, shouldering anyone else to the sidelines.

I’m no stranger to the brogrammer culture: I’ve worked alongside men who behave this way, and it’s apparent when I attend developer events as well. But as an answer to the question “why don’t girls consider IT and STEM as career choices from a young age”, that might be too simplistic.

My interest in computers began as a child. I can’t remember a time when we didn’t have a computer in the house - my dad was, and is, a massive geek, and prided himself on being an early adopter of everything and anything. He encouraged me to tinker, explore and break things. Without a shadow of a doubt, my enthusiasm and interest stemmed from those years when he let me run loose on his PC (and invariably end up breaking something).

I was really lucky to attend a well-equipped primary school until I was 10, where we had IT lessons once a week, learning about how to use computers to solve real-world problems. My secondary school was an all-girls’ school, where we did our IT GCSE at the end of year 9 - two years early. Some of my peers even went on to do their A level IT while we were doing our GCSEs.

That said, my secondary school was in a rural location, and many of my peers seemed preprogrammed to believe they would move into well-known careers like teaching, childcare or even farming. Aspirations to move into STEM-related careers amongst my fellow students were few and far between, even though our teachers were constantly pushing us towards medicine, veterinary sciences, IT, mathematics and the like. The opportunities existed and our teachers were great at encouraging us to consider STEM as a career choice, but most students passed it over completely.

So, it begs the question: if these children knew there were career opportunities available in STEM, and they knew they were lucrative, well-paid jobs, why did they pass them over for other, more traditional options? Why are so few girls willing to choose a career in STEM?

This got me thinking about how STEM is portrayed as a career. My role as a web developer is all about logic-based problem solving: it’s critical thinking at its very finest. We should be demonstrating to kids how fun and rewarding it can be when you’re presented with a real world problem, and how you use computer programming in a logical way to arrive at a solution.

As an avid digital artist in my spare time, I feel we should expand to students of the arts, demonstrating how computer design can be a viable career alternative. So often schools pigeonhole artistry as “painting bowls of fruit on paper”, skimming over the awesome world of technology: there’s graphic design, animation, games design, music production and so much more. A career in IT doesn’t necessarily mean programming!

So often people choose careers because they feel fulfilled in them: teachers because they like teaching and nurturing kids; doctors because they like to care for others; historians because they enjoy history. With tech, it’s important to sell the story in a different way. We need to ditch the perception of “if you work with computers, you’re geeky and uncool”, and frame a career in tech as “a way to solve problems”, so that we can inspire inquisitive minds from an early age.

But what about when it comes to boys versus girls? What’s the solution for getting more girls into tech? Well, in my view everything I’ve said here applies to both boys and girls. I would have hated being singled out as a special case because I was “a girl who liked computers” - like some kind of unicorn!

I’m a staunch believer that if a person doesn’t like something, they simply won’t pursue it. If you show children - boys and girls alike - how technology can be enjoyed and fulfilling, without introducing gender roles, they’ll be more likely to consider tech as a career.

The key is to forget about gender, and start focusing on the exciting opportunities that choosing a career in STEM can bring about!

Sophie has a BSc (hons) in Web Design, and was the UK’s first female Drupal Grand Master (the highest recognition in Drupal development). Her talents have recently been recognised by The Drum who listed Sophie amongst their ‘50 under 30’ most influential women in tech, as well as by BIMA who included her in their Hot 100 list. She is a senior developer for Microserve and has worked on many of our most complex client projects.

 

 

Written by: Sophie Shanahan-Kluth, Senior Developer

Microserve is a Drupal Agency based in Bristol, UK. We specialise in Drupal Development, Drupal Site Audits and Health Checks, and Drupal Support and Maintenance. Contact us for for further information.

Gizra.com: Yesod (and Haskell) from a Drupal (and PHP) Perspective

Planet Drupal -

In Gizra, we run an unusual stack. Drupal, our bread and butter, serves as the backend and is complimented by Elm for the front end, and as of recently Yesod - a Haskell framework.
Before Yesod, we were running NodeJs as our proxy server for light tasks or real-time messages.

But ever since I came across Elm, Javascript and I are hardly friends. I respect it, but can no longer turn my eye from its shortcomings. Functional programming has caught my heart and mind.

In this post I’m not going to try and present strong points on why you should adapt this stack, but rather share with you the unique path we are paving.

Elm

Elm was my first dip into the functional programming (FP) world. I recommend starting from there. It’s way more gentle than Haskell, and it has, of course, one important advantage - it helps you build rock solid, crazily fast, joy-filling, web apps.

Maybe this post and video will get you excited as well.

Gentle Intro to Haskell

A good way to start explaining what’s so special about Haskell is to dive directly into Haskell. While PHP is defined (by some) as a “productive” language, Haskell is often blamed (by some) as being an “academic language”. Both statements are probably wrong.

Often when mentioning Haskell, we talk about the compiler and the type system. They are truly marvelous tools. For the type system, I think the Elm post I lined above should be enough to get the hang of it. But I’d like to continue and reveal a bit more by highlighting mini examples on how Haskell makes us approach development tasks differently.

Lists

Below are examples from the REPL (the interactive shell for Haskell)

> [1, 2] ++ [3, 4] [1, 2, 3, 4]

What we have here are two lists of integers that are appended to each other. A list of integers is represented as [Int] in Haskell. The ++ is the operation that causes those two lists to be grouped into a single one.

Haskell comes with some handy shortcuts.

Continue reading…

Cheeky Monkey Media: Cheeky Monkey Media Named Leading Digital Agency

Planet Drupal -

Cheeky Monkey Media Named Leading Digital Agency rohan Wed, 09/21/2016 - 20:31

Do you want to kick ass in the digital environment? We thought so! Our cheeky monkeys have been helping clients do just that since 2008—longer than many digital agencies have been around.

Our work speaks for itself, but we really like it when our clients speak on our behalf. Recently their input was in large part responsible for helping us make a list of the top digital agencies in Canada, compiled by Clutch, a B2B market research firm based in Washington, D.C.

We earned our spot on Clutch’s “Leaders Matrix” based on our previous work, market presence, and most importantly, client reviews conducted by Clutch analysts. Below are a few comments from some of the people we’ve worked with:

A new look for Drupal.org

Drupal News -

As you can see we've put a fresh coat of paint on Drupal.org - but the changes run below the surface. This latest iteration of the front page brings the key concepts of our design system to the forefront: Clean, Modern, Technical.

This change also brings new editorial tools for Drupal.org content editors. The new home page provides us more flexibility with content and presentation, and so you'll see more frequent updates, more information about DrupalCon, and more editorial flexibility on the home page than you've seen in the past. These tools are also helping us to build cleaner, modern landing pages - like you've just seen with our Fall Membership Campaign.

We've previewed this work with several key members of the community and the board, and we want to say thank you to everyone who's given us their feedback on this first step for our new home page. We also want to give an extra special thank you to dyannenova for her contributions to this effort.

This is just the beginning - very soon we'll have a new visual look for the case studies that are featured on the home page, and then shortly after that we'll begin promoting solutions to Drupal evaluators in specific industries, like Higher Education, Media & Publishing, and Government.

If Drupal.org is the home of the community, than the front page is our front door. We want to welcome new users and evaluators of Drupal, highlight the project's strengths, and promote news and happenings from throughout the ecosystem.

We hope you like the changes, and we think you'll like the upcoming iterations even more. We'd love to hear your feedback!

Drupal.org blog: A new look for Drupal.org

Planet Drupal -

As you can see we've put a fresh coat of paint on Drupal.org - but the changes run below the surface. This latest iteration of the front page brings the key concepts of our design system to the forefront: Clean, Modern, Technical.

This change also brings new editorial tools for Drupal.org content editors. The new home page provides us more flexibility with content and presentation, and so you'll see more frequent updates, more information about DrupalCon, and more editorial flexibility on the home page than you've seen in the past. These tools are also helping us to build cleaner, modern landing pages - like you've just seen with our Fall Membership Campaign.

We've previewed this work with several key members of the community and the board, and we want to say thank you to everyone who's given us their feedback on this first step for our new home page. We also want to give an extra special thank you to dyannenova for her contributions to this effort.

This is just the beginning - very soon we'll have a new visual look for the case studies that are featured on the home page, and then shortly after that we'll begin promoting solutions to Drupal evaluators in specific industries, like Higher Education, Media & Publishing, and Government.

If Drupal.org is the home of the community, than the front page is our front door. We want to welcome new users and evaluators of Drupal, highlight the project's strengths, and promote news and happenings from throughout the ecosystem.

We hope you like the changes, and we think you'll like the upcoming iterations even more. We'd love to hear your feedback!

Drupal Blog: Drupal 8.1.10 released

Planet Drupal -

Drupal 8.1.10, a maintenance release which contains fixes for security vulnerabilities, is now available for download.

See the Drupal 8.1.10 release notes for further information.

Download Drupal 8.1.10

Upgrading your existing Drupal 8 sites is strongly recommended. There are no new features nor non-security-related bug fixes in this release. For more information about the Drupal 8.x release series, consult the Drupal 8 overview.

Security information

We have a security announcement mailing list and a history of all security advisories, as well as an RSS feed with the most recent security advisories. We strongly advise Drupal administrators to sign up for the list.

Drupal 8 includes the built-in Update Manager module, which informs you about important updates to your modules and themes.

Bug reports

This is the final security release for the 8.1.x series. Future maintenance releases will be made available in the 8.2.x series, according to our monthly release cycle.

Change log

Drupal 8.1.10 is a security release only. For more details, see the 8.1.10 release notes. A complete list of all changes in the upcoming 8.2.x branch can be found in the git commit log.

Security vulnerabilities

Drupal 8.1.10 was released in response to the discovery of security vulnerabilities. Details can be found in the official security advisories:

To fix the security problem, please upgrade to Drupal 8.1.10. (Sites testing the 8.2.x release should update to 8.2.0-rc2.)

Update notes

See the 8.1.10 release notes for details on important changes in this release.

This is the final security release of the 8.1.x series. Sites should prepare to update to 8.2.0 following this release.

Known issues

See the 8.1.10 release notes for known issues.

Drupal 8.1.10 released

Drupal News -

Drupal 8.1.10, a maintenance release which contains fixes for security vulnerabilities, is now available for download.

See the Drupal 8.1.10 release notes for further information.

Download Drupal 8.1.10

Upgrading your existing Drupal 8 sites is strongly recommended. There are no new features nor non-security-related bug fixes in this release. For more information about the Drupal 8.x release series, consult the Drupal 8 overview.

Security information

We have a security announcement mailing list and a history of all security advisories, as well as an RSS feed with the most recent security advisories. We strongly advise Drupal administrators to sign up for the list.

Drupal 8 includes the built-in Update Manager module, which informs you about important updates to your modules and themes.

Bug reports

This is the final security release for the 8.1.x series. Future maintenance releases will be made available in the 8.2.x series, according to our monthly release cycle.

Change log

Drupal 8.1.10 is a security release only. For more details, see the 8.1.10 release notes. A complete list of all changes in the upcoming 8.2.x branch can be found in the git commit log.

Security vulnerabilities

Drupal 8.1.10 was released in response to the discovery of security vulnerabilities. Details can be found in the official security advisories:

To fix the security problem, please upgrade to Drupal 8.1.10. (Sites testing the 8.2.x release should update to 8.2.0-rc2.)

Update notes

See the 8.1.10 release notes for details on important changes in this release.

This is the final security release of the 8.1.x series. Sites should prepare to update to 8.2.0 following this release.

Known issues

See the 8.1.10 release notes for known issues.

Lullabot: Modern decoupling is more performant

Planet Drupal -

Two years ago, I started to be interested in API-first designs. I was asked during my annual review, “what kind of project would you like to be involved with, this next year?” My response: I want to develop projects from an API-first perspective.

Little did I know that I was about to embark on a series of projects that would teach me not only about decoupled Drupal, but also the subtleties of designing proper APIs to maximize performance and minimize roundtrips to the server.

Embedding resources

I was lucky enough that the client that I was working with at the time—The Tonight Show with Jimmy Fallon—decided on a decoupled approach. I was involved in the Drupal HTTP API server implementation. The project went on to win an Emmy Award for Outstanding Interactive Program.

The idea of a content repository that could be accessed from anywhere via HTTP, and leverage all the cool technologies 2014 had to offer, was—if not revolutionary—forward-looking. I was amazed by the possibilities the approach opened. The ability to expose Drupal’s data to an external team that could work in parallel using the front-end technologies that they were proficient with meant work could begin immediately. Nevertheless, there were drawbacks to the approach. For instance, we observed a lot of round trips between the consumer of the data—the client—and the server.

As it turns out, The Tonight Show with Jimmy Fallon was only the first of several decoupled projects that I undertook in rapid succession. As a result, I authored version 2.x of the RESTful module to support the JSON API spec in Drupal 7. One of the strong points of this specification is resource embedding. Embedding resources—also called resource composition—is a technique where the response to a particular entity also contains the contents of the entities it is related to. Embedding resources for relationships is one of the most effective ways to reduce the number of round trips when dealing with REST servers. It’s based on the idea that the consumer requests the relationships that it wants embedded in the response. This same idea is used in many other specifications like GraphQL.

In JSON API, the consumer can interrogate the data with a single query, tracing relationships between objects and returning the desired data in one trip. Imagine searching for a great grandparent with a genealogy system that would only let you find the name of a single family member at a time versus a system that could return every ancestor going back three generations with a single request. To do so, the client appends an include parameter in the URL. For example: 

?include=relationship1,relationship2.nestedRelationship1

The response will include information about four entities:

  • The entity being requested (the one that contains the relationships).
  • The entity that relationship1 points to. This may be an entity reference field inside of the entity being requested.
  • The entity that relationship2 points to.
  • The entity that nestedRelationship1 points to. This may be an entity reference field inside of the entity that relationship2 is pointing to.

A single request from a consumer can return multiple entities. Note that for the same API different consumers may follow different embedding patterns, depending on the designs being implemented.

The landscape for JSON API and Drupal nowadays seems bright. Dries Buytaert, the product lead of the Drupal project, hopes to include the JSON API module in core. Moreover, there seems to be numerous articles about decoupling techniques for Drupal 8.

But does resource embedding offer a performance edge over multiple round-trip requests? Let’s quantitatively compare the two.

Performance comparison

This performance comparison uses a clean Drupal installation with some automatically generated content. Bear in mind, performance analysis is tightly coupled to the content model and merits case-by-case study. Nevertheless, let’s analyze the response times to test our hypothesis: that resource embedding provides a performance improvement over traditional REST approaches.

Our test case will involve the creation of an article detail page that comes with the Standard Drupal profile. I also included the profile image of a commenter to make things a bit more complex.

undefined

In Figure 1, I’ve visually indicated the “levels” of relationships between the article itself and each accompanying chunk of content necessary to compose the “page.” Using traditional REST, a particular consumer would need to make the following requests:

  • Request the given article (node/2410).
  • Once the article response comes back it will need to request, in parallel:
    • The author of the article.
      • The profile image of the author of the article.
    • The image for the article.
    • The first tag for the article.
    • The second tag for the article.
    • The first comment on the article.
      • The author of the first comment on the article.
        • The profile image of the author of the first comment of the article.
    • The second comment of the article.
      • The author of the second comment of the article.

In contrast, using the JSON API module (or any other with resource composition), will only require a single request with the include query parameter set to 

?include=uid,uid.field_image,field_tags,comments,comments.uid,comments.uid.field_image

When the server gets such a request it will load all the requested entities and return them back in a single swoop. Thus, the front-end framework for your decoupled app gets all of its data requirements in a JSON document in a single request instead of many.

For simplicity I will assume that the overall response time of the REST-based approach will be the one with the longest path (four levels deep). Having four parallel requests that happen at the same time will not have a big impact on the final response time. In a more realistic performance analysis, we would take into account that having four parallel calls degrades the overall performance. Even in this handicapped scenario the resource embedding should have a better response time.

Once the request reaches the server, if the response to it is ready in the different caching layers, it takes the same effort to retrieve a big JSON document for the JSON API request than to retrieve a small JSON document for one of the REST requests. That indicates that the big effort is in bootstrapping Drupal to a point where it can serve a cached response. That is true for anonymous and authenticated traffic, via the Page Cache and Dynamic Page Cache core modules.

undefined

The graphic above shows the response time for each approach. Both approaches are cached in the page cache, so there is a constant response time to bootstrap Drupal and grab the cache. For this example the response time for every request was ~7 ms every time.

It is obvious that the more complex the interconnections between your data are the greater the advantage of using JSON API's resource embedding. I believe that even though this example is extremely simple, we were able to cut response time by 75%.

If we now introduce latency between the consumer and the server, you can observe that the JSON API response still takes 75% less time. However, the total response time is degraded significantly. In the following chart, I have assumed an optimistic, and constant, transport time of 75 ms.

undefined Conclusion

This article describes some sophisticated techniques that can dramatically improve the performance of our apps. There are some other challenges in decoupled systems that I did not mention here. If you are interested in those—and more!—please attend my session at DrupalCon Dublin Building Advanced Web Services With JSON API, or watch it later. I hope to prove that you can create more engaging products and services by using advanced web services. After all, when you are building digital experiences one of your primary goals you should be to make it enjoyable to the user. Shorter response times correlate to more successful user engagement. And successful engagements make for amazing digital experiences .

Pages

Subscribe to Cruiskeen Consulting LLC aggregator