Professional Documents
Culture Documents
Course Wikibook
Course Wikibook
External links
Are We Fast Yet? (http:/ / arewefastyet. com/ ) - A daily comparison of bleeding-edge JavaScript engines for
Mozilla Firefox, Google Chrome and Apple Safari.
Peacekeeper (http:/ / peacekeeper. futuremark.com) - Browser speed test
SunSpider (http:/ / www2. webkit. org/ perf/ sunspider/ sunspider. html) - Online JavaScript speed test
Speed-Battle (http:/ / www. speed-battle. com) - Online JavaScript speed test
Descripter (http:/ / www. descripter.org) - A different open source JavaScript engine on Java platform
ECMAScript
124
ECMAScript
ECMAScript
Paradigm(s) Multi-paradigm: prototype-based, functional, imperative, scripting
Appeared in 1997
Designed by Brendan Eich, Ecma International
Typing discipline Duck, weak, dynamic
Major implementations JavaScript, ActionScript, JScript, QML, QtScript, InScript
Influenced by Self, HyperTalk, AWK, C, Perl, Python, Java, Scheme
ECMAScript
Filename extension .es
Internet media type app1icaion/ecmascrip
Developed by Sun Microsystems,
Ecma International
Initial release June 1997
Latest release Edition 5.1 / June2011
Type of format Scripting language
Website
ECMA-262
[1]
, ECMA-290
[2]
,
ECMA-327
[3]
, ECMA-357
[4]
Part of a series on
JavaScript
JavaScript syntax
JavaScript library
Unobtrusive JavaScript
JavaScript engine
Lists of Frameworks and Libraries
Ajax frameworks
JavaScript web application frameworks
Comparison of JavaScript frameworks
List of JavaScript libraries
JavaScript unit testing frameworks
JavaScript Object Notation
See also
ECMAScript
v
t
e
[1]
ECMAScript
125
ECMAScript is the scripting language standardized by Ecma International in the ECMA-262 specification and
ISO/IEC 16262. The language is widely used for client-side scripting on the web, in the form of several well-known
implementations such as JavaScript, JScript and ActionScript.
History
JavaScript was originally developed by Brendan Eich of Netscape under the name Mocha, later LiveScript, and
finally renamed to JavaScript. In December 1995, Sun Microsystems and Netscape announced JavaScript in a press
release. In March 1996, Netscape Navigator 2.0 was released, featuring support for JavaScript.
Owing to the widespread success of JavaScript as a client-side scripting language for web pages, Microsoft
developed a compatible dialect of the language, naming it JScript to avoid trademark issues. JScript added new date
methods to fix the non-Y2K-friendly methods in JavaScript, which were based on the Java Date class. JScript was
included in Internet Explorer 3.0, released in August 1996.
Netscape delivered JavaScript to Ecma International for standardization and the work on the specification,
ECMA-262, began in November 1996. The first edition of ECMA-262 was adopted by the Ecma General Assembly
of June 1997. Several editions of the language standard have been published since then.
ECMAScript is the name of the scripting language standardized in ECMA-262. The name "ECMAScript" was a
compromise between the organizations involved in standardizing the language, especially Netscape and Microsoft,
whose disputes dominated the early standards sessions. Brendan Eich, the creator of JavaScript, commented that
"ECMAScript was always an unwanted trade name that sounds like a skin disease."
While both JavaScript and JScript aim to be compatible with ECMAScript, they also provide additional features not
described in the ECMA specifications.
[citation needed]
Versions
There are five editions of ECMA-262 published. Work on a future edition, codenamed "Harmony", is in progress.
Edition Date
published
Changes from prior edition Editor
1 June 1997 First edition Guy L. Steele,
Jr.
2 June 1998 Editorial changes to keep the specification fully aligned with ISO/IEC 16262 international standard Mike
Cowlishaw
3 December
1999
Added regular expressions, better string handling, new control statements, try/catch exception handling,
tighter definition of errors, formatting for numeric output and other enhancements
Mike
Cowlishaw
4 Abandoned Fourth Edition was abandoned, due to political differences concerning language complexity. Many
features proposed for the Fourth Edition have been completely dropped; some are proposed for
ECMAScript Harmony.
5 December
2009
Adds "strict mode", a subset intended to provide more thorough error checking and avoid error-prone
constructs. Clarifies many ambiguities in the 3rd edition specification, and accommodates behaviour of
real-world implementations that differed consistently from that specification. Adds some new features,
such as getters and setters, library support for JSON, and more complete reflection on object properties.
Pratap
Lakshman,
Allen
Wirfs-Brock
5.1 June 2011 This edition 5.1 of the ECMAScript Standard is fully aligned with third edition of the international
standard ISO/IEC 16262:2011
Pratap
Lakshman,
Allen
Wirfs-Brock
ECMAScript
126
6 Work in
progress
The Sixth Edition adds significant new syntax for writing complex applications, including classes and
modules, but defines them semantically in the same terms as ECMAScript 5 strict mode. Other new
features include iterators and for/of loops, Python-style generators and generator expressions, arrow
functions, binary data, collections (maps, sets and weak maps), and proxies (metaprogramming for virtual
objects and wrappers). As the first "ECMAScript Harmony" specification, it is also known as "ES6
Harmony".
Allen
Wirfs-Brock
7 Work in
progress
The Seventh Edition is in a very early stage of development, but is intended to continue the themes of
language reform, code isolation, control of effects and library/tool enabling from ES6. New features
proposed include promises/concurrency, number and math enhancements, guards and trademarks (an
alternative to static typing), operator overloading, value types (first-class number-like objects), new
record structures (records, tuples and typed arrays), pattern matching, and traits.
In June 2004, Ecma International published ECMA-357 standard, defining an extension to ECMAScript, known as
ECMAScript for XML (E4X).
Ecma also defined a "Compact Profile" for ECMAScript - known as ES-CP, or ECMA 327 - which is designed
for resource-constrained devices. Several of the dynamic features of ECMAScript (such as the eva1 function) are
made optional, thus allowing the runtime to make more assumptions about the behaviour of programs and therefore
make more performance trade-offs when running the code. The HD DVD standard was one place where the
ECMAScript Compact Profile was used in favour of full ECMAScript to reduce processing and memory needs on
devices.
Features
The ECMAScript language includes structured, dynamic, functional, and prototype-based features, as officially
summarized here.
Implementations
ECMAScript is supported in many applications, especially web browsers, where it is implemented by JavaScript, or,
in the case of Internet Explorer, JScript. Implementations sometimes include extensions to the language, or to the
standard library and related application programming interfaces (API) such as the World Wide Web Consortium
(W3C) specified Document Object Model (DOM). This means that applications written in one implementation may
be incompatible with another, unless they are written to use only a common subset of supported features and APIs.
Application-implementation Implementation and latest
version
ECMAScript edition
Mozilla Firefox, the Gecko layout engine, SpiderMonkey, and
Rhino
[5]
JavaScript 1.8.5
[6]
ECMA-262, edition 5, and features from
upcoming 6.
[7]
Google Chrome, the V8 engine JavaScript
ECMA-262, edition 5
[8][9]
Internet Explorer, the Trident layout engine JScript 9.0 ECMA-262, edition 5
Opera
ECMAScript
[10]
ECMA-262, edition 5
[11]
RemObjects Script for .NET ECMAScript ECMA-262, edition 5
KHTML layout engine, KDE's Konqueror, and Apple Inc.'s
Safari
[12]
JavaScript ECMA-262, edition 3
Appweb Web Server, Samba 4 Ejscript 0.9.9
ECMA-262, edition 3
[13]
Microsoft .NET Framework JScript .NET 8.0
ECMA-262, edition 3
[14]
Adobe Flash and Adobe Flex ActionScript 3
ECMA-262, edition 3
[15]
ECMAScript
127
Adobe Acrobat
JavaScript 1.7
[16]
ECMA-262, edition 3
Adobe Creative Suite products: InDesign, Illustrator,
Photoshop, Bridge, After Effects, Premiere Pro
ExtendScript
ECMA-262, edition 3
[citation needed]
General purpose scripting language DMDScript 1.15 ECMA-262
OpenLaszlo
JavaScript
[17]
ECMA-262, edition 3
[18]
CriScript, JScript for game platforms CriScript 0.91.0 ECMA-262, edition 3
iCab InScript 3.22 (abandoned) ECMA-262, edition 3
Max/MSP JavaScript 1.5 ECMA-262, edition 3
ANT Galio 3
JavaScript 1.5
[19]
ECMA-262, edition 3
KDE QtScript ECMA-262, edition 3
Caja
ECMA-262, edition 3
[20]
Objective-J ECMA-262, edition 3
WMLScript ECMA-262, edition 3
Compiler-generated JavaScript applications TypeScript ECMA-262, edition 3, 5 and features from
upcoming 6.
Node.js JavaScript ECMA-262, edition 5
[1] http:/ / www. ecma-international.org/ publications/ standards/ Ecma-262. htm
[2] http:/ / www. ecma-international.org/ publications/ standards/ Ecma-290. htm
[3] http:/ / www. ecma-international.org/ publications/ standards/ Ecma-327. htm
[4] http:/ / www. ecma-international.org/ publications/ standards/ Ecma-357. htm
[5] The Mozilla implementations, (SpiderMonkey in the C++ language, Rhino in the Java language), are used in several third-party programs,
including the Yahoo Widget Engine (Konfabulator) and the Macintosh system-level scripting language JavaScript OSA.
[6] "JavaScript" is an ECMAScript variant managed by Mozilla. All non-Mozilla implementations using JavaScript are actually implementing
ECMAScript, rather than Javascript. "JavaScript" support generally is meant to describe support for ECMA-262, edition 3, though
some-notably Chrome, but also Opera 12 and Internet Explorer 10-target ECMA-262, edition 5.
[7] SpiderMonkey already supports a wide range of upcoming features: ECMAScript 6 support in Mozilla (https:/ / developer.mozilla. org/
en-US/ docs/ Web/ JavaScript/ ECMAScript_6_support_in_Mozilla)
[8] V8, the JavaScript engine created by Google and used in Chrome, implements ECMAScript as specified in ECMA-262, 5th edition: V8
JavaScript Engine (http:/ / code.google. com/ p/ v8/ ).
[9] Chrome also implements non-ECMAScript-standard extensions to the language which are present in WebKit, in order to maintain
compatibility with JavaScriptCore (which is itself based on the KDE KJS library) : V8 JavaScript Engine issue tracker (http:/ / code.google.
com/ p/ v8/ issues/ detail?id=890& can=1& q=Javascript 1. 8& colspec=ID Type Status Priority Owner Summary HW OS Area Stars).
[10] Opera's implementation includes some JavaScript and JScript extensions: ECMAScript support in Opera Presto 2.3 (http:/ / www.opera.
com/ docs/ specs/ presto23/ ecmascript/ )
[11] Full ECMAScript (JavaScript) 5.1 support in Opera 11.51+ : (http:/ / my. opera.com/ desktopteam/ blog/ 2011/ 09/ 13/ es5).
[12] Apple's Safari uses JavaScriptCore which is based on the KDE KJS library.
[13] This implementation asserts to support some extensions proposed in drafts of ECMAScript edition 4 (and now ECMAScript Harmony):
Ejscript Overview (http:/ / www. ejscript.org/ products/ ejs/ overview. html).
[14] [14] Microsoft asserts that JScript 8.0 supports "almost all of the features of the ECMAScript Edition 3 Language Specification" but does not list
the unsupported features.
[15] In addition to supporting ECMA-262 edition 3, ActionScript 3 also included support for extensions proposed in drafts of ECMAScript
edition 4: The Kiwi Project: AS3 language 101 for C/C++ coders (http:/ / blogs. adobe.com/ kiwi/ 2006/ 05/
as3_language_101_for_cc_coders.html).
[16] Adobe Acrobat 9.0 uses the SpiderMonkey 1.7 engine: JavaScript for Acrobat API Reference (http:/ / livedocs. adobe.com/ acrobat_sdk/ 9/
Acrobat9_HTMLHelp/ wwhelp/ wwhimpl/ common/ html/ wwhelp. htm?context=Acrobat9_HTMLHelp& file=JS_API_AcroJS. 88. 1. html)
[17] OpenLaszlo both uses an ECMAScript implementation as noted in the Developer's Guide: Appendix B: ECMAScript (http:/ / www.
openlaszlo.org/ lps4. 5/ docs/ developers/ ecmascript-and-lzx. html) and can compile down to JavaScript targeted for the browser (the
DHTML target).
[18] As of version 4, OpenLaszlo implements standard ECMAScript edition 3 with some extensions proposed in drafts of ECMAScript edition 4:
OpenLaszlo 4 (http:/ / www. openlaszlo.org/ legals).
ECMAScript
128
[19] ANT Galio Browser (http:/ / www.antplc. com/ ant_galio_browser. asp?menu=153) claims support for JavaScript 1.5.
[20] [20] Caja emulates strict mode as specified in the ECMAScript edition 5 draft.
Version correspondence
The following table is based on tedster's history compilation forum post and Microsoft's JScript version information
webpage. Items on the same line are approximately the same language.
JavaScript JScript ECMAScript
1.0 (Netscape 2.0,
March 1996)
1.0 (IE 3.0 - early
versions, August
1996)
1.1 (Netscape 3.0,
August 1996)
2.0 (IE 3.0 - later
versions, January
1997)
1.2 (Netscape
4.0-4.05, June
1997)
1.3 (Netscape
4.06-4.7x, October
1998)
3.0 (IE 4.0, Oct
1997)
Edition 1 (June 1997) / Edition 2 (June 1998)
1.4 (Netscape
Server only)
4.0 (Visual Studio
6, no IE release)
5.0 (IE 5.0, March
1999)
5.1 (IE 5.01)
1.5 (Netscape 6.0,
Nov 2000; also
later Netscape and
Mozilla releases)
5.5 (IE 5.5, July
2000)
Edition 3 (December 1999)
5.6 (IE 6.0,
October 2001)
1.6 (Gecko 1.8,
Firefox 1.5,
November 2005)
Edition 3, with some compliant enhancements: ECMAScript for XML (E4X), Array extras (e.g.
Array.prooype.forEach), Array and Sring generics ( New in JavaScript 1.6 (https:/ /
developer. mozilla. org/ en/ docs/ New_in_JavaScript_1. 6))
1.7 (Gecko 1.8.1,
Firefox 2, October
2006)
Edition 3 plus all JavaScript 1.6 enhancements, plus Pythonic generators and array comprehensions
([a*a for (a in ier)|), block scope with 1e, destructuring assignment (var
[a,b|=[1,2|) ( New in JavaScript 1.7 (https:/ / developer. mozilla. org/ en/ docs/
New_in_JavaScript_1. 7))
1.8 (Gecko 1.9,
Firefox 3, June
2008)
Edition 3 plus all JavaScript 1.7 enhancements, plus expression closures (funcion(x) x * x),
generator expressions, and more ( New in JavaScript 1.8 (https:/ / developer. mozilla.org/ en/ docs/
New_in_JavaScript_1. 8))
JScript .NET
(ASP.NET; no IE
release)
(JScript .NET is said to have been designed with the participation of other Ecma members)
JavaScript 2.0
(Work in progress)
Harmony (Work in progress; see the section "ECMAScript Harmony" below).
ECMAScript
129
Conformance tests
In 2010, Ecma International started developing a standards test for Ecma 262 ECMAScript. Test262 is an
ECMAScript conformance test suite that can be used to check how closely a JavaScript implementation follows the
ECMAScript 5th Edition Specification. The test suite contains thousands of individual tests, each of which tests
some specific requirements of the ECMAScript specification.
Development of Test262 is a project of Ecma Technical Committee 39 (TC39). The testing framework and
individual tests are created by member organizations of TC39 and contributed to Ecma for use in Test262.
Important contributions were made by Google (Sputnik testsuite) and Microsoft who both contributed thousands of
tests.
The Test262 testsuite already contains more than 11,000 tests and is being developed further as of 2013 (http:/ / en.
wikipedia. org/ w/ index. php?title=ECMAScript& action=edit). Be aware that Test262 itself may contain bugs
(https:/ / bugs. ecmascript. org/ buglist. cgi?order=Importance& query_format=advanced&
bug_status=CONFIRMED& bug_status=IN_PROGRESS& component=ECMA-262 Tests& product=Test262)
which may impact some browsers' scores. So take these figures with a grain of salt.
The following table shows current conformance results of browser products. Lower scores are better, although scores
can not be compared as tests are not weighted.
Product Version tested Test262
failed
Test suite version
(date)
Pre-release version Test262
failed
Test suite version
(date)
Internet
Explorer
11.0
(11.0.9600.16428)
7/11578 ES5.1 (2013-06-13)
Safari 7.0 (9537.71) 8/11578 ES5.1 (2013-06-13)
Opera 18.0.1284.63 9/11578 ES5.1 (2013-06-13)
Chrome 31.0.1650.63 m 9/11578 ES5.1 (2013-06-13) 31.0.1650.8 dev 3/11578 ES5.1 (2013-06-13)
Maxthon 4.2.0.4000 10/11578 ES5.1 (2013-06-13)
Firefox 26.0 73/11578 ES5.1 (2013-06-13) Nightly 29.0a1
(2013-12-16)
71/11578 ES5.1 (2013-06-13)
ECMAScript, 4th Edition
The proposed fourth edition of ECMA-262 (ECMAScript 4 or ES4) would have been the first major update to
ECMAScript since the third edition was published in 1999. The specification (along with a reference
implementation) was originally targeted for completion by October 2008. An overview (http:/ / www. ecmascript.
org/ es4/ spec/ overview. pdf) of the language was released by the working group on October 22, 2007.
As of August 2008, the ECMAScript 4th edition proposal has been scaled back into a project codenamed
ECMAScript Harmony.
ECMAScript
130
Features under discussion
Features under discussion for a future edition (originally "ECMAScript 4"; now ECMAScript Harmony) include:
Classes
A module system
Optional type annotations and static typing, probably using a structural type system
Generators and iterators
Destructuring assignment
Algebraic data types
The intent of these features is partly to better support programming in the large, and to allow sacrificing some of the
script's ability to be dynamic to improve performance. For example, Tamarin - the virtual machine for ActionScript
developed and open sourced by Adobe - has just-in-time compilation (JIT) support for certain classes of scripts.
Bug fixes and backwards compatibility
In addition to introducing new features, some ES3 bugs were proposed to be fixed in edition 4. These fixes and
others, and support for JSON encoding/decoding, have been folded into the ECMAScript, 5th Edition specification.
History
Work started on Edition 4 after the ES-CP (Compact Profile) specification was completed, and continued for
approximately 18 months where slow progress was made balancing the theory of Netscape's JavaScript 2
specification with the implementation experience of Microsoft's JScript .NET. After some time, the focus shifted to
the ECMAScript for XML (E4X) standard. The update has not been without controversy. In late 2007, a debate
between Eich, now the Mozilla Foundation's CTO, and Chris Wilson, Microsoft's platform architect for Internet
Explorer, became public on a number of blogs. Wilson cautioned that because the proposed changes to ECMAScript
made it backwards incompatible in some respects to earlier versions of the language, the update amounted to
"breaking the Web," and that stakeholders who opposed the changes were being "hidden from view". Eich responded
by stating that Wilson seemed to be "repeating falsehoods in blogs" and denied that there was attempt to suppress
dissent and challenging critics to give specific examples of incompatibility. He also pointed out that Microsoft
Silverlight and Adobe AIR rely on C# and ActionScript 3 respectively, both of which are larger and more complex
than ECMAScript Edition 3.
ECMAScript, 5th Edition
Yahoo, Microsoft, Google, and other 4th edition dissenters formed their own subcommittee to design a less
ambitious update of ECMAScript 3, tentatively named ECMAScript 3.1. This edition would focus on security and
library updates with a large emphasis on compatibility. After the aforementioned public sparring, the ECMAScript
3.1 and ECMAScript 4 teams agreed on a compromise: the two editions would be worked on, in parallel, with
coordination between the teams to ensure that ECMAScript 3.1 remains a strict subset of ECMAScript 4 in both
semantics and syntax.
However, the differing philosophies in each team resulted in repeated breakages of the subset rule, and it remained
doubtful that the ECMAScript 4 dissenters would ever support or implement ECMAScript 4 in the future. After over
a year since the disagreement over the future of ECMAScript within the Ecma Technical Committee 39, the two
teams reached a new compromise in July 2008: Brendan Eich announced that Ecma TC39 would focus work on the
ECMAScript 3.1 (later renamed to ECMAScript, 5th Edition) project with full collaboration of all parties, and
vendors would target at least two interoperable implementations by early 2009. In April 2009, Ecma TC39 published
the "final" draft of the 5th edition and announced that testing of interoperable implementations was expected to be
completed by mid-July. On December 3, 2009, ECMA-262 5th edition was published.
ECMAScript
131
ECMAScript Harmony (6th Edition)
In the July 2008 announcement, Eich also stated that the ECMAScript 4 proposal would be superseded by a new
project, code-named ECMAScript Harmony. ECMAScript Harmony names the agreed design trajectory of post-ES5
editions. It will include syntactic extensions, but the changes will be more modest than ECMAScript 4 in both
semantic and syntactic innovation. Packages, namespaces, and early binding from ECMAScript 4 are no longer
included for planned releases. In addition, other goals and ideas from ECMAScript 4 are being rephrased to keep
consensus in the committee; these include a notion of classes based on ECMAScript, 5th Edition (being an update to
ECMAScript, 3rd edition).
Drafts of ES.next have been published periodically since July 2011,
[1]
with a target release date of December
2013.
[2]
References
[1] harmony:specification_drafts [ES Wiki] (http:/ / wiki. ecmascript. org/ doku. php?id=harmony:specification_drafts). Wiki.ecmascript.org.
Retrieved on 2013-10-23.
[2] TC39 - ECMAScript (http:/ / ecma-international. org/ memento/ TC39-M. htm). Ecma-international.org. Retrieved on 2013-10-23.
External links
Official website (http:/ / www. ecmascript. org)
The World of ECMAScript (http:/ / ejohn. org/ blog/ the-world-of-ecmascript) : John Resig's map on
ECMAScript
ISO Standard
ISO 16262 (http:/ / www. iso. org/ iso/ iso_catalogue/ catalogue_tc/ catalogue_detail. htm?csnumber=55755)
Ecma Standards
ECMA-262 (http:/ / www. ecma-international. org/ publications/ standards/ Ecma-262. htm)
ECMA-262 ECMAScript Language Specification 3rd edition (December 1999) (http:/ / www.
ecma-international. org/ publications/ files/ ECMA-ST-ARCH/ ECMA-262, 3rd edition, December 1999. pdf)
ECMAScript Language Specification, Edition 3 Final, 24-Mar-00 (http:/ / www.mozilla. org/ js/ language/
E262-3. pdf)
ECMA-262 ECMAScript Language Specification 5th edition (December 2009) (http:/ / www.
ecma-international. org/ publications/ files/ ECMA-ST-ARCH/ ECMA-262 5th edition December 2009. pdf)
ECMA-262 ECMAScript Language Specification 5.1 edition (June 2011) (http:/ / www.ecma-international.
org/ publications/ files/ ECMA-ST/ ECMA-262 edition 5. 1, June 2011. pdf)
ECMA-290 ECMAScript Components Specification (June 1999) (http:/ / www.ecma-international. org/
publications/ standards/ Ecma-290. htm)
ECMA-327 ECMAScript 3rd Edition Compact Profile (June 2001) (http:/ / www.ecma-international. org/
publications/ standards/ Ecma-327. htm)
ECMA-357 ECMAScript for XML (E4X) Specification (June 2004) (http:/ / www.ecma-international. org/
publications/ standards/ Ecma-357. htm)
Ajax (programming)
132
Ajax (programming)
Ajax (also AJAX; /`etd_ks/; an acronym for Asynchronous JavaScript and XML) is a group of interrelated web
development techniques used on the client-side to create asynchronous web applications. With Ajax, web
applications can send data to, and retrieve data from, a server asynchronously (in the background) without interfering
with the display and behavior of the existing page. Data can be retrieved using the XMLHpReques object.
Despite the name, the use of XML is not required (JSON is often used instead. See AJAJ), and the requests do not
need to be asynchronous.
Ajax is not a single technology, but a group of technologies. HTML and CSS can be used in combination to mark up
and style information. The DOM is accessed with JavaScript to dynamically display, and allow the user to interact
with, the information presented. JavaScript and the XMLHttpRequest object provide a method for exchanging data
asynchronously between browser and server to avoid full page reloads.
History
In the 1990s, most web sites were based on complete HTML pages. Each user action required that the page be
reloaded from the server (or a new page loaded). This process was inefficient, as reflected by the user experience: all
page content disappeared, then reappeared. Each time a page was reloaded due to a partial change, all of the content
had to be re-sent, even though only some of the information had changed. This placed additional load on the server
and used excessive bandwidth. In 1996, the iframe tag was introduced by Internet Explorer to load content
asynchronously.
In 1998, Microsoft Outlook Web Access team implemented the first component XMLHTTP by client script.
In 1999, Microsoft utilized its iframe technology to dynamically update the news stories and stock quotes on the
default page for Internet Explorer,
[1]
and created the XMLHTTP ActiveX control in Internet Explorer 5, which was
later adopted by Mozilla, Safari, Opera and other browsers as the XMLHttpRequest JavaScript object. Microsoft has
adopted the native XMLHttpRequest model as of Internet Explorer 7, though the ActiveX version is still supported.
The utility of background HTTP requests to the server and asynchronous web technologies remained fairly obscure
until it started appearing in full scale online applications such as Outlook Web Access (2000) and Oddpost (2002).
Google made a wide deployment of standards-compliant, cross browser Ajax with Gmail (2004) and Google Maps
(2005).
The term Ajax was coined on 18 February 2005 by Jesse James Garrett in an article entitled "Ajax: A New Approach
to Web Applications", based on techniques used on Google pages.
On 5 April 2006, the World Wide Web Consortium (W3C) released the first draft specification for the
XMLHttpRequest object in an attempt to create an official web standard.
Ajax (programming)
133
Technologies
The term Ajax has come to represent a broad group of web technologies that can be used to implement a web
application that communicates with a server in the background, without interfering with the current state of the page.
In the article that coined the term Ajax, Jesse James Garrett explained that the following technologies are
incorporated:
HTML (or XHTML) and CSS for presentation
The Document Object Model (DOM) for dynamic display of and interaction with data
XML for the interchange of data, and XSLT for its manipulation
The XMLHttpRequest object for asynchronous communication
JavaScript to bring these technologies together
Since then however there have been a number of developments in the technologies used in an Ajax application, and
the definition of the term Ajax. XML is not required for data interchange and therefore XSLT is not required for the
manipulation of data. JavaScript Object Notation (JSON) is often used as an alternative format for data interchange,
although other formats such as preformatted HTML or plain text can also be used.
Asynchronous HTML and HTTP
[2]
(AHAH) involves using XMLHTTPRequest to retrieve (X)HTML fragments
which are then inserted directly into the web page.
Drawbacks
In pre-HTML5 browsers, pages dynamically created using successive Ajax requests did not automatically register
themselves with the browser's history engine, so clicking the browser's "back" button may not have returned the
browser to an earlier state of the Ajax-enabled page, but may have instead returned to the last full page visited
before it. Such behavior-navigating between pages instead of navigating between page states-may be
desirable, but if fine-grained tracking of page state is required then a pre-HTML5 workaround was to use invisible
iframes to trigger changes in the browser's history. A workaround implemented by Ajax techniques is to change
the URL fragment identifier (the part of a URL after the '#') when an Ajax-enabled page is accessed and monitor
it for changes. HTML5 provides an extensive API standard for working with the browser's history engine.
Dynamic web page updates also make it difficult to bookmark and return to a particular state of the application.
Solutions to this problem exist, many of which again use the URL fragment identifier. The solution provided by
HTML5 for the above problem also applies for this.
Depending on the nature of the Ajax application, dynamic page updates may interfere disruptively with user
interactions, especially if working on an unstable Internet connection. For instance, editing a search field may
trigger a query to the server for search completions, but the user may not know that a search completion popup is
forthcoming, and if the internet connection is slow, the popup list may show up at an inconvenient time, when the
user has already proceeded to do something else.
Because most web crawlers do not execute JavaScript code, publicly indexable web applications should provide
an alternative means of accessing the content that would normally be retrieved with Ajax, thereby allowing search
engines to index it.
Any user whose browser does not support JavaScript or XMLHpReques, or simply has this functionality
disabled, will not be able to properly use pages which depend on Ajax. Devices such as smartphones and PDAs
may not have support for the required technologies, though this is becoming less of an issue. The only way to let
the user carry out functionality is to fall back to non-JavaScript methods. This can be achieved by making sure
links and forms can be resolved properly and not relying solely on Ajax.
Similarly, some web applications which use Ajax are built in a way that cannot be read by screen-reading
technologies, such as JAWS. The WAI-ARIA standards provide a way to provide hints in such a case.
Screen readers that are able to use Ajax may still not be able to properly read the dynamically generated content.
Ajax (programming)
134
The same origin policy prevents some Ajax techniques from being used across domains, although the W3C has a
draft of the XMLHttpRequest object that would enable this functionality. Methods exist to sidestep this security
feature by using a special Cross Domain Communications channel embedded as an iframe within a page, or by
the use of JSONP.
The asynchronous callback-style of programming required can lead to complex code that is hard to maintain, to
debug and to test.
Example
Here is an example of a simple Ajax request using the GET method.
get-ajax-data.js:
// This is the c1ient-side script
// Initia1ize the ax request
var xhr = new XMLHpReques(),
xhr.open('ge', 'send-a_ax-daa.php'),
// Track the state changes of the request
xhr.onreadysaechange = function(){
// Ready state 4 means the request is done
if(xhr.readySae === 4){
// 200 is a successfu1 return
if(xhr.saus === 200){
a1er(xhr.responseTex), // 'This is the returned text.'
}else{
a1er('Error: '+xhr.saus), // n error occurred during
he reques
}
}
}
// Send the request to send-aax-data.php
xhr.send(null),
send-ajax-data.php:
<?php
// This is the server-side script
// Set the content type
header('Conen-Type: ex/p1ain'),
// Send the data back
echo "This is he reurned ex.",
?>
Ajax (programming)
135
jQuery example
This example uses the popular JavaScript library jQuery, to do the same thing as the example above.
$.ge('send-a_ax-daa.php', function(daa) {
a1er(daa),
}),
References
[1] MSN.com (http:/ / home.microsoft. com). Home.microsoft.com (1999-12-31). Retrieved on 2013-07-13.
[2] http:/ / microformats.org/ wiki/ rest/ ahah
External links
Ajax: A New Approach to Web Applications (http:/ / www. adaptivepath. com/ ideas/ essays/ archives/ 000385.
php)-Article that coined the term and Q&A
Ajax (programming) (http:/ / www. dmoz. org/ Computers/ Programming/ Languages/ JavaScript/ Ajax/ ) on the
Open Directory Project
Ajax Tutorial (http:/ / www. xul. fr/ en-xml-ajax. html) with GET, POST, text and XML examples.
XMLHttpRequest
HTTP
Persistence
Compression
HTTPS
Request methods
OPTIONS
GET
HEAD
POST
PUT
DELETE
TRACE
CONNECT
PATCH
Header fields
Cookie
ETag
Location
HTTP referer
DNT
X-Forwarded-For
Status codes
XMLHttpRequest
136
301 Moved Permanently
302 Found
303 See Other
403 Forbidden
404 Not Found
v
t
e
[1]
XMLHttpRequest (XHR) is an API available to web browser scripting languages such as JavaScript. It is used to
send HTTP or HTTPS requests to a web server and load the server response data back into the script. Development
versions of all major browsers support URI schemes beyond http: and https:, in particular, blob: URLs are
supported.
[2]
The name was standardized to XMLHttpRequest for compatibility. It may be misleading, in particular because any
textual data may be received from the server, not just XML. Data are also commonly received as JSON, HTML, or
as plain text. Data from the response can be used to alter the current document in the browser window without
loading a new web page. The response data can also be evaluated by client-side scripting. For example, if it was
formatted as JSON by the web server, it can be converted into a client-side data object for further use.
XMLHttpRequest has an important role in the Ajax web development technique. It is currently used by many
websites to implement responsive and dynamic web applications.
XMLHttpRequest is subject to the browser's same-origin policy: for security reasons, requests will only succeed if
they are made to the same server that served the original web page.
History and support
The concept behind the XMLHttpRequest object was originally created by the developers of Outlook Web Access
(by Microsoft) for Microsoft Exchange Server 2000. An interface called IXMLHTTPRequest was developed and
implemented into the second version of the MSXML library using this concept. The second version of the MSXML
library was shipped with Internet Explorer 5.0 in March 1999, allowing access, via ActiveX, to the
IXMLHTTPRequest interface using the XMLHTTP wrapper of the MSXML library.
The Mozilla project developed and implemented an interface called nsIXMLHttpRequest into the Gecko layout
engine. This interface was modeled to work as closely to Microsoft's IXMLHTTPRequest interface as possible.
Mozilla created a wrapper to use this interface through a JavaScript object which they called XMLHttpReqaest. The
XMLHttpRequest object was accessible as early as Gecko version 0.6 released on December 6 of 2000, but it was not
completely functional until as late as version 1.0 of Gecko released on June 5, 2002. The XMLHttpRequest object
became a de facto standard in other major web clients, implemented in Safari 1.2 released in February 2004,
Konqueror, Opera 8.0 released in April 2005, and iCab 3.0b352 released in September 2005.
The World Wide Web Consortium published a Working Draft specification for the XMLHttpRequest object on April
5, 2006, edited by Anne van Kesteren of Opera Software and Dean Jackson of W3C. Its goal is "to document a
minimum set of interoperable features based on existing implementations, allowing Web developers to use these
features without platform-specific code." The last revision to the XMLHttpRequest object specification was on
November 19 of 2009, being a last call working draft.
Microsoft added the XMLHttpRequest object identifier to its scripting languages in Internet Explorer 7.0 released in
October 2006.
With the advent of cross-browser JavaScript libraries such as jQuery and the Prototype JavaScript Framework,
developers can invoke XMLHttpRequest functionality without coding directly to the API. Prototype provides an
asynchronous requester object called A_ax.Reques that wraps the browser's underlying implementation and
XMLHttpRequest
137
provides access to it. jQuery objects represent or wrap elements from the current client-side DOM. They all have a
.1oad() method that takes a URI parameter and makes an XMLHttpRequest to that URI, then by default places
any returned HTML into the HTML element represented by the jQuery object.
The W3C has since published another Working Draft specification for the XMLHttpRequest object,
"XMLHttpRequest Level 2", on February 25 of 2008. Level 2 consists of extended functionality to the
XMLHttpReqaest object, including, but not currently limited to, progress events, support for cross-site requests, and
the handling of byte streams. The latest revision of the XMLHttpRequest Level 2 specification is that of 16 August
2011, which is still a working draft.
As of 5December2011[3], XMLHttpRequest version 2 has been merged into the main XMLHttpRequest
specification, and there is no longer a version 1 and a version 2.
Support in Internet Explorer versions 5, 5.5, and 6
Internet Explorer versions 5 and 6 did not define the XMLHttpRequest object identifier in their scripting languages
as the XMLHttpRequest identifier itself was not standard at the time of their releases. Backward compatibility can be
achieved through object detection if the XMLHttpRequest identifier does not exist.
Web pages that use XMLHttpRequest or XMLHTTP can mitigate the current minor differences in the
implementations either by encapsulating the XMLHttpRequest object in a JavaScript wrapper, or by using an
existing framework that does so. In either case, the wrapper should detect the abilities of current implementation and
work within its requirements.
Until 8 April 2014 Microsoft will support Windows XP and so Internet Explorer 6 - a JavaScript encapsulation
example is provided below.
/*
Rrovide the XMLHttpRequest constructor for Internet Exp1orer
5.x-6.x:
Other browsers (inc1uding Internet Exp1orer 7.x-9.x) do not redefine
XMLHttpRequest if it a1ready exists.
This examp1e is based on findings at:
http://b1ogs.msdn.com/xm1team/archive/2006/10/23/using-the-right-version-of-msxm1-in-internet-exp1orer.aspx
*/
if (typeof XMLHpReques === "undefined") {
XMLHpReques = function () {
try { return new AciveXOb_ec("Msxm12.XMLHTTR.6.0"), }
catch (e) {}
try { return new AciveXOb_ec("Msxm12.XMLHTTR.3.0"), }
catch (e) {}
try { return new AciveXOb_ec("Microsof.XMLHTTR"), }
catch (e) {}
throw new Error("This browser does no suppor XMLHpReques."),
},
}
XMLHttpRequest
138
HTTP request
The following sections demonstrate how a request using the XMLHttpRequest object functions within a conforming
user agent based on the W3C Working Draft. As the W3C standard for the XMLHttpRequest object is still a draft,
user agents may not abide by all the functionings of the W3C definition and any of the following is subject to
change. Extreme care should be taken into consideration when scripting with the XMLHttpRequest object across
multiple user agents. This article will try to list the inconsistencies between the major user agents.
The apen method
The HTTP and HTTPS requests of the XMLHttpRequest object must be initialized through the apen method. This
method must be invoked prior to the actual sending of a request to validate and resolve the request method, URL,
and URI user information to be used for the request. This method does not assure that the URL exists or the user
information is correct. This method can accept up to five parameters, but requires only two, to initialize a request.
open( Mehod, URL, Asynchronous, UserName, Rassword )
The first parameter of the method is a text string indicating the HTTP request method to use. The request methods
that must be supported by a conforming user agent, defined by the W3C draft for the XMLHttpRequest object, are
currently listed as the following.
GET (Supported by Internet Explorer 7 (and later), Mozilla 1+)
POST (Supported by Internet Explorer 7 (and later), Mozilla 1 (and later))
HEAD (Supported by Internet Explorer 7 (and later))
PUT
DELETE
OPTIONS (Supported by Internet Explorer 7 (and later))
However, request methods are not limited to the ones listed above. The W3C draft states that a browser may support
additional request methods at their own discretion.
The second parameter of the method is another text string, this one indicating the URL of the HTTP request. The
W3C recommends that browsers should raise an error and not allow the request of a URL with either a different port
or ihost URI component from the current document.
The third parameter, a boolean value indicating whether or not the request will be asynchronous, is not a required
parameter by the W3C draft. The default value of this parameter should be assumed to be true by a W3C conforming
user agent if it is not provided. An asynchronous request ("true") will not wait on a server response before continuing
on with the execution of the current script. It will instead invoke the onreadystatechange event listener of the
XMLHttpRequest object throughout the various stages of the request. A synchronous request ("false") however will
block execution of the current script until the request has been completed, thus not invoking the anreadystatechange
event listener.
The fourth and fifth parameters are the username and password, respectively. These parameters, or just the username,
may be provided for authentication and authorization if required by the server for this request.
XMLHttpRequest
139
The setReqaestHeader method
Upon successful initialization of a request, the setReqaestHeader method of the XMLHttpRequest object can be
invoked to send HTTP headers with the request.
seRequesHeader( Name, Va1ue )
The first parameter of this method is the text string name of the header. The second parameter is the text string value.
This method must be invoked for each header that needs to be sent with the request. Any headers attached here will
be removed the next time the open method is invoked in a W3C conforming user agent.
The send method
To send an HTTP request, the send method of the XMLHttpRequest must be invoked. This method accepts a single
parameter containing the content to be sent with the request.
send( aa )
This parameter may be omitted if no content needs to be sent. The W3C draft states that this parameter may be any
type available to the scripting language as long as it can be turned into a text string, with the exception of the DOM
dacament object. If a user agent cannot serialise the parameter, then the parameter should be ignored. Firefox 3.0.x
and previous versions will however throw an exception if send is called without an argument.
[4]
If the parameter is a DOM document object, a user agent should assure the document is turned into well-formed
XML using the encoding indicated by the inputEncoding property of the document object. If the Content-Type
request header was not added through setRequestHeader yet, it should automatically be added by a conforming user
agent as "application/xml;charset=charset," where charset is the encoding used to encode the document.
If the user agent is configured to use a proxy server, then the XMLHttpRequest object will modify the request
appropriately so as to connect to the proxy instead of the origin server, and send Rroxy-Auhorizaion
headers as configured.
The anreadystatechange event listener
If the open method of the XMLHttpRequest object was invoked with the third parameter set to true for an
asynchronous request, the onreadystatechange event listener will be automatically invoked for each of the
following actions that change the readyState property of the XMLHttpRequest object.
State changes work like this:
After the open method has been invoked successfully, the readyState property of the XMLHttpRequest object
should be assigned a value of 1.
After the send method has been invoked and the HTTP response headers have been received, the readyState
property of the XMLHttpRequest object should be assigned a value of 2.
Once the HTTP response content begins to load, the readyState property of the XMLHttpRequest object should
be assigned a value of 3.
Once the HTTP response content has finished loading, the readyState property of the XMLHttpRequest object
should be assigned a value of 4.
The listener will only respond to state changes which occur after the listener is defined. To detect states 1 and 2, the
listener must be defined before the open method is invoked. The open method must be invoked before the send
method is invoked.
xm1hp.onreadysaechange = function() {
if (xm1hp.readySae === 4){
a1er(xm1hp.readySae),
XMLHttpRequest
140
}
},
xm1hp.open('GET', 'somepage.xm1', true),
xm1hp.seRequesHeader('X-Requesed-Wih', 'XMLHpReques'), //
Te11s server ha this ca11 is made for a_ax purposes.
//
Mos 1ibraries 1i'e _Query/Rrooype/o_o do this
xm1hp.send(null), // No data need to send a1ong with the request.
The abart method
This method aborts the request if the readyState of the XMLHttpRequest object has not yet become 4. The abort
method ensures that the callback handler does not get invoked in an asynchronous request.
abor( )
Some AJAX libraries use the abort method to cancel potential duplicate or out-of-order requests.
The HTTP response
After a successful and completed call to the send method of the XMLHttpRequest, if the server response was valid
XML and the Cantent-Type header sent by the server is understood by the user agent as an Internet media type for
XML, the respanseXML property of the XMLHttpRequest object will contain a DOM document object. Another
property, respanseText will contain the response of the server in plain text by a conforming user agent, regardless of
whether or not it was understood as XML.
Cross-domain requests
In the early development of the World Wide Web, it was found possible to breach users' security by the use of
JavaScript to exchange information from one web site with that from another less reputable one. All modern
browsers therefore implement a same origin policy that prevents many such attacks, such as cross-site scripting.
XMLHttpRequest data is subject to this security policy, but sometimes web developers want intentionally to
circumvent its restrictions. This is sometimes due to the legitimate use of subdomains as, for example, making an
XMLHttpRequest from a page created by foo.examp1e.com for information from bar.examp1e.com will
normally fail.
Various alternatives exist to circumvent this security feature, including using JSONP, Cross-Origin Resource
Sharing (CORS) or alternatives with plugins such as Flash or Silverlight. Cross-origin XMLHttpRequest is specified
in W3C's XMLHttpRequest Level 2 specification and it is supported by all modern browsers (desktop and mobile).
Internet Explorer did not implement CORS until version 10. The two previous versions (8 and 9) offered similar
functionality through the XDomainRequest API. This API has several restrictions, including but not limited to:
denial of setting custom request headers and omission of cookies. Further, only the GET and POST request methods
are supported. In practice, the POST method is barely useful, because the only allowed value for the Content-Type
request header is "text/plain", while many server-side frameworks require "application/x-www-urlencoded" to
function properly.
XMLHttpRequest
141
References
[1] http:/ / en. wikipedia.org/ w/ index.php?title=Template:HTTP& action=edit
[2] http:/ / dev.w3. org/ 2006/ webapi/ FileAPI/
[3] http:/ / en. wikipedia.org/ w/ index.php?title=XMLHttpRequest& action=edit
[4] [4] Test-Driven JavaScript Development, Christian Johansen, ADDISON-WESLEY, 2010, p. 270
External links
Specifications
XMLHttpRequest (level 1) specification (http:/ / www. w3. org/ TR/ 2012/ NOTE-XMLHttpRequest1-20120117/
) from W3C (abandoned Candidate Recommendation)
XMLHttpRequest level 2 specification (http:/ / www. w3. org/ TR/ XMLHttpRequest2/ ) from W3C (Working
Draft)
Cross-Origin Resource Sharing (http:/ / www. w3. org/ TR/ cors/ )
Progress Events 1.0 (http:/ / www. w3. org/ TR/ progress-events/ )
Browsers
MSDN Library
Specification of the XMLHttpRequest object for Microsoft developers (http:/ / msdn. microsoft. com/ en-us/
library/ ms535874(VS. 85). aspx)
XDomainRequest (http:/ / msdn. microsoft.com/ en-us/ library/ cc288060. aspx)
Specification of the XMLHttpRequest object for Mozilla developers (https:/ / developer. mozilla. org/ en/
XMLHttpRequest)
Specification of the XMLHttpRequest object for Opera developers (http:/ / www.opera. com/ docs/ specs/
opera9/ xhr/ )
Other
New Tricks in XMLHttpRequest2 (http:/ / www. html5rocks. com/ en/ tutorials/ file/ xhr2/ ), online tutorial by
Eric Bidelman (Developer Relations, Google)
"Attacking AJAX Applications" (http:/ / www. isecpartners. com/ files/ iSEC-Attacking_AJAX_Applications.
BH2006. pdf), a presentation given at the Black Hat security conference. Discusses several issues involving XHR
and the future of cross-domain Ajax.
(http:/ / windows. microsoft. com/ en-US/ windows/ end-support-help) Support end of Windows XP
Brendan Eich
142
Brendan Eich
Brendan Eich
Born 1961 (age52-53)
Pittsburgh, Pennsylvania
A/mamater University of Illinois at Urbana-Champaign
Occupation CTO, Mozilla Corporation
Knownfor JavaScript
Website
brendaneich.com
[1]
Brendan Eich (/`atk/; born 1961) is an American computer programmer and creator of the JavaScript scripting
language. He is the chief technology officer at the Mozilla Corporation.
Education
Brendan Eich received his bachelor's degree in mathematics and computer science at Santa Clara University. He
received his master's degree in 1986 from the University of Illinois at Urbana-Champaign.
Career
Eich started his career at Silicon Graphics, working for seven years on operating system and network code.
[2]
He
then worked for three years at MicroUnity Systems Engineering writing microkernel and DSP code, and doing the
first MIPS R4000 port of GCC.
Eich is best known for his work on Netscape and Mozilla. He started work at Netscape Communications Corporation
in April 1995, working on JavaScript (originally called Mocha, then called LiveScript) for the Netscape Navigator
web browser.
He then helped found mozilla.org in early 1998, serving as chief architect. When AOL shut down the Netscape
browser unit in July 2003, Eich helped spin out the Mozilla Foundation.
In August 2005, after serving as Lead Technologist and as a member of the Board of Directors of the Mozilla
Foundation, Eich became CTO of the newly founded Mozilla Corporation.
Brendan Eich
143
Eich has contributed to the creation of the Rust programming language at Mozilla.
[3]
Political activities
Eich donated $1,000 in 2008 to the campaign supporting California Proposition 8, which was recorded in a public
database with Mozilla's name attached as his employer, and many people commented about this donation on Twitter
in March 2012.
References
[1] https:/ / brendaneich. com/
[2] Brendan Eich and JavaScript (http:/ / inventors. about. com/ library/ inventors/ bl_javascript. htm) (about.com)
[3] Original Rust authors GitHub (https:/ / github. com/ mozilla/ rust/ commit/ c01efc669f09508b55eced32d3c88702578a7c3e#diff-1)
External links
Mozilla Futures: Analysis and Proposals (http:/ / www-archive.mozilla. org/ events/ dev-day-feb-2004/
mozilla-futures/ title. html) (Slides presented at Mozilla Developer Day on February 27, 2004; more detailed than
the recent slides cited in roadmap blog)
Brendan's blog (http:/ / brendaneich. com/ )
Brendan's Roadmap Updates (http:/ / weblogs. mozillazine. org/ roadmap/ ) (Mozilla roadmap weblog)
Brendan Eich on the Gillmor Gang July 2004 (http:/ / www. itconversations. com/ shows/ detail156. html) and
December 2005 (http:/ / gillmorgang. podshow. com/ ?p=25)
Brendan's Netscape Joke Homepage (http:/ / web. archive. org/ web/ 20000815055653/ people. netscape. com/
brendan/ )
Computerworld Interview with Brendan Eich on JavaScript (http:/ / www.computerworld. com. au/ index. php/
id;243672124;fp;4194304;fpid;1)
Douglas Crockford
144
Douglas Crockford
Douglas Crockford
Douglas Crockford at the "Browser Wars: Episode II Attack of the DOMs" event on 2007-02-28
Born MinnesotaWikipedia:Manual of Style/Dates and numbers#Chronological items
A/mamater San Francisco State University
Occupation senior JavaScript architect
Employer PayPal
Knownfor JavaScript Object Notation
Website
crockford.com
[1]
Douglas Crockford is an American computer programmer and entrepreneur who is best known for his ongoing
involvement in the development of the JavaScript language, for having popularized the data format JSON
(JavaScript Object Notation), and for developing various JavaScript related tools such as JSLint and JSMin. He is
currently a senior JavaScript architect at PayPal, and is also a writer and speaker on JavaScript, JSON, and related
web technologies such as the Yahoo User Interface Library (YUI).
Early years
Crockford earned a degree in Radio and Television from San Francisco State University.
[2]
in 1975. He took classes
in FORTRAN and worked with a university lab's computers.
Career
After Crockford purchased an Atari 8-bit computer in 1980, he wrote Galahad and the Holy Grail for Atari Program
Exchange. Chris Crawford hired him at Atari, Inc., and after Warner Communications sold the company he joined
National Semiconductor. In 1984 Crockford joined Lucasfilm, and later Paramount Pictures. He became something
of a cult figure on video game oriented listservs in the early 1990s after he posted his memoir "The Expurgation of
Maniac Mansion" to a videogaming bulletin board; the memoir documented his efforts to censor the computer game
Maniac Mansion to Nintendo's satisfaction so that they could release it as a cartridge, and Crockford's mounting
frustrations as Nintendo's demands became more obscure and confusing.
[3]
Together with Randy Farmer and Chip Morningstar, Crockford founded Electric Communities and was its CEO
from 1994 to 1995. He was involved in the development of the programming language E.
Crockford was also the founder of State Software (also known as Veil Networks) and its CTO from 2001 to 2002.
Douglas Crockford
145
During his time at State Software, Crockford popularized the JSON data format, based upon existing JavaScript
language constructs, as a lightweight alternative to XML. He obtained the domain name json.org in 2002, and put up
his description of the format there.
[4]
In July 2006 he specified the format officially, as RFC 4627.
[5]
Criticism
In 2002, in reference to President George Bush's war on "evildoers", Crockford added the requirement "The
Software shall be used for Good, not Evil" to the open source MIT License for his JSMin software. This clause was
carried over to JSMin-PHP, a variation of JSMin by Ryan Grove. This software was hosted on Google Code until
December 2009 when, due to the additional clause, Google determined that the license was not compliant with the
definition of open source software, which does not permit any restriction on how software may be used. JSMin-PHP
was forced to migrate to a new hosting provider.
Despite its humorous
[6]
intent, the "evil" clause has continued to cause problems for some open source software
developers when they inadvertently use code based on Crockford's version of the MIT License, and has inspired
criticism of Crockford from affected open source developers as recently as November 2012. Crockford has refused
to change the license terms despite numerous requests, with the notable exception from IBM
Bibliography
JavaScript. The Good Parts
[7]
. O'Reilly. 2008. ISBN978-0-596-51774-8. OCLC192027457
[8]
..
References
[1] http:/ / crockford. com
[2] Douglas Crockford speaker biography (http:/ / www.almaden. ibm. com/ cs/ new_paradigms/ crockfor. html), New Paradigms for Using
Computers conference, IBM Almaden Research Center, August 22, 1996
[3] The Expurgation of Maniac Mansion: A Memoir by Douglas Crockford (http:/ / www.crockford. com/ wrrrld/ maniac. html)
[4] JSON: The Fat-Free Alternative to XML (http:/ / www. json. org/ fatfree. html), Douglas Crockford, December 6, 2006
[5] RFC 4627: The application/json Media Type for JavaScript Object Notation (JSON) (http:/ / tools. ietf. org/ html/ rfc4627)
[6] Douglas Crockford: The JSON Saga (http:/ / www.youtube. com/ watch?v=-C-JoyNuQJs& t=39m50s). YouTube (2011-08-28). Retrieved on
2013-08-23.
[7] http:/ / oreilly.com/ catalog/ 9780596517748/
[8] http:/ / www. worldcat.org/ oclc/ 192027457
External links
Official website (http:/ / crockford. com)
Douglas Crockford's Lectures on Javascript (http:/ / yuiblog. com/ crockford/ )
146
Chapter 14: Single-Page Applications with
JavaScript, JSON, and REST API
Web application
Google Calendar is a contact- and time-management web application
offered by Google.
Horde groupware is an open source web application.
In computing, a web-based application is any
application that uses a web browser as a client.
[1][2]
The
term may also mean a computer software application
that is coded in a browser-supported programming
language (such as JavaScript, combined with a
browser-rendered markup language like HTML) and
reliant on a common web browser to render the
application executable.
Web applications are popular due to the ubiquity of
web browsers, and the convenience of using a web
browser as a client, sometimes called a thin client. The
ability to update and maintain web applications without
distributing and installing software on potentially
thousands of client computers is a key reason for their
popularity, as is the inherent support for cross-platform
compatibility. Common web applications include
webmail, online retail sales, online auctions, wikis and
many other functions.
History
In earlier computing models, e.g. in client-server, the
load for the application was shared between code on the
server and code installed on each client locally. In other
words, an application had its own client program which served as its user interface and had to be separately installed
on each user's personal computer. An upgrade to the server-side code of the application would typically also require
an upgrade to the client-side code installed on each user workstation, adding to the support cost and decreasing
productivity.
In contrast, web applications use web documents written in a standard format such as HTML and JavaScript, which
are supported by a variety of web browsers. Web applications can be considered as a specific variant of client-server
software where the client software is downloaded to the client machine when visiting the relevant web page, using
standard procedures such as HTTP. Client web software updates may happen each time the web page is visited.
During the session, the web browser interprets and displays the pages, and acts as the universal client
[3]
for any web
application.
In the early days of the Web each individual web page was delivered to the client as a static document, but the
sequence of pages could provide an interactive experience, as user input is returned through web form elements
embedded in the page markup.
Web application
147
In 1995 Netscape introduced a client-side scripting language called JavaScript allowing programmers to add some
dynamic elements to the user interface that ran on the client side. So instead of sending data to the server in order to
generate an entire web page, the embedded scripts of the downloaded page can perform various tasks such as input
validation or showing/hiding parts of the page.
In 1996, Macromedia introduced Flash, a vector animation player that could be added to browsers as a plug-in to
embed animations on the web pages. It allowed the use of a scripting language to program interactions on the client
side with no need to communicate with the server.
In 1999, the "web application" concept was introduced in the Java language in the Servlet Specification version 2.2.
[2.1?]. At that time both JavaScript and XML had already been developed, but Ajax had still not yet been coined and
the XMLHttpRequest object had only been recently introduced on Internet Explorer 5 as an ActiveX object.
In 2005, the term Ajax was coined, and applications like Gmail started to make their client sides more and more
interactive. A web page script is able to contact the server for storing/retrieving data without downloading an entire
web page.
In 2011, HTML5 was finalized, which provides graphic and multimedia capabilities without the need of client side
plugins. HTML5 also enriched the semantic content of documents. The APIs and document object model (DOM) are
no longer afterthoughts, but are fundamental parts of the HTML5 specification. WebGL API paved the way for
advanced 3D graphics based on HTML5 canvas and JavaScript language. These have significant importance in
creating truly platform and browser independent rich web applications.
Interface
Through Java, JavaScript, DHTML, Flash, Silverlight and other technologies, application-specific methods such as
drawing on the screen, playing audio, and access to the keyboard and mouse are all possible. Many services have
worked to combine all of these into a more familiar interface that adopts the appearance of an operating system.
General purpose techniques such as drag and drop are also supported by these technologies. Web developers often
use client-side scripting to add functionality, especially to create an interactive experience that does not require page
reloading. Recently, technologies have been developed to coordinate client-side scripting with server-side
technologies such as PHP. Ajax, a web development technique using a combination of various technologies, is an
example of technology which creates a more interactive experience.
Structure
Applications are usually broken into logical chunks called "tiers", where every tier is assigned a role. Traditional
applications consist only of 1 tier, which resides on the client machine, but web applications lend themselves to an
n-tiered approach by nature. Though many variations are possible, the most common structure is the three-tiered
application. In its most common form, the three tiers are called presentation, application and storage, in this order. A
web browser is the first tier (presentation), an engine using some dynamic Web content technology (such as ASP,
ASP.NET, CGI, ColdFusion, JSP/Java, PHP, Perl, Python, Ruby on Rails or Struts2) is the middle tier (application
logic), and a database is the third tier (storage). The web browser sends requests to the middle tier, which services
them by making queries and updates against the database and generates a user interface.
For more complex applications, a 3-tier solution may fall short, and it may be beneficial to use an n-tiered approach,
where the greatest benefit is breaking the business logic, which resides on the application tier, into a more
fine-grained model. Another benefit may be adding an integration tier that separates the data tier from the rest of
tiers by providing an easy-to-use interface to access the data. For example, the client data would be accessed by
calling a "list_clients()" function instead of making an SQL query directly against the client table on the database.
This allows the underlying database to be replaced without making any change to the other tiers.
Web application
148
There are some who view a web application as a two-tier architecture. This can be a "smart" client that performs all
the work and queries a "dumb" server, or a "dumb" client that relies on a "smart" server. The client would handle the
presentation tier, the server would have the database (storage tier), and the business logic (application tier) would be
on one of them or on both. While this increases the scalability of the applications and separates the display and the
database, it still doesn't allow for true specialization of layers, so most applications will outgrow this model.
Business use
An emerging strategy for application software companies is to provide web access to software previously distributed
as local applications. Depending on the type of application, it may require the development of an entirely different
browser-based interface, or merely adapting an existing application to use different presentation technology. These
programs allow the user to pay a monthly or yearly fee for use of a software application without having to install it
on a local hard drive. A company which follows this strategy is known as an application service provider (ASP), and
ASPs are currently receiving much attention in the software industry.
Security breaches on these kinds of applications are a major concern because it can involve both enterprise
information and private customer data. Protecting these assets is an important part of any web application and there
are some key operational areas that must be included in the development process. This includes processes for
authentication, authorization, asset handling, input, and logging and auditing. Building security into the applications
from the beginning can be more effective and less disruptive in the long run.
In cloud computing model web applications are software as a service (SaaS). There are business applications
provided as SaaS for enterprises for fixed or usage dependent fee. Other web applications are offered free of charge,
often generating income from advertisements shown in web application interface.
Many businesses are enabled by open source web applications such as e-commerce software that facilitates easily
creating an online retail store. Most businesses today do not need to buy data center hardware such as servers
because they are affordably rented on a short term basis from a plethora of hosting companies that provide turnkey
implementations of web applications. It is common for hosting providers to also offer packages of hardware and all
necessary software to support the business needs of a company. Innovations in all aspects of web applications are
providing tremendous economic value by increasing competition by reducing barriers to entry for new companies.
Writing web applications
Writing of web applications is often simplified by open source software such as Django, Ruby on Rails or Symfony
called web application frameworks. These frameworks facilitate rapid application development by allowing a
development team to focus on the parts of their application which are unique to their goals without having to resolve
common development issues such as user management. While many of these frameworks are open source, this is by
no means a requirement.
The use of web application frameworks can often reduce the number of errors in a program, both by making the code
simpler, and by allowing one team to concentrate on the framework while another focuses on a specified use case. In
applications which are exposed to constant hacking attempts on the Internet, security-related problems can be caused
by errors in the program. Frameworks can also promote the use of best practices such as GET after POST.
In addition, there is potential for the development of applications on Internet operating systems, although currently
there are not many viable platforms that fit this model.
Web application
149
Applications
Examples of browser applications are simple office software (word processors, online spreadsheets, and presentation
tools), but can also include more advanced applications such as project management, computer-aided design, video
editing and point-of-sale.
Benefits
Web applications do not require any complex "roll out" procedure to deploy in large organizations. A compatible
web browser is all that is needed;
Browser applications typically require little or no disk space on the client;
They require no upgrade procedure since all new features are implemented on the server and automatically
delivered to the users;
Web applications integrate easily into other server-side web procedures, such as email and searching.
They also provide cross-platform compatibility in most cases (i.e., Windows, Mac, Linux, etc.) because they
operate within a web browser window.
With the advent of HTML5, programmers can create richly interactive environments natively within browsers.
Included in the list of new features are native audio, video and animations, as well as improved error handling.
Modern web applications support greater interactivity and greatly improved usability through technologies such
as AJAX that efficiently exchange data between the browser and the server.
Web applications allow for easier introduction of new user devices (e.g. smartphones, tablets) because they have
built-in browsers.
Drawbacks
In practice, web interfaces, compared to thick clients, typically force significant sacrifice to user experience and
basic usability.
Web applications absolutely require compatible web browsers. If a browser vendor decides not to implement a
certain feature, or abandons a particular platform or operating system version, this may affect a huge number of
users;
Standards compliance is an issue with any non-typical office document creator, which causes problems when file
sharing and collaboration becomes critical;
Browser applications rely on application files accessed on remote servers through the Internet. Therefore, when
connection is interrupted, the application is no longer usable. However, if it uses HTML5 API's such as Offline
Web application caching, it can be downloaded and installed locally, for offline use. Google Gears, although no
longer in active development, is a good example of a third party plugin for web browsers that provides additional
functionality for creating web applications;
Since many web applications are not open source, there is also a loss of flexibility, making users dependent on
third-party servers, not allowing customizations on the software and preventing users from running applications
offline (in most cases). However, if licensed, proprietary software can be customized and run on the preferred
server of the rights owner;
They depend entirely on the availability of the server delivering the application. If a company goes bankrupt and
the server is shut down, the users have little recourse. Traditional installed software keeps functioning even after
the demise of the company that produced it (though there will be no updates or customer service);
Likewise, the company has much greater control over the software and functionality. They can roll out new
features whenever they wish, even if the users would like to wait until the bugs have been worked out before
upgrading. The option of simply skipping a weak software version is often not available. The company can foist
unwanted features on the users or cut costs by reducing bandwidth. Of course, companies will try to keep the
good will of their customers, but the users of web applications have fewer options in such cases unless a
Web application
150
competitor steps in and offers a better product and easy migration;
The company can theoretically track anything the users do. This can cause privacy problems.
According to Jonathan Zittrain, the online applications like Facebook and Google Apps have made the Internet
become far more proprietary than early versions of Microsoft Windows.
References
[1] What is a Web Application? (http:/ / webtrends. about. com/ od/ webapplications/ a/ web_application. htm) by Daniel Nations, former
About.com Guide
[2] What is a Web Application? (http:/ / www.youtube. com/ user/ 93599Productions) by Daniel Nations, former About.com Guide
[3] Comprehensive solutions for managing your data- Web Applications http:/ / www.meddb. be/ webapplications.aspx by MedDb
External links
HTML5 Draft recommendation (http:/ / www. whatwg. org/ specs/ web-apps/ current-work/ multipage/ ), changes
to HTML and related APIs to ease authoring of web-based applications.
The Other Road Ahead (http:/ / www. paulgraham. com/ road.html) - An article arguing that the future lies on
the server, not rich interfaces on the client
Web Applications (http:/ / www. dmoz. org/ Computers/ Internet/ On_the_Web/ Web_Applications/ ) on the
Open Directory Project
Web Applications Working Group (http:/ / www. w3. org/ 2008/ webapps/ ) at the World Wide Web Consortium
(http:/ / www. w3. org/ ) (W3C)
Single-page application
A single-page application (SPA), also known as single-page interface (SPI), is a web application or web site that
fits on a single web page with the goal of providing a more fluid user experience akin to a desktop application.
In an SPA, either all necessary code - HTML, JavaScript, and CSS - is retrieved with a single page load,
[1]
or the
appropriate resources are dynamically loaded and added to the page as necessary, usually in response to user actions.
The page does not reload at any point in the process, nor does control transfer to another page, although modern web
technologies (such as those included in HTML5) can provide the perception and navigability of separate logical
pages in the application. Interaction with the single page application often involves dynamic communication with the
web server behind the scenes.
The term single-page application was coined by Steve Yen in 2005, though the concept was discussed at least as
early as 2003 and Stuart (stunix) Morris wrote the Self-Contained website at http:/ / slashdotslash. com with the
same goals and functions in 2002.
Technical approaches
There are various techniques available that enable the browser to retain a single page even when the application
requires server communication.
AJAX
The most prominent technique currently being used is Ajax. Predominantly using the XMLHttpRequest object from
JavaScript, other AJAX approaches include using IFRAME or script HTML elements. Popular libraries like jQuery,
that normalize AJAX behavior across browsers from different manufacturers, have further popularized the AJAX
technique.
Single-page application
151
Node.js/SignalR
Asynchronous calls to the server may also be achieved using SignalR or Node.js in conjunction with Socket.io.
Browser plugins
Asynchronous calls to the server may also be achieved using browser plug-in technologies such as Silverlight, Flash,
HTML5 Socket or Java applets.
Data transport (XML, JSON and AJAX)
Requests to the server typically result in either raw data (e.g. XML or JSON), or new HTML being returned. In the
case where HTML is returned by the server, JavaScript on the client updates a partial area of the DOM (Document
Object Model). When raw data is returned, often a client-side JavaScript XML / (XSL) process ( and in case of
JSON a template ) is used to translate the raw data into HTML, which is then used to update a partial area of the
DOM.
Thin server architecture
An SPA moves logic from the server to the client. This results in the role of the web server evolving into a pure data
API or web service. This architectural shift has, in some circles, been coined "Thin Server Architecture" to highlight
that complexity has been moved from the server to the client, with the argument that this ultimately reduces overall
complexity of the system.
Thick stateful server architecture
The server keeps the necessary state in memory of the client state of the page. In this way, when any request hits the
server (usually user actions), the server sends the appropriate HTML and/or JavaScript with the concrete changes to
bring the client to the new desired state (usually adding/deleting/updating a part of the client DOM). At the same
time the state in server is updated. Most of the logic is executed in server and HTML is usually also rendered in
server. In some ways the server simulates a web browser, receiving events and performing delta changes in server
state which are automatically propagated to client. This approach needs more server memory and server processing,
but the advantage is a simplified development model because a) the application is usually fully coded in server, b)
data and UI state in server are shared in the same memory space with no need of custom client/server communication
bridges.
Thick stateless server architecture
Is a variant of the stateful server approach, in this case the client page sends the necessary data of the current state to
the server usually through AJAX requests, the server with this data is able to reconstruct in some way the client state
of the page part going to be modified and generate the necessary data or code, for instance as JavaScript code,
returned to the client to bring it to a new state usually modifying the page DOM tree according to the action which
motivated the request. The stateless variant of the thick server architecture requires more data sent to server and may
require more computational resources per request to reconstruct partially or fully the client page state in server, in the
same time this approach is more easily scalable because there is no per client page data kept in server and therefore
AJAX requests can be dispatched to different server nodes with no need of session data sharing or server affinity.
Single-page application
152
Running locally
Some SPAs may be executed from a local file using the file URI scheme. This gives users the ability to download
the SPA from a server and run the file from a local storage device, without depending on server connectivity. If such
an SPA wants to store and update data, it must be self-modifying.Wikipedia:Disputed statement That is, the SPA
must be capable of writing itself to disk, including a representation of the state that is to be persisted. These
applications benefit from advances available with HTML5, particularly Web Storage.
Challenges with the SPA model
Because the SPA is an evolution away from the stateless page-redraw model that browsers were originally designed
for, some new challenges have emerged. Each of these problems has an effective solution with:
Client-side JavaScript libraries addressing various issues.
Server side web frameworks that specialize in the SPA model.
The evolution of browsers and the HTML5 specification aimed at the SPA model.
[2]
Search engine optimization
Because of the lack of JavaScript execution on crawlers of all popular Web search engines, SEO (Search engine
optimization) has historically presented a problem for public facing websites wishing to adopt the SPA model.
Google currently crawls URLs containing hash fragments starting with #,. This allows the use of hash fragments
within the single URL of an SPA. Special behavior must be implemented by the SPA site to allow extraction of
relevant metadata by the search engine's crawler. For search engines that do not support this URL hash scheme, the
hashed URLs of the SPA remain invisible.
Alternatively, applications may render the first page load on the server and subsequent page updates on the client.
This is traditionally difficult, because the rendering code might need to be written in a different language or
framework on the server and in the client. Using logic-less templates, cross-compiling from one language to another,
or using the same language on the server and the client may help to increase the amount of code that can be shared.
One way to increase the amount of code that can be shared between servers and clients is to use a logic-less template
language like Mustache or Handlebars. Such templates can be rendered from different host languages, such as Ruby
on the server and JavaScript in the client. However, merely sharing templates typically requires duplication of
business logic used to choose the correct templates and populate them with data. Rendering from templates may
have negative performance effects when only updating a small portion of the page-such as the value of a text input
within a large template. Replacing an entire template might also disturb a user's selection or cursor position, where
updating only the changed value might not. To avoid these problems, applications can use UI data bindings or
granular DOM manipulation to only update the appropriate parts of the page instead of re-rendering entire templates.
Another approach used by server centric web frameworks like the Java based ItsNat is to render any hypertext in
server using the same language and templating technology. In this approach the server knows with precision the
DOM state in client, any big or small page update required is performed generating in server, and transported by
AJAX, the exact JavaScript code to bring the client page to the new state executing DOM methods. Developers can
decide which page states must be crawlable by web spiders for SEO and be able to generate the required state in load
time generating plain HTML instead of JavaScript. In case of ItsNat framework this is automatic because ItsNat
keeps the client DOM tree in server as a Java W3C DOM tree, rendering of this DOM tree in server generates plain
HTML in load time and JavaScript DOM actions for AJAX requests. This duality is very important for SEO because
developers can build with the same Java code and pure HTML based templating the desired DOM state in server, on
page load time conventional HTML is generated by ItsNat making this DOM state SEO compatible. As of version
1.3 ItsNat provides a new stateless mode, client DOM is not kept in server because in stateless mode client DOM
state is partially or fully reconstructed in server when processing any AJAX request based on required data sent by
Single-page application
153
client informing of the current DOM state; the stateless mode may be also SEO compatible because SEO
compatibility happens in load time of the initial page not affected by stateful or stateless modes.
Because SEO compatibility is not trivial in SPAs, it's worth noting that SPAs are commonly not used in a context
where search engine indexing is either a requirement, or desirable. Use cases include applications that surface private
data hidden behind an authentication system. In the cases where these applications are consumer products, often a
classic "page redraw" model is used for the applications landing page and marketing site, which provides enough
meta data for the application to appear as a hit in a search engine query. Blogs, support forums, and other traditional
page redraw artifacts often sit around the SPA that can seed search engines with relevant terms.
Browser history
With an SPA being, by definition, "a single page", the model breaks the browser's design for page history navigation
using the Forward/Back buttons. This presents a usability impediment when a user presses the back button,
expecting the previous screen state within the SPA, but instead the application's single page unloads and the previous
page in the browser's history is presented.
The traditional solution for SPA's has been to change the browser URL's hash fragment identifier in accord with the
current screen state. This can be achieved with JavaScript, and causes URL history events to be built up within the
browser. As long as the SPA is capable of resurrecting the same screen state from information contained within the
URL hash, the expected back button behavior is retained.
To further address this issue, the HTML5 specification has introduced pushState
[3]
and replaceState
[4]
providing
programmatic access to the actual URL and browser history.
Page lifecycle
An SPA is fully loaded in the initial page load and then page regions are replaced or updated with new page
fragments loaded from the server on demand. To avoid excessive downloading of unused features, an SPA will often
progressively download more features as they become required, either small fragments of the page, or complete
screen modules.
In this way an analogy exists between "states" in an SPA and "pages" in a traditional web site. Because "state
navigation" in the same page is analogous to page navigation, in theory any page based web site could be converted
to single-page replacing in the same page only the changed parts result of comparing consecutive pages in a
non-SPA.
The SPA approach on the web is similar to the Single Document Interface (SDI) presentation technique popular in
native desktop applications.
References
[1] Flanagan, David, "JavaScript - The Definitive Guide", 5th ed., OReilly, Sebastopol, CA, 2006, p.497
[2] [2] HTML5
[3] http:/ / dev.w3. org/ html5/ spec/ history.html#dom-history-pushstate
[4] http:/ / dev.w3. org/ html5/ spec/ history.html#dom-history-replacestate
External links
Single-page applications (http:/ / code. google. com/ p/ trimpath/ wiki/ SinglePageApplications) page with
definitions and SPA examples
Migrating Multi-page Web Applications to Single-page Ajax Interfaces (Delft University of Technology): http:/ /
arxiv. org/ abs/ cs/ 0610094
The Single Page Interface Manifesto (http:/ / itsnat. sourceforge.net/ php/ spim/ spi_manifesto_en. php)
Uniform resource identifier
154
Uniform resource identifier
In computing, a uniform resource identifier (URI) is a string of characters used to identify a name of a web
resource. Such identification enables interaction with representations of the web resource over a network (typically
the World Wide Web) using specific protocols. Schemes specifying a concrete syntax and associated protocols
define each URI.
Relationship to URL and URN
This Euler diagram shows that a uniform
resource identifier (URI) is either a uniform
resource locator (URL), or a uniform resource
name (URN), or both.
URIs can be classified as locators (URLs), as names (URNs), or as
both. A uniform resource name (URN) functions like a person's name,
while a uniform resource locator (URL) resembles that person's street
address. In other words: the URN defines an item's identity, while the
URL provides a method for finding it.
The ISBN system for uniquely identifying books provides a typical
example of the use of URNs. ISBN 0-486-27557-4
(urn:isbn:0-486-27557-4) cites unambiguously a specific edition of
Shakespeare's play Romeo and Juliet. To gain access to this object and
read the book, one needs its location: a URL address. A typical URL
for this book on a Unix-like operating system would be a file path such
as fi1e:///home/username/boo's/RomeoAndJu1ie.pdf, identifying the electronic book library saved
on a local disk drive. So URNs and URLs have complementary purposes.
URLs and URNs
A URL is a URI that, in addition to identifying a web resource, specifies the means of acting upon or obtaining the
representation: providing both the primary access mechanism, and the network "location". For example, the URL
hp://examp1e.org/wi'i/Main_Rage refers to a resource identified as /wi'i/Main_Rage whose
representation, in the form of HTML and related code, is obtainable via HyperText Transfer Protocol (hp://)
from a network host whose domain name is examp1e.org.
A URN is a URI that identifies a resource by name, in a particular namespace. One can use a URN to talk about a
resource without implying its location or how to access it. For example, the URN urn.isbn.0-395-36341-1 is a URI
that specifies the identifier system, i.e. international standard book number (ISBN), as well as the unique reference
within that system and allows one to talk about a book, but the URI does not itself suggest where or how to obtain an
actual copy of it.
Technical publications, especially standards produced by the IETF and by the W3C, normally reflect a view outlined
in a W3C Recommendation of 2001, which acknowledges the precedence of the term URI rather than endorsing any
formal subdivision into URL and URN: "URL is a useful but informal concept: a URL is a type of URI that
identifies a resource via a representation of its primary access mechanism (e.g., its network "location"), rather than
by some other attributes it may have". A URL is simply a URI that happens to point to a physical resource over a
network.
[1]
However, in non-technical contexts and in software for the World Wide Web, the term URL remains widely used.
Additionally, the term web address (which has no formal definition) often occurs in non-technical publications as a
synonym for a URI that uses the 'http' or 'https' scheme. Such assumptions can lead to confusion, for example when
viewing XML source: the normal means of identifying unique XML vocabularies within an XML document is to
declare XML namespaces whose names are URIs that begin with 'http' and use the syntax of a genuine domain name
followed by a file path, but which have no need to point to any specific file locations that actually exist.
Uniform resource identifier
155
Syntax
The URI syntax consists of a URI scheme name (such as "hp", "fp", "mai1o", "crid" or "fi1e") followed
by a colon character, and then by a scheme-specific part. The specifications that govern the schemes determine the
syntax and semantics of the scheme-specific part. However, URI syntax does require all schemes to adhere to a
general syntax that (among other things) reserves certain characters for special purposes (without always identifying
those purposes). The URI syntax also enforces restrictions on the scheme-specific part in order to (for example)
provide for a degree of consistency when the part has a hierarchical structure.
Percent-encoding can add extra information to a URI.
History
Naming, addressing, and identifying resources
URIs and URLs have a shared history. In 1994, Tim Berners-Lee's proposals for HyperText implicitly introduced the
idea of a URL as a short string representing a resource that is the target of a hyperlink. At the time, people referred to
it as a 'hypertext name' or 'document name'.
Over the next three and a half years, as the World Wide Web's core technologies of HTML (the HyperText Markup
Language), HTTP, and web browsers developed, a need to distinguish a string that provided an address for a
resource from a string that merely named a resource emerged. Although not yet formally defined, the term Uniform
Resource Locator came to represent the former, and the more contentious Uniform Resource Name came to represent
the latter.
During the debate over defining URLs and URNs it became evident that the two concepts embodied by the terms
were merely aspects of the fundamental, overarching notion of resource identification. In June 1994, the IETF
published Berners-Lee's RFC 1630: the first RFC that (in its non-normative text) acknowledged the existence of
URLs and URNs, and, more importantly, defined a formal syntax for Universal Resource Identifiers - URL-like
strings whose precise syntaxes and semantics depended on their schemes. In addition, this RFC attempted to
summarize the syntaxes of URL schemes in use at the time. It also acknowledged, but did not standardize, the
existence of relative URLs and fragment identifiers.
Refinement of specifications
In December 1994, RFC 1738 formally defined relative and absolute URLs, refined the general URL syntax, defined
how to resolve relative URLs to absolute form, and better enumerated the URL schemes then in use. The agreed
definition and syntax of URNs had to wait until the publication of RFC 2141 in May 1997.
The publication of RFC 2396 in August 1998 saw the URI syntax become a separate specification and most of the
parts of RFCs 1630 and 1738 relating to URIs and URLs in general were revised and expanded by the IETF. The
new RFC changed the significance of the "U" in "URI": it came to represent "Uniform" rather than "Universal". The
sections of RFC 1738 that summarized existing URL schemes migrated into a separate document.
[2]
IANA keeps a
registry of those schemes; RFC 2717 first described the procedure to register them.
In December 1999, RFC 2732 provided a minor update to RFC 2396, allowing URIs to accommodate IPv6
addresses. Some time later, a number of shortcomings discovered in the two specifications led to the development of
a number of draft revisions under the title rfc2396bis. This community effort, coordinated by RFC 2396 co-author
Roy Fielding, culminated in the publication of RFC 3986 in January 2005. This RFC, as of 2009[3] the current
version of the URI syntax recommended for use on the Internet, renders RFC 2396 obsolete. It does not, however,
render the details of existing URL schemes obsolete; RFC 1738 continues to govern such schemes except where
otherwise superseded - RFC 2616 for example, refines the 'http' scheme. Simultaneously, the IETF published the
content of RFC 3986 as the full standard STD 66, reflecting the establishment of the URI generic syntax as an
Uniform resource identifier
156
official Internet protocol.
In August 2002, RFC 3305 pointed out that the term 'URL' has, despite its widespread use in the vernacular of the
Internet-aware public at large, faded into near obsolescence. It now serves only as a reminder that some URIs act as
addresses because they have schemes that imply some kind of network accessibility, regardless of whether systems
actually use them for that purpose. As URI-based standards such as Resource Description Framework make evident,
resource identification need not suggest the retrieval of resource representations over the Internet, nor need they
imply network-based resources at all.
On November 1, 2006, the W3C Technical Architecture Group published 'On Linking Alternative Representations
To Enable Discovery And Publishing', a guide to best practices and canonical URIs for publishing multiple versions
of a given resource. For example, content might differ by language or by size to adjust for capacity or settings of the
device used to access that content.
The Semantic Web uses the HTTP URI scheme to identify both documents and concepts in the real world: this has
caused confusion as to how to distinguish the two. The Technical Architecture Group of W3C (TAG) published an
e-mail in June 2005 on how to solve this problem. The e-mail became known as the httpRange-14 resolution.
[4]
To
expand on this (rather brief) email, W3C published in March 2008 the Interest Group Note Cool URIs for the
Semantic Web. This explains the use of content negotiation and the 303-redirect code in more detail.
URI reference
A URI reference may take the form of a full URI, or just the scheme-specific portion of one, or even some trailing
component thereof - even the empty string. An optional fragment identifier, preceded by #, may be present at the
end of a URI reference. The part of the reference before the # indirectly identifies a resource, and the fragment
identifier identifies some portion of that resource.
To derive a URI from a URI reference, software converts the URI reference to 'absolute' form by merging it with an
absolute 'base' URI according to a fixed algorithm. The system treats the URI reference as relative to the base URI,
although in the case of an absolute reference, the base has no relevance. The base URI typically identifies the
document containing the URI reference, although this can be overridden by declarations made within the document
or as part of an external data transmission protocol. If the base URI includes a fragment identifier, it is ignored
during the merging process. If a fragment identifier is present in the URI reference, it is preserved during the
merging process.
Web document markup languages frequently use URI references to point to other resources, such as external
documents or specific portions of the same logical document.
Uses of URI references in markup languages
In HTML, the value of the src attribute of the img element provides a URI reference, as does the value of the
href attribute of the a or 1in' element.
In XML, the system identifier appearing after the SYSTEM keyword in a DTD is a fragmentless URI reference.
In XSLT, the value of the href attribute of the xs1:impor element/instruction is a URI reference; likewise
the first argument to the documen() function.
Uniform resource identifier
157
Examples of absolute URIs
hp://examp1e.org/abso1ue/URI/wih/abso1ue/pah/o/resource.x
fp://examp1e.org/resource.x
urn:issn:1535-3613
Examples of URI references
hp://en.wi'ipedia.org/wi'i/URI#Examp1es_of_URI_references("hp" specifies the
'scheme' name, "en.wi'ipedia.org" is the 'authority', "/wi'i/URI" the 'path' pointing to this article, and
"#Examp1es_of_URI_references" is a 'fragment' pointing to this section.)
hp://examp1e.org/abso1ue/URI/wih/abso1ue/pah/o/resource.x
//examp1e.org/scheme-re1aive/URI/wih/abso1ue/pah/o/resource.x
/re1aive/URI/wih/abso1ue/pah/o/resource.x
re1aive/pah/o/resource.x
../../../resource.x
./resource.x#frag01
resource.x
#frag01
(empty string)
URI resolution
To resolve a URI means either to convert a relative URI reference to absolute form, or to dereference a URI or URI
reference by attempting to obtain a representation of the resource that it identifies. The 'resolver' component in
document processing software generally provides both services.
One can regard a URI reference as a same document reference: a reference to the document containing the URI
reference itself. Document processing software can efficiently use its current representation of the document to
satisfy the resolution of a same document reference without fetching a new representation. This is only a
recommendation, and document processing software can alternatively use other mechanisms to determine whether to
obtain a new representation.
The current URI specification as of 2009[3], RFC 3986, defines a URI reference as a same document reference if,
when resolved to absolute form, it equates exactly to the base URI in effect for the reference. Typically, the base
URI is the URI of the document containing the reference. XSLT 1.0, for example, has a documen() function
that, in effect, implements this functionality. RFC 3986 also formally defines URI equivalence, which can be used to
determine that a URI reference, while not identical to the base URI, still represents the same resource and thus can
be considered to be a same document reference.
RFC 2396 prescribed a different method for determining same document references; RFC 3986 made RFC 2396
obsolete, but RFC 2396 still serves as the basis of many specifications and implementations. This specification
defines a URI reference as a same document reference if it is an empty string or consists of only the # character
followed by an optional fragment.
Relation to XML namespaces
XML has a concept of a namespace, an abstract domain to which a collection of element and attribute names can be
assigned. The namespace name (a character string which must adhere to the generic URI syntax) identifies an XML
namespace. However, the namespace name is generally not considered
[5]
to be a URI because the 'URI-ness' of
strings is, according to the URI specification, based on their intended use, not just their lexical components. A
namespace name also does not necessarily imply any of the semantics of URI schemes; a namespace name beginning
Uniform resource identifier
158
with 'http:', for example, likely has nothing to do with the HTTP protocol. XML professionals have debated this
thoroughly on the xml dev electronic mailing list; some feel that a namespace name could be a URI, since the
collection of names comprising a particular namespace could be regarded as a resource that is being identified, and
since a version of the 'Namespaces in XML' specification says that the namespace name is a URI reference. But the
consensus seems to suggest that a namespace name is just a string that happens to look like a URI, nothing more.
Initially, the namespace name could match the syntax of any non-empty URI reference, but an erratum to the
'Namespaces In XML Recommendation' later deprecated the use of relative URI references. A separate specification,
issued for namespaces for XML 1.1, allows IRI references, not just URI references, to serve as the basis for
namespace names.
To mitigate confusion that began to arise among newcomers to XML from the use of URIs (particularly HTTP
URLs) for namespaces, a descriptive language called RDDL (Resource Directory Description Language) developed,
though the specification of RDDL has no official standing and no relevant organization (such as W3C) has
considered or approved it. An RDDL document can provide machine- and human-readable information about a
particular namespace and about the XML documents that use it. Authors of XML documents were
encouragedWikipedia:Manual of Style/Words to watch#Unsupported attributions to put RDDL documents in
locations such that if a namespace name in their document somehow becomes de-referenced, then an RDDL
document would be obtained, thus satisfying the desire among many developers for a namespace name to point to a
network-accessible resource.
References
[1] Much of this discussion comes from RFC3305 (http:/ / rfc-editor. org/ cgi-bin/ rfcdoctype. pl?loc=RFC& letsgo=3305& type=http&
file_format=txt), titled 'Report from the Joint W3C/IETF URI Planning Interest Group: Uniform Resource Identifiers (URIs), URLs, and
Uniform Resource Names (URNs): Clarifications and Recommendations'. This RFC outlines the work of a joint W3C/IETF working group set
up specifically to normalize the divergent views held within the IETF and W3C over the relationship between the various 'UR*' terms and
standards. While not published as a full standard by either organization, it has become the basis for the above common understanding and has
informed many standards since then.
[2] [2] This separate document is not explicitly linked, RFC 2717 and RFC 4395 point to the IANA registry as the official URI scheme registry.
[3] http:/ / en. wikipedia.org/ w/ index.php?title=Uniform_resource_identifier& action=edit
[4] [4] The httpRange-14 resolution consists of three bullet points: see , and did not help much to reduce the confusion.
[5] Harold, Elliote Rusty (2004). XML 1.1 Bible, Third Edition, Wiley Publishing Inc., p.291. ISBN 0-7645-4986-3.
External links
RFC 3986 / STD 66 (http:/ / tools. ietf. org/ html/ std66) (2005) - the current (http:/ / en. wikipedia. org/ w/ index.
php?title=Uniform_resource_identifier& action=edit) generic URI syntax specification
URI Schemes (http:/ / www. iana. org/ assignments/ uri-schemes.html) - IANA-maintained registry of URI
Schemes
Architecture of the World Wide Web, Volume One, 2: Identification (http:/ / www.w3.org/ TR/ webarch/
#identification) - by W3C
W3C URI Clarification (http:/ / www. w3.org/ TR/ uri-clarification/ )
JSON
159
JSON
JSON
Filename extension ._son
Internet media type app1icaion/_son
Uniform Type Identifier public.json
Type of format Data interchange
Extended from JavaScript
Standard(s) RFC 4627, ECMA-404
Website
json.org
[1]
JSON (/`d_etsbn/ JAY-soun, /`d_etsen/ JAY-son), or JavaScript Object Notation, is an open standard format that
uses human-readable text to transmit data objects consisting of attribute-value pairs. It is used primarily to transmit
data between a server and web application, as an alternative to XML.
Although originally derived from the JavaScript scripting language, JSON is a language-independent data format,
and code for parsing and generating JSON data is readily available in a large variety of programming languages.
The JSON format was originally specified by Douglas Crockford, and is described in RFC 4627 and ECMA-404.
The official Internet media type for JSON is app1icaion/_son. The JSON filename extension is ._son.
History
Douglas Crockford was the first to specify and popularize the JSON format.
[2]
The economic justification that led to
the discovery of JSON grew out of a perceived market need for stateful, real-time server to browser communication
without using browser plugins such as Flash or Java applets which were the dominant design at the time.
JSON was used at State Software Inc., a company co-founded by Douglas Crockford and Robert F. Napiltonia,
starting in April 2001, and funded by Tesla Ventures. When State was founded in early 2001 by six former
employees of Communities.com, they agreed to build a system that used standard browser capabilities and provided
an abstraction layer for Web developers to create stateful Web applications that had a persistent duplex connection to
a Web server by holding the two HTTP connections open and recycling them before standard browser time-outs if
no further data were exchanged. The idea for the State Application Framework was developed by Chip Morningstar
at State Software. It was used in a project at Communities.com for Cartoon Network, which used a plug-in with a
proprietary messaging format to manipulate DHTML elements (this system is also owned by 3DO). Upon discovery
of early Ajax capabilities, digiGroups, Noosh, and others used frames to pass information into the user browsers'
visual field without refreshing a Web application's visual context, realizing real-time rich Web applications using
only the standard HTTP, HTML and JavaScript capabilities of Netscape 4.0.5+ and IE 5+. Douglas Crockford then
found that JavaScript could be used as an object-based messaging format for such a system. The system was sold to
Sun Microsystems, Amazon.com and EDS. The JSON.org
[1]
Web site was launched in 2002. In December 2005,
JSON
160
Yahoo began offering some of its Web services in JSON. Google started offering JSON feeds for its GData web
protocol in December 2006.
Although JSON was originally based on a non-strict subset of the JavaScript scripting language (specifically,
Standard ECMA-262 3rd Edition-December 1999) and is commonly used with that language, it is a
language-independent data format. Code for parsing and generating JSON data is readily available for a large variety
of programming languages. JSON's Web site
[1]
provides a comprehensive listing of existing JSON libraries,
organized by language.
Though JSON is commonly perceived as being a subset of JavaScript and ECMAScript, it allows some unescaped
characters in strings that are illegal in JavaScript and ECMAScript strings.
Data types, syntax and example
JSON's basic types are:
Number (double-precision floating-point format in JavaScript, generally depends on implementation)
String (double-quoted Unicode, with backslash escaping)
Boolean (rue or fa1se)
Array (an ordered, comma-separated sequence of values enclosed in square brackets; the values do not need to be
of the same type)
Object (an unordered, comma-separated collection of key:value pairs enclosed in curly braces, with the ':'
character separating the key and the value; the keys must be strings and should be distinct from each other)
nu11 (empty)
Non-significant white space may be added freely around the "structural characters" (i.e. brackets " [ ]", colons ":"
and commas ",").
The following example shows the JSON representation of an object that describes a person. The object has string
fields for first name and last name, a number field for age, an object representing the person's address and an array of
phone number objects.
{
"firsName": "John",
"1asName": "Smih",
"age": 25,
"address": {
"sreeAddress": "21 2nd Sree",
"ciy": "New Yor'",
"sae": "NY",
"posa1Code": 10021
},
"phoneNumbers": [
{
"ype": "home",
"number": "212 555-1234"
},
{
"ype": "fax",
"number": "646 555-4567"
}
|
JSON
161
}
One potential pitfall of the free-form nature of JSON comes from the ability to write numbers as either numeric
literals or quoted strings. For example, ZIP Codes in the northeastern U.S. begin with zeroes (for example, 06511 for
New Haven, Connecticut). If written with quotes by one programmer but not by another, the leading zero could be
dropped when exchanged between systems, when searched for within the same system, or when printed. In addition,
postal codes in the U.S. are numbers but other countries use letters as well. The use of a JSON Schema (see below)
should reduce this as a type of problem.
A JSON parser library or JavaScript's native JSON support should be used for reading and writing JSON. A correctly
implemented JSON parser will only accept valid JSON, preventing potentially malicious code from being
inadvertently executed.
var p = JSON.parse(conac),
Web browsers, such as Firefox and Internet Explorer, have, since 2010, included support for parsing JSON. As
native browser support is more efficient and secure than eva1(), native JSON support is included in Edition 5 of
the ECMAScript standard.
[3]
The jQuery library wraps a JSON object in a function constructor and executes it immediately when JSON.parse is
not present. This avoids using eval in the code.
var p = new Euncion('reurn ' + conac + ',')(),
Despite the widespread belief that JSON is a JavaScript subset, this is not the case. Specifically, JSON allows the
Unicode line terminators U+2028 line separator and U+2029 paragraph separator to appear unescaped in quoted
strings, while JavaScript does not. This is a consequence of JSON disallowing only "control characters". This
subtlety is important when generating JSONP.
Unsupported native data types
JavaScript syntax defines several native data types that are not included in the JSON standard:
[4]
Date, Error,
Regular Expression, and Function. These JavaScript data types must be represented by some other data format, with
the programs on both ends agreeing on how to convert between the types. As of 2011, there are some de facto
standards; e.g. converting between Date and String, but none universally recognized.
[5][6]
Other languages may have
a different set of native types that must be serialized carefully to deal with this type of conversion.
Schema and Metadata
JSON Schema
JSON Schema
[7]
specifies a JSON-based format to define the structure of JSON data for validation, documentation,
and interaction control. A JSON Schema provides a contract for the JSON data required by a given application, and
how that data can be modified. JSON Schema is based on the concepts from XML Schema, RelaxNG, and Kwalify,
but is JSON-based. The JSON data schema can be used to validate JSON data; the same serialization/deserialization
tools can be used both for the schema and data. The schema is self-describing.
JSON Schema is an Internet Draft, currently version 4.
[8]
There are several validators available for different
programming languages,
[9]
each with varying levels of conformance.
Example JSON Schema:
{
"name": "Rroduc",
"properies": {
JSON
162
"id": {
"ype": "number",
"descripion": "Rroduc idenifier",
"required": true
},
"name": {
"ype": "sring",
"descripion": "Name of he produc",
"required": true
},
"price": {
"ype": "number",
"minimum": 0,
"required": true
},
"ags": {
"ype": "array",
"iems": {
"ype": "sring"
}
},
"soc'": {
"ype": "ob_ec",
"properies": {
"warehouse": {
"ype": "number"
},
"reai1": {
"ype": "number"
}
}
}
}
}
The JSON Schema above can be used to test the validity of the JSON code below:
{
"id": 1,
"name": "Eoo",
"price": 123,
"ags": [ "Bar", "Ee'" |,
"soc'": {
"warehouse": 300,
"reai1": 20
}
}
JSON
163
MIME type
The official MIME type for JSON text is "app1icaion/_son".
[10]
Although most modern implementations
have adopted the official MIME type, many applications continue to provide legacy support for other MIME types.
Many service providers, browsers, servers, web applications, libraries, frameworks, and APIs use, expect, or
recognize the (unofficial) MIME type "ex/_son" or the content-type "ex/_avascrip". Notable
examples include the Google Search API,
[11]
Yahoo,
[12]
Flickr, Facebook API,
[13]
Lift framework,
[14]
Dojo Toolkit
0.4,
[15]
etc.
JSON-RPC
JSON-RPC is an RPC protocol built on JSON, as a replacement for XML-RPC or SOAP. It is a simple protocol that
defines only a handful of data types and commands. JSON-RPC allows for notifications (information sent to the
server that do not require a response) and for multiple calls to be sent to the server that may be answered out of
order. Example of a JSON-RPC 2.0 request and response using positional parameters.
--> {"_sonrpc": "2.0", "mehod": "subrac", "params": [42, 23|, "id":
1}
<-- {"_sonrpc": "2.0", "resu1": 19, "id": 1}
Use in Ajax
JSON is often used in Ajax techniques. Ajax is a term for the ability of a webpage to request new data after it has
loaded into the web browser, usually in response to user actions on the displayed webpage. As part of the Ajax
model, the new data is usually incorporated into the user interface display dynamically the moment it arrives back
from the server. For example when the user is typing into a search box, client-side code sends what they type to a
server that will respond with a possible list of items from its database. These might be displayed in a drop-down list
beneath the search box. The user may then stop typing and select the relevant string directly. When it was originally
implemented in the mid-2000s, Ajax commonly used XML as the data interchange format. Now many developers
use JSON to pass the Ajax updates between the server and the client.
The following JavaScript code is just one example of a client using XMLHttpRequest to request data in JSON
format from a server. (The server-side programming is omitted; it must be set up to service requests to the ur1
containing a JSON-formatted string.)
var my_JSON_ob_ec,
var hp_reques = new XMLHpReques(),
hp_reques.open("GET", ur1, true),
hp_reques.onreadysaechange = function () {
var done = 4, o' = 200,
if (hp_reques.readySae === done && hp_reques.saus === o')
{
my_JSON_ob_ec = JSON.parse('''hp_reques.responseTex'''),
}
},
hp_reques.send(null),
JSON
164
Security issues
Although JSON is intended solely as a data serialization format, its design as a non-strict subset of the JavaScript
scripting language poses several security concerns. These concerns center on the use of a JavaScript interpreter to
execute JSON text dynamically as embedded JavaScript. This exposes a program to errant or malicious scripts . This
is a serious issue when dealing with data retrieved from the Internet. This easy and popular technique exploits
JSON's compatibility with the JavaScript eva1() function which is described below.
JavaScript eval()
Because most JSON-formatted text is also syntactically legal JavaScript code, an easy way for a JavaScript program
to parse JSON-formatted data is to use the built-in JavaScript eva1() function, which was designed to evaluate
JavaScript expressions. Rather than using a JSON-specific parser, the JavaScript interpreter itself is used to execute
the JSON data producing native JavaScript objects. There are, however, some Unicode characters that are valid in
JSON strings but invalid in JavaScript, so additional escaping may be needed in some cases.
Unless precautions are taken to validate the data first, the eval technique is subject to security vulnerabilities when
the data and the entire JavaScript environment are not within the control of a single trusted source. For example, if
the data is itself not trusted, it is subject to malicious JavaScript code injection attacks. Such breaches of trust also
can create vulnerabilities for data theft, authentication forgery, and other potential misuse of data and resources.
Regular expressions can be used to validate the data prior to invoking eva1(). The RFC that defines JSON (RFC
4627) suggests using the following code to validate JSON before evaluating it (the variable 'text' is the input JSON):
var my_JSON_ob_ec = !(/[^,:{}\[\|0-9.\-+Eaef1nr-u \n\r\|/.es(
ex.rep1ace(/"(\\.|[^"\\|)*"/g, ''))) && eva1('(' + ex + ')'),
A new function, JSON.parse(), was thus developed as a safer alternative to eva1. It is specifically intended to
process JSON data and not JavaScript. It was originally planned for inclusion in the Fourth Edition of the
ECMAScript standard, but this did not occur. It was first added to the Fifth Edition, and is now supported by the
major browsers given below. For older ones, a compatible JavaScript library is available at JSON.org.
Native encoding and decoding in browsers
Recent Web browsers now either have or are working on native JSON encoding/decoding. Not only does this
eliminate the eva1() security problem above, but also increases performance due to the fact that functions must
no longer be parsed. Native JSON is generally faster compared to the JavaScript libraries commonly used before. As
of June 2009 the following browsers have or will have native JSON support, via JSON.parse() and
JSON.sringify():
Mozilla Firefox 3.5+
Microsoft Internet Explorer 8+
Opera 10.5+
WebKit-based browsers (Apple Safari)
Blink-based browsers (e.g. Google Chrome, Opera)
At least five popular JavaScript libraries have committed to use native JSON, if available:
YUI Library
Prototype
jQuery
Dojo Toolkit
MooTools
The default character encoding for JSON is UTF8; it also supports UTF16 and UTF32.
JSON
165
Object references
The JSON standard does not support object references, but the Dojo Toolkit illustrates how conventions can be
adopted to support such references using standard JSON. Specifically, the dojox.json.ref
[16]
module provides
support for several forms of referencing including circular, multiple, inter-message, and lazy referencing.
Alternatively, non-standard solutions exist such as the use of Mozilla JavaScript Sharp Variables, although this
functionality has been removed in Firefox version 12.
Comparison with other formats
JSON is promoted as a low-overhead alternative to XML as both of these formats have widespread support for
creation, reading and decoding in the real-world situations where they are commonly used. Apart from XML,
examples could include OGDL, YAML and CSV. Also, Google Protocol Buffers can fill this role, although it is not
a data interchange language.
YAML
YAML is almost, but not entirely, a superset of JSON. For example, escaping a slash (/) with a backslash () is valid
JSON, but not valid YAML. (This is common practice when injecting JSON into HTML to protect against cross-site
scripting attacks.) Nonetheless, many YAML parsers can natively parse the output from many JSON encoders.
[17]
XML
XML has been used to describe structured data and to serialize objects. Various XML-based protocols exist to
represent the same kind of data structures as JSON for the same kind of data interchange purposes. When data is
encoded in XML, the result is typically larger than an equivalent encoding in JSON, mainly because of XML's
closing tags. Yet, if the data is compressed using an algorithm like gzip, there is little difference because
compression is good at saving space when a pattern is repeated.
When used without an XML schema, XML values don't have a specific data type.
Samples
JSON sample
{
"firsName": "John",
"1asName": "Smih",
"age": 25,
"address": {
"sreeAddress": "21 2nd Sree",
"ciy": "New Yor'",
"sae": "NY",
"posa1Code": "10021"
},
"phoneNumber": [
{
"ype": "home",
"number": "212 555-1234"
},
{
"ype": "fax",
JSON
166
"number": "646 555-4567"
}
|
}
Both of the following examples carry the same kind of information as the JSON example above in different ways.
YAML sample
The above JSON code is also entirely valid YAML; however, YAML also offers an alternative syntax intended to be
more human-accessible by replacing nested delimiters like {}, [|, and " marks with structured whitespace indents.
---
firsName: John
1asName: Smih
age: 25
address:
sreeAddress: 21 2nd Sree
ciy: New Yor'
sae: NY
posa1Code: 10021
phoneNumber:
-
ype: home
number: 212 555-1234
-
ype: fax
number: 646 555-4567
XML samples
<person>
<firstName>John</firstName>
<lastName>Smih</lastName>
<age>25</age>
<address>
<streetAddress>21 2nd Sree</streetAddress>
<city>New Yor'</city>
<state>NY</state>
<postalCode>10021</postalCode>
</address>
<phoneNumbers>
<phoneNumber ype="home">212 555-1234</phoneNumber>
<phoneNumber ype="fax">646 555-4567</phoneNumber>
</phoneNumbers>
</person>
<person firsName="John" 1asName="Smih" age="25">
<address sreeAddress="21 2nd Sree" ciy="New Yor'" sae="NY" posa1Code="10021" />
JSON
167
<phoneNumbers>
<phoneNumber ype="home" number="212 555-1234"/>
<phoneNumber ype="fax" number="646 555-4567"/>
</phoneNumbers>
</person>
The XML encoding may therefore be comparable in length to the equivalent JSON encoding. A wide range of XML
processing technologies exist, from the Document Object Model to XPath and XSLT. XML can also be styled for
immediate display using CSS. XHTML is a form of XML so that elements can be passed in this form ready for
direct insertion into webpages using client-side scripting.
References
[1] http:/ / json.org/
[2] Video: Douglas Crockford - The JSON Saga (http:/ / developer. yahoo. com/ yui/ theater/ video. php?v=crockford-json), on Yahoo
Developer Network. In the video Crockford states: "I do not claim to have invented JSON... What I did was I found it, I named it, I described
how it was useful.... So, the idea's been around there for a while. What I did was I gave it a specification, and a little Web site."
[3] Standard ECMA-262 (http:/ / www. ecma-international. org/ publications/ standards/ Ecma-262.htm)
[4] [4] RFC 4627
[5] jquery - How to format a JSON date? - Stack Overflow (http:/ / stackoverflow. com/ questions/ 206384/ how-to-format-a-json-date)
[6] Dates and JSON - Tales from the Evil Empire (http:/ / weblogs. asp. net/ bleroy/ archive/ 2008/ 01/ 18/ dates-and-json.aspx)
[7] JSON Schema (http:/ / json-schema.org/ )
[8] JSON Schema draft 4 (http:/ / tools. ietf. org/ html/ draft-zyp-json-schema-04)
[9] JSON Schema implementations (http:/ / json-schema. org/ implementations)
[10] IANA Application Media Types (http:/ / www.iana.org/ assignments/ media-types/ application/ index. html)
[11] Faraday Stack pull request (https:/ / github. com/ mislav/ faraday-stack/ pull/ 2)
[12] Yahoo, JavaScript, and JSON (http:/ / blog. programmableweb. com/ 2005/ 12/ 16/ yahoo-javascript-and-json/ )
[13] AFNetworking pull request 148 (https:/ / github. com/ AFNetworking/ AFNetworking/ pull/ 148)
[14] Lift framework source (https:/ / github.com/ lift/ lift/ blob/ master/ framework/ lift-base/ lift-webkit/ src/ main/ scala/ net/ liftweb/ http/ Req.
scala)
[15] Dojo Toolkit 0.4 /src/io/BrowserIO.js (https:/ / bugs.dojotoolkit. org/ browser/ legacy/ branches/ 0. 4/ src/ io/ BrowserIO.js)
[16] http:/ / dojotoolkit.org/ api/ ?qs=1.5/ dojox/ json/ ref
[17] YAML Version 1.2 (http:/ / yaml.org/ spec/ 1. 2/ spec. html)
External links
JSON.com (http:/ / www. json. com/ )
Format home page (http:/ / www. json. org/ )
RFC 4627 - The application/json Media Type for JavaScript Object Notation (JSON)
JSON-Introduction By Microsoft (http:/ / msdn. microsoft.com/ en-us/ library/ bb299886. aspx)
Improvements to JSON (http:/ / bolinfest. com/ essays/ json. html)
168
Chapter 15: Overview of HTML5 and its
JavaScript APIs
HTML5
HTML5
(HyperText Markup Language)
Filename extension .hm1
Internet media type ex/hm1
Type code TEXT
Uniform Type Identifier public.html
Developed by World Wide Web Consortium and WHATWG
Type of format Markup language
Extended to XHTML5
Open format? Yes
XHTML5
Filename extension .xhm1, .hm1
Internet media type app1icaion/xm1, app1icaion/xhm1+xm1
Developed by World Wide Web Consortium and WHATWG
Type of format Markup language
Extended from XML, HTML5
Open format? Yes
HTML5
169
HTML
HTML and HTML5; HTML editor
Dynamic HTML
XHTML
XHTML Basic (Mobile)
XHTML Mobile Profile and C-HTML
HTML element
Span and div
HTML attribute
Character encodings; Unicode
Language code
Document Object Model
Browser Object Model
Style sheets and CSS
Font family and Web colors
HTML scripting and JavaScript
W3C, WHATWG, and validator
Quirks mode
HTML Frames
HTML5 Canvas, WebGL, and WebCL
HTML5 Audio and HTML5 video
Web storage
Web browser (layout) engine
Comparison of
document markup languages
web browsers
layout engine support for
HTML; Non-standard HTML
XHTML (1.1)
HTML5; HTML5 canvas,
HTML5 media (Audio, Video)
v
t
e
[1]
HTML5 is a markup language used for structuring and presenting content for the World Wide Web and a core
technology of the Internet. It is the fifth revision of the HTML standard (created in 1990 and standardized as HTML
4 as of 1997) and, as of December 2012[2], is a candidate recommendation of the World Wide Web Consortium
(W3C). Its core aims have been to improve the language with support for the latest multimedia while keeping it
easily readable by humans and consistently understood by computers and devices (web browsers, parsers, etc.).
HTML5 is intended to subsume not only HTML4, but also XHTML1 and DOM Level 2 HTML.
Following its immediate predecessors HTML4.01 and XHTML1.1, HTML5 is a response to the fact that the HTML
and XHTML in common use on the World Wide Web are a mixture of features introduced by various specifications,
along with those introduced by software products such as web browsers, those established by common practice, and
the many syntax errors in existing web documents.
[3]
It is also an attempt to define a single markup language that can
be written in either HTML or XHTML syntax. It includes detailed processing models to encourage more
interoperable implementations; it extends, improves and rationalises the markup available for documents, and
introduces markup and application programming interfaces (APIs) for complex web applications. For the same
reasons, HTML5 is also a potential candidate for cross-platform mobile applications. Many features of HTML5 have
HTML5
170
been built with the consideration of being able to run on low-powered devices such as smartphones and tablets. In
December 2011, research firm Strategy Analytics forecast sales of HTML5 compatible phones would top 1 billion in
2013.
[4]
In particular, HTML5 adds many new syntactic features. These include the new <video>, <audio> and
<canvas> elements, as well as the integration of scalable vector graphics (SVG) content (that replaces the uses of
generic <ob_ec> tags) and MathML for mathematical formulas. These features are designed to make it easy to
include and handle multimedia and graphical content on the web without having to resort to proprietary plugins and
APIs. Other new elements, such as <secion>, <aric1e>, <header> and <nav>, are designed to enrich the
semantic content of documents. New attributes have been introduced for the same purpose, while some elements and
attributes have been removed. Some elements, such as <a>, <cie> and <menu> have been changed, redefined
or standardized. The APIs and Document Object Model (DOM) are no longer afterthoughts, but are fundamental
parts of the HTML5 specification. HTML5 also defines in some detail the required processing for invalid documents
so that syntax errors will be treated uniformly by all conforming browsers and other user agents.
History
The Web Hypertext Application Technology Working Group (WHATWG) began work on the new standard in 2004.
At that time, HTML4.01 had not been updated since 2000, and the World Wide Web Consortium (W3C) was
focusing future developments on XHTML2.0. In 2009, the W3C allowed the XHTML 2.0 Working Group's charter
to expire and decided not to renew it. W3C and WHATWG are currently working together on the development of
HTML5.
While HTML5 is often compared to Flash, the two technologies are very different. Both include features for playing
audio and video within web pages, and for using Scalable Vector Graphics. HTML5 on its own cannot be used for
animation and interactivity- it must be supplemented with CSS3 or JavaScript. There are many Flash capabilities
that have no direct counterpart in HTML5. See Comparison of HTML5 and Flash.
Although HTML5 has been well known among web developers for years, it became the topic of mainstream media
around April 2010 after Apple Inc's then-CEO Steve Jobs issued a public letter titled "Thoughts on Flash" where he
concludes that "[Adobe] Flash is no longer necessary to watch video or consume any kind of web content" and that
"new open standards created in the mobile era, such as HTML5, will win".
[5]
This sparked a debate in web
development circles where some suggested that while HTML5 provides enhanced functionality, developers must
consider the varying browser support of the different parts of the standard as well as other functionality differences
between HTML5 and Flash.
[6]
In early November 2011, Adobe announced that it will discontinue development of
Flash for mobile devices and reorient its efforts in developing tools utilizing HTML5.
Standardization process
The Mozilla Foundation and Opera Software presented a position paper at a World Wide Web Consortium (W3C)
workshop in June 2004, focusing on developing technologies that are backward compatible with existing browsers,
including an initial draft specification of Web Forms 2.0. The workshop concluded with a vote, 8 for, 14 against, for
continuing work on HTML. Later that month, work based upon that position paper moved to the newly formed Web
Hypertext Application Technology Working Group (WHATWG), and a second draft, Web Applications 1.0, was
also announced. The two specifications were later merged to form HTML5. The HTML5 specification was adopted
as the starting point of the work of the new HTML working group of the W3C in 2007.
2008- First Public Working Draft
WHATWG published the First Public Working Draft of the specification on 22 January 2008. Parts of HTML5 have
been implemented in browsers despite the whole specification not yet having reached final Recommendation status.
2011- Last Call
HTML5
171
On 14 February 2011, the W3C extended the charter of its HTML Working Group with clear milestones for
HTML5. In May 2011, the working group advanced HTML5 to "Last Call", an invitation to communities inside and
outside W3C to confirm the technical soundness of the specification. The W3C is developing a comprehensive test
suite to achieve broad interoperability for the full specification by 2014, which is now the target date for
Recommendation. In January 2011, the WHATWG renamed its "HTML5" living standard to "HTML". The W3C
nevertheless continues its project to release HTML5.
2012- Candidate Recommendation
In July 2012, WHATWG and W3C decided on a degree of separation. W3C will continue the HTML5 specification
work, focusing on a single definitive standard, which is considered as a "snapshot" by WHATWG. The WHATWG
organization will continue its work with HTML5 as a "Living Standard". The concept of a living standard is that it is
never complete and is always being updated and improved. New features can be added but functionality will not be
removed.
In December 2012, W3C designated HTML5 as a Candidate Recommendation. The criterion for advancement to
W3C Recommendation is "two 100% complete and fully interoperable implementations".
Plan 2014
In September 2012, the W3C proposed a plan to release a stable HTML5 Recommendation by the end of 2014 and
an HTML 5.1 specification Recommendation by the end of 2016.
Core HTML specification
The combined timelines for HTML 5.0, HTML 5.1 and HTML 5.2:
2012 2013 2014 2015 2016
HTML 5.0 Candidate Rec Call for Review Recommendation
HTML 5.1 1st Working Draft Last Call Candidate Rec Recommendation
HTML 5.2 1st Working Draft
Features and APIs
The W3C proposed a greater reliance on modularity as a key part of the plan to make faster progress, meaning
identifying specific features, either proposed or already existing in the spec, and advancing them as separate
specifications. Some technologies that were originally defined in HTML5 itself are now defined in separate
specifications:
HTML Working Group- Microdata, HTML Canvas 2D Context
Web Apps WG- Web Messaging, Web Workers, Web Storage, WebSocket API, Server-Sent Events
IETF HyBi WG- WebSocket Protocol
WebRTC WG- WebRTC
W3C Web Media Text Tracks CG- WebVTT
Some specifications that were initially developed standalone have been adapted as HTML5 extensions or features by
reference: SVG, MathML, WAI-ARIA.
HTML5
172
Features
Markup
HTML5 introduces elements and attributes that reflect typical usage on modern websites. Some of them are semantic
replacements for common uses of generic block (<div>) and inline (<span>) elements, for example <nav>
(website navigation block), <fooer> (usually referring to bottom of web page or to last lines of HTML code), or
<audio> and <video> instead of <ob_ec>.
[7][8][9]
Some deprecated elements from HTML4.01 have been
dropped, including purely presentational elements such as <fon> and <cener>, whose effects have long been
superseded by the more capable Cascading Style Sheets. There is also a renewed emphasis on the importance of
DOM scripting (e.g., JavaScript) in Web behavior.
The HTML5 syntax is no longer based on SGML
[10][11]
despite the similarity of its markup. It has, however, been
designed to be backward compatible with common parsing of older versions of HTML. It comes with a new
introductory line that looks like an SGML document type declaration, <!OCTYRE hm1>, which triggers the
standards-compliant rendering mode. As of 5 January 2009, HTML5 also includes Web Forms 2.0, a previously
separate WHATWG specification.
New APIs
In addition to specifying markup, HTML5 specifies scripting application programming interfaces (APIs) that can be
used with JavaScript.
[12]
Existing document object model (DOM) interfaces are extended and de facto features
documented. There are also new APIs, such as:
HTML5 related APIs.
[13]
The canvas element for immediate
mode 2D drawing. See Canvas 2D
API Specification 1.0
specification
[14]
Timed media playback
Offline Web Applications
[15]
Document editing
Drag-and-drop
Cross-document messaging
[16]
Browser history management
MIME type and protocol handler
registration
Microdata
Web Storage, a key-value pair
storage framework that provides
behaviour similar to cookies but
with larger storage capacity and improved API.
[17]
Not all of the above technologies are included in the W3C HTML5 specification, though they are in the WHATWG
HTML specification.
[18]
Some related technologies, which are not part of either the W3C HTML5 or the WHATWG
HTML specification, are as follows. The W3C publishes specifications for these separately:
Geolocation
Web SQL Database, a local SQL Database (no longer maintained).
[19]
The Indexed Database API, an indexed hierarchical key-value store (formerly WebSimpleDB).
[20]
HTML5 File API,
[21]
handles file uploads and file manipulation.
[22]
Directories and System, an API intended to satisfy client-side-storage use cases not well served by databases.
[23]
File Writer, an API for writing to files from web applications.
[24]
HTML5
173
Web Audio API,
[25]
a high-level JavaScript API for processing and synthesizing audio in web applications.
HTML5 alone cannot provide animation within web pages. Either JavaScript or CSS3 is necessary for animating
HTML elements. Animation is also possible using JavaScript and HTML 4
[26]
Wikipedia:Verifiability, and within
SVG elements through SMIL, although browser support of the latter remains uneven as of 2011.
XHTML5
XHTML5 is the XML serialization of HTML5. XML documents must be served with an XML Internet media type
(often confused with MIME type) such as app1icaion/xhm1+xm1 or app1icaion/xm1. XHTML5
requires XML's strict, well-formed syntax. The choice between HTML5 and XHTML5 boils down to the choice of a
MIME/content type: the media type one chooses determines what type of document should be used.
[27]
In XHTML5,
the HTML5 doctype hm1 is optional and may simply be omitted. HTML that has been written to conform to both
the HTML and XHTML specifications-and which will therefore produce the same DOM tree whether parsed as
HTML or XML-is termed "polyglot markup".
Error handling
HTML5 is designed so that old browsers can safely ignore new HTML5 constructs. For example, in contrast to
HTML 4.01, the HTML5 specification gives detailed rules for lexing and parsing, with the intent that different
compliant browsers will produce the same result in the case of incorrect syntax. Although HTML5 now defines a
consistent behavior for "tag soup" documents, those documents are not regarded as conforming to the HTML5
standard.
Popularity
According to a report released on 30 September 2011, 34 of the world's top 100 Web sites were using HTML5- the
adoption led by search engines and social networks. Another report released in August 2013 has shown that 153 of
the Fortune 500 U.S. companies already implemented HTML5 on their corporate websites.
[28]
Differences from HTML4.01 and XHTML1.x
The following is a cursory list of differences and some specific examples.
New parsing rules: oriented towards flexible parsing and compatibility; not based on SGML
Ability to use inline SVG and MathML in ex/hm1
New elements: aric1e, aside, audio, bdi, canvas, command, daa, daa1is, deai1s, embed,
figcapion, figure, fooer, header, 'eygen, mar', meer, nav, oupu, progress, rp, r,
ruby, secion, source, summary, ime, rac', video, wbr
New types of form controls: daes and imes, emai1, ur1, search, number, range, e1, co1or
New attributes: charse (on mea), async (on scrip)
Global attributes (that can be applied for every element): id, abindex, hidden, daa-* (custom data
attributes)
Deprecated elements will be dropped altogether: acronym, app1e, basefon, big, cener, dir, fon,
frame, framese, isindex, noframes, sri'e,
dev.w3.org provides the latest Editors Draft of "HTML5 differences from HTML 4", which provides a complete
outline of additions, removals and changes between HTML5 and HTML 4.
HTML5
174
Logo
The W3C HTML5 logo
On 18 January 2011, the W3C introduced a logo to represent the use of or interest in
HTML5. Unlike other badges previously issued by the W3C, it does not imply
validity or conformance to a certain standard. As of 1 April 2011, this logo is
official.
When initially presenting it to the public, the W3C announced the HTML5 logo as a
"general-purpose visual identity for a broad set of open web technologies, including
HTML5, CSS, SVG, WOFF, and others". Some web standard advocates, including
The Web Standards Project, criticised that definition of "HTML5" as an umbrella
term, pointing out the blurring of terminology and the potential for
miscommunication. Three days later, the W3C responded to community feedback
and changed the logo's definition, dropping the enumeration of related technologies. The W3C then said the logo
"represents HTML5, the cornerstone for modern Web applications".
Digital rights management
Industrial players including the BBC, Google, Microsoft, and Netflix have been lobbying for the inclusion of
Encrypted Media Extensions (EME),
[29]
a form of digital rights management (DRM), into the HTML5 standard. As
of the end of 2012 and the beginning of 2013, 27 organisations
[30]
including the Free Software Foundation
[31]
have
started a campaign against including digital rights management in the HTML5 standard.
[32][33]
However in late
September 2013, the W3C HTML Working Group decided that Encrypted Media Extensions, a form of DRM, was
"in scope" and will potentially be included in the HTML 5.1 standard.
[34]
WHATWG's "HTML Living Standard"
continued to be developed without DRM-enabled proposals.
Some proponents of EMEWikipedia:Avoid weasel words say it would help replace plug-ins like Flash with a W3C
standard; opponents point out that EME itself is just an architecture for a DRM plug-in mechanism.
References
[1] http:/ / en. wikipedia.org/ w/ index.php?title=Template:HTML& action=edit
[2] http:/ / en. wikipedia.org/ w/ index.php?title=HTML5& action=edit
[3] W3C Markup Validation Service (http:/ / validator. w3. org/ ), using this service anybody can check that almost all the web sites created by
popular user friendly tools produce web pages not conforming to the W3C standards. The situation can perhaps become a bit better as time
passes, but this was the situation between 1998 and 2012. This fact belongs to the folklore of the real experts, not the average experts floading
the world of informatics.
[4] HTML5-enabled phones to hit 1 billion in sales in 2013 Internet & Media - CNET News (http:/ / news.cnet. com/
8301-1023_3-57339156-93/ html5-enabled-phones-to-hit-1-billion-in-sales-in-2013/ )
[5] 'Thoughts on Flash', by Steve Jobs, CEO of Apple, Inc. (http:/ / www.apple. com/ hotnews/ thoughts-on-flash/ )
[6] Is HTML5 Replacing Flash? (http:/ / www.lyquix.com/ blog/ 122-is-html5-replacing-flash)
[7] Introduction to HTML5 video (http:/ / dev.opera. com/ articles/ view/ introduction-html5-video/ )
[8] IBM Developer Works New elements in HTML5: Structure and semantics (http:/ / www.ibm. com/ developerworks/ library/ x-html5/
?ca=dgr-lnxw01NewHTML)
[9] ICAMD.org Finalcut Silverlight Films that Videographers share Quicktime in a Flash : Video on the Web using HTML5 and other Codecs
(http:/ / www. amazon.com/ dp/ B003H05Q18)
[10] HTML5 DTD (http:/ / www. cs.tut. fi/ jkorpela/ html5-dtd. html): "HTML5 is not SGML-based, and there will be no official DTD for it."
[11] HTML 5 Reference (http:/ / dev. w3. org/ html5/ html-author/ ): "Although it is inspired by its SGML origins, in practice, it really only
shares minor syntactic similarities." "As HTML5 is no longer formally based upon SGML, the DOCTYPE no longer serves this purpose, and
thus no longer needs to refer to a DTD."
[12] "HTML5 Differences from HTML4- APIs" (http:/ / www.w3.org/ html/ wg/ html5/ diff/ #apis). World Wide Web Consortium.
[13] Sergey Mavrody "Sergey's HTML5 & CSS3 Quick Reference. 2nd Edition". Belisso Corp., 2012. ISBN 978-0-9833867-2-8
[14] "HTML Canvas 2D Context" (http:/ / dev. w3. org/ html5/ 2dcontext/ ). World Wide Web Consortium.
[15] "Offline Web Applications" (http:/ / www.w3. org/ TR/ offline-webapps/ ). World Wide Web Consortium.
[16] "HTML5 Web Messaging" (http:/ / dev.w3. org/ html5/ postmsg/ ). World Wide Web Consortium.
HTML5
175
[17] "Web Storage Specification" (http:/ / dev. w3.org/ html5/ webstorage/ ). World Wide Web Consortium.
[18] 1 Introduction - HTML Standard (http:/ / www.whatwg. org/ specs/ web-apps/ current-work/ multipage/ introduction. html#is-this-html5)
[19] "Web SQL Database" (http:/ / dev.w3.org/ html5/ webdatabase/ ). World Wide Web Consortium.
[20] "Indexed Database" (http:/ / www.w3. org/ TR/ IndexedDB/ ). World Wide Web Consortium.
[21] "File API" (http:/ / www. w3.org/ TR/ FileAPI/ )
[22] "File API" (http:/ / www. w3.org/ TR/ FileAPI/ ). World Wide Web Consortium.
[23] "Filesystem API" (http:/ / www.w3. org/ TR/ file-system-api/ ). World Wide Web Consortium.
[24] "File API: Writer" (http:/ / www. w3. org/ TR/ file-writer-api/ ). World Wide Web Consortium.
[25] "Web Audio API" (https:/ / dvcs.w3. org/ hg/ audio/ raw-file/ tip/ webaudio/ specification. html)
[26] "What HTML5 is (and what it isn't)", HTML5 First Look, (lynda.com, 2010),
http://www.lynda.com/home/DisplayCourse.aspx?lpk2=67161
[27] Sergey Mavrody "Sergey's HTML5 & CSS3 Quick Reference". Belisso Corp., 2010. ISBN 978-0-615-43321-9
[28] " HTML5 Popularity Among Fortune 500 Companies (http:/ / www. incore. com/ Fortune500HTML5/ #infographic)". INCORE. Retrieved
5 March 2013.
[29] Encrypted Media Extensions (https:/ / dvcs.w3.org/ hg/ html-media/ raw-file/ tip/ encrypted-media/ encrypted-media. html) draft
specification of the W3C
[30] Une coalition de vingt-sept organisations demande au W3C de garder les menottes numriques (DRM) hors des standards du Web http:/ /
www.april. org/ une-coalition-de-vingt-sept-organisations-demande-au-w3c-de-garder-les-menottes-numeriques-drm-hors
[31] Tell W3C: We don't want the Hollyweb http:/ / www.defectivebydesign. org/ no-drm-in-html5
[32] The W3C's Soul at Stake http:/ / www.fsf. org/ blogs/ rms/ w3c-soul-at-stake
[33] Netflix Wants to Go HTML5, but Not Without DRM http:/ / news. slashdot. org/ story/ 13/ 04/ 16/ 1228245/
netflix-wants-to-go-html5-but-not-without-drm
[34] http:/ / lists.w3.org/ Archives/ Public/ public-html-admin/ 2013Sep/ 0129. html
External links
Library resources about
HTML5
Resources in your library (http:/ / tools.wmflabs. org/ ftl/ cgi-bin/ ftl?st=wp& su=HTML5)
Resources in other libraries (http:/ / tools. wmflabs. org/ ftl/ cgi-bin/ ftl?st=wp& su=HTML5& library=0CHOOSE0)
HTML Working Group (http:/ / www. w3. org/ html/ wg/ ) - HTML5 publications, specifications, and notes
HTML5 Rocks (http:/ / www. html5rocks. com/ ) - A comprehensive HTML5 resource for developers by Google
Mozilla Demo Studio (https:/ / demos. mozilla. org/ en-US/ ) - Demos of HTML5 implementations
HTML5 Frontend Comparison (http:/ / www. capwell. nl/ software-ontwikkeling/ ria-html5-specialisten/
artikelen/ html5-frontend-comparison-58) - Sheet showing HTML5 vs. other main frontend techniques
HTML5 in mobile devices
176
HTML5 in mobile devices
In mobile devices, HTML5 is often used for mobile websites and mobile
applications on Mobile operating systems such as Firefox OS, Tizen, and Ubuntu
Touch. It provides developers with tools such as Offline Web Storage, GeoLocation
API, Canvas Drawing, CSS3, and many more.
In Windows 8, developers can build HTML5, Metro Style apps.
Key features for mobile devices
Offline support
The AppCache and database make it possible for mobile developers to store things locally on the device and
interruptions in connectivity will not affect the ability for someone to get their work done.
Offline support helps browsers cache static pages. They depend more on HTTP response headers sent by web servers
to fetch HTML, CSS and multimedia required to render the web page. If everything required to render is cached,
then a page loads quickly, but even if one item is not cached then everything slows down dramatically.
To provide offline support, a cache manifest file should be created to specify the offline application's resources-i.e.
its pages, images, and other files needed to run offline. Typically, the manifest also contains a comment that is
changed when any of the resources change, prompting the browser to refresh the cache.
CACHE MANIEEST
# Version 0.1
off1ine.hm1
/iui/iui._s
/iui/iui.css
/iui/1oading.gif
/iui/oo1bar.png
/iui/whieBuon.png
/images/gymnasics._pg
/images/soccer.png
/images/gym._pg
/images/soccer._pg
The "manifest" attribute of the app's "html" element should specify the URL of the manifest file.
<hm1 manifes="manifes.mf">
The proper MIME type "text/cache-manifest" should also be set on the server for the cache manifest.
HTML5 in mobile devices
177
Canvas drawing
Sites can mark off a space on a page where interactive pictures, charts and graphs, game components, and other
imaginations can be drawn directly by programming code and user interaction - no Flash or other plug-ins are
required.
Video and audio streaming support
Development is in the very early stages and subject to format disruption, but sites like YouTube and Pandora could
one day skip Flash entirely and bring streaming audio and video, with timed playback and further features.
GeoLocation API
This is actually not part of HTML5, but is a separate specification. The geolocation API lets you share your location
with trusted web sites. (This is actually the physical location of the device or of your internet connection, decided
based on some combination of GPS, accelerometers, cellphone tower triangulation, and ISP address records.) The
latitude and longitude are available to JavaScript on the page, which in turn can send it back to the remote web
server and show you location-aware content like local businesses or show your location on a map.
Following is the prominent API for a geolocation.
navigaor.geo1ocaion.geCurrenRosiion(successCa11bac', errorCa11bac', opions),
Geolocation is an object which is part of Navigator object. It uses the getCurrentPosition() method. Finding location
is an asynchronous operation as it requires the user's permission for access. Hence callback functions for success and
failure are required.
Advanced forms
Even simple things like the improvements in HTML5 for forms could make life easier for mobile applications.
Fields that can be validated by the browser are improvements for mobile devices. The more that can be handled by
the browser means less time downloading JavaScript code and fewer round trips to the server if validation can be
found before the form is posted.
HTML5 capabilities in top mobile devices
A Mobile Web Metrics Report demonstrates HTML5 capabilities in mobile devices. The report checked how many
HTML5 features are supported by different devices that access the mobile web.
Top 5 supported features
GeolocationAPI, offline web application support, WebStorage, CSS3 Selectors and 2D animations are the top five
supported features referred to by the term HTML5 across the top 15 mobile devices in all USA, UK, Germany,
Malaysia, Australia markets examined.
Top 5 partially supported features
Misc. Element types and attributes, extended user interaction concept, CSS3 in General, extended form concept, and
extended video / audio support are the top five partially supported HTML5 features across the top 15 mobile devices
in all USA, UK, Germany, Malaysia, Australia markets examined.
HTML5 in mobile devices
178
Top 5 not supported features
Microdata, 3D animation rendering, FileReader API, IndexedDB, and local Device support or the WebWorkers
feature respectively are the top five HTML5 features not supported across the top 15 mobile devices in all USA, UK,
Germany, Malaysia, Australia markets examined.
This report concludes that HTML5 is a welcome addition to the mobile party, but it does not negate device and OS
fragmentation.
Frameworks for app development
With HTML5 and mobile web development new tools and frameworks are popping up to provide a more consistent
and comprehensive HTML5 support across mobile browsers. Such HTML5 mobile web frameworks are:
Appear IQ
Appear IQ is a mobility platform that simplifies the development and management of context-aware hybrid mobile
web applications (HTML5, CSS3, JavaScript), native mobile applications as well as their integration with enterprise
IT systems. It allows developers to make use of their web skills to craft powerful mobile applications that are
optimized to the end user's needs.
Enyo
Enyo is an object-oriented JavaScript cross platform and cross device application framework emphasizing
modularity and encapsulation. It was originally launched for developers to create applications for the HP TouchPad
with Enyo 1.0 which ran the mobile operating system WebOS version 3.0. In January of 2012, Enyo 2.0 was
released as an open source project with support for several mobile operating systems and browsers. Since then, Enyo
has been updated to version 2.2 for support for many more mobile operating systems and browsers along many other
additions of usability to the development framework.
DaVinci Studio
DaVinci is a framework that supports HTML5 mobile app development. The tool has a WYSIWYG (What You See
Is What You Get) authoring environment in which users may drag and drop components to build applications. It also
comes with a jQuery framework as well as other libraries and allows users to integrate open source libraries of their
choice into the tool.
DHTMLX Touch
DHTMLX Touch is an HTML5-based JavaScript library for building mobile web applications, in the form of UI
widgets and a cross-platform application framework compatible with the major web browsers for mobile platforms.
Applications built with DHTMLX Touch will run smoothly on iPad, iPhone, Android-based smartphones, and other
popular devices.
HTML5 in mobile devices
179
Google Web Toolkit
Google Web Toolkit is a web app framework that can be used for developing mobile html5 apps in Java, especially
in combination with optimized mobile widget libraries such as m-gwt
[1]
JavaScript
JavaScript, is a scripting language built into nearly every modern browser. In Windows 8 and Windows RT (both
HTML Application and Windows Runtime), any HTML5 apps fully supported mobile operating systems (Firefox
OS and WebOS, Tizen and Ubuntu Touch), event handling in HTML5 apps is made possible by JavaScript.
Jo
Jo is a JavaScript framework for HTML5 capable browsers and devices. It was originally designed to work on
mobile platforms as a GUI and light data layer on top of PhoneGap. Since its creation, Jo also works as a lightweight
framework for mobile browsers, newer desktop browsers, and dashboard widgets.
jQuery Mobile
jQuery Mobile, is a unified user interface system across all popular mobile device platforms, built on jQuery and
jQuery UI.
jQTouch
jQTouch is jQuery plugin for mobile web development on the iPhone, iPod Touch, Android 2.3+, and other
forward-thinking devices. This framework is heavy on the CSS, while light on the JavaScript.
KonyOne
KonyOne is a multichannel mobile applications platform from Kony Solutions that supports all browsers including
HTML5 across channels (phones, tablets, kiosks and desktops).
M-Project
The-M-Project is an HTML5 JavaScript framework that targets iOS, Android, BlackBerry and webOS platforms. It
makes use of jQuery on the JavaScript part and contains all UI and core files with features like offline support,
internationalization and more.
LungoJs
LungoJs is a framework powered by HTML5, CSS3 for iOS, Android, BlackBerry and WebOS. It has support for
touch events like tap, double-tap or swipe and does not use images (including the icons), as everything is vectorized.
MobileNationHQ
MobileNationHQ is a web based tool that uses a visual programming paradigm to facilitate the creation of HTML5
mobile applications for iOS and android. The tool also supports the integration of custom JavaScript
qooxdoo Mobile
qooxdoo is a universal JavaScript framework that enables you to create applications for a wide range of platforms.
With its object-oriented programming model you build native-like apps for mobile devices, leveraging an integrated
tool chain and a state-of-the-art GUI toolkit.
HTML5 in mobile devices
180
Sencha Touch
Sencha Touch is the first HTML5 framework for mobile devices. This framework builds web applications that make
sense for mobile devices. It comes with a comprehensive UI widget library, complete touch event management with
CSS transitions and an extensive data package.
Smart Mobile Studio
Smart Mobile Studio is an Object Pascal based framework for HTML5 development. The compiler compiles Object
Pascal source code into a JavaScript driven web/mobile application. The IDE contains several components that can
be organized in a visual designer. The Smart Pascal dialect supports various wrapping and mapping methods against
the JavaScript language. Such as "asm sections" that contains pure JavaScript and "exerna1 method/class
directive" that defines the interface in Smart Pascal and the implementation in JavaScript.
SproutCore
SproutCore, is an open source HTML5/JavaScript for building web and mobile apps. Through the use of PhoneGap,
SproutCore applications can be wrapped into native apps that run on iOS, Blackberry and Android platforms.
ViziApps
ViziApps is a mobile app development platform that supports creation of HTML5 web apps and hybrid apps for
iPhones, iPads, Android phones, and Android tablets without coding. App developers use a drag-and-drop approach
to design and build mobile apps with ViziApps and access data with Google spreadsheets, web services, SQL
databases and other popular web data sources. In addition to no-coding app design, custom JavaScript can be added
to include 3rd party libraries and to extend app functionality.
Worklight
Worklight is a mobile application platform that supports the development of HTML5, hybrid and native mobile
applications. The Worklight Studio - the platform's IDE - allows mobile developers to make full use of all existing
HTML5 functionality as well as further enhance these capabilities with utilities and mechanisms required by modern
organizations such as encryption of locally stored data, offline authentication, combined HTML5 and native coding,
3rd-party library integration with frameworks such as PhoneGap, Sencha Touch, JQuery, and more.
Hybrid Mobile Apps
A hybrid mobile application (or hybrid mobile app) is a mobile application that runs inside of a native container and
leverages the device's web browser to display locally hosted HTML pages.
[2]
Hybrid mobile apps are composed
mostly of HTML, JavaScript, and CSS. Device specific functionalities such as camera access, geolocation, and
accelerometer readings are exposed through a JavaScript API.
Differences from Native Apps and Mobile Web Apps
Hybrid mobile apps contain a mixture of native app and mobile web app concepts. They do contain native code but
are not completely native. Typically the native code is provided by a framework and reveals a JavaScript API so that
the app's JavaScript code can perform native functions such as taking a picture with the camera. Extra functionality
can also be implemented by creating native "plugin" components for the framework that perform a native task.
Unlike mobile web app's, which store source files on a server, hybrid mobile apps store HTML, JavaScript, and CSS
files locally so no Internet access is required to launch a hybrid mobile app.
[3]
To the user a hybrid mobile app
appears to be no different than a native app; it is launched and closed in the same manner as opposed to a mobile
web app, which must be accessed through the device's web browser app.
HTML5 in mobile devices
181
Pros and Cons of Hybrid Apps
Hybrid mobile apps have their pros and cons. When choosing what type of mobile application to develop it is
important to keep these in mind.
Pros
Hybrid mobile apps allow code reuse across platforms. Let the library or framework you are using take care of the
platform specific differences and use the same JavaScript code on both platforms.
JavaScript is something that many developers are already familiar with where something like the iOS
development tools are more specialized. It can be argued that there is less of a learning curve when developing
hybrid mobile apps compared to native apps.
The apps interface and logic can be built and debugged in the web browser using an emulation framework. This
could lower development costs depending on the tools required to develop native apps for the target platforms.
Cons
Hybrid mobile apps are more susceptible to user interface lag due to the extra layers of abstraction.
Only a certain subset of native functionality is available which depends on the framework. All others native
functions are accessible developing Plugins
Debugging a hybrid mobile app once it is actually on the device is not as simple as debugging a native app due to
the native code and JavaScript code running simultaneously even if a right usage of console.log is comfortable
enoughWikipedia:Disputed statement
[citation needed]
As for native apps, the hybrid code base requires recompilation and resubmission to the distribution network
where it is possible to instantly update a mobile web app's codebase.
Hybrid Mobile App Frameworks
Name Website License Latest
Version
API
Apache Cordova (previously
PhoneGap)
Apache License, v2.0 3.0.0
Docs
[4]
Appcelerator Titanium Proprietary 3.1.1
Titanium docs
[5]
Appear IQ Proprietary 8.0.2 -
IBM Worklight Proprietary 5 -
Oracle ADF Mobile Framework Proprietary 11.1.1.6 Java JDK 1.4
KonyOne
Non-Proprietary
[citation needed]
Wikipedia:Disputed
statement
5.0 -
CocoonJS by Ludei Proprietary 1.4.4
Ludei
[6]
Kendo Mobile Proprietary 2013.2.716
HTML5 in mobile devices
182
References
[1] http:/ / www. m-gwt. com/
[2] What is a Hybrid Mobile App? (http:/ / icenium. com/ community/ blog/ icenium-team-blog/ 2012/ 06/ 14/ what-is-a-hybrid-mobile-app-)
[3] Native, HTML5, or Hybrid (http:/ / wiki. developerforce. com/ page/
Native,_HTML5,_or_Hybrid:_Understanding_Your_Mobile_Application_Development_Options)
[4] http:/ / cordova.apache.org/ docs/ en/
[5] http:/ / docs.appcelerator.com/ titanium/ latest
[6] http:/ / wiki.ludei.com
External links
WHAT HTML5 Editor's Draft (http:/ / www. whatwg. org/ specs/ web-apps/ current-work/ multipage/ )
W3C HTML5 Associated Vocabulary and APIs (http:/ / dev. w3. org/ html5/ spec/ Overview. html)
W3C The HTML5 differences with HTML4 (http:/ / dev. w3. org/ html5/ html4-differences/ )
W3C GeoLocation API (http:/ / www. w3. org/ TR/ geolocation-API/ )
Web storage
HTML
HTML and HTML5; HTML editor
Dynamic HTML
XHTML
XHTML Basic (Mobile)
XHTML Mobile Profile and C-HTML
HTML element
Span and div
HTML attribute
Character encodings; Unicode
Language code
Document Object Model
Browser Object Model
Style sheets and CSS
Font family and Web colors
HTML scripting and JavaScript
W3C, WHATWG, and validator
Quirks mode
HTML Frames
HTML5 Canvas, WebGL, and WebCL
HTML5 Audio and HTML5 video
Web storage
Web browser (layout) engine
Comparison of
document markup languages
web browsers
layout engine support for
HTML; Non-standard HTML
XHTML (1.1)
HTML5; HTML5 canvas,
HTML5 media (Audio, Video)
Web storage
183
v
t
e
[1]
Web storage and DOM storage (document object model) are web application software methods and protocols used
for storing data in a web browser. Web storage supports persistent data storage, similar to cookies but with a greatly
enhanced capacity
[1]
and no information stored in the HTTP request header.
[2]
There are two main web storage
types: local storage and session storage, behaving similarly to persistent cookies and session cookies respectively.
Web storage is being standardized by the World Wide Web Consortium (W3C). It was originally part of the HTML
5 specification, but is now in a separate specification.
[3]
It is supported by Internet Explorer 8, Mozilla-based
browsers (e.g., Firefox 2+, officially from 3.5),
[4]
Safari 4, Google Chrome 4 (sessionStorage is from 5), and Opera
10.50. As of 14March2011[5] Opera and IE9 supports the storage events.
[6]
Features
Web storage can be viewed simplistically as an improvement on cookies. However, it differs from cookies in some
key ways.
Storage size
Web storage provides far greater storage capacity (5MB per origin in Google Chrome,
[7]
Mozilla Firefox,
[8]
and
Opera; 10MB per storage area in Internet Explorer;
[9]
25MB per origin on BlackBerry 10 devices) compared to 4kB
(around 1000times less space) available to cookies.
Client-side interface
Unlike cookies, which can be accessed by both the server and client side, web storage falls exclusively under the
purview of client-side scripting.
Web storage data is not automatically transmitted to the server in every HTTP request, and a web server can't
directly write to Web storage. However, either of these effects can be achieved with explicit client-side scripts,
allowing for fine-grained tuning of the desired interaction with the server.
Local and session storage
Web storage offers two different storage areas-local storage and session storage-which differ in scope and
lifetime. Data placed in local storage is per origin (the combination of protocol, hostname, and port number as
defined in the same origin policy) (the data is available to all scripts loaded from pages from the same origin that
previously stored the data) and persists after the browser is closed. Session storage is per-page-per-window and is
limited to the lifetime of the window. Session storage is intended to allow separate instances of the same web
application to run in different windows without interfering with each other, a use case that's not well supported by
cookies.
[10]
Web storage
184
Interface and data model
Web storage currently provides a better programmatic interface than cookies because it exposes an associative array
data model where the keys and values are both strings. An additional API for accessing structured data is being
considered by the W3C Web Applications Working Group.
[11]
Usage
Browsers that support web storage have the global variables 'sessionStorage' and 'localStorage' declared at the
window level. The following JavaScript code can be used on these browsers to trigger web storage behaviour:
sessionStorage
// Store va1ue on browser for duration of the session
sessionSorage.seIem(''ey', 'va1ue'),
// Retrieve va1ue (gets de1eted when browser is c1osed and re-opened)
a1er(sessionSorage.geIem(''ey')),
localStorage
// Store va1ue on the browser beyond the duration of the session
1oca1Sorage.seIem(''ey', 'va1ue'),
// Retrieve va1ue (persists even after c1osing and re-opening the
browser)
a1er(1oca1Sorage.geIem(''ey')),
Accessing data for the currently browsed domain
The following code can be used to retrieve all values stored in local storage for the currently browsed domain (the
domain for the web page that is being browsed).
This JavaScript code can be executed using development tools available in most modern browsers such as the IE
Developer Toolbar, Chrome Developer Tools, the Firebug extension in Firefox, or Opera Dragonfly:
var oupu = "LOCALSTORAGE
ATA:\n------------------------------------\n",
if (window.1oca1Sorage) {
if (1oca1Sorage.1engh) {
for (var i = 0, i < 1oca1Sorage.1engh, i++) {
oupu += 1oca1Sorage.'ey(i) + ': ' +
1oca1Sorage.geIem(1oca1Sorage.'ey(i)) + '\n',
}
} else {
oupu += 'There is no daa sored for his domain.',
}
} else {
oupu += 'Your browser does no suppor 1oca1 sorage.'
}
conso1e.1og(oupu),
Web storage
185
Data types
Only strings can be stored via the Storage API.
[12]
Attempting to store a different data type will result in an
automatic conversion into a string in most browsers. Conversion into JSON (JavaScript Object Notation), however,
allows for effective storage of JavaScript objects.
// Store an obect instead of a string
1oca1Sorage.seIem(''ey', {name: 'va1ue'}),
a1er(typeof 1oca1Sorage.geIem(''ey')), // string
// Store an integer instead of a string
1oca1Sorage.seIem(''ey', 1),
a1er(typeof 1oca1Sorage.geIem(''ey')), // string
// Store an obect using JSON
1oca1Sorage.seIem(''ey', JSON.sringify({name: 'va1ue'})),
a1er(JSON.parse(1oca1Sorage.geIem(''ey')).name), // va1ue
Nomenclature
The W3C draft is titled "Web Storage", but "DOM storage" is also a commonly used name.
[13][14]
The "DOM" in DOM storage doesn't literally refer to the Document Object Model. According to the W3C, "The
term DOM is used to refer to the API set made available to scripts in Web applications, and does not necessarily
imply the existence of an actual Document object..."
[15]
Web Storage Management
Storage of web storage objects is enabled by default in Mozilla Firefox and SeaMonkey, but can be disabled by
setting the "about:config" parameter "dom.storage.enabled" to false.
[16]
Mozilla Firefox stores all web storage objects in a single file named webappsstore.sqlite. The sqlite3 command can
be used to show the elements stored therein.
[17]
There are browser extensions/add-ons for Google Chrome and Mozilla Firefox available that let the user deal with
web storage, such as "Click&Clean"
[18][19]
and "BetterPrivacy" which can be configured to remove the whole web
storage automatically on a regular basis.
[20][21][22]
References
[1] Opera Web Storage, 2011 http:/ / dev. opera. com/ articles/ view/ web-storage/
[2] AndyHume.net, 2011 http:/ / blog. andyhume. net/ localstorage-is-not-cookies
[3] Web Storage (http:/ / www. w3. org/ TR/ webstorage/ ). W3.org. Retrieved on 2011-06-12.
[4] Mozilla Developer Center: DOM Storage (https:/ / developer. mozilla. org/ En/ DOM:Storage#Description). Developer.mozilla.org. Retrieved
on 2011-06-12.
[5] http:/ / en. wikipedia.org/ w/ index.php?title=Web_storage& action=edit
[6] (http:/ / www. codeproject.com/ Articles/ 162783/ HTML5-Web-Storage-in-Essence). HTML5 Web Storage in Essence (2011-02-28).
Retrieved on 2012-03-30.
[7] chrome.storage.local.QUOTA_BYTES (http:/ / developer. chrome. com/ extensions/ storage. html#property-local-QUOTA_BYTES) Chrome
extension developer documentation.
[8] John Resig: DOM Storage (http:/ / ejohn. org/ blog/ dom-storage/ ). John Resig, ejohn.org. Retrieved on 2011-06-12.
[9] MSDN: Introduction to DOM Storage (http:/ / msdn.microsoft. com/ en-us/ library/ cc197062(VS. 85). aspx#_dom). Microsoft Developer
Network, msdn.microsoft.com. Retrieved on 2011-06-12.
[10] W3C: Web Storage draft standard (http:/ / dev. w3.org/ html5/ webstorage/ #introduction). Dev.w3.org (2004-02-05). Retrieved on
2011-06-12.
[11] W3C: Indexed Database API (http:/ / www.w3. org/ TR/ IndexedDB/ ). W3C. Retrieved on 2012-02-12.
Web storage
186
[12] W3C, 2011 http:/ / dev.w3. org/ html5/ webstorage/
[13] Mozilla Developer Center: DOM Storage (https:/ / developer. mozilla. org/ En/ DOM:Storage). Developer.mozilla.org. Retrieved on
2011-06-12.
[14] MSDN: Introduction to DOM Storage (http:/ / msdn.microsoft. com/ en-us/ library/ cc197062(VS. 85). aspx). Msdn.microsoft.com.
Retrieved on 2011-06-12.
[15] W3C: Web Storage draft standard (http:/ / dev. w3.org/ html5/ webstorage/ #terminology). Dev.w3.org (2004-02-05). Retrieved on
2011-06-12.
[16] Mozillazine article on disabling Web Storage Objects in about:config. Kb.mozillazine.org. Retrieved on 2011-06-12.
[17] Firefox's Super Cookies (http:/ / www. cerias. purdue. edu/ site/ blog/ post/ firefoxs-super-cookies), Cerias, January 16, 2008
[18] "Click&Clean" extension for Google Chrome (http:/ / www. hotcleaner. com/ clickclean_chrome.html). Hotcleaner.com (2011-06-01).
Retrieved on 2011-06-12.
[19] "Click&Clean add-on for Mozilla Firefox (https:/ / addons. mozilla. org/ en-US/ firefox/ addon/ clickclean/ ). Addons.mozilla.org. Retrieved
on 2011-06-12.
[20] Mozilla add-ons page for "Better Privacy" (https:/ / addons. mozilla. org/ en-US/ firefox/ addon/ betterprivacy/ ). Addons.mozilla.org.
Retrieved on 2011-06-12.
[21] Homepage of "Better Privacy", with some further references to blogs and articles (http:/ / netticat. ath.cx/ extensions. html). Netticat.ath.cx.
Retrieved on 2011-06-12.
[22] Google Chrome Browser Client-Side Storage (http:/ / www. hotcleaner. com/ web_storage.html). Hotcleaner.com. Retrieved on
2011-06-12.
External links
W3C: Web Storage (http:/ / www. w3. org/ TR/ webstorage/ )
MSDN: Introduction to DOM Storage (http:/ / msdn. microsoft. com/ en-us/ library/ cc197062(VS. 85). aspx)
Mozilla Developer Center: DOM Storage (https:/ / developer. mozilla. org/ En/ DOM:Storage)
Opera: Web Storage: easier, more powerful client-side data storage (http:/ / dev. opera. com/ articles/ view/
web-storage/ )
BB10: HTML5 WebWorks Api Reference (https:/ / developer. blackberry. com/ html5/ api/ localStorage. html)
187
Chapter 16: Online Exercises with the
HTML5 Mobile Application Framework
Sencha Touch
Sencha Touch
Sencha Touch
A Sencha Touch app with an iOS6 theme
Developer(s) Sencha
Stable release 2.3.1 / November8, 2013
Development status Active
Written in JavaScript
Operating system Android, iOS, BlackBerry, Kindle, Windows Phone, Tizen
Available in English
Type JavaScript library
License GPLv3 or commercial
Website
www.sencha.com/products/touch
[1]
Sencha Touch is a user interface (UI) JavaScript library, or framework, specifically built for the Mobile Web. It can
be used by Web developers to develop user interfaces for mobile web applications that look and feel like native
applications on supported mobile devices. It is fully based on web standards such as HTML5, CSS3 and JavaScript.
Sencha Touch aims to enable developers to quickly and easily create HTML5 based mobile apps that work on
Android, iOS, Windows, Tizen and BlackBerry devices, and produce a native-app-like experience inside a browser.
Sencha Touch
188
Version history and support
Sencha Touch is a product of Sencha, which was formed after popular JavaScript library projects ExtJS, jQTouch
and Raphal were combined. The first release of Sencha Touch, version 0.90 beta, was made available on July 17,
2010. This beta release supported devices running Android, and iOS (on iPhone, iPod touch, iPad). Subsequently the
first stable version, 1.0, was released in November 2010. Version 1.1.0 added support for devices running
BlackBerry OS version 6. The latest release, Sencha Touch 2.3.1, was released in November, 2013 and is designed
to run on the following browsers and platforms: Android browser, Google Chrome for Android, BlackBerry 10,
Bada Mobile Browser, Kindle Fire Browser, Windows Phone 8 and Windows 8 IE10 and Mobile Safari. Sencha
Touch 2.3.1 contains support for the Tizen browser. There are no announced plans to support Firefox Mobile.
Features
Sencha Touch includes a set of graphical user interface GUI-based controls (or components) for use within mobile
web applications. These components are optimized for touch input. The components are: buttons with device specific
themes and effects; form elements such as text fields for email, date picker, and address; sliders, selectors, and
combo-boxes; a list component with momentum-scrolling and an index bar; a minimal icon set; toolbars and menus;
movable tabs; bottom toolbars; and a map component with support for multi-touch gestures such as pinch and zoom.
All the components can be themed according to the target device. This is done using SASS, a stylesheet language
built over CSS.
Sencha Touch has eight in-built transition effects including slide over or under the current element, pop, flip, and
cube. It supports common touch gestures built from touch events, which are Web standards but supported only by
Android, iOS, and some touch enabled devices. These are tap, double tap, swipe, scroll, and pinch.
Comparison to native applications
Native applications on mobile devices have access to device components such as the compass, and microphone
which Sencha Touch can access through the use of a native shell such as Cordova. As mobile browsers and devices
have evolved to meet emerging standards, APIs and components such as WebSockets, GPS, camera and
accelerometers have become available to mobile web applications, with GPS specifically supported by Sencha
Touch. Sencha Touch can be used along with Cordova or Phonegap or its own native packager, to create applications
native to a mobile device that have access to currently native-only components, and which can be made available
from app marketplaces. As of Sencha Touch 2.3, Cordova is the favored packaging technology.
References
[1] http:/ / www. sencha. com/ products/ touch
Bibliography
Jesus Garcia and Anthony De Moss, Sencha Touch in Action (Early access edition), ISBN 978-1-61729-037-4.
External links
Official website (http:/ / sencha. com/ products/ touch)
189
Chapter 17: Introduction to NoSQL
Databases for Web Apps
NoSQL
A NoSQL database provides a mechanism for storage and retrieval of data that is modeled in means other than the
tabular relations used in relational databases. Motivations for this approach include simplicity of design, horizontal
scaling and finer control over availability. NoSQL databases are often highly optimized key-value stores intended
primarily for simple retrieval and appending operations, whereas an RDBMS is intended as a general purpose data
store. There will thus be some operations where NoSQL is faster and some where an RDBMS is faster. NoSQL
databases are finding significant and growing industry use in big data and real-time web applications. NoSQL
systems are also referred to as "Not only SQL" to emphasize that they may in fact allow SQL-like query languages to
be used.
History
Carlo Strozzi used the term NoSQL in 1998 to name his lightweight, open-source relational database that did not
expose the standard SQL interface. Strozzi suggests that, as the current NoSQL movement "departs from the
relational model altogether; it should therefore have been called more appropriately 'NoREL'.
Eric Evans (then a Rackspace employee) reintroduced the term NoSQL in early 2009 when Johan Oskarsson of
Last.fm wanted to organize an event to discuss open-source distributed databases. The name attempted to label the
emergence of a growing number of non-relational, distributed data stores that often did not attempt to provide
atomicity, consistency, isolation and durability guarantees that are key attributes of classic relational database
systems.
Taxonomy
There have been various approaches to classify NoSQL databases, each with different categories and subcategories.
Because of the variety of approaches and overlaps it is difficult to get and maintain an overview of non-relational
databases. Nevertheless, the basic classification that most would agree on is based on data model. A few of these and
their prototypes are:
Column: HBase, Accumulo, Cassandra
Document: MarkLogic, MongoDB, Couchbase
Key-value: Dynamo, Riak, Redis, MemcacheDB, Project Voldemort
Graph: Neo4J, OrientDB, Allegro, Virtuoso
NoSQL
190
Classification based on data model
Stephen Yen in his blog post "NoSQL is a Horseless Carriage" suggests the following:
[1]
Term Matching Database
KV Cache Memcached, Repcached, Coherence, Infinispan, eXtreme Scale, JBoss Cache, Velocity, Terracotta, Gigaspaces
XAP
KV Store Keyspace, Flare, SchemaFree, RAMCloud
KV Store - Eventually
consistent
Dynamo, Voldemort, Dynomite, SubRecord, MotionDb, DovetailDB
Data-structures server Redis
KV Store - Ordered TokyoTyrant, Lightcloud, NMDB, Luxio, MemcacheDB, Actord
Tuple Store Gigaspaces, Coord, Apache River
Object Database ZopeDB, DB4O, Shoal, Perst
Document Store MarkLogic, CouchDB, MongoDB, Jackrabbit, XML-Databases, ThruDB, CloudKit, Persevere, Riak Basho,
Scalaris
Wide Columnar Store BigTable, HBase, Cassandra, Hypertable, KAI, OpenNeptune, Qbase, KDI
Classification based on feature
Ben Scofield categorized NoSQL databases based on nonfunctional categories ("(il)ities") plus a rating of their
feature coverage:
[citation needed]
Data Model Performance Scalability Flexibility Complexity Functionality
Key-value Stores high high high low variable (none)
Column Store high high moderate low minimal
Document Store high variable (high) high low variable (low)
Graph Database variable variable high high graph theory
Relational Database variable variable low moderate relational algebra.
Examples
Document store
The central concept of a document store is the notion of a "document". While each document-oriented database
implementation differs on the details of this definition, in general, they all assume that documents encapsulate and
encode data (or information) in some standard formats or encodings. Encodings in use include XML, YAML, and
JSON as well as binary forms like BSON, PDF and Microsoft Office documents (MS Word, Excel, and so on).
Different implementations offer different ways of organizing and/or grouping documents:
Collections
Tags
Non-visible Metadata
Directory hierarchies
Compared to relational databases, for example, collections could be considered as tables as well as documents could
be considered as records. But they are different: every record in a table has the same sequence of fields, while
documents in a collection may have fields that are completely different.
NoSQL
191
Documents are addressed in the database via a unique key that represents that document. One of the other defining
characteristics of a document-oriented database is that, beyond the simple key-document (or key-value) lookup that
you can use to retrieve a document, the database will offer an API or query language that will allow retrieval of
documents based on their contents.
Name Language Notes
BaseX Java, XQuery XML database
Cloudant Erlang, Java, Scala, C JSON store (online service)
Clusterpoint C++ XML, geared for Full text search
Couchbase Server Erlang, C, C++ Support for JSON and binary documents
Apache CouchDB Erlang JSON database
djondb
[2][3][4]
C++ JSON, ACID Document Store
ElasticSearch Java JSON, Search engine
eXist Java, XQuery XML database
Jackrabbit Java Java Content Repository implementation
IBM Lotus Notes and Lotus Domino LotusScript, Java, IBM X Pages, others MultiValue
MarkLogic Server XQuery, Java, REST XML database with support for JSON, text, and binaries
MongoDB C++, C#, Go BSON store (binary format JSON)
Oracle NoSQL Database Java, C
OrientDB Java JSON, SQL support
CoreFoundation Property list C, C++, Objective-C JSON, XML, binary
Sedna XQuery, C++ XML database
SimpleDB Erlang online service
TokuMX C++, C#, Go MongoDB with Fractal Tree indexing
OpenLink Virtuoso C++, C#, Java, SPARQL middleware and database engine hybrid
Graph
This kind of database is designed for data whose relations are well represented as a graph (elements interconnected
with an undetermined number of relations between them). The kind of data could be social relations, public transport
links, road maps or network topologies, for example.
Name Language Notes
AllegroGraph SPARQL RDF GraphStore
IBM DB2 SPARQL RDF GraphStore added in DB2 10
DEX Java, C++, .NET High-performance graph database
FlockDB Scala
InfiniteGraph Java High-performance, scalable, distributed graph database
Neo4j Java
OpenLink Virtuoso C++, C#, Java, SPARQL middleware and database engine hybrid
OrientDB Java
Sones GraphDB C#
NoSQL
192
Sqrrl Enterprise Java Distributed, real-time graph database featuring cell-level security
OWLIM Java, SPARQL 1.1 RDF graph store with reasoning
Key!value stores
Key-value stores allow the application to store its data in a schema-less way. The data could be stored in a datatype
of a programming language or an object. Because of this, there is no need for a fixed data model. The following
types exist:
KV - eventually consistent
Apache Cassandra
Dynamo
Hibari
OpenLink Virtuoso
Project Voldemort
Riak
KV - hierarchical
GT.M
InterSystems Cach
KV - cache in RAM
memcached
redis
OpenLink Virtuoso
Hazelcast
Oracle Coherence
KV - solid state or rotating disk
Aerospike
BigTable
CDB
Couchbase Server
Keyspace
LevelDB
MemcacheDB (using Berkeley DB)
MongoDB
OpenLink Virtuoso
Tarantool
Tokyo Cabinet
Tuple space
Oracle NoSQL Database
NoSQL
193
KV - ordered
Berkeley DB
FoundationDB
IBM Informix C-ISAM
InfinityDB
MemcacheDB
NDBM
Object database
db4o
GemStone/S
InterSystems Cach
JADE
NeoDatis ODB
ObjectDB
Objectivity/DB
ObjectStore
ODABA
Perst
OpenLink Virtuoso
Versant Object Database
WakandaDB
ZODB
Tabular
Apache Accumulo
BigTable
Apache Hbase
Hypertable
Mnesia
OpenLink Virtuoso
Tuple store
Apache River
OpenLink Virtuoso
Tarantool
Triple/Quad Store (RDF) database
SparkleDB
Virtuoso Universal Server
Ontotext-OWLIM
Apache JENA
Oracle NoSQL database
MarkLogic
NoSQL
194
Hosted
Freebase
OpenLink Virtuoso
Datastore on Google Appengine
Amazon DynamoDB
Cloudant Data Layer (CouchDB)
Multivalue databases
Northgate Information Solutions Reality, the original Pick/MV Database
Extensible Storage Engine (ESE/NT)
OpenQM
Revelation Software's OpenInsight
Rocket U2
D3 Pick database
InterSystems Cach
InfinityDB
Cell database
[]
Boardwalk
NoSQL databases on the cloud
NoSQL databases can be run on-premises, but are also often run on IaaS or PaaS platforms like Amazon Web
Services, RackSpace or Heroku. There are three common deployment models for NoSQL on the cloud:
Virtual machine image - cloud platforms allow users to rent virtual machine instances for a limited time. It is
possible to run a NoSQL database on these virtual machines. Users can upload their own machine image with a
database installed on it, use ready-made machine images that already include an optimized installation of a
database, or install the NoSQL database on a running machine instance.
Database as a service - some cloud platforms offer options for using familiar NoSQL database products as a
service, such as MongoDB, Redis and Cassandra, without physically launching a virtual machine instance for the
database. The database is provided as a managed service, meaning that application owners do not have to install
and maintain the database on their own, and pay according to usage. Some database as a service providers provide
additional features, such as clustering or high availability, that are not available in the on-premise version of the
database (see the table below for several examples).
Native cloud NoSQL databases - some providers offer a NoSQL database service which is available only on the
cloud. A well-known example is Amazon's SimpleDB, a simple NoSQL key-value store. SimpleDB cannot be
installed on a local machine and cannot be used on any cloud platform except Amazon's.
The following table provides notable examples of NoSQL databases available on the cloud in each of these
deployment models:
NoSQL
195
Deployment
Model
Database
Technology
Provider Cloud-Specific Features Pricing Model
Virtual machine
image
MongoDB
MongoDB - machine images for Amazon
EC2
[5]
and Windows Azure
[6]
None Database and machine
image - open source
Amazon/Azure instances -
pay per use
Virtual
Machine Image
Redis
Redis - standard open source
installation
Script for installation on Amazon EC2
[7]
Recommended installation on
Windows Azure
[8]
None Database and machine
image - open source
Amazon/Azure instances -
pay per use
Virtual machine
image
Cassandra
Apache Cassandra - machine image for
Amazon EC2
[9]
None Database and machine
image - open source
Amazon instances - pay per
use
Database as a
Service
MongoDB
Mongolab
[10]
- available on Amazon,
Google, Joyent, Rackspace and Windows
Azure
Managed service
High availability
Automatic failover
Pre-configured
clustering
Free up to 500MB (on
disk)
[11]
Paid plans based on
architecture and storage size
Database as a
Service
Redis/Memcached
Amazon Web Services - ElastiCache
[12]
Managed service
Automatic healing of
failed nodes
Resilient system to
prevent overloaded DBs
Performance monitoring
Free for 750 hours on micro
instance
[13]
Pay per use for machine
utilization, no separate
charge for data usage
[14]
Database as a
Service
Redis
RedisToGo
[15]
- available on Amazon
EC2, RackSpace, Heroku, AppHarbor,
Orchestra
Managed service
Daily backups
API enabling creation,
deletion, or download of
Redis instances
Free up to 5MB (memory)
Paid plans based on
memory usage
Database as a
Service
Redis
Redis Cloud (Garantia Data)
[16]
-
available on Amazon EC2, Windows
Azure, Heroku, Cloud Foundry,
OpenShift, AppFog, AppHarbor
Managed service
Automatic scaling,
unlimited Redis nodes
High availability
Built-in clustering
Free up to 25MB
(memory)
[17]
Pay per use
Database as a
Service
Cassandra
InstaClustr
[18]
- available on Amazon
EC2, RackSpace, Windows Azure,
Joyent, Google Compute Engine
Managed service
Performance tuning
Monitoring
Automated backups
DataStax OpsCenter for
cluster admin
Paid plans based on disk
storage, memory usage and
CPU cores
[19]
Native cloud
NoSQL
database
Amazon SimpleDB Amazon Web Services Managed service
High availability
Unlimited scale
Data durability
Free for 750 hours on micro
instance
[20]
Pay per use - separate
charge for machine
utilization and data usage
NoSQL
196
Native cloud
NoSQL
database
Google App Engine
Datastore
[21]
Google No planned downtime
Atomic transactions
High availability of
reads and writes
Free with quota system
limiting instance hours,
storage and throughput
[22]
Pay per use based on
instance hours, storage,
throughput and other
parameters
Native cloud
NoSQL
database
SalesForce
Database.com
[23]
SalesForce Unlimited scale
Access to SalesForce
meta data
Social API
Support for mobile
clients
Multi-tenancy
Free up to 100K records
and 50K transactions
[24]
Pay per use based on users,
number of records and
transactions
References
[1] A Yes for a NoSQL Taxonomy (http:/ / highscalability. com/ blog/ 2009/ 11/ 5/ a-yes-for-a-nosql-taxonomy. html). High Scalability
(2009-11-05). Retrieved on 2013-09-18.
[2] The enterprise class NoSQL database (http:/ / djondb.com). djondb. Retrieved on 2013-09-18.
[3] http:/ / tinman.cs.gsu. edu/ raj/ 8711/ sp13/ djondb/ Report. pdf
[4] Undefined Blog: Meeting with DjonDB (http:/ / undefvoid. blogspot. com/ 2013/ 03/ meeting-with-djondb. html). Undefvoid.blogspot.com.
Retrieved on 2013-09-18.
[5] " Neo4J in the Cloud (http:/ / wiki.neo4j. org/ content/ Neo4j_in_the_Cloud)", Neo4J Wiki (http:/ / wiki.neo4j. org), Retrieved 2011-11-10.
[6] " MongoDB on Azure (http:/ / www.mongodb.org/ display/ DOCS/ MongoDB+ on+ Azure), MongoDB.org (http:/ / www.mongodb. org),
Retrieved 2011-11-10.
[7] " Install Redis.sh (https:/ / gist.github. com/ dstroot/ 2776679)", GitHub Gist (https:/ / gist. github.com), Retrieved 2013-12-29.
[8] " Running Redis on a CentOS Linux VM in Windows Azure (http:/ / blogs. msdn.com/ b/ tconte/ archive/ 2012/ 06/ 08/
running-redis-on-a-centos-linux-vm-in-windows-azure. aspx)", Thomas Cont's MSDN Weblog (http:/ / blogs. msdn.com/ b/ tconte/ ),
Retrieved 2013-12-29.
[9] " Setting up Cassandra in the Cloud (http:/ / wiki.apache. org/ cassandra/ CloudConfig)", Cassandra Wiki (http:/ / wiki.apache.org/
cassandra/ ), Retrieved 2011-11-10.
[10] " MongoLab Product Overview (https:/ / mongolab. com/ products/ )", MongoLab.com (https:/ / mongolab. com), Retrieved 2013-12-29.
[11] " MongoLab Plans and Pricing (https:/ / mongolab.com/ products/ pricing/ )", MongoLab.com (https:/ / mongolab. com), Retrieved
2013-12-29.
[12] " Amazon ElastiCache (http:/ / aws.amazon. com/ elasticache/ )", Amazon Web Services (http:/ / aws. amazon.com), Retrieved
2013-12-29.
[13] " Amazon ElastiCache Free Usage Tier (http:/ / aws. amazon. com/ elasticache/ free/ )", Amazon Web Services (http:/ / aws.amazon. com),
Retrieved 2013-12-29.
[14] " Amazon ElastiCache Pricing (http:/ / aws.amazon. com/ elasticache/ pricing/ )", Amazon Web Services (http:/ / aws. amazon.com),
Retrieved 2013-12-29.
[15] " RedisToGo Documentation (http:/ / www.redistogo. com/ documentation?language=en)", RedisToGo.com (http:/ / www.redistogo. com),
Retrieved 2013-12-29.
[16] Redis Cloud by Garantia Data (http:/ / redis-cloud. com/ ), Redis-Cloud.com (http:/ / redis-cloud. com), Retrieved 2013-12-29.
[17] " Garantia Data Pricing (http:/ / garantiadata. com/ Pricing)", GarantiaData.com (http:/ / garantiadata.com), Retrieved 2013-12-29.
[18] " InstaClustr Frequently Asked Questions (https:/ / www. instaclustr. com/ faq)", Instaclustr.com (https:/ / www.instaclustr.com), Retrieved
2013-12-29.
[19] Instaclutr Providers & Pricing (https:/ / www.instaclustr. com/ ?provider=AWS& data-centre=US_EAST1#pricing), Instaclustr.com (https:/
/ www.instaclustr. com), Retrieved 2013-12-29.
[20] Amazon SimpleDB Pricing (http:/ / aws. amazon. com/ simpledb/ #pricing), Amazon Web Services (http:/ / aws. amazon.com), Retrieved
2013-12-29.
[21] " Java Datastore API (https:/ / developers. google.com/ appengine/ docs/ java/ datastore/ ?hl=en)", Google App Engine (https:/ / developers.
google.com/ appengine/ ), Retrieved 2013-12-29.
[22] App Engine Pricing (https:/ / cloud. google. com/ products/ app-engine/ #pricing), Google Cloud Platform (https:/ / cloud. google. com),
Retrieved 2013-12-29.
[23] " How it works (http:/ / www. database. com/ en/ howitworks)", Database.com (http:/ / www.database.com), Retrieved 2013-12-29.
[24] " Database.com Pricing (http:/ / www.database. com/ en/ pricing)", Database.com (http:/ / www. database.com), Retrieved 2013-12-29.
NoSQL
197
Further reading
Pramod Sadalage and Martin Fowler (2012). NoSQL Distilled. A Brief Guide to the Emerging World of Polyglot
Persistence. Addison-Wesley. ISBN0-321-82662-0.
Christof Strauch (2012). "NoSQL Databases" (http:/ / www. christof-strauch. de/ nosqldbs. pdf).
Moniruzzaman AB, Hossain SA (2013). "NoSQL Database: New Era of Databases for Big data Analytics -
Classification, Characteristics and Comparison" (http:/ / arxiv. org/ abs/ 1307. 0191).
Kai Orend (2013). Analysis and Classification of NoSQL Databases and Evaluation of their Ability to Replace an
Object-relational Persistence Layer (http:/ / citeseerx. ist. psu. edu/ viewdoc/ download?doi=10. 1. 1. 184. 483&
rep=rep1& type=pdf).
Ganesh Krishnan, Sarang Kulkarni, Dharmesh Kirit Dadbhawala. "Method and system for versioned sharing,
consolidating and reporting information" (https:/ / www. google. com/ patents/ US7383272?pg=PA1&
dq=ganesh+ krishnan& hl=en& sa=X).
Sugam Sharma. "A Brief Review on Modern NoSQL Data Models, Handling Big Data" (http:/ / www.cs.iastate.
edu/ sugamsha/ articles).
External links
Christoph Strauch. "NoSQL whitepaper" (http:/ / www. christof-strauch. de/ nosqldbs. pdf). Hochschule der
Medien, Stuttgart.
Stefan Edlich. "NoSQL database List" (http:/ / nosql-database. org/ ).
Peter Neubauer (2010). "Graph Databases, NOSQL and Neo4j" (http:/ / www.infoq. com/ articles/
graph-nosql-neo4j).
Sergey Bushik (2012). "A vendor-independent comparison of NoSQL databases: Cassandra, HBase, MongoDB,
Riak" (http:/ / www. networkworld. com/ news/ tech/ 2012/ 102212-nosql-263595. html). NetworkWorld.
CouchDB
198
CouchDB
Apache CouchDB
CouchDB's Futon Administration Interface, User database
Original author(s) Damien Katz, Jan Lehnardt, Noah Slater, Christopher Lenz, J. Chris Anderson, Paul Davis, Adam Kocoloski, Jason Davies,
Benot Chesneau, Filipe Manana, Robert Newson
Developer(s) Apache Software Foundation
Initial release 2005
Stable release 1.5.0 / November5,2013
Development status Active
Written in Erlang
Operating system Cross-platform
Type Document-oriented database
License Apache License
Website
couchdb.apache.org
[1]
The LYCE (software bundle) is based on Erlang and comprises CouchDB. It's
entirely composed of free and open-source software
Apache CouchDB, commonly referred to as
CouchDB, is an open source database that
focuses on ease of use and on being "a
database that completely embraces the
web". It is a NoSQL database that uses
JSON to store data, JavaScript as its query
language using MapReduce, and HTTP for
an API. One of its distinguishing features is
multi-master replication. CouchDB was first
released in 2005 and later became an
Apache project in 2008.
Unlike in a relational database, CouchDB
does not store data and relationships in
tables. Instead, each database is a collection of independent documents. Each document maintains its own data and
self-contained schema. An application may access multiple databases, such as one stored on a user's mobile phone
and another on a server. Document metadata contains revision information, making it possible to merge any
CouchDB
199
differences that may have occurred while the databases were disconnected.
CouchDB implements a form of Multi-Version Concurrency Control (MVCC) in order to avoid the need to lock the
database file during writes. Conflicts are left to the application to resolve. Resolving a conflict generally involves
first merging data into one of the documents, then deleting the stale one.
Other features include document-level ACID semantics with eventual consistency, (incremental) MapReduce, and
(incremental) replication. Administration is supported with a built-in web application called Futon.
History
CouchDB (Couch is an acronym for cluster of unreliable commodity hardware)
[2]
is a project created in April 2005
by Damien Katz, former Lotus Notes developer at IBM. Damien Katz defined it as a "storage system for a large
scale object database". His objectives for the database were to become the database of the Internet and that it would
be designed from the ground up to serve web applications. He self-funded the project for almost two years and
released it as an open source project under the GNU General Public License.
In February 2008, it became an Apache Incubator project and the license was changed to the Apache License.
[3]
A
few months after, it graduated to a top-level project.
[4]
This led to the first stable version being released in July
2010.
[5]
In early 2012, Damien Katz left the project to focus on Couchbase Server.
Since the departure of Damien Katz, the Apache CouchDB project has continued, releasing 1.2 in April 2012 and 1.3
in April 2013. In July 2013, the CouchDB community merged the codebase for BigCouch, Cloudant's clustered
version of CouchDB, into the Apache project. The BigCouch clustering framework is prepared to be included in an
upcoming release of Apache CouchDB.
Main features
Document Storage
CouchDB stores data as "documents", as one or more field/value pairs expressed as JSON. Field values can be
simple things like strings, numbers, or dates; but ordered lists and associative arrays can also be used. Every
document in a CouchDB database has a unique id and there is no required document schema.
ACID Semantics
CouchDB provides ACID semantics.
[6]
It does this by implementing a form of Multi-Version Concurrency
Control, meaning that CouchDB can handle a high volume of concurrent readers and writers without conflict.
Map/Reduce Views and Indexes
The stored data is structured using views. In CouchDB, each view is constructed by a JavaScript function that
acts as the Map half of a map/reduce operation. The function takes a document and transforms it into a single
value which it returns. CouchDB can index views and keep those indexes updated as documents are added,
removed, or updated.
Distributed Architecture with Replication
CouchDB was designed with bi-direction replication (or synchronization) and off-line operation in mind. That
means multiple replicas can have their own copies of the same data, modify it, and then sync those changes at
a later time.
REST API
All items have a unique URI that gets exposed via HTTP. REST uses the HTTP methods POST, GET, PUT
and DELETE for the four basic CRUD (Create, Read, Update, Delete) operations on all resources.
Eventual Consistency
CouchDB
200
CouchDB guarantees eventual consistency to be able to provide both availability and partition tolerance.
Built for Offline
CouchDB can replicate to devices (like smartphones) that can go offline and handle data sync for you when
the device is back online.
CouchDB also offers a built-in administration interface accessible via web called Futon.
[7]
Use cases & production deployments
Replication and synchronization capabilities of CouchDB make it ideal for using it in mobile devices, where network
connection is not guaranteed but the application must keep on working offline.
CouchDB is well suited for applications with accumulating, occasionally changing data, on which pre-defined
queries are to be run and where versioning is important (CRM, CMS systems, by example). Master-master
replication is an especially interesting feature, allowing easy multi-site deployments.
[8]
Enterprises that use CouchDB
A few examples of enterprises that used or are using CouchDB are:
Ubuntu began using it in 2009 for its synchronization service "Ubuntu One"
[9]
but stopped using it in November
2011.
[10]
The BBC, for its dynamic content platforms
[11]
Credit Suisse, for internal use at commodities department for their marketplace framework.
[12]
Meebo, for their social platform (web and applications) - Meebo was acquired by Google and was shut down on
July 12, 2012.
A more comprehensive list of software projects and web sites that use CouchDB is available on the Apache
projects's wiki
[13]
Data manipulation: documents and views
CouchDB manages a collection of JSON documents. The documents are organised via views. Views are defined
with aggregate functions and filters are computed in parallel, much like MapReduce.
Views are generally stored in the database and their indexes updated continuously. CouchDB supports a view system
using external socket servers and a JSON-based protocol.
[14]
As a consequence, view servers have been developed in
a variety of languages (JavaScript is the default, but there are also PHP, Ruby, Python and Erlang).
Accessing data via HTTP
Applications interact with CouchDB via HTTP. The following demonstrates a few examples using cURL, a
command-line utility. These examples assume that CouchDB is running on localhost (127.0.0.1) on port 5984.
CouchDB
201
Action Request Response
Accessing
server
information
<fon size="5.78">cur1 hp://127.0.0.1:5984/</fon> <fon size="5.78">{
"couchdb": "We1come",
"version":"1.1.0"
}</fon>
Creating
a
database
named
wiki
<fon size="5.78">cur1 -X RUT hp://127.0.0.1:5984/wi'i</fon> <fon size="5.78">{"o'": true}</fon>
Attempting
to create
a second
database
named
wiki
<fon size="5.78">cur1 -X RUT hp://127.0.0.1:5984/wi'i</fon> <fon size="5.78">{
"error":"fi1e_exiss",
"reason":"The daabase cou1d no be creaed, he fi1e a1ready exiss."
}</fon>
Retrieve
information
about the
wiki
database
<fon size="5.78">cur1 hp://127.0.0.1:5984/wi'i</fon> <fon size="5.78">{
"db_name": "wi'i",
"doc_coun": 0,
"doc_de1_coun": 0,
"updae_seq": 0,
"purge_seq": 0,
"compac_running": false,
"dis'_size": 79,
"insance_sar_ime": "1272453873691070",
"dis'_forma_version": 5
}</fon>
Delete
the
database
wiki
<fon size="5.78">cur1 -X ELETE hp://127.0.0.1:5984/wi'i</fon> <fon size="5.78">{"o'": true}</fon>
Create a
document,
asking
CouchDB
to supply
a
document
id
<fon size="5.78">cur1 -X ROST -H "Conen-Type: app1icaion/_son" --daa \
'{ "ex" : "Wi'ipedia on CouchB", "raing": 5 }' \
hp://127.0.0.1:5984/wi'i
</fon>
<fon size="5.78">{
"o'": true,
"id": "123BAC",
"rev": "946B71C"
}</fon>
Open source components
CouchDB includes a number of other open source projects as part of its default package.
CouchDB
202
Component Description License
SpiderMonkey SpiderMonkey is a code name for the first ever JavaScript engine, written by Brendan Eich at Netscape
Communications, later released as open source and now maintained by the Mozilla Foundation.
MPL
jQuery jQuery is a lightweight cross-browser JavaScript library that emphasizes interaction between JavaScript and
HTML.
Dual license:
GPL and MIT
ICU International Components for Unicode (ICU) is an open source project of mature C/C++ and Java libraries for
Unicode support, software internationalization and software globalization. ICU is widely portable to many
operating systems and environments.
MIT License
OpenSSL OpenSSL is an open source implementation of the SSL and TLS protocols. The core library (written in the C
programming language) implements the basic cryptographic functions and provides various utility functions.
Apache-like
unique
Erlang Erlang is a general-purpose concurrent programming language and runtime system. The sequential subset of
Erlang is a functional language, with strict evaluation, single assignment, and dynamic typing.
Modified MPL
References
[1] http:/ / couchdb. apache.org/
[2] Exploring CouchDB (http:/ / www. ibm. com/ developerworks/ opensource/ library/ os-couchdb/ index. html), article from IBM Developer
Works
[3] Apache mailing list announcement (http:/ / mail-archives. apache. org/ mod_mbox/ incubator-general/ 200802. mbox/
3d4032300802121136p361b52ceyfc0f3b0ad81a1793mail. gmail. com) on mail-archives.apache.org
[4] Re: Proposed Resolution: Establish CouchDB TLP (http:/ / mail-archives. apache.org/ mod_mbox/ incubator-couchdb-dev/ 200811. mbox/
3F352A54-5FC8-4CB0-8A6B-7D3446F07462jaguNET. com) on mail-archives.apache.org
[5] "CouchDB NoSQL Database Ready for Production Use" (http:/ / www.pcworld. com/ businesscenter/ article/ 201046/
couchdb_nosql_database_ready_for_production_use. html), article from PC World of Jully 2010
[6] CoachDB, Technical Overview (http:/ / couchdb. apache. org/ docs/ overview. html)
[7] "Welcome to Futon" (http:/ / guide.couchdb. org/ draft/ tour. html#welcome) from "CouchDB The Definitive Guide"
[8] Cassandra vs MongoDB vs CouchDB vs Redis vs Riak vs HBase comparison (http:/ / kkovacs.eu/
cassandra-vs-mongodb-vs-couchdb-vs-redis) from Kristf Kovcs
[9] Email from Elliot Murphy (Canonical) (http:/ / mail-archives. apache. org/ mod_mbox/ couchdb-dev/ 200910. mbox/ 4AD53996.
3090104canonical.com) to the CouchDB-Devel list
[10] Canonical Drops CouchDB From Ubuntu One (Slashdot) (http:/ / linux. slashdot. org/ story/ 11/ 11/ 22/ 171228/
canonical-drops-couchdb-from-ubuntu-one)
[11] CouchDB at the BBC as a fault tolerant, scalable, multi-data center key-value store (http:/ / www.erlang-factory.com/ conference/
London2009/ speakers/ endafarrell)
[12] "CouchDB in the wild" (http:/ / wiki. apache. org/ couchdb/ CouchDB_in_the_wild) article of the product's web, a list of software projects
and websites using CouchDB
[13] "CouchDB in the wild" (http:/ / wiki. apache. org/ couchdb/ CouchDB_in_the_wild)
[14] View Server Documentation (http:/ / wiki. apache. org/ couchdb/ ViewServer) on wiki.apache.org
Bibliography
Anderson, J. Chris; Slater, Noah; Lehnardt, Jan (November 15, 2009), CouchDB. The Definitive Guide (http:/ /
guide. couchdb. org/ editions/ 1/ en/ index. html) (1st ed.), O'Reilly Media, p.300, ISBN0-596-15816-5
Lennon, Joe (December 15, 2009), Beginning CouchDB (http:/ / www.apress. com/ book/ view/ 9781430272373)
(1st ed.), Apress, p.300, ISBN1-4302-7237-6
Holt, Bradley (March 7, 2011), Writing and Querying MapReduce Views in CouchDB (http:/ / oreilly. com/
catalog/ 0636920018247) (1st ed.), O'Reilly Media, p.76, ISBN1-4493-0312-9
Holt, Bradley (April 11, 2011), Scaling CouchDB (http:/ / oreilly. com/ catalog/ 9781449303433) (1st ed.),
O'Reilly Media, p.72, ISBN1-4493-0343-9
Brown, MC (October 31, 2011), Getting Started with CouchDB (http:/ / oreilly. com/ catalog/ 9781449307554)
(1st ed.), O'Reilly Media, p.50, ISBN1-4493-0755-8
CouchDB
203
Thompson, Mick (August 2, 2011), Getting Started with GEO, CouchDB, and Node.js (http:/ / oreilly. com/
catalog/ 9781449307523) (1st ed.), O'Reilly Media, p.64, ISBN1-4493-0752-3
External links
Official website (http:/ / couchdb. apache. org/ )
CouchDB: The Definitive Guide (http:/ / books. couchdb. org/ relax/ )
CouchDB articles on NoSQLDatabases.com (http:/ / www. nosqldatabases. com/ main/ tag/ couchdb)
CouchDB news and articles on myNoSQL (http:/ / nosql. mypopescu. com/ tagged/ couchdb)
Scaling CouchDB (http:/ / nosql. mypopescu. com/ post/ 683838234/ scaling-couchdb)
Complete HTTP API Reference (http:/ / wiki. apache. org/ couchdb/ Complete_HTTP_API_Reference)
Simple PHP5 library to communicate with CouchDB (https:/ / github. com/ 1999/ couchdb-php)
Asynchronous CouchDB client for Java (http:/ / code. google. com/ p/ async-couchdb-client/ )
Asynchronous CouchDB client for Scala (https:/ / github. com/ KimStebel/ sprouch)
3 CouchDB Case Studies (http:/ / nosql. mypopescu. com/ post/ 746667801/ 3-couchdb-case-studies)
CouchDB for access log aggregation and analysis (http:/ / userprimary. net/ posts/ 2009/ 06/ 13/
couchdb-for-access-log-aggregation-and-analysis/ )
Lehnardt, Jan (2008). "Couch DB at 10,000 feet" (http:/ / video. google. com/
videoplay?docid=-3714560380544574985& hl=en#). Erlang eXchange 2008. Retrieved 15 April 2012.
Lenhardt, Jan (2009). "CouchDB for Erlang Developers" (http:/ / www.erlang-factory. com/ conference/
London2009/ speakers/ janlehnardt). Erlang Factory London 2009. Retrieved 15 April 2012.
Katz, Damien (January 2009). "CouchDB and Me" (http:/ / www.infoq. com/ presentations/
katz-couchdb-and-me). RubyFringe. InfoQ. Retrieved 15 April 2012.
204
Chapter 18: Full-Stack JavaScript: Design
and implementation of a WebSocket App
WebSocket
WebSocket is a protocol providing full-duplex communications channels over a single TCP connection. The
WebSocket protocol was standardized by the IETF as RFC 6455 in 2011, and the WebSocket API in Web IDL is
being standardized by the W3C.
WebSocket is designed to be implemented in web browsers and web servers, but it can be used by any client or
server application. The WebSocket Protocol is an independent TCP-based protocol. Its only relationship to HTTP is
that its handshake is interpreted by HTTP servers as an Upgrade request.
[1]
The WebSocket protocol makes possible
more interaction between a browser and a web site, facilitating live content and the creation of real-time games. This
is made possible by providing a standardized way for the server to send content to the browser without being
solicited by the client, and allowing for messages to be passed back and forth while keeping the connection open. In
this way a two-way (bi-directional) ongoing conversation can take place between a browser and the server. A similar
effect has been achieved in non-standardized ways using stop-gap technologies such as Comet.
In addition, the communications are done over TCP port number 80, which is of benefit for those environments
which block non-web Internet connections using a firewall. WebSocket protocol is currently supported in several
browsers including Google Chrome, Internet Explorer, Firefox, Safari and Opera. WebSocket also requires web
applications on the server to support it.
Technical overview
Unlike HTTP, WebSocket provides for full-duplex communication. Additionally, Websocket enables streams of
messages on top of TCP. TCP alone deals with streams of bytes with no inherent concept of a message. Before
WebSocket, port 80 full-duplex communication was attainable using Comet channels; however, Comet
implementation is nontrivial, and due to the TCP handshake and HTTP header overhead, it is inefficient for small
messages. WebSocket protocol aims to solve these problems without compromising security assumptions of the web.
Browser implementation
A secure version of the WebSocket protocol is implemented in Firefox 6, Safari 6, Google Chrome 14, Opera 12.10
and Internet Explorer 10.
An older, less secure version of the protocol was implemented in Opera 11 and Safari 5, as well as the mobile
version of Safari in iOS 4.2. Also, the BlackBerry Browser in OS7 implements WebSocket. Although there are no
known exploits, it was disabled in Firefox 4 and 5, and Opera 11.
WebSocket
205
WebSocket protocol handshake
To establish a WebSocket connection, the client sends a WebSocket handshake request, and the server sends a
WebSocket handshake response, as shown in the following example:
Client request:
GET /mycha HTTR/1.1
Hos: server.examp1e.com
Upgrade: websoc'e
Connecion: Upgrade
Sec-WebSoc'e-Key: x3JJHMbL1EzL'h9GBhXw==
Sec-WebSoc'e-Rrooco1: cha
Sec-WebSoc'e-Version: 12
Origin: hp://examp1e.com
Server response:
HTTR/1.1 101 Swiching Rrooco1s
Upgrade: websoc'e
Connecion: Upgrade
Sec-WebSoc'e-Accep: HSmrc0sM1YU'AGmm5ORpG2HaGW'=
Sec-WebSoc'e-Rrooco1: cha
The handshake resembles HTTP so that servers can handle HTTP connections as well as WebSocket connections on
the same port. However the specific fields involved, and what follows after the handshake, do not conform to the
HTTP protocol.
Note that each line ends with an EOL (end of line) sequence, \r\n. There must be a blank line at the end.
The client sends a Sec-WebSoc'e-Key which is a random value that has been base64 encoded. To form a
response, the magic string 258EAEA5-E914-47A-95CA-C5AB0C85B11 is appended to this (undecoded)
key. The resulting string is then hashed with SHA-1, then base64 encoded. Finally, the resulting reply occurs in the
header Sec-WebSoc'e-Accep.
Details of Sec-WebSocket-Key to Sec-WebSocket-Accept :
x3JJHMbL1EzL'h9GBhXw==258EAEA5-E914-47A-95CA-C5AB0C85B11 string hashed by
SHA-1 gives 0x1d29ab734b0c9585240069a6e4e3e91b61da1969 hexadecimal value.
Encoding the SHA-1 hash by Base64 (using the binary of the SHA-1) yields
HSmrc0sM1YU'AGmm5ORpG2HaGW'=, which is the Sec-WebSocket-Accept value.
Once the connection is established, the client and server can send WebSocket data or text frames back and forth in
full-duplex mode. The data is minimally framed, with a small header followed by payload. WebSocket transmissions
are described as "messages", where a single message can optionally be split across several data frames. This can
allow for sending of messages where initial data is available but the complete length of the message is unknown (it
sends one data frame after another until the end is reached and marked with the FIN bit). With extensions to the
protocol, this can also be used for multiplexing several streams simultaneously (for instance to avoid monopolizing
use of a socket for a single large payload).
WebSocket
206
Proxy traversal
WebSocket protocol client implementations try to detect if the user agent is configured to use a proxy when
connecting to destination host and port and, if it is, uses HTTP CONNECT method to set up a persistent tunnel.
While the WebSocket protocol itself is unaware of proxy servers and firewalls, it features an HTTP-compatible
handshake so that HTTP servers can share their default HTTP and HTTPS ports (80 and 443) with a WebSocket
gateway or server. The WebSocket protocol defines a ws:// and wss:// prefix to indicate a WebSocket and a
WebSocket Secure connection, respectively. Both schemes use an HTTP upgrade mechanism to upgrade to the
WebSocket protocol. Some proxy servers are transparent and work fine with WebSocket; others will prevent
WebSocket from working correctly, causing the connection to fail. In some cases, additional proxy server
configuration may be required, and certain proxy servers may need to be upgraded to support WebSocket.
If unencrypted WebSocket traffic flows through an explicit or a transparent proxy server on its way to the
WebSocket server, then, whether or not the proxy server behaves as it should, the connection is almost certainly
bound to fail today (as WebSocket become more mainstream, proxy servers may become WebSocket aware).
Therefore, unencrypted WebSocket connections should be used only in the simplest topologies.
If an encrypted WebSocket connection is used, then the use of Transport Layer Security (TLS) in the WebSocket
Secure connection ensures that an HTTP CONNECT command is issued when the browser is configured to use an
explicit proxy server. This sets up a tunnel, which provides low-level end-to-end TCP communication through the
HTTP proxy, between the WebSocket Secure client and the WebSocket server. In the case of transparent proxy
servers, the browser is unaware of the proxy server, so no HTTP CONNECT is sent. However, since the wire traffic
is encrypted, intermediate transparent proxy servers may simply allow the encrypted traffic through, so there is a
much better chance that the WebSocket connection will succeed if WebSocket Secure is used. Using encryption is
not free of resource cost, but often provides the highest success rate.
A mid-2010 draft (version hixie-76) broke compatibility with reverse-proxies and gateways by including 8 bytes of
key data after the headers, but not advertising that data in a Content-Length: 8 header. This data was not forwarded
by all intermediates, which could lead to protocol failure. More recent drafts (e.g., hybi-09) put the key data in a
Sec-WebSocket-Key header, solving this problem.
URI scheme
The WebSocket protocol specification defines two new URI schemes, ws: and wss:, for unencrypted and encrypted
connections respectively. Apart from the scheme name, the rest of the URI components are defined to use URI
generic syntax.
Browser support
All the latest browsers except Android browser support the latest specification (RFC 6455) of the WebSocket
protocol. A detailed protocol test suite report lists the conformance of those browsers to specific protocol aspects.
WebSocket
207
Implementation status
Protocol Draft date Internet
Explorer
Firefox
(PC)
Firefox
(Android)
Chrome (PC,
Mobile)
Safari (Mac,
iOS)
Opera (PC,
Mobile)
Android
Browser
hixie-75
[2]
February 4,
2010
4 5.0.0
hixie-76
[3]
hybi-00
[4]
May 6, 2010
May 23, 2010
4.0
(disabled)
6 5.0.1 11.00 (disabled)
7 hybi-07
[5]
April 22, 2011
6
1
8 hybi-10
[6]
July 11, 2011
7
[7]
1 7 14
13 RFC
6455
December,
2011
10 11 11 16 6 12.10
1
Gecko-based browsers versions 6-10 implement the WebSocket object as "MozWebSocket", requiring extra code
to integrate with existing WebSocket-enabled code.
Experimental extensions
There is also a command-line switch for Google Chrome (--enab1e-websoc'e-over-spdy) that enables an
early experimental implementation of WebSocket over SPDY.
Development
Using the Google Chrome Developer Tools, developers can inspect the WebSocket handshake as well as the
WebSocket frames.
References
[1] [1] RFC 6455#section-1.7
[2] http:/ / tools.ietf.org/ html/ draft-hixie-thewebsocketprotocol-75
[3] http:/ / tools.ietf.org/ html/ draft-hixie-thewebsocketprotocol-76
[4] http:/ / tools.ietf.org/ html/ draft-ietf-hybi-thewebsocketprotocol-00
[5] http:/ / tools.ietf.org/ html/ draft-ietf-hybi-thewebsocketprotocol-07
[6] http:/ / tools.ietf.org/ html/ draft-ietf-hybi-thewebsocketprotocol-10
[7] WebSockets - upgrade to ietf-07 (https:/ / bugzilla. mozilla. org/ show_bug. cgi?id=640003#c91)
External links
IETF Hypertext-Bidirectional (HyBi) working group (https:/ / datatracker. ietf. org/ wg/ hybi/ charter/ )
The WebSocket protocol (http:/ / tools. ietf. org/ html/ rfc6455) - Proposed Standard published by the IETF
HyBi Working Group
The WebSocket protocol (http:/ / tools. ietf. org/ html/ draft-ietf-hybi-thewebsocketprotocol) - Internet-Draft
published by the IETF HyBi Working Group
The WebSocket protocol (http:/ / tools. ietf. org/ html/ draft-hixie-thewebsocketprotocol-76) - Original
protocol proposal by Ian Hickson
The WebSocket API (http:/ / dev. w3. org/ html5/ websockets/ ) - W3C Working Draft specification of the API
WebSocket
208
The WebSocket API (http:/ / www. w3. org/ TR/ websockets/ ) - W3C Candidate Recommendation specification
of the API
Websocket.org (http:/ / www.websocket. org/ ) - A WebSocket Community
Node.js
Node.js
Original author(s) Ryan Lienhart Dahl
Developer(s)
Node.js Developers
[1]
, Joyent
Initial release
May27,2009
[2]
Stable release
0.10.24 / December19,2013
[3]
Preview release
0.11.10 / January1,2014
[4]
Development status Active
Written in C, C++, JavaScript
Operating system Mac OS X, Linux, Solaris, FreeBSD, OpenBSD, Windows (older versions require Cygwin), webOS
Type Event-driven networking
License MIT
Website
nodejs.org
[5]
Node.js is a software platform that is used to build scalable network (especially server-side) applications. Node.js
utilizes JavaScript as its scripting language, and achieves high throughput via non-blocking I/O and a single-threaded
event loop.
Node.js contains a built-in HTTP server library, making it possible to run a web server without the use of external
software, such as Apache or Lighttpd, and allowing more control of how the web server works.
Node.js
209
History
Node creator Ryan Dahl
Node.js was created by Ryan Dahl starting in 2009. Its development
and maintenance is sponsored by Joyent. Dahl was inspired to create
Node.js after seeing a file upload progress bar on Flickr. The browser
did not know how much of the file uploaded and had to query the web
server. Dahl wanted an easier way. Ruby's Mongrel web server was
another source of inspiration for Dahl. Originally Dahl had several
failed projects in C, Lua, and Haskell, but when Google's V8 engine
was released, Dahl began to examine JavaScript. Even though his
original idea was non-blocking he "backed out of that (a bit) in the
module system and a few other areas" as it made loading external
libraries troublesome.
On January 30, 2012 Dahl stepped aside, promoting coworker and
NPM creator Isaac Schlueter to the gatekeeper position. Dahl wrote on
Google groups,
Now that the rewrite on top of libuv is largely complete, I
am ceding my position as gatekeeper to Isaac Schlueter.
Our energy will now be largely focused over the next few
months on improving the third party module system
experience including a website for browsing modules, a new addon build system, and binary
installations from npm. Isaac is in the unique position to bridge the gap between core and external
modules to ensure a pleasant experience. After three years of working on Node, this frees me up to work
on research projects. I am still an employee at Joyent and will advise from the sidelines but I won't be
involved in the day-to-day bug fixes. Isaac has final say over what makes it into the releases. Appeals
for new features, changes, and bug fixes should now be directed at him.
Dahl continues to work for Joyent and as an advisor for node.
Details
Node.js is a packaged compilation of Google's V8 JavaScript engine, the platform abstraction layer, and a core
library, which is itself primarily written in JavaScript.
Dahl's original goal was to create web sites with push capabilities as seen in web applications like Gmail. After
trying solutions in several other programming languages he chose JavaScript because of the lack of an existing I/O
API. This allowed him to define a convention of non-blocking, event-driven I/O.
[6]
Similar environments written in other programming languages include Tornado and Twisted for Python; Perl Object
Environment for Perl; libevent for C; Vert.x for Java, JavaScript, Groovy, Python and Ruby; Akka for Java and
Scala; EventMachine for Ruby and vibe.d for D. Unlike most JavaScript programs, Node.js is not executed in a web
browser, but instead as a server-side JavaScript application. Node.js implements some CommonJS specifications.
[7]
It also provides a REPL environment for interactive testing.
Node.js
210
Examples
This is an implementation of a "hello world" HTTP server in Node.js:
var hp = require('hp'),
hp.creaeServer(
function (reques, response) {
response.wrieHead(200, {'Conen-Type': 'ex/p1ain'}),
response.end('He11o Wor1d\n'),
}
).1isen(8000),
conso1e.1og('Server running a hp://1oca1hos:8000/'),
The following code is a simple TCP server which listens on port 8000 and echoes 'hello' upon connection:
var ne = require('ne'),
ne.creaeServer(
function (sream) {
sream.wrie('he11o\r\n'),
sream.on('end',
function () {
sream.end('goodbye\r\n'),
}
),
sream.pipe(sream),
}
).1isen(8000),
Tools and IDEs
Cloud9 IDE (cloud service)
JetBrains WebStorm or IntelliJ IDEA (commercial products)
Microsoft WebMatrix (free) or Visual Studio (commercial product) with Node.js Tools for Visual Studio (free)
Nodeclipse (Eclipse-based)
Community
Node.js has a developer community primarily centered on two mailing lists, nodejs,
[8]
nodejs-dev,
[9]
and the IRC
channel #node.js on freenode. The community gathers at NodeConf,
[10]
an annual developer conference focused on
Node.js.
[11]
Node.js is currently used by a number of large companies including LinkedIn,
[12]
Microsoft,
[13]
Yahoo,
[14]
Walmart
and Paypal.
Node.js
211
References
[1] http:/ / github. com/ ry/ node/ blob/ master/ AUTHORS
[2] https:/ / github.com/ joyent/ node/ tags?after=v0. 0.4
[3] Node v0.10.24 (Stable) (http:/ / blog.nodejs. org/ 2013/ 12/ 19/ node-v0-10-24-stable/ )
[4] Node v0.11.10 (Unstable) (http:/ / blog.nodejs.org/ 2013/ 12/ 31/ node-v0-11-10-unstable/ )
[5] http:/ / nodejs.org
[6] See the book's Foreword at OReilly.com (http:/ / ofps. oreilly. com/ titles/ 9781449398583/ forward. html)
[7] Implementations/node.js (http:/ / wiki.commonjs. org/ wiki/ Implementations/ node.js) - CommonJS Spec Wiki
[8] http:/ / groups.google.com/ group/ nodejs
[9] http:/ / groups.google.com/ group/ nodejs-dev nodejs-dev
[10] http:/ / www. nodeconf.com/
[11] NodeConf Schedule Announced (http:/ / www.readwriteweb. com/ hack/ 2011/ 04/ nodeconf-schedule-announced.php), By Klint Finley,
April 7, 2011, ReadWriteHack
[12] (http:/ / engineering.linkedin.com/ nodejs/ blazing-fast-nodejs-10-performance-tips-linkedin-mobile), LinkedIn's developer blog discusses
their Node.js stack optimizations
[13] (http:/ / www. hanselman.com/ blog/ WebMatrix2FrontEndWebDevelopersTakeNoteASPNETPHPNodejsAndMore. aspx), WebMatrix -
Front End Web Developers take note (ASP.NET, PHP, node.js and more)
[14] (http:/ / developer. yahoo.com/ blogs/ ydn/ posts/ 2011/ 11/ yahoo-announces-cocktails- -shaken-not-stirred/ ), Yahoo Developer
Network announces Cocktails project using Node.js
Further reading
Hughes-Croucher, Tom; Wilson, Mike (April, 2012), Up and Running with Node.js (First ed.), O'Reilly Media,
p.204, ISBN978-1-4493-9858-3
Ornbo, George (September, 2012), Sams Teach Yourself Node.js in 24 Hours (First ed.), SAMS Publishing,
p.440, ISBN978-0-672-33595-2
Teixeira, Pedro (October, 2012), Professional Node.js (http:/ / eu. wiley. com/ WileyCDA/ WileyTitle/
productCd-1118185463,descCd-authorInfo.html) (First ed.), John Wiley & Sons, p.408,
ISBN978-1-1182-2754-1
Randal L. Schwartz and Aaron Newcomb (9 January 2013). "Episode 237: Node.js" (http:/ / twit. tv/ show/
floss-weekly/ 237). http:/ / twit. tv/ show/ floss-weekly (Podcast). TWiT.tv. Event occurs at 1:08:13. Retrieved 9
January 2013.
Ribeiro Pereira, Caio (July, 2013), Aplicaoes web real-time com Node.js (https:/ / casadocodigo. refersion. com/
l/ 630. 1389) (First ed.), Casa do Cdigo, p.143, ISBN978-85-66250-14-5
External links
Official website (http:/ / nodejs. org)
npm (http:/ / npmjs. org/ ) - the official package manager for Node.js
nodejs modules (https:/ / nodejsmodules. org/ )
Node.js Tools for Visual Studio (https:/ / nodejstools. codeplex. com/ )
212
Chapter 19: Preparing an HTML5 App for
App Stores
Mobile app
A mobile app, short for mobile application or just app, is application software designed to run on smartphones,
tablet computers and other mobile devices.
Apps are usually available through application distribution platforms, which began appearing in 2008 and are
typically operated by the owner of the mobile operating system, such as the Apple App Store, Google Play,
Windows Phone Store, and BlackBerry App World. Some apps are free, while others must be bought. Usually, they
are downloaded from the platform to a target device, such as an iPhone, BlackBerry, Android phone or Windows
Phone, but sometimes they can be downloaded to laptops or desktop computers. For apps with a price, generally a
percentage, 20-30%, goes to the distribution provider (such as iTunes), and the rest goes to the producer of the app.
The same app can therefore cost the average Smartphone user a different price depending on whether they use
iPhone, Android, or BlackBerry 10 devices.
The term "app" is a shortening of the term "application software". It has become very popular and in 2010 was listed
as "Word of the Year" by the American Dialect Society. In 2009, technology columnist David Pogue said that newer
smartphones could be nicknamed "app phones" to distinguish them from earlier less-sophisticated smartphones.
Mobile apps were originally offered for general productivity and information retrieval, including email, calendar,
contacts, and stock market and weather information. However, public demand and the availability of developer tools
drove rapid expansion into other categories, such as mobile games, factory automation, GPS and location-based
services, banking, order-tracking, and ticket purchases. The explosion in number and variety of apps made discovery
a challenge, which in turn led to the creation of a wide range of review, recommendation, and curation sources,
including blogs, magazines, and dedicated online app-discovery services.
The popularity of mobile apps has continued to rise, as their usage has become increasingly prevalent across mobile
phone users.
[1]
A May 2012 comScore study reported that during the previous quarter, more mobile subscribers used
apps than browsed the web on their devices: 51.1% vs. 49.8% respectively.
[2]
Researchers found that usage of
mobile apps strongly correlates with user context and depends on user's location and time of the day.
[3]
According to market research firm Gartner, 102bn apps will be downloaded in 2013 (91% of them will be free) but
they will still generate US$26billion, up 44.4% on 2012's US$18bn. An analyst report estimates that the app
economy creates revenues of more than 10 billion Euros per year within the European Union, while over 529
thousand jobs have been created in EU28 states due to the growth of the app market.
[4]
Mobile app
213
Development
Developing apps for mobile devices requires considering the constrains of these devices. Mobile devices run on
battery and have less powerful processors than personal computers. Developers also have to consider a lengthy array
of screen sizes, hardware specifications and configurations because of intense competition in mobile software and
changes within each of the platforms.
Mobile application development requires use of specialized integrated development environments. Mobile apps are
first tested within the development environment using emulators and later subjected to field testing. Emulators
provide an inexpensive way to test applications on mobile phones to which developers may not have physical access.
Distribution
Amazon Appstore
Amazon Appstore is an alternate application store for the Android operating system. It was opened in March 2011,
with 3800 applications.
App Store
Apple's App Store for iOS was the first app distribution service, which set the standard for app distribution services
and continues to do so, opened on July 10, 2008, and as of January 2011, reported over 10 billion downloads. As of
June 6, 2011, there are 425,000 third-party apps available, which are downloaded by 200 million iOS users. During
Apple's 2012 Worldwide Developers Conference in 20, Apple CEO Tim Cook announced that the App Store has
650,000 available apps to download as well as "an astounding 30 billion apps" downloaded from the app store until
that date. From an alternative perspective, figures seen in July 2013 by the BBC from tracking service Adeven
indicate over two-thirds of apps in the store are "zombies", barely ever installed by consumers.
[5]
BlackBerry World
BlackBerry World is the application store for BlackBerry 10 and BlackBerry OS devices. It opened in April 2009 as
BlackBerry App World, and as of February 2011, was claiming the largest revenue per app: $9,166.67 compared to
$6,480.00 at the Apple App Store and $1,200 in the Android market. In July 2011, it was reporting 3 million
downloads per day and one billion total downloads. In May 2013, BlackBerry World reached over 120,000 apps.
BlackBerry 10 users can also sideload and run Android apps.
Google Play
Google Play (formerly known as the Android Market) is an international online software store developed by Google
for Android devices. It opened in October 2008. In April 2013, there were approximately 850,000 apps available for
Android, and the estimated number of applications downloaded from Google Play was 40 billion. Android Apps can
also be sideload onto BlackBerry 10 devices.
Nokia Store
An app store for Nokia phones was launched internationally in May 2009. As of April 2011 there were 50,000 apps,
and as of August 2011, Nokia was reporting 9 million downloads per day. In February 2011, Nokia reported that it
would start using Windows Phone as its primary operating system. In May 2011, Nokia announced plans to rebrand
its Ovi product line under the Nokia brand and Ovi Store was renamed Nokia Store in October 2011. Nokia Store
remains as the distribution platform for its previous lines of mobile operating systems but will no longer allow
developers to publish new apps or app updates for its legacy Symbian and MeeGo operating systems from January
2014.
Mobile app
214
Windows Phone Store
Windows Phone Store was introduced by Microsoft for its Windows Phone platform, which was launched in October
2010. As of October 2012[6], it has over 120,000 apps available.
Windows Store
Windows Store was introduced by Microsoft for its Windows 8 and Windows RT platforms. While it can also carry
listings for traditional desktop programs certified for compatibility with Windows 8, it is primarily used to distribute
"Windows Store apps"-which are primarily built for use on tablets and other touch-based devices (but can still be
used with a keyboard and mouse, and on desktop computers and laptops)
Samsung Apps Store
An app store for Samsung mobile phones was founded in September 2009. As of October 2011 Samsung Apps
reached 10 million downloads. Currently the store is available in 125 countries and it offers apps for Windows
Mobile, Android and Bada platforms.
Enterprise management
Mobile application management (MAM) describes software and services responsible for provisioning and
controlling access to internally developed and commercially available mobile apps used in business settings, which
has become necessary with the onset of Bring your own device (BYOD) phenomenon. When an employee brings a
personal device into an enterprise setting, mobile application management enables the corporate IT staff to transfer
required applications, control access to business data, and remove locally cached business data from the device if it
is lost, or when its owner no longer works with the company.
References
[1] Ludwig, Sean. December 5, 2012. venturebeat.com (http:/ / venturebeat. com/ 2012/ 12/ 05/ mobile-app-usage-tv-web-2012/ ), study:
"Mobile app usage grows 35%, TV & web not so much"
[2] Perez, Sarah. July 2, 2012. "comScore: In U.S. Mobile Market, Samsung, Android Top The Charts; Apps Overtake Web Browsing."
techcrunch.com (http:/ / techcrunch.com/ 2012/ 07/ 02/
comscore-in-u-s-mobile-market-samsung-android-top-the-charts-apps-overtake-web-browsing/ )
[3] Matthias Bhmer, Brent Hecht, Johannes Schning, Antonio Krger, and Gernot Bauer. 2011. Falling asleep with Angry Birds, Facebook and
Kindle: a large scale study on mobile app usage (http:/ / dx. doi. org/ 10. 1145/ 2037373. 2037383). In: Proceedings of the 13th International
Conference on Human Computer Interaction with Mobile Devices and Services (MobileHCI '11). ACM, New York, NY, USA, 47-56.
[4] VisionMobile, Plum Consulting, " European App Economy" analyst report (http:/ / www. visionmobile. com/ EUApp), September 2013
[5] bbc.co.uk (http:/ / www.bbc.co.uk/ news/ technology-23240971)
[6] http:/ / en. wikipedia.org/ w/ index.php?title=Mobile_app& action=edit
PhoneGap
215
PhoneGap
PhoneGap (Cordova)
Original
author(s)
Joe Bowser, Michael Brooks, Rob Ellis, Dave Johnson, Anis Kadri, Brian Leroux, Jesse MacFadyen, Filip Maj, Eric Oesterle,
Brock Whitten, Herman Wong, Shazron Abdullah
Developer(s) Adobe Systems
Stable release 3.2.0 / November28,2013
Development
status
Active
Written in JavaScript, HTML5, CSS3, Java, C++, C# and Objective-C
Operating
system
iOS, Android, webOS, Symbian, BlackBerry, Ubuntu Touch, Windows Phone, Windows 8
Available in English
Type mobile development framework
License Apache 2.0 License
Website
www.phonegap.com
[1]
cordova.apache.org
[2]
PhoneGap is a mobile development framework produced by Nitobi, purchased by Adobe Systems. It enables
software programmers to build applications for mobile devices using JavaScript, HTML5, and CSS3, instead of
device-specific languages such as Objective-C. The resulting applications are hybrid, meaning that they are neither
truly native (because all layout rendering is done via web views instead of the platform's native UI framework) nor
purely web-based (because they are not just web apps, but are packaged as apps for distribution and have access to
native device APIs). From version 1.9 onward it is even possible to freely mix native and hybrid code snippets.
The software underlying PhoneGap is Apache Cordova. The software was previously called just "PhoneGap", then
"Apache Callback".
[3]
Apache Cordova is open source software.
History
First developed at an iPhoneDevCamp event in San Francisco, PhoneGap went on to win the People's Choice Award
at O'Reilly Media's 2009 Web 2.0 Conference and the framework has been used to develop many apps. Apple Inc.
has confirmed that the framework has its approval, even with the new 4.0 developer license agreement changes. The
PhoneGap framework is used by several mobile application platforms such as ViziApps, Worklight, Convertigo, and
appMobi as the backbone of their mobile client development engine. Adobe officially announced the acquisition of
Nitobi Software (the original developer) on October 4, 2011. Coincident with that, the PhoneGap code was
contributed to the Apache Software Foundation to start a new project called Apache Cordova. The project original
name, Apache Callback, was viewed as too generic. Then it also appears in Adobe Systems as Adobe PhoneGap and
also as Adobe Phonegap Build.
Early versions of PhoneGap required a person making iOS apps to have an Apple computer, and a person making
Windows Mobile apps to have a computer running Windows. After September 2012, Adobe's PhoneGap Build
service allows programmers to upload HTML, CSS and JavaScript source code to a "cloud compiler" that generates
apps for every supported platform.
[4]
PhoneGap
216
Design and rationale
The core of PhoneGap applications use HTML5 and CSS3 for their rendering, and JavaScript for their logic.
Although HTML5 now provides access to underlying hardware such as the accelerometer, camera and GPS, browser
support for HTML5-based device access is not consistent across mobile browsers, particularly older versions of
Android. To overcome these limitations, the PhoneGap framework embeds HTML5 code inside a native WebView
on the device, using a Foreign Function Interface to access the native resources of the device.
PhoneGap is also able to be extended with native plug-ins
[5]
that allow for developers to add functionality that can
be called from JavaScript, allowing for direct communication between the native layer, and the HTML5 page.
PhoneGap includes basic plugins that allow access to the device's accelerometer, camera, microphone, compass, file
system, and more.
However, the use of web-based technologies leads many PhoneGap applications to run slower than native
applications with similar functionality. Adobe Systems warns that applications built using PhoneGap may be rejected
by Apple for being too slow or not feeling "native" enough (having appearance and functionality consistent with
what users have come to expect on the platform).
Supported platforms
PhoneGap currently supports development for the operating systems Apple iOS, Google Android, LG webOS,
Microsoft Windows Phone (7 and 8), Nokia Symbian OS, RIM BlackBerry, Tizen (SDK 2.x), and Ubuntu Touch.
Support for recent versions, such as BlackBerry 5 and 6 and Windows Phone 7, is being implemented now. Bada
(the operating system used by the Samsung Wave S8500) support is "coming soon". The table below is a list of
supported features for each operating system.
Feature iPhone
/iPhone
3G
iPhone
3GS and
newer
Android
1.0 ! 4.2
Windows
Phone
BlackBerry
10 and
PlayBook OS
4.6!4.7 5.x!6.0+ Bada Symbian webOS Tizen Ubuntu
Touch
Accelerometer Yes Yes Yes Yes Yes N/A Yes Yes Yes Yes Yes Yes
Camera Yes Yes Yes Yes Yes N/A Yes Yes Yes Yes Yes Yes
Compass N/A Yes Yes Yes Yes N/A N/A Yes N/A Yes Yes Yes
Contacts Yes Yes Yes Yes Yes N/A Yes Yes Yes N/A Yes N/A
File Yes Yes Yes Yes Yes N/A Yes N/A N/A N/A Yes Yes
Geolocation Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes
Media Yes Yes Yes Yes Yes N/A N/A N/A N/A N/A Yes Yes
Network Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes
Notification
(alert, sound,
vibration)
Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes
Storage Yes Yes Yes Yes Yes N/A Yes N/A Yes Yes Yes Yes
PhoneGap
217
References
[1] http:/ / www. phonegap. com
[2] http:/ / cordova.apache.org/
[3] Apache Callback Project Incubation Status (http:/ / incubator. apache. org/ projects/ callback. html)
[4] Klint Finley. "Adobe Launches Hosted PhoneGap Build Service For Creating Cross-Platform Mobile Apps" (http:/ / techcrunch.com/ 2012/
09/ 24/ adobe-launches-hosted-phonegap-build-service-for-creating-cross-platform-mobile-apps/ ). 2012.
[5] http:/ / docs.phonegap.com/ en/ 3. 0. 0/ guide_hybrid_plugins_index. md. html#Plugin%20Development%20Guide
Bibliography
Pelletier, Jeff (April 25, 2013). Mobile App Manual. The Blueprint (http:/ / mobileappmanual. com) (1st ed.).
Withinsight Publishing. p.96. ISBN978-0989072106.
Shotts, Kerri (February 26, 2013). PhoneGap 2.x Mobile Application Development Hotshot (http:/ / www.
packtpub. com/ phonegap-2-mobile-application-hotshot/ book) (1st ed.). Packt Publishing. p.388.
ISBN978-1849519403.
Gifford, Matt (October 22, 2012). PhoneGap Mobile Application Development Cookbook (http:/ / www.
packtpub. com/ phonegap-mobile-application-development-cookbook/ book) (1st ed.). Packt Publishing. p.320.
ISBN978-1849518581.
M. Wargo, John (June 11, 2012). PhoneGap Essentials. Building Cross-Platform Mobile Apps (http:/ /
phonegapessentials. com/ ) (1st ed.). Addison-Wesley Professional. p.384. ISBN978-0321814296.
Munro, Jamie (March 29, 2012). 20 Recipes for Programming PhoneGap. Cross-Platform Mobile Development
for Android and iPhone (http:/ / shop. oreilly. com/ product/ 0636920023708. do) (1st ed.). O'Reilly Media. p.76.
ISBN978-1-4493-1954-0.
Marinacci, Joshua (March 21, 2012). Building Mobile Applications with Java. Using the Google Web Toolkit and
PhoneGap (http:/ / shop. oreilly. com/ product/ 0636920021063. do) (1st ed.). O'Reilly Media. p.86.
ISBN978-1-4493-0823-0.
Lunny, Andrew (September 23, 2011). PhoneGap Beginners Guide (http:/ / www.packtpub. com/
phonegap-beginners-guide/ book) (1st ed.). Packt Publishing. p.328. ISBN1-84951-536-0.
Ghatol, Rohit (November 14, 2011). Beginning PhoneGap. Mobile Web Framework for JavaScript and HTML5
(http:/ / www. apress. com/ 9781430239031) (1st ed.). Apress. p.700. ISBN1-4302-3903-4.
Myer, Thomas (December 13, 2011). Beginning PhoneGap (http:/ / www.wiley. com/ WileyCDA/ WileyTitle/
productCd-111815665X. html) (1st ed.). Wrox. p.336. ISBN1-118-15665-X.
External links
Official website (http:/ / www. phonegap. com)
App store optimization
218
App store optimization
App store optimization (ASO) is the process of improving the visibility of a mobile app (such as an iPhone, iPad,
Android, or Windows Phone app) in an app store (such as iTunes or Google Play for Android). App store
optimization is closely related to search engine optimization. Specifically, app store optimization includes the
process of ranking highly in an app store's search results and top charts rankings. ASO marketers agree that ranking
higher in search results and top charts rankings will drive more downloads for an app.
Goals
Being found better by users in the app stores, due to the fact that App Store Search is the No. 1 source for people
to discover new applications
Rank higher compared to competitors
Rank higher for specific keywords (mainly due to keyword density)
Rank higher in Googles semantic search for applications
History
Apple's iTunes App Store was launched July 10, 2008, along with the release of the iPhone 3G. It currently supports
iOS, including iPhone and iPad. There is also a non-mobile app store for Macs. Google's app store, Google Play, was
launched September 23, 2008. It was originally named Android Market and supports the Android operating system.
Since the launch of iTunes App Store and Google Play, there has been an explosion in both the number of app stores
and the size of the stores (amount of apps and number of downloads). In 2010, Apple's App Store grew to process
USD$1.78 billion worth of apps. iTunes App Store had 435,000 apps as of July 11, 2011, while Google Play had
438,000 as of May 1, 2012.
As the number of apps in app stores has grown, the possibility of any one app being found has dropped. This has led
app marketersWikipedia:Avoid weasel words to realize how important it is to be noticed within an app store. As
marketers started working on ranking highly in top charts and search results, a new discipline was formed.
The first use of the term "app store optimization" to describe this new discipline appears to have been in a
presentation by Johannes Borchardt on November 4, 2009. It began to take hold as a standardized term not long
after, with outlets such as Search Engine Watch and TechCrunch using the term by February, 2012.
As app publishers became more interested and engaged around App Store Optimization, tools began to emerge to
help them understand and optimize their success with app store optimization. For example, TechCrunch wrote about
MobileDevHQ's App Store Optimization keyword volume tool on February 29, 2012 and AppCod.es' keyword tool
on March 12, 2012.
Methods
App store optimization is a young and evolving field. Methods of how to efficiently optimize an app's visibility
within an app store are still relatively unknown.
However, as the field is quickly becoming an important driver of app downloads for marketers, methods for App
Store Optimization are beginning to be more widespread. App Store Optimization tools provider MobileDevHQ
broke App Store Optimization into three distinct parts: finding the right keywords, ranking highly for those
keywords, and converting visitors into users. Nevertheless, ASO is not limited to keyword related tactics only, it
actually involves all meta data available and accessible in the app stores, like icons, screenshots, description and
update texts and others.
App store optimization
219
White hat versus black hat
Many app marketersWikipedia:Avoid weasel words attempt to perform ASO in a way that most app stores would
approve of and accept. This is called "white hat" ASO. Some app marketers, however, engage in what many call
"black hat" ASO and are practices which the app stores do not condone.
Black hat ASO includes falsifying downloads or ratings, perhaps by using bots or other techniques to make app
stores (and their users) believe an app is more important and influential than it actually is.
Apple has been proactively fighting against black hat ASO. In February, 2012, Apple released a statement as
reported by The New York Times "warning app makers that using third-party services to gain top placement in App
Store charts could get them banned from the store."
Notes
220
Chapter 20: Screen Casting Web Apps for
User Documentation
Screencast
A screencast is a digital recording of computer screen output, also known as a video screen capture, often
containing audio narration. The term screencast compares with the related term screenshot; whereas screenshot is a
picture of a computer screen, a screencast is essentially a movie of the changes over time that a user sees on a
computer screen, enhanced with audio narration.
Origin of the term
In 2004, columnist Jon Udell invited readers of his blog to propose names for the emerging genre. Udell selected the
term "screencast", which was proposed by both Joseph McDonald and Deeje Cooley.
The terms "screencast" and "Screencam" are often used interchangeably, due to the market influence of ScreenCam
as a screencasting product of early 1990s. ScreenCam, however, is a federal trademark in the United States, whereas
screencast is not trademarked and has established use in publications as part of Internet and Computing vernacular.
Uses
Screencasts can help demonstrate and teach the use of software features. Creating a screencast helps software
developers show off their work. Educators may also use screencasts as another means of integrating technology into
the curriculum.
[1]
Students can record video and audio as they demonstrate the proper procedure to solve a problem
on an interactive whiteboard.
Screencasts are useful tools for ordinary software users as well: They help filing report bugs in which the screencasts
take the place of potentially unclear written explanations; they help showing others how a given task is accomplished
in a specific software environment.
Organizers of seminars may choose to routinely record complete seminars and make them available to all attendees
for future reference and/or sell these recordings to people who cannot afford the fee of the live seminar or do not
have the time to attend it. This will generate an additional revenue stream for the organizers and makes the
knowledge available to a broader audience.
This strategy of recording seminars is already widely used in fields where using a simple video camera or audio
recorder is sufficient to make a useful recording of a seminar. Computer-related seminars need high quality and
easily readable recordings of screen contents which is usually not achieved by a video camera that records the
desktop.
Screencast
221
Hardware
An alternative solution for capturing a screencast is the use of a hardware RGB or DVI frame grabber card. This
approach places the burden of the recording and compression process on a machine separate from the one generating
the visual material being captured.
References
[1] http:/ / eprints.hud.ac.uk/ 14208/ 2/ Ireland. pdf
Further reading
1. Udell, Jon (16 November 2005). "What Is Screencasting" (http:/ / www.oreillynet. com/ pub/ a/ oreilly/
digitalmedia/ 2005/ 11/ 16/ what-is-screencasting. html?page=1). OReilly Digital Media. O'Reilly. Retrieved 7
December 2010.
2. Christian (24 September 2010). "Guide: Recording your Linux desktop with ffmpeg" (http:/ / www.technotes. se/
?p=28). www.technotes.se $ Technical guides and discussions. Retrieved 7 December 2010.
Camtasia Studio
Camtasia Studio
Camtasia Studio
Developer(s) TechSmith
Initial release 2002
Stable release 8.2.1 / 17December 2013
Operating system Microsoft Windows
Type Screencasting and video editing software
License Trialware
Website
www.techsmith.com/camtasia/
[1]
Camtasia for Mac
Developer(s) TechSmith
Stable release 2.6.2 / 14August 2013
Operating system Mac OS X
Type Screencasting and video editing software
License Trialware
Website
www.techsmith.com/camtasiamac/
[2]
Camtasia Studio and Camtasia for Mac are software suites for creating video tutorials and presentations directly
by screen capture (screen video capture), or via a direct recording plug-in to Microsoft PowerPoint created and
published by TechSmith. The screen area to be recorded can be chosen freely, and audio or other multimedia
recordings may be recorded at the same time or added separately from any other source and integrated in the
Camtasia Studio
222
Camtasia Studio component of the product. Both versions of Camtasia started as enhanced screen capture programs
and have evolved to integrate screen capture and post processing tools targeted at the educational and information
multimedia development marketplace.
Camtasia Studio receives high marks from professional reveiwers and individual users alike. It is one of the most
capable, integrated screen capture and editing packages. However, the per user license fee is relatively high for this
category of software.
Camtasia Studio v8 for Microsoft Windows consists of two major components:
Camtasia Recorder - a separate tool for capturing screen audio and video
Camtasia Studio editor - the component for which the entire product is named, which is now a multimedia
authoring tool with the industry standard "timeline" interface for managing multiple clips in a stacked track form
plus enhancements summarized below.
Camtasia Recorder
In Camtasia Recorder, the presenter is able to start and stop recording with a hotkey combination at any time, at
which point the recording may be halted and resumed or Camtasia Recorder can render the input that has been
captured into a CAMREC format. The CAMREC file may be saved to disk or directly imported into the Camtasia
Studio component for editing. Camtasia Recorder allows audio recording while screen-capturing is in progress, so
the presenter can capture live narrate during a demonstration or presentation. Camtasia also supports dubbing in
other audio tracks or voiceover during post-capture editing.
Camtasia Studio editor
Within Camtasia Studio editor one may import multimedia objects of various formats into the clip library and then
arrange them in time order and stacked tracks using the timeline form of user controls that is so common among
video editors today. Overlays of various types may be added including user-defined settings, such as when and how
to display the cursor, pan-and-zoom effects such as the Ken Burns effect. Camtasia Studio v8 and Camtasia Mac v2
offer numerous options to enhance sections of the recorded screen to draw attention via a cursor or drawn in pointer
to highlight section(s) of the screen or to better illustrate the actions of the presenter on screen.
Post-production
After capturing a presentation in the Camatasia Recorder, the Camtasia Studio component may be used to modify
audio & video displayed as tracks using the industry standard timeline control and object library interface with an
integrated preview window. The image in the infobox to the right is a screen capture of the timeline interface. In
addition, Camtasia Studio allows voice overlay for the presenter or editor, as well as the ability to add sound effects
in many different formats including music formats into the clip bin and arrange anywhere on the timeline.
Many presenters prefer to wait until they have finished the screen-capture then record the narration from a script as
the application is playing back the recorded capture. They may do so in the Camtasia Studio editor and overlay the
original recorded audio.
Rendering & Deployment
The Camtasia Studio program allows import of various types of multimedia video and audio files including MP4,
MP3, WMV, WMA, AVI, WAV and many other formats into the Camtasia proprietary CAMREC format which is
only readable by Camtasia. The CAMREC format is a single container for potentially hundreds of multimedia
objects including video clips, still images, document screen shots and special effect containers. Camtasia also allows
entire project under development to be exported as one zip file for portability to other workstations with Camtasia or
Camtasia Studio
223
other video editing software. The created video may be exported to common video formats including MPEG-2,
MPEG-4, WMV, AVI, and Adobe Flash. There are preset output formats that can be read by software available on
the vast majority of current generation mobile devices, desktop, and laptop computers without requiring any
Camtasia software or license. An additional component is included, Camtasia Player v8.2 for the Microsoft
Windows version only, which may be freely shared and supports replay of variety of video formats on computers
running Microsoft Windows.
Reviews
The v8 updates to Camtasia Studio have eliminated some of the prior release issues including dramatically reduced
rendering times and excessive consumption of system resources during production. Other pros from reviews listed
below and from the Ning.com Camtasia Studio Feedback Forums:
Enhanced multi-track video/audio editing capabilities compared to v7
Improved handling of embedded hyperlinks compared to v7
Higher quality screen action capture compared to v7
Integrated audio clip enhancement
Integrated tutorial for both Camtasia Studio and PowerPoint plug-in components
Large library of tutorial material
Good support resources, both online and via text chat. Options for in person telephone support available for fully
licensed versions
Excellent educational discount license for students and instructor K-12 or university use
Camtasia Studio's shortcomings noted in the PC World review of January 17, 2013 and CNET review of June 19,
2012 and including key shortcomings from Ning.com Camtasia Studio Feedback Forums:
Rotation of objects is applied via a dialog rather than interactively, though many lower priced video editors do
provide interactive rotation and manipulation of objects such as text and video frames
Recording live from a DV camera is not supported
Pricey for this category of integrated screen capture and mid-range video editing software
Still potentially overwhelming for the introductory user, tempered by the tutorial material available. NOTE the
V8 release is a complete rewrite so much of the prior tutorial material written for the popular Camtasia Studio v6
and v7 sofware for Microsoft Windows is not usable with this release.
Audio handling has minimal capabilities and no integration with other packages compared to some competitors in
this price range
Lacks any video clip manipulation or integration with other packages that have such capabilities
PC World noted that "Camtasia [Studio] has evolved from being the go-to program for software demonstrators to a
full-featured education/information video tool" from this 4 1/2 star review. An earlier 2005 review is still relevant,
which states that, though "powerful," Camtasia can be "a little overwhelming at the start" to new users, though the
learning curve is easily manageable.
[3]
[4]
[5]
[6]
Camtasia Studio
224
References
[1] http:/ / www. techsmith.com/ camtasia/
[2] http:/ / www. techsmith.com/ camtasiamac/
[3] (http:/ / www. pcworld. com/ article/ 2025498/ review-camtasia-studio-8-raises-the-bar-on-interactive-video-creation. html), Sally Wiener
Grotta & Daniel Grotta, PC World, January 17, 2013
[4] [hhttp://download.cnet.com/8301-2007_4-57455703-12/camtasia-8-vastly-improves-screencast-frame-rates/], Jason Parker, CNET, June 19,
2012
[5] "Tips & Tweaks: Podcasts and Screencasts" (http:/ / www.pcworld. com/ article/ id,122192-page,1-c,webutilities/ article. html), Steve Bass,
PC World, August 31, 2005
[6] (http:/ / camtasia.ning.com/ forum), Many authors, Ning.com, 2012-2014
External links
Camtasia Studio (http:/ / www. techsmith. com/ camtasia. asp)
Download Locations
Alternate Download Locations and .ZIP Versions (http:/ / www. techsmith. com/ download/ alternate. asp)
Previous Release Download Locations and .ZIP Versions (http:/ / www.techsmith. com/ download/ oldversions.
asp)
Article Sources and Contributors
225
Article Sources and Contributors
Massive open online course Source: http://en.wikipedia.org/w/index.php?oldid=589185330 Contributors: 3nafish, 47deacon, AManWithNoPlan, Aabella, Adhithyan15, Alansohn,
Alfredoamerico, Alilemus, Alligatoryang, AlwaysCoding, Ammenjordan, Andrewman327, Andybulle, Angelia2041, Anthonyhcole, Apparition11, Axel Pettersson (WMSE), BJ Hooker's Vodka,
Bbarney, Bearcat, Beautifulcog, Bemanna, Bfinn, Bgwhite, Bhashavia1, Bhny, Bides time, Billymeinke, Bmcm, Bnleez, Boohoo000, Bostonian2, Brett McLennan, Bttrsweetsorrow, Calwiki,
CamphorLaurel, Capricorn1345, Carliitaeliza, Carol yeager, Charles Matthews, Chonapuch, Chris the speller, ChrisGualtieri, Cjfsyntropy, Compagejohn, Conversar, Cristian Opazo, Dan.reichart,
Danielkueh, Davecormier, DebraMynar, Derekchen14, Discospinster, Divonbriesen, Dl2000, DouglasCalvert, Downes, Edtechsean, ElKevbo, Elinde7994, Epf, Ettrig, Eugene-elgato, Fayenatic
london, Fourmi volage, Francesbell, FrankSier, Frap, Fred Bauder, Free Course Evangelist, GDW13, Gavin Moodie, Ginsuloft, Glaisher, Gsiemens, Hitchen1, Hu12, JDGWI, Jac16888,
Jamesmcmahon0, Jarble, Jaredstein, Jmenard, Jugoretz, JustAGal, Kai-Hendrik, Katharineamy, Kingturtle, Kmasters0, Lee Shapiro, Lentower, Lfstevens, LibrarianAnnie, LilHelpa, Linasouzain,
LisaMLane, Logical Cowboy, Lproven, Lucieneantunes, MZMcBride, Macflamerz, Magioladitis, Makecat, Malpaso, MariaDroujkova, Mariamgiorgadze, Masonwan, Mato, Maxim Leyenson,
Mcalvoirujo, Medicineball, Melaniehughes, MichelleSkylark, Mike Gale, Millichap, Mion, Mkljun, Mogism, Moocsmx, Mortense, MrMichaelFagan, MrOllie, Mubina.gillani, Nafizaa,
Natebailey, Naturelover007, Neelkamala, Nelliemuller, Newoz1, Nikai, Nohomers48, Nuragustinus, Nurg, Nytektchr, O.tacke, Ofol, Oreo Priest, OwenIsMeeGo, Ozhu, Pasternaker, Paum89,
Peaceray, Philbarker, Pnm, Poetfount, Porturology, Profvalente, Pvrooman, RHaworth, Ramonovelar, RichardBurdon, Rjensen, Rjhogue, RonFredericks, Ronz, SchreiberBike, Scottx2,
Sebinjmmw, Shanmianshuimeng, Shruti14, Simonjon, Sirhind, Sjgknight, Smallbones, Splitpeasoup, Sreecharan 93, Stefano Schiavon, Steve03Mills, Stoneroses77, Tallison11, Tarmo,
Tekkaman, The Anome, Theintuitus, TimothyCahill22, Timrollpickering, Tony1, TylerGreenberg, UCEntrepreneurshipOnline, UVN, Ulisp, VCHunter, VanceStevens, Vannigoc,
Vigneshtrichymba, Vipul, WBRSin, Wanderlust1282, WelshCloggy, WereSpielChequers, WikiPedant, Wnewbold, Woodpainter, Work Shop Corpse, Wschaap, Xavier Deroi, Yintan, Yug,
Zandr4, Zerkler, Zimzaman, 223 anonymous edits
Web engineering Source: http://en.wikipedia.org/w/index.php?oldid=587732582 Contributors: A3csc300, Ahddib, Ahoerstemeier, Andy Dingley, Awahid101, Bloodshedder, Btphelps,
Bulwersator, Christopherscott, Denis Beskov-Doronin, Djavidan, Dmwtechnologies, Dodoste, Dougweller, Eumi wanninayake, Frap, Ganesh121292, Illuminatusds, Jack Greenmaven, Jaime
Agudo, JamesMoose, Jammycakes, Jgzheng, Jim1138, Mabdul, Marcobramb, Mdd, Melchoir, Mesbaha, Mr Stephen, Nidalsalih, Nkuttler, Omnipaedista, Oroso, Rich Farmbrough, Robert Cerny,
SamJohnston, Sanjeevraj 25, Subversive.sound, Tenzakhti, TheAMmollusc, Tiptoety, Tonyshan, Trbdavies, Washburnmav, WebEng, WereSpielChequers, Widr, YaKashif, 93 anonymous edits
Iversity Source: http://en.wikipedia.org/w/index.php?oldid=589316783 Contributors: Alian, Anthony Appleyard, Drdemartino, GB fan, Happysailor, Quantumobserver, Ronanmcguire1234, 5
anonymous edits
VirtualBox Source: http://en.wikipedia.org/w/index.php?oldid=588744041 Contributors: A:-)Brunu, AVRS, Acdx, Aeluwas, Agentlame, Alan0098, Alisha.4m, AlistairMcMillan, Althepal,
Andy Dingley, Aoidh, Archimaredes on a train, Arctrebortic, Arichnad, Artem-S-Tashkinov, Artkagor, Barnet.Herts, Baron1984, BenJWoodcroft, Biker Biker, Bmecoli, Bob Re-born, Boudhayan
Gupta, Bradkittenbrink, Brianski, Bruce89, Bugaevc, CFeyecare, China Crisis, Chris Ssk, Chris the speller, Ciaran H, Codename Lisa, CommonsDelinker, Confusionball, Cpiral, Crazycomputers,
Curmudgeonry, Cyzor, DGaryGrady, DOSGuy, DalekClock, Daminstant, DanielVonEhren, Darkmorpher, David Chisnall, Dcorry, Demonkoryu, Denniss, DivineOmega, Dnstest, DoomMaster,
Doomonyou, Dougher, DrSeehas, DragonLord, E rulez, EagleOne, EdgeOfEpsilon, El aprendelenguas, ElectronicsEnthusiast, Epbr123, EqualRights, EvilHom3r, EwokiWiki, Favonian,
FleetCommand, Frap, Free Software Knight, GSK, Galactic Dominator, GandalfDaGraay, GarrettJeanes, Ghepeu, Greenrd, Greg L, Gronau, Gsdefender2, Guyjohnston, Gtz, HPSCHD,
Halsteadk, Hekerui, Helix84, Hidro, Hildebrand us, Hugo 87, Ian Vaughan, Ikar.us, Inservibile, Instigator uk, IronGargoyle, Iusta, Ivanusto, JCDenton2052, JGXenite, JLaTondre, Jamieostrich,
Jandalhandler, Jarble, Jasper Deng, Jdthood, Jeff G., Jengelh, Jerebin, JeremyWJ, Jirijanata, Julesd, JulianYap, KAMiKAZOW, Kiore, Kipaihoski, Kl4m, Klingoncowboy4, Koman90, Kvng,
Lester, Liangsuilong, LifeInTheDarkNight, Limulus, Little Professor, Lkundrak, Loopakoopa, Lopifalko, Lordgabor, M4gnum0n, MadNav, Majeru, Mark Renier, MarkusHagenlocher, Mars
fenix, Masoris, Matthew V Ball, Med, Medovina, Melnakeeb, Merbenz, Michaelkpate, Mindeye, Minikola, Mnemo, Mojo Hand, Momposi, Mortense, Mprove, Musan, Mwtoews, Mxxcon,
Myworld.lostin, NapoliRoma, Nbrouard, Neilh79, Nil Einne, NotinREALITY, O, Ohnoitsjamie, OmegaElheats, One Of Seven Billion, OnionBulb, Ost316, PentiumPro, Petru Dimitriu,
Phatom87, PhilipO, Phobos11, Piandcompany, Piculo, Pinecar, Purrete, Quadunit404, Raysonho, Reisio, Rgb9000, Rgiltrap, Rich Farmbrough, Rig0, Rmsuperstar99, RoestVrijStaal, Rnin,
SF007, SHARD, Samvtran, SasakiSumire, Sbiki, Schapel, Scorpus57, ScotXW, Sdornan, Seashorewiki, Seliopou, Seryo93, Setu, Sfiga, Silas S. Brown, Simple Bob, Snarespenguin, Solbu,
Someone's Moving Castle, Starionwolf, Stephen Gilbert, SteveLetwin, Superhappyfuntime, Tabledhote, Tarabo, Tatsh, Technologov, Teknomancer, TerryE, Tesssla, TheChampionMan1234,
TheFuzzball, TheRingess, Theone256, Thewikipedian, Thisara.d.m, Thumperward, TimTay, Toehead2001, TranslucentCloud, Trasz, TwoTwoHello, UU, Ujoimro, UncleDouggie, Uzume,
Vadreb, Veliath, W Nowicki, Wikievil666, Wikimike2007, Winterst, Woohookitty, Xiaq, Xojo, Xpclient, Ysangkok, Ytrewq17, Z killemall, Zero Thrust, Zippy, Zirconscot, Zundark, 318
anonymous edits
Virtual appliance Source: http://en.wikipedia.org/w/index.php?oldid=585775120 Contributors: Aakeg, Abune, Alexamies, AlistairMcMillan, Andrewman327, BabelStone, Back ache,
Barnet.Herts, Bovineone, Bpjadam, Captainfoo, Catherinenuel, Codename Lisa, Cougar w, Cymy, Erianna, Frap, Gacpro, George9eg, Ghowett, Haidut, Henryhuang, Hut 8.5, Jerome Charles
Potts, Jgweir, Jlavepoze, Jojalozzo, Jonixs, Jshurtleff, Kbrose, Khalid hassani, Khinnu4u, Kusma, Laurap414, LirazSiri, M4gnum0n, MER-C, Mark waugh, Minikola, Monadic, Nixeagle,
Rmallins, Ronanspamtitan, Ronz, SF007, SamJohnston, SteffenPoulsen, StephenDennis, Stvrly, TFOWR, Tadorne, TheParanoidOne, TimFreeman701, Tonibilly, Uzume, Vanpedia,
ViperSnake151, WikiScrubber, Yworo, 86 anonymous edits
BitTorrent Source: http://en.wikipedia.org/w/index.php?oldid=588093082 Contributors: 100110100, 1337 JN, 2 black, 4v4l0n42, 7h0r, 84user, =Xotic=, AMsisscorsister, Aaron Brenneman,
AaronSw, Abby, Accelerometer, Acidburn24m, Acido255, Acp1989, Adam Conover, Adamwankenobi, Adashiel, AgentSmith15, Agnte, Agro1986, Aitias, Ajfweb, Akersmc, Alanl, Alerante,
AlexR, Alexp73, Alienware377, Alimony, AlistairMcMillan, Alistaircase, Aljullu, Alpha Quadrant, Altdesigns, Always remember dont forget, Alxndr, Amren, An Sealgair, Analoguedragon,
Andersc1, Andkore, Andrew Benton, AndrewMrse, Andrewericoleman, Andrewpmk, Anduin13, Anna Lincoln, Anomaly1, Anonymous Dissident, Anonymous editor, Anopheles, Antaeus
Feldspar, Antandrus, Anthony, Antidrugue, Antilived, Aoidh, Appraiser, Aquilosion, Arbor to SJ, Arctic-Editor, Arnold Go, Arpingstone, Arru, Arsenic88, Arsi Warrior, Asbestos, Asdf903,
Atheros1, Augustz, Avsa, AxelBoldt, Axsimon, Azcolvin429, Azimuth1, Azx2, B&W Anime Fan, B-Con, Babajobu, Bad Byte, Badagnani, Badmonkey0001, Barfly, Barneyboo, Barte, Bawolff,
Bbatsell, Bbik, Bcharles, Beanluc, Beebauman, Beetstra, Befryxell, Beland, Benandorsqueaks, Bender235, Benmoreassynt, Beno1000, Betacommand, Bevo, Beyazid, Beyondo, Bhagwad,
Bige1977, Billymac00, Bitbit, Bkell, Black Falcon, Blahaccountblah, Blanchardb, Bleudove, Blosoya, Blu Aardvark, Bmendonc, Bmkos, Bncok, Boba5fett, Bobblewik, Bobet, Bobo192, Bobz,
Bongwarrior, BonzoESC, Bootleg42, BorisFromStockdale, Bovski, Bposert, Brasetvik, Bratch, Bratsche, BreakingMad, Breno, Brian Geppert, Brianjd, Bridson, BrokenSegue, Bruce89, Bryan
Derksen, Bsroiaadn, Btipling, Buchanan-Hermit, Bulmabriefs144, BurnDownBabylon, Burschik, Buttonius, Bytemaster, CBDunkerson, CableCat, Caesura, Caiaffa, Caidh, Calton,
Cambodianholiday, Can't sleep, clown will eat me, CanisRufus, Cantthinkofausername, Capt. James T. Kirk, Caramelman, Carbo1200, Carlosguitar, Cartoonmaster, Catfoo, Catgut, Cbraga,
Cdonges, Cebra, Ceplm, CesarB, Ceyockey, Chaheel Riens, ChangChienFu, CharlesC, Chris Wood, Chrisprall, Christopher Parham, Ciphergoth, Citrus538, Cjpuffin, Clarince63, Clement
Cherlin, Cliffhanger407, Cmdrjameson, Cmouse, CoMePrAdZ, Codewench, Coelacan, Cold Light, Coldacid, Colonel panic, Connelly, Consumed Crustacean, Conti, Contristo, CooPs89,
CorbinSimpson, Corevette, Cornilleau, Corpx, Corti, CosineKitty, CountZer0, Courcelles, Covracer, Coyote376, Cprompt, Cradel, Crazy4her, Crazyman, Crazyviolinist, Crf, Crimson30,
Crispmuncher, Crossmr, Crscrs, Curps, Cw.fire, CyberSkull, Cyberevil, Cynical, Cypherior, D Marcescu, D33d, DBaba, DBigXray, DH85868993, DS1953, Da Vynci, Damfino52, Damian
Yerrick, Dan100, Dancingmadness, Danfreak, Daniel.Cardenas, Daniel77o, DanielCD, Danielizzat, Darkone, Darksun, Darthnader37, DaveBurstein, Davewho2, David Levy, Davidgothberg,
Davidknag, Davidlawrence, Daxx wp, Dck7777, Ddxc, Deamon chum, Deathphoenix, Debresser, Decrease789, Decrypt3, Deewhite, Dekker, Delirium, Delpino, Demonkey36, DerHexer,
Derek.cashman, Deskana, Dexter prog, Dhcmrlchtdj, DiaBZeRo, Diaa abdelmoneim, Diannaa, Didimos, Dina, Discospinster, Dissolve, Dkevanko, Dmarquard, Dmitris-bat-girl, DocWatson42,
Doctoroxenbriery, Dodo bird, Donwilson, Dooogiee, Doradus, Dp462090, DrMoc, Dratman, Dreaded Walrus, Dude1818, Duk, Dupz, Dxco, Dycedarg, Dysepsion, Dysprosia, E. Sn0 =31337=,
ENoggin, Eadric, Easwarno1, Edderso, EdoDodo, Edurant, Edwards, Ehn, Einstein9073, Ejay, Ekashp, Ekazp, ElTyrant, Elfguy, Eliashc, Eloquence, Emkrasn, Emufarmers, Emurphy42, En3r0,
EndingPop, Endlessnameless, Englishmen, Epbr123, Epsoul, EquusAustralus, Erkcan, Ernesto99, Esemono, Esoteric Rogue, Espo111, Esrever, Ethicalfan, Eugene van der Pijll, Eugman,
Euphrosyne, Even248, Everyking, Evice, Evil Monkey, Evilweevil, EwanMclean2005, Exile.mind, Eyreland, Ezeu, F, FT2, Fab1968, Fabiovh, Falcon8765, Fallon Turner, Fallout boy,
Farshad83, FeldBum, Felix Wiemann, Fennec, Feureau, Finlay McWalter, FireBallAX1, Fish and karate, Fishnet37222, Flarn2006, Flockmeal, Florian adamsky, Folken de Fanel, Fondaprog,
Foobaz, Forderud, Fourchette, Fragglet, FrancoGG, Frap, Frazzydee, FreakQNC, Freakmighty, Freakofnurture, Fredrikh, Fsiler, Ftiercel, Fubar Obfusco, Funchords, Funnybunny, Furrykef,
Fuzheado, Fvw, G-RaZoR, Gabbe, Gaius Cornelius, Gambuzino, Gardar Rurak, Gargaj, Garion96, Garo, Gary King, GatesPlusPlus, Gavinatkinson, Gef05, Gen0cide, Gengw2000,
Georgewilliamherbert, Gephc, Geschichte, Ggoddard, Ghen, Ghindo, Ghost Freeman, Giftlite, Ginsengbomb, Godcast, GodofLuigi, Gogo Dodo, Gokusandwich, Golbez, Goodboywonder, Goto,
Gracefool, GraemeL, Graft, Grawity, Green caterpillar, Greenrd, GregorB, Greywiz, Gronky, GrubLord, Guaka, Guillaume2303, Gujjar123, Gunboat Diplomat, Gunnar Helgason, Guy Macon,
Guyjohnston, Guzenkov, Gwern, Gzhanstong, H2ppyme, Haakon, Hadal, Hadees, Haeleth, Halfmonkey, Ham Pastrami, Hao2lian, Haseo9999, Hashar, Hateless, Hbdragon88, Hdkiller, Hdt83,
Hede2000, Helios solaris, Helohe, Heron, Hfastedge, HiS oWn, Holdenmcrutch1, Honta, HowardStrong, Howdoesthiswo, Hpkomic, Htmlism, Huji, Hulsie, Hurricane111, Husky, Hydrargyrum,
IGod, INO Exodus, IRedRat, IRn, Iamunknown, Ian Dunster, Icedog, ImMAW, Imroy, InShaneee, Ind9ie, Inexplicable, InfoMike84, Inter, Intgr, Intimidated, Ioscius, Ipsign, Irdepesca572,
Isilanes, Itai, Itemirus, Ixfd64, J Di, J3ff, JLaTondre, JYOuyang, JaGa, Jack Cox, Jackmcbarn, Jaffa phil, Jahiegel, Jakenath, Jamesx12345, Janhuss, JavaTenor, JayKeaton, Jayen466, Jcorby,
Jdowland, Jdub7, Jerryobject, Jersey emt, Jetbackwards, Jfmantis, Jghaines, Jimmyjackjohn, Jimmyjackjohn1, Jipcy, Jivecat, Jkeren93, Jleedev, Jm1262, Jmabel, JoanneB, JoeSmack, Joel7687,
Joelholdsworth, Jogloran, John Fader, John13535, John254, Johndoe7776059, Johnleach, Johnleemk, Johnm115, JohnyDog, Jolivierld, Jonas Viper, Jonne, Josemanimala, Josh Parris, Josh
blumberg, Joshlk, Joshua Issac, Jossi, Joyous, Jpettitt, Jrleighton, Jsernest, Jtepper, Jtkiefer, Jusdafax, Justinwiley, Juux, K.Nevelsteen, K1Bond007, KConWiki, KLLvr283, Kaldosh, Kalebdf,
KamasamaK, Karasuhebi, Karl-Henner, Karlo918, Karlwiegand, Karn, Karnesky, Karol Langner, Karthikndr, Kasreyn, Katalaveno, Kate, Kateshortforbob, Kazvorpal, Kelly Martin, Kendall-K1,
Kennethkrabat, Kerotan, Kevin, Kevin chen2003, Kf4bdy, Khalid, Khokkanen, Khukri, Kidburla, Killdevil, Kinema, Kingturtle, Kitsunegami, Kiwifilm, Kizar, Kizzle, KjeXz, Kjm, Kl4m-AWB,
Knidu, Knucmo2, Knutaldrin, Koogunmo, Krakau, Krassotkin, KrazyA1pha, Krogstadt, Kuru, Kwekubo, Kwirky88, Kx1186, Kylone, LACHLANOC, LBarsov, Labenset, LamontCranston,
Langelgjm, Lavenderbunny, LeaveSleaves, Lee1026, Leedrick, Legolost, LeighvsOptimvsMaximvs, Lejarrag, Lemming, Lensi, LeoHeska, Leondz, Lerhaupt, Leuk he, Leuko, Lexein,
Article Sources and Contributors
226
Liamzebedee, Liao, LieroMan, Lightmouse, Linguisticgeek, Linkminer, Lino Mastrodomenico, Liontamer, Little Mountain 5, LittleDan, Littlealien182, Logan, LoganTheGeshrat, Loganishappy,
Logixoul, LokiC2, Lollerskates, Lotje, Ludling, Lulu of the Lotus-Eaters, Lunkwill, Lysis rationale, M, M.B, M.luke.myers, M.nelson, M4gnum0n, MC Dupree, MC10, MER-C, MOE37x3,
Mabdul, Madder, Magioladitis, Magister Mathematicae, Maha Pizza, Mahahahaneapneap, Mailer diablo, Makcal94, Mallocks, Malo, Malu5531, ManiacalMonkey, Marco255, Mareklug,
MariposaHD, Mark Bergsma, Mark mclaughlin, MarkGallagher, MarritzN, Martijn Hoekstra, Marudubshinki, Marysunshine, Master Of Ninja, Masudr, Mathiasr101, Mathrick, Matt Britt, Matt
Crypto, MattSL97, Matteh, Matthew kokai, Mattk132, Mavhc, Mayur, Mbroskamp, McSly, Mchmike, Mcld, Mdale, Mechamind90, Meltonkt, Member, MementoVivere, Meneth, Merovingian,
Metalface, Mezzaluna, Mgarcia22, Miami33139, MichaelCrawford, Mihai Damian, Mike Van Emmerik, MikeRS, Mild Bill Hiccup, Milece, Miljushm, MindlessXD, Mindmatrix, Minesweeper,
Minghong, MisterSheik, MisterShiney, Misza13, Mjb, Mjpresson, Mkilly, Mmatrxm, Mmxsaro, Mo0, Modeha, Modtang, Moe Epsilon, Momo Hemo, Monkey 32606, Monsterseas, Mor Griv,
Mortense, Mosquitopsu, Mphenley, Mr. Billion, MrCalifornia, MrParkle, Mrjeff, Mschel, Msikma, Msmithma, Mtoley, Mu li, Muro de Aguas, Musical Linguist, Mxn, Mylittleanon, Mysid,
Mtze, N5iln, NJlo, Naddy, Nadyes, Nageh, Najoj, Nakakapagpabagabag, Nakon, NaruFGT, NatBlack, Nathanrdotcom, NawlinWiki, Nedlowe, Neg, Neo-Jay, NeoDeGenero, Neolandes, Nep,
Neustradamus, Newhow, Nicd, Nick, NickCatal, Nickptar, Nigelj, NightDragon, Nightscream, Nikai, Nil Einne, Nimur, Nitrodist, Nixeagle, Njoubert, Nlitement, Nneonneo, Nogwa, Noian,
Nokiki, Nonagonal Spider, Nshunter, Nugneant, Nwatson, Od Mishehu, Odysseyandoracle, Ohnoitsjamie, Oiarsun, Ojw, Omegatron, Omicronpersei8, Omstedall, Onanoff, Oren0,
OriginalGamer, Orphan Wiki, Otus, Ozzmosis, P0lyglut, PEAR, PSYCH, PTSE, Pablo-flores, Pajz, Pak21, Pale blue dot, PamD, Pamri, Paranoid, Paraphelion, Pats1, Patstuart, Paul August, Paul
Richter, Pauli133, Pbayowner, Pbevin, Pbryan, Pceriott, Pedant, Penagate, Pentasyllabic, Pepve, Perfecto, Pernogr, Peruvianllama, Peter S., Petereriksson, Pgan002, Pgk, Phantasee, Pharaoh of
the Wizards, Phe, Philip Trueman, PhilipMW, Philopedia, Phixt, Phoenix Hacker, Piano non troppo, Pictureuploader, Pile0nades, PinchasC, Pinchiukas, Piperh, Pixelface, Pkrulzzz, Plasticup,
Player 03, Pmanderson, Pmsyyz, Podolsky, Pogo747, PopUpPirate, Popoffka, Popsracer, PortnoySLP, Postdlf, Pr1268, Prashanthns, Prasi90, Preisler, Procule, Proficient, ProhibitOnions, ProveIt,
PseudoSudo, Pseudomonas, PseudonympH, Pstudier, Pti, Public Menace, Puckly, Pxma, PyroMithrandir, Qaddosh, Quarl, Quinthar, R00ted, Rakshasa, Rami R, RandomP, Ranjithsutari, Rasmus
Faber, Raysonho, Rchamberlain, Rcsprinter123, Rdsmith4, Recepyesil, Reduxtion, Reedy, Rees11, Rehill, Reifman, Reinyday, Rejozenger, Rekenner, Remember the dot,
RenamedUser01302013, Renox, Replyswung, RexNL, ReyBrujo, Rfvsydysb, Rhododendrites, Rich Farmbrough, Richi, Ricky81682, Ringbang, Rjw62, Rjwilmsi, Rlevse, Roberta F., Rocastelo,
Rocketmansbro, Rockrox, RodC, Ronark, Rory096, Ross Fraser, RossBagwell, Rotem Dan, RoyBoy, Rsduhamel, Rspeer, Rtcpenguin, Rulecam, Rurik, Rursus, RxS, Ryanrhymes, Rydia, Ryuch,
Ryulong, S3ven, SDS, SF007, SKP2, SRobbins, SadaraX, Sajman12, Saluyot, Sam Hocevar, Samboy, Sanchom, Sandunperera, Sango123, Sarregouset, SasaMaker, Sasquatch, Sburke, Scootey,
ScudLee, Seakintruth, Sebastian Goll, Sega381, Seidenstud, Seiji, Senator2029, Seth Finkelstein, Shaddack, Shadow1, Shawn K. Quinn, Shellreef, Shenme, Shii, Shining Celebi, Sietse Snel,
Simetrical, Simonkeys, Sir Isaac, Sir Paul, Sixteen Left, Skizzik, Skrapion, SkyWalker, Sl, Slaah, SlapAyoda, Slicedoranges, Slinky Puppet, Slogsweep, Smautf, Snowman304, Sogartar,
SoledadKabocha, Solitude, Somewhereelse, Sommers, Somnophore, Sonjaaa, Soul1337, Soulparadox, Sound-Mind, Sparkyelite, Spe88, Spencerwhite18, Sperxios, Spire42, Spitfire, Spitzl,
Splintax, Spoon, SpuriousQ, SqueakBox, Staka, StasMalyga, Steel, StephanCom, StephenFalken, Stephenb, Stepheng3, Stephian, Stereotek, Steve McKinney, Stevenrasnick, Stevertigo, Stilroc,
StradivariusTV, Strike Eagle, Stryke3, Stuart Morrow, StuffOfInterest, SubKamran, Subha gen1, Sugarshoesfootwear, Suki42000, Sun Creator, Superjordo, Superm401, Suruena, Svick, Swerty,
Synchronism, TAG.Odessa, TANVEERAHMED493, TJJFV, TRasLucido, Tabletop, Taestell, Tagus, Taketwo, TakuyaMurata, TallulahBelle, Talmage, TangentCube, Tanner Swett, Targetter,
Tarquin, Tarun.Varshney, Tcncv, Technobadger, Tedwardo2, Teemuk, Tentinator, TestRabbit, Tgr, Thayts, The Deviant, The Ephialtist, The Inedible Bulk, The SZ, The Thing That Should Not
Be, The bellman, The freddinator, TheDeathCard, TheKoG, TheMissileSilo, TheSurfer, TheWeakWilled, TheYellowAlien, Thecerial, Theda, Theqool, Thermalimage, Theshibboleth, Thewalrus,
Theymos, Thiseye, ThomasK, Thorpe, Thumperward, Thunder Wolf, Tim Pritlove, TimMagic, TimRatelle, TimothyPilgrim, Timwi, Tiuks, TnS, Toehead2001, Tokek, TomFitzhenry, Tony1,
Tonyxc600, Tooth557, TorrentExpert, Torrentler, Torrentmap, Toufeeq, Toussaint, Toytoy, TravelingCat, Treyt021, Triadbeast, Tristanb, Tropylium, True Vox, Ttwaring, TulioRibeiro, Tullie,
Tunneltunnel, TuxDistro, Twsx, Ultimus, Ultra-Loser, Um Bongo, Umapathy, Uncle Milty, UncleBubba, Unclepea, Unixer, UnknownForEver, UriBudnik, Usenetfriend, Usman.shaheen,
Utcursch, Vague, Vald, Vanished User 0001, Varuna, Vector4F, Vego99999, VerTiCal, Versatilegeek, Violetriga, Vishahu, Voidwarranty, Voidxor, Vorash, VunYunT, WaeV, WakiMiko,
Wangi, Ward20, Wayward, Wbm1058, Webjomo, Wellreadone, Welsh, WesternActor, Weyes, What'sGoingOn, Whcodered, WhyBeNormal, Wiesel 99, Wiki light light, Wikidrone,
WikipedianMarlith, Wikisurfer1, William Graham, William M. Connolley, William Pietri, Wingbullet, Wisq, Wmahan, Woofcat, Woohookitty, Worldofstar, WpZurp, Wubrgamer, WurdBendur,
X1987x, XLerate, XP1, Xamian, XanderJ, Xandrox, Xeonxl, Xyzzyplugh, XzaB, YUL89YYZ, Yaaron, Yaluen, Yamamoto Ichiro, Yegorius, Yelyos, Yono, Zaeleus, Zaita, Zandperl, Zealotgi,
Zerit0, Zginfo, Zoe, Zoicon5, Zondor, Zootsuits, Zoz, Zsero, Zucche, Zvonsully, var Arnfjr Bjarmason, anp Monn, !"#, u.o .. . uo, 2539 anonymous edits
CloudControl Source: http://en.wikipedia.org/w/index.php?oldid=528013661 Contributors: Ben Ben, Magioladitis, Rwalker, SwisterTwister, Tomger, 4 anonymous edits
Git (software) Source: http://en.wikipedia.org/w/index.php?oldid=588956459 Contributors: 1exec1, 1qaz-pl, A.M., A2Kafir, Adam Katz, AgadaUrbanit, Alecclews, Alerante, Alex.muller,
Alfasst, Alisha.4m, AlistairMcMillan, Alphax, Amalthea, Andre.goddard, AngelKnight, Antanst, Arialdomartini, Arichnad, Arjun G. Menon, Artagnon, Artw, Atheuz, Audriusa, AxelBoldt,
Banpei, Bbossola, Behnam, Bender235, Betterworld, Beyazid, Bhny, BiT, Bigbluefish, BioTube, Blazar, Blowfish2012, BluePyth, Bluebusy, Boomi89, Boyski, Bradmurray, Bramschoenmakers,
BreachReach, Breed808, Brentonson, C5st4wr6ch, CD-Host, Camponez, Capitalismojo, Cbr2702, Cburnett, CesarB, Chaos.squirrel, CharlesC, Chikyuu, Choas, Chr1syr, Chx1975, CiaPan, Ck3d,
Cmglee, Codename Lisa, Comwt, ConradPino, Coonsta, Cybercobra, DMarti, Daev, Daniel Santos, Daniel Thompson, Daniel.Cardenas, Daniel.ugra, Danielmiessler, DataWraith, David Gerard,
David Woodward, David.hilton.p, Davidswelt, Davipo, Dcamp314, Debarshiray, Deflective, Deleteme42, Deltik, Demitsu, Demonkoryu, Dennis714, Der Messer, DigitalPig, Direvus, Dl2000,
Dmprantz, DonPaolo, DopefishJustin, Dpotapov, Drafnel, Drake Redcrest, Draperp, Drdee, Drizzd, Dscho, Duesentrieb, Dwheeler, Eagleoneraptor, Eaglizard, Eddie Nixon, Eeekster, Ehamberg,
Eleveneleven, Eloquence, Enormekever, Erikmhatter, Erlendaakre, Eschnett, Eturkay, EvanCarroll, Ewlyahoocom, Exidor, Falcon9x5, Fanf, Fatespeaks, Felix Wiemann, Fiftyquid, Fleasoft,
Folajimi, Forderud, Fragglet, Frakturfreund, Francis Tyers, FrancisTyers, FrankTobia, Frap, Frecklefoot, Fred Bradstadt, Fredrik, Free Software Knight, Furrykef, Gaius Cornelius, Galzigler,
Gdavidp, Generalk, Georg Stillfried, Gil mo, GivePeasAChance, Gjmulhol, Glenn, Gloin, Gogo hr, Gonzonoir, Greg Tyler, GregorB, Grendelkhan, Gronky, Groxx, Grutness, Gustavb, Gwern,
HMSSolent, Haeinous, Hairy Dude, Hanifbbz, Hannes Rst, Hawaiian717, Henon, Henridv, Hervegirod, Hobbes78, Hooperbloob, Hpv, Hpxchan, Hu2hugo, Hulten, HumbertoDiogenes,
Hydrargyrum, Hypersw, ISoron, IainDavidson, IanVaughan, Iani, Iggymwangi, Ino5hiro, Int19h, Intgr, Invalid abstraction, Isidore, IvanLanin, J Di, J.delanoy, JLaTondre, JamesTeterenko, Jason
Quinn, Jasper Deng, Javaman411, Jeffrey Smith, Jeffz1, Jengelh, Jfcarr, Jfmantis, Jherland, Jidanni, Jnareb, John Vandenberg, Jonnycando, JordiGH, Jpatokal, Jsalcedo, Jstepka, Juhtolv, Jun-Dai,
Junkblocker, Justin545, KYSoh, Kanguole, Kbh3rd, Kelapstick, Kesla, Kevinbsmith, Kinema, King of Hearts, Kkm010, Kl4m-AWB, Kntrabssi, Kohei, Kohtala, Kugland, Kurepalaku, Kwerle,
Landroni, Lee Carre, Leonid Volnitsky, LimeHat, Linuxbeak, Liontooth, Liyf, Luke.lightly, MBisanz, MZMcBride, Maddyunlocked, Majromax, Mamling, Manop, Marcinkuzminski, Martin
Geisler, Marudubshinki, Matonen, MattFS218, MattGiuca, Matthieu fr, Meandtheshell, Meonkeys, Meow, Methmann, Mfedyk, Michael9422, MikeRS, MikeWazowski, Mimosinnet, Mirokado,
Mitch Ames, Mitchan, Mmj, Modargo, Mortense, Mosquitopsu, Moxfyre, MrDolomite, MrOllie, Mrh30, Mu Mind, Mugwumpjism, MyNameIsNeo, Myrdred, NapoliRoma, Nejc76, Nickb79,
Nicolas1981, Ninly, Nippysaurus, NisseSthlm, Noam, Oconnor663, Oska, Othtim, Padraigk, Pagingmrherman, Palfrey, Paradoja, PaulJackson99, Paulmorriss, Pcap, Pelerin2, Pengo, Perey,
Petteri, Phil.a, Philip Trueman, Pjrm, Pmsyyz, Pnorcks, Pootor, Querent, Quibik, QuimGil, Qutezuce, Qwe, R'n'B, RCX, Raggha, RainerBlome, RandalSchwartz, Raul654, Raysonho, Rchandra,
Reedy, Renku, Resing, ReyBrujo, Rich Farmbrough, Rigmahroll, Rjwilmsi, Robertotyley, Rogerdpack, Ronz, RossPatterson, Rossami, Rst, Runtime, Ruud Koot, SRabbelier, STGM, Saken kun,
Samdutton, Sandrafromgermany, Saneef, Sanxiyn, Saric, Sathallrin, Schily, Scientes, Scs, Secleinteer, Sensation1833, Shanes, Shd, Shentino, Shirudo, Shoujun, SimenH, Sivaraj, SleekWeasel,
Sligocki, Smyth, Socrates32, Solarra, Sovarn, Spasquali, SpeedyGonsales, Spyhawk, Stassats, Stausifr, Stevenj, Stevertigo, Strait, Strimo, Subsolar, Superm401, Sverdrup, Svick, Sweavo, Sycarr,
Sysmonblog, TakuyaMurata, Tchor, Techietim, Tedickey, Tedyu002, Tha sun, Thepizzaking, Thumperward, ThurnerRupert, Thv, TigerShark, Tim abell, Tinuzz, Tobias Bergemann, Tom Yates,
Toofishes, Tpk5010, Trevor37, Trdel, Tuxcantfly, Tuxic, Uncle G, Unicodemonkey, Unixchris, Urhixidur, VanGore, Vanuan, Vegpuff, Venkytv, Veratien, Viatropos, Vl'hurg, Warren, Winterst,
Wmahan, Woohookitty, Woseph, Wourriezer, WurmWoode, Wutzi15, Wwwwolf, Xan2, Y.P.Y, Zenaan, Zzzawir, var Arnfjr Bjarmason, Ziedas, 674 anonymous edits
Representational state transfer Source: http://en.wikipedia.org/w/index.php?oldid=589595964 Contributors: AaronRoe, Abdull, Abhiyerra, AlastairIrvine, Aleksa Lukic, AlexanderPletnev,
Alexbrn, Alexjrodriguez, AlistairMcMillan, Allister MacLeod, Anders94, Andrewpmk, Andy Dingley, Antandrus, Antientropic, Anton Gutsunaev, Arthena, Arunsingh16, Aschauer, Aslam1979,
AstralWiki, Autarch, Autiger, B Fizz, Banus, Barrylb, Bbeeley, Bcosca, Bdahi, Beyondeverything, Bezenek, Bhanafee, Bipinkdas, Blahblah29, Bocklin, Bovineone, Boyprose, Bpanulla,
Bpmurray, Bramschoenmakers, Brianfinley, Cam15jg, Candyghost, Carleas, CarloWood, Caseydk, Cburnett, Cdiggins, Centheroworld, Charles Brooking, Charles Merriam, Chimrae,
Chocolateboy, Chris Chittleborough, ChristianGruen, CornellEngr2008, CosmoDad, Crasshopper, Crazyfaboo2, Crazytonyi, Cypres, DBooth, Dan East, Daniel.Cardenas, Danja, Darrhiggs,
David.coallier, Dcoetzee, Debresser, Deepesh16, Dejvas, Delepster, Denisarona, Destynova, Dheerajnagpal, Diego Moya, Dionyziz, Dipskinny, Discovery4, Djmackenzie, Dlabtot, Dmccreary,
Dmh, Dockurt2k, Doradus, Download, Dpm64, Drernie, Dsnelling, Dstefanox, DuncanCragg, Durrantm, Dvyjones, Dw31415, Eaefremov, Ed Brey, Ederiel, Edouard, Ekerazha, Elgolferisto,
Enkrates, Epicgenius, ErKURITA, Ernbeld, Etan Wexler, EvanProdromou, Excirial, Faisal.akeel, Favonian, Fdbtwiki, Felipec, Felix Wiemann, Ferrans, Feydey, Fkopp, FlyingToaster, Forage,
FrYGuY, FrankTobia, Frappyjohn, Fred Bradstadt, FuzzyBSc, Gaius Cornelius, Gardar Rurak, Gary King, Gertvandijk, GioeleBarabucci, GlenPeterson, Goflow6206, GoingBatty, Gravbox,
Grenavitar, Griba2010, GuilhermeSalgado, H.seldte, Hairy Dude, Halmstad, Hawaiianchimp, HenryLi, HereToHelp, HikariWS, Hrvoje Simic, Hu12, Husky, Hymek, IMSoP, Iemeli, Ilikepure,
Informedbanker, Innotis, Iosmak, Ivan Pozdeev, IvanLanin, Izuzak, Ifai, J. Finkelstein, J.delanoy, JHunterJ, JLaTondre, Jacobsrl, JamesBrownJr, Jandalhandler, Jarble, Jbaylor, Jdevins,
Jedediah Smith, Jelder, Jes5199, Jfalvarez, Jgowdy, Jianhui67, Jim McKeeth, Jim1138, JimD, JimisDose, Jkonkle, Jlouvel, Jncraton, Jniemi, Joaquin, Joeschneid09, John Vandenberg,
JohnPritchard, Johnuniq, Johnvpetersen, Jokes Free4Me, Josemanimala, Joshsteiner, Jsled, KLdd15, KarlDubost, Kasunbg, Keithjgrant, Kendall-K1, Kevin.dickerson, Kgomadam, Khalid
hassani, Kirloo, Kjetil r, Kku, Konklone, Kotz, Kriszyp, Kswisz, Kwamikagami, Kyng, Lakshmag, Lastnightout2000, Ldrhcp, Lectonar, Leif, LeonardoGregianin, Leotohill, Liangent,
Lost.goblin, Lotje, Lsaffre, MC10, MER-C, MacIomhair, Magic3y3, Makeemlighter, Mangst, MarXidad, Marchash, Mark Arsten, Martinsnt, Materialscientist, Mathiastck, Matlads, MattDP,
Mauls, Max Terry, Mboverload, Mecolin, Mgpatil, Michael Hardy, Michael miceli, MikeVitale, Mindmatrix, Misterdom, Mmurrain, Monkeech, Mortense, Movednaval, MrOllie, Mtaus,
Mugunth Kumar, MusikAnimal, Musiphil, Mzajac, Naasking, Nakakapagpabagabag, Nasnema, Nategood, NawlinWiki, Nealmcb, Neo139, Ngio, Niceguyedc, Nicholsr, NickGarvey, Nickg,
Nicoglop, Nigelj, Ninly, Norm Cimon, Nurg, Nux, Nvf, Oligomous, Oliverlewis, Onefreewalk, Otterfan, Ozten, Pasado, Pathoschild, PatialaPeg, PatriceNeff, PatrickFisher, Pbannister, Pengo,
Peruvianllama, Peter Campbell, Philippe, Pierslawson, Pietrow, Pingveno, Plausible deniability, Plustgarten, Pmronchi, Pnm, Polymorp, Prafulpatel2010, Priit Tamboom, Ptoniolo, Puterfreek,
Quinxorin, R'n'B, Raam86, Radagast83, Randykahle, Rbirkby, Rcunderw, Reach Out to the Truth, RedHughs, Reedy, RekishiEJ, Rich257, RickScott, Ringbang, Ripounet, Roberto999,
Robscheele, Rocketrod1960, Rodii, Rohan Jayasekera, Ronhjones, Ronz, RossPatterson, Rror, Rshin, Ruakh, Rwong48, Sae1962, SamJohnston, Sanspeur, Sbalagiri, Scottsteffens, Sean Flanigan,
Seaphoto, Sebastian.Dietrich, Sebastianovide, Shaded0, Sharavanabhava, ShauNotDeaD, Shii, Shoujun, Sietse Snel, Singingwolfboy, Skiwi, Sleepnomore, Sleepyhead81, SlubGlub, Snigbrook,
Snoofer, SoledadKabocha, Spock of Vulcan, Srgsoroka1, Sstrader, Starbuxman, Stemann, Stephan Leeds, SteveLoughran, Stevecrozz, Steven Zhang, Stevietheman, Stpeter, Strafym,
Subversive.sound, Subwiz, Svick, Sybanes99, TJRC, TNLNYC, Tankxcluzive1991, Tburke261, Tcaruso2, Teemu Leisti, The Wild Falcon, TheodorVonAschenbach, ThinkingInBinary,
Thomas.uhl, ThomasHofmann, Thorwald, Thumperward, Tima, TimmoGierke, Tlesher, Toddcs, Tommy2010, Tony1, Toussaint, Trevor Wennblom, Txomin, Uncle G, Vdm, Venky atl,
Article Sources and Contributors
227
VernoWhitney, Vgooditem, Vhastings, Viksrox, WWC, Wadsworth, Waldir, Walter Grlitz, Warnov, Warren, Wavelength, Wayne Slam, Wdror-wsu-gb, Wesley, Widefox, Wikiplorer, William
Allen Simpson, Winterst, Wolfgang42, Woohookitty, Wooptoo, Yannick56, Zak.mandhro, Zeno Gantner, 866 anonymous edits
Create, read, update and delete Source: http://en.wikipedia.org/w/index.php?oldid=588207446 Contributors: 5994995, Absinf, Alex2222, Alvin-cs, Ant, Antonielly, Apokrif, Atki4564,
Banzaimonkey, Beatupbutterfly, Bovski, CanadianLinuxUser, Chris Purcell, DaGizza, Demonkoryu, Dhartung, Donperk, Dreftymac, Eraldito, FeRD NYC, Fgrinder, Fluffernutter, Fred
Bradstadt, Gary King, Garylhewitt, Gjs238, Gobbleswoggler, Gogo Dodo, Guoxiao281, Herbee, Iancarter, Intgr, James Harvard, Jarble, Jim1138, Jleedev, Jmkim dot com, Kazvorpal, Kbrose,
KeithTyler, Kenyon, Khalid hassani, KnightRider, Korg, Kozuch, L Kensington, Leonus, Lord Zoner, LucQ, Lus Felipe Braga, Lyverbe, Mark McColl, Mark Renier, MarkusStolze, Martnym,
Max Terry, Metal.lunchbox, Mike Blackney, Mikeblas, Mindmatrix, Mr e guest79, Mzajac, Napoleonsacrebleu, NawlinWiki, Nepenthes, OguzOzkeroglu, Pinethicket, Pmcm, RJFJR,
Railwayfan2005, Rayngwf, Remuel, Richnice, RickScott, Robert K S, RobertG, Robertbowerman, Sannse, Sawall, Stephan Leeds, Syhon, Techi2ee, Thorwald, Thringer, Troels Arvin, Unixxx,
Vectro, Wesley, Winterst, Zanerock, Zegoma beach, 192 anonymous edits
HATEOAS Source: http://en.wikipedia.org/w/index.php?oldid=581453106 Contributors: Andreas Kaufmann, Bearcat, BlaF, Crazytonyi, Dawynn, Dkf11, Gerweck, Jedediah Smith, Justinc,
Mad Pierrot, Mfirry, Nigelj, PamD, Sharney3, Tabledhote, Thorwald, Xezbeth, 16 anonymous edits
Hypertext Transfer Protocol Source: http://en.wikipedia.org/w/index.php?oldid=588960933 Contributors: 1234r00t, 4342, AeX, A-moll9, Aapo Laitinen, Abdull, Abu ali, Acdx, Ace of
Spades, Adoniscik, Agawish, Agupte, Agus puryanto, Ahoerstemeier, Aitias, Ajfweb, Alansohn, Aldie, AlefZet, Alerante, Alistair1978, AlistairMcMillan, Amalthea, Andareed, Andkim99, Andre
Engels, Android Mouse, Aneah, Angus Lepper, Anna Lincoln, AnotherSprocket, Anwar saadat, Apparition11, Arch o median, Ash, Ashley Y, Asj123fds, Asteiner, Astroview120mm,
Atemperman, Audriusa, Avb, Avnjay, Baa, Babbage, Babedacus, Babysabre, Bamkin, BaronLarf, Basil.bourque, BeakerK44, Beefyt, Beinder, Beland, Ben-Zin, BenBildstein, Benandorsqueaks,
Benanhalt, Bernfarr, Betacommand, Betterworld, Bevan7, Bevo, Bg, Bgwwlm, Bihco, Bil1, Bjankuloski06en, Blade44, Blanchardb, Blm, Bluemask, Bluerasberry, Bobo192, Bongwarrior,
Booyabazooka, Bpantalone, Brian.fsm, Brownsteve, Bruce1ee, Bsrdjan, Bull3t, C. A. Russell, C.Fred, CWii, Calabe1992, Callmederek, Calor, Caltas, Calvin 1998, Cambalachero, Cameltrader,
Can't sleep, clown will eat me, Canderson7, Capricorn42, CardinalDan, Catamorphism, Cburnett, CecilWard, Cedy, Chadfiller, Charles Gaudette, Chasingsol, Chealer, Checking, Chenqiang.prc,
ChongDae, Chrisamaphone, Christian75, Chruck, Coasting, Compfreak7, Conversion script, Cool-RR, Coroberti, Corpx, Cryptic, Cwolfsheep, Cyberstrike3000X, CyrilB, DKEdwards, DVdm,
Daf, Dalitvoice, Damian Yerrick, Damnreds, DanBLOO, DanBishop, Danculley, Daniboydl07, Daniel.Cardenas, Danielfolsom, DarTar, DasRakel, Davidgumberg, Davidjk, Davilima, Dawn
Bard, Dcoetzee, Ddas, De728631, DeadEyeArrow, Delicates, Delirium, DerBorg, DerHexer, DigitalNinja, Dionyziz, Discospinster, Dmufasa, Dmyersturnbull, Doc Armitage, Don4of4, Doria, Dr
bab, Draperp, Drcwright, Dspradau, Ducknish, ENeville, Earthlyreason, Edmund Patrick, Edward, Ehn, El C, ElKevbo, Electron9, Eli the Bearded, Elimerl, Ellywa, Elving, Englishrose,
Enjoi4586, Ent, Epbr123, EphemeralJun, Equendil, Esanchez7587, EvergreenFir, Evil Monkey, Ewawer, Extra999, Extransit, Eyreland, Falsestuff, Favonian, Femto, Ferkelparade, Firetrap9254,
Flockmeal, Frap, Frappyjohn, Fraxtil, Fred Bradstadt, Fresheneesz, Funandtrvl, Furrykef, Fuzzygenius, GGShinobi, GJHC1, Gaccolin, Gaius Cornelius, Galund, Gamernotnerd, Gavinmorrice,
Gdo01, Gen. von Klinkerhoffen, George Ho, Gfoley4, Giftlite, GimliDotNet, Ginsuloft, GioeleBarabucci, Glane23, Godtrog, GordonMcKinney, Gracenotes, Graciella, Graham87, GrahamColm,
Grantglendinning, Gregkaye, Grouse, Gscshoyru, Gsiegman, Gurchzilla, Guy Harris, Guy Macon, Haakon, Habbabuba91, Haiiiiilllsatana, Ham Pastrami, Hans Genten, HappyCamper,
Happysailor, HarisM, Haseo9999, Hashar, Hashproduct, Helix84, HexaChord, Himichellet, HonestIntelligence, Horsten, Hrafnkell.palsson, Hrvoje Simic, Htonl, Hu12, Huw Powell, Hydrogen
Iodide, Hydrox, Hyperthermia, I am One of Many, IAlexR, IMSoP, IRedRat, IShadowed, Icairns, Idyllic press, Ihatejava, Iluvcapra, Imnotminkus, Imroy, Incnis Mrsi, InfoRetrieval, Interiot,
Intgr, Irrypride, Itpastorn, Ivank06, Ivko, Ixfd64, J.Dong820, J.delanoy, JHolman, JTN, Jaan513, Jacobolus, James086, JamesBWatson, Jarble, Jarkospratt, Jarkspratt, Jasper Deng, Jdowland,
Jeffq, Jeltz, Jennica, Jeroenvdmeer, Jleedev, Jmar777, John Quiggin, John Vandenberg, John of Reading, Jojhutton, Jonathan O'Donnell, Jonnabuz, JonoF, Josh3736, Joyous, Jrobinjapan,
Jstrater, Jusdafax, JustAnotherJoe, KAtremer, KGasso, Ka-Ping Yee, Karingo, Karl Dickman, Kbrose, Keilana, Kesac, Kesla, Kgfleischmann, Kinema, King jakob c 2, Kiwi128, Knutux, Koavf,
Kocio, Konniret3, Korealin, KrakatoaKatie, Kravietz, Krellion, Krellis, Ksn, Kundor, Kungfuadam, KurtRaschke, Kvng, Kwi, Kylu, Kymacpherson, La Parka Your Car, Lady Serena, Lannm,
Leafyplant, Lee Carre, Lee J Haywood, Lethe, Lezek, Lightdarkness, Lilac Soul, Linusnk, Lloydpick, Lotje, Lotu, Lproven, Lugia2453, Luna Santin, Lupinoid, Lysdexia, M0rphzone,
M4gnum0n, MLauba, MZMcBride, Mabdul, Macademe, MackSalmon, Madhero88, Maebmij, Magaman dude, Magioladitis, Mange01, Marc Kupper, Marcos canbeiro, Marek69, Mark Arsten,
Martin BENOIT, Marx01, Materialscientist, Mathiastck, Mauro Lanari, Mblumber, Mdann52, Mdd, Mdf, Meekohi, Mehfuz, Melonkelon, Meneth, MikeF, Mikerlynn, Mindmatrix, Mjb, Mlibby,
Mmj, Mnot, Modster, Moe Epsilon, Mohammedsheikh786, Mormegil, Mortense, Moustafaza, Mpeylo, Mr Stephen, MrExplosive, MsDivagin, Mschel, Mumia-w-18, Mwarren us, Mwtoews,
Nageh, Nanshu, NawlinWiki, Negrulio, Nevyn, NewEnglandYankee, Newone, Nezzadar, Nickshanks, Nicolas1981, Nigelj, Nightraider0, Nightstallion, Nikola Smolenski, Ninly, Niqueco,
Nixdorf, Nixeagle, Nknight, Nlu, No Guru, Nubiatech, Nurg, Nyelvmark, ObfuscatePenguin, Okyea, Omniplex, Oneiros, Onlynone, Optiguy54, Orbnauticus, Ore4444, OsoLeon, Oxymoron83,
Pakaran, Papadakis2007, Part Deux, Pascal666, Patrick, Paul Mackay, Paul-L, Pb30, Perceptes, PerfectSystem, Persian Poet Gal, Petero9, Pforret, Pgan002, Phatom87, Phette23, Philip Trueman,
Piano non troppo, Pioneerking, Pip2andahalf, Planet Herald, Pnm, Praefectorian, Produke, Psychonaut, Pxma, Qff828, R3m0t, RHaworth, RJaguar3, RainbowOfLight, Rainman-sr, Raise
exception, RandomHumanoid, Ravik, Reach Out to the Truth, RedWolf, Reschke, Retiono Virginian, RexNL, Rhaskallion, Rich Farmbrough, Rischmueller, Rjwilmsi, Rmhermen, Rmosler2100,
RobMattson, Robert Xia, RockMFR, Ronhjones, RossPatterson, Rror, RyanCross, Ryulong, SJP, SWAdair, Sae1962, Saebjorn, Sahara4u, Sakkath, Salvio giuliano, Samuel, Sander Sde,
Saoshyant, Saturn star, SchnitzelMannGreek, Schwallex, Scientus, Scottywong, Sdrtirs, Sean Whitton, Seb-Gibbs, Sekro, Shadowjams, Sharon08tam, SheeEttin, Sheldon Rampton, Shiftoften66,
Shuipzv3, Sietse Snel, SiobhanHansa, SixSix, SkE, Smsarmad, Socrates2008, Sodabrew, SoftX, Spaceman85, Spandrawn, Sparky132, SpyMagician, SqueakBox, Sri Krishna Geova Allah,
Sriharsh1234, Sses401, Sstteevvee, Stephan Leeds, StephenBuxton, Stephenb, SteveLoughran, Stevenup7002, Stolee, Stupid Corn, Super48paul, Suppie, Suruena, Syrthiss, T-borg, THEN WHO
WAS PHONE?, Tabledhote, TakuyaMurata, Tbannist, Tbhotch, TechTony, Template namespace initialisation script, Tempodivalse, TenOfAllTrades, Th.matt.wiki, The Anome, The Quirky
Kitty, The Thing That Should Not Be, The Utahraptor, The wub, TheJosh, Theopolisme, Think777, Thumperward, Tianjiao, Tide rolls, Timc1212, Timmywimmy, Timneu22, Tinogomes,
Tlesher, Tobby72, Tobias Bergemann, Tobias382, Todd Vierling, Tomaxer, Tommy2010, TonyAiuto, Toto Mommam, Tpbradbury, Tpirfan28, Tregoweth, Trusilver, Trygvis, TuukkaH, UU,
Uncle Dick, Uncle G, UncleBubba, Universalss, Universimmedia, Upkarsh, Uruiamme, Utcursch, VMS Mosaic, Valenciano, Versus22, VictorAnyakin, Vinoth.t, Voxii, Vrenator, WDGraham,
Wavelength, Wayne Hardman, Widefox, Widr, Wikipelli, Wintonian, Wizzard2k, Wjcw, Wolfomatic5, Wonko, Woohookitty, Wtmitchell, XapApp, Y98, Yacht, Yaronf, Yomcat, Yonatan,
Yuhong, Zachlipton, Zalnas, Zekefast, Zvn, demon, le flottante, 1414 anonymous edits
Roy Fielding Source: http://en.wikipedia.org/w/index.php?oldid=589207870 Contributors: Advised Wang, Bdelacretaz, C3o, Coar, Diego Moya, Djmackenzie, Dpm64, Duncan.Hull, Gene
Nygaard, Gh0sT, Jonesey95, Kaly99, Klizza, Lars3loff, Lilac Soul, Lindsaymacvean, Martarius, MaxVeers, Mhartl, Mjb, Mount Flatten, Open Source Guy, RlyehRising, Rrrlf, Sae1962, SchreyP,
Snori, TJRC, Tangledweb, Thorwald, Thumperward, Txomin, Uncopy, Waacstats, 30 anonymous edits
Codecademy Source: http://en.wikipedia.org/w/index.php?oldid=589519710 Contributors: Andrewnpeters, Angelia2041, AppInstruct, Bassplr19, Belasolve, Belmond, Captain Conundrum,
Cases3, Cnwilliams, Codecademy Group, CommonsDelinker, DJ898, Davykamanzi, Drmies, Greatscholar2013, Hellboy81, Imamathwiz, Jdaudier, Ksuraj3, Lawsonstu, MER-C, Magioladitis,
Mahbubur-r-aaman, Mark Arsten, OOZZYTLO, Ohnoitsjamie, Paul7e, Pensativa, Pinethicket, Qwirty, Scrawlspacer, Sigmacharding, Silver hr, SweetTarty, Theopolisme, Tinlash, Titodutta,
Tofushop, Tsatoor, Tubeyak, VitorAzBine, WikiTryHardDieHard, Zadspecial, 33 anonymous edits
JavaScript Source: http://en.wikipedia.org/w/index.php?oldid=589484964 Contributors: 12 Noon, 16r, 1wolfblake, 31stCenturyMatt, 80N, A bit iffy, A.amitkumar, A3 nm, ABCD, ABF,
ANGGUN, Aapo Laitinen, Aaroniba, Abc123456person, Abhishekitmbm, Abhkum, Abody97, Acostin, Adam Hauner, AdamTReineke, AdmN, Aeons, Aerton, Afrobuddy, AgentCDE, Ahda,
Ahoerstemeier, Ahy1, Ajfweb, Aka042, Akronym, AlanUS, Alansohn, AlastairIrvine, Alisha.4m, AlistairMcMillan, Allens, Aman2008, Amaury, Amgc56, Amire80, AmitDeshwar, Ancheta Wis,
Andre Engels, Andreas S., Andrew Levine, AndrewHowse, Andrewrost3241981, Andy Dingley, AndyZ, Andytuba, Anfernyjohnsun, Ankles, Anna512, AnnaFrance, Antimatter15, Antipastor,
Antonio Lopez, Aoi, Aoidh, Apollo1758, AquaGeneral, Arctic Kangaroo, Ardonik, Arjayay, Artemis-Arethusa, Artw, Arvindn, AsceticRose, Asqueella, Astrobloby, Astroman3D, Avijitguharoy,
Avoided, AxelBoldt, Azylber, B0at, B1KWikis, BBL5660, BBilge, BP7865, Bacon and the Sandwich, Badman11, Bamkin, Barek, Beao, Belgarat, Ben-Zin, BenAveling, Bencherlite, Bender235,
Benjaminoakes, Bergie, BernhardBauer, Betax, Bevo, Bill the hairy troll, BinaryWeapon, Bionicseraph, BirdieGalyan, Blobglob, Blonkm, Bob Re-born, Bobcat hokie, Bobdc, Bogtha, Boing
said Zebedee, Bonadea, Boomshadow, Boshomi, Bpeps, Brainyiscool, Bratsche, Brendan Eich, Brenhein, Brettz9, Brian Kendig, Brighterorange, Brilliant trees, Brion VIBBER, Bryan Derksen,
Butch566, Bwickery, CForrester, CO, CQJ, Caiguanhao, Caltas, Calvin 1998, CambridgeBayWeather, CanadianLinuxUser, CanisRufus, Canonical Rush, Cap'n Refsmmat, Capricorn42,
Carewolf, Carey Evans, Cash cab, Cat-five, CecilWard, Cenarium, Centrx, Chacho3x, Chairboy, Chaojoker, Charles Gaudette, Charles Iliya Krempeaux, Charles.2345, CharlotteWebb,
Chazwatson, Chealer, Chester br, Choronzon111, Chris the speller, ChrisGualtieri, Chrisdolan, Chrisman247, Christian75, Chriswiki, Chuq, CiudadanoGlobal, Civilis, Cliciu, Closedmouth,
Clsdennis2007, Cmdrjameson, Coffee, ColinHelvensteijn, ColinJF, Collabi, Combustablejo, Comp.arch, Compfreak7, Conifer, Corti, Cpu111, Crazycomputers, CreamPies, Cronium, Crystallina,
Cslayden, Cst17, Csusbdt, Cwillm2, Cybercobra, Cyfal, Cpey, D.brodale, DARTH SIDIOUS 2, DO'Neil, DTR, DVdm, Damian Yerrick, Damicatz, Danakil, Daniel.Cardenas, Daniel5Ko,
Danielsig89, Dantheman531, Daonguyen95, Darkride, Dasch, DaveKBTC, Daveed84x, Daveydweeb, David Edgar, David Gerard, David Wahler, David Woodward, DavidCary, Davidiad,
Davigoli, Dbabbitt, Dcoetzee, Dee59, Dejansp, Delcnsltmd, Delfuego, Demonking123, Demonkoryu, Den fjttrade ankan, Denbosch, DennisWithem, Deor, Derekleungtszhei, Desiblast,
Dewritech, Dexterv, Dhtml, Dhtmlkitchen, Diannaa, Digita, Discospinster, Dlexc, Dlrohrer2003, DocWatson42, Dodecagon12, Dogoteacher, Don4of4, DonToto, Donbert, Dragon Dave,
Dreadstar, DreamGuy, Dreftymac, Drizzd, Drsquirlz, Dvoudheusden, Dycedarg, DylanYang963, Dysprosia, ESkog, Eagleal, Echo95, Ed Brey, Ed g2s, EdC, EdJohnston, Edgar181, Edknol,
Edward Z. Yang, Ekspiulo, Elefectoborde, Eliashedberg, Eliot1785, Ellmist, Emperorbma, Engelec, Enkauston, Ennajm, Ensign beedrill, Epochbb, Er Komandante, Erich gasboy, Erkcan,
Eskimospy, EvanProdromou, Eventualentropy, Everyking, Ex-dude329.4, Excirial, Execvator, Explicit, Extremecircuitz, Face, Faerycircle, Faisal.akeel, Faizan, Familyguy0108, FatalError,
Fchoong, Felipe1982, Femmina, Ferdaw, Ferdinandojfoo, Fetchcomms, Fistboy, Flager, Florencefc4eva, FootholdTechnology, Forderud, Fraggle81, Frap, Frau Holle, Frecklefoot, Fred Bradstadt,
Fred Gandt, Fredrik, Funandtrvl, Func, Furrykef, Fwerdna, GGShinobi, GTBacchus, Gail, Galwhaa, Gamaliel, Garrycl, Gary King, Gaurav21r, Geary, Geneb1955, Genhuan, Geoffrey,
Georgeryp, Gerbrant, Gerweck, Ghettoblaster, Giftlite, GigAtomixxX, Gilderien, Ginsuloft, Glass Sword, Glen 3B, Gm4, Gogo Dodo, Goplat, Gorpik, Gowr, Gracefool, Graeme Bartlett,
GraemeL, Graham87, Grammarspellchecker, Grayczyk, Greenie2600, Greenminz, Greenrd, Gregersrygg, GregorB, Griba2010, Grika, Groogle, GroovySandwich, Grumpycraig, Grunny, Guaka,
Guitardemon666, Gunuag, Guppyfinsoup, Gurchzilla, Gwernol, Gzabers, HDrake, Hairy Dude, Hannes Hirzel, Happysailor, Hbackman, Hblank, Hcobb, Hello71, Herorev, Hervegirod,
Hgmichna, Hirzel, Hmains, Hongguo, Hoo man, Hosmich, Hu, Hu12, HundoUno, Hydrargyrum, HyperCapitalist, I already forgot, I3enhamin, IRP, Iamjaypatel, Iamyourdoom61, Ian Bailey, Ida
Shaw, Idiotfromia, Ieee8023, Igoldste, Illeoebnbbu, Illicium, IlliterateSage, ImperatorExercitus, Inseeisyou, Insouciance, Intgr, InvertRect, Iridescent, Irish Souffle, Irrbloss, Itpastorn, ItsZippy,
IvanLanin, J.delanoy, JFG, JForget, JVz, Jack Waugh, JackyBrown, Jacobolus, Jagginess, Jake Nelson, Jake Wartenberg, James.abley, Jan1nad, Jarble, Jasper Deng, JavaKid, Javalenok,
Article Sources and Contributors
228
Javalikescript, Jay, Jcubic, Jdaudier, Jec, JeepdaySock, Jemee012, Jeresig, Jerome Charles Potts, Jerryobject, Jesant13, Jesus Presley, Jfd34, Jim McKeeth, Jim1138, JimABC123, Jlerner,
Jmartinsson, Jmccormac, Jnigam33, Jobanjohn, Jodi.a.schneider, Joeytje50, Joffeloff, JohnCD, Johnuniq, JokarMan, JonathanAquino, Joncnunn, Jonhanson, Jor, Jpgordon, Jteplitz602,
JuanIgnacioIglesias, Juanr2099, Juliancolton, Jumbuck, Justie1220, JustinStolle, Jwadeo, Kengaroo, Kenny TM, Kenyon, Kesac, KeybladeSephi, Khaled0147, Kiensvay, Killab14, Kincc, King
of Hearts, Kingpin13, Kinu, Kkm010, Klilidiplomus, KnowledgeOfSelf, Knutkj, Koavf, Kookiethebird, Kozuch, Kravietz, Krenair, Krinkle, Kroum, Kshtiz005, Kungming2, L Kensington,
LMANSH, Lacqui, Laesod, Lambyte, Lanxiazhi, Largoplazo, Lateg, LedgendGamer, Ledgerbob, LeeU, Lego614, Lemon octopus, Leotohill, Lesgles, Lethe, Lexprfuncall, Lhtown, Lianmei,
Linuxerist, LittleBenW, Liujiang, Looie496, Lucas Malor, Lucy75, Lukasblakk, Lukestanley, Lupin, M k amin, MER-C, MFNickster, MIT Trekkie, MVelliste, Mabdul, Macaldo, Machine Elf
1735, Madhusudan N, Magioladitis, Magister Mathematicae, Mahewa, Maian, Malcolmxl5, Mangst, MarK, Marc-Andr Abrock, Marcoxa, MarekPro, Mariano.viola, Mark Renier, Marklbarrett,
Martarius, Martin.kopta, MartinRinehart, Martinhenz, Materialscientist, MatheoDJ, Matifibrahim, Matijap, Matt.forestpath, Matthew Yeager, Matthewrbowker, Maury Markowitz, Maximus Rex,
Mazin07, Mbarone911, McDutchie, McSly, Mcclurmc, Mckoss, Message From Xenu, Mfc, MichaelBillington, Microgoal, Midinastasurazz, Miernik, Mifter, Mikeblas, Mikehtw, Mikenolte,
Mikething, Milefool, MilesAgain, Miller9904, Milly, Mindmatrix, Minesweeper, Minghong, Minna Sora no Shita, Miranda, Misericord, Mistress Selina Kyle, MithrandirAgain, MithunRT, Mjb,
Mkweise, Mmick66, Mnemeson, Mnemonicof, Mob590, ModDJesus, Moeron, Mohammad khallad, Monority, Moonyfruit, Morgansutherland, Mortense, Mouchoir le Souris, Mr. Wheely Guy,
Mr.Clown, MrOllie, Mrt3366, Mrwigg1es, Ms2ger, Muntfish, MusikAnimal, Muzzamo, Mxn, Mypallmall, Mtze, NYKevin, Nako16, Nali4Freedom, NameIsRon, Nanshu, Nanud, Nashleyj,
Nate Silva, Nate879, Nathan2055, Nbarth, Nczempin, Nealcardwell, Nearfar, Necromantiarian, Neilc, Neilerdwien, Neilshermer, NeonMerlin, Neonmario, NerdyScienceDude, Nezticle,
Niceguyedc, Nick8325, NickW557, Nifky?, Nigelj, Nil4you, Nivix, Nixeagle, Njuuton, Nk, Nlu, No Guru, Nol888, Nozomimous, OLENJONNE123, Obiwankenobi, Odaravlaac, Official
Spokesman, Ohnoitsjamie, Oleg Alexandrov, Oli Filth, Oliphaunt, Oliver Pereira, Oneiros, Oobug, Optakeover, Opticyclic, OrangeDog, Oroso, Osoviejo, Oxymoron83, OzFred, Pacoup,
Paercebal, Paradox7798, Patrick, Patrick Corcoran, Paul.irish, Paul1337, Peak, Pearll's sun, Peter L, Peter S., Phantombantam, Pharaoh of the Wizards, Phette23, PhilHibbs, Philcha, PhilipR,
Piano non troppo, Piet Delport, Pinethicket, Piotrus, Plest, PlusMinus, PointedEars, Poor Yorick, Prakshal, Presto8, Prince-of-Life, Prolog, Prosfilaes, Protonk, Psalmstrist cheifprosperity,
Pseliger, Psychcf, Psz, Pyrospirit, Qatter, Quale, Quamaretto, Quantum00, QueenCake, Quinxorin, Qutezuce, R'n'B, R3m0t, RG, RJaguar3, Radagast83, Ramesh Chandra, RandomAct,
RandomStringOfCharacters, Razorx, Rbirkby, Rbucci, Rdsmith4, RealityApologist, Recnilgiarc, Recognizance, RedRollerskate, RedWolf, Reinthal, Reisio, Resoru, RexNL, Rezonansowy, Rfl,
Rgoodermote, Rgqld, Rhobite, Rich Farmbrough, Rich Janis, Rick Block, Rickynails, Ringbang, Rizome, Rjwilmsi, Robbie098, Roberto Cruz, Robmv, Rohitjs, Ronhjones, Rostz, Rp, Rror,
Rschen7754, Rsrikanth05, Rufous, Rufustfirefly, Rursus, Ruud Koot, Rwalker, Ryan Postlethwaite, S-n-ushakov, S.M.Samee, SFC9394, SJP, ST47, Saken kun, Salarmehr, Sam Hocevar, Sam
Korn, Samfosteriam, Samliew, Samuell, Samwr1234, Sander Sde, Sango123, Sapper-fi, Saqib, Sayer55512, Sbmeirow, Sboy365, ScalarField, Scarpy, Sceeuk, Scetoaux, Sciurin, Sclark23,
Scott Martin, Sealican, Seav, Selket, Shalom Yechiel, Shanel, Shantirao, SharkD, Shenme, Shoecream, Shriram, Shuipzv3, Shwaza, SineQ, Singhvivender, Sir Lewk, Sjforman, Skamecrazy123,
Skizzik, SkyWalker, Slamb, Sleepyhead81, Sleventis, Slippyd, SlowByte, Smyth, Snowolf, Snoyes, SomeStranger, Someguyonthestreet, Spalding, SparrowsWing, Spe88, SpeedyGonsales,
Spellmaster, Spiel, Spitfire, SpuriousQ, Srich32977, StaticGull, SteveSims, Steveholt, Steven Walling, Stickguy, StudioFortress, Stuffandthings, SubSeven, Sundstrm, Super Rad, Superm401,
Superslacker87, Suprcel, Surfeited, Susan Davis, SusanLesch, Sushiflinger, Sweecoo, TFOWR, TOReilly, Tabledhote, Tabrez, TakuyaMurata, TarmoK, Tasc, Taw, Tbhotch, Technome,
Tedickey, Template namespace initialisation script, Tgeairn, Thatguyflint, The MoUsY spell-checker, The Nut, The Parting Glass, The Rambling Man, The Thing That Should Not Be, The Wild
Falcon, The wub, TheColdestFusion, TheKMan, TheMuffinWalkers, TheTechFan, Thefuzzballster, Thekaleb, Themasternerd, Theone256, Theopolisme, Thingg, Think outside the box,
ThirdSide, Thron7, Thumperward, Tigerwolf753, Timwi, Titodutta, Tizio, To Fight a Vandal, Tobias Bergemann, Todd Vierling, Toddcs, Tokek, Tom Jenkins, Tophu, Toussaint,
Toyotabedzrock, Tpbradbury, Tpk5010, Transcendence, Trigger hurt, Troels Arvin, Troy.hester, Trustle, Tsemii, Tumblingsky, Tuntable, TwoTwoHello, Txt.file, Tyomitch, Typhoonhurricane,
Tysto, UU, Udittmer, UltimateSupreme, Ultramandk, Uncle G, Urbanus Secundus, Useight, Userask, Utcursch, VKokielov, Vanished user tj4iniosefjoisdkwk4ej5, Vasiliy Faronov, Vegaswikian,
Velella, Versageek, Vertium, Vibhabamba, Vikingurinn, Violetriga, Vishwanatharondekar, Vocaro, VoluntarySlave, Vossfeldt, Vriullop, W0ozy5ho0t3r, Wadsworth, Wael Ellithy, Waldir,
Waldred, Wapcaplet, Wasell, Waterfalls12, Wavelength, Wayward, Webclient101, Website-andrew, Weirdo134, Weka, Wernher, Who, Why Not A Duck, Wickorama, Widefox, Widr,
WikiLaurent, Wikibob, Wikieat, Wikieditoroftoday, Winterst, Wisdom89, Writ Keeper, Wzwz, XP1, Xedret, Xhienne, Xudifsd, YETIURL, Yamakiri, Yamakiri on Firefox, Yaron K.,
Yellowdesk, Ylandra, Ylbissop, Ysangkok, Yuki Konno, Yuval Madar, Zaak, Zakawer, ZakuSage, Zigger, Zin, ZmiLa, Zoicon5, Zojj, Zootm, Zundark, Zven, Zvn, Zzuuzz, 2, u.o .. . uo,
1859 anonymous edits
JavaScript syntax Source: http://en.wikipedia.org/w/index.php?oldid=580872024 Contributors: (jarbarf), Aaaidan, Abdull, Acasson, Albrecht andrzejewski, AnAj, Ancheta Wis, Arthur Rubin,
Ashwanigl, Azede Chukwu, Bakkedal, Beefyt, Betax, Bibescu, Boshomi, Brianfreud, Buzzard2501, Cactus.man, Calmer Waters, Cedar101, ChrisGualtieri, Chutzpan, Clayhalliwell, Cliciu,
Cmcfarland, Comocomocomocomo, Crystallina, Cybercobra, Daclyff, Daira Hopwood, Daniel5Ko, Danyaljj, Davidfstr, Demonkoryu, Denbosch, Dgw, Dipset1991, DonToto, Dougluce,
Dreftymac, Drknkn, Dto, Edward, Egil, ElliottBelardo, Enkidu1947, Erich gasboy, ErikvanB, Evaluist, Exert, Explanator, Extremecircuitz, Ficklephil, FrankSier, Fred Bradstadt, Furrykef,
Gabrielsroka, GavinSharp, Gene91, Gerbrant, Gerweck, Grahamzibar, Grshiplett, Hibou57, Hypher, Imshardy, Incnis Mrsi, Inimino, Insouciance, Int19h, Intrr, J.delanoy, JLaTondre, Jake611987,
James Portman, Javascriptlover2, Jeffz1, Jeremywosborne, Jeshan, Jessemerriman, Jiri Svoboda, John Vandenberg, Jorge Stolfi, Jprupp, KMeyer, Kgwikipedian, Khaledziyaeen, Kickboy, Kku,
Knutkj, Kohtala, Kusunose, Lanxiazhi, Lingwitt, Lucian1900, Luna Santin, LuoShengli, Lycurgus, Machine Elf 1735, Madacs, Maian, Matt.forestpath, Mattjball, Mikeblas, Mild Bill Hiccup,
Misortie, Mmalessa, Mortense, Nate879, Nbarth, NewEnglandYankee, Nhantdn, Nigelj, Not-just-yeti, OverlordQ, Pascal.bazin, Piano non troppo, PleaseStand, Qetuth, Quale, Quamaretto,
QuentinUK, Quilokos, RHaworth, RLG, RVS, Reazal, RobG-bne, Robertmdeluca, Rockower, Rosuav, Rsjaffe, Rufous, Rursus, Ruud Koot, Samkass, Santac311, Sesembeki, Shanes, Shunpiker,
Sleeper220, Takarada, Tgeairn, ThomasStrohmann, Thumperward, Tobias Bergemann, Tony Sidaway, Triul, Tryforceful, Tuntable, VasilievVV, Viebel, Vngin, Wackywace, Walden, Waldir,
Widr, Wizek, Wknight94, Wogga62, X42bn6, XP1, Ymarkovitch, Ynhockey, Youngoat, Zzedar, 357 anonymous edits
JavaScript engine Source: http://en.wikipedia.org/w/index.php?oldid=586802475 Contributors: Silent, ABCRic, ARUNKUMAR P.R, Aavindraa, Asqueella, Bender235, CRGreathouse,
Chrismiceli, Cic, Comp.arch, Digita, Dlrohrer2003, DonToto, Fantasticfears, Fchoong, FedericoMP, Foolishgrunt, Furrykef, Gargaj, Gott wisst, Ikawe.saeem, JLaTondre, Jbishopp, Jeffw57,
Jerryobject, JonHarder, Jondel, Kennyluck, Kesal, LeopardX64, Mabdul, Minghong, Mortense, Oddity-, Pbalduino, Pol098, Rachmaninoff, Radagast83, RehmT, RekishiEJ, Rocketrod1960, Ross
Hill, Sobi3ch, Syp, Waldir, Wickund, William.Aleman, Wislam, XP1, Yellowdesk, 73 anonymous edits
ECMAScript Source: http://en.wikipedia.org/w/index.php?oldid=588971039 Contributors: AJenbo, Adam.J.W.C., Alexf, Angela, Ankles, Arronax50, Artemka373, Ascorbic, Asqueella,
Athaba, Atnan, Baudway, Bawolff, Beefyt, Bevo, Bewildebeast, Blablablob, Bmecoli, Brendan Eich, Brianfreud, Brion VIBBER, CRGreathouse, Caccioly, Campuscodi, CanisRufus,
Catamorphism, Charles Gaudette, Cherkash, Chrisdolan, Compfreak7, Craig Bolon, Crimwusa, Cybercobra, Cybjit, D.i.l., Daira Hopwood, Danakil, David Gerard, Davigoli, De1337, Dekay46,
Derek R Bullamore, DerekMorr, Desplow, Dhulme, Diegovilar, Dkasak, Dleonard, DonToto, Dwheeler, Dysprosia, Earthsound, Echo95, Edknol, Egriffin, Elitedev, Enderandpeter, Engelec,
Erights, EvanProdromou, Evoluzion, FatalError, Figure, Fred Bradstadt, Fred Gandt, FredCK, Fridolin, Func, Furrykef, Gabrielryan2012, Ganjuror, Gatortpk, Ghettoblaster, Gilgamesh, Grayger,
Greatslovakia, Grstain, Gschizas, Gtarget, Gudeldar, Gwern, HappyInGeneral, Hateless, Herorev, Hervegirod, Hexene, Hmains, IGEL, Inka 888, Int19h, Intgr, Iwo2010, Ixfd64, J.Ammon,
JLaTondre, Jacob Poon, Jacobguza, James Foster, JavaScriptKiddie, Jayron32, JeepdaySock, Jerryobject, Jfruh, Jhawkinson, Jimktrains, Jinma, JohnCD, JonHarder, Koavf, Lambyte, Larry V,
Lcchueri, Logixoul, Lucideer, Lus Felipe Braga, Mabdul, Macbookair3140, Maian, Mairi, Martarius, Mcclade, Md84419, Mentifisto, Merix, Mfc, Minghong, Minimac, Mm, Mob590, MoreNet,
MrOllie, Msikma, Mxn, Nasa-verve, Neon white, NickGarvey, PCHS-NJROTC, Peak, Petertorr, Phoenix-forgotten, Pmedema, Pnm, PointedEars, Pol098, Q Chris, Quota, Ramu50, Renku, Rich
Farmbrough, Rwwww, Sam Pointon, Scotopik, ScottSteiner, Sega381, Sherman Thompson, Skierpage, Smably, Smyth, Snakeskincowboy, Snehalnayan, Soc88, Soumyasch, Stassats, Sun
Creator, Sundstrm, Svdb, Swmcd, Synagonism, Tar-Mairon, TedPavlic, The Thing That Should Not Be, The Wild Falcon, ThePCKid, Thorenn, Torc2, Toyotabedzrock,
Travisowenshotmail.com, Trewyy, Troy.hester, Typhoonhurricane, UU, Ufopedia, Ultramandk, Vargenau, Vfbp-geyf, VoluntarySlave, WOSlinker, Waded, Waldir, Wfox, Widefox, XP1,
ZeroOne, Zinjixmaggir, Zundark, 517 anonymous edits
Ajax (programming) Source: http://en.wikipedia.org/w/index.php?oldid=589175188 Contributors: 16r, 1exec1, A brisson, ARC Gritt, Aaron Nitro Danielson, Aaron Schulz, Aashish.59,
Abelson, AbsolutDan, Abulfazl, Academic Challenger, Acather96, Acroterion, Adashiel, AdrianLozano, Af1218, Ahoerstemeier, Ajaxbee, Ajaxdevil, Ajaxtoday, Ajdecandis, Ajfweb, Akadruid,
Akhristov, Akronymn, Alaa.moustafa, AlanUS, Alansohn, Albanaco, Alcalazar, Aleenf1, Aleksandar Susnjar, Alekseenkokirill, Aleph-4, Alex haley89, AlexMorozov, Alexa Foster, AlexaW,
Alexandria, Alexei.white, Alexhop, Alhutch, AlistairMcMillan, Amalthea, AmiDaniel, Amniarix, Amux, Anakin101, Anamanfan, Anand mr, Anarchist42, Anatolpanom, Ancheta Wis, Anderiv,
Andreas Kaufmann, Andykitchen, Angelpeream, Anguis, AniRaptor2001, AnmaFinotera, Anthonyfrey, AntiVan, Api, Apoltix, Archer3, Archfalhwyl, Arminbachmann, Artw, Arvindn, ArwinJ,
Asharism, Ashmoo, Athenasoft, Atif.mod, Aude, AvengeX, Avik21, B0at, BBilge, BCube, BRPXQZME, BTLizard, BankingBum, Barte, Bash, Bbatsell, Beefyt, Beetstra, Before My Ken,
Beland, Ben kenobi 00, Ben-oni, Benatmail.nl, Benawhite, Bender235, Beradrian, Betamod, Bevo, Bewildebeast, Bgpaulus, Bgrayless, Bgupta55, Bhadani, Bigtrick, Bill37212, Billfromhk,
BillyTFried, Bipin Jethwani, Bjhecht, Bkonrad, Blanchardb, Bllix, Blonkm, Bmicomp, Bobet, Bobo192, Bogtha, Bongwarrior, Booch, Booles, Borkweb, Bornhj, Boulevardier, Bovineone,
Brat32, Brclancy111, Breno, Brentashley, Brest, Brian Gunderson, Brightc, Bukharin, C++ Template, CKlunck, CPWinter, CQJ, Cabiria, Cactus.man, Cahtyecruzio.com, Cakeman, Caldini,
Cameltrader, Camilo Sanchez, Campustr, Camw, Can't sleep, clown will eat me, Canadian-Bacon, Canderson7, CapitalR, Capricorn42, Cascadiadudegmail.com, Catrope, Cbuckley, Cdc,
Cedars, Ceejayoz, Ceiton, Cfinazzo, Cfust, Charles.kendrick, CharlesClarkson, CharlotteWebb, Chase me ladies, I'm the Cavalry, Chatmeprise, Chbarts, Chealer, Chelsel, Chinneeb, Chris Kuehl,
Chris the speller, ChrisHibbert, Christian75, Clamum, Closedmouth, CodeAdams, Coder cotton, Color probe, Compfreak7, Computerjoe, Cookiecrook, Coolbeka, Courcelles, Crazycomputers,
Crimsonphire, Crowdes, Csega, Ctkeene, Cybercobra, Cyberhitesh, Cyjpat, Cynical, CzarB, D'Artagnol, D.taveira, DHN, DMacks, DRogers, DVdm, Damian Yerrick, Damicatz, DanBri, DanMS,
Dancter, Dandv, Danicc, Daniel.Cardenas, Danielbullis, Danlevine, Dannymo, Danyuyou, Dar-Ape, DarkFalls, Darth Panda, Darwin226, Dasch, Dave Cohoe, David costanzo, DavidCary,
Davidhorman, Davipo, Dawnseeker2000, Dcaron, Dcflyer, DeadEyeArrow, Deathanatos, Debackerl, Debresser, Decrease789, Dedrick, Deflective, Delfuego, Demi, DepartedUser2, Derivator,
Destynova, Dhartung, Digitxpsp3, Dijxtra, Dina, Diophantus, Dirkbike, Disavian, Discospinster, Dispenser, Dkcreatto, Dlrohrer2003, Dmarquard, DmitryKoterov, Dmwtechnologies, DoSiDo,
DocWatson42, Donald Albury, Donama, Doug Bell, Dougbertram, Dougofborg, Dpaner, Dr. Zaret, Draicone, Drbreznjev, Dream out loud, Dreftymac, Dlugosz, E.au, Eagleal, Ebruchez, Ed g2s,
EdJohnston, Edward, Edward301, Eenu, Egil, Eliz81, Eloi.sanmartin, Eman502, Emre D., Encephalon, Enchanter, Ento, Epbr123, Eric B. and Rakim, Ericross, EstebanF, Euryalus,
EvanProdromou, Evil Monkey, EvocativeIntrigue, Excirial, Execvator, Fadookie, Faelomx, Falling Cloud, FatalError, Faustnh, Fdp, Feezo, Felix.rivas, Fenin, Fennec, Fergalbreen, Ferkelparade,
FiRe, Filemon, FireWeed, Firstauthor, Fmccown, Fosnez, Fox Aquatis, Fram, Franamax, Frangibility, Frap, Freakofnurture, Frecklefoot, Fred Bradstadt, Fred J, Fredrik, Frencheigh, Funnybunny,
Furrygeek, Furrykef, Fusiondeveloper, Fuzzy510, GCarty, Gacpro, Galactor213, Galwhaa, Galzigler, Gamol, Garrett Albright, Gary King, Gblaz, Gham367, Gilliam, Ginsuloft, Glane23, Glen,
Gmauruthi, Gmd588, Gnome of Fury, Gobik, GoingBatty, Golbez, Gpatnude, GraemeL, Graham87, Greenie2600, Greggobridges, GreyCat, Guilherme Blanco, Gurch, Gurubrahma, Gustavb,
Article Sources and Contributors
229
GuyBehindtheGuy, Guyjohnston, Gwernol, Gypsydoctor, H3h, Habap, Hallandnash, Hanberke, Harborsparrow, Harej, Harmil, Harshadoak, Hede2000, Heezy, Hegh, Hellclanner, Henricchen,
Henrikb4, Hervegirod, Hgmichna, Hooloovoo, Hoosierplew, Horatio, Hu12, HumbertoDiogenes, Husky, Huwleslie, HybridBoy, Hypnoticcyst, IByte, ICTlogist, IGod, Ian Moody, Ianneub,
Idearat, Imsoclever, Insanephantom, Insanity Incarnate, Intgr, Irish Souffle, Irnavash, Ironfistofanarchy, Isnow, IvanLanin, Ixfd64, J$, J.delanoy, JFreeman, JLaTondre, JVz, Jabberwoch,
Jacecole, Jacobolus, Jahleeldaruis, Jainvineet, James Skarzinskas, Jamesinderbyshire, Jancikotuc, Jarchitect, Jareha, Jasongaylord, Jaspsoft, Jatkins, JavaScriptKiddie, Jay Gatsby, Jcw69, Jdthood,
Jebba, Jeet020, Jeffmcfarland, Jeffq, Jeffrey O. Gustafson, Jemee012, Jemptymethod, Jepc, Jerryobject, Jesdisciple, Jesset77, Jesusjonez, Jevon, Jim1138, JimD, JimR, Jklin, Jlbeezer, Jmabel,
Jmlk17, JoDiamonds, JoanneB, Jobanjohn, JoeWalker, Johayek, John Mark Williams, John Seward, JohnManuel, Johndci, Johndrinkwater, Jonathanrcoxhead, Jonkerz, Jonovision, Josenaves,
Josh-Levinieee.org, Joshf, Jossi, Jouk pleiter, Journeyman, Jovrtn, Jppaul, Jriffel, Julyscripter, Junky, Jupition, Justavo, Jutiphan, K.lee, KHaskell, KJK::Hyperion, KTyson, Kafziel, Kamal006,
Karlthegreat, Kartano, Katieh5584, Kaylanimis, Kel-nage, Kelly Martin, Kelner, Kenyon, Keppx0r, Kevin, Kevin Baas, KevinLocker, Khaderv, Khadlock, Khakbaz, Khakman, Khalid hassani,
KiaThr, Kiand, Killiondude, Kingpin13, Kirils, Kithplana, Kjd, Kks krishna, Kku, Klimpong, Klutzy, Kmccoy, Knut, Knutux, Koavf, Kompere, Korg, Kovyrin, Kozuch, Kwamikagami, L
Kensington, LOL, Laksono, Largoplazo, Latrippi, Leaf of Silver, Leafyplant, Leandro Cardoso, LeeU, Leif, LeonardoGregianin, Lianmei, Lightdarkness, Lightmouse, Lindsay-mclennan,
Ling.Nut, LinguistAtLarge, Lishugo, Logain2006, Lollol7969, Loren.wilton, Luk, Luna Santin, LunaticBeatnik, M. B., Jr., M4rk, MC10, MER-C, MK8, MKoltnow, Mabdul, Mac, Macaldo,
Mahemoff, Majid khonji, MajykHands, Makyz, Mandarax, Manop, Maoj-jb, Marc.GZR, Marcus Qwertyus, MarkSweep, Markdidj, Markmarucot, Marktmilligan, Marky1124, Marty Pauley,
Master Of Ninja, MasterXC, Materialscientist, Mattd, Matthewpun, Mauri1980, Maxmaxb, Mboverload, Mdchachi, Mean as custard, Mehraj, MeirM, Melah Hashamaim, Mendaliv, Mervyn, Mg
cristi, Michael Frind, Michael Slone, MichaelBillington, MichaelMaggs, MightyWarrior, Mikeblas, Mikus, Milefool, Miller9904, Milnivri, Mindmatrix, Minghong, Mini-Geek, Minimac,
Minimac's Clone, Mistsrider, Mixx941, Mknouse, Mlemos, Mohanrl, Mohnsonj, Monotonehell, Moonside, Moralis, Moreschi, Mpeachey, Mr Minchin, Mr buick, Mr datawolf, MrCalifornia,
MrMoran, MrOllie, Mrberryman, Mschel, MusikAnimal, Muthuveerappan, Mxl, Myanw, Mysid, NHRHS2010, NSR, Nakakapagpabagabag, Nakkeeran, Nako16, Nathan Johnson, NathanBeach,
NawlinWiki, Neilrieck, Nescio, NiceGuyAlberto, Nickmjohnson, Nickmurdoch, Nickshanks, Nigelj, Nihonjoe, Nitinshah23, Nkatsaras, Norm mit, Notinasnaid, Nova77, Nurg, Oazabir, Oben,
Oblivious, Odinjobs, Ohnoitsjamie, Okgoood, Olego, Oli Filth, Omicronpersei8, One Random Fellow, Onkarshinde, Opelio, Orchid Righteous, Orioane, Ornil, Orrc, Osbus, Ost316,
OwenBlacker, OwenX, Oxymoron83, PB0305, Palfrey, Pathoschild, Patrick, Paul August, PaulHoadley, Pavel Vozenilek, Payrard, Pctopp, Pegasus1138, Pentapenguin, Perfecto, Peter Delmonte,
Peter McGinley, Petr.adamek, Petrb, Pgan002, Pgk, Phanuruch8555, Pharos, Philip Trueman, PhilipO, PhilipZalesak, Phuntism, Pickatutorial, Pietdesomere, Pikiwyn, Pilotguy, Pimlottc,
Pingveno, Piovertwo, Pip2andahalf, Pjdonnelly, Pkchan, Pkrecker, Plyd, Pmsyyz, Pne, PointedEars, Porqin, Praveen bv, PrimeCupEevee, Printer222, PrometheeFeu, PseudoSudo, Pwt-wsu-mg,
Pyrowolf, Qebafhzn, Quaternionic, QubitOtaku, Quendus, Quill18, Quilokos, Quinsareth, Qviri, Qwayzer, Qxz, RHJesusFreak40, RMHED, Raanoo, Rabidpoobear, Radiier, RainerBlome,
Ramu50, RandalSchwartz, Raven4x4x, Rawling, Rayngwf, RazorICE, Rcronk, Reallyjoel, Red Director, RedWolf, Redvers, Reedbeta, Reinthal, Reisio, Remember the dot, Renmiri, Renwique,
RexNL, Rfernand, Rgarcia09, Rhobite, RicardoAmador, Rich Farmbrough, Rich Janis, Rick Block, RidinHood25, Riki, Riley Huntley, Rklawton, Rob cowie, RobGonda, Robert Stephen Spiegel,
Robferrer, Robmanson, Robomaeyhem, Rocastelo, Rohitjs, Roleplayer, Roman clef, Ronchristie, Ronz, Rookstar, Rosdec, Rosswnelson, Roux, RoyLeban, Royboycrashfan, Rpawlitzek,
Rpenner, Rrjanbiah, Rs564, Rsocol, Rubencepeda, Rufous, Ruud Koot, Rydel, Ryulong, SCPearson, SGBailey, SMcCandlish, Safety Cap, Salilkaul, SaltyDawg, Sam Korn, SamJohnston,
Samdeskin, Samyem, SanDiegoPolitico, Sarefo, Satheeaseelan, Saturday, Sauwiki, Saxifrage, Sayden, Sciurin, SeanR, Seanhan, SeattleJazzMan, Seba5618, Seefeld, Seriouswikifan, Shadow1,
Shanes, Sheiko, Shenme, Shii, Shinmawa, Shon, Shwaza, Siddhartha 90, Simetrical, Simishag, SimonP, Singularity, Sintaku, Sir Vicious, Siroxo, Skarebo, Skeejay, Skizzik, Skomorokh,
Slashme, Sleepnomore, Sleepyhead81, Sleske, Smpdawg, Snaxe920, Snezzy, SnowFire, Soeren1611, Softguyus, Softtest123, Sophrosune, Soumyasch, SpaceFlight89, Spankman, Spayrard,
Spookfish, Sprocketonline, SpuriousQ, SqueakBox, Srl, Ssergi, Sshoberi, Stadler, Stajler, Starwiz, Stefanostraus, Stephen B Streater, Stephen Compall, StephenHill, Stmontgomery, Storkk,
StormTide, Stuc1, StuffOfInterest, Sugarskane, Sunzongbao2007, SuperFatBan, Supernerd, Susen2008, Suwa, Swarve, Swatjester, Switchercat, Swordofsaya, Syberguru, Syndicate,
SynonymousEconomist, Syrthiss, TKGerson, TXiKi, Taboca, Tagus, Taka, Takman187, Talrias, Tangotango, Tanthalas39, Tarun2701, Tawker, Tbhotch, TedGoddard, TehSpud, Tempshill,
Tentinator, Teryx, TexMurphy, Thane, The Illusive Man, The Real Walrus, The Thing That Should Not Be, The wub, TheKMan, TheRaytracer, Thebes7, Thedjatclubrock, Therearenospoons,
Tholly, Thorenn, Throwaway85, Thruston, Thryduulf, Thumperward, Thunderboltz, ThylekShran, Tibbetts2c, TigerShark, Tiggerjay, Tigrisek, TimmmmCam, Timneu22, Tippler, Tnicky,
Tohd8BohaithuGh1, Tom Jenkins, Tom Sponheim, Tomkarlo, Tomwood0, Tomyeh, Tooto, Toveling, Trails, TravisCross, Tregoweth, TreyHarris, Triona, Trogera, Tudorol, Tuntable,
TurionTzukosson, Tuvok77, TwoTwoHello, Tyler2222, Typofixer76, Tzarius, UU, Uberdude85, Ugictox, UkPaolo, Umapathy, Uncle Milty, Unclejedd, Uniwalk, Unschool, Usquared, Vaab,
Vanished user 99034jfoiasjq2oirhsf3, Vary, Velociostrich, Versageek, VictorAnyakin, Vigna, Virexmachina, Viridian, Voorhies, Vriullop, Vunutus, Wadems, Wafulz, Waggers, Wagnermr14,
Waltercruz, Warren, Wayward, Wengier, Weregerbil, Westonmr, Weylinp, Wikiajax, Wikibofh, Wikilinus, Willemo, Williamlund, Wimt, Windharp, Winhunter, WiniWidiWici, Wisden17, Wm,
Wnorris, Woogee, Woohookitty, Wpbasti, Wwwwolf, XGraham, XP1, Xamian, Xelgen, Xephero, Xmnemonic, Xmuskrat, Xpclient, Yamamoto Ichiro, Ycherkashin, Ymendel, Ynod, Yooden,
Yoric, Yunshui, Zad68, Zanejin, Zazou, Zealotgi, ZeikJT, Zelchenko, Zondor, Zr40, Zscout370, Zundark, Zvika, Zvn, Zwilson, Zzedar, Zzuuzz, Zzyzx11, 4353 anonymous edits
XMLHttpRequest Source: http://en.wikipedia.org/w/index.php?oldid=581658298 Contributors: .:Ajvol:., A3r0, Aditsu, Ahoerstemeier, Alaa.moustafa, Alansohn, Alcalazar, Alex Smotrov,
Alexandre Martins, Algae, Alphachimp, Anirvan, Apv, Arjun G. Menon, Artw, Bezenek, Blackdenimgumby, BobBagwill, Bobo192, Bovineone, CDV, Caged.danimal, CambridgeBayWeather,
CanisRufus, CapitalR, Catamorphism, Chealer, Christopherlin, Cic, Coffeeflower, DJ Rubbie, DMcMPO11AAUK, Damicatz, Daniel.Cardenas, Dantman, Darklama, Dbaron, Delfuego, Digita,
Dionyziz, Dirus, Discospinster, Djkenzie, Downfromzero, Dpant, Drano, Dsnell923, Ej0c, Electricmuffin11, Eloi.sanmartin, Enyo, EriF, Eric B. and Rakim, Eve Teschlemacher, Fabiob,
FatalError, Filipvr, Fram, Frap, Fred Bradstadt, Fromz, Furrykef, Gabrielsroka, Gerbrant, Gilgamesh, Gilliam, Gimboid13, GraemeL, GregorB, Guy Macon, Hariva, Haza-w, Hondavice, Husky,
Ignacio Javier Igjav, Imandrewa, Isnow, J.delanoy, Jaray, Javalenok, Javawizard, Jaw959, Jdowland, Jeroldan, Jmabel, John Vandenberg, JonDePlume, Jriffel, Keelypavan, KenricAshe, Khalid
hassani, Koavf, Kozuch, Krellis, Kugland, Lee J Haywood, LemonairePaides, Liberatus, Lindsay-mclennan, Locos epraix, Lupin, MC10, Mabdul, Macaldo, Maian, Mamund, Manop,
Marktmilligan, Marskind, Martin Hampl, Martnym, Masonbarge, Materialscientist, MattGiuca, Me and, Metaeducation, MichaelHausenblas, Mindmatrix, Minghong, Mnot, Molily, MoreNet,
Mortense, Mrcs, Mu Mind, Nickshanks, Nigelj, Nightstallion, Niven, Nkour, Norm mit, Oeln, Ohgyun Ahn, Pak1standby, Pcj, Pctopp, Peterl, Ph0t0phobic, Phloopy, Phorgan1, Piet Delport,
Pjakubo86, Pjdonnelly, PointedEars, Proton.mule, Quilokos, Qwerty0, R'n'B, Rabimba, Rafaec, Rajkeaner, Ramu50, Ranjithsutari, RedWolf, Reisio, Remember the dot, Renku, RidinHood25,
Ringbang, Rjwilmsi, RobWu, Robert p levy, Rohan Jayasekera, Rsrikanth05, Rufous, Ryan Norton, SalM, Schmloof, Sega381, Shamesspwns, Simon Lieschke, SineSwiper, Skeejay, Slant,
Sleepyhead81, Spankman, Speight, Stephen Morley, Suruena, SvartMan, Taka, TakuyaMurata, Tamlyn, Teiladnam, The Anome, The Fish, TheJosh, Thedangerouskitchen, Thelazyleo,
Theoretick, Thumperward, Timc, Timeroot, Timwi, Tolmaion, Twsx, Urkle0, Uzume, Vberger, VictorAnyakin, Vladogr, Wengier, White 720, WhiteHatLurker, Widgetguy, WikHead,
WikiLaurent, XP1, Xoneca, Yoderj, Zippedmartin, Zoef1234, Zvn, Zzuuzz, K, 428 anonymous edits
Brendan Eich Source: http://en.wikipedia.org/w/index.php?oldid=586708774 Contributors: AVRS, Aaron Schulz, AcidJazzed, Alik Kirillovich, AlistairMcMillan, Amire80, Artichoker,
Avicennasis, Bagodonuts, Brendan Eich, Callanecc, ChrisEich, Ciphergoth, Crownabhisek, Cybercobra, Dalisays, David Gerard, Davidwboswell, Deflective, Denisarona, Discospinster, DonToto,
DoriSmith, Dreamyshade, Dyl, Eliz81, FerranJorba, FlyingToaster, Giuliocc, GregorB, Hailey C. Shannon, Hervegirod, Howcome, Hu12, J JMesserly, Jamelan, Jamesmorrison, Jim1138, Jj137,
Jlin, Joy, Jpbowen, Jschuur, Katieh5584, Kwamikagami, Lopifalko, Lzur, Mabdul, Mariuskempe, Marketdiamond, MartinMichlmayr, Minghong, Mms, Mortense, Neurolysis, NicatronTg,
Omnipaedista, Ottawahitech, Paul1337, Peak, Plesner, Pmsyyz, Renku, Richmeister, Robertvan1, RogDel, SMC, Scopecreep, Sealican, SirFozzie, Srbauer, Stemonitis, Surfingslovak,
SusanLesch, Tbird20d, Thetrek, Thumperward, Toussaint, Ugur Basak, Underthefreeway, V0rt3x, Vlad, Waacstats, Widefox, Wookiepedian, Yubal, Zarkonnen, Zebra zebra01, Hrate, 83
anonymous edits
Douglas Crockford Source: http://en.wikipedia.org/w/index.php?oldid=589409995 Contributors: Amalas, Anirvan, Bill william compton, Bobblehead, Bunnyhop11, Compfreak7, Denny,
DonToto, Dreftymac, Falcor84, Finlay McWalter, Gaurav21r, I9o0q1, Jackmcbarn, Jarble, Javalangstring, Javaweb, JeepdaySock, Jerryobject, Jonik, Josve05a, Kovianyo, Lopifalko, MantisEars,
Martarius, Mika1h, Mikeleeorg, Nadirss, Naval dudhoria, Pmaccabe, Quercus basaseachicensis, Renku, Rfl, Souphanousinphone, Toussaint, Waldir, XP1, Yaron K., Ylee, Zvn, 34 anonymous
edits
Web application Source: http://en.wikipedia.org/w/index.php?oldid=586879372 Contributors: -Barry-, 16r, Adamhauner, Adaxl, Aegicen, Alansohn, Alriode, Amcfreely, Amy2chow, Andy
Dingley, Anonymous editor, Apheonix666, Aplixus, ArtBarstow, Artw, Asmitford, Avinashm, Ayush29feb, Barek, Betamod, Bobbias, Bobo192, Boonebytes, Bornslippy, Brainix, Brainyiscool,
Brockert, Brunnock, Bvlax2005, CanadianLinuxUser, Captain Conundrum, Casbah, CesarB, Chaojoker, Chip Zero, Chowbok, ChrisLoosley, Christian75, Christopherlin, Colin.carle,
Cometstyles, CommonsDelinker, Computerjoe, Coolcaesar, Cphi, Cursedbuddy, DPryden, DRogers, DVD R W, Damir Zakiev, Ddwebguru, Deineka, Delfuego, Denimadept, Denisarona, Diego
Moya, Dj thegreat, Dnas, Dogloverxyz, Dtobey, Ebarbero, EdgeOfEpsilon, Edward, ElKevbo, ElTyrant, Eleclion, Elsendero, Enric Naval, Ercrt, Erianna, Erik Raven, Evildeathmath, Falcon
Kirtaran, Falcon8765, Fieldday-sunday, Flyer22, Freshraisin, Fubar Obfusco, GMcGath, GateKeeper, Gerbolya, Glane23, Glen, Gogo Dodo, GoingBatty, Gotocloud, GraemeL, Greenstone1,
Haakon, HamYoyo, Happysailor, Harryboyles, Hemanshu, Hendry, Hoo man, HowardBGolden, Hu12, Hult041956, Hunghim, Hybrazil, I dream of horses, Insanity Incarnate, InverseHypercube,
Iolar, Irvinfly, IvanLanin, JCLately, JDCMAN, JLaTondre, Jarble, Jatkins, JeremyA, JimmyOrangeSeed, Jmabel, Jnarvey, John Vandenberg, Jojalozzo, JonHarder, Joseph Solis in Australia,
Jovianeye, Joy, Jreiss186, Juliashapiro, Jutiphan, Jvkiet, Karthickkumar.aj, Kbh3rd, Kevin, Khalid hassani, King Lopez, Klodolph, KnowBuddy, Komarov om, Kozuch, Krauss, Leehongfay,
LeilaLinux, Lemon-s, Leszek Janczuk, Liempt, LodeRunner, Lucanos, MARKELLOS, Macaldo, Magioladitis, MainFrame, Manintights28, Mark Kilby, Mark Renier, Matt Schwartz, Matticus78,
Mauro Bieg, Maxeboy, Mboverload, Mcnattyp, Mcwhittemore, Meaghan, Melab-1, Menoberlin, Mindmatrix, Minghong, Mingyzhang, MithrandirAgain, Mlindstr, Mortense, MrOllie,
Mumia-w-18, Muthudesigner, N5iln, Narendra Sisodiya, Nddstudent, Neelix, Neon white, Njan, Nozomimous, NurAzije, Nurg, Nusoftware, Nuujinn, Object404, Octahedron80, Ohnoitsjamie,
Oicumayberight, Ojw, Ompeag, Onepd, PGWG, Pippijn, Pkchan, Pnm, Poldi, Postdlf, Qgil, RJHall, Rafaelluik, Rasmus Faber, Raul Durand, Raznice, RexNL, RitaRosen, Ritjais, Robbyfinstein,
Robertandy, Rocketrod1960, Rogerd, Rsaesha, S3Indiana, SF007, Sagaciousuk, SamJohnston, Satellizer, Scotty 8776, Sebastianpy, Sepersann, Shadowjams, Shees570, Shell Kinney,
Sleepyhead81, Snarius, SpuriousQ, SquidSK, Starionwolf, Stephan Leeds, Stephen B Streater, Stephenb, Stepheno, SteveLoughran, Steven Walling, Stevietheman, Swerdnaneb, TYelliot,
Tallcguy, Techi2ee, Terrillja, The Thing That Should Not Be, The.megapode, Thumperward, Tide rolls, Timneu22, Tmmm, TommyG, Torchwoodwho, Tqbf, Trusilver, Tverbeek, UBeR,
Unixxx, Unyoyega, Van der Hoorn, Veinor, Versageek, Vespristiano, Vinhtantran, Viridian, Vivik belly, WaltBusterkeys, WalterGR, Waqas1987, Wickethewok, Widr, Wikialoft, William Avery,
Windharp, Wwheeler, Yamamoto Ichiro, YellowLlama, Zad68, Zimbabwer, Zoicon5, Zumbo, Zzuuzz, 515 anonymous edits
Single-page application Source: http://en.wikipedia.org/w/index.php?oldid=589584483 Contributors: Abdull, Ashishanand25, Asmitford, Bfreis, Colapeninsula, Ehn, Epbr123, Gilliam, Gogo
Dodo, Haaninjo, Ilmari Karonen, JDubman, JamesBWatson, Jemptymethod, Jmarranz, John of Reading, Johnpapa, Johnwlantz, K0zka, LilHelpa, Loourr, Mahemoff, Malcolma, Mcewan,
Article Sources and Contributors
230
Mogism, Nateps, Pageboy za, PaulHammant, PerLundberg, Philcockfield, R. S. Shaw, RHaworth, Rjwilmsi, RobertGloverJr, Snori, Spoonriver, Strumpflohner, Stw, Thron7, Tom Morris,
Ubershmekel, Weitzhandler, WikiZond, Yedingding, 76 anonymous edits
Uniform resource identifier Source: http://en.wikipedia.org/w/index.php?oldid=585613412 Contributors: .:Ajvol:., Activex800, Ahruman, Anwar saadat, Ashleyleia, Avsa, Bamgooly, Beland,
Beyond My Ken, Bezenek, Bgwhite, BlueCaper, Boud, Calorus, CanadianLinuxUser, Cgomery, Chealer, Cishcurn, Colmjude, Conversion script, Cwitty, Cybercobra, Damian Yerrick, David
Wahler, Decrease789, Dfoxvog, Dickguertin, Discospinster, Domlowe, Douglas Milnes, DrFree, Drunkasian, E smith2000, Elhalconingles, Eric.dane, FatalError, Folajimi, FordGT90Concept,
Fschoenm, Furrykef, Galaxiaad, Galoubet, Gamliel Fishkin, Gary King, Ghettoblaster, Giraffedata, Golbez, GreenReaper, H2g2bob, HenryLi, Hrvoje Simic, Hunyadym, IMSoP, Iain.dalton,
Iatwork, Ida Shaw, Idiotfromia, Ilham151096, J. Finkelstein, JTN, JVz, Jeremy Visser, Jerome Charles Potts, JimKleck, Jiri Svoboda, Johnuniq, Josephw, Joshleitzel, Jpfagerback, JustAGal,
Justarandomgeek, Justus87, Karada, Kbdank71, Kbrose, Kdammers, Khym Chanur, Kr-val, Krauss, Krellis, Kungfuadam, Kvng, Lantay77, Lastorset, Leobard, Levin, LivingShadow, Lotje,
Lysdexia, Lysy, MER-C, Mabdul, Mac, MacTed, Mamling, MarXidad, Martarius, Materialscientist, Mattmm, McGeddon, Mdd, Mike Cline, Mike Rosoft, Mindmatrix, Minghong, Mjb, Mjec,
Mjm24970, Mormegil, MrChrisRodriguez, Mysid, Naresh.jirawal, Natryall, Naudefj, Nickcarr, Nicolas1981, Nigelj, Northgrove, NotInventedHere, Nsda, Nubiatech, Nurg, Odigity, Odoncaoa,
Ohnoitsjamie, Omicronpersei8, Orioane, Ospalh, Parabolis, Pedant17, Personalmountains, PinkAmpersand, Pinkadelica, Pyroguy, Qwerty0, Raime, Raven4x4x, RedWolf, Reinthal, Reschke,
Rich Farmbrough, Richard asr, Richmeister, Rjgodoy, Robert Mijakovi, Robertcathles, S7evyn, SPUI, Samsara, Scott Martin, Seren-dipper, Shanes, SimonP, Sleske, SnappingTurtle,
SnowCone314159, Southen, Spikey, Stephan Leeds, Strike Eagle, Surachit, SusanLesch, Syndicate, TakuyaMurata, Tarikash, Tassedethe, Territory, TerryE, The Thing That Should Not Be,
Thorncrag, Thorwald, Tiggerjay, Timneu22, Tomaxer, Tony1, Tooki, Trudelle, Ultimatewisdom, Universimmedia, UrsaFoot, Vegaswikian, Vespristiano, VictorAnyakin, Vingo132, Vinifera7,
Violetriga, WN:ichibantel, WR:ichibantel, Wagino 20100516, Wapcaplet, Wavelength, Wereon, Wildqat, WilliamH, WojPob, Zearin, Zodon, Zundark, 255 anonymous edits
JSON Source: http://en.wikipedia.org/w/index.php?oldid=589584306 Contributors: 121a0012, 16r, 1ForTheMoney, 90, A bit iffy, A1kmm, Aandersonamherst.edu, Achowat, AdeBarkah,
Agoode, AlanUS, Alarob, Alex rosenberg35, Amire80, Amux, Andonic, Andrs Santiago Prez-Bergquist, Andyparkins, Anirudh4444, Anna Lincoln, AnonMoos, Aprock, Ariel., AsceticRose,
Ashawley, Austin512, AxelBoldt, Azbarcea, Balrog, Beefyt, Beland, Betacommand, Binris, Bongdentoiac, Booles, Bosik GN, Brettz9, Brianhe, Brycen, Bspahh, Bunnyhop11, CHForsyth,
CWii, CapitalR, Cassivs, Cems2, Charles Iliya Krempeaux, Chenopodiaceous, Chowbok, Chris Q, Chrisdew, Christopherlin, ClemRutter, Colinmcc, Cowtowncoder, Cst17, Cybercobra,
Cyberhitesh, D6, Daemonicky, Dah31, Dainis, Damian Yerrick, Dan Bolser, Daniel.Cardenas, DanilaKutkevich, David spector, Debloper, Deflective, Delfuego, Demisone, Dfinch, Dgies, Digita,
Digitalme, Dispenser, Dmeranda, Dmpatierno, Dodiad, Doekman, DonToto, Doniago, Doug4, DouglasCrockford, Dreftymac, Drrwebber, Dtgriscom, Durrantm, Dylnuge, Easyas12c, Ebraminio,
Ebruchez, EdC, Elharo, EncMstr, Falcon9x5, Fangfufu, FatalError, Frap, Frenchwhale, Furrykef, F, Gabrielsroka, Gamol, Genesis, Gerbrant, Getify, Ghettoblaster, GoingBatty, Gorgalore,
Gosub, Gslin, Gutza, HMSSolent, Habbie, Hammer1980, Happysailor, Hdt83, Heimy, Hfmanson, Hg00000, Hmahajan, Hogstrom, Hu12, Hughcharlesparker, Hydrargyrum, IGEL, IMSoP, Ian
Moody, Ijabz, Ilovenagpur, Inimino, IvanLanin, Izhaki, Ifai, Jaap, Jack Greenmaven, Jacobolus, Jainvineet, JamesNK, Jameswiltshire, Jarble, Jarekadam, Jason.grossman, Javy tahu, Jcgoble3,
Jdthood, Jefe2000, Jeffreymcmanus, Jeltz, Jerome Charles Potts, Jesus Presley, Jhswalwell, Jleedev, Joe Schmedley, Joe Sewell, John Bentley, John Millikin, Johnirving2001, Johnuniq, Jonkerz,
Jose Icaza, Joshsteiner, Joswig, Julesd, Jvangorp, Jvenema, Kadnan, Kakurady, Kephir, Kingboyk, Kmote, Koavf, Konklone, Kragen, Krellis, Krinkle, Kromped, Ksn, Kuteni, Kwamikagami,
Larsnostdal, Lauciusa, Levin, Lindsay-mclennan, Lino Mastrodomenico, Listmeister, Lockoom, Logan, Logikl dk, Lovelyme00, MC10, MEFlora, MER-C, Maian, Marcoshz, Markpeak,
Martin.sweeney, MartinSpacek, Martnym, Maxime.Debosschere, Mcld, Mecanismo, Mets501, Mga, Mgamer gd, MichaelRWolf, Mifter, MiguelMunoz, Mikhail Ryazanov, Mindmatrix,
Minghong, Mister pink2, MitchellShnier, Mjb, Mjohnjoseph, Mjs, Mount Flatten, MrForms, MrOllie, Mralokkp, Nagle, Nasa-verve, Natkeeran, Nealmcb, Neinsun, Nickj, Nigelj, NintendoFan,
Nneuman, Octahedron80, Ohnoitsjamie, Oliver.hessling, Ootachi, Otterfan, OwenBlacker, P.srikanta, Panzi, Paranomia, Pctopp, Pdameasap, Peak, Pediddle, Penagate, Peterdjones, Peterl, Peu,
Pgan002, Phistuck, Phlegat, Phoe6, Pimlottc, Plperez, Pne, Pnm, Polyethene, Pot, Potatoswatter, Prashanthjoshi, Pratyya Ghosh, Psifi, Rafiahmad, Rchandra, RedWolf, RedWordSmith, Reedy,
Renku, RenniePet, Rezonansowy, Rfl, RicJohnsonIII, Rich Farmbrough, RichMorin, Richtaur, Rjwilmsi, Robmanson, Robwlakes, RockMFR, Roesser, RokerHRO, RolandYoung, Ronz, Rory
O'Kane, RossPatterson, RuudVisser, Ryan Kaldari, SFK2, SMcCandlish, SQL, Sae1962, SaltyDawg, SamB, Sanspeur, Sapper-fi, Saxifrage, Scientus, Senorkaj, Sevela.p, Shinkolobwe,
Simetrical, SimpleBeep, SixSix, Skaffman, Skierpage, Sleepyhead81, Snori, Speed.arg, Ssd, Steffan Cline, SunKing2, Superm401, Superp, Supersizefriesjj, Svippong, Syberguru, Tagith,
TakuyaMurata, Termininja, Tesi1700, The Earwig, Theoretick, ThereFOUR, Thomasfrank.se, Thumperward, Tianrb, Tjholowaychuk, Tlane, Tlroche, Tobias Bergemann, Todd Vierling, Tom
W.M., Tommy2010, Tonyhansen, Tothwolf, Transcendence, Tronic2, Tschubring, Tsuvo, Ttennebkram, Tuankiet65, Ultrarob, Unfletch, Universalss, Urhixidur, Verdy p, VictorPorton,
Vishalmamania, Vlad, Vladimir Lapacek, Vocaro, W Nowicki, Washi, Wevah, Wezkoh, Whorvath, Widr, WildWeazel, Wineaficionado, Wjcw, Wrs1864, Wtmitchell, Yellowdesk, Zearin,
Ztolstoy, Zziffle, var Arnfjr Bjarmason, 824 anonymous edits
HTML5 Source: http://en.wikipedia.org/w/index.php?oldid=589586454 Contributors: 12cool725, 1exec1, AVRS, AWiersch, Abhik0904, Achinikh, Adagio67, Adila1360, Adpete, Adrianwn,
Agon Avdimetaj, Alex Chamberlain, Alex.muller, Alexbrn, Alexius08, Alexjohnc3, AllenZh, AmAnisa, Anbu121, Andrejbuday, Andres Agudelo, Andy Dingley, Angrytoast, Ankitasdeveloper,
Annevk, Annieh129, Anomalocaris, Anon1345, Anym, AoV2, Aoidh, Arjunpsd, Armando, Artichoker, Artw, Athaba, Aubray1741, Aurora1900, Azuris, Bandito4u, Bangsanegara, Barkermn01,
Barry Fruitman, Bcxfu75k, Beland, Beleavali, Ben Ben, BenJWoodcroft, Bender235, Best Dog Ever, Bevo, Bhny, BiT, BillyPreset, Binksternet, Biruitorul, Bitbit, Blaisorblade, Bllix,
Bluewind25, Bngsudheer, Bomazi, Bongwarrior, BradNeuberg, Brianpeiris, Brianski, Brijeshgosai, CRGreathouse, Canceo, Candace Gillhoolley, Canley, Captbalbo, Caspertheghost, Causa sui,
Centrx, Cfust, ChPietsch, Chealer, Chelentano, Chikiliver, Chris the speller, Ciantic, Clairvoyant walrus, CloudNine, CodeCaster, Coffee, Cogiati, Colejohnson66, CommonsDelinker, Comp.arch,
Compfreak7, Corn cheese, CortlandKlein, Crissov, Crysb, Curtmcd, CyberSkull, Cybercobra, D'oh, DARTH SIDIOUS 2, Danchr, Daniel.Cardenas, Darklilac, Darxus, Data2action, David
Gerard, Davidhorman, Dawn Bard, DePiep, Debloper, Debresser, Decodedlabs, Democraticmacguitarist, Demonkoryu, Deon, Digisus, Doctor Nick, Dog786, Dogru144, DokReggar, Dolphin51,
Domokato, Dr. Elwin Ransom, DrFrench, Dvdjns234, Ed Brey, Eggsyntax, Emurphy42, Erikdw, Eutelsat, Eville84, Extra999, Eyewax, Famous anus, FatalError, Favonian, Fenring,
Fijiwebdesign, Filemon, Fitoschido, FleetCommand, Flohsuchtliebe, Flying sheep, Foonarres, FreedomCultist, Fudoreaper, Funandtrvl, Gabriel2008, Gaia Octavia Agrippa, Gallaecio, Gareth,
Gareth Griffith-Jones, Giftlite, Gilliam, Ginsuloft, Glenn, GoShow, GoingBatty, Gpvos, Graeme Bartlett, Grasshoppa, Grawity, Greedohun, GregU, GregorB, Grosshat, Grshiplett, Gsnedders,
Gyrobo, H3llbringer, Hairy Dude, Hankwang, Happy-melon, Harizotoh9, Hectigo, HelicopterLlama, Henry hedden, HenryLi, Hexene, Hkdobrev, Hnetsec, Hondarox715, Hoo man, Horrabin,
Hsivonen, Html5, Html5cn, Html5cn org, Html5forum, Html5gallery, Hwost, ILeoable, Icedragz, Ignatzmice, Iliev, Indefatigable, Inputdata, It writer, Itpastorn, JHMM13, JHP, JJC1138,
JLKrause, JLaTondre, JWilk, Jackdrogba, Jackfork, Jahoe, Jamesrdf, Jarble, Jasper Deng, Jay, Jengelh, Jenniferreid2012, Jeremy Visser, Jerryobject, Jetrink, Jleedev, John Cline, Johnadowell,
Jonathantneal, Jonsteroo, Jorge.casar, Josve05a, Jrincayc, Julesd, Kalki101, Kankachi1980Kan, KarlDubost, Kasrjoel, Kehtabp, KeithH, Keithjgrant, Kevindeedavis, Kingbean1, Kitsunegami,
Koavf, Kocio, KohanX, Ktpenrose, Kuru, L Kensington, LLarson, Lachlan Hunt, Lawsonstu, Le Sage, Leinad, Leonard glas, Leotohill, Locke Cole, Lopifalko, Luckyz, Lucy75, MC10, MC1302,
MER-C, MZMcBride, Mabdul, Macan55, Macromediax, Madsenfr, Maduskis, MainFrame, Male1979, Mange01, Manop, Marcos canbeiro, MartinRinehart, Materialscientist, Mathian123, Matt
Darby, MattCuts, Mcarrera, Mdagr8, Mdale, Meewam, Melnakeeb, Melonkelon, Meow, Michael Devore, MichaelKohlhase, Mike Rosoft, Mikldt, Mindmatrix, Mistress Selina Kyle, Mizusajt,
Mmj, Mortense, Motherlover2012, MrX, Ms2ger, Nakakapagpabagabag, Nelziq, NerdyNSK, Neustradamus, NewEnglandYankee, Nick UA, NickGarvey, Nickshanks, Nigelj, NikitaVasilev, Nil
Einne, Nnemo, Nogburt, Nopetro, Norman.u.sy, Notetp, Noz92, Nsda, Nthep, Nunojpg, Nyssen, Ohnoitsjamie, Oliphaunt, Oneiros, Onorem, Ontoraul, Oppenheiter, Orange Suede Sofa, Oren
Balaban, OzuYatamutsu, PatrickFisher, Paul Foxworthy, Pauldwaite, Perey, PeterEasthope, Peterdx, Phatom87, Philbayer, Philu, Philwiki, PhnomPencil, Pingveno, Pnm, Pointillist, Ppntori,
Primaryspace, Prohlep, Pwjb, Quatermass, R'n'B, REM888, RPaschotta, RW Marloe, Racklever, Rathigpe, Reisio, RekishiEJ, Reliablesource12345, Repku, Resistor, Rezonansowy, Riki,
Rodmoten, RoyBoy, RoySmith, Rubenreyes, Rubinkumar, Rugops, Runecats, Rursus, Rwxrwxrwx, Sabin4232, Sailee5, Sajid130, SamJohnston, Samdutton, Samuel.G.Mills, Saoshyant,
Saravanakumarc5, Scientus, Scottman1995, ScottyWZ, Sdesalas, Senator2029, Ser Amantio di Nicolao, Shepazu, Shubhamanandcs, Shubhee, Simetrical, SimonEast, Sligocki, SlipperyGun,
Smaines, SmeyHAcker, Smyth, Snakeskincowboy, Snookerman, Sogle, Solarra, SoledadKabocha, Songcycle, Sonicdrewdriver, SoopahMan, Spanglej, Speedok, Spencerk, Spidermario,
SqueakBox, Srinivasasha, Station1, Stemonitis, Stephen B Streater, StevenDH, Subversive.sound, Sugarfish, Svick, Swapnil raja, Takimata, Tart2000, TechGizmo, Techdude3331, Tenebrae,
Tentonbricks, Teotocopulos, The Anome, TheSirLachlan, Thue, Thumperward, Thyako, TimothyJPitt, Titomuerte, Tlaresch, Tms, TobyDZ, Todd Vierling, Tomchen1989, TommmL,
Tommy2010, TorayL, Traxer, Tremolo, Turbohans, Ubernostrum, Ultimatewisdom, Unicomp21, Urashimataro, Uusijani, Vald, Vdavid2, Vicsar, Victorgno, Vivekanandanpdy, Voidxor, Volox,
WOFall, Webmaren, Widefox, Wiikipedian, Wikipincompk, Willscrlt, Winterheat, Wxidea, Xyz98711, Yeepsi, Yintan, Zcorpan, 616 anonymous edits
HTML5 in mobile devices Source: http://en.wikipedia.org/w/index.php?oldid=586898208 Contributors: Abdull, Abhishekkant, Alexeev.sergey, Ander-EM, AndrewHowse, Annieh129, BafS,
Bamyers99, Belcerebon, Bender235, BharatMeda, Brian abp, Canceo, Compfreak7, Dbalmerjr, Derek R Bullamore, Download, FT2, Frze, Galkadaw, Galmargalit, GoingBatty, Hmmst, Horrabin,
ILarsona, Jack Phoenix, Jay-Sebastos, Karina57, King of Hearts, Lenin1234, Lo2u, Materialscientist, Mfiels92, Mobileg, Mogism, Mortense, Nikwhite, Nozomimous, Nyssen, OsamaBinLogin,
Pnm, Pointillist, Rodasmith, Sganta, Shreyzie, Thumperward, Toddst1, Tvaddava, Valeria1983, Van der Hoorn, Vincent Dollet, WhiteArk, Widefox, Xhienne, Yannikrock, Yunshui, !"#$%&#,
64 anonymous edits
Web storage Source: http://en.wikipedia.org/w/index.php?oldid=586210588 Contributors: Angrytoast, Bandito4u, Bryan.burgers, Bxj, Chininazu12, DBigXray, Dantman, Dhollm, Edratzer,
Eikern, Eutelsat, Finlay McWalter, Frap, Ghiaurul, Haakon, Izarf, Jashilo, Lxsg, MBParker, Mabdul, Materialscientist, Mazin07, Melizg, Michaeldsuarez, Mike Gale, MoreNet, Mr. Stradivarius,
Msa61, Nnemo, Odalcet, Salvatorelionetti, Sdesalas, Technopat, Terrycojones, Uzume, Winterheat, Zcorpan, ZhukMax, 41 anonymous edits
Sencha Touch Source: http://en.wikipedia.org/w/index.php?oldid=585655256 Contributors: AndrewHowse, Anna Frodesiak, Beland, Dalar, Derek R Bullamore, Drttm, Gian-Pa, GoingBatty,
Hcatlin, Jack Phoenix, Jerryobject, Mark Arsten, Mortense, MusikAnimal, Nagarjuna Reddy Bollam, Njk, Partha lal, PowerSp00n, Rwalker, Samdutton, Sganta, Sorin7486, Sugarfish,
ThePastIsObdurate, Toddst1, Torchiest, 44 anonymous edits
NoSQL Source: http://en.wikipedia.org/w/index.php?oldid=589583746 Contributors: (:Julien:), Adtadt, Al3xpopescu, Alexandre.Morgaut, Alexrakia, AlisonW, Altered Walter, Amire80,
Anastrophe, AndrewBass, Angry bee, Anilkumar1129, Anne.naimoli, Anoop K Nayak, Ansh.prat, Anujsahni, Argv0, Arjayay, Arto B, Asafdapper, Ashtango, Ashtango5, Atropos235, AxelBoldt,
BD2412, Bbulkow, Bdijkstra, Bearcat, Beland, Benatkin, Benhoyt, Bhaskar, Billinghurst, Biofinderplus, Boshomi, Bovineone, Bramante, Brocsima, CJGarner, CaptTofu, Ceefour, Cekli829,
Charbelgereige, Chenopodiaceous, ChristianGruen, Ciges, Clemwang, Cloud-dev, Cnorvell, ColdShine, Coldacid, Colemala, Compfreak7, Corrector623, Craigbeveridge, Crosbiesmith,
Crosstantine, Cybercobra, Cyril.wack, DBigXray, Dabron, DamarisC, Dancrumb, DatabACE, DavidBourguignon, DavidSol, Davidhorman, Dawn Bard, Dericofilho, Dewritech, Dm, Dmccreary,
Dmitri.grigoriev, Dredwolff, Drttm, Dshelby, Dstainer, Duncan, Ebalter, Eco schranzer, Edlich, Eedeebee, Ehn, Electricmuffin11, Eno, EricBloch, ErikHaugen, Ertugka, Euphoria, Excirial,
Article Sources and Contributors
231
Extrovrt101, F331491, Farvartish, Fiskbil, Fitzchak, Fmorstatter, FontOfSomeKnowledge, Fraktalek, FranzKraun, Frap, Freshnfruity, Frze, Furrykef, Fxsjy, Gaborcselle, Gadfium,
Germanviscuso, Getmoreatp, GimliDotNet, Ginsuloft, Gkorland, GlobalsDB, GoingBatty, Gonim, Gorman, Gpierre, GraemeL, Griswolf, Gstein, Hairy Dude, Harpreet dandeon, Headbomb,
Heelmijnlevenlang, HereToHelp, Hloeung, Hoelzro, Hu12, Inmortalnet, Intgr, Irmatov, JLaTondre, Jabawack81, Jandalhandler, Jasonhpang, Javalangstring, Jeffdexter77, Jerome Charles Potts,
JnRouvignac, Jnaranjo86, JohnPritchard, Jonasfagundes, Joolean, Jottinger, Jrudisin, Jstplace, Jubalkessler, Justinsheehy, Kbrose, Kgfleischmann, Khiladi 2010, Ki2010, KiloByte, Kkbhumana,
Kku, Knudmoeller, Koavf, Komap, Korrawit, LeeAMitchell, Leegee23, Legacypath, Leotohill, Lfstevens, Lguzenda, Linas, Lmxspice, Looris, Luebbert42, Luisramos22, Lyoshenka,
MMSequeira, Mabdul, MacTed, Magnuschr, ManikSurtani, Marasmusine, Mark Arsten, Matspca, Matt Heard, Mauls, Mauro Bieg, Maury Markowitz, Mbarrenecheajr, Mbonaci, Mbroberg,
McSly, Mesut.ayata, Mhegi, Miami33139, Michael Minh, Mitpradeep, Mjresin, Morphh, Mortense, MrOllie, MrWerewolf, Msalvadores, Mshefer, Mtrencseni, Mydoghasworms, Nanolat,
Natan.puzis, Natishalom, Nawk, Nawroth, Netmesh, Neustradamus, Nick Number, Nileshbansal, Nosql.analyst, Ntoll, OmerMor, Omidnoorani, Orenfalkowitz, Ostrolphant, PatrickFisher, Pcap,
Peak, Pereb, Peter Gulutzan, Phillips-Martin, Philu, Phoe6, Phoenix720, Phunehehe, Plustgarten, Pnm, Pointillist, Poohneat, Professionalsql, ProfessorBaltasar, QuiteUnusual, Qwertyus, R39132,
RA0808, Rabihnassar, Raysonho, Razorflame, Really Enthusiastic, Rediosoft, Rfl, Robert1947, RobertG, Robhughadams, Ronz, Rossturk, Rpk512, Rtweed1955, Russss, Rzicari, Sae1962,
Sagarjhobalia, SamJohnston, Sandy.toast, Sanspeur, Sasindar, ScottConroy, Sdrkyj, Sduplooy, Seancribbs, Seraphimblade, Shadowjams, Shepard, Shijucv, Smyth, Socialuser, Somewherepurple,
Sorenriise, Sstrader, StanContributor, Stephen Bain, Stephen E Browne, Steve03Mills, Stevedekorte, Stevenguttman, Stimpy77, Strait, Sugamsha, Svesterli, Syaskin, TJRC, Tabletop,
Tagishsimon, Techsaint, Tedder, Tgrall, The-verver, Theandrewdavis, Thegreeneman5, Thomas.uhl, ThomasMueller, Thumperward, ThurnerRupert, Thringer, Timwi, Tobiasivarsson,
Tomdo08, Trbdavies, Tshanky, Tsm32, Tsvljuchsh, Tuvrotya, Tylerskf, Ugurbost, Uhbif19, Vegaswikian, Violaaa, Viper007Bond, Volt42, Voodootikigod, Vychtrle, Walter Grlitz, Wavelength,
Webtrill, Weimanm, Whimsley, White gecko, Whooym, William greenly, Winston Chuen-Shih Yang, Winterst, Woohookitty, Wyverald, Xtremejames183, YPavan, Yasinaktimur, Zapher67,
Zaxius, Zond, Mnan Jnannnh, 678 anonymous edits
CouchDB Source: http://en.wikipedia.org/w/index.php?oldid=581746310 Contributors: 16r, 1ForTheMoney, Agriffis, Al3xpopescu, Altered Walter, Amorfo, Andy Dingley, Arleyl,
Benedolph, Bryant.cutler, CCC2012, CDCAA18D, CJGarner, Canaima, Cander0000, Centrx, CharlotteWebb, Chiborg, Chzz, Ciges, CommonsDelinker, Comp.arch, Dabron, Dgorley, Diannaa,
Diego guillen, Dionysostom, Dmccreary, Dstainer, Ebraminio, Ehn, Euclidbuena, Ewolff42, FatalError, Frap, Gary King, Goldzahn, Gslin, Hu12, Husky, Ingenthr, Jaskiern, Jason Davies,
Jncraton, Kenyon, Khazar2, Kinema, Koistya, Kslattery, Lambdacalculator, Levin, Locotorp, Mbroberg, Mentifisto, Micrypt, Mikecron, Miym, Mqtthiqs, MrOllie, Msiebuhr, MySchizoBuddy,
MylesBraithwaite, Nealmcb, Nslater, Osndok, Palosirkka, Patcito, Phluid61, Phunehehe, PhuongCM88, Pingveno, Psychcf, Qwertyus, R'n'B, Rfl, Rich Farmbrough, Rickyphyllis, Rurd4me,
SamJohnston, Saric, Sbose7890, ScotXW, SeMeKh, Seifsallam, Silas S. Brown, Slackr, Spdegabrielle, Suggestednickname, Thorwald, Thumperward, TimClicks, Tmcw, Tobias Bergemann,
Tonieisner, Upsetspecial, VanGore, Widr, Wikieditoroftoday, Will Faught, Zundark, 235 anonymous edits
WebSocket Source: http://en.wikipedia.org/w/index.php?oldid=588878060 Contributors: Abdull, Ajfweb, Aleksa Lukic, AlistairMcMillan, AmigoNico, Ant.lafarge, Aoidh, Arctic Kangaroo,
Ashanbh, Athari, AvicAWB, Brec, Bugster47, CecilWard, Cornellier, Cxw, CyberShadow, Cyberajith, DVdm, Decatur-en, Deineka, Dtgriscom, Ed Brey, EncoreUnUsername, Evanchooly,
Evertw, Filing Flunky, Filnik, Flohack, Frap, Fred Gandt, Gelma, Genium, Giraffedata, Gottabekd, Gutworth, Guy Macon, Gyrobo, HannesP, Hvj78, Infocris, Infofarmer, Javy tahu, Jengelh,
Jimblandy, Jj kille, Jjamison, Jmgonzalez, Jnestorius, Jonabbey, Joshuadmorris, JustinRosenstein, Kanaka, KoolNam, Leggetter, LittleWink, Macaldo, Mamsaac, Masklinn, Materialscientist,
Mindmatrix, Moock, MoreNet, Mortense, MrOllie, Mrotaru, Muhandes, NNemec, Narup, Nealmcb, NicoSchottelius, Nodulation, Nsda, Oberstet, Ohnoitsjamie, P.lubbers, Paul.irish, Peachey88,
Peeyujr, Pete142, Piet Delport, Pmokeefe, Pmoskovi, ReCover, ReachingTerminalVelocity, Reaper Eternal, Remonson, Reschke, Rezonansowy, Rogerfgay, SURIV, Sergey.lyubka, Shadowjams,
SilkTork, Skleanthous, SunKing2, Superbjorn, Svick, Swat671, Syp, Taotetek, Tassadar356, The Decryptor, Themfromspace, Theopolisme, Tiagonmas, Towel401, Trivialist, Trowski, Tsingi,
Uzume, Waldir, Waltgibson, Widefox, Wikiasec, Wilfrednilsen, Winne, XDanielx, XP1, Xeon06, Yannick56, Ysangkok, Zearin, 255 anonymous edits
Node.js Source: http://en.wikipedia.org/w/index.php?oldid=589233512 Contributors: Adammw, Ale And Quail, AlexanderPletnev, Alexfradiani, Alexrr123, Ameyms, Amire80, Anas hashmi,
Andrewpmk, Apoc2400, Azakhark, Back ache, Bdiscoe, BeautifulNumbness, BenNashSF, Bgwhite, BillyBreen, Br77rino, Bunnyhop11, CH1982, Callanecc, Chowbok, Chris Chittleborough,
ChrisGualtieri, Cnevis, Cowholio4, Cshay, Cybercobra, Dancablam, Davidhorman, Der Messer, Dkikizas, Download, Dpmehta02, Ds13, Dyork, Ebraminio, Eric iSoftStone, Ethelhael,
Federalist51, Frap, Fred Gandt, GDW13, Gioto, Gkorland, Graphnode, Greenrd, Guzugi, Hammersoft, Hu12, Hydrology, Ian13, InverseHypercube, Itwars, Jamescun, Jarble, JasonWoof, Jcgrob,
Jcubic, Jens Laufer, Jfmantis, Jim1138, Jimwelch, Jonpress, Jorgechamorro, KenanSulayman, Klimashkin, Koper, Largoplazo, Liberatus, Loki 66, Lokmac, Lone boatman, Lopifalko,
MEGADORVS, Martarius, Mastazi, Mbabuskov, Message From Xenu, Metalim, Mihrdat, Minitech.me, Mipadi, Misbehavens, Mootros, Mortense, MrOllie, Mroswell, Msiebuhr, Mu Mind,
NuclearWizard, Nunojob, OsamaBinLogin, Owain, Paul Verest, Pborenstein, Pengwynn, Peppage, Pmokeefe, PochWiki, PoorLeno, Potasmic, Qji, Quuxplusone, RHaworth, Rchandra,
Redneb33, Rezonansowy, Rohan nog, Rpyle731, Runtime, SHL-at-Sv, Sh1mmer, Shay Falador, Shaynehughes, SidneyGijzen, Silas S. Brown, Sixmno, Skulla, Softdevusa, Sonjaaa, Sthiy,
Superheroes Fighting, The.rahul.nair, Thorwald, Threedaymonk, Thumperward, Toby Douglass, Toddst1, Trevor Burnham, Tra, Unsigned char, Varenilus, Voidvector, Wainstead, WakiMiko,
Widefox, Wikieditoroftoday, Wooptoo, Wpoely86, Yoreei, Zaketamemanikia, 176 anonymous edits
Mobile app Source: http://en.wikipedia.org/w/index.php?oldid=589428471 Contributors: 007-JJE, Acalamari, Accusativen hos Olsson, Android4.0, Andy Dingley, Bakeriell1, Bballkid19,
Bgwhite, Bhny, Bkmagnetron, Buffbills7701, Casti bolen, ChrisGualtieri, Cloudbound, Codename Lisa, Contribute23, Crysb, Davepilgrimus, Dcirovic, Diego Moya, Dm20, Dmsc893,
DouglasCalvert, Dreamyshade, Edszho, Elfalem, Elonka, Emilyanne25, Evanh2008, Flyer22, Genieconnect1, GirasoleDE, Gogo Dodo, Groovecoder, Highdog318, Hu12, Hydrox, Ian Page,
Jadvii, Jamwalsh, Jaynangle1234, Jennie'13, Jerryobject, Jfbonner, Jim.henderson, Joancdocyogen, Joe204, JohnnyMrNinja, Kakomap, Kashmiri, Kendall-K1, Kilopi, Lisak 87, Lotje,
M0rphzone, MER-C, Materialscientist, MatosKap, Md. Mazharul Islam, Mean as custard, Mett bollen, Mushroom, MusikAnimal, Nnotova, Nozomimous, Nz9555, OdessaCamp, Oop,
Oxfordwang, PamD, Pava, Petermcelwee, Pigsonthewing, Pratyya Ghosh, Pyae Aye, Qetuth, RHaworth, Rakshitsrivastava, RealtorBrenton, Riddwan49, Rkmelton, Rockfang, Rosspz,
Ruchishah312, Sadeqs, Satellizer, Scbmy, Sethant, Shrivatsavbalen, Simeondahl, Smartmo, Socialmaven1, Srleffler, Superzohar, Sydneyb85, Tbhotch, Technopat, The Wikimon,
Therealpowerflower, ThomasWF, Tiwuu, Tom Morris, ViperSnake151, Vivik belly, Wammes Waggel, Widr, Yunshui, Zalunardo8, 83 anonymous edits
PhoneGap Source: http://en.wikipedia.org/w/index.php?oldid=588035292 Contributors: 178tint, A.amitkumar, Aanyad, Alacenski, Alharding, AlistairMcMillan, Altonbr, Amarprabhu,
Amorymeltzer, Amr.rs, BigBrownChunx, Brian Kendig, CXCV, CaribDigita, Chazwatson, Coldfumonkeh, Cookingwithrye, Courcelles, Cynicaljoy, David Johnson-Davies, DavidCary,
Dbarefoot, Ddly, Denniss, Dfmaratos, DouglasCalvert, DudeMeister66, Falcon8765, FireyFly, Frap, Freedman1, Freerunnering, Gapple, Gary King, GoingBatty, Hellboy81, Hervegirod,
Hugozam, I dream of horses, IndianGeneralist, InverseHypercube, JCRules, JIP, Jacksonhull, Jerryobject, Jk1977, Johnfloyd6675, Kiran Gopi, Liangent, LilHelpa, Lostrust, Lotje, Magog the
Ogre, Melizg, Mortense, Nathanathanathan, Niceguyedc, NotDifficult, Nyco, Nycynik, Nyssen, Paul.plaquette, Phette23, Pinethicket, Polluks, R'n'B, Rezonansowy, Rockfang, Rwh86, Sahilm,
Shazronabdullah, Silas S. Brown, Snay2, Stennie, Tabledhote, Tagishsimon, Thine Antique Pen, TylerGreenberg, Unwiredben, WhiteArk, Withinsight, Xeniar, Yaron K., Yug, Zzuuzz,
!"#$%&#, 178 anonymous edits
App store optimization Source: http://en.wikipedia.org/w/index.php?oldid=584362964 Contributors: Bearcat, CommonsDelinker, Eugene So, Fbartolom, FunkyCanute, Hoangducanh89,
InMktgWeTrust, Irishnh, Iseff, Katharineamy, Kilopi, MrOllie, Rwalker, StefanBielau, Steven Walling, Sylvainww, Trivialist, 15 anonymous edits
Screencast Source: http://en.wikipedia.org/w/index.php?oldid=587956335 Contributors: 16r, 1mujin22, A-giau, AVRS, Ajg00, Alexbarn, Alexwcovington, Alvin Seville, Amitpagarwal,
Antiochus, Argey, Arialjo19, Asifrehmani, Avinashk914, Awildman, Bahaa2008, Banjobarry, Biot, Bobbyd123, Boffob, Boing said Zebedee, Bonadea, C.Fred, CALR, CWii, Chninkel,
Chris8649, ChristianLinhart, Cygnuz, Daniel.Cardenas, Daveswagon, DavidMcCabe, Dctoedt, Deeje, DennisDaniels, Diomedea Exulans, Dismas, Dltq, Dreftymac, Drnitinp, Dude1phoenix,
Easyexplainvideos, Ehdrive, Einar75, Eliezer Aharon, Eloquence, Eurovictor, FleetCommand, FrankTobia, Funandtrvl, G8briel, Gamewizard71, Gnowor, Gordmoo, Hadal, Hank Magnuski,
Hao2lian, Houghton, Ianozsvald, Impdog, InSb, J3ff, Jac16888, Jackol, Jamesmorrison, Jamie-forsyth, JazzyGroove, Jinxs, John Broughton, JonHarder, Jonudell, JzG, Kahlown, Kerowyn,
Khalid hassani, Khalid.elgazzar, Klessblog, Kovyrin, Kragen, Lantisgaius, Lightdarkness, Lilysnow, Lonezor, Mac, Manray7, Mark Rizo, Marsilies, Martarius, Mediamei, Methmann, Mgiarrap,
MiguelTremblay, MikeWazowski, Mozealou, Mulk, Nerd42, Nick, Nono64, OS2Warp, Omiltonmaciel, Pathoschild, Pearle, Permacultura, Philb23, Pkchan, Pr0b3r, Puramyun31, Pwforaker,
Quiddity, Random832, Raspalchima, Requestion, Rhilgers, Rhoehn, Ritchiep, Ronz, Salix alba, Samartino, ScreencastCentral, Shadownight, ShaneCavanaugh, SheeEttin, Sietse Snel, Simon
Nuttall, Skarkkai, Skeetervalentine, SkyWalker, Snori, Stevenrhicks, StreamRecorder, Sunilswa, SvenBecker, Syndicate, TKD, Techwritter31, Teratornis, TheParanoidOne, Tim baker,
TimFahlberg, TinaFly, Tizio, Tmtoulouse, TonyW, Toussaint, Ugaruer, Unforgettableid, UnknownFork, Vincentvangolf, Webinaria, Webvideo, Wfryer, Winterst, Wmahan, Woodroar, Xionbox,
Yury V, Zenkano, Zeth, Zondor, 311 anonymous edits
Camtasia Studio Source: http://en.wikipedia.org/w/index.php?oldid=589400345 Contributors: 0508michael, 16r, AVRS, Abdull, Abmac, AlanUS, Arch4ngel, Blitterbug, Bulldog73,
ChallengeSpacePedia, Chrisforestus, Ckatz, Clarenceville Trojan, Dima Lobanov06, Dwandelt, Dwellings, Eeekster, Elonka, FleetCommand, Freerick, Frog Splash, Geeteshbajaj, Glenn,
Hemlock Martinis, Hippi ippi, Howardcdavis, Iamthedeus, JAnerd, JReusch, Jesse V., Jim1138, Jncraton, JohnDoe0007, JonHarder, KLLvr283, Kamranm1000, Khalid hassani, Kwmicklatcher,
KylieTastic, Maginks, Malcolma, Malcolmgillis, MasterOfTheXP, Mbtutt, Merge4, MrOllie, Narendra Sisodiya, Patrias, Pcgamer17, Perohanych, Philip Trueman, Pnm, Raspalchima,
RetroPanda360, Rich Farmbrough, Robsinden, Romney yw, SF007, Skapur, Skeetervalentine, Superman768, TerriersFan, Tharskjold, TinaFly, TonyW, Tuanese, Ukexpat, Uncle Milty, Unimath,
Ute-s, VideoNerd, ViperBite, W3bbo, W4CHL, Woodroar, Woohookitty, Xl ll 80, Zaurus, ZimZalaBim, Bann-T, 74 anonymous edits
Image Sources, Licenses and Contributors
232
Image Sources, Licenses and Contributors
File:MOOC poster mathplourde.jpg Source: http://en.wikipedia.org/w/index.php?title=File:MOOC_poster_mathplourde.jpg License: Creative Commons Attribution 2.0 Contributors:
FlickreviewR, Smallbones
File:Dave Cormier at Skolforum 2012-10-30.JPG Source: http://en.wikipedia.org/w/index.php?title=File:Dave_Cormier_at_Skolforum_2012-10-30.JPG License: Creative Commons
Attribution-Sharealike 3.0 Contributors: User:Axel Pettersson (WMSE)
file:Nuvola apps kaboodle.svg Source: http://en.wikipedia.org/w/index.php?title=File:Nuvola_apps_kaboodle.svg License: unknown Contributors: Cathy Richards, Pierpao, Tkgd2007, Waldir,
1 anonymous edits
File:Connectivism and Connective Knowledge (CCK08) course network.png Source:
http://en.wikipedia.org/w/index.php?title=File:Connectivism_and_Connective_Knowledge_(CCK08)_course_network.png License: Creative Commons Attribution 3.0 Contributors: Ozhu
File:The Future of Higher Education Daphne Koller (8411917358).jpg Source:
http://en.wikipedia.org/w/index.php?title=File:The_Future_of_Higher_Education_Daphne_Koller_(8411917358).jpg License: Creative Commons Attribution-Sharealike 2.0 Contributors: World
Economic Forum from Cologny, Switzerland
File:Gartner Hype Cycle.svg Source: http://en.wikipedia.org/w/index.php?title=File:Gartner_Hype_Cycle.svg License: Creative Commons Attribution-Sharealike 3.0,2.5,2.0,1.0 Contributors:
Jeremy Kemp.
File:Duke Chapel spire.jpg Source: http://en.wikipedia.org/w/index.php?title=File:Duke_Chapel_spire.jpg License: Creative Commons Attribution-Sharealike 3.0 Contributors: Look2See1,
Nyttend, Smallbones
File:Figure 1 MOOCs and Open Education Timeline p6.jpg Source: http://en.wikipedia.org/w/index.php?title=File:Figure_1_MOOCs_and_Open_Education_Timeline_p6.jpg License:
Creative Commons Attribution 3.0 Contributors: Sjgknight
File:Table 1 Comparison of key aspects of MOOCs or Open Education initiatives p8.jpg Source:
http://en.wikipedia.org/w/index.php?title=File:Table_1_Comparison_of_key_aspects_of_MOOCs_or_Open_Education_initiatives_p8.jpg License: Creative Commons Attribution 3.0
Contributors: Sjgknight
File:Virtualbox logo.png Source: http://en.wikipedia.org/w/index.php?title=File:Virtualbox_logo.png License: unknown Contributors: Codename Lisa, Foroa, Magog the Ogre
File:VirtualBox screenshot.png Source: http://en.wikipedia.org/w/index.php?title=File:VirtualBox_screenshot.png License: GNU General Public License Contributors: Kubuntu 11.04:
VirtualBox 4.1.8: Windows 7: This screenshot:
File:VirtualBox logo 64px.png Source: http://en.wikipedia.org/w/index.php?title=File:VirtualBox_logo_64px.png License: unknown Contributors: innotek GmbH
File:Ubuntu1310 LiveCD with VirtualBox on Ubuntu1310.ogv Source: http://en.wikipedia.org/w/index.php?title=File:Ubuntu1310_LiveCD_with_VirtualBox_on_Ubuntu1310.ogv License:
unknown Contributors: User:OnionBulb
File:Gartoon-fs-ftp.png Source: http://en.wikipedia.org/w/index.php?title=File:Gartoon-fs-ftp.png License: GNU General Public License Contributors: Berto, Mikm, Thuresson,
WikipediaMaster
File:FildelningMedBitTorrent.png Source: http://en.wikipedia.org/w/index.php?title=File:FildelningMedBitTorrent.png License: Public Domain Contributors: Piratbyrn
File:Git-logo-2012.svg Source: http://en.wikipedia.org/w/index.php?title=File:Git-logo-2012.svg License: unknown Contributors: -
File:Git session.png Source: http://en.wikipedia.org/w/index.php?title=File:Git_session.png License: Public Domain Contributors: Chris Down
File:Git operations.svg Source: http://en.wikipedia.org/w/index.php?title=File:Git_operations.svg License: Creative Commons Attribution 3.0 Contributors: Daniel Kinzler
File:Internet1.jpg Source: http://en.wikipedia.org/w/index.php?title=File:Internet1.jpg License: Creative Commons Attribution-Share Alike Contributors: Rock1997
File:Tim Berners-Lee CP 2.jpg Source: http://en.wikipedia.org/w/index.php?title=File:Tim_Berners-Lee_CP_2.jpg License: Creative Commons Attribution 2.0 Contributors: Silvio Tanaka
File:Http request telnet ubuntu.png Source: http://en.wikipedia.org/w/index.php?title=File:Http_request_telnet_ubuntu.png License: Public Domain Contributors: TheJosh
File:Roy Fielding.jpg Source: http://en.wikipedia.org/w/index.php?title=File:Roy_Fielding.jpg License: Creative Commons Attribution 2.0 Contributors: Phillie Casablanca
File:Codecademy-banner.png Source: http://en.wikipedia.org/w/index.php?title=File:Codecademy-banner.png License: Public Domain Contributors: Codecademy
File:Increase Negative.svg Source: http://en.wikipedia.org/w/index.php?title=File:Increase_Negative.svg License: Public Domain Contributors: Increase2.svg: Sarang derivative work:
Dodoste (talk)
File:Unofficial JavaScript logo 2.svg Source: http://en.wikipedia.org/w/index.php?title=File:Unofficial_JavaScript_logo_2.svg License: Public Domain Contributors: User:Ramaksoud2000,
User:denbosch
file:Wikibooks-logo-en-noslogan.svg Source: http://en.wikipedia.org/w/index.php?title=File:Wikibooks-logo-en-noslogan.svg License: logo Contributors: User:Bastique, User:Ramac et al.
File:Javascript icon.svg Source: http://en.wikipedia.org/w/index.php?title=File:Javascript_icon.svg License: GNU Lesser General Public License Contributors: Lupo
File:Crystal source.png Source: http://en.wikipedia.org/w/index.php?title=File:Crystal_source.png License: GNU Lesser General Public License Contributors: Dake, Kakurady
File:BEich.jpg Source: http://en.wikipedia.org/w/index.php?title=File:BEich.jpg License: Creative Commons ShareAlike 1.0 Generic Contributors: Original uploader was AcidJazzed at
en.wikipedia
File:Douglas Crockford.jpg Source: http://en.wikipedia.org/w/index.php?title=File:Douglas_Crockford.jpg License: Creative Commons Attribution-Sharealike 2.0 Contributors: Franco Folini
from San Francisco, USA
Image:Gcalendar.png Source: http://en.wikipedia.org/w/index.php?title=File:Gcalendar.png License: unknown Contributors: Ayleuss, Hk1992, Mugunth Kumar
Image:Horde-portal.png Source: http://en.wikipedia.org/w/index.php?title=File:Horde-portal.png License: GNU Lesser General Public License Contributors: The Horde Project
File:URI Euler Diagram no lone URIs.svg Source: http://en.wikipedia.org/w/index.php?title=File:URI_Euler_Diagram_no_lone_URIs.svg License: GNU Free Documentation License
Contributors: David Torres original author derivative work: Qwerty0 (talk)
File:JSON vector logo.svg Source: http://en.wikipedia.org/w/index.php?title=File:JSON_vector_logo.svg License: Public Domain Contributors: Loki 66
File:HTML5-logo.svg Source: http://en.wikipedia.org/w/index.php?title=File:HTML5-logo.svg License: unknown Contributors: -
File:HTML5-APIs-and-related-technologies-by-Sergey-Mavrody.png Source: http://en.wikipedia.org/w/index.php?title=File:HTML5-APIs-and-related-technologies-by-Sergey-Mavrody.png
License: Creative Commons Attribution-Sharealike 3.0 Contributors: Jarry1250, Mercury999, Morgankevinj, Torsch, 1 anonymous edits
File:P14.png Source: http://en.wikipedia.org/w/index.php?title=File:P14.png License: Creative Commons Attribution-Sharealike 3.0 Contributors: User:Shrey2smart
File:Couchdb screenshot.png Source: http://en.wikipedia.org/w/index.php?title=File:Couchdb_screenshot.png License: GNU General Public License Contributors: apache.org
File:LYME_software_bundle.svg Source: http://en.wikipedia.org/w/index.php?title=File:LYME_software_bundle.svg License: Creative Commons Attribution-Sharealike 3.0 Contributors:
User:ScotXW
File:Node.js logo.svg Source: http://en.wikipedia.org/w/index.php?title=File:Node.js_logo.svg License: Public Domain Contributors: Rezonansowy, 1 anonymous edits
File:Ryan Dahl.jpg Source: http://en.wikipedia.org/w/index.php?title=File:Ryan_Dahl.jpg License: Creative Commons Attribution 2.0 Contributors: David Calhoun
License
233
License
Creative Commons Attribution-Share Alike 3.0
//creativecommons.org/licenses/by-sa/3.0/