1. Introduction
This document defines Document Policy, which is a framework for designing configurable features as part of the web platform, and for allowing web developers to configure those features as part of their site deployment.
2. Examples #
Needs new examples. For now, see explainer.
3. Other and related mechanisms
Document Policy is similar in scope to some existing mechanisms for document configuration, though there are significant differences from each.
3.1. Relation to Feature Policy
Feature Policy [FEATURE-POLICY] is another mechanism which allows authors to configure features in documents, and is similar in scope, though it uses a different inheritance mechanism, which makes it more suitable for certain types of features, separate from those which are suitable for control by document policy.
Historically, document policy was created as a response to a number of proposed feature additions to feature policy, which either didn’t quite fit the existing 'feature' model, or required significant additional complexity to be added to the feature policy spec. This included features with parameters, features with optional inheritance into subframes, and features which would inherit differently in popups than in other top-level browsing contexts.
Those features are now proposed to be covered by document policy, and feature policy is used for features where delegation is the primary concern. Feature policy features are boolean-valued (either enabled or disabled), can never be re-enabled in a child frame if disabled in parent, and generally follow the model of "available in top-level browsing contexts and their same-origin children; must be delegated to cross-origin frames."
In contrast, features controlled by document policy may take parameters, and those parameters may have unrelated values in different frames (constraining a feature in a parent frame does not necessarily constrain its child frames.)
3.2. Relation to Content Security Policy
Content-Security-Policy [CSP] also configures 'features' in documents, although it is primarily concerned with the origin of resources in a page, rather than controlling what those resources can do once loaded.
CSP also provides a different mechanism for setting sandbox flags on a document, through the sandbox directive. If sandbox flags are moved to document policy, then this may be redundant, as the two headers may encode identical information.
CSP-Embedded-Enforcement introduced a model for forcing a policy to be adhered to by child documents, and for rejecting non-conforming documents as network errors during Fetch. This model is adopted by document policy for the required policy mechanism.
3.3. Relation to Sandboxing
Iframe sandboxing is another mechanism for controlling features in documents, and behaves in a very similar manner to document policy’s required policies: disabling a feature is something that can be imposed on a frame, and affects all content loaded into that frame.
The features which are controlled by the iframe sandbox attribute could be expressed very naturally with document policy.
One key difference between iframe sandboxing and document policy is that all sandbox features are applied by default when the 'sandbox' attribute is used on a frame, and must be re-enabled one-by-one. This makes it very difficult to extend the sandboxing model with new features, as any additions will immediately affect all existing sandboxed content. Additionally, there is no mechanism for the origin server to know that its content will be sandboxed, so it is difficult to add new sandbox features which could potentially alter control flow in a sandboxed document, as this could introduce new security vulnerabilities in existing content.
4. Framework
4.1. Features
-
A name, which is a token,
-
A value type, which is either
boolean
,integer
,float
, orenum
, -
A value range, which is a subset of the possible values for the feature’s type, and
-
A default value, which is an element of the feature’s value range.
4.2. Policies
-
Browsing context has a required document policy, which is a document policy.
-
Browsing context has a nested context required document policy, which is a document policy.
-
Document has a declared document policy, which is a document policy.
A document policy is an ordered map from features to values.
-
A browsing context with a null opener browsing context has an empty required document policy.
4.3. Values
-
Policies have values for features
-
Values have domains
-
Domains have ordering
-
Examples: positive ints, floats, bools, enums
4.4. Default Values
-
features have default values.
-
(Non-normative) Defaults are chosen for web compatibility.
5. Required Policy Serialization
-
Explain here how required policies are serialized as structured headers.
-
Ensure that there is a canonical form (for compat testing).
6. Delivery
6.1. Policies as Structured Headers
Policies are represented in HTTP headers and in HTML attributes as the serialization of an sh-list structure. The list members are tokens, each corresponding to a policy directive. Each token may take a single parameter; the details of the parameter name and allowed values are determined by the value type of the feature which the token names.
6.1.1. Boolean-valued features
Boolean-valued features do not take any parameters. They may be expressed in headers by simply naming them, to enable the feature, or naming them with a prefix of 'no-', to disable the feature.
Examples:
-
boolean-feature
-
no-boolean-feature
6.1.2. Integer-valued features
Integer-valued features should have a single parameter, whose name is defined by the feature, and whose value should be an Integer. The range of Integers allowed should be defined by the feature.
Examples:
-
integer-feature;p=2
6.1.3. Float-valued features
Float-valued features should have a single parameter, whose name is defined by the feature, and whose value should be a Float. The range of Floats allowed should be defined by the feature.
Examples:
-
float-feature;q=-0.2
6.1.4. Enum-valued features
Enum-valued features should take a parameter with no value. The allowed values for the enum should be used as the parameter name.
Examples:
-
enum-feature;state
6.2. HTTP Headers
6.2.1. Document-Policy
The `Document-Policy
` HTTP
header can be used in the response (server to client) to communicate the document policy that should be enforced by the client.
The Document-Policy
header is a Structured Header. Its value
must be a list. Its ABNF is:
Document-Policy = sh-list
Each list element must be a token. If the token does not name a supported feature, (or a supported boolean feature prefixed by "no-",) then the list element must be ignored.
6.2.2. Require-Document-Policy
The `Require-Document-Policy
`
HTTP header field is a response header which is used to communicate to the
client the minimum required document policy to apply to all nested
content.
The Require-Document-Policy
header is a Structured Header list, with
exactly the same syntax as the Document-Policy
header.
6.2.3. Sec-Required-Document-Policy
The `Sec-Required-Document-Policy
`
HTTP header field is a request header which is used to communicate to the
server the document policy which must be sent with the document
returned with the request.
The header’s value is the § 5 Required Policy Serialization of one or more policy directives
6.3. The policy
attribute of the iframe
element
iframe
elements have a "policy
" attribute, which contains a required
policy directive (SH format).
7. Integrations
If a frame has a required policy, then that policy must be advertised in the request header for any outgoing document requests, to inform the server of the policy which will be applied to the document by the user agent. This allows the server to alter the representation which is returned, to conform to that policy.
In the case where a required policy request header is present, the response must contain a compatible document policy header, or the fetch will fail.
7.1. Integration with HTML
The following changes should be incorporated into [HTML]:
-
iframe
elements should have the following IDL added:
[CEReactions] attribute DOMString policy;
-
The iframe policy attribute should be defined as follows:
-
The
policy
attribute, when specified, adds a required document policy to theiframe
's nested browsing context, when it is initialized. Its value must be a serialized document policy.
-
-
In HTML 5 §3.1.1 The Document object, add the following line:
-
The Document has a document policy, which is a document policy, which is initially empty.
-
-
In the algorithm:
-
Add the following step after step 5:
-
Set browsingContext’s required document policy to the result of creating a required policy for a browsing context browsingContext.
-
-
Change step 9 (renumbered now to 10) to read:
-
Let document be a new Document, marked as an HTML document in quirks mode, whose content type is
"text/html"
, origin is origin, active sandboxing flag set is sandboxFlags, feature policy is feature policy, document policy is identical to browsingContext’s required document policy, and which is both ready for post-load tasks and completely loaded immediately.
-
-
-
In the process a navigate fetch algorithm:
-
Add the following step after step 5:
-
Set request’s required document policy to browsingContext’s required document policy.
-
-
-
In the algorithm:
-
Add the following step after step 3:
-
Let documentPolicy be the result of creating a document policy for browsingContext from response.
-
-
Change step 6 (renumbered now to 7) to read:
-
Let document be a new Document, whose type is type, content type is contentType, origin is origin, feature policy is featurePolicy, active sandboxing flag set is finalSandboxFlags, and document policy is documentPolicy.
-
-
7.2. Integration with Fetch
The following changes should be incorporated into [FETCH]:
-
In Fetch Standard §2.2.5 Requests, add the following:
-
A request has an associated required document policy, which is a document policy. Unless otherwise stated, it is null.
-
-
In Fetch Standard §4.5 HTTP-network-or-cache fetch, after step 15, insert the following:
-
If httpRequest has a required document policy, then
-
Let serializedRequiredPolicy be the result of calling Serialize Required Policy on httpRequest’s required document policy.
-
Append
Sec-Required-Document-Policy
/serializedRequiredPolicy to httpRequest’s header list.
-
-
-
In Fetch Standard §4.1 Main fetch, add the following algorithm to the list of algorithms in step 11:
-
Add the following algorithm to Fetch Standard §2.2.2 Headers:
-
To get and parse a structured header name as type from header list list, run these steps:
-
Let input be the result of getting name from list.
-
If input is null, then return null.
-
Let value be the result of running the Parsing Header Fields into Structured Headers algorithm with input as input_string and type as header_type. [HEADER-STRUCTURE]
-
If the previous step fails, return null.
-
Return value.
-
-
8. Algorithms
8.1. Is policy compatible?
Given a required document policy requiredPolicy and a declared document policy declaredPolicy, this algorithm returns true if declaredPolicy is compatible with requiredPolicy, or false otherwise.
-
For each feature → value in requiredPolicy:
-
If feature does not require acknowledgement, then continue.
-
If declaredPolicy[feature] does not exist, then return false.
-
If requiredPolicy[feature] is stricter than declaredPolicy[feature], then return false.
-
-
Return true.
8.2. Process response policy
Given a response (response), this algorithm returns a declared document policy.
-
Abort these steps if the response’s header list does not contain a header whose name is "
Document-Policy
". -
Let header be the concatenation of the values of all header fields in response’s header list whose name is "
Document-Policy
", separated by U+002C (,) (according to [RFC7230, 3.2.2]). -
Let document policy be the result of executing Parse document policy on header.
-
Return document policy.
8.3. Parse document policy
Given a string (policyString), this algorithm returns a document policy, if it can be parsed as one, or else fails.
-
Let policy be a new ordered map.
-
Let list be the result of parsing policyString as a list.
-
If parsing fails, then fail.
-
For each element in list,
-
If element is not a token, then fail
-
If element is the name of a supported feature which is a boolean feature, then
-
If element has any associated parameters, then fail.
-
Let feature be the supported feature with name element.
-
If policy[feature] exists, then continue with the next element.
-
Set policy[feature] to the boolean value true.
-
Continue with the next element.
-
-
If element begins with the string "no-", and the remaining characters match the name of a supported feature which is a boolean feature, then
-
If element has any associated parameters, then fail.
-
Let feature be the supported feature with name element.
-
If policy[feature] exists, then continue with the next element.
-
Set policy[feature] to the boolean value false.
-
Continue with the next element.
-
-
If element is the name of a supported feature, then
-
If element does not have exactly one parameter, then fail.
-
Let feature be the supported feature with name element.
-
If policy[feature] exists, then continue with the next element.
-
If feature is an enum-valued feature, then
-
If element’s parameter has a value, then fail.
-
Let value be the name of element’s parameter.
-
If value is not the name of one of features allowed enum values, then fail.
-
Let policy[feature] be the enum value named value.
-
Continue with the next element.
-
-
If element’s parameter’s name does not match feature’s parameter name, then fail.
-
Let value be the value of element’s parameter.
-
If feature is an integer-valued feature, then
-
If value is not an integer, then fail.
-
If value is not in feature’s range, then fail.
-
Let policy[feature] be the integer value value.
-
Continue with the next element.
-
-
If feature is an float-valued feature, then
-
If value is not a float, then fail.
-
If value is not in feature’s range, then fail.
-
Let policy[feature] be the float value value.
-
Continue with the next element.
 Serialize required policy
Given a document policy (requiredPolicy), this algorithm returns a string which represents the canonical serialization of the policy.
-
Let list be an empty sh-list
-
Let features be the keys of requiredPolicy
-
Sort features by the name of each element, in ASCII order.
-
For each feature in features:
-
If feature is a boolean-valued feature, then
-
If requiredPolicy[feature] is true, append feature’s name to list.
-
Otherwise, append the sh-token formed by concatenating the string "no-" and feature’s name to list.
-
-
Otherwise, if feature is an enum-valued feature, then
-
Let value be requiredPolicy[feature].
-
Let param be a parameter with param-name value and with no param-value.
-
Append an sh-item which is an sh-token formed from feature’s name, with the single parameter param, to list.
-
-
Otherwise,
-
Let value be requiredPolicy[feature].
-
Let param be a parameter with param-name being features’s parameter name, and with param-value value.
-
Append an sh-item which is an sh-token formed from feature’s name, with the single parameter param, to list.
-
-
-
Return the serialization of list.
8.5. Create a required policy for a browsing context
Given a browsing context (browsingContext), this algorithm returns a new Document Policy.
-
If browsingContext is a nested browsing context, then
-
Let requiredPolicy be a clone of browsingContext’s browsing context container’s nested context required document policy.
-
If browsingContext’s browsing context container has a "policy" attribute, then
-
Let somethingPolicy be the result of parsing the attribute
-
For each feature -> value in somethingPolicy:
-
If requiredPolicy[feature] does not exist, or if value is stricter than requiredPolicy[feature], then set requiredPolicy[feature] to value.
-
-
-
-
Otherwise, let requiredPolicy be a new ordered map.
-
return requiredPolicy.
8.6. Create a document Policy for a browsing context from response
Given a browsing context (browsingContext) and a response (response), this algorithm returns a new Document Policy.
-
Let requiredPolicy be the result of running Create a required policy for a browsing context given browsingContext.
-
Let declaredPolicy be the result of running Process response policy on response.
-
If declaredPolicy is compatible with requiredPolicy, then return declaredPolicy.
-
Throw an exception.
8.7. Should response to request be blocked due to document policy?
-
If request has a required document policy, then
-
Let documentPolicy be the result of getting and parsing the structured header
Document-Policy
as "list" from response’s header list. -
If documentPolicy is not compatible with request’s required document policy, return "blocked".
-
Return "valid".
-
8.8. Get policy value for feature in document
Given a feature (feature) and a Document
object (document), this
algorithm the value for feature in document’s document policy.
-
Let policy be document’s Document Policy.
-
If policy[feature] exists, return it.
-
Return feature’s default value.
9. IANA Considerations
The permanent message header field registry should be updated with the following registrations [RFC3864]:
- Header field name
- Document-Policy
- Applicable protocol
- http
- Status
- standard
- Author/Change controller
- W3C
- Specification document
- Document Policy API
- Header field name
- Require-Document-Policy
- Applicable protocol
- http
- Status
- standard
- Author/Change controller
- W3C
- Specification document
- Document Policy API
- Header field name
- Sec-Required-Document-Policy
- Applicable protocol
- http
- Status
- standard
- Author/Change controller
- W3C
- Specification document
- Document Policy API
10. Privacy and Security
This is going to be very similar to feature policy, with these notes:
-
Opt-in generally required to enable enforcement in subframes.
-
Policy attribute may conflict with sandbox attribute
-
Observability? Yes, still. Take care when designing features that their effects cannot be seen across origin boundaries.
-
Take care in creating non-reflect features
This specification standardizes a mechanism for an embedding page to set a
policy which will be enforced on an embedded page. When explicit
acknowlegement of a required policy is not required, similar to iframe sandbox
, this means that behaviors of existing features may be
changed in published web sites, by embedding them in another document with an
appropriate required policy.
As such, the biggest privacy and security concerns are:
-
Exposure of behavior in a cross-origin subframe to its embedder.
-
Unanticipated behavior changes in subframes controlled by the embedder.
To a degree, these concerns are already present in the web platform, and this specification attempts to at least not make them needlessly worse.
Security and privacy issues may also be caused by the design of individual features, so care must be taken when integrating with this specification. This section attempts to provide some guidance as to what kinds of behaviors could cause such issues.
10.1. Exposure of cross-origin behavior {#exposure-of-cross-origin-behavior}
Features should be designed such that a violation of the policy in a framed document is not observable by documents in other frames. For instance, a hypothetical feature which caused a event to be fired in the embedding document if it is used while disabled by policy, could be used to extract information about the state of an embedded document. If the feature is known only to be used while a user is logged in to the site, for instance, then the embedder could disable that feature for the frame, and then listen for the resulting events to determine whether or not the user is logged in.
10.2. Unanticipated behavior changes
Document policy grants a document the ability to control which features will and will not be availble in a subframe at the time it is loaded. When a feature represents an existing, long-standing behavior of the web platform, this may mean that existing published content on the web was not written with the expectation that a particular API could fail.
-
Mitigated by requiring opt-in
-
non-opt-in features have issues similar to sandbox.
-
Reference FP section
10.3. Advertisement of required policy
-
May leak details of embedder headers or markup.


plastid Cuscuta genes intron genome reflexa RNA editing gronovii gene parasitic plant photosynthetic species Plant plants rps DNA group {border-style > px;} rpl #ffffff;} introns land sequence sites splicing chloroplast loss tobacco genomes Biol coding conserved promoter tRNA virginiana ycf (.) (Table ./BF encoded expression (Fig. Epifagus Mol PCR analysis gronovii. transcription changes chloroplasts chromosome different gronovii, higher plastids polymerase protein single activity clpP codon copy matK nuclear-encoded position ribosomal adaptation capacity edited genus known px; region retained species, {font-family Cell IIA Nicotiana PEP Sugiura amino chromosomes complete font-size functional host indicate lifestyle losses plants. reduction regions tRNAs tabacum (intron Germany). Physiol Sci Table acid apparatus double; evolution genome, holoparasitic inverted large lost non-parasitic number performed plastid-encoded potential proteins rbcL reduced sequenced sequences shown site small tCa transcribed Berg Chloroplast Embo Gene Genet However, Krause Krupinska Palmer Plastid RT-PCR Wakasugi Wolfe achlorophyllous bold border-color border-width box compared data factor flowering genes, indicates inversions ndh non-photosynthetic observed photosynthesis-related plants, present promoters range reflexa, reflexa. responsible size solid; start structure translation trnK-uuu typical using {font-style {font-weight Börner Curr Cuscuta. Figure Haberhausen Hess Kit Kössel Morden NEP Planta Poltnigg Res [bp] case completely containing content corresponding courier; deletion eliminated em; far genes. genomes, high highly hybridization import imported investigated kbp lack levels mainly missing non-coding nuclear operon order parasitism parts petB photosynthesis products pseudogenes pt;} repeat required rpo rpoC rps- rrn set shows significant significantly similar subunits tissue transfer virginiana,


This is a simple Page Application using AngularJs, BootStrap, HTML5, CSS3 as a Front End. The back end is ASP.NET 5


"PATARA "a city on the south-west coast of Lycia at which Paul landed on his return from his third missionary journey (Acts 21:1, 2). Here he found a larger vessel, which was about to sail across the open sea to the coast of Phoenicia. In this vessel he set forth, and reached the city of Tyre in perhaps two or three days.
"PATARA "a city on the south-west coast of Lycia at which Paul landed on his return from his third missionary journey (Acts 21:1, 2). Here he found a larger vessel, which was about to sail across the open sea to the coast of Phoenicia. In this vessel he set forth, and reached the city of Tyre in perhaps two or three days.


Crime
Deteriorating economic conditions and rising unemployment have contributed to the gravely intensified incidents of crime, in particular violent crime, in The Bahamas. In addition to its devastating social impact on communities, rising crime levels constitute a critical threat to the economy, domestic and foreign sectors. It is particularly harmful to tourism, the economy’s principal driver, which is influenced by even the perception of crime.
- State of the Nation Report, page 77
Conviction rates are low and there have been reports of “inadequate institutional capacity”. State of the Nation Report, page 35
“The U.S. State Department gave The Bahamas a crime rating of ‘critical.’ While not a warning, Canada reminded its travelers to ‘exercise a high degree of caution due to high rates of crime, especially in Nassau’. One reason attributed to the high crime rates is the delay in administering justice…” State of the Nation Report, page 39
These kind of travel warnings have become commonplace and many visitors have been vocal about violent incidents and poor service they have received. This issue has gone largely unaddressed.
The United States Department of State heads the Overseas Security Advisory Council (OSAC) which releases annual reports on crime in the Bahamas. You can find the latest report here. Reports go back until 2012.


Subscribe to the EDU-UNIVERSAL channel for more action, romantic,adventure, musicals, drama films and series
Please leave us a comment


url(http://4.bp.blogspot.com/-8nPtC07s9CI/UAgCjRR8DLI/AAAAAAAABjE/D2Ra13Gzbmw/s1600/metal+gear+solid+mgs+snake+eater+ending+big+boss+the+boss+wallpaper+background+konami+action+stealth.jpg); background-repeat:no-repeat;
url(http://4.bp.blogspot.com/-8nPtC07s9CI/UAgCjRR8DLI/AAAAAAAABjE/D2Ra13Gzbmw/s1600/metal+gear+solid+mgs+snake+eater+ending+big+boss+the+boss+wallpaper+background+konami+action+stealth.jpg) no-repeat
Krux wrote:even in Edit Post, those spaces aren't there. I see what ur talking about, but i can't remove them and they're not in bblog.
....anyways, how do i adjust my background to fill the screen and not move while scrolling?
url(http://4.bp.blogspot.com/-8nPtC07s9CI/UAgCjRR8DLI/AAAAAAAABjE/D2Ra13Gzbmw/s1600/metal+gear+solid+mgs+snake+eater+ending+big+boss+the+boss+wallpaper+background+konami+action+stealth.jpg) no-repeat fixed center
Krux wrote:my resolution has been in my first post....
and assuming i find that image in a larger rez, how would i force it to not move when scrolling? (keeping the image in place)
Krux wrote:my resolution has been in my first post....
Krux wrote:and assuming i find that image in a larger rez, how would i force it to not move when scrolling? (keeping the image in place)
Krux wrote:my resolution has been in my first post....
and assuming i find that image in a larger rez, how would i force it to not move when scrolling? (keeping the image in place)
url("http://4.bp.blogspot.com/-8nPtC07s9CI/UAgCjRR8DLI/AAAAAAAABjE/D2Ra13Gzbmw/s1600/metal+gear+solid+mgs+snake+eater+ending+big+boss+the+boss+wallpaper+background+konami+action+stealth.jpg") no-repeat top transparent
Brady_The wrote:Krux wrote:my resolution has been in my first post....
Sorry.
Krux wrote:and assuming i find that image in a larger rez, how would i force it to not move when scrolling? (keeping the image in place)
I might got you wrong on that point. Do you want the image to scroll with you or stay on top with the default background color when the picture ends (1050px)?
url("http://4.bp.blogspot.com/-8nPtC07s9CI/UAgCjRR8DLI/AAAAAAAABjE/D2Ra13Gzbmw/s1600/metal+gear+solid+mgs+snake+eater+ending+big+boss+the+boss+wallpaper+background+konami+action+stealth.jpg") fixed no-repeat top transparent
juress wrote:url("http://4.bp.blogspot.com/-8nPtC07s9CI/UAgCjRR8DLI/AAAAAAAABjE/D2Ra13Gzbmw/s1600/metal+gear+solid+mgs+snake+eater+ending+big+boss+the+boss+wallpaper+background+konami+action+stealth.jpg") fixed no-repeat top transparent


---
layout: post
title: 'Agile 2009: Agile by the numbers - what people are doing'
date: 2009-08-29 00:00:00
category: software-development
---
"Agile by the numbers - what people are doing" was a talk by the enjoyable spikey Scott Ambler. Scott had been running some surveys to try and get to the bottom of what agile teams were actually doing - as opposed to what they claimed to be doing. Scott hypothesised that there's a bit of a macho developer culture which perhaps inhibits the ready dissemination of truth :)
His findings:
- 76% of organisations "do agile" - it's not a marginal practice any more;
- Within these organisations, only 44% of the teams are "doing agile" (he doesn't try and define what this actually means, this is according to the teams definition of agile);
- Teams of up to 10 developers tend to succeed more: agile seems to be easier with smaller teams. But that said, there are lots of people succeeding with larger teams;
- Most agile processes *are* empirical;
- 3/4 of teams using agile are doing legacy projects - i.e. it's not only used for greenfield development;
- Only 42% of agile teams are colocated - another 42% are driving distance or further apart;
- 56% of agile teams produce documentation in the form of a "vision document";
- The average agile project takes 3.9 weeks to warm up, before code starts being written - developers aren't typically diving into building stuff immediately;
- According to a fairly exhaustive DDJ survey, agile works better than other methods;
- 70% of projects are accurate to within 30% of their best estimate. The other 30% of projects are less accurate. But most businesses require projects to be accurate to within 9% of the original estimate;


14.12 Related Topics
- Lossy compression
-
A broad class of approaches to data
compression that do not produce an exact copy of the
original data when the data is uncompressed. Lossy
compression is useful primarily in graphics and sound
applications, where a certain loss of accuracy is acceptable
in exchange for greater compression ratios, provided the
degradation is carefully managed.
- Statistical modeling
-
The engine behind data compression methods
based on minimum redundancy coding. This chapter worked with
an order-0 model, which
simply determines the probability of any one symbol
occurring in the data. Higher-order models look at the
probabilities associated with combinations of symbols to get
a more accurate determination of the data's entropy. For
example, if we encounter the symbol "Q" in text data, in
many languages the probability is high that the next symbol
will be "U." Higher-order models take considerations like
this into account.
- Shannon-Fano coding
-
The first form of minimum redundancy
coding. Interestingly, it came about in the 1940s, apart
from computers, as a result of experiments in information
theory during World War II. Shannon-Fano coding is similar
to Huffman coding, but it builds its tree from the top down
instead of the bottom up.
- Adaptive Huffman coding
-
A variation of Huffman coding that does not
require that the table of frequencies be passed along with
the compressed data. Instead, a statistical model is adapted as the data is compressed
and uncompressed. The main benefit of adaptive Huffman
coding is in using statistical models greater than the
order-0 model described earlier. An order-0 model does not
require much space, but the substantial space requirements
of higher-order models make prepending a table
impractical.
- Arithmetic coding
-
A popular method of data compression that
addresses the inaccuracies in Huffman coding brought about
by entropies that are fractional values of bits. Arithmetic
coding avoids this by encoding data as a single, very long
floating-point value that can be uniquely decoded.
- LZ78 (
Lempel-Ziv-1978) and LZW (Lempel-Ziv-Welch) compression
-
Variations of LZ77 that use more effective
methods than a sliding window to keep track of previously
seen phrases. Generally, each method uses some type of data
structure for efficient searching, such as a hash table (Chapter
8), a binary tree (see Chapter
9), or a trie (see the related topics at the end of Chapter
9), and applies some unique approach to optimizing the
process of encoding and decoding phrases.
|


Modules in pybert package¶
pybert - Main PyBERT class definition, as well as some helper classes.¶
Bit error rate tester (BERT) simulator, written in Python.
Original Author: David Banas<EMAIL_ADDRESS>Original Date: 17 June 2014
Testing by: Mark Marlett<EMAIL_ADDRESS>This Python script provides a GUI interface to a BERT simulator, which can be used to explore the concepts of serial communication link design.
Copyright (c) 2014 by David Banas; All rights reserved World wide.
-
class
pybert.pybert.
PyBERT
(run_simulation=True)[source]¶ A serial communication link bit error rate tester (BERT) simulator with a GUI interface.
Useful for exploring the concepts of serial communication link design.
Initial plot setup occurs here.
In order to populate the data structure we need to construct the plots, we must run the simulation.
Parameters: run_simulation (Bool) – If true, run the simulation, as part of class initialization. This is provided as an argument for the sake of larger applications, which may be importing PyBERT for its attributes and methods, and may not want to run the full simulation. (Optional; default = True) -
calc_chnl_h
()[source]¶ Calculates the channel impulse response.
- Also sets, in ‘self’:
- chnl_dly:
group delay of channel
- start_ix:
first element of trimmed response
- t_ns_chnl:
the x-values, in ns, for plotting ‘chnl_h’
- chnl_H:
channel frequency response
- chnl_s:
channel step response
- chnl_p:
channel pulse response
-
-
class
pybert.pybert.
TxOptThread
(group=None, target=None, name=None, args=(), kwargs=None, verbose=None)[source]¶ Used to run Tx tap weight optimization in its own thread, in order to preserve GUI responsiveness.
This constructor should always be called with keyword arguments. Arguments are:
group should be None; reserved for future extension when a ThreadGroup class is implemented.
target is the callable object to be invoked by the run() method. Defaults to None, meaning nothing is called.
name is the thread name. By default, a unique name is constructed of the form “Thread-N” where N is a small decimal number.
args is the argument tuple for the target invocation. Defaults to ().
kwargs is a dictionary of keyword arguments for the target invocation. Defaults to {}.
If a subclass overrides the constructor, it must make sure to invoke the base class constructor (Thread.__init__()) before doing anything else to the thread.
-
class
pybert.pybert.
RxOptThread
(group=None, target=None, name=None, args=(), kwargs=None, verbose=None)[source]¶ Used to run Rx tap weight optimization in its own thread, in order to preserve GUI responsiveness.
This constructor should always be called with keyword arguments. Arguments are:
group should be None; reserved for future extension when a ThreadGroup class is implemented.
target is the callable object to be invoked by the run() method. Defaults to None, meaning nothing is called.
name is the thread name. By default, a unique name is constructed of the form “Thread-N” where N is a small decimal number.
args is the argument tuple for the target invocation. Defaults to ().
kwargs is a dictionary of keyword arguments for the target invocation. Defaults to {}.
If a subclass overrides the constructor, it must make sure to invoke the base class constructor (Thread.__init__()) before doing anything else to the thread.
-
class
pybert.pybert.
CoOptThread
(group=None, target=None, name=None, args=(), kwargs=None, verbose=None)[source]¶ Used to run co-optimization in its own thread, in order to preserve GUI responsiveness.
This constructor should always be called with keyword arguments. Arguments are:
group should be None; reserved for future extension when a ThreadGroup class is implemented.
target is the callable object to be invoked by the run() method. Defaults to None, meaning nothing is called.
name is the thread name. By default, a unique name is constructed of the form “Thread-N” where N is a small decimal number.
args is the argument tuple for the target invocation. Defaults to ().
kwargs is a dictionary of keyword arguments for the target invocation. Defaults to {}.
If a subclass overrides the constructor, it must make sure to invoke the base class constructor (Thread.__init__()) before doing anything else to the thread.
pybert_cntrl - Model control logic.¶
Default controller definition for PyBERT class.
Original author: David Banas<EMAIL_ADDRESS>Original date: August 24, 2014 (Copied from `pybert.py’, as part of a major code cleanup.)
Copyright (c) 2014 David Banas; all rights reserved World wide.
-
pybert.pybert_cntrl.
my_run_sweeps
(self)[source]¶ Runs the simulation sweeps.
Parameters: self (PyBERT) – Reference to an instance of the PyBERT class.
-
pybert.pybert_cntrl.
my_run_simulation
(self, initial_run=False, update_plots=True)[source]¶ Runs the simulation.
Parameters: - self (PyBERT) – Reference to an instance of the PyBERT class.
- initial_run (Bool) – If True, don’t update the eye diagrams, since they haven’t been created, yet. (Optional; default = False.)
- update_plots (Bool) – If True, update the plots, after simulation completes. This option can be used by larger scripts, which import pybert, in order to avoid graphical back-end conflicts and speed up this function’s execution time. (Optional; default = True.)
pybert_view - Main GUI window layout definition.¶
Default view definition for PyBERT class.
Original author: David Banas<EMAIL_ADDRESS>Original date: August 24, 2014 (Copied from `pybert.py’, as part of a major code cleanup.)
Copyright (c) 2014 David Banas; all rights reserved World wide.
-
class
pybert.pybert_view.
MyHandler
[source]¶ This handler is instantiated by the View and handles user button clicks.
-
class
pybert.pybert_view.
RunSimThread
(group=None, target=None, name=None, args=(), kwargs=None, verbose=None)[source]¶ Used to run the simulation in its own thread, in order to preserve GUI responsiveness.
This constructor should always be called with keyword arguments. Arguments are:
group should be None; reserved for future extension when a ThreadGroup class is implemented.
target is the callable object to be invoked by the run() method. Defaults to None, meaning nothing is called.
name is the thread name. By default, a unique name is constructed of the form “Thread-N” where N is a small decimal number.
args is the argument tuple for the target invocation. Defaults to ().
kwargs is a dictionary of keyword arguments for the target invocation. Defaults to {}.
If a subclass overrides the constructor, it must make sure to invoke the base class constructor (Thread.__init__()) before doing anything else to the thread.
pybert_util - Various utilities used by other modules.¶
General purpose utilities for PyBERT.
Original author: David Banas<EMAIL_ADDRESS>Original date: September 27, 2014 (Copied from `pybert_cntrl.py’.)
Copyright (c) 2014 David Banas; all rights reserved World wide.
-
pybert.pybert_util.
moving_average
(a, n=3)[source]¶ Calculates a sliding average over the input vector.
Parameters: - a ([float]) – Input vector to be averaged.
- n (int) – Width of averaging window, in vector samples. (Optional; default = 3.)
- Returns: the moving average of the input vector, leaving the input
- vector unchanged.
-
pybert.pybert_util.
find_crossing_times
(t, x, min_delay=0.0, rising_first=True, min_init_dev=0.1, thresh=0.0)[source]¶ Finds the threshold crossing times of the input signal.
Parameters: - t ([float]) – Vector of sample times. Intervals do NOT need to be uniform.
- x ([float]) – Sampled input vector.
- min_delay (float) – Minimum delay required, before allowing crossings. (Helps avoid false crossings at beginning of signal.) (Optional; default = 0.)
- rising_first (bool) – When True, start with the first rising edge found. (Optional; default = True.) When this option is True, the first rising edge crossing is the first crossing returned. This is the desired behavior for PyBERT, because we always initialize the bit stream with [0, 0, 1, 1], in order to provide a known synchronization point for jitter analysis.
- min_init_dev (float) – The minimum initial deviation from zero, which must be detected, before searching for crossings. Normalized to maximum input signal magnitude. (Optional; default = 0.1.)
- thresh (float) – Vertical crossing threshold.
Returns: an array of signal threshold crossing times.
-
pybert.pybert_util.
find_crossings
(t, x, amplitude, min_delay=0.0, rising_first=True, min_init_dev=0.1, mod_type=0)[source]¶ Finds the crossing times in a signal, according to the modulation type.
Parameters: - t ([float]) – The times associated with each signal sample.
- x ([float]) – The signal samples.
- amplitude (float) – The nominal signal amplitude. (Used for determining thresholds, in the case of some modulation types.)
- min_delay (float) – The earliest possible sample time we want returned. (Optional; default = 0.)
- rising_first (bool) – When True, start with the first rising edge found. When this option is True, the first rising edge crossing is the first crossing returned. This is the desired behavior for PyBERT, because we always initialize the bit stream with [0, 1, 1], in order to provide a known synchronization point for jitter analysis. (Optional; default = True.)
- min_init_dev (float) – The minimum initial deviation from zero, which must be detected, before searching for crossings. Normalized to maximum input signal magnitude. (Optional; default = 0.1.)
- mod_type (int) – The modulation type. Allowed values are: {0: NRZ, 1: Duo-binary, 2: PAM-4} (Optional; default = 0.)
Returns: The signal threshold crossing times.
-
pybert.pybert_util.
calc_jitter
(ui, nui, pattern_len, ideal_xings, actual_xings, rel_thresh=6, num_bins=99, zero_mean=True)[source]¶ Calculate the jitter in a set of actual zero crossings, given the ideal crossings and unit interval.
Inputs:
- ui : The nominal unit interval.
- nui : The number of unit intervals spanned by the input signal.
- pattern_len : The number of unit intervals, before input symbol stream repeats.
- ideal_xings : The ideal zero crossing locations of the edges.
- actual_xings : The actual zero crossing locations of the edges.
- rel_thresh : (optional) The threshold for determining periodic jitter spectral components (sigma).
- num_bins : (optional) The number of bins to use, when forming histograms.
- zero_mean : (optional) Force the mean jitter to zero, when True.
Outputs:
- jitter : The total jitter.
- t_jitter : The times (taken from ‘ideal_xings’) corresponding to the returned jitter values.
- isi : The peak to peak jitter due to intersymbol interference.
- dcd : The peak to peak jitter due to duty cycle distortion.
- pj : The peak to peak jitter due to uncorrelated periodic sources.
- rj : The standard deviation of the jitter due to uncorrelated unbounded random sources.
- tie_ind : The data independent jitter.
- thresh : Threshold for determining periodic components.
- jitter_spectrum : The spectral magnitude of the total jitter.
- tie_ind_spectrum : The spectral magnitude of the data independent jitter.
- spectrum_freqs : The frequencies corresponding to the spectrum components.
- hist : The histogram of the actual jitter.
- hist_synth : The histogram of the extrapolated jitter.
- bin_centers : The bin center values for both histograms.
-
pybert.pybert_util.
make_uniform
(t, jitter, ui, nbits)[source]¶ Make the jitter vector uniformly sampled in time, by zero-filling where necessary.
The trick, here, is creating a uniformly sampled input vector for the FFT operation, since the jitter samples are almost certainly not uniformly sampled. We do this by simply zero padding the missing samples.
Inputs:
- t : The sample times for the ‘jitter’ vector.
- jitter : The input jitter samples.
- ui : The nominal unit interval.
- nbits : The desired number of unit intervals, in the time domain.
Output:
- y : The uniformly sampled, zero padded jitter vector.
- y_ix : The indices where y is valid (i.e. - not zero padded).
-
pybert.pybert_util.
calc_gamma
(R0, w0, Rdc, Z0, v0, Theta0, ws)[source]¶ Calculates propagation constant from cross-sectional parameters.
The formula’s applied are taken from Howard Johnson’s “Metallic Transmission Model” (See “High Speed Signal Propagation”, Sec. 3.1.)
- Inputs:
- R0 skin effect resistance (Ohms/m)
- w0 cross-over freq.
- Rdc d.c. resistance (Ohms/m)
- Z0 characteristic impedance in LC region (Ohms)
- v0 propagation velocity (m/s)
- Theta0 loss tangent
- ws frequency sample points vector
- Outputs:
- gamma frequency dependent propagation constant
- Zc frequency dependent characteristic impedance
-
pybert.pybert_util.
calc_G
(H, Rs, Cs, Zc, RL, Cp, CL, ws)[source]¶ Calculates fully loaded transfer function of complete channel.
- Inputs:
- H unloaded transfer function of interconnect
- Rs source series resistance
- Cs source parallel (parasitic) capacitance
- Zc frequency dependent characteristic impedance of the interconnect
- RL load resistance (differential)
- Cp load parallel (parasitic) capacitance (single ended)
- CL load series (d.c. blocking) capacitance (single ended)
- ws frequency sample points vector
- Outputs:
- G frequency dependent transfer function of channel
-
pybert.pybert_util.
calc_eye
(ui, samps_per_ui, height, ys, y_max, clock_times=None)[source]¶ Calculates the “eye” diagram of the input signal vector.
Parameters: - ui (float) – unit interval (s)
- samps_per_ui (int) – # of samples per unit interval
- height (int) – height of output image data array
- ys ([float]) – signal vector of interest
- y_max (float) – max. +/- vertical extremity of plot
Keyword Arguments: clock_times ([float]) – (optional) vector of clock times to use for eye centers. If not provided, just use mean zero-crossing and assume constant UI and no phase jumps. (This allows the same function to be used for eye diagram creation, for both pre and post-CDR signals.)
- Returns: The “heat map” representing the eye diagram. Each grid
- location contains a value indicating the number of times the signal passed through that location.
-
pybert.pybert_util.
make_ctle
(rx_bw, peak_freq, peak_mag, w, mode='Passive', dc_offset=0)[source]¶ Generate the frequency response of a continuous time linear equalizer (CTLE), given the:
- signal path bandwidth,
- peaking specification
- list of frequencies of interest, and
- operational mode/offset.
We use the ‘invres()’ function from scipy.signal, as it suggests itself as a natural approach, given our chosen use model of having the user provide the peaking frequency and degree of peaking.
That is, we define our desired frequency response using one zero and two poles, where:
- The pole locations are equal to:
- the signal path natural bandwidth, and
- the user specified peaking frequency.
The zero location is chosen, so as to provide the desired degree of peaking.
Inputs:
rx_bw The natural (or, unequalized) signal path bandwidth (Hz).
- peak_freq The location of the desired peak in the frequency
response (Hz).
peak_mag The desired relative magnitude of the peak (dB). (mag(H(0)) = 1)
w The list of frequencies of interest (rads./s).
- mode The operational mode; must be one of:
- ‘Off’ : CTLE is disengaged.
- ‘Passive’: Maximum frequency response has magnitude one.
- ‘AGC’ : Automatic gain control. (Handled by calling routine.)
- ‘Manual’ : D.C. offset is set manually.
- dc_offset The d.c. offset of the CTLE gain curve (dB).
(Only valid, when ‘mode’ = ‘Manual’.)
Outputs:
- w, H The resultant complex frequency response, at the
given frequencies.
-
pybert.pybert_util.
trim_impulse
(g, Ts=0, chnl_dly=0, min_len=0, max_len=1000000)[source]¶ - Trim impulse response, for more useful display, by:
- eliminating 90% of the overall delay from the beginning, and
- clipping off the tail, after 99.8% of the total power has been captured. (Using 99.9% was causing problems; I don’t know why.)
Inputs:
- g impulse response
- Ts (optional) sample interval (same units as ‘chnl_dly’)
- chnl_dly (optional) channel delay
- min_len (optional) minimum length of returned vector
- max_len (optional) maximum length of returned vector
Outputs:
- g_trim trimmed impulse response
- start_ix index of first returned sample
pybert_plot - Plot definitions for the PyBERT GUI.¶
Plot definitions for PyBERT class.
Original author: David Banas<EMAIL_ADDRESS>Original date: February 21, 2015 (Copied from `pybert.py’, as part of a major code cleanup.)
Copyright (c) 2015 David Banas; all rights reserved World wide.
pybert_help - Contents of the Help tab of the PyBERT GUI.¶
User instructions for PyBERT class.
Original author: David Banas<EMAIL_ADDRESS>Original date: April 15, 2015 (Copied from `pybert.py’.)
Copyright (c) 2015 David Banas; all rights reserved World wide.
dfe - DFE behavioral model.¶
Behavioral model of a decision feedback equalizer (DFE).
Original Author: David Banas<EMAIL_ADDRESS>Original Date: 17 June 2014
This Python script provides a behavioral model of a decision feedback equalizer (DFE). The class defined, here, is intended for integration into the larger PyBERT framework.
Copyright (c) 2014 by David Banas; All rights reserved World wide.
-
class
pybert.dfe.
LfilterSS
(b, a)[source]¶ A single steppable version of scipy.signal.lfilter().
Parameters: - b ([float]) – Coefficients of the numerator of the rational transfer function.
- a ([float]) – Coefficients of the denominator of the rational transfer function.
-
class
pybert.dfe.
DFE
(n_taps, gain, delta_t, alpha, ui, n_spb, decision_scaler, mod_type=0, bandwidth=100000000000.0, n_ave=10, n_lock_ave=500, rel_lock_tol=0.01, lock_sustain=500, ideal=True)[source]¶ Behavioral model of a decision feedback equalizer (DFE).
Inputs:
Required:
n_taps # of taps in adaptive filter
gain adaptive filter tap weight correction gain
delta_t CDR proportional branch constant (ps)
alpha CDR integral branch constant (normalized to delta_t)
ui nominal unit interval (ps)
n_spb # of samples per unit interval
- decision_scaler multiplicative constant applied to the result of
the sign function, when making a “1 vs. 0” decision. Sets the target magnitude for the DFE.
Optional:
- mod_type The modulation type:
- 0: NRZ
- 1: Duo-binary
- 2: PAM-4
bandwidth The bandwidth, at the summing node (Hz).
- n_ave The number of averages to take, before adapting.
(Also, the number of CDR adjustments per DFE adaptation.)
- n_lock_ave The number of unit interval estimates to
consider, when determining locked status.
rel_lock_tol The relative tolerance for determining lock.
- lock_sustain Length of the histerysis vector used for
lock flagging.
ideal Boolean flag. When true, use an ideal summing node.
Raises: Exception
– If the requested modulation type is unknown.-
decide
(x)[source]¶ Make the bit decisions, according to modulation type.
Parameters: x (float) – The signal value, at the decision time. Returns: tuple – The members of the returned tuple are: - decision:
- One of:
- {-1, 1} (NRZ)
- {-1, 0, +1} (Duo-binary)
- {-1, -1/3, +1/3, +1} (PAM-4)
according to what the ideal signal level should have been. (‘decision_scaler’ normalized)
bits: The list of bits recovered.
Return type: float, [int] Raises: Exception
– If the requested modulation type is unknown.
-
run
(sample_times, signal)[source]¶ Run the DFE on the input signal.
Parameters: - sample_times ([float]) – Vector of time values at wich corresponding signal values were sampled.
- signal ([float]) – Vector of sampled signal values.
Returns: tuple – The members of the returned tuple, in order, are:
- res([float]):
Samples of the summing node output, taken at the times given in sample_times.
- tap_weights([[float]]):
List of list of tap weights showing how the DFE adapted over time.
- ui_ests([float]):
List of unit interval estimates, showing how the CDR adapted.
- clocks([int]):
List of mostly zeros with ones at the recovered clocking instants. Useful for overlaying the clock times on signal waveforms, in plots.
- lockeds([bool]):
List of Booleans indicating state of CDR lock.
- clock_times([float]):
List of clocking instants, as recovered by the CDR.
- bits([int]):
List of recovered bits.
Return type: ([float], [[float]], [float], [int], [bool], [float], [int]
Raises: Exception
– If the requested modulation type is unknown.
-
step
(decision, error, update)[source]¶ Step the DFE, according to the new decision and error inputs.
Parameters: - decision (float) – Current slicer output.
- error (float) – Difference between summing node and slicer outputs.
- update (bool) – If true, update tap weights.
Returns: res – New backward filter output value.
Return type: float
cdr - CDR behavioral model.¶
Behavioral model of a “bang-bang” clock data recovery (CDR) unit.
Original Author: David Banas<EMAIL_ADDRESS>Original Date: 17 June 2014
This Python script provides a behavioral model of a “bang-bang” clock data recovery (CDR) unit. The class defined, here, is intended for integration into the larger PyBERT framework.
Copyright (c) 2014 by David Banas; All rights reserved World wide.
-
class
pybert.cdr.
CDR
(delta_t, alpha, ui, n_lock_ave=500, rel_lock_tol=0.01, lock_sustain=500)[source]¶ A class providing behavioral modeling of a ‘bang- bang’ clock data recovery (CDR) unit.
Parameters: - delta_t (float) – The proportional branch correction, in seconds.
- alpha (float) – The integral branch correction, normalized to proportional branch correction.
- ui (float) – The nominal unit interval, in seconds.
- n_lock_ave (Optional, int) – Number of unit intervals to use for determining lock. Defaults to 500.
- rel_lock_tol (Optional, float) – Lock tolerance, relative to delta_t. Defaults to 0.01.
- lock_sustain (Optional, int) – Length of lock sustain vector used to provide histerysis. Defaults to 500.
Notes
The code does not care what units are actually used for ‘delta_t’ and ‘ui’; only that they are the same.
-
adapt
(samples)[source]¶ Adapt period/phase, according to 3 samples.
Should be called, when the clock has just struck.
- Synopsis:
- (ui, locked) = adapt(samples)
Parameters: samples ([float]) – A list of 3 samples of the input waveform, as follows:
- at the last clock time
- at the last unit interval boundary time
- at the current clock time
Returns: tuple – - ui:
- The new unit interval estimate, in seconds.
- locked:
- Boolean flag indicating ‘locked’ status.
Return type: float, bool
-
locked
¶ The current locked state.
-
ui
¶ The current unit interval estimate.


William Pansky
Front-end web developer and graphic designer with ability to solve complex website interface problems through creative and UX-minded solutions.
Projects
-
GoHugo.io stand-alone site for Goodwill Dallas' annual fundraising event, THE LUNCH.
-
illusiveapparel.website
Wordpress website powered by WooCommerce for Dallas apparel boutique. (Case study coming soon; view the local static version) of the project.
-
giftwrapcreations.com
Wordpress website for Dallas gift wrapping artist, Anita Ivancevic. (Case study coming soon; view the local static version) of the project.
-
miller.agency
Wordpress website for Dallas full-service ad agency, Miller Ad Agency. (Case study coming soon; view the local static version) of the project.
-
DNN website for the Dallas branch of national NPO, Goodwill Industries.
-
Simple boilerplate repo for how I generally organize my project assets; installable via Bower CLI.
-
A plethora of designs hosted externally on my Behance profile.
CodePens
-
Megamenu concept for Credit Union of Texas.
-
Popin info/cta for new banking information for Credit Union of Texas.
-
Development pen for Credit Union of Texas location listing; using: github.com/desandro/masonry.
-
Velocity.js - Mobile Sidebar Menu
-
Velocity.js — Intro Animations
-
Experimenting with new ways to display projects on the next iteration of my personal portfolio site; trying to go beyond the ol' "image-with-hover-effect" now that I'm transitioning from design to development.
-
Interactive fixed-footer newsletter signup form via MailChimp for Miller Ad Agency.


One of the key features of Object-oriented programming is encapsulation. Because of encapsulation, we generally have _________ instance variables and _____________ methods.
There are no hints for this question


I've got a “four oh three”. This is not where you're meant to be.
Psst… that's a permission error. You could
try logging in
if you haven't already.


{% extends 'eBedTrack/base.html' %} {% block content %}
Thank you for utilizing our services and reaching out to us with your question, we will get back to you as quickly as possible.


Nasty Tomatoes
Title:
Year:
Genre:
Actors:
Rating (0-5):
Poster (link):
Like Movies?
Enter your favorites!


Electron + MySQL
Show Products
Add New Products
Show Locations
Add New Locations
A Demo App for Electron + MongoDB


Based on what you've told us You get help with NHS costs and don't need to apply
Because you get Pension Credit Guarantee Credit:
You get free:
- NHS prescriptions
- NHS dental check-ups and treatment
- sight tests
- NHS wigs and fabric supports
You get money off:
- new glasses or contact lenses
- repairing or replacing your glasses or contact lenses
- travel for NHS treatment
How to get your help
You don't have to do anything more, although you may have to show proof you get Pension Credit Guarantee Credit to your pharmacist, optician or dentist.
You can use your latest pension credit award letter as proof.
If you have lost yours contact the Pension Service helpline.
Back to application


{% extends "mail_layout.html" %} {% block title %}SURF organisation invite{% endblock %} {% block content %}
You have been invited by {{ invitation.user.name }} to become {{ invitation.intended_role }} in organisation '{{ invitation.organisation.name }}'.
Accept invitation
{{ invitation.message }}
{{ invitation.user.name }} has invited you to join them using SURF Research Access Management. Help for enrollment is available.