Download as pdf or txt
Download as pdf or txt
You are on page 1of 237

PDF generated using the open source mwlib toolkit. See http://code.pediapress.com/ for more information.

PDF generated at: Tue, 07 Jan 2014 19:16:23 UTC


MOOC Web Engineering
Part II: Developing Mobile HTML5 Apps
Contents
Articles
Intro: MOOC Web Engineering
1
Massive open online course 1
Web engineering 18
Iversity 23
Chapter 11: Starter Kit: Tools for the HTML5 App in the Cloud
25
VirtualBox 25
Virtual appliance 30
BitTorrent 32
CloudControl 44
Git (software) 45
Chapter 12: REST Architectural Style for Mobile Web Applications
52
Representational state transfer 52
Create, read, update and delete 58
HATEOAS 59
Hypertext Transfer Protocol 60
Roy Fielding 68
Chapter 13: Interactive Exercises with JavaScript at Codecademy
70
Codecademy 70
JavaScript 71
JavaScript syntax 90
JavaScript engine 120
ECMAScript 124
Ajax (programming) 132
XMLHttpRequest 135
Brendan Eich 142
Douglas Crockford 144
Chapter 14: Single-Page Applications with JavaScript, JSON, and REST
API
146
Web application 146
Single-page application 150
Uniform resource identifier 154
JSON 159
Chapter 15: Overview of HTML5 and its JavaScript APIs
168
HTML5 168
HTML5 in mobile devices 176
Web storage 182
Chapter 16: Online Exercises with the HTML5 Mobile Application
Framework Sencha Touch
187
Sencha Touch 187
Chapter 17: Introduction to NoSQL Databases for Web Apps
189
NoSQL 189
CouchDB 198
Chapter 18: Full-Stack JavaScript: Design and implementation of a
WebSocket App
204
WebSocket 204
Node.js 208
Chapter 19: Preparing an HTML5 App for App Stores
212
Mobile app 212
PhoneGap 215
App store optimization 218
Chapter 20: Screen Casting Web Apps for User Documentation
220
Screencast 220
Camtasia Studio 221
References
Article Sources and Contributors 225
Image Sources, Licenses and Contributors 232
Article Licenses
License 233
1
Intro: MOOC Web Engineering
Massive open online course
Poster, entitled "MOOC, every letter is negotiable," exploring
the meaning of the words "Massive Open Online Course"
A Massive Open Online Course (MOOC) is an online
course aimed at unlimited participation and open access via
the web. In addition to traditional course materials such as
videos, readings, and problem sets, MOOCs provide
interactive user forums that help build a community for
students, professors, and teaching assistants (TAs).
MOOCs are a recent development in distance education.
Although early MOOCs often emphasized open access
features, such as connectivism and open licensing of
content, structure, and learning goals, to promote the reuse
and remixing of resources, some notable newer MOOCs
use closed licenses for their course materials, while
maintaining free access for students.
[1]
History
External video
Dave Cormier on MOOCs
[2]
What is a MOOC?
[3]
on YouTube, 2010
Success in a MOOC
[4]
on YouTube, 2010
Knowledge in a MOOC
[5]
on YouTube, 2010
From the New York Times
Welcome to the Brave New World of MOOCs
[6]
on YouTube, 2013
Massive open online course
2
Precursors
Before the Digital Age, distance learning appeared in the form of correspondence courses, broadcast courses and
early forms of e-learning. By the 1890s correspondence courses on specialized topics such as civil service tests and
shorthand were promoted by door-to-door salesmen.
[7]
Over 4 million Americans - far more than attended
traditional colleges - were enrolled in correspondence courses by the 1920s, covering hundreds of practical
job-oriented topics. Their completion rate was under 3%.
[8]
Broadcast radio was new in the 1920s and with programs that were free to audiences of any size. By 1922, New
York University operated its own radio station, with plans to broadcast practically all its courses. Other schools
followed, including Columbia, Harvard, Kansas State, Ohio State, NYU, Purdue, Wisconsin, Utah and many others.
Students read textbooks and listened to broadcast lectures, while mailing in answers to tests. Journalist Bruce Bliven
asked: "Is radio to become a chief arm of education? Will the classroom be abolished and the child of the future be
stuffed with facts as he sits at home or even as he walks about the streets with his portable receiving-set in his
pocket?"
[9]
Completion rates were very low, cheating was hard to detect, and there was no way to collect tuition. By
the 1940s radio courses had virtually disappeared in the United States. The Australian School of the Air used
two-way shortwave radio starting in 1951 to teach students in classrooms in remote locations, with students able to
ask questions of the live instructor.
During World War II, movies were used to train millions of draftees, as lecturers could demonstrate physical
equipment in action. Universities offered televised classes, starting in the late 1940s at the University of
Louisville.
[10]
At many universities in the 1980s classrooms were linked to a remote campus to provide closed-circuit video access
for some students. The CBS TV series Sunrise Semester, broadcast from the 1950s to the 1980s with cooperation
between CBS and NYU, offered course credit.
[11]
In 1994, James J. O'Donnell of the University of Pennsylvania taught a seminar over the Internet, using gopher and
email, on the life and works of St. Augustine of Hippo, attracting over 500 participants from around the world.
[12]
The short lecture format used by many MOOCs developed from "Khan Academy's free archive of snappy
instructional videos." In 2003 Hello China launched what the UK Guardian newspaper described on 24 September
that year as a new media venture to teach 4 million Chinese learners who were preparing for business degrees by
radio, web and mobile phone. The course was open to all participants who could have access to radio and the
internet.
Early approaches
A network diagram showing the distributive
nature of Stephen Downes' and George Siemens'
CCK08 course, one of the first MOOCs and the
course that inspired the term MOOC to become
adopted.
The first MOOCs emerged from the open educational resources (OER)
movement. The term MOOC was coined in 2008 by Dave Cormier of
the University of Prince Edward Island and Senior Research Fellow
Bryan Alexander of the National Institute for Technology in Liberal
Education in response to a course called Connectivism and Connective
Knowledge (also known as CCK08). CCK08, which was led by George
Siemens of Athabasca University and Stephen Downes of the National
Research Council, consisted of 25 tuition-paying students in Extended
Education at the University of Manitoba, as well as over 2200 online
students from the general public who paid nothing. All course content
was available through RSS feeds and online students could participate
through collaborative tools, including blog posts, threaded discussions
in Moodle and Second Life meetings. Stephen Downes considers these so-called cMOOCs to be more "creative and
dynamic" than the current xMOOCs, which he believes "resemble television shows or digital textbooks."
Massive open online course
3
Other MOOCs then emerged. Jim Groom from The University of Mary Washington and Michael Branson Smith of
York College, City University of New York hosted MOOCs through several universities. Early MOOCs did not rely
on posted resources, learning management systems and structures that mix the learning management system with
more open web resources. MOOCs from private, non-profit institutions emphasized prominent faculty members and
expanded existing distance learning offerings (e.g., podcasts) into free and open online courses.
[13]
Recent developments
External video
TED talks
[14]
Shimon Schocken
[15]
on YouTube, The self-organizing computer course, October 2012
Daphne Koller
[16]
at TED, What were learning from online education, June 2012
Peter Norvig
[17]
at TED, The 100,000-student classroom February 2012
Salman Khan
[18]
at TED, Lets use video to reinvent education, March 2011
The New York Times dubbed 2012 'The Year of the MOOC'. Time magazine said that free MOOCs open the door to
the 'Ivy League for the Masses.'
North America
Several well-financed American providers emerged, associated with top universities, including Udacity, Coursera,
edX,
[19]
In the fall of 2011 Stanford University launched three courses. The first of those courses was Introduction Into AI,
launched by Sebastian Thrun and Peter Norvig. Enrollment quickly reached 160,000 students. The announcement
was followed within weeks by the launch of two more MOOCs, by Andrew Ng and Jennifer Widom. Following the
publicity and high enrollment numbers of these courses, Thrun started a company he named Udacity and Daphne
Koller and Andrew Ng launched Coursera. Coursera subsequently announced university partnerships with University
of Pennsylvania, Princeton University, Stanford University and The University of Michigan.
Concerned about the commercialization of online education, MIT created the not-for-profit MITx. The inaugural
course, 6.002x, launched in March 2012. Harvard joined the group, renamed edX, that spring, and University of
California, Berkeley joined in the summer. The initiative then added the University of Texas System, Wellesley
College and Georgetown University.
In November 2012, the University of Miami launched first high school MOOC as part of Global Academy, its online
high school. The course became available for high school students preparing for the SAT Subject Test in biology.
In January 2013, Udacity launched its first MOOCs-for-credit, in collaboration with San Jose State University. In
May 2013 the company announced the first entirely MOOC-based Master's Degree, a collaboration between
Udacity, AT&T and the Georgia Institute of Technology, costing $7,000, a fraction of its normal tuition.
"Gender Through Comic Books," was a course taught by Ball State University's Christina Blanch on Instructure's
Canvas Network, a MOOC platform launched in November 2012. The course used examples from comic books to
teach academic concepts about gender and perceptions.
Massive open online course
4
In March 2013, Coursolve piloted a crowdsourced business strategy course for 100 organizations with the University
of Virginia. A data science MOOC began in May 2013.
In May 2013 Coursera announced free e-books for some courses in partnership with Chegg, an online
textbook-rental company. Students would use Chegg's e-reader, which limits copying and printing and could use the
book only while enrolled in the class. In June 2013, the University of North Carolina at Chapel Hill launched Skynet
University, which offers MOOCs on introductory astronomy. Participants gain access to the university's global
network of robotic telescopes, including those in the Chilean Andes and Australia. It incorporates YouTube,
Facebook and Twitter.
In September 2013, edX announced a partnership with Google to develop Open edX, an open source platform and its
MOOC.org, a site for non-xConsortium groups to build and host courses. Google will work on the core platform
development with edX partners. In addition, Google and edX will collaborate on research into how students learn
and how technology can transform learning and teaching. MOOC.org will adopt Google's infrastructure.
EdX currently offers 94 courses from 29 institutions around the world (as of November 2013). During its first 13
months of operation (ending March 2013), Coursera offered about 325 courses, with 30% in the sciences, 28% in
arts and humanities, 23% in information technology, 13% in business and 6% in mathematics. Udacity offered 26
courses. Udacity's CS101, with an enrollment of over 300,000 students, was the largest MOOC to date.
Some organisations operate their own MOOCs - including Google's Power Search. As of February 2013 dozens of
universities had affiliated with MOOCs, including many international institutions.
Asia
In November 2011 EduKart was launched as an Indian online education company in partnership with Indian and
international universities and industry regulatory bodies. The site provides courses, support from experts and
interactive webinars.
Schoo provides MOOCs in Japan.
In 24 August 2013, Universitas Ciputra Entrepreneurship Online (UCEO) launched first MOOC in Indonesia with
the first course entitled Entrepreneurship Ciputra Way. With over 20,000 registered members, the course offered
insights on how to start a business, and was delivered in Indonesian.
Europe
In February 2012, ex-Nokia employees in Finland based CBTec launched Eliademy.com,
[20]
based on the Open
Source Moodle Virtual learning environment. The site is localized to more than 19 languages (including Latin),
designed for mobile use.
In late 2012, the UK's Open University launched a British MOOC provider, Futurelearn, as a separate company
including provision of MOOCs from non-university partners.
On 15 March 2012 Researchers Dr. Jorge Rami and Dr. Alfonso Muoz from Universidad Politcnica de Madrid
successfully launched the fist Spanish MOOC titled Crypt4you.
[citation needed]
Iversity is a MOOC provider in Germany. With over 82,000 students (Nov 2013) iversity's "The Future of
Storytelling" is Europe's largest MOOC to date.
OpenupEd
[21]
is a supranational platform, founded with support of the European Union (EU).
In Ireland ALISON provides free online certificate/diploma courses to two 2 million learners worldwide. ALISON
was shortlisted in June 2013 by London-based education technology company Edxus Group and specialist media
and advisory firm IBIS Capital, as one of the 'top 20 e-learning companies in Europe' as judged by an expert panel.
In October 2013, the French government announced the creation of France Universite Numerique (FUN), a French
public alternative to existing solutions. French business schools have begun launching their own MOOCs, the first
being supervised by Alberto Alemanno.
Massive open online course
5
Australia
On 15 October 2012 The University of New South Wales launched UNSW Computing 1, the first Australian
MOOC. The course was initiated OpenLearning, an online learning platform developed in Australia, which provides
features for group work, automated marking, collaboration and gamification.
In March 2013 the Open2Study platform was set up in Australia.
Latin America
In 18 June 2012, Ali Lemus from Galileo University launched the first Latin American MOOC titled "Desarrollando
Aplicaciones para iPhone y iPad" This MOOC is a Spanish remix of Stanford University's popular "CS 193P iPhone
Application Development" and had 5,380 students enrolled. The technology used to host the MOOC was the Galileo
Educational System platform (GES) which is based on the .LRN project.
Startup Veduca launched the first MOOCs in Brazil, in partnership with the University of So Paulo in June 2013.
The first two courses were Basic Physics, taught by Vanderlei Salvador Bagnato, and Probability and Statistics,
taught by Melvin Cymbalista and Andr Leme Fleury.
[22]
In the first two weeks following the launch at Polytechnic
School of the University of So Paulo, more than 10,000 students enrolled.
[23]
Related educational practices and courses
Organizations such as Khan Academy, Peer-to-Peer University (P2PU), Udemy, and Course Hero are viewed as
similar to MOOCs work outside the university system or emphasize individual self-paced lessons.
[24]
Udemy allows
teachers to sell online courses, with the course creators keeping 70-85% of the proceeds and intellectual property
rights.
Hype
Dennis Yang, President of MOOC provider Udemy has
suggested that MOOCs are in the midst of a hype cycle,
with expectations undergoing a wild swing.
During a presentation at SXSWedu in early 2013, Instructure
CEO Josh Coates suggested that MOOCs are in the midst of a
hype cycle, with expectations undergoing wild swings. Dennis
Yang, President of MOOC provider Udemy, later made the
point in an article for the Huffington Post.
Many universities scrambled to join in the "next big thing", as
did more established online education service providers such as
Blackboard Inc, in what has been called a "stampede." Dozens
of universities in Canada, Mexico, Europe and Asia have
announced partnerships with the large American MOOC
providers.
[25]
By early 2013, questions emerged about whether
academia was "MOOC'd out."
Massive open online course
6
Structures and instructional design approaches
External video
10 Steps to Developing an Online Course: Walter Sinnott-Armstrong
[26]
on YouTube, Duke University
Designing, developing and running (Massive) Online Courses
[27]
by George Siemens, Athabasca University
Many MOOCs use video lectures, employing the old form of teaching using a new technology. Thrun testified
before the President's Council of Advisors on Science and Technology (PCAST) that MOOC "courses are 'designed
to be challenges,' not lectures, and the amount of data generated from these assessments can be evaluated 'massively
using machine learning' at work behind the scenes. This approach, he said, dispels 'the medieval set of myths'
guiding teacher efficacy and student outcomes, and replaces it with evidence-based, 'modern, data-driven'
educational methodologies that may be the instruments responsible for a 'fundamental transformation of education'
itself".
Because of massive enrollments, MOOCs require instructional design that facilitates large-scale feedback and
interaction. The two basic approaches are:
Peer-review and group collaboration
Automated feedback through objective, online assessments, e.g. quizzes and exams
So-called connectivist MOOCs rely on the former approach; broadcast MOOCs relay more on the latter.
[28]
Some instructional design approaches attempt to connect learners to each other to answer questions and/or
collaborate on joint projects. This may include emphasizing collaborative development of the MOOC.
An emerging trend in MOOCs is the use of nontraditional textbooks such as graphic novels to improve knowledge
retention. Others view the videos and other material produced by the MOOC as the next form of the textbook.
"MOOC is the new textbook," according to David Finegold of Rutgers University.
Massive open online course
7
Connectivist design
Development of MOOC providers
[29]
As MOOCs have evolved, there appear to be
two distinct types: those that emphasize the
connectivist philosophy, and those that
resemble more traditional courses. To
distinguish the two, Stephen Downes proposed
the terms "cMOOC" and "xMOOC".
Principles
Connectivist MOOCs are based on principles
from connectivist pedagogy:
[30][31][32][33]
1. Aggregation. Enable content to be produced
in different places and aggregated as a newsletter or a web page accessible to participants.
2. Remixing associates materials created within the course with each other and with other materials.
3. Re-purposing of aggregated and remixed materials to suit the goals of each participant.
4. Feeding forward, sharing of re-purposed ideas and content with other participants and the rest of the world.
An earlier list (2005) of Connectivist principles from Siemens:
1. 1. Learning and knowledge rest in diversity of opinions.
2. 2. Learning is a process of connecting specialised nodes or information sources.
3. 3. Learning may reside in non-human appliances.
4. 4. Capacity to learn is more critical than what is currently known.
5. 5. Nurturing and maintaining connections is needed to facilitate learning.
6. 6. Ability to see connections between fields, ideas and concepts is a core skill.
7. 7. Accurate, up-to-date knowledge is the intent of all connectivist learning activities.
8. Decision making is a learning process. Choosing what to learn and the meaning of incoming information is seen
through the lens of a shifting reality. While there is a right answer now, it may be wrong tomorrow due to
alterations in the information climate affecting the decision.Wikipedia:Please clarify
Ravenscrot claimed that connectivist MOOCs better support collaborative dialogue and knowledge building.
[34][35]
Assessments
Assessment can be the most difficult activity to conduct online, and online assessments can be quite different from
the bricks-and-mortar version.
[36]
Special attention has been devoted to proctoring and cheating.
The two most common methods of MOOC assessment are machine-graded multiple-choice quizzes or tests and
peer-reviewed written assignments. Machine grading of written assignments is also underway.
Peer review is often based upon sample answers or rubrics, which guide the grader on how many points to award
different answers. These rubrics cannot be as complex for peer grading as for teaching assistants. Students are
expected to learn via grading others.
Exams may be proctored at regional testing centers. Other methods, including "eavesdropping technologies worthy
of the C.I.A." allow testing at home or office, by using webcams, or monitoring mouse clicks and typing styles.
Special techniques such as adaptive testing may be used, where the test tailors itself given the student's previous
answers, giving harder or easier questions accordingly.
Massive open online course
8
Lecture design
A study of edX student habits found that certificate-earning students generally stop watching videos longer than 6 to
9 minutes. They viewed the first 4.4 minutes (median) of 12- to 15-minute videos.
Completion rates
Completion rates are typically lower than 10%, with a steep participation drop starting in the first week. In the course
Bioelectricity, Fall 2012 at Duke University, 12,725 students enrolled, but only 7,761 ever watched a video, 3,658
attempted a quiz, 345 attempted the final exam, and 313 passed, earning a certificate.
Early data from Coursera suggest a completion rate of 7%-9%. Most registered students intend to explore the topic
rather than complete the course, according to Koller and Ng. The completion rate for students who complete the first
assignment is about 45 percent. Students paying $50 for a feature designed to prevent cheating on exams have
completion rates of about 70 percent.
One online survey published a "top ten" list of reasons for dropping out. These were that the course required too
much time, or was too difficult or too basic. Reasons related to poor course design included "lecture fatigue" from
courses that were just lecture videos, lack of a proper introduction to course technology and format, clunky
technology and trolling on discussion boards. Hidden costs were cited, including required readings from expensive
textbooks written by the instructor that also significantly limited students' access to learning material.
[37]
Other
non-completers were "just shopping around" when they registered, or were participating for knowledge rather than a
credential. Providers are exploring multiple techniques to increase the often single-digit completion rates in many
MOOCs.
Human interaction
"The most important thing that helps students succeed in an online course is interpersonal interaction and support,"
says Shanna Smith Jaggars, assistant director of Columbia University's Community College Research Center. Her
research compared online-only and face-to-face learning in studies of community-college students and faculty in
Virginia and Washington state. Among her findings: In Virginia, 32% of students failed or withdrew from for-credit
online courses, compared with 19% for equivalent in-person courses.
Assigning mentors to students is another interaction-enhancing technique. In 2013 Harvard offered a popular class,
The Ancient Greek Hero, taken by thousands of Harvard students over prior decades. It appealed to alumni to
volunteer as online mentors and discussion group managers. About 10 former teaching fellows also volunteered. The
task of the volunteers, which required 3-5 hours per week, was to focus online class discussion. The
instructor,Gregory Nagy The edX course registered 27,000 students.
Flipped classrooms
Some traditional schools blend online and offline learning, sometimes called flipped classrooms. Students watch
lectures online at home and work on projects and interact with faculty while in class. Such hybrids can even improve
student performance in traditional in-person classes. One fall 2012 test by San Jose State and edX found that
incorporating content from an online course into a for-credit campus-based course increased pass rates to 91% from
as low as 55% without the online component. "We do not recommend selecting an online-only experience over a
blended learning experience," says Coursera's Ng.
Massive open online course
9
Encouragement
Techniques for maintaining connection with students include adding audio comments on assignments instead of
writing them, weekly update videos about the course and congratulatory emails on prior accomplishments to students
who are slightly behind.
Preliminaries
Some instructors make students begin with self-assessment surveys and videos. They asked, "What do you think it
takes to be successful in online education, and do you feel that you are ready for it?" Asking those kinds of questions
"improved the engagement right off the bat."
Student fees
Coursera found that students who paid $30 to $90 were substantially more likely to finish the course. The fee was
ostensibly for the company's identity-verification program, which confirms that they took and passed a course.
Student scores
Research found that time spent on homework exercises was the largest grade predictor-more than time spent
watching videos or reading. Among comparable students, one additional hour yielded a 2.2-point score increase on a
100-point scale (with a 60 required to pass). "Organizing the course around exercises and mental challenges is much
more effective than around lectures", says Thrun.
Industry
MOOCs are widely seen as a major part of a larger disruptive innovation taking place in higher education. In
particular, the many services offered under traditional university business models are predicted to become unbundled
and sold to students individually or in newly formed bundles. These services include research, curriculum design,
content generation (such as textbooks), teaching, assessment and certification (such as granting degrees) and student
placement. MOOCs threaten existing business models by potentially selling teaching, assessment, and/or placement
separately from the current package of services.
James Mazoue, Director of Online Programs at Wayne State University describes one possible innovation:
The next disruptor will likely mark a tipping point: an entirely free online curriculum leading to a degree
from an accredited institution. With this new business model, students might still have to pay to certify
their credentials, but not for the process leading to their acquisition. If free access to a degree-granting
curriculum were to occur, the business model of higher education would dramatically and irreversibly
change.
But how universities will benefit by "giving our product away free online" is unclear.
No one's got the model that's going to work yet. I expect all the current ventures to fail, because the
expectations are too high. People think something will catch on like wildfire. But more likely, it's maybe a
decade later that somebody figures out how to do it and make money.
-James Grimmelmann, New York Law School professor
Massive open online course
10
Fee opportunities
In the freemium business model the basic product - the course content - is given away free. "Charging for content
would be a tragedy," said Andrew Ng. But "premium" services such as certification or placement would be charged a
fee.
Course developers could charge licensing fees for educational institutions that use its materials. Introductory or
"gateway" courses and some remedial courses may earn the most fees. Free introductory courses may attract new
students to follow-on fee-charging classes. Blended courses supplement MOOC material with face-to-face
instruction. Providers can charge employers for recruiting its students. Students may be able to pay to take a
proctored exam to earn transfer credit at a degree-granting university, or for certificates of completion.
On EduKart, fees are charged for providing the courses, not for exams. EduKart uses a franchise network.
Franchisees provide advice and then sell courses directly to consumers. The table below lists revenue sources under
consideration by four MOOC providers.
Overview of potential revenue sources for four MOOC providers
[38]
edX Coursera UDACITY EduKart
Certification Certification Certification Courses fees directly from enrolled
students
Secure assessments Employers paying to recruit talented
students
Franchise network
Employee recruitment Students rsums and job match
services
Companies paying for employees'
trainings
Applicant screening Sponsored high-tech skills courses Colleges paying for students'
trainings
Human tutoring or assignment marking
Enterprises pay to run their own training
courses
Sponsorships
Tuition fees
In February 2013 the American Council on Education (ACE) recommended that its members provide transfer credit
from a few MOOC courses, though even the universities who deliver the courses had said that they would not.
The University of Wisconsin offered multiple, competency-based bachelor's and master's degrees starting Fall 2013,
the first public university to do so on a system-wide basis. The university encouraged students to take online-courses
such as MOOCs and complete assessment tests at the university to receive credit. ACE president Molly Corbett
Broad called the UW Flexible Option program "quite visionary."
As of 2013 few students had applied for college credit for MOOC classes. Colorado State University-Global Campus
received no applications in the year after they offered the option.
[39]
Academic Partnerships is a company that helps public universities move their courses online. According to its
chairman, Randy Best "We started it, frankly, as a campaign to grow enrollment. But 72 to 84 percent of those who
did the first course came back and paid to take the second course."
[40]
While Coursera takes a larger cut of any revenue generated - but requires no minimum payment - the not-for-profit
EdX has a minimum required payment from course providers, but takes a smaller cut of any revenues, tied to the
amount of support required for each course.
Massive open online course
11
Industry structure
The industry has an unusual structure, consisting of linked groups including MOOC providers, the larger non-profit
sector, universities, related companies and venture capitalists. The Chronicle of Higher Education lists the major
providers as the non-profits the Khan Academy, and edX, and the for-profits Udacity and Coursera.
The larger non-profit organizations include the Bill & Melinda Gates Foundation, the MacArthur Foundation, the
National Science Foundation, and the American Council on Education. University pioneers include Stanford,
Harvard, MIT, the University of Pennsylvania, CalTech, the University of Texas at Austin, the University of
California at Berkeley, San Jose State University and the Indian Institute of Technology, Bombay IIT Bombay.
Related companies include Google and educational publisher Pearson PLC. Venture capitalists include Kleiner
Perkins Caufield & Byers, New Enterprise Associates and Andreessen Horowitz.
The changes predicted from MOOCs generated objections in some quarters. The San Jose State University
philosophy faculty wrote in an open letter to Harvard University professor and MOOC teacher Michael Sandel:
Should one-size-fits-all vendor-designed blended courses become the norm, we fear two classes of
universities will be created: one, well-funded colleges and universities in which privileged students get
their own real professor; the other, financially stressed private and public universities in which students
watch a bunch of video-taped lectures.
Technology
Unlike traditional courses, MOOCs require additional skills, provided by videographers, instructional designers, IT
specialists and platform specialists. Georgia Tech professor Karen Head reports that 19 people work on their
MOOCs and that more are needed. The platforms have availability requirements similar to media/content sharing
websites, due to the large number of enrollees. MOOCs typically use cloud computing.
Course delivery involves asynchronous access to videos and other learning material, exams and other assessment, as
well as online forums. Before 2013 each MOOC tended to develop its own delivery platform. EdX in April 2013
joined with Stanford University, which previously had its own platform called Class2Go, to work on XBlock SDK, a
joint open-source platform. It is available to the public under the Affero GPL open source license, which requires
that all improvements to the platform be publicly posted and made available under the same license. Stanford Vice
Provost John Mitchell said that the goal was to provide the "Linux of online learning." This is unlike companies such
as Coursera that have developed their own platform.
Potential benefits
The MOOC Guide lists 12 benefits:
1. 1. Appropriate for any setting that has connectivity (Web or Wi-Fi)
2. 2. Any language or multiple languages
3. 3. Any online tools
4. 4. Escape time zones and physical boundaries
5. 5. Produce and deliver in short timeframe (e.g. for relief aid)
6. 6. Contextualized content can be shared by all
7. 7. Informal setting
8. 8. Peer-to-peer contact can trigger serendipitous learning
9. 9. Easier to cross disciplines and institutional barriers
10. 10. Lower barriers to student entry
11. 11. Enhance personal learning environment and/or network by participating
12. 12. Improve lifelong learning skills
Massive open online course
12
Experience and feedback
About 10% of the students who sign up typically complete the course. Most participants participate peripherally
("lurk"). For example, one of the first MOOCs in 2008 had 2200 registered members, of whom 150 actively
interacted at various times.
[41]
Learners control where, what, how and with whom they learn, although different learners choose to exercise more or
less of that control.
[42]
Students include traditional university students, along with degreed professionals, educators, business people,
researchers and others interested in internet culture.
Principles of openness inform the creation, structure and operation of MOOCs. The extent to which practices of
Open Design in educational technology are applied vary. Research by Kop and Fournier highlighted as major
challenges the lack of social presence and the high level of autonomy required.
Table 1 Comparison of key aspects of MOOCs or
Open Education initiatives p8.jpgCompares some
features of current MOOC offerings eDX,
Coursera, Udacity, Udemy, P2P with respect to
attributes:For profit; free to access; certification
fee; institutional credit.Yuan, Li, and Stephen
Powell. MOOCs and Open Education:
Implications for Higher Education White Paper.
University of Bolton: CETIS, 2013. http:/ /
publications. cetis. ac. uk/ 2013/ 667.
Grading by peer review has had mixed results. In one example, three
fellow students grade one assignment for each assignment that they
submit. The grading key or rubric tends to focus the grading, but
discourages more creative writing.
A. J. Jacobs in an op-ed in the New York Times graded his experience
in 11 MOOC classes overall as a "B". He rated his professors as '"B+",
despite "a couple of clunkers", even comparing them to pop stars and
"A-list celebrity professors." Nevertheless he rated teacher-to-student
interaction as a "D" since he had almost no contact with the professors.
The highest rated ("A") aspect of Jacobs' experience was the ability to
watch videos at any time. Student-to-student interaction and
assignments both received "B-". Study groups that didn't meet, trolls
on message boards and the relative slowness of online vs. personal
conversations lowered that rating. Assignments included multiple
choice quizzes and exams as well as essays and projects. He found the
multiple choice tests stressful and peer graded essays painful. He completed only 2 of the 11 classes.
Humanities vs science
Many popular MOOC sites were created by scientists. However, MOOCs are also useful for teaching poetry. "There
was a real question of whether this would work for humanities and social science," says Ng. However, psychology
and philosophy courses are among Coursera's most popular. Student feedback and completion rates suggest that they
are as successful as math and science courses.
In the community-college study, Ms. Jaggars found lower online grades in English than in natural-science classes,
although no definitive explanations emerged.
Massive open online course
13
Students served
By June 2012 more than 1.5 million people had registered for classes through Coursera, Udacity and/or edX.
[43]
As
of 2013, the range of students registered appears to be broad, diverse and non-traditional, but concentrated among
English-speakers in rich countries. By March 2013, Coursera alone had registered about 2.8 million learners:
Coursera enrollees
Country Percentage
United States 27.7%
India 8.8%
Brazil 5.1%
United Kingdom 4.4%
Spain 4.0%
Canada 3.6%
Australia 2.3%
Russia 2.2%
Rest of world 41.9%
By October 2013, Coursera enrollment continued to surge, surpassing 5 million, while edX had independently
reached 1.3 million.
A course billed as "Asia's first MOOC" given by the Hong Kong University of Science and Technology through
Coursera starting in April 2013 registered 17,000 students. About 60% were from "rich countries" with many of the
rest from middle-income countries in Asia, South Africa, Brazil or Mexico. Fewer students enrolled from areas with
more limited access to the internet, and students from the People's Republic of China may have been discouraged by
Chinese government policies.
[44]
"We have the whole gamut of older and younger, experienced and less experienced students, and also academics and
probably some people who are experts in related fields," according to Naubahar Sharif who teaches the class on
Science, Technology and Society in China. "We do have students from China as well, in places where Internet
connections are more reliable."
Koller stated in May 2013 that a majority of the people taking Coursera courses had already earned college
degrees.
[45]
According to a Stanford University study of a more general group of students "active learners" - anybody who
participated beyond just registering - found that sixty-four percent of high school active learners were male and 88%
were male for undergraduate- and graduate-level courses.
In 2013, the Chronicle of Higher Education surveyed 103 professors who had taught MOOCs. "Typically a professor
spent over 100 hours on his MOOC before it even started, by recording online lecture videos and doing other
preparation," though some instructors' pre-class preparation was "a few dozen hours." The professors then spent
8-10 hours per week on the course, including participation in discussion forums.
The medians were: 33,000 students enrollees; 2,600 passing; and 1 teaching assistant helping with the class. 74% of
the classes used automated grading, and 34% used peer grading. 97% of the instructors used original videos, 75%
used open educational resources and 27% used other resources. 9% of the classes required a physical textbook and
5% required an e-book.
Massive open online course
14
Student demographics
A study from Stanford University's Learning Analytics group identified four types of students: auditors, who
watched video throughout the course, but took few quizzes or exams; completers, who viewed most lectures and
took part in most assessments; disengaged learners, who quickly dropped the course; and sampling learners, who
might only occasionally watch lectures. They identified the following percentages in each group:
Course Auditing Completing Disengaging Sampling
High school 6% 27% 28% 39%
Undergraduate 6% 8% 12% 74%
Graduate 9% 5% 6% 80%
Jonathan Haber focused on questions of what students are learning and student demographics. About half the
students taking US courses are from other countries and do not speak English as their first language. He found some
courses to be meaningful, especially about reading comprehension. Video lectures followed by multiple choice
questions can be challenging since they are often the "right questions." Smaller discussion boards paradoxically offer
the best conversations. Larger discussions can be "really, really thoughtful and really, really misguided," with long
discussions becoming rehashes or "the same old stale left/right debate."
Challenges and criticisms
The MOOC Guide lists 5 possible challenges for collaborative-style MOOCs:
1. 1. Participants must create their own content
2. Digital literacy is necessary
3. 3. Time and effort required from participants
4. 4. It is organic, which means the course will take on its own trajectory (you have got to let go).
5. 5. Participants must self-regulate and set their own goals
Other concerns include:
The 'territorial' nature of MOOCs with little discussion around: 1) who enrolls in/completes courses; 2) The
implications of courses scaling across country borders, and potential difficulties with relevance and knowledge
transfer; 3) the need for territory-specific study of locally relevant issues and needs.
Other features associated with early MOOCs, such as open licensing of content, open structure and learning goals,
community-centeredness, etc., may not be present in all MOOC projects.
Effects on the structure of higher education were lamented for example by Moshe Y. Vardi, who finds an "absence
of serious pedagogy in MOOCs", indeed in all of higher education. He criticized the format of "short,
unsophisticated video chunks, interleaved with online quizzes, and accompanied by social
networking."Wikipedia:Please clarify An underlying reason is simple cost cutting pressures, which could hamstring
the higher education industry.
Cary Nelson, former president of the American Association of University Professors claimed that MOOCs are not a
reliable means of supplying credentials, stating that "It's fine to put lectures online, but this plan only degrades
degree programs if it plans to substitute for them." Sandra Schroeder, chair of the Higher Education Program and
Policy Council for the American Federation of Teachers expressed concern that "These students are not likely to
succeed without the structure of a strong and sequenced academic program."
With a 60% majority, the Amherst College faculty rejected the opportunity to work with edX based on a perceived
incompatibility with their seminar-style classes and personalized feedback. Some were concerned about issues such
as the "information dispensing" teaching model of lectures followed by exams, the use of multiple-choice exams and
peer-grading. The Duke University faculty took a similar stance in the spring of 2013. The effect of MOOCs on
Massive open online course
15
second- and third-tier institutions and of creating a professorial "star system" were among other concerns.
At least one alternative to MOOCs has advocates: Distributed open collaborative courses (DOCC) challenge the
roles of the instructor, hierarchy, money and massiveness. DOCC recognizes that the pursuit of knowledge may be
achieved better by not using a centralized singular syllabus, that expertise is distributed throughout all the
participants and does not just reside with one or two individuals.
[46]
Providers
Provider Type Example institutional participants
Coursera For-profit Wharton School, University of Virginia, Stanford University,University of Tokyo,
iversity Non-profit Universidad Autonoma de Madrid, University of Florence, University of Hamburg
edX Non-profit MIT, Harvard University, UC Berkeley, Kyoto University, Peking University, University of Queensland
ALISON Commercial n/a
Canvas Network Commercial Santa Clara University, University of Utah, Universit Lille 1
OpenLearning Commercial University of New South Wales, Taylor's University, University of Canberra
Udacity Commercial n/a
Academic Earth Non-profit UC Berkeley, UCLA, University of Michigan, Oxford University
FutureLearn Non-profit Open University, Monash University, Trinity College, Dublin, Warwick University
Peer to Peer University Non-profit n/a
Khan Academy Non-profit n/a
Saylor.org Non-profit n/a
Udemy Commercial n/a
World Education Portals Non-profit University of Helsinki, Florida State University, Texas A&M University
References
[1] Wiley, David. " The MOOC Misnomer (http:/ / opencontent. org/ blog/ archives/ 2436)". July 2012
[2] Videos by Dave Cormier with a grant from the University of Prince Edward Island, , accessed 6 March 2013
[3] https:/ / www. youtube. com/ watch?v=eW3gMGqcZQc#
[4] https:/ / www. youtube. com/ watch?v=r8avYQ5ZqM0
[5] https:/ / www. youtube. com/ watch?v=bWKdhzSAAG0
[6] https:/ / www. youtube. com/ watch?v=KqQNvmQH_YM
[7] J.J. Clark, "The Correspondence School-Its Relation to Technical Education and Some of Its Results," Science (1906) 24#611 pp.327-334
in JSTOR (http:/ / www. jstor. org/ stable/ 1633383)
[8] Joseph F. Kett, Pursuit of Knowledge Under Difficulties. From Self-Improvement to Adult Education in America (1996) pp 236-8
[9] The Century Illustrated Monthly Magazine (1924) Volume 108, Page 148
[10] Dwayne D. Cox and William J. Morison, The University of Louisville (1999) pp 115-17
[11] [11] Professor Floyd Zulli of NYU was an animating spirit in this enterprise:
[12] [12] For description, see: ; for O'Donnell's reflections on the current context, see
[13] The College of St. Scholastica, " Massive Open Online Courses (http:/ / go. css.edu/ learn)", (2012)
[14] TED talks:
accessed 6 March 2013.
[15] https:/ / www. youtube. com/ watch?v=iE7YRHxwoDs
[16] http:/ / www. ted. com/ talks/ daphne_koller_what_we_re_learning_from_online_education. html/
[17] http:/ / www. ted. com/ talks/ peter_norvig_the_100_000_student_classroom. html/
[18] http:/ / www. ted. com/ talks/ salman_khan_let_s_use_video_to_reinvent_education. html/
[19] Smith, Lindsey " 5 education providers offering MOOCs now or in the future (http:/ / www. educationdive.com/ news/ 5-mooc-providers/
44506/ )". 31 July 2012.
[20] http:/ / www. Eliademy.com
Massive open online course
16
[21] OpenupEd (http:/ / www. openuped. eu/ )
[22] Latin America's First MOOC (17 June 2013). https:/ / www. edsurge. com/ n/ 2013-06-17-latin-america-s-first-mooc (Retrieved 2 July
2013).
[23] Primeiro curso superior virtual da Amrica Latina j soma 10 mil inscritos (28 June 2013). http:/ / noticias. terra. com.br/ educacao/
primeiro-curso-superior-virtual-da-america-latina-ja-soma-10-mil-inscritos,2a26b78c2b28f310VgnCLD2000000ec6eb0aRCRD. html
(Retrieved 2 July 2013).
[24] Yuan, Li, and Stephen Powell. MOOCs and Open Education: Implications for Higher Education White Paper (http:/ / publications.cetis.ac.
uk/ 2013/ 667). University of Bolton: CETIS, 2013. pp. 7-8.
[25] Laura Pappano. The Year of the MOOC - The New York Times (http:/ / www.nytimes. com/ 2012/ 11/ 04/ education/ edlife/
massive-open-online-courses-are-multiplying-at-a-rapid-pace. html?pagewanted=1). 2 November 2012
[26] https:/ / www. youtube. com/ watch?v=JKbPNx2TSgM
[27] http:/ / www. slideshare.net/ gsiemens/ designing-and-running-a-mooc
[28] Carson, Steve. " What we talk about when we talk about automated assessment (http:/ / tofp. wordpress. com/ 2012/ 07/ 23/
what-we-talk-about-when-we-talk-about-automated-assessment/ )" 23 July 2012
[29] Yuan, Li, and Stephen Powell. MOOCs and Open Education: Implications for Higher Education White Paper. University of Bolton: CETIS,
2013. p.6 (http:/ / publications.cetis.ac. uk/ 2013/ 667)
[30] Downes, Stephen "'Connectivism' and Connective Knowledge" (http:/ / www.huffingtonpost. com/ stephen-downes/
connectivism-and-connecti_b_804653.html), Huffpost Education, 5 January 2011, accessed 27 July 2011
[31] Kop, Rita "The challenges to connectivist learning on open online networks: Learning experiences during a massive open online course"
(http:/ / www. irrodl.org/ index. php/ irrodl/ article/ view/ 882), International Review of Research in Open and Distance Learning, Volume 12,
Number 3, 2011, accessed 22 November 2011
[32] Bell, Frances "Connectivism: Its Place in Theory-Informed Research and Innovation in Technology-Enabled Learning" (http:/ / www.irrodl.
org/ index.php/ irrodl/ article/ view/ 902/ 1664), International Review of Research in Open and Distance Learning, Volume 12, Number 3,
2011, accessed 31 July 2011
[33] Downes, Stephen. "Learning networks and connective knowledge" (http:/ / it. coe. uga.edu/ itforum/ paper92/ paper92.html), Instructional
Technology Forum, 2006, accessed 31 July 2011
[34] Dialogue and Connectivism: A New Approach to Understanding and Promoting Dialogue-Rich Networked Learning (http:/ / www.irrodl.
org/ index.php/ irrodl/ article/ view/ 934) Andrew Ravenscroft International Review of Research in Open and Distance Learning Vol. 12.3
March - 2011, Learning Technology Research Institute (LTRI), London Metropolitan University, UK
[35] S.F. John Mak, R. Williams, and J. Mackness, Blogs and Forums as Communication and Learning Tools in a MOOC (http:/ / www.lancs.
ac.uk/ fss/ organisations/ netlc/ past/ nlc2010/ abstracts/ PDFs/ Mak. pdf), Proceedings of the 7th International Conference on Networked
Learning (2010)
[36] Degree of Freedom - an adventure in online learning (http:/ / degreeoffreedom. org/ mooc-components-assessment/ ), MOOC Components
! Assessment, 22 March 2013.
[37] P. Adamopoulos, "What Makes a Great MOOC? An Interdisciplinary Analysis of Student Retention in Online Courses," ICIS 2013
Proceedings (2013) pp.1-21 in AIS Electronic Library (AISeL) (http:/ / aisel. aisnet.org/ icis2013/ proceedings/ BreakthroughIdeas/ 13/ )
[38] Yuan, Li, and Stephen Powell. MOOCs and Open Education: Implications for Higher Education White Paper. University of Bolton: CETIS,
2013.http:/ / publications.cetis.ac. uk/ 2013/ 667, p.10
[39] [39] Udacity, which is offering an online master's degree in computer science in partnership with Georgia Tech, reported in October 2013 that
applications for the term starting in January 2014 were more than double the number of applications that Georgia Tech receives for its
traditional program.
[40] Tamar Lewin. Public Universities to Offer Free Online Classes for Credit (http:/ / www.nytimes. com/ 2013/ 01/ 23/ education/
public-universities-to-offer-free-online-classes-for-credit. html). 23 January 2013
[41] Mackness, Jenny, Mak, Sui Fai John, and Williams, Roy "The Ideals and Reality of Participating in a MOOC" (http:/ / www. lancs. ac. uk/
fss/ organisations/ netlc/ past/ nlc2010/ abstracts/ PDFs/ Mackness. pdf), Proceedings of the 7th International Conference on Networked
Learning 2010
[42] Kop, Rita, and Fournier, Helene "New Dimensions to Self-Directed Learning in an Open Networked Learning Environment" (http:/ / www.
oltraining.com/ SDLwebsite/ IJSDL/ IJSDL7. 2-2010. pdf#page=6), International Journal of Self-Directed Learning, Volume 7, Number 2,
Fall 2010
[43] [43] See, e.g. the first 3 minutes of the video
[44] reprinted from University World News
[45] Steve Kolowich, "In Deals With 10 Public Universities, Coursera Bids for Role in Credit Courses," Chronicle of Higher Education 30 May
2013 (http:/ / chronicle.com/ article/ In-Deals-With-10-Public/ 139533/ ?cid=at& utm_source=at& utm_medium=en)
[46] Scott Jaschik, "Feminist Anti-MOOC" (http:/ / www.insidehighered. com/ news/ 2013/ 08/ 19/
feminist-professors-create-alternative-moocs#ixzz2duFJIkrX), Inside Higher Ed, 19 August 2013).
Massive open online course
17
External links and further reading
Report and literature review from UK Government Department for Business Innovation and Skills (BIS) "The
maturing of the MOOC: literature review of massive open online courses & other forms of online distance
learning" https:/ / www. gov. uk/ government/ publications/
massive-open-online-courses-and-online-distance-learning-review
"MOOC pedagogy: the challenges of developing for Coursera" (http:/ / newsletter. alt. ac.uk/ 2012/ 08/
mooc-pedagogy-the-challenges-of-developing-for-coursera/ )
"Babson Survey Research Group: National reports on growth of online learning in US Higher Education" (http:/ /
sloanconsortium. org/ publications/ survey/ going_distance_2011)
A. McAuley, B. Stewart, G. Siemens and D. Cormier, The MOOC Model for Digital Practice (http:/ /
davecormier. com/ edblog/ wp-content/ uploads/ MOOC_Final. pdf) (2010)
Daniel, John (2012) Making sense of MOOCs: musings in a maze of myth, paradox and possibility, Research
paper presented as a fellow of the Korea National Open University, retrieved 13 October 2012 from http:/ /
sirjohn. ca/ wordpress/ wp-content/ uploads/ 2012/ 08/ 120925MOOCspaper2.pdf
D. Levy, Lessons Learned from Participating in a Connectivist Massive Online Open Course (MOOC) (https:/ /
docs.google. com/ viewer?a=v& pid=explorer& chrome=true&
srcid=0B5ppG_u6D8hFOWE2YTY1NWMtNzM3Ny00MGQ0LWE2NzMtYzMzYjM0NmZkZjc5& hl=en&
authkey=CMOUnb8C), (2011)
Rees, Jonathan The MOOC Racket (http:/ / www. slate. com/ articles/ technology/ future_tense/ 2013/ 07/
moocs_could_be_disastrous_for_students_and_professors. html), Slate, 25 July 2013.
UNLOCKING the GATES: How and Why Leading Universities Are Opening Up Access To Their Courses;
Taylor Walsh, Princeton University Press, 2011. ISBN 978-0-691-14874-8
Stephen Carson and Jan Philipp Schmidt. The Massive Open Online Professor (http:/ / www.academicmatters.
ca/ 2012/ 05/ the-massive-open-online-professor/ ). Academic Matters: The Journal of Higher Education, May
2012.
BBC interviews Jimmy Wales on MOOCs (http:/ / www. bbc. co. uk/ news/ business-22160988), 1 May 2013
Shannon Bohle. Librarians and the Era of the MOOC (http:/ / www.scilogs. com/
scientific_and_medical_libraries/ librarians-and-the-era-of-the-mooc/ ). Nature.com, 9 May 2013.
A Comprehensive List of MOOC Providers (http:/ / www. technoduet. com/
a-comprehensive-list-of-mooc-massive-open-online-courses-providers/ )
Books are MOOCs, Too (http:/ / www. insidehighered. com/ views/ 2013/ 08/ 02/
let-us-count-ways-books-and-moocs-are-alike-essay), Bernard Fryshman, Inside Higher Education, 2 August
2013.
ciputra-uceo.com (http:/ / www. ciputra-uceo. com/ ), First MOOC in Indonesia, 24 August 2013
Interview with Kyle Courtney - Copyright Advisor for Harvard and HarvardX (22:50) (http:/ / degreeoffreedom.
org/ interview-kyle-courtney-copyright-advisor-harvard-harvardx/ ), podcast, Degree of Freedom blog, interview
by Jonathan Haber.
MOOC-less in Africa (http:/ / openuct.uct. ac. za/ blog/ mooc-less-africa) by OpenUCT's (http:/ / openuct. uct.
ac. za/ ) Professor Laura Czerniewicz & Uvania Naidoo
(https:/ / soundcloud. com/ theeconomist/ moocs-the-fall-of-the-ivory)
MOOC List (http:/ / www. mooc-list. com/ ), A complete list of Massive Open Online Courses offered by the best
universities and entities.
Web engineering
18
Web engineering
The web has become a major delivery platform for a variety of complex and sophisticated enterprise applications in
several domains. In addition to their inherent multifaceted functionality, these web applications exhibit complex
behavior and place some unique demands on their usability, performance, security and ability to grow and evolve.
However, a vast majority of these applications continue to be developed in an ad-hoc way, contributing to problems
of usability, maintainability, quality and reliability.
[1][2]
While web development can benefit from established
practices from other related disciplines, it has certain distinguishing characteristics that demand special
considerations. In recent years, there have been developments towards addressing these considerations.
As an emerging discipline, web engineering actively promotes systematic, disciplined and quantifiable approaches
towards successful development of high-quality, ubiquitously usable web-based systems and applications.
[3]
In
particular, web engineering focuses on the methodologies, techniques and tools that are the foundation of web
application development and which support their design, development, evolution, and evaluation. Web application
development has certain characteristics that make it different from traditional software, information system, or
computer application development.
Web engineering is multidisciplinary and encompasses contributions from diverse areas: systems analysis and
design, software engineering, hypermedia/hypertext engineering, requirements engineering, human-computer
interaction, user interface, information engineering, information indexing and retrieval, testing, modelling and
simulation, project management, and graphic design and presentation. Web engineering is neither a clone, nor a
subset of software engineering, although both involve programming and software development. While web
Engineering uses software engineering principles, it encompasses new approaches, methodologies, tools, techniques,
and guidelines to meet the unique requirements of web-based applications.
Web engineering as a discipline
Proponents of web engineering supported the establishment of web engineering as a discipline at an early stage of
web. First Workshop on Web Engineering was held in conjunction with World Wide Web Conference held in
Brisbane, Australia, in 1998. San Murugesan, Yogesh Deshpande, Steve Hansen and Athula Ginige, from University
of Western Sydney, Australia formally promoted web engineering as a new discipline in the first ICSE workshop on
Web Engineering in 1999. Since then they published a series of papers in a number of journals, conferences and
magazines to promote their view and got wide support. Major arguments for web engineering as a new discipline
are:
Web-based Information Systems (WIS) development process is different and unique.
[4]
Web engineering is multi-disciplinary; no single discipline (such as software engineering) can provide complete
theory basis, body of knowledge and practices to guide WIS development.
[5]
Issues of evolution and lifecycle management when compared to more 'traditional' applications.
Web based information systems and applications are pervasive and non-trivial. The prospect of web as a platform
will continue to grow and it is worth being treated specifically.
However, it has been controversial, especially for people in other traditional disciplines such as software
engineering, to recognize web engineering as a new field. The issue is how different and independent web
engineering is, compared with other disciplines.
Main topics of Web engineering include, but are not limited to, the following areas:
Web engineering
19
Web requirements modeling disciplines
Business Processes for Applications on the Web
Process Modelling of Web applications.
Requirements Engineering for Web applications
B2B applications
Web system design disciplines, tools and methods
UML and the Web
Conceptual Modeling of Web Applications (aka. Web modeling)
Prototyping Methods and Tools
Web design methods
CASE Tools for Web Applications
Web Interface Design
Data Models for Web Information Systems
Web system implementation disciplines
Integrated Web Application Development Environments
Code Generation for Web Applications
Software Factories for/on the Web
Web 2.0, AJAX, E4X, ASP.NET, PHP and Other New Developments
Web Services Development and Deployment
Empirical Web Engineering
Web system testing disciplines
Testing and Evaluation of Web systems and Applications
Testing Automation, Methods and Tools
Web applications categories disciplines
Semantic Web applications
Ubiquitous and Mobile Web Applications
Mobile Web Application Development
Device Independent Web Delivery
Localization and Internationalization Of Web Applications
Attributes of web based system and applications
Web quality attributes disciplines
Web Metrics, Cost Estimation, and Measurement
Personalisation and Adaptation of Web applications
Web Quality
Usability of Web Applications
Web accessibility
Performance of Web-based applications
Web engineering
20
Content-related disciplines
Web Content Management
Multimedia Authoring Tools and Software
Authoring of adaptive hypermedia
Web engineering education
Master of Science: Web Engineering as a branch of study within the MSc program Web Sciences at the Johannes
Kepler University Linz, Austria
[6]
References
[1] [1] Roger S Pressman, "Can Internet Applications be Engineered?" IEEE Software, Vol. 15, No. 5, Sep/Oct 1998, pp 104-110
[2] [2] Roger S Pressman, "What a Tangled Web we Weave," IEEE Software, Jan/Feb 2001, Vol. 18, No.1, pp 18-21
[3] [3] San Murugesan, Yogesh Deshpande, Steve Hansen and Athula Ginige, "Web Engineering: A New Discipline for Development of Web-based
Systems," Proceedings of the First International Conference of Software Engineering (ICSE) Workshop on Web Engineering, Los Angeles,
USA, 1999. Also published in Web Engineering: Managing Diversity and Complexity of Web Application Development, San Murugesan and
Yogesh Deshpande (Eds), LNCS 2016, Springer Verlag, Berlin Heidelberg, 2001Athula Ginige and San Murugesan, "Web Engineering: An
Introduction," IEEE Multimedia, Vol. 8, No. 1, January 2001, pp 14-18
[4] [4] Gerti Kappel, Birgit Proll, Seiegfried, and Werner Retschitzegger, "An Introduction to Web Engineering," in Web Engineering, Gerti Kappel,
et al. (eds.) John Wiley and Sons, Heidelberg, Germany, 2003
[5] [5] Yogesh Deshpande, and Steve Hansen, "Web Engineering: Creating Discipline among Disciplines," IEEE Multimedia, Vol. 8, No. 1, January
2001, pp 81-86
[6] http:/ / www. jku. at/ content/ e262/ e242/ e2380/ e131292
Sources
Robert L. Glass, "Who's Right in the Web Development Debate?" Cutter IT Journal, July 2001, Vol. 14, No.7, pp
6-10.
S. Ceri, P. Fraternali, A. Bongio, M. Brambilla, S. Comai, M. Matera. "Designing Data-Intensive Web
Applications". Morgan Kaufmann Publisher, Dec 2002, ISBN 1-55860-843-5
Web engineering resources
Organizations
International Society for Web Engineering e.V.: http:/ / www. iswe-ev. de/
Web Engineering Community: http:/ / www. webengineering. org
WISE Society: http:/ / www. wisesociety. org/
ACM SIGWEB: http:/ / www. acm. org/ sigweb
World Wide Web Consortium: http:/ / www. w3. org
Books
"Engineering Web Applications", by Sven Casteleyn, Florian Daniel, Peter Dolog and Maristella Matera,
Springer, 2009, ISBN 978-3-540-92200-1
"Handbook of Research on Web 2.0, 3.0, and X.0: Technologies, Business, and Social Applications", San
Murugesan (Editor), Information Science Research, Hershey - New York, October 2009, ISBN
978-1-60566-384-5
"Web Engineering: Modelling and Implementing Web Applications", edited by Gustavo Rossi, Oscar Pastor,
Daniel Schwabe and Luis Olsina, Springer Verlag HCIS, 2007, ISBN 978-1-84628-922-4
"Cost Estimation Techniques for Web Projects", Emilia Mendes, IGI Publishing, ISBN 978-1-59904-135-3
"Web Engineering - The Discipline of Systematic Development of Web Applications", edited by Gerti Kappel,
Birgit Prll, Siegfried Reich, and Werner Retschitzegger, John Wiley & Sons, 2006
Web engineering
21
"Web Engineering", edited by Emilia Mendes and Nile Mosley, Springer-Verlag, 2005
"Web Engineering: Principles and Techniques", edited by Woojong Suh, Idea Group Publishing, 2005
"Building Web Applications with UML" (2nd edition), by Jim Conallen, Pearson Education, 2003
"Information Architecture for the World Wide Web" (2nd edition), by Peter Morville and Louis Rosenfeld,
O'Reilly, 2002
"Web Site Engineering: Beyond Web Page Design", by Thomas A. Powell, David L. Jones and Dominique C.
Cutts, Prentice Hall, 1998
"Designing Data-Intensive Web Applications", by S. Ceri, P. Fraternali, A. Bongio, M. Brambilla, S. Comai, M.
Matera. Morgan Kaufmann Publisher, Dec 2002, ISBN 1-55860-843-5
Conferences
World Wide Web Conference (by IW3C2, since 1994): http:/ / www.iw3c2. org
International Conference on Web Engineering (ICWE) (since 2000)
2007: http:/ / www. icwe2007. org/
2006: http:/ / www. icwe2006. org
2005: http:/ / www. icwe2005. org
2004: http:/ / www. icwe2004. org
ICWE Conference Proceedings
ICWE2007: LNCS 4607 http:/ / www. springer. com/ computer/ database+ management+ & + information+
retrieval/ book/ 978-3-540-73596-0
ICWE2005: LNCS 3579 http:/ / www. springer. com/ east/ home/ generic/ search/
results?SGWID=5-40109-22-58872076-0
ICWE2004: LNCS 3140 http:/ / www. springer. com/ east/ home/ generic/ search/
results?SGWID=5-40109-22-32445543-0
ICWE2003: LNCS 2722 http:/ / www. springer. com/ east/ home/ generic/ search/
results?SGWID=5-40109-22-3092664-0
Web Information Systems Engineering Conference (by WISE Society, since 2000): http:/ / www.wisesociety.
org/
International Conference on Web Information Systems and Technologies (WebIST) (since 2005): http:/ / www.
webist. org/
International Workshop on Web Site Evolution (WSE): http:/ / www.websiteevolution. org/
International Conference on Software Engineering: http:/ / www.icse-conferences. org/
Book chapters and articles
Murugesan,S and A.Ginige, A. "Web Engineering: Introduction and Perspectives", Chapter 1 in "Web
Engineering: Principles and Techniques" (Suh, W. ed.), Idea Group Publishing, 2005. http:/ / www.idea-group.
com/ downloads/ excerpts/ 01%20Suh. pdf
Pressman, R.S., 'Applying Web Engineering', Part 3, Chapters 16-20, in Software Engineering: A Practitioner's
Perspective, Sixth Edition, McGraw-Hill, New York, 2004. http:/ / www.rspa. com/ '
Journals
Journal of Web Engineering: http:/ / www. rintonpress. com/ journals/ jwe/
International Journal of Web Engineering and Technology: http:/ / www.inderscience. com/ browse/ index.
php?journalID=48
ACM Transactions on Internet Technology: http:/ / toit.acm. org/
World Wide Web (Springer): http:/ / link. springer. com/ journal/ 11280
Web coding journal: http:/ / www. web-code. org/
Special issues
Web engineering
22
Web Engineering, IEEE MultiMedia, Jan.-Mar. 2001 (Part 1) and April-June 2001 (Part 2). http:/ / csdl2.
computer. org/ persagen/ DLPublication. jsp?pubtype=m& acronym=mu
Usability Engineering, IEEE Software, January-February 2001.
Web Engineering, Cutter IT Journal, 14(7), July 2001.*
Testing E-business Applications, Cutter IT Journal, September 2001.
Engineering Internet Software, IEEE Software, March-April 2002.
Usability and the Web, IEEE Internet Computing, March-April 2002.
Iversity
23
Iversity
iversity
Web address
www.iversity.org
[1]
Commercial? No
Type of site Online education
Registration Required
Available language(s) English and German
Owner Jonas Liepmann and Hannes Klpper
Created by Jonas Liepmann and Hannes Klpper
Launched October2013
Current status Active
iversity.org is a MOOC provider based in Bernau bei Berlin. iversity specialises in providing online courses and
lectures in higher education, specifically MOOCs (Massive Open Online Courses) . As opposed to the US-American
provider Coursera, the iversity platform works together with professors to provide each course. Courses are free and
open for anyone to enrol and participate. Courses are mainly conducted in English or German, but also Russian and
Italian, with the addition of more languages are in the planning. Some of the courses were winners of the MOOC
Production Fellowship held in early 2013 . iversity.org officially launched the MOOC platform online on 15 October
2013, with 24 MOOCs and over 100,000 users . The goals for 2014 are to have 1 million users and over 100 courses
.
History
In 2008, Jonas Liepmann, at the time a student of Cultural Studies at Humboldt University of Berlin, created iversity
as an educational platform for students and professors. In 2011, Hannes Klpper and Jonas Liepmann founded
iversity as a GmbH after receiving funding from the EXist-Founder Scholarship (EXIST funding) through the BMWi
(Federal Ministry of Economics and Technology) and the EU. iversity became an online platform for MOOCs in
2012 . Marcus Riecke joined the team and invested in the company together with the existing investors, Masoud
Kamali and T-Venture, the venture arm of Deutsche Telekom AG. In 2013, Hannes Klpper and Marcus Riecke
were the Managing Directors of iversity.
MOOC Production Fellowship
iversity, in cooperation with the Donor's Association for German Science, ran the MOOC Production Fellowship in
2013. t250,000 was set aside to fund the production of 10 MOOCs. Half of the funding was allocated for German
language MOOC production. It was considered a big success, with 250 professors applying and 100,000 votes from
around the world. The judging panel included, among others, Jorg Drager, Hamburg's Science Senator and member
of Bertelsmann Foundation for Education, Prof Jurgen Kluge, expert in innovation management, and Prof Jorn
Loviscach, a lecturer in Mathematics at MOOC provider Udacity, and Christian Spannagelhaus, Math professor at
Heidelberg Teachers College.
Iversity
24
Courses
iversity has 24 MOOCs and is expanding continually. Professors and universities worldwide are open to working
with iversity. Current partners include: KU Leuven, Universidad Autonoma de Madrid, University of Florence, the
University of Hamburg and the Pratt Institute in New York.
Courses on iversity include: DNA, Dark Matter, Medicine, storytelling, Internet Privacy, Web Engineering,
Architecture, Math, and others. The courses on iversity have short video lectures with assignments.
Course Structure
Courses are open and free to anyone. Course levels vary from introductory level to final year undergraduate level.
Some courses may recommend previous knowledge on the subject.
Courses consist of Chapters, Units and Assessments. A MOOC will typically consist of 8 Chapters. One chapter will
be released per week. Each chapter will contain 6-10 units. These units consist of 3-8 minutes long videos, that have
interactive quizzes and homework. Depending on the instructor there may be a peer-to-peer review assessments and
group projects. An exam will be held at the end of each course.
Discussion forums make up a large part of the course infrastructure, and is considered beneficial to the learning
experience. Instructors and TAs moderate and guide these discussions and ensure quality control.
ECTS Credits
ECTS credits can be obtained from participation in three iversity MOOCs. The MOOCs can be taken remotely, and
the final examination must be taken in each respective university campus for the credits to be awarded. iversity is the
first MOOCs provider to offer ECTS credits.
These courses are:
"Algorithms and Data Structures" from University of Osnabrck
"Fundamentals of Marketing" from Lbeck University of Applied Sciences
"Introduction to Business Administration" from RWTH Aachen
References
[1] https:/ / www. iversity.org/
External links
Official website (https:/ / iversity. org)
Official blog (https:/ / iversity. org/ blog/ )
List of all courses offered by iversity (http:/ / getfreeeducation. blogspot. com/ 2013/ 10/
24-free-courses-offered-by-iversity-new. html)
25
Chapter 11: Starter Kit: Tools for the
HTML5 App in the Cloud
VirtualBox
VirtualBox
Running Kubuntu Live CD with Oracle VM VirtualBox on Windows 7
Original author(s) innotek GmbH
Developer(s) Oracle Corporation
Initial release 15January 2007
Stable release
4.3.6 (December18, 2013) []
[1]
Written in C, C++
Operating system Microsoft Windows, Mac OS X, Linux and Solaris
Size 40-101 MB depending on platform
Type Virtual machine
License
Base Package: GNU General Public License version 2 (Optionally CDDL for most files of the source distribution),
"Extension Pack": PUEL
[2]
Website
www.virtualbox.org
[3]
Oracle VM VirtualBox (formerly Sun VirtualBox, Sun xVM VirtualBox and innotek VirtualBox) is a
virtualization software package for x86 and AMD64/Intel64-based computers from Oracle Corporation as part of its
family of virtualization products. It was created by innotek GmbH, purchased in 2008 by Sun Microsystems, and
now developed by Oracle. It is installed on an existing host operating system as an application; this host application
allows additional guest operating systems, each known as a Guest OS, to be loaded and run, each with its own virtual
environment.
Supported host operating systems include Linux, Mac OS X, Windows XP, Windows Vista, Windows 7, Windows
8, Solaris, and OpenSolaris; there is also a port to FreeBSD. Supported guest operating systems include versions and
VirtualBox
26
derivations of Windows, Linux, BSD, OS/2, Solaris and others. Since release 3.2.0, VirtualBox also allows limited
virtualization of Mac OS X guests on Apple hardware, though OSX86 can also be installed using VirtualBox.
Since version 4.1, Windows guests on supported hardware can take advantage of the recently implemented WDDM
driver included in the guest additions; this allows Windows Aero to be enabled along with Direct3D support.
History
Logo of
VirtualBox OSE,
2007
VirtualBox was initially offered by the innotek GmbH under a proprietary software license,
making one version of the product available at no cost for personal or evaluation use, subject to
the VirtualBox Personal Use and Evaluation License (PUEL). In January 2007, based on counsel
by LiSoG, innotek GmbH released VirtualBox Open Source Edition (OSE) as free and
open-source software, subject to the requirements of the GNU General Public License (GPL),
version 2.
The innotek GmbH also contributed to the development of OS/2 and Linux support in
virtualization and OS/2 ports of products from Connectix which were later acquired by
Microsoft. Specifically, innotek developed the "additions" code in both Microsoft Virtual PC and Microsoft Virtual
Server, which enables various host-guest OS interactions like shared clipboards or dynamic viewport resizing.
Sun Microsystems acquired innotek in February 2008.
Oracle Corporation acquired Sun in January 2010 and re-branded the product as "Oracle VM VirtualBox".
Licensing
With version 4 of VirtualBox, released in December 2010, the core package is free software released under GNU
General Public License version 2 (GPLv2). This is the fully featured package, excluding some proprietary
components not available under GPLv2. These components provide support for USB 2.0 devices, Remote Desktop
Protocol (RDP) and Preboot Execution Environment (PXE) for Intel cards and are released as a separate "VirtualBox
Oracle VM VirtualBox extension pack" under a proprietary Personal Use and Evaluation License (PUEL), which
permits use of the software for personal use, educational use, or evaluation, free of charge.
Oracle defines personal use as any situation in which one person installs the software, and only that individual, and
their friends and family, use the software. Oracle does not care if that use is for commercial or non-commercial
purposes. Oracle would consider it non-personal use, for example, if a network administrator installed many copies
of the software on many different machines, on behalf of many different end-users. That type of situation would
require purchasing a special volume license.
Prior to version 4, there were two different packages of the VirtualBox software. The full package was offered free
under the PUEL, with licenses for other commercial deployment purchasable from Oracle. A second package called
the VirtualBox Open Source Edition (OSE) was released under GPLv2. This removed the same proprietary
components not available under GPLv2.
Although VirtualBox has experimental support for Mac OS X guests, the end user license agreement of Mac OS X
does not permit the operating system to run on non-Apple hardware, enforced within the operating system by calls to
the Apple System Management Controller (SMC) in all Apple machines, which verifies the authenticity of the
hardware.
VirtualBox
27
Emulated environment
Running Ubuntu Live CD with Oracle VM
VirtualBox on Ubuntu
Users of VirtualBox can load multiple guest OSs under a single host
operating-system (host OS). Each guest can be started, paused and
stopped independently within its own virtual machine (VM). The user
can independently configure each VM and run it under a choice of
software-based virtualization or hardware assisted virtualization if the
underlying host hardware supports this. The host OS and guest OSs
and applications can communicate with each other through a number
of mechanisms including a common clipboard and a virtualized
network facility. Guest VMs can also directly communicate with each
other if configured to do so.
Software-based virtualization
In the absence of hardware-assisted virtualization, VirtualBox adopts a standard software-based virtualization
approach. This mode supports 32-bit guest OSs which run in rings 0 and 3 of the Intel ring architecture.
The system reconfigures the guest OS code, which would normally run in ring 0, to execute in ring 1 on the host
hardware. Because this code contains many privileged instructions which cannot run natively in ring 1,
VirtualBox employs a Code Scanning and Analysis Manager (CSAM) to scan the ring 0 code recursively before
its first execution to identify problematic instructions and then calls the Patch Manager (PATM) to perform in-situ
patching. This replaces the instruction with a jump to a VM-safe equivalent compiled code fragment in hypervisor
memory.
The guest user-mode code, running in ring 3, generally runs directly on the host hardware in ring 3.
In both cases, VirtualBox uses CSAM and PATM to inspect and patch the offending instructions whenever a fault
occurs. VirtualBox also contains a dynamic recompiler, based on QEMU to recompile any real mode or protected
mode code entirely (e.g. BIOS code, a DOS guest, or any operating system startup).
Using these techniques, VirtualBox can achieve a performance comparable to that of VMware.
Hardware-assisted virtualization
VirtualBox supports both Intel's VT-x and AMD's AMD-V hardware-virtualization. Making use of these facilities,
VirtualBox can run each guest VM in its own separate address-space; the guest OS ring 0 code runs on the host at
ring 0 in VMX non-root mode rather than in ring1.
VirtualBox supports some guests (including 64-bit guests, SMP guests and certain proprietary OSs) only on hosts
with hardware-assisted virtualization.
Device virtualization
The system emulates hard disks in one of three disk image formats:
1. 1. a VirtualBox-specific container format, called "Virtual Disk Image" (VDI), storing files (with a .vdi suffix) on the
host operating system
2. VMware Virtual Machine Disk Format (VMDK)
3. Microsoft Virtual PC VHD format
A VirtualBox virtual machine can, therefore, use disks previously created in VMware or Microsoft Virtual PC, as
well as its own native format. VirtualBox can also connect to iSCSI targets and to raw partitions on the host, using
either as virtual hard disks. VirtualBox emulates IDE (PIIX4 and ICH6 controllers), SCSI, SATA (ICH8M
controller) and SAS controllers to which hard drives can be attached.
VirtualBox
28
VirtualBox has supported Open Virtualization Format (OVF) since version 2.2.0 (April 2009).
Both ISO images and host-connected physical devices can be mounted as CD/DVD drives. For example, the DVD
image of a Linux distribution can be downloaded and used directly by VirtualBox.
By default VirtualBox provides graphics support through a custom virtual graphics-card that is VESA compatible.
The Guest Additions for Windows, Linux, Solaris, OpenSolaris, or OS/2 guests include a special video-driver that
increases video performance and includes additional features, such as automatically adjusting the guest resolution
when resizing the VM window or desktop composition via virtualized WDDM drivers .
For an Ethernet network adapter, VirtualBox virtualizes these Network Interface Cards:
AMD PCnet PCI II (Am79C970A)
AMD PCnet-Fast III (Am79C973)
Intel Pro/1000 MT Desktop (82540EM)
Intel Pro/1000 MT Server (82545EM)
Intel Pro/1000 T Server (82543GC)
The emulated network cards allow most guest OSs to run without the need to find and install drivers for networking
hardware as they are shipped as part of the guest OS. A special paravirtualized network adapter is also available,
which improves network performance by eliminating the need to match a specific hardware interface, but requires
special driver support in the guest. (Many distributions of Linux ship with this driver included.) By default,
VirtualBox uses NAT through which Internet software for end-users such as Firefox or ssh can operate. Bridged
networking via a host network adapter or virtual networks between guests can also be configured. Up to 36 network
adapters can be attached simultaneously, but only four are configurable through the graphical interface.
For a sound card, VirtualBox virtualizes Intel HD Audio, Intel ICH AC'97 and SoundBlaster 16 devices.
A USB 1.1 controller is emulated so that any USB devices attached to the host can be seen in the guest. The
closed-source extension pack adds a USB 2.0 controller and, if VirtualBox acts as an RDP server, it can also use
USB devices on the remote RDP client as if they were connected to the host, although only if the client supports this
VirtualBox-specific extension (Oracle provides clients for Solaris, Linux and Sun Ray thin clients that can do this,
and have promised support for other platforms in future versions).
Feature set
64-bit guests (hardware virtualization support is required)
NCQ support for SATA, SCSI and SAS raw disks and partitions
Snapshots
Seamless mode - the ability to run virtualized applications side by side with your normal desktop applications
Shared clipboard
Shared folders
Special drivers and utilities to facilitate switching between systems
Command line interaction (in addition to the GUI)
Public API (Java, Python, SOAP, XPCOM) to control VM configuration and execution
Nested paging for AMD-V and Intel VT (only for processors supporting SLAT and with SLAT enabled)
Raw hard disk access - allows physical hard disk partitions on the host system to appear in the guest system
VMware Virtual Machine Disk (VMDK) format support - allows VirtualBox to exchange disk images with
VMware
Microsoft VHD support
Limited support for 3D graphics acceleration (including OpenGL up to (but not including) 3.0 and Direct3D 9.0c
via Wine's Direct3D to OpenGL translation)
SMP support (up to 32 virtual CPUs per virtual machine), since version 3.0
VirtualBox
29
Teleportation (aka Live Migration), since version 3.1 (Broken since version 4.1, but fixed in 4.2.18)
2D video output acceleration (not to be mistaken with video decoding acceleration), since version 3.1
Since version 3.2
Mac OS X Server guest support - experimental
Memory ballooning (not available on Solaris hosts)
RAM deduplication (Page Fusion) for Windows guests on 64-bit hosts
CPU hot-plugging for Linux (hot-add and hot-remove) and certain Windows guests (hot-add only)
Deleting snapshots while the VM is running
Multi-monitor guest setups in the GUI, for Windows guests
LSI Logic SAS controller emulation
Remote Desktop Protocol (RDP) video acceleration
Run and control guest applications from the host - for automated software deployments
Since version 4.0
The PUEL/OSE separation was given up in favor of an open source base product and a closed source extension
pack that can be installed on top of the base product. As part of this change, additional components of VirtualBox
were made open source (installers, documentation, device drivers)
Intel HD audio codec emulation
Intel ICH9 chipset emulation
A new VM storage scheme where all VM data is stored in one single folder to improve VM portability
Several UI enhancements including a new look with VM preview and scale mode
On 32-bit hosts, VMs can each use more than 1.5GB of RAM
In addition to OVF, the single file OVA format is supported
CPU use and I/O bandwidth can be limited per VM
Support for Apple DMG images (DVD)
Multi-monitor guest setups for Linux/Solaris guests (previously Windows only)
Resizing of disk image formats from Oracle, VDI (VirtualBox disk image), and Microsoft, VHD (Virtual PC hard
disk)
Since version 4.1
Windows Aero support (experimental)
Virtual machine cloning
Since version 4.2
Virtual machine groups - allows you to manage a group of virtual machines as a single unit (power them on or
off, snapshot them, etc.)
Some VM settings can be altered during a VM execution
Support up to 36 NICs in case of the ICH9 chipset
Support for limiting network IO bandwidth
Can automatically run VMs on a host system startup
Since version 4.3
VM video capturing support
Host touch devices support (GUI passes host touch-events to guest)/USB virtualization of such devices
VirtualBox
30
The extension pack
Some features require the installation of the closed-source "VirtualBox Extension Pack":
Support for a virtual USB 2.0 controller (EHCI)
VirtualBox RDP: support for proprietary remote connection protocol developed by Microsoft and Citrix.
PXE boot for Intel cards
References
[1] http:/ / en. wikipedia.org/ w/ index.php?title=Template:Latest_stable_software_release/ VirtualBox& action=edit
[2] https:/ / www. virtualbox.org/ wiki/ VirtualBox_PUEL
[3] https:/ / www. virtualbox.org
External links
Official website (https:/ / www. virtualbox.org/ )
Sub-site at Oracle (http:/ / www. oracle. com/ us/ technologies/ virtualization/ oraclevm/ 061976. html)
Virtualbox Downloads (https:/ / www. virtualbox. org/ wiki/ Downloads)
Virtual appliance
A virtual appliance is a virtual machine image designed to run on a virtualization platform (e.g., VirtualBox, Xen,
VMware Workstation, Parallels Workstation).
Virtual appliances are a subset of the broader class of software appliances. Installation of a software appliance on a
virtual machine and packaging that into an image creates a virtual appliance. Like software appliances, virtual
appliances are intended to eliminate the installation, configuration and maintenance costs associated with running
complex stacks of software.
A virtual appliance is not a complete virtual machine platform, but rather a software image containing a software
stack designed to run on a virtual machine platform which may be a Type 1 or Type 2 hypervisor. Like a physical
computer, a hypervisor is merely a platform for running an operating system environment and does not provide
application software itself.
Many virtual appliances provide a Web page user interface to permit their configuration. A virtual appliance is
usually built to host a single application; it therefore represents a new way to deploy applications on a network.
File formats
Virtual appliances are provided to the user or customer as files, via either electronic downloads or physical
distribution. The file format most commonly used is the Open Virtualization Format (OVF). The Distributed
Management Task Force (DMTF) publishes the OVF specification documentation. Most virtualization vendors,
including VMware, Microsoft, Oracle, and Citrix, support OVF for virtual appliances.
Relationship to grid computing
Virtualization solves a key problem in the grid computing arena - namely, the reality that any sufficiently large grid
will inevitably consist of a wide variety of heterogeneous hardware and operating system configurations. Adding
virtual appliances into the picture allows for extremely rapid provisioning of grid nodes and importantly, cleanly
decouples the grid operator from the grid consumer by encapsulating all knowledge of the application within the
virtual appliance.
Virtual appliance
31
Relationship to infrastructure as a service cloud computing
Virtual appliances are critical resources in infrastructure as a service cloud computing. The file format of the virtual
appliance is the concern of the cloud provider and usually not relevant to the cloud user even though the cloud user
may be the owner of the virtual appliance. However, challenges may arise with the transfer of virtual appliance
ownership or transfer of virtual appliances between cloud data centers. In this case, virtual appliance copy or
export/import features can be used to overcome this problem.
[1]
Relationship to software as a service (SaaS)
With the rise of virtualization as a platform for hosted services provision, virtual appliances have come to provide a
direct route for traditional on-premises applications to be rapidly redeployed in a software as a service (SaaS) mode -
without requiring major application re-architecture for multi-tenancy. By decoupling the hardware and operating
system infrastructure provider from the application stack provider, virtual appliances allow economies of scale on
the one side to be leveraged by the economy of simplicity on the other. Traditional approaches to SaaS, such as that
touted by Salesforce.com, leverage shared infrastructure by forcing massive change and increased complexity on the
software stack.
A concrete example of the virtual appliances approach to delivering SaaS is the Amazon Elastic Compute Cloud
(EC2) - a grid of Xen hypervisor nodes coupled with the availability of pre-packaged virtual appliances in the
Amazon Machine Image format. Amazon EC2 reduces the cost-barrier to the point where it becomes feasible to have
each customer of a hosted SaaS solution provisioned with their own virtual appliance instance(s) rather than forcing
them to share common instances. Prior to EC2, single-tenant hosted models were too expensive, leading to the
failure of many early ASP offerings.
Furthermore, in contrast to the multi-tenancy approaches to SaaS, a virtual appliance can also be deployed
on-premises for customers that need local network access to the running application, or have security requirements
that a third-party hosting model does not meet. The underlying virtualization technology also allows for rapid
movement of virtual appliances instances between physical execution environments. Traditional approaches to SaaS
fix the application in place on the hosted infrastructure.
References
[1] Wu C F, Wang Y S, Liu G N, Amies, A, 2012, Create solutions on IBM SmartCloud Enterprise: Transfer image assets between different
accounts (http:/ / www. ibm.com/ developerworks/ cloud/ library/ cl-smartcloudsolution2/ index. html) IBM developerWorks, June 6.
External links
Turnkey Linux - Virtual Appliance Library (http:/ / www. turnkeylinux. org/ )
virtualbox images (http:/ / virtualboximages. com/ )
BitTorrent
32
BitTorrent
Part of a series on
File sharing
Technologies
Peer to peer
BitTorrent
File hosting services
Development and societal aspects
Timeline
Legal aspects
Non-public file sharing
Anonymous P2P
Friend-to-friend
Darknet
Private P2P
File sharing networks and services
Gnutella/ Gnutella2 (G2)
FastTrack
eDonkey
Direct Connect
Mininova
isoHunt
The Pirate Bay
Bitcoin
By country or region
Canada
UK
Related
PeerBlock
v
t
e
[1]
BitTorrent is a protocol supporting the practice of peer-to-peer file sharing that is used to distribute large amounts
of data over the Internet. BitTorrent is one of the most common protocols for transferring large files, and
peer-to-peer networks have been estimated to collectively account for approximately 43% to 70% of all Internet
traffic (depending on geographical location) as of February 2009[2]. In November 2004, BitTorrent was responsible
for 35% of all Internet traffic. As of February 2013, BitTorrent was responsible for 3.35% of all worldwide
bandwidth, more than half of the 6% of total bandwidth dedicated to file sharing.
[3]
BitTorrent
33
Programmer Bram Cohen, a former University at Buffalo graduate student in Computer Science, designed the
protocol in April 2001 and released the first available version on July 2, 2001, and the final version in 2008.
BitTorrent clients are available for a variety of computing platforms and operating systems including an official
client released by Bittorrent, Inc.
As of 2009, BitTorrent reportedly had about the same number of active users online as viewers of YouTube and
Facebook combined. As of January 2012[2], BitTorrent is utilized by 150 million active users (according to
BitTorrent, Inc.). Based on this figure, the total number of monthly BitTorrent users can be estimated at more than a
quarter of a billion.
Description
The middle computer is acting as a seed to
provide a file to the other computers which act as
peers.
The BitTorrent protocol can be used to reduce the server and network
impact of distributing large files. Rather than downloading a file from
a single source server, the BitTorrent protocol allows users to join a
"swarm" of hosts to download and upload from each other
simultaneously. The protocol is an alternative to the older single
source, multiple mirror sources technique for distributing data, and can
work over networks with lower bandwidth. Using the BitTorrent
protocol, several basic computers, such as home computers, can
replace large servers while efficiently distributing files to many
recipients. This lower bandwidth usage also helps prevent large spikes
in internet traffic in a given area, keeping internet speeds higher for all
users in general, regardless of whether or not they use the BitTorrent
protocol.
A user who wants to upload a file first creates a small torrent
descriptor file that they distribute by conventional means (web, email,
etc.). They then make the file itself available through a BitTorrent node acting as a seed. Those with the torrent
descriptor file can give it to their own BitTorrent nodes which, acting as peers or leechers, download it by
connecting to the seed and/or other peers (see diagram on the right).
The file being distributed is divided into segments called pieces. As each peer receives a new piece of the file it
becomes a source (of that piece) for other peers, relieving the original seed from having to send that piece to every
computer or user wishing a copy. With BitTorrent, the task of distributing the file is shared by those who want it; it
is entirely possible for the seed to send only a single copy of the file itself and eventually distribute to an unlimited
number of peers.
Each piece is protected by a cryptographic hash contained in the torrent descriptor. This ensures that any
modification of the piece can be reliably detected, and thus prevents both accidental and malicious modifications of
any of the pieces received at other nodes. If a node starts with an authentic copy of the torrent descriptor, it can
verify the authenticity of the entire file it receives.
Pieces are typically downloaded non-sequentially and are rearranged into the correct order by the BitTorrent Client,
which monitors which pieces it needs, and which pieces it has and can upload to other peers. Pieces are of the same
size throughout a single download (for example a 10MB file may be transmitted as ten 1MB Pieces or as forty
256KB Pieces). Due to the nature of this approach, the download of any file can be halted at any time and be
resumed at a later date, without the loss of previously downloaded information, which in turn makes BitTorrent
particularly useful in the transfer of larger files. This also enables the client to seek out readily available pieces and
download them immediately, rather than halting the download and waiting for the next (and possibly unavailable)
piece in line, which typically reduces the overall length of the download.
BitTorrent
34
When a peer completely downloads a file, it becomes an additional seed. This eventual shift from peers to seeders
determines the overall "health" of the file (as determined by the number of times a file is available in its complete
form).
The distributed nature of BitTorrent can lead to a flood like spreading of a file throughout many peer computer
nodes. As more peers join the swarm, the likelihood of a complete successful download by any particular node
increases. Relative to traditional Internet distribution schemes, this permits a significant reduction in the original
distributor's hardware and bandwidth resource costs.
Distributed downloading protocols in general provide redundancy against system problems, reduces dependence on
the original distributor
[4]
and provides sources for the file which are generally transient and therefore harder to trace
by those who would block distribution compared to the situation provided by limiting availability of the file to a
fixed host machine (or even several).
One such example of BitTorrent being used to reduce the distribution cost of file transmission is in the BOINC
Client-Server system. If a BOINC distributed computing application needs to be updated (or merely sent to a user) it
can do so with little impact on the BOINC Server.
Operation
A BitTorrent client is any program that implements the BitTorrent protocol. Each client is capable of preparing,
requesting, and transmitting any type of computer file over a network, using the protocol. A peer is any computer
running an instance of a client.
To share a file or group of files, a peer first creates a small file called a "torrent" (e.g. MyFile.torrent). This file
contains metadata about the files to be shared and about the tracker, the computer that coordinates the file
distribution. Peers that want to download the file must first obtain a torrent file for it and connect to the specified
tracker, which tells them from which other peers to download the pieces of the file.
Though both ultimately transfer files over a network, a BitTorrent download differs from a classic download (as is
typical with an HTTP or FTP request, for example) in several fundamental ways:
BitTorrent makes many small data requests over different TCP connections to different machines, while classic
downloading is typically made via a single TCP connection to a single machine.
BitTorrent downloads in a random or in a "rarest-first" approach that ensures high availability, while classic
downloads are sequential.
Taken together, these differences allow BitTorrent to achieve much lower cost to the content provider, much higher
redundancy, and much greater resistance to abuse or to "flash crowds" than regular server software. However, this
protection, theoretically, comes at a cost: downloads can take time to rise to full speed because it may take time for
enough peer connections to be established, and it may take time for a node to receive sufficient data to become an
effective uploader. This contrasts with regular downloads (such as from an HTTP server, for example) that, while
more vulnerable to overload and abuse, rise to full speed very quickly and maintain this speed throughout.
In general, BitTorrent's non-contiguous download methods have prevented it from supporting progressive download
or "streaming playback". However, comments made by Bram Cohen in January 2007 suggest that streaming torrent
downloads will soon be commonplace and ad supported streaming appears to be the result of those comments. In
January 2011 Cohen demonstrated an early version of BitTorrent streaming, saying the feature was projected to be
available by summer 2011. As of 2013, this new BitTorrent streaming protocol is available for beta testing.
BitTorrent
35
Creating and publishing torrents
The peer distributing a data file treats the file as a number of identically sized pieces, usually with byte sizes of a
power of 2, and typically between 32 kB and 16 MB each. The peer creates a hash for each piece, using the SHA-1
hash function, and records it in the torrent file. Pieces with sizes greater than 512 kB will reduce the size of a torrent
file for a very large payload, but is claimed to reduce the efficiency of the protocol. When another peer later receives
a particular piece, the hash of the piece is compared to the recorded hash to test that the piece is error-free. Peers that
provide a complete file are called seeders, and the peer providing the initial copy is called the initial seeder.
The exact information contained in the torrent file depends on the version of the BitTorrent protocol. By convention,
the name of a torrent file has the suffix .orren. Torrent files have an "announce" section, which specifies the
URL of the tracker, and an "info" section, containing (suggested) names for the files, their lengths, the piece length
used, and a SHA-1 hash code for each piece, all of which are used by clients to verify the integrity of the data they
receive.
Torrent files are typically published on websites or elsewhere, and registered with at least one tracker. The tracker
maintains lists of the clients currently participating in the torrent. Alternatively, in a trackerless system (decentralized
tracking) every peer acts as a tracker. Azureus was the first
[citation needed]
BitTorrent client to implement such a
system through the distributed hash table (DHT) method. An alternative and incompatible DHT system, known as
Mainline DHT, was later developed and adopted by the BitTorrent (Mainline), Torrent, Transmission, rTorrent,
KTorrent, BitComet, and Deluge clients.
After the DHT was adopted, a "private" flag- analogous to the broadcast flag- was unofficially introduced,
telling clients to restrict the use of decentralized tracking regardless of the user's desires. The flag is intentionally
placed in the info section of the torrent so that it cannot be disabled or removed without changing the identity of the
torrent. The purpose of the flag is to prevent torrents from being shared with clients that do not have access to the
tracker. The flag was requested for inclusion in the official specification in August, 2008, but has not been accepted
yet. Clients that have ignored the private flag were banned by many trackers, discouraging the practice.
Downloading torrents and sharing files
Users find a torrent of interest, by browsing the web or by other means, download it, and open it with a BitTorrent
client. The client connects to the tracker(s) specified in the torrent file, from which it receives a list of peers currently
transferring pieces of the file(s) specified in the torrent. The client connects to those peers to obtain the various
pieces. If the swarm contains only the initial seeder, the client connects directly to it and begins to request pieces.
Clients incorporate mechanisms to optimize their download and upload rates; for example they download pieces in a
random order to increase the opportunity to exchange data, which is only possible if two peers have different pieces
of the file.
The effectiveness of this data exchange depends largely on the policies that clients use to determine to whom to send
data. Clients may prefer to send data to peers that send data back to them (a tit for tat scheme), which encourages fair
trading. But strict policies often result in suboptimal situations, such as when newly joined peers are unable to
receive any data because they don't have any pieces yet to trade themselves or when two peers with a good
connection between them do not exchange data simply because neither of them takes the initiative. To counter these
effects, the official BitTorrent client program uses a mechanism called "optimistic unchoking", whereby the client
reserves a portion of its available bandwidth for sending pieces to random peers (not necessarily known good
partners, so called preferred peers) in hopes of discovering even better partners and to ensure that newcomers get a
chance to join the swarm.
Although swarming scales well to tolerate flash crowds for popular content, it is less useful for unpopular content.
Peers arriving after the initial rush might find the content unavailable and need to wait for the arrival of a seed in
order to complete their downloads. The seed arrival, in turn, may take long to happen (this is termed the seeder
BitTorrent
36
promotion problem). Since maintaining seeds for unpopular content entails high bandwidth and administrative costs,
this runs counter to the goals of publishers that value BitTorrent as a cheap alternative to a client-server approach.
This occurs on a huge scale; measurements have shown that 38% of all new torrents become unavailable within the
first month. A strategy adopted by many publishers which significantly increases availability of unpopular content
consists of bundling multiple files in a single swarm. More sophisticated solutions have also been proposed;
generally, these use cross-torrent mechanisms through which multiple torrents can cooperate to better share content.
BitTorrent does not offer its users anonymity. It is possible to obtain the IP addresses of all current and possibly
previous participants in a swarm from the tracker. This may expose users with insecure systems to attacks. It may
also expose users to the risk of being sued, if they are distributing files without permission from the copyright
holder(s). However, there are ways to promote anonymity; for example, the OneSwarm project layers
privacy-preserving sharing mechanisms on top of the original BitTorrent protocol.
Adoption
A growing number of individuals and organizations are using BitTorrent to distribute their own or licensed material.
Independent adopters report that without using BitTorrent technology, and its dramatically reduced demands on their
private networking hardware and bandwidth, they could not afford to distribute their files.
[5]
Film, video, and music
BitTorrent Inc. has obtained a number of licenses from Hollywood studios for distributing popular content from
their websites.
Sub Pop Records releases tracks and videos via BitTorrent Inc. to distribute its 1000+ albums. Babyshambles and
The Libertines (both bands associated with Pete Doherty) have extensively used torrents to distribute hundreds of
demos and live videos. US industrial rock band Nine Inch Nails frequently distributes albums via BitTorrent.
Podcasting software is starting to integrate BitTorrent to help podcasters deal with the download demands of their
MP3 "radio" programs. Specifically, Juice and Miro (formerly known as Democracy Player) support automatic
processing of .torrent files from RSS feeds. Similarly, some BitTorrent clients, such as Torrent, are able to
process web feeds and automatically download content found within them.
DGM Live purchases are provided via BitTorrent.
Vodo, a service which distributes "free-to-share" movies and TV shows via BitTorrent.
[6][7][8]
Broadcasters
In 2008, the CBC became the first public broadcaster in North America to make a full show (Canadas Next Great
Prime Minister) available for download using BitTorrent.
The Norwegian Broadcasting Corporation (NRK) has since March 2008 experimented with bittorrent distribution,
available online. Only selected material in which NRK owns all royalties are published. Responses have been
very positive, and NRK is planning to offer more content.
The Dutch VPRO broadcasting organization released four documentaries in 2009 and 2010 under a Creative
Commons license using the content distribution feature of the Mininova tracker.
BitTorrent
37
Personal material
The Amazon S3 "Simple Storage Service" is a scalable Internet-based storage service with a simple web service
interface, equipped with built-in BitTorrent support.
Blog Torrent offers a simplified BitTorrent tracker to enable bloggers and non-technical users to host a tracker on
their site. Blog Torrent also allows visitors to download a "stub" loader, which acts as a BitTorrent client to
download the desired file, allowing users without BitTorrent software to use the protocol. This is similar to the
concept of a self-extracting archive.
Software
Blizzard Entertainment uses BitTorrent (via a proprietary client called the "Blizzard Downloader") to distribute
content and patches for Diablo III, StarCraft II and World of Warcraft, including the games themselves.
CCP Games, maker of the space Simulation MMORPG Eve Online, has announced that a new launcher will be
released that is based on BitTorrent.
Many software games, especially those whose large size makes them difficult to host due to bandwidth limits,
extremely frequent downloads, and unpredictable changes in network traffic, will distribute instead a specialized,
stripped down bittorrent client with enough functionality to download the game from the other running clients and
the primary server (which is maintained in case not enough peers are available).
Many major open source and free software projects encourage BitTorrent as well as conventional downloads of
their products (via HTTP, FTP etc.) to increase availability and to reduce load on their own servers, especially
when dealing with larger files.
Government
The UK government used BitTorrent to distribute details about how the tax money of UK citizens was spent.
Education
Florida State University uses BitTorrent to distribute large scientific data sets to its researchers.
Many universities that have BOINC distributed computing projects have used the BitTorrent functionality of the
client-server system to reduce the bandwidth costs of distributing the client side applications used to process the
scientific data.
Others
Facebook uses BitTorrent to distribute updates to Facebook servers.
Twitter uses BitTorrent to distribute updates to Twitter servers.
The Internet Archive added Bittorrent to its file download options for over 1.3 million existing files, and all newly
uploaded files, in August 2012.
[9]
This method is the fastest means of downloading media from the Archive.
[10]
As of 2011[2] BitTorrent had 100 million users and a greater share of network bandwidth than Netflix and Hulu
combined.
CableLabs, the research organization of the North American cable industry, estimates that BitTorrent represents 18%
of all broadband traffic.Wikipedia:Manual of Style/Dates and numbers#Precise language In 2004, CacheLogic put
that number at roughly 35% of all traffic on the Internet.Wikipedia:Manual of Style/Dates and numbers#Precise
language The discrepancies in these numbers are caused by differences in the method used to measure P2P traffic on
the Internet.Wikipedia:Verifiability
Routers that use network address translation (NAT) must maintain tables of source and destination IP addresses and
ports. Typical home routers are limited to about 2000 table entries
[citation needed]
while some more expensive routers
have larger table capacities. BitTorrent frequently contacts 20-30 servers per second, rapidly filling the NAT tables.
BitTorrent
38
This is a known cause of some home routers ceasing to work correctly.
Indexing
The BitTorrent protocol provides no way to index torrent files. As a result, a comparatively small number of
websites have hosted a large majority of torrents, many linking to copyrighted material without the authorization of
copyright holders, rendering those sites especially vulnerable to lawsuits. Several types of websites support the
discovery and distribution of data on the BitTorrent network.
Public torrent-hosting sites such as The Pirate Bay allow users to search and download from their collection of
torrent files. Users can typically also upload torrent files for content they wish to distribute. Often, these sites also
run BitTorrent trackers for their hosted torrent files, but these two functions are not mutually dependent: a torrent file
could be hosted on one site and tracked by another unrelated site.
Private host/tracker sites operate like public ones except that they may restrict access to registered users and may
also keep track of the amount of data each user uploads and downloads, in an attempt to reduce leeching.
Search engines allow the discovery of torrent files that are hosted and tracked on other sites; examples include
Mininova, BTDigg, BTJunkie, Torrentz, The Pirate Bay, and isoHunt. These sites allow the user to ask for content
meeting specific criteria (such as containing a given word or phrase) and retrieve a list of links to torrent files
matching those criteria. This list can often be sorted with respect to several criteria, relevance (seeders-leechers ratio)
being one of the most popular and useful (due to the way the protocol behaves, the download bandwidth achievable
is very sensitive to this value). Bram Cohen launched a BitTorrent search engine on http:/ / www. bittorrent. com/
search that co-mingles licensed content with search results. Metasearch engines allow one to search several
BitTorrent indices and search engines at once. DHT search engines monitors the DHT network and indexes torrents
via metadata exchange from peers.
Recently some P2P, decentralized alternatives to Torrent search engines have emerged, see decentralized keyword
search below.
Technologies built on BitTorrent
The BitTorrent protocol is still under development and may therefore still acquire new features and other
enhancements such as improved efficiency.
Distributed trackers
On May 2, 2005, Azureus 2.3.0.0 (now known as Vuze) was released, introducing support for "trackerless" torrents
through a system called the "distributed database." This system is a DHT implementation which allows the client to
use torrents that do not have a working BitTorrent tracker. The following month, BitTorrent, Inc. released version
4.2.0 of the Mainline BitTorrent client, which supported an alternative DHT implementation (popularly known as
"Mainline DHT", outlined in a draft
[11]
on their website) that is incompatible with that of Azureus. Recent
measurement shows users of Mainline DHT is from 10 million to 25 million, with a daily churn of at least 10
million. Mainline DHT is arguably the largest realistic DHT in the world.
Current versions of the official BitTorrent client, Torrent, BitComet, Transmission and BitSpirit all share
compatibility with Mainline DHT. Both DHT implementations are based on Kademlia. As of version 3.0.5.0,
Azureus also supports Mainline DHT in addition to its own distributed database through use of an optional
application plugin. This potentially allows the Azureus/Vuze client to reach a bigger swarm.
Another idea that has surfaced in Vuze is that of virtual torrents. This idea is based on the distributed tracker
approach and is used to describe some web resource. Currently, it is used for instant messaging. It is implemented
using a special messaging protocol and requires an appropriate plugin. Anatomic P2P is another approach, which
uses a decentralized network of nodes that route traffic to dynamic trackers.
BitTorrent
39
Most BitTorrent clients also use Peer exchange (PEX) to gather peers in addition to trackers and DHT. Peer
exchange checks with known peers to see if they know of any other peers. With the 3.0.5.0 release of Vuze, all major
BitTorrent clients now have compatible peer exchange.
Web seeding
Web seeding was implemented in 2006 as the ability of BitTorrent clients to download torrent pieces from an HTTP
source in addition to the swarm. The advantage of this feature is that a website may distribute a torrent for a
particular file or batch of files and make those files available for download from that same web server; this can
simplify long-term seeding and load balancing through the use of existing, cheap, web hosting setups. In theory, this
would make using BitTorrent almost as easy for a web publisher as creating a direct HTTP download. In addition, it
would allow the "web seed" to be disabled if the swarm becomes too popular while still allowing the file to be
readily available.
This feature has two distinct and incompatible specifications.
The first was created by John "TheSHAD0W" Hoffman, who created BitTornado. From version 5.0 onward, the
Mainline BitTorrent client also supports web seeds, and the BitTorrent web site had a simple publishing tool that
creates web seeded torrents. Torrent added support for web seeds in version 1.7. BitComet added support for web
seeds in version 1.14. This first specification requires running a web service that serves content by info-hash and
piece number, rather than filename.
The other specification is created by GetRight authors and can rely on a basic HTTP download space (using byte
serving).
In September 2010, a new service named Burnbit was launched which generates a torrent from any URL using
webseeding.
There are server-side solutions that provide initial seeding of the file from the webserver via standard BitTorrent
protocol and when the number of external seeders reach a limit, they stop serving the file from the original source.
RSS feeds
A technique called broadcatching combines RSS with the BitTorrent protocol to create a content delivery system,
further simplifying and automating content distribution. Steve Gillmor explained the concept in a column for
Ziff-Davis in December, 2003.
[12]
The discussion spread quickly among bloggers (Ernest Miller,
[13]
Chris Pirillo,
etc.). In an article entitled Broadcatching with BitTorrent, Scott Raymond explained:
I want RSS feeds of BitTorrent files. A script would periodically check the feed for new items, and use them
to start the download. Then, I could find a trusted publisher of an Alias RSS feed, and "subscribe" to all new
episodes of the show, which would then start downloading automatically- like the "season pass" feature of
the TiVo.
-Scott Raymond, scottraymond.net
The RSS feed will track the content, while BitTorrent ensures content integrity with cryptographic hashing of all
data, so feed subscribers will receive uncorrupted content.
One of the first and popular software clients (free and open source) for broadcatching is Miro. Other free software
clients such as PenguinTV and KatchTV are also now supporting broadcatching.
The BitTorrent web-service MoveDigital added the ability to make torrents available to any web application capable
of parsing XML through its standard REST-based interface in 2006,
[14]
though this has since been discontinued.
Additionally, Torrenthut is developing a similar torrent API that will provide the same features, and help bring the
torrent community to Web 2.0 standards. Alongside this release is a first PHP application built using the API called
PEP, which will parse any Really Simple Syndication (RSS 2.0) feed and automatically create and seed a torrent for
each enclosure found in that feed.
[15]
BitTorrent
40
Throttling and encryption
Since BitTorrent makes up a large proportion of total traffic, some ISPs have chosen to throttle (slow down)
BitTorrent transfers. For this reason, methods have been developed to disguise BitTorrent traffic in an attempt to
thwart these efforts.
Protocol header encrypt (PHE) and Message stream encryption/Protocol encryption (MSE/PE) are features of some
BitTorrent clients that attempt to make BitTorrent hard to detect and throttle. At the moment Vuze, Bitcomet,
KTorrent, Transmission, Deluge, Torrent, MooPolice, Halite, rTorrent and the latest official BitTorrent client (v6)
support MSE/PE encryption.
In September 2006 it was reported that some software could detect and throttle BitTorrent traffic masquerading as
HTTP traffic.
Reports in August 2007 indicated that Comcast was preventing BitTorrent seeding by monitoring and interfering
with the communication between peers. Protection against these efforts is provided by proxying the client-tracker
traffic via an encrypted tunnel to a point outside of the Comcast network.
[16]
Comcast has more recently called a
"truce" with BitTorrent, Inc. with the intention of shaping traffic in a protocol-agnostic manner. Questions about the
ethics and legality of Comcast's behavior have led to renewed debate about net neutrality in the United States.
In general, although encryption can make it difficult to determine what is being shared, BitTorrent is vulnerable to
traffic analysis. Thus, even with MSE/PE, it may be possible for an ISP to recognize BitTorrent and also to
determine that a system is no longer downloading but only uploading data, and terminate its connection by injecting
TCP RST (reset flag) packets.
Multitracker
Another unofficial feature is an extension to the BitTorrent metadata format proposed by John Hoffman and
implemented by several indexing websites. It allows the use of multiple trackers per file, so if one tracker fails,
others can continue to support file transfer. It is implemented in several clients, such as BitComet, BitTornado,
BitTorrent, KTorrent, Transmission, Deluge, Torrent, rtorrent, Vuze, Frostwire. Trackers are placed in groups, or
tiers, with a tracker randomly chosen from the top tier and tried, moving to the next tier if all the trackers in the top
tier fail.
Torrents with multiple trackers can decrease the time it takes to download a file, but also have a few consequences:
Poorly implemented clients may contact multiple trackers, leading to more overhead-traffic.
Torrents from closed trackers suddenly become downloadable by non-members, as they can connect to a seed via
an open tracker.
Decentralized keyword search
Even with distributed trackers, a third party is still required to find a specific torrent. This is usually done in the form
of a hyperlink from the website of the content owner or through indexing websites like isoHunt, Torrentz, BTDigg or
The Pirate Bay.
The Tribler BitTorrent client is the first to incorporate decentralized search capabilities. With Tribler, users can find
.torrent files that are hosted among other peers, instead of on a centralized index sites. It adds such an ability to the
BitTorrent protocol using a gossip protocol, somewhat similar to the eXeem network which was shut down in 2005.
The software includes the ability to recommend content as well. After a dozen downloads the Tribler software can
roughly estimate the download taste of the user and recommend additional content.
In May 2007 Cornell University published a paper proposing a new approach to searching a peer-to-peer network for
inexact strings, which could replace the functionality of a central indexing site. A year later, the same team
implemented the system as a plugin for Vuze called Cubit and published a follow-up paper reporting its success.
BitTorrent
41
A somewhat similar facility but with a slightly different approach is provided by the BitComet client through its
"Torrent Exchange"
[17]
feature. Whenever two peers using BitComet (with Torrent Exchange enabled) connect to
each other they exchange lists of all the torrents (name and info-hash) they have in the Torrent Share storage (torrent
files which were previously downloaded and for which the user chose to enable sharing by Torrent Exchange).
Thus each client builds up a list of all the torrents shared by the peers it connected to in the current session (or it can
even maintain the list between sessions if instructed). At any time the user can search into that Torrent Collection list
for a certain torrent and sort the list by categories. When the user chooses to download a torrent from that list, the
.torrent file is automatically searched for (by info-hash value) in the DHT Network and when found it is downloaded
by the querying client which can after that create and initiate a downloading task.
Implementations
The BitTorrent specification is free to use and many clients are open source, so BitTorrent clients have been created
for all common operating systems using a variety of programming languages. The official BitTorrent client,
Torrent, Xunlei, Transmission, Vuze and BitComet are some of the most popular clients.
Some BitTorrent implementations such as MLDonkey and Torrentflux are designed to run as servers. For example,
this can be used to centralize file sharing on a single dedicated server which users share access to on the network.
Server-oriented BitTorrent implementations can also be hosted by hosting providers at co-located facilities with high
bandwidth Internet connectivity (e.g., a datacenter) which can provide dramatic speed benefits over using BitTorrent
from a regular home broadband connection.
Services such as ImageShack can download files on BitTorrent for the user, allowing them to download the entire
file by HTTP once it is finished.
The Opera web browser supports BitTorrent, as does Wyzo. BitLet allows users to download Torrents directly from
their browser using a Java applet. An increasing number of hardware devices are being made to support BitTorrent.
These include routers and NAS devices containing BitTorrent-capable firmware like OpenWrt.
Proprietary versions of the protocol which implement DRM, encryption, and authentication are found within
managed clients such as Pando.
Development
An unimplemented (as of February 2008[2]) unofficial feature is Similarity Enhanced Transfer (SET), a technique
for improving the speed at which peer-to-peer file sharing and content distribution systems can share data. SET,
proposed by researchers Pucha, Andersen, and Kaminsky, works by spotting chunks of identical data in files that are
an exact or near match to the one needed and transferring these data to the client if the "exact" data are not present.
Their experiments suggested that SET will help greatly with less popular files, but not as much for popular data,
where many peers are already downloading it. Andersen believes that this technique could be immediately used by
developers with the BitTorrent file sharing system.
As of December 2008[2], BitTorrent, Inc. is working with Oversi on new Policy Discover Protocols that query the
ISP for capabilities and network architecture information. Oversi's ISP hosted NetEnhancer box is designed to
"improve peer selection" by helping peers find local nodes, improving download speeds while reducing the loads
into and out of the ISP's network.
BitTorrent
42
Legal issues
There has been much controversy over the use of BitTorrent trackers. BitTorrent metafiles themselves do not store
file contents. Whether the publishers of BitTorrent metafiles violate copyrights by linking to copyrighted material
without the authorization of copyright holders is controversial.
Various jurisdictions have pursued legal action against websites that host BitTorrent trackers. High-profile examples
include the closing of Suprnova.org, TorrentSpy, LokiTorrent, BTJunkie, Mininova, Demonoid and Oink's Pink
Palace. The Pirate Bay torrent website, formed by a Swedish group, is noted for the "legal" section of its website in
which letters and replies on the subject of alleged copyright infringements are publicly displayed. On May 31, 2006,
The Pirate Bay's servers in Sweden were raided by Swedish police on allegations by the MPAA of copyright
infringement; however, the tracker was up and running again three days later.
In the study used to value NBC Universal in its merger with Comcast, Envisional examined the 10,000 torrent
swarms managed by PublicBT which had the most active downloaders. After excluding pornographic and
unidentifiable content, it was found that only one swarm offered legitimate content.
Between 2010 and 2012, 200,000 people have been sued for uploading and downloading copyrighted content
through BitTorrent.
In 2011, 18.8% of North American internet traffic was used by peer-to-peer networks which equates to 132 billion
music file transfers and 11 billion movie file transfers on the BitTorrent network.
On April 30, 2012 the UK High Court ordered five ISPs to block BitTorrent search engine The Pirate Bay.
BitTorrent and malware
Several studies on BitTorrent have indicated that a large portion of files available for download via BitTorrent
contain malware. In particular, one small sample indicated that 18% of all executable programs available for
download contained malware. Another study claims that as much as 14.5% of BitTorrent downloads contain
zero-day malware, and that BitTorrent was used as the distribution mechanism for 47% of all zero-day malware they
have found.
References
[1] http:/ / en. wikipedia.org/ w/ index.php?title=Template:File_sharing_sidebar& action=edit
[2] http:/ / en. wikipedia.org/ w/ index.php?title=BitTorrent& action=edit
[3] [3] . Palo Alto Networks. 2013. Retrieved 2013-04-07.
[4] [4] by D. Menasche, A. Rocha, E. de Souza e Silva, R. M. Leao, D. Towsley, A. Venkataramani
[5] [5] See, for example, . tasvideos.org.
[6] "VODO - About..." (http:/ / vo.do/ about). Retrieved 2012-04-15. ( WebCite (http:/ / www.webcitation. org/ 66wxu53jV)).
[7] Cory Doctorow (October 15, 2009). "Vodo: a filesharing service for film-makers" (http:/ / boingboing. net/ 2009/ 10/ 15/
vodo-a-filesharing-s.html). Boing Boing. Happy Mutants LLC. Retrieved 2012-04-15. ( WebCite (http:/ / www.webcitation.org/
66wy0PFq1))
[8] Ernesto. "Pioneer One, The BitTorrent Exclusive TV-Series Continues" (https:/ / torrentfreak. com/
pioneer-one-the-bittorrent-exclusive-tv-series-continues-101215/ ). TorrentFreak. Retrieved 2012-04-15. ( WebCite (http:/ / www.
webcitation.org/ 66wyOriIB))
[9] [9] . Archive.org.
[10] [10] . Archive.org. 2012.
[11] http:/ / bittorrent.org/ beps/ bep_0005.html
[12] Gillmor, Steve (December 13, 2003). . EWeek.com Retrieved April 22, 2007.
[13] Miller, Ernest (March 2, 2004). . The Importance of... Corante.com
[14] [14] Documentation.
[15] via Internet Wayback Machine
[16] , TorrentFreak, 17 August 2007
[17] [17] . The torrent sharing feature of BitComet. Bitcomet.com. Retrieved 2010-01-31.
BitTorrent
43
Further reading
Pouwelse, Johan; et al. (2005). "The Bittorrent P2P File-Sharing System: Measurements and Analysis" (http:/ /
books. google. com/ books?id=Dnw7E8xzQUMC& lpg=PA205& dq=The Bittorrent P2P File-Sharing System:
Measurements and Analysis Johan Pouwelse , Pawel Garbacki, Dick Epema,& pg=PA205#v=onepage& q&
f=false). Peer-to-Peer Systems IV. Berlin: Springer. pp.205-216. doi: 10.1007/11558989_19 (http:/ / dx. doi. org/
10. 1007/ 11558989_19). ISBN978-3-540-29068-1. Retrieved September 4, 2011.
External links
Official BitTorrent website (http:/ / www. bittorrent. com/ )
Official BitTorrent Specification (http:/ / www. bittorrent. org/ beps/ bep_0003. html)
BitTorrent (http:/ / www. dmoz. org/ Computers/ Internet/ File_Sharing/ BitTorrent/ ) on the Open Directory
Project
Interview with chief executive Ashwin Navin (http:/ / streaming. scmp. com/ podcasting/ upload/
News_BitTorrent_june15. mp3)
Unofficial BitTorrent Protocol Specification v1.0 (http:/ / wiki. theory. org/ BitTorrentSpecification) at
wiki.theory.org
Unofficial BitTorrent Location-aware Protocol 1.0 Specification (http:/ / wiki. theory. org/
BitTorrent_Location-aware_Protocol_1. 0_Specification) at wiki.theory.org
Michal Czerniawski, Responsibility of Bittorrent Search Engines for Copyright Infringements (http:/ / papers.
ssrn. com/ sol3/ papers. cfm?abstract_id=1540913), at SSRN (December 2009)
Under the hood of BitTorrent (http:/ / www. stanford.edu/ class/ ee380/ Abstracts/ 050216. html) - lecture given
by BitTorrent protocol designer, Bram Cohen at Stanford University ( video archive (http:/ / stanford-online.
stanford. edu/ courses/ ee380/ 050216-ee380-100. asx)).
Tiny perl script to view contents inside torrent files (http:/ / wiki. gotux. net/ downloads/ btview)
Mainline DHT Measurement (http:/ / www. cs. helsinki. fi/ u/ jakangas/ MLDHT/ )
CloudControl
44
CloudControl
cloudControl GmbH
Type Private
Industry Cloud platform as a service
Founded January 2009
Founder(s) Philipp Strube, Tobias Wilken, Thomas Ruland
Headquarters Berlin, Germany
Key people Gnter Kraft, Peter Elsayeh, Thomas Ludwig, Philipp Mhring
Website
www.cloudcontrol.com
[1]
cloudControl is a European programming language agnostic platform as a service (PaaS) based in Berlin, Germany.
Officially supported languages for development and deployment are Java, PHP, Python and Ruby via the open
buildpack API originally developed by Heroku. Custom buildpack support has been announced for 2013. The
platform supports multiple environments for production, staging or development for each app.
History
cloudControl was founded in January 2009 by Philipp Strube, Tobias Wilken and Thomas Ruland in Bonn,
Germany. The company moved to the Berlin, Germany area in early 2010 after getting business angel funding.
Production support for the PHP programming language was launched in October 2010. The company raised VC
funding August 2011 to accelerate product and team development. As a result of this, official support for Java,
Python and Ruby programming languages has been launched in October 2012.
References
[1] https:/ / www. cloudcontrol.com/
External links
cloudControl (https:/ / www. cloudcontrol. com/ ) (official site).
Git (software)
45
Git (software)
Git (software)
Git logo
A command line session showing repository creation, and addition of a file and remote synchronization
Original author(s) Linus Torvalds
Developer(s)
Junio Hamano, Linus Torvalds, and many others
[1]
Initial release 7April2005
Stable release
1.8.5.2 (17December 2013) []
[2]
Preview release
1.8.5-rc3 (20November 2013) []
[3]
Written in C, Bourne Shell, Tcl, Perl
Operating system Linux, POSIX, Windows, OS X
Type Version control
License GNU General Public License v2
Website
git-scm.com
[4]
In software development, Git /gtt/ is a distributed revision control and source code management (SCM) system with
an emphasis on speed.
[5]
Git was initially designed and developed by Linus Torvalds for Linux kernel development
in 2005. Based on a 2013 survey of Eclipse IDE users, Git is reported to have 30% adoption.
[6]
Every Git working directory is a full-fledged repository with complete history and full version tracking capabilities,
not dependent on network access or a central server.
Git is free software distributed under the terms of the GNU General Public License version 2.
Git (software)
46
History
Git development began after many developers of the Linux kernel chose to give up access to BitKeeper, a
proprietary SCM system that had previously been used to maintain the project.
[7]
The copyright holder of BitKeeper,
Larry McVoy, had withdrawn free use of the product after he claimed that Andrew Tridgell had reverse-engineered
the BitKeeper protocols.
Torvalds wanted a distributed system that he could use like BitKeeper, but none of the available free systems met his
needs, particularly in terms of performance. Torvalds took an example of an SCM system requiring thirty seconds to
apply a patch and update all associated metadata, and noted that this would not scale to the needs of Linux kernel
development, where syncing with fellow maintainers could require 250 such actions at a time. His goal was for
patches to take three seconds. Torvalds had several other design criteria:
Take CVS as an example of what not to do; if in doubt, make the exact opposite decision.
Support a distributed, BitKeeper-like workflow.
Very strong safeguards against corruption, either accidental or malicious.
[8]
These three criteria eliminated every then-existing version control system, except for Monotone. Considering
performance as well excluded this too. So, immediately after the 2.6.12-rc2 Linux kernel development release, he set
out to write his own.
Torvalds has quipped about the name git, which is British English slang roughly equivalent to "unpleasant person".
Torvalds said: "I'm an egotistical bastard, and I name all my projects after myself. First 'Linux', now 'git'." The man
page describes git as "the stupid content tracker".
The development of Git began on 3 April 2005. The project was announced on 6 April, and became self-hosting as
of 7 April. The first merge of multiple branches was done on 18 April. Torvalds achieved his performance goals; on
29 April, the nascent Git was benchmarked recording patches to the Linux kernel tree at the rate of 6.7 per second.
On 16 June, the kernel 2.6.12 release was managed by Git. Torvalds turned over maintenance on 26 July 2005 to
Junio Hamano, a major contributor to the project. Hamano was responsible for the 1.0 release on 21 December 2005,
and remains the project's maintainer.
Design
Git's design was inspired by BitKeeper and Monotone.
[9]
Git was originally designed as a low-level version control
system engine on top of which others could write front ends, such as Cogito or StGIT. The core Git project has since
become a complete version control system that is usable directly. While strongly influenced by BitKeeper, Torvalds
deliberately attempted to avoid conventional approaches, leading to a unique design.
[10]
Characteristics
Git's design is a synthesis of Torvalds's experience with Linux in maintaining a large distributed development
project, along with his intimate knowledge of file system performance gained from the same project and the urgent
need to produce a working system in short order. These influences led to the following implementation choices:
Strong support for non-linear development
Git supports rapid branching and merging, and includes specific tools for visualizing and navigating a
non-linear development history. A core assumption in Git is that a change will be merged more often than it is
written, as it is passed around various reviewers. Branches in git are very lightweight: A branch in git is only a
reference to a single commit. With its parental commits, the full branch structure can be constructed.
Distributed development
Like Darcs, BitKeeper, Mercurial, SVK, Bazaar and Monotone, Git gives each developer a local copy of the
entire development history, and changes are copied from one such repository to another. These changes are
Git (software)
47
imported as additional development branches, and can be merged in the same way as a locally developed
branch.
Compatibility with existing systems/protocols
Repositories can be published via HTTP, FTP, rsync, or a Git protocol over either a plain socket, ssh or HTTP.
Git also has a CVS server emulation, which enables the use of existing CVS clients and IDE plugins to access
Git repositories. Subversion and svk repositories can be used directly with git-svn.
Efficient handling of large projects
Torvalds has described Git as being very fast and scalable, and performance tests done by Mozilla showed it
was an order of magnitude faster than some version-control systems, and fetching version history from a
locally stored repository can be one hundred times faster than fetching it from the remote server.
[11]
Cryptographic authentication of history
The Git history is stored in such a way that the ID of a particular version (a commit in Git terms) depends upon
the complete development history leading up to that commit. Once it is published, it is not possible to change
the old versions without it being noticed. The structure is similar to a hash tree, but with additional data at the
nodes as well as the leaves. (Mercurial and Monotone also have this property.)
Toolkit-based design
Git was designed as a set of programs written in C, and a number of shell scripts that provide wrappers around
those programs.
[12]
Although most of those scripts have since been rewritten in C for speed and portability, the
design remains, and it is easy to chain the components together.
[13]
Pluggable merge strategies
As part of its toolkit design, Git has a well-defined model of an incomplete merge, and it has multiple
algorithms for completing it, culminating in telling the user that it is unable to complete the merge
automatically and that manual editing is required.
Garbage accumulates unless collected
Aborting operations or backing out changes will leave useless dangling objects in the database. These are
generally a small fraction of the continuously growing history of wanted objects. Git will automatically
perform garbage collection when enough loose objects have been created in the repository. Garbage collection
can be called explicitly using gi gc --prune.
Periodic explicit object packing
Git stores each newly created object as a separate file. Although individually compressed, this takes a great
deal of space and is inefficient. This is solved by the use of packs that store a large number of objects in a
single file (or network byte stream) called packfile, delta-compressed among themselves. Packs are
compressed using the heuristic that files with the same name are probably similar, but do not depend on it for
correctness. A corresponding index file is created for each packfile, telling the offset of each object in the
packfile. Newly created objects (newly added history) are still stored singly, and periodic repacking is required
to maintain space efficiency. The process of packing the repository can be very computationally expensive. By
allowing objects to exist in the repository in a loose, but quickly generated format, git allows the expensive
pack operation to be deferred until later when time does not matter (e.g. the end of the work day). Git does
periodic repacking automatically but manual repacking is also possible with the gi gc command. For data
integrity, both packfile and its index have SHA-1 checksum inside, and also the file name of packfile contains
a SHA-1 checksum. To check integrity, run the gi fsc' command.
Another property of Git is that it snapshots directory trees of files. The earliest systems for tracking versions of
source code, SCCS and RCS, worked on individual files and emphasized the space savings to be gained from
interleaved deltas (SCCS) or delta encoding (RCS) the (mostly similar) versions. Later revision control systems
Git (software)
48
maintained this notion of a file having an identity across multiple revisions of a project. However, Torvalds rejected
this concept. Consequently, Git does not explicitly record file revision relationships at any level below the source
code tree.
Implicit revision relationships have some significant consequences:
It is slightly more expensive to examine the change history of a single file than the whole project. To obtain a
history of changes affecting a given file, Git must walk the global history and then determine whether each
change modified that file. This method of examining history does, however, let Git produce with equal efficiency
a single history showing the changes to an arbitrary set of files. For example, a subdirectory of the source tree
plus an associated global header file is a very common case.
Renames are handled implicitly rather than explicitly. A common complaint with CVS is that it uses the name of
a file to identify its revision history, so moving or renaming a file is not possible without either interrupting its
history, or renaming the history and thereby making the history inaccurate. Most post-CVS revision control
systems solve this by giving a file a unique long-lived name (a sort of inode number) that survives renaming. Git
does not record such an identifier, and this is claimed as an advantage. Source code files are sometimes split or
merged as well as simply renamed, and recording this as a simple rename would freeze an inaccurate description
of what happened in the (immutable) history. Git addresses the issue by detecting renames while browsing the
history of snapshots rather than recording it when making the snapshot.
[14]
(Briefly, given a file in revision N, a
file of the same name in revision N#1 is its default ancestor. However, when there is no like-named file in
revision N#1, Git searches for a file that existed only in revision N#1 and is very similar to the new file.)
However, it does require more CPU-intensive work every time history is reviewed, and a number of options to
adjust the heuristics.
Git implements several merging strategies; a non-default can be selected at merge time:
resolve: the traditional three-way merge algorithm.
recursive: This is the default when pulling or merging one branch, and is a variant of the three-way merge
algorithm.
When there are more than one common ancestors that can be used for three-way merge, it creates a merged
tree of the common ancestors and uses that as the reference tree for the three-way merge. This has been
reported to result in fewer merge conflicts without causing mis-merges by tests done on actual merge commits
taken from Linux 2.6 kernel development history. Additionally this can detect and handle merges involving
renames.
-Linus Torvalds
octopus: This is the default when merging more than two heads.
Data structures
Git's primitives are not inherently a source code management (SCM) system. Torvalds explains,
In many ways you can just see git as a filesystem- it is content-addressable, and it has a notion of
versioning, but I really really designed it coming at the problem from the viewpoint of a filesystem
person (hey, kernels is what I do), and I actually have absolutely zero interest in creating a traditional
SCM system.
From this initial design approach, Git has developed the full set of features expected of a traditional SCM, with
features mostly being created as needed, then refined and extended over time.
Git (software)
49
Some data flows and storage levels in the Git
revision control system.
Git has two data structures: a mutable index (also called stage or
cache) that caches information about the working directory and the
next revision to be committed; and an immutable, append-only object
database.
The object database contains four types of objects:
A blob (binary large object) is the content of a file. Blobs have no
file name, time stamps, or other metadata.
A tree object is the equivalent of a directory. It contains a list of file
names, each with some type bits and the name of a blob or tree
object that is that file, symbolic link, or directory's contents. This
object describes a snapshot of the source tree.
A commit object links tree objects together into a history. It contains the name of a tree object (of the top-level
source directory), a time stamp, a log message, and the names of zero or more parent commit objects.
A tag object is a container that contains reference to another object and can hold additional meta-data related to
another object. Most commonly, it is used to store a digital signature of a commit object corresponding to a
particular release of the data being tracked by Git.
The index serves as connection point between the object database and the working tree.
Each object is identified by a SHA-1 hash of its contents. Git computes the hash, and uses this value for the object's
name. The object is put into a directory matching the first two characters of its hash. The rest of the hash is used as
the file name for that object.
Git stores each revision of a file as a unique blob. The relationships between the blobs can be found through
examining the tree and commit objects. Newly added objects are stored in their entirety using zlib compression. This
can consume a large amount of disk space quickly, so objects can be combined into packs, which use delta
compression to save space, storing blobs as their changes relative to other blobs.
Git servers typically listen on TCP port 9418.
Implementations
Git is primarily developed on Linux, although it also supports most major operating systems including BSD, Solaris,
OS X, and Microsoft Windows.
The JGit implementation of Git is a pure Java software library, designed to be embedded in any Java application.
JGit is used in the Gerrit code review tool and in EGit, a Git client for the Eclipse IDE.
The Dulwich implementation of Git is a pure Python software component for Python 2.
The libgit2 implementation of Git is an ANSI C software library with no other dependencies, which can be built on
multiple platforms including Microsoft Windows, Linux, Mac OS X, and BSD. It has bindings for many
programming languages, including Ruby, Python and Haskell. It is used as the underlying Git implementation in
Microsoft's Team Foundation Service and Visual Studio.
The Plastic SCM versioning system contains its own implementation of the Git protocol, to allow Plastic SCM
clients to interoperate with remote Git repositories.
The Perforce version management system also supports Git clients. Perforce can make its versioned content
available as Git repositories using the git+ssh and smart HTTP transports, and these repositories can be used as Git
remotes from any Git client.
JS-Git is a JavaScript implementation of a subset of Git.
[15]
Git (software)
50
Adoption
The Eclipse Foundation reported in its annual community survey that as of May 2013, more than 36% of
professional software developers use Git as their primary source control system, compared with 27.6% in 2012 and
12.8% in 2011. Open source directory Ohloh reports a similar uptake among open source projects.
The UK IT jobs website itjobswatch.co.uk reports that as of late November 2013, approximately 15.5% of UK
permanent software development job openings list Git as a requirement,
[16]
compared to 17.1% for Subversion,
[17]
11% for Microsoft Team Foundation Server,
[18]
1.5% for Visual SourceSafe,
[19]
and 1.7% for Mercurial.
[20]
The following Web sites provide free source code hosting for Git repositories:
[21]
Assembla
BerliOS
Bitbucket
CloudForge
CodePlex
CollabNet
[22]
GitHub
GitLab
[23]
GitPrep
[24]
Gitorious
GNU Savannah
Google Code
JavaForge
SourceForge
Visual Studio Online
[25]
Some of these also offer software downloads for self-hosted solutions. Additionally, self-hosted web-based support
for hosting Git repositories can also be done with the following software:
Atlassian Stash
Gitolite
RhodeCode
[26]
References
[1] https:/ / github.com/ git/ git/ contributors
[2] http:/ / en. wikipedia.org/ w/ index.php?title=Template:Latest_stable_software_release/ Git& action=edit
[3] http:/ / en. wikipedia.org/ w/ index.php?title=Template:Latest_preview_software_release/ Git& action=edit
[4] http:/ / git-scm.com
[5] [5] "So I'm writing some scripts to try to track things a whole lot faster."
[6] http:/ / ianskerrett.wordpress. com/ 2013/ 06/ 12/ eclipse-community-survey-results-for-2013/
[7] Feature: No More Free BitKeeper KernelTrap.org (http:/ / kerneltrap. org/ node/ 4966)
[8] [8] A brief description of Git's data integrity design goals.
[9] [9] "Some historical background" on git's predecessors
[10] [10] A discussion of Git vs. BitKeeper
[11] [11] , observing that "git log" is 100x faster than "svn log" because the latter has to contact a remote server.
[12] [12] , describing Git's script-oriented design
[13] [13] , praising Git's scriptability
[14] , on using gi-b1ame to show code moved between source files
[15] https:/ / github. com/ creationix/ js-git "js-git: a JavaScript implementation of Git." Retrieved 13 August 2013.
[16] http:/ / www. itjobswatch.co.uk/ jobs/ uk/ git%20%28software%29. do
[17] http:/ / www. itjobswatch.co.uk/ jobs/ uk/ subversion. do
[18] http:/ / www. itjobswatch.co.uk/ jobs/ uk/ team%20foundation%20server. do
[19] http:/ / www. itjobswatch.co.uk/ jobs/ uk/ vss/ sourcesafe. do
Git (software)
51
[20] http:/ / www. itjobswatch.co.uk/ jobs/ uk/ mercurial. do
[21] https:/ / git.wiki.kernel. org/ index.php/ GitHosting
[22] http:/ / www. collab.net/ git
[23] http:/ / www. gitlab.com
[24] http:/ / gitprep.org/
[25] http:/ / www. visualstudio. com/ products/ visual-studio-online-overview-vs
[26] https:/ / rhodecode. com/
Further reading
Loeliger, Jon; McCullough, Matthew (August 2012). Version Control with Git (http:/ / shop. oreilly. com/
product/ 0636920022862. do) (2nd ed.). Farnham: O'Reilly. ISBN978-1-4493-1638-9. Retrieved 22 April 2013.
Table of Contents (http:/ / www. foxebook. net/ version-control-with-git-2nd-edition/ )
Silverman, Richard (July 2013). Git Pocket Guide (http:/ / www. foxebook. net/ git-pocket-guide/ ) (1st ed.).
O'Reilly. ISBN978-1-4493-2586-2. Retrieved 30 July 2013.
External links
Official website (http:/ / gitscm. com)
52
Chapter 12: REST Architectural Style for
Mobile Web Applications
Representational state transfer
Representational state transfer (REST) is an architectural style consisting of a coordinated set of constraints
applied to components, connectors, and data elements, within a distributed hypermedia system. REST ignores the
details of component implementation and protocol syntax in order to focus on the roles of components, the
constraints upon their interaction with other components, and their interpretation of significant data elements.
[1]
The term representational state transfer was introduced and defined in 2000 by Roy Fielding in his doctoral
dissertation at UC Irvine.
REST has been applied to describe desired web architecture, to identify existing problems, to compare alternative
solutions, and to ensure that protocol extensions would not violate the core constraints that make the Web successful.
Fielding used REST to design HTTP 1.1 and Uniform Resource Identifiers (URI).
[2][3]
The REST architectural style is also applied to the development of Web services as an alternative to other
distributed-computing specifications such as SOAP.
History
The REST architectural style was developed by W3C Technical Architecture Group (TAG) in parallel with HTTP
1.1, based on the existing design of HTTP 1.0. The World Wide Web represents the largest implementation of a
system conforming to the REST architectural style.
Architectural Properties
The properties of the REST architectural style are:
Performance
Scalability of component interactions
Fielding describes REST's effect on scalability thus:
REST's client-server separation of concerns simplifies component implementation, reduces the complexity of
connector semantics, improves the effectiveness of performance tuning, and increases the scalability of pure
server components. Layered system constraints allow intermediaries-proxies, gateways, and firewalls-to be
introduced at various points in the communication without changing the interfaces between components, thus
allowing them to assist in communication translation or improve performance via large-scale, shared caching.
REST enables intermediate processing by constraining messages to be self-descriptive: interaction is stateless
between requests, standard methods and media types are used to indicate semantics and exchange information,
and responses explicitly indicate cacheability.
Simplicity of interfaces
Modifiability of components to meet changing needs (even while the application is running)
Visibility of communication between components by service agents
Portability of component deployment
Reliability
Representational state transfer
53
Constraints
The architectural properties of REST are realized by applying specific interaction constraints to components,
connectors, and data elements. The formal REST constraints are:
Client!server
A uniform interface separates clients from servers. This separation of concerns means that, for example,
clients are not concerned with data storage, which remains internal to each server, so that the portability of
client code is improved. Servers are not concerned with the user interface or user state, so that servers can be
simpler and more scalable. Servers and clients may also be replaced and developed independently, as long as
the interface between them is not altered.
Stateless
The client-server communication is further constrained by no client context being stored on the server
between requests. Each request from any client contains all of the information necessary to service the request,
and session state is held in the client. Important to note is that the session state can be transferred by the server
to another service such as a database to maintain a persistent state for a period of time and allow
authentication. The client begins sending requests when it is ready to make the transition to a new state. While
one or more requests are outstanding, the client is considered to be in transition. The representation of each
application state contains links that may be used the next time the client chooses to initiate a new
state-transition.
Cacheable
As on the World Wide Web, clients can cache responses. Responses must therefore, implicitly or explicitly,
define themselves as cacheable, or not, to prevent clients reusing stale or inappropriate data in response to
further requests. Well-managed caching partially or completely eliminates some client-server interactions,
further improving scalability and performance.
Layered system
A client cannot ordinarily tell whether it is connected directly to the end server, or to an intermediary along the
way. Intermediary servers may improve system scalability by enabling load-balancing and by providing shared
caches. They may also enforce security policies.
Code on demand (optional)
Servers can temporarily extend or customize the functionality of a client by the transfer of executable code.
Examples of this may include compiled components such as Java applets and client-side scripts such as
JavaScript. "Code on demand" is the only optional constraint of the REST architecture.
Uniform Interface
The uniform interface constraint is fundamental to the design of any REST service. The uniform interface
simplifies and decouples the architecture, which enables each part to evolve independently. The four guiding
principles of this interface are:
Identification of resources
Individual resources are identified in requests, for example using URIs in web-based REST systems.
The resources themselves are conceptually separate from the representations that are returned to the
client. For example, the server does not send its database, but rather, perhaps, some HTML, XML or
Representational state transfer
54
JSON that represents some database records expressed, for instance, in Swahili and encoded in UTF-8,
depending on the details of the request and the server implementation.
Manipulation of resources through these representations
When a client holds a representation of a resource, including any metadata attached, it has enough
information to modify or delete the resource on the server should it have permission to do so.
Self-descriptive messages
Each message includes enough information to describe how to process the message. For example, which
parser to invoke may be specified by an Internet media type (previously known as a MIME type).
Responses also explicitly indicate their cacheability.
Hypermedia as the engine of application state (A.K.A. HATEOAS)
Clients make state transitions only through actions that are dynamically identified within hypermedia by
the server (e.g., by hyperlinks within hypertext). Except for simple fixed entry points to the application,
a client does not assume that any particular action is available for any particular resources beyond those
described in representations previously received from the server.
One can characterise applications conforming to the REST constraints described in this section as "RESTful". If a
service violates any of the required constraints, it cannot be considered RESTful.
Complying with these constraints, and thus conforming to the REST architectural-style, enables any kind of
distributed hypermedia system to have desirable emergent properties, such as performance, scalability, simplicity,
modifiability, visibility, portability, and reliability.
Concept
Representational State Transfer is intended to evoke an image of how a well-designed Web application behaves:
presented with a network of Web pages (a virtual state-machine), the user progresses through an application by
selecting links (state transitions), resulting in the next page (representing the next state of the application) being
transferred to the user and rendered for their use.
REST was initially described in the context of HTTP, but it is not limited to that protocol. RESTful architectures
may be based on other Application Layer protocols if they already provide a rich and uniform vocabulary for
applications based on the transfer of meaningful representational state. RESTful applications maximize the use of the
existing, well-defined interface and other built-in capabilities provided by the chosen network protocol, and
minimize the addition of new application-specific features on top of it.
Vocabulary re-use vs. its arbitrary extension: HTTP and SOAP
In addition to URIs; Internet media types; request and response codes; etc., HTTP has a vocabulary of operations
called request methods, most notably:
GET
ROST
RUT
ELETE
REST uses these operations and other existing features of the HTTP protocol. For example, layered proxy and
gateway components perform additional functions on the network, such as HTTP caching and security enforcement.
SOAP RPC over HTTP, on the other hand, encourages each application designer to define new, application-specific
operations that supplant HTTP operations. An example could be:
geUsers()
Representational state transfer
55
geNewUsersSince(dae Sinceae)
saveRurchaseOrder(sring CusomerI, sring RurchaseOrderI)
This additive vocabulary disregards many of HTTP's existing capabilities, such as authentication, caching, and
content-type negotiation. The advantage SOAP has over REST is that SOAP, not following HTTP conventions,
works equally well over raw TCP, named pipes, message queues, etc.
Central principle
An important concept in REST is the existence of resources (sources of specific information), each of which is
referenced with a global identifier (e.g., a URI in HTTP). In order to manipulate these resources, components of the
network (user agents and origin servers) communicate via a standardized interface (e.g., HTTP) and exchange
representations of these resources (the actual documents conveying the information). For example, a resource that
represents a circle (as a logical object) may accept and return a representation that specifies a center point and radius,
formatted in SVG, but may also accept and return a representation that specifies any three distinct points along the
curve (since this also uniquely identifies a circle) as a comma-separated list.
Any number of connectors (e.g., clients, servers, caches, tunnels, etc.) can mediate the request, but each does so
without "seeing past" its own request (referred to as "layering", another constraint of REST and a common principle
in many other parts of information and networking architecture). Thus, an application can interact with a resource by
knowing two things: the identifier of the resource and the action required-it does not need to know whether there
are caches, proxies, gateways, firewalls, tunnels, or anything else between it and the server actually holding the
information. The application does, however, need to understand the format of the information (representation)
returned, which is typically an HTML, XML, or JSON document of some kind, although it may be an image, plain
text, or any other content.
Applied to Web Services
A RESTful web service is a web API implemented using HTTP and REST principles. It is a collection of resources,
with four defined aspects:
the base URI for the web API, such as hp://examp1e.com/resources/
the Internet media type of the data supported by the web API. This is often JSON but can be any other valid
Internet media type provided that it is a valid hypertext standard.
the set of operations supported by the web API using HTTP methods (e.g., GET, PUT, POST, or DELETE).
The API must be hypertext driven.
The following table shows how the HTTP methods are typically used to implement a web API.
RESTful web API HTTP methods
Resource GET PUT POST DELETE
Collection URI, such as
http://example.com/resources
List the URIs and
perhaps other details of
the collection's members.
Replace the entire
collection with
another
collection.
Create a new entry in the
collection. The new
entry's URI is assigned
automatically and is
usually returned by the
operation.
Delete the
entire
collection.
Representational state transfer
56
Element URI, such as
http://example.com/resources/item17
Retrieve a representation
of the addressed member
of the collection,
expressed in an
appropriate Internet
media type.
Replace the
addressed
member of the
collection, or if it
doesn't exist,
create it.
Not generally used. Treat
the addressed member as
a collection in its own
right and create a new
entry in it.
Delete the
addressed
member of the
collection.
The PUT and DELETE methods are idempotent methods. The GET method is a safe method (or nullipotent),
meaning that calling it produces no side-effects.
Unlike SOAP-based web services, there is no "official" standard for RESTful web APIs.
[4]
This is because REST is
an architectural style, unlike SOAP, which is a protocol. Even though REST is not a standard, a RESTful
implementation such as the Web can use standards like HTTP, URI, XML, etc.
Public implementations
REST can be found in a number of places on the public Web:
The Atom Publishing Protocol for publishing to blogs is considered a canonical RESTful protocol
[5]
.
Sun Microsystems' Cloud API
[6]
is a good example of resource media type documentation.
The Open Services for Lifecycle Collaboration (OSLC)
[7]
initiative is establishing a RESTful approach to
integrating software development artifacts.
CouchDB is a document-oriented database written in Erlang that provides a RESTful JSON API that can be
accessed from any environment that allows HTTP requests.
MySQL Cluster is a write-scalable auto-sharded database also accessible through a native REST/JSON
[8]
interface as an Apache module.
Microsoft's Canonical REST Entity Service
[9]
.
Nuxeo, an open source document manager, implements a Content Automation interface via a REST API
[10]
Restful Objects, a public specification for a generic RESTful API to any domain object model
Sones GraphDB is a graph-oriented database written in C# that provides a RESTful interface
Google Fusion Tables support includes a RESTful API
[11]
DreamFactory Services Platform for mobile application development uses a REST API
[12]
Espresso Logic Platform for mobile and web application development helps in creating RESTful API to SQL
databases [13]
Objections
REST invites the client to specify the unique ID of a new item to be created in a collection managed by the server. It
is less problematic if the client's new-item request specifies only the content data, and the server returns a unique
"handle" for the new item, as this allows to generate unique identifiers for each newly created resource and avoid
conflicts ensuring atomicity. Techniques for handling ensuing complications are deferred to the server. However, a
means of communication for the data created between the server and the client must be established. Such means
could include, for instance, special headers or response body content when dealing with HTTP. Nevertheless, the
REST architectural style does not specify which of these are to be employed.
Representational state transfer
57
References
Fielding, Roy T.; Taylor, Richard N. (May 2002), "Principled Design of the Modern Web Architecture"
[14]
(PDF), ACM Transactions on Internet Technology (TOIT) (New York: Association for Computing Machinery) 2
(2): 115-150, doi:10.1145/514183.514185
[15]
, ISSN1533-5399
[16]
Fielding, Roy Thomas (2000), Architectural Styles and the Design of Network-based Software Architectures
[17]
,
Doctoral dissertation, University of California, Irvine
Pautasso, Cesare; Zimmermann, Olaf; Leymann, Frank (April 2008), "RESTful Web Services vs. Big Web
Services: Making the Right Architectural Decision"
[18]
, 17th International World Wide Web Conference
(WWW2008) (Beijing, China)
Richardson, Leonard; Ruby, Sam (May 2007), RESTful Web Services
[19]
, O'Reilly, ISBN978-0-596-52926-0
Notes
[1] Chapter 5 of Fielding's dissertation is "Representational State Transfer (REST)" (http:/ / www.ics.uci. edu/ fielding/ pubs/ dissertation/
rest_arch_style.htm).
[2] [2] RFC 1945
[3] [3] RFC 2616
[4] Elkstein, M. What is REST' (http:/ / rest. elkstein. org/ 2008/ 02/ what-is-rest. html). Retrieved on 2009-07-04.
[5] http:/ / tools.ietf.org/ html/ rfc5023
[6] http:/ / kenai.com/ projects/ suncloudapis/ pages/ Home
[7] http:/ / open-services. net/ html/ Home. html
[8] http:/ / code.google.com/ p/ mod-ndb/
[9] http:/ / code.msdn.microsoft.com/ cannonicalRESTEntity
[10] https:/ / doc. nuxeo.com/ display/ NXDOC/ REST+ API
[11] https:/ / developers. google.com/ fusiontables/
[12] https:/ / www. dreamfactory.com/
[13] https:/ / www. espressologic.com
[14] http:/ / www. ics. uci.edu/ taylor/ documents/ 2002-REST-TOIT. pdf
[15] http:/ / dx. doi.org/ 10.1145%2F514183.514185
[16] http:/ / www. worldcat.org/ issn/ 1533-5399
[17] http:/ / www. ics. uci.edu/ fielding/ pubs/ dissertation/ top. htm
[18] http:/ / www. jopera.org/ docs/ publications/ 2008/ restws
[19] http:/ / oreilly.com/ catalog/ 9780596529260
Create, read, update and delete
58
Create, read, update and delete
In computer programming, create, read, update and delete (CRUD) (Sometimes called SCRUD with an "S" for
Search) are the four basic functions of persistent storage. Sometimes CRUD is expanded with the words retrieve
instead of read, modify instead of update, or destroy instead of delete. It is also sometimes used to describe user
interface conventions that facilitate viewing, searching, and changing information; often using computer-based forms
and reports. The term was likely first popularized by James Martin in his 1983 book Managing the Data-base
Environment. The acronym may be extended to CRUDL to cover listing of large data sets which bring additional
complexity such as pagination when the data sets are too large to hold easily in memory.
Another variation of CRUD is BREAD, an acronym for "Browse, Read, Edit, Add, Delete".
Database applications
The acronym CRUD refers to all of the major functions that are implemented in relational database applications.
Each letter in the acronym can map to a standard SQL statement and HTTP method:
Operation SQL HTTP
Create INSERT POST
Read (Retrieve) SELECT GET
Update (Modify) UPDATE PUT / PATCH
Delete (Destroy) DELETE DELETE
Making full use of HTTP methods, along with other constraints, is considered "RESTful".
Although a relational database provides a common persistence layer in software applications, numerous other
persistence layers exist. CRUD functionality can be implemented with an object database, an XML database, flat text
files, custom file formats, tape, or card, for example.
User interface
CRUD is also relevant at the user interface level of most applications. For example, in address book software, the
basic storage unit is an individual contact entry. As a bare minimum, the software must allow the user to:
Create or add new entries
Read, retrieve, search, or view existing entries
Update or edit existing entries
Delete/deactivate existing entries
Without at least these four operations, the software cannot be considered complete. Because these operations are so
fundamental, they are often documented and described under one comprehensive heading, such as "contact
management", "content management" or "contact maintenance" (or "document management" in general, depending
on the basic storage unit for the particular application).
Notes
HATEOAS
59
HATEOAS
HATEOAS, an abbreviation for Hypermedia as the Engine of Application State, is a constraint of the REST
application architecture that distinguishes it from most other network application architectures. The principle is that a
client interacts with a network application entirely through hypermedia provided dynamically by application servers.
A REST client needs no prior knowledge about how to interact with any particular application or server beyond a
generic understanding of hypermedia. In a service-oriented architecture (SOA), clients and servers interact through a
fixed interface shared through documentation or an interface description language (IDL).
RESTful service can be described as well to be available for the client code-generation, RSDL (RESTful Service
Description Language) using dynamic metadata collection to achieve this goal.
The HATEOAS constraint serves to decouple client and server in a way that allows the server to evolve functionality
independently.
Details
A REST client enters a REST application through a simple fixed URL. All future actions the client may take are
discovered within resource representations returned from the server. The media types used for these representations,
and the link relations they may contain, are standardized. The client transitions through application states by
selecting from the links within a representation or by manipulating the representation in other ways afforded by its
media type. In this way, RESTful interaction is driven by hypermedia, rather than out-of-band information.
A client does not need to understand every media type and communication mechanism offered by the server and this
understanding may be improved on the fly through "code-on-demand" provided to the client by the server.
Origins
The HATEOAS constraint is an essential part of the "uniform interface" feature of REST, as defined in Roy
Fielding's doctoral dissertation.
[1]
Fielding has further described the concept on his blog.
The purpose of some of the strictness of this and other REST constraints, Fielding explains, is "software design on
the scale of decades: every detail is intended to promote software longevity and independent evolution. Many of the
constraints are directly opposed to short-term efficiency. Unfortunately, people are fairly good at short-term design,
and usually awful at long-term design".
References
Hypertext Transfer Protocol
60
Hypertext Transfer Protocol
Internet
protocol suite
Application layer
DHCP
DHCPv6
DNS
FTP
HTTP
IMAP
IRC
LDAP
MGCP
NNTP
BGP
NTP
POP
RPC
RTP
RTSP
RIP
SIP
SMTP
SNMP
SOCKS
SSH
Telnet
TLS/SSL
XMPP
more...
Transport layer
TCP
UDP
DCCP
SCTP
RSVP
more...
Internet layer
IP
IPv4
IPv6
ICMP
ICMPv6
ECN
IGMP
IPsec
more...
Hypertext Transfer Protocol
61
Link layer
ARP/InARP
NDP
OSPF
Tunnels
L2TP
PPP
Media access control
Ethernet
DSL
ISDN
FDDI
DOCSIS
more...
v
t
e
[1]
The Hypertext Transfer Protocol (HTTP) is an application protocol for distributed, collaborative, hypermedia
information systems. HTTP is the foundation of data communication for the World Wide Web.
Hypertext is structured text that uses logical links (hyperlinks) between nodes containing text. HTTP is the protocol
to exchange or transfer hypertext.
The standards development of HTTP was coordinated by the Internet Engineering Task Force (IETF) and the World
Wide Web Consortium (W3C), culminating in the publication of a series of Requests for Comments (RFCs), most
notably RFC 2616 (June 1999), which defines HTTP/1.1, the version of HTTP in common use.
Technical overview
URL beginning with the HTTP scheme and the
WWW domain name label.
HTTP functions as a request-response protocol in the client-server
computing model. A web browser, for example, may be the client and
an application running on a computer hosting a web site may be the
server. The client submits an HTTP request message to the server. The
server, which provides resources such as HTML files and other
content, or performs other functions on behalf of the client, returns a
response message to the client. The response contains completion
status information about the request and may also contain requested
content in its message body.
A web browser is an example of a user agent (UA). Other types of user
agent include the indexing software used by search providers (web
crawlers), voice browsers, mobile apps and other software that
accesses, consumes or displays web content.
HTTP is designed to permit intermediate network elements to improve or enable communications between clients
and servers. High-traffic websites often benefit from web cache servers that deliver content on behalf of upstream
servers to improve response time. Web browsers cache previously accessed web resources and reuse them when
possible to reduce network traffic. HTTP proxy servers at private network boundaries can facilitate communication
for clients without a globally routable address, by relaying messages with external servers.
Hypertext Transfer Protocol
62
HTTP is an application layer protocol designed within the framework of the Internet Protocol Suite. Its definition
presumes an underlying and reliable transport layer protocol,
[2]
and Transmission Control Protocol (TCP) is
commonly used. However HTTP can use unreliable protocols such as the User Datagram Protocol (UDP), for
example in Simple Service Discovery Protocol (SSDP).
HTTP resources are identified and located on the network by Uniform Resource Identifiers (URIs)-or, more
specifically, Uniform Resource Locators (URLs)-using the hp or hps URI schemes. URIs and hyperlinks
in Hypertext Markup Language (HTML) documents form webs of inter-linked hypertext documents.
HTTP/1.1 is a revision of the original HTTP (HTTP/1.0). In HTTP/1.0 a separate connection to the same server is
made for every resource request. HTTP/1.1 can reuse a connection multiple times to download images, scripts,
stylesheets et cetera after the page has been delivered. HTTP/1.1 communications therefore experience less latency
as the establishment of TCP connections presents considerable overhead.
History
Tim Berners-Lee
The term HyperText was coined by Ted Nelson who in turn was
inspired by Vannevar Bush's microfilm-based "memex". Tim
Berners-Lee first proposed the "WorldWideWeb" project- now
known as the World Wide Web. Berners-Lee and his team are
credited with inventing the original HTTP along with HTML and the
associated technology for a web server and a text-based web
browser. The first version of the protocol had only one method,
namely GET, which would request a page from a server. The
response from the server was always an HTML page.
The first documented version of HTTP was HTTP V0.9
[3]
(1991).
Dave Raggett led the HTTP Working Group (HTTP WG) in 1995 and wanted to expand the protocol with extended
operations, extended negotiation, richer meta-information, tied with a security protocol which became more efficient
by adding additional methods and header fields. RFC 1945 officially introduced and recognized HTTP V1.0 in 1996.
The HTTP WG planned to publish new standards in December 1995 and the support for pre-standard HTTP/1.1
based on the then developing RFC 2068 (called HTTP-NG) was rapidly adopted by the major browser developers in
early 1996. By March 1996, pre-standard HTTP/1.1 was supported in Arena, Netscape 2.0, Netscape Navigator Gold
2.01, Mosaic 2.7,
[citation needed]
Lynx 2.5
[citation needed]
, and in Internet Explorer 2.0
[citation needed]
. End-user adoption
of the new browsers was rapid. In March 1996, one web hosting company reported that over 40% of browsers in use
on the Internet were HTTP 1.1 compliant.
[citation needed]
That same web hosting company reported that by June 1996,
65% of all browsers accessing their servers were HTTP/1.1 compliant. The HTTP/1.1 standard as defined in RFC
2068 was officially released in January 1997. Improvements and updates to the HTTP/1.1 standard were released
under RFC 2616 in June 1999.
HTTP session
An HTTP session is a sequence of network request-response transactions. An HTTP client initiates a request by
establishing a Transmission Control Protocol (TCP) connection to a particular port on a server (typically port 80; see
List of TCP and UDP port numbers). An HTTP server listening on that port waits for a client's request message.
Upon receiving the request, the server sends back a status line, such as "HTTP/1.1 200 OK", and a message of its
own. The body of this message is typically the requested resource, although an error message or other information
may also be returned.
Hypertext Transfer Protocol
63
Request methods
An HTTP 1.1 request made using telnet. The
request, response headers and response body are
highlighted.
HTTP defines methods (sometimes referred to as verbs) to indicate the
desired action to be performed on the identified resource. What this
resource represents, whether pre-existing data or data that is generated
dynamically, depends on the implementation of the server. Often, the
resource corresponds to a file or the output of an executable residing
on the server. The HTTP/1.0 specification
:section 8
defined the GET,
POST and HEAD methods and the HTTP/1.1 specification
:section 9
added 5 new methods: OPTIONS, PUT, DELETE, TRACE and
CONNECT. By being specified in these documents their semantics are
well known and can be depended upon. Any client can use any method
and the server can be configured to support any combination of
methods. If a method is unknown to an intermediate it will be treated
as an unsafe and non-idempotent method. There is no limit to the number of methods that can be defined and this
allows for future methods to be specified without breaking existing infrastructure. For example, WebDAV defined 7
new methods and RFC5789 specified the PATCH method.
GET
Requests a representation of the specified resource. Requests using GET should only retrieve data and should
have no other effect. (This is also true of some other HTTP methods.) The W3C has published guidance
principles on this distinction, saying, "Web application design should be informed by the above principles, but
also by the relevant limitations." See safe methods below.
HEAD
Asks for the response identical to the one that would correspond to a GET request, but without the response
body. This is useful for retrieving meta-information written in response headers, without having to transport
the entire content.
POST
Requests that the server accept the entity enclosed in the request as a new subordinate of the web resource
identified by the URI. The data POSTed might be, as examples, an annotation for existing resources; a
message for a bulletin board, newsgroup, mailing list, or comment thread; a block of data that is the result of
submitting a web form to a data-handling process; or an item to add to a database.
PUT
Requests that the enclosed entity be stored under the supplied URI. If the URI refers to an already existing
resource, it is modified; if the URI does not point to an existing resource, then the server can create the
resource with that URI.
DELETE
Deletes the specified resource.
TRACE
Echoes back the received request so that a client can see what (if any) changes or additions have been made by
intermediate servers.
OPTIONS
Returns the HTTP methods that the server supports for the specified URL. This can be used to check the
functionality of a web server by requesting '*' instead of a specific resource.
CONNECT
Hypertext Transfer Protocol
64
Converts the request connection to a transparent TCP/IP tunnel, usually to facilitate SSL-encrypted
communication (HTTPS) through an unencrypted HTTP proxy.
PATCH
Is used to apply partial modifications to a resource.
HTTP servers are required to implement at least the GET and HEAD methods and, whenever possible, also the
OPTIONS method.
[citation needed]
Safe methods
Some methods (for example, HEAD, GET, OPTIONS and TRACE) are defined as safe, which means they are
intended only for information retrieval and should not change the state of the server. In other words, they should not
have side effects, beyond relatively harmless effects such as logging, caching, the serving of banner advertisements
or incrementing a web counter. Making arbitrary GET requests without regard to the context of the application's state
should therefore be considered safe. By contrast, methods such as POST, PUT and DELETE are intended for actions
that may cause side effects either on the server, or external side effects such as financial transactions or transmission
of email. Such methods are therefore not usually used by conforming web robots or web crawlers; some that do not
conform tend to make requests without regard to context or consequences. Despite the prescribed safety of GET
requests, in practice their handling by the server is not technically limited in any way. Therefore, careless or
deliberate programming can cause non-trivial changes on the server. This is discouraged, because it can cause
problems for Web caching, search engines and other automated agents, which can make unintended changes on the
server.
Idempotent methods and web applications
Methods PUT and DELETE are defined to be idempotent, meaning that multiple identical requests should have the
same effect as a single request (Note that idempotence refers to the state of the system after the request has
completed, so while the action the server takes (e.g. deleting a record) or the response code it returns may be
different on subsequent requests, the system state will be the same every time). Methods GET, HEAD, OPTIONS
and TRACE, being prescribed as safe, should also be idempotent, as HTTP is a stateless protocol. In contrast, the
POST method is not necessarily idempotent, and therefore sending an identical POST request multiple times may
further affect state or cause further side effects (such as financial transactions). In some cases this may be desirable,
but in other cases this could be due to an accident, such as when a user does not realize that their action will result in
sending another request, or they did not receive adequate feedback that their first request was successful. While web
browsers may show alert dialog boxes to warn users in some cases where reloading a page may re-submit a POST
request, it is generally up to the web application to handle cases where a POST request should not be submitted more
than once. Note that whether a method is idempotent is not enforced by the protocol or web server. It is perfectly
possible to write a web application in which (for example) a database insert or other non-idempotent action is
triggered by a GET or other request. Ignoring this recommendation, however, may result in undesirable
consequences, if a user agent assumes that repeating the same request is safe when it isn't.
Hypertext Transfer Protocol
65
Security
Implementing methods such as TRACE, TRACK and DEBUG are considered potentially insecure by some security
professionals because attackers can use them to gather information or bypass security controls during attacks.
Security software tools such as Tenable Nessus and Microsoft UrlScan Security Tool report on the presence of these
methods as being security issues. TRACK and DEBUG are not valid HTTP 1.1 verbs.
Status codes
In HTTP/1.0 and since, the first line of the HTTP response is called the status line and includes a numeric status
code (such as "404") and a textual reason phrase (such as "Not Found"). The way the user agent handles the
response primarily depends on the code and secondarily on the response headers. Custom status codes can be used
since, if the user agent encounters a code it does not recognize, it can use the first digit of the code to determine the
general class of the response.
Also, the standard reason phrases are only recommendations and can be replaced with "local equivalents" at the web
developer's discretion. If the status code indicated a problem, the user agent might display the reason phrase to the
user to provide further information about the nature of the problem. The standard also allows the user agent to
attempt to interpret the reason phrase, though this might be unwise since the standard explicitly specifies that status
codes are machine-readable and reason phrases are human-readable. HTTP status code is primarily divided into five
groups for better explanation of request and responses between client and server as named: Informational 1XX,
Successful 2XX, Redirection 3XX, Client Error 4XX and Server Error 5XX.
Persistent connections
In HTTP/0.9 and 1.0, the connection is closed after a single request/response pair. In HTTP/1.1 a
keep-alive-mechanism was introduced, where a connection could be reused for more than one request. Such
persistent connections reduce request latency perceptibly, because the client does not need to re-negotiate the TCP
3-Way-Handshake connection after the first request has been sent. Another positive side effect is that in general the
connection becomes faster with time due to TCP's slow-start-mechanism.
Version 1.1 of the protocol also made bandwidth optimization improvements to HTTP/1.0. For example, HTTP/1.1
introduced chunked transfer encoding to allow content on persistent connections to be streamed rather than buffered.
HTTP pipelining further reduces lag time, allowing clients to send multiple requests before waiting for each
response. Another improvement to the protocol was byte serving, where a server transmits just the portion of a
resource explicitly requested by a client.
HTTP session state
HTTP is a stateless protocol. A stateless protocol does not require the HTTP server to retain information or status
about each user for the duration of multiple requests. However, some web applications implement states or server
side sessions using for instance HTTP cookies or Hidden variables within web forms.
Encrypted connections
The most popular way of establishing an encrypted HTTP connection is HTTP Secure.
Two other methods for establishing an encrypted HTTP connection also exist, called Secure Hypertext Transfer
Protocol and the HTTP/1.1 Upgrade header. Browser support, for these latter two, is, however, nearly
non-existent,
[citation needed]
so HTTP Secure is the dominant method of establishing an encrypted HTTP connection.
Hypertext Transfer Protocol
66
Request message
The request message consists of the following:
A request line, for example GET /images/1ogo.png HTTR/1.1, which requests a resource called
/images/1ogo.png from the server.
Request Headers, such as Accep-Language: en
An empty line.
An optional message body.
The request line and headers must all end with CRLF (that is, a carriage return character followed by a line
feed character). The empty line must consist of only CRLF and no other whitespace. In the HTTP/1.1 protocol,
all headers except Host are optional.
A request line containing only the path name is accepted by servers to maintain compatibility with HTTP clients
before the HTTP/1.0 specification in RFC 1945.
[4]
Response message
The response message consists of the following:
A Status-Line (for example HTTR/1.1 200 OK, which indicates that the client's request succeeded)
Response Headers, such as Conen-Type: ex/hm1
An empty line
An optional message body
The Status-Line and headers must all end with CRLF (a carriage return followed by a line feed). The empty
line must consist of only CRLF and no other whitespace.
Example session
Below is a sample conversation between an HTTP client and an HTTP server running on www.example.com, port
80.
Client request
GET /index.hm1 HTTR/1.1
Hos: www.examp1e.com
A client request (consisting in this case of the request line and only one header) is followed by a blank line, so that
the request ends with a double newline, each in the form of a carriage return followed by a line feed. The "Host"
header distinguishes between various DNS names sharing a single IP address, allowing name-based virtual hosting.
While optional in HTTP/1.0, it is mandatory in HTTP/1.1.
Server response
HTTR/1.1 200 OK
ae: Mon, 23May 200522:38:34 GMT
Server: Apache/1.3.3.7 (Unix) (Red-Ha/Linux)
Las-Modified: Wed, 08 Jan 2003 23:11:55 GMT
ETag: "3f80f-1b6-3e1cb03b"
Conen-Type: ex/hm1, charse=UTE-8
Conen-Lengh: 131
Connecion: c1ose
Hypertext Transfer Protocol
67
<hm1>
<head>
<i1e>An Examp1e Rage</i1e>
</head>
<body>
He11o Wor1d, his is a very simp1e HTML documen.
</body>
</hm1>
The ETag (entity tag) header is used to determine if a cached version of the requested resource is identical to the
current version of the resource on the server. Content-Type specifies the Internet media type of the data conveyed by
the HTTP message, while Content-Length indicates its length in bytes. The HTTP/1.1 webserver publishes its ability
to respond to requests for certain byte ranges of the document by setting the header Accept-Ranges. bytes. This is
useful, if the client needs to have only certain portions
[5]
of a resource sent by the server, which is called byte
serving. When Connection. close is sent in a header, it means that the web server will close the TCP connection
immediately after the transfer of this response.
Most of the header lines are optional. When Content-Length is missing the length is determined in other ways.
Chunked transfer encoding uses a chunk size of 0 to mark the end of the content. Identity encoding without
Content-Length reads content until the socket is closed.
A Content-Encoding like gzip can be used to compress the transmitted data.
Alternatives to HTTP
Historically, Gopher existed as a competitor to HTTP.
Notes
[1] http:/ / en. wikipedia.org/ w/ index.php?title=Template:IPstack& action=edit
[2] Fielding, et al. Internet RFC 2616." (http:/ / www.w3.org/ Protocols/ rfc2616/ rfc2616-sec1.html#sec1. 4), section 1.4. Retrieved on January
21, 2009.
[3] http:/ / www. w3.org/ pub/ WWW/ Protocols/ HTTP/ AsImplemented. html
[4] [4] 090502 apacheweek.com
[5] Tools.ietf.org (http:/ / tools.ietf. org/ html/ draft-ietf-http-range-retrieval-00), Byte Range Retrieval Extension to HTTP
References
HTTP 0.9 - As Implemented in 1991 (http:/ / www. w3. org/ Protocols/ HTTP/ AsImplemented. html)
External links
"Change History for HTTP" (http:/ / www. w3. org/ Protocols/ History. html). W3.org. Retrieved 2010-08-01. A
detailed technical history of HTTP.
"Design Issues for HTTP" (http:/ / www. w3. org/ Protocols/ DesignIssues. html). W3.org. Retrieved 2010-08-01.
Design Issues by Berners-Lee when he was designing the protocol.
"Classic HTTP Documents" (http:/ / www. w3. org/ Protocols/ Classic. html). W3.org. 1998-05-14. Retrieved
2010-08-01. list of other classic documents recounting the early protocol history
"HTTP Status Code Definitions" (http:/ / www.timesofhttp. com/ Pages/ StatusCodeDefinitions. aspx). Times of
HTTP
Roy Fielding
68
Roy Fielding
Roy Fielding speaking at OSCON08
Roy Thomas Fielding (born 1965) is an
American computer scientist, one of the principal
authors of the HTTP specification, an authority
on computer network architecture and co-founder
of the Apache HTTP Server project.
In 1999, he was named to the MIT Technology
Review TR100 as one of the top 100 innovators
in the world under the age of 35. He received a
doctorate from the University of California,
Irvine in 2000.
Contributions
Architectural Styles and the Design of
Network-based Software Architectures, Fielding's
doctoral dissertation, describes Representational
State Transfer (REST) as a key architectural
principle of the World Wide Web, and received a
large amount of attention. People now frequently
hold up REST as an approach to developing Web
services, as an alternative to other
distributed-computing specifications such as
SOAP. Fielding has also been heavily involved in
the development of HTML and Uniform
Resource Identifiers. Fielding was a co-founder of the Apache HTTP Server project and was a member of the interim
OpenSolaris Boards until he resigned from the community in 2008, disappointed that Sun would not let the
community influence development decisions. He was the chair of the Apache Software Foundation for its first three
years and remains a member of its board of directors. Currently he works as a Principal Scientist at Adobe Systems
in San Jose, California.
In September 2012, he came under fireWikipedia:Please clarify when he committed a patch to the Apache HTTP
Server that would disable the ability to set the Do Not Track setting of IE10 in response to the news that Microsoft
would make this the default option.
[citation needed]
Waka protocol
Between 2002 and 2006 Fielding worked on Waka, an application protocol intended as "a binary, token-based
replacement for HTTP." It was "designed to match the efficiency of the REST architectural style." The waka
protocol is named after a type of Maori canoe.
Waka was described in a 2002 ApacheCon presentation. As of August 2006, waka was "all done in my head, it's not
on paper though. ... I'm almost to the point where I can make it an open project."
Some of waka's features include:
New request semantics (new methods for monitoring and authoring resources)
Self-descriptive (explicit type, scope, binding of response to request)
Allow unsolicited responses
Roy Fielding
69
Uniform syntax regardless of type and direction
Extensible via URIs
Client-side macros
Personal
He describes himself as "...part Maori, Kiwi, Yank, Irish, Scottish, British, and California beach bum...". Fielding
was born in Laguna Beach, California.
References
External links
Fielding's blog (http:/ / roy. gbiv. com/ untangled/ )
Roy Thomas Fielding (2000). "Architectural Styles and the Design of Network-based Software Architectures"
(https:/ / www. ics. uci. edu/ fielding/ pubs/ dissertation/ top. htm). University of California, Irvine.
Roy Fielding (https:/ / twitter. com/ fielding) on Twitter
70
Chapter 13: Interactive Exercises with
JavaScript at Codecademy
Codecademy
Codecademy
Codecademy homepage on March 3, 2013
Type Private
Headquarters New York City, United States
Areaserved Worldwide
Founder(s) Zach Sims, Ryan Bubinski
Industry Internet
Website
Codecademy
[1]
Alexa rank
2,417 (January 2014[2])
Current status Active
Codecademy is an online interactive platform that offers free coding classes in six different languages:
programming languages like Python, PHP, jQuery, JavaScript, and Ruby, as well as markup languages including
HTML and CSS. As of June 2012, the site had over 5 million users who had completed over 100 million exercises.
The site has received positive reviews from many blogs and websites, including the New York Times and
TechCrunch.
Each individual who joins has their own profile. To motivate users to participate, the site offers feedback, badges for
completing exercises, as well as a function that keeps track of a user's total score and total day streak, and displays it
to others. There are also CSS and HTML glossaries available within each tutorial. The site allows anyone to create
and publish a new course using a Course Creator tool.
Codecademy also provides a forum where enthusiasts, beginners, and advanced coders can come together. There are
four main topics: Web (HTML, CSS & JS), Ruby, Python, and Miscellaneous.
Codecademy
71
History
Codecademy was founded in 2011 by Zach Sims and Ryan Bubinski. Sims dropped out of Columbia University to
focus on launching a venture, while Bubinski graduated from Columbia with a degree in computer science and
biophysics. The company, headquartered in New York City, raised $2.5 million in Series A funding in October 2011
and $10 million in Series B funding in June 2012. The latest round of funding was led by Index Ventures.
Code Year
Code Year is a free Codecademy program for anyone who is interested to learn how to program. The program
intends to help people follow through on a New Year's Resolution to learn how to program, by introducing a new
course for every week in 2012. Over 450,000 people took courses in 2012, and Codecademy continued the program
into 2013.
References
[1] http:/ / www. codecademy.com/
[2] http:/ / en. wikipedia.org/ w/ index.php?title=Codecademy& action=edit
External links
Codecademy website (http:/ / www. codecademy. com)
JavaScript
JavaScript
Paradigm(s) Multi-paradigm: scripting, object-oriented (prototype-based), imperative, functional
Appeared in 1995
Designed by Brendan Eich
Developer Netscape Communications Corporation, Mozilla Foundation
Stable release 1.8.5 (March22, 2011)
Typing discipline dynamic, duck
Major implementations KJS, Rhino, SpiderMonkey, V8, Carakan, Chakra
Influenced by Scheme, Self
Influenced ActionScript, CoffeeScript, Dart, JScript .NET, Objective-J, QML, TIScript, TypeScript, Node.js
JavaScript at Wikibooks
JavaScript
72
JavaScript
Filename extension ._s
Internet media type app1icaion/_avascrip
ex/_avascrip(obsolete)
Uniform Type Identifier com.netscape.javascript-source
Type of format Scripting language
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]
JavaScript (JS) is an interpreted computer programming language.
[2]
As part of web browsers, implementations
allow client-side scripts to interact with the user, control the browser, communicate asynchronously, and alter the
document content that is displayed.
[2]
It has also become common in server-side programming, game development
and the creation of desktop applications.
JavaScript is a prototype-based scripting language with dynamic typing and has first-class functions. Its syntax was
influenced by C. JavaScript copies many names and naming conventions from Java, but the two languages are
otherwise unrelated and have very different semantics. The key design principles within JavaScript are taken from
the Self and Scheme programming languages. It is a multi-paradigm language, supporting object-oriented,
imperative, and functional
[3]
programming styles.
The application of JavaScript to use outside of web pages-for example, in PDF documents, site-specific browsers,
and desktop widgets-is also significant. Newer and faster JavaScript VMs and platforms built upon them (notably
Node.js) have also increased the popularity of JavaScript for server-side web applications.
JavaScript
73
JavaScript was formalized in the ECMAScript language standard and is primarily used as part of a web browser
(client-side JavaScript). This enables programmatic access to computational objects within a host environment.
History
Birth at Netscape
JavaScript was originally developed by Brendan Eich. While battling with Microsoft over the Web, Netscape
considered their client-server offering a distributed OS, running a portable version of Sun Microsystems' Java.
Because Java was a competitor of C++ and aimed at professional programmers, Netscape also wanted a lightweight
interpreted language that would complement Java by appealing to nonprofessional programmers, like Microsoft's
Visual Basic (see JavaScript and Java).
Although it was developed under the name Mocha, the language was officially called LiveScript when it first shipped
in beta releases of Netscape Navigator 2.0 in September 1995, but it was renamed JavaScript
[4]
when it was deployed
in the Netscape browser version 2.0B3.
The change of name from LiveScript to JavaScript roughly coincided with Netscape adding support for Java
technology in its Netscape Navigator web browser. The final choice of name caused confusion, giving the
impression that the language was a spin-off of the Java programming language, and the choice has been
characterized by many as a marketing ploy by Netscape to give JavaScript the cachet of what was then the hot new
web programming language.
There is a common misconception that the JavaScript language was influenced by Cmm (C-minus-minus), an earlier
web page scripting language developed by Nombas.
[5][6][7]
Brendan Eich, however, had never heard of Cmm before
he created LiveScript.
[8]
Nombas did pitch their embedded web page scripting to Netscape, though web page
scripting was not a new concept, as shown by ViolaWWW.
[9]
Nombas later switched to offering JavaScript instead
of Cmm in their ScriptEase product and was part of the TC39 group that standardized ECMAScript.
[10][11]
Server-side JavaScript
Netscape introduced an implementation of the language for server-side scripting (SSJS) with Netscape Enterprise
Server, first released in December, 1994 (soon after releasing JavaScript for browsers). Since the mid-2000s, there
has been a proliferation of server-side JavaScript implementations. Node.js is one recent notable example of
server-side JavaScript being used in real-world applications.
Adoption by Microsoft
JavaScript very quickly gained widespread success as a client-side scripting language for web pages. Microsoft
introduced JavaScript support in its own web browser, Internet Explorer, in version 3.0, released in August
1996.Wikipedia:Verifiability Microsoft's webserver, Internet Information Server, introduced support for server-side
scripting in JavaScript with release 3.0 (1996). Microsoft started to promote webpage scripting using the umbrella
term Dynamic HTML.
Microsoft's JavaScript implementation was later renamed JScript to avoid trademark issues. JScript added new date
methods to fix the Y2K-problematic methods in JavaScript, which were based on Java's _ava.ui1.ae class.
JavaScript
74
Standardization
In November 1996, Netscape announced that it had submitted JavaScript to Ecma International for consideration as
an industry standard, and subsequent work resulted in the standardized version named ECMAScript. In June 1997,
Ecma International published the first edition of the ECMA-262 specification. A year later, in June 1998, some
modifications were made to adapt it to the ISO/IEC-16262 standard, and the second edition was released. The third
edition of ECMA-262 (published on December 1999) is the version most browsers currently use.
Development of what would have been a fourth edition of the ECMAScript standard was ultimately never completed
and no fourth edition was released.
[12]
The fifth edition was released in December 2009. The current edition of the
ECMAScript standard is 5.1, released in June 2011.
Later developments
JavaScript has become one of the most popular programming languages on the web. Initially, however, many
professional programmers denigrated the language because its target audience consisted of web authors and other
such "amateurs", among other reasons. The advent of Ajax returned JavaScript to the spotlight and brought more
professional programming attention. The result was a proliferation of comprehensive frameworks and libraries,
improved JavaScript programming practices, and increased usage of JavaScript outside of web browsers, as seen by
the proliferation of server-side JavaScript platforms.
In January 2009, the CommonJS project was founded with the goal of specifying a common standard library mainly
for JavaScript development outside the browser.
Trademark
Today, "JavaScript" is a trademark of Oracle Corporation. It is used under license for technology invented and
implemented by Netscape Communications and current entities such as the Mozilla Foundation.
Features
The following features are common to all conforming ECMAScript implementations, unless explicitly specified
otherwise.
Imperative and structured
JavaScript supports much of the structured programming syntax from C (e.g., if statements, whi1e loops,
swich statements, etc.). One partial exception is scoping: C-style block scoping is not supported. Instead,
JavaScript has function scoping (although, block scoping using the 1e keyword was added in JavaScript 1.7). Like
C, JavaScript makes a distinction between expressions and statements. One syntactic difference from C is automatic
semicolon insertion, in which the semicolons that terminate statements can be omitted.
[13]
JavaScript
75
Dynamic
Dynamic typing
As in most scripting languages, types are associated with values, not with variables. For example, a variable x
could be bound to a number, then later rebound to a string. JavaScript supports various ways to test the type of
an object, including duck typing.
[14]
Object based
JavaScript is almost entirely object-based. JavaScript objects are associative arrays, augmented with
prototypes (see below). Object property names are string keys. They support two equivalent syntaxes: dot
notation (ob_.x=10) and bracket notation (ob_['x'|=10). Properties and their values can be added,
changed, or deleted at run-time. Most properties of an object (and those on its prototype inheritance chain) can
be enumerated using a for...in loop. JavaScript has a small number of built-in objects such as
Euncion and ae.
Run-time evaluation
JavaScript includes an eva1 function that can execute statements provided as strings at run-time.
Functional
First-class functions
Functions are first-class; they are objects themselves. As such, they have properties and methods, such as
.ca11() and .bind(). A nested function is a function defined within another function. It is created each
time the outer function is invoked. In addition, each created function forms a lexical closure: the lexical scope
of the outer function, including any constants, local variables and argument values, becomes part of the
internal state of each inner function object, even after execution of the outer function concludes.
[15]
Prototype-based
Prototypes
JavaScript uses prototypes where many other object oriented languages use classes for inheritance. It is
possible to simulate many class-based features with prototypes in JavaScript.
Functions as object constructors
Functions double as object constructors along with their typical role. Prefixing a function call with new will
create an instance of a prototype, inheriting properties and methods from the constructor (including properties
from the Ob_ec prototype). ECMAScript 5 offers the Ob_ec.creae method, allowing explicit
creation of an instance without automatically inheriting from the Ob_ec prototype (older environments can
assign the prototype to nu11). The constructor's prooype property determines the object used for the
new object's internal prototype. New methods can be added by modifying the prototype of the object used as a
constructor. JavaScript's built-in constructors, such as Array or Ob_ec, also have prototypes that can be
modified. While it is possible to modify the Ob_ec prototype, it is generally considered bad practice
because most objects in JavaScript will inherit methods and properties from the Ob_ec prototype and they
may not expect the prototype to be modified.
Functions as methods
Unlike many object-oriented languages, there is no distinction between a function definition and a method
definition. Rather, the distinction occurs during function calling; when a function is called as a method of an
object, the function's local his keyword is bound to that object for that invocation.
JavaScript
76
Implicit and Explicit Delegation
JavaScript is a Delegation Language.
Functions as Roles (Traits and Mixins)
JavaScript natively supports various function based implementations of Role patterns like Traits
[16]
and
Mixins.
[17]
Such a function defines additional behavior by at least one method bound to the his keyword
within its funcion body. A Role then has to be delegated explicitly via ca11 or app1y to objects that
need to feature additional behavior that is not shared via the prototype chain.
Type Composition and Inheritance
Whereas explicit function based delegation does cover composition in JavaScript, implicit delegation already
happens every time the prototype chain is walked in order to e.g. find a method that might be related to but is
not directly owned by an object. Once the method was found it gets called within this objects context. Thus
inheritance in JavaScript is covered by a delegation automatism that is bound to the prototype property of
constructor functions.
Miscellaneous
Run-time environment
JavaScript typically relies on a run-time environment (e.g. a web browser) to provide objects and methods by
which scripts can interact with the environment (e.g. a webpage DOM). It also relies on the run-time
environment to provide the ability to include/import scripts (e.g. HTML <scrip> elements). This is not a
language feature per se, but it is common in most JavaScript implementations.
Variadic functions
An indefinite number of parameters can be passed to a function. The function can access them through formal
parameters and also through the local argumens object. Variadic functions can also be created by using
the app1y method.
Array and object literals
Like many scripting languages, arrays and objects (associative arrays in other languages) can each be created
with a succinct shortcut syntax. In fact, these literals form the basis of the JSON data format.
Regular expressions
JavaScript also supports regular expressions in a manner similar to Perl, which provide a concise and powerful
syntax for text manipulation that is more sophisticated than the built-in string functions.
Vendor-specific extensions
JavaScript is officially managed by Mozilla Foundation, and new language features are added periodically. However,
only some JavaScript engines support these new features:
property getter and setter functions (supported by WebKit, Opera,
[18]
ActionScript, and Rhino)
[19]
conditional cach clauses
iterator protocol (adopted from Python)
shallow generators-coroutines (adopted from Python)
array comprehensions and generator expressions (adopted from Python)
proper block scope via the 1e keyword
array and object destructuring (limited form of pattern matching)
concise function expressions (funcion(args) expr)
ECMAScript for XML (E4X), an extension that adds native XML support to ECMAScript
JavaScript
77
Syntax
As of 2011[20], the latest version of the language is JavaScript 1.8.5. It is a superset of ECMAScript (ECMA-262)
Edition 3. Extensions to the language, including partial ECMAScript for XML (E4X) (ECMA-357) support and
experimental features considered for inclusion into future ECMAScript editions, are documented here.
Simple examples
Variables in JavaScript can be defined using the var keyword:
var x, //defines the variab1e x, a1though no va1ue is assigned to it by
default
var y = 2, //defines the variab1e y and assigns the va1ue of 2 to it
Note the comments in the example above, both of which were preceded with two forward slashes.
There is no built-in I/O functionality in JavaScript; the runtime environment provides that. The ECMAScript
specification in edition 5.1 mentions:
... indeed, there are no provisions in this specification for input of external data or output of computed
results.
However, most runtime environments have a conso1e object that can be used to print output. Here is a minimalist
Hello World program:
conso1e.1og("He11o wor1d!"),
A simple recursive function:
function facoria1(n) {
if (n === 0) {
return 1,
}
return n * facoria1(n - 1),
}
Anonymous function (or lambda) syntax and closure example:
var disp1ayC1osure = function() {
var coun = 0,
return function () {
return ++coun,
},
}
var inc = disp1ayC1osure(),
inc(), // returns 1
inc(), // returns 2
inc(), // returns 3
Variadic function demonstration (argumens is a special variable).
var sum = function() {
var i, x = 0,
for (i = 0, i < argumens.1engh, ++i) {
x += argumens[i|,
}
JavaScript
78
return x,
}
sum(1, 2, 3), // returns 6
Immediately-invoked function expressions allow functions to pass around variables under their own closures.
var v,
v = 1,
var geVa1ue = (function(v) {
return function() {return v,},
})(v),
v = 2,
geVa1ue(), // 1
More advanced example
This sample code displays various JavaScript features.
/* Einds the 1owest common mu1tip1e (LCM) of two numbers */
function LCMCa1cu1aor(x, y) { // constructor function
var chec'In = function (x) { // inner function
if (x % 1 !== 0) {
throw new TypeError(x + " is no an ineger"), // throw an
excepion
}
return x,
},
this.a = chec'In(x)
// semico1ons ^^^^ are optiona1, a new1ine is enough
this.b = chec'In(y),
}
// The prototype of obect instances created by a constructor is
// that constructor's "prototype" property.
LCMCa1cu1aor.prooype = { // obect 1itera1
consrucor: LCMCa1cu1aor, // when reassigning a prototype, set
he consrucor propery appropriae1y
gcd: function () { // method that ca1cu1ates the greatest common
divisor
// Euc1idean a1gorithm:
var a = Mah.abs(this.a), b = Mah.abs(this.b), ,
if (a < b) {
// swap variab1es
= b,
b = a,
a = ,
}
while (b !== 0) {
= b,
JavaScript
79
b = a % b,
a = ,
}
// On1y need to ca1cu1ate GC once, so "redefine" this method.
// (ctua11y not redefinition$it's defined on the instance
ise1f,
// so that this.gcd refers to this "redefinition" instead of
LCMCa1cu1aor.prooype.gcd.)
// 1so, 'gcd' === "gcd", this['gcd'] === this.gcd
this['gcd'| = function () {
return a,
},
return a,
},
// Obect property names can be specified by strings de1imited by
double (") or sing1e (') quoes.
1cm : funcion () {
// Variab1e names don' co11ide wih ob_ec properies, e.g.
|1cm| is no |his.1cm|.
// no using |his.a * his.b| o avoid ER precision issues
var 1cm = his.a / his.gcd() * his.b,
// On1y need o ca1cu1ae 1cm once, so "redefine" his mehod.
his.1cm = funcion () {
reurn 1cm,
},
reurn 1cm,
},
oSring: funcion () {
reurn "LCMCa1cu1aor: a = " + his.a + ", b = " + his.b,
}
},
// efine generic oupu funcion, his imp1emenaion on1y wor's for
web browsers
funcion oupu(x) {
documen.body.appendChi1d(documen.creaeTexNode(x)),
documen.body.appendChi1d(documen.creaeE1emen('br')),
}
// Noe: Array's map() and forEach() are defined in JavaScrip 1.6.
// They are used here o demonsrae JavaScrip's inheren funciona1
naure.
[[25, 55|, [21, 56|, [22, 58|, [28, 56||.map(funcion (pair) { // array
1iera1 + mapping funcion
reurn new LCMCa1cu1aor(pair[0|, pair[1|),
}).sor(funcion (a, b) { // sor wih his comparaive funcion
reurn a.1cm() - b.1cm(),
JavaScript
80
}).forEach(funcion (ob_) {
oupu(ob_ + ", gcd = " + ob_.gcd() + ", 1cm = " + ob_.1cm()),
}),
The following output should be displayed in the browser window.
LCMCa1cu1aor: a = 28, b = 56, gcd = 28, 1cm = 56
LCMCa1cu1aor: a = 21, b = 56, gcd = 7, 1cm = 168
LCMCa1cu1aor: a = 25, b = 55, gcd = 5, 1cm = 275
LCMCa1cu1aor: a = 22, b = 58, gcd = 2, 1cm = 638
Use in web pages
The most common use of JavaScript is to write functions that are embedded in or included from HTML pages and
that interact with the Document Object Model (DOM) of the page. Some simple examples of this usage are:
Loading new page content or submitting data to the server via AJAX without reloading the page (for example, a
social network might allow the user to post status updates without leaving the page)
Animation of page elements, fading them in and out, resizing them, moving them, etc.
Interactive content, for example games, and playing audio and video
Validating input values of a web form to make sure that they are acceptable before being submitted to the server.
Transmitting information about the user's reading habits and browsing activities to various websites. Web pages
frequently do this for web analytics, ad tracking, personalization or other purposes.
Because JavaScript code can run locally in a user's browser (rather than on a remote server), the browser can respond
to user actions quickly, making an application more responsive. Furthermore, JavaScript code can detect user actions
which HTML alone cannot, such as individual keystrokes. Applications such as Gmail take advantage of this: much
of the user-interface logic is written in JavaScript, and JavaScript dispatches requests for information (such as the
content of an e-mail message) to the server. The wider trend of Ajax programming similarly exploits this strength.
A JavaScript engine (also known as JavaScript interpreter or JavaScript implementation) is an interpreter that
interprets JavaScript source code and executes the script accordingly. The first JavaScript engine was created by
Brendan Eich at Netscape Communications Corporation, for the Netscape Navigator web browser. The engine,
code-named SpiderMonkey, is implemented in C. It has since been updated (in JavaScript 1.5) to conform to
ECMA-262 Edition 3. The Rhino engine, created primarily by Norris Boyd (formerly of Netscape; now at Google) is
a JavaScript implementation in Java. Rhino, like SpiderMonkey, is ECMA-262 Edition 3 compliant.
A web browser is by far the most common host environment for JavaScript. Web browsers typically create "host
objects" to represent the Document Object Model (DOM) in JavaScript. The web server is another common host
environment. A JavaScript webserver would typically expose host objects representing HTTP request and response
objects, which a JavaScript program could then interrogate and manipulate to dynamically generate web pages.
Because JavaScript is the only language that the most popular browsers share support for, it has become a target
language for many frameworks in other languages, even though JavaScript was never intended to be such a
language. Despite the performance limitations inherent to its dynamic nature, the increasing speed of JavaScript
engines has made the language a surprisingly feasible compilation target.
JavaScript
81
Example script
Below is a minimal example of a standards-conforming web page containing JavaScript (using HTML 5 syntax) and
the DOM:
<!OCTYRE hm1>
<mea charse="uf-8">
<i1e>Minima1 Examp1e</i1e>
<h1 id="header">This is JavaScrip</h1>
<scrip>
documen.body.appendChi1d(documen.creaeTexNode('He11o Wor1d!')),
var h1 = documen.geE1emenById('header'), // ho1ds a reference o he <h1> ag
h1 = documen.geE1emensByTagName('h1')[0|, // accessing he same <h1> e1emen
</scrip>
<noscrip>Your browser eiher does no suppor JavaScrip, or has i urned off.</noscrip>
Compatibility considerations
Because JavaScript runs in widely varying environments, an important part of testing and debugging is to test and
verify that the JavaScript works across multiple browsers.
The DOM interfaces for manipulating web pages are not part of the ECMAScript standard, or of JavaScript itself.
Officially, the DOM interfaces are defined by a separate standardization effort by the W3C; in practice, browser
implementations differ from the standards and from each other, and not all browsers execute JavaScript.
To deal with these differences, JavaScript authors can attempt to write standards-compliant code which will also be
executed correctly by most browsers; failing that, they can write code that checks for the presence of certain browser
features and behaves differently if they are not available.
[21]
In some cases, two browsers may both implement a
feature but with different behavior, and authors may find it practical to detect what browser is running and change
their script's behavior to match.
[22][23]
Programmers may also use libraries or toolkits which take browser differences
into account.
Furthermore, scripts may not work for some users. For example, a user may:
use an old or rare browser with incomplete or unusual DOM support,
use a PDA or mobile phone browser which cannot execute JavaScript,
have JavaScript execution disabled as a security precaution,
use a speech browser due to, for example, a visual disability.
To support these users, web authors can try to create pages which degrade gracefully on user agents (browsers)
which do not support the page's JavaScript. In particular, the page should remain usable albeit without the extra
features that the JavaScript would have added. An alternative approach that many find preferable is to first author
content using basic technologies that work in all browsers, then enhance the content for users that have JavaScript
enabled. This is known as progressive enhancement.
JavaScript
82
Accessibility
Assuming that the user has not disabled its execution, client-side web JavaScript should be written to enhance the
experiences of visitors with visual or physical disabilities, and certainly should avoid denying information to these
visitors.
[24]
Screen readers, used by the blind and partially sighted, can be JavaScript-aware and so may access and read the page
DOM after the script has altered it. The HTML should be as concise, navigable and semantically rich as possible
whether the scripts have run or not. JavaScript should not be totally reliant on mouse or keyboard specific events
because a user may be physically unable to use these input devices. For this reason, device-agnostic events such as
onfocus and onchange are preferable to device-centric events such as onmouseover and on'eypress in
most cases.
[24]
JavaScript should not be used in a way that is confusing or disorienting to any web user. For example, using script to
alter or disable the normal functionality of the browser, such as by changing the way the "back" or "refresh" buttons
work, is usually best avoided. Equally, triggering events that the user may not be aware of reduces the user's sense of
control as do unexpected scripted changes to the page content.
Often the process of making a complex web page as accessible as possible becomes a nontrivial problem where
issues become matters of debate and opinion, and where compromises are necessary in the end. However, user
agents and assistive technologies are constantly evolving and new guidelines and relevant information are
continually being published on the web.
[24]
Security
JavaScript and the DOM provide the potential for malicious authors to deliver scripts to run on a client computer via
the web. Browser authors contain this risk using two restrictions. First, scripts run in a sandbox in which they can
only perform web-related actions, not general-purpose programming tasks like creating files. Second, scripts are
constrained by the same origin policy: scripts from one web site do not have access to information such as
usernames, passwords, or cookies sent to another site. Most JavaScript-related security bugs are breaches of either
the same origin policy or the sandbox.
There are subsets of general JavaScript - ADsafe, Secure ECMA Script (SES) - that provide greater level of
security, especially on code created by third parties (such as advertisements).
Content Security Policy is the main intended method of ensuring that only trusted code is executed on a web page.
Cross-site vulnerabilities
A common JavaScript-related security problem is cross-site scripting, or XSS, a violation of the same-origin policy.
XSS vulnerabilities occur when an attacker is able to cause a target web site, such as an online banking website, to
include a malicious script in the webpage presented to a victim. The script in this example can then access the
banking application with the privileges of the victim, potentially disclosing secret information or transferring money
without the victim's authorization. A solution to XSS vulnerabilities is to use HTML escaping whenever displaying
untrusted data.
Some browsers include partial protection against reflected XSS attacks, in which the attacker provides a URL
including malicious script. However, even users of those browsers are vulnerable to other XSS attacks, such as those
where the malicious code is stored in a database. Only correct design of Web applications on the server side can fully
prevent XSS.
XSS vulnerabilities can also occur because of implementation mistakes by browser authors.
[25]
Another cross-site vulnerability is cross-site request forgery or CSRF. In CSRF, code on an attacker's site tricks the
victim's browser into taking actions the user didn't intend at a target site (like transferring money at a bank). It works
because, if the target site relies only on cookies to authenticate requests, then requests initiated by code on the
JavaScript
83
attacker's site will carry the same legitimate login credentials as requests initiated by the user. In general, the solution
to CSRF is to require an authentication value in a hidden form field, and not only in the cookies, to authenticate any
request that might have lasting effects. Checking the HTTP Referrer header can also help.
"JavaScript hijacking" is a type of CSRF attack in which a script tag on an attacker's site exploits a page on the
victim's site that returns private information such as JSON or JavaScript. Possible solutions include:
requiring an authentication token in the POST and GET parameters for any response that returns private
information
using POST and never GET for requests that return private information
Misplaced trust in the client
Developers of client-server applications must recognize that untrusted clients may be under the control of attackers.
The application author cannot assume that his JavaScript code will run as intended (or at all) because any secret
embedded in the code could be extracted by a determined adversary. Some implications are:
Web site authors cannot perfectly conceal how their JavaScript operates because the raw source code must be sent
to the client. The code can be obfuscated, but obfuscation can be reverse-engineered.
JavaScript form validation only provides convenience for users, not security. If a site verifies that the user agreed
to its terms of service, or filters invalid characters out of fields that should only contain numbers, it must do so on
the server, not only the client.
Scripts can be selectively disabled, so JavaScript can't be relied on to prevent operations such as right-clicking on
an image to save it.
It is extremely bad practice to embed sensitive information such as passwords in JavaScript because it can be
extracted by an attacker.
Browser and plugin coding errors
JavaScript provides an interface to a wide range of browser capabilities, some of which may have flaws such as
buffer overflows. These flaws can allow attackers to write scripts which would run any code they wish on the user's
system. This code is not by any means limited to another JavaScript application. For example, a buffer overrun
exploit can allow an attacker to gain access to the operating system's API with superuser privileges.
These flaws have affected major browsers including Firefox,
[26]
Internet Explorer,
[27]
and Safari.
[28]
Plugins, such as video players, Adobe Flash, and the wide range of ActiveX controls enabled by default in Microsoft
Internet Explorer, may also have flaws exploitable via JavaScript (such flaws have been exploited in the past).
[29][30]
In Windows Vista, Microsoft has attempted to contain the risks of bugs such as buffer overflows by running the
Internet Explorer process with limited privileges.
[31]
Google Chrome similarly confines its page renderers to their
own "sandbox".
Sandbox implementation errors
Web browsers are capable of running JavaScript outside of the sandbox, with the privileges necessary to, for
example, create or delete files. Of course, such privileges aren't meant to be granted to code from the web.
Incorrectly granting privileges to JavaScript from the web has played a role in vulnerabilities in both Internet
Explorer
[32]
and Firefox.
[33]
In Windows XP Service Pack 2, Microsoft demoted JScript's privileges in Internet
Explorer.
[34]
Microsoft Windows allows JavaScript source files on a computer's hard drive to be launched as general-purpose,
non-sandboxed programs (see: Windows Script Host). This makes JavaScript (like VBScript) a theoretically viable
vector for a Trojan horse, although JavaScript Trojan horses are uncommon in practice.
[35]
JavaScript
84
Uses outside web pages
In addition to web browsers and servers, JavaScript interpreters are embedded in a number of tools. Each of these
applications provides its own object model which provides access to the host environment. The core JavaScript
language remains mostly the same in each application.
Embedded scripting language
Google's Chrome extensions, Opera's extensions, Apple's Safari 5 extensions, Apple's Dashboard Widgets,
Microsoft's Gadgets, Yahoo Widgets, Google Desktop Gadgets, and Serence Klipfolio are implemented using
JavaScript.
Adobe's Acrobat and Adobe Reader support JavaScript in PDF files.
Tools in the Adobe Creative Suite, including Photoshop, Illustrator, Dreamweaver, and InDesign, allow scripting
through JavaScript.
OpenOffice.org, an office application suite, allows JavaScript to be used as a scripting language.
The interactive music signal processing software Max/MSP released by Cycling '74, offers a JavaScript model of
its environment for use by developers. It allows much more precise control than the default GUI-centric
programming model.
Apple's Logic Pro X digital audio workstation (DAW) software can create custom MIDI effects plugins using
JavaScript.
ECMAScript was included in the VRML97 standard for scripting nodes of VRML scene description files.
Sphere is an open-source and cross-platform computer program designed primarily to make role-playing games
that use JavaScript as a scripting language.
The open-source Re-Animator framework allows developing 2D sprite-based games using JavaScript and
XML.
[36]
The Unity game engine supports a modified version of JavaScript for scripting via Mono.
DX Studio (3D engine) uses the SpiderMonkey implementation of JavaScript for game and simulation logic.
Maxwell Render (rendering software) provides an ECMA standard based scripting engine for tasks
automation.
[37]
Google Apps Script in Google Spreadsheets and Google Sites allows users to create custom formulas, automate
repetitive tasks and also interact with other Google products such as Gmail.
[38]
Many IRC clients, like ChatZilla or XChat, use JavaScript for their scripting abilities.
SpinetiX products use the SpiderMonkey JavaScript engine to allow scripting within SVG files to create digital
signage projects.
Cloud Party virtual world uses a limited version of JavaScript/ECMAScript 5 as in-world scripting language.
Scripting engine
Microsoft's Active Scripting technology supports JScript as a scripting language.
The Java programming language introduced the _avax.scrip package in version 6 that includes a
JavaScript implementation based on Mozilla Rhino. Thus, Java applications can host scripts that access the
application's variables and objects, much like web browsers host scripts that access a webpage's Document Object
Model (DOM).
[39]
The Qt C++ toolkit includes a QScrip module to interpret JavaScript, analogous to Java's _avax.scrip
package.
[40]
JSDB (JavaScript for Databases) is an open-source JavaScript shell for Windows, Mac OS X, Linux, and Unix,
which extends the Mozilla JavaScript engine with file, database, email, and network objects.
[41]
jslibs is an open-source JavaScript shell for Windows and Linux which extends the Mozilla JavaScript engine. It
has the ability to call functions in commonly used libraries like NSPR, SQLite, libTomCrypt, OpenGL, OpenAL,
JavaScript
85
and librsvg.
[42]
Late Night Software's JavaScript OSA (aka JavaScript for OSA, or JSOSA) is a freeware alternative to
AppleScript for Mac OS X. It is based on the Mozilla 1.5 JavaScript implementation, with the addition of a
MacOS object for interaction with the operating system and third-party applications.
[43]
Application platform
ActionScript, the programming language used in Adobe Flash, is another implementation of the ECMAScript
standard.
Adobe Integrated Runtime is a JavaScript runtime that allows developers to create desktop applications.
CA, Inc.'s AutoShell cross-application scripting environment is built on the SpiderMonkey Javascript engine. It
contains preprocessor-like extensions for command definition, as well as custom classes for various
system-related tasks like file I/O, operation system command invocation and redirection, and COM scripting.
GNOME Shell, the shell for the GNOME 3 desktop environment, made JavaScript its default programming
language in 2013.
The Mozilla platform, which underlies Firefox, Thunderbird, and some other web browsers, uses JavaScript to
implement the graphical user interface (GUI) of its various products.
myNFC is a JavaScript based framework that allows developers to create applications for smart phones.
Qt Quick's markup language (available since Qt 4.7) uses JavaScript for its application logic. Its declarative
syntax is also similar to JavaScript.
TypeScript is a programming language based on JavaScript that adds support for optional type annotations and
some other language extensions such as classes, interfaces and modules. A TS-script compiles into plain
JavaScript and can be executed in any JS host supporting ECMAScript 3 or higher. The compiler is itself written
in TypeScript.
Ubuntu Touch provides a JavaScript API for its unified usability interface.
webOS uses the WebKit implementation of JavaScript in its SDK to allow developers to create stand-alone
applications solely in JavaScript.
WinJS provides a special Windows Library for JavaScript functionality in Windows 8 that enables the
development of Modern style (formerly Metro style) applications in HTML5 and JavaScript.
Development tools
Within JavaScript, access to a debugger becomes invaluable when developing large, non-trivial programs. Because
there can be implementation differences between the various browsers (particularly within the Document Object
Model), it is useful to have access to a debugger for each of the browsers that a web application targets.
Script debuggers are available for Internet Explorer, Firefox, Safari, Google Chrome, and Opera.
Three debuggers are available for Internet Explorer: Microsoft Visual Studio is the richest of the three, closely
followed by Microsoft Script Editor (a component of Microsoft Office),
[44]
and finally the free Microsoft Script
Debugger which is far more basic than the other two. The free Microsoft Visual Web Developer Express provides a
limited version of the JavaScript debugging functionality in Microsoft Visual Studio. Internet Explorer has included
developer tools since version 8 (reached by pressing the F12 key).
Web applications within Firefox can be debugged using the Firebug add-on, or the older Venkman debugger. Firefox
also has a simpler built-in Error Console, which logs and evaluates JavaScript. It also logs CSS errors and warnings.
Opera includes a set of tools called Dragonfly.
WebKit's Web Inspector includes a JavaScript debugger, which is used in Safari. A modified version is used in
Google Chrome.
JavaScript
86
Some debugging aids are themselves written in JavaScript and built to run on the Web. An example is the program
JSLint, developed by Douglas Crockford who has written extensively on the language. JSLint scans JavaScript code
for conformance to a set of standards and guidelines.
Version history
The following table is based on information from multiple sources.
Version Release date Equivalent to Netscape
Navigator
Mozilla
Firefox
Internet
Explorer
Opera Safari Google
Chrome
1.0 March 1996 2.0 3.0
1.1 August 1996 3.0
1.2 June 1997 4.0-4.05 3
1.3 October
1998
ECMA-262 1st + 2nd edition 4.06-4.7x 4.0 5
1.4 Netscape
Server
6
1.5 November
2000
ECMA-262 3rd edition 6.0 1.0 5.5 (JScript
5.5),
6 (JScript
5.6),
7 (JScript
5.7),
8 (JScript
5.8)
7.0 3.0-5 1.0-10.0.666
1.6 November
2005
1.5 + array extras + array and
string generics + E4X
1.5
1.7 October
2006
1.6 + Pythonic generators
[45]
+ iterators + let
2.0 28.0.1500.95
1.8 June 2008 1.7 + generator expressions +
expression closures
3.0 11.50
1.8.1 1.8 + native JSON support +
minor updates
3.5
1.8.2 June 22,
2009
1.8.1 + minor updates 3.6
1.8.5 July 27,
2010
1.8.2 + ECMAScript 5
compliance
4 9 11.60
1.8.6Wikipedia:Disputed
statement
17
Legend:
Old version
Latest version
JavaScript
87
Related languages and features
JSON, or JavaScript Object Notation, is a general-purpose data interchange format that is defined as a subset of
JavaScript's literal syntax.
jQuery is a popular JavaScript library designed to simplify DOM-oriented client-side HTML scripting.
Mozilla browsers currently support LiveConnect, a feature that allows JavaScript and Java to intercommunicate on
the web. However, Mozilla-specific support for LiveConnect is scheduled to be phased out in the future in favor of
passing on the LiveConnect handling via NPAPI to the Java 1.6+ plug-in (not yet supported on the Mac as of March
2010[20]).
[46]
Most browser inspection tools, such as Firebug in Firefox, include JavaScript interpreters that can act
on the visible page's DOM.
asm.js is a subset of JavaScript that can be run in any JavaScript engine or run faster in an ahead-of-time (AOT)
compiling engine.
[47]
Use as an intermediate language
As JavaScript is the most widely supported client-side language that can run within a web browser, it has become an
intermediate language for other languages to target. This has included both newly created languages and ports of
existing languages. Some of these include:
Objective-J, a superset of JavaScript that compiles to standard JavaScript. It adds traditional inheritance and
Smalltalk/Objective-C style dynamic dispatch and optional pseudo-static typing to JavaScript.
Processing.js, a JavaScript port of Processing, a programming language designed to write visualizations, images,
and interactive content. It allows web browsers to display animations, visual applications, games and other
graphical rich content without the need for a Java applet or Flash plugin.
CoffeeScript, an alternate syntax for JavaScript intended to be more concise and readable. It adds features like
array comprehensions (also available in JavaScript since version 1.7) and pattern matching. Like Objective-J, it
compiles to JavaScript. Ruby and Python have been cited as influential on CoffeeScript syntax.
Google Web Toolkit translates a subset of Java to JavaScript.
Scala, an object-oriented and functional programming language, has an experimental Scala-to-Javascript compiler
[48]
.
Quby
[49]
, a proprietary sand-boxed Ruby-like language by PlayMyCode used for building browser games.
OMeta
[50]
, a functional language featuring pattern matching.
Phype
[51]
, an open-source PHP-to-JavaScript compiler.
TIScript
[52]
, a superset of JavaScript that adds classes, namespaces, and lambda expressions.
ClojureScript
[53]
, a Clojure to JavaScript compiler which is compatible with the advanced compilation mode of
the Google Closure optimizing compiler.
Parenscript
[54]
, a Common Lisp library that can translate both well-circumscribed Common Lisp code, and
JavaScript rendered as "inlined" S-expressions to Javascript.
Py2JS
[55]
, a subset of Python
Pyjamas, a port of Google Web Toolkit to Python (translates a subset of Python to JavaScript)
Dart, an open-source programming language developed by Google, can be compiled to JavaScript.
Whalesong
[56]
, a Racket-to-JavaScript compiler.
Emscripten, a LLVM-backend for porting native libraries to JavaScript.
Fantom a programming language that runs on JVM, .NET and JavaScript.
TypeScript, a free and open-source programming language developed by Microsoft. It is a superset of JavaScript,
and essentially adds optional static typing and class-based object-oriented programming to the language.
Haxe, an open-source high-level multiplatform programming language and compiler that can produce
applications and source code for many different platforms including JavaScript.
JavaScript
88
JavaScript and Java
A common misconception is that JavaScript is similar or closely related to Java. It is true that both have a C-like
syntax (the C language being their most immediate common ancestor language). They also are both typically
sandboxed (when used inside a browser), and JavaScript was designed with Java's syntax and standard library in
mind. In particular, all Java keywords were reserved in original JavaScript, JavaScript's standard library follows
Java's naming conventions, and JavaScript's Math and Date objects are based on classes from Java 1.0, but the
similarities end there.
The differences between the two languages are more prominent than their similarities. Java has static typing, while
JavaScript's typing is dynamic (meaning a variable can hold an object of any type and cannot be restricted). Java is
loaded from compiled bytecode, while JavaScript is loaded as human-readable source code. Java's objects are
class-based, while JavaScript's are prototype-based. Finally, Java does not support functional programming, while
JavaScript does, as it contains many features based on the Scheme language.
References
[1] http:/ / en. wikipedia.org/ w/ index.php?title=Template:JavaScriptSidebar& action=edit
[2] Flanagan & Ferguson 2006, p.1.
[3] The Little JavaScripter (http:/ / www.crockford. com/ javascript/ little. html) shows the relationship with Scheme in more detail.
[4] Press release announcing JavaScript (https:/ / web. archive. org/ web/ 20070916144913/ http:/ / wp.netscape.com/ newsref/ pr/
newsrelease67. html), "Netscape and Sun announce Javascript", PR Newswire, December 4, 1995
[5] http:/ / oreilly.com/ news/ languageposter_0504. html
[6] http:/ / www. brenkoweb.com/ m/ www/ design/ design_jshistory. php
[7] http:/ / media. wiley.com/ product_data/ excerpt/ 88/ 07645790/ 0764579088. pdf
[8] http:/ / www. quora. com/ Brent-Noorda/ answers/ ECMA
[9] http:/ / www. brent-noorda.com/ nombas/ history/ HistoryOfNombas. html#h. yal3k216ii2r
[10] https:/ / brendaneich. com/ 2011/ 06/ new-javascript-engine-module-owner/
[11] http:/ / read. uberflip. com/ i/ 113144/ 44
[12] http:/ / www. ecmascript.org/ docs. php
[13] Flanagan & Ferguson 2006, p.16.
[14] Flanagan & Ferguson 2006, pp.176-178.
[15] Flanagan & Ferguson 2006, p.141.
[16] JavaScript Code Reuse Patterns (https:/ / github.com/ petsel/ javascript-code-reuse-patterns/ tree/ master/ source/ components/ composition/
), April 19, 2013.
[17] Angus Croll, A fresh look at JavaScript Mixins (http:/ / javascriptweblog. wordpress.com/ 2011/ 05/ 31/ a-fresh-look-at-javascript-mixins/ ),
published May 31, 2011.
[18] Robert Nyman, Getters And Setters With JavaScript - Code Samples And Demos (http:/ / robertnyman. com/ 2009/ 05/ 28/
getters-and-setters-with-javascript-code-samples-and-demos/ ), published 29 May 2009, accessed 2 January 2010.
[19] John Resig, JavaScript Getters and Setters (http:/ / ejohn. org/ blog/ javascript-getters-and-setters/ ), 18 July 2007, accessed 2 January 2010
[20] http:/ / en.wikipedia.org/ w/ index.php?title=JavaScript& action=edit
[21] Peter-Paul Koch, Object detection (http:/ / www. quirksmode. org/ js/ support. html)
[22] Peter-Paul Koch, Mission Impossible - mouse position (http:/ / www. evolt. org/ node/ 23335)
[23] Peter-Paul Koch, Browser detect (http:/ / www.quirksmode. org/ js/ detect. html)
[24] Flanagan & Ferguson 2006, pp.262-263.
[25] MozillaZine, Mozilla Cross-Site Scripting Vulnerability Reported and Fixed (http:/ / www. mozillazine. org/ talkback. html?article=4392)
[26] Mozilla Corporation, Buffer overflow in crypto.signText() (http:/ / www. mozilla. org/ security/ announce/ 2006/ mfsa2006-38. html)
[27] Paul Festa, CNet, Buffer-overflow bug in IE (http:/ / archive. is/ 20120724070835/ http:/ / news.com.com/ 2100-1001-214620. html)
[28] SecurityTracker.com, Apple Safari JavaScript Buffer Overflow Lets Remote Users Execute Arbitrary Code and HTTP Redirect Bug Lets
Remote Users Access Files (http:/ / securitytracker. com/ alerts/ 2006/ Mar/ 1015713. html)
[29] SecurityFocus, Microsoft WebViewFolderIcon ActiveX Control Buffer Overflow Vulnerability (http:/ / www. securityfocus.com/ bid/
19030/ info)
[30] Fusion Authority, Macromedia Flash ActiveX Buffer Overflow (http:/ / www. fusionauthority. com/ security/
3234-macromedia-flash-activex-buffer-overflow. htm)
[31] Mike Friedman, Protected Mode in Vista IE7 (http:/ / blogs. msdn. com/ ie/ archive/ 2006/ 02/ 09/ 528963. aspx)
[32] US CERT, Vulnerability Note VU#713878: Microsoft Internet Explorer does not properly validate source of redirected frame (https:/ /
www.kb. cert.org/ vuls/ id/ 713878)
JavaScript
89
[33] Mozilla Foundation, Mozilla Foundation Security Advisory 2005-41: Privilege escalation via DOM property overrides (http:/ / www.
mozilla. org/ security/ announce/ 2005/ mfsa2005-41. html)
[34] Microsoft Corporation, Changes to Functionality in Microsoft Windows XP Service Pack 2: Part 5: Enhanced Browsing Security (http:/ /
technet. microsoft. com/ en-us/ library/ bb457150. aspx#EHAA)
[35] For one example of a rare JavaScript Trojan Horse, see Symantec Corporation, JS.Seeker.K (http:/ / www.symantec.com/
security_response/ writeup.jsp?docid=2003-100111-0931-99)
[36] Re-Animator (https:/ / launchpad.net/ reanimator), in Launchpad
[37] THINK The Maxwell Render Resourcer Center, Scripting References (http:/ / think. maxwellrender. com/ scripting_references-269.html)
[38] Google Apps Script, Welcome to Google Apps Script (http:/ / www. google. com/ google-d-s/ scripts/ scripts.html)
[39] Flanagan & Ferguson 2006, pp.214 et seq.
[40] Nokia Corporation, QtScript Module (http:/ / doc. qt.nokia. com/ 4. 6/ qtscript. html)
[41] JSDB.org (http:/ / www.jsdb. org/ ) (Official website)
[42] jslibs (https:/ / code.google. com/ p/ jslibs/ ) on Google Code
[43] [43] Open Scripting Architecture
[44] JScript development in Microsoft Office 11 (http:/ / msdn2. microsoft. com/ en-us/ library/ aa202668(office. 11). aspx) (MS InfoPath 2003)
[45] https:/ / developer. mozilla.org/ en-US/ docs/ JavaScript/ New_in_JavaScript/ 1. 7?redirectlocale=en-US&
redirectslug=New_in_JavaScript_1.7#Generators
[46] Release Notes for the Next-Generation Java' Plug-In Technology (introduced in Java SE 6 update 10) (http:/ / java.sun. com/ javase/ 6/
webnotes/ 6u10/ plugin2/ liveconnect/ ). Java.sun.com. Retrieved on 2013-06-13.
[47] http:/ / asmjs.org/ faq. html
[48] http:/ / lampwww.epfl. ch/ doeraene/ scala-js/
[49] http:/ / www. playmycode.com/ build/ sandbox
[50] http:/ / tinlizzie.org/ ometa/
[51] https:/ / code. google. com/ p/ phype/
[52] https:/ / code. google. com/ p/ tiscript/
[53] https:/ / github. com/ clojure/ clojurescript
[54] http:/ / common-lisp.net/ project/ parenscript
[55] https:/ / github. com/ qsnake/ py2js
[56] http:/ / hashcollision.org/ whalesong/
Further reading
Bhangal, Sham; Jankowski, Tomasz (2003). Foundation Web Design. Essential HTML, JavaScript, CSS,
PhotoShop, Fireworks, and Flash. APress L. P. ISBN1-59059-152-6.
Burns, Joe; Growney, Andree S. (2001). JavaScript Goodies. Pearson Education. ISBN0-7897-2612-2.
Duffy, Scott (2003). How to do Everything with JavaScript. Osborne. ISBN0-07-222887-3.
Flanagan, David; Ferguson, Paula (2006). JavaScript. The Definitive Guide (5th ed.). O'Reilly & Associates.
ISBN0-596-10199-6.
Goodman, Danny; Eich, Brendan (2001). JavaScript Bible. John Wiley & Sons. ISBN0-7645-3342-8.
Goodman, Danny; Markel, Scott (2003). JavaScript and DHTML Cookbook. O'Reilly & Associates.
ISBN0-596-00467-2.
Harris, Andy (2001). JavaScript Programming for the Absolute Beginner. Premier Press. ISBN0-7615-3410-5.
Haverbeke, Marijn (2011). Eloquent JavaScript. No Starch Press. ISBN978-1593272821.
Heinle, Nick; Koman, Richard (1997). Designing with JavaScript. O'Reilly & Associates. ISBN1-56592-300-6.
McDuffie, Tina Spain (2003). JavaScript Concepts & Techniques. Programming Interactive Web Sites. Franklin,
Beedle & Associates. ISBN1-887902-69-4.
McFarlane, Nigel (2003). Rapid Application Development with Mozilla. Prentice Hall Professional Technical
References. ISBN0-13-142343-6.
Powell, Thomas A.; Schneider, Fritz (2001). JavaScript. The Complete Reference. McGraw-Hill Companies.
ISBN0-07-219127-9.
Shelly, Gary B.; Cashman, Thomas J.; Dorin, William J.; Quasney, Jeffrey J. (2000). JavaScript. Complete
Concepts and Techniques. Cambridge: Course Technology. ISBN0-7895-6233-2.
Vander Veer, Emily A. (2004). JavaScript For Dummies (4th ed.). Wiley Pub. ISBN0-7645-7659-3.
JavaScript
90
Watt, Andrew H.; Watt, Jonathan A.; Simon, Jinjer L. (2002). Teach Yourself JavaScript in 21 Days. Pearson
Education. ISBN0-672-32297-8.
External links
JS Beginner's tutorial (http:/ / referencedesigner. com/ tutorials/ js/ js_1. php)
Codeacademy's JavaScript Track (http:/ / www.codecademy. com/ tracks/ javascript)
Douglas Crockford's video lectures on JavaScript (http:/ / yuiblog. com/ crockford/ )
Douglas Crockford's A Survey of the JavaScript Programming Language (http:/ / javascript. crockford. com/
survey. html)
Mozilla Developer Center
Mozilla's Official Documentation on JavaScript (https:/ / developer. mozilla. org/ en/ JavaScript)
References for Core JavaScript versions: 1.5+ (https:/ / developer. mozilla. org/ en/ JavaScript/ Reference)
overview over new features in JavaScript (https:/ / developer.mozilla. org/ en/ JavaScript/ New_in_JavaScript)
List of JavaScript releases: versions 1.5+ (https:/ / developer. mozilla. org/ en/ JavaScript/ Reference/ About)
Re-Introduction to JavaScript (https:/ / developer. mozilla. org/ en/ A_re-introduction_to_JavaScript)
Eloquent JavaScript (http:/ / eloquentjavascript. net/ ) by Marijn Haverbeke-a free, Creative Commons-licensed
eBook
JavaScript (http:/ / dev. opera. com/ articles/ javascript/ )-Opera Developer Community
List of languages that compile to JS (https:/ / github. com/ jashkenas/ coffee-script/ wiki/
List-of-languages-that-compile-to-JS/ )
JavaScript syntax
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]
The syntax of JavaScript is the set of rules that define a correctly structured JavaScript program.
The examples below make use of the a1er function for standard text output. The JavaScript standard library lacks
an official standard text output function. However, given that JavaScript is mainly used for client-side scripting
JavaScript syntax
91
within modern web browsers, and that almost all web browsers provide the a1er function, a1er is used in the
examples.
Origins
Brendan Eich summarized the ancestry of the syntax in the first paragraph of the JavaScript 1.1 specification
[1]
as
follows:
JavaScript borrows most of its syntax from Java, but also inherits from Awk and Perl, with some
indirect influence from Self in its object prototype system.
Basics
Case sensitivity
JavaScript is case sensitive. It is common to start the name of a constructor with a capitalised letter, and the name of
a function or variable with a lower-case letter.
Whitespace and semicolons
Spaces, tabs and newlines used outside of string constants are called whitespace. Unlike C, whitespace in JavaScript
source can directly impact semantics. Because of a technique called "automatic semicolon insertion" (ASI), some
statements that are well formed when a newline is parsed will be considered complete (as if a semicolon were
inserted just prior to the newline). Some authorities advise supplying statement-terminating semicolons explicitly
because it may lessen unintended effects of the automatic semicolon insertion.
There are two issues: five tokens can either begin a statement or as the extension of a complete statement, and five
restricted productions, where line breaks are not allowed in certain positions, potentially yielding incorrect parsing.
The five problematic tokens are the open parenthesis "(", open bracket "[", slash "/", and "+" and "-". Of these, open
parenthesis is common in the immediately-invoked function expression pattern, and open bracket occurs sometimes,
while others are quite rare. The example given in the spec is:
a = b + c
(d + e).foo()
// Treated as:
// a = b + c(d + e).foo();
with the suggestion that the preceding statement be terminated with a semicolon.
Some suggest instead the use of leading semicolons on lines starting with ( or [, so the line is not accidentally joined
with the previous one. This is known as a defensive semicolon, and is particularly recommended because code may
become ambiguous when it is rearranged.
[][2]
For example:
a = b + c
,(d + e).foo()
// Treated as:
// a = b + c;
// (d + e).foo();
Initial semicolons are also sometimes used at the start of JavaScript libraries, in case they are appended to another
library which omits a trailing semicolon, as this can result in ambiguity of the initial statement.
JavaScript syntax
92
The five restricted productions are return, throw, break, continue, and post-increment/decrement. In all cases
inserting semicolons does not fix the problem, but makes the parsed syntax clear, making the error easier to detect.
Return and throw take an optional value, while break and continue take an optional label. In all cases the advice is to
keep the value or label on the same line as the statement. This most often shows up in the return statement, where
one might return a large object literal, which might be accidentally placed starting on a new line. For
post-increment/decrement, there is potential ambiguity with pre-increment/decrement, and again it is recommended
to simply keep these on the same line.
return
a + b,
// Returns undefined. Treated as:
// return;
// a + b;
// Shou1d be written as:
// return a + b;
Comments
Comment syntax is the same as in C++ and many other languages.
// a short, one-1ine comment
/* this is a 1ong, mu1ti-1ine comment
about my script. May it one day
be great. */
/* Comments /* may not be nested */ Synax error */
Variables
Variables in standard JavaScript have no type attached, and any value can be stored in any variable. Variables are
declared with a var statement, multiple variables can be declared at once. An identifier must start with a letter,
underscore (_), or dollar sign ($); subsequent characters can also be digits (0-9). Because JavaScript is case sensitive,
letters include the characters "A" through "Z" (uppercase) and the characters "a" through "z" (lowercase). Starting
with JavaScript 1.5, ISO 8859-1 or Unicode letters (or uXXXX Unicode escape sequences) can be used in
identifiers. In certain JavaScript implementations, the at sign () can be used in an identifier, this is contrary to the
specifications and not supported in newer implementations. Variables are lexically scoped at function level (not
block level as in C), and this does not depend on order (forward declaration is not necessary): if a variable is
declared inside a function (at any point, in any block), then inside the function, the name will resolve to that variable.
This is equivalent in block scoping to variables being forward declared at the top of the function, and is referred to as
hoisting.
[3]
However, the variable value is undefined until it is initialized, and forward reference is not possible.
Thus a var x = 1 statement in the middle of the function is equivalent to a var x declaration statement at the
top of the function, and a x = 1 assignment statement at that point in the middle of the function - only the
declaration is hoisted, not the assignment.
Functions statements, whose effect is to declare a variable of type Function and assign a value to it, are similar to
variable statements, but in addition to hoisting the declaration, they also hoist the assignment - as if the entire
statement appeared at the top of the containing function - and thus forward reference is also possible: the location of
a function statement within an enclosing function is irrelevant.
JavaScript syntax
93
Block scoping can be produced by wrapping the entire block in a function and then executing it; this is known as the
immediately-invoked function expression pattern.
Variables declared outside any function are global. If a variable is declared in a higher scope, it can be accessed by
child functions.
Here is an example of variable declarations and global values:
var x = 0, // g1oba1 variab1e, because it is not in any function
function f() {
var z = 'foxes', r = 'birds', // 2 1oca1 variab1es
m = 'fish', // g1oba1 because it wasn't dec1ared anywhere before
function chi1d() {
var r = 'mon'eys', // This variab1e is 1oca1 and does not affect
he "birds" r of he paren function.
z = 'penguins', // The chi1d function is ab1e to access the
variab1es of he paren function, this is ca11ed c1osure.
}
weny = 20, // This variab1e is dec1ared on the next 1ine, but
usab1e anywhere in he function, even before, as here
var weny,
chi1d(),
return x, // We can use x here because it is g1oba1
}
f(),
a1er(z), // This 1ine wi11 raise a ReferenceError exception because
he va1ue of z is no 1onger avai1ab1e
When JavaScript tries to resolve an identifier, it looks in the local function scope. If this identifier is not found, it
looks in the outer function that declared the local one, and so on along the scope chain until it reaches the global
scope where global variables reside. If it is still not found, JavaScript will raise a ReferenceError exception.
When assigning an identifier, JavaScript does exactly the same process to retrieve this identifier, except that if it is
not found in the global scope, it will create the "variable" as a property of the global object.
[4]
As a consequence, a
variable never declared will be global if assigned. Declaring a variable (with the keyword var) in the global code
(i.e. outside of any function body), assigning a never declared identifier or adding a property to the global object
(usually window) will also create a new global variable.
Note that JavaScript's strict mode forbids the assignment of an undeclared variable, which avoids global namespace
pollution.
JavaScript syntax
94
Primitive data types
The JavaScript language provides a handful of primitive data types. Some of the primitive data types also provide a
set of named values that represent the extents of the type boundaries. These named values are described within the
appropriate sections below.
Undefined
The value of "undefined" is assigned to all uninitialized variables, and is also returned when checking for object
properties that do not exist. In a Boolean context, the undefined value is considered a false value.
Note: undefined is considered a genuine primitive type. Unless explicitly converted, the undefined value may behave
unexpectedly in comparison to other types that evaluate to false in a logical context.
var es, // variab1e dec1ared but not defined, ...
// ... set to va1ue of undefined
var esOb_ = {},
a1er(es), // test variab1e exists but va1ue not ...
// ... defined, disp1ays undefined
a1er(esOb_.myRrop), // testOb exists, property does not, ...
// ... disp1ays undefined
a1er(undefined == null), // unenforced type during check, disp1ays
true
a1er(undefined === null), // enforce type during check, disp1ays fa1se
Note: There is no built-in language literal for undefined. Thus (x == undefined) is not a foolproof way to
check whether a variable is undefined, because in versions before ECMAScript 5, it is legal for someone to write
var undefined = "I'm defined now",. A more robust approach is to compare using (ypeof x ===
'undefined').
Functions like this won't work as expected:
function isUndefined(x) { var u, return x === u, } // 1ike this...
function isUndefined(x) { return x === void 0, } // ... or that
second one
function isUndefined(x) { return (typeof x) === "undefined", } // ...
or ha hird one
Here, calling isUndefined(my_var) raises a ReferenceError if my_var is an unknown identifier, whereas
ypeof my_var === 'undefined' doesn't.
Null
Unlike undefined, null is often set to indicate that something has been declared but has been defined to be empty. In
a Boolean context, the value of null is considered a false value in JavaScript.
Note: Null is a true primitive-type within the JavaScript language, of which nu11 (note case) is the single value. As
such, when performing checks that enforced type checking, the null value will not equal other false types.
Surprisingly, nu11 is considered an object by ypeof.
a1er(null == undefined), // unenforced type during check,
disp1ays true
a1er(null === undefined), // enforce type during check,
disp1ays false
JavaScript syntax
95
a1er(typeof null === 'ob_ec'), // true
Number
Numbers are represented in binary as IEEE-754 Doubles, which provides an accuracy nearly 16 significant digits.
Because they are floating point numbers, they do not always exactly represent real numbers, including fractions.
This becomes an issue when comparing or formatting numbers. For example:
a1er(0.2 + 0.1 == 0.3), // disp1ays fa1se
a1er(0.94 - 0.01), // disp1ays 0.9299999999999999
As a result, a routine such as the toFixed() method should be used to round numbers whenever they are formatted for
output
[5]
.
Numbers may be specified in any of these notations:
345, // an "integer", a1though there is on1y one numeric type in
JavaScrip
34.5, // a f1oating-point number
3.45e2, // another f1oating-point, equiva1ent to 345
0377, // an octa1 integer equa1 to 255
0xEE, // a hexadecima1 integer equa1 to 255, digits represented by
he ...
// ... 1etters -E may be upper or 1owercase
The extents + , " and NaN (Not a Number) of the number type may be obtained by two program expressions:
Infinity, // Rositive Infinity (negative obtained with -Infinity for
insance)
NaN, // The Not--Number va1ue, a1so returned as a fai1ure in ...
// ... string-to-number conversions
These three special values correspond and behave as the IEEE-754 describes them.
The Number constructor, or a unary + or -, may be used to perform explicit numeric conversion:
var mySring = "123.456",
var myNumber1 = Number(mySring),
var myNumber2 = +mySring,
When used as a constructor, a numeric wrapper object is created (though it is of little use):
myNumericWrapper = new Number(123.456),
String
A string in JavaScript is a sequence of characters. In JavaScript, strings can be created directly by placing the series
of characters between double or single quotes.
var greeing = "He11o, wor1d!",
var anoherGreeing = 'Greeings, peop1e of Earh.',
You can access individual characters within a string using the charA method (provided by
Sring.prooype). This is the preferred way when accessing individual characters within a string because it
also works in non-modern browsers:
JavaScript syntax
96
var h = greeing.charA(0),
In modern browsers, individual characters within a string can be accessed (as strings with only a single character)
through the same notation as arrays:
var h = greeing[0|,
However, JavaScript strings are immutable:
greeing[0| = "H", // Not working.
Applying the equality operator ("==") to two strings returns true if the strings have the same contents, which means:
of same length and same cases (for alphabets). Thus:
var x = "wor1d",
var compare1 = ("He11o, " +x == "He11o, wor1d"), // Now compare1
conains true.
var compare2 = ("He11o, " +x == "he11o, wor1d"), // Now compare2
conains ...
// ... fa1se since
he ...
// ... first
characers ...
// ... of both
operands ...
// ... are not of the
same case.
You cannot use quotes of the same type inside the quotes unless they are escaped.
var x = '"He11o, wor1d!" he said.' // Just fine.
var x = ""He11o, wor1d!" he said." // Not good.
var x = "\"He11o, wor1d!\" he said." // That works by rep1acing " with
\"
It is possible to create a string using the Sring constructor:
var greeing = new Sring("He11o, wor1d!"),
These objects have a va1ueOf method returning the primitive string wrapped into them:
var s = new Sring("He11o !"),
typeof s, // Is 'obect'.
typeof s.va1ueOf(), // Is 'string'.
Equality between two Sring objects does not behave as with string primitives:
var s1 = new Sring("He11o !"),
var s2 = new Sring("He11o !"),
s1 == s2, // Is fa1se, because they are two distinct obects.
s1.va1ueOf() == s2.va1ueOf(), // Is true.
JavaScript syntax
97
Alerts
Alerts are a common Javascript feature.
Here, an example:
msgToA1r = "This is a es message."
a1er(msgToA1r)
This will display a window with the contents you want. When making a crazy error program, this feature is for you.
Boolean
JavaScript provides a Boolean data type with rue and fa1se literals. The ypeof operator returns the string
"boo1ean" for these primitive types. When used in a logical context, 0, -0, nu11, NaN, undefined, and the
empty string ("") evaluate as fa1se due to automatic type coercion. The complement evaluates as rue,
including the strings "0", "fa1se" and any object (except nu11). Automatic type coercion by the equality
comparison operators (== and !=) can be avoided by using the type checked comparison operators, (=== and
!==).
When type conversion is required, JavaScript converts String, Number, Boolean, or Object operands as follows:
Number and String
The string is converted to a number value. JavaScript attempts to convert the string numeric literal to a
Number type value. First, a mathematical value is derived from the string numeric literal. Next, this value is
rounded to nearest Number type value.
Boolean
If one of the operands is a Boolean, the Boolean operand is converted to 1 if it is rue or to 0 if it is fa1se.
Object
If an object is compared with a number or string, JavaScript attempts to return the default value for the object.
An object is converted to a primitive String or Number value, using the .va1ueOf() or .oSring()
methods of the object. If this fails, a runtime error is generated.
Douglas Crockford advocates the terms "truthy" and "falsy" to describe how values of various types behave when
evaluated in a logical context, especially in regard to edge cases. The binary logical operators returned a Boolean
value in early versions of JavaScript, but now they return one of the operands instead. The left-operand is returned if
it can be evaluated as: fa1se, in the case of conjunction (a && b), or rue, in the case of disjunction (a || b);
otherwise the right-operand is returned. Automatic type coercion by the comparison operators may differ for cases
of mixed boolean and number-compatible operands (including strings that can be evaluated as a number, or objects
that can be evaluated as such a string) because the boolean operand will be compared as a numeric value. This may
be unexpected. An expression can be explicitly cast to a boolean primitive by doubling the logical negation operator
(!!), using the Boo1ean() function, or using the conditional operator (c ? : f).
<fon size="8.50">
//utomatic type coercion
a1er(true == 2 ), // fa1se... true % 1 !== 2 & 2
a1er(false == 2 ), // fa1se... fa1se % 0 !== 2 & 2
a1er(true == 1 ), // true.... true % 1 === 1 & 1
a1er(false == 0 ), // true.... fa1se % 0 === 0 & 0
a1er(true == "2"), // fa1se... true % 1 !== 2 & "2"
a1er(false == "2"), // fa1se... fa1se % 0 !== 2 & "2"
a1er(true == "1"), // true.... true % 1 === 1 & "1"
a1er(false == "0"), // true.... fa1se % 0 === 0 & "0"
JavaScript syntax
98
a1er(false == "" ), // true.... fa1se % 0 === 0 & ""
a1er(false == NaN), // fa1se... fa1se % 0 !== NaN
//Type checked comparison (no conversion of types and va1ues)
a1er(true === 1), // fa1se... data types do not match
//Exp1icit type coercion
a1er(true === !!2), // true.... data types and va1ues match
a1er(true === !!0), // fa1se... data types match but va1ues differ
a1er( 1 ? true : false), // true.... on1y 0 and NaN are 'fa1sy(
numbers
a1er("0" ? true : false), // true.... on1y the empty string is 'fa1sy(
a1er(Boo1ean({})), // true.... a11 obects are 'truthy( except nu11
</fon>
The new operator can be used to create an object wrapper for a Boolean primitive. However, the ypeof operator
does not return "boo1ean" for the object wrapper, it returns "ob_ec". Because all objects evaluate as rue, a
method such as .va1ueOf(), or .oSring(), must be used to retrieve the wrapped value. For explicit
coercion to the Boolean type, Mozilla recommends that the Boo1ean() function (without new) be used in
preference to the Boolean object.
<fon size="8.50">
var b = new Boo1ean(false), // Obect fa1se {}
var = Boo1ean(b), // Boo1ean true
var f = Boo1ean(b.va1ueOf()), // Boo1ean fa1se
var n = new Boo1ean(b), // Not recommended
n = new Boo1ean(b.va1ueOf()), // Rreferred
if (0 || -0 || "" || null || undefined || b.va1ueOf() || !new Boo1ean()
|| !) {
a1er("Never his"),
} else if ([| && {} && b && typeof b === "ob_ec" && b.oSring() ===
"fa1se") {
a1er("A1ways his"),
}
</fon>
Native objects
The JavaScript language provides a handful of native objects. JavaScript native objects are considered part of the
JavaScript specification. JavaScript environment notwithstanding, this set of objects should always be available.
Array
An Array is a JavaScript object prototyped from the Array constructor specifically designed to store data values
indexed by integer keys. Arrays, unlike the basic Object type, are prototyped with methods and properties to aid the
programmer in routine tasks (for example, _oin, s1ice, and push).
As in the C family, arrays use a zero-based indexing scheme: A value that is inserted into an empty array by means
of the push method occupies the 0th index of the array.
JavaScript syntax
99
var myArray = [|, // Roint the variab1e myrray to a new1y
...
// ... created, empty rray
myArray.push("he11o wor1d"), // Ei11 the next empty index, in this case
0
a1er(myArray[0|), // Equiva1ent to a1ert("he11o wor1d");
Arrays have a 1engh property that is guaranteed to always be larger than the largest integer index used in the
array. It is automatically updated if one creates a property with an even larger index. Writing a smaller number to the
1engh property will remove larger indices.
Elements of Arrays may be accessed using normal object property access notation:
myArray[1|, // the 2nd item in myrray
myArray["1"|,
The above two are equivalent. It's not possible to use the "dot"-notation or strings with alternative representations of
the number:
myArray.1, // syntax error
myArray["01"|, // not the same as myrray[1]
Declaration of an array can use either an Array literal or the Array constructor:
myArray = [0, 1,, , 4, 5|, // array with 1ength 6 and 6
e1emens, ...
// ... inc1uding 2 undefined e1ements
myArray = new Array(0, 1, 2, 3, 4, 5), // array with 1ength 6 and 6
e1emens
myArray = new Array(365), // an empty array with 1ength 365
Arrays are implemented so that only the elements defined use memory; they are "sparse arrays". Setting
myArray[10| = 'someThing' and myArray[57| = 'somehingOher' only uses space for these
two elements, just like any other object. The 1engh of the array will still be reported as 58.
One can use the object declaration literal to create objects that behave much like associative arrays in other
languages:
dog = {co1or: "brown", size: "1arge"},
dog["co1or"|, // resu1ts in "brown"
dog.co1or, // a1so resu1ts in "brown"
One can use the object and array declaration literals to quickly create arrays that are associative, multidimensional,
or both. (Technically, JavaScript does not support multidimensional arrays, but one can mimic them with
arrays-of-arrays.)
cas = [{co1or: "brown", size: "1arge"},
{co1or: "b1ac'", size: "sma11"}|,
cas[0|["size"|, // resu1ts in "1arge"
dogs = {rover: {co1or: "brown", size: "1arge"},
spo: {co1or: "b1ac'", size: "sma11"}},
dogs["spo"|["size"|, // resu1ts in "sma11"
dogs.rover.co1or, // resu1ts in "brown"
JavaScript syntax
100
Date
A Date object stores a signed millisecond count with zero representing 1970-01-01 00:00:00 UT and a range of 10
8
days. There are several ways of providing arguments to the ae constructor. Note that months are zero-based.
new ae() // create a new ate instance
represening he curren ime/dae.
new ae(2010, 2, 1) // create a new ate instance
represening 2010-Mar-01 00:00:00
new ae(2010, 2, 1, 14, 25, 30) // create a new ate instance
represening 2010-Mar-01 14:25:30
new ae("2010-3-1 14:25:30") // create a new ate instance from a
Sring.
Methods to extract fields are provided, as well as a useful oSring:
var d = new ae(2010, 2, 1, 14, 25, 30), // 2010-Mar-01 14:25:30
// isp1ays '2010-3-1 14:25:30':
a1er(d.geEu11Year() + '-' + (d.geMonh()+1) + '-' + d.geae() + '
'
+ d.geHours() + ':' + d.geMinues() + ':' + d.geSeconds()),
// Bui1t-in toString returns something 1ike 'Mon Mar 01 2010 14:25:30
GMT-0500 (EST)':
a1er(d),
Error
Custom error messages can be created using the Error class:
throw new Error("Somehing wen wrong."),
Nested within conditional statements, such instantiations can substitute for try/catch blocks:
var emai1Address = promp("R1ease ener your e-mai1 address:", ""),
if (!emai1Address || emai1Address.1engh == 0) {
throw new Error("Excuse me: You mus ener your e-mai1 address o
coninue."),
}
Math
The Math object contains various math-related constants (for example, ) and functions (for example, cosine). (Note
the "Math" object has no constructor, unlike Array or Date. All its methods are "static", AKA "class" methods.) All
the trigonometric functions use angles expressed in radians, not degrees or grads.
JavaScript syntax
101
Properties of the Math object
Property Returned value
rounded to 5 digits
Description
Math.E 2.7183 e: Natural logarithm base
Math.LN2 0.69315 Natural logarithm of 2
Math.LN10 2.3026 Natural logarithm of 10
Math.LOG2E 1.4427 Logarithm to the base 2 of e
Math.LOG10E 0.43429 Logarithm to the base 10 of e
Math.PI 3.14159 : circumference/diameter of a circle
Math.SQRT1_2 0.70711 Square root of
Math.SQRT2 1.4142 Square root of 2
Methods of the Math object
Example Returned value
rounded to 5 digits
Description
Math.abs(-2.3) 2.3 Absolute value: (x < 0) ? -x : x
Math.acos(Math.SQRT1_2) 0.78540 rad. = 45 Arccosine
Math.asin(Math.SQRT1_2) 0.78540 rad. = 45 Arcsine
Math.atan(1) 0.78540 rad. = 45 Half circle arctangent (-/2 to +/2)
Math.atan2(-3.7, -3.7) -2.3562 rad. = -135 Whole circle arctangent (- to +)
Math.ceil(1.1) 2 Ceiling: round up to smallest integer argument
Math.cos(Math.PI/4) 0.70711 Cosine
Math.exp(1) 2.7183 Exponential function: e raised to this power
Math.floor(1.9) 1 Floor: round down to largest integer s argument
Math.log(Math.E) 1 Natural logarithm, base e
Math.max(1, -2) 1 Maximum: (x > y) ? x : y
Math.min(1, -2) -2 Minimum: (x < y) ? x : y
Math.pow(-3, 2) 9
Exponentiation (raised to the power of): Mah.pow(x, y) gives x
y
Math.random() 0.17068 Pseudorandom number between 0 (inclusive) and 1 (exclusive)
Math.round(1.5) 2 Round to the nearest integer; half fractions are rounded up (e.g. 1.5 rounds to 2)
Math.sin(Math.PI/4) 0.70711 Sine
Math.sqrt(49) 7 Square root
Math.tan(Math.PI/4) 1 Tangent
JavaScript syntax
102
Regular expression
/expression/.es(sring),
"sring".search(/expression/),
"sring".rep1ace(/expression/,rep1acemen),
// Here are some examp1es
if(/Tom/.es("My name is Tom")) a1er("He11o Tom!"),
a1er("My name is Tom".search(/Tom/)), // == 11
(1eers before Tom)
a1er("My name is Tom".rep1ace(/Tom/,"John")), // == "My
name is John"
Character classes
// \d - digit
// \ - non digit
// \s - space
// \S - non space
// \w - word char
// \W - non word
// [ ] - one of
// [^ ] - one not of
// - - range
if (/\d/.es('0')) a1er('igi'),
if (/[0-9|/.es('6')) a1er('igi'),
if (/[13579|/.es('1')) a1er('Odd number'),
if (/\S\S\s\S\S\S\S/.es('My name')) a1er('Eorma OK'),
if (/\w\w\w/.es('Tom')) a1er('He11o Tom'),
if (/[a-zA-Z|/.es('B')) a1er('Leer'),
Character matching
// ...Z a...z 0...9 - a1phanumeric
// \u0000...\uEEEE - Unicode hexadecima1
// \x00...\xEE - SCII hexadecima1
// \t - tab
// \n - new 1ine
// \r - CR
// . - any character
// [ - OR
if (/T.m/.es('Tom')) a1er ('Hi Tom, Tam or Tim'),
if (/A|B/.es("A")) a1er ('A or B'),
JavaScript syntax
103
Repeaters
// ? - 0 or 1 match
// * - 0 or more
// + - 1 or more
// {n} - exact1y n
// {n,} - n or more
// {0,n} - n or 1ess
// {n,m} - range n to m
if (/ab?c/.es("ac")) a1er("OK"), // match: "ac", "abc"
if (/ab*c/.es("ac")) a1er("OK"), // match: "ac", "abc",
"abbc", "abbbc" ec.
if (/ab+c/.es("abc")) a1er("OK"), // match: "abc", "abbc",
"abbbc" ec.
if (/ab{3}c/.es("abbbc")) a1er("OK"), // match: "abbbc"
if (/ab{3,}c/.es("abbbc")) a1er("OK"), // match: "abbbc", "abbbbc",
"abbbbbc" ec.
if (/ab{1,3}c/.es("abc")) a1er("OK"), // match: "abc","abbc",
"abbbc"
Anchors
// ^ - string starts with
// $ - string ends with
if (/^My/.es("My name is Tom")) a1er ("Hi!"),
if (/Tom$/.es("My name is Tom")) a1er ("Hi Tom!"),
Subexpression
// ( ) - groups characters
if (/waer(mar')?/.es("waermar'")) a1er("Here is waer!"), //
mach: "waer", "waermar'",
if (/(Tom)|(John)/.es("John")) a1er("Hi Tom or John!"),
Flags
// /g - g1oba1
// /i - ignore upper/1ower case
// /m - a11ow matches to span mu1tip1e 1ines
a1er("hi om!".rep1ace(/Tom/i,"John")), // == "hi John!"
a1er("raaam".rep1ace(/a/,"u")), // == "ratutam"
a1er("raaam".rep1ace(/a/g,"u")), // == "ratutum"
JavaScript syntax
104
Advanced methods
my_array = my_sring.sp1i(my_de1imier),
// examp1e
my_array = "dog,ca,cow".sp1i(","), //
my_array==("dog","ca","cow"),
my_array = my_sring.mach(my_expression),
// examp1e
my_array = "We sar a 11:30, 12:15 and 16:45".mach(/\d\d:\d\d/g), //
my_array=("11:30","12:15","16:45"),
Capturing groups
var myRe = /(\d{4}-\d{2}-\d{2}) (\d{2}:\d{2}:\d{2})/,
var resu1s = myRe.exec("The dae and ime are 2009-09-08 09:37:08."),
if (resu1s) {
a1er("Mached: " + resu1s[0|), // Entire match
var my_dae = resu1s[1|, // Eirst group == "2009-09-08"
var my_ime = resu1s[2|, // Second group == "09:37:08"
a1er("I is " + my_ime + " on " + my_dae),
} else a1er("id no find a va1id dae!"),
Function
Every function in JavaScript is an instance of the Function object:
//x,y is the argument. 'return x+y' is the function body, which is the
1as in he argumen 1is.
var add = new Euncion('x', 'y', 'reurn x+y'),
var = add(1, 2),
a1er(), //3
The add function above may also be defined using the following pattern.
function add(x, y) {
return x + y,
}
var = add(1, 2),
a1er(), //3
A function instance has properties and methods.
function subrac(x, y) {
return x - y,
}
a1er(subrac.1engh),//2,expected amount of arguments.
a1er(subrac.oSring()),
/*
function subtract(x, y) {
JavaScript syntax
105
return x - y;
}
*/
Operators
The '+' operator is overloaded: it is used for string concatenation and arithmetic addition. This may cause problems
when inadvertently mixing strings and numbers. As a unary operator, it can convert a numeric string to a number.
// Concatenate 2 strings
a1er('He' + '11o'), // disp1ays He11o
// dd two numbers
a1er(2 + 6), // disp1ays 8
// dding a number and a string resu1ts in concatenation
a1er(2 + '2'), // disp1ays 22
a1er('$' + 3 + 4), // disp1ays $34, but $7 may have been expected
a1er('$' + (3 + 4)), // disp1ays $7
// Convert a string to a number
a1er(+'2' === 2), // disp1ays true
a1er(+'He11o'), // disp1ays NaN
Arithmetic
JavaScript supports the following binary arithmetic operators:
+ Addiion
- Subracion
* Mu1ip1icaion
/ ivision (reurns a f1oaing-poin va1ue)
% Modu1us (reurns he remainder)
JavaScript supports the following unary arithmetic operators:
+ Unary conversion of sring o number
- Unary negaion (reverses he sign)
++ Incremen (can be prefix or posfix)
-- ecremen (can be prefix or posfix)
var x = 1,
a1er(++x), // disp1ays: 2
a1er(x++), // disp1ays: 2; x becomes 3 then
a1er(x), // disp1ays: 3
a1er(x--), // disp1ays: 3; x becomes 2 then
a1er(x), // disp1ays: 2
a1er(--x), // disp1ays: 1
JavaScript syntax
106
Assignment
= Assign
+= Add and assign
-= Subrac and assign
*= Mu1ip1y and assign
/= ivide and assign
%= Modu1us and assign
Assignment of primitive types
var x = 9,
x += 1,
a1er(x), // disp1ays: 10
x *= 30,
a1er(x), // disp1ays: 300
x /= 6,
a1er(x), // disp1ays: 50
x -= 3,
a1er(x), // disp1ays: 47
x %= 7,
a1er(x), // disp1ays: 5
Assignment of object types
var ob__1 = {a: 1}, // assign reference of new1y created obect to
variab1e ob__1
var ob__2 = {a: 0},
var ob__3 = ob__2, // ob_3 references the same obect as ob_2 does
ob__2.a = 2,
a1er(ob__1.a + " " + ob__2.a + " " + ob__3.a), // disp1ays 1 2 2
ob__2 = ob__1, // ob_2 now references the same obect as variab1e
ob__1
// ob_3 now the on1y reference to what ob_2
referenced
a1er(ob__1.a + " " + ob__2.a + " " + ob__3.a), // disp1ays 1 1 2
ob__2.a = 7,// modifies ob_1
a1er(ob__1.a + " " + ob__2.a + " " + ob__3.a), // disp1ays 7 7 2
JavaScript syntax
107
Destructuring assignment
In Mozilla's JavaScript, since version 1.7, destructuring assignment allows the assignment of parts of data structures
to several variables at once. The left hand side of an assignment is a pattern that resembles an arbitrarily nested
object/array literal containing l-lvalues at its leafs which are to receive the substructures of the assigned value.
var a, b, c, d, e,
[a, b| = [3, 4|,
a1er(a + ',' + b), // disp1ays: 3,4
e = {foo: 5, bar: 6, baz: ['Baz', 'Conen'|},
var arr = [|,
({baz: [arr[0|, arr[3||, foo: a, bar: b}) = e,
a1er(a + ',' + b + ',' + arr), // disp1ays: 5,6,Baz,,,Content
[a, b| = [b, a|, // swap contents of a and b
a1er(a + ',' + b), // disp1ays: 6,5
Comparison
== Equa1
!= No equa1
> Greaer han
>= Greaer han or equa1 o
< Less han
<= Less han or equa1 o
=== Idenica1 (equa1 and of he same ype)
!== No idenica1
When comparing variables which are objects they are considered to be different if their objects are not the same
object, even if the values of them are the same, so:
var ob_1 = {a: 1},
var ob_2 = {a: 1},
var ob_3 = ob_1,
a1er(ob_1 == ob_2), //fa1se
a1er(ob_3 == ob_1), //rue
See also String.
Logical
JavaScript provides four logical operators:
unary negation (NOT = !a)
binary disjunction (OR = a || b) and conjunction (AN = a && b)
ternary conditional (c ? : f)
In the context of a logical operation, any expression evaluates to true except the following:
Srings: "", '',
Numbers: 0, -0, NaN,
Specia1: nu11, undefined,
Boo1ean: fa1se.
The Boolean function can be used to explicitly convert to a primitive of type Boolean:
JavaScript syntax
108
// On1y empty strings return fa1se
a1er(Boo1ean("") === false),
a1er(Boo1ean("fa1se") === true),
a1er(Boo1ean("0") === true),
// On1y zero and NaN return fa1se
a1er(Boo1ean(NaN) === false),
a1er(Boo1ean(0) === false),
a1er(Boo1ean(-0) === false), // equiva1ent to -1*0
a1er(Boo1ean(-2) === true ),
// 11 obects return true
a1er(Boo1ean(this) === true),
a1er(Boo1ean({}) === true),
a1er(Boo1ean([|) === true),
// These types return fa1se
a1er(Boo1ean(null) === false),
a1er(Boo1ean(undefined) === false), // equiva1ent to Boo1ean()
The NOT operator evaluates its operand as a Boolean, and returns the negation. Using the operator twice in a row, as
a double negative, explicitly converts an expression to a primitive of type Boolean:
a1er( !0 === Boo1ean(!0)), a1er(Boo1ean(!0) === !!1), a1er(!!1
=== Boo1ean(1)),
a1er(!!0 === Boo1ean(0)), a1er(Boo1ean(0) === !1), a1er(!1
=== Boo1ean(!1)),
a1er(!"" === Boo1ean(!"")), a1er(Boo1ean(!"") === !!"s"), a1er(!!"s"
=== Boo1ean("s")),
a1er(!!"" === Boo1ean("")), a1er(Boo1ean("") === !"s"), a1er(!"s"
=== Boo1ean(!"s")),
The ternary operator can also be used for explicit conversion:
a1er([| == false), a1er([| ? true : false), // 'truthy(, but the
comparison uses [|.oSring()
a1er([0| == false), a1er([0|? true : false), // [0].toString() == "0"
a1er("0" == false), a1er("0"? true : false), // "0" % 0 ) (0==0) ) 0
false
a1er([1| == true), a1er([1|? true : false), // [1].toString() == "1"
a1er("1" == true), a1er("1"? true : false), // "1" % 1 ) (1==1) ) 1
true
a1er([2| != true), a1er([2|? true : false), // [2].toString() == "2"
a1er("2" != true), a1er("2"? true : false), // "2" % 2 ) (2!=1) ) 1
true
Expressions that use features such as post-incrementation, (i++), have an anticipated side effect. JavaScript
provides short-circuit evaluation of expressions; the right operand is only executed if the left operand does not
suffice to determine the value of the expression.
JavaScript syntax
109
a1er(a || b), // When a is true, there is no reason to eva1uate b.
a1er(a && b), // When a is fa1se, there is no reason to eva1uate b.
a1er(c ? : f), // When c is true, there is no reason to eva1uate f.
In early versions of JavaScript and JScript, the binary logical operators returned a Boolean value (like most
C-derived programming languages). However, all contemporary implementations return one of their operands
instead:
a1er(a || b), // if a is true, return a, otherwise return b
a1er(a && b), // if a is fa1se, return a, otherwise return b
Programmers who are more familiar with the behavior in C might find this feature surprising, but it allows for a
more concise expression of patterns like null coalescing:
var s = || "(defau1)", // assigns t, or the defau1t va1ue if t is
null, empy, ec.
Bitwise
JavaScript supports the following binary bitwise operators:
& And
| Or
^ Xor
<< Shif 1ef (zero fi11)
>> Shif righ (sign-propagaing), copies of he 1efmos bi (sign bi) are shifed in from he
1ef.
>>> Shif righ (zero fi11)
Eor posiive numbers, >> and >>> yie1d he same resu1.
JavaScript supports the following unary bitwise operator:
~ No (invers he bis)
String
= Assignmen
+ Concaenaion
+= Concaenae and assign
Examples
sr = "ab" + "cd", // "abcd"
sr += "e", // "abcde"
sr2 = "2"+2 // "22", not "4" or 4.
JavaScript syntax
110
Control structures
Compound statements
A pair of curly brackets {} and an enclosed sequence of statements constitute a compound statement, which can
be used wherever a statement can be used.
If ... else
if (expr) {
//statements;
} else if (expr2) {
//statements;
} else {
//statements;
}
this is also possible
if (exprA exprB) {
//statements;
} else if (expr2) {
//statements;
} else {
//statements;
}
Conditional operator
The conditional operator creates an expression that evaluates as one of two expressions depending on a condition.
This is similar to the if statement that selects one of two statements to execute depending on a condition. I.e., the
conditional operator is to expressions what if is to statements.
resu1 = condiion ? expression : a1ernaive,
is the same as:
if (condiion) {
resu1 = expression,
} else {
resu1 = a1ernaive,
}
Unlike the if statement, the conditional operator cannot omit its "else-branch".
Switch statement
The syntax of the JavaScript Switch statement is as follows:
switch (expr) {
case SOMEVALUE:
//statements;
break,
case ANOTHERVALUE:
JavaScript syntax
111
//statements;
break,
default:
//statements;
break,
}
brea', is optional; however, it is usually needed, since otherwise code execution will continue to the body of
the next case block.
Add a break statement to the end of the last case as a precautionary measure, in case additional cases are added
later.
Strings literal values can also be used for the case values.
Expressions can be used instead of values.
case defau1: is optional.
Braces are required.
For loop
The syntax of the JavaScript for loop is as follows:
for (iniia1, condiion, 1oop saemen) {
/*
statements wi11 be executed every time
the for{} 1oop cyc1es, whi1e the
condition is satisfied
*/
}
or
for (iniia1, condiion, 1oop saemen(ieraion)) // one statement
For ... in loop
The syntax of the JavaScript For ... in loop is as follows:
for (var propery_name in some_ob_ec) {
//statements using some_obect[property_name];
}
Iterates through all enumerable properties of an object.
Iterates through all used indices of array including all user-defined properties of array object if any. Thus it may
be better to use a traditional for loop with a numeric index when iterating over arrays.
There are differences between the various web browsers with regard to which properties will be reflected with the
for...in loop statement. In theory, this is controlled by an internal state property defined by the ECMAscript
standard called "DontEnum", but in practice each browser returns a slightly different set of properties during
introspection. It is useful to test for a given property using if
(some_ob_ec.hasOwnRropery(propery_name)) { ... }. Thus, adding a method to the array
prototype with Array.prooype.newMehod = funcion() {...} may cause for ... in loops to
loop over the method's name.
JavaScript syntax
112
While loop
The syntax of the JavaScript while loop is as follows:
while (condiion) {
saemen1,
saemen2,
saemen3,
...
}
Do ... while loop
The syntax of the JavaScript do ... while loop is as follows:
do {
saemen1,
saemen2,
saemen3,
...
} while (condiion),
With
The wih statement sets the default object for the set of statements that follow.
with (documen) {
var a = geE1emenById('a'),
var b = geE1emenById('b'),
var c = geE1emenById('c'),
},
Note the absence of documen. before each geE1emenById() invocation.
The semantics are similar to the wih statement of Pascal.
Labels
JavaScript supports nested labels in most implementations. loops or blocks can be labeled for the break statement,
and loops for continue. Although goto is a reserved word,
[6]
goto is not implemented in JavaScript.
1oop1: for (var a = 0, a < 10, a++) {
if (a == 4) {
break 1oop1, // Stops after the 4th attempt
}
a1er('a = ' + a),
1oop2: for (var b = 0, b < 10, ++b) {
if (b == 3) {
continue 1oop2, // Number 3 is skipped
}
if (b == 6) {
continue 1oop1, // Continues the first 1oop, 'finished' is not
shown
}
JavaScript syntax
113
a1er('b = ' + b),
}
a1er('finished')
}
b1oc'1: {
a1er('he11o'), // isp1ays 'he11o'
break b1oc'1,
a1er('wor1d'), // Wi11 never get here
}
goto b1oc'1, // Rarse error.
Functions
A function is a block with a (possibly empty) parameter list that is normally given a name. A function may use local
variables. If you exit the function without a return statement, the value undefined is returned.
function gcd(segmenA, segmenB) {
var diff = segmenA - segmenB,
if (diff == 0)
return segmenA,
return diff > 0 ? gcd(segmenB, diff) : gcd(segmenA, -diff),
}
a1er(gcd(60, 40)), // 20
var mygcd=gcd, // mygcd is a reference to the same function as gcd.
Noe no argumen ()s.
a1er(mygcd(60, 40)), // 20
Functions are first class objects and may be assigned to other variables.
The number of arguments given when calling a function may not necessarily correspond to the number of arguments
in the function definition; a named argument in the definition that does not have a matching argument in the call will
have the value undefined (which can be implicitly cast to false). Within the function, the arguments may also be
accessed through the argumens object; this provides access to all arguments using indices (e.g.
argumens[0|, argumens[1|, ... argumens[n|), including those beyond the number of named
arguments. (While the arguments list has a .length property, it is not an instance of Array; it does not have methods
such as .slice(), .sort(), etc.)
function add7(x, y) {
if (!y) {
y = 7,
}
a1er(x + y + argumens.1engh),
},
add7(3), // 11
add7(3, 4), // 9
All parameters are passed by value (for objects, it is the reference to the object that is passed).
var ob_1 = {a : 1},
var ob_2 = {b : 2},
JavaScript syntax
114
function foo(p) {
p = ob_2, // Ignores actua1 parameter
p.b = argumens[1|,
}
foo(ob_1, 3), // oes not affect ob1 at a11. 3 is additiona1 parameter
a1er(ob_1.a + " " + ob_2.b), // writes 1 3
Functions can be declared inside other functions, and access the outer function's local variables. Furthermore they
implement full closures by remembering the outer function's local variables even after the outer function has exited.
var v = "Top",
var bar, baz,
function foo() {
var v = "fud",
bar = function() { a1er(v) },
baz = function(x) { v = x, },
}
foo(),
baz("Eug1y"),
bar(), // Eug1y (not fud) even though foo() has exited.
a1er(v), // Top
Objects
For convenience, types are normally subdivided into primitives and objects. Objects are entities that have an identity
(they are only equal to themselves) and that map property names to values ("slots" in prototype-based programming
terminology). Objects may be thought of as associative arrays or hashes, and are often implemented using these data
structures. However, objects have additional features, such as a prototype chainWikipedia:Please clarify, which
ordinary associative arrays do not have.
JavaScript has several kinds of built-in objects, namely Array, Boolean, Date, Function, Math, Number, Object,
RegExp and String. Other objects are "host objects", defined not by the language but by the runtime environment.
For example, in a browser, typical host objects belong to the DOM (window, form, links, etc.).
Creating objects
Objects can be created using a constructor or an object literal. The constructor can use either a built-in Object
function or a custom function. It is a convention that constructor functions are given a name that starts with a capital
letter:
// Constructor
var anOb_ec = new Ob_ec(),
// Obect 1itera1
var ob_ecA = {},
var ob_ecA2 = {}, // != 2, {}s create new obects as copies.
var ob_ecB = {index1: 'va1ue 1', index2: 'va1ue 2'},
// Custom constructor (see be1ow)
Object literals and array literals allow one to easily create flexible data structures:
JavaScript syntax
115
var mySrucure = {
name: {
firs: "Me1",
1as: "Smih"
},
age: 33,
hobbies: ["chess", "_ogging"|
},
This is the basis for JSON, which is a simple notation that uses JavaScript-like syntax for data exchange.
Methods
A method is simply a function that is assigned to the value of an object's slot. Unlike many object-oriented
languages, there is no distinction between a function definition and a method definition. Rather, the distinction
occurs during function calling; a function can be called as a method.
When called as a method, the standard local variable this is just automatically set to the object instance to the left of
the ".". (There are also call and apply methods that can set this explicitly-some packages such as jQuery do unusual
things with this.)
In the example below, Foo is being used as a constructor. There is nothing special about a constructor, it is just a
method that is invoked after the object is created. this is set to the newly created object.
Note that in the example below, Foo is simply assigning values to slots, some of which are functions. Thus it can
assign different functions to different instances. There is no prototyping in this example.
function px() {return this.prefix + "X",}
function Eoo(yz) {
this.prefix = "a-",
if (yz > 0) {
this.pyz = function() {return this.prefix + "Y",},
} else {
this.pyz = function() {return this.prefix + "Z",},
}
this.m1 = px,
}
var foo1 = new Eoo(1),
var foo2 = new Eoo(0),
foo2.prefix = "b-",
a1er("foo1/2 " + foo1.pyz() + foo2.pyz()),
// foo1/2 a-Y b-Z
foo1.m3 = px, // ssigns the function itse1f, not its eva1uated resu1t,
i.e. no px()
var baz = {"prefix": "c-"},
baz.m4 = px, // No need for a constructor to make an obect.
JavaScript syntax
116
a1er("m1/m3/m4 " + foo1.m1() + foo1.m3() + baz.m4()),
// m1/m3/m4 a-X a-X c-X
foo1.m2(), // Throws an exception, because foo1.m2 doesn't exist.
Constructors
Constructor functions simply assign values to slots of a newly created object. The values may be data or other
functions.
Example: Manipulating an object
function MyOb_ec(aribueA, aribueB) {
this.aribueA = aribueA,
this.aribueB = aribueB,
}
MyOb_ec.saicC = "b1ue", // On MyObect Eunction, not ob
a1er(MyOb_ec.saicC), // b1ue
ob_ = new MyOb_ec('red', 1000),
a1er(ob_.aribueA), // red
a1er(ob_["aribueB"|), // 1000
a1er(ob_.saicC), // undefined
ob_.aribueC = new ae(), // add a new property
delete ob_.aribueB, // remove a property of ob
a1er(ob_.aribueB), // undefined
delete ob_, // remove the who1e Obect (rare1y used)
a1er(ob_.aribueA), // throws an exception
The constructor itself is stored in the special slot constructor. So
function Eoo(){}
// Use of 'new' sets prototype and constructor s1ots (for examp1e,
// Eoo.prototype = {}; // wou1d set constructor to Obect).
x = new Eoo(),
// The above is a1most equiva1ent to
y = {},
y.consrucor = Eoo,
y.consrucor(),
// Except
x.consrucor == y.consrucor // true
x instanceof Eoo // true
y instanceof Eoo // fa1se
z = new {consrucor: Eoo}.consrucor(),
z instanceof Eoo // true.
JavaScript syntax
117
// Changing Eoo.prototype after 'new' has been ca11ed can change the
// instanceof resu1ts, unti1 it is changed back with the identica1
va1ue.
Functions are objects themselves, which can be used to produce an effect similar to "static properties" (using
C++/Java terminology) as shown below. (The function object also has a special prooype property, as discussed
in the Inheritance section below.)
Object deletion is rarely used as the scripting engine will garbage collect objects that are no longer being referenced.
Inheritance
JavaScript supports inheritance hierarchies through prototyping in the manner of Self.
In the following example, the Derived class inherits from the Base class. When d is created as a Derived, the
reference to the base instance of Base is copied to d.base.
Derive does not contain a value for aBaseFunction, so it is retrieved from Base when aBaseFunction is accessed.
This is made clear by changing the value of base.aBaseFunction, which is reflected in the value of d.aBaseFunction.
Some implementations allow the prototype to be accessed or set explicitly using the __proto__ slot as shown below.
function Base() {
this.anOverride = function() {a1er("Base::anOverride()"),},
this.aBaseEuncion = function() {a1er("Base::aBaseEuncion()"),},
}
function erived() {
this.anOverride = function() {a1er("erived::anOverride()"),},
}
base = new Base(),
erived.prooype = base, // Must be before new erived()
d = new erived(), // Copies erived.prototype to d instance's hidden
prooype s1o.
base.aBaseEuncion = function() {a1er("Base::aNEWBaseEuncion()")}
d.anOverride(), // erived::anOverride()
d.aBaseEuncion(), // Base::aNEWBaseEunction()
a1er(d.aBaseEuncion == erived.prooype.aBaseEuncion), // true
a1er(d.__proo__ == base), // true in Mozi11a-based imp1ementations
bu false in many oher imp1emenaions.
The following shows clearly how references to prototypes are copied on instance creation, but that changes to a
prototype can affect all instances that refer to it.
function m1() {return "One",}
function m2() {return "Two",}
function m3() {return "Three",}
JavaScript syntax
118
function Base() {}
Base.prooype.m = m2,
bar = new Base(),
a1er("bar.m " + bar.m()), // bar.m Two
function Top() {this.m = m3,}
= new Top(),
foo = new Base(),
Base.prooype = ,
// No effect on foo, the *reference* to t is copied.
a1er("foo.m " + foo.m()), // foo.m Two
baz = new Base(),
a1er("baz.m " + baz.m()), // baz.m Three
.m = m1, // oes affect baz, and any other derived c1asses.
a1er("baz.m1 " + baz.m()), // baz.m1 One
In practice many variations of these themes are used, and it can be both powerful and confusing.
Exception handling
JavaScript includes a ry ... cach ... fina11y exception handling statement to handle run-time errors.
The ry ... cach ... fina11y statement catches exceptions resulting from an error or a throw statement.
Its syntax is as follows:
try {
// Statements in which exceptions might be thrown
} catch(errorVa1ue) {
// Statements that execute in the event of an exception
} finally {
// Statements that execute afterward either way
}
Initially, the statements within the try block execute. If an exception is thrown, the script's control flow immediately
transfers to the statements in the catch block, with the exception available as the error argument. Otherwise the catch
block is skipped. The Catch block can hrow(errorVa1ue) if it does not want to handle a specific error.
In any case the statements in the finally block are always executed. This can be used to free resources, although
memory is automatically garbage collected.
Either the cach or the fina11y clause may be omitted. The catch argument is required.
The Mozilla implementation allows for multiple catch statements, as an extension to the ECMAScript standard. They
follow a syntax similar to that used in Java:
try { saemen, }
catch (e if e == "Inva1idNameExcepion") { saemen, }
catch (e if e == "Inva1idIdExcepion") { saemen, }
JavaScript syntax
119
catch (e if e == "Inva1idEmai1Excepion") { saemen, }
catch (e) { saemen, }
In a browser, the onerror event is more commonly used to trap exceptions.
onerror = function (errorVa1ue, ur1, 1ineNr) {..., return true,},
Native functions and methods
(Not related to web browsers.)
eval (expression)
Evaluates expression string parameter, which can include assignment statements. Variables local to functions can be
referenced by the expression.
(function foo() {
var x=7,
a1er("va1 " + eva1("x+2")),
})(), // shows va1 9.
Notes
[1] JavaScript 1.1 specification (http:/ / hepunx.rl. ac. uk/ adye/ jsspec11/ intro. htm#1006028)
[2] " Semicolons in JavaScript are optional (http:/ / mislav. uniqpath. com/ 2010/ 05/ semicolons/ )", by Mislav Marohni, 07 May 2010
[3] " JavaScript Scoping and Hoisting (http:/ / www.adequatelygood. com/ JavaScript-Scoping-and-Hoisting. html)", Ben Cherry (http:/ / www.
adequatelygood. com/ about. html), Adequately Good (http:/ / www. adequatelygood. com/ ), 2010-02-08
[4] ECMA-262 5e edition clarified this confusing behavior introducing the notion of Declarative Environment Record and Object Environment
Record. With this formalism, the global object is the Object Environment Record of the global Lexical Environment (the global scope).
[5] http:/ / www. jibbering. com/ faq/ #formatNumber
[6] [6] ECMA-262, Edition 3, 7.5.3 Future Reserved Words
References
David Flanagan, Paula Ferguson: JavaScript. The Definitive Guide, O'Reilly & Associates, ISBN 0-596-10199-6
Danny Goodman: JavaScript Bible, Wiley, John & Sons, ISBN 0-7645-3342-8
Thomas A. Powell, Fritz Schneider: JavaScript. The Complete Reference, McGraw-Hill Companies, ISBN
0-07-219127-9
Emily Vander Veer: JavaScript For Dummies, 4th Edition, Wiley, ISBN 0-7645-7659-3
External links
A re-introduction to JavaScript - Mozilla Developer Center (https:/ / developer. mozilla. org/ en/ docs/
A_re-introduction_to_JavaScript)
ECMAScript standard references: ECMA-262 (http:/ / www. ecma-international. org/ publications/ standards/
Ecma-262. htm)
Interactive JavaScript Lessons - example-based (http:/ / javalessons. com/ cgi-bin/ fun/ java-tutorials-main.
cgi?sub=javascript& code=script)
JavaScript on About.com: lessons and explanation (http:/ / javascript. about. com/ )
Mozilla Developer Center Core References for JavaScript versions 1.5 (https:/ / developer. mozilla. org/ en/ docs/
Core_JavaScript_1. 5_Reference), 1.4 (http:/ / research. nihonsoft. org/ javascript/ CoreReferenceJS14/ ), 1.3
(http:/ / research. nihonsoft.org/ javascript/ ClientReferenceJS13/ ) and 1.2 (http:/ / research. nihonsoft. org/
javascript/ jsref/ )
JavaScript syntax
120
Mozilla JavaScript Language Documentation (https:/ / developer. mozilla. org/ en/ docs/ JavaScript)
Comparison Operators in JavaScript (http:/ / www. how-to-code. com/ javascript/
comparison-operators-in-javascript. html)
JavaScript engine
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]
A JavaScript engine is specialized computer software which interprets and executes JavaScript (also known as
ECMAScript). Although there are several uses for a JavaScript engine, it is most commonly used in web browsers.
History
Before the second browser war in 2008-2009, the JavaScript engine (also termed JavaScript interpreter or
JavaScript implementation) was known as simply an interpreter that read and executed JavaScript source code.
The first JavaScript engine was created by Brendan Eich at Netscape Communications Corporation for the Netscape
Navigator web browser. The engine, code named SpiderMonkey, is implemented in C++. It has since been updated
(in JavaScript 1.5) to conform to ECMA-262 Edition 3. The Rhino engine, created primarily by Norris Boyd (also at
Netscape) is a JavaScript implementation in Java. Like SpiderMonkey, Rhino is ECMA-262 Edition 3 compliant.
Applications of the technology include Apple Safari 4's Nitro, Google Chrome's V8 and Mozilla Firefox 3.5's
TraceMonkey.
By far the most common host environment for JavaScript is a web browser. Web browsers typically use the public
application programming interface (API) to create "host objects" responsible for reflecting the Document Object
Model (DOM) into JavaScript.
The web server is another common application of the engine. A JavaScript web server exposes host objects
representing an HTTP request and response objects, which a JavaScript program then manipulates to dynamically
generate web pages. Microsoft's ASP technology for IIS allows server-side code to be written in VBScript or JScript
(Microsoft's implementation of JavaScript). Jaxer is a web server that runs entirely on JavaScript; this has the benefit
of allowing the same code to be shared on the server and on the client.
JavaScript engine
121
Performance evolution
"..previously behind-the-scenes programming technology called JavaScript is getting new visibility .. "
--CNET
A typical major browser has a graphical engine and an independent JavaScript engine, which allows for easier
testing, reimplementation or use in other projects. For example Carakan is used with Presto; Nitro with WebKit;
SpiderMonkey with Gecko; KJS with KHTML; Rhino by default has no layout engine. Other combinations are
possible, for example, V8 with WebKit in Google Chrome. The JavaScript engine gives developers access to
functionality (networking, DOM handling, external events, HTML5 video, canvas and data storage) needed to
control the web browser.
SunSpider is a JavaScript benchmark utility for measuring the performance of JavaScript engines in more than a
dozen tests, each concentrating on different part of JavaScript language. SunSpider does not use for benchmarking
any features beyond those needed to test pure computations (no HTML, no CSS, no networking).
The JavaScript engine race: 2008 and 2009
Recently, there has been a race by browser developers to develop even faster JavaScript engines in response to the
growing use of JavaScript frameworks and Ajax, as the user's experience is directly influenced by the browser's
ability to execute the site's client-side code. In 2008, Google Chrome was praised for its JavaScript performance, but
other browsers soon received new JavaScript engines which were faster. Later, Chrome won in the races of better
performance. Chrome's strength is its application performance and JavaScript processing speed, both of which were
independently verified by multiple websites to be the fastest amongst the major browsers of its time. With the advent
of WebKit's Squirrelfish and Mozilla's TraceMonkey JavaScript virtual machines, Chrome's JavaScript execution
performance has been found to be slower. Google responded with the Danish-developed V8 which boosted
JavaScript performance in Google Chrome 2.
On June 2, 2008, the WebKit development team announced SquirrelFish, a then-new JavaScript engine that vastly
improves Safari's speed at interpreting scripts. The engine was one of the new features in Safari 4, released for
developers on June 11, 2008; the final JavaScript engine was called Nitro.
In January 2009, the engine then known as SquirrelFish Extreme (SFX) was enabled for Mac OS X on x86-64
architectures as it passes all tests on that platform by Apple Inc.
[1]
Released June 30, 2009, Firefox 3.5 includes the
optimization technique that offered "performance improvements ranging between 20 and 40 times faster" compared
to Firefox 3 in some cases.
The JavaScript engine race: 2010
In early 2010, the Norwegian Opera browser replaced the aging Futhark with the faster Carakan, which was 2.5
times faster in early testing. Others in the race, at this time, include Apple's Safari's Nitro (the engine formerly
known as SquirrelFish) and Firefox's new JgerMonkey (a "cross-child of Nitro with the older TraceMonkey
Engine"). Microsoft lagged behind, lacking a dedicated JavaScript engine and being the slowest of the major
browsers. Although by mid-2010, Microsoft held out the carrot of Chakra in then unreleased Internet Explorer 9.
JgerMonkey began testing in the publicly released Firefox 4.0 beta in Summer 2010. Safari 5, also released in
Summer 2010, featured 30 percent faster JavaScript performance than Safari 4 (using the Nitro engine).
[2]
JavaScript engine
122
2011
In 2011, Firefox 4 and Internet Explorer 9 were released with their JavaScript software.
[citation needed]
JavaScript engines
Mozilla
Rhino, managed by the Mozilla Foundation, open source, developed entirely in Java
SpiderMonkey (code name), the first ever JavaScript engine, written by Brendan Eich at Netscape
Communications
TraceMonkey, a tracing JIT compiler introduced with Firefox 3.5
JgerMonkey, the engine introduced with Firefox 4
IonMonkey, further JIT compiler optimizations for SpiderMonkey, introduced with Firefox 18
OdinMonkey, the engine based on asm.js, introduced with Firefox 22
Tamarin, by Adobe Labs
Google
V8 - open source, developed by Google in Denmark, part of Google Chrome
Opera
Carakan, by Opera Software, used by Opera web browser version 10.50 until switching to V8 with Opera 14
(released in 2013).
[3][4]
Futhark, by Opera Software, used by Opera web browser versions 9.50 to 10.10 until replaced by Carakan in
Opera 10.50 (released March 2010).
Safari
JavaScriptCore - open source, marketed as Nitro and developed by Apple for Safari
Other
KJS - KDE's ECMAScript/JavaScript engine originally developed by Harri Porten for the KDE project's
Konqueror web browser
Narcissus open source, written by Brendan Eich, who also wrote SpiderMonkey
Chakra, for Internet Explorer 9
dyn.js, open source, written by Douglas Campos and others
Nashorn, open source as part of OpenJDK, written by Oracle Java Languages and Tool Group
JUCE, the open source JUCE C++ toolkit contains an embedded JavaScript interpreter
Implementations
JavaScript is a dialect of ECMAScript, which is supported in many applications, especially web browsers. Dialects
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 an application written in one dialect may be incompatible with another, unless the applications are written
to use only a common subset of supported features and APIs ("core").
A dialect and an implementation are distinct: a dialect of a language is a significant variant of that language, while an
implementation of a language (or dialect) executes a program written in that language (or dialect).
JavaScript engine
123
Application Dialect and latest version ECMAScript edition
Google Chrome, the V8 engine JavaScript ECMA-262, edition 5
Mozilla Firefox, the Gecko layout engine, SpiderMonkey, and Rhino JavaScript 1.8.5 ECMA-262, edition 5
Safari, the Nitro engine JavaScript ECMA-262, edition 5.1
Opera ECMAScript with some JavaScript
1.5
and JScript extensions
ECMA-262, edition 5.1
KHTML layout engine, KDE's Konqueror JavaScript 1.5 ECMA-262, edition 3
Adobe Acrobat JavaScript 1.5 ECMA-262, edition 3
OpenLaszlo JavaScript 1.4 ECMA-262, edition 3
Max/MSP JavaScript 1.5 ECMA-262, edition 3
ANT Galio 3 JavaScript 1.5 with RMAI extensions ECMA-262, edition 3
References
[1] https:/ / trac.webkit.org/ changeset/ 40439
[2] http:/ / www. prnewswire.com/ news-releases/ apple-releases-safari-5-95817479. html Safari 5 Released
[3] http:/ / my. opera. com/ ODIN/ blog/ 300-million-users-and-move-to-webkit
[4] http:/ / my. opera. com/ ODIN/ blog/ opera-14-for-android-is-out

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/

You might also like