Deliverability
Deliverability
Contents
- Introduction to email deliverability
1.1 What is email deliverability? 1.2 Why do emails bounce? 1.3 What happens when emails get delivered? 1.4 Spam, the worst? 1.5 Summing up 1.6 So, why is this important when it comes to sales?
- What influences deliverability?
2.1 Technical configuration 2.2 Reputation 2.3 Content 2.4 Volume 2.5 Data quality 2.6 Email stack
- How can I improve my email deliverability?
3.1 Set up the correct technical configuration 3.2 Improve Your Reputation 3.3 Content 3.4 Be mindful of your email volume 3.5 Make sure you have the highest quality of email data 3.6 Recipient’s email stack
-
TL;DR
-
Introduction to email deliverability
1.1 What is email deliverability?
Email deliverability is the ability of outbound emails to make it into their recipient’s inboxes. The result of excellent and poor deliverability only has two possible outcomes: emails can either bounce or be successfully delivered. This is why deliverability has become an essential factor driving email success (or failure) for any organization doing outbound sales in 2021.
1.2 Why do emails bounce?
A bounce happens when an email fails to be delivered to the recipient’s mailbox. This can happen for several reasons. One of the most common reasons is when the email address doesn’t exist. For example, when there is a typo in an email or when someone has left the company, these situations are called hard bounces. There are other possible reasons why your emails may bounce, including if the recipient’s inbox is full, the email is too large, etc - these are called soft bounces.
1.3 What happens when emails get delivered?
Getting an email delivered means that the email made it into one of the recipient’s, inbox folders. It does not mean that you are in the primary inbox. Email providers use algorithms to determine whether a specific email should be placed in the primary, inbox, social folder, promotions folder or in the spam folder.
1.4 Spam, the worst?
When sending out cold emails, some of them might land in the span. folder. This can happen for multiple reasons.
• Someone marks your email as spam
• You have a missing or incorrect email domain setup
• Your domain has a poor reputation
We will dive into these in the following sections. Spam is something that you want to avoid as much as possible and we will provide a few practical insights on how to do it.
1.5 Summing up…
Deliverability, as we define it here, is the ability to send an email that makes it to the primary inbox of your recipient. In this guide we’ll explain which factors increase the chances of your emails landing in Me Primary inbox.
[Image: Only a percentage of the emails you send go to the primary inbox and are opened by your recipients.]
1.6 So, why is this important when it comes to sales?
Deliverability is one of most important metrics for sales, marketing, and growth teams at B2B companies. These teams are revenue drivers and email is one of their main channels to engage with prospects and generate revenue.
We could summarize deliverability and its impact like this:
Better Deliverability -> More Sales Conversations -> Increased Sales Pipeline -> More New Customers -> Revenue!!!
For B2B companies improving their “top of the funnel; engaging with more prospects translates directly into more revenue at the “bottom of the funnel”.
A good deliverability rate at the “top of the funnel” affects your projections for revenue, i.e. if you increase your deliverability by 50%, You would be able to increase your revenue projections by 50%.
So, really, for sales teams:
Deliverability = Revenue!!!
In the next sections, we’ll discuss what influences deliverability and which easy steps you can take to improve deliverability.
- What influences deliverability?
2.1 Technical Configuration
Incorrect or missing configurations of your email domain will hurt your deliverability. The first thing you need to ensure is that you have your email domain properly set up.
SPF, DKIM, and DMARC are common configurations used to double-check the sender’s identity. Without them, external attackers can easily send malicious emails on your behalf. If this happens, your emails will most likely end up in the spam folder.
Lets take a closer look at each one of these 3 configurations:
Sender Policy Framework, SPF. SPF allows you to choose which servers can send emails from your domain. For example, if you only allow Gmail servers, only users that are signed into your account through the Gmail platform will be able to send emails.
Domain Keys Identified Message, DKIM. DKIM attributes a digital signature to your emails so that the recipient's email can automatically check if there was any content changed by a third-party (i.e attachments, links, etc).
Domain-based Message Authentication, Reporting & Conformance, DMARC. DMARC is build on top of SPF and DKIM and allows you to determine how you want to deal with any actions that trigger security alerts. In a nutshell, this will be your security-breach reporting process.
2.2 Reputation
Every sender’s IP, domain, and individual email address has a reputation score. You can think of this reputation as karma points : “good” behavior will give you positive points, and “bad” behavior will give you negative points.
What an individual user does will impact their own reputation but it will also impact the company’s domain and IP address reputation.
Let’s dive deeper into the different aspects of reputation:
a) Sender reputation
The sender’s reputation is the reputation attributed to the specific mailbox from which the email is being sent - this corresponds to your individual reputation.
The main factors influencing your sender reputation are:
• The history of your email address. If you have an email address that has a lot of history, i.e. it was created years ago and has been used to send and receive a lot of emails then you you have a strong reputation. On Me other hand, a brand new email address has a weak reputation.
• Your daily activity. If you send email. that are marked as spam, you will end up hurting your reputation. If most of your emails are responded to and you have a lot of email threads, you will positively impact your reputation.
• Your send volume. If you send a burst of hundreds of emails in a short period of time and they all look 99% alike you will hurt your reputation.
b) Domain reputation
Domain reputation aggregates the reputation of individual mailboxes. Think of it as the sum of all senders reputation scores that belong to the same domain.
@domain.com reputation =<EMAIL_ADDRESS>+<EMAIL_ADDRESS>+ — +<EMAIL_ADDRESS>If one user is flagged, they will hurt their own reputation and the entire domain. New domains, given their limited history, have a fragile reputation so you need to pay special attention to your activity during the first weeks or even months.
c) IP address reputation
Similarly to domain reputation, all of the users activity within an IP will impact that IP address reputation.
The main difference is that several companies could be sharing the same IP address. For instance, you could be sending emails responsibly and still have a poor IP reputation because of the other companies using the same platform to send their emails (i.e Hubspot, Sendgrid, Mailchimp, etc).
Why do companies share the same IP? Having a single dedicated IP is expensive and it usually comes as an extra feature. Thus, most people end up sharing the IP address to reduce costs.
d) Temporary Reputation
When too many emails are marked as spam in a short period of time, the sender could end up in “spam jail”. This will affect reputation for 48 to 72 hours of time.
All of the factors mentioned here work in tandem and are all interconnected. Thanks to this breakdown you can now get a better understanding of where you reputation-related deliverability problems might be coming from.
2.3 Content
Good reputation helps. But, if the content of your email isn’t relevant, your emails can go to the wrong folder and be marked as spam. If you constantly use words like “Free”, “Promotion”, “Buy now”, etc… your emails will not land in the primary inbox.
The examples above are just the tip of the iceberg when it comes to content-related factors. Let’s explore what other content issues could be impacting your email deliverability.
a) Sending the same content too many times
Most of the emails that you consistently use the same template over time, allowing it to be flagged as spam enough times that you essentially “wear it out” and “ding” your reputation.
b) Enabling open and click tracking
The typical “open” tracking software adds a pixel image to every email, so it can track how many times it has been seen. Standard tracking pixels are shared across thousand of companies and have already been identified by most email clients like Gmail and Outlook. If you are not using a custom tracking pixel, you might be suffering from poor deliverability.
Click tracking software uses a “redirect method” to track when a recipient clicks on a link in the emails you send. Click tracking has an especially negative impact when it comes to deliverability due to the amount of “unrelated” links that are added to your email body.
c) Adding too many links images
Emails with too many images and links are typical characteristics of marketing emails, so these emails can easily be diverted from the primary inbox.
d) Having complex signatures
Adding complex signatures with HTML code, too many links or images might hinder your deliverability and hurt your chances to make it to the primary inbox.
2.4 Volume
On top of reputation and content, another important factor to take into account is the volume of emails that you’re sending:
a) Unusual spikes in the activity of emails
Sending too many emails within a short period of time and having very little activity in the remaining periods might trigger suspicious activity warnings. Furthermore, sending bursts of emails increases the likelihood of multiple recipients marking you emails as spam in a similar time-frame.
b) Number of emails sent vs emails received ratio
When this ratio is too high, it means that you send a lot of emails that go unanswered. This is a problem especially for sales emails. Why?
Think of an email sequence sent to 1000 prospects that has a first touch and 3 follow-up emails. If you achieve a 20% reply ratio, you’ll have 800 first touches plus 800*3 follow ups that never had an answer. You’ll end up, therefore, with an imbalance ratio of 3400-4000 emails sent vs 200 emails received!
c) Amount of email engagement
The more people who engage with your emails the better. If more people are opening and replying to your emails, the more likely it is that your emails will make it to the primary inbox.
This engagement can be measured in terms of open rates, reply rates, archived email rates, percentage of clicked links, etc…
2.5 Data quality
Data quality is an often overlooked part of email deliverability. When it comes to sales emails, you want to make sure that you are sending the right emails to the right people. Invest time in prospecting and validating your contact information.
a) Bounces
If you’re using poor email data, it’s likely that a high percentage of your emails will bounce. Having a high bounce rate will trigger suspicious activity warnings and hurt your deliverability.
What bounce rate is considered safe? When it comes to cold outbound sales, having a bounce rate around 10% is considered safe and will not hinder deliverability.
b) The wrong people are receiving your emails
A good lead generation process will help deliverability. If you contact the right people with the right message at the right time, you are maximizing the engagement rate of your emails and reducing the spam rate. This will help improve any future deliverability rates.
2.6 Email stack
Lastly, email deliverability will also be influenced by your recipient’s email stack (i.e Gmail, Outlook, Mailgun, etc) and any other tools that they might have in place to deal with unauthorized emails (additional verification’s and spam filters).
For example, companies with strict spam rules block all emails from domains they don’t usually interact with, or ask the sender additional email confirmation notices.
These standards differ substantially between industries: Medical and Health-care industry, Government and Defense, or Finance and Fintech are usually spam strict industries.
- How can I improve my email deliverability?
Now that we have a better understanding of the factors influencing deliverability, we can start thinking about how to improve and maintain a high deliverability rating. As previously stated, protecting and improving deliverability is key to having good sales results.
In this section, we will dive deeper into practical tips you can implement to improve your deliverability.
3.1 Set up the right technical configuration
First things first, make sure your email domain and mailboxes are properly set up.
a) SPF, DKIM, and DMARC
An incorrect configuration of your SPF, DKIM, and DMARC will increase the likelihood of your emails ending up in the spam folder. Make sure you correctly set up all these 3 configurations.
For Google users:
- Set up SPF
- Set up DKIM
- Set up DMARC
For Exchange users:
- Set up SPF
- Set up DKIM
- Set up DMARC
If you are not the Administrator of your email domain, send these articles to the members of your team who will be able to set these up.
b) Custom domain tracking
By default, email sequencing tools use a shared domain to track all email opens. While this provides immediate stats, it can impact the deliverability of your emails.
Set up a custom domain tracking and your deliverability reputation is entirely under your own control.
c) Mailbox setup
It can be easy for your recipients to forget that there’s a real person behind these emails.
Remember to add your name, a photo to your Google or Exchange accounts so your prospects can see the preview before they open your emails.
[Image: Contact on the left side has all the information missing, whereas the contact on the right side is complete.]
3.2. Improve Your Reputation
One of the most important things when it comes to deliverability is reputation. You want to ensure that you maximize your sender and your domain reputations.
a) Sender reputation
Here are a few tips on how you can maximize your sender reputation:
• Increase your engagement rate. Add different types of activity to your mailbox in order to maximize the engagement rate and increase the number of non-sales activities. For example, you should exchange emails with colleagues, customers, friends, and subscribe to forums and newsletters .
• Don’t overload your mailbox. Track all of the emails you’re sending; this includes both new prospects and all of your existing sequence follow-ups. Ideally, this number is below 350 emails per mailbox per day .
• Create new mailboxes and spread volume. I n order to keep a healthy reputation, it’s worth controlling several mailboxes for the same user under the same domain, e.g .: john @ company.com and john.doe @ company.com. This allows you to avoid overloading a mailbox by spreading the volume across different mailboxes.
• Subscribe to a w arm - up net w or k . W arming up a mailbox is the equivalent of consolidating its reputation by adding high-quality volume and engagement. I f you are an MailSwami user you can do this automatically, learn more about the warm-up network here .
• Monitor your daily activity. If you use your mailbox mainly for sales emails, you should monitor the quality of your conversations. If you have a lot of prospects asking you to Stop or Unsubscribe, you should review your lead generation process and your email templates as quickly as possible.
[Image: Barometer for open rate benchmarks 24h after the first email is sent.]
• Send emails to personal mailboxes and have them mark your emails as not spam. When doing sales email outreach, it’s normal to have a number of emails marked as spam. Something you can do to curb this is to periodically send emails to personal email addresses (@gmail.com, @yahoo.com, @outlook.com...) and have the recipient mark you as not spam if they find your email in the spam folder.
b) Domain reputation
The reputation of a domain is the sum of the reputations of all its individual mailboxes. A few tips to improve your domain reputation:
• Make sure all your mailboxes follow the deliverability rules. In order to guarantee a strong email domain reputation, make sure all of the individual mailboxes in your account follow the rules mentioned in the previous section. Deliverability should, therefore, be an essential part of all your onboarding programs for new members in the sales team.
• Create multiple domains. When doing cold outreach via email, it’s best to have multiple domains. The goal is to not overload and hurt the reputation of a single domain. You should purchase and set up different email domains, e.g.: company.com, companyapp.com, getcompany.com, trycompany.com, etc… Buying additional domains is like buying insurance for your sales team (note: a new domain costs about $15/year).
• Spread email volume across different domains. With the multiple alias email domains you created, spread out the sending volume evenly.
• Warm-up your domains. It used to be possible to create a new domain and immediately start sending hundreds of sales emails. This type of behavior is no longer tolerated and domains with poor history will be marked as spam… fast! For every new domain you create, make sure to warm it up for at least 4 weeks before you start sending any outbound emails.
Read more about this here: MailSwami Warm -Up Network .
c) IP address reputation
IPs are usually shared across multiple domains.
• Test your deliverability rates using different email platforms. Pay attention to which platforms you use to send emails (not only for sales but marketing, too). IPs are usually shared across multiple domains. If you are setting up a new IP you should make sure you create a dedicated IP for your company’s exclusive usage. This way, you can have complete control over its reputation.
• Test your deliverability rates using different email platforms. Pay attention to which platforms you use to send emails (not only for sales but marketing, too). IPs are usually shared across multiple domains. If you are setting up a new IP you should make sure you create a dedicated IP for your company’s exclusive usage. This way, you can have complete control over its reputation.
d) Temporary Reputation
Your deliverability can be temporarily hit if some of your emails are reported as spam.
• Monitor open rates. Your deliverability can be temporarily hit if some of your emails are reported as spam. If you see open rates below 20% for a few of your first email sends, you’re likely having a spam issue.
• Pause or delay any new outreach. The best way to solve a temporary deliverability issue is to hit ‘pause’ on any of your planned activity. Delay all new emails by 48-72 hours and you should see an increase in open rates. If the problem persists then you might be experiencing a more serious deliverability problem.
3.3 Content
In order to maximize your engagement and reply rates: Make sure you’re sending a message to the right person at the right time.
Here are a few practical things you can do to improve your engagement rates:
• Add variability to your sales outreach. Most sales teams create 2 or 3 different templates and end up using the same email copy every day. It’s easy for spam filters to pick up on this type of behavior. Therefore, you should have a number of different approaches being sent out from your mailbox, every single month. The best way to do this is to run monthly sales initiatives, where you A/B test different email templates with different audiences.
• Don’t “wear out” email copy. If you’re using the same template for months on end, spam filters will have seen it being reported enough times that you end up going to spam automatically. You should review your templates periodically to avoid this issue.
• Avoid using links and images. Reduce the number of links and images in your sales emails. The more images and links you add to an email the more likely it is to be marked as spam or to land in the promotions folder.
• Avoid using click tracking features. Click tracking softare wraps your links in a different set of “unrelated domains” which has a substantial impact on your deliverability. If you’re using click tracking and experience low open rates, try quick test ( even if you’re using well - known tools like Mailchimp ) . You might be surprised by disabling it and running a the results.
• Simplify email signatures. Don’t use complex HTML signatures. In the case of signatures, less is more.  Use a signature that is plain text only, with your name, and (at most) 2 to 3 different links (e.g.: company website, LinkedIn, calendar, etc...).
[Image: HTML complexity for two different email signatures. On the left, it shows a complex signature with multiple links and images, while on the right is a simple signature with only one link.]
• The obvious. Avoid using spam triggering words like “Free”, “Promotion”, “Exclusive”, etc. You can learn more about this here.
3.4. Be mindful of your email volume
Every email and domain has a limit on volume capacity. For example, at MailSwami, we consider the maximum number of emails you should send in a day to be 350. Beyond this daily number, your account may end up blocked by email providers like Gmail and Outlook.
When sending sales emails, be extra careful with the amount of volume you send from a specific mailbox and domain. Here are a few basic volume rules to follow:
a) Create new domains and mailboxes
As we’ve mentioned, having multiple mailboxes and email domains helps with reputation management but it also allows you to do more sales volume.
If you plan on ramping up email volume, then it’s best to create new domains and mailboxes in order to disperse the volume. Pay special attention to any new domains which may have a poor reputation, and remember to warm them up for at least 4 weeks before you send any sales email to unverified emails.
Note that larger companies may take advantage of their strong domain. Having a high ratio between non-sales mailboxes vs. sales mailboxes will help maintain a positive reputation within your main domain.
b) Send small and recurring batches of new emails
Remember that deliverability algorithms look for suspicious behavior in your email activity. Instead of having huge spikes in the activity of your email, it’s important that you keep it more consistent (for example, the 30/40 emails a day).
For MailSwami customers: You can enable the Schedule feature to avoid sending new emails on days with too much activity already scheduled. Check this article on how to set it up .
[Image: Left side of the image shows the right volume flow with multiple mailboxes and domains, while on the right side is shown what you shouldn’t do, irregular email activity all through the same mailbox.]
c) Balance your sent vs received emails ratio
To prevent big disparities in your sent/received emails ratio, you should focus not only on maximizing your replies, but also to signing up for newsletters that will help balance your sent/received ratios.
Remember the example in the previous section about the huge disparity between sent vs received emails? This will help with that!
At MailSwami, we recommend that for each email received, no more than 4 emails should be sent.
Sent / Received ratio = 4000 / 1000
[Image: The maximum ratio of emails sent / received is 4. This means that for any linear combination between emails sent and received you should always attempt to have a maximum of 4x more sent emails than received emails (while respecting all the other deliverability rules).]
3.5 Make sure you have the highest quality of email data
This is probably one of the most difficult pieces of the email deliverability puzzle to solve.
Data is easy to find. But good data isn’t. It’s not a surprise that this is the #1 factor of complaints in lead generation vendors, even though that’s their unique job.
In order to make sure you’re maximizing the full potential of your sales emails, there are a few things you can do:
• Take time to refine your lead generation process. Find your relevant target audience.
• Find buying intent signals (e.g.: someone who engages with LinkedIn content or attends a webinar that is relevant to your ICP is showing you that he/she is interested in your product or service - read this article to find high-intent strategies)
• Bounce rates: Use high-quality lead generation tools. This is really important as you don’t want to pay for software that gives you bad quality data and makes your emails end up in spam.
• A void contacting shared inbox as such as info@, sales@, hello @ ... Sales emails sent to shared inboxes are more likely to be marked as spam.
Above all, make sure you’re sending your emails to the right audience. These prospects are not only more likely to convert to paying customers but will also help you achieve higher engagement levels.
If you don’t put the time into defining your ideal customer and personalizing your emails, you’ll find that people will be less likely to engage with your emails, and more likely to mark you as spam.
3.6 Recipient’s email stack
Although this is the factor that you have the least control of, you should be mindful about it when designing your outbound initiatives.
Different industries and companies have different ways of dealing with unsolicited emails. In a nutshell, the recipient’s email stack will determine if the domain you are sending emails to has additional spam filters to block your emails.
• Keep spam controls in mind and continuously test for different industries, locations, etc. If you start to notice any patterns in the deliverability of your emails, A/B test and refine your target audience, or adapt the way to do your campaigns.
Example. For some leads in the medical & healthcare industry (a spam-strict industry), you may be able to make your “cold” emails “warmer” by previously connecting with your prospects in other online platforms/communities, such as LinkedIn. Or perhaps, you should first nurture your leads with content before you pitch any type of promotional content.
- TL;DR
To create a successful growth engine, sales teams need to pay special attention to email deliverability.
In a nutshell, the the main topics that will help you achieve a healthy deliverability score are:
- Setting up the right technical configuration for all your domains
- Building a strong reputation derived from solid email activity
- Creating well thought content and enough variability between email approaches
- Planning volume mindfully with no big spikes in activity
- Using the best quality data for emails
- Being mindful of your audience’s restrictions to cold outbound requests
At MailSwami, we take the deliverability of our customers seriously and give them the best tools for the ever-changing internet world.
Alongside many dedicated features within MailSwami that help you monitor your deliverability, we offer 2 special packages you might want to look at:
Warm Up / Done For You Email Finder
We created a deliverability checklist to help you take action and improve your deliverability today. You can find it on the next page.
Deliverability Checklist
-
Your email configuration: [ ] Set up your SPF, DKIM, and DMARC configurations [ ] Create a custom tracking domain to track open rates [ ] Complete your mailbox profile information (add your name, photo, signature…)
-
Sender best practices - email content & volume: [ ] Enable MailSwami warm-up network to increase your sender reputation [ ] Subscribe to daily newsletters to increase the number of emails that you receive every day (you can set a filter on Gmail) [ ] Use your mailboxes for purposes other than sales and marketing like for example exchanging emails with colleagues, friends, customers… [ ] Simplify email signatures: use plain text only, include your name and at most 2 to 3 different links (ex: company website, LinkedIn, calendar, etc) [ ] Avoid using SPAM triggering words like “Free”, “Promotion”, “Exclusive”, etc… [ ] Avoid links and images in your sales emails (include 1-2 maximum if you must) [ ] Disable click tracking features [ ] Send campaigns with at most 50 new leads per mailbox per day [ ] Keep your send volume to 350 emails per mailbox per day. Run multiple monthly sales initiatives, where you A/B test different email templates with different audiences to avoid sending thousands of emails that look 95% alike [ ] Review your templates periodically to avoid “template exhaustion”
-
Sender best practices - lead generation: [ ] Take time to refine your lead generation process in order to make sure you are reaching out to the right people in order to maximise positive replies [ ] Make sure you’re reaching out at the right time, when prospects are more likely to buy is also a big variable in getting responses and building a positive deliverability feedback loop. [ ] Avoid contacting shared inboxes such as info@, sales@, hello@… [ ] Periodically review your lead generation by leveraging the quality of your replies and conversations - try to avoid audiences that get you a lot of “hard no’s” as replies
-
If you want to ramp up volume: [ ] Create new mailboxes. For example if your name is John Doe create<EMAIL_ADDRESS>and<EMAIL_ADDRESS>[ ] Create new domains. If you are using company.com, you could create getcompany.com, companyapp.com, trycompany.com, etc… [ ] For every new mailbox (and new domain) make sure to warm it up for at least 4 weeks before you send any sales content [ ] Balance your sent vs. received emails ratio on all of your mailboxes and domains


Mage is one of the most fun classes to play in Hearthstone and can be one of the most rage-inducing to play against. Prior to the release of Rastakhan’s Rumble, though, Mage players were in a bit of a rut for most of 2018.
Unless you enjoyed Big Spell Mage, there weren’t many meta options for Mage players. There were plenty of other Mage archetypes floating around, such as Elemental Mage, Tempo Mage and even Murloc Mage. But none of these seemed to be able to make their way to the top of the tier list.
With the launch of the new expansion, Mage is coming back in a big way. The first night of Rastakhan’s Rumble on Twitch saw Hearthstone legends, such as Octavian “Kripparrian” Morosan and Jeremy “Disguised Toast” Wang, play consecutive games against Odd Mage as they attempted to climb the ranked ladder. Disguised Toast may be somewhat responsible for this due to uploading a video of himself playing a version of the deck to his YouTube channel just before launch.
Let’s take a look at the playstyle and packages that make Odd Mage so powerful early on in the expansion.
Since this is an Odd Deck, you’re going to be running Baku The Mooneater. This means your hero power will deal two damage all game (until you drop Frost Lich Jaina, at least). The hero power damage is important due to this deck’s bread and butter: Jan’alai, the Dragonhawk.
This card is a brand-new Mage legendary from the Rastakhan set with a Battlecry that allows you to summon Ragnaros the Firelord, provided you’ve dealt eight damage with your hero power so far in the match. Ragnaros can’t attack, but it’s an 8/8 that deals eight damage to a random enemy at the end of your turn. Depending on the matchup and the tempo of the game, Ragnaros can be used to finish off your opponent or to clear pesky high-health minions.
If you’re unable to finish your opponent off with Ragnaros and Jan’alai, odds are they’ll buy you enough time to drop Frost Lich Jaina and start the classic freeze heal cycle, leading your opponent into a drawn-out watery grave. Many Odd Mage lists run Alexstrasza as a way to expedite the process. Alexstrasza lets you set a hero’s health to 15, and you’ll usually be doing it to your opponent unless you’re near death.
An awesome package that was introduced in this expansion to further buff Odd Mage comes from Daring Fire-Eater and Pyromaniac. Daring Fire-Eater is a one-cost 1/1 with a Battlecry that causes your hero power to deal two extra damage the turn in which it’s played.  This comes in handy big time as a tool to speed through your deck in order to draw Jan’alai or Jaina.
Another sweet package that makes this deck so powerful is Blast Wave, Dragon’s Fury, and Arcane Tyrant. Blast Wave and Dragon’s Fury are both five-cost board clears that you can use to stall or set the board up for Ragnaros. Arcane Tyrant is a five-cost 4/4 that you can play for free if you have played a five-cost spell in the same turn.
Mulligan Guide
The Mulligan with this deck will depend on a bit of guesswork based on what class your opponent is playing. If you suspect you’re playing against a deck that isn’t incredibly fast, you’ll want to hang on to Jan’alai or Jaina (not both at once) so you can get them on the board as fast as possible. Always keep Jaina if you can afford to.
If you suspect you’re playing against a fast deck, try hanging onto Fire Fly, Black Cat, Stonehill Defender, and Tar Creeper so that you’ll have board presence early on. The Taunts mentioned here will also keep you from getting your face smashed in during the early game.
If you can afford to based on the mana cost of the other cards in your hand, it’s a good idea to hang on to Blast Wave or Dragon’s Fury so you can counter the early rushdown from most aggro decks.
Artigo produzido por: Datesports.


You will have 30 minutes to write an essay on ONE of the topics below. Remember to leave a few minutes to read over your essay and correct any mistakes you see.Pay attention to the construction of your sentences, correct use of grammar and correct use of punctuation.
Write a composition about any ONE of the following topics or themes.
- The incident that spoilt my entire vacation.
- Ways in which television has helped me.
- Why each home should have a vegetable garden.
- My favourite sports personality.
- Complete the story which begins:
I heard the noise and rushed to the window.
- The group of pictures below suggests a story. Write the story that is suggested to you.
Question Number:
1
2
3
4
5
6
|


Development Standards¶
Front End Development¶
Background¶
Note
Consider this the canonical resource for contributing Javascript and CSS. We are currently in the process of modernizing our front end development procedures. You will see a lot of different styles around the code base for front end JavaScript and CSS.
Our modern front end development stack includes the following tools:
- Gulp
- Bower
- Browserify
- Debowerify
- And soon, LESS
We use the following libraries:
Previously, JavaScript development has been done in monolithic files or inside templates. jQuery was added as a global object via an include in the base template to an external source. There are no standards currently to JavaScript libraries, this aims to solve that.
The requirements for modernizing our front end code are:
- Code should be modular and testable. One-off chunks of JavaScript in templates or in large monolithic files are not easily testable. We currently have no JavaScript tests.
- Reduce code duplication.
- Easy JavaScript dependency management.
Modularizing code with Browserify is a good first step. In this development workflow, major dependencies commonly used across JavaScript includes are installed with Bower for testing, and vendorized as standalone libraries via Gulp and Browserify. This way, we can easily test our JavaScript libraries against jQuery/etc, and have the flexibility of modularizing our code. See JavaScript Bundles for more information on what and how we are bundling.
To ease deployment and contributions, bundled JavaScript is checked into the repository for now. This ensures new contributors don’t need an additional front end stack just for making changes to our Python code base. In the future, this may change, so that assets are compiled before deployment, however as our front end assets are in a state of flux, it’s easier to keep absolute sources checked in.
Getting Started¶
You will need a working version of Node and NPM to get started. We won’t cover that here, as it varies from platform to platform.
To install these tools and dependencies:
npm install
This will install locally to the project, not globally. You can install globally
if you wish, otherwise make sure node_modules/.bin
is in your PATH.
Next, install front end dependencies:
bower install
The sources for our bundles are found in the per-application path
static-src
, which has the same directory structure as static
. Files in
static-src
are compiled to static
for static file collection in Django.
Don’t edit files in static
directly, unless you are sure there isn’t a
source file that will compile over your changes.
To test changes while developing, which will watch source files for changes and compile as necessary, you can run Gulp with our development target:
gulp dev
Once you are satisfied with your changes, finalize the bundles (this will minify library sources):
gulp build
If you updated any of our vendor libraries, compile those:
gulp vendor
Make sure to check in both files under static
and static-src
.
Making Changes¶
If you are creating a new library, or a new library entry point, make sure to
define the application source file in gulpfile.js
, this is not handled
automatically right now.
If you are bringing in a new vendor library, make sure to define the bundles you
are going to create in gulpfile.js
as well.
Tests should be included per-application, in a path called tests
, under the
static-src/js
path you are working in. Currently, we still need a test
runner that accumulates these files.
Deployment¶
If merging several branches with JavaScript changes, it’s important to do a final post-merge bundle. Follow the steps above to rebundle the libraries, and check in any changed libraries.
JavaScript Bundles¶
There are several components to our bundling scheme:
- Vendor library
We repackage these using Browserify, Bower, and Debowerify to make these libraries available by a
require
statement. Vendor libraries are packaged separately from our JavaScript libraries, because we use the vendor libraries in multiple locations. Libraries bundled this way with Browserify are available to our libraries viarequire
and will back down to finding the object on the globalwindow
scope.Vendor libraries should only include libraries we are commonly reusing. This currently includes jQuery and Knockout. These modules will be excluded from libraries by special includes in our
gulpfile.js
.- Minor third party libraries
- These libraries are maybe used in one or two locations. They are installed via Bower and included in the output library file. Because we aren’t reusing them commonly, they don’t require a separate bundle or separate include. Examples here would include jQuery plugins used on one off forms, such as jQuery Payments.
- Our libraries
These libraries are bundled up excluding vendor libraries ignored by rules in our
gulpfile.js
. These files should be organized by function and can be split up into multiple files per application.Entry points to libraries must be defined in
gulpfile.js
for now. We don’t have a defined directory structure that would make it easy to imply the entry point to an application library.


{%extends "/shared/layout.html" %} {% block title %}My Profile {% endblock %} {% block content %}
| Member Since | Address | |
| {{ member.email }} | {{member.memberSince}} | {{member.street}} {{member.city + ', ' + member.state + ' ' + member.zip}} |
| # | ISBN | Title | Authors | Genre | Branch | Due Date | Return |
|---|---|---|---|---|---|---|---|
| {{ book.id }} | {{ book.isbn }} | {{ book.title }} | {{ book.author }} | {{ book.genre.capitalize() }} | {{ book.branchLocation.capitalize() }} | {{ duedates[loop.index-1] }} |
No Books You Reserved!
{% endif %}


ScissorPlot¶
-
class
components.liftingsurfaces.scissorplot.
ScissorPlot
(*args, **kwargs)[source]¶ This script will generate a scissor plot to size the horizontal tail (HT). The required inputs are: the CG position, aerodynamic center position, the tail arm, the HT aspect ratio, HT span efficiency, the tail to main wing speed ratio, the wing pitching moment about the aerodynamic center, the wing lift slope, the c_l for controllability (derived in wing), and the allowable shift in center of gravity.
Returns: Required Tail Surface Area and Scissor Plot
Parameters: - x_cg (float) – The CG positon in SI meters.
- x_ac (float) – The aerodynamic center positon in SI meters.
- x_lemac (float) – The distance to the leading edge of the Mean Aerodynamic center in SI meters.
- mac (float) – This is the MAC length.
- AR (float) – This is the aspect ratio of the aircraft.
- e (float) – This is the oswald efficiency factor of the aircraft.
- CD0 (float) – This is the zero-lift drag coefficient of the aircraft.
- k_factor (float) – This is the k factor to correct the canard main wing’s C_L alpha due to canard downwash.
- SM (float) – This is the required stability margin.
- AR_h (float) – This is the assumed aspect ratio of the horizontal tail.
- e_h (float) – This is the oswald efficiency factor of the HT.
- VhV_conv (float) – This is the speed ratio for a conventional tail aircraft.
- VhV_canard (float) – This is the speed ratio for a canard aircraft.
- a_0 (float) – This is the lift slope for a thin airfoil.
- Cl_w (float) – This is the controllability lift coefficient of the wing at 1.2*V_s imported from wing.
- C_mac (float) – This is the pitching moment about the aerodynamic center of the wing. This is calculated with AVL in ‘wing.py’
- Cla_w (float) – This is the lift curve slope of the wing. This is calculated with AVL in ‘wing.py’.
- delta_xcg (float) – This is the assumed change in the cg location.
- configuration (str) – This is a switch to determine the configuration.
- lhc (float) – Derived input of the non-dimensionalized tail arm based on configuration choice
-
AR
¶ Below is the wing aspect ratio.
-
AR_h
[source]¶ Utilizes a relation based on reference pictures to obtain a ratio of the tail aspect ratio as a function of the main-wing
-
CD0
¶ Below is the assumed zero lift drag coefficient
-
C_mac
¶ Below is the pitching moment about the aerodynamic center of the wing. This is calculated with AVL in ‘wing.py’.
-
Cl_w
¶ Below is the controllability lift coefficient of the wing at 1.2*V_s imported from wing.
-
Cla_w
¶ Below is the lift curve slope of the wing. This is calculated with AVL in ‘wing.py’.
-
SM
¶ Below is the assumed Stability Margin.
-
VhV_canard
= 1.0¶ Below is the speed ratio for a canard aircraft.
-
VhV_conv
= 0.9219544457292888¶ Below is the speed ratio for a conventional tail aircraft.
-
a_0
= 6.283185307179586¶ Below is the lift slope for a thin airfoil.
-
cl_h
[source]¶ This attribute returns the lift coefficient of the tail for the controllability case. The canard is assumed to be all moving.
Returns: HT lift coefficient Return type: float
-
cla_h
[source]¶ This attribute estimates the lift slope of a low sweep, low speed three dimensional wing.
Returns: HT lift curve slope Return type: float
-
cla_w_canard
[source]¶ This attribute reduces the wing lift slope for the canard case. It is reducing the C_l alpha from AVL.
Returns: Canard main wing lift slope Return type: float
-
configuration
¶ Below is a switch to determine the configuration.
-
delta_xcg
¶ Below is the assumed change in the cg location.
-
downwash_a
[source]¶ This attribute estimates the wings change in downwash with angle of attack.
Returns: Downwash gradient of main wing Return type: float
-
e
¶ Below is the wing span efficiency factor
-
k_factor
¶ Below is the k factor to correct the canard main wing C_Lalpha due to canard downwash.
-
lhc
[source]¶ Derived input of the non-dimensionalized tail arm based on configuration choice
Returns: Non-dimensional tail arm Return type: float
-
mac
¶ Below is the MAC length
-
plot_scissordiagram
[source]¶ This attribute will plot the scissor plot.
Returns: Scissor Plot Return type: Plot
-
shs_control
[source]¶ This attribute calculates the required Sh/S for the controllability requirement as a function of CG position.
Returns: Required Sh/S for controllability Return type: list
-
shs_req
[source]¶ This attribute will fit a linear spline to the controllability and stability curves to be able to address any value of Sh/S if probelems occur with the attribute ‘shs_sm’.
Returns: Required Sh/S Return type: float
-
shs_sm
[source]¶ This attribute will calculate the required Sh/S based on the required cg shift.
Returns: Required Sh/S Return type: float
-
shs_stability
[source]¶ This attribute calculates the required Sh/S for the stability requirement as a function of CG position.
Returns: Required Sh/S for stability Return type: list
-
x_ac
¶ Below is the current Aerodynamic Center position
-
x_cg
¶ Below is the current COG position
-
x_cg_vs_mac
[source]¶ This attribute returns the non dimensional distance between the COG and the wing AC.
Returns: The distance between the COG and the wing AC in meters Return type: float
-
x_lemac
¶ Below is the current leading edge of the MAC position


Some artifacts are restricted to certain frequencies and can therefore be fixed by filtering. An artifact that typically affects only some frequencies is due to the power line.
Power-line noise is a noise created by the electrical network. It is composed of sharp peaks at 50Hz (or 60Hz depending on your geographical location). Some peaks may also be present at the harmonic frequencies, i.e. the integer multiples of the power-line frequency, e.g. 100Hz, 150Hz, … (or 120Hz, 180Hz, …).
This tutorial covers some basics of how to filter data in MNE-Python. For more in-depth information about filter design in general and in MNE-Python in particular, check out Background information on filtering.
import numpy as np
import mne
from mne.datasets import sample
data_path = sample.data_path()
raw_fname = data_path + '/MEG/sample/sample_audvis_raw.fif'
proj_fname = data_path + '/MEG/sample/sample_audvis_eog_proj.fif'
tmin, tmax = 0, 20 # use the first 20s of data
# Setup for reading the raw data (save memory by cropping the raw data
# before loading it)
raw = mne.io.read_raw_fif(raw_fname)
raw.crop(tmin, tmax).load_data()
raw.info['bads'] = ['MEG 2443', 'EEG 053'] # bads + 2 more
fmin, fmax = 2, 300 # look at frequencies between 2 and 300Hz
n_fft = 2048 # the FFT size (n_fft). Ideally a power of 2
# Pick a subset of channels (here for speed reason)
selection = mne.read_selection('Left-temporal')
picks = mne.pick_types(raw.info, meg='mag', eeg=False, eog=False,
stim=False, exclude='bads', selection=selection)
# Let's first check out all channel types
raw.plot_psd(area_mode='range', tmax=10.0, picks=picks, average=False)
Out:
Opening raw data file /home/ubuntu/mne_data/MNE-sample-data/MEG/sample/sample_audvis_raw.fif...
Read a total of 3 projection items:
PCA-v1 (1 x 102) idle
PCA-v2 (1 x 102) idle
PCA-v3 (1 x 102) idle
Range : 25800 ... 192599 = 42.956 ... 320.670 secs
Ready.
Current compensation grade : 0
Reading 0 ... 12012 = 0.000 ... 20.000 secs...
Effective window size : 3.410 (s)
Removing power-line noise can be done with a Notch filter, directly on the Raw object, specifying an array of frequency to be cut off:
raw.notch_filter(np.arange(60, 241, 60), picks=picks, filter_length='auto',
phase='zero')
raw.plot_psd(area_mode='range', tmax=10.0, picks=picks, average=False)
Out:
Setting up band-stop filter
Filter length of 7928 samples (13.200 sec) selected
Effective window size : 3.410 (s)
If you’re only interested in low frequencies, below the peaks of power-line noise you can simply low pass filter the data.
# low pass filtering below 50 Hz
raw.filter(None, 50., h_trans_bandwidth='auto', filter_length='auto',
phase='zero')
raw.plot_psd(area_mode='range', tmax=10.0, picks=picks, average=False)
Out:
Setting up low-pass filter at 50 Hz
h_trans_bandwidth chosen to be 12.5 Hz
Filter length of 317 samples (0.528 sec) selected
Effective window size : 3.410 (s)
To remove slow drifts, you can high pass.
Warning
There can be issues using high-passes greater than 0.1 Hz (see examples in High-pass problems), so apply high-pass filters with caution.
raw.filter(1., None, l_trans_bandwidth='auto', filter_length='auto',
phase='zero')
raw.plot_psd(area_mode='range', tmax=10.0, picks=picks, average=False)
Out:
Setting up high-pass filter at 1 Hz
l_trans_bandwidth chosen to be 1.0 Hz
Filter length of 3964 samples (6.600 sec) selected
Effective window size : 3.410 (s)
To do the low-pass and high-pass filtering in one step you can do a so-called band-pass filter by running the following:
# band-pass filtering in the range 1 Hz - 50 Hz
raw.filter(1, 50., l_trans_bandwidth='auto', h_trans_bandwidth='auto',
filter_length='auto', phase='zero')
Out:
Setting up band-pass filter from 1 - 50 Hz
l_trans_bandwidth chosen to be 1.0 Hz
h_trans_bandwidth chosen to be 12.5 Hz
Filter length of 3964 samples (6.600 sec) selected
When performing experiments where timing is critical, a signal with a high sampling rate is desired. However, having a signal with a much higher sampling rate than necessary needlessly consumes memory and slows down computations operating on the data. To avoid that, you can downsample your time series. Since downsampling raw data reduces the timing precision of events, it is recommended only for use in procedures that do not require optimal precision, e.g. computing EOG or ECG projectors on long recordings.
Note
A downsampling operation performs a low-pass (to prevent
aliasing) followed by decimation, which selects every
\(N^{th}\) sample from the signal. See
scipy.signal.resample()
and
scipy.signal.resample_poly()
for examples.
Data resampling can be done with resample methods.
raw.resample(100, npad="auto") # set sampling frequency to 100Hz
raw.plot_psd(area_mode='range', tmax=10.0, picks=picks)
Out:
25 events found
Events id: [ 1 2 3 4 5 32]
25 events found
Events id: [ 1 2 3 4 5 32]
Effective window size : 10.010 (s)
To avoid this reduction in precision, the suggested pipeline for processing final data to be analyzed is:
- low-pass the data with
mne.io.Raw.filter()
.- Extract epochs with
mne.Epochs
.- Decimate the Epochs object using
mne.Epochs.decimate()
or thedecim
argument to themne.Epochs
object.
We also provide the convenience methods mne.Epochs.resample()
and
mne.Evoked.resample()
to downsample or upsample data, but these are
less optimal because they will introduce edge artifacts into every epoch,
whereas filtering the raw data will only introduce edge artifacts only at
the start and end of the recording.
Total running time of the script: ( 0 minutes 3.065 seconds)


Test your knowledge of random movie questions across time.
Hit the start button to begin - you will have 30 seconds to answer each question.


Press n or j to go to the next uncovered block, b, p or k for the previous block.
| File | Statements | Branches | Functions | Lines | |||||
|---|---|---|---|---|---|---|---|---|---|
| byte.ts |
|
53.8% | 163/303 | 39.81% | 41/103 | 53.06% | 26/49 | 54.07% | 146/270 |
| index.ts |
|
100% | 3/3 | 100% | 0/0 | 100% | 0/0 | 100% | 3/3 |
| pb-proto-handler.ts |
|
93% | 93/100 | 77.5% | 31/40 | 90% | 9/10 | 92.86% | 91/98 |
| pkg-type.ts |
|
100% | 6/6 | 100% | 2/2 | 100% | 1/1 | 100% | 6/6 |


#Build: Synplify Pro J-2015.03M-SP1-2, Build 266R, Dec 14 2015 #install: C:\Microsemi\Libero_SoC_v11.8\SynplifyPro\fpga_J-2015.03M-SP1-2 #OS: Windows 8 6.2 #Hostname: LAPTOP-UCQD4H1A #Implementation: synthesis Synopsys HDL Compiler, version comp201503sp1p1, Build 240R, built Dec 1 2015 @N: : | Running in 64-bit mode Copyright (C) 1994-2015 Synopsys, Inc. This software and the associated documentation are proprietary to Synopsys, Inc. This software may only be used in accordance with the terms and conditions of a written license agreement with Synopsys, Inc. All other use, reproduction, or distribution of this software is strictly prohibited. Synopsys VHDL Compiler, version comp201503sp1p1, Build 240R, built Dec 1 2015 @N: : | Running in 64-bit mode Copyright (C) 1994-2015 Synopsys, Inc. This software and the associated documentation are proprietary to Synopsys, Inc. This software may only be used in accordance with the terms and conditions of a written license agreement with Synopsys, Inc. All other use, reproduction, or distribution of this software is strictly prohibited. @N:CD720 : std.vhd(146) | Setting time resolution to ns @N: : WOLF_CONTROLLER.vhd(22) | Top entity is set to WOLF_CONTROLLER. Options changed - recompiling VHDL syntax check successful! Options changed - recompiling @N:CD231 : std1164.vhd(890) | Using onehot encoding for type mvl9plus ('U'="1000000000") @N:CD630 : WOLF_CONTROLLER.vhd(22) | Synthesizing work.wolf_controller.architecture_wolf_controller @N:CD231 : WOLF_CONTROLLER.vhd(59) | Using onehot encoding for type state (start="100000") @W:CD434 : WOLF_CONTROLLER.vhd(75) | Signal rocket_pin in the sensitivity list is not used in the process @W:CD604 : WOLF_CONTROLLER.vhd(139) | OTHERS clause is not synthesized @W:CD434 : WOLF_CONTROLLER.vhd(91) | Signal clk_1hz in the sensitivity list is not used in the process Post processing for work.wolf_controller.architecture_wolf_controller @W:CL169 : WOLF_CONTROLLER.vhd(95) | Pruning register rocket_pin_old_4 @A:CL282 : WOLF_CONTROLLER.vhd(95) | Feedback mux created for signal next_state[0:5] -- possible set/reset assignment for signal missing. Specifying a reset value will improve timing and area. @W:CL159 : WOLF_CONTROLLER.vhd(30) | Input rocket_pin is unused At c_vhdl Exit (Real Time elapsed 0h:00m:00s; CPU Time elapsed 0h:00m:00s; Memory used current: 72MB peak: 73MB) Process took 0h:00m:01s realtime, 0h:00m:01s cputime # Wed Jun 07 11:28:38 2017 ###########################################################] Synopsys Netlist Linker, version comp201503sp1p1, Build 240R, built Dec 1 2015 @N: : | Running in 64-bit mode At syn_nfilter Exit (Real Time elapsed 0h:00m:00s; CPU Time elapsed 0h:00m:00s; Memory used current: 67MB peak: 68MB) Process took 0h:00m:01s realtime, 0h:00m:01s cputime # Wed Jun 07 11:28:38 2017 ###########################################################] @END At c_hdl Exit (Real Time elapsed 0h:00m:00s; CPU Time elapsed 0h:00m:00s; Memory used current: 3MB peak: 4MB) Process took 0h:00m:01s realtime, 0h:00m:01s cputime # Wed Jun 07 11:28:38 2017 ###########################################################] Synopsys Netlist Linker, version comp201503sp1p1, Build 240R, built Dec 1 2015 @N: : | Running in 64-bit mode File C:\Users\rozen\Dropbox\EE_BSC_2017\G8\vhdl\CU_Droptest\synthesis\synwork\WOLF_CONTROLLER_comp.srs changed - recompiling At syn_nfilter Exit (Real Time elapsed 0h:00m:00s; CPU Time elapsed 0h:00m:00s; Memory used current: 67MB peak: 68MB) Process took 0h:00m:01s realtime, 0h:00m:01s cputime # Wed Jun 07 11:28:40 2017 ###########################################################] Pre-mapping Report Synopsys Microsemi Technology Pre-mapping, Version mapact, Build 1659R, Built Dec 10 2015 09:42:41 Copyright (C) 1994-2015, Synopsys, Inc. This software and the associated documentation are proprietary to Synopsys, Inc. This software may only be used in accordance with the terms and conditions of a written license agreement with Synopsys, Inc. All other use, reproduction, or distribution of this software is strictly prohibited. Product Version J-2015.03M-SP1-2 Mapper Startup Complete (Real Time elapsed 0h:00m:00s; CPU Time elapsed 0h:00m:00s; Memory used current: 99MB peak: 99MB) Reading constraint file: C:\Users\rozen\Dropbox\EE_BSC_2017\G8\vhdl\CU_Droptest\constraint\CU_Main_32.sdc Linked File: WOLF_CONTROLLER_scck.rpt Printing clock summary report in "C:\Users\rozen\Dropbox\EE_BSC_2017\G8\vhdl\CU_Droptest\synthesis\WOLF_CONTROLLER_scck.rpt" file @N:MF248 : | Running in 64-bit mode. @N:MF667 : | Clock conversion disabled Design Input Complete (Real Time elapsed 0h:00m:00s; CPU Time elapsed 0h:00m:00s; Memory used current: 100MB peak: 102MB) Mapper Initialization Complete (Real Time elapsed 0h:00m:00s; CPU Time elapsed 0h:00m:00s; Memory used current: 100MB peak: 102MB) Finished netlist restructuring (Real Time elapsed 0h:00m:01s; CPU Time elapsed 0h:00m:00s; Memory used current: 107MB peak: 109MB) @S |Clock Summary ***************** Start Requested Requested Clock Clock Clock Frequency Period Type Group ----------------------------------------------------------------------------------------- WOLF_CONTROLLER|clk_1hz 100.0 MHz 10.000 inferred Inferred_clkgroup_0 WOLF_CONTROLLER|clk_main 100.0 MHz 10.000 inferred Inferred_clkgroup_1 main_clk 32.8 MHz 30.500 declared default_clkgroup ========================================================================================= @W:MT530 : wolf_controller.vhd(77) | Found inferred clock WOLF_CONTROLLER|clk_1hz which controls 13 sequential elements including sec_since_eject[12:0]. This clock has no specified timing constraint which may adversely impact design performance. @W:MT530 : wolf_controller.vhd(95) | Found inferred clock WOLF_CONTROLLER|clk_main which controls 13 sequential elements including current_state[0:5]. This clock has no specified timing constraint which may adversely impact design performance. Finished Pre Mapping Phase. @N:BN225 : | Writing default property annotation file C:\Users\rozen\Dropbox\EE_BSC_2017\G8\vhdl\CU_Droptest\synthesis\WOLF_CONTROLLER.sap. Pre-mapping successful! At Mapper Exit (Real Time elapsed 0h:00m:01s; CPU Time elapsed 0h:00m:01s; Memory used current: 45MB peak: 109MB) Process took 0h:00m:01s realtime, 0h:00m:01s cputime # Wed Jun 07 11:28:41 2017 ###########################################################] Map & Optimize Report Synopsys Microsemi Technology Mapper, Version mapact, Build 1659R, Built Dec 10 2015 09:42:41 Copyright (C) 1994-2015, Synopsys, Inc. This software and the associated documentation are proprietary to Synopsys, Inc. This software may only be used in accordance with the terms and conditions of a written license agreement with Synopsys, Inc. All other use, reproduction, or distribution of this software is strictly prohibited. Product Version J-2015.03M-SP1-2 Mapper Startup Complete (Real Time elapsed 0h:00m:00s; CPU Time elapsed 0h:00m:00s; Memory used current: 99MB peak: 99MB) @N:MF248 : | Running in 64-bit mode. @N:MF667 : | Clock conversion disabled Design Input Complete (Real Time elapsed 0h:00m:00s; CPU Time elapsed 0h:00m:00s; Memory used current: 99MB peak: 101MB) Mapper Initialization Complete (Real Time elapsed 0h:00m:00s; CPU Time elapsed 0h:00m:00s; Memory used current: 99MB peak: 101MB) Starting Optimization and Mapping (Real Time elapsed 0h:00m:00s; CPU Time elapsed 0h:00m:00s; Memory used current: 107MB peak: 110MB) Available hyper_sources - for debug and ip models None Found Finished RTL optimizations (Real Time elapsed 0h:00m:00s; CPU Time elapsed 0h:00m:00s; Memory used current: 107MB peak: 110MB) @N: : wolf_controller.vhd(77) | Found counter in view:work.WOLF_CONTROLLER(architecture_wolf_controller) inst sec_since_eject[12:0] Finished factoring (Real Time elapsed 0h:00m:00s; CPU Time elapsed 0h:00m:00s; Memory used current: 108MB peak: 110MB) Finished gated-clock and generated-clock conversion (Real Time elapsed 0h:00m:01s; CPU Time elapsed 0h:00m:00s; Memory used current: 108MB peak: 110MB) Finished generic timing optimizations - Pass 1 (Real Time elapsed 0h:00m:01s; CPU Time elapsed 0h:00m:00s; Memory used current: 108MB peak: 110MB) Starting Early Timing Optimization (Real Time elapsed 0h:00m:01s; CPU Time elapsed 0h:00m:00s; Memory used current: 109MB peak: 110MB) Finished Early Timing Optimization (Real Time elapsed 0h:00m:01s; CPU Time elapsed 0h:00m:01s; Memory used current: 109MB peak: 110MB) Finished generic timing optimizations - Pass 2 (Real Time elapsed 0h:00m:01s; CPU Time elapsed 0h:00m:01s; Memory used current: 109MB peak: 110MB) Finished preparing to map (Real Time elapsed 0h:00m:01s; CPU Time elapsed 0h:00m:01s; Memory used current: 109MB peak: 110MB) Finished technology mapping (Real Time elapsed 0h:00m:01s; CPU Time elapsed 0h:00m:01s; Memory used current: 109MB peak: 110MB) High Fanout Net Report ********************** Driver Instance / Pin Name Fanout, notes ------------------------------------------------------------- reset_pad / Y 26 : 20 asynchronous set/reset ============================================================= @N:FP130 : | Promoting Net clk_1hz_c on CLKBUF clk_1hz_pad @N:FP130 : | Promoting Net clk_main_c on CLKBUF clk_main_pad Finished technology timing optimizations and critical path resynthesis (Real Time elapsed 0h:00m:01s; CPU Time elapsed 0h:00m:01s; Memory used current: 109MB peak: 110MB) Buffering reset_c, fanout 26 segments 2 Added 1 Buffers Added 0 Cells via replication Added 0 Sequential Cells via replication Added 0 Combinational Cells via replication Finished restoring hierarchy (Real Time elapsed 0h:00m:01s; CPU Time elapsed 0h:00m:01s; Memory used current: 109MB peak: 110MB) #### START OF CLOCK OPTIMIZATION REPORT #####[ Clock optimization not enabled 2 non-gated/non-generated clock tree(s) driving 26 clock pin(s) of sequential element(s) 0 gated/generated clock tree(s) driving 0 clock pin(s) of sequential element(s) 0 instances converted, 0 sequential instances remain driven by gated/generated clocks ============================= Non-Gated/Non-Generated Clocks ============================= Clock Tree ID Driving Element Drive Element Type Fanout Sample Instance ------------------------------------------------------------------------------------------ ClockId0001 clk_1hz port 13 sec_since_eject[0] ClockId0002 clk_main port 13 cutter_en ========================================================================================== ##### END OF CLOCK OPTIMIZATION REPORT ######] Start Writing Netlists (Real Time elapsed 0h:00m:01s; CPU Time elapsed 0h:00m:01s; Memory used current: 109MB peak: 110MB) Writing Analyst data base C:\Users\rozen\Dropbox\EE_BSC_2017\G8\vhdl\CU_Droptest\synthesis\synwork\WOLF_CONTROLLER_m.srm Finished Writing Netlist Databases (Real Time elapsed 0h:00m:01s; CPU Time elapsed 0h:00m:01s; Memory used current: 109MB peak: 110MB) Writing EDIF Netlist and constraint files J-2015.03M-SP1-2 Finished Writing EDIF Netlist and constraint files (Real Time elapsed 0h:00m:01s; CPU Time elapsed 0h:00m:01s; Memory used current: 109MB peak: 110MB) Start final timing analysis (Real Time elapsed 0h:00m:01s; CPU Time elapsed 0h:00m:01s; Memory used current: 109MB peak: 110MB) @W:MT420 : | Found inferred clock WOLF_CONTROLLER|clk_main with period 10.00ns. Please declare a user-defined clock on object "p:clk_main" @W:MT420 : | Found inferred clock WOLF_CONTROLLER|clk_1hz with period 10.00ns. Please declare a user-defined clock on object "p:clk_1hz" @S |##### START OF TIMING REPORT #####[ # Timing Report written on Wed Jun 07 11:28:43 2017 # Top view: WOLF_CONTROLLER Library name: PA3 Operating conditions: COMWCSTD ( T = 70.0, V = 1.42, P = 1.74, tree_type = balanced_tree ) Requested Frequency: 100.0 MHz Wire load mode: top Wire load model: proasic3 Paths requested: 5 Constraint File(s): C:\Users\rozen\Dropbox\EE_BSC_2017\G8\vhdl\CU_Droptest\constraint\CU_Main_32.sdc @N:MT320 : | Timing report estimates place and route data. Please look at the place and route timing report for final timing. @N:MT322 : | Clock constraints cover only FF-to-FF paths associated with the clock. Performance Summary ******************* Worst slack in design: 0.429 Requested Estimated Requested Estimated Clock Clock Starting Clock Frequency Frequency Period Period Slack Type Group ------------------------------------------------------------------------------------------------------------------------------- WOLF_CONTROLLER|clk_1hz 100.0 MHz 104.5 MHz 10.000 9.571 0.429 inferred Inferred_clkgroup_0 WOLF_CONTROLLER|clk_main 100.0 MHz 178.0 MHz 10.000 5.619 4.381 inferred Inferred_clkgroup_1 =============================================================================================================================== @W:MT548 : cu_main_32.sdc(1) | Source for clock main_clk not found in netlist. Run the constraint checker to verify if constraints are applied correctly. Clock Relationships ******************* Clocks | rise to rise | fall to fall | rise to fall | fall to rise ------------------------------------------------------------------------------------------------------------------------------------------ Starting Ending | constraint slack | constraint slack | constraint slack | constraint slack ------------------------------------------------------------------------------------------------------------------------------------------ WOLF_CONTROLLER|clk_1hz WOLF_CONTROLLER|clk_1hz | 10.000 0.429 | No paths - | No paths - | No paths - WOLF_CONTROLLER|clk_1hz WOLF_CONTROLLER|clk_main | Diff grp - | No paths - | No paths - | No paths - WOLF_CONTROLLER|clk_main WOLF_CONTROLLER|clk_main | 10.000 4.381 | No paths - | No paths - | No paths - ========================================================================================================================================== Note: 'No paths' indicates there are no paths in the design for that pair of clock edges. 'Diff grp' indicates that paths exist but the starting clock and ending clock are in different clock groups. Interface Information ********************* No IO constraint found ==================================== Detailed Report for Clock: WOLF_CONTROLLER|clk_1hz ==================================== Starting Points with Worst Slack ******************************** Starting Arrival Instance Reference Type Pin Net Time Slack Clock -------------------------------------------------------------------------------------------------------------- sec_since_eject[0] WOLF_CONTROLLER|clk_1hz DFN1C1 Q sec_since_eject[0] 0.737 0.429 sec_since_eject[1] WOLF_CONTROLLER|clk_1hz DFN1C1 Q sec_since_eject[1] 0.737 0.638 sec_since_eject[3] WOLF_CONTROLLER|clk_1hz DFN1C1 Q sec_since_eject[3] 0.737 0.660 sec_since_eject[2] WOLF_CONTROLLER|clk_1hz DFN1C1 Q sec_since_eject[2] 0.737 0.678 sec_since_eject[4] WOLF_CONTROLLER|clk_1hz DFN1C1 Q sec_since_eject[4] 0.737 1.465 sec_since_eject[5] WOLF_CONTROLLER|clk_1hz DFN1C1 Q sec_since_eject[5] 0.737 2.397 sec_since_eject[8] WOLF_CONTROLLER|clk_1hz DFN1C1 Q sec_since_eject[8] 0.737 3.135 sec_since_eject[9] WOLF_CONTROLLER|clk_1hz DFN1C1 Q sec_since_eject[9] 0.737 3.488 sec_since_eject[7] WOLF_CONTROLLER|clk_1hz DFN1C1 Q sec_since_eject[7] 0.737 3.714 sec_since_eject[6] WOLF_CONTROLLER|clk_1hz DFN1C1 Q sec_since_eject[6] 0.737 3.891 ============================================================================================================== Ending Points with Worst Slack ****************************** Starting Required Instance Reference Type Pin Net Time Slack Clock ----------------------------------------------------------------------------------------------------------------- sec_since_eject[11] WOLF_CONTROLLER|clk_1hz DFN1C1 D sec_since_eject_n11 9.461 0.429 sec_since_eject[10] WOLF_CONTROLLER|clk_1hz DFN1C1 D sec_since_eject_n10 9.461 0.911 sec_since_eject[9] WOLF_CONTROLLER|clk_1hz DFN1C1 D sec_since_eject_n9 9.461 1.422 sec_since_eject[8] WOLF_CONTROLLER|clk_1hz DFN1C1 D sec_since_eject_n8 9.461 1.903 sec_since_eject[7] WOLF_CONTROLLER|clk_1hz DFN1C1 D sec_since_eject_n7 9.461 2.834 sec_since_eject[12] WOLF_CONTROLLER|clk_1hz DFN1C1 D sec_since_eject_n12 9.461 3.135 sec_since_eject[6] WOLF_CONTROLLER|clk_1hz DFN1C1 D sec_since_eject_n6 9.461 3.316 sec_since_eject[4] WOLF_CONTROLLER|clk_1hz DFN1C1 D sec_since_eject_n4 9.461 3.829 sec_since_eject[3] WOLF_CONTROLLER|clk_1hz DFN1C1 D sec_since_eject_n3 9.461 4.247 sec_since_eject[5] WOLF_CONTROLLER|clk_1hz DFN1C1 D sec_since_eject_n5 9.461 4.247 ================================================================================================================= Worst Path Information View Worst Path in Analyst *********************** Path information for path number 1: Requested Period: 10.000 - Setup time: 0.539 + Clock delay at ending point: 0.000 (ideal) = Required time: 9.461 - Propagation time: 9.032 - Clock delay at starting point: 0.000 (ideal) = Slack (critical) : 0.429 Number of logic level(s): 5 Starting point: sec_since_eject[0] / Q Ending point: sec_since_eject[11] / D The start point is clocked by WOLF_CONTROLLER|clk_1hz [rising] on pin CLK The end point is clocked by WOLF_CONTROLLER|clk_1hz [rising] on pin CLK Instance / Net Pin Pin Arrival No. of Name Type Name Dir Delay Time Fan Out(s) ------------------------------------------------------------------------------------------- sec_since_eject[0] DFN1C1 Q Out 0.737 0.737 - sec_since_eject[0] Net - - 1.279 - 5 sec_since_eject_RNIT0F3[1] NOR2B B In - 2.016 - sec_since_eject_RNIT0F3[1] NOR2B Y Out 0.627 2.644 - sec_since_eject_c1 Net - - 1.279 - 5 sec_since_eject_RNI3FDA[5] NOR3C B In - 3.923 - sec_since_eject_RNI3FDA[5] NOR3C Y Out 0.607 4.529 - sec_since_eject_c5 Net - - 0.806 - 3 sec_since_eject_RNICSSD[6] NOR3C B In - 5.336 - sec_since_eject_RNICSSD[6] NOR3C Y Out 0.607 5.942 - sec_since_eject_c7 Net - - 0.806 - 3 sec_since_eject_RNIPDCH[9] NOR3C B In - 6.748 - sec_since_eject_RNIPDCH[9] NOR3C Y Out 0.607 7.355 - sec_since_eject_c9 Net - - 0.386 - 2 sec_since_eject_RNO[11] AX1C B In - 7.741 - sec_since_eject_RNO[11] AX1C Y Out 0.970 8.711 - sec_since_eject_n11 Net - - 0.322 - 1 sec_since_eject[11] DFN1C1 D In - 9.032 - =========================================================================================== Total path delay (propagation time + setup) of 9.571 is 4.692(49.0%) logic and 4.878(51.0%) route. Path delay compensated for clock skew. Clock skew is added to clock-to-out value, and is subtracted from setup time value ==================================== Detailed Report for Clock: WOLF_CONTROLLER|clk_main ==================================== Starting Points with Worst Slack ******************************** Starting Arrival Instance Reference Type Pin Net Time Slack Clock ----------------------------------------------------------------------------------------------------------- current_state[1] WOLF_CONTROLLER|clk_main DFN1C1 Q current_state[1] 0.737 4.381 current_state[0] WOLF_CONTROLLER|clk_main DFN1C1 Q current_state[0] 0.737 4.724 current_state[3] WOLF_CONTROLLER|clk_main DFN1C1 Q current_state[3] 0.737 5.335 current_state[4] WOLF_CONTROLLER|clk_main DFN1C1 Q current_state[4] 0.737 6.279 current_state[2] WOLF_CONTROLLER|clk_main DFN1C1 Q current_state[2] 0.737 7.404 next_state[5] WOLF_CONTROLLER|clk_main DFN1 Q next_state[5] 0.737 7.468 current_state[5] WOLF_CONTROLLER|clk_main DFN1P1 Q current_state[5] 0.737 8.368 next_state[0] WOLF_CONTROLLER|clk_main DFN1E0 Q next_state[0] 0.737 8.368 next_state[1] WOLF_CONTROLLER|clk_main DFN1E0 Q next_state[1] 0.737 8.368 next_state[2] WOLF_CONTROLLER|clk_main DFN1E0 Q next_state[2] 0.737 8.368 =========================================================================================================== Ending Points with Worst Slack ****************************** Starting Required Instance Reference Type Pin Net Time Slack Clock ----------------------------------------------------------------------------------------------------------------- next_state[0] WOLF_CONTROLLER|clk_main DFN1E0 D next_state_9[0] 9.461 4.381 next_state[1] WOLF_CONTROLLER|clk_main DFN1E0 D next_state_9[1] 9.461 4.381 next_state[3] WOLF_CONTROLLER|clk_main DFN1E0 D next_state_9[3] 9.461 4.381 cutter_en WOLF_CONTROLLER|clk_main DFN1E0C1 E un1_current_state_2 9.392 5.445 next_state[2] WOLF_CONTROLLER|clk_main DFN1E0 D next_state_0_sqmuxa 9.427 6.557 next_state[5] WOLF_CONTROLLER|clk_main DFN1 D next_state_RNO[5] 9.427 7.468 current_state[5] WOLF_CONTROLLER|clk_main DFN1P1 D next_state[5] 9.427 8.304 current_state[0] WOLF_CONTROLLER|clk_main DFN1C1 D next_state[0] 9.427 8.368 current_state[1] WOLF_CONTROLLER|clk_main DFN1C1 D next_state[1] 9.427 8.368 current_state[2] WOLF_CONTROLLER|clk_main DFN1C1 D next_state[2] 9.427 8.368 ================================================================================================================= Worst Path Information View Worst Path in Analyst *********************** Path information for path number 1: Requested Period: 10.000 - Setup time: 0.539 + Clock delay at ending point: 0.000 (ideal) = Required time: 9.461 - Propagation time: 5.080 - Clock delay at starting point: 0.000 (ideal) = Slack (non-critical) : 4.381 Number of logic level(s): 3 Starting point: current_state[1] / Q Ending point: next_state[3] / D The start point is clocked by WOLF_CONTROLLER|clk_main [rising] on pin CLK The end point is clocked by WOLF_CONTROLLER|clk_main [rising] on pin CLK Instance / Net Pin Pin Arrival No. of Name Type Name Dir Delay Time Fan Out(s) ------------------------------------------------------------------------------------------ current_state[1] DFN1C1 Q Out 0.737 0.737 - current_state[1] Net - - 1.184 - 4 current_state_RNI0SR72[0] AO1 B In - 1.921 - current_state_RNI0SR72[0] AO1 Y Out 0.598 2.518 - un1_current_state_0 Net - - 0.322 - 1 current_state_RNINRA24[3] AO1 C In - 2.840 - current_state_RNINRA24[3] AO1 Y Out 0.633 3.472 - un1_current_state Net - - 0.806 - 3 next_state_9[3] MX2 S In - 4.279 - next_state_9[3] MX2 Y Out 0.480 4.758 - next_state_9[3] Net - - 0.322 - 1 next_state[3] DFN1E0 D In - 5.080 - ========================================================================================== Total path delay (propagation time + setup) of 5.619 is 2.986(53.1%) logic and 2.633(46.9%) route. Path delay compensated for clock skew. Clock skew is added to clock-to-out value, and is subtracted from setup time value ##### END OF TIMING REPORT #####] Finished final timing analysis (Real Time elapsed 0h:00m:01s; CPU Time elapsed 0h:00m:01s; Memory used current: 109MB peak: 110MB) Finished timing report (Real Time elapsed 0h:00m:01s; CPU Time elapsed 0h:00m:01s; Memory used current: 109MB peak: 110MB) -------------------------------------------------------------------------------- Target Part: A3P250_VQFP100_STD Report for cell WOLF_CONTROLLER.architecture_wolf_controller Core Cell usage: cell count area count*area AO1 3 1.0 3.0 AO1A 1 1.0 1.0 AX1C 6 1.0 6.0 BUFF 1 1.0 1.0 GND 1 0.0 0.0 INV 1 1.0 1.0 MX2 2 1.0 2.0 NOR2 2 1.0 2.0 NOR2A 1 1.0 1.0 NOR2B 8 1.0 8.0 NOR3 1 1.0 1.0 NOR3A 6 1.0 6.0 NOR3C 7 1.0 7.0 OAI1 1 1.0 1.0 OR3 1 1.0 1.0 VCC 1 0.0 0.0 XOR2 6 1.0 6.0 DFN1 1 1.0 1.0 DFN1C1 18 1.0 18.0 DFN1E0 5 1.0 5.0 DFN1E0C1 1 1.0 1.0 DFN1P1 1 1.0 1.0 ----- ---------- TOTAL 75 73.0 IO Cell usage: cell count CLKBUF 2 INBUF 1 OUTBUF 1 ----- TOTAL 4 Core Cells : 73 of 6144 (1%) IO Cells : 4 RAM/ROM Usage Summary Block Rams : 0 of 8 (0%) Mapper successful! At Mapper Exit (Real Time elapsed 0h:00m:01s; CPU Time elapsed 0h:00m:01s; Memory used current: 46MB peak: 110MB) Process took 0h:00m:01s realtime, 0h:00m:01s cputime # Wed Jun 07 11:28:44 2017 ###########################################################]


| Billing address | |
| Name | {{order.billingAddress.firstName}} {{order.billingAddress.lastName}} |
| Address line-1 | |
| Address line-2 | |
| City | |
| Country | |
| Post code | |
| Phone number |
| Shipping address | |
| Name | {{order.shippingAddress.firstName}} {{order.shippingAddress.lastName}} |
| Address line-1 | |
| Address line-2 | |
| City | |
| Country | |
| Post code | |
| Phone number |
| Payment | |
| Payment method | |
| Payment status |
| Shipping | |
| Shipping method | |
| Shipping status |
| Product(s) | Price | Quantity | Total |
| {{item.name}} | {{item.price | currency}} | {{item.quantity}} | {{(item.price * item.quantity) | currency}} |
| Sub Total: | |
| Shipping: | |
| Total: |


Welcome to the Office for National Statistics
The UK's largest independent producer of official statistics and the recognised national statistical institute of the UK.
The UK's largest independent producer of official statistics and the recognised national statistical institute of the UK.


Fullstack LA is always on the lookout for speakers to present open source projects to our group that they are deeply involved in. We love seasoned open source committers and maintainers! If you fit this description, we want you to come show us how it's done!
While maintainers and core team members are definetly the right people to give these talks; we feel anybody with a clear history of involvement and a passion for a given project would make an excellent ambassador. Learn more about how to bring an open source project to our attention on our RFP page.


Content
Accessible web pages
In modern web development it is customary to organize your best practices around individual components, or modules: discrete pockets of functionality such as accordions, cards, or tab interfaces.
However, certain accessibility provisions pertain to the outer web page, or document. The way your components are ordered and interrelate within that document is also important.
Here, we'll cover the fundamentals of accessible web pages.
The title
Labels are critical to accessible web interfaces. Buttons, links, and form elements must all have descriptive labels that are parsable by assistive technologies. Headings are labels for sections of content, and the
's <title>
allows you to label the document itself.
Upon page load a screen reader will announce the <title>
, and you should make the most of this opportunity to describe the page in context of the site. Since users will likely have tabs from different sites open simultaneously, it's important they're aware which "Home" or "Search results" belongs to which site.
A typical structure is as follows.
<title>[Label for page] - [Name for site]</title>
In single-page applications there is only one page and, therefore, only one <title>
element. Accordingly, as users traverse 'routes' and load synthetic pages, you will need to update the <title>
's text node. This is achievable via document.title
document.title = 'UK Politics - BBC News';
Heading structure
The principle

heading shares responsibility with the <title>
in describing (naming) the page. There should, therefore, only be one

per page, and its text is most effective as a subset of the <title>
. Typically, the

should be the <title>
minus the site name (see above).
Example:
<title>UK Politics - BBC News</title>
...

UK Politics

The heading level (h1—h6) for any other section of the page should be chosen in terms of belonging. That is, if the heading labels a child subsection of the page, then

is appropriate. If the heading labels a subsection of a subsection, then the level should be one higher than the parent.
-
UK Politics (h1)
-
Top stories (h2)
- Bid to get Labour to change Brexit stance (h3)
- Ban on electric shock collars for pets (h3)
-
As in the above example, sibling/equivalent sections should have the same heading level. In cases where one subsection is considered more important than another, it is not appropriate to change the heading level to elicit a larger heading for size (for example). This makes a nonsense of the document structure for screen reader users. Instead, use one of the following techniques:
- Promote the item so it appears first in the order (a 'sticky post' in blogging terms)
- Include the text 'featured' or similar as part of the heading on in close proximity to it
In addition, you may use a styling technique that doesn't affect the semantics of the element to increase the font-size
. HTML classes have no impact on how screen readers interpret the element. A common technique is to style headings by their element types as a default, and provide classes to amend styles where necessary:
h1,
.h1 {
font-size: 2.5rem;
}
h2,
.h2 {
font-size: 2rem;
}
h3,
.h3 {
font-size: 1.5rem;
}
/* etc */
Headings are one of the most important provisions for screen reader usability, since they help break the page into manageable and navigable chunks. Screen reader users can navigate between headings, and therefore sections, using shortcut keys. In NVDA and JAWS, the 2 key will take you to the next

heading, and Shift + 2 will take you to the previous one.
Be aware that many screen readers aggregate headings into tables of content. It is therefore important that each heading's text makes sense and is descriptive without the assistance of surrounding content. For example, "Ban on electric shock collars for pets" is preferable to "Product ban" or "Good news for pets".
Landmarks
Landmarks describe the principle areas of the page. They are the continents to sections' countries. While headings describe sections, landmark elements describe landmarks. They can be applied with HTML5 or ARIA:

orrole="banner"
→ page header, found at the top of the page (one per page)
orrole="contentinfo"
→ page footer, found at the bottom of the page (one per page)
orrole="navigation"
→ set of navigation links, typically found in or near the

orrole="complementary"
→ supplementary content, either adjacent to
or as interludes within the content of

orrole="main"
→ contains the page's main content (one per page)
As indicated, some landmarks are expected to be included just once per page. Others, like
and
may be used multiple times. However, each
or
within the page should have a unique purpose and content. For example, you could include a
for navigating around the site and another for navigating between sections of the current page. These should be distinguished by label.

Site

...

This page

Note: You can hide the headings for these
s if you wish. The display: none
declaration is applicable in this case, because the association via aria-labelledby
preserves announcement despite display: none
typically removing elements from screen reader output.
With the exception of
, landmarks used across multiple pages (such as the site navigation landmark, above) must be placed consistently and contain consistent content. It is not recommended that the 'current' page is removed from a list of
links, since this is helpful for context when wayfinding. You can mark the current page with aria-current="page"
and use an attribute selector for styling.
[aria-current='page'] {
text-decoration: underline; /* for example */
}
Ensure that all content exists within one landmark or another. Any 'orphaned' content can be missed when a screen reader user is navigating by landmark.
Skip links
It is recommended the
landmark and navigation come before the
content. This way, it's easy for users to get around the site. This does present a problem, though: keyboard users are faced with a number of links to Tab through to reach the main content of the page.
The traditional remedy is to provide a 'skip link' that lets users bypass the header and move directly into the page's unique content. Here's how this is typically marked up:

Skip to content

...

Note the use of tabindex="-1"
. This forces browsers to move focus into
when users activate the link. Without it, some browsers leave focus at the point of origin. This will elicit a :focus
style, which can be removed for focus targets that use tabindex="-1"
and are, therefore, not focusable by the user with the Tab key.
[tabindex='-1']:focus {
outline: none;
}
Skip links can appear by default or — since they are intended for keyboard users primarily — be made invisible until the user focuses them. The CSS would look something like the following, using positioning to move the link in and out of view.
[href='#main'] {
position: absolute;
top: -2rem;
}
[href='#main']:focus {
top: 0;
}
Do not use display: none
to hide the skip link, because then it will be unable to receive focus and never appear to the user.
The page language
Internationalization is an important aspect of inclusive design, especially since most of the web is accessible by anyone, from anywhere around the world.
By declaring a default language for the page, you help translation engines like Google Translate convert the content for audiences of different first languages. In addition, it tells screen readers which synthetic voice profile to use. Were a screen reader to read French text with a Dutch voice profile (for example) the words would be garbled.
Applying a default language is simple. Here is an British English example. Just "en
" would probably suffice, in fact.

If your page in mostly in English but has sections in different languages, you can switch into the relevant language on a case-by-case basis. For instance, if you were to quote Magritte, you can do this:

The artist Magritte famously said:

Ceci n'est pas une pipe

Sometimes, you will want to switch to a preferred font for the language — because that font has better support for the language's character set. For example, you can provide a preferred font for Arabic text:
[lang='ar'] {
font-family: Neue Helvetica Arabic, serif;
}
The viewport meta tag
The viewport meta tag is one of the corner stones of responsive web design, since it tells devices to display content appropriate to the device's vieport dimensions. Without width=device-width
, pages tend to 'zoom out', meaning content becomes unreadably small by default.
<meta name="viewport" content="width=device-width, initial-scale=1">
While a default scale is important, it's also imperative you allow the user to zoom the content in and out at their discretion. This helps sight impaired users read but can also be used to enlarge interactive controls, making operation easier for those with unsteady hands. You simply need to omit the value user-scalable=no
.
A note on simplicity
A well-structured web page, including all the provisions covered here, will perform better than one lacking in structural rigor. But even pages that are structurally sound will challenge readers and users where the sheer amount of information present is too large.
Commit to making concise and incisive content, and web pages that focus as much as possible on single subjects. Remove as many tangential and extraneous features, components, sections, and controls as possible. Simple interfaces benefit everyone.