The Flight of the Horse
by Larry Niven (1969-1973)
I just got this back from long-term loan to Phil, and I just couldn't resist reading it clean through once again. It's a quick, light read, and I honestly couldn't really justify my love of it to a dispassionate third party. But Niven's stuff, particularly his early short stories like this, are always a nostalgia trip for me, representative of the ideas that got me into science fiction as a kid in the first place. He writes throwaway tales of quirky worlds, but each one is crafted with such a singularly consistent exploration of the logical implications of a single, simple premise, that with hindsight, suddenly complicit in the gag, you can almost see how each story's conclusion grew inescapably out of the very opening paragraphs.
It's very much Niven's modus operandi, and it lends itself well to a book like this, which is essentially a couple of sets of related short stories, in settings that verge on fantasy, but which abide by a strict internal logic that makes them indisputably hard SF to me.
The first sequence follows the fortunes of a 24th century post-apocalyptic time traveller, who is trying his best to investigate the past - our time, and pre-industrial ages - and bring back specimens of long-extinct species. Things never quite go according to plan - the horse he bags has an unexpected horn, and the whale he sought turns out to be a biblical leviathan, until eventually, he figures out the hard way what we the reader should have known all along - his time machine is screwy, slipping a little sideways in time every time he travels back to the past, sometimes a little, to worlds that differ from ours merely in happenstance, or sometimes further, to worlds that never could have been, in which mythical beasts roam and humanity is a very different breed.
The second series explores a similarly simple premise - that countless generations ago, deep in prehistory, when magic thrived and was a practical art in the world, a sorcerer discovers a terrible secret: that magic uses up energy from its surroundings, and that eventually this mana runs out, leaving an area sterile of magical potential, deadly to aged magicians, uninhabitable by mythical beasts. The knowledge is exploited to further various agendas, a vicious cycle that accelerates the process, that we the reader can see will inevitably lead to the fall of their civilisation, and the immeasurable dark ages before our own recorded history began.
It's the sort of stuff that people who don't 'do' SF clearly won't have any patience for. But if you can conjour up a little willing suspension, can overlook the writer's unsubtle early works, then the imagination and clarity of the tales shines through, weaving entertaining worlds of both humour and grandeur.
Rating: 7/10


|
Part A The magnitude shows for each image the spikes that occur at frequency 8 and -8 for cosine and sin from a top-down view. The magnitude display of the frequency domain shows how much information can be encoded in a small amount of data. We took the vertical bands created by the functions and converted them into two single spikes without losing any data. Part B We would expect to see the two images added together's magnitude to be the sum of their original Magnitudes because of the linearity of the Fourier Transfrom. That is upheld by the two points being located at frequency 8, -8 on the x axis and frequency 4, -4 on the y-axis. Part C The Fourier Transform has the property that maps rotations in the image in the spatial domain directly onto the frequency domain. Due to this property we would expect that the Magnitude of the Rotated Sum of the two images to be a rotated copy of the Magnitude of the sum and once again that is shown in the image (albeit faintly!) with the four points that were once located on the x and y axis rotated by the same 15 degrees that the image was rotated by in the spatial domain. Part D Multiplying the two images ends up having a masking effect and we see that the only places where there is white are where the two images had overlapping white values. Additionally this operation is exactly what we did in Problem 1 where we had to compute the Fourier Transform of the sin(x) and sin(y). The only difference there is the frequency of the points which would just adjust their location in the frequency domain. As the book work indicated we would expect four point again this time appearing in a box-like shape. Part E From the examples in the book on page 202 the indication is that phase has a greater effect on the structure of the image and thus output image 1 which had the magnitude of the ball and the phase of the gull we would expect to look more like the gull which it does. This also holds true for image 2 which has the phase of the ball and shows an image of the ball. |


{% extends "base.html" %} {% import 'bootstrap/wtf.html' as wtf %} {% block app_content %}
Your email account has been successfully authenticated! Refresh your browser to access the page!


Role Based Access Control
Role based access control (RBAC) functionality enables application admins to limit the permissions of some users within a team.
Many times when SaaS applications first launch team functionality, they start out with all users being fully privileged to access all features. However, for larger customers there are requirements that different members of the team be assigned only the functionality they need to do their job (see the principle of least privilege). To this point, it is even a security best practice for admins to maintain separate accounts for their user level activities. As a result, SaaS applications need to offer Role Based Access Control to be EnterpriseReady.
We’ve included screen-by-screen tear downs of the RBAC implementations of both HubSpot & Intercom.
At the most basic level:
Very simple implementations of RBAC start by simply allowing users to be identified as read-only. These users are able to view all features and resources, but not make any changes.
The standard functionality:
Eventually, customers require more fine-tuned control over which roles have read-write, read-only, or no-access to various features and resources. When they do, many SaaS companies create general roles with defined permissions. Examples include:
Super Admins - can modify users as well as modify all features and resources.
Billing Admins - can modify the account billing data but not modify users or features.
Users - can use the product in all of its functionality but do not have access to modify users or view billing info.
Reporting users - can only access reporting features (and likely not modify any additional resources).
Feature only users - limiting users to use only one application specific feature or another.
Advanced functionality:
At some point most advanced enterprise software solutions offer the ability to customize the roles with specific read/write, read-only or no-access permissions for each feature individually. This is often messy and many software products prefer to not have the screen of checkboxes to custom provision a role or account.
How to integrate
Role assignment is best integrated into the invitation and user management flow. Anytime a new user is created they should be designated specific permissions that allow them access the features they need. Ongoing management of permissions should be done in the users list with each user’s roles clearly identified.
Communicating restricted functionality
Once you restrict functionality from users it is important to consider their experience when they encounter the touch points with such features. Ie, if a user can’t invite users, ensure that the “invite user” button is disabled with a clear designation that it is disabled due to insufficient permissions.
On-boarding Different Roles
It’s important to consider the on-boarding flow for various user types, both from how they first sign-up all they way to the on-boarding emails they receive. Highlighting the features that most impact their role is critical to increase adoption and user understanding.


rubella age cases herd immunity vaccination data number Japan infection susceptible {border-style males reported px;} #ffffff;} CRS females proportion epidemic study aged population congenital seronegative Japan, coverage seropositive time (figure Infectious line births live risk threshold calculated elevated present using Diseases analysis recent seroepidemiological seroprevalence adult dotted figure major px; syndrome {font-family Ministry National age-specific birth bold cases, considered cut-off font-size observed reporting supplementary women years years Figure Infect Japan. Surveillance born cases. cohorts different double; epidemics epidemiological gender male pockets proportions represents threshold, (.–.) .%) Epidemiological Health, Research Science absolute adopted adults age-group age-standardised analysed assess border-color border-width collab: epidemic. especially function policy pregnant serological solid solid; standardised surveillance value {font-style {font-weight (A) (MHLW). (in Health Japanese). Law Technology Vaccine;:–. annual assessment based childbearing confirmed corresponding courier; data. dynamics elevation em; examined females. focused fraction groups important increase increased indicates levels mothers programme pt;} retrospective sensitivity sentinel shown size survey titre trend vertical women. year – years – years,


Russian court orders murder-suspect professor detained
MOSCOW (AP) - A St. Petersburg court has rejected a defense lawyer’s request for a prominent Russian history professor who’s suspected of murdering and dismembering a female student to be released under house arrest pending trial.
The court on Monday ordered Oleg Sokolov detained for two months.
The case has attracted wide attention in Russian media because of its grisly aspects.
Sokolov was detained Saturday after being pulled from St. Petersburg’s Moika River, where a backpack containing two severed arms also was found. The arms were identified as those of the student; other body parts were found in Sokolov’s home near the river.
Sokolov has confessed to the killing, according to his lawyer, Alexander Pochuev.
Sign up for Daily Newsletters
Copyright © 2019 The Washington Times, LLC.
Please read our comment policy before commenting.


---
layout: def
---
The fluctation of an operatr is the standard deviation of it's expected value.
Notations
The flunctation is denoted with
$$\begin{align*}
\Delta A=\sqrt{\langle(A-\langle A\rangle)^2\rangle}
\end{align*}$$
Concepts
The fluctation is denoted as the standard deviation. We can simplify the equation.
Related
Coming soon


Harsh Baldaniya
Web Designer
Harsh Baldaniya
UI Designer
Harsh Baldaniya
Web Devloper
Harsh Baldaniya
Web Designer
Harsh Baldaniya
UI Designer
Harsh Baldaniya
Web Devloper


User defined input function to read data from input stream.
unsigned int in_func ( JDEC* jdec, /* Pointer to the decompression object */ uint8_t* buff, /* Pointer to buffer to store the read data */ unsigned int ndata /* Number of bytes to read */ );
Returns number of bytes read/removed. When a zero is returned, the jd_prepare() and jd_decomp() function aborts with JDR_INP.
This function is the data input interface of the TJpgDec module. The corresponding decompression session can be identified by the pointer to the device identifier jdec->device passed to the 5th argument of jd_prepare function.


{% extends 'base.html' %} {% block title %} {{ object.name }} Detail {% endblock %} {% block content %}
Use this id to reference {{ object.name }} via the API
When activated through the API, {{ object.name }} expects these attributes in the POST data
Notifications will be sent this frequently
Alert priority will be raised if not acknowledged within this period
Alerts will automatically acknowledge if they haven't been updated for longer than this period
The initial Priority for alerts
This action will be used to pre-process incoming alert data to format a title, message and priority for the alert
After the alert data has been pre-processed, these Notification Actions will be run.
These Logic Actions will be run in priority order using the incoming, un-pre-processed alert data


{% extends "core/base.html" %} {% block content %} {% if form.errors %}
Please try again.
{% endif %} {% if next %} {% if user.is_authenticated %}Your account doesn't have access to this page. To proceed, please login with an account that has access.
{% else %}Please login to see this page.
{% endif %} {% endif %} {% endblock %}


Swimming Vegetable
menu
Main Page
Help
Page List
Options
Danger!
JavaScript is disabled; we can't continue without it.
Click Here
for more information.
Copyright © 2009-2013
Meadhbh S. Hamrick
, All Rights Reserved.
License Info


When using transactions with dbstl, you must call the dbstl
transaction functions instead of the corresponding methods
from the Berkeley DB C or C++ transaction API. That is, you
must use dbstl::begin_txn()
,
dbstl::commit_txn()
and
dbstl::abort_txn()
in order to
begin/commit/abort transactions.
A container can be configured to use auto commit by setting the DB_AUTO_COMMIT flag when the environment or database handle is opened. In this case, any container method that supports auto commit will automatically form an independent transaction if the method is not in an external transactional context; Otherwise, the operation will become part of that transaction.
You can configure the flags used internally by dbstl when
it is creating and committing these independent transactions
required by auto commit. To do so, use the
db_container::set_txn_begin_flags()
and/or
db_container::set_commit_flags()
methods.
When a transaction is committed or aborted, dbstl will automatically close any cursors opened for use by the transaction. For this reason, any iterators opened within the transaction context should not be used after the transaction commits or aborts.
You can use nested transactions explicitly and externally,
by calling dbstl::begin_txn()
in a
context already operating under the protection of a
transaction. But you can not designate which transaction is
the parent transaction. The parent transaction is
automatically the most recently created and unresolved
transaction in current thread.
It is also acceptable to use explicit transactions in a container configured for auto commit. The operation performed by the method will become part of the provided external transaction.
Finally, transactions and iterators cannot be shared among multiple threads. That is, they are not free-threaded, or thread-safe.


In video games, artificial intelligence is used to generate responsive, adaptive or intelligent behaviors primarily in non-player characters similar to human-like intelligence. Artificial intelligence has been an integral part of video games since their inception in the 1950s. The role of AI in video games has expanded greatly since its introduction. Modern games often implement existing techniques from the field of artificial intelligence such as pathfinding and decision trees to guide the actions of NPCs. Additionally, AI is often used in mechanisms which are not immediately visible to the user, such as data mining and procedural-content generation.
The term "game AI" is used to refer to a broad set of algorithms that also include techniques from control theory, robotics, computer graphics and computer science in general, and so video game AI may often not constitute "true AI" in that such techniques do not necessarily facilitate computer learning or other standard criteria, only constituting "automated computation" or a predetermined and limited set of responses to a predetermined and limited set of inputs. Many industry and corporate voices claim that so-called video game AI has come a long way in the sense that it has revolutionized the way humans interact with all forms of technology, although many expert researchers are skeptical of such claims, and particularly of the notion that such technologies fit the definition of "intelligence" standardly used in the cognitive sciences. Industry voices make the argument that AI has become more versatile in the way we use all technological devices for more than their intended purpose because the AI allows the technology to operate in multiple ways, allegedly developing their own personalities and carrying out complex instructions of the user. However, many in the field of AI have argued that video game AI is not true intelligence, but an advertising buzzword used to describe computer programs that use simple sorting and matching algorithms to create the illusion of intelligent behavior while bestowing software with a misleading aura of scientific or technological complexity and advancement. Since game AI for NPCs is centered on appearance of intelligence and good gameplay within environment restrictions, its approach is very different from that of traditional AI.


{{#if orgExists org.name}}
{{> SelectOrg_deregister org=org}}
Manage
{{#unless localUser}}
{{> SelectOrg_git org=org}}
{{/unless}}
{{else}}
{{#if isAdminOfOrg org.name}}
{{> SelectOrg_register org=org}}
{{> SelectOrg_git org=org}}
{{else}}
You must be an admin of {{org.name}} to register it in RazeeDash.
{{/if}}
{{/if}}
{{else}}
{{#if localUser}}
You don't appear to belong to any organizations. You can create a new organization using the form below.
{{> AddLocalOrg}}
{{else}}
{{#if bitbucketUser }}
You don't appear to belong to any Bitbucket teams. Try refreshing.
You can also create a new Bitbucket team.
{{else}}
You don't appear to belong to any GitHub organizations. Try refreshing.
You can also create a new GitHub organization.
{{/if}}


|
||||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Object de.iabg.swing.event.LoggableLogListener
public class LoggableLogListener
This implementation of a LogListener
links one Loggable
object with another. This is usually necessary when an object aggregates
Loggable
objects and needs to be notified when each log is changed.
The notification of the log change is chained through each subsequent
Loggable
object until it reaches a Logger
, which finally
handles the log.
| Field Summary | |
|---|---|
protected Loggable |
loggable_
The Loggable object that is notified of log changes |
| Constructor Summary | |
|---|---|
LoggableLogListener(Loggable loggable)
Constructs a LogListener with a reference to the given
Loggable . |
| Method Summary | |
|---|---|
void |
logChanged(LogEvent logEvent)
Invoked when the target of this listener has changed its log. |
| Methods inherited from class java.lang.Object |
|---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
| Field Detail |
|---|
protected Loggable loggable_
Loggable
object that is notified of log changes
| Constructor Detail |
|---|
public LoggableLogListener(Loggable loggable)
LogListener
with a reference to the given
Loggable
.
loggable
- the object to be notified of a log change| Method Detail |
|---|
public void logChanged(LogEvent logEvent)
LogListener
logChanged
in interface LogListener
logEvent
- the LogEvent
from the log source
|
||||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |


A sports bettor's dream
In the gambling industry, the odds are stacked against the bettor, who will lose money in the long run in favor of the house. The house taking the bets charge from 2%-10% on every bet, plus fees when you deposit and withdraw your money. At ZeroHouseEdge, we flipped the script; there is no house. Using cutting edge Bitcoin & Blockchain technology, ZeroHouseEdge has developed software to make gambling free on the internet for the first time in history. Sorry bookies, it was only a matter of time.
Download the app
We've designed ZeroHouseEdge to be as secure as possible. With that in mind, we made ZeroHouseEdge an application that runs on your machine. All keys and funds will be stored on your machine locally. That way if we get attacked by a hacker somehow, they still do not have access to your private keys or funds because no valuable data lives on our server.
Get Bitcoin
Bitcoin, the digital version of cash, is the most important invention in years. One of the reasons is that it allows money and code to meld and create revolutionary technology. You can use ZeroHouseEdge in many currencies, such as the US Dollar, but to first deposit you need Bitcoin. For more on why we use Bitcoin or our recommended ways to buy Bitcoin, click here.
Create and accept bets
At ZeroHouseEdge there is zero house, lol. But seriously, users bet with each other. You are your own bookie: create your own bets, set your own lines, accept proposed bets from other users, and withdraw and deposit at your leisure. All for free, no catch. When a netowork of bettors come together to use revolutionary software, we end up saving billions of dollars.


RRD Header Info
RRD URL:
Update
Javascript needed for this page to work
RRD file
None
Min Step
N/A
Last update
N/A


My Numbers
67, 80, 65, 79, 86, 66, 75, 71, 81, 69, 90, 79, 68, 65, 73, 88
1. Convert numbers to Alphabet in order (e.g. 1 becomes A, 2 becomes B and so on)
Using the forEach method:
Using a for loop:
Using the map method:
Answer:
2. Display numbers below showing only numbers that are greater than 72 and less then 88 (inclusive) using the filter method
Answer:
3. Display the product of all numbers using reduce
Answer:


You will be shown two sentences, and you should decide whether one
sentence entails the other (⇒ or ⇐),
the sentences say the same thing (⇔), or the sentences are not
related (?).
One sentence entails another sentence if by reading only the one sentence,
you think the other sentence is most likely true.
Two sentences saying the same thing is equivalent to one entailing the other,
and the other entailing the one.
Otherwise, the sentences are not related. Unrelated sentences still often
talk about the same topic, but neither entails the other.
Examples
0.
If we know that:
(a)
Plastic is very harmful to the environment .
What can we say about:
(b)
cutting down a rain forest is most harmful to the natural environment.
Although both sentences talk about the environment, "plastic" and "cutting down trees" are not comparable.
0.
If we know that:
(a)
Other human activities like cutting down forests , land clearing , even building roads and cities has harmful effects on the natural environment .
What can we say about:
(b)
cutting down a rain forest is harmful to the natural environment.
The second sentence only has information you would assume to be true from the first sentence; but, the first sentence has more information that may not be true having only read the second sentence.
0.
If we know that:
(a)
The main source of energy for the water cycle is the sun .
What can we say about:
(b)
sunlight is the main source of energy for the water cycle.
These sentences have exactly the same information, they just say it differently.
[optional]: Do you have any comments / suggestions?
Comments about clarity and compensation are particularly useful.


CHAPTER 222
HAWAII RESEARCH CENTER FOR FUTURES STUDY
REPEALED. L 2006, c 75, §16.
Cross References
For present provisions, see chapter 304A, part VII, subpart E.


Answer some questions.
Then find the friend with the greatest compatibility!
Cheeper than eHarmony; Safer than Bumble.


2 Chronicles 21:8
In his days the Edomites revolted from under the dominion of Judah, and made themselves a king.


Imagine that you enter a parlor. You come late. When you arrive, others have long preceded you, and they are engaged in a heated discussion, a discussion too heated for them to pause and tell you exactly what it is about. In fact, the discussion had already begun long before any of them got there so that no one present is qualified to retrace for you all the steps that had gone before.  Someone answers; you answer her; another comes to your defense; another aligns himself against you, to either the embarrassment or gratification of your opponent, depending upon the quality of your ally's assistance. However, the discussion is interminable. The hour grows late, you must depart. And you do depart, with the discussion still vigorously in progress.
Jargon-rich and uses images as informational tool.
Conversational, informal, and images used to draw attention.
Freewrite for 2 minutes: What do you think will be the most challenging part of putting together a virtual presentation?
Your audience will be blended in many ways
Looking for additional assistance? Struggling with breaking down ideas? Please feel free to contact me to set up a meeting.
A copy of this presentation can be found at:
http://www.writing-rhetoric.com/spur-2021/


ESPAlertData Class Reference
| Inherits from | NSObject |
|---|---|
| Declared in | ESPAlertData.h |
Other Methods
– init
Default initializer that always returns nil; DO NOT CALL
- (id)init
Discussion
Default initializer that always returns nil; DO NOT CALL
See Also
- initWithData:(NSData)
Declared In
ESPAlertData.h
– initWithData:
Initializes the alert from a received packet’s payload
- (id)initWithData:(NSData *)data
Parameters
data |
the payload data of a respAlertData packet |
|---|
Return Value
a newly initialized alert
Discussion
Initializes the alert from a received packet’s payload
Declared In
ESPAlertData.h
– initWithAlertData:
Initializes a new alert by copying information from an existing alert
- (id)initWithAlertData:(ESPAlertData *)alert
Parameters
alert |
the alert to copy from |
|---|
Return Value
a newly initialized alert
Discussion
Initializes a new alert by copying information from an existing alert
Declared In
ESPAlertData.h
– isEqualToAlertData:
Tells if the given alert is equal to this alert
- (BOOL)isEqualToAlertData:(ESPAlertData *)alertData
Parameters
alertData |
the alert to compare |
|---|
Return Value
YES if the alerts are equal, or NO if they are not equal
Discussion
Tells if the given alert is equal to this alert
Declared In
ESPAlertData.h
data
The full payload data of the alert
@property (nonatomic, readonly) NSData *data
Discussion
The full payload data of the alert
Declared In
ESPAlertData.h
count
The number of alerts in the alert table
@property (nonatomic, readonly) NSUInteger count
Discussion
The number of alerts in the alert table
Declared In
ESPAlertData.h
index
The index of the alert in the alert table
@property (nonatomic, readonly) NSUInteger index
Discussion
The index of the alert in the alert table
Declared In
ESPAlertData.h
frequency
The frequency of the alert
@property (nonatomic, readonly) ESPFrequencyMHz frequency
Discussion
The frequency of the alert
Declared In
ESPAlertData.h
frontSignalStrength
The front signal strength (0-255)
@property (nonatomic, readonly) NSUInteger frontSignalStrength
Discussion
The front signal strength (0-255)
Declared In
ESPAlertData.h
rearSignalStrength
The rear signal strength (0-255)
@property (nonatomic, readonly) NSUInteger rearSignalStrength
Discussion
The rear signal strength (0-255)
Declared In
ESPAlertData.h
alertSignalStrength
The alert signal strength to use for the bargraph (0-255)
@property (nonatomic, readonly) NSUInteger alertSignalStrength
Discussion
The alert signal strength to use for the bargraph (0-255)
Declared In
ESPAlertData.h
bargraphSignalStrength
The bargraph strength indicator strength (0-8)
@property (nonatomic, readonly) NSUInteger bargraphSignalStrength
Discussion
The bargraph strength indicator strength (0-8)
Declared In
ESPAlertData.h
priority
Tells if this alert is a priority alert
@property (nonatomic, readonly, getter=isPriority) BOOL priority
Discussion
Tells if this alert is a priority alert
Declared In
ESPAlertData.h
direction
The direction of the alert
@property (nonatomic, readonly) ESPAlertDirection direction
Discussion
The direction of the alert
Declared In
ESPAlertData.h
band
The band of the alert
@property (nonatomic, readonly) ESPAlertBand band
Discussion
The band of the alert
Declared In
ESPAlertData.h
Other Methods
– isWithinDevianceWindow:
Tells if the given alert is within the deviance window of this alert
- (BOOL)isWithinDevianceWindow:(ESPAlertData *)alert
Parameters
alert |
the alert to compare |
|---|
Return Value
YES if the alert is within the deviance window, NO if it is not
Discussion
Tells if the given alert is within the deviance window of this alert
Declared In
ESPAlertData.h


Copyright © 2005 W3C® (MIT, ERCIM, Keio), All Rights Reserved. W3C liability, trademark and document use rules apply.
A common method of limiting access to services made available over the Web is visual verification of a bitmapped image. This presents a major problem to users who are blind, have low vision, or have a learning disability such as dyslexia. This document examines a number of potential solutions that allow systems to test for human users while preserving access by users with disabilities.
This section describes the status of this document at the time of its publication. Other documents may supersede this document. A list of current W3C publications and the latest revision of this technical report can be found in the W3C technical reports index at http://www.w3.org/TR/.
This is a W3C Working Group Note produced by the WAI Protocols and Formats Working Group. The Working Group has expressed its consensus in support of publishing this Note.
The WAI Protocols and Formats Working Group recognizes that this is a dynamic area of technology. The Group expects to continue researching CAPTCHA and related technologies. They seek feedback from developers and users of these technologies on how, where and why it is in use. Particularly if you have a security plus accessibility success story, please share it. Please send comments to the WAI XTech list. Messages to this list are archived publicly.
The WAI Protocols and Formats Working Group is part of the WAI Technical Activity.
This is an updated version of a document previously titled "Inaccessibility of Visually-Oriented Anti-Robot Tests: Problems and Alternatives".
Publication as a Working Group Note does not imply endorsement by the W3C Membership. This is a draft document and may be updated, replaced or obsoleted by other documents at any time. It is inappropriate to cite this document as other than work in progress.
Web sites with resources that are attractive to aggregators (travel and event ticket sites, etc.) or other forms of automation (Web-based email, weblogs and message boards) have taken measures to ensure that they can offer their service to individual users without having their content harvested or otherwise exploited by Web robots.
The most popular solution at present is the use of graphical representations of text in registration or comment areas. The site attempts to verify that the user in question is in fact a human by requiring the user to read a distorted set of characters from a bitmapped image, then enter those characters into a form.
Researchers at Carnegie Mellon University have pioneered this method, which they have called CAPTCHA (Completely Automated Public Turing test to Tell Computers and Humans Apart) [CAPTCHA]. Various groups are at work on projects based on or similar to this original, and for the purpose of this paper, the term "CAPTCHA" is used to refer to all of these projects collectively. A Turing test [TURING], named after famed computer scientist Alan Turing, is any system of tests designed to differentiate a human from a computer.
This type of visual and textual verification comes at a huge price to users who are blind, visually impaired or dyslexic. Naturally, this image has no text equivalent accompanying it, as that would make it a giveaway to computerized systems. In many cases, these systems make it impossible for users with certain disabilities to create accounts, write comments, or make purchases on these sites, that is, CAPTCHAs fail to properly recognize users with disabilities as human.
It is important to note that, like seemingly every security system that has preceded it, this system can be defeated by those who benefit most from doing so. For example, spammers can pay a programmer to aggregate these images and feed them one by one to a human operator, who could easily verify hundreds of them each hour. The efficacy of visual verification systems is low, and their usefulness is nullified once they are commonly exploited.
A history of how CAPTCHA has been adopted over the years is instructive. Larger sites adopted CAPTCHA because their resources were easy to abuse for the purposes of sending spam or conducting anonymous, illegal activity.
In recent times, however, inaccessible-by-design technologies such as CAPTCHA have spread to smaller sites, and to new applications which further confound assistive technology. Banking site ING Direct's "PIN Guard" [PINGUARD] uses a visual keypad to associate letters on the keyboard with numbers in a user's passcode. Users who cannot see the code, or understand the juxtaposition of letters and numbers, are unable to access their own financial data on this site.
CAPTCHA is now in frequent use in the comment areas of message boards and personal weblogs. Many bloggers claim that CAPTCHA challenges are successful in eradicating comment spam, but below a certain threshold of popularity, any other method of comment spam control should be reasonably successful -- and more accessible to users with disabilities.
A number of data points on this false sense of security have arisen since this document was first published. Part of the CAPTCHA Project at Carnegie Mellon University, where the technique was developed, was a group intended to defeat new CAPTCHAs as they were created. One of the first documented attacks on the system was by a Carnegie Mellon student, who associated CAPTCHA images with access to an adult Web site, thus gaining free human labor to crack the authentication. High-value Web resources are always at risk for social-engineering attacks of this nature, as humans can be hired, sometimes at near-slave wages, to defeat hundreds if not thousands of these tests per hour.
External projects such as [BREAKING], [AICAPTCHA] and [PWNTCHA]
have shown methodologies and results indicating that many of the systems can
be defeated by computers with between 88% and 100% accuracy, using optical character
recognition. [BREAKINGOCR] outlines a CAPTCHA
defeat on PHP- and ASP-based systems, in which known-valid session IDs are cached
and reused to circumvent several popular CAPTCHA schemes. The "Screen
Scraper" attack reported by the Anti-Phishing Working Group [ANTIPHISHING] defeats the [PINGUARD] technique by capturing the screen when
the user clicks to enter their secret code.
It is a logical fallacy, then, to hail CAPTCHA as a spam-busting panacea. Even 10% accuracy by a computer amounts to system failure, just at a slower rate. It is also faulty logic to believe that the adoption of CAPTCHA in large sites is evidence of its supremacy in fighting spam. Indeed, a number of techniques are as effective as CAPTCHA, without causing the human interaction step that causes usability and accessibility issues.
Sites implementing verification have very different needs, and they fall into a hierarchy. As the bar for authentication is raised, so is the risk that many users may be marginalized, and the damage that may cause.
Most systems implement security in some form or another to preserve privileges for certain users. Authentication of a privileged user without a personal identification scheme that cannot be repudiated is the current mechanism for all but the most secure sites on the Web. We can open accounts on any number of email services, portals, newspapers, and message boards without providing any credentials of our own, such as a passport, driver's license or serial number. In these situations, the first priority may be to point users to the resources they may access; security itself may not take precedence until exploitable details such as credit card information is stored on a given site.
Systems that offer attractive privileges are often exploited, particularly when users can do so anonymously. The ability to create several accounts to multiply a user's privileges is often the cause for these Turing tests to be put into place. It is understood to be fact that human users interacting with sites cannot consume resources as quickly as programs designed to acquire and use free privileges. These sites wish to provide credentials to humans while eliminating robot access to the same resources.
Beyond humanity is unique human identity. A person's identity (including such details as nationality, property, or even personal features) needs to be established authoritatively in order to guarantee everything from secure and legal financial transactions, to the security of medical and legal information, to fair elections. All of these are becoming increasingly available online, including Web-based voting, which has undergone trials in Sweden, Switzerland, France, the United Kingdom, Estonia, and the United States.
It is important to determine solutions for verifying unique identity in users, while balancing the needs of all potential users of such a system. The cost of failure ranges from inconvenience in privilege-based models to the denial of basic human rights in some identity-based systems.
There are many techniques available to users to discourage or eliminate fraudulent account creations or uses. Several of them may be as effective as the visual verification technique while being more accessible to people with disabilities. Others may be overlaid as an accommodation for the purposes of accessibility. Seven alternatives are listed below, with their individual pros and cons. Many are achievable today, while some hint at a near future that may render this need obsolete.
The goal of visual verification is to separate human from machine. One reasonable way to do this is to test for logic. Simple mathematical word puzzles, trivia, and the like may raise the bar for robots, at least to the point where using them is more attractive elsewhere.
Problems: Users with cognitive disabilities may still have trouble. Answers may need to be handled flexibly, if they require free-form text. A system would have to maintain a vast number of questions, or shift them around programmatically, in order to keep spiders from capturing them all. This approach is also subject to defeat by human operators.
To reframe the problem, text is easy to manipulate, which is good for assistive technologies, but just as good for robots. So, a logical means of trying to solve this problem is to offer another non-textual method of using the same content. Hotmail serves a sound file that can be listened to if the visual verification is not suitable for the user.
However, according to a CNet article [NEWSCOM], Hotmail's sound output, which is itself distorted to avoid the same programmatic abuse, was unintelligible to all four test subjects, all of whom had "good hearing". Users who are deaf-blind, don't have or use a sound card, work in noisy environments, or don't have required sound plugins are likewise left in the lurch. Since this content is auditory in nature, users often have to write down the code before entering it, which is very inconvenient. Worst of all, some implementations of this technique are JavaScript-based, or designed in such a way that some blind users may not be able to access them. Machines, on the other hand, may even have greater success with voice recognition software than they do with OCR on visual CAPTCHAs.
Users of free accounts very rarely need full and immediate access to a site's resources. For example, users who are searching for concert tickets may need to conduct only three searches a day, and new email users may only need to send a canned notification of their new address to their friends, and a few other free-form messages. Sites may create policies that limit the frequency of interaction explicitly (that is, by disabling an account for the rest of the day) or implicitly (by slowing the response times incrementally). Creating limits for new users can be an effective means of making high-value sites unattractive targets to robots.
The drawbacks to this approach include having to take a trial-and-error approach to determine a useful technique. It requires site designers to look at statistics of normal and exceptional users, and determine whether a bright line exists between them.
While CAPTCHA and other interactive approaches to spam control are sometimes effective, they do make using a site more complex. This is often unnecessary, as a large number of non-interactive mechanisms exist to check for spam or other invalid content.
This category contains two popular non-interactive approaches: spam filtering, in which an automated tool evaluates the content of a transaction, and heuristic checks, which evaluate the behavior of the client.
Applications that use "hot words" to flag spam content, or Bayesian filtering to detect other patterns consistent with spam, are very popular, and quite effective. While such systems may experience false negatives from time to time, properly-tuned systems are as effective as a CAPTCHA approach, while also removing the added cognitive burden on the user.
Most major blogging software contains spam filtering capabilities, or can be fitted with a plug-in for this functionality. Many of these filters can automatically delete messages that reach a certain spam threshold, and mark questionable messages for manual moderation. More advanced systems can control attacks based on post frequency, filter content sent using the [TRACKBACK] protocol, and ban users by IP address range, temporarily or permanently.
Heuristics are discoveries in a process that seem to indicate a given result. It may be possible to detect the presence of a robotic user based on the volume of data the user requests, series of common pages visited, IP addresses, data entry methods, or other signature data that can be collected.
Again, this requires a good look at the data of a site. If pattern-matching algorithms can't find good heuristics, then this is not a good solution. Also, polymorphism, or the creation of changing footprints, is apt to result, if it hasn't already, in robots, just as polymorphic ("stealth") viruses appeared to get around virus checkers looking for known viral footprints.
Another heuristic approach identified in [KILLBOTS] involves the use of CAPTCHA images, with a twist: how the user reacts to the test is as important as whether or not it was solved. This system, which was designed to thwart distributed denial of service (DDoS) attacks, bans automated attackers which make repeated attempts to retrieve a certain page, while protecting against marking humans incorrectly as automated traffic. When the server's load drops below a certain level, the authentication process is removed entirely.
Competing efforts by Microsoft and the Liberty Alliance are attempting to establish a "federated network identity" system, which can allow a user to create an account, set his or her preferences, payment data, etc., and have that data persist across all sites that use the same service. This sort of system, which is making inroads in both Web sites and Web Services, would allow a portable form of identification across the Web.
Ironically enough, the Passport system itself is one of the very same services that currently utilizes visual verification techniques. These single sign-on services will have to be among the most accessible on the Web in order to offer these benefits to people with disabilities. Additionally, use of these services will need to be ubiquitous to truly solve the problems addressed here once and for all.
Another approach is to use certificates for individuals who wish to verify their identity. The certificate can be issued in such a way as to ensure something close to a one-person-one-vote system by for example issuing these identifiers in person and enabling users to develop distributed trust networks, or having the certificates issued by highly trusted authorities such as governments. These type of systems have been implemented for securing web pages, and for authenticating email.
The cost of creating fraudulent certificates needs to be high enough to destroy the value of producing them in most cases. Sites would need to use mechanisms which are widely implemented in user agents.
A subset of this concept, in which only people with disabilities who are affected by other verification systems would register, raises a privacy concern in that the user would need to telegraph to every site that she has a disability. The stigma of users with disabilities having to register themselves to receive the same services should be avoided. With that said, there are a few instances in which users may want to inform sites of their disabilities or other needs: sites such as Bookshare [BOOKSHARE] require evidence of a visual disability in order to allow users to access printed materials which are often unavailable in audio or Braille form. An American copyright provision known as the Chafee Amendment [CHAFEE] allows copyrighted materials to be reproduced in forms that are only usable by blind and visually impaired users. A public-key infrastructure system would allow Bookshare's maintainers to ensure that the site and its users are in compliance with copyright law.
On the horizon, a more foolproof method of user verification is being formulated in the field of biometric technology. A host of tests, from fingerprint and retinal scanning to DNA matching, promise to check a person's identity authoritatively, effectively limiting the ability of spammers to create infinite email accounts. Microsoft has announced a new biometric system in its Longhorn operating system, complete with a new, secure connector to capture this data. Biometrics will very likely be used in conjunction with single sign-on services.
Again, the weakness here is based on infrastructure. It will take several years for biometric hardware to penetrate a market, and some political and social issues exist which may hold back the process. Biometric systems will also have to take into account the fact that not all people have the same physical features: for example, retinal scanning does not work for a user who was born without eyes.
One approach that remains somewhat popular where identity is concerned is the use of existing artifacts of identity, such as credit cards and national IDs such as the Social Security number in the United States. While these systems do provide an easy way to verify users against systems at low cost, their value has been discounted in this paper due to their insecurity. Moreover, systems which collect this data from large numbers of users create a more attractive target for identity theft than they ever did for misappropriation of services.
Recently, Google has sent its account creation keys to new users via a Short Message Service (SMS) message. While introducing new complications such as somewhat limited worldwide penetration for mobile phones, thereby creating a different sort of barrier, and poor accessibility to SMS features among users who are blind, it does limit the extent to which large systems can be exploited. It's not feasible, for example, for someone to use thousands of phones to farm account keys daily, then exchange them for new phones when the service refuses to send more keys. Sadly, the Google account creation system still requires a CAPTCHA in addition to this security measure. This technique is included to encourage innovative thought around using architectural constraints, with real costs involved, to impact the feasibility of exploiting a Web resource.
Sites with attractive resources and millions of users will always have a need for access control systems that limit widespread abuse. At that level, it is reasonable to employ many concurrent approaches, including audio and visual CAPTCHA, to do so. However, it must be noted that human users will fall through the cracks in these systems, and it will be necessary for sites like these to ensure that users with disabilities will have some human-operated means of interacting with a given resource in a reasonable amount of time.
The widespread use of CAPTCHA in low-volume, low-resource sites, on the other hand, is unnecessarily damaging to the experience of users with disabilities. An explicitly inaccessible access control mechanism should not be promoted as a solution, especially when other systems exist that are not only more accessible, but may be more effective, as well. It is strongly recommended that smaller sites adopt spam filtering and/or heuristic checks in place of CAPTCHA.
Lastly, new approaches focusing on using exclusively visual or auditory means for access control, such as the "PIN Guard" mentioned above, should be scrapped until a reliable method exists for users who cannot access them to authenticate themselves. A short-term security benefit is not worth threatening a person's autonomy by denying them access to such important data as their finances.
Thanks to the following contributors: Kentarou Fukuda, Marc-Antoine Garrigue, Al Gilman, Charles McCathieNevile, David Pawson, David Poehlman, Janina Sajka, and Jason White.
This publication has been funded in part with Federal funds from the U.S. Department of Education under contract number ED05CO0039. The content of this publication does not necessarily reflect the views or policies of the U.S. Department of Education, nor does mention of trade names, commercial products, or organizations imply endorsement by the U.S. Government.