237

Course Wikibook

Embed Size (px)

DESCRIPTION

wikibook

Citation preview

Page 1: Course Wikibook
Page 2: Course Wikibook

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 EngineeringPart II: Developing Mobile HTML5 Apps

Page 3: Course Wikibook

ContentsArticles

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 RESTAPI 146

Web application 146

Single-page application 150

Page 4: Course Wikibook

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 ApplicationFramework 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 aWebSocket 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

ReferencesArticle Sources and Contributors 225

Image Sources, Licenses and Contributors 232

Article LicensesLicense 233

Page 5: Course Wikibook

1

Intro: MOOC Web Engineering

Massive open online course

Poster, entitled "MOOC, every letter is negotiable," exploringthe meaning of the words "Massive Open Online Course"

A Massive Open Online Course (MOOC) is an onlinecourse aimed at unlimited participation and open access viathe web. In addition to traditional course materials such asvideos, readings, and problem sets, MOOCs provideinteractive user forums that help build a community forstudents, professors, and teaching assistants (TAs).MOOCs are a recent development in distance education.

Although early MOOCs often emphasized open accessfeatures, such as connectivism and open licensing ofcontent, structure, and learning goals, to promote the reuseand remixing of resources, some notable newer MOOCsuse closed licenses for their course materials, whilemaintaining 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, 2010From the New York Times

Welcome to the Brave New World of MOOCs [6] on YouTube, 2013

Page 6: Course Wikibook

Massive open online course 2

PrecursorsBefore the Digital Age, distance learning appeared in the form of correspondence courses, broadcast courses andearly forms of e-learning. By the 1890s correspondence courses on specialized topics such as civil service tests andshorthand were promoted by door-to-door salesmen.[7] Over 4 million Americans – far more than attendedtraditional colleges – were enrolled in correspondence courses by the 1920s, covering hundreds of practicaljob-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, NewYork University operated its own radio station, with plans to broadcast practically all its courses. Other schoolsfollowed, 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 Blivenasked: "Is radio to become a chief arm of education? Will the classroom be abolished and the child of the future bestuffed with facts as he sits at home or even as he walks about the streets with his portable receiving-set in hispocket?"[9] Completion rates were very low, cheating was hard to detect, and there was no way to collect tuition. Bythe 1940s radio courses had virtually disappeared in the United States. The Australian School of the Air usedtwo-way shortwave radio starting in 1951 to teach students in classrooms in remote locations, with students able toask questions of the live instructor.

During World War II, movies were used to train millions of draftees, as lecturers could demonstrate physicalequipment in action. Universities offered televised classes, starting in the late 1940s at the University ofLouisville.[10]

At many universities in the 1980s classrooms were linked to a remote campus to provide closed-circuit video accessfor some students. The CBS TV series Sunrise Semester, broadcast from the 1950s to the 1980s with cooperationbetween 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 andemail, 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 snappyinstructional videos." In 2003 Hello China launched what the UK Guardian newspaper described on 24 Septemberthat year as a new media venture to teach 4 million Chinese learners who were preparing for business degrees byradio, web and mobile phone. The course was open to all participants who could have access to radio and theinternet.

Early approaches

A network diagram showing the distributivenature of Stephen Downes' and George Siemens'CCK08 course, one of the first MOOCs and thecourse 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 ofthe University of Prince Edward Island and Senior Research FellowBryan Alexander of the National Institute for Technology in LiberalEducation in response to a course called Connectivism and ConnectiveKnowledge (also known as CCK08). CCK08, which was led by GeorgeSiemens of Athabasca University and Stephen Downes of the NationalResearch Council, consisted of 25 tuition-paying students in ExtendedEducation at the University of Manitoba, as well as over 2200 onlinestudents from the general public who paid nothing. All course contentwas available through RSS feeds and online students could participatethrough collaborative tools, including blog posts, threaded discussionsin Moodle and Second Life meetings. Stephen Downes considers these so-called cMOOCs to be more "creative anddynamic" than the current xMOOCs, which he believes "resemble television shows or digital textbooks."

Page 7: Course Wikibook

Massive open online course 3

Other MOOCs then emerged. Jim Groom from The University of Mary Washington and Michael Branson Smith ofYork College, City University of New York hosted MOOCs through several universities. Early MOOCs did not relyon posted resources, learning management systems and structures that mix the learning management system withmore open web resources. MOOCs from private, non-profit institutions emphasized prominent faculty members andexpanded 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 we're learning from online education, June 2012

Peter Norvig [17] at TED, The 100,000-student classroom February 2012

Salman Khan [18] at TED, Let's 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 tothe '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 announcementwas followed within weeks by the launch of two more MOOCs, by Andrew Ng and Jennifer Widom. Following thepublicity and high enrollment numbers of these courses, Thrun started a company he named Udacity and DaphneKoller and Andrew Ng launched Coursera. Coursera subsequently announced university partnerships with Universityof 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 inauguralcourse, 6.002x, launched in March 2012. Harvard joined the group, renamed edX, that spring, and University ofCalifornia, Berkeley joined in the summer. The initiative then added the University of Texas System, WellesleyCollege and Georgetown University.

In November 2012, the University of Miami launched first high school MOOC as part of Global Academy, its onlinehigh 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. InMay 2013 the company announced the first entirely MOOC-based Master's Degree, a collaboration betweenUdacity, 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'sCanvas Network, a MOOC platform launched in November 2012. The course used examples from comic books toteach academic concepts about gender and perceptions.

Page 8: Course Wikibook

Massive open online course 4

In March 2013, Coursolve piloted a crowdsourced business strategy course for 100 organizations with the Universityof 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 onlinetextbook-rental company. Students would use Chegg's e-reader, which limits copying and printing and could use thebook only while enrolled in the class. In June 2013, the University of North Carolina at Chapel Hill launched SkynetUniversity, which offers MOOCs on introductory astronomy. Participants gain access to the university's globalnetwork 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 itsMOOC.org, a site for non-xConsortium groups to build and host courses. Google will work on the core platformdevelopment with edX partners. In addition, Google and edX will collaborate on research into how students learnand 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 13months of operation (ending March 2013), Coursera offered about 325 courses, with 30% in the sciences, 28% inarts and humanities, 23% in information technology, 13% in business and 6% in mathematics. Udacity offered 26courses. 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 ofuniversities 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 andinternational universities and industry regulatory bodies. The site provides courses, support from experts andinteractive webinars.

Schoo provides MOOCs in Japan.

In 24 August 2013, Universitas Ciputra Entrepreneurship Online (UCEO) launched first MOOC in Indonesia withthe first course entitled Entrepreneurship Ciputra Way. With over 20,000 registered members, the course offeredinsights 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 OpenSource 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 companyincluding provision of MOOCs from non-university partners.

On 15 March 2012 Researchers Dr. Jorge Ramió and Dr. Alfonso Muñoz from Universidad Politécnica de Madridsuccessfully 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 ofStorytelling" 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. ALISONwas shortlisted in June 2013 by London–based education technology company Edxus Group and specialist mediaand 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 Frenchpublic alternative to existing solutions. French business schools have begun launching their own MOOCs, the firstbeing supervised by Alberto Alemanno.

Page 9: Course Wikibook

Massive open online course 5

Australia

On 15 October 2012 The University of New South Wales launched UNSW Computing 1, the first AustralianMOOC. The course was initiated OpenLearning, an online learning platform developed in Australia, which providesfeatures 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 "DesarrollandoAplicaciones para iPhone y iPad" This MOOC is a Spanish remix of Stanford University's popular "CS 193P iPhoneApplication Development" and had 5,380 students enrolled. The technology used to host the MOOC was the GalileoEducational System platform (GES) which is based on the .LRN project.

Startup Veduca launched the first MOOCs in Brazil, in partnership with the University of São 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 PolytechnicSchool of the University of São Paulo, more than 10,000 students enrolled.[23]

Related educational practices and coursesOrganizations such as Khan Academy, Peer-to-Peer University (P2PU), Udemy, and Course Hero are viewed assimilar to MOOCs work outside the university system or emphasize individual self-paced lessons.[24] Udemy allowsteachers to sell online courses, with the course creators keeping 70-85% of the proceeds and intellectual propertyrights.

Hype

Dennis Yang, President of MOOC provider Udemy hassuggested that MOOCs are in the midst of a hype cycle,

with expectations undergoing a wild swing.

During a presentation at SXSWedu in early 2013, InstructureCEO Josh Coates suggested that MOOCs are in the midst of ahype cycle, with expectations undergoing wild swings. DennisYang, President of MOOC provider Udemy, later made thepoint in an article for the Huffington Post.

Many universities scrambled to join in the "next big thing", asdid more established online education service providers such asBlackboard Inc, in what has been called a "stampede." Dozensof universities in Canada, Mexico, Europe and Asia haveannounced partnerships with the large American MOOCproviders.[25] By early 2013, questions emerged about whetheracademia was "MOOC'd out."

Page 10: Course Wikibook

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 testifiedbefore the President’s Council of Advisors on Science and Technology (PCAST) that MOOC "courses are 'designedto be challenges,' not lectures, and the amount of data generated from these assessments can be evaluated 'massivelyusing 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 andinteraction. 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/orcollaborate 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 knowledgeretention. 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.

Page 11: Course Wikibook

Massive open online course 7

Connectivist design

Development of MOOC providers[29]

As MOOCs have evolved, there appear to betwo distinct types: those that emphasize theconnectivist philosophy, and those thatresemble more traditional courses. Todistinguish the two, Stephen Downes proposedthe terms "cMOOC" and "xMOOC".

Principles

Connectivist MOOCs are based on principlesfrom connectivist pedagogy:[30][31][32][33]

1. Aggregation. Enable content to be producedin 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 toalterations in the information climate affecting the decision.Wikipedia:Please clarify

Ravenscrot claimed that connectivist MOOCs better support collaborative dialogue and knowledge building.[34][35]

AssessmentsAssessment can be the most difficult activity to conduct online, and online assessments can be quite different fromthe 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 andpeer-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 awarddifferent answers. These rubrics cannot be as complex for peer grading as for teaching assistants. Students areexpected to learn via grading others.

Exams may be proctored at regional testing centers. Other methods, including "eavesdropping technologies worthyof 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 previousanswers, giving harder or easier questions accordingly.

Page 12: Course Wikibook

Massive open online course 8

Lecture designA study of edX student habits found that certificate-earning students generally stop watching videos longer than 6 to9 minutes. They viewed the first 4.4 minutes (median) of 12- to 15-minute videos.

Completion ratesCompletion rates are typically lower than 10%, with a steep participation drop starting in the first week. In the courseBioelectricity, Fall 2012 at Duke University, 12,725 students enrolled, but only 7,761 ever watched a video, 3,658attempted 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 topicrather than complete the course, according to Koller and Ng. The completion rate for students who complete the firstassignment is about 45 percent. Students paying $50 for a feature designed to prevent cheating on exams havecompletion rates of about 70 percent.

One online survey published a "top ten" list of reasons for dropping out. These were that the course required toomuch time, or was too difficult or too basic. Reasons related to poor course design included "lecture fatigue" fromcourses that were just lecture videos, lack of a proper introduction to course technology and format, clunkytechnology and trolling on discussion boards. Hidden costs were cited, including required readings from expensivetextbooks written by the instructor that also significantly limited students' access to learning material.[37] Othernon-completers were "just shopping around" when they registered, or were participating for knowledge rather than acredential. Providers are exploring multiple techniques to increase the often single-digit completion rates in manyMOOCs.

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. Herresearch compared online-only and face-to-face learning in studies of community-college students and faculty inVirginia and Washington state. Among her findings: In Virginia, 32% of students failed or withdrew from for-creditonline 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 tovolunteer as online mentors and discussion group managers. About 10 former teaching fellows also volunteered. Thetask of the volunteers, which required 3–5 hours per week, was to focus online class discussion. Theinstructor,Gregory Nagy The edX course registered 27,000 students.

Flipped classroomsSome traditional schools blend online and offline learning, sometimes called flipped classrooms. Students watchlectures online at home and work on projects and interact with faculty while in class. Such hybrids can even improvestudent performance in traditional in-person classes. One fall 2012 test by San Jose State and edX found thatincorporating content from an online course into a for-credit campus-based course increased pass rates to 91% fromas low as 55% without the online component. "We do not recommend selecting an online-only experience over ablended learning experience," says Coursera's Ng.

Page 13: Course Wikibook

Massive open online course 9

EncouragementTechniques for maintaining connection with students include adding audio comments on assignments instead ofwriting them, weekly update videos about the course and congratulatory emails on prior accomplishments to studentswho are slightly behind.

PreliminariesSome instructors make students begin with self-assessment surveys and videos. They asked, "What do you think ittakes 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 feesCoursera found that students who paid $30 to $90 were substantially more likely to finish the course. The fee wasostensibly for the company's identity-verification program, which confirms that they took and passed a course.

Student scoresResearch found that time spent on homework exercises was the largest grade predictor—more than time spentwatching videos or reading. Among comparable students, one additional hour yielded a 2.2-point score increase on a100-point scale (with a 60 required to pass). "Organizing the course around exercises and mental challenges is muchmore effective than around lectures", says Thrun.

IndustryMOOCs are widely seen as a major part of a larger disruptive innovation taking place in higher education. Inparticular, the many services offered under traditional university business models are predicted to become unbundledand 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 studentplacement. MOOCs threaten existing business models by potentially selling teaching, assessment, and/or placementseparately 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 degreefrom an accredited institution. With this new business model, students might still have to pay to certifytheir credentials, but not for the process leading to their acquisition. If free access to a degree-grantingcurriculum were to occur, the business model of higher education would dramatically and irreversiblychange.

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 theexpectations are too high. People think something will catch on like wildfire. But more likely, it's maybe adecade later that somebody figures out how to do it and make money.

—James Grimmelmann, New York Law School professor

Page 14: Course Wikibook

Massive open online course 10

Fee opportunitiesIn the freemium business model the basic product – the course content – is given away free. "Charging for contentwould be a tragedy," said Andrew Ng. But "premium" services such as certification or placement would be charged afee.

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 newstudents to follow-on fee-charging classes. Blended courses supplement MOOC material with face-to-faceinstruction. Providers can charge employers for recruiting its students. Students may be able to pay to take aproctored 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 underconsideration 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 enrolledstudents

•• Secure assessments •• Employers paying to recruit talentedstudents

•• Franchise network

•• Employee recruitment •• Students résumés and job matchservices

•• 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 trainingcourses

•• Sponsorships

•• Tuition fees

In February 2013 the American Council on Education (ACE) recommended that its members provide transfer creditfrom 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-coursessuch as MOOCs and complete assessment tests at the university to receive credit. ACE president Molly CorbettBroad 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 Campusreceived 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 itschairman, Randy Best "We started it, frankly, as a campaign to grow enrollment. But 72 to 84 percent of those whodid 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-profitEdX has a minimum required payment from course providers, but takes a smaller cut of any revenues, tied to theamount of support required for each course.

Page 15: Course Wikibook

Massive open online course 11

Industry structureThe industry has an unusual structure, consisting of linked groups including MOOC providers, the larger non-profitsector, universities, related companies and venture capitalists. The Chronicle of Higher Education lists the majorproviders 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, theNational 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 ofCalifornia 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 KleinerPerkins Caufield & Byers, New Enterprise Associates and Andreessen Horowitz.

The changes predicted from MOOCs generated objections in some quarters. The San Jose State Universityphilosophy 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 ofuniversities will be created: one, well-funded colleges and universities in which privileged students gettheir own real professor; the other, financially stressed private and public universities in which studentswatch a bunch of video-taped lectures.

TechnologyUnlike traditional courses, MOOCs require additional skills, provided by videographers, instructional designers, ITspecialists and platform specialists. Georgia Tech professor Karen Head reports that 19 people work on theirMOOCs and that more are needed. The platforms have availability requirements similar to media/content sharingwebsites, 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, aswell as online forums. Before 2013 each MOOC tended to develop its own delivery platform. EdX in April 2013joined with Stanford University, which previously had its own platform called Class2Go, to work on XBlock SDK, ajoint open-source platform. It is available to the public under the Affero GPL open source license, which requiresthat all improvements to the platform be publicly posted and made available under the same license. Stanford ViceProvost John Mitchell said that the goal was to provide the "Linux of online learning." This is unlike companies suchas Coursera that have developed their own platform.

Potential benefitsThe MOOC Guide lists 12 benefits:

1.1. Appropriate for any setting that has connectivity (Web or Wi-Fi)2.2. Any language or multiple languages3.3. Any online tools4.4. Escape time zones and physical boundaries5.5. Produce and deliver in short timeframe (e.g. for relief aid)6.6. Contextualized content can be shared by all7.7. Informal setting8.8. Peer-to-peer contact can trigger serendipitous learning9.9. Easier to cross disciplines and institutional barriers10.10. Lower barriers to student entry11.11. Enhance personal learning environment and/or network by participating12.12. Improve lifelong learning skills

Page 16: Course Wikibook

Massive open online course 12

Experience and feedbackAbout 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 activelyinteracted at various times.[41]

Learners control where, what, how and with whom they learn, although different learners choose to exercise more orless 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 ofOpen Design in educational technology are applied vary. Research by Kop and Fournier highlighted as majorchallenges the lack of social presence and the high level of autonomy required.

Table 1 Comparison of key aspects of MOOCs orOpen Education initiatives p8.jpgCompares some

features of current MOOC offerings eDX,Coursera, Udacity, Udemy, P2P with respect toattributes:For profit; free to access; certificationfee; 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, threefellow students grade one assignment for each assignment that theysubmit. The grading key or rubric tends to focus the grading, butdiscourages more creative writing.

A. J. Jacobs in an op-ed in the New York Times graded his experiencein 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-studentinteraction as a "D" since he had almost no contact with the professors.The highest rated ("A") aspect of Jacobs' experience was the ability towatch videos at any time. Student-to-student interaction andassignments both received "B-". Study groups that didn't meet, trollson message boards and the relative slowness of online vs. personalconversations lowered that rating. Assignments included multiplechoice quizzes and exams as well as essays and projects. He found themultiple 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. "Therewas a real question of whether this would work for humanities and social science," says Ng. However, psychologyand philosophy courses are among Coursera's most popular. Student feedback and completion rates suggest that theyare 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.

Page 17: Course Wikibook

Massive open online course 13

Students servedBy June 2012 more than 1.5 million people had registered for classes through Coursera, Udacity and/or edX.[43] Asof 2013, the range of students registered appears to be broad, diverse and non-traditional, but concentrated amongEnglish-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 independentlyreached 1.3 million.

A course billed as "Asia's first MOOC" given by the Hong Kong University of Science and Technology throughCoursera starting in April 2013 registered 17,000 students. About 60% were from "rich countries" with many of therest from middle-income countries in Asia, South Africa, Brazil or Mexico. Fewer students enrolled from areas withmore limited access to the internet, and students from the People's Republic of China may have been discouraged byChinese government policies.[44]

"We have the whole gamut of older and younger, experienced and less experienced students, and also academics andprobably some people who are experts in related fields," according to Naubahar Sharif who teaches the class onScience, Technology and Society in China. "We do have students from China as well, in places where Internetconnections are more reliable."

Koller stated in May 2013 that a majority of the people taking Coursera courses had already earned collegedegrees.[45]

According to a Stanford University study of a more general group of students "active learners" – anybody whoparticipated 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 professorspent over 100 hours on his MOOC before it even started, by recording online lecture videos and doing otherpreparation," though some instructors' pre-class preparation was "a few dozen hours." The professors then spent8–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% ofthe 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 and5% required an e-book.

Page 18: Course Wikibook

Massive open online course 14

Student demographicsA study from Stanford University's Learning Analytics group identified four types of students: auditors, whowatched video throughout the course, but took few quizzes or exams; completers, who viewed most lectures andtook part in most assessments; disengaged learners, who quickly dropped the course; and sampling learners, whomight 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 thestudents taking US courses are from other countries and do not speak English as their first language. He found somecourses to be meaningful, especially about reading comprehension. Video lectures followed by multiple choicequestions can be challenging since they are often the "right questions." Smaller discussion boards paradoxically offerthe best conversations. Larger discussions can be "really, really thoughtful and really, really misguided," with longdiscussions becoming rehashes or "the same old stale left/right debate."

Challenges and criticismsThe MOOC Guide lists 5 possible challenges for collaborative-style MOOCs:

1.1. Participants must create their own content2. Digital literacy is necessary3.3. Time and effort required from participants4.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) Theimplications of courses scaling across country borders, and potential difficulties with relevance and knowledgetransfer; 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 "absenceof 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 socialnetworking."Wikipedia:Please clarify An underlying reason is simple cost cutting pressures, which could hamstringthe higher education industry.

Cary Nelson, former president of the American Association of University Professors claimed that MOOCs are not areliable means of supplying credentials, stating that "It’s fine to put lectures online, but this plan only degradesdegree programs if it plans to substitute for them." Sandra Schroeder, chair of the Higher Education Program andPolicy Council for the American Federation of Teachers expressed concern that "These students are not likely tosucceed 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

Page 19: Course Wikibook

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 theroles of the instructor, hierarchy, money and massiveness. DOCC recognizes that the pursuit of knowledge may beachieved better by not using a centralized singular syllabus, that expertise is distributed throughout all theparticipants 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

Page 20: Course Wikibook

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 América 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), InstructionalTechnology 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.3March – 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 NetworkedLearning (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 2013Proceedings (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 thatapplications for the term starting in January 2014 were more than double the number of applications that Georgia Tech receives for itstraditional 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 NetworkedLearning 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).

Page 21: Course Wikibook

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 distancelearning" 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, Researchpaper 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, May2012.

• 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 August2013.

• 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, interviewby 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.

Page 22: Course Wikibook

Web engineering 18

Web engineeringThe web has become a major delivery platform for a variety of complex and sophisticated enterprise applications inseveral domains. In addition to their inherent multifaceted functionality, these web applications exhibit complexbehavior 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 problemsof usability, maintainability, quality and reliability.[1][2] While web development can benefit from establishedpractices from other related disciplines, it has certain distinguishing characteristics that demand specialconsiderations. In recent years, there have been developments towards addressing these considerations.

As an emerging discipline, web engineering actively promotes systematic, disciplined and quantifiable approachestowards successful development of high-quality, ubiquitously usable web-based systems and applications.[3] Inparticular, web engineering focuses on the methodologies, techniques and tools that are the foundation of webapplication development and which support their design, development, evolution, and evaluation. Web applicationdevelopment has certain characteristics that make it different from traditional software, information system, orcomputer application development.

Web engineering is multidisciplinary and encompasses contributions from diverse areas: systems analysis anddesign, software engineering, hypermedia/hypertext engineering, requirements engineering, human-computerinteraction, user interface, information engineering, information indexing and retrieval, testing, modelling andsimulation, project management, and graphic design and presentation. Web engineering is neither a clone, nor asubset of software engineering, although both involve programming and software development. While webEngineering 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 disciplineProponents of web engineering supported the establishment of web engineering as a discipline at an early stage ofweb. First Workshop on Web Engineering was held in conjunction with World Wide Web Conference held inBrisbane, Australia, in 1998. San Murugesan, Yogesh Deshpande, Steve Hansen and Athula Ginige, from Universityof Western Sydney, Australia formally promoted web engineering as a new discipline in the first ICSE workshop onWeb Engineering in 1999. Since then they published a series of papers in a number of journals, conferences andmagazines to promote their view and got wide support. Major arguments for web engineering as a new disciplineare:

• 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 completetheory 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 softwareengineering, to recognize web engineering as a new field. The issue is how different and independent webengineering is, compared with other disciplines.

Main topics of Web engineering include, but are not limited to, the following areas:

Page 23: Course Wikibook

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

Page 24: Course Wikibook

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 andYogesh Deshpande (Eds), LNCS 2016, Springer Verlag, Berlin Heidelberg, 2001Athula Ginige and San Murugesan, "Web Engineering: AnIntroduction," 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, January2001, 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 resourcesOrganizations

• 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", SanMurugesan (Editor), Information Science Research, Hershey – New York, October 2009, ISBN978-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 Pröll, Siegfried Reich, and Werner Retschitzegger, John Wiley & Sons, 2006

Page 25: Course Wikibook

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 "WebEngineering: 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'sPerspective, 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

Page 26: Course Wikibook

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.

Page 27: Course Wikibook

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 Klöpper

Created by Jonas Liepmann and Hannes Klöpper

Launched October 2013

Current status Active

iversity.org is a MOOC provider based in Bernau bei Berlin. iversity specialises in providing online courses andlectures in higher education, specifically MOOCs (Massive Open Online Courses) . As opposed to the US-Americanprovider Coursera, the iversity platform works together with professors to provide each course. Courses are free andopen for anyone to enrol and participate. Courses are mainly conducted in English or German, but also Russian andItalian, with the addition of more languages are in the planning. Some of the courses were winners of the MOOCProduction Fellowship held in early 2013 . iversity.org officially launched the MOOC platform online on 15 October2013, with 24 MOOCs and over 100,000 users . The goals for 2014 are to have 1 million users and over 100 courses.

HistoryIn 2008, Jonas Liepmann, at the time a student of Cultural Studies at Humboldt University of Berlin, created iversityas an educational platform for students and professors. In 2011, Hannes Klöpper and Jonas Liepmann foundediversity 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 in2012 . Marcus Riecke joined the team and invested in the company together with the existing investors, MasoudKamali and T-Venture, the venture arm of Deutsche Telekom AG. In 2013, Hannes Klöpper and Marcus Rieckewere the Managing Directors of iversity.

MOOC Production Fellowshipiversity, in cooperation with the Donor’s Association for German Science, ran the MOOC Production Fellowship in2013. €250,000 was set aside to fund the production of 10 MOOCs. Half of the funding was allocated for Germanlanguage MOOC production. It was considered a big success, with 250 professors applying and 100,000 votes fromaround the world. The judging panel included, among others, Jorg Drager, Hamburg's Science Senator and memberof Bertelsmann Foundation for Education, Prof Jurgen Kluge, expert in innovation management, and Prof JornLoviscach, a lecturer in Mathematics at MOOC provider Udacity, and Christian Spannagelhaus, Math professor atHeidelberg Teachers College.

Page 28: Course Wikibook

Iversity 24

Coursesiversity has 24 MOOCs and is expanding continually. Professors and universities worldwide are open to workingwith iversity. Current partners include: KU Leuven, Universidad Autonoma de Madrid, University of Florence, theUniversity 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 StructureCourses 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 willbe released per week. Each chapter will contain 6-10 units. These units consist of 3–8 minutes long videos, that haveinteractive quizzes and homework. Depending on the instructor there may be a peer-to-peer review assessments andgroup 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 learningexperience. Instructors and TAs moderate and guide these discussions and ensure quality control.

ECTS CreditsECTS credits can be obtained from participation in three iversity MOOCs. The MOOCs can be taken remotely, andthe final examination must be taken in each respective university campus for the credits to be awarded. iversity is thefirst MOOCs provider to offer ECTS credits.

These courses are:

• "Algorithms and Data Structures" from University of Osnabrück• "Fundamentals of Marketing" from Lübeck 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)

Page 29: Course Wikibook

25

Chapter 11: Starter Kit: Tools for theHTML5 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 15 January 2007

Stable release 4.3.6 (December 18, 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 avirtualization software package for x86 and AMD64/Intel64-based computers from Oracle Corporation as part of itsfamily of virtualization products. It was created by innotek GmbH, purchased in 2008 by Sun Microsystems, andnow developed by Oracle. It is installed on an existing host operating system as an application; this host applicationallows additional guest operating systems, each known as a Guest OS, to be loaded and run, each with its own virtualenvironment.

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

Page 30: Course Wikibook

VirtualBox 26

derivations of Windows, Linux, BSD, OS/2, Solaris and others. Since release 3.2.0, VirtualBox also allows limitedvirtualization 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 WDDMdriver included in the guest additions; this allows Windows Aero to be enabled along with Direct3D support.

History

Logo ofVirtualBox 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 tothe VirtualBox Personal Use and Evaluation License (PUEL). In January 2007, based on counselby LiSoG, innotek GmbH released VirtualBox Open Source Edition (OSE) as free andopen-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 invirtualization and OS/2 ports of products from Connectix which were later acquired byMicrosoft. Specifically, innotek developed the “additions” code in both Microsoft Virtual PC and Microsoft VirtualServer, 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".

LicensingWith version 4 of VirtualBox, released in December 2010, the core package is free software released under GNUGeneral Public License version 2 (GPLv2). This is the fully featured package, excluding some proprietarycomponents not available under GPLv2. These components provide support for USB 2.0 devices, Remote DesktopProtocol (RDP) and Preboot Execution Environment (PXE) for Intel cards and are released as a separate "VirtualBoxOracle VM VirtualBox extension pack" under a proprietary Personal Use and Evaluation License (PUEL), whichpermits 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, andtheir friends and family, use the software. Oracle does not care if that use is for commercial or non-commercialpurposes. Oracle would consider it non-personal use, for example, if a network administrator installed many copiesof the software on many different machines, on behalf of many different end-users. That type of situation wouldrequire purchasing a special volume license.

Prior to version 4, there were two different packages of the VirtualBox software. The full package was offered freeunder the PUEL, with licenses for other commercial deployment purchasable from Oracle. A second package calledthe VirtualBox Open Source Edition (OSE) was released under GPLv2. This removed the same proprietarycomponents not available under GPLv2.

Although VirtualBox has experimental support for Mac OS X guests, the end user license agreement of Mac OS Xdoes not permit the operating system to run on non-Apple hardware, enforced within the operating system by calls tothe Apple System Management Controller (SMC) in all Apple machines, which verifies the authenticity of thehardware.

Page 31: Course Wikibook

VirtualBox 27

Emulated environment

Running Ubuntu Live CD with Oracle VMVirtualBox on Ubuntu

Users of VirtualBox can load multiple guest OSs under a single hostoperating-system (host OS). Each guest can be started, paused andstopped independently within its own virtual machine (VM). The usercan independently configure each VM and run it under a choice ofsoftware-based virtualization or hardware assisted virtualization if theunderlying host hardware supports this. The host OS and guest OSsand applications can communicate with each other through a numberof mechanisms including a common clipboard and a virtualizednetwork facility. Guest VMs can also directly communicate with eachother if configured to do so.

Software-based virtualization

In the absence of hardware-assisted virtualization, VirtualBox adopts a standard software-based virtualizationapproach. 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 hosthardware. 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 beforeits first execution to identify problematic instructions and then calls the Patch Manager (PATM) to perform in-situpatching. This replaces the instruction with a jump to a VM-safe equivalent compiled code fragment in hypervisormemory.

•• 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 faultoccurs. VirtualBox also contains a dynamic recompiler, based on QEMU to recompile any real mode or protectedmode 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 virtualizationVirtualBox 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 atring 0 in VMX non-root mode rather than in ring 1.

VirtualBox supports some guests (including 64-bit guests, SMP guests and certain proprietary OSs) only on hostswith hardware-assisted virtualization.

Device virtualizationThe 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 thehost 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, aswell as its own native format. VirtualBox can also connect to iSCSI targets and to raw partitions on the host, usingeither as virtual hard disks. VirtualBox emulates IDE (PIIX4 and ICH6 controllers), SCSI, SATA (ICH8Mcontroller) and SAS controllers to which hard drives can be attached.

Page 32: Course Wikibook

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 DVDimage 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 thatincreases video performance and includes additional features, such as automatically adjusting the guest resolutionwhen 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 networkinghardware 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 requiresspecial 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. Bridgednetworking via a host network adapter or virtual networks between guests can also be configured. Up to 36 networkadapters 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. Theclosed-source extension pack adds a USB 2.0 controller and, if VirtualBox acts as an RDP server, it can also useUSB devices on the remote RDP client as if they were connected to the host, although only if the client supports thisVirtualBox-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

Page 33: Course Wikibook

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 extensionpack that can be installed on top of the base product. As part of this change, additional components of VirtualBoxwere 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.5 GB 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 oroff, 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

Page 34: Course Wikibook

VirtualBox 30

The extension packSome 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 applianceA 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 avirtual machine and packaging that into an image creates a virtual appliance. Like software appliances, virtualappliances are intended to eliminate the installation, configuration and maintenance costs associated with runningcomplex stacks of software.

A virtual appliance is not a complete virtual machine platform, but rather a software image containing a softwarestack designed to run on a virtual machine platform which may be a Type 1 or Type 2 hypervisor. Like a physicalcomputer, a hypervisor is merely a platform for running an operating system environment and does not provideapplication software itself.

Many virtual appliances provide a Web page user interface to permit their configuration. A virtual appliance isusually built to host a single application; it therefore represents a new way to deploy applications on a network.

File formatsVirtual appliances are provided to the user or customer as files, via either electronic downloads or physicaldistribution. The file format most commonly used is the Open Virtualization Format (OVF). The DistributedManagement 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 computingVirtualization solves a key problem in the grid computing arena - namely, the reality that any sufficiently large gridwill inevitably consist of a wide variety of heterogeneous hardware and operating system configurations. Addingvirtual appliances into the picture allows for extremely rapid provisioning of grid nodes and importantly, cleanlydecouples the grid operator from the grid consumer by encapsulating all knowledge of the application within thevirtual appliance.

Page 35: Course Wikibook

Virtual appliance 31

Relationship to infrastructure as a service cloud computingVirtual appliances are critical resources in infrastructure as a service cloud computing. The file format of the virtualappliance is the concern of the cloud provider and usually not relevant to the cloud user even though the cloud usermay be the owner of the virtual appliance. However, challenges may arise with the transfer of virtual applianceownership or transfer of virtual appliances between cloud data centers. In this case, virtual appliance copy orexport/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 adirect 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 operatingsystem infrastructure provider from the application stack provider, virtual appliances allow economies of scale onthe one side to be leveraged by the economy of simplicity on the other. Traditional approaches to SaaS, such as thattouted by Salesforce.com, leverage shared infrastructure by forcing massive change and increased complexity on thesoftware 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 theAmazon Machine Image format. Amazon EC2 reduces the cost-barrier to the point where it becomes feasible to haveeach customer of a hosted SaaS solution provisioned with their own virtual appliance instance(s) rather than forcingthem to share common instances. Prior to EC2, single-tenant hosted models were too expensive, leading to thefailure of many early ASP offerings.

Furthermore, in contrast to the multi-tenancy approaches to SaaS, a virtual appliance can also be deployedon-premises for customers that need local network access to the running application, or have security requirementsthat a third-party hosting model does not meet. The underlying virtualization technology also allows for rapidmovement of virtual appliances instances between physical execution environments. Traditional approaches to SaaSfix 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/ )

Page 36: Course Wikibook

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 amountsof data over the Internet. BitTorrent is one of the most common protocols for transferring large files, andpeer-to-peer networks have been estimated to collectively account for approximately 43% to 70% of all Internettraffic (depending on geographical location) as of February 2009[2]. In November 2004, BitTorrent was responsiblefor 35% of all Internet traffic. As of February 2013, BitTorrent was responsible for 3.35% of all worldwidebandwidth, more than half of the 6% of total bandwidth dedicated to file sharing.[3]

Page 37: Course Wikibook

BitTorrent 33

Programmer Bram Cohen, a former University at Buffalo graduate student in Computer Science, designed theprotocol 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 officialclient released by Bittorrent, Inc.

As of 2009, BitTorrent reportedly had about the same number of active users online as viewers of YouTube andFacebook combined. As of January 2012[2], BitTorrent is utilized by 150 million active users (according toBitTorrent, Inc.). Based on this figure, the total number of monthly BitTorrent users can be estimated at more than aquarter of a billion.

Description

The middle computer is acting as a seed toprovide a file to the other computers which act as

peers.

The BitTorrent protocol can be used to reduce the server and networkimpact of distributing large files. Rather than downloading a file froma single source server, the BitTorrent protocol allows users to join a"swarm" of hosts to download and upload from each othersimultaneously. The protocol is an alternative to the older singlesource, multiple mirror sources technique for distributing data, and canwork over networks with lower bandwidth. Using the BitTorrentprotocol, several basic computers, such as home computers, canreplace large servers while efficiently distributing files to manyrecipients. This lower bandwidth usage also helps prevent large spikesin internet traffic in a given area, keeping internet speeds higher for allusers in general, regardless of whether or not they use the BitTorrentprotocol.

A user who wants to upload a file first creates a small torrentdescriptor 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 torrentdescriptor file can give it to their own BitTorrent nodes which, acting as peers or leechers, download it byconnecting 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 itbecomes a source (of that piece) for other peers, relieving the original seed from having to send that piece to everycomputer or user wishing a copy. With BitTorrent, the task of distributing the file is shared by those who want it; itis entirely possible for the seed to send only a single copy of the file itself and eventually distribute to an unlimitednumber of peers.

Each piece is protected by a cryptographic hash contained in the torrent descriptor. This ensures that anymodification of the piece can be reliably detected, and thus prevents both accidental and malicious modifications ofany of the pieces received at other nodes. If a node starts with an authentic copy of the torrent descriptor, it canverify 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 samesize throughout a single download (for example a 10 MB file may be transmitted as ten 1 MB Pieces or as forty256 KB Pieces). Due to the nature of this approach, the download of any file can be halted at any time and beresumed at a later date, without the loss of previously downloaded information, which in turn makes BitTorrentparticularly useful in the transfer of larger files. This also enables the client to seek out readily available pieces anddownload 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.

Page 38: Course Wikibook

BitTorrent 34

When a peer completely downloads a file, it becomes an additional seed. This eventual shift from peers to seedersdetermines the overall "health" of the file (as determined by the number of times a file is available in its completeform).

The distributed nature of BitTorrent can lead to a flood like spreading of a file throughout many peer computernodes. As more peers join the swarm, the likelihood of a complete successful download by any particular nodeincreases. Relative to traditional Internet distribution schemes, this permits a significant reduction in the originaldistributor's hardware and bandwidth resource costs.

Distributed downloading protocols in general provide redundancy against system problems, reduces dependence onthe original distributor[4] and provides sources for the file which are generally transient and therefore harder to traceby those who would block distribution compared to the situation provided by limiting availability of the file to afixed host machine (or even several).

One such example of BitTorrent being used to reduce the distribution cost of file transmission is in the BOINCClient-Server system. If a BOINC distributed computing application needs to be updated (or merely sent to a user) itcan do so with little impact on the BOINC Server.

OperationA 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 computerrunning 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 filecontains metadata about the files to be shared and about the tracker, the computer that coordinates the filedistribution. Peers that want to download the file must first obtain a torrent file for it and connect to the specifiedtracker, 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 istypical 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 classicdownloading 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 classicdownloads are sequential.

Taken together, these differences allow BitTorrent to achieve much lower cost to the content provider, much higherredundancy, and much greater resistance to abuse or to "flash crowds" than regular server software. However, thisprotection, theoretically, comes at a cost: downloads can take time to rise to full speed because it may take time forenough peer connections to be established, and it may take time for a node to receive sufficient data to become aneffective uploader. This contrasts with regular downloads (such as from an HTTP server, for example) that, whilemore 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 downloador "streaming playback". However, comments made by Bram Cohen in January 2007 suggest that streaming torrentdownloads will soon be commonplace and ad supported streaming appears to be the result of those comments. InJanuary 2011 Cohen demonstrated an early version of BitTorrent streaming, saying the feature was projected to beavailable by summer 2011. As of 2013, this new BitTorrent streaming protocol is available for beta testing.

Page 39: Course Wikibook

BitTorrent 35

Creating and publishing torrentsThe peer distributing a data file treats the file as a number of identically sized pieces, usually with byte sizes of apower of 2, and typically between 32 kB and 16 MB each. The peer creates a hash for each piece, using the SHA-1hash function, and records it in the torrent file. Pieces with sizes greater than 512 kB will reduce the size of a torrentfile for a very large payload, but is claimed to reduce the efficiency of the protocol. When another peer later receivesa particular piece, the hash of the piece is compared to the recorded hash to test that the piece is error-free. Peers thatprovide 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 .torrent. Torrent files have an "announce" section, which specifies theURL of the tracker, and an "info" section, containing (suggested) names for the files, their lengths, the piece lengthused, and a SHA-1 hash code for each piece, all of which are used by clients to verify the integrity of the data theyreceive.

Torrent files are typically published on websites or elsewhere, and registered with at least one tracker. The trackermaintains lists of the clients currently participating in the torrent. Alternatively, in a trackerless system (decentralizedtracking) every peer acts as a tracker. Azureus was the first[citation needed] BitTorrent client to implement such asystem through the distributed hash table (DHT) method. An alternative and incompatible DHT system, known asMainline 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 intentionallyplaced in the info section of the torrent so that it cannot be disabled or removed without changing the identity of thetorrent. The purpose of the flag is to prevent torrents from being shared with clients that do not have access to thetracker. The flag was requested for inclusion in the official specification in August, 2008, but has not been acceptedyet. Clients that have ignored the private flag were banned by many trackers, discouraging the practice.

Downloading torrents and sharing filesUsers find a torrent of interest, by browsing the web or by other means, download it, and open it with a BitTorrentclient. The client connects to the tracker(s) specified in the torrent file, from which it receives a list of peers currentlytransferring pieces of the file(s) specified in the torrent. The client connects to those peers to obtain the variouspieces. 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 arandom order to increase the opportunity to exchange data, which is only possible if two peers have different piecesof the file.

The effectiveness of this data exchange depends largely on the policies that clients use to determine to whom to senddata. Clients may prefer to send data to peers that send data back to them (a tit for tat scheme), which encourages fairtrading. But strict policies often result in suboptimal situations, such as when newly joined peers are unable toreceive any data because they don't have any pieces yet to trade themselves or when two peers with a goodconnection between them do not exchange data simply because neither of them takes the initiative. To counter theseeffects, the official BitTorrent client program uses a mechanism called "optimistic unchoking", whereby the clientreserves a portion of its available bandwidth for sending pieces to random peers (not necessarily known goodpartners, so called preferred peers) in hopes of discovering even better partners and to ensure that newcomers get achance 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 inorder to complete their downloads. The seed arrival, in turn, may take long to happen (this is termed the seeder

Page 40: Course Wikibook

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 thefirst month. A strategy adopted by many publishers which significantly increases availability of unpopular contentconsists 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 possiblyprevious participants in a swarm from the tracker. This may expose users with insecure systems to attacks. It mayalso expose users to the risk of being sued, if they are distributing files without permission from the copyrightholder(s). However, there are ways to promote anonymity; for example, the OneSwarm project layersprivacy-preserving sharing mechanisms on top of the original BitTorrent protocol.

AdoptionA 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 theirprivate 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 ofdemos 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 theirMP3 "radio" programs. Specifically, Juice and Miro (formerly known as Democracy Player) support automaticprocessing of .torrent files from RSS feeds. Similarly, some BitTorrent clients, such as µTorrent, are able toprocess 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 (Canada's 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 beenvery positive, and NRK is planning to offer more content.

• The Dutch VPRO broadcasting organization released four documentaries in 2009 and 2010 under a CreativeCommons license using the content distribution feature of the Mininova tracker.

Page 41: Course Wikibook

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 todownload the desired file, allowing users without BitTorrent software to use the protocol. This is similar to theconcept 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 andthe 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 oftheir products (via HTTP, FTP etc.) to increase availability and to reduce load on their own servers, especiallywhen 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 thescientific 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 Hulucombined.

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 putthat number at roughly 35% of all traffic on the Internet.Wikipedia:Manual of Style/Dates and numbers#Preciselanguage The discrepancies in these numbers are caused by differences in the method used to measure P2P traffic onthe 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.

Page 42: Course Wikibook

BitTorrent 38

This is a known cause of some home routers ceasing to work correctly.

IndexingThe BitTorrent protocol provides no way to index torrent files. As a result, a comparatively small number ofwebsites have hosted a large majority of torrents, many linking to copyrighted material without the authorization ofcopyright holders, rendering those sites especially vulnerable to lawsuits. Several types of websites support thediscovery 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 oftorrent files. Users can typically also upload torrent files for content they wish to distribute. Often, these sites alsorun BitTorrent trackers for their hosted torrent files, but these two functions are not mutually dependent: a torrent filecould 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 mayalso 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 includeMininova, BTDigg, BTJunkie, Torrentz, The Pirate Bay, and isoHunt. These sites allow the user to ask for contentmeeting specific criteria (such as containing a given word or phrase) and retrieve a list of links to torrent filesmatching 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 achievableis 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 severalBitTorrent indices and search engines at once. DHT search engines monitors the DHT network and indexes torrentsvia metadata exchange from peers.

Recently some P2P, decentralized alternatives to Torrent search engines have emerged, see decentralized keywordsearch below.

Technologies built on BitTorrentThe BitTorrent protocol is still under development and may therefore still acquire new features and otherenhancements such as improved efficiency.

Distributed trackersOn May 2, 2005, Azureus 2.3.0.0 (now known as Vuze) was released, introducing support for "trackerless" torrentsthrough a system called the "distributed database." This system is a DHT implementation which allows the client touse torrents that do not have a working BitTorrent tracker. The following month, BitTorrent, Inc. released version4.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. Recentmeasurement shows users of Mainline DHT is from 10 million to 25 million, with a daily churn of at least 10million. Mainline DHT is arguably the largest realistic DHT in the world.

Current versions of the official BitTorrent client, µTorrent, BitComet, Transmission and BitSpirit all sharecompatibility 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 optionalapplication 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 trackerapproach and is used to describe some web resource. Currently, it is used for instant messaging. It is implementedusing a special messaging protocol and requires an appropriate plugin. Anatomic P2P is another approach, whichuses a decentralized network of nodes that route traffic to dynamic trackers.

Page 43: Course Wikibook

BitTorrent 39

Most BitTorrent clients also use Peer exchange (PEX) to gather peers in addition to trackers and DHT. Peerexchange checks with known peers to see if they know of any other peers. With the 3.0.5.0 release of Vuze, all majorBitTorrent clients now have compatible peer exchange.

Web seedingWeb seeding was implemented in 2006 as the ability of BitTorrent clients to download torrent pieces from an HTTPsource in addition to the swarm. The advantage of this feature is that a website may distribute a torrent for aparticular file or batch of files and make those files available for download from that same web server; this cansimplify long-term seeding and load balancing through the use of existing, cheap, web hosting setups. In theory, thiswould make using BitTorrent almost as easy for a web publisher as creating a direct HTTP download. In addition, itwould allow the "web seed" to be disabled if the swarm becomes too popular while still allowing the file to bereadily 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, theMainline BitTorrent client also supports web seeds, and the BitTorrent web site had a simple publishing tool thatcreates web seeded torrents. µTorrent added support for web seeds in version 1.7. BitComet added support for webseeds in version 1.14. This first specification requires running a web service that serves content by info-hash andpiece number, rather than filename.

The other specification is created by GetRight authors and can rely on a basic HTTP download space (using byteserving).

In September 2010, a new service named Burnbit was launched which generates a torrent from any URL usingwebseeding.

There are server-side solutions that provide initial seeding of the file from the webserver via standard BitTorrentprotocol and when the number of external seeders reach a limit, they stop serving the file from the original source.

RSS feedsA 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 forZiff-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 themto start the download. Then, I could find a trusted publisher of an Alias RSS feed, and "subscribe" to all newepisodes of the show, which would then start downloading automatically — like the "season pass" feature ofthe TiVo.

—Scott Raymond,  scottraymond.net

The RSS feed will track the content, while BitTorrent ensures content integrity with cryptographic hashing of alldata, 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 softwareclients 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 capableof 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 thetorrent community to Web 2.0 standards. Alongside this release is a first PHP application built using the API calledPEP, which will parse any Really Simple Syndication (RSS 2.0) feed and automatically create and seed a torrent foreach enclosure found in that feed.[15]

Page 44: Course Wikibook

BitTorrent 40

Throttling and encryptionSince 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 tothwart these efforts.

Protocol header encrypt (PHE) and Message stream encryption/Protocol encryption (MSE/PE) are features of someBitTorrent 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 asHTTP traffic.

Reports in August 2007 indicated that Comcast was preventing BitTorrent seeding by monitoring and interferingwith the communication between peers. Protection against these efforts is provided by proxying the client-trackertraffic 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 theethics 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 totraffic analysis. Thus, even with MSE/PE, it may be possible for an ISP to recognize BitTorrent and also todetermine that a system is no longer downloading but only uploading data, and terminate its connection by injectingTCP RST (reset flag) packets.

MultitrackerAnother unofficial feature is an extension to the BitTorrent metadata format proposed by John Hoffman andimplemented 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, ortiers, with a tracker randomly chosen from the top tier and tried, moving to the next tier if all the trackers in the toptier 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 searchEven with distributed trackers, a third party is still required to find a specific torrent. This is usually done in the formof a hyperlink from the website of the content owner or through indexing websites like isoHunt, Torrentz, BTDigg orThe 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 theBitTorrent 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 canroughly 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 forinexact strings, which could replace the functionality of a central indexing site. A year later, the same teamimplemented the system as a plugin for Vuze called Cubit and published a follow-up paper reporting its success.

Page 45: Course Wikibook

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 toeach other they exchange lists of all the torrents (name and info-hash) they have in the Torrent Share storage (torrentfiles 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 caneven maintain the list between sessions if instructed). At any time the user can search into that Torrent Collection listfor 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 downloadedby the querying client which can after that create and initiate a downloading task.

ImplementationsThe BitTorrent specification is free to use and many clients are open source, so BitTorrent clients have been createdfor 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 highbandwidth Internet connectivity (e.g., a datacenter) which can provide dramatic speed benefits over using BitTorrentfrom a regular home broadband connection.

Services such as ImageShack can download files on BitTorrent for the user, allowing them to download the entirefile by HTTP once it is finished.

The Opera web browser supports BitTorrent, as does Wyzo. BitLet allows users to download Torrents directly fromtheir 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 withinmanaged clients such as Pando.

DevelopmentAn unimplemented (as of February 2008[2]) unofficial feature is Similarity Enhanced Transfer (SET), a techniquefor 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 arean 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 bydevelopers with the BitTorrent file sharing system.

As of December 2008[2], BitTorrent, Inc. is working with Oversi on new Policy Discover Protocols that query theISP 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 loadsinto and out of the ISP's network.

Page 46: Course Wikibook

BitTorrent 42

Legal issuesThere has been much controversy over the use of BitTorrent trackers. BitTorrent metafiles themselves do not storefile contents. Whether the publishers of BitTorrent metafiles violate copyrights by linking to copyrighted materialwithout the authorization of copyright holders is controversial.

Various jurisdictions have pursued legal action against websites that host BitTorrent trackers. High-profile examplesinclude the closing of Suprnova.org, TorrentSpy, LokiTorrent, BTJunkie, Mininova, Demonoid and Oink's PinkPalace. The Pirate Bay torrent website, formed by a Swedish group, is noted for the "legal" section of its website inwhich 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 copyrightinfringement; 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 torrentswarms managed by PublicBT which had the most active downloaders. After excluding pornographic andunidentifiable 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 contentthrough BitTorrent.

In 2011, 18.8% of North American internet traffic was used by peer-to-peer networks which equates to 132 billionmusic 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 malwareSeveral studies on BitTorrent have indicated that a large portion of files available for download via BitTorrentcontain malware. In particular, one small sample indicated that 18% of all executable programs available fordownload contained malware. Another study claims that as much as 14.5% of BitTorrent downloads containzero-day malware, and that BitTorrent was used as the distribution mechanism for 47% of all zero-day malware theyhave 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.

Page 47: Course Wikibook

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). ISBN 978-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/ )

Page 48: Course Wikibook

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 Günter Kraft, Peter Elsayeh, Thomas Ludwig, Philipp Möhring

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 openbuildpack API originally developed by Heroku. Custom buildpack support has been announced for 2013. Theplatform supports multiple environments for production, staging or development for each app.

HistorycloudControl 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 VCfunding 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).

Page 49: Course Wikibook

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 7 April 2005

Stable release 1.8.5.2 (17 December 2013) [±] [2]

Preview release 1.8.5-rc3 (20 November 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 /ɡɪt/ is a distributed revision control and source code management (SCM) system withan emphasis on speed.[5] Git was initially designed and developed by Linus Torvalds for Linux kernel developmentin 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.

Page 50: Course Wikibook

Git (software) 46

HistoryGit development began after many developers of the Linux kernel chose to give up access to BitKeeper, aproprietary 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-engineeredthe BitKeeper protocols.

Torvalds wanted a distributed system that he could use like BitKeeper, but none of the available free systems met hisneeds, particularly in terms of performance. Torvalds took an example of an SCM system requiring thirty seconds toapply a patch and update all associated metadata, and noted that this would not scale to the needs of Linux kerneldevelopment, where syncing with fellow maintainers could require 250 such actions at a time. His goal was forpatches 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. Consideringperformance as well excluded this too. So, immediately after the 2.6.12-rc2 Linux kernel development release, he setout 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 manpage 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 asof 7 April. The first merge of multiple branches was done on 18 April. Torvalds achieved his performance goals; on29 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 toJunio 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.

DesignGit's design was inspired by BitKeeper and Monotone.[9] Git was originally designed as a low-level version controlsystem engine on top of which others could write front ends, such as Cogito or StGIT. The core Git project has sincebecome a complete version control system that is usable directly. While strongly influenced by BitKeeper, Torvaldsdeliberately attempted to avoid conventional approaches, leading to a unique design.[10]

CharacteristicsGit's design is a synthesis of Torvalds's experience with Linux in maintaining a large distributed developmentproject, along with his intimate knowledge of file system performance gained from the same project and the urgentneed 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 anon-linear development history. A core assumption in Git is that a change will be merged more often than it iswritten, as it is passed around various reviewers. Branches in git are very lightweight: A branch in git is only areference 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

Page 51: Course Wikibook

Git (software) 47

imported as additional development branches, and can be merged in the same way as a locally developedbranch.

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 accessGit 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 itwas an order of magnitude faster than some version-control systems, and fetching version history from alocally 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 uponthe complete development history leading up to that commit. Once it is published, it is not possible to changethe old versions without it being noticed. The structure is similar to a hash tree, but with additional data at thenodes 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 aroundthose programs.[12] Although most of those scripts have since been rewritten in C for speed and portability, thedesign 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 multiplealgorithms for completing it, culminating in telling the user that it is unable to complete the mergeautomatically 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 aregenerally a small fraction of the continuously growing history of wanted objects. Git will automaticallyperform garbage collection when enough loose objects have been created in the repository. Garbage collectioncan be called explicitly using git gc --prune.

Periodic explicit object packing

Git stores each newly created object as a separate file. Although individually compressed, this takes a greatdeal of space and is inefficient. This is solved by the use of packs that store a large number of objects in asingle file (or network byte stream) called packfile, delta-compressed among themselves. Packs arecompressed using the heuristic that files with the same name are probably similar, but do not depend on it forcorrectness. A corresponding index file is created for each packfile, telling the offset of each object in thepackfile. Newly created objects (newly added history) are still stored singly, and periodic repacking is requiredto maintain space efficiency. The process of packing the repository can be very computationally expensive. Byallowing objects to exist in the repository in a loose, but quickly generated format, git allows the expensivepack operation to be deferred until later when time does not matter (e.g. the end of the work day). Git doesperiodic repacking automatically but manual repacking is also possible with the git gc command. For dataintegrity, both packfile and its index have SHA-1 checksum inside, and also the file name of packfile containsa SHA-1 checksum. To check integrity, run the git fsck 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

Page 52: Course Wikibook

Git (software) 48

maintained this notion of a file having an identity across multiple revisions of a project. However, Torvalds rejectedthis concept. Consequently, Git does not explicitly record file revision relationships at any level below the sourcecode 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 ahistory of changes affecting a given file, Git must walk the global history and then determine whether eachchange modified that file. This method of examining history does, however, let Git produce with equal efficiencya single history showing the changes to an arbitrary set of files. For example, a subdirectory of the source treeplus 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 ofa file to identify its revision history, so moving or renaming a file is not possible without either interrupting itshistory, or renaming the history and thereby making the history inaccurate. Most post-CVS revision controlsystems solve this by giving a file a unique long-lived name (a sort of inode number) that survives renaming. Gitdoes not record such an identifier, and this is claimed as an advantage. Source code files are sometimes split ormerged as well as simply renamed, and recording this as a simple rename would freeze an inaccurate descriptionof what happened in the (immutable) history. Git addresses the issue by detecting renames while browsing thehistory of snapshots rather than recording it when making the snapshot.[14] (Briefly, given a file in revision N, afile of the same name in revision N−1 is its default ancestor. However, when there is no like-named file inrevision 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 toadjust 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 mergedtree of the common ancestors and uses that as the reference tree for the three-way merge. This has beenreported to result in fewer merge conflicts without causing mis-merges by tests done on actual merge commitstaken from Linux 2.6 kernel development history. Additionally this can detect and handle merges involvingrenames.

—Linus Torvalds

• octopus: This is the default when merging more than two heads.

Data structuresGit'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 ofversioning, but I really really designed it coming at the problem from the viewpoint of a filesystemperson (hey, kernels is what I do), and I actually have absolutely zero interest in creating a traditionalSCM system.

From this initial design approach, Git has developed the full set of features expected of a traditional SCM, withfeatures mostly being created as needed, then refined and extended over time.

Page 53: Course Wikibook

Git (software) 49

Some data flows and storage levels in the Gitrevision control system.

Git has two data structures: a mutable index (also called stage orcache) that caches information about the working directory and thenext revision to be committed; and an immutable, append-only objectdatabase.

The object database contains four types of objects:

• A blob (binary large object) is the content of a file. Blobs have nofile name, time stamps, or other metadata.

• A tree object is the equivalent of a directory. It contains a list of filenames, each with some type bits and the name of a blob or treeobject that is that file, symbolic link, or directory's contents. Thisobject 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-levelsource 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 toanother object. Most commonly, it is used to store a digital signature of a commit object corresponding to aparticular 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'sname. The object is put into a directory matching the first two characters of its hash. The rest of the hash is used asthe file name for that object.

Git stores each revision of a file as a unique blob. The relationships between the blobs can be found throughexamining the tree and commit objects. Newly added objects are stored in their entirety using zlib compression. Thiscan consume a large amount of disk space quickly, so objects can be combined into packs, which use deltacompression to save space, storing blobs as their changes relative to other blobs.

Git servers typically listen on TCP port 9418.

ImplementationsGit 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 onmultiple platforms including Microsoft Windows, Linux, Mac OS X, and BSD. It has bindings for manyprogramming languages, including Ruby, Python and Haskell. It is used as the underlying Git implementation inMicrosoft's Team Foundation Service and Visual Studio.

The Plastic SCM versioning system contains its own implementation of the Git protocol, to allow Plastic SCMclients to interoperate with remote Git repositories.

The Perforce version management system also supports Git clients. Perforce can make its versioned contentavailable as Git repositories using the git+ssh and smart HTTP transports, and these repositories can be used as Gitremotes from any Git client.

JS-Git is a JavaScript implementation of a subset of Git.[15]

Page 54: Course Wikibook

Git (software) 50

AdoptionThe Eclipse Foundation reported in its annual community survey that as of May 2013, more than 36% ofprofessional software developers use Git as their primary source control system, compared with 27.6% in 2012 and12.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 UKpermanent 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 supportfor 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 git-blame 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

Page 55: Course Wikibook

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. ISBN 978-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. ISBN 978-1-4493-2586-2. Retrieved 30 July 2013.

External links• Official website (http:/ / gitscm. com)

Page 56: Course Wikibook

52

Chapter 12: REST Architectural Style forMobile Web Applications

Representational state transferRepresentational state transfer (REST) is an architectural style consisting of a coordinated set of constraintsapplied to components, connectors, and data elements, within a distributed hypermedia system. REST ignores thedetails of component implementation and protocol syntax in order to focus on the roles of components, theconstraints 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 doctoraldissertation at UC Irvine.

REST has been applied to describe desired web architecture, to identify existing problems, to compare alternativesolutions, 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 otherdistributed-computing specifications such as SOAP.

HistoryThe REST architectural style was developed by W3C Technical Architecture Group (TAG) in parallel with HTTP1.1, based on the existing design of HTTP 1.0. The World Wide Web represents the largest implementation of asystem conforming to the REST architectural style.

Architectural PropertiesThe 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 ofconnector semantics, improves the effectiveness of performance tuning, and increases the scalability of pureserver components. Layered system constraints allow intermediaries—proxies, gateways, and firewalls—to beintroduced at various points in the communication without changing the interfaces between components, thusallowing 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 statelessbetween 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

Page 57: Course Wikibook

Representational state transfer 53

ConstraintsThe architectural properties of REST are realized by applying specific interaction constraints to components,connectors, and data elements. The formal REST constraints are:

Client–serverA 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 ofclient code is improved. Servers are not concerned with the user interface or user state, so that servers can besimpler and more scalable. Servers and clients may also be replaced and developed independently, as long asthe interface between them is not altered.

StatelessThe client–server communication is further constrained by no client context being stored on the serverbetween 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 serverto another service such as a database to maintain a persistent state for a period of time and allowauthentication. The client begins sending requests when it is ready to make the transition to a new state. Whileone or more requests are outstanding, the client is considered to be in transition. The representation of eachapplication state contains links that may be used the next time the client chooses to initiate a newstate-transition.

CacheableAs 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 tofurther requests. Well-managed caching partially or completely eliminates some client–server interactions,further improving scalability and performance.

Layered systemA client cannot ordinarily tell whether it is connected directly to the end server, or to an intermediary along theway. Intermediary servers may improve system scalability by enabling load-balancing and by providing sharedcaches. 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 asJavaScript. "Code on demand" is the only optional constraint of the REST architecture.

Uniform InterfaceThe uniform interface constraint is fundamental to the design of any REST service. The uniform interfacesimplifies and decouples the architecture, which enables each part to evolve independently. The four guidingprinciples 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

Page 58: Course Wikibook

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 enoughinformation 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, whichparser 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 bythe 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 thosedescribed in representations previously received from the server.

One can characterise applications conforming to the REST constraints described in this section as "RESTful". If aservice 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 ofdistributed hypermedia system to have desirable emergent properties, such as performance, scalability, simplicity,modifiability, visibility, portability, and reliability.

ConceptRepresentational 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 byselecting links (state transitions), resulting in the next page (representing the next state of the application) beingtransferred 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 architecturesmay be based on other Application Layer protocols if they already provide a rich and uniform vocabulary forapplications based on the transfer of meaningful representational state. RESTful applications maximize the use of theexisting, well-defined interface and other built-in capabilities provided by the chosen network protocol, andminimize the addition of new application-specific features on top of it.

Vocabulary re-use vs. its arbitrary extension: HTTP and SOAPIn addition to URIs; Internet media types; request and response codes; etc., HTTP has a vocabulary of operationscalled request methods, most notably:

GET

POST

PUT

DELETE

REST uses these operations and other existing features of the HTTP protocol. For example, layered proxy andgateway 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-specificoperations that supplant HTTP operations. An example could be:

getUsers()

Page 59: Course Wikibook

Representational state transfer 55

getNewUsersSince(date SinceDate)

savePurchaseOrder(string CustomerID, string PurchaseOrderID)

This additive vocabulary disregards many of HTTP's existing capabilities, such as authentication, caching, andcontent-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 principleAn important concept in REST is the existence of resources (sources of specific information), each of which isreferenced with a global identifier (e.g., a URI in HTTP). In order to manipulate these resources, components of thenetwork (user agents and origin servers) communicate via a standardized interface (e.g., HTTP) and exchangerepresentations of these resources (the actual documents conveying the information). For example, a resource thatrepresents 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 thecurve (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 sowithout "seeing past" its own request (referred to as "layering", another constraint of REST and a common principlein many other parts of information and networking architecture). Thus, an application can interact with a resource byknowing two things: the identifier of the resource and the action required—it does not need to know whether thereare caches, proxies, gateways, firewalls, tunnels, or anything else between it and the server actually holding theinformation. 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, plaintext, or any other content.

Applied to Web ServicesA 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 http://example.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 ashttp://example.com/resources

List the URIs andperhaps other details ofthe collection's members.

Replace the entirecollection withanothercollection.

Create a new entry in thecollection. The newentry's URI is assignedautomatically and isusually returned by theoperation.

Delete theentirecollection.

Page 60: Course Wikibook

Representational state transfer 56

Element URI, such ashttp://example.com/resources/item17

Retrieve a representationof the addressed memberof the collection,expressed in anappropriate Internetmedia type.

Replace theaddressedmember of thecollection, or if itdoesn't exist,create it.

Not generally used. Treatthe addressed member asa collection in its ownright and create a newentry in it.

Delete theaddressedmember of thecollection.

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 isan architectural style, unlike SOAP, which is a protocol. Even though REST is not a standard, a RESTfulimplementation such as the Web can use standards like HTTP, URI, XML, etc.

Public implementationsREST 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 SQLdatabases [13]

ObjectionsREST invites the client to specify the unique ID of a new item to be created in a collection managed by the server. Itis 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 avoidconflicts ensuring atomicity. Techniques for handling ensuing complications are deferred to the server. However, ameans of communication for the data created between the server and the client must be established. Such meanscould include, for instance, special headers or response body content when dealing with HTTP. Nevertheless, theREST architectural style does not specify which of these are to be employed.

Page 61: Course Wikibook

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], ISSN 1533-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 WebServices: 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, ISBN 978-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

Page 62: Course Wikibook

Create, read, update and delete 58

Create, read, update and deleteIn computer programming, create, read, update and delete (CRUD) (Sometimes called SCRUD with an "S" forSearch) are the four basic functions of persistent storage. Sometimes CRUD is expanded with the words retrieveinstead of read, modify instead of update, or destroy instead of delete. It is also sometimes used to describe userinterface conventions that facilitate viewing, searching, and changing information; often using computer-based formsand reports. The term was likely first popularized by James Martin in his 1983 book Managing the Data-baseEnvironment. The acronym may be extended to CRUDL to cover listing of large data sets which bring additionalcomplexity 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 applicationsThe 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 otherpersistence layers exist. CRUD functionality can be implemented with an object database, an XML database, flat textfiles, custom file formats, tape, or card, for example.

User interfaceCRUD is also relevant at the user interface level of most applications. For example, in address book software, thebasic 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 sofundamental, they are often documented and described under one comprehensive heading, such as "contactmanagement", "content management" or "contact maintenance" (or "document management" in general, dependingon the basic storage unit for the particular application).

Notes

Page 63: Course Wikibook

HATEOAS 59

HATEOASHATEOAS, an abbreviation for Hypermedia as the Engine of Application State, is a constraint of the RESTapplication architecture that distinguishes it from most other network application architectures. The principle is that aclient 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 ageneric understanding of hypermedia. In a service-oriented architecture (SOA), clients and servers interact through afixed 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 ServiceDescription 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 functionalityindependently.

DetailsA REST client enters a REST application through a simple fixed URL. All future actions the client may take arediscovered 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 byselecting from the links within a representation or by manipulating the representation in other ways afforded by itsmedia 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 thisunderstanding may be improved on the fly through "code-on-demand" provided to the client by the server.

OriginsThe HATEOAS constraint is an essential part of the "uniform interface" feature of REST, as defined in RoyFielding'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 onthe scale of decades: every detail is intended to promote software longevity and independent evolution. Many of theconstraints are directly opposed to short-term efficiency. Unfortunately, people are fairly good at short-term design,and usually awful at long-term design".

References

Page 64: Course Wikibook

Hypertext Transfer Protocol 60

Hypertext Transfer Protocol

Internetprotocol 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...

Page 65: Course Wikibook

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, hypermediainformation 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 protocolto exchange or transfer hypertext.

The standards development of HTTP was coordinated by the Internet Engineering Task Force (IETF) and the WorldWide Web Consortium (W3C), culminating in the publication of a series of Requests for Comments (RFCs), mostnotably 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 theWWW domain name label.

HTTP functions as a request-response protocol in the client-servercomputing model. A web browser, for example, may be the client andan application running on a computer hosting a web site may be theserver. The client submits an HTTP request message to the server. Theserver, which provides resources such as HTML files and othercontent, or performs other functions on behalf of the client, returns aresponse message to the client. The response contains completionstatus information about the request and may also contain requestedcontent in its message body.

A web browser is an example of a user agent (UA). Other types of useragent include the indexing software used by search providers (webcrawlers), voice browsers, mobile apps and other software thataccesses, consumes or displays web content.

HTTP is designed to permit intermediate network elements to improve or enable communications between clientsand servers. High-traffic websites often benefit from web cache servers that deliver content on behalf of upstreamservers to improve response time. Web browsers cache previously accessed web resources and reuse them whenpossible to reduce network traffic. HTTP proxy servers at private network boundaries can facilitate communicationfor clients without a globally routable address, by relaying messages with external servers.

Page 66: Course Wikibook

Hypertext Transfer Protocol 62

HTTP is an application layer protocol designed within the framework of the Internet Protocol Suite. Its definitionpresumes an underlying and reliable transport layer protocol,[2] and Transmission Control Protocol (TCP) iscommonly used. However HTTP can use unreliable protocols such as the User Datagram Protocol (UDP), forexample in Simple Service Discovery Protocol (SSDP).

HTTP resources are identified and located on the network by Uniform Resource Identifiers (URIs)—or, morespecifically, Uniform Resource Locators (URLs)—using the http or https URI schemes. URIs and hyperlinksin 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 ismade 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 latencyas the establishment of TCP connections presents considerable overhead.

History

Tim Berners-Lee

The term HyperText was coined by Ted Nelson who in turn wasinspired by Vannevar Bush's microfilm-based "memex". TimBerners-Lee first proposed the "WorldWideWeb" project — nowknown as the World Wide Web. Berners-Lee and his team arecredited with inventing the original HTTP along with HTML and theassociated technology for a web server and a text-based webbrowser. The first version of the protocol had only one method,namely GET, which would request a page from a server. Theresponse 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 extendedoperations, extended negotiation, richer meta-information, tied with a security protocol which became more efficientby 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.1based on the then developing RFC 2068 (called HTTP-NG) was rapidly adopted by the major browser developers inearly 1996. By March 1996, pre-standard HTTP/1.1 was supported in Arena, Netscape 2.0, Netscape Navigator Gold2.01, Mosaic 2.7,[citation needed] Lynx 2.5[citation needed], and in Internet Explorer 2.0[citation needed]. End-user adoptionof the new browsers was rapid. In March 1996, one web hosting company reported that over 40% of browsers in useon 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 RFC2068 was officially released in January 1997. Improvements and updates to the HTTP/1.1 standard were releasedunder RFC 2616 in June 1999.

HTTP sessionAn HTTP session is a sequence of network request-response transactions. An HTTP client initiates a request byestablishing a Transmission Control Protocol (TCP) connection to a particular port on a server (typically port 80; seeList 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 itsown. The body of this message is typically the requested resource, although an error message or other informationmay also be returned.

Page 67: Course Wikibook

Hypertext Transfer Protocol 63

Request methods

An HTTP 1.1 request made using telnet. Therequest, response headers and response body are

highlighted.

HTTP defines methods (sometimes referred to as verbs) to indicate thedesired action to be performed on the identified resource. What thisresource represents, whether pre-existing data or data that is generateddynamically, depends on the implementation of the server. Often, theresource corresponds to a file or the output of an executable residingon 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 andCONNECT. By being specified in these documents their semantics arewell known and can be depended upon. Any client can use any methodand the server can be configured to support any combination ofmethods. If a method is unknown to an intermediate it will be treatedas an unsafe and non-idempotent method. There is no limit to the number of methods that can be defined and thisallows for future methods to be specified without breaking existing infrastructure. For example, WebDAV defined 7new methods and RFC5789 specified the PATCH method.

GET

Requests a representation of the specified resource. Requests using GET should only retrieve data and shouldhave no other effect. (This is also true of some other HTTP methods.) The W3C has published guidanceprinciples on this distinction, saying, "Web application design should be informed by the above principles, butalso 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 responsebody. This is useful for retrieving meta-information written in response headers, without having to transportthe entire content.

POST

Requests that the server accept the entity enclosed in the request as a new subordinate of the web resourceidentified by the URI. The data POSTed might be, as examples, an annotation for existing resources; amessage for a bulletin board, newsgroup, mailing list, or comment thread; a block of data that is the result ofsubmitting 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 existingresource, it is modified; if the URI does not point to an existing resource, then the server can create theresource 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 byintermediate servers.

OPTIONS

Returns the HTTP methods that the server supports for the specified URL. This can be used to check thefunctionality of a web server by requesting '*' instead of a specific resource.

CONNECT

Page 68: Course Wikibook

Hypertext Transfer Protocol 64

Converts the request connection to a transparent TCP/IP tunnel, usually to facilitate SSL-encryptedcommunication (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 theOPTIONS method.[citation needed]

Safe methodsSome methods (for example, HEAD, GET, OPTIONS and TRACE) are defined as safe, which means they areintended only for information retrieval and should not change the state of the server. In other words, they should nothave side effects, beyond relatively harmless effects such as logging, caching, the serving of banner advertisementsor incrementing a web counter. Making arbitrary GET requests without regard to the context of the application's stateshould therefore be considered safe. By contrast, methods such as POST, PUT and DELETE are intended for actionsthat may cause side effects either on the server, or external side effects such as financial transactions or transmissionof email. Such methods are therefore not usually used by conforming web robots or web crawlers; some that do notconform tend to make requests without regard to context or consequences. Despite the prescribed safety of GETrequests, in practice their handling by the server is not technically limited in any way. Therefore, careless ordeliberate programming can cause non-trivial changes on the server. This is discouraged, because it can causeproblems for Web caching, search engines and other automated agents, which can make unintended changes on theserver.

Idempotent methods and web applicationsMethods PUT and DELETE are defined to be idempotent, meaning that multiple identical requests should have thesame effect as a single request (Note that idempotence refers to the state of the system after the request hascompleted, so while the action the server takes (e.g. deleting a record) or the response code it returns may bedifferent on subsequent requests, the system state will be the same every time). Methods GET, HEAD, OPTIONSand TRACE, being prescribed as safe, should also be idempotent, as HTTP is a stateless protocol. In contrast, thePOST method is not necessarily idempotent, and therefore sending an identical POST request multiple times mayfurther 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 insending another request, or they did not receive adequate feedback that their first request was successful. While webbrowsers may show alert dialog boxes to warn users in some cases where reloading a page may re-submit a POSTrequest, it is generally up to the web application to handle cases where a POST request should not be submitted morethan once. Note that whether a method is idempotent is not enforced by the protocol or web server. It is perfectlypossible to write a web application in which (for example) a database insert or other non-idempotent action istriggered by a GET or other request. Ignoring this recommendation, however, may result in undesirableconsequences, if a user agent assumes that repeating the same request is safe when it isn't.

Page 69: Course Wikibook

Hypertext Transfer Protocol 65

SecurityImplementing methods such as TRACE, TRACK and DEBUG are considered potentially insecure by some securityprofessionals 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 thesemethods as being security issues. TRACK and DEBUG are not valid HTTP 1.1 verbs.

Status codesIn HTTP/1.0 and since, the first line of the HTTP response is called the status line and includes a numeric statuscode (such as "404") and a textual reason phrase (such as "Not Found"). The way the user agent handles theresponse primarily depends on the code and secondarily on the response headers. Custom status codes can be usedsince, if the user agent encounters a code it does not recognize, it can use the first digit of the code to determine thegeneral class of the response.

Also, the standard reason phrases are only recommendations and can be replaced with "local equivalents" at the webdeveloper's discretion. If the status code indicated a problem, the user agent might display the reason phrase to theuser to provide further information about the nature of the problem. The standard also allows the user agent toattempt to interpret the reason phrase, though this might be unwise since the standard explicitly specifies that statuscodes are machine-readable and reason phrases are human-readable. HTTP status code is primarily divided into fivegroups 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 connectionsIn HTTP/0.9 and 1.0, the connection is closed after a single request/response pair. In HTTP/1.1 akeep-alive-mechanism was introduced, where a connection could be reused for more than one request. Suchpersistent connections reduce request latency perceptibly, because the client does not need to re-negotiate the TCP3-Way-Handshake connection after the first request has been sent. Another positive side effect is that in general theconnection 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.1introduced 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 eachresponse. Another improvement to the protocol was byte serving, where a server transmits just the portion of aresource explicitly requested by a client.

HTTP session stateHTTP is a stateless protocol. A stateless protocol does not require the HTTP server to retain information or statusabout each user for the duration of multiple requests. However, some web applications implement states or serverside sessions using for instance HTTP cookies or Hidden variables within web forms.

Encrypted connectionsThe 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 TransferProtocol and the HTTP/1.1 Upgrade header. Browser support, for these latter two, is, however, nearlynon-existent,[citation needed] so HTTP Secure is the dominant method of establishing an encrypted HTTP connection.

Page 70: Course Wikibook

Hypertext Transfer Protocol 66

Request messageThe request message consists of the following:

• A request line, for example GET /images/logo.png HTTP/1.1, which requests a resource called/images/logo.png from the server.

• Request Headers, such as Accept-Language: en•• An empty line.•• An optional message body.

The request line and headers must all end with <CR><LF> (that is, a carriage return character followed by a linefeed character). The empty line must consist of only <CR><LF> 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 clientsbefore the HTTP/1.0 specification in RFC 1945.[4]

Response messageThe response message consists of the following:

• A Status-Line (for example HTTP/1.1 200 OK, which indicates that the client's request succeeded)• Response Headers, such as Content-Type: text/html•• An empty line•• An optional message body

The Status-Line and headers must all end with <CR><LF> (a carriage return followed by a line feed). The emptyline must consist of only <CR><LF> and no other whitespace.

Example sessionBelow is a sample conversation between an HTTP client and an HTTP server running on www.example.com, port80.

Client requestGET /index.html HTTP/1.1

Host: www.example.com

A client request (consisting in this case of the request line and only one header) is followed by a blank line, so thatthe 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 responseHTTP/1.1 200 OK

Date: Mon, 23 May 2005 22:38:34 GMT

Server: Apache/1.3.3.7 (Unix) (Red-Hat/Linux)

Last-Modified: Wed, 08 Jan 2003 23:11:55 GMT

ETag: "3f80f-1b6-3e1cb03b"

Content-Type: text/html; charset=UTF-8

Content-Length: 131

Connection: close

Page 71: Course Wikibook

Hypertext Transfer Protocol 67

<html>

<head>

<title>An Example Page</title>

</head>

<body>

Hello World, this is a very simple HTML document.

</body>

</html>

The ETag (entity tag) header is used to determine if a cached version of the requested resource is identical to thecurrent version of the resource on the server. Content-Type specifies the Internet media type of the data conveyed bythe HTTP message, while Content-Length indicates its length in bytes. The HTTP/1.1 webserver publishes its abilityto respond to requests for certain byte ranges of the document by setting the header Accept-Ranges: bytes. This isuseful, if the client needs to have only certain portions[5] of a resource sent by the server, which is called byteserving. When Connection: close is sent in a header, it means that the web server will close the TCP connectionimmediately 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 withoutContent-Length reads content until the socket is closed.

A Content-Encoding like gzip can be used to compress the transmitted data.

Alternatives to HTTPHistorically, 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

Page 72: Course Wikibook

Roy Fielding 68

Roy Fielding

Roy Fielding speaking at OSCON08

Roy Thomas Fielding (born 1965) is anAmerican computer scientist, one of the principalauthors of the HTTP specification, an authorityon computer network architecture and co-founderof the Apache HTTP Server project.

In 1999, he was named to the MIT TechnologyReview TR100 as one of the top 100 innovatorsin the world under the age of 35. He received adoctorate from the University of California,Irvine in 2000.

Contributions

Architectural Styles and the Design ofNetwork-based Software Architectures, Fielding'sdoctoral dissertation, describes RepresentationalState Transfer (REST) as a key architecturalprinciple of the World Wide Web, and received alarge amount of attention. People now frequentlyhold up REST as an approach to developing Webservices, as an alternative to otherdistributed-computing specifications such asSOAP. Fielding has also been heavily involved inthe development of HTML and UniformResource Identifiers. Fielding was a co-founder of the Apache HTTP Server project and was a member of the interimOpenSolaris Boards until he resigned from the community in 2008, disappointed that Sun would not let thecommunity influence development decisions. He was the chair of the Apache Software Foundation for its first threeyears and remains a member of its board of directors. Currently he works as a Principal Scientist at Adobe Systemsin San Jose, California.

In September 2012, he came under fireWikipedia:Please clarify when he committed a patch to the Apache HTTPServer that would disable the ability to set the Do Not Track setting of IE10 in response to the news that Microsoftwould make this the default option.[citation needed]

Waka protocolBetween 2002 and 2006 Fielding worked on 'Waka, an application protocol intended as "a binary, token-basedreplacement for HTTP." It was "designed to match the efficiency of the REST architectural style." The wakaprotocol 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 noton 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

Page 73: Course Wikibook

Roy Fielding 69

•• Uniform syntax regardless of type and direction• Extensible via URIs•• Client-side macros

PersonalHe describes himself as "...part Maori, Kiwi, Yank, Irish, Scottish, British, and California beach bum...". Fieldingwas 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

Page 74: Course Wikibook

70

Chapter 13: Interactive Exercises withJavaScript at Codecademy

Codecademy

Codecademy

Codecademy homepage on March 3, 2013

Type Private

Headquarters New York City, United States

Area served 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 includingHTML 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 andTechCrunch.

Each individual who joins has their own profile. To motivate users to participate, the site offers feedback, badges forcompleting exercises, as well as a function that keeps track of a user's total score and total day streak, and displays itto others. There are also CSS and HTML glossaries available within each tutorial. The site allows anyone to createand publish a new course using a Course Creator tool.

Codecademy also provides a forum where enthusiasts, beginners, and advanced coders can come together. There arefour main topics: Web (HTML, CSS & JS), Ruby, Python, and Miscellaneous.

Page 75: Course Wikibook

Codecademy 71

HistoryCodecademy was founded in 2011 by Zach Sims and Ryan Bubinski. Sims dropped out of Columbia University tofocus on launching a venture, while Bubinski graduated from Columbia with a degree in computer science andbiophysics. The company, headquartered in New York City, raised $2.5 million in Series A funding in October 2011and $10 million in Series B funding in June 2012. The latest round of funding was led by Index Ventures.

Code YearCode Year is a free Codecademy program for anyone who is interested to learn how to program. The programintends to help people follow through on a New Year's Resolution to learn how to program, by introducing a newcourse for every week in 2012. Over 450,000 people took courses in 2012, and Codecademy continued the programinto 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 (March 22, 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

Page 76: Course Wikibook

JavaScript 72

JavaScript

Filename extension .js

Internet media type application/javascript

text/javascript (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, implementationsallow client-side scripts to interact with the user, control the browser, communicate asynchronously, and alter thedocument content that is displayed.[2] It has also become common in server-side programming, game developmentand the creation of desktop applications.

JavaScript is a prototype-based scripting language with dynamic typing and has first-class functions. Its syntax wasinfluenced by C. JavaScript copies many names and naming conventions from Java, but the two languages areotherwise unrelated and have very different semantics. The key design principles within JavaScript are taken fromthe 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 (notablyNode.js) have also increased the popularity of JavaScript for server-side web applications.

Page 77: Course Wikibook

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 NetscapeJavaScript was originally developed by Brendan Eich. While battling with Microsoft over the Web, Netscapeconsidered 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 lightweightinterpreted language that would complement Java by appealing to nonprofessional programmers, like Microsoft'sVisual Basic (see JavaScript and Java).

Although it was developed under the name Mocha, the language was officially called LiveScript when it first shippedin beta releases of Netscape Navigator 2.0 in September 1995, but it was renamed JavaScript[4] when it was deployedin the Netscape browser version 2.0B3.

The change of name from LiveScript to JavaScript roughly coincided with Netscape adding support for Javatechnology in its Netscape Navigator web browser. The final choice of name caused confusion, giving theimpression that the language was a spin-off of the Java programming language, and the choice has beencharacterized by many as a marketing ploy by Netscape to give JavaScript the cachet of what was then the hot newweb programming language.

There is a common misconception that the JavaScript language was influenced by Cmm (C-minus-minus), an earlierweb page scripting language developed by Nombas.[5][6][7] Brendan Eich, however, had never heard of Cmm beforehe created LiveScript.[8] Nombas did pitch their embedded web page scripting to Netscape, though web pagescripting was not a new concept, as shown by ViolaWWW.[9] Nombas later switched to offering JavaScript insteadof Cmm in their ScriptEase product and was part of the TC39 group that standardized ECMAScript.[10][11]

Server-side JavaScriptNetscape introduced an implementation of the language for server-side scripting (SSJS) with Netscape EnterpriseServer, first released in December, 1994 (soon after releasing JavaScript for browsers). Since the mid-2000s, therehas been a proliferation of server-side JavaScript implementations. Node.js is one recent notable example ofserver-side JavaScript being used in real-world applications.

Adoption by MicrosoftJavaScript very quickly gained widespread success as a client-side scripting language for web pages. Microsoftintroduced JavaScript support in its own web browser, Internet Explorer, in version 3.0, released in August1996.Wikipedia:Verifiability Microsoft's webserver, Internet Information Server, introduced support for server-sidescripting in JavaScript with release 3.0 (1996). Microsoft started to promote webpage scripting using the umbrellaterm Dynamic HTML.

Microsoft's JavaScript implementation was later renamed JScript to avoid trademark issues. JScript added new datemethods to fix the Y2K-problematic methods in JavaScript, which were based on Java's java.util.Date class.

Page 78: Course Wikibook

JavaScript 74

StandardizationIn November 1996, Netscape announced that it had submitted JavaScript to Ecma International for consideration asan 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, somemodifications were made to adapt it to the ISO/IEC-16262 standard, and the second edition was released. The thirdedition 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 completedand no fourth edition was released.[12] The fifth edition was released in December 2009. The current edition of theECMAScript standard is 5.1, released in June 2011.

Later developmentsJavaScript has become one of the most popular programming languages on the web. Initially, however, manyprofessional programmers denigrated the language because its target audience consisted of web authors and othersuch "amateurs", among other reasons. The advent of Ajax returned JavaScript to the spotlight and brought moreprofessional 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 bythe proliferation of server-side JavaScript platforms.

In January 2009, the CommonJS project was founded with the goal of specifying a common standard library mainlyfor JavaScript development outside the browser.

TrademarkToday, "JavaScript" is a trademark of Oracle Corporation. It is used under license for technology invented andimplemented by Netscape Communications and current entities such as the Mozilla Foundation.

FeaturesThe following features are common to all conforming ECMAScript implementations, unless explicitly specifiedotherwise.

Imperative and structuredJavaScript supports much of the structured programming syntax from C (e.g., if statements, while loops,switch statements, etc.). One partial exception is scoping: C-style block scoping is not supported. Instead,JavaScript has function scoping (although, block scoping using the let keyword was added in JavaScript 1.7). LikeC, JavaScript makes a distinction between expressions and statements. One syntactic difference from C is automaticsemicolon insertion, in which the semicolons that terminate statements can be omitted.[13]

Page 79: Course Wikibook

JavaScript 75

DynamicDynamic typing

As in most scripting languages, types are associated with values, not with variables. For example, a variable xcould be bound to a number, then later rebound to a string. JavaScript supports various ways to test the type ofan object, including duck typing.[14]

Object based

JavaScript is almost entirely object-based. JavaScript objects are associative arrays, augmented withprototypes (see below). Object property names are string keys. They support two equivalent syntaxes: dotnotation (obj.x = 10) and bracket notation (obj['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) canbe enumerated using a for...in loop. JavaScript has a small number of built-in objects such asFunction and Date.

Run-time evaluation

JavaScript includes an eval function that can execute statements provided as strings at run-time.

FunctionalFirst-class functions

Functions are first-class; they are objects themselves. As such, they have properties and methods, such as.call() and .bind(). A nested function is a function defined within another function. It is created eachtime the outer function is invoked. In addition, each created function forms a lexical closure: the lexical scopeof the outer function, including any constants, local variables and argument values, becomes part of theinternal state of each inner function object, even after execution of the outer function concludes.[15]

Prototype-basedPrototypes

JavaScript uses prototypes where many other object oriented languages use classes for inheritance. It ispossible 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 willcreate an instance of a prototype, inheriting properties and methods from the constructor (including propertiesfrom the Object prototype). ECMAScript 5 offers the Object.create method, allowing explicitcreation of an instance without automatically inheriting from the Object prototype (older environments canassign the prototype to null). The constructor's prototype property determines the object used for thenew object's internal prototype. New methods can be added by modifying the prototype of the object used as aconstructor. JavaScript's built-in constructors, such as Array or Object, also have prototypes that can bemodified. While it is possible to modify the Object prototype, it is generally considered bad practicebecause most objects in JavaScript will inherit methods and properties from the Object prototype and theymay 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 methoddefinition. Rather, the distinction occurs during function calling; when a function is called as a method of anobject, the function's local this keyword is bound to that object for that invocation.

Page 80: Course Wikibook

JavaScript 76

Implicit and Explicit DelegationJavaScript is a Delegation Language.

Functions as Roles (Traits and Mixins)

JavaScript natively supports various function based implementations of Role patterns like Traits[16] andMixins.[17] Such a function defines additional behavior by at least one method bound to the this keywordwithin its function body. A Role then has to be delegated explicitly via call or apply to objects thatneed 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 alreadyhappens every time the prototype chain is walked in order to e.g. find a method that might be related to but isnot directly owned by an object. Once the method was found it gets called within this objects context. Thusinheritance in JavaScript is covered by a delegation automatism that is bound to the prototype property ofconstructor functions.

MiscellaneousRun-time environment

JavaScript typically relies on a run-time environment (e.g. a web browser) to provide objects and methods bywhich scripts can interact with the environment (e.g. a webpage DOM). It also relies on the run-timeenvironment to provide the ability to include/import scripts (e.g. HTML <script> elements). This is not alanguage 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 formalparameters and also through the local arguments object. Variadic functions can also be created by usingthe apply method.

Array and object literals

Like many scripting languages, arrays and objects (associative arrays in other languages) can each be createdwith 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 powerfulsyntax for text manipulation that is more sophisticated than the built-in string functions.

Vendor-specific extensionsJavaScript 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 catch 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 let keyword• array and object destructuring (limited form of pattern matching)• concise function expressions (function(args) expr)• ECMAScript for XML (E4X), an extension that adds native XML support to ECMAScript

Page 81: Course Wikibook

JavaScript 77

SyntaxAs 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 andexperimental features considered for inclusion into future ECMAScript editions, are documented here.

Simple examplesVariables in JavaScript can be defined using the var keyword:

var x; //defines the variable x, although no value is assigned to it by

default

var y = 2; //defines the variable y and assigns the value 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 ECMAScriptspecification in edition 5.1 mentions:

... indeed, there are no provisions in this specification for input of external data or output of computedresults.

However, most runtime environments have a console object that can be used to print output. Here is a minimalistHello World program:

console.log("Hello world!");

A simple recursive function:

function factorial(n) {

if (n === 0) {

return 1;

}

return n * factorial(n - 1);

}

Anonymous function (or lambda) syntax and closure example:

var displayClosure = function() {

var count = 0;

return function () {

return ++count;

};

}

var inc = displayClosure();

inc(); // returns 1

inc(); // returns 2

inc(); // returns 3

Variadic function demonstration (arguments is a special variable).

var sum = function() {

var i, x = 0;

for (i = 0; i < arguments.length; ++i) {

x += arguments[i];

}

Page 82: Course Wikibook

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 getValue = (function(v) {

return function() {return v;};

})(v);

v = 2;

getValue(); // 1

More advanced exampleThis sample code displays various JavaScript features.

/* Finds the lowest common multiple (LCM) of two numbers */

function LCMCalculator(x, y) { // constructor function

var checkInt = function (x) { // inner function

if (x % 1 !== 0) {

throw new TypeError(x + " is not an integer"); // throw an

exception

}

return x;

};

this.a = checkInt(x)

// semicolons ^^^^ are optional, a newline is enough

this.b = checkInt(y);

}

// The prototype of object instances created by a constructor is

// that constructor's "prototype" property.

LCMCalculator.prototype = { // object literal

constructor: LCMCalculator, // when reassigning a prototype, set

the constructor property appropriately

gcd: function () { // method that calculates the greatest common

divisor

// Euclidean algorithm:

var a = Math.abs(this.a), b = Math.abs(this.b), t;

if (a < b) {

// swap variables

t = b;

b = a;

a = t;

}

while (b !== 0) {

t = b;

Page 83: Course Wikibook

JavaScript 79

b = a % b;

a = t;

}

// Only need to calculate GCD once, so "redefine" this method.

// (Actually not redefinition—it's defined on the instance

itself,

// so that this.gcd refers to this "redefinition" instead of

LCMCalculator.prototype.gcd.)

// Also, 'gcd' === "gcd", this['gcd'] === this.gcd

this['gcd'] = function () {

return a;

};

return a;

},

// Object property names can be specified by strings delimited by

double (") or single (') quotes.

lcm : function () {

// Variable names don't collide with object properties, e.g.

|lcm| is not |this.lcm|.

// not using |this.a * this.b| to avoid FP precision issues

var lcm = this.a / this.gcd() * this.b;

// Only need to calculate lcm once, so "redefine" this method.

this.lcm = function () {

return lcm;

};

return lcm;

},

toString: function () {

return "LCMCalculator: a = " + this.a + ", b = " + this.b;

}

};

// Define generic output function; this implementation only works for

web browsers

function output(x) {

document.body.appendChild(document.createTextNode(x));

document.body.appendChild(document.createElement('br'));

}

// Note: Array's map() and forEach() are defined in JavaScript 1.6.

// They are used here to demonstrate JavaScript's inherent functional

nature.

[[25, 55], [21, 56], [22, 58], [28, 56]].map(function (pair) { // array

literal + mapping function

return new LCMCalculator(pair[0], pair[1]);

}).sort(function (a, b) { // sort with this comparative function

return a.lcm() - b.lcm();

Page 84: Course Wikibook

JavaScript 80

}).forEach(function (obj) {

output(obj + ", gcd = " + obj.gcd() + ", lcm = " + obj.lcm());

});

The following output should be displayed in the browser window.

LCMCalculator: a = 28, b = 56, gcd = 28, lcm = 56

LCMCalculator: a = 21, b = 56, gcd = 7, lcm = 168

LCMCalculator: a = 25, b = 55, gcd = 5, lcm = 275

LCMCalculator: a = 22, b = 58, gcd = 2, lcm = 638

Use in web pagesThe most common use of JavaScript is to write functions that are embedded in or included from HTML pages andthat 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, asocial 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 respondto user actions quickly, making an application more responsive. Furthermore, JavaScript code can detect user actionswhich HTML alone cannot, such as individual keystrokes. Applications such as Gmail take advantage of this: muchof the user-interface logic is written in JavaScript, and JavaScript dispatches requests for information (such as thecontent 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 thatinterprets JavaScript source code and executes the script accordingly. The first JavaScript engine was created byBrendan 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 toECMA-262 Edition 3. The Rhino engine, created primarily by Norris Boyd (formerly of Netscape; now at Google) isa 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 "hostobjects" to represent the Document Object Model (DOM) in JavaScript. The web server is another common hostenvironment. A JavaScript webserver would typically expose host objects representing HTTP request and responseobjects, 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 targetlanguage for many frameworks in other languages, even though JavaScript was never intended to be such alanguage. Despite the performance limitations inherent to its dynamic nature, the increasing speed of JavaScriptengines has made the language a surprisingly feasible compilation target.

Page 85: Course Wikibook

JavaScript 81

Example scriptBelow is a minimal example of a standards-conforming web page containing JavaScript (using HTML 5 syntax) andthe DOM:

<!DOCTYPE html>

<meta charset="utf-8">

<title>Minimal Example</title>

<h1 id="header">This is JavaScript</h1>

<script>

document.body.appendChild(document.createTextNode('Hello World!'));

var h1 = document.getElementById('header'); // holds a reference to the <h1> tag

h1 = document.getElementsByTagName('h1')[0]; // accessing the same <h1> element

</script>

<noscript>Your browser either does not support JavaScript, or has it turned off.</noscript>

Compatibility considerationsBecause JavaScript runs in widely varying environments, an important part of testing and debugging is to test andverify 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, browserimplementations 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 beexecuted correctly by most browsers; failing that, they can write code that checks for the presence of certain browserfeatures and behaves differently if they are not available.[21] In some cases, two browsers may both implement afeature but with different behavior, and authors may find it practical to detect what browser is running and changetheir script's behavior to match.[22][23] Programmers may also use libraries or toolkits which take browser differencesinto 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 extrafeatures that the JavaScript would have added. An alternative approach that many find preferable is to first authorcontent using basic technologies that work in all browsers, then enhance the content for users that have JavaScriptenabled. This is known as progressive enhancement.

Page 86: Course Wikibook

JavaScript 82

AccessibilityAssuming that the user has not disabled its execution, client-side web JavaScript should be written to enhance theexperiences of visitors with visual or physical disabilities, and certainly should avoid denying information to thesevisitors.[24]

Screen readers, used by the blind and partially sighted, can be JavaScript-aware and so may access and read the pageDOM after the script has altered it. The HTML should be as concise, navigable and semantically rich as possiblewhether the scripts have run or not. JavaScript should not be totally reliant on mouse or keyboard specific eventsbecause a user may be physically unable to use these input devices. For this reason, device-agnostic events such asonfocus and onchange are preferable to device-centric events such as onmouseover and onkeypress inmost cases.[24]

JavaScript should not be used in a way that is confusing or disorienting to any web user. For example, using script toalter or disable the normal functionality of the browser, such as by changing the way the "back" or "refresh" buttonswork, is usually best avoided. Equally, triggering events that the user may not be aware of reduces the user's sense ofcontrol 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 whereissues become matters of debate and opinion, and where compromises are necessary in the end. However, useragents and assistive technologies are constantly evolving and new guidelines and relevant information arecontinually being published on the web.[24]

SecurityJavaScript and the DOM provide the potential for malicious authors to deliver scripts to run on a client computer viathe web. Browser authors contain this risk using two restrictions. First, scripts run in a sandbox in which they canonly perform web-related actions, not general-purpose programming tasks like creating files. Second, scripts areconstrained by the same origin policy: scripts from one web site do not have access to information such asusernames, passwords, or cookies sent to another site. Most JavaScript-related security bugs are breaches of eitherthe same origin policy or the sandbox.

There are subsets of general JavaScript — ADsafe, Secure ECMA Script (SES) — that provide greater level ofsecurity, 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 vulnerabilitiesA 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, toinclude a malicious script in the webpage presented to a victim. The script in this example can then access thebanking application with the privileges of the victim, potentially disclosing secret information or transferring moneywithout the victim's authorization. A solution to XSS vulnerabilities is to use HTML escaping whenever displayinguntrusted data.

Some browsers include partial protection against reflected XSS attacks, in which the attacker provides a URLincluding malicious script. However, even users of those browsers are vulnerable to other XSS attacks, such as thosewhere the malicious code is stored in a database. Only correct design of Web applications on the server side can fullyprevent 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

Page 87: Course Wikibook

JavaScript 83

attacker's site will carry the same legitimate login credentials as requests initiated by the user. In general, the solutionto CSRF is to require an authentication value in a hidden form field, and not only in the cookies, to authenticate anyrequest 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 thevictim'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 privateinformation

•• 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 secretembedded 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 sentto 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 agreedto its terms of service, or filters invalid characters out of fields that should only contain numbers, it must do so onthe server, not only the client.

•• Scripts can be selectively disabled, so JavaScript can't be relied on to prevent operations such as right-clicking onan image to save it.

•• It is extremely bad practice to embed sensitive information such as passwords in JavaScript because it can beextracted 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 asbuffer overflows. These flaws can allow attackers to write scripts which would run any code they wish on the user'ssystem. This code is not by any means limited to another JavaScript application. For example, a buffer overrunexploit 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 MicrosoftInternet 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 theInternet Explorer process with limited privileges.[31] Google Chrome similarly confines its page renderers to theirown "sandbox".

Sandbox implementation errors

Web browsers are capable of running JavaScript outside of the sandbox, with the privileges necessary to, forexample, 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 InternetExplorer[32] and Firefox.[33] In Windows XP Service Pack 2, Microsoft demoted JScript's privileges in InternetExplorer.[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 viablevector for a Trojan horse, although JavaScript Trojan horses are uncommon in practice.[35]

Page 88: Course Wikibook

JavaScript 84

Uses outside web pagesIn addition to web browsers and servers, JavaScript interpreters are embedded in a number of tools. Each of theseapplications provides its own object model which provides access to the host environment. The core JavaScriptlanguage 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 usingJavaScript.

• 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-centricprogramming model.

•• Apple's Logic Pro X digital audio workstation (DAW) software can create custom MIDI effects plugins usingJavaScript.

• 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, automaterepetitive 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 javax.script package in version 6 that includes a

JavaScript implementation based on Mozilla Rhino. Thus, Java applications can host scripts that access theapplication's variables and objects, much like web browsers host scripts that access a webpage's Document ObjectModel (DOM).[39]

• The Qt C++ toolkit includes a QtScript module to interpret JavaScript, analogous to Java's javax.scriptpackage.[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,

Page 89: Course Wikibook

JavaScript 85

and librsvg.[42]

• Late Night Software's JavaScript OSA (aka JavaScript for OSA, or JSOSA) is a freeware alternative toAppleScript for Mac OS X. It is based on the Mozilla 1.5 JavaScript implementation, with the addition of aMacOS 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 varioussystem-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 programminglanguage in 2013.

• The Mozilla platform, which underlies Firefox, Thunderbird, and some other web browsers, uses JavaScript toimplement 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 plainJavaScript and can be executed in any JS host supporting ECMAScript 3 or higher. The compiler is itself writtenin 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 toolsWithin JavaScript, access to a debugger becomes invaluable when developing large, non-trivial programs. Becausethere can be implementation differences between the various browsers (particularly within the Document ObjectModel), 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, closelyfollowed by Microsoft Script Editor (a component of Microsoft Office),[44] and finally the free Microsoft ScriptDebugger which is far more basic than the other two. The free Microsoft Visual Web Developer Express provides alimited version of the JavaScript debugging functionality in Microsoft Visual Studio. Internet Explorer has includeddeveloper 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. Firefoxalso 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 inGoogle Chrome.

Page 90: Course Wikibook

JavaScript 86

Some debugging aids are themselves written in JavaScript and built to run on the Web. An example is the programJSLint, developed by Douglas Crockford who has written extensively on the language. JSLint scans JavaScript codefor conformance to a set of standards and guidelines.

Version historyThe following table is based on information from multiple sources.

Version Release date Equivalent to NetscapeNavigator

MozillaFirefox

InternetExplorer

Opera Safari GoogleChrome

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 October1998

ECMA-262 1st + 2nd edition 4.06-4.7x 4.0 5

1.4 NetscapeServer

6

1.5 November2000

ECMA-262 3rd edition 6.0 1.0 5.5 (JScript5.5),

6 (JScript5.6),

7 (JScript5.7),

8 (JScript5.8)

7.0 3.0-5 1.0-10.0.666

1.6 November2005

1.5 + array extras + array andstring generics + E4X

1.5

1.7 October2006

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 5compliance

4 9 11.60

1.8.6Wikipedia:Disputedstatement

17

Legend:

Old version

Latest version

Page 91: Course Wikibook

JavaScript 87

Related languages and featuresJSON, or JavaScript Object Notation, is a general-purpose data interchange format that is defined as a subset ofJavaScript'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 onthe web. However, Mozilla-specific support for LiveConnect is scheduled to be phased out in the future in favor ofpassing on the LiveConnect handling via NPAPI to the Java 1.6+ plug-in (not yet supported on the Mac as of March2010[20]).[46] Most browser inspection tools, such as Firebug in Firefox, include JavaScript interpreters that can acton 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 languageAs JavaScript is the most widely supported client-side language that can run within a web browser, it has become anintermediate language for other languages to target. This has included both newly created languages and ports ofexisting languages. Some of these include:

• Objective-J, a superset of JavaScript that compiles to standard JavaScript. It adds traditional inheritance andSmalltalk/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 othergraphical 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 likearray comprehensions (also available in JavaScript since version 1.7) and pattern matching. Like Objective-J, itcompiles 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.

Page 92: Course Wikibook

JavaScript 88

JavaScript and JavaA common misconception is that JavaScript is similar or closely related to Java. It is true that both have a C-likesyntax (the C language being their most immediate common ancestor language). They also are both typicallysandboxed (when used inside a browser), and JavaScript was designed with Java's syntax and standard library inmind. In particular, all Java keywords were reserved in original JavaScript, JavaScript's standard library followsJava's naming conventions, and JavaScript's Math and Date objects are based on classes from Java 1.0, but thesimilarities end there.

The differences between the two languages are more prominent than their similarities. Java has static typing, whileJavaScript's typing is dynamic (meaning a variable can hold an object of any type and cannot be restricted). Java isloaded from compiled bytecode, while JavaScript is loaded as human-readable source code. Java's objects areclass-based, while JavaScript's are prototype-based. Finally, Java does not support functional programming, whileJavaScript 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)

Page 93: Course Wikibook

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. ISBN 1-59059-152-6.• Burns, Joe; Growney, Andree S. (2001). JavaScript Goodies. Pearson Education. ISBN 0-7897-2612-2.• Duffy, Scott (2003). How to do Everything with JavaScript. Osborne. ISBN 0-07-222887-3.• Flanagan, David; Ferguson, Paula (2006). JavaScript: The Definitive Guide (5th ed.). O'Reilly & Associates.

ISBN 0-596-10199-6.• Goodman, Danny; Eich, Brendan (2001). JavaScript Bible. John Wiley & Sons. ISBN 0-7645-3342-8.• Goodman, Danny; Markel, Scott (2003). JavaScript and DHTML Cookbook. O'Reilly & Associates.

ISBN 0-596-00467-2.• Harris, Andy (2001). JavaScript Programming for the Absolute Beginner. Premier Press. ISBN 0-7615-3410-5.• Haverbeke, Marijn (2011). Eloquent JavaScript. No Starch Press. ISBN 978-1593272821.• Heinle, Nick; Koman, Richard (1997). Designing with JavaScript. O'Reilly & Associates. ISBN 1-56592-300-6.• McDuffie, Tina Spain (2003). JavaScript Concepts & Techniques: Programming Interactive Web Sites. Franklin,

Beedle & Associates. ISBN 1-887902-69-4.• McFarlane, Nigel (2003). Rapid Application Development with Mozilla. Prentice Hall Professional Technical

References. ISBN 0-13-142343-6.• Powell, Thomas A.; Schneider, Fritz (2001). JavaScript: The Complete Reference. McGraw-Hill Companies.

ISBN 0-07-219127-9.• Shelly, Gary B.; Cashman, Thomas J.; Dorin, William J.; Quasney, Jeffrey J. (2000). JavaScript: Complete

Concepts and Techniques. Cambridge: Course Technology. ISBN 0-7895-6233-2.• Vander Veer, Emily A. (2004). JavaScript For Dummies (4th ed.). Wiley Pub. ISBN 0-7645-7659-3.

Page 94: Course Wikibook

JavaScript 90

• Watt, Andrew H.; Watt, Jonathan A.; Simon, Jinjer L. (2002). Teach Yourself JavaScript in 21 Days. PearsonEducation. ISBN 0-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–licensedeBook

• 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 alert 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

Page 95: Course Wikibook

JavaScript syntax 91

within modern web browsers, and that almost all web browsers provide the alert function, alert is used in theexamples.

OriginsBrendan Eich summarized the ancestry of the syntax in the first paragraph of the JavaScript 1.1 specification[1] asfollows:

JavaScript borrows most of its syntax from Java, but also inherits from Awk and Perl, with someindirect influence from Self in its object prototype system.

Basics

Case sensitivityJavaScript is case sensitive. It is common to start the name of a constructor with a capitalised letter, and the name ofa function or variable with a lower-case letter.

Whitespace and semicolonsSpaces, tabs and newlines used outside of string constants are called whitespace. Unlike C, whitespace in JavaScriptsource can directly impact semantics. Because of a technique called "automatic semicolon insertion" (ASI), somestatements that are well formed when a newline is parsed will be considered complete (as if a semicolon wereinserted just prior to the newline). Some authorities advise supplying statement-terminating semicolons explicitlybecause 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 fiverestricted 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, openparenthesis 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 joinedwith the previous one. This is known as a defensive semicolon, and is particularly recommended because code maybecome 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 anotherlibrary which omits a trailing semicolon, as this can result in ambiguity of the initial statement.

Page 96: Course Wikibook

JavaScript syntax 92

The five restricted productions are return, throw, break, continue, and post-increment/decrement. In all casesinserting 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 tokeep the value or label on the same line as the statement. This most often shows up in the return statement, whereone might return a large object literal, which might be accidentally placed starting on a new line. Forpost-increment/decrement, there is potential ambiguity with pre-increment/decrement, and again it is recommendedto simply keep these on the same line.

return

a + b;

// Returns undefined. Treated as:

// return;

// a + b;

// Should be written as:

// return a + b;

CommentsComment syntax is the same as in C++ and many other languages.

// a short, one-line comment

/* this is a long, multi-line comment

about my script. May it one day

be great. */

/* Comments /* may not be nested */ Syntax error */

VariablesVariables in standard JavaScript have no type attached, and any value can be stored in any variable. Variables aredeclared 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). Startingwith JavaScript 1.5, ISO 8859-1 or Unicode letters (or \uXXXX Unicode escape sequences) can be used inidentifiers. In certain JavaScript implementations, the at sign (@) can be used in an identifier, this is contrary to thespecifications and not supported in newer implementations. Variables are lexically scoped at function level (notblock level as in C), and this does not depend on order (forward declaration is not necessary): if a variable isdeclared 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 ashoisting.[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 thetop of the function, and a x = 1 assignment statement at that point in the middle of the function – only thedeclaration 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 tovariable statements, but in addition to hoisting the declaration, they also hoist the assignment – as if the entirestatement appeared at the top of the containing function – and thus forward reference is also possible: the location ofa function statement within an enclosing function is irrelevant.

Page 97: Course Wikibook

JavaScript syntax 93

Block scoping can be produced by wrapping the entire block in a function and then executing it; this is known as theimmediately-invoked function expression pattern.

Variables declared outside any function are global. If a variable is declared in a higher scope, it can be accessed bychild functions.

Here is an example of variable declarations and global values:

var x = 0; // A global variable, because it is not in any function

function f() {

var z = 'foxes', r = 'birds'; // 2 local variables

m = 'fish'; // global because it wasn't declared anywhere before

function child() {

var r = 'monkeys'; // This variable is local and does not affect

the "birds" r of the parent function.

z = 'penguins'; // The child function is able to access the

variables of the parent function, this is called closure.

}

twenty = 20; // This variable is declared on the next line, but

usable anywhere in the function, even before, as here

var twenty;

child();

return x; // We can use x here because it is global

}

f();

alert(z); // This line will raise a ReferenceError exception because

the value of z is no longer available

When JavaScript tries to resolve an identifier, it looks in the local function scope. If this identifier is not found, itlooks in the outer function that declared the local one, and so on along the scope chain until it reaches the globalscope 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 isnot found in the global scope, it will create the "variable" as a property of the global object.[4] As a consequence, avariable 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 namespacepollution.

Page 98: Course Wikibook

JavaScript syntax 94

Primitive data typesThe JavaScript language provides a handful of primitive data types. Some of the primitive data types also provide aset of named values that represent the extents of the type boundaries. These named values are described within theappropriate sections below.

UndefinedThe value of "undefined" is assigned to all uninitialized variables, and is also returned when checking for objectproperties 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 behaveunexpectedly in comparison to other types that evaluate to false in a logical context.

var test; // variable declared but not defined, ...

// ... set to value of undefined

var testObj = {};

alert(test); // test variable exists but value not ...

// ... defined, displays undefined

alert(testObj.myProp); // testObj exists, property does not, ...

// ... displays undefined

alert(undefined == null); // unenforced type during check, displays

true

alert(undefined === null); // enforce type during check, displays false

Note: There is no built-in language literal for undefined. Thus (x == undefined) is not a foolproof way tocheck whether a variable is undefined, because in versions before ECMAScript 5, it is legal for someone to writevar undefined = "I'm defined now";. A more robust approach is to compare using (typeof x ==='undefined').

Functions like this won't work as expected:

function isUndefined(x) { var u; return x === u; } // like this...

function isUndefined(x) { return x === void 0; } // ... or that

second one

function isUndefined(x) { return (typeof x) === "undefined"; } // ...

or that third one

Here, calling isUndefined(my_var) raises a ReferenceError if my_var is an unknown identifier, whereastypeof my_var === 'undefined' doesn't.

NullUnlike undefined, null is often set to indicate that something has been declared but has been defined to be empty. Ina 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 null (note case) is the single value. Assuch, when performing checks that enforced type checking, the null value will not equal other false types.Surprisingly, null is considered an object by typeof.

alert(null == undefined); // unenforced type during check,

displays true

alert(null === undefined); // enforce type during check,

displays false

Page 99: Course Wikibook

JavaScript syntax 95

alert(typeof null === 'object'); // true

NumberNumbers 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:

alert(0.2 + 0.1 == 0.3); // displays false

alert(0.94 - 0.01); // displays 0.9299999999999999

As a result, a routine such as the toFixed() method should be used to round numbers whenever they are formatted foroutput [5].

Numbers may be specified in any of these notations:

345; // an "integer", although there is only one numeric type in

JavaScript

34.5; // a floating-point number

3.45e2; // another floating-point, equivalent to 345

0377; // an octal integer equal to 255

0xFF; // a hexadecimal integer equal to 255, digits represented by

the ...

// ... letters A-F may be upper or lowercase

The extents +�, −� and NaN (Not a Number) of the number type may be obtained by two program expressions:

Infinity; // Positive Infinity (negative obtained with -Infinity for

instance)

NaN; // The Not-A-Number value, also returned as a failure 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 myString = "123.456";

var myNumber1 = Number(myString);

var myNumber2 = +myString;

When used as a constructor, a numeric wrapper object is created (though it is of little use):

myNumericWrapper = new Number(123.456);

StringA string in JavaScript is a sequence of characters. In JavaScript, strings can be created directly by placing the seriesof characters between double or single quotes.

var greeting = "Hello, world!";

var anotherGreeting = 'Greetings, people of Earth.';

You can access individual characters within a string using the charAt method (provided byString.prototype). This is the preferred way when accessing individual characters within a string because italso works in non-modern browsers:

Page 100: Course Wikibook

JavaScript syntax 96

var h = greeting.charAt(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 = greeting[0];

However, JavaScript strings are immutable:

greeting[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 = "world";

var compare1 = ("Hello, " +x == "Hello, world"); // Now compare1

contains true.

var compare2 = ("Hello, " +x == "hello, world"); // Now compare2

contains ...

// ... false since

the ...

// ... first

characters ...

// ... 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 = '"Hello, world!" he said.' // Just fine.

var x = ""Hello, world!" he said." // Not good.

var x = "\"Hello, world!\" he said." // That works by replacing " with

\"

It is possible to create a string using the String constructor:

var greeting = new String("Hello, world!");

These objects have a valueOf method returning the primitive string wrapped into them:

var s = new String("Hello !");

typeof s; // Is 'object'.

typeof s.valueOf(); // Is 'string'.

Equality between two String objects does not behave as with string primitives:

var s1 = new String("Hello !");

var s2 = new String("Hello !");

s1 == s2; // Is false, because they are two distinct objects.

s1.valueOf() == s2.valueOf(); // Is true.

Page 101: Course Wikibook

JavaScript syntax 97

Alerts

Alerts are a common Javascript feature.

Here, an example:

msgToAlrt = "This is a test message."

alert(msgToAlrt)

This will display a window with the contents you want. When making a crazy error program, this feature is for you.

BooleanJavaScript provides a Boolean data type with true and false literals. The typeof operator returns the string"boolean" for these primitive types. When used in a logical context, 0, -0, null, NaN, undefined, and theempty string ("") evaluate as false due to automatic type coercion. The complement evaluates as true,including the strings "0", "false" and any object (except null). Automatic type coercion by the equalitycomparison 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 aNumber type value. First, a mathematical value is derived from the string numeric literal. Next, this value isrounded to nearest Number type value.

Boolean

If one of the operands is a Boolean, the Boolean operand is converted to 1 if it is true or to 0 if it is false.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 .valueOf() or .toString()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 whenevaluated in a logical context, especially in regard to edge cases. The binary logical operators returned a Booleanvalue in early versions of JavaScript, but now they return one of the operands instead. The left–operand is returned ifit can be evaluated as: false, in the case of conjunction (a && b), or true, in the case of disjunction (a || b);otherwise the right–operand is returned. Automatic type coercion by the comparison operators may differ for casesof mixed boolean and number-compatible operands (including strings that can be evaluated as a number, or objectsthat can be evaluated as such a string) because the boolean operand will be compared as a numeric value. This maybe unexpected. An expression can be explicitly cast to a boolean primitive by doubling the logical negation operator(!!), using the Boolean() function, or using the conditional operator (c ? t : f).

<font size="8.50">

//Automatic type coercion

alert(true == 2 ); // false... true → 1 !== 2 ← 2alert(false == 2 ); // false... false → 0 !== 2 ← 2alert(true == 1 ); // true.... true → 1 === 1 ← 1alert(false == 0 ); // true.... false → 0 === 0 ← 0alert(true == "2"); // false... true → 1 !== 2 ← "2"alert(false == "2"); // false... false → 0 !== 2 ← "2"alert(true == "1"); // true.... true → 1 === 1 ← "1"alert(false == "0"); // true.... false → 0 === 0 ← "0"

Page 102: Course Wikibook

JavaScript syntax 98

alert(false == "" ); // true.... false → 0 === 0 ← ""alert(false == NaN); // false... false → 0 !== NaN

//Type checked comparison (no conversion of types and values)

alert(true === 1); // false... data types do not match

//Explicit type coercion

alert(true === !!2); // true.... data types and values match

alert(true === !!0); // false... data types match but values differ

alert( 1 ? true : false); // true.... only ±0 and NaN are “falsy” numbers

alert("0" ? true : false); // true.... only the empty string is “falsy”alert(Boolean({})); // true.... all objects are “truthy” except null</font>

The new operator can be used to create an object wrapper for a Boolean primitive. However, the typeof operatordoes not return "boolean" for the object wrapper, it returns "object". Because all objects evaluate as true, amethod such as .valueOf(), or .toString(), must be used to retrieve the wrapped value. For explicitcoercion to the Boolean type, Mozilla recommends that the Boolean() function (without new) be used inpreference to the Boolean object.

<font size="8.50">

var b = new Boolean(false); // Object false {}

var t = Boolean(b); // Boolean true

var f = Boolean(b.valueOf()); // Boolean false

var n = new Boolean(b); // Not recommended

n = new Boolean(b.valueOf()); // Preferred

if (0 || -0 || "" || null || undefined || b.valueOf() || !new Boolean()

|| !t) {

alert("Never this");

} else if ([] && {} && b && typeof b === "object" && b.toString() ===

"false") {

alert("Always this");

}

</font>

Native objectsThe JavaScript language provides a handful of native objects. JavaScript native objects are considered part of theJavaScript specification. JavaScript environment notwithstanding, this set of objects should always be available.

ArrayAn Array is a JavaScript object prototyped from the Array constructor specifically designed to store data valuesindexed by integer keys. Arrays, unlike the basic Object type, are prototyped with methods and properties to aid theprogrammer in routine tasks (for example, join, slice, and push).

As in the C family, arrays use a zero-based indexing scheme: A value that is inserted into an empty array by meansof the push method occupies the 0th index of the array.

Page 103: Course Wikibook

JavaScript syntax 99

var myArray = []; // Point the variable myArray to a newly

...

// ... created, empty Array

myArray.push("hello world"); // Fill the next empty index, in this case

0

alert(myArray[0]); // Equivalent to alert("hello world");

Arrays have a length property that is guaranteed to always be larger than the largest integer index used in thearray. It is automatically updated if one creates a property with an even larger index. Writing a smaller number to thelength property will remove larger indices.

Elements of Arrays may be accessed using normal object property access notation:

myArray[1]; // the 2nd item in myArray

myArray["1"];

The above two are equivalent. It's not possible to use the "dot"-notation or strings with alternative representations ofthe number:

myArray.1; // syntax error

myArray["01"]; // not the same as myArray[1]

Declaration of an array can use either an Array literal or the Array constructor:

myArray = [0, 1,, , 4, 5]; // array with length 6 and 6

elements, ...

// ... including 2 undefined elements

myArray = new Array(0, 1, 2, 3, 4, 5); // array with length 6 and 6

elements

myArray = new Array(365); // an empty array with length 365

Arrays are implemented so that only the elements defined use memory; they are "sparse arrays". SettingmyArray[10] = 'someThing' and myArray[57] = 'somethingOther' only uses space for thesetwo elements, just like any other object. The length 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 otherlanguages:

dog = {color: "brown", size: "large"};

dog["color"]; // results in "brown"

dog.color; // also results 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 witharrays-of-arrays.)

cats = [{color: "brown", size: "large"},

{color: "black", size: "small"}];

cats[0]["size"]; // results in "large"

dogs = {rover: {color: "brown", size: "large"},

spot: {color: "black", size: "small"}};

dogs["spot"]["size"]; // results in "small"

dogs.rover.color; // results in "brown"

Page 104: Course Wikibook

JavaScript syntax 100

DateA Date object stores a signed millisecond count with zero representing 1970-01-01 00:00:00 UT and a range of ±108

days. There are several ways of providing arguments to the Date constructor. Note that months are zero-based.

new Date() // create a new Date instance

representing the current time/date.

new Date(2010, 2, 1) // create a new Date instance

representing 2010-Mar-01 00:00:00

new Date(2010, 2, 1, 14, 25, 30) // create a new Date instance

representing 2010-Mar-01 14:25:30

new Date("2010-3-1 14:25:30") // create a new Date instance from a

String.

Methods to extract fields are provided, as well as a useful toString:

var d = new Date(2010, 2, 1, 14, 25, 30); // 2010-Mar-01 14:25:30

// Displays '2010-3-1 14:25:30':

alert(d.getFullYear() + '-' + (d.getMonth()+1) + '-' + d.getDate() + '

'

+ d.getHours() + ':' + d.getMinutes() + ':' + d.getSeconds());

// Built-in toString returns something like 'Mon Mar 01 2010 14:25:30

GMT-0500 (EST)':

alert(d);

ErrorCustom error messages can be created using the Error class:

throw new Error("Something went wrong.");

Nested within conditional statements, such instantiations can substitute for try/catch blocks:

var emailAddress = prompt("Please enter your e-mail address:", "");

if (!emailAddress || emailAddress.length == 0) {

throw new Error("Excuse me: You must enter your e-mail address to

continue.");

}

MathThe Math object contains various math-related constants (for example, π) and functions (for example, cosine). (Notethe "Math" object has no constructor, unlike Array or Date. All its methods are "static", AKA "class" methods.) Allthe trigonometric functions use angles expressed in radians, not degrees or grads.

Page 105: Course Wikibook

JavaScript syntax 101

Properties of the Math object

Property Returned valuerounded 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 valuerounded 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 ≤ 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): Math.pow(x, y) gives xy

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

Page 106: Course Wikibook

JavaScript syntax 102

Regular expression/expression/.test(string);

"string".search(/expression/);

"string".replace(/expression/,replacement);

// Here are some examples

if(/Tom/.test("My name is Tom")) alert("Hello Tom!");

alert("My name is Tom".search(/Tom/)); // == 11

(letters before Tom)

alert("My name is Tom".replace(/Tom/,"John")); // == "My

name is John"

Character classes

// \d - digit

// \D - non digit

// \s - space

// \S - non space

// \w - word char

// \W - non word

// [ ] - one of

// [^ ] - one not of

// - - range

if (/\d/.test('0')) alert('Digit');

if (/[0-9]/.test('6')) alert('Digit');

if (/[13579]/.test('1')) alert('Odd number');

if (/\S\S\s\S\S\S\S/.test('My name')) alert('Format OK');

if (/\w\w\w/.test('Tom')) alert('Hello Tom');

if (/[a-zA-Z]/.test('B')) alert('Letter');

Character matching

// A...Z a...z 0...9 - alphanumeric

// \u0000...\uFFFF - Unicode hexadecimal

// \x00...\xFF - ASCII hexadecimal

// \t - tab

// \n - new line

// \r - CR

// . - any character

// | - OR

if (/T.m/.test('Tom')) alert ('Hi Tom, Tam or Tim');

if (/A|B/.test("A")) alert ('A or B');

Page 107: Course Wikibook

JavaScript syntax 103

Repeaters

// ? - 0 or 1 match

// * - 0 or more

// + - 1 or more

// {n} - exactly n

// {n,} - n or more

// {0,n} - n or less

// {n,m} - range n to m

if (/ab?c/.test("ac")) alert("OK"); // match: "ac", "abc"

if (/ab*c/.test("ac")) alert("OK"); // match: "ac", "abc",

"abbc", "abbbc" etc.

if (/ab+c/.test("abc")) alert("OK"); // match: "abc", "abbc",

"abbbc" etc.

if (/ab{3}c/.test("abbbc")) alert("OK"); // match: "abbbc"

if (/ab{3,}c/.test("abbbc")) alert("OK"); // match: "abbbc", "abbbbc",

"abbbbbc" etc.

if (/ab{1,3}c/.test("abc")) alert("OK"); // match: "abc","abbc",

"abbbc"

Anchors

// ^ - string starts with

// $ - string ends with

if (/^My/.test("My name is Tom")) alert ("Hi!");

if (/Tom$/.test("My name is Tom")) alert ("Hi Tom!");

Subexpression

// ( ) - groups characters

if (/water(mark)?/.test("watermark")) alert("Here is water!"); //

match: "water", "watermark",

if (/(Tom)|(John)/.test("John")) alert("Hi Tom or John!");

Flags

// /g - global

// /i - ignore upper/lower case

// /m - allow matches to span multiple lines

alert("hi tom!".replace(/Tom/i,"John")); // == "hi John!"

alert("ratatam".replace(/ta/,"tu")); // == "ratutam"

alert("ratatam".replace(/ta/g,"tu")); // == "ratutum"

Page 108: Course Wikibook

JavaScript syntax 104

Advanced methods

my_array = my_string.split(my_delimiter);

// example

my_array = "dog,cat,cow".split(","); //

my_array==("dog","cat","cow");

my_array = my_string.match(my_expression);

// example

my_array = "We start at 11:30, 12:15 and 16:45".match(/\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 results = myRe.exec("The date and time are 2009-09-08 09:37:08.");

if (results) {

alert("Matched: " + results[0]); // Entire match

var my_date = results[1]; // First group == "2009-09-08"

var my_time = results[2]; // Second group == "09:37:08"

alert("It is " + my_time + " on " + my_date);

} else alert("Did not find a valid date!");

FunctionEvery 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

last in the argument list.

var add = new Function('x', 'y', 'return x+y');

var t = add(1, 2);

alert(t); //3

The add function above may also be defined using the following pattern.

function add(x, y) {

return x + y;

}

var t = add(1, 2);

alert(t); //3

A function instance has properties and methods.

function subtract(x, y) {

return x - y;

}

alert(subtract.length);//2,expected amount of arguments.

alert(subtract.toString());

/*

function subtract(x, y) {

Page 109: Course Wikibook

JavaScript syntax 105

return x - y;

}

*/

OperatorsThe '+' operator is overloaded: it is used for string concatenation and arithmetic addition. This may cause problemswhen inadvertently mixing strings and numbers. As a unary operator, it can convert a numeric string to a number.

// Concatenate 2 strings

alert('He' + 'llo'); // displays Hello

// Add two numbers

alert(2 + 6); // displays 8

// Adding a number and a string results in concatenation

alert(2 + '2'); // displays 22

alert('$' + 3 + 4); // displays $34, but $7 may have been expected

alert('$' + (3 + 4)); // displays $7

// Convert a string to a number

alert(+'2' === 2); // displays true

alert(+'Hello'); // displays NaN

ArithmeticJavaScript supports the following binary arithmetic operators:

+ Addition

- Subtraction

* Multiplication

/ Division (returns a floating-point value)

% Modulus (returns the remainder)

JavaScript supports the following unary arithmetic operators:

+ Unary conversion of string to number

- Unary negation (reverses the sign)

++ Increment (can be prefix or postfix)

-- Decrement (can be prefix or postfix)

var x = 1;

alert(++x); // displays: 2

alert(x++); // displays: 2; x becomes 3 then

alert(x); // displays: 3

alert(x--); // displays: 3; x becomes 2 then

alert(x); // displays: 2

alert(--x); // displays: 1

Page 110: Course Wikibook

JavaScript syntax 106

Assignment= Assign

+= Add and assign

-= Subtract and assign

*= Multiply and assign

/= Divide and assign

%= Modulus and assign

Assignment of primitive types

var x = 9;

x += 1;

alert(x); // displays: 10

x *= 30;

alert(x); // displays: 300

x /= 6;

alert(x); // displays: 50

x -= 3;

alert(x); // displays: 47

x %= 7;

alert(x); // displays: 5

Assignment of object types

var obj_1 = {a: 1}; // assign reference of newly created object to

variable obj_1

var obj_2 = {a: 0};

var obj_3 = obj_2; // obj_3 references the same object as obj_2 does

obj_2.a = 2;

alert(obj_1.a + " " + obj_2.a + " " + obj_3.a); // displays 1 2 2

obj_2 = obj_1; // obj_2 now references the same object as variable

obj_1

// obj_3 now the only reference to what obj_2

referenced

alert(obj_1.a + " " + obj_2.a + " " + obj_3.a); // displays 1 1 2

obj_2.a = 7;// modifies obj_1

alert(obj_1.a + " " + obj_2.a + " " + obj_3.a); // displays 7 7 2

Page 111: Course Wikibook

JavaScript syntax 107

Destructuring assignment

In Mozilla's JavaScript, since version 1.7, destructuring assignment allows the assignment of parts of data structuresto several variables at once. The left hand side of an assignment is a pattern that resembles an arbitrarily nestedobject/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];

alert(a + ',' + b); // displays: 3,4

e = {foo: 5, bar: 6, baz: ['Baz', 'Content']};

var arr = [];

({baz: [arr[0], arr[3]], foo: a, bar: b}) = e;

alert(a + ',' + b + ',' + arr); // displays: 5,6,Baz,,,Content

[a, b] = [b, a]; // swap contents of a and b

alert(a + ',' + b); // displays: 6,5

Comparison== Equal

!= Not equal

> Greater than

>= Greater than or equal to

< Less than

<= Less than or equal to

=== Identical (equal and of the same type)

!== Not identical

When comparing variables which are objects they are considered to be different if their objects are not the sameobject, even if the values of them are the same, so:

var obj1 = {a: 1};

var obj2 = {a: 1};

var obj3 = obj1;

alert(obj1 == obj2); //false

alert(obj3 == obj1); //true

See also String.

LogicalJavaScript provides four logical operators:

• unary negation (NOT = !a)• binary disjunction (OR = a || b) and conjunction (AND = a && b)• ternary conditional (c ? t : f)

In the context of a logical operation, any expression evaluates to true except the following:

• Strings: "", '',• Numbers: 0, -0, NaN,• Special: null, undefined,• Boolean: false.

The Boolean function can be used to explicitly convert to a primitive of type Boolean:

Page 112: Course Wikibook

JavaScript syntax 108

// Only empty strings return false

alert(Boolean("") === false);

alert(Boolean("false") === true);

alert(Boolean("0") === true);

// Only zero and NaN return false

alert(Boolean(NaN) === false);

alert(Boolean(0) === false);

alert(Boolean(-0) === false); // equivalent to -1*0

alert(Boolean(-2) === true );

// All objects return true

alert(Boolean(this) === true);

alert(Boolean({}) === true);

alert(Boolean([]) === true);

// These types return false

alert(Boolean(null) === false);

alert(Boolean(undefined) === false); // equivalent to Boolean()

The NOT operator evaluates its operand as a Boolean, and returns the negation. Using the operator twice in a row, asa double negative, explicitly converts an expression to a primitive of type Boolean:

alert( !0 === Boolean(!0)); alert(Boolean(!0) === !!1); alert(!!1

=== Boolean(1));

alert(!!0 === Boolean(0)); alert(Boolean(0) === !1); alert(!1

=== Boolean(!1));

alert(!"" === Boolean(!"")); alert(Boolean(!"") === !!"s"); alert(!!"s"

=== Boolean("s"));

alert(!!"" === Boolean("")); alert(Boolean("") === !"s"); alert(!"s"

=== Boolean(!"s"));

The ternary operator can also be used for explicit conversion:

alert([] == false); alert([] ? true : false); // “truthy”, but the comparison uses [].toString()

alert([0] == false); alert([0]? true : false); // [0].toString() == "0"

alert("0" == false); alert("0"? true : false); // "0" → 0 … (0==0) … 0 ← false

alert([1] == true); alert([1]? true : false); // [1].toString() == "1"

alert("1" == true); alert("1"? true : false); // "1" → 1 … (1==1) … 1 ← true

alert([2] != true); alert([2]? true : false); // [2].toString() == "2"

alert("2" != true); alert("2"? true : false); // "2" → 2 … (2!=1) … 1 ← true

Expressions that use features such as post–incrementation, (i++), have an anticipated side effect. JavaScriptprovides short-circuit evaluation of expressions; the right operand is only executed if the left operand does notsuffice to determine the value of the expression.

Page 113: Course Wikibook

JavaScript syntax 109

alert(a || b); // When a is true, there is no reason to evaluate b.

alert(a && b); // When a is false, there is no reason to evaluate b.

alert(c ? t : f); // When c is true, there is no reason to evaluate f.

In early versions of JavaScript and JScript, the binary logical operators returned a Boolean value (like mostC–derived programming languages). However, all contemporary implementations return one of their operandsinstead:

alert(a || b); // if a is true, return a, otherwise return b

alert(a && b); // if a is false, return a, otherwise return b

Programmers who are more familiar with the behavior in C might find this feature surprising, but it allows for amore concise expression of patterns like null coalescing:

var s = t || "(default)"; // assigns t, or the default value if t is

null, empty, etc.

BitwiseJavaScript supports the following binary bitwise operators:

& And

| Or

^ Xor

<< Shift left (zero fill)

>> Shift right (sign-propagating); copies of the leftmost bit (sign bit) are shifted in from the

left.

>>> Shift right (zero fill)

For positive numbers, >> and >>> yield the same result.

JavaScript supports the following unary bitwise operator:

~ Not (inverts the bits)

String= Assignment

+ Concatenation

+= Concatenate and assign

Examples

str = "ab" + "cd"; // "abcd"

str += "e"; // "abcde"

str2 = "2"+2 // "22", not "4" or 4.

Page 114: Course Wikibook

JavaScript syntax 110

Control structures

Compound statementsA pair of curly brackets { } and an enclosed sequence of statements constitute a compound statement, which canbe used wherever a statement can be used.

If ... elseif (expr) {

//statements;

} else if (expr2) {

//statements;

} else {

//statements;

}

this is also possible

if (exprA exprB) {

//statements;

} else if (expr2) {

//statements;

} else {

//statements;

}

Conditional operatorThe 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., theconditional operator is to expressions what if is to statements.

result = condition ? expression : alternative;

is the same as:

if (condition) {

result = expression;

} else {

result = alternative;

}

Unlike the if statement, the conditional operator cannot omit its "else-branch".

Switch statementThe syntax of the JavaScript Switch statement is as follows:

switch (expr) {

case SOMEVALUE:

//statements;

break;

case ANOTHERVALUE:

Page 115: Course Wikibook

JavaScript syntax 111

//statements;

break;

default:

//statements;

break;

}

• break; is optional; however, it is usually needed, since otherwise code execution will continue to the body ofthe next case block.

•• Add a break statement to the end of the last case as a precautionary measure, in case additional cases are addedlater.

•• Strings literal values can also be used for the case values.•• Expressions can be used instead of values.• case default: is optional.•• Braces are required.

For loopThe syntax of the JavaScript for loop is as follows:

for (initial; condition; loop statement) {

/*

statements will be executed every time

the for{} loop cycles, while the

condition is satisfied

*/

}

or

for (initial; condition; loop statement(iteration)) // one statement

For ... in loopThe syntax of the JavaScript For ... in loop is as follows:

for (var property_name in some_object) {

//statements using some_object[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 ECMAscriptstandard called "DontEnum", but in practice each browser returns a slightly different set of properties duringintrospection. It is useful to test for a given property using if(some_object.hasOwnProperty(property_name)) { ... }. Thus, adding a method to the arrayprototype with Array.prototype.newMethod = function() {...} may cause for ... in loops toloop over the method's name.

Page 116: Course Wikibook

JavaScript syntax 112

While loopThe syntax of the JavaScript while loop is as follows:

while (condition) {

statement1;

statement2;

statement3;

...

}

Do ... while loopThe syntax of the JavaScript do ... while loop is as follows:

do {

statement1;

statement2;

statement3;

...

} while (condition);

WithThe with statement sets the default object for the set of statements that follow.

with (document) {

var a = getElementById('a');

var b = getElementById('b');

var c = getElementById('c');

};

• Note the absence of document. before each getElementById() invocation.

The semantics are similar to the with statement of Pascal.

LabelsJavaScript 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.

loop1: for (var a = 0; a < 10; a++) {

if (a == 4) {

break loop1; // Stops after the 4th attempt

}

alert('a = ' + a);

loop2: for (var b = 0; b < 10; ++b) {

if (b == 3) {

continue loop2; // Number 3 is skipped

}

if (b == 6) {

continue loop1; // Continues the first loop, 'finished' is not

shown

}

Page 117: Course Wikibook

JavaScript syntax 113

alert('b = ' + b);

}

alert('finished')

}

block1: {

alert('hello'); // Displays 'hello'

break block1;

alert('world'); // Will never get here

}

goto block1; // Parse error.

FunctionsA function is a block with a (possibly empty) parameter list that is normally given a name. A function may use localvariables. If you exit the function without a return statement, the value undefined is returned.

function gcd(segmentA, segmentB) {

var diff = segmentA - segmentB;

if (diff == 0)

return segmentA;

return diff > 0 ? gcd(segmentB, diff) : gcd(segmentA, -diff);

}

alert(gcd(60, 40)); // 20

var mygcd=gcd; // mygcd is a reference to the same function as gcd.

Note no argument ()s.

alert(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 argumentsin the function definition; a named argument in the definition that does not have a matching argument in the call willhave the value undefined (which can be implicitly cast to false). Within the function, the arguments may also beaccessed through the arguments object; this provides access to all arguments using indices (e.g.arguments[0], arguments[1], ... arguments[n]), including those beyond the number of namedarguments. (While the arguments list has a .length property, it is not an instance of Array; it does not have methodssuch as .slice(), .sort(), etc.)

function add7(x, y) {

if (!y) {

y = 7;

}

alert(x + y + arguments.length);

};

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 obj1 = {a : 1};

var obj2 = {b : 2};

Page 118: Course Wikibook

JavaScript syntax 114

function foo(p) {

p = obj2; // Ignores actual parameter

p.b = arguments[1];

}

foo(obj1, 3); // Does not affect obj1 at all. 3 is additional parameter

alert(obj1.a + " " + obj2.b); // writes 1 3

Functions can be declared inside other functions, and access the outer function's local variables. Furthermore theyimplement 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() { alert(v) };

baz = function(x) { v = x; };

}

foo();

baz("Fugly");

bar(); // Fugly (not fud) even though foo() has exited.

alert(v); // Top

ObjectsFor 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 programmingterminology). Objects may be thought of as associative arrays or hashes, and are often implemented using these datastructures. However, objects have additional features, such as a prototype chainWikipedia:Please clarify, whichordinary 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 objectsObjects can be created using a constructor or an object literal. The constructor can use either a built-in Objectfunction or a custom function. It is a convention that constructor functions are given a name that starts with a capitalletter:

// Constructor

var anObject = new Object();

// Object literal

var objectA = {};

var objectA2 = {}; // A != A2, {}s create new objects as copies.

var objectB = {index1: 'value 1', index2: 'value 2'};

// Custom constructor (see below)

Object literals and array literals allow one to easily create flexible data structures:

Page 119: Course Wikibook

JavaScript syntax 115

var myStructure = {

name: {

first: "Mel",

last: "Smith"

},

age: 33,

hobbies: ["chess", "jogging"]

};

This is the basis for JSON, which is a simple notation that uses JavaScript-like syntax for data exchange.

MethodsA method is simply a function that is assigned to the value of an object's slot. Unlike many object-orientedlanguages, there is no distinction between a function definition and a method definition. Rather, the distinctionoccurs 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 ofthe ".". (There are also call and apply methods that can set this explicitly—some packages such as jQuery do unusualthings with this.)

In the example below, Foo is being used as a constructor. There is nothing special about a constructor, it is just amethod 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 canassign different functions to different instances. There is no prototyping in this example.

function px() {return this.prefix + "X";}

function Foo(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 Foo(1);

var foo2 = new Foo(0);

foo2.prefix = "b-";

alert("foo1/2 " + foo1.pyz() + foo2.pyz());

// foo1/2 a-Y b-Z

foo1.m3 = px; // Assigns the function itself, not its evaluated result,

i.e. not px()

var baz = {"prefix": "c-"};

baz.m4 = px; // No need for a constructor to make an object.

Page 120: Course Wikibook

JavaScript syntax 116

alert("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.

ConstructorsConstructor functions simply assign values to slots of a newly created object. The values may be data or otherfunctions.

Example: Manipulating an object

function MyObject(attributeA, attributeB) {

this.attributeA = attributeA;

this.attributeB = attributeB;

}

MyObject.staticC = "blue"; // On MyObject Function, not obj

alert(MyObject.staticC); // blue

obj = new MyObject('red', 1000);

alert(obj.attributeA); // red

alert(obj["attributeB"]); // 1000

alert(obj.staticC); // undefined

obj.attributeC = new Date(); // add a new property

delete obj.attributeB; // remove a property of obj

alert(obj.attributeB); // undefined

delete obj; // remove the whole Object (rarely used)

alert(obj.attributeA); // throws an exception

The constructor itself is stored in the special slot constructor. So

function Foo(){}

// Use of 'new' sets prototype and constructor slots (for example,

// Foo.prototype = {}; // would set constructor to Object).

x = new Foo();

// The above is almost equivalent to

y = {};

y.constructor = Foo;

y.constructor();

// Except

x.constructor == y.constructor // true

x instanceof Foo // true

y instanceof Foo // false

z = new {constructor: Foo}.constructor();

z instanceof Foo // true.

Page 121: Course Wikibook

JavaScript syntax 117

// Changing Foo.prototype after 'new' has been called can change the

// instanceof results, until it is changed back with the identical

value.

Functions are objects themselves, which can be used to produce an effect similar to "static properties" (usingC++/Java terminology) as shown below. (The function object also has a special prototype property, as discussedin the Inheritance section below.)

Object deletion is rarely used as the scripting engine will garbage collect objects that are no longer being referenced.

InheritanceJavaScript 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, thereference 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() {alert("Base::anOverride()");};

this.aBaseFunction = function() {alert("Base::aBaseFunction()");};

}

function Derived() {

this.anOverride = function() {alert("Derived::anOverride()");};

}

base = new Base();

Derived.prototype = base; // Must be before new Derived()

d = new Derived(); // Copies Derived.prototype to d instance's hidden

prototype slot.

base.aBaseFunction = function() {alert("Base::aNEWBaseFunction()")}

d.anOverride(); // Derived::anOverride()

d.aBaseFunction(); // Base::aNEWBaseFunction()

alert(d.aBaseFunction == Derived.prototype.aBaseFunction); // true

alert(d.__proto__ == base); // true in Mozilla-based implementations

but false in many other implementations.

The following shows clearly how references to prototypes are copied on instance creation, but that changes to aprototype can affect all instances that refer to it.

function m1() {return "One";}

function m2() {return "Two";}

function m3() {return "Three";}

Page 122: Course Wikibook

JavaScript syntax 118

function Base() {}

Base.prototype.m = m2;

bar = new Base();

alert("bar.m " + bar.m()); // bar.m Two

function Top() {this.m = m3;}

t = new Top();

foo = new Base();

Base.prototype = t;

// No effect on foo, the *reference* to t is copied.

alert("foo.m " + foo.m()); // foo.m Two

baz = new Base();

alert("baz.m " + baz.m()); // baz.m Three

t.m = m1; // Does affect baz, and any other derived classes.

alert("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 handlingJavaScript includes a try ... catch ... finally exception handling statement to handle run-time errors.

The try ... catch ... finally 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(errorValue) {

// 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 immediatelytransfers to the statements in the catch block, with the exception available as the error argument. Otherwise the catchblock is skipped. The Catch block can throw(errorValue) 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, althoughmemory is automatically garbage collected.

Either the catch or the finally clause may be omitted. The catch argument is required.

The Mozilla implementation allows for multiple catch statements, as an extension to the ECMAScript standard. Theyfollow a syntax similar to that used in Java:

try { statement; }

catch (e if e == "InvalidNameException") { statement; }

catch (e if e == "InvalidIdException") { statement; }

Page 123: Course Wikibook

JavaScript syntax 119

catch (e if e == "InvalidEmailException") { statement; }

catch (e) { statement; }

In a browser, the onerror event is more commonly used to trap exceptions.

onerror = function (errorValue, url, lineNr) {...; 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 bereferenced by the expression.

(function foo() {

var x=7;

alert("val " + eval("x+2"));

})(); // shows val 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/ )

Page 124: Course Wikibook

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 asECMAScript). Although there are several uses for a JavaScript engine, it is most commonly used in web browsers.

HistoryBefore the second browser war in 2008-2009, the JavaScript engine (also termed JavaScript interpreter orJavaScript 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 NetscapeNavigator 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 atNetscape) 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'sTraceMonkey.

By far the most common host environment for JavaScript is a web browser. Web browsers typically use the publicapplication programming interface (API) to create "host objects" responsible for reflecting the Document ObjectModel (DOM) into JavaScript.

The web server is another common application of the engine. A JavaScript web server exposes host objectsrepresenting an HTTP request and response objects, which a JavaScript program then manipulates to dynamicallygenerate 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 benefitof allowing the same code to be shared on the server and on the client.

Page 125: Course Wikibook

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 easiertesting, 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 arepossible, for example, V8 with WebKit in Google Chrome. The JavaScript engine gives developers access tofunctionality (networking, DOM handling, external events, HTML5 video, canvas and data storage) needed tocontrol the web browser.

SunSpider is a JavaScript benchmark utility for measuring the performance of JavaScript engines in more than adozen tests, each concentrating on different part of JavaScript language. SunSpider does not use for benchmarkingany features beyond those needed to test pure computations (no HTML, no CSS, no networking).

The JavaScript engine race: 2008 and 2009Recently, there has been a race by browser developers to develop even faster JavaScript engines in response to thegrowing use of JavaScript frameworks and Ajax, as the user's experience is directly influenced by the browser'sability to execute the site's client-side code. In 2008, Google Chrome was praised for its JavaScript performance, butother browsers soon received new JavaScript engines which were faster. Later, Chrome won in the races of betterperformance. Chrome's strength is its application performance and JavaScript processing speed, both of which wereindependently verified by multiple websites to be the fastest amongst the major browsers of its time. With the adventof WebKit's Squirrelfish and Mozilla's TraceMonkey JavaScript virtual machines, Chrome's JavaScript executionperformance has been found to be slower. Google responded with the Danish-developed V8 which boostedJavaScript performance in Google Chrome 2.

On June 2, 2008, the WebKit development team announced SquirrelFish, a then-new JavaScript engine that vastlyimproves Safari's speed at interpreting scripts. The engine was one of the new features in Safari 4, released fordevelopers 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-64architectures as it passes all tests on that platform by Apple Inc.[1] Released June 30, 2009, Firefox 3.5 includes theoptimization technique that offered "performance improvements ranging between 20 and 40 times faster" comparedto Firefox 3 in some cases.

The JavaScript engine race: 2010In early 2010, the Norwegian Opera browser replaced the aging Futhark with the faster Carakan, which was 2.5times faster in early testing. Others in the race, at this time, include Apple's Safari's Nitro (the engine formerlyknown as SquirrelFish) and Firefox's new JägerMonkey (a "cross-child of Nitro with the older TraceMonkeyEngine"). Microsoft lagged behind, lacking a dedicated JavaScript engine and being the slowest of the majorbrowsers. Although by mid-2010, Microsoft held out the carrot of Chakra in then unreleased Internet Explorer 9.JägerMonkey began testing in the publicly released Firefox 4.0 beta in Summer 2010. Safari 5, also released inSummer 2010, featured 30 percent faster JavaScript performance than Safari 4 (using the Nitro engine).[2]

Page 126: Course Wikibook

JavaScript engine 122

2011In 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• JägerMonkey, 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 inOpera 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

ImplementationsJavaScript is a dialect of ECMAScript, which is supported in many applications, especially web browsers. Dialectssometimes include extensions to the language, or to the standard library and related application programminginterfaces (API) such as the World Wide Web Consortium (W3C) specified Document Object Model (DOM). Thismeans that an application written in one dialect may be incompatible with another, unless the applications are writtento 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 animplementation of a language (or dialect) executes a program written in that language (or dialect).

Page 127: Course Wikibook

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 JavaScript1.5and 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

Page 128: Course Wikibook

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 application/ecmascript

Developed by Sun Microsystems,Ecma International

Initial release June 1997

Latest release Edition 5.1 / June 2011

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]

Page 129: Course Wikibook

ECMAScript 125

ECMAScript is the scripting language standardized by Ecma International in the ECMA-262 specification andISO/IEC 16262. The language is widely used for client-side scripting on the web, in the form of several well-knownimplementations such as JavaScript, JScript and ActionScript.

HistoryJavaScript was originally developed by Brendan Eich of Netscape under the name Mocha, later LiveScript, andfinally renamed to JavaScript. In December 1995, Sun Microsystems and Netscape announced JavaScript in a pressrelease. 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, Microsoftdeveloped a compatible dialect of the language, naming it JScript to avoid trademark issues. JScript added new datemethods to fix the non-Y2K-friendly methods in JavaScript, which were based on the Java Date class. JScript wasincluded 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 Assemblyof 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 acompromise 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 notdescribed in the ECMA specifications. [citation needed]

VersionsThere are five editions of ECMA-262 published. Work on a future edition, codenamed "Harmony", is in progress.

Edition Datepublished

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 MikeCowlishaw

3 December1999

Added regular expressions, better string handling, new control statements, try/catch exception handling,tighter definition of errors, formatting for numeric output and other enhancements

MikeCowlishaw

4 Abandoned Fourth Edition was abandoned, due to political differences concerning language complexity. Manyfeatures proposed for the Fourth Edition have been completely dropped; some are proposed forECMAScript Harmony.

5 December2009

Adds "strict mode", a subset intended to provide more thorough error checking and avoid error-proneconstructs. Clarifies many ambiguities in the 3rd edition specification, and accommodates behaviour ofreal-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.

PratapLakshman,AllenWirfs-Brock

5.1 June 2011 This edition 5.1 of the ECMAScript Standard is fully aligned with third edition of the internationalstandard ISO/IEC 16262:2011

PratapLakshman,AllenWirfs-Brock

Page 130: Course Wikibook

ECMAScript 126

6 Work inprogress

The Sixth Edition adds significant new syntax for writing complex applications, including classes andmodules, but defines them semantically in the same terms as ECMAScript 5 strict mode. Other newfeatures include iterators and for/of loops, Python-style generators and generator expressions, arrowfunctions, binary data, collections (maps, sets and weak maps), and proxies (metaprogramming for virtualobjects and wrappers). As the first “ECMAScript Harmony” specification, it is also known as “ES6Harmony”.

AllenWirfs-Brock

7 Work inprogress

The Seventh Edition is in a very early stage of development, but is intended to continue the themes oflanguage reform, code isolation, control of effects and library/tool enabling from ES6. New featuresproposed include promises/concurrency, number and math enhancements, guards and trademarks (analternative to static typing), operator overloading, value types (first-class number-like objects), newrecord 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 asECMAScript for XML (E4X).

Ecma also defined a "Compact Profile" for ECMAScript — known as ES-CP, or ECMA 327 — which is designedfor resource-constrained devices. Several of the dynamic features of ECMAScript (such as the eval function) aremade optional, thus allowing the runtime to make more assumptions about the behaviour of programs and thereforemake more performance trade-offs when running the code. The HD DVD standard was one place where theECMAScript Compact Profile was used in favour of full ECMAScript to reduce processing and memory needs ondevices.

FeaturesThe ECMAScript language includes structured, dynamic, functional, and prototype-based features, as officiallysummarized here.

ImplementationsECMAScript 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 thestandard 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 maybe incompatible with another, unless they are written to use only a common subset of supported features and APIs.

Application-implementation Implementation and latestversion

ECMAScript edition

Mozilla Firefox, the Gecko layout engine, SpiderMonkey, andRhino[5]

JavaScript 1.8.5[6] ECMA-262, edition 5, and features fromupcoming 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.'sSafari[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]

Page 131: Course Wikibook

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 fromupcoming 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, thoughsome—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: V8JavaScript 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 maintaincompatibility 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 (theDHTML 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).

Page 132: Course Wikibook

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 correspondenceThe following table is based on tedster's history compilation forum post and Microsoft's JScript version informationwebpage. 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 - earlyversions, August1996)

1.1 (Netscape 3.0,August 1996)

2.0 (IE 3.0 - laterversions, January1997)

1.2 (Netscape4.0-4.05, June1997)

1.3 (Netscape4.06-4.7x, October1998)

3.0 (IE 4.0, Oct1997)

Edition 1 (June 1997) / Edition 2 (June 1998)

1.4 (NetscapeServer only)

4.0 (Visual Studio6, no IE release)

5.0 (IE 5.0, March1999)

5.1 (IE 5.01)

1.5 (Netscape 6.0,Nov 2000; alsolater Netscape andMozilla releases)

5.5 (IE 5.5, July2000)

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.prototype.forEach), Array and String 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, October2006)

Edition 3 plus all JavaScript 1.6 enhancements, plus Pythonic generators and array comprehensions([a*a for (a in iter)]), block scope with let, 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, June2008)

Edition 3 plus all JavaScript 1.7 enhancements, plus expression closures (function(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 IErelease)

(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).

Page 133: Course Wikibook

ECMAScript 129

Conformance testsIn 2010, Ecma International started developing a standards test for Ecma 262 ECMAScript. Test262 is anECMAScript conformance test suite that can be used to check how closely a JavaScript implementation follows theECMAScript 5th Edition Specification. The test suite contains thousands of individual tests, each of which testssome specific requirements of the ECMAScript specification.

Development of Test262 is a project of Ecma Technical Committee 39 (TC39). The testing framework andindividual 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 oftests.

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 scorescan not be compared as tests are not weighted.

Product Version tested Test262failed

Test suite version(date)

Pre-release version Test262failed

Test suite version(date)

InternetExplorer

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 EditionThe proposed fourth edition of ECMA-262 (ECMAScript 4 or ES4) would have been the first major update toECMAScript since the third edition was published in 1999. The specification (along with a referenceimplementation) 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 codenamedECMAScript Harmony.

Page 134: Course Wikibook

ECMAScript 130

Features under discussionFeatures 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 thescript's ability to be dynamic to improve performance. For example, Tamarin — the virtual machine for ActionScriptdeveloped and open sourced by Adobe — has just-in-time compilation (JIT) support for certain classes of scripts.

Bug fixes and backwards compatibilityIn addition to introducing new features, some ES3 bugs were proposed to be fixed in edition 4. These fixes andothers, and support for JSON encoding/decoding, have been folded into the ECMAScript, 5th Edition specification.

HistoryWork started on Edition 4 after the ES-CP (Compact Profile) specification was completed, and continued forapproximately 18 months where slow progress was made balancing the theory of Netscape's JavaScript 2specification with the implementation experience of Microsoft's JScript .NET. After some time, the focus shifted tothe ECMAScript for XML (E4X) standard. The update has not been without controversy. In late 2007, a debatebetween Eich, now the Mozilla Foundation's CTO, and Chris Wilson, Microsoft's platform architect for InternetExplorer, became public on a number of blogs. Wilson cautioned that because the proposed changes to ECMAScriptmade 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 respondedby stating that Wilson seemed to be "repeating falsehoods in blogs" and denied that there was attempt to suppressdissent and challenging critics to give specific examples of incompatibility. He also pointed out that MicrosoftSilverlight and Adobe AIR rely on C# and ActionScript 3 respectively, both of which are larger and more complexthan ECMAScript Edition 3.

ECMAScript, 5th EditionYahoo, Microsoft, Google, and other 4th edition dissenters formed their own subcommittee to design a lessambitious update of ECMAScript 3, tentatively named ECMAScript 3.1. This edition would focus on security andlibrary updates with a large emphasis on compatibility. After the aforementioned public sparring, the ECMAScript3.1 and ECMAScript 4 teams agreed on a compromise: the two editions would be worked on, in parallel, withcoordination between the teams to ensure that ECMAScript 3.1 remains a strict subset of ECMAScript 4 in bothsemantics and syntax.

However, the differing philosophies in each team resulted in repeated breakages of the subset rule, and it remaineddoubtful that the ECMAScript 4 dissenters would ever support or implement ECMAScript 4 in the future. After overa year since the disagreement over the future of ECMAScript within the Ecma Technical Committee 39, the twoteams reached a new compromise in July 2008: Brendan Eich announced that Ecma TC39 would focus work on theECMAScript 3.1 (later renamed to ECMAScript, 5th Edition) project with full collaboration of all parties, andvendors would target at least two interoperable implementations by early 2009. In April 2009, Ecma TC39 publishedthe "final" draft of the 5th edition and announced that testing of interoperable implementations was expected to becompleted by mid-July. On December 3, 2009, ECMA-262 5th edition was published.

Page 135: Course Wikibook

ECMAScript 131

ECMAScript Harmony (6th Edition)In the July 2008 announcement, Eich also stated that the ECMAScript 4 proposal would be superseded by a newproject, code-named ECMAScript Harmony. ECMAScript Harmony names the agreed design trajectory of post-ES5editions. It will include syntactic extensions, but the changes will be more modest than ECMAScript 4 in bothsemantic and syntactic innovation. Packages, namespaces, and early binding from ECMAScript 4 are no longerincluded for planned releases. In addition, other goals and ideas from ECMAScript 4 are being rephrased to keepconsensus in the committee; these include a notion of classes based on ECMAScript, 5th Edition (being an update toECMAScript, 3rd edition).

Drafts of ES.next have been published periodically since July 2011,[1] with a target release date of December2013.[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)

Page 136: Course Wikibook

Ajax (programming) 132

Ajax (programming)Ajax (also AJAX; /ˈeɪdʒæks/; an acronym for Asynchronous JavaScript and XML) is a group of interrelated webdevelopment techniques used on the client-side to create asynchronous web applications. With Ajax, webapplications can send data to, and retrieve data from, a server asynchronously (in the background) without interferingwith the display and behavior of the existing page. Data can be retrieved using the XMLHttpRequest object.Despite the name, the use of XML is not required (JSON is often used instead. See AJAJ), and the requests do notneed to be asynchronous.

Ajax is not a single technology, but a group of technologies. HTML and CSS can be used in combination to mark upand style information. The DOM is accessed with JavaScript to dynamically display, and allow the user to interactwith, the information presented. JavaScript and the XMLHttpRequest object provide a method for exchanging dataasynchronously between browser and server to avoid full page reloads.

HistoryIn the 1990s, most web sites were based on complete HTML pages. Each user action required that the page bereloaded from the server (or a new page loaded). This process was inefficient, as reflected by the user experience: allpage content disappeared, then reappeared. Each time a page was reloaded due to a partial change, all of the contenthad to be re-sent, even though only some of the information had changed. This placed additional load on the serverand used excessive bandwidth. In 1996, the iframe tag was introduced by Internet Explorer to load contentasynchronously.

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 thedefault page for Internet Explorer,[1] and created the XMLHTTP ActiveX control in Internet Explorer 5, which waslater adopted by Mozilla, Safari, Opera and other browsers as the XMLHttpRequest JavaScript object. Microsoft hasadopted 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 obscureuntil 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 Approachto 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 theXMLHttpRequest object in an attempt to create an official web standard.

Page 137: Course Wikibook

Ajax (programming) 133

TechnologiesThe term Ajax has come to represent a broad group of web technologies that can be used to implement a webapplication 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 areincorporated:

• 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, andthe definition of the term Ajax. XML is not required for data interchange and therefore XSLT is not required for themanipulation 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 fragmentswhich 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 thebrowser to an earlier state of the Ajax-enabled page, but may have instead returned to the last full page visitedbefore it. Such behavior—navigating between pages instead of navigating between page states—may bedesirable, but if fine-grained tracking of page state is required then a pre-HTML5 workaround was to use invisibleiframes to trigger changes in the browser's history. A workaround implemented by Ajax techniques is to changethe URL fragment identifier (the part of a URL after the '#') when an Ajax-enabled page is accessed and monitorit 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 byHTML5 for the above problem also applies for this.

•• Depending on the nature of the Ajax application, dynamic page updates may interfere disruptively with userinteractions, especially if working on an unstable Internet connection. For instance, editing a search field maytrigger a query to the server for search completions, but the user may not know that a search completion popup isforthcoming, and if the internet connection is slow, the popup list may show up at an inconvenient time, when theuser has already proceeded to do something else.

• Because most web crawlers do not execute JavaScript code, publicly indexable web applications should providean alternative means of accessing the content that would normally be retrieved with Ajax, thereby allowing searchengines to index it.

• Any user whose browser does not support JavaScript or XMLHttpRequest, or simply has this functionalitydisabled, will not be able to properly use pages which depend on Ajax. Devices such as smartphones and PDAsmay not have support for the required technologies, though this is becoming less of an issue. The only way to letthe user carry out functionality is to fall back to non-JavaScript methods. This can be achieved by making surelinks 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-readingtechnologies, 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.

Page 138: Course Wikibook

Ajax (programming) 134

• The same origin policy prevents some Ajax techniques from being used across domains, although the W3C has adraft of the XMLHttpRequest object that would enable this functionality. Methods exist to sidestep this securityfeature by using a special Cross Domain Communications channel embedded as an iframe within a page, or bythe use of JSONP.

• The asynchronous callback-style of programming required can lead to complex code that is hard to maintain, todebug and to test.

ExampleHere is an example of a simple Ajax request using the GET method.

get-ajax-data.js:

// This is the client-side script

// Initialize the Ajax request

var xhr = new XMLHttpRequest();

xhr.open('get', 'send-ajax-data.php');

// Track the state changes of the request

xhr.onreadystatechange = function(){

// Ready state 4 means the request is done

if(xhr.readyState === 4){

// 200 is a successful return

if(xhr.status === 200){

alert(xhr.responseText); // 'This is the returned text.'

}else{

alert('Error: '+xhr.status); // An error occurred during

the request

}

}

}

// Send the request to send-ajax-data.php

xhr.send(null);

send-ajax-data.php:

<?php

// This is the server-side script

// Set the content type

header('Content-Type: text/plain');

// Send the data back

echo "This is the returned text.";

?>

Page 139: Course Wikibook

Ajax (programming) 135

jQuery exampleThis example uses the popular JavaScript library jQuery, to do the same thing as the example above.

$.get('send-ajax-data.php', function(data) {

alert(data);

});

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

Page 140: Course Wikibook

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 tosend HTTP or HTTPS requests to a web server and load the server response data back into the script. Developmentversions of all major browsers support URI schemes beyond http: and https:, in particular, blob: URLs aresupported.[2]

The name was standardized to XMLHttpRequest for compatibility. It may be misleading, in particular because anytextual data may be received from the server, not just XML. Data are also commonly received as JSON, HTML, oras plain text. Data from the response can be used to alter the current document in the browser window withoutloading a new web page. The response data can also be evaluated by client-side scripting. For example, if it wasformatted 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 manywebsites to implement responsive and dynamic web applications.

XMLHttpRequest is subject to the browser's same-origin policy: for security reasons, requests will only succeed ifthey are made to the same server that served the original web page.

History and supportThe 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 andimplemented into the second version of the MSXML library using this concept. The second version of the MSXMLlibrary was shipped with Internet Explorer 5.0 in March 1999, allowing access, via ActiveX, to theIXMLHTTPRequest interface using the XMLHTTP wrapper of the MSXML library.

The Mozilla project developed and implemented an interface called nsIXMLHttpRequest into the Gecko layoutengine. 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 XMLHttpRequest. TheXMLHttpRequest object was accessible as early as Gecko version 0.6 released on December 6 of 2000, but it was notcompletely functional until as late as version 1.0 of Gecko released on June 5, 2002. The XMLHttpRequest objectbecame 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 April5, 2006, edited by Anne van Kesteren of Opera Software and Dean Jackson of W3C. Its goal is "to document aminimum set of interoperable features based on existing implementations, allowing Web developers to use thesefeatures without platform-specific code." The last revision to the XMLHttpRequest object specification was onNovember 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 inOctober 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 Ajax.Request that wraps the browser's underlying implementation and

Page 141: Course Wikibook

XMLHttpRequest 137

provides access to it. jQuery objects represent or wrap elements from the current client-side DOM. They all have a.load() method that takes a URI parameter and makes an XMLHttpRequest to that URI, then by default placesany 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 theXMLHttpRequest object, including, but not currently limited to, progress events, support for cross-site requests, andthe handling of byte streams. The latest revision of the XMLHttpRequest Level 2 specification is that of 16 August2011, which is still a working draft.

As of 5 December 2011[3], XMLHttpRequest version 2 has been merged into the main XMLHttpRequestspecification, and there is no longer a version 1 and a version 2.

Support in Internet Explorer versions 5, 5.5, and 6Internet Explorer versions 5 and 6 did not define the XMLHttpRequest object identifier in their scripting languagesas the XMLHttpRequest identifier itself was not standard at the time of their releases. Backward compatibility can beachieved through object detection if the XMLHttpRequest identifier does not exist.

Web pages that use XMLHttpRequest or XMLHTTP can mitigate the current minor differences in theimplementations either by encapsulating the XMLHttpRequest object in a JavaScript wrapper, or by using anexisting framework that does so. In either case, the wrapper should detect the abilities of current implementation andwork within its requirements.

Until 8 April 2014 Microsoft will support Windows XP and so Internet Explorer 6 - a JavaScript encapsulationexample is provided below.

/*

Provide the XMLHttpRequest constructor for Internet Explorer

5.x-6.x:

Other browsers (including Internet Explorer 7.x-9.x) do not redefine

XMLHttpRequest if it already exists.

This example is based on findings at:

http://blogs.msdn.com/xmlteam/archive/2006/10/23/using-the-right-version-of-msxml-in-internet-explorer.aspx

*/

if (typeof XMLHttpRequest === "undefined") {

XMLHttpRequest = function () {

try { return new ActiveXObject("Msxml2.XMLHTTP.6.0"); }

catch (e) {}

try { return new ActiveXObject("Msxml2.XMLHTTP.3.0"); }

catch (e) {}

try { return new ActiveXObject("Microsoft.XMLHTTP"); }

catch (e) {}

throw new Error("This browser does not support XMLHttpRequest.");

};

}

Page 142: Course Wikibook

XMLHttpRequest 138

HTTP requestThe following sections demonstrate how a request using the XMLHttpRequest object functions within a conforminguser 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 tochange. Extreme care should be taken into consideration when scripting with the XMLHttpRequest object acrossmultiple user agents. This article will try to list the inconsistencies between the major user agents.

The open methodThe HTTP and HTTPS requests of the XMLHttpRequest object must be initialized through the open method. Thismethod 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 userinformation is correct. This method can accept up to five parameters, but requires only two, to initialize a request.

open( Method, URL, Asynchronous, UserName, Password )

The first parameter of the method is a text string indicating the HTTP request method to use. The request methodsthat must be supported by a conforming user agent, defined by the W3C draft for the XMLHttpRequest object, arecurrently 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 supportadditional 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. TheW3C recommends that browsers should raise an error and not allow the request of a URL with either a different portor 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 requiredparameter by the W3C draft. The default value of this parameter should be assumed to be true by a W3C conforminguser agent if it is not provided. An asynchronous request ("true") will not wait on a server response before continuingon with the execution of the current script. It will instead invoke the onreadystatechange event listener of theXMLHttpRequest object throughout the various stages of the request. A synchronous request ("false") however willblock execution of the current script until the request has been completed, thus not invoking the onreadystatechangeevent 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.

Page 143: Course Wikibook

XMLHttpRequest 139

The setRequestHeader methodUpon successful initialization of a request, the setRequestHeader method of the XMLHttpRequest object can beinvoked to send HTTP headers with the request.

setRequestHeader( Name, Value )

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 willbe removed the next time the open method is invoked in a W3C conforming user agent.

The send methodTo send an HTTP request, the send method of the XMLHttpRequest must be invoked. This method accepts a singleparameter containing the content to be sent with the request.

send( Data )

This parameter may be omitted if no content needs to be sent. The W3C draft states that this parameter may be anytype available to the scripting language as long as it can be turned into a text string, with the exception of the DOMdocument object. If a user agent cannot serialise the parameter, then the parameter should be ignored. Firefox 3.0.xand 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-formedXML using the encoding indicated by the inputEncoding property of the document object. If the Content-Typerequest header was not added through setRequestHeader yet, it should automatically be added by a conforming useragent 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 requestappropriately so as to connect to the proxy instead of the origin server, and send Proxy-Authorizationheaders as configured.

The onreadystatechange event listenerIf the open method of the XMLHttpRequest object was invoked with the third parameter set to true for anasynchronous request, the onreadystatechange event listener will be automatically invoked for each of thefollowing 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 objectshould be assigned a value of 1.

• After the send method has been invoked and the HTTP response headers have been received, the readyStateproperty 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 shouldbe assigned a value of 3.

• Once the HTTP response content has finished loading, the readyState property of the XMLHttpRequest objectshould 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, thelistener must be defined before the open method is invoked. The open method must be invoked before the sendmethod is invoked.

xmlhttp.onreadystatechange = function() {

if (xmlhttp.readyState === 4){

alert(xmlhttp.readyState);

Page 144: Course Wikibook

XMLHttpRequest 140

}

};

xmlhttp.open('GET', 'somepage.xml', true);

xmlhttp.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); //

Tells server that this call is made for ajax purposes.

//

Most libraries like jQuery/Prototype/Dojo do this

xmlhttp.send(null); // No data need to send along with the request.

The abort methodThis method aborts the request if the readyState of the XMLHttpRequest object has not yet become 4. The abortmethod ensures that the callback handler does not get invoked in an asynchronous request.

abort( )

Some AJAX libraries use the abort method to cancel potential duplicate or out-of-order requests.

The HTTP responseAfter a successful and completed call to the send method of the XMLHttpRequest, if the server response was validXML and the Content-Type header sent by the server is understood by the user agent as an Internet media type forXML, the responseXML property of the XMLHttpRequest object will contain a DOM document object. Anotherproperty, responseText will contain the response of the server in plain text by a conforming user agent, regardless ofwhether or not it was understood as XML.

Cross-domain requestsIn the early development of the World Wide Web, it was found possible to breach users' security by the use ofJavaScript to exchange information from one web site with that from another less reputable one. All modernbrowsers 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 tocircumvent its restrictions. This is sometimes due to the legitimate use of subdomains as, for example, making anXMLHttpRequest from a page created by foo.example.com for information from bar.example.com willnormally fail.

Various alternatives exist to circumvent this security feature, including using JSONP, Cross-Origin ResourceSharing (CORS) or alternatives with plugins such as Flash or Silverlight. Cross-origin XMLHttpRequest is specifiedin 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 similarfunctionality 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 methodsare supported. In practice, the POST method is barely useful, because the only allowed value for the Content-Typerequest header is "text/plain", while many server-side frameworks require "application/x-www-urlencoded" tofunction properly.

Page 145: Course Wikibook

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 XHRand the future of cross-domain Ajax.

• (http:/ / windows. microsoft. com/ en-US/ windows/ end-support-help) Support end of Windows XP

Page 146: Course Wikibook

Brendan Eich 142

Brendan Eich

Brendan Eich

Born 1961 (age 52–53)Pittsburgh, Pennsylvania

Alma mater University of Illinois at Urbana–Champaign

Occupation CTO, Mozilla Corporation

Known for JavaScript

Website

brendaneich.com [1]

Brendan Eich (/ˈaɪk/; born 1961) is an American computer programmer and creator of the JavaScript scriptinglanguage. He is the chief technology officer at the Mozilla Corporation.

EducationBrendan Eich received his bachelor's degree in mathematics and computer science at Santa Clara University. Hereceived his master's degree in 1986 from the University of Illinois at Urbana-Champaign.

CareerEich started his career at Silicon Graphics, working for seven years on operating system and network code.[2] Hethen worked for three years at MicroUnity Systems Engineering writing microkernel and DSP code, and doing thefirst MIPS R4000 port of GCC.

Eich is best known for his work on Netscape and Mozilla. He started work at Netscape Communications Corporationin April 1995, working on JavaScript (originally called Mocha, then called LiveScript) for the Netscape Navigatorweb browser.

He then helped found mozilla.org in early 1998, serving as chief architect. When AOL shut down the Netscapebrowser 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 MozillaFoundation, Eich became CTO of the newly founded Mozilla Corporation.

Page 147: Course Wikibook

Brendan Eich 143

Eich has contributed to the creation of the Rust programming language at Mozilla.[3]

Political activitiesEich donated $1,000 in 2008 to the campaign supporting California Proposition 8, which was recorded in a publicdatabase with Mozilla's name attached as his employer, and many people commented about this donation on Twitterin 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 thanthe 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)

Page 148: Course Wikibook

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

Alma mater San Francisco State University

Occupation senior JavaScript architect

Employer PayPal

Known for JavaScript Object Notation

Website

crockford.com [1]

Douglas Crockford is an American computer programmer and entrepreneur who is best known for his ongoinginvolvement 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 iscurrently a senior JavaScript architect at PayPal, and is also a writer and speaker on JavaScript, JSON, and relatedweb technologies such as the Yahoo! User Interface Library (YUI).

Early yearsCrockford earned a degree in Radio and Television from San Francisco State University.[2] in 1975. He took classesin FORTRAN and worked with a university lab's computers.

CareerAfter Crockford purchased an Atari 8-bit computer in 1980, he wrote Galahad and the Holy Grail for Atari ProgramExchange. Chris Crawford hired him at Atari, Inc., and after Warner Communications sold the company he joinedNational Semiconductor. In 1984 Crockford joined Lucasfilm, and later Paramount Pictures. He became somethingof a cult figure on video game oriented listservs in the early 1990s after he posted his memoir "The Expurgation ofManiac Mansion" to a videogaming bulletin board; the memoir documented his efforts to censor the computer gameManiac Mansion to Nintendo's satisfaction so that they could release it as a cartridge, and Crockford's mountingfrustrations as Nintendo's demands became more obscure and confusing.[3]

Together with Randy Farmer and Chip Morningstar, Crockford founded Electric Communities and was its CEOfrom 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.

Page 149: Course Wikibook

Douglas Crockford 145

During his time at State Software, Crockford popularized the JSON data format, based upon existing JavaScriptlanguage constructs, as a lightweight alternative to XML. He obtained the domain name json.org in 2002, and put uphis description of the format there.[4] In July 2006 he specified the format officially, as RFC 4627.[5]

CriticismIn 2002, in reference to President George Bush's war on "evildoers", Crockford added the requirement "TheSoftware shall be used for Good, not Evil" to the open source MIT License for his JSMin software. This clause wascarried over to JSMin-PHP, a variation of JSMin by Ryan Grove. This software was hosted on Google Code untilDecember 2009 when, due to the additional clause, Google determined that the license was not compliant with thedefinition of open source software, which does not permit any restriction on how software may be used. JSMin-PHPwas 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 softwaredevelopers when they inadvertently use code based on Crockford's version of the MIT License, and has inspiredcriticism of Crockford from affected open source developers as recently as November 2012. Crockford has refusedto change the license terms despite numerous requests, with the notable exception from IBM

Bibliography• JavaScript: The Good Parts [7]. O'Reilly. 2008. ISBN 978-0-596-51774-8. OCLC 192027457 [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/ )

Page 150: Course Wikibook

146

Chapter 14: Single-Page Applications withJavaScript, JSON, and REST API

Web application

Google Calendar is a contact- and time-management web applicationoffered by Google.

Horde groupware is an open source web application.

In computing, a web-based application is anyapplication that uses a web browser as a client.[1][2] Theterm may also mean a computer software applicationthat is coded in a browser-supported programminglanguage (such as JavaScript, combined with abrowser-rendered markup language like HTML) andreliant on a common web browser to render theapplication executable.

Web applications are popular due to the ubiquity ofweb browsers, and the convenience of using a webbrowser as a client, sometimes called a thin client. Theability to update and maintain web applications withoutdistributing and installing software on potentiallythousands of client computers is a key reason for theirpopularity, as is the inherent support for cross-platformcompatibility. Common web applications includewebmail, online retail sales, online auctions, wikis andmany other functions.

History

In earlier computing models, e.g. in client-server, theload for the application was shared between code on theserver and code installed on each client locally. In otherwords, an application had its own client program which served as its user interface and had to be separately installedon each user's personal computer. An upgrade to the server-side code of the application would typically also requirean upgrade to the client-side code installed on each user workstation, adding to the support cost and decreasingproductivity.

In contrast, web applications use web documents written in a standard format such as HTML and JavaScript, whichare supported by a variety of web browsers. Web applications can be considered as a specific variant of client-serversoftware where the client software is downloaded to the client machine when visiting the relevant web page, usingstandard 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 webapplication.

In the early days of the Web each individual web page was delivered to the client as a static document, but thesequence of pages could provide an interactive experience, as user input is returned through web form elementsembedded in the page markup.

Page 151: Course Wikibook

Web application 147

In 1995 Netscape introduced a client-side scripting language called JavaScript allowing programmers to add somedynamic elements to the user interface that ran on the client side. So instead of sending data to the server in order togenerate an entire web page, the embedded scripts of the downloaded page can perform various tasks such as inputvalidation 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 toembed animations on the web pages. It allowed the use of a scripting language to program interactions on the clientside 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 andthe 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 moreinteractive. A web page script is able to contact the server for storing/retrieving data without downloading an entireweb page.

In 2011, HTML5 was finalized, which provides graphic and multimedia capabilities without the need of client sideplugins. HTML5 also enriched the semantic content of documents. The APIs and document object model (DOM) areno longer afterthoughts, but are fundamental parts of the HTML5 specification. WebGL API paved the way foradvanced 3D graphics based on HTML5 canvas and JavaScript language. These have significant importance increating truly platform and browser independent rich web applications.

InterfaceThrough Java, JavaScript, DHTML, Flash, Silverlight and other technologies, application-specific methods such asdrawing on the screen, playing audio, and access to the keyboard and mouse are all possible. Many services haveworked 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 oftenuse client-side scripting to add functionality, especially to create an interactive experience that does not require pagereloading. Recently, technologies have been developed to coordinate client-side scripting with server-sidetechnologies such as PHP. Ajax, a web development technique using a combination of various technologies, is anexample of technology which creates a more interactive experience.

StructureApplications are usually broken into logical chunks called "tiers", where every tier is assigned a role. Traditionalapplications consist only of 1 tier, which resides on the client machine, but web applications lend themselves to ann-tiered approach by nature. Though many variations are possible, the most common structure is the three-tieredapplication. In its most common form, the three tiers are called presentation, application and storage, in this order. Aweb 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 (applicationlogic), and a database is the third tier (storage). The web browser sends requests to the middle tier, which servicesthem 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 morefine-grained model. Another benefit may be adding an integration tier that separates the data tier from the rest oftiers by providing an easy-to-use interface to access the data. For example, the client data would be accessed bycalling 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.

Page 152: Course Wikibook

Web application 148

There are some who view a web application as a two-tier architecture. This can be a "smart" client that performs allthe work and queries a "dumb" server, or a "dumb" client that relies on a "smart" server. The client would handle thepresentation tier, the server would have the database (storage tier), and the business logic (application tier) would beon one of them or on both. While this increases the scalability of the applications and separates the display and thedatabase, it still doesn't allow for true specialization of layers, so most applications will outgrow this model.

Business useAn emerging strategy for application software companies is to provide web access to software previously distributedas local applications. Depending on the type of application, it may require the development of an entirely differentbrowser-based interface, or merely adapting an existing application to use different presentation technology. Theseprograms allow the user to pay a monthly or yearly fee for use of a software application without having to install iton a local hard drive. A company which follows this strategy is known as an application service provider (ASP), andASPs 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 enterpriseinformation and private customer data. Protecting these assets is an important part of any web application and thereare some key operational areas that must be included in the development process. This includes processes forauthentication, authorization, asset handling, input, and logging and auditing. Building security into the applicationsfrom 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 applicationsprovided 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 easilycreating an online retail store. Most businesses today do not need to buy data center hardware such as serversbecause they are affordably rented on a short term basis from a plethora of hosting companies that provide turnkeyimplementations of web applications. It is common for hosting providers to also offer packages of hardware and allnecessary software to support the business needs of a company. Innovations in all aspects of web applications areproviding tremendous economic value by increasing competition by reducing barriers to entry for new companies.

Writing web applicationsWriting of web applications is often simplified by open source software such as Django, Ruby on Rails or Symfonycalled web application frameworks. These frameworks facilitate rapid application development by allowing adevelopment team to focus on the parts of their application which are unique to their goals without having to resolvecommon development issues such as user management. While many of these frameworks are open source, this is byno means a requirement.

The use of web application frameworks can often reduce the number of errors in a program, both by making the codesimpler, and by allowing one team to concentrate on the framework while another focuses on a specified use case. Inapplications which are exposed to constant hacking attempts on the Internet, security-related problems can be causedby 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 currentlythere are not many viable platforms that fit this model.

Page 153: Course Wikibook

Web application 149

ApplicationsExamples of browser applications are simple office software (word processors, online spreadsheets, and presentationtools), but can also include more advanced applications such as project management, computer-aided design, videoediting 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 ofusers;

•• Standards compliance is an issue with any non-typical office document creator, which causes problems when filesharing and collaboration becomes critical;

• Browser applications rely on application files accessed on remote servers through the Internet. Therefore, whenconnection is interrupted, the application is no longer usable. However, if it uses HTML5 API's such as OfflineWeb application caching, it can be downloaded and installed locally, for offline use. Google Gears, although nolonger in active development, is a good example of a third party plugin for web browsers that provides additionalfunctionality for creating web applications;

• Since many web applications are not open source, there is also a loss of flexibility, making users dependent onthird-party servers, not allowing customizations on the software and preventing users from running applicationsoffline (in most cases). However, if licensed, proprietary software can be customized and run on the preferredserver of the rights owner;

•• They depend entirely on the availability of the server delivering the application. If a company goes bankrupt andthe server is shut down, the users have little recourse. Traditional installed software keeps functioning even afterthe 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 newfeatures whenever they wish, even if the users would like to wait until the bugs have been worked out beforeupgrading. The option of simply skipping a weak software version is often not available. The company can foistunwanted features on the users or cut costs by reducing bandwidth. Of course, companies will try to keep thegood will of their customers, but the users of web applications have fewer options in such cases unless a

Page 154: Course Wikibook

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 applicationA single-page application (SPA), also known as single-page interface (SPI), is a web application or web site thatfits 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 theappropriate 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 webtechnologies (such as those included in HTML5) can provide the perception and navigability of separate logicalpages in the application. Interaction with the single page application often involves dynamic communication with theweb server behind the scenes.

The term single-page application was coined by Steve Yen in 2005, though the concept was discussed at least asearly as 2003 and Stuart (stunix) Morris wrote the Self-Contained website at http:/ / slashdotslash. com with thesame goals and functions in 2002.

Technical approachesThere are various techniques available that enable the browser to retain a single page even when the applicationrequires server communication.

AJAXThe most prominent technique currently being used is Ajax. Predominantly using the XMLHttpRequest object fromJavaScript, 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 AJAXtechnique.

Page 155: Course Wikibook

Single-page application 151

Node.js/SignalRAsynchronous calls to the server may also be achieved using SignalR or Node.js in conjunction with Socket.io.

Browser pluginsAsynchronous 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 thecase where HTML is returned by the server, JavaScript on the client updates a partial area of the DOM (DocumentObject Model). When raw data is returned, often a client-side JavaScript XML / (XSL) process ( and in case ofJSON a template ) is used to translate the raw data into HTML, which is then used to update a partial area of theDOM.

Thin server architectureAn SPA moves logic from the server to the client. This results in the role of the web server evolving into a pure dataAPI or web service. This architectural shift has, in some circles, been coined "Thin Server Architecture" to highlightthat complexity has been moved from the server to the client, with the argument that this ultimately reduces overallcomplexity of the system.

Thick stateful server architectureThe server keeps the necessary state in memory of the client state of the page. In this way, when any request hits theserver (usually user actions), the server sends the appropriate HTML and/or JavaScript with the concrete changes tobring the client to the new desired state (usually adding/deleting/updating a part of the client DOM). At the sametime the state in server is updated. Most of the logic is executed in server and HTML is usually also rendered inserver. In some ways the server simulates a web browser, receiving events and performing delta changes in serverstate 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 communicationbridges.

Thick stateless server architectureIs a variant of the stateful server approach, in this case the client page sends the necessary data of the current state tothe server usually through AJAX requests, the server with this data is able to reconstruct in some way the client stateof 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 whichmotivated the request. The stateless variant of the thick server architecture requires more data sent to server and mayrequire more computational resources per request to reconstruct partially or fully the client page state in server, in thesame time this approach is more easily scalable because there is no per client page data kept in server and thereforeAJAX requests can be dispatched to different server nodes with no need of session data sharing or server affinity.

Page 156: Course Wikibook

Single-page application 152

Running locallySome SPAs may be executed from a local file using the file URI scheme. This gives users the ability to downloadthe SPA from a server and run the file from a local storage device, without depending on server connectivity. If suchan SPA wants to store and update data, it must be self-modifying.Wikipedia:Disputed statement That is, the SPAmust be capable of writing itself to disk, including a representation of the state that is to be persisted. Theseapplications benefit from advances available with HTML5, particularly Web Storage.

Challenges with the SPA modelBecause the SPA is an evolution away from the stateless page-redraw model that browsers were originally designedfor, 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 optimizationBecause of the lack of JavaScript execution on crawlers of all popular Web search engines, SEO (Search engineoptimization) 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 fragmentswithin the single URL of an SPA. Special behavior must be implemented by the SPA site to allow extraction ofrelevant metadata by the search engine's crawler. For search engines that do not support this URL hash scheme, thehashed 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 orframework 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 templatelanguage like Mustache or Handlebars. Such templates can be rendered from different host languages, such as Rubyon the server and JavaScript in the client. However, merely sharing templates typically requires duplication ofbusiness logic used to choose the correct templates and populate them with data. Rendering from templates mayhave negative performance effects when only updating a small portion of the page—such as the value of a text inputwithin a large template. Replacing an entire template might also disturb a user's selection or cursor position, whereupdating only the changed value might not. To avoid these problems, applications can use UI data bindings orgranular 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

Page 157: Course Wikibook

Single-page application 153

client informing of the current DOM state; the stateless mode may be also SEO compatible because SEOcompatibility 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 contextwhere search engine indexing is either a requirement, or desirable. Use cases include applications that surface privatedata hidden behind an authentication system. In the cases where these applications are consumer products, often aclassic "page redraw" model is used for the applications landing page and marketing site, which provides enoughmeta data for the application to appear as a hit in a search engine query. Blogs, support forums, and other traditionalpage redraw artifacts often sit around the SPA that can seed search engines with relevant terms.

Browser historyWith an SPA being, by definition, "a single page", the model breaks the browser's design for page history navigationusing 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 previouspage 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 thecurrent screen state. This can be achieved with JavaScript, and causes URL history events to be built up within thebrowser. As long as the SPA is capable of resurrecting the same screen state from information contained within theURL hash, the expected back button behavior is retained.

To further address this issue, the HTML5 specification has introduced pushState [3] and replaceState [4] providingprogrammatic access to the actual URL and browser history.

Page lifecycleAn SPA is fully loaded in the initial page load and then page regions are replaced or updated with new pagefragments loaded from the server on demand. To avoid excessive downloading of unused features, an SPA will oftenprogressively download more features as they become required, either small fragments of the page, or completescreen modules.

In this way an analogy exists between "states" in an SPA and "pages" in a traditional web site. Because "statenavigation" in the same page is analogous to page navigation, in theory any page based web site could be convertedto single-page replacing in the same page only the changed parts result of comparing consecutive pages in anon-SPA.

The SPA approach on the web is similar to the Single Document Interface (SDI) presentation technique popular innative desktop applications.

References[1] Flanagan, David, "JavaScript - The Definitive Guide", 5th ed., O'Reilly, 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)

Page 158: Course Wikibook

Uniform resource identifier 154

Uniform resource identifierIn computing, a uniform resource identifier (URI) is a string of characters used to identify a name of a webresource. Such identification enables interaction with representations of the web resource over a network (typicallythe World Wide Web) using specific protocols. Schemes specifying a concrete syntax and associated protocolsdefine each URI.

Relationship to URL and URN

This Euler diagram shows that a uniformresource identifier (URI) is either a uniformresource locator (URL), or a uniform resource

name (URN), or both.

URIs can be classified as locators (URLs), as names (URNs), or asboth. A uniform resource name (URN) functions like a person's name,while a uniform resource locator (URL) resembles that person's streetaddress. In other words: the URN defines an item's identity, while theURL provides a method for finding it.

The ISBN system for uniquely identifying books provides a typicalexample of the use of URNs. ISBN 0-486-27557-4(urn:isbn:0-486-27557-4) cites unambiguously a specific edition ofShakespeare's play Romeo and Juliet. To gain access to this object andread the book, one needs its location: a URL address. A typical URLfor this book on a Unix-like operating system would be a file path suchas file:///home/username/books/RomeoAndJuliet.pdf, identifying the electronic book library savedon a local disk drive. So URNs and URLs have complementary purposes.

URLs and URNsA URL is a URI that, in addition to identifying a web resource, specifies the means of acting upon or obtaining therepresentation: providing both the primary access mechanism, and the network "location". For example, the URLhttp://example.org/wiki/Main_Page refers to a resource identified as /wiki/Main_Page whoserepresentation, in the form of HTML and related code, is obtainable via HyperText Transfer Protocol (http://)from a network host whose domain name is example.org.

A URN is a URI that identifies a resource by name, in a particular namespace. One can use a URN to talk about aresource without implying its location or how to access it. For example, the URN urn:isbn:0-395-36341-1 is a URIthat specifies the identifier system, i.e. international standard book number (ISBN), as well as the unique referencewithin that system and allows one to talk about a book, but the URI does not itself suggest where or how to obtain anactual copy of it.

Technical publications, especially standards produced by the IETF and by the W3C, normally reflect a view outlinedin a W3C Recommendation of 2001, which acknowledges the precedence of the term URI rather than endorsing anyformal subdivision into URL and URN: "URL is a useful but informal concept: a URL is a type of URI thatidentifies a resource via a representation of its primary access mechanism (e.g., its network "location"), rather thanby some other attributes it may have". A URL is simply a URI that happens to point to a physical resource over anetwork.[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 asynonym for a URI that uses the 'http' or 'https' scheme. Such assumptions can lead to confusion, for example whenviewing XML source: the normal means of identifying unique XML vocabularies within an XML document is todeclare XML namespaces whose names are URIs that begin with 'http' and use the syntax of a genuine domain namefollowed by a file path, but which have no need to point to any specific file locations that actually exist.

Page 159: Course Wikibook

Uniform resource identifier 155

SyntaxThe URI syntax consists of a URI scheme name (such as "http", "ftp", "mailto", "crid" or "file") followedby a colon character, and then by a scheme-specific part. The specifications that govern the schemes determine thesyntax and semantics of the scheme-specific part. However, URI syntax does require all schemes to adhere to ageneral syntax that (among other things) reserves certain characters for special purposes (without always identifyingthose 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 resourcesURIs and URLs have a shared history. In 1994, Tim Berners-Lee’s proposals for HyperText implicitly introduced theidea of a URL as a short string representing a resource that is the target of a hyperlink. At the time, people referred toit 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 MarkupLanguage), HTTP, and web browsers developed, a need to distinguish a string that provided an address for aresource from a string that merely named a resource emerged. Although not yet formally defined, the term UniformResource Locator came to represent the former, and the more contentious Uniform Resource Name came to representthe latter.

During the debate over defining URLs and URNs it became evident that the two concepts embodied by the termswere merely aspects of the fundamental, overarching notion of resource identification. In June 1994, the IETFpublished Berners-Lee's RFC 1630: the first RFC that (in its non-normative text) acknowledged the existence ofURLs and URNs, and, more importantly, defined a formal syntax for Universal Resource Identifiers — URL-likestrings whose precise syntaxes and semantics depended on their schemes. In addition, this RFC attempted tosummarize the syntaxes of URL schemes in use at the time. It also acknowledged, but did not standardize, theexistence of relative URLs and fragment identifiers.

Refinement of specificationsIn December 1994, RFC 1738 formally defined relative and absolute URLs, refined the general URL syntax, definedhow to resolve relative URLs to absolute form, and better enumerated the URL schemes then in use. The agreeddefinition 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 theparts of RFCs 1630 and 1738 relating to URIs and URLs in general were revised and expanded by the IETF. Thenew RFC changed the significance of the "U" in "URI": it came to represent "Uniform" rather than "Universal". Thesections of RFC 1738 that summarized existing URL schemes migrated into a separate document.[2] IANA keeps aregistry 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

Page 160: Course Wikibook

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 theInternet-aware public at large, faded into near obsolescence. It now serves only as a reminder that some URIs act asaddresses because they have schemes that imply some kind of network accessibility, regardless of whether systemsactually 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 theyimply network-based resources at all.

On November 1, 2006, the W3C Technical Architecture Group published 'On Linking Alternative RepresentationsTo Enable Discovery And Publishing', a guide to best practices and canonical URIs for publishing multiple versionsof a given resource. For example, content might differ by language or by size to adjust for capacity or settings of thedevice used to access that content.

The Semantic Web uses the HTTP URI scheme to identify both documents and concepts in the real world: this hascaused confusion as to how to distinguish the two. The Technical Architecture Group of W3C (TAG) published ane-mail in June 2005 on how to solve this problem. The e-mail became known as the httpRange-14 resolution.[4] Toexpand on this (rather brief) email, W3C published in March 2008 the Interest Group Note Cool URIs for theSemantic Web. This explains the use of content negotiation and the 303-redirect code in more detail.

URI referenceA URI reference may take the form of a full URI, or just the scheme-specific portion of one, or even some trailingcomponent thereof – even the empty string. An optional fragment identifier, preceded by #, may be present at theend of a URI reference. The part of the reference before the # indirectly identifies a resource, and the fragmentidentifier 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 anabsolute '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 thedocument containing the URI reference, although this can be overridden by declarations made within the documentor as part of an external data transmission protocol. If the base URI includes a fragment identifier, it is ignoredduring the merging process. If a fragment identifier is present in the URI reference, it is preserved during themerging process.

Web document markup languages frequently use URI references to point to other resources, such as externaldocuments 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 thehref attribute of the a or link 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 xsl:import element/instruction is a URI reference; likewise

the first argument to the document() function.

Page 161: Course Wikibook

Uniform resource identifier 157

Examples of absolute URIs•• http://example.org/absolute/URI/with/absolute/path/to/resource.txt

•• ftp://example.org/resource.txt

• urn:issn:1535-3613

Examples of URI references• http://en.wikipedia.org/wiki/URI#Examples_of_URI_references ("http" specifies the

'scheme' name, "en.wikipedia.org" is the 'authority', "/wiki/URI" the 'path' pointing to this article, and"#Examples_of_URI_references" is a 'fragment' pointing to this section.)

•• http://example.org/absolute/URI/with/absolute/path/to/resource.txt

•• //example.org/scheme-relative/URI/with/absolute/path/to/resource.txt

•• /relative/URI/with/absolute/path/to/resource.txt

•• relative/path/to/resource.txt

•• ../../../resource.txt

•• ./resource.txt#frag01

•• resource.txt

•• #frag01

•• (empty string)

URI resolutionTo resolve a URI means either to convert a relative URI reference to absolute form, or to dereference a URI or URIreference by attempting to obtain a representation of the resource that it identifies. The 'resolver' component indocument processing software generally provides both services.

One can regard a URI reference as a same document reference: a reference to the document containing the URIreference itself. Document processing software can efficiently use its current representation of the document tosatisfy the resolution of a same document reference without fetching a new representation. This is only arecommendation, and document processing software can alternatively use other mechanisms to determine whether toobtain 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 baseURI is the URI of the document containing the reference. XSLT 1.0, for example, has a document() functionthat, in effect, implements this functionality. RFC 3986 also formally defines URI equivalence, which can be used todetermine that a URI reference, while not identical to the base URI, still represents the same resource and thus canbe considered to be a same document reference.

RFC 2396 prescribed a different method for determining same document references; RFC 3986 made RFC 2396obsolete, but RFC 2396 still serves as the basis of many specifications and implementations. This specificationdefines a URI reference as a same document reference if it is an empty string or consists of only the # characterfollowed by an optional fragment.

Relation to XML namespacesXML 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

Page 162: Course Wikibook

Uniform resource identifier 158

with 'http:', for example, likely has nothing to do with the HTTP protocol. XML professionals have debated thisthoroughly on the xml dev electronic mailing list; some feel that a namespace name could be a URI, since thecollection of names comprising a particular namespace could be regarded as a resource that is being identified, andsince a version of the 'Namespaces in XML' specification says that the namespace name is a URI reference. But theconsensus 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 fornamespace names.

To mitigate confusion that began to arise among newcomers to XML from the use of URIs (particularly HTTPURLs) 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) hasconsidered or approved it. An RDDL document can provide machine- and human-readable information about aparticular namespace and about the XML documents that use it. Authors of XML documents wereencouragedWikipedia:Manual of Style/Words to watch#Unsupported attributions to put RDDL documents inlocations such that if a namespace name in their document somehow becomes de-referenced, then an RDDLdocument would be obtained, thus satisfying the desire among many developers for a namespace name to point to anetwork-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, andUniform Resource Names (URNs): Clarifications and Recommendations'. This RFC outlines the work of a joint W3C/IETF working group setup specifically to normalize the divergent views held within the IETF and W3C over the relationship between the various 'UR*' terms andstandards. While not published as a full standard by either organization, it has become the basis for the above common understanding and hasinformed 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/ )

Page 163: Course Wikibook

JSON 159

JSON

JSON

Filename extension .json

Internet media type application/json

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ʒeɪsɒn/ JAY-soun, /ˈdʒeɪsən/ JAY-son), or JavaScript Object Notation, is an open standard format thatuses human-readable text to transmit data objects consisting of attribute–value pairs. It is used primarily to transmitdata 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 application/json. The JSON filename extension is .json.

HistoryDouglas Crockford was the first to specify and popularize the JSON format.[2] The economic justification that led tothe discovery of JSON grew out of a perceived market need for stateful, real-time server to browser communicationwithout 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,

Page 164: Course Wikibook

JSON 160

Yahoo! began offering some of its Web services in JSON. Google started offering JSON feeds for its GData webprotocol 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 alanguage-independent data format. Code for parsing and generating JSON data is readily available for a large varietyof 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 unescapedcharacters in strings that are illegal in JavaScript and ECMAScript strings.

Data types, syntax and exampleJSON's basic types are:

• Number (double-precision floating-point format in JavaScript, generally depends on implementation)• String (double-quoted Unicode, with backslash escaping)• Boolean (true or false)• 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)• null (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 stringfields for first name and last name, a number field for age, an object representing the person's address and an array ofphone number objects.

{

"firstName": "John",

"lastName": "Smith",

"age": 25,

"address": {

"streetAddress": "21 2nd Street",

"city": "New York",

"state": "NY",

"postalCode": 10021

},

"phoneNumbers": [

{

"type": "home",

"number": "212 555-1234"

},

{

"type": "fax",

"number": "646 555-4567"

}

]

Page 165: Course Wikibook

JSON 161

}

One potential pitfall of the free-form nature of JSON comes from the ability to write numbers as either numericliterals or quoted strings. For example, ZIP Codes in the northeastern U.S. begin with zeroes (for example, 06511 forNew Haven, Connecticut). If written with quotes by one programmer but not by another, the leading zero could bedropped 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 correctlyimplemented JSON parser will only accept valid JSON, preventing potentially malicious code from beinginadvertently executed.

var p = JSON.parse(contact);

Web browsers, such as Firefox and Internet Explorer, have, since 2010, included support for parsing JSON. Asnative browser support is more efficient and secure than eval(), native JSON support is included in Edition 5 ofthe ECMAScript standard.[3]

The jQuery library wraps a JSON object in a function constructor and executes it immediately when JSON.parse isnot present. This avoids using eval in the code.

var p = new Function('return ' + contact + ';')();

Despite the widespread belief that JSON is a JavaScript subset, this is not the case. Specifically, JSON allows theUnicode line terminators U+2028 line separator and U+2029 paragraph separator to appear unescaped in quotedstrings, while JavaScript does not. This is a consequence of JSON disallowing only "control characters". Thissubtlety is important when generating JSONP.

Unsupported native data typesJavaScript 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, withthe programs on both ends agreeing on how to convert between the types. As of 2011, there are some de factostandards; e.g. converting between Date and String, but none universally recognized.[5][6] Other languages may havea different set of native types that must be serialized carefully to deal with this type of conversion.

Schema and Metadata

JSON SchemaJSON 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, andhow 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/deserializationtools 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 differentprogramming languages,[9] each with varying levels of conformance.

Example JSON Schema:

{

"name": "Product",

"properties": {

Page 166: Course Wikibook

JSON 162

"id": {

"type": "number",

"description": "Product identifier",

"required": true

},

"name": {

"type": "string",

"description": "Name of the product",

"required": true

},

"price": {

"type": "number",

"minimum": 0,

"required": true

},

"tags": {

"type": "array",

"items": {

"type": "string"

}

},

"stock": {

"type": "object",

"properties": {

"warehouse": {

"type": "number"

},

"retail": {

"type": "number"

}

}

}

}

}

The JSON Schema above can be used to test the validity of the JSON code below:

{

"id": 1,

"name": "Foo",

"price": 123,

"tags": [ "Bar", "Eek" ],

"stock": {

"warehouse": 300,

"retail": 20

}

}

Page 167: Course Wikibook

JSON 163

MIME typeThe official MIME type for JSON text is "application/json".[10] Although most modern implementationshave 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, orrecognize the (unofficial) MIME type "text/json" or the content-type "text/javascript". Notableexamples include the Google Search API,[11] Yahoo!,[12] Flickr, Facebook API,[13] Lift framework,[14] Dojo Toolkit0.4,[15] etc.

JSON-RPCJSON-RPC is an RPC protocol built on JSON, as a replacement for XML-RPC or SOAP. It is a simple protocol thatdefines only a handful of data types and commands. JSON-RPC allows for notifications (information sent to theserver that do not require a response) and for multiple calls to be sent to the server that may be answered out oforder. Example of a JSON-RPC 2.0 request and response using positional parameters.

--> {"jsonrpc": "2.0", "method": "subtract", "params": [42, 23], "id":

1}

<-- {"jsonrpc": "2.0", "result": 19, "id": 1}

Use in AjaxJSON is often used in Ajax techniques. Ajax is a term for the ability of a webpage to request new data after it hasloaded into the web browser, usually in response to user actions on the displayed webpage. As part of the Ajaxmodel, the new data is usually incorporated into the user interface display dynamically the moment it arrives backfrom the server. For example when the user is typing into a search box, client-side code sends what they type to aserver that will respond with a possible list of items from its database. These might be displayed in a drop-down listbeneath the search box. The user may then stop typing and select the relevant string directly. When it was originallyimplemented in the mid-2000s, Ajax commonly used XML as the data interchange format. Now many developersuse 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 JSONformat from a server. (The server-side programming is omitted; it must be set up to service requests to the urlcontaining a JSON-formatted string.)

var my_JSON_object;

var http_request = new XMLHttpRequest();

http_request.open("GET", url, true);

http_request.onreadystatechange = function () {

var done = 4, ok = 200;

if (http_request.readyState === done && http_request.status === ok)

{

my_JSON_object = JSON.parse('''http_request.responseText''');

}

};

http_request.send(null);

Page 168: Course Wikibook

JSON 164

Security issuesAlthough JSON is intended solely as a data serialization format, its design as a non-strict subset of the JavaScriptscripting language poses several security concerns. These concerns center on the use of a JavaScript interpreter toexecute JSON text dynamically as embedded JavaScript. This exposes a program to errant or malicious scripts . Thisis a serious issue when dealing with data retrieved from the Internet. This easy and popular technique exploitsJSON's compatibility with the JavaScript eval() function which is described below.

JavaScript eval()

Because most JSON-formatted text is also syntactically legal JavaScript code, an easy way for a JavaScript programto parse JSON-formatted data is to use the built-in JavaScript eval() function, which was designed to evaluateJavaScript expressions. Rather than using a JSON-specific parser, the JavaScript interpreter itself is used to executethe JSON data producing native JavaScript objects. There are, however, some Unicode characters that are valid inJSON 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 whenthe data and the entire JavaScript environment are not within the control of a single trusted source. For example, ifthe data is itself not trusted, it is subject to malicious JavaScript code injection attacks. Such breaches of trust alsocan 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 eval(). The RFC that defines JSON (RFC4627) suggests using the following code to validate JSON before evaluating it (the variable 'text' is the input JSON):

var my_JSON_object = !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(

text.replace(/"(\\.|[^"\\])*"/g, ''))) && eval('(' + text + ')');

A new function, JSON.parse(), was thus developed as a safer alternative to eval. It is specifically intended toprocess JSON data and not JavaScript. It was originally planned for inclusion in the Fourth Edition of theECMAScript standard, but this did not occur. It was first added to the Fifth Edition, and is now supported by themajor browsers given below. For older ones, a compatible JavaScript library is available at JSON.org.

Native encoding and decoding in browsersRecent Web browsers now either have or are working on native JSON encoding/decoding. Not only does thiseliminate the eval() security problem above, but also increases performance due to the fact that functions mustno longer be parsed. Native JSON is generally faster compared to the JavaScript libraries commonly used before. Asof June 2009 the following browsers have or will have native JSON support, via JSON.parse() andJSON.stringify():

• 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.

Page 169: Course Wikibook

JSON 165

Object referencesThe JSON standard does not support object references, but the Dojo Toolkit illustrates how conventions can beadopted to support such references using standard JSON. Specifically, the dojox.json.ref [16] module providessupport 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 thisfunctionality has been removed in Firefox version 12.

Comparison with other formatsJSON is promoted as a low-overhead alternative to XML as both of these formats have widespread support forcreation, 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 nota data interchange language.

YAMLYAML is almost, but not entirely, a superset of JSON. For example, escaping a slash (/) with a backslash (\) is validJSON, but not valid YAML. (This is common practice when injecting JSON into HTML to protect against cross-sitescripting attacks.) Nonetheless, many YAML parsers can natively parse the output from many JSON encoders.[17]

XMLXML has been used to describe structured data and to serialize objects. Various XML-based protocols exist torepresent the same kind of data structures as JSON for the same kind of data interchange purposes. When data isencoded in XML, the result is typically larger than an equivalent encoding in JSON, mainly because of XML'sclosing tags. Yet, if the data is compressed using an algorithm like gzip, there is little difference becausecompression 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

{

"firstName": "John",

"lastName": "Smith",

"age": 25,

"address": {

"streetAddress": "21 2nd Street",

"city": "New York",

"state": "NY",

"postalCode": "10021"

},

"phoneNumber": [

{

"type": "home",

"number": "212 555-1234"

},

{

"type": "fax",

Page 170: Course Wikibook

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 bemore human-accessible by replacing nested delimiters like {}, [], and " marks with structured whitespace indents.

---

firstName: John

lastName: Smith

age: 25

address:

streetAddress: 21 2nd Street

city: New York

state: NY

postalCode: 10021

phoneNumber:

-

type: home

number: 212 555-1234

-

type: fax

number: 646 555-4567

XML samples

<person>

<firstName>John</firstName>

<lastName>Smith</lastName>

<age>25</age>

<address>

<streetAddress>21 2nd Street</streetAddress>

<city>New York</city>

<state>NY</state>

<postalCode>10021</postalCode>

</address>

<phoneNumbers>

<phoneNumber type="home">212 555-1234</phoneNumber>

<phoneNumber type="fax">646 555-4567</phoneNumber>

</phoneNumbers>

</person>

<person firstName="John" lastName="Smith" age="25">

<address streetAddress="21 2nd Street" city="New York" state="NY" postalCode="10021" />

Page 171: Course Wikibook

JSON 167

<phoneNumbers>

<phoneNumber type="home" number="212 555-1234"/>

<phoneNumber type="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 XMLprocessing technologies exist, from the Document Object Model to XPath and XSLT. XML can also be styled forimmediate display using CSS. XHTML is a form of XML so that elements can be passed in this form ready fordirect 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 describedhow 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)

Page 173: Course Wikibook

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 coretechnology of the Internet. It is the fifth revision of the HTML standard (created in 1990 and standardized as HTML4 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 iteasily readable by humans and consistently understood by computers and devices (web browsers, parsers, etc.).HTML5 is intended to subsume not only HTML 4, but also XHTML 1 and DOM Level 2 HTML.

Following its immediate predecessors HTML 4.01 and XHTML 1.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

Page 174: Course Wikibook

HTML5 170

been built with the consideration of being able to run on low-powered devices such as smartphones and tablets. InDecember 2011, research firm Strategy Analytics forecast sales of HTML5 compatible phones would top 1 billion in2013.[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 ofgeneric <object> tags) and MathML for mathematical formulas. These features are designed to make it easy toinclude and handle multimedia and graphical content on the web without having to resort to proprietary plugins andAPIs. Other new elements, such as <section>, <article>, <header> and <nav>, are designed to enrich thesemantic content of documents. New attributes have been introduced for the same purpose, while some elements andattributes have been removed. Some elements, such as <a>, <cite> and <menu> have been changed, redefinedor standardized. The APIs and Document Object Model (DOM) are no longer afterthoughts, but are fundamentalparts of the HTML5 specification. HTML5 also defines in some detail the required processing for invalid documentsso that syntax errors will be treated uniformly by all conforming browsers and other user agents.

HistoryThe Web Hypertext Application Technology Working Group (WHATWG) began work on the new standard in 2004.At that time, HTML 4.01 had not been updated since 2000, and the World Wide Web Consortium (W3C) wasfocusing future developments on XHTML 2.0. In 2009, the W3C allowed the XHTML 2.0 Working Group's charterto expire and decided not to renew it. W3C and WHATWG are currently working together on the development ofHTML5.

While HTML5 is often compared to Flash, the two technologies are very different. Both include features for playingaudio and video within web pages, and for using Scalable Vector Graphics. HTML5 on its own cannot be used foranimation and interactivity — it must be supplemented with CSS3 or JavaScript. There are many Flash capabilitiesthat 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 mediaaround April 2010 after Apple Inc's then-CEO Steve Jobs issued a public letter titled "Thoughts on Flash" where heconcludes 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 webdevelopment circles where some suggested that while HTML5 provides enhanced functionality, developers mustconsider the varying browser support of the different parts of the standard as well as other functionality differencesbetween HTML5 and Flash.[6] In early November 2011, Adobe announced that it will discontinue development ofFlash for mobile devices and reorient its efforts in developing tools utilizing HTML5.

Standardization processThe 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, forcontinuing work on HTML. Later that month, work based upon that position paper moved to the newly formed WebHypertext Application Technology Working Group (WHATWG), and a second draft, Web Applications 1.0, wasalso announced. The two specifications were later merged to form HTML5. The HTML5 specification was adoptedas 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 havebeen implemented in browsers despite the whole specification not yet having reached final Recommendation status.

2011 – Last Call

Page 175: Course Wikibook

HTML5 171

On 14 February 2011, the W3C extended the charter of its HTML Working Group with clear milestones forHTML5. In May 2011, the working group advanced HTML5 to "Last Call", an invitation to communities inside andoutside W3C to confirm the technical soundness of the specification. The W3C is developing a comprehensive testsuite to achieve broad interoperability for the full specification by 2014, which is now the target date forRecommendation. In January 2011, the WHATWG renamed its "HTML5" living standard to "HTML". The W3Cnevertheless 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 specificationwork, focusing on a single definitive standard, which is considered as a "snapshot" by WHATWG. The WHATWGorganization will continue its work with HTML5 as a "Living Standard". The concept of a living standard is that it isnever complete and is always being updated and improved. New features can be added but functionality will not beremoved.

In December 2012, W3C designated HTML5 as a Candidate Recommendation. The criterion for advancement toW3C Recommendation is "two 100% complete and fully interoperable implementations".

Plan 2014In September 2012, the W3C proposed a plan to release a stable HTML5 Recommendation by the end of 2014 andan 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, meaningidentifying specific features, either proposed or already existing in the spec, and advancing them as separatespecifications. Some technologies that were originally defined in HTML5 itself are now defined in separatespecifications:

• 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 byreference: SVG, MathML, WAI-ARIA.

Page 176: Course Wikibook

HTML5 172

Features

MarkupHTML5 introduces elements and attributes that reflect typical usage on modern websites. Some of them are semanticreplacements for common uses of generic block (<div>) and inline (<span>) elements, for example <nav>(website navigation block), <footer> (usually referring to bottom of web page or to last lines of HTML code), or<audio> and <video> instead of <object>.[7][8][9] Some deprecated elements from HTML 4.01 have beendropped, including purely presentational elements such as <font> and <center>, whose effects have long beensuperseded by the more capable Cascading Style Sheets. There is also a renewed emphasis on the importance ofDOM 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, beendesigned to be backward compatible with common parsing of older versions of HTML. It comes with a newintroductory line that looks like an SGML document type declaration, <!DOCTYPE html>, which triggers thestandards-compliant rendering mode. As of 5 January 2009, HTML5 also includes Web Forms 2.0, a previouslyseparate WHATWG specification.

New APIsIn addition to specifying markup, HTML5 specifies scripting application programming interfaces (APIs) that can beused with JavaScript.[12] Existing document object model (DOM) interfaces are extended and de facto featuresdocumented. There are also new APIs, such as:

HTML5 related APIs.[13]

• The canvas element for immediatemode 2D drawing. See Canvas 2DAPI Specification 1.0specification[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 providesbehaviour similar to cookies butwith 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 WHATWGHTML specification.[18] Some related technologies, which are not part of either the W3C HTML5 or the WHATWGHTML 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]

Page 177: Course Wikibook

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 animatingHTML elements. Animation is also possible using JavaScript and HTML 4[26]Wikipedia:Verifiability, and withinSVG elements through SMIL, although browser support of the latter remains uneven as of 2011.

XHTML5XHTML5 is the XML serialization of HTML5. XML documents must be served with an XML Internet media type(often confused with MIME type) such as application/xhtml+xml or application/xml. XHTML5requires XML's strict, well-formed syntax. The choice between HTML5 and XHTML5 boils down to the choice of aMIME/content type: the media type one chooses determines what type of document should be used.[27] In XHTML5,the HTML5 doctype html is optional and may simply be omitted. HTML that has been written to conform to boththe HTML and XHTML specifications—and which will therefore produce the same DOM tree whether parsed asHTML or XML—is termed "polyglot markup".

Error handlingHTML5 is designed so that old browsers can safely ignore new HTML5 constructs. For example, in contrast toHTML 4.01, the HTML5 specification gives detailed rules for lexing and parsing, with the intent that differentcompliant browsers will produce the same result in the case of incorrect syntax. Although HTML5 now defines aconsistent behavior for "tag soup" documents, those documents are not regarded as conforming to the HTML5standard.

PopularityAccording to a report released on 30 September 2011, 34 of the world's top 100 Web sites were using HTML5 – theadoption led by search engines and social networks. Another report released in August 2013 has shown that 153 ofthe Fortune 500 U.S. companies already implemented HTML5 on their corporate websites.[28]

Differences from HTML 4.01 and XHTML 1.xThe 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 text/html• New elements: article, aside, audio, bdi, canvas, command, data, datalist, details, embed,figcaption, figure, footer, header, keygen, mark, meter, nav, output, progress, rp, rt,ruby, section, source, summary, time, track, video, wbr

• New types of form controls: dates and times, email, url, search, number, range, tel, color• New attributes: charset (on meta), async (on script)• Global attributes (that can be applied for every element): id, tabindex, hidden, data-* (custom data

attributes)• Deprecated elements will be dropped altogether: acronym, applet, basefont, big, center, dir, font,frame, frameset, isindex, noframes, strike, tt

dev.w3.org provides the latest Editors Draft of "HTML5 differences from HTML 4", which provides a completeoutline of additions, removals and changes between HTML5 and HTML 4.

Page 178: Course Wikibook

HTML5 174

Logo

The W3C HTML5 logo

On 18 January 2011, the W3C introduced a logo to represent the use of or interest inHTML5. Unlike other badges previously issued by the W3C, it does not implyvalidity or conformance to a certain standard. As of 1 April 2011, this logo isofficial.

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, includingHTML5, CSS, SVG, WOFF, and others". Some web standard advocates, includingThe Web Standards Project, criticised that definition of "HTML5" as an umbrellaterm, pointing out the blurring of terminology and the potential formiscommunication. Three days later, the W3C responded to community feedbackand 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 managementIndustrial players including the BBC, Google, Microsoft, and Netflix have been lobbying for the inclusion ofEncrypted Media Extensions (EME),[29] a form of digital rights management (DRM), into the HTML5 standard. Asof the end of 2012 and the beginning of 2013, 27 organisations[30] including the Free Software Foundation[31] havestarted a campaign against including digital rights management in the HTML5 standard.[32][33] However in lateSeptember 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 W3Cstandard; 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 timepasses, but this was the situation between 1998 and 2012. This fact belongs to the folklore of the real experts, not the average experts floadingthe 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, andthus 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.

Page 179: Course Wikibook

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 numériques (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 aboutHTML5

• 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

Page 180: Course Wikibook

HTML5 in mobile devices 176

HTML5 in mobile devicesIn mobile devices, HTML5 is often used for mobile websites and mobileapplications on Mobile operating systems such as Firefox OS, Tizen, and UbuntuTouch. It provides developers with tools such as Offline Web Storage, GeoLocationAPI, Canvas Drawing, CSS3, and many more.

In Windows 8, developers can build HTML5, Metro Style apps.

Key features for mobile devices

Offline supportThe AppCache and database make it possible for mobile developers to store things locally on the device andinterruptions 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 serversto 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 ischanged when any of the resources change, prompting the browser to refresh the cache.

CACHE MANIFEST

# Version 0.1

offline.html

/iui/iui.js

/iui/iui.css

/iui/loading.gif

/iui/toolbar.png

/iui/whiteButton.png

/images/gymnastics.jpg

/images/soccer.png

/images/gym.jpg

/images/soccer.jpg

The "manifest" attribute of the app's "html" element should specify the URL of the manifest file.

<html manifest="manifest.mf">

The proper MIME type "text/cache-manifest" should also be set on the server for the cache manifest.

Page 181: Course Wikibook

HTML5 in mobile devices 177

Canvas drawingSites can mark off a space on a page where interactive pictures, charts and graphs, game components, and otherimaginations can be drawn directly by programming code and user interaction — no Flash or other plug-ins arerequired.

Video and audio streaming supportDevelopment is in the very early stages and subject to format disruption, but sites like YouTube and Pandora couldone day skip Flash entirely and bring streaming audio and video, with timed playback and further features.

GeoLocation APIThis is actually not part of HTML5, but is a separate specification. The geolocation API lets you share your locationwith trusted web sites. (This is actually the physical location of the device or of your internet connection, decidedbased on some combination of GPS, accelerometers, cellphone tower triangulation, and ISP address records.) Thelatitude and longitude are available to JavaScript on the page, which in turn can send it back to the remote webserver and show you location-aware content like local businesses or show your location on a map.

Following is the prominent API for a geolocation.

navigator.geolocation.getCurrentPosition(successCallback, errorCallback, options);

Geolocation is an object which is part of Navigator object. It uses the getCurrentPosition() method. Finding locationis an asynchronous operation as it requires the user’s permission for access. Hence callback functions for success andfailure are required.

Advanced formsEven 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 bythe browser means less time downloading JavaScript code and fewer round trips to the server if validation can befound before the form is posted.

HTML5 capabilities in top mobile devicesA Mobile Web Metrics Report demonstrates HTML5 capabilities in mobile devices. The report checked how manyHTML5 features are supported by different devices that access the mobile web.

Top 5 supported featuresGeolocationAPI, offline web application support, WebStorage, CSS3 Selectors and 2D animations are the top fivesupported 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 featuresMisc. Element types and attributes, extended user interaction concept, CSS3 in General, extended form concept, andextended video / audio support are the top five partially supported HTML5 features across the top 15 mobile devicesin all USA, UK, Germany, Malaysia, Australia markets examined.

Page 182: Course Wikibook

HTML5 in mobile devices 178

Top 5 not supported featuresMicrodata, 3D animation rendering, FileReader API, IndexedDB, and local Device support or the WebWorkersfeature 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 OSfragmentation.

Frameworks for app developmentWith HTML5 and mobile web development new tools and frameworks are popping up to provide a more consistentand comprehensive HTML5 support across mobile browsers. Such HTML5 mobile web frameworks are:

Appear IQAppear IQ is a mobility platform that simplifies the development and management of context-aware hybrid mobileweb applications (HTML5, CSS3, JavaScript), native mobile applications as well as their integration with enterpriseIT systems. It allows developers to make use of their web skills to craft powerful mobile applications that areoptimized to the end user's needs.

EnyoEnyo is an object-oriented JavaScript cross platform and cross device application framework emphasizingmodularity and encapsulation. It was originally launched for developers to create applications for the HP TouchPadwith Enyo 1.0 which ran the mobile operating system WebOS version 3.0. In January of 2012, Enyo 2.0 wasreleased as an open source project with support for several mobile operating systems and browsers. Since then, Enyohas been updated to version 2.2 for support for many more mobile operating systems and browsers along many otheradditions of usability to the development framework.

DaVinci StudioDaVinci is a framework that supports HTML5 mobile app development. The tool has a WYSIWYG (What You SeeIs What You Get) authoring environment in which users may drag and drop components to build applications. It alsocomes with a jQuery framework as well as other libraries and allows users to integrate open source libraries of theirchoice into the tool.

DHTMLX TouchDHTMLX Touch is an HTML5-based JavaScript library for building mobile web applications, in the form of UIwidgets 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 otherpopular devices.

Page 183: Course Wikibook

HTML5 in mobile devices 179

Google Web ToolkitGoogle Web Toolkit is a web app framework that can be used for developing mobile html5 apps in Java, especiallyin combination with optimized mobile widget libraries such as m-gwt [1]

JavaScriptJavaScript, is a scripting language built into nearly every modern browser. In Windows 8 and Windows RT (bothHTML Application and Windows Runtime), any HTML5 apps fully supported mobile operating systems (FirefoxOS and WebOS, Tizen and Ubuntu Touch), event handling in HTML5 apps is made possible by JavaScript.

JoJo is a JavaScript framework for HTML5 capable browsers and devices. It was originally designed to work onmobile platforms as a GUI and light data layer on top of PhoneGap. Since its creation, Jo also works as a lightweightframework for mobile browsers, newer desktop browsers, and dashboard widgets.

jQuery MobilejQuery Mobile, is a unified user interface system across all popular mobile device platforms, built on jQuery andjQuery UI.

jQTouchjQTouch is jQuery plugin for mobile web development on the iPhone, iPod Touch, Android 2.3+, and otherforward-thinking devices. This framework is heavy on the CSS, while light on the JavaScript.

KonyOneKonyOne is a multichannel mobile applications platform from Kony Solutions that supports all browsers includingHTML5 across channels (phones, tablets, kiosks and desktops).

M-ProjectThe-M-Project is an HTML5 JavaScript framework that targets iOS, Android, BlackBerry and webOS platforms. Itmakes use of jQuery on the JavaScript part and contains all UI and core files with features like offline support,internationalization and more.

LungoJsLungoJs is a framework powered by HTML5, CSS3 for iOS, Android, BlackBerry and WebOS. It has support fortouch events like tap, double-tap or swipe and does not use images (including the icons), as everything is vectorized.

MobileNationHQMobileNationHQ is a web based tool that uses a visual programming paradigm to facilitate the creation of HTML5mobile applications for iOS and android. The tool also supports the integration of custom JavaScript

qooxdoo Mobileqooxdoo 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 integratedtool chain and a state-of-the-art GUI toolkit.

Page 184: Course Wikibook

HTML5 in mobile devices 180

Sencha TouchSencha Touch is the first HTML5 framework for mobile devices. This framework builds web applications that makesense for mobile devices. It comes with a comprehensive UI widget library, complete touch event management withCSS transitions and an extensive data package.

Smart Mobile StudioSmart Mobile Studio is an Object Pascal based framework for HTML5 development. The compiler compiles ObjectPascal source code into a JavaScript driven web/mobile application. The IDE contains several components that canbe organized in a visual designer. The Smart Pascal dialect supports various wrapping and mapping methods againstthe JavaScript language. Such as "asm sections" that contains pure JavaScript and "external method/classdirective" that defines the interface in Smart Pascal and the implementation in JavaScript.

SproutCoreSproutCore, 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.

ViziAppsViziApps is a mobile app development platform that supports creation of HTML5 web apps and hybrid apps foriPhones, iPads, Android phones, and Android tablets without coding. App developers use a drag-and-drop approachto design and build mobile apps with ViziApps and access data with Google spreadsheets, web services, SQLdatabases and other popular web data sources. In addition to no-coding app design, custom JavaScript can be addedto include 3rd party libraries and to extend app functionality.

WorklightWorklight is a mobile application platform that supports the development of HTML5, hybrid and native mobileapplications. The Worklight Studio - the platform's IDE - allows mobile developers to make full use of all existingHTML5 functionality as well as further enhance these capabilities with utilities and mechanisms required by modernorganizations 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 AppsA hybrid mobile application (or hybrid mobile app) is a mobile application that runs inside of a native container andleverages the device’s web browser to display locally hosted HTML pages.[2] Hybrid mobile apps are composedmostly of HTML, JavaScript, and CSS. Device specific functionalities such as camera access, geolocation, andaccelerometer readings are exposed through a JavaScript API.

Differences from Native Apps and Mobile Web AppsHybrid mobile apps contain a mixture of native app and mobile web app concepts. They do contain native code butare not completely native. Typically the native code is provided by a framework and reveals a JavaScript API so thatthe app’s JavaScript code can perform native functions such as taking a picture with the camera. Extra functionalitycan 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 CSSfiles locally so no Internet access is required to launch a hybrid mobile app.[3] To the user a hybrid mobile appappears to be no different than a native app; it is launched and closed in the same manner as opposed to a mobileweb app, which must be accessed through the device’s web browser app.

Page 185: Course Wikibook

HTML5 in mobile devices 181

Pros and Cons of Hybrid AppsHybrid mobile apps have their pros and cons. When choosing what type of mobile application to develop it isimportant 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 theplatform 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 iOSdevelopment tools are more specialized. It can be argued that there is less of a learning curve when developinghybrid mobile apps compared to native apps.

•• The apps interface and logic can be built and debugged in the web browser using an emulation framework. Thiscould 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 comfortableenoughWikipedia:Disputed statement[citation needed]

• As for native apps, the hybrid code base requires recompilation and resubmission to the distribution networkwhere it is possible to instantly update a mobile web app’s codebase.

Hybrid Mobile App Frameworks

Name Website License LatestVersion

API

Apache Cordova (previouslyPhoneGap)

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:Disputedstatement

5.0 -

CocoonJS by Ludei Proprietary 1.4.4 Ludei [6]

Kendo Mobile Proprietary 2013.2.716

Page 186: Course Wikibook

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)

Page 187: Course Wikibook

Web storage 183

•• v•• t• e [1]

Web storage and DOM storage (document object model) are web application software methods and protocols usedfor storing data in a web browser. Web storage supports persistent data storage, similar to cookies but with a greatlyenhanced capacity[1] and no information stored in the HTTP request header.[2] There are two main web storagetypes: 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 HTML5 specification, but is now in a separate specification.[3] It is supported by Internet Explorer 8, Mozilla-basedbrowsers (e.g., Firefox 2+, officially from 3.5),[4] Safari 4, Google Chrome 4 (sessionStorage is from 5), and Opera10.50. As of 14 March 2011[5] Opera and IE9 supports the storage events.[6]

FeaturesWeb storage can be viewed simplistically as an improvement on cookies. However, it differs from cookies in somekey ways.

Storage sizeWeb storage provides far greater storage capacity (5 MB per origin in Google Chrome,[7] Mozilla Firefox,[8] andOpera; 10 MB per storage area in Internet Explorer;[9] 25MB per origin on BlackBerry 10 devices) compared to 4 kB(around 1000 times less space) available to cookies.

Client-side interfaceUnlike cookies, which can be accessed by both the server and client side, web storage falls exclusively under thepurview of client-side scripting.

Web storage data is not automatically transmitted to the server in every HTTP request, and a web server can'tdirectly 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 storageWeb storage offers two different storage areas—local storage and session storage—which differ in scope andlifetime. Data placed in local storage is per origin (the combination of protocol, hostname, and port number asdefined in the same origin policy) (the data is available to all scripts loaded from pages from the same origin thatpreviously stored the data) and persists after the browser is closed. Session storage is per-page-per-window and islimited to the lifetime of the window. Session storage is intended to allow separate instances of the same webapplication to run in different windows without interfering with each other, a use case that's not well supported bycookies.[10]

Page 188: Course Wikibook

Web storage 184

Interface and data modelWeb storage currently provides a better programmatic interface than cookies because it exposes an associative arraydata model where the keys and values are both strings. An additional API for accessing structured data is beingconsidered by the W3C Web Applications Working Group. [11]

UsageBrowsers that support web storage have the global variables 'sessionStorage' and 'localStorage' declared at thewindow level. The following JavaScript code can be used on these browsers to trigger web storage behaviour:

sessionStorage// Store value on browser for duration of the session

sessionStorage.setItem('key', 'value');

// Retrieve value (gets deleted when browser is closed and re-opened)

alert(sessionStorage.getItem('key'));

localStorage// Store value on the browser beyond the duration of the session

localStorage.setItem('key', 'value');

// Retrieve value (persists even after closing and re-opening the

browser)

alert(localStorage.getItem('key'));

Accessing data for the currently browsed domainThe following code can be used to retrieve all values stored in local storage for the currently browsed domain (thedomain 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 IEDeveloper Toolbar, Chrome Developer Tools, the Firebug extension in Firefox, or Opera Dragonfly:

var output = "LOCALSTORAGE

DATA:\n------------------------------------\n";

if (window.localStorage) {

if (localStorage.length) {

for (var i = 0; i < localStorage.length; i++) {

output += localStorage.key(i) + ': ' +

localStorage.getItem(localStorage.key(i)) + '\n';

}

} else {

output += 'There is no data stored for this domain.';

}

} else {

output += 'Your browser does not support local storage.'

}

console.log(output);

Page 189: Course Wikibook

Web storage 185

Data typesOnly strings can be stored via the Storage API.[12] Attempting to store a different data type will result in anautomatic conversion into a string in most browsers. Conversion into JSON (JavaScript Object Notation), however,allows for effective storage of JavaScript objects.

// Store an object instead of a string

localStorage.setItem('key', {name: 'value'});

alert(typeof localStorage.getItem('key')); // string

// Store an integer instead of a string

localStorage.setItem('key', 1);

alert(typeof localStorage.getItem('key')); // string

// Store an object using JSON

localStorage.setItem('key', JSON.stringify({name: 'value'}));

alert(JSON.parse(localStorage.getItem('key')).name); // value

NomenclatureThe 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, "Theterm DOM is used to refer to the API set made available to scripts in Web applications, and does not necessarilyimply the existence of an actual Document object..."[15]

Web Storage ManagementStorage of web storage objects is enabled by default in Mozilla Firefox and SeaMonkey, but can be disabled bysetting 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 canbe 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 withweb storage, such as "Click&Clean"[18][19] and "BetterPrivacy" which can be configured to remove the whole webstorage 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.

Page 190: Course Wikibook

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)

Page 191: Course Wikibook

187

Chapter 16: Online Exercises with theHTML5 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 / November 8, 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 canbe used by Web developers to develop user interfaces for mobile web applications that look and feel like nativeapplications 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 onAndroid, iOS, Windows, Tizen and BlackBerry devices, and produce a native-app-like experience inside a browser.

Page 192: Course Wikibook

Sencha Touch 188

Version history and supportSencha Touch is a product of Sencha, which was formed after popular JavaScript library projects Ext JS, jQTouchand Raphaël 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 thefirst stable version, 1.0, was released in November 2010. Version 1.1.0 added support for devices runningBlackBerry OS version 6. The latest release, Sencha Touch 2.3.1, was released in November, 2013 and is designedto 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. SenchaTouch 2.3.1 contains support for the Tizen browser. There are no announced plans to support Firefox Mobile.

FeaturesSencha Touch includes a set of graphical user interface GUI-based controls (or components) for use within mobileweb applications. These components are optimized for touch input. The components are: buttons with device specificthemes and effects; form elements such as text fields for email, date picker, and address; sliders, selectors, andcombo-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 languagebuilt over CSS.

Sencha Touch has eight in-built transition effects including slide over or under the current element, pop, flip, andcube. It supports common touch gestures built from touch events, which are Web standards but supported only byAndroid, iOS, and some touch enabled devices. These are tap, double tap, swipe, scroll, and pinch.

Comparison to native applicationsNative applications on mobile devices have access to device components such as the compass, and microphonewhich Sencha Touch can access through the use of a native shell such as Cordova. As mobile browsers and deviceshave evolved to meet emerging standards, APIs and components such as WebSockets, GPS, camera andaccelerometers have become available to mobile web applications, with GPS specifically supported by SenchaTouch. Sencha Touch can be used along with Cordova or Phonegap or its own native packager, to create applicationsnative to a mobile device that have access to currently native-only components, and which can be made availablefrom 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)

Page 193: Course Wikibook

189

Chapter 17: Introduction to NoSQLDatabases for Web Apps

NoSQLA NoSQL database provides a mechanism for storage and retrieval of data that is modeled in means other than thetabular relations used in relational databases. Motivations for this approach include simplicity of design, horizontalscaling and finer control over availability. NoSQL databases are often highly optimized key–value stores intendedprimarily for simple retrieval and appending operations, whereas an RDBMS is intended as a general purpose datastore. There will thus be some operations where NoSQL is faster and some where an RDBMS is faster. NoSQLdatabases are finding significant and growing industry use in big data and real-time web applications. NoSQLsystems are also referred to as "Not only SQL" to emphasize that they may in fact allow SQL-like query languages tobe used.

HistoryCarlo Strozzi used the term NoSQL in 1998 to name his lightweight, open-source relational database that did notexpose the standard SQL interface. Strozzi suggests that, as the current NoSQL movement "departs from therelational 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 ofLast.fm wanted to organize an event to discuss open-source distributed databases. The name attempted to label theemergence of a growing number of non-relational, distributed data stores that often did not attempt to provideatomicity, consistency, isolation and durability guarantees that are key attributes of classic relational databasesystems.

TaxonomyThere 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-relationaldatabases. Nevertheless, the basic classification that most would agree on is based on data model. A few of these andtheir prototypes are:

• Column: HBase, Accumulo, Cassandra• Document: MarkLogic, MongoDB, Couchbase• Key-value: Dynamo, Riak, Redis, MemcacheDB, Project Voldemort• Graph: Neo4J, OrientDB, Allegro, Virtuoso

Page 194: Course Wikibook

NoSQL 190

Classification based on data modelStephen 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, GigaspacesXAP

KV Store Keyspace, Flare, SchemaFree, RAMCloud

KV Store - Eventuallyconsistent

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 featureBen Scofield categorized NoSQL databases based on nonfunctional categories (“(il)ities“) plus a rating of theirfeature 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 storeThe central concept of a document store is the notion of a "document". While each document-oriented databaseimplementation differs on the details of this definition, in general, they all assume that documents encapsulate andencode data (or information) in some standard formats or encodings. Encodings in use include XML, YAML, andJSON 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 couldbe considered as records. But they are different: every record in a table has the same sequence of fields, whiledocuments in a collection may have fields that are completely different.

Page 195: Course Wikibook

NoSQL 191

Documents are addressed in the database via a unique key that represents that document. One of the other definingcharacteristics of a document-oriented database is that, beyond the simple key-document (or key–value) lookup thatyou can use to retrieve a document, the database will offer an API or query language that will allow retrieval ofdocuments 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

GraphThis kind of database is designed for data whose relations are well represented as a graph (elements interconnectedwith an undetermined number of relations between them). The kind of data could be social relations, public transportlinks, 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#

Page 196: Course Wikibook

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 storesKey–value stores allow the application to store its data in a schema-less way. The data could be stored in a datatypeof a programming language or an object. Because of this, there is no need for a fixed data model. The followingtypes 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

Page 197: Course Wikibook

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

Page 198: Course Wikibook

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 cloudNoSQL databases can be run on-premises, but are also often run on IaaS or PaaS platforms like Amazon WebServices, 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 ispossible to run a NoSQL database on these virtual machines. Users can upload their own machine image with adatabase installed on it, use ready-made machine images that already include an optimized installation of adatabase, 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 aservice, such as MongoDB, Redis and Cassandra, without physically launching a virtual machine instance for thedatabase. The database is provided as a managed service, meaning that application owners do not have to installand maintain the database on their own, and pay according to usage. Some database as a service providers provideadditional features, such as clustering or high availability, that are not available in the on-premise version of thedatabase (see the table below for several examples).

• Native cloud NoSQL databases - some providers offer a NoSQL database service which is available only on thecloud. A well-known example is Amazon’s SimpleDB, a simple NoSQL key-value store. SimpleDB cannot beinstalled 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 thesedeployment models:

Page 199: Course Wikibook

NoSQL 195

DeploymentModel

DatabaseTechnology

Provider Cloud-Specific Features Pricing Model

Virtual machineimage

MongoDB MongoDB - machine images for AmazonEC2[5] and Windows Azure[6]

None •• Database and machineimage - open source

•• Amazon/Azure instances -pay per use

VirtualMachine Image

Redis • Redis - standard open sourceinstallation

• Script for installation on Amazon EC2[7]

• Recommended installation onWindows Azure [8]

None •• Database and machineimage - open source

•• Amazon/Azure instances -pay per use

Virtual machineimage

Cassandra Apache Cassandra - machine image forAmazon EC2[9]

None •• Database and machineimage - open source

•• Amazon instances - pay peruse

Database as aService

MongoDB Mongolab[10] - available on Amazon,Google, Joyent, Rackspace and WindowsAzure

•• Managed service•• High availability•• Automatic failover•• Pre-configured

clustering

• Free up to 500MB (ondisk)[11]

•• Paid plans based onarchitecture and storage size

Database as aService

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 microinstance[13]

• Pay per use for machineutilization, no separatecharge for data usage[14]

Database as aService

Redis RedisToGo[15] - available on AmazonEC2, RackSpace, Heroku, AppHarbor,Orchestra

•• Managed service•• Daily backups•• API enabling creation,

deletion, or download ofRedis instances

•• Free up to 5MB (memory)•• Paid plans based on

memory usage

Database as aService

Redis Redis Cloud (Garantia Data)[16] -available on Amazon EC2, WindowsAzure, 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 aService

Cassandra InstaClustr[18] - available on AmazonEC2, RackSpace, Windows Azure,Joyent, Google Compute Engine

•• Managed service•• Performance tuning•• Monitoring•• Automated backups•• DataStax OpsCenter for

cluster admin

Paid plans based on diskstorage, memory usage andCPU cores[19]

Native cloudNoSQLdatabase

Amazon SimpleDB Amazon Web Services •• Managed service•• High availability•• Unlimited scale•• Data durability

• Free for 750 hours on microinstance[20]

•• Pay per use - separatecharge for machineutilization and data usage

Page 200: Course Wikibook

NoSQL 196

Native cloudNoSQLdatabase

Google App EngineDatastore[21]

Google •• No planned downtime•• Atomic transactions•• High availability of

reads and writes

• Free with quota systemlimiting instance hours,storage and throughput[22]

•• Pay per use based oninstance hours, storage,throughput and otherparameters

Native cloudNoSQLdatabase

SalesForceDatabase.com[23]

SalesForce •• Unlimited scale•• Access to SalesForce

meta data•• Social API•• Support for mobile

clients•• Multi-tenancy

• Free up to 100K recordsand 50K transactions[24]

•• Pay per use based on users,number of records andtransactions

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.

Page 201: Course Wikibook

NoSQL 197

Further reading• Pramod Sadalage and Martin Fowler (2012). NoSQL Distilled: A Brief Guide to the Emerging World of Polyglot

Persistence. Addison-Wesley. ISBN 0-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.

Page 202: Course Wikibook

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,Benoît Chesneau, Filipe Manana, Robert Newson

Developer(s) Apache Software Foundation

Initial release 2005

Stable release 1.5.0 / November 5, 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'sentirely composed of free and open-source software

Apache CouchDB, commonly referred to asCouchDB, is an open source database thatfocuses on ease of use and on being "adatabase that completely embraces theweb". It is a NoSQL database that usesJSON to store data, JavaScript as its querylanguage using MapReduce, and HTTP foran API. One of its distinguishing features ismulti-master replication. CouchDB was firstreleased in 2005 and later became anApache project in 2008.

Unlike in a relational database, CouchDBdoes not store data and relationships intables. 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

Page 203: Course Wikibook

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 thedatabase file during writes. Conflicts are left to the application to resolve. Resolving a conflict generally involvesfirst 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.

HistoryCouchDB (Couch is an acronym for cluster of unreliable commodity hardware)[2] is a project created in April 2005by Damien Katz, former Lotus Notes developer at IBM. Damien Katz defined it as a "storage system for a largescale object database". His objectives for the database were to become the database of the Internet and that it wouldbe designed from the ground up to serve web applications. He self-funded the project for almost two years andreleased 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] Afew months after, it graduated to a top-level project.[4] This led to the first stable version being released in July2010.[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.3in April 2013. In July 2013, the CouchDB community merged the codebase for BigCouch, Cloudant's clusteredversion of CouchDB, into the Apache project. The BigCouch clustering framework is prepared to be included in anupcoming release of Apache CouchDB.

Main featuresDocument Storage

CouchDB stores data as "documents", as one or more field/value pairs expressed as JSON. Field values can besimple things like strings, numbers, or dates; but ordered lists and associative arrays can also be used. Everydocument 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 ConcurrencyControl, 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 thatacts as the Map half of a map/reduce operation. The function takes a document and transforms it into a singlevalue 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. Thatmeans multiple replicas can have their own copies of the same data, modify it, and then sync those changes ata later time.

REST API

All items have a unique URI that gets exposed via HTTP. REST uses the HTTP methods POST, GET, PUTand DELETE for the four basic CRUD (Create, Read, Update, Delete) operations on all resources.

Eventual Consistency

Page 204: Course Wikibook

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 whenthe device is back online.

CouchDB also offers a built-in administration interface accessible via web called Futon.[7]

Use cases & production deploymentsReplication and synchronization capabilities of CouchDB make it ideal for using it in mobile devices, where networkconnection 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-definedqueries are to be run and where versioning is important (CRM, CMS systems, by example). Master-masterreplication is an especially interesting feature, allowing easy multi-site deployments.[8]

Enterprises that use CouchDBA 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 November2011.[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 onJuly 12, 2012.

A more comprehensive list of software projects and web sites that use CouchDB is available on the Apacheprojects's wiki[13]

Data manipulation: documents and viewsCouchDB manages a collection of JSON documents. The documents are organised via views. Views are definedwith 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 systemusing external socket servers and a JSON-based protocol.[14] As a consequence, view servers have been developed ina variety of languages (JavaScript is the default, but there are also PHP, Ruby, Python and Erlang).

Accessing data via HTTPApplications interact with CouchDB via HTTP. The following demonstrates a few examples using cURL, acommand-line utility. These examples assume that CouchDB is running on localhost (127.0.0.1) on port 5984.

Page 205: Course Wikibook

CouchDB 201

Action Request Response

Accessing

server

information

<font size="5.78">curl http://127.0.0.1:5984/</font> <font size="5.78">{ "couchdb": "Welcome", "version":"1.1.0"}</font>

Creating

a

database

named

wiki

<font size="5.78">curl -X PUT http://127.0.0.1:5984/wiki</font> <font size="5.78">{"ok": true}</font>

Attempting

to create

a second

database

named

wiki

<font size="5.78">curl -X PUT http://127.0.0.1:5984/wiki</font> <font size="5.78">{ "error":"file_exists", "reason":"The database could not be created, the file already exists."}</font>

Retrieve

information

about the

wiki

database

<font size="5.78">curl http://127.0.0.1:5984/wiki</font> <font size="5.78">{ "db_name": "wiki", "doc_count": 0, "doc_del_count": 0, "update_seq": 0, "purge_seq": 0, "compact_running": false, "disk_size": 79, "instance_start_time": "1272453873691070", "disk_format_version": 5}</font>

Delete

the

database

wiki

<font size="5.78">curl -X DELETE http://127.0.0.1:5984/wiki</font> <font size="5.78">{"ok": true}</font>

Create a

document,

asking

CouchDB

to supply

a

document

id

<font size="5.78">curl -X POST -H "Content-Type: application/json" --data \'{ "text" : "Wikipedia on CouchDB", "rating": 5 }' \http://127.0.0.1:5984/wiki</font>

<font size="5.78">{ "ok": true, "id": "123BAC", "rev": "946B7D1C"}</font>

Open source componentsCouchDB includes a number of other open source projects as part of its default package.

Page 206: Course Wikibook

CouchDB 202

Component Description License

SpiderMonkey SpiderMonkey is a code name for the first ever JavaScript engine, written by Brendan Eich at NetscapeCommunications, 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 andHTML.

Dual license:GPL and MIT

ICU International Components for Unicode (ICU) is an open source project of mature C/C++ and Java libraries forUnicode support, software internationalization and software globalization. ICU is widely portable to manyoperating systems and environments.

MIT License

OpenSSL OpenSSL is an open source implementation of the SSL and TLS protocols. The core library (written in the Cprogramming language) implements the basic cryptographic functions and provides various utility functions.

Apache-likeunique

Erlang Erlang is a general-purpose concurrent programming language and runtime system. The sequential subset ofErlang 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/

<3d4032300802121136p361b52ceyfc0f3b0ad81a1793@mail. 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-7D3446F07462@jaguNET. 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 Kristóf Kovács[9] Email from Elliot Murphy (Canonical) (http:/ / mail-archives. apache. org/ mod_mbox/ couchdb-dev/ 200910. mbox/ <4AD53996.

3090104@canonical. 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, ISBN 0-596-15816-5• Lennon, Joe (December 15, 2009), Beginning CouchDB (http:/ / www. apress. com/ book/ view/ 9781430272373)

(1st ed.), Apress, p. 300, ISBN 1-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, ISBN 1-4493-0312-9• Holt, Bradley (April 11, 2011), Scaling CouchDB (http:/ / oreilly. com/ catalog/ 9781449303433) (1st ed.),

O'Reilly Media, p. 72, ISBN 1-4493-0343-9• Brown, MC (October 31, 2011), Getting Started with CouchDB (http:/ / oreilly. com/ catalog/ 9781449307554)

(1st ed.), O'Reilly Media, p. 50, ISBN 1-4493-0755-8

Page 207: Course Wikibook

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, ISBN 1-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.

Page 208: Course Wikibook

204

Chapter 18: Full-Stack JavaScript: Designand implementation of a WebSocket App

WebSocketWebSocket is a protocol providing full-duplex communications channels over a single TCP connection. TheWebSocket protocol was standardized by the IETF as RFC 6455 in 2011, and the WebSocket API in Web IDL isbeing standardized by the W3C.

WebSocket is designed to be implemented in web browsers and web servers, but it can be used by any client orserver application. The WebSocket Protocol is an independent TCP-based protocol. Its only relationship to HTTP isthat its handshake is interpreted by HTTP servers as an Upgrade request.[1] The WebSocket protocol makes possiblemore interaction between a browser and a web site, facilitating live content and the creation of real-time games. Thisis made possible by providing a standardized way for the server to send content to the browser without beingsolicited by the client, and allowing for messages to be passed back and forth while keeping the connection open. Inthis way a two-way (bi-directional) ongoing conversation can take place between a browser and the server. A similareffect 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 environmentswhich block non-web Internet connections using a firewall. WebSocket protocol is currently supported in severalbrowsers including Google Chrome, Internet Explorer, Firefox, Safari and Opera. WebSocket also requires webapplications on the server to support it.

Technical overviewUnlike HTTP, WebSocket provides for full-duplex communication. Additionally, Websocket enables streams ofmessages on top of TCP. TCP alone deals with streams of bytes with no inherent concept of a message. BeforeWebSocket, port 80 full-duplex communication was attainable using Comet channels; however, Cometimplementation is nontrivial, and due to the TCP handshake and HTTP header overhead, it is inefficient for smallmessages. WebSocket protocol aims to solve these problems without compromising security assumptions of the web.

Browser implementationA secure version of the WebSocket protocol is implemented in Firefox 6, Safari 6, Google Chrome 14, Opera 12.10and Internet Explorer 10.

An older, less secure version of the protocol was implemented in Opera 11 and Safari 5, as well as the mobileversion of Safari in iOS 4.2. Also, the BlackBerry Browser in OS7 implements WebSocket. Although there are noknown exploits, it was disabled in Firefox 4 and 5, and Opera 11.

Page 209: Course Wikibook

WebSocket 205

WebSocket protocol handshakeTo establish a WebSocket connection, the client sends a WebSocket handshake request, and the server sends aWebSocket handshake response, as shown in the following example:

Client request:

GET /mychat HTTP/1.1

Host: server.example.com

Upgrade: websocket

Connection: Upgrade

Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==

Sec-WebSocket-Protocol: chat

Sec-WebSocket-Version: 12

Origin: http://example.com

Server response:

HTTP/1.1 101 Switching Protocols

Upgrade: websocket

Connection: Upgrade

Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=

Sec-WebSocket-Protocol: chat

The handshake resembles HTTP so that servers can handle HTTP connections as well as WebSocket connections onthe same port. However the specific fields involved, and what follows after the handshake, do not conform to theHTTP 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-WebSocket-Key which is a random value that has been base64 encoded. To form aresponse, the magic string 258EAFA5-E914-47DA-95CA-C5AB0DC85B11 is appended to this (undecoded)key. The resulting string is then hashed with SHA-1, then base64 encoded. Finally, the resulting reply occurs in theheader Sec-WebSocket-Accept.

Details of Sec-WebSocket-Key to Sec-WebSocket-Accept :

• x3JJHMbDL1EzLkh9GBhXDw==258EAFA5-E914-47DA-95CA-C5AB0DC85B11 string hashed bySHA-1 gives 0x1d29ab734b0c9585240069a6e4e3e91b61da1969 hexadecimal value.

• Encoding the SHA-1 hash by Base64 (using the binary of the SHA-1) yieldsHSmrc0sMlYUkAGmm5OPpG2HaGWk=, 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 infull-duplex mode. The data is minimally framed, with a small header followed by payload. WebSocket transmissionsare described as "messages", where a single message can optionally be split across several data frames. This canallow for sending of messages where initial data is available but the complete length of the message is unknown (itsends one data frame after another until the end is reached and marked with the FIN bit). With extensions to theprotocol, this can also be used for multiplexing several streams simultaneously (for instance to avoid monopolizinguse of a socket for a single large payload).

Page 210: Course Wikibook

WebSocket 206

Proxy traversalWebSocket protocol client implementations try to detect if the user agent is configured to use a proxy whenconnecting 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-compatiblehandshake so that HTTP servers can share their default HTTP and HTTPS ports (80 and 443) with a WebSocketgateway or server. The WebSocket protocol defines a ws:// and wss:// prefix to indicate a WebSocket and aWebSocket Secure connection, respectively. Both schemes use an HTTP upgrade mechanism to upgrade to theWebSocket protocol. Some proxy servers are transparent and work fine with WebSocket; others will preventWebSocket from working correctly, causing the connection to fail. In some cases, additional proxy serverconfiguration 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 theWebSocket server, then, whether or not the proxy server behaves as it should, the connection is almost certainlybound 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 WebSocketSecure connection ensures that an HTTP CONNECT command is issued when the browser is configured to use anexplicit proxy server. This sets up a tunnel, which provides low-level end-to-end TCP communication through theHTTP proxy, between the WebSocket Secure client and the WebSocket server. In the case of transparent proxyservers, the browser is unaware of the proxy server, so no HTTP CONNECT is sent. However, since the wire trafficis encrypted, intermediate transparent proxy servers may simply allow the encrypted traffic through, so there is amuch better chance that the WebSocket connection will succeed if WebSocket Secure is used. Using encryption isnot 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 ofkey data after the headers, but not advertising that data in a Content-Length: 8 header. This data was not forwardedby all intermediates, which could lead to protocol failure. More recent drafts (e.g., hybi-09) put the key data in aSec-WebSocket-Key header, solving this problem.

URI schemeThe WebSocket protocol specification defines two new URI schemes, ws: and wss:, for unencrypted and encryptedconnections respectively. Apart from the scheme name, the rest of the URI components are defined to use URIgeneric syntax.

Browser supportAll the latest browsers except Android browser support the latest specification (RFC 6455) of the WebSocketprotocol. A detailed protocol test suite report lists the conformance of those browsers to specific protocol aspects.

Page 211: Course Wikibook

WebSocket 207

Implementation status

Protocol Draft date InternetExplorer

Firefox(PC)

Firefox(Android)

Chrome (PC,Mobile)

Safari (Mac,iOS)

Opera (PC,Mobile)

AndroidBrowser

hixie-75[2]

February 4,2010

4 5.0.0

hixie-76[3]

hybi-00 [4]

May 6, 2010May 23, 2010

4.0(disabled)

6 5.0.1 11.00 (disabled)

7 hybi-07[5]

April 22, 2011 61

8 hybi-10[6]

July 11, 2011 7[7]1 7 14

13 RFC6455

December,2011

10 11 11 16 6 12.10

1 Gecko-based browsers versions 6–10 implement the WebSocket object as "MozWebSocket", requiring extra codeto integrate with existing WebSocket-enabled code.

Experimental extensionsThere is also a command-line switch for Google Chrome (--enable-websocket-over-spdy) that enables anearly experimental implementation of WebSocket over SPDY.

DevelopmentUsing the Google Chrome Developer Tools, developers can inspect the WebSocket handshake as well as theWebSocket 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 IETFHyBi Working Group

• The WebSocket protocol (http:/ / tools. ietf. org/ html/ draft-ietf-hybi-thewebsocketprotocol) - Internet-Draftpublished by the IETF HyBi Working Group

• The WebSocket protocol (http:/ / tools. ietf. org/ html/ draft-hixie-thewebsocketprotocol-76) - Originalprotocol proposal by Ian Hickson

• The WebSocket API (http:/ / dev. w3. org/ html5/ websockets/ ) - W3C Working Draft specification of the API

Page 212: Course Wikibook

WebSocket 208

• The WebSocket API (http:/ / www. w3. org/ TR/ websockets/ ) - W3C Candidate Recommendation specificationof 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 May 27, 2009[2]

Stable release 0.10.24 / December 19, 2013[3]

Preview release 0.11.10 / January 1, 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.jsutilizes JavaScript as its scripting language, and achieves high throughput via non-blocking I/O and a single-threadedevent loop.

Node.js contains a built-in HTTP server library, making it possible to run a web server without the use of externalsoftware, such as Apache or Lighttpd, and allowing more control of how the web server works.

Page 213: Course Wikibook

Node.js 209

History

Node creator Ryan Dahl

Node.js was created by Ryan Dahl starting in 2009. Its developmentand maintenance is sponsored by Joyent. Dahl was inspired to createNode.js after seeing a file upload progress bar on Flickr. The browserdid not know how much of the file uploaded and had to query the webserver. Dahl wanted an easier way. Ruby's Mongrel web server wasanother source of inspiration for Dahl. Originally Dahl had severalfailed projects in C, Lua, and Haskell, but when Google's V8 enginewas released, Dahl began to examine JavaScript. Even though hisoriginal idea was non-blocking he "backed out of that (a bit) in themodule system and a few other areas" as it made loading externallibraries troublesome.

On January 30, 2012 Dahl stepped aside, promoting coworker andNPM creator Isaac Schlueter to the gatekeeper position. Dahl wrote onGoogle groups,

Now that the rewrite on top of libuv is largely complete, Iam ceding my position as gatekeeper to Isaac Schlueter.Our energy will now be largely focused over the next fewmonths on improving the third party module systemexperience including a website for browsing modules, a new addon build system, and binaryinstallations from npm. Isaac is in the unique position to bridge the gap between core and externalmodules to ensure a pleasant experience. After three years of working on Node, this frees me up to workon research projects. I am still an employee at Joyent and will advise from the sidelines but I won't beinvolved in the day-to-day bug fixes. Isaac has final say over what makes it into the releases. Appealsfor new features, changes, and bug fixes should now be directed at him.

Dahl continues to work for Joyent and as an advisor for node.

DetailsNode.js is a packaged compilation of Google's V8 JavaScript engine, the platform abstraction layer, and a corelibrary, 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. Aftertrying solutions in several other programming languages he chose JavaScript because of the lack of an existing I/OAPI. 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 ObjectEnvironment for Perl; libevent for C; Vert.x for Java, JavaScript, Groovy, Python and Ruby; Akka for Java andScala; EventMachine for Ruby and vibe.d for D. Unlike most JavaScript programs, Node.js is not executed in a webbrowser, but instead as a server-side JavaScript application. Node.js implements some CommonJS specifications.[7]

It also provides a REPL environment for interactive testing.

Page 214: Course Wikibook

Node.js 210

ExamplesThis is an implementation of a "hello world" HTTP server in Node.js:

var http = require('http');

http.createServer(

function (request, response) {

response.writeHead(200, {'Content-Type': 'text/plain'});

response.end('Hello World\n');

}

).listen(8000);

console.log('Server running at http://localhost:8000/');

The following code is a simple TCP server which listens on port 8000 and echoes 'hello' upon connection:

var net = require('net');

net.createServer(

function (stream) {

stream.write('hello\r\n');

stream.on('end',

function () {

stream.end('goodbye\r\n');

}

);

stream.pipe(stream);

}

).listen(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)

CommunityNode.js has a developer community primarily centered on two mailing lists, nodejs,[8] nodejs-dev,[9] and the IRCchannel #node.js on freenode. The community gathers at NodeConf,[10] an annual developer conference focused onNode.js.[11]

Node.js is currently used by a number of large companies including LinkedIn,[12]Microsoft,[13] Yahoo!,[14] Walmartand Paypal.

Page 215: Course Wikibook

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, ISBN 978-1-4493-9858-3• Ornbo, George (September, 2012), Sams Teach Yourself Node.js in 24 Hours (First ed.), SAMS Publishing,

p. 440, ISBN 978-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,ISBN 978-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 9January 2013.

• Ribeiro Pereira, Caio (July, 2013), Aplicações web real-time com Node.js (https:/ / casadocodigo. refersion. com/l/ 630. 1389) (First ed.), Casa do Código, p. 143, ISBN 978-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/ )

Page 216: Course Wikibook

212

Chapter 19: Preparing an HTML5 App forApp Stores

Mobile appA 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 aretypically 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, theyare downloaded from the platform to a target device, such as an iPhone, BlackBerry, Android phone or WindowsPhone, but sometimes they can be downloaded to laptops or desktop computers. For apps with a price, generally apercentage, 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 useiPhone, 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 listedas "Word of the Year" by the American Dialect Society. In 2009, technology columnist David Pogue said that newersmartphones 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 toolsdrove rapid expansion into other categories, such as mobile games, factory automation, GPS and location-basedservices, banking, order-tracking, and ticket purchases. The explosion in number and variety of apps made discoverya 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 mobilephone users.[1] A May 2012 comScore study reported that during the previous quarter, more mobile subscribers usedapps than browsed the web on their devices: 51.1% vs. 49.8% respectively.[2] Researchers found that usage ofmobile 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) butthey will still generate US$26billion, up 44.4% on 2012's US$18bn. An analyst report estimates that the appeconomy creates revenues of more than 10 billion Euros per year within the European Union, while over 529thousand jobs have been created in EU28 states due to the growth of the app market.[4]

Page 217: Course Wikibook

Mobile app 213

DevelopmentDeveloping apps for mobile devices requires considering the constrains of these devices. Mobile devices run onbattery and have less powerful processors than personal computers. Developers also have to consider a lengthy arrayof screen sizes, hardware specifications and configurations because of intense competition in mobile software andchanges within each of the platforms.

Mobile application development requires use of specialized integrated development environments. Mobile apps arefirst tested within the development environment using emulators and later subjected to field testing. Emulatorsprovide an inexpensive way to test applications on mobile phones to which developers may not have physical access.

Distribution

Amazon AppstoreAmazon Appstore is an alternate application store for the Android operating system. It was opened in March 2011,with 3800 applications.

App StoreApple's App Store for iOS was the first app distribution service, which set the standard for app distribution servicesand continues to do so, opened on July 10, 2008, and as of January 2011, reported over 10 billion downloads. As ofJune 6, 2011, there are 425,000 third-party apps available, which are downloaded by 200 million iOS users. DuringApple's 2012 Worldwide Developers Conference in 20, Apple CEO Tim Cook announced that the App Store has650,000 available apps to download as well as "an astounding 30 billion apps" downloaded from the app store untilthat date. From an alternative perspective, figures seen in July 2013 by the BBC from tracking service Adevenindicate over two-thirds of apps in the store are "zombies", barely ever installed by consumers.[5]

BlackBerry WorldBlackBerry World is the application store for BlackBerry 10 and BlackBerry OS devices. It opened in April 2009 asBlackBerry 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 milliondownloads 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 PlayGoogle Play (formerly known as the Android Market) is an international online software store developed by Googlefor Android devices. It opened in October 2008. In April 2013, there were approximately 850,000 apps available forAndroid, and the estimated number of applications downloaded from Google Play was 40 billion. Android Apps canalso be sideload onto BlackBerry 10 devices.

Nokia StoreAn 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 itwould start using Windows Phone as its primary operating system. In May 2011, Nokia announced plans to rebrandits Ovi product line under the Nokia brand and Ovi Store was renamed Nokia Store in October 2011. Nokia Storeremains as the distribution platform for its previous lines of mobile operating systems but will no longer allowdevelopers to publish new apps or app updates for its legacy Symbian and MeeGo operating systems from January2014.

Page 218: Course Wikibook

Mobile app 214

Windows Phone StoreWindows Phone Store was introduced by Microsoft for its Windows Phone platform, which was launched in October2010. As of October 2012[6], it has over 120,000 apps available.

Windows StoreWindows Store was introduced by Microsoft for its Windows 8 and Windows RT platforms. While it can also carrylistings 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 beused with a keyboard and mouse, and on desktop computers and laptops)

Samsung Apps StoreAn app store for Samsung mobile phones was founded in September 2009. As of October 2011 Samsung Appsreached 10 million downloads. Currently the store is available in 125 countries and it offers apps for WindowsMobile, Android and Bada platforms.

Enterprise managementMobile application management (MAM) describes software and services responsible for provisioning andcontrolling access to internally developed and commercially available mobile apps used in business settings, whichhas become necessary with the onset of Bring your own device (BYOD) phenomenon. When an employee brings apersonal device into an enterprise setting, mobile application management enables the corporate IT staff to transferrequired applications, control access to business data, and remove locally cached business data from the device if itis 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 Böhmer, Brent Hecht, Johannes Schöning, Antonio Krüger, and Gernot Bauer. 2011. Falling asleep with Angry Birds, Facebook andKindle: a large scale study on mobile app usage (http:/ / dx. doi. org/ 10. 1145/ 2037373. 2037383). In: Proceedings of the 13th InternationalConference 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

Page 219: Course Wikibook

PhoneGap 215

PhoneGap

PhoneGap (Cordova)

Originalauthor(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 / November 28, 2013

Developmentstatus

Active

Written in JavaScript, HTML5, CSS3, Java, C++, C# and Objective-C

Operatingsystem

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 enablessoftware programmers to build applications for mobile devices using JavaScript, HTML5, and CSS3, instead ofdevice-specific languages such as Objective-C. The resulting applications are hybrid, meaning that they are neithertruly native (because all layout rendering is done via web views instead of the platform's native UI framework) norpurely web-based (because they are not just web apps, but are packaged as apps for distribution and have access tonative 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.

HistoryFirst developed at an iPhoneDevCamp event in San Francisco, PhoneGap went on to win the People's Choice Awardat 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. ThePhoneGap framework is used by several mobile application platforms such as ViziApps, Worklight, Convertigo, andappMobi as the backbone of their mobile client development engine. Adobe officially announced the acquisition ofNitobi Software (the original developer) on October 4, 2011. Coincident with that, the PhoneGap code wascontributed to the Apache Software Foundation to start a new project called Apache Cordova. The project originalname, Apache Callback, was viewed as too generic. Then it also appears in Adobe Systems as Adobe PhoneGap andalso as Adobe Phonegap Build.

Early versions of PhoneGap required a person making iOS apps to have an Apple computer, and a person makingWindows Mobile apps to have a computer running Windows. After September 2012, Adobe's PhoneGap Buildservice allows programmers to upload HTML, CSS and JavaScript source code to a "cloud compiler" that generatesapps for every supported platform.[4]

Page 220: Course Wikibook

PhoneGap 216

Design and rationaleThe 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, browsersupport for HTML5-based device access is not consistent across mobile browsers, particularly older versions ofAndroid. To overcome these limitations, the PhoneGap framework embeds HTML5 code inside a native WebViewon 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 canbe 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, filesystem, and more.

However, the use of web-based technologies leads many PhoneGap applications to run slower than nativeapplications with similar functionality. Adobe Systems warns that applications built using PhoneGap may be rejectedby Apple for being too slow or not feeling "native" enough (having appearance and functionality consistent withwhat users have come to expect on the platform).

Supported platformsPhoneGap 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 ofsupported features for each operating system.

Feature iPhone/iPhone

3G

iPhone3GS and

newer

Android1.0 – 4.2

WindowsPhone

BlackBerry10 and

PlayBook OS

4.6–4.7 5.x–6.0+ Bada Symbian webOS Tizen UbuntuTouch

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

Page 221: Course Wikibook

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. ISBN 978-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.ISBN 978-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.ISBN 978-1849518581.

• M. Wargo, John (June 11, 2012). PhoneGap Essentials: Building Cross-Platform Mobile Apps (http:/ /phonegapessentials. com/ ) (1st ed.). Addison-Wesley Professional. p. 384. ISBN 978-0321814296.

• Munro, Jamie (March 29, 2012). 20 Recipes for Programming PhoneGap: Cross-Platform Mobile Developmentfor Android and iPhone (http:/ / shop. oreilly. com/ product/ 0636920023708. do) (1st ed.). O'Reilly Media. p. 76.ISBN 978-1-4493-1954-0.

• Marinacci, Joshua (March 21, 2012). Building Mobile Applications with Java: Using the Google Web Toolkit andPhoneGap (http:/ / shop. oreilly. com/ product/ 0636920021063. do) (1st ed.). O'Reilly Media. p. 86.ISBN 978-1-4493-0823-0.

• Lunny, Andrew (September 23, 2011). PhoneGap Beginner's Guide (http:/ / www. packtpub. com/phonegap-beginners-guide/ book) (1st ed.). Packt Publishing. p. 328. ISBN 1-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. ISBN 1-4302-3903-4.

• Myer, Thomas (December 13, 2011). Beginning PhoneGap (http:/ / www. wiley. com/ WileyCDA/ WileyTitle/productCd-111815665X. html) (1st ed.). Wrox. p. 336. ISBN 1-118-15665-X.

External links• Official website (http:/ / www. phonegap. com)

Page 222: Course Wikibook

App store optimization 218

App store optimizationApp 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 storeoptimization is closely related to search engine optimization. Specifically, app store optimization includes theprocess of ranking highly in an app store's search results and top charts rankings. ASO marketers agree that rankinghigher 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 Google´s semantic search for applications

HistoryApple's iTunes App Store was launched July 10, 2008, along with the release of the iPhone 3G. It currently supportsiOS, including iPhone and iPad. There is also a non-mobile app store for Macs. Google's app store, Google Play, waslaunched 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 storesand the size of the stores (amount of apps and number of downloads). In 2010, Apple's App Store grew to processUSD$1.78 billion worth of apps. iTunes App Store had 435,000 apps as of July 11, 2011, while Google Play had438,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 ledapp marketersWikipedia:Avoid weasel words to realize how important it is to be noticed within an app store. Asmarketers 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 apresentation by Johannes Borchardt on November 4, 2009. It began to take hold as a standardized term not longafter, 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 tohelp them understand and optimize their success with app store optimization. For example, TechCrunch wrote aboutMobileDevHQ's App Store Optimization keyword volume tool on February 29, 2012 and AppCod.es' keyword toolon March 12, 2012.

MethodsApp store optimization is a young and evolving field. Methods of how to efficiently optimize an app's visibilitywithin an app store are still relatively unknown.

However, as the field is quickly becoming an important driver of app downloads for marketers, methods for AppStore Optimization are beginning to be more widespread. App Store Optimization tools provider MobileDevHQbroke App Store Optimization into three distinct parts: finding the right keywords, ranking highly for thosekeywords, and converting visitors into users. Nevertheless, ASO is not limited to keyword related tactics only, itactually involves all meta data available and accessible in the app stores, like icons, screenshots, description andupdate texts and others.

Page 223: Course Wikibook

App store optimization 219

White hat versus black hatMany app marketersWikipedia:Avoid weasel words attempt to perform ASO in a way that most app stores wouldapprove 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 appstores (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 asreported by The New York Times "warning app makers that using third-party services to gain top placement in AppStore charts could get them banned from the store."

Notes

Page 224: Course Wikibook

220

Chapter 20: Screen Casting Web Apps forUser Documentation

ScreencastA screencast is a digital recording of computer screen output, also known as a video screen capture, oftencontaining audio narration. The term screencast compares with the related term screenshot; whereas screenshot is apicture of a computer screen, a screencast is essentially a movie of the changes over time that a user sees on acomputer screen, enhanced with audio narration.

Origin of the termIn 2004, columnist Jon Udell invited readers of his blog to propose names for the emerging genre. Udell selected theterm "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 ScreenCamas a screencasting product of early 1990s. ScreenCam, however, is a federal trademark in the United States, whereasscreencast is not trademarked and has established use in publications as part of Internet and Computing vernacular.

UsesScreencasts can help demonstrate and teach the use of software features. Creating a screencast helps softwaredevelopers show off their work. Educators may also use screencasts as another means of integrating technology intothe curriculum.[1] Students can record video and audio as they demonstrate the proper procedure to solve a problemon an interactive whiteboard.

Screencasts are useful tools for ordinary software users as well: They help filing report bugs in which the screencaststake the place of potentially unclear written explanations; they help showing others how a given task is accomplishedin a specific software environment.

Organizers of seminars may choose to routinely record complete seminars and make them available to all attendeesfor future reference and/or sell these recordings to people who cannot afford the fee of the live seminar or do nothave the time to attend it. This will generate an additional revenue stream for the organizers and makes theknowledge available to a broader audience.

This strategy of recording seminars is already widely used in fields where using a simple video camera or audiorecorder is sufficient to make a useful recording of a seminar. Computer-related seminars need high quality andeasily readable recordings of screen contents which is usually not achieved by a video camera that records thedesktop.

Page 225: Course Wikibook

Screencast 221

HardwareAn alternative solution for capturing a screencast is the use of a hardware RGB or DVI frame grabber card. Thisapproach places the burden of the recording and compression process on a machine separate from the one generatingthe visual material being captured.

References[1] http:/ / eprints. hud. ac. uk/ 14208/ 2/ Ireland. pdf

Further reading1. 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). O'Reilly Digital Media. O'Reilly. Retrieved 7December 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 / 17 December 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 / 14 August 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

Page 226: Course Wikibook

Camtasia Studio 222

Camtasia Studio component of the product. Both versions of Camtasia started as enhanced screen capture programsand have evolved to integrate screen capture and post processing tools targeted at the educational and informationmultimedia development marketplace.

Camtasia Studio receives high marks from professional reveiwers and individual users alike. It is one of the mostcapable, integrated screen capture and editing packages. However, the per user license fee is relatively high for thiscategory 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 formplus enhancements summarized below.

Camtasia RecorderIn Camtasia Recorder, the presenter is able to start and stop recording with a hotkey combination at any time, atwhich point the recording may be halted and resumed or Camtasia Recorder can render the input that has beencaptured into a CAMREC format. The CAMREC file may be saved to disk or directly imported into the CamtasiaStudio component for editing. Camtasia Recorder allows audio recording while screen-capturing is in progress, sothe presenter can capture live narrate during a demonstration or presentation. Camtasia also supports dubbing inother audio tracks or voiceover during post-capture editing.

Camtasia Studio editorWithin Camtasia Studio editor one may import multimedia objects of various formats into the clip library and thenarrange them in time order and stacked tracks using the timeline form of user controls that is so common amongvideo editors today. Overlays of various types may be added including user-defined settings, such as when and howto display the cursor, pan-and-zoom effects such as the Ken Burns effect. Camtasia Studio v8 and Camtasia Mac v2offer numerous options to enhance sections of the recorded screen to draw attention via a cursor or drawn in pointerto highlight section(s) of the screen or to better illustrate the actions of the presenter on screen.

Post-productionAfter capturing a presentation in the Camatasia Recorder, the Camtasia Studio component may be used to modifyaudio & video displayed as tracks using the industry standard timeline control and object library interface with anintegrated preview window. The image in the infobox to the right is a screen capture of the timeline interface. Inaddition, Camtasia Studio allows voice overlay for the presenter or editor, as well as the ability to add sound effectsin 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 asthe application is playing back the recorded capture. They may do so in the Camtasia Studio editor and overlay theoriginal recorded audio.

Rendering & DeploymentThe 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

Page 227: Course Wikibook

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 onthe vast majority of current generation mobile devices, desktop, and laptop computers without requiring anyCamtasia software or license. An additional component is included, Camtasia Player v8.2 for the MicrosoftWindows version only, which may be freely shared and supports replay of variety of video formats on computersrunning Microsoft Windows.

ReviewsThe v8 updates to Camtasia Studio have eliminated some of the prior release issues including dramatically reducedrendering times and excessive consumption of system resources during production. Other pros from reviews listedbelow 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 doprovide 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 v6and 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 inthis 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 afull-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 thelearning curve is easily manageable. [3] [4] [5] [6]

Page 228: Course Wikibook

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)

Page 229: Course Wikibook

Article Sources and Contributors 225

Article Sources and ContributorsMassive 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, Fayenaticlondon, 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, Dodoïste, Dougweller, Eumi wanninayake, Frap, Ganesh121292, Illuminatusds, Jack Greenmaven, JaimeAgudo, 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, 5anonymous 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, BoudhayanGupta, 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, Götz, 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, Marsfenix, 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, Rōnin,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, 318anonymous 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 CharlesPotts, 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, Bleu`dove, 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, DiaB^ZeRo, 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,

Page 230: Course Wikibook

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, MattCrypto, 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,Mütze, 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, PaulRichter, Pauli133, Pbayowner, Pbevin, Pbryan, Pceriott, Pedant, Penagate, Pentasyllabic, Pepve, Perfecto, Pernogr, Peruvianllama, Peter S., Petereriksson, Pgan002, Pgk, Phantasee, Pharaoh ofthe 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, RasmusFaber, 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 NotBe, 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 Arnfjörð Bjarmason, Александр Мотин, शिव, තඹරු විජ�ස�කර, 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 Röst, 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, JasonQuinn, 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, MartinGeisler, 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, Tchoř, Techietim, Tedickey, Tedyu002, Tha sun, Thepizzaking, Thumperward, ThurnerRupert, Thv, TigerShark, Tim abell, Tinuzz, Tobias Bergemann, Tom Yates,Toofishes, Tpk5010, Trevor37, Trödel, 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 Arnfjörð Bjarmason, Žiedas, 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, Iæfai, 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,

Page 231: Course Wikibook

Article Sources and Contributors 227

VernoWhitney, Vgooditem, Vhastings, Viksrox, WWC, Wadsworth, Waldir, Walter Görlitz, Warnov, Warren, Wavelength, Wayne Slam, Wdror-wsu-gb, Wesley, Widefox, Wikiplorer, WilliamAllen 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, FredBradstadt, 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, Luís 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, Thüringer, 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, A!eX, A-moll9, Aapo Laitinen, Abdull, Abu ali, Acdx, Ace ofSpades, Adoniscik, Agawish, Agupte, Agus puryanto, Ahoerstemeier, Aitias, Ajfweb, Alansohn, Aldie, AlefZet, Alerante, Alistair1978, AlistairMcMillan, Amalthea, Andareed, Andkim99, AndreEngels, 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, DawnBard, Dcoetzee, Ddas, De728631, DeadEyeArrow, Delicates, Delirium, DerBorg, DerHexer, DigitalNinja, Dionyziz, Discospinster, Dmufasa, Dmyersturnbull, Doc Armitage, Don4of4, Doria, Drbab, 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, HydrogenIodide, 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, Raiseexception, 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 Säde,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 WHOWAS PHONE?, Tabledhote, TakuyaMurata, Tbannist, Tbhotch, TechTony, Template namespace initialisation script, Tempodivalse, TenOfAllTrades, Th.matt.wiki, The Anome, The QuirkyKitty, 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, GeneNygaard, 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, 16@r, 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, Cépey, D.brodale, DARTH SIDIOUS 2, DO'Neil, DTR, DVdm, Damian Yerrick, Damicatz, Danakil, Daniel.Cardenas, Daniel5Ko, Danielsig89, Dantheman531, Daonguyen95, Darkride, Dasch, DaveK@BTC, Daveed84x, Daveydweeb, David Edgar, David Gerard, David Wahler, David Woodward, DavidCary, Davidiad, Davigoli, Dbabbitt, Dcoetzee, Dee59, Dejansp, Delcnsltmd, Delfuego, Demonking123, Demonkoryu, Den fjättrade 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,

Page 232: Course Wikibook

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, Kingof 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 Elf1735, Madhusudan N, Magioladitis, Magister Mathematicae, Mahewa, Maian, Malcolmxl5, Mangst, MarK, Marc-André Aßbrock, 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, Mütze, 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, OfficialSpokesman, 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, SamKorn, Samfosteriam, Samliew, Samuell, Samwr1234, Sander Säde, 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, Sundström, 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 WildFalcon, 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, Σ, තඹරු විජ�ස�කර,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, RossHill, 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, Luís 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, RichFarmbrough, Rwwww, Sam Pointon, Scotopik, ScottSteiner, Sega381, Sherman Thompson, Skierpage, Smably, Smyth, Snakeskincowboy, Snehalnayan, Soc88, Soumyasch, Stassats, SunCreator, Sundström, Svdb, Swmcd, Synagonism, Tar-Mairon, TedPavlic, The Thing That Should Not Be, The Wild Falcon, ThePCKid, Thorenn, Torc2, Toyotabedzrock,[email protected], 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: 16@r, 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 Šušnjar, 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, [email protected], 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, [email protected], Cakeman, Caldini, Cameltrader, Camilo Sanchez, Campustr, Camw, Can't sleep, clown will eat me, Canadian-Bacon, Canderson7, CapitalR, Capricorn42, [email protected], 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, Długosz, 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,

Page 233: Course Wikibook

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,[email protected], 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, LKensington, 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, Mgcristi, 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, Khalidhassani, 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, Πrate, 83anonymous 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 anonymousedits

Web application  Source: http://en.wikipedia.org/w/index.php?oldid=586879372  Contributors: -Barry-, 16@r, Adamhauner, Adaxl, Aegicen, Alansohn, Alriode, Amcfreely, Amy2chow, AndyDingley, 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, DiegoMoya, Dj thegreat, Dnas, Dogloverxyz, Dtobey, Ebarbero, EdgeOfEpsilon, Edward, ElKevbo, ElTyrant, Eleclion, Elsendero, Enric Naval, Ercrt, Erianna, Erik Raven, Evildeathmath, FalconKirtaran, 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 Jańczuk, 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,

Page 234: Course Wikibook

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, DavidWahler, 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, 16@r, 1ForTheMoney, 90, A bit iffy, A1kmm, [email protected], Achowat, AdeBarkah,Agoode, AlanUS, Alarob, Alex rosenberg35, Amire80, Amux, Andonic, Andrés Santiago Pérez-Bergquist, Andyparkins, Anirudh4444, Anna Lincoln, AnonMoos, Aprock, Ariel., AsceticRose,Ashawley, Austin512, AxelBoldt, Azbarcea, Balrog, Beefyt, Beland, Betacommand, Bináris, 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, IanMoody, Ijabz, Ilovenagpur, Inimino, IvanLanin, Izhaki, Iæfai, 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, RoryO'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, TomW.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 Arnfjörð 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, DavidGerard, 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, MattDarby, 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, NilEinne, Nnemo, Nogburt, Nopetro, Norman.u.sy, Notetp, Noz92, Nsda, Nthep, Nunojpg, Nyssen, Ohnoitsjamie, Oliphaunt, Oneiros, Onorem, Ontoraul, Oppenheiter, Orange Suede Sofa, OrenBalaban, 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,

Page 235: Course Wikibook

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, Thüringer, Timwi, Tobiasivarsson,Tomdo08, Trbdavies, Tshanky, Tsm32, Tsvljuchsh, Tuvrotya, Tylerskf, Ugurbost, Uhbif19, Vegaswikian, Violaaa, Viper007Bond, Volt42, Voodootikigod, Vychtrle, Walter Görlitz, Wavelength,Webtrill, Weimanm, Whimsley, White gecko, Whooym, William greenly, Winston Chuen-Shih Yang, Winterst, Woohookitty, Wyverald, Xtremejames183, YPavan, Yasinaktimur, Zapher67,Zaxius, Zond, Милан Јелисавчић, 678 anonymous edits

CouchDB  Source: http://en.wikipedia.org/w/index.php?oldid=581746310  Contributors: 16@r, 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, Tóraí, 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 theOgre, 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: 16@r, 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, SimonNuttall, 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, 16@r, 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, Василий-Т, 74 anonymous edits

Page 236: Course Wikibook

Image Sources, Licenses and Contributors 232

Image Sources, Licenses and ContributorsFile: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, SmallbonesFile: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 CommonsAttribution-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 editsFile: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: OzhuFile: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: WorldEconomic Forum from Cologny, SwitzerlandFile: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, SmallbonesFile: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: SjgknightFile: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: SjgknightFile:Virtualbox logo.png  Source: http://en.wikipedia.org/w/index.php?title=File:Virtualbox_logo.png  License: unknown  Contributors: Codename Lisa, Foroa, Magog the OgreFile: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 GmbHFile: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:OnionBulbFile: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,WikipediaMasterFile:FildelningMedBitTorrent.png  Source: http://en.wikipedia.org/w/index.php?title=File:FildelningMedBitTorrent.png  License: Public Domain  Contributors: PiratbyrånFile: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 DownFile:Git operations.svg  Source: http://en.wikipedia.org/w/index.php?title=File:Git_operations.svg  License: Creative Commons Attribution 3.0  Contributors: Daniel KinzlerFile:Internet1.jpg  Source: http://en.wikipedia.org/w/index.php?title=File:Internet1.jpg  License: Creative Commons Attribution-Share Alike  Contributors: Rock1997File: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 TanakaFile:Http request telnet ubuntu.png  Source: http://en.wikipedia.org/w/index.php?title=File:Http_request_telnet_ubuntu.png  License: Public Domain  Contributors: TheJoshFile:Roy Fielding.jpg  Source: http://en.wikipedia.org/w/index.php?title=File:Roy_Fielding.jpg  License: Creative Commons Attribution 2.0  Contributors: Phillie CasablancaFile:Codecademy-banner.png  Source: http://en.wikipedia.org/w/index.php?title=File:Codecademy-banner.png  License: Public Domain  Contributors: CodecademyFile: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:Dodoïste (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:denboschfile: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: LupoFile:Crystal source.png  Source: http://en.wikipedia.org/w/index.php?title=File:Crystal_source.png  License: GNU Lesser General Public License  Contributors: Dake, KakuradyFile: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 aten.wikipediaFile: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 Folinifrom San Francisco, USAImage:Gcalendar.png  Source: http://en.wikipedia.org/w/index.php?title=File:Gcalendar.png  License: unknown  Contributors: Ayleuss, Hk1992, Mugunth KumarImage: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 ProjectFile: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 66File: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 editsFile:P14.png  Source: http://en.wikipedia.org/w/index.php?title=File:P14.png  License: Creative Commons Attribution-Sharealike 3.0  Contributors: User:Shrey2smartFile:Couchdb screenshot.png  Source: http://en.wikipedia.org/w/index.php?title=File:Couchdb_screenshot.png  License: GNU General Public License  Contributors: apache.orgFile: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:ScotXWFile: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 editsFile: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

Page 237: Course Wikibook

License 233

LicenseCreative Commons Attribution-Share Alike 3.0//creativecommons.org/licenses/by-sa/3.0/