Weaving Web Accessibility With Usability

By formally adopting web accessibility standards, you can provide access to people with visual impairments without involving them in the product development lifecycle, but does that mean the end product is usable? In this article, I’ll briefly discuss visual impairments, as well as the connection between web accessibility standards and usability principles. I’ll also share my key takeaways from a usability test I conducted with visually impaired and blind participants.

What Is Visual Impairment?

The term visual impairment refers to people who can see but have a decrease in visual acuity or visual field. Visual impairment affects the ability to perform daily activities, such as reading, walking, driving, and social activities — all of which become difficult (and sometimes even impossible). There is a range of visual impairments which vary from mild to severe vision loss in one or both eyes.

Here are a few examples:

  • Central Scotoma
    Loss of vision in the central visual field.

  • Tunnel Vision
    Loss of vision in the peripheral visual field.

  • Hemianopia
    Loss of vision in half the visual field.

  • Blindness
    This term is only used for complete or near-complete loss of vision.

Warp & Weft

Weaving is a method of textile production in which the longitudinal warp and transverse weft come together to make a fabric. As in weaving, the creation of a user experience for people with visual impairments is based on the interweaving of two components: accessibility and usability.

Warp — Accessibility

Web accessibility means that websites, web applications, and technologies are designed and developed so that people with disabilities can use them. More specifically, people can: perceive, understand, navigate, and interact with and contribute to the web.

There is a range of disabilities that can impact how people access the web, including auditory, cognitive, neurological, physical, speech, and visual.

“The power of the web is in its universality. Access by everyone regardless of disability is an essential aspect”.

— Tim Berners-Lee, inventor of the World Wide Web

In order to ensure the universality of the web and provide access to everyone, as Berners-Lee noted, there’s a wide range of web accessibility standards (which come with a myriad of acronyms).

Let’s focus on these three key components:

  • Web Content Accessibility Guidelines (WCAG)
    Define how content (such as texts, images, forms) should be created so that it will be accessible through the use of sound, mouse-free navigation, compatibility with assistive technologies, and more.

Compliance with web accessibility guidelines is technical and requires a high level of expertise. While you can use these guidelines to create a more accessible product, does that mean the product is also easy to use?

While I tested visually impaired and blind participants on a product that was accessible according to the guidelines, I encountered the following cases:

  • Visually impaired participants were unable to read a large-size font because it’s weight was too thin.
  • Blind participants were unable to book a reservation at a restaurant because the navigation between dates was too hard to understand.
  • Visually impaired participants were unable to find their checkout because it opened elsewhere on the screen that was out of their visual field.

In other words, formal adoption of the web accessibility guidelines can certainly lead to compliance, but not necessarily usability. This is also recognized in W3C documentation where there is an explicit reference to the fact that usability must always be taken into account:

“Yet when designers, developers, and project managers approach accessibility as a checklist to meet these standards, the focus is only on the technical aspects of accessibility. As a result, the human interaction aspect is often lost, and accessibility is not achieved.”

I particularly like Bruce Lawson’s pictorial description in the introduction of the book Web Accessibility: Web Standards and Regulatory Compliance:

“I wouldn’t want you to think that making your sites accessible is just a matter of following a recipe; to make nourishing accessibility pudding, add one part CSS, one part valid code, a pinch of semantic markup, and a cupful of WCAG guidelines. It would be nice if I could guarantee that slavishly following such a recipe would make everything lovely… but the annoying fact is that people are people, and insist on having different needs and abilities.”

Compliance with accessibility standards is a necessary goal (and often required by law), but it can’t exist in a vacuum.

Weft — Usability

Usability is a measure of how much a specified user in a particular environment can use a user-interface to achieve a defined goal.

Usability is not an exact science that consists of formulas or black and white answers. Over the years, various usability models have been proposed for measuring the usability of software systems. One of the models was created by Jacob Nielsen, who proposed in his 1993 book Usability Engineering that usability is not a single, one-dimensional property of a user interface, but consists of five core attributes:

  1. Learnability
    How easy is it for the users to accomplish basic tasks during the first time they encounter the design?
  2. Efficiency
    How fast can users perform tasks and be productive after learning the design?
  3. Memorability
    How fast can returned-users reestablish proficiency, after a period of not using the design, without having to relearn everything?
  4. Errors
    How many errors do users make, how serious are these errors, and how easily can they recover from the errors?
  5. Satisfaction
    How subjectively are users satisfied with the use of the design?

To ensure a product is usable, it’s essential that these five cornerstones are dominant in the design and development process.

What I Learned From Conducting A Usability Test With Visually Impaired And Blind Participants

A usability test is a structured interview where participants that match a target audience perform a series of tasks. While the participants are working, they verbally describe their reactions to interactions with the product. This allows the observers to understand not only what the participants are doing in the interface, but why they’re doing so.

When I conducted my first usability test with visually impaired and blind participants on a product that is in compliance with the accessibility standards, I wasn’t able to find too much information about conducting these types of sessions. So, I thought to share some highlights from the process. These are divided into three parts:

  1. Before The Session
  2. During The Session
  3. After The Session

1. Before The Session

Defining The Test Goal

This is a starting point for a usability test. The test goal should be clear, specific, achievable, and relevant. The way we defined the goal is by collaborating with a multidisciplinary team: Designers, Product Managers, Developers, Content Writers, and QAs — each role brings a different perspective and expertise.

Creating Tasks

Since visually impaired and blind participants can take a longer time to complete tasks due to the way they navigate the site, we prioritized the tasks based on what’s most important to us, but this doesn’t mean that complex tasks need to be compromised.

Setting A Schedule:

Setting up our schedule for usability sessions required us to consider a range of issues, especially considering the complexity of our product and the physical limitations of the participants. This included:

  • Time to accompany the participant when entering and exiting the lab (we assigned a staff member to accompany each of the participants).
  • Time to configure and arrange assistive technology settings for each of the participants, depending on their abilities and if they brought their own equipment.
  • A time that the participants can comfortably navigate the interface.
  • Time to debrief with the staff after each session.

We set one hour for each session and 45 minutes between sessions which was stressful  and forced us to rush (it is better to take an hour between sessions).

Recruiting Participants

The selection of participants whose background and abilities represent the target audience is a crucial component in the testing process. In our case, we were looking for visually impaired and blind candidates who have experience purchasing products online.

Sources for finding participants can vary, such as information and technology learning centers for people with visual impairments in hospitals, colleges, and universities.

In our case, my wife, an ophthalmologist by profession, referred me to the operator of the Information Center for the Visually Impaired and Blind at the hospital where she works. To my delight, I encountered someone who was happy to help and referred me to a group of relevant candidates.

In order to prepare the candidates, we discussed the following:

  • The nature of the test, including that  there will be people watching them and a recording of the session.
  • Their online shopping experience. Do they primarily purchase on a computer or mobile? What is their favorite browser? What assistive technologies do they use? Additionally, in instances when the test is done in a non-English speaking country, ask them about the level of language proficiency when the interface is in English.
  • That each participant will receive an incentive (it’s important to make sure the incentive is also accessible).
  • If the candidates could bring their equipment with them.

Overall the responsiveness was high, and most candidates expressed a desire to attend.

Setting Up The Test Position

The candidates who confirmed their participation had different ways of interacting with the web. Some consume information by customizing settings for fonts, colors contrast, screen magnification, or listening to a screen reader, while some needed a combination of a few things.

Since most participants were not interested in bringing equipment with them (mainly due to difficulties carrying it or having a desktop computer), we had to take care of it ourselves. Once we found a staff member who understood how to configure the assistive technology, it didn’t take long to set up or adjust between sessions.

We set up various browsers and assistive technologies, including  NVDA, JAWS, and ZoomText.

Additionally, the camera and microphone should be adjusted to the needs of visually impaired participants, who need to get closer to the screen and view it at different angles.

It’s necessary to check before starting that the lab is physically accessible as well. For example, that there are no stairs at the entrance, there’s an accessible toilet, access to public transportation, and a place for a guide dog to sit.

Sending A Non-Disclosure Agreement (NDA)

Like any other instance where you want to get informed consent, you can send the NDA online using an accessible PDF.

Conducting A Dry Run Session

A week before the usability session, we conducted a dry run with a visually impaired participant in order to avoid unexpected difficulties. For example, we saw that the screen sharing tool we were using conflicted with one of the assistive technologies. Additionally, the dry run helped us get a better feeling for the schedule. For example, the introduction of the moderator was too long, so we weren’t able to check some of the planned tasks. Also, it helped us to refine the test plan in instances where certain tasks weren’t clear, more difficult than expected, or too easy. Just as importantly, the dry run allowed the moderators to train with a “real” participant, and mentally prepare themselves for this type of usability test.

2. During The Session

Moderator

The moderator is an important key to make this type of usability test go smoothly. Jared M. Spool once wrote:

“The best usability test moderators have a lot in common with an orchestra conductor. They keep the participant comfortable and stress-free. The moderator tries to make the participant forget they are in a foreign environment with a bunch of strangers who intensely watch everything that he/she does. They keep the information flowing to the design team, especially the tough news. And they do all this with organized flair and patience, ensuring every aspect of the user’s experience is explored.”

Moderating With Multiple Personalities: 3 Roles For Facilitating Usability Tests

In a test with visually impaired and blind participants, the orchestra conductor should behave even more sensitively. For example, during sessions where a screen reader was used—which affects the concentration of the observers—it is important to ask participants to speak loud and clear, so we can understand their process and how they comprehend tasks.

Observers

We invited relevant people from different departments so they would be directly exposed to participants and have a better chance to absorb the key information. After all, getting a report on the results doesn’t provide the same benefits as seeing the participants’ experience firsthand.

During the test, it’s important to pay attention and listen to the participant–even though the screen reader is distracting.

3. After The Session

Writing A Report

After the sessions, we wrote a report with our insights from the test:

Some of the insights were related to bugs that we had to fix. For example, blind participants didn’t always find a particular button in the NVDA’s Elements List dialog, or sometimes they didn’t receive confirmation in the screen reader after clicking on the "Like" button.

Some of the insights were related to the content. For example, some blind participants didn’t notice they were filling out the wrong form or wanted to scan an entire page quickly, but the strings in the aria-labels were too long.

Some of the insights were related to visuals. For example, visually impaired participants who use magnifying software didn’t understand how to proceed when the next action appeared in a different area of ​​the screen. Other times they didn’t notice the modal “close” icon — although its color was high contrast.

In the end, we found 65 issues that impact multiple departments in the company.

Additionally, our report included happy moments from the sessions. For example, some participants noted that using an icon next to a link helps them because they don’t have to read the text. Others liked the contrast of the placeholder text, and some mentioned that the image-zoom worked very well.

“Nothing About Us Without Us”

On July 26, 2020, the world marked the 30th anniversary of the signing of the American Disability Act (ADA). This opened doors that were closed too long for people with disabilities, such as participating in basic daily activities like traveling by bus, going to school, attending movies, visiting museums, and more.

All the events marking this historic signature were canceled or moved online due to the spread of the coronavirus.

One of the online events was the Virtual Crip Camp, featuring trailblazing speakers from the disability community. In the invitation to this event, there is a green bus with the slogan “Nothing About Us Without Us”:

“Nothing About Us Without Us” conveys the idea that a decision should be made with the direct participation of those most affected. The slogan came into use by activists with disabilities during the 1990s and is a connecting point between various disability rights movements around the world. The widespread use of the slogan (and in social networks using the hashtag #NothingAboutUsWithoutUs), reflects the desire of people with disabilities to take part in shaping the decisions that affect their personal lives.

The same DNA is common with the User-Centered Design approach, whose philosophy is that the product should fit the user—and not make the user adapt to the product. Under the User-Centered Design approach, there is a collaboration with users through a variety of techniques applied at different points in the product development lifecycle. Usability testing is one of those techniques.

The real magic of the usability test is not the reporting of data after the test, but the change in the perspective of team members who watch the participant in real-time and absorb what those participants say, think, do and, feel. As a result, they’ll develop empathy and better understand, reflect, and share the needs and motivations of another person.

In the case of participants with disabilities, this empathy is essential for many reasons — it harnesses the observers, creates motivation for change, and raises awareness about the experience for people with disabilities.

While automated tools that offer to make websites accessible can, at best, show us how well our site meets WCAG’s guidelines, they don’t clearly reflect how usable the website is for people with disabilities. In regard to a mechanistic approach to accessibility, my colleague Neil Osman, an accessibility engineer at Wix who is visually impaired, often uses the following expression:

"You can put lipstick on a pig, but it’s still a pig."

Making a usable product is not just the ability to rely on a list of accessibility standards. In order to create solutions for people with disabilities, we need to be exposed to them firsthand.

Disclaimer: The information provided here does not, and is not intended to, constitute legal advice; instead, all information, content, and materials are for general informational purposes only. The information contained herein may not constitute the most up-to-date legal or other information.


Credits: Jeremy Hoover, Udi Gindi, Bat-El Sebbag, Nir Horesh, Neil Osman, Alon Fridman Waisbard, Shira Fogel and Zivan Krisher contributed to this article.

11 Massive Cyber Monday 2020 Deals With Up to 94% Off

Black Friday and Cyber Monday are two of the year’s main shopping events. For online shoppers they are anticipated to be as rewarding as ever.

New and upgraded products often appear for the first time on Cyber Monday along with many longtime favorites. Web designers in particular will have an opportunity to purchase products or resources they have been needing for some time. Or, have a use for but didn’t even know they existed.

That said, here are 11 Cyber Monday specials, any one of which might just make your day!

1. Amelia WordPress Booking Plugin

Despite its time and money saving features and capabilities, Amelia is a lightweight and straightforward appointment and event management system for businesses to use, including front-end panels for their clients and employees.

Amelia is by far the best-selling WordPress booking plugin.

  • It is been placed in use by more than 30,000 businesses to date, including healthcare, beauty, sports, educational, and other industries
  • It replaces manual and semi-automated appointment booking and management systems with a fully automated, error free, and easy to work with application.
  • Amelia manages appointments, events, user, customer, and employee roles, services, and notifications at both single and multiple locations.
  • Amelia integrates seamlessly with Google and Outlook calendars, WooCommerce, and Zoom.
  • Several plans are available including annual, lifetime, basic, pro and developer.
  • It is a time saver that helps you gain more satisfied customers, and higher employee morale

Click on the banner to learn about Amelia’s features, including its front-end and back-end views. All licenses are offered at a 30% Cyber Monday discount..

2. wpDataTables 3.0 WordPress Table and Chart Plugin

This WordPress table and chart management plugin is designed to make data representation, presentation, and interaction quick, easy to accomplish, and effective.

  • wpDataTables enables you to build and insert interactive tables and charts in any WordPress-created website, page, or post.
  • wpDataTables’ features and user instructions are well documented
  • wpDataTables can process thousands upon thousands of data rows or files within minutes, if not seconds, saving its users hours and even days of time
  • Data can be accessed from many sources; MySQL query, Excel files, PHP arrays, Google spreadsheets, and CSV files to name a few.
  • wpDataTables-created tables and charts are customizable, responsive, informative, colorful, and easily maintainable. Tables and charts can be edited from the front-end or the back-end, and key data can be highlighted.

wpDataTables user licenses can be purchased at a 30% off Cyber Monday discount. Click on the banner to visit the site and learn more.

3. Kalium – Creative theme for multiple uses

Kalium won’t simply showcase your work. It will do so in a way you always hoped to achieve. This creative, multipurpose WordPress theme is well organized and quite simple to use and maintain, in addition to being a source of a large number of visually stunning demos.

  • The demos are easy to import, after which they, along with other design elements can be customized to meet the needs of the user.
  • All of the popular WordPress plugins are supported
  • Several highly popular plugins are included for free, including Slider Revolution, WPBakery and Elementor page builders, WooCommerce, and Advanced Custom Fields Pro.
  • Kalium is fast, totally responsive, SEO optimized and GDPR compliant.

You’re invited to join more than 36,000 satisfied Kalium clients. Kalium sells for $59, but the price has been reduced to $29 to help you celebrate Cyber Monday.

4. Slider Revolution

It’s more than a slider design tool. With Slider Revolution, you can WOW your clients – and even yourself – with professional-level visuals.

  • This WordPress plugin has more than 7 million users
  • If you can imagine it, you can probably build it with Slider Revolution
  • Sliders, carousels, website page templates and addons are yours to create mind-blowing websites.

This is an opportunity to add Slider Revolution to your design toolkit at a 33% Cyber Monday discount.

5. Total Theme

This flexible, easy-to-work-with WordPress theme is fast, SEO optimized, and perfect for creating websites for any industry.

Among Total’s features you’ll find:

  • A customizable, easy to use front-end page builder
  • A great selection of ready-to-use themes, and theme cards
  • Premium plugins including Slider Revolution and WPBakery

Total is WooCommerce ready and developer friendly and offers a 50% Cyber Week discount. The offer is valid November 24, 2020 at 1am (UTC) through December 2, 2020 1am (UTC). Discount already applied.

6. TheGem – Creative Multi-Purpose High-Performance WordPress Theme

If by chance you let Black Friday slip by, you still have a chance to purchase this, the ultimate high-performance multi-purpose toolbox for WordPress, at the Cyber Monday Special 50% discount.

  • TheGem WP theme includes more than 400 premium pre-built multi-page and onepage websites and templates with flexible customization options 
  • Available for Elementor and WPBakery page builders
  • With extended WooCommerce tools & features for best online shopping
  • A large selection of TheGem blocks (pre-designed web-page sections) is also included in the package 

Click on the banner to learn more about this popular, Google friendly theme.

7. Get illustrations bundle

Illustrations can add a lot to almost any website and can often accomplish what photos cannot.

  • Get Illustrations offers 4000+, and growing, unique illustrations to download
  • These illustrations are royalty free. A license is provided for their commercial use
  • The illustrations are available in SVG, PNG, Sketch, Ai, Figma, and Adobe XD formats

Use code EARLYBIRD to claim your 25% Cyber Monday discount.

8. Mobirise Website Builder

This could be one of the best Cyber Monday specials ever, especially if you’re in the market for a high-quality offline website builder.

Mobirise gets your projects started with:

  • 3500+ cool website templates
  • Google Amp and Bootstrap 4 for outstanding mobile performance
  • A great selection of sliders, galleries, eCommerce elements, and more

The Mobirise Cyber Monday discount? How does 97% sound?

9. XStore: Responsive Multi-Purpose WooCommerce WordPress Theme

If setting up an online store is in your sights, XStore offers a great opportunity to make it happen, easily and quickly.

  • For starters, there are 95+ good-to-go shops plus a full AJAX shop
  • $510 worth of premium WordPress plugins together with full support for WPBakery and Elementor
  • A header builder, a single product page builder, and a JS/CSS files generator

This WooCommerce-based theme is yours Cyber Monday for the low price of $39.

10. Ads Pro Plugin – Multi-Purpose WordPress Advertising Manager

This ad manager for WordPress plugin is set up to make ad management easy for both you and your users.

AdsPro features include:

  • An intuitive front-end order form
  • Front-end ad management for users and back-end management for the site owner
  • 25+ ad templates in 8 categories together with 20+ display types
  • CPC, CPM and CPD billing models plus 4 payment methods including Bank Transfer

Check the site to find out more about AdPro’s Cyber Monday special.

11. Heroic Inbox

Heroic Inbox offers a new way to manage your customer support email

  • The UI features smart workflows to help you quickly work through your emails
  • Provides collaboration among staff members to best assign and respond to customer emails.
  • Tracks key performance metrics so you can best understand how you and your team are performing

The Cyber Monday Special: use the BETA pass and save 66%.

*****   

You might want to bookmark this page for later use so you can take advantage of the bargains it features for your own use or your holiday shopping.

Many Cyber Monday offerings are intended to be redeemed in stores. They can however be downloaded or saved for in-store pickup at a later date.

Whatever you choose to do – Happy Shopping!

The post 11 Massive Cyber Monday 2020 Deals With Up to 94% Off appeared first on Codrops.

How to Easily Fix the DNS_PROBE_FINISHED_NXDOMAIN Error

Recently, one of our readers asked what they could do to fix the DNS_PROBE-FINISHED_NXDOMAIN problem?

This error message appears in Chrome when your browser can’t connect to the website you’ve requested. Other browsers use different messages to display this error.

In this article, we’ll show you how to easily fix the DNS_PROBE_FINISHED_NXDOMAIN error, and how to avoid it in the future.

Fixing the DNS_PROBE_FINISHED_NXDOMAIN error

What Is the DNS_PROBE_FINISHED_NXDOMAIN Error?

The DNS_PROBE_FINISHED_NXDOMAIN error is a Google Chrome error message which appears when the browser is unable to find the website you are trying to access.

An example of the DNS_PROBE_FINISHED_NXDOMAIN error in Google Chrome

This error appears when the DNS (Domain Name System) cannot find or connect to the IP address for that website.

Your browser then assumes that the website domain name doesn’t exist. The NXDOMAIN part of the error stands for ‘non-existent domain.’

To understand more, please take a look at our guide on how domain name / DNS work (visual explanation).

The error looks different in other browsers. For instance, here’s how it looks in Firefox:

An example of the DNS_PROBE_FINISHED_NXDOMAIN error in Firefox

If you’re seeing this error when you try to access your own WordPress site, you may think there’s a problem with your site.

The good news is that your site is likely working fine. The problem is that your computer isn’t able to connect to it.

With that said, let’s see how to troubleshoot and fix this error.

How to Fix the DNS_PROBE_FINISHED_NXDOMAIN Error?

There are several ways to fix the DNS_PROBE_FINISHED_NXDOMAIN error. However, it’s important to first check that it really is an error.

Before doing anything else, you should check that you typed the domain name correctly.

For instance, if you accidentally typed incorrect spelling for a domain name, then your browser may not be able to find that domain and give this error.

Even if you clicked on a link, you should still check that the domain name is correct. It could have been mistyped by whoever created the link.

If you’re certain that the domain name is correct, then click the ‘Reload’ or ‘Try again’ button.

Clicking the button to reload the website

Next, you should try accessing the website from a mobile phone (4G network), so you can see whether the issue is with your device or WIFI connection.

If the website doesn’t load on your mobile phone either, then you need to immediately contact your WordPress hosting provider because this means that your website is down.

However if the website loads just fine on your mobile phone, then you know the issue is either with your computer or your WiFi connection.

Let’s try solving that.

The first thing you should try is restarting your computer. If that doesn’t help, turn your internet modem off and on. These steps may automatically clear DNS and network-related issues.

If the error is still appearing, then you may need to try the following methods. We recommend starting with the first one and working through them.

Clear Your Browser’s Cache

To clear your cache in Chrome, go to the page chrome://settings/clearBrowserData in your browser. This should give you a popup window where you are able to clear your cache.

First, set the time range to ‘All time’ then check just the ‘Cached images and files’ box. Next, click the ‘Clear data’ button.

Clearing cached images and files in Chrome

If you aren’t using Chrome, check out our article on clearing your browser cache for instructions for all major browsers.

Now, try the website again. If it still shows the error message DNS_PROBE_FINISHED_NXDOMAIN, simply try the next solution.

Turn Off Experimental Chrome Features

If you’ve enabled any of Chrome’s experimental features, then these could be causing the DNS_PROBE_FINISHED_NXDOMAIN error.

To turn these off, go to chrome://flags/ in your browser then click the ‘Reset all’ button at the top.

Resetting all experiments in Chrome

If the website you want to access still shows the error, try the next solution.

Flush Your Computer’s DNS Cache

Your computer often saves (caches) the IP addresses of websites that you’ve previously visited. If the website’s IP has changed, then that can cause the DNS_PROBE_FINISHED_NXDOMAIN error.

Here’s how to flush your DNS cache.

Note: These instructions are for Windows 10. For macOS instructions, check out our guide on clearing your DNS cache.

First, search for the Command Prompt app. Go ahead and open it up.

Tip: If you’re not logged in as an administrator, use the ‘Run as administrator’ option.

Opening the Command Prompt app

Next, type ipconfig/flushdns then press Enter on your keyboard. You should then see a success message.

Typing the command into the Command Prompt window to flush the DNS cache

Now, try accessing the website again. If the error message DNS_PROBE_FINISHED_NXDOMAIN still appears, try the next solution.

Release and Renew Your IP Address

The next step is to renew your computer’s IP address on the internet.

Go ahead and open up the Command Prompt app, as shown in the previous step. Next, enter the following commands in this order. Press Enter after each one.

ipconfig /release

ipconfig /flushdns

ipconfig /renew

You will see quite a few lines of information after entering the first and third commands. This is normal.

Renewing your computer's IP address

If the DNS_PROBE_FINISHED_NXDOMAIN error still appears after this, try the next solution.

Use Google’s Public DNS Servers

By default, your computer uses the DNS server from your internet service provider (ISP). You can change this to use Google’s public DNS server instead.

On Windows, open your Control Panel then go to Network and Internet » Network and Sharing Center. Then, click the ‘Change adapter settings’ link on the left hand side.

Clicking the Change adaptor settings link

You will see a list of connections. Right-click on your current connection and select the Properties option.

Click on the Properties for your active internet connection

Next, click on the Internet Protocol Version 4 (TCP/IPv4) and then click the Properties button.

Selecting the Internet Protocol Version 4 (TCP/IPv4) option

After that, you need to click the ‘Use the following DNS server addresses’ option and enter these DNS servers:

Preferred DNS server: 8.8.8.8
Alternative DNS server: 8.8.4.4

Then, click the OK button to save your changes.

Using the details for Google's public DNS servers

Try the website again to see if the DNS_PROBE_FINISHED_NXDOMAIN error is fixed. If not, try the final method.

Check Your Computer’s ‘hosts’ File

The hosts file is a file that your computer uses to map domain names to IP addresses. If the website is incorrectly recorded in this file, that can be the cause of the DNS_PROBE_FINISHED_NXDOMAIN issue.

On Windows, you can find this file through File Explorer. First, open File Explorer, then find the Windows folder on your computer. It’s normally in the C:\ drive. Mac users can find the file under /private/etc/hosts/ folder.

Next, go to System32 » drivers » etc. Here, you need to locate the hosts file and double click on it to open it. If you’re prompted to choose an app, use Notepad.

Finding the 'hosts' file on your computer

Now, check to see if the website’s address is in the hosts file. If it is, delete it along with the IP address next to it. Then, save the file.

Checking the contents of the 'hosts' file on your computer

After doing this, the DNS_PROBE_FINISHED_NXDOMAIN error should hopefully no longer appear for that site.

We hope this article helped you learn how to fix the DNS_PROBE_FINISHED_NXDOMAIN error. You might also like our article on the most common WordPress errors and how to fix them.

If you liked this article, then please subscribe to our YouTube Channel for WordPress video tutorials. You can also find us on Twitter and Facebook.

The post How to Easily Fix the DNS_PROBE_FINISHED_NXDOMAIN Error appeared first on WPBeginner.

Building a Svelte Static Website with Smooth Page Transitions

Editor’s note: We want to share more of the web dev and design community directly here on Codrops, so we’re very happy to start featuring Yuriy’s newest live coding sessions!

In this live stream of ALL YOUR HTML, you’ll learn how image transitions with GLSL and Three.js work and how to build a static website with Svelte.js that will be using a third party API. Finally, we’ll code some smooth page transitions using GSAP and Three.js.

This coding session was streamed live on November 29, 2020.

Check out the live demo.

Support: https://www.patreon.com/allyourhtml

Setup: https://gist.github.com/akella/a19954…

The post Building a Svelte Static Website with Smooth Page Transitions appeared first on Codrops.

Dreaming Of A Magical December (2020 Wallpapers Edition)

2020 was a year that was anything but ordinary, and, well, the upcoming holiday season will be different from what we all are used to, too. To cater for a little bit of holiday cheer in these weird times, artists and designers from across the globe got their creative juices flowing and created festive and inspiring wallpapers for December. Following our monthly tradition, they all come in versions with and without a calendar and can be downloaded for free.

We are very thankful to everyone who took the time to create an artwork and shared it with us this month — you are truly smashing! And since so many talented people have helped fill our archives with designs that are just too good to be forgotten in all these years we’ve been running this wallpapers challenge, we also compiled a little best-of from past December editions at the end of this post. Maybe you’ll spot one of your almost-forgotten favorites in there, too? Have a cozy December, everyone, and stay safe!

  • All images can be clicked on and lead to the preview of the wallpaper,
  • We respect and carefully consider the ideas and motivation behind each and every artist’s work. This is why we give all artists the full freedom to explore their creativity and express emotions and experience through their works. This is also why the themes of the wallpapers weren’t anyhow influenced by us but rather designed from scratch by the artists themselves.

Submit your wallpaper

Did you know that you could get featured in one of our upcoming wallpapers posts, too? We are always looking for creative talent, so if you have an idea for a wallpaper for January, please don’t hesitate to submit it. We’d love to see what you’ll come up with. Join in! →

Holiday Season

“As the holiday season is coming, let’s not let this situation that has befallen us all spoil the most beautiful moments with our loved ones. The LibraFire team wishes you a lot of love, health and understanding in the new year!” — Designed by LibraFire from Serbia.

Stay Cozy

“For our December calendar, we drew inspiration from the contrast of the home warmth and brisk weather outside. Cut off from reality, though at the same time, intimate for those on the inside. This December, stay cozy, stay warm, and stay safe.” — Designed by PopArt Studio from Serbia.

Happy Holidays

Designed by Ricardo Gimenes from Sweden.

It’s Christmas

“The holiday season is finally here, which means it’s time to deck the halls, bring out the figgy pudding and embrace all things merry and bright. It’s Christmas !” — Designed by Divya (DimpuSuchi) from Malaysia.

Winter Landscape

Designed by Morgane Van Achter from Belgium.

Porcupine Christmas

“I got you something for this Christmas. I hope you like it: porcupine gifting watercolor flowers.” — Designed by Divya (DimpuSuchi) from Malaysia.

Oldies But Goodies

Whether it’s Christmas, the frosty winter weather, or International Bathtub Party Day, a lot of things have inspired the community to design a December wallpaper in the past. Below you’ll find a selection of timeless December goodies from our archives. Please note that these wallpapers don’t come with a calendar.

Dear Moon, Merry Christmas

“Please visit Vladstudio website if you like my works!” — Designed by Vlad Gerasimov from Russia.

Christmas Mood

Designed by MasterBundles from the United States.

Getting Hygge

“There’s no more special time for a fire than in the winter. Cozy blankets, warm beverages, and good company can make all the difference when the sun goes down. We’re all looking forward to generating some hygge this winter, so snuggle up and make some memories.” — Designed by The Hannon Group from Washington D.C.

December Through Different Eyes

“As a Belgian, December reminds me of snow, cosiness, winter, lights and so on. However, in the Southern Hemisphere it is summer at this time. With my illustration I wanted to show the different perspectives on December. I wish you all a Merry Christmas and Happy New Year!” — Designed by Jo Smets from Belgium.

’Tis The Season (To Drink Eggnog)

“There’s nothing better than a tall glass of Golden Eggnog while sitting by the Christmas tree. Let’s celebrate the only time of year this nectar of the gods graces our lips.” — Designed by Jonathan Shears from Connecticut, USA.

Cardinals In Snowfall

“During Christmas season, in the cold, colorless days of winter, Cardinal birds are seen as symbols of faith and warmth! In the part of America I live in, there is snowfall every December. While the snow is falling, I can see gorgeous Cardinals flying in and out of my patio. The intriguing color palette of the bright red of the Cardinals, the white of the flurries and the brown/black of dry twigs and fallen leaves on the snow-laden ground fascinates me a lot, and inspired me to create this quaint and sweet, hand-illustrated surface pattern design as I wait for the snowfall in my town!” — Designed by Gyaneshwari Dave from the United States.

Have A Minimal Christmas

“My brother-in-law has been on a design buzzword kick where he calls everything minimal, to the point where he wishes people, “Have a minimal day!” I made this graphic as a poster for him.” — Designed by Danny Gugger from Madison, Wisconsin.

Snow & Flake

“December always reminds me of snow and being with other people. That’s why I created two snowflakes Snow & Flake who are best buddies and love being with each other during winter time.” — Designed by Ian De Lantsheer from Belgium.

A Merry Christmas You Will Have

“I am a huge fan of Star Wars, so I designed a parody cartoon image of Master Yoda on Dagobah wishing everyone a Merry Christmas… Yoda-style. I designed a candy cane as his walking stick and added a Christmas hat to complete the picture. I hope you like it!” — Designed by Evita Bourmpakis from Greece.

Enchanted Blizzard

“A seemingly forgotten world under the shade of winter glaze hides a moment where architecture meets fashion and change encounters steadiness.” — Designed by Ana Masnikosa from Belgrade, Serbia.

Christmas Owl

“Christmas waves a magic wand over this world, and behold, everything is softer and more beautiful.” — Designed by Suman Sil from India.

The House On The River Drina

“Since we often yearn for a peaceful and quiet place to work, we have found inspiration in the famous house on the River Drina in Bajina Bašta, Serbia. Wouldn’t it be great being in nature, away from the civilization, swaying in the wind and listening to the waves of the river smashing your house, having no neighbors to bother you? Not sure about the Internet, though…” — Designed by PopArt Studio from Serbia.

Don’t Stop

“The year isn’t over yet — don’t stop pushing yourself!” — Designed by Shawna Armstrong from the United States.

A South Pole Christmas

“Reindeer and elves don’t deserve all the fun in December!” — Designed by Michaela Schuett from the United States.

Joy To The World

“Joy to the world, all the boys and girls now, joy to the fishes in the deep blue sea, joy to you and me.” — Designed by Morgan Newnham from Boulder, Colorado.

Christmas Time!

Designed by Sofie Keirsmaekers from Belgium.

Ninja Santa

Designed by Elise Vanoorbeek from Belgium.

House Of The Birds

Designed by Pietje Precies from the Netherlands.

Ice Flowers

“I took some photos during a very frosty and cold week before Christmas.” Designed by Anca Varsandan from Romania.

Bathtub Party Day

“December 5th is also known as Bathtub Party Day, which is why I wanted to visualize what celebrating this day could look like.” — Designed by Jonas Vanhamme from Belgium.

Hello Friends new here :)

Hello everyone..It's me Mark Smith from new york currently studying in a college near my home just to join this website to make community with you..Recently I join a company name [Logo orbit] and I'm working at there as a marketing agent...hope you guys like my introduction..Glad to see a warm welcome from your side :)

Save data from array to file

Hi i'm a beginner in Java. I have school assigment where they want to save employee array to the file and can load it back with replacing the current array in GUI when it hit button save or load. Also, if i want to save or load the array with the specific file name from JTextField what code should i include.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.event.ActionListener;
import java.io.FileOutputStream;
import java.util.Scanner;
import java.awt.event.ActionEvent;
import java.io.*;
import javax.swing.JOptionPane;

public class Etracker 
{
    public static void main(String[] args)
    {
      Etracker etk = new Etracker();

      Etracker file = new Etracker();

      etk.getInput();

      file.saveBytes();
      file.loadBytes();
      file.saveData();
   file.loadData();



    }
    void saveBytes(){
            File f = new File("Employee.txt");

            try {
                    FileOutputStream fos = new FileOutputStream(f);
                    ObjectOutputStream oos = new ObjectOutputStream(fos);


                    fos.close(); oos.close();
            }
            catch (FileNotFoundException e)
            {
                //joption needed
                JOptionPane.showMessageDialog(null, "Sorry File not found", "Error",JOptionPane.ERROR_MESSAGE);
            }
            catch (IOException e) 
            {
                //joption needed
                JOptionPane.showMessageDialog(null, "unspecified I/O exception!", "Error",JOptionPane.ERROR_MESSAGE);
            }
    }
    void loadBytes(){

                File f = new File("Employee.txt");

                try {
                        FileInputStream fis = new FileInputStream(f);
                        ObjectInputStream ios = new ObjectInputStream(fis);


                        fis.close(); ios.close();
                }
                catch (FileNotFoundException e)
                {
                    //joption needed
                    JOptionPane.showMessageDialog(null, "Sorry File not found", "Error",JOptionPane.ERROR_MESSAGE);
                }
                catch (IOException e) 
                {
                    //joption needed
                        JOptionPane.showMessageDialog(null, "unspecified I/O exception!", "Error",JOptionPane.ERROR_MESSAGE);
                }
                    }

    void saveData() {

        File f = new File("Employee.txt");



        try {

            FileOutputStream fos = new FileOutputStream(f);

            DataOutputStream dos = new DataOutputStream(fos);

            System.out.println("data successfully saved");


            dos.close(); fos.close();
                } 
                catch (FileNotFoundException e)
                {
                    //joption needed
                    JOptionPane.showMessageDialog(null, "Sorry File not found", "Error",JOptionPane.ERROR_MESSAGE);
                }
                catch (IOException e) 
                {
                    //joption needed
                        JOptionPane.showMessageDialog(null, "unspecified I/O exception!", "Error",JOptionPane.ERROR_MESSAGE);
                }
    }

    void loadData() {

        File f = new File("Employee.dat");



        try {

            FileInputStream fis = new FileInputStream(f);


            DataInputStream dis = new DataInputStream(fis);

            System.out.println("data successfully loaded");


            dis.close(); fis.close();
                } 
                catch (FileNotFoundException e)
                {
                    //joption needed
                    JOptionPane.showMessageDialog(null, "Sorry File not found", "Error",JOptionPane.ERROR_MESSAGE);
                }
                catch (IOException e) 
                {
                    //joption needed
                        JOptionPane.showMessageDialog(null, "unspecified I/O exception!", "Error",JOptionPane.ERROR_MESSAGE);
                }
        }



        private EFrame gui;
        private Employee[] e; 
        private Integer current;

        public Etracker() 
        {
          e = new Employee[0]; 
          gui = new EFrame(); 
        }


        public void create(String lastName, String firstName) 
        {
                Employee id = new Employee(e.length + 1, firstName, lastName);
                expand(id);

        }


        public void expand(Employee id) 
        {
          Employee[] temEmplAr = new Employee[e.length + 1];
                for(int i = 0; i < e.length; i++) 
                {
                   temEmplAr[i] = e[i];
                }

                temEmplAr[e.length] = id;

                e = temEmplAr;
        }


        public void getInput()
        {

                Scanner sc = new Scanner(System.in);

                while(true)
                {
                  System.out.println("Enter Command (create, list , get lastn, get firstn, exit)");
                      String nextLine = sc.nextLine();  
                  if(nextLine.startsWith("create"))
                  {
                    System.out.println("please enter lastname and firstname");
                    String nextLine_c = sc.nextLine();  
                    String[] Ar = nextLine_c.split(" ");

                    create(Ar[0], Ar[1]);

                  }

                else if(nextLine.startsWith("list")) 
                        {
                          for(int i = 0; i < e.length; i++)
                                {
                                        System.out.println("id: " + e[i].getId() + " " + e[i].getlastName() + ", " + e[i].getfirstName());
                                }
                        } 

                        else if(nextLine.startsWith("get lastn")) 
                        {
                                String[] Ar2 = nextLine.split(" ");
                                for(int i = 0; i < e.length; i++)
                                {
                                   if(e[i].getlastName().equals(Ar2[2]))
                                        {
                                         System.out.println("id: " + e[i].getId() + " " + e[i].getlastName() + ", " + e[i].getfirstName());
                                        }
                                }
                        } 

                        else if(nextLine.startsWith("get firstn")) 
                        {
                          String[] Ar3 = nextLine.split(" ");
                          for(int i = 0; i < e.length; i++) 
                                {
                                        if(e[i].getfirstName().equals(Ar3[2])) 
                                        {
                                           System.out.println("id: " + e[i].getId() + " " + e[i].getlastName() + ", " + e[i].getfirstName());
                                        }
                                }
                        } 
                        else if(nextLine.startsWith("exit")) 
                        {
                         System.out.println("Thank you for using our Employee Management Application");
                          System.exit(0);
                        }
                }
        }

        class EFrame extends JFrame implements ActionListener {
            JLabel jlID, jlFirstname, jlLastname, jlFilename;
            JTextArea jta;
            JPanel jpBase , jpTop, jpm, jpmm,jpmb ,  jpBottom, jpBBT;
            JTextField jtfID, jtf2 , jtf3, jtf4, jtf5;
            JButton bcreate, blist, bfirst, blast, bclear, bexit, bback, bforward, bshow, bupdate, bsave, bload;
           JOptionPane jo;
           JScrollBar jBar;
           JScrollPane jsp;


            EFrame() {

                setTitle("GUI");
                setSize(1000, 1000);
                setDefaultCloseOperation(EXIT_ON_CLOSE);


                this.setMinimumSize(new Dimension(100, 100));
                this.setMaximumSize(new Dimension(1920, 1080));

                jsp = new JScrollPane(jta);

                jpBase = new JPanel();
                jpTop = new JPanel();
                jpm = new JPanel();
                jpmm = new JPanel();
                jpmb = new JPanel();
                jpBottom = new JPanel();
                jpBBT = new JPanel();


                jlID = new JLabel("ID"); 
                jlFirstname = new JLabel("Firstname"); 
                jlLastname = new JLabel("Lastname");
               jta = new JTextArea("");

               jta.setPreferredSize(new Dimension(700, 360));
               jlFilename = new JLabel("filename");


                jtfID = new JTextField(10);
                jtf2 = new JTextField(10);
                jtf3 = new JTextField(10);
                jtf5 = new JTextField(10);





                add(jpBase);
                jpBase.setLayout(new GridLayout(8,1));
                jpBase.setSize(1000, 1000);
                jpBase.add(jpTop);
                jpBase.add(jpm);
                jpBase.add(jpmm);
                jpBase.add(jpmb);
                jpBase.add(jpBottom);
                jpBase.add(jpBBT);

                jpTop.setLayout(new GridLayout  (1, 0));

                jpTop.add(jlID);  jpTop.add(jtfID); 

                jpm.setLayout(new GridLayout  (1, 0));

                jpm.add(jlFirstname); jpm.add(jtf2);

                jpmm.setLayout(new GridLayout  (1, 0));

                jpmm.add(jlLastname); jpmm.add(jtf3);

                jpmb.setLayout(new GridLayout  (1, 0));

                jpmb.add(jlFilename); jpmb.add(jtf5);


                //add button

                bcreate = new JButton("Create");     bcreate.addActionListener(this);
                blist = new JButton("List");        blist.addActionListener(this);
                bfirst = new JButton("Get first");      bfirst.addActionListener(this);
                blast = new JButton("Get last");    blast.addActionListener(this);
                bclear = new JButton("Clear");      bclear.addActionListener(this);
                bexit = new JButton("Exit");        bexit.addActionListener(this);
                bback = new JButton("<");       bback.addActionListener(this);
                bforward = new JButton(">");        bforward.addActionListener(this);
                bshow = new JButton("show");        bshow.addActionListener(this);
                bupdate = new JButton("update");    bupdate.addActionListener(this);
                bsave = new JButton("save");            bsave.addActionListener(this);
                bload = new JButton("load");            bload.addActionListener(this);

                jpBottom.setLayout(new GridLayout(1, 0));
                jpBottom.add(bcreate);
                jpBottom.add(blist);
                jpBottom.add(bfirst);
                jpBottom.add(blast);
                jpBottom.add(bclear);
                jpBottom.add(bexit);
                jpBottom.add(bback);
                jpBottom.add(bforward);
                jpBottom.add(bshow);
                jpBottom.add(bupdate);
                jpBottom.add(bsave);
                jpBottom.add(bload);


                jpBBT.setLayout(new GridLayout (1, 1));
                jpBBT.add(jta);
                jta.add(jsp);




                this.setVisible(true);

            }

            @Override
            public void actionPerformed(ActionEvent ae)
            {
                    if(ae.getSource() == bcreate) // create
                    {
                        String firstname;
                        String lastname;
                        String id;

                        firstname = jtf2.getText();
                        lastname = jtf3.getText();

                        create(firstname, lastname);


                        id = Integer.toString(e.length); 

                        current = Integer.parseInt(id);

                        jta.setText("Employee #" + id + " " + firstname + " " + lastname + " was created.");

                    }
                    if(ae.getSource() == blist) //list
                    {
                        String firstname;
                        String lastname;
                        String id;

                        jta.setText("");

                        current = e[0].id;

                        for(int i = 0; i < e.length; i++)
                        {

                                jta.append("id: " + e[i].getId() + " " + e[i].getlastName() + ", " + e[i].getfirstName() + "\n");

                        }

                    }
                    if(ae.getSource() == bfirst) //getfir
                    {
                        String firstname;
                        String lastname;
                        Integer id;
                        jta.setText("");

                        current = -1;

                        for(int i = 0; i < e.length; i++) 
                        {


                            Employee firstEmployee = e[i];

                            firstname = firstEmployee.getfirstName();
                            lastname = firstEmployee.getlastName();
                            id = firstEmployee.getId();



                            if(firstname.equals(jtf2.getText()))
                            {
                                if(current == -1)
                                {
                                    current = id;
                                }
                                jta.append("id: " + id + " " + lastname + ", " + firstname + "\n");
                            }
                    }
                    }
                    if(ae.getSource() == blast)// getlast
                    {
                        String firstname;
                        String lastname;
                        Integer id;
                        jta.setText("");


                        for(int i = 0; i < e.length; i++) 
                        {
                            Employee firstEmployee = e[i];
                            firstname = firstEmployee.getfirstName();
                            lastname = firstEmployee.getlastName();
                            id = firstEmployee.getId();


                            if(lastname.equals(jtf3.getText()))
                            {
                                if(current == -1)
                                {
                                    current = id;
                                }

                                jta.append("id: " + id + " " + lastname + ", " + firstname + "\n");
                            }


                        }
                    }
                    if(ae.getSource() == bclear) //clear
                        {
                            jtfID.setText("");
                            jtf2.setText("");
                            jtf3.setText("");
                        }
                    if(ae.getSource() == bexit) //exit
                        {
                            System.exit(0);
                        }

                    if(ae.getSource() == bshow) 
                    {
                        String firstname;
                        String lastname;
                        String id;
                        jta.setText("");

                        for(int i = 0; i < e.length; i++) 
                        {
                            Employee firstEmployee = e[i];
                            firstname = firstEmployee.getfirstName();
                            lastname = firstEmployee.getlastName();
                            id = Integer.toString(firstEmployee.getId());

                            if(id.equals(jtfID.getText()))
                            {
                                if(current == -1)
                                {
                                    current = Integer.parseInt(id);
                                }
                                jta.append("id: " + id + " " + lastname + ", " + firstname + "\n");
                            }
                        }
                    }
                         if(ae.getSource() == bback) // <
                         { 


                            String firstname;
                            String lastname;
                            String id;
                            jta.setText("");

                            Employee firstEmployee = e[current - 1];
                            firstname = firstEmployee.getfirstName();
                            lastname = firstEmployee.getlastName();
                            id = Integer.toString(firstEmployee.getId());

                            jta.append("id: " + id + " " + lastname + ", " + firstname + current);

                            current = current - 1;

                         }

                         if(ae.getSource() == bforward) 
                         { // >
                             String firstname;
                            String lastname;
                            String id;
                            jta.setText("");

                            Employee firstEmployee = e[current + 1];
                            firstname = firstEmployee.getfirstName();
                            lastname = firstEmployee.getlastName();
                            id = Integer.toString(firstEmployee.getId());

                            jta.append("id: " + id + " " + lastname + ", " + firstname + current);

                            current = current + 1;


                         }


                         if(ae.getSource() == bupdate) //update
                         {
                                String firstname;
                                String lastname;
                                Integer id;
                                jta.setText("");
                                for(int i = 0; i < e.length; i++)
                                {
                                    Employee firstEmployee = e[current + 0];
                                    firstEmployee.updatefirstName(jtf2.getText());
                                    firstEmployee.updatelastName(jtf3.getText());

                                }

                         }
                         if(ae.getSource()== bsave) // save
                         {      

                         }
                         if(ae.getSource() == bload) // load
                         {

                         }
        }        
}


class Employee 
{

        private int id;
        private String lastName;
        private String firstName;


        public Employee(int id, String lastName, String firstName) {
                this.id = id;
                this.lastName = lastName;
                this.firstName = firstName;
        }

        public void updatelastName(String lastName) {
                this.lastName = lastName;
        }

             public void updatefirstName(String firstName) {
                this.firstName = firstName;
        }

            public String getlastName() {
                return lastName;
        }

             public String getfirstName() {
                return firstName;
        }
            public int getId() {
                return id;
        }
}
}

How To Check WordPress Site Speed With The New GTmetrix (Featuring Lighthouse)

GTmetrix is now powered by Lighthouse, delivering page performance test results that better reflect the user’s perception of how fast their websites are loading.

Any business that wants to stay in business knows it’s essential to have a fast loading website. Websites that load quickly retain more visitors and perform better in search engines Google.

We have written a number of articles on how to speed up WordPress and fix WordPress page speed problems using free page speed testing tools.

One of these tools is GTmetrix.

GTmetrix test results
The new GTmetrix report.

The new GTmetrix report is designed to help you assess the page’s user experience and looks at both structure and performance, i.e. how well the page actually performs for users in areas like loading, interactivity, and visual stability.

The main difference in the newly redesigned report is that GTmetrix has replaced its PageSpeed/YSlow libraries with Lighthouse, the open-source tool from Google that is considered the industry standard in modern web performance data and metrics.

In this post, we’ll look at:

Using the New GTmetrix Tool

GTmetrix is free to use for generating a basic yet very useful site loading speed report.

Just head over to GTmetrix.com and enter your site or page URL, then click the test button.

GTmetrix Page Speed Test
Enter the URL of the site or page you want to test.

A report will be automatically generated after a few seconds.

GTmetrix report.
GTmetrix report.

Previously, GTmetrix reports focused on how well your page was built for speed (i.e. its structure), but not how fast it loaded from your users’ perspective. This resulted in sites sometimes achieving great PageSpeed/YSlow scores and a slow Fully Loaded Time.

Good PS/YS scores, Bad Fully loaded time.
Does this site deliver a good or bad experience for users? (Source: GTmetrix blog.)

Fully Loaded Time (i.e. how long it takes for a page to completely load) has also become less useful as a metric for site performance as modern websites began to adopt more efficient page-loading strategies (e.g. client-side rendering).

The new GTmetrix Report reflects how fast your page loads for users and how well it’s built for performance, using a new scoring system called the GTmetrix Grade.

GTmetrix grade.
GTmetrix grade.

This is based on a weighted grade comprised of new Performance and Structure Scores (70% Performance Score + 30% Structure Score) and the addition of new tabs, visualizations, graphs, and deeper insights.

GTmetrix tabs.
GTmetrix tabs.

As mentioned earlier, what makes the new GTmetrix tool significantly different from its old Legacy report is that it has replaced PageSpeed/YSlow with (Google-owned) Lighthouse analysis and performance data.

This provides an assessment of webpages focused on the pages’ user experience and tracks the timing of various milestones that users actually experience and care about, then scores each of these metrics in three key areas:

  • Loading Performance (55% of the total score). This comprises of the following metrics:
    • First Contentful Paint (15%) – measures how much time has elapsed before the browser begins to display the first elements of your site.
    • Speed Index (15%) – shows you how quickly the contents of your page are being visibly populated.
    • Largest Contentful Paint (25%) – measures how long the largest content element on your page (e.g. a featured image or heading text) takes to load on the users’ viewport.
  • Interactivity (40% of the total score).
    • Time to Interactive (15%) – measures how long it takes before the user can reliably interact with the content on the page (e.g. click links, enter text into input fields, etc.)
    • Total Blocking Time (25%) – measures the total amount of time that a page is blocked by scripts from responding to user input (e.g. mouse clicks, screen taps, or keyboard presses) during your page loading process.
  • Visual Stability (5% of the total score).
    • Cumulative Layout Shift (5%) – Measures how much of your site’s content layout shifts as it loads (e.g. late-loading ads that negatively affect the user’s experience by pushing content down after it has already loaded).
GTmetrix Lighthouse performance data.
GTmetrix now incorporates Lighthouse performance data.

Using Core Web Vitals to Improve Your Search Engine Results

GTmetrix also displays another set of metrics in its reports called Web Vitals.

GTmetrix Web Vitals.
GTmetrix Web Vitals.

Most site visitors aren’t as concerned about how long it takes for your entire site to load as they are about how soon they can start engaging with the content on the page you’re presenting them.

As described on the feature’s information tooltip,

Web Vitals represent a small set of core metrics that indicate whether you’re delivering a fast and (what Google calls) a delightful experience to your visitors. Focus on these impactful metrics first before undertaking deeper optimizations.

Core Web Vitals comprise of three different metrics (see the previous section for brief descriptions):

  • Largest Contentful Paint (LCP) – GTmetrix recommends aiming for an LCP of 1.2 seconds or less for a good user experience,
  • Total Blocking Time (TBT) – GTmetrix recommends aiming for a TBT of 150 milliseconds or less.
  • Cumulative Layout Shift (CLS) – GTmetrix recommends aiming for a CLS score of 0.1 or less.

Core Web Vitals, then, are an important indicator of how your site visitors perceive the performance of your website. These key metrics connect your site’s performance to user experience and Google thinks they’re important enough to include as an SEO ranking factor starting from May 2021.

According to Google, Core Web Vitals will affect mobile and desktop results and play a significant role in determining whether or not your content appears in Top Stories.

GTmetrix, Hummingbird, and Smush

If you use our Hummingbird and Smush plugins to optimize WordPress speed and images, you should find the new GTmetrix reports’ Lighthouse data and metrics to be more actionable after running our plugin scans.

This is because our plugins and GTmetrix now both follow Google’s PageSpeed Insights recommendations, which are derived from Lighthouse data.

Hummingbird’s scans and Smush’s settings mirror Google’s PageSpeed testing and automate many of its fixes and recommendations, while GTmetrix uses the latest API from Google Pagespeed Insights to create and compile its report.

Hummingbird Improvement Recommendations.
GTmetrix reports are now closer to Hummingbird’s improvement recommendations, which follow Google PageSpeed Insights based on Lighthouse data.

For more information on improving Google PageSpeed Insights recommendations, see our Performance Optimization Guide and these tutorials:

Will You Score The Perfect 100?

I don’t want to spoil the ending here for you, but you’ll probably never get that perfect 100!

We’ve tried and discovered that there are many challenges when it comes to getting a perfect score on page speed test results.

Here are some articles we’ve written about the challenges of optimizing WordPress sites for speed based on the recommendations of tools like GTmetrix, Google PageSpeed Insights, and others:

Also, definitely check out our video series on improving WordPress performance:

Scan your sites today and happy WordPress optimizing!

Link Building Tutorial for DA/Referral Traffic

Hey all!

I've been a long-time lurker on this forum so I wanted to share some super powerful SEO link building tactics that I've used that I think might benefit a lot of you. I'm primarily a marketer, so dev is a weak point for me, and this forum has been very helpful for me. Conversely, I see a lot of awesome devs who sometimes need help on the SEO front.

Has anyone here tried using Q&A Links to generate referral traffic and boost your link profile? Its a strategy Ive been using for a while to build highly relevant backlinks and drive targeted traffic to my websites, and Ive seen some great results.

I havent been able to find any posts with instructions on how to actually go about building these links quickly, so I figured Id give something back and make one myself! Heres an in-depth explanation of exactly how I create Q&A Links:

Step 1: I Set Up The Accounts

The first thing I do is set up an account for each of the websites Im trying to rank on 10 different major Q&A sites (like Quora, Fluther, etc.). I then personalize the page as much as possible by creating a custom description, adding my social media accounts, and uploading my logo.

Step 2: I Choose Some Targeted, Relevant Questions

The next thing I do is choose 10 different questions related to my business niche. For example, if you were building links for an insurance website, you might choose questions like what is the best type of life insurance - you get the picture! Ive found it helps to get inside the head of my target market and try to think about what questions they might ask.

Step 3: I Write a Detailed, Relevant Answer

Finally, I do a little research on each question so that I can write an accurate answer. The answer should be of as much value to the reader as possible. The aim is to get upvotes so your answer commands more authority. I also include any target keywords that I want to rank for in each answer (as naturally as possible) and a natural, contextual backlink. I tend to vary between branded, naked, and generic anchor text for each answer. Once Ive written the 10 questions and answers, I post them to 10 different Q&A sites from the accounts I built in step 1.

The Results

The best thing about this strategy for me is that it lets me leverage the ranking power of authoritative Q&A sites. Q&A sites tend to rank on the first page of the SERPs for tons of search queries. By having a link in some of those pages, I can generate lots of referral traffic. I also get the added bonus of having 10 powerful, highly-relevant backlinks from high DA websites.

The biggest problem with this strategy for me is the amount of time I need to invest in researching and answering different questions. Those that don't have the time or the content writing ability are usually the types of clients that my company works with, but if you've never done any link building, this is an easy DIY strategy you can start with to bolster some quick wins.

Has anyone used any other link building strategies that theyd recommend? Let me know! Let's get a discussion started.

Cheers!

Hi everyone! Excited to be here.

Hey everyone! Long-time lurker here, this forum has been super valuable for me as a marketer that's much less well-versed in dev. I made an account to engage more and help share some things that might help out other users the way youve helped me. Cheers!

Cosmetic item. Not a big deal. Browser tab randomness?

Here's the screenshot:
image_2020-11-28_073835.png

Notice the browser tab showing a tag. Here's one that does not work like that:
https://www.daniweb.com/programming/software-development/threads/378481/need-algorithm-to-c-code-conversion-assistance

The link is https://www.daniweb.com/hardware-and-software/microsoft-windows/threads/533760/please-i-want-to-change-c-to-c

I don't see a tag being called out in all tabs so there's something of a randomness there.

Not a big deal and you have much bigger areas to work.