<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://homeostasis.scs.carleton.ca/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Zero</id>
	<title>Soma-notes - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://homeostasis.scs.carleton.ca/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Zero"/>
	<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php/Special:Contributions/Zero"/>
	<updated>2026-05-12T22:01:19Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://homeostasis.scs.carleton.ca/wiki/index.php?title=Distributed_OS:_Fall_2017&amp;diff=21037</id>
		<title>Distributed OS: Fall 2017</title>
		<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=Distributed_OS:_Fall_2017&amp;diff=21037"/>
		<updated>2017-09-26T13:49:04Z</updated>

		<summary type="html">&lt;p&gt;Zero: Added project reminder.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Course Outline==&lt;br /&gt;
&lt;br /&gt;
[[Distributed OS: Fall 2017 Course Outline|Here]] is the course outline.  It should see only minor modifications during the semester.&lt;br /&gt;
&lt;br /&gt;
==Assigned Readings==&lt;br /&gt;
&lt;br /&gt;
===September 12, 2017===&lt;br /&gt;
&lt;br /&gt;
The Early Internet:&lt;br /&gt;
* [https://homeostasis.scs.carleton.ca/~soma/distos/2014w/kahn1972-resource.pdf Robert E. Kahn, &amp;quot;Resource-Sharing Computer Communications Networks&amp;quot; (1972)]  [http://dx.doi.org/10.1109/PROC.1972.8911 (DOI)]&lt;br /&gt;
* [https://archive.org/details/ComputerNetworks_TheHeraldsOfResourceSharing Computer Networks: The Heralds of Resource Sharing (1972)] - video&lt;br /&gt;
&lt;br /&gt;
The Mother of All Demos:&lt;br /&gt;
* [http://www.dougengelbart.org/firsts/dougs-1968-demo.html Doug Engelbart Institute, &amp;quot;Doug&#039;s 1968 Demo&amp;quot;].  You may want to focus on the [http://dougengelbart.org/events/1968-demo-highlights.html highlights] or the [http://sloan.stanford.edu/MouseSite/1968Demo.html annotated clips].&lt;br /&gt;
* [http://en.wikipedia.org/wiki/The_Mother_of_All_Demos Wikipedia&#039;s page on &amp;quot;The Mother of all Demos&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
===September 14, 2017===&lt;br /&gt;
&lt;br /&gt;
The Alto:&lt;br /&gt;
* [https://homeostasis.scs.carleton.ca/~soma/distos/2014w/alto.pdf Thacker et al., &amp;quot;Alto: A Personal computer&amp;quot; (1979)]  ([https://archive.org/details/bitsavers_xeroxparcttoAPersonalComputer_6560658 archive.org])&lt;br /&gt;
&lt;br /&gt;
===September 19, 2017===&lt;br /&gt;
&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Multics Wikipedia article on Multics]&lt;br /&gt;
* [http://homeostasis.scs.carleton.ca/~soma/distos/fall2008/unix.pdf Dennis M. Ritchie and Ken Thompson, &amp;quot;The UNIX Time-Sharing System&amp;quot; (1974)]&lt;br /&gt;
&lt;br /&gt;
Optional: Browse around [http://www.multicians.org/ the Multicians website].&lt;br /&gt;
&lt;br /&gt;
===September 21, 2017===&lt;br /&gt;
&lt;br /&gt;
* [http://homeostasis.scs.carleton.ca/~soma/distos/2008-01-21/walker-locus.pdf Bruce Walker et al., &amp;quot;The LOCUS Distributed Operating System.&amp;quot; (1983)]&lt;br /&gt;
* [http://homeostasis.scs.carleton.ca/~soma/distos/2008-01-28/ousterhout-sprite.pdf John Ousterhout et al., &amp;quot;The Sprite Network Operating System&amp;quot; (1987)]&lt;br /&gt;
&lt;br /&gt;
===September 26, 2017===&lt;br /&gt;
&lt;br /&gt;
* [http://homeostasis.scs.carleton.ca/~soma/distos/2008-01-21/cheriton-v.pdf David R. Cheriton, &amp;quot;The V Distributed System.&amp;quot; (1988)]&lt;br /&gt;
* [http://homeostasis.scs.carleton.ca/~soma/distos/2008-01-28/tanenbaum-amoeba.pdf Andrew Tannenbaum et al., &amp;quot;The Amoeba System&amp;quot; (1990)]&lt;br /&gt;
* [http://homeostasis.scs.carleton.ca/~soma/distos/2008-01-28/clouds-dasgupta.pdf Partha Dasgupta et al., &amp;quot;The Clouds Distributed Operating System&amp;quot; (1991)]&lt;br /&gt;
* Reminder for grad students (and optionally undergrad) to start writing an abstract, outline, and find roughly 10 references for their project&lt;br /&gt;
&lt;br /&gt;
===September 28, 2017===&lt;br /&gt;
&lt;br /&gt;
* [http://homeostasis.scs.carleton.ca/~soma/distos/2008-02-11/sandberg-nfs.pdf Russel Sandberg et al., &amp;quot;Design and Implementation of the Sun Network Filesystem&amp;quot; (1985)]&lt;br /&gt;
* [http://homeostasis.scs.carleton.ca/~soma/distos/2008-02-11/howard-afs.pdf John H. Howard et al., &amp;quot;Scale and Performance in a Distributed File System&amp;quot; (1988)]&lt;br /&gt;
&lt;br /&gt;
==Project Help==&lt;br /&gt;
&lt;br /&gt;
To develop your literature review or research proposal, start with a single research paper that you find interesting and that is related to distributed operating systems in some way.&lt;br /&gt;
&lt;br /&gt;
To begin selecting a paper, I suggest that you:&lt;br /&gt;
* search on Google Scholar using keywords relating to your interests, and/or&lt;br /&gt;
* browse the proceedings of major conferences that publish work related to distributed operating systems.&lt;br /&gt;
&lt;br /&gt;
The main operating system conferences are [https://www.usenix.org/conferences/byname/179 OSDI] and ACM SOSP ([http://sosp.org/ sosp.org],[http://dl.acm.org/event.cfm?id=RE208&amp;amp;CFID=475138068&amp;amp;CFTOKEN=43996267 ACM DL]).  Note that not all the work here is on distributed operating systems!  Also, many other conferences publish some work related to distributed operating systems, e.g. [https://www.usenix.org/conferences/byname/178 NSDI].&lt;br /&gt;
&lt;br /&gt;
To help you write a literature review or the background of a research paper, read the following:&lt;br /&gt;
* Harvey, &amp;quot;What Is a Literature Review?&amp;quot; [http://www.cs.cmu.edu/~missy/WritingaLiteratureReview.doc (DOC)] [http://www.cs.cmu.edu/~missy/Writing_a_Literature_Review.ppt (PPT)]&lt;br /&gt;
* [http://www.writing.utoronto.ca/advice/specific-types-of-writing/literature-review Taylor, &amp;quot;The Literature Review: A Few Tips On Conducting It&amp;quot;]&lt;/div&gt;</summary>
		<author><name>Zero</name></author>
	</entry>
	<entry>
		<id>https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_13&amp;diff=20952</id>
		<title>WebFund 2016W Lecture 13</title>
		<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_13&amp;diff=20952"/>
		<updated>2016-04-11T23:17:42Z</updated>

		<summary type="html">&lt;p&gt;Zero: Added link to JSFiddle.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Video==&lt;br /&gt;
&lt;br /&gt;
The video from the lecture given on March 1, 2016 [http://homeostasis.scs.carleton.ca/~soma/webfund-2016w/lectures/comp2406-2016w-lec13-01Mar2016.mp4 is now available].&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&lt;br /&gt;
===In lecture===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Lecture 13&lt;br /&gt;
----------&lt;br /&gt;
&lt;br /&gt;
To get help with assignment 4, look at Assignment 5 from Winter 2015.&lt;br /&gt;
&lt;br /&gt;
closures&lt;br /&gt;
&lt;br /&gt;
DOM&lt;br /&gt;
 - document object model&lt;br /&gt;
 - set of JavaScript objects for accessing the current page in the browser&lt;br /&gt;
 &lt;br /&gt;
client-side JS can access the DOM&lt;br /&gt;
  (data structures representing the current web page)&lt;br /&gt;
&lt;br /&gt;
server-side JS can access the operating system&lt;br /&gt;
&lt;br /&gt;
client-side JS is *limited* in its access&lt;br /&gt;
 - because such access is dangerous&lt;br /&gt;
 - ANYONE can run JavaScript in your browser&lt;br /&gt;
 - so, JavaScript in the browser is sandboxed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
execution sandbox is an environment for running untrusted programs&lt;br /&gt;
 - sandbox limits access and resources&lt;br /&gt;
&lt;br /&gt;
Client-side JavaScript has no native way to&lt;br /&gt;
  (well, it used to...)&lt;br /&gt;
  - access local files&lt;br /&gt;
  - open network connections&lt;br /&gt;
  - run multiple threads&lt;br /&gt;
  - access other windows/programs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Originally JavaScript was so limited it could do no background processing&lt;br /&gt;
 - could only run when the page was loaded or when the user acted&lt;br /&gt;
&lt;br /&gt;
Microsoft messed it up&lt;br /&gt;
 - Outlook Web Access&lt;br /&gt;
 - they built an ActiveX control which implemented XMLHttpRequest()&lt;br /&gt;
   - but really, it was a way to do GETs and POSTs in the background&lt;br /&gt;
 - other browsers implemented the API natively&lt;br /&gt;
&lt;br /&gt;
Now you could update data in a web page without reloading the page&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Student Notes===&lt;br /&gt;
&lt;br /&gt;
====storelogline.js and storelogs.js====&lt;br /&gt;
&lt;br /&gt;
*To use storelogline.js:&lt;br /&gt;
**Find an entry from an existing log file and copy the line&lt;br /&gt;
**Run storelogline.js with the copied line pasted after the script name as command line parameters&lt;br /&gt;
**Optionally, verify that the line was entered in the database by typing the following with the Mongo client:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
mongo&lt;br /&gt;
use log-demo&lt;br /&gt;
db.logs.find()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Writing storelogs.js=====&lt;br /&gt;
&lt;br /&gt;
*We can use the code from storeloglines.js to start building the storelogs.js script for tutorial 5&lt;br /&gt;
*To read in a file specified in the command line, you do &amp;lt;code&amp;gt;var data = fs.readFileSync(process.argv[2], ‘utf-8’);&amp;lt;/code&amp;gt;&lt;br /&gt;
**You use &amp;lt;code&amp;gt;process.argv[2]&amp;lt;/code&amp;gt; because in the terminal your third argument is going to be the file to read&lt;br /&gt;
*To split the data into lines, yo do &amp;lt;code&amp;gt;var lines = data.split(‘\n’);&amp;lt;/code&amp;gt;&lt;br /&gt;
*To parse the lines and store them into an array, you can do something like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
var entries = [];&lt;br /&gt;
int i; entry, fields, j;&lt;br /&gt;
&lt;br /&gt;
for(i=0;i&amp;lt;lines.length; i++) {&lt;br /&gt;
   if(lines[i] &amp;amp;&amp;amp;lines[i]!==null) {&lt;br /&gt;
      field=lines[i].split(‘ ‘); //this is used to split the lines at index i wherever the spaces occur&lt;br /&gt;
      console.log(split); //when this is printed you’ll see that it splits between all the spaces as well—&amp;gt;you can regular expression to fix this but we fixed it through the while loop&lt;br /&gt;
      entry={};&lt;br /&gt;
      j=0;&lt;br /&gt;
&lt;br /&gt;
      //Used to delete the spaces&lt;br /&gt;
      while(j&amp;lt;field.length) {&lt;br /&gt;
         if(field.lenght[j]===“ “) {&lt;br /&gt;
            field.splice(j, 1);&lt;br /&gt;
         }else{&lt;br /&gt;
            j++;&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      console.log(field); //—&amp;gt;this prints the logs out without the spaces&lt;br /&gt;
      entry.date=field[0] + “ “ + field[1]; //Than you start populating the array&lt;br /&gt;
      entry.time=field[2];&lt;br /&gt;
      entry.host=field[3];&lt;br /&gt;
      entry.service=field[4].slice(0,-1); //the program will have an error here without the if statement above&lt;br /&gt;
      entry.message=filed.slice(5).join(‘ ‘);&lt;br /&gt;
      //to store in to the entries ( the array )&lt;br /&gt;
      entries.push(entry);&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*To insert into the database you don’t need a loop to iterate. You can use the &amp;lt;code&amp;gt;collection.insert()&amp;lt;/code&amp;gt; method which can take an array (entries) as the argument to insert&lt;br /&gt;
**API’s have documentation and they change because there’s also &amp;lt;code&amp;gt;insertOne()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;insertMany()&amp;lt;/code&amp;gt; that seem to do the same thing&lt;br /&gt;
**For what we want to do &amp;lt;code&amp;gt;insert()&amp;lt;/code&amp;gt; will work&lt;br /&gt;
*For querying the database (assignment 4), there is a trick&lt;br /&gt;
**There are previous assignment solutions that can help you.&lt;br /&gt;
**It&#039;s the previous assignment from last year’s assignment 5&lt;br /&gt;
*Note that when using special characters like [] and () in regular expression, you will need to use a backslash to escape them&lt;br /&gt;
&lt;br /&gt;
====JavaScript Closures====&lt;br /&gt;
&lt;br /&gt;
*JavaScript closures are about nesting functions&lt;br /&gt;
**For example:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
var f = function(x) {&lt;br /&gt;
   function g(y) {&lt;br /&gt;
      return x+y;&lt;br /&gt;
   }&lt;br /&gt;
   return g; //The function g can see x&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var q = f(7);&lt;br /&gt;
var h = f(12);&lt;br /&gt;
console.log(“q = “ +q(4)); //prints 11&lt;br /&gt;
console.log(“h(4) = “ + h(4)); //Prints 16&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*This gives different answers because &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; is different in two two instances of &amp;lt;code&amp;gt;g()&amp;lt;/code&amp;gt;&lt;br /&gt;
*You cannot do things like this with C&lt;br /&gt;
*In examforms we have an app.get for list and we have a function in it that has a callback called &amp;lt;code&amp;gt;findCallback()&amp;lt;/code&amp;gt;&lt;br /&gt;
**This callback function has access to the request and response objects because they were in scope at the location where the callback function was defined&lt;br /&gt;
**To have &amp;lt;code&amp;gt;findCallback&amp;lt;/code&amp;gt; have access to request and response you just need to create different instances of &amp;lt;code&amp;gt;findCallback&amp;lt;/code&amp;gt; that have their own copies of request and response, therefore one version of &amp;lt;code&amp;gt;findCallback&amp;lt;/code&amp;gt; will have one request and on another call it will have another request&lt;br /&gt;
*Closure is a concept you need to understand because it’s very handy&lt;br /&gt;
&lt;br /&gt;
====Client-Side JavaScript====&lt;br /&gt;
&lt;br /&gt;
*In JavaScript we’ve been doing everything on the server side so far&lt;br /&gt;
*Using the browser dev tools, you can go to console and play around in it. Its almost like the Node environment in a terminal but with some missing features&lt;br /&gt;
*In the browser there is no &amp;lt;code&amp;gt;require()&amp;lt;/code&amp;gt;&lt;br /&gt;
*In the browser the unit is the page but in the server its the file&lt;br /&gt;
*You can access objects representing the page by typing &amp;lt;code&amp;gt;document&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;window&amp;lt;/code&amp;gt;&lt;br /&gt;
*When you load a webpage, it can load and run scripts&lt;br /&gt;
**By running JavaScript within the browser, you can write code that has access to the webpage (in particular, the DOM)&lt;br /&gt;
***The DOM (Document Object Model) is a tree-like structure of objects representing the HTML elements of the page&lt;br /&gt;
&lt;br /&gt;
=====Differences Between Client-Side and Server-Side JavaScript=====&lt;br /&gt;
&lt;br /&gt;
*Client-side JavaScript can access the DOM (data structure repressing the current web page)&lt;br /&gt;
*Server-side JavaScript can access the operating system&lt;br /&gt;
*In client-side JavaScript, you can’t access everything... It&#039;s *limited*&lt;br /&gt;
**That’s because such access is dangerous, the code could be coming from ANYONE&lt;br /&gt;
**ANYONE can run JavaScript in your browser and you don’t want this code messing with your system&lt;br /&gt;
**The browser is designed to protect your system from bad JavaScript, so JavaScript in the browser is sandboxed&lt;br /&gt;
***An execution sandbox is an environment for running untrusted code&lt;br /&gt;
***The sandbox limits access and resources&lt;br /&gt;
***Client-side JavaScript has no native way to:&lt;br /&gt;
****Access local files&lt;br /&gt;
****Open network connections&lt;br /&gt;
****Run multiple threads&lt;br /&gt;
****Access other windows/programs&lt;br /&gt;
*The model of client-side JavaScript was that it should be limited&lt;br /&gt;
*Originally JavaScript was so limited that it could do no background processing&lt;br /&gt;
**It originally could only run when the webpage was loaded or when the user acted&lt;br /&gt;
**It was singly threaded so you had to limit your execution&lt;br /&gt;
**Microsoft messed it up (in particular, the Outlook Web Access team messed it up)&lt;br /&gt;
***They built an ActiveX control which implemented XMLHttpRequest() —&amp;gt; an object that would send a GET or a POST request and would bring back a document that is assumed to be XML&lt;br /&gt;
***But more importantly, it was a way to do GETs and POSTs in the background&lt;br /&gt;
***Other browsers implemented the API natively&lt;br /&gt;
***Now you could update data in a web page without reloading the page&lt;br /&gt;
***Google really ran with this (with gmail, google maps, etc)&lt;br /&gt;
*Client-side JavaScript is the same JavaScript we have been working with except it has access to a webpage now but you access the things you can access the exact same way&lt;br /&gt;
*If you want to change how the current page looks or works you can type JavaScript directly into the browser console (it uses a read-eval-print loop which will affect the page)&lt;br /&gt;
&lt;br /&gt;
==Code==&lt;br /&gt;
&lt;br /&gt;
===nested.js===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot; line&amp;gt;&lt;br /&gt;
var f = function(x) {&lt;br /&gt;
    function g(y) {&lt;br /&gt;
	return x + y;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return g;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var q = f(7);&lt;br /&gt;
var h = f(12);&lt;br /&gt;
&lt;br /&gt;
console.log(&amp;quot;q(4) = &amp;quot; + q(4));&lt;br /&gt;
console.log(&amp;quot;h(4) = &amp;quot; + h(4));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://jsfiddle.net/Manouchehri/jy5793dd/&lt;br /&gt;
&lt;br /&gt;
===storeLogs.js===&lt;br /&gt;
&lt;br /&gt;
[http://homeostasis.scs.carleton.ca/~soma/webfund-2016w/code/storeLogs.js downloadable version]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot; line&amp;gt;&lt;br /&gt;
// storeLogs.js&lt;br /&gt;
//&lt;br /&gt;
// node storeLogs.js &amp;lt;logfile&amp;gt;&lt;br /&gt;
//&lt;br /&gt;
//&lt;br /&gt;
// The log messages in the file should be of the format:&lt;br /&gt;
// &amp;lt;month&amp;gt; &amp;lt;day of month&amp;gt; &amp;lt;24-hour time in hh:mm:ss&amp;gt; &amp;lt;host&amp;gt; &amp;lt;service name[pid]&amp;gt;: Actual message&lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
var mc = require(&#039;mongodb&#039;).MongoClient;&lt;br /&gt;
var fs = require(&#039;fs&#039;);&lt;br /&gt;
&lt;br /&gt;
var data = fs.readFileSync(process.argv[2], &#039;utf-8&#039;);&lt;br /&gt;
&lt;br /&gt;
var lines = data.split(&#039;\n&#039;);&lt;br /&gt;
&lt;br /&gt;
var entries = [];&lt;br /&gt;
&lt;br /&gt;
var i, j, entry, field;&lt;br /&gt;
&lt;br /&gt;
for (i=0; i&amp;lt;lines.length; i++) {&lt;br /&gt;
    if (lines[i] &amp;amp;&amp;amp; lines[i] !== &#039;&#039;) {&lt;br /&gt;
	field = lines[i].split(&#039; &#039;);&lt;br /&gt;
	entry = {};&lt;br /&gt;
	j = 0;&lt;br /&gt;
	while (j &amp;lt; field.length) {&lt;br /&gt;
	    if (field[j] === &amp;quot;&amp;quot;) {&lt;br /&gt;
		field.splice(j, 1);&lt;br /&gt;
	    } else {&lt;br /&gt;
		j++;&lt;br /&gt;
	    } &lt;br /&gt;
	}&lt;br /&gt;
	entry.date = field[0] + &amp;quot; &amp;quot; + field[1];&lt;br /&gt;
	entry.time = field[2];&lt;br /&gt;
	entry.host = field[3];&lt;br /&gt;
	entry.service = field[4].slice(0,-1);&lt;br /&gt;
	entry.message = field.slice(5).join(&#039; &#039;);&lt;br /&gt;
	entries.push(entry);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// entry.date = process.argv[2] + &amp;quot; &amp;quot; + process.argv[3];&lt;br /&gt;
// entry.time = process.argv[4];&lt;br /&gt;
// entry.host = process.argv[5];&lt;br /&gt;
// entry.service = process.argv[6].slice(0,-1);  // drop the trailing colon&lt;br /&gt;
// entry.message = process.argv.slice(7).join(&#039; &#039;);&lt;br /&gt;
&lt;br /&gt;
var db;&lt;br /&gt;
&lt;br /&gt;
var reportInserted = function(err, result) {&lt;br /&gt;
    if (err) {&lt;br /&gt;
	throw err;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    console.log(&amp;quot;Inserted the following log record:&amp;quot;);&lt;br /&gt;
    console.log(result.ops);&lt;br /&gt;
    db.close();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var connectCallback = function(err, returnedDB) {&lt;br /&gt;
    if (err) {&lt;br /&gt;
	throw err;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    db = returnedDB;&lt;br /&gt;
 &lt;br /&gt;
    db.collection(&#039;logs&#039;).insert(entries, reportInserted);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mc.connect(&#039;mongodb://localhost/log-demo&#039;, connectCallback);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Zero</name></author>
	</entry>
	<entry>
		<id>https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Exam_Review&amp;diff=20951</id>
		<title>WebFund 2016W Exam Review</title>
		<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Exam_Review&amp;diff=20951"/>
		<updated>2016-04-11T23:05:40Z</updated>

		<summary type="html">&lt;p&gt;Zero: Added Google Doc link.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Video==&lt;br /&gt;
&lt;br /&gt;
The video from the review session on April 11, 2016 [http://homeostasis.scs.carleton.ca/~soma/webfund-2016w/lectures/comp2406-2016w-examreview-11Apr2016.mp4 is now available].&lt;br /&gt;
&lt;br /&gt;
===Student Notes===&lt;br /&gt;
&lt;br /&gt;
https://docs.google.com/document/d/12aQlwzaVH6Xn9_E6os4xY54KTkZJwKjgKL-qkSfTVGQ/&lt;/div&gt;</summary>
		<author><name>Zero</name></author>
	</entry>
	<entry>
		<id>https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_23&amp;diff=20950</id>
		<title>WebFund 2016W Lecture 23</title>
		<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_23&amp;diff=20950"/>
		<updated>2016-04-11T17:34:54Z</updated>

		<summary type="html">&lt;p&gt;Zero: Defined CDN.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Video==&lt;br /&gt;
&lt;br /&gt;
The video from the lecture given on April 5, 2016 [http://homeostasis.scs.carleton.ca/~soma/webfund-2016w/lectures/comp2406-2016w-lec23-05Apr2016.mp4 is now available].&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&lt;br /&gt;
===In class===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Lecture 23&lt;br /&gt;
----------&lt;br /&gt;
&lt;br /&gt;
Scalability&lt;br /&gt;
&lt;br /&gt;
* You replicate your web application, should be&lt;br /&gt;
  &amp;quot;embarassingly parallel&amp;quot; (no direct interaction)&lt;br /&gt;
&lt;br /&gt;
* Communication between servers happens through the&lt;br /&gt;
  backend database&lt;br /&gt;
&lt;br /&gt;
Why not have the web servers talk directly to each other?&lt;br /&gt;
 - you then have to figure out how to do&lt;br /&gt;
   synchronization/concurrency right&lt;br /&gt;
 - that&#039;s what databases are for!&lt;br /&gt;
&lt;br /&gt;
So how in the world do you scale up databases?&lt;br /&gt;
&lt;br /&gt;
First answer: use a minimal solution&lt;br /&gt;
 - only get the functionality that you want&lt;br /&gt;
&lt;br /&gt;
First rule of scalability&lt;br /&gt;
 - you can&#039;t do everything at scale&lt;br /&gt;
&lt;br /&gt;
So, you have to choose what you will do&lt;br /&gt;
&lt;br /&gt;
Why are sacrifices necessary?&lt;br /&gt;
&lt;br /&gt;
latency versus bandwidth&lt;br /&gt;
&lt;br /&gt;
bandwith: bits transferred per second on average&lt;br /&gt;
latency: time to get first bit of response after request&lt;br /&gt;
&lt;br /&gt;
Consider a large truck full of hard disks driving&lt;br /&gt;
across Canada.&lt;br /&gt;
  - very, very high bandwidth&lt;br /&gt;
  - very, very high latency as well!&lt;br /&gt;
    (2 weeks to get first bit of response)&lt;br /&gt;
&lt;br /&gt;
Ideally, you want high bandwidth and low latency&lt;br /&gt;
 - bandwidth you get through parallelism&lt;br /&gt;
 - latency has to be engineered&lt;br /&gt;
&lt;br /&gt;
A &amp;quot;supercomputer&amp;quot; is one with low-latency memory access,&lt;br /&gt;
for LOTS of memory&lt;br /&gt;
  - so it has to have fast interconnects&lt;br /&gt;
  - thus, accesses to different nodes aren&#039;t much&lt;br /&gt;
    slower than local accesses&lt;br /&gt;
&lt;br /&gt;
Challeng for large web apps is having the database&lt;br /&gt;
answer queries with low latency&lt;br /&gt;
&lt;br /&gt;
But some amount of latency is inevitable&lt;br /&gt;
 - speed of light is finite&lt;br /&gt;
&lt;br /&gt;
So if you want fast access to your webserver worldwide&lt;br /&gt;
 - you need to replicate across the globe&lt;br /&gt;
 - be close to your clients&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
NoSQL databases became popular because of latency&lt;br /&gt;
concerns&lt;br /&gt;
 - you needed to be as fast as possible,&lt;br /&gt;
 - so strip it to the bone&lt;br /&gt;
&lt;br /&gt;
Use an in-memory key-value store if it is sufficient&lt;br /&gt;
  - lowest latency&lt;br /&gt;
  - least functionality&lt;br /&gt;
&lt;br /&gt;
If you have to, use an SQL database&lt;br /&gt;
  - highest latency&lt;br /&gt;
  - most functionality&lt;br /&gt;
&lt;br /&gt;
Or use something in between (MongoDB)&lt;br /&gt;
&lt;br /&gt;
Once you choose the type of database, you OPTIMIZE&lt;br /&gt;
 - minimize I/O and computation required per access&lt;br /&gt;
   (read or write)&lt;br /&gt;
 - example: query optimization&lt;br /&gt;
 - how you form the query&lt;br /&gt;
   - how database is organized&lt;br /&gt;
&lt;br /&gt;
Count the number of web pages that have the word&lt;br /&gt;
 &amp;quot;amazing&amp;quot; in them&lt;br /&gt;
&lt;br /&gt;
How?&lt;br /&gt;
 - first, need a database with a copy of the web pages&lt;br /&gt;
 - then, you could do linear search through all&lt;br /&gt;
   of the web pages...&lt;br /&gt;
&lt;br /&gt;
I ask this because a web search is a massive challenge&lt;br /&gt;
in query optimization&lt;br /&gt;
&lt;br /&gt;
 - need to limit scope as early as possible in query&lt;br /&gt;
 - organize data so queries are quick to be answered&lt;br /&gt;
    - precompute as much as possible&lt;br /&gt;
&lt;br /&gt;
The best you can do is table lookup. So have the right&lt;br /&gt;
tables ready!&lt;br /&gt;
&lt;br /&gt;
Key tool is making an INDEX&lt;br /&gt;
 - table of search term and pointers to data&lt;br /&gt;
&lt;br /&gt;
E.g., you have a table of customers sorted by ID&lt;br /&gt;
 - have an index of names, so a table of names versus&lt;br /&gt;
   IDs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Student Notes===&lt;br /&gt;
&lt;br /&gt;
====Counting Log Entries====&lt;br /&gt;
&lt;br /&gt;
*Exercise related to Assignment 6: The following is to help you in getting started on adding in single-page functionality for the web app.&lt;br /&gt;
**How do we get the data related to the number of log files and the number of entries from the database? Ask the database how many log files are there?&lt;br /&gt;
**What do we want to do? Count the number of entries. Use the count method.&lt;br /&gt;
***&amp;lt;code&amp;gt;db.logs.count()&amp;lt;/code&amp;gt; counts records&lt;br /&gt;
**How many distinct values are there?&lt;br /&gt;
***&amp;lt;code&amp;gt;db.logs.distinct(“file”)&amp;lt;/code&amp;gt; counts how many files we have&lt;br /&gt;
**The placeholder information is currently filled in on the server&lt;br /&gt;
***How? First go to views. The Jade file already has &amp;lt;code&amp;gt;numfiles&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;numentries&amp;lt;/code&amp;gt; variables which are passed in to the template through the call to &amp;lt;code&amp;gt;render()&amp;lt;/code&amp;gt; in the routes. How do we update them?&lt;br /&gt;
**What problems do we run in to when using the &amp;lt;code&amp;gt;count()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;distinct()&amp;lt;/code&amp;gt; methods?&lt;br /&gt;
***Reloading the page is one problem&lt;br /&gt;
***The real problem is with the callbacks&lt;br /&gt;
****In order to do this, we need to do 2 separate database operations to get the values. We can try to combine them, however, this entails nesting one call to the database within the other callback, and therefore is messy.&lt;br /&gt;
****Instead, we can make them each as a separate route. Set up the following in index.js:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
router.get(‘/count’, function(req,res){&lt;br /&gt;
   function reportCount(err,count){&lt;br /&gt;
      if (err) {&lt;br /&gt;
         res.send(-1);&lt;br /&gt;
      }&lt;br /&gt;
      else {&lt;br /&gt;
         res.send(count);&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   logsCollection.count({}, reportCount);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*A problem with this code is that the count is interpreted as a response code&lt;br /&gt;
*We can change the code to fix this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
router.get(‘/count’, function(req,res){&lt;br /&gt;
   function reportCount(err,count){&lt;br /&gt;
      if err {&lt;br /&gt;
         res.sendStatus(500);}&lt;br /&gt;
      } else {&lt;br /&gt;
         res.send({count: count});&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   logsCollection.count({}, reportCount);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*And the route for file count:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
router.get(‘/storeFiles’, function(req,res) {&lt;br /&gt;
   function reportStoredFiles(err,files){&lt;br /&gt;
      if err {&lt;br /&gt;
         res.sendStatus(500);&lt;br /&gt;
      } else{&lt;br /&gt;
         res.send(files); //to get number of files res.send({count: files.length});&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   logsCollection.distinct(“file”, reportStoredFiles);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*This code allows us to get these values to the client&lt;br /&gt;
*Currently, we do not have any client-side code to do anything with the values&lt;br /&gt;
*We want to somehow update the page to reflect the correct values&lt;br /&gt;
*We can do this on the server-side before sending the page to the client but this can be a pain so let’s change this so that we do an AJAX request from the browser and update the DOM&lt;br /&gt;
*We will need a client-side script to do this&lt;br /&gt;
*We can reference exam-storage to see how to link our scripts in the Jade templates&lt;br /&gt;
**In layout.jade, we want to link the jquery script since we will be using it&lt;br /&gt;
**From account.jade, we can see where our main client-side script was linked. We will need to do something like this for index.jade&lt;br /&gt;
**Make sure that the scripts are stored somewhere in the public directory and that the paths in the links are correct&lt;br /&gt;
*We can add some default text into index.jade to display if we do not have the actual file and log entry counts&lt;br /&gt;
*Then we need to write our query.js script&lt;br /&gt;
**The functions in this script are used to update the number of logs and number of entries shown in the browser. So, when you reload the page after uploading a file, the number of logs and entries also get updated accordingly.&lt;br /&gt;
***&amp;lt;code&amp;gt;updateStats()&amp;lt;/code&amp;gt; is used to make the AJAX requests to the server to get the updated values&lt;br /&gt;
***&amp;lt;code&amp;gt;updatesStatsText()&amp;lt;/code&amp;gt; is used to update the DOM with the new values&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
$(function() {&lt;br /&gt;
   var numEntries = 0;&lt;br /&gt;
   var numFiles = 0;&lt;br /&gt;
   var stats = $(“#stats”);&lt;br /&gt;
&lt;br /&gt;
   function updatesStatsText() {&lt;br /&gt;
      stats.html(“Currently we have “ + numEntries + “ log entries in “ + numFiles + “log files.”);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   function updateStats() {&lt;br /&gt;
      var numUpdated = 0;&lt;br /&gt;
      $.getJSON(“/ count”,function(v){&lt;br /&gt;
         numEntries = v.count;&lt;br /&gt;
         numUpdated++;&lt;br /&gt;
&lt;br /&gt;
         if(numUpdated &amp;gt;= 2){&lt;br /&gt;
            updateStatsText();&lt;br /&gt;
         }&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      $.getJSON(“/storedFileCount”, function(v){&lt;br /&gt;
         numFiles = v.count;&lt;br /&gt;
         numUpdated++;&lt;br /&gt;
&lt;br /&gt;
         if(numUpdated &amp;gt;= 2){&lt;br /&gt;
            updateStatsText(); });&lt;br /&gt;
         }&lt;br /&gt;
      });&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   updateStats();&lt;br /&gt;
}      &lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*With the assignment, everything should show up at the bottom of the page.&lt;br /&gt;
*This means upating the DOM in a similar fashion to what we have done here&lt;br /&gt;
&lt;br /&gt;
====Scalability====&lt;br /&gt;
&lt;br /&gt;
*When replicating your web application, your code should be “embarrassingly parallel” (no direct interaction)&lt;br /&gt;
*Communication between servers happens through the backend database&lt;br /&gt;
*Why not have the web servers talk directly to each other?&lt;br /&gt;
**You have to figure out how to do synchronization/concurrency right&lt;br /&gt;
**That&#039;s what databases are for! Let it deal with the problem&lt;br /&gt;
*So, how in the world do you scale up databases?&lt;br /&gt;
*First answer: use a minimal solution&lt;br /&gt;
**Only get the functionality that you want&lt;br /&gt;
*Basic/first rule of scalability&lt;br /&gt;
**You cant do everything at scale&lt;br /&gt;
*So you have to choose what you will do. Have to make some sacrifices&lt;br /&gt;
*Why are sacrifices necessary?&lt;br /&gt;
*Latency vs Bandwidth&lt;br /&gt;
**Bandwidth: bits transferred per second on average&lt;br /&gt;
**Latency: time to get first bit of response after request&lt;br /&gt;
*Consider a large truck full of hard disks driving across Canada. What’s the bandwidth of this truck? Low bandwidth or high bandwidth?&lt;br /&gt;
**It’s very very high bandwidth takes two weeks to travel across the country, but when it arrives, a lot of data has been transferred&lt;br /&gt;
**Very very high latency as well! (2 weeks to get first bit of response)&lt;br /&gt;
*Ideally you want HIGH BANDWIDTH and LOW LATENCY&lt;br /&gt;
**Bandwidth you get through parallelism&lt;br /&gt;
**Latency has to be engineered.&lt;br /&gt;
*Latency is hard so,&lt;br /&gt;
**A “supercoumputer” is one with low latency memory access, for lots of memory.&lt;br /&gt;
***So it has to have [https://www.mellanox.com/page/performance_infiniband fast interconnects between the nodes]. Fast meaning low latency, not high bandwidth.&lt;br /&gt;
***Thus, accesses to different nodes aren&#039;t much slower than local accesses&lt;br /&gt;
*Challenge for large web apps is having the database answer queries with low latency&lt;br /&gt;
*If a user goes to your website the page should be loaded fast. Even if it&#039;s a bit slow, they will be unhappy. So, you need the low latency.&lt;br /&gt;
*But some amount of latency is inevitable (laws of physics, Einstein)&lt;br /&gt;
**The speed of light is finite. A nanosecond in wire is a short piece of wire. A microsecond a pretty good size spool. Milliseconds is thousand times larger.&lt;br /&gt;
**How far do signals go?&lt;br /&gt;
***Microprocessors operate on the nanoseconds&lt;br /&gt;
***Networks on the milliseconds&lt;br /&gt;
***Ping time to get to the other side of the globe, 100s of millisecond&lt;br /&gt;
****If it&#039;s more than 50 milliseconds or half a second, people will notice&lt;br /&gt;
*So if you want fast access to your web server worldwide&lt;br /&gt;
**You need to replicate across the globe (this is what a CDN/content delivery network does)&lt;br /&gt;
**Be close to your clients&lt;br /&gt;
*In general, the more the functionality a database will have, the longer it will take&lt;br /&gt;
*NoSQL databases became popular because of latency concerns&lt;br /&gt;
**You needed to be as fast as possible&lt;br /&gt;
**So strip it to the bone&lt;br /&gt;
*Use an in-memory key value store if it is sufficient&lt;br /&gt;
**Lowest latency&lt;br /&gt;
**Least functionality&lt;br /&gt;
*If you have to, use an SQL database&lt;br /&gt;
**Higher latency&lt;br /&gt;
**Most functionality&lt;br /&gt;
*Or use something in between (MongoDB)&lt;br /&gt;
*Once you choose the type of database, you optimize&lt;br /&gt;
**Minimize I/O and computation require per access (read or write)&lt;br /&gt;
**Example: query optimization&lt;br /&gt;
**How you form the query&lt;br /&gt;
**How the database is organized&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Why Google is getting big bucks? How do you query the entire Web?&lt;br /&gt;
**Google is good at query optimization&lt;br /&gt;
*Google has a copy of everything on the Web. Their Web crawlers do this for them&lt;br /&gt;
*How do you make a query of the entire Web?&lt;br /&gt;
**Use a very big database!&lt;br /&gt;
**The interface to query through Google is just a regular website, it&#039;s just working with very large data sets!&lt;br /&gt;
*How can we count the number of web pages that have the word that have the word “amazing” in them?&lt;br /&gt;
**First you need a database with a copy of all the web pages&lt;br /&gt;
**Then you could do linear search through all the of the pages of the web (this is not an efficient solution)&lt;br /&gt;
*I ask this because a web search is a massive challenge in query optimization&lt;br /&gt;
**We need to limit scope as early as possible in query&lt;br /&gt;
**Organize data so queries can be answered quickly&lt;br /&gt;
**Precompute as much as possible&lt;br /&gt;
*The best you can do is table lookup. So have the right tables ready!&lt;br /&gt;
*When you do a Google search, it is picking out answer from answers it already figured out before&lt;br /&gt;
*A key tool is making an INDEX&lt;br /&gt;
**Table of search terms and pointers to data&lt;br /&gt;
**e.g. If you have a table of customers sorted by ID&lt;br /&gt;
***Have an index of names, so a table of names vs IDs&lt;br /&gt;
**An index is a table that is very short, one column for the indexed attribute and the second for the ID&lt;br /&gt;
**Is this what Google is doing? No, they are doing much fancier things but don’t tell anyone because of layers and layers of proprietary stuff&lt;br /&gt;
*Microsoft has about 100 millions lines of code, Linux kernel is 20 millions lines of code, Google is estimated at about 2 billion lines of code. This is not surprising, there is a lot of functionality&lt;br /&gt;
*Look up MapReduce. You can use it to find all web pages with “amazing”. All you do is you have a cluster of machines with data across them and you tell each machine to count the number of times amazing appears in the web pages you have on that machine and then accumulate altogether to be a single count. It can also handle failures during a query. Data is being stored in special replicated way, so that if there is one particular node that is failing, others can take over the job. It is functional programming at scale.&lt;br /&gt;
&lt;br /&gt;
==Code==&lt;br /&gt;
&lt;br /&gt;
* [http://homeostasis.scs.carleton.ca/~soma/webfund-2016w/code/analyzeLogs-filecount.zip analyzeLogs-filecount]&lt;br /&gt;
&lt;br /&gt;
Note this version has node_modules removed; copy this directory from analyzeLogs-sol or run &amp;quot;npm install&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Zero</name></author>
	</entry>
	<entry>
		<id>https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_23&amp;diff=20949</id>
		<title>WebFund 2016W Lecture 23</title>
		<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_23&amp;diff=20949"/>
		<updated>2016-04-11T17:31:32Z</updated>

		<summary type="html">&lt;p&gt;Zero: InfiniBand can be sub-microsecond, as far as I know it&amp;#039;s mostly what&amp;#039;s being used for supercomputer networking.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Video==&lt;br /&gt;
&lt;br /&gt;
The video from the lecture given on April 5, 2016 [http://homeostasis.scs.carleton.ca/~soma/webfund-2016w/lectures/comp2406-2016w-lec23-05Apr2016.mp4 is now available].&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&lt;br /&gt;
===In class===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Lecture 23&lt;br /&gt;
----------&lt;br /&gt;
&lt;br /&gt;
Scalability&lt;br /&gt;
&lt;br /&gt;
* You replicate your web application, should be&lt;br /&gt;
  &amp;quot;embarassingly parallel&amp;quot; (no direct interaction)&lt;br /&gt;
&lt;br /&gt;
* Communication between servers happens through the&lt;br /&gt;
  backend database&lt;br /&gt;
&lt;br /&gt;
Why not have the web servers talk directly to each other?&lt;br /&gt;
 - you then have to figure out how to do&lt;br /&gt;
   synchronization/concurrency right&lt;br /&gt;
 - that&#039;s what databases are for!&lt;br /&gt;
&lt;br /&gt;
So how in the world do you scale up databases?&lt;br /&gt;
&lt;br /&gt;
First answer: use a minimal solution&lt;br /&gt;
 - only get the functionality that you want&lt;br /&gt;
&lt;br /&gt;
First rule of scalability&lt;br /&gt;
 - you can&#039;t do everything at scale&lt;br /&gt;
&lt;br /&gt;
So, you have to choose what you will do&lt;br /&gt;
&lt;br /&gt;
Why are sacrifices necessary?&lt;br /&gt;
&lt;br /&gt;
latency versus bandwidth&lt;br /&gt;
&lt;br /&gt;
bandwith: bits transferred per second on average&lt;br /&gt;
latency: time to get first bit of response after request&lt;br /&gt;
&lt;br /&gt;
Consider a large truck full of hard disks driving&lt;br /&gt;
across Canada.&lt;br /&gt;
  - very, very high bandwidth&lt;br /&gt;
  - very, very high latency as well!&lt;br /&gt;
    (2 weeks to get first bit of response)&lt;br /&gt;
&lt;br /&gt;
Ideally, you want high bandwidth and low latency&lt;br /&gt;
 - bandwidth you get through parallelism&lt;br /&gt;
 - latency has to be engineered&lt;br /&gt;
&lt;br /&gt;
A &amp;quot;supercomputer&amp;quot; is one with low-latency memory access,&lt;br /&gt;
for LOTS of memory&lt;br /&gt;
  - so it has to have fast interconnects&lt;br /&gt;
  - thus, accesses to different nodes aren&#039;t much&lt;br /&gt;
    slower than local accesses&lt;br /&gt;
&lt;br /&gt;
Challeng for large web apps is having the database&lt;br /&gt;
answer queries with low latency&lt;br /&gt;
&lt;br /&gt;
But some amount of latency is inevitable&lt;br /&gt;
 - speed of light is finite&lt;br /&gt;
&lt;br /&gt;
So if you want fast access to your webserver worldwide&lt;br /&gt;
 - you need to replicate across the globe&lt;br /&gt;
 - be close to your clients&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
NoSQL databases became popular because of latency&lt;br /&gt;
concerns&lt;br /&gt;
 - you needed to be as fast as possible,&lt;br /&gt;
 - so strip it to the bone&lt;br /&gt;
&lt;br /&gt;
Use an in-memory key-value store if it is sufficient&lt;br /&gt;
  - lowest latency&lt;br /&gt;
  - least functionality&lt;br /&gt;
&lt;br /&gt;
If you have to, use an SQL database&lt;br /&gt;
  - highest latency&lt;br /&gt;
  - most functionality&lt;br /&gt;
&lt;br /&gt;
Or use something in between (MongoDB)&lt;br /&gt;
&lt;br /&gt;
Once you choose the type of database, you OPTIMIZE&lt;br /&gt;
 - minimize I/O and computation required per access&lt;br /&gt;
   (read or write)&lt;br /&gt;
 - example: query optimization&lt;br /&gt;
 - how you form the query&lt;br /&gt;
   - how database is organized&lt;br /&gt;
&lt;br /&gt;
Count the number of web pages that have the word&lt;br /&gt;
 &amp;quot;amazing&amp;quot; in them&lt;br /&gt;
&lt;br /&gt;
How?&lt;br /&gt;
 - first, need a database with a copy of the web pages&lt;br /&gt;
 - then, you could do linear search through all&lt;br /&gt;
   of the web pages...&lt;br /&gt;
&lt;br /&gt;
I ask this because a web search is a massive challenge&lt;br /&gt;
in query optimization&lt;br /&gt;
&lt;br /&gt;
 - need to limit scope as early as possible in query&lt;br /&gt;
 - organize data so queries are quick to be answered&lt;br /&gt;
    - precompute as much as possible&lt;br /&gt;
&lt;br /&gt;
The best you can do is table lookup. So have the right&lt;br /&gt;
tables ready!&lt;br /&gt;
&lt;br /&gt;
Key tool is making an INDEX&lt;br /&gt;
 - table of search term and pointers to data&lt;br /&gt;
&lt;br /&gt;
E.g., you have a table of customers sorted by ID&lt;br /&gt;
 - have an index of names, so a table of names versus&lt;br /&gt;
   IDs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Student Notes===&lt;br /&gt;
&lt;br /&gt;
====Counting Log Entries====&lt;br /&gt;
&lt;br /&gt;
*Exercise related to Assignment 6: The following is to help you in getting started on adding in single-page functionality for the web app.&lt;br /&gt;
**How do we get the data related to the number of log files and the number of entries from the database? Ask the database how many log files are there?&lt;br /&gt;
**What do we want to do? Count the number of entries. Use the count method.&lt;br /&gt;
***&amp;lt;code&amp;gt;db.logs.count()&amp;lt;/code&amp;gt; counts records&lt;br /&gt;
**How many distinct values are there?&lt;br /&gt;
***&amp;lt;code&amp;gt;db.logs.distinct(“file”)&amp;lt;/code&amp;gt; counts how many files we have&lt;br /&gt;
**The placeholder information is currently filled in on the server&lt;br /&gt;
***How? First go to views. The Jade file already has &amp;lt;code&amp;gt;numfiles&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;numentries&amp;lt;/code&amp;gt; variables which are passed in to the template through the call to &amp;lt;code&amp;gt;render()&amp;lt;/code&amp;gt; in the routes. How do we update them?&lt;br /&gt;
**What problems do we run in to when using the &amp;lt;code&amp;gt;count()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;distinct()&amp;lt;/code&amp;gt; methods?&lt;br /&gt;
***Reloading the page is one problem&lt;br /&gt;
***The real problem is with the callbacks&lt;br /&gt;
****In order to do this, we need to do 2 separate database operations to get the values. We can try to combine them, however, this entails nesting one call to the database within the other callback, and therefore is messy.&lt;br /&gt;
****Instead, we can make them each as a separate route. Set up the following in index.js:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
router.get(‘/count’, function(req,res){&lt;br /&gt;
   function reportCount(err,count){&lt;br /&gt;
      if (err) {&lt;br /&gt;
         res.send(-1);&lt;br /&gt;
      }&lt;br /&gt;
      else {&lt;br /&gt;
         res.send(count);&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   logsCollection.count({}, reportCount);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*A problem with this code is that the count is interpreted as a response code&lt;br /&gt;
*We can change the code to fix this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
router.get(‘/count’, function(req,res){&lt;br /&gt;
   function reportCount(err,count){&lt;br /&gt;
      if err {&lt;br /&gt;
         res.sendStatus(500);}&lt;br /&gt;
      } else {&lt;br /&gt;
         res.send({count: count});&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   logsCollection.count({}, reportCount);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*And the route for file count:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
router.get(‘/storeFiles’, function(req,res) {&lt;br /&gt;
   function reportStoredFiles(err,files){&lt;br /&gt;
      if err {&lt;br /&gt;
         res.sendStatus(500);&lt;br /&gt;
      } else{&lt;br /&gt;
         res.send(files); //to get number of files res.send({count: files.length});&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   logsCollection.distinct(“file”, reportStoredFiles);&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*This code allows us to get these values to the client&lt;br /&gt;
*Currently, we do not have any client-side code to do anything with the values&lt;br /&gt;
*We want to somehow update the page to reflect the correct values&lt;br /&gt;
*We can do this on the server-side before sending the page to the client but this can be a pain so let’s change this so that we do an AJAX request from the browser and update the DOM&lt;br /&gt;
*We will need a client-side script to do this&lt;br /&gt;
*We can reference exam-storage to see how to link our scripts in the Jade templates&lt;br /&gt;
**In layout.jade, we want to link the jquery script since we will be using it&lt;br /&gt;
**From account.jade, we can see where our main client-side script was linked. We will need to do something like this for index.jade&lt;br /&gt;
**Make sure that the scripts are stored somewhere in the public directory and that the paths in the links are correct&lt;br /&gt;
*We can add some default text into index.jade to display if we do not have the actual file and log entry counts&lt;br /&gt;
*Then we need to write our query.js script&lt;br /&gt;
**The functions in this script are used to update the number of logs and number of entries shown in the browser. So, when you reload the page after uploading a file, the number of logs and entries also get updated accordingly.&lt;br /&gt;
***&amp;lt;code&amp;gt;updateStats()&amp;lt;/code&amp;gt; is used to make the AJAX requests to the server to get the updated values&lt;br /&gt;
***&amp;lt;code&amp;gt;updatesStatsText()&amp;lt;/code&amp;gt; is used to update the DOM with the new values&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
$(function() {&lt;br /&gt;
   var numEntries = 0;&lt;br /&gt;
   var numFiles = 0;&lt;br /&gt;
   var stats = $(“#stats”);&lt;br /&gt;
&lt;br /&gt;
   function updatesStatsText() {&lt;br /&gt;
      stats.html(“Currently we have “ + numEntries + “ log entries in “ + numFiles + “log files.”);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   function updateStats() {&lt;br /&gt;
      var numUpdated = 0;&lt;br /&gt;
      $.getJSON(“/ count”,function(v){&lt;br /&gt;
         numEntries = v.count;&lt;br /&gt;
         numUpdated++;&lt;br /&gt;
&lt;br /&gt;
         if(numUpdated &amp;gt;= 2){&lt;br /&gt;
            updateStatsText();&lt;br /&gt;
         }&lt;br /&gt;
      });&lt;br /&gt;
&lt;br /&gt;
      $.getJSON(“/storedFileCount”, function(v){&lt;br /&gt;
         numFiles = v.count;&lt;br /&gt;
         numUpdated++;&lt;br /&gt;
&lt;br /&gt;
         if(numUpdated &amp;gt;= 2){&lt;br /&gt;
            updateStatsText(); });&lt;br /&gt;
         }&lt;br /&gt;
      });&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   updateStats();&lt;br /&gt;
}      &lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*With the assignment, everything should show up at the bottom of the page.&lt;br /&gt;
*This means upating the DOM in a similar fashion to what we have done here&lt;br /&gt;
&lt;br /&gt;
====Scalability====&lt;br /&gt;
&lt;br /&gt;
*When replicating your web application, your code should be “embarrassingly parallel” (no direct interaction)&lt;br /&gt;
*Communication between servers happens through the backend database&lt;br /&gt;
*Why not have the web servers talk directly to each other?&lt;br /&gt;
**You have to figure out how to do synchronization/concurrency right&lt;br /&gt;
**That&#039;s what databases are for! Let it deal with the problem&lt;br /&gt;
*So, how in the world do you scale up databases?&lt;br /&gt;
*First answer: use a minimal solution&lt;br /&gt;
**Only get the functionality that you want&lt;br /&gt;
*Basic/first rule of scalability&lt;br /&gt;
**You cant do everything at scale&lt;br /&gt;
*So you have to choose what you will do. Have to make some sacrifices&lt;br /&gt;
*Why are sacrifices necessary?&lt;br /&gt;
*Latency vs Bandwidth&lt;br /&gt;
**Bandwidth: bits transferred per second on average&lt;br /&gt;
**Latency: time to get first bit of response after request&lt;br /&gt;
*Consider a large truck full of hard disks driving across Canada. What’s the bandwidth of this truck? Low bandwidth or high bandwidth?&lt;br /&gt;
**It’s very very high bandwidth takes two weeks to travel across the country, but when it arrives, a lot of data has been transferred&lt;br /&gt;
**Very very high latency as well! (2 weeks to get first bit of response)&lt;br /&gt;
*Ideally you want HIGH BANDWIDTH and LOW LATENCY&lt;br /&gt;
**Bandwidth you get through parallelism&lt;br /&gt;
**Latency has to be engineered.&lt;br /&gt;
*Latency is hard so,&lt;br /&gt;
**A “supercoumputer” is one with low latency memory access, for lots of memory.&lt;br /&gt;
***So it has to have [https://www.mellanox.com/page/performance_infiniband fast interconnects between the nodes]. Fast meaning low latency, not high bandwidth.&lt;br /&gt;
***Thus, accesses to different nodes aren&#039;t much slower than local accesses&lt;br /&gt;
*Challenge for large web apps is having the database answer queries with low latency&lt;br /&gt;
*If a user goes to your website the page should be loaded fast. Even if it&#039;s a bit slow, they will be unhappy. So, you need the low latency.&lt;br /&gt;
*But some amount of latency is inevitable (laws of physics, Einstein)&lt;br /&gt;
**The speed of light is finite. A nanosecond in wire is a short piece of wire. A microsecond a pretty good size spool. Milliseconds is thousand times larger.&lt;br /&gt;
**How far do signals go?&lt;br /&gt;
***Microprocessors operate on the nanoseconds&lt;br /&gt;
***Networks on the milliseconds&lt;br /&gt;
***Ping time to get to the other side of the globe, 100s of millisecond&lt;br /&gt;
****If it&#039;s more than 50 milliseconds or half a second, people will notice&lt;br /&gt;
*So if you want fast access to your web server worldwide&lt;br /&gt;
**You need to replicate across the globe&lt;br /&gt;
**Be close to your clients&lt;br /&gt;
*In general, the more the functionality a database will have, the longer it will take&lt;br /&gt;
*NoSQL databases became popular because of latency concerns&lt;br /&gt;
**You needed to be as fast as possible&lt;br /&gt;
**So strip it to the bone&lt;br /&gt;
*Use an in-memory key value store if it is sufficient&lt;br /&gt;
**Lowest latency&lt;br /&gt;
**Least functionality&lt;br /&gt;
*If you have to, use an SQL database&lt;br /&gt;
**Higher latency&lt;br /&gt;
**Most functionality&lt;br /&gt;
*Or use something in between (MongoDB)&lt;br /&gt;
*Once you choose the type of database, you optimize&lt;br /&gt;
**Minimize I/O and computation require per access (read or write)&lt;br /&gt;
**Example: query optimization&lt;br /&gt;
**How you form the query&lt;br /&gt;
**How the database is organized&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Why Google is getting big bucks? How do you query the entire Web?&lt;br /&gt;
**Google is good at query optimization&lt;br /&gt;
*Google has a copy of everything on the Web. Their Web crawlers do this for them&lt;br /&gt;
*How do you make a query of the entire Web?&lt;br /&gt;
**Use a very big database!&lt;br /&gt;
**The interface to query through Google is just a regular website, it&#039;s just working with very large data sets!&lt;br /&gt;
*How can we count the number of web pages that have the word that have the word “amazing” in them?&lt;br /&gt;
**First you need a database with a copy of all the web pages&lt;br /&gt;
**Then you could do linear search through all the of the pages of the web (this is not an efficient solution)&lt;br /&gt;
*I ask this because a web search is a massive challenge in query optimization&lt;br /&gt;
**We need to limit scope as early as possible in query&lt;br /&gt;
**Organize data so queries can be answered quickly&lt;br /&gt;
**Precompute as much as possible&lt;br /&gt;
*The best you can do is table lookup. So have the right tables ready!&lt;br /&gt;
*When you do a Google search, it is picking out answer from answers it already figured out before&lt;br /&gt;
*A key tool is making an INDEX&lt;br /&gt;
**Table of search terms and pointers to data&lt;br /&gt;
**e.g. If you have a table of customers sorted by ID&lt;br /&gt;
***Have an index of names, so a table of names vs IDs&lt;br /&gt;
**An index is a table that is very short, one column for the indexed attribute and the second for the ID&lt;br /&gt;
**Is this what Google is doing? No, they are doing much fancier things but don’t tell anyone because of layers and layers of proprietary stuff&lt;br /&gt;
*Microsoft has about 100 millions lines of code, Linux kernel is 20 millions lines of code, Google is estimated at about 2 billion lines of code. This is not surprising, there is a lot of functionality&lt;br /&gt;
*Look up MapReduce. You can use it to find all web pages with “amazing”. All you do is you have a cluster of machines with data across them and you tell each machine to count the number of times amazing appears in the web pages you have on that machine and then accumulate altogether to be a single count. It can also handle failures during a query. Data is being stored in special replicated way, so that if there is one particular node that is failing, others can take over the job. It is functional programming at scale.&lt;br /&gt;
&lt;br /&gt;
==Code==&lt;br /&gt;
&lt;br /&gt;
* [http://homeostasis.scs.carleton.ca/~soma/webfund-2016w/code/analyzeLogs-filecount.zip analyzeLogs-filecount]&lt;br /&gt;
&lt;br /&gt;
Note this version has node_modules removed; copy this directory from analyzeLogs-sol or run &amp;quot;npm install&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Zero</name></author>
	</entry>
	<entry>
		<id>https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_22&amp;diff=20948</id>
		<title>WebFund 2016W Lecture 22</title>
		<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_22&amp;diff=20948"/>
		<updated>2016-04-11T17:24:27Z</updated>

		<summary type="html">&lt;p&gt;Zero: Minor details.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Video==&lt;br /&gt;
&lt;br /&gt;
The video for the lecture given on March 31, 2016 [http://homeostasis.scs.carleton.ca/~soma/webfund-2016w/lectures/comp2406-2016w-lec22-31Mar2016.mp4 is now available].&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&lt;br /&gt;
===In Class===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Lecture 22&lt;br /&gt;
------------&lt;br /&gt;
Web Security&lt;br /&gt;
&lt;br /&gt;
Security in isolated systems&lt;br /&gt;
 - no networking&lt;br /&gt;
&lt;br /&gt;
What is the threat model?&lt;br /&gt;
&lt;br /&gt;
Threat model&lt;br /&gt;
 - what attacks are you trying to defend against&lt;br /&gt;
 - what attacks are you NOT trying to defend against&lt;br /&gt;
&lt;br /&gt;
Computer in an isolated room&lt;br /&gt;
 - ignore physical attacks, e.g. sledgehammers&lt;br /&gt;
&lt;br /&gt;
How to compromise this computer?&lt;br /&gt;
 - someone bad starts typing&lt;br /&gt;
 - someone inserts malicious media/device&lt;br /&gt;
   - parking lot flashdrive attack&lt;br /&gt;
     (solution: epoxy)&lt;br /&gt;
 - electromagnetic emissions&lt;br /&gt;
     (live in a faraday cage)&lt;br /&gt;
&lt;br /&gt;
Computer on a network&lt;br /&gt;
 - all local attacks&lt;br /&gt;
 - attacker can send arbitrary network data to system&lt;br /&gt;
 - attacker can listen in on network traffic&lt;br /&gt;
 - attacker can change outgoing traffic&lt;br /&gt;
&lt;br /&gt;
Basic defense: network crypto&lt;br /&gt;
 - encrypt to hide, sign data to protect integrity,&lt;br /&gt;
   verify authenticity&lt;br /&gt;
&lt;br /&gt;
Who will access?&lt;br /&gt;
 - authenticated, authorized users&lt;br /&gt;
 - unauthorized individuals/systems&lt;br /&gt;
 - attackers (can be either of the above)&lt;br /&gt;
&lt;br /&gt;
How can an attacker be &amp;quot;authorized&amp;quot;?&lt;br /&gt;
 - social engineering&lt;br /&gt;
   (can you please reset my password?)&lt;br /&gt;
 - brute force (try all the passwords)&lt;br /&gt;
 - technical compromise of credentials (keylogger)&lt;br /&gt;
 - authorized user turns/is malicious&lt;br /&gt;
   (insider attack)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
And now the web&lt;br /&gt;
&lt;br /&gt;
Who can access your application?&lt;br /&gt;
 - ANYBODY&lt;br /&gt;
 - for public web apps, ANYBODY is an authorized user&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So just from this we can see that web security is going&lt;br /&gt;
to be hard.&lt;br /&gt;
&lt;br /&gt;
The other half of the nightmare: the browser&lt;br /&gt;
&lt;br /&gt;
Ideally, to secure systems you isolate components&lt;br /&gt;
  - build big walls&lt;br /&gt;
&lt;br /&gt;
Your web browser has walls between pages...but there are&lt;br /&gt;
BIG HOLES (on purpose)&lt;br /&gt;
&lt;br /&gt;
 - cookies, in particular, are shared&lt;br /&gt;
 - this is bad because the scope of cookies is&lt;br /&gt;
   determined by DNS (domain name system)&lt;br /&gt;
&lt;br /&gt;
DNS has almost no security&lt;br /&gt;
 - there is DNSSEC but nobody uses it, yet at least&lt;br /&gt;
&lt;br /&gt;
You can better protect cookies by using HSTS&lt;br /&gt;
 - force HTTPS everywhere on a page/domain&lt;br /&gt;
 - protects against mixes of http/https content and&lt;br /&gt;
   downgrade attacks&lt;br /&gt;
&lt;br /&gt;
Why do we have cookies in the first place?&lt;br /&gt;
 - because HTTP was supposed to be stateless&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Also...&lt;br /&gt;
&lt;br /&gt;
Cross-site Scripting (XSS) attacks&lt;br /&gt;
 - not necessarily cross-site, not necesarily scripting&lt;br /&gt;
 - &amp;quot;web injection attacks&amp;quot;&lt;br /&gt;
 - see anywhere attacker can inject content into a page&lt;br /&gt;
   - (ads)&lt;br /&gt;
   - comments&lt;br /&gt;
   - social media&lt;br /&gt;
   - &amp;quot;user-generated content&amp;quot;&lt;br /&gt;
 - failure to sanitize untrusted input that is inserted&lt;br /&gt;
   into a web page&lt;br /&gt;
   (adding a comment to a page)&lt;br /&gt;
 - otherwise, you can insert arbitrary HTML, CSS,&lt;br /&gt;
   and JavaScript into the page&lt;br /&gt;
&lt;br /&gt;
Cross-site request forgery&lt;br /&gt;
 - makes use of cookies automatically being sent&lt;br /&gt;
   to domain, no matter where the link came from&lt;br /&gt;
 - can stop using tokens in URLs, or checking&lt;br /&gt;
   Referer/Origin headers (and a few other ways)&lt;br /&gt;
&lt;br /&gt;
Same-origin policy&lt;br /&gt;
 - data should only be loaded from the originating&lt;br /&gt;
   server&lt;br /&gt;
 - but, you can load almost anything else from&lt;br /&gt;
   anywhere&lt;br /&gt;
    - images&lt;br /&gt;
    - sound&lt;br /&gt;
    - javascript&lt;br /&gt;
&lt;br /&gt;
So what about JSON?&lt;br /&gt;
 - when you load it with AJAX, you have same origin&lt;br /&gt;
   policy&lt;br /&gt;
 - but if you just treated it as a script...&lt;br /&gt;
 - and what if you were logged in&lt;br /&gt;
   - bank sending data as JSON&lt;br /&gt;
&lt;br /&gt;
JSON files are valid JavaScript but they don&#039;t specify&lt;br /&gt;
the name to give to the data structure&lt;br /&gt;
 - so you can&#039;t access it, unless&lt;br /&gt;
&lt;br /&gt;
To build an object, you have to call the object&#039;s&lt;br /&gt;
constructor&lt;br /&gt;
 - why not replace the constructor with our own method?&lt;br /&gt;
   e.g., override Array&lt;br /&gt;
 - this is solved in regular browsers for JSON by&lt;br /&gt;
   only using a clean JavaScript environment for&lt;br /&gt;
   JSON.parse()&lt;br /&gt;
&lt;br /&gt;
This doesn&#039;t help you for code, but who cares about&lt;br /&gt;
code, right?&lt;br /&gt;
 - many websites dynamically generate JavaScript and put&lt;br /&gt;
   personal information into it&lt;br /&gt;
&lt;br /&gt;
Solution?  Don&#039;t mix code and data!&lt;br /&gt;
&lt;br /&gt;
WebAssembly&lt;br /&gt;
-----------&lt;br /&gt;
&lt;br /&gt;
* Many, many people hate JavaScript&lt;br /&gt;
* Lots of code that isn&#039;t JavaScript&lt;br /&gt;
* But people want everything to run on the web&lt;br /&gt;
  in a browser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Past efforts at having alternative languages all&lt;br /&gt;
had a basic problem&lt;br /&gt;
 - they couldn&#039;t see the DOM&lt;br /&gt;
 - e.g., Java applets, Flash, Silverlight&lt;br /&gt;
&lt;br /&gt;
And, what about all those other languages?&lt;br /&gt;
 - C, C++??!&lt;br /&gt;
 - how about games?&lt;br /&gt;
&lt;br /&gt;
Unreal runs in a web page&lt;br /&gt;
 - there&#039;s WebGL which is pretty fast&lt;br /&gt;
&lt;br /&gt;
So, why can&#039;t we compile code and have it run in the&lt;br /&gt;
browser?&lt;br /&gt;
&lt;br /&gt;
Two old solutions:&lt;br /&gt;
 - NaCl (Google)&lt;br /&gt;
 - asm.js (Mozilla)&lt;br /&gt;
 &lt;br /&gt;
They joined up and are now making WebAssembly&lt;br /&gt;
&lt;br /&gt;
This will be good for functionality and bad for&lt;br /&gt;
security.&lt;br /&gt;
 - security won&#039;t go well because code isn&#039;t&lt;br /&gt;
   designed for the web&lt;br /&gt;
 - but it will be cool to play games in a browser at&lt;br /&gt;
   full speed :-)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Student Notes===&lt;br /&gt;
&lt;br /&gt;
====Administrative====&lt;br /&gt;
&lt;br /&gt;
*There is a study session on April 11 morning.&lt;br /&gt;
*Students can come to tutorial next week and consider it as extended office hours&lt;br /&gt;
&lt;br /&gt;
====Web Security====&lt;br /&gt;
&lt;br /&gt;
*There are certain fundamental things of the web that make it very hard to secure&lt;br /&gt;
*When considering security, we want to consider a threat model&lt;br /&gt;
**What attacks are you trying to defend against?&lt;br /&gt;
**What attacks are you NOT trying to defend against?&lt;br /&gt;
&lt;br /&gt;
=====Computer in an isolated room=====&lt;br /&gt;
&lt;br /&gt;
*Ignore physical attacks, e.g. sledgehammers&lt;br /&gt;
*If we talking about software level, how can the computer be compromised?&lt;br /&gt;
**Someone bad starts typing&lt;br /&gt;
**Someone inserts malicious media/device&lt;br /&gt;
**Parking lot flashdrive attack (a flashdrive is left in a parking lot for someone to pick up and plug in)&lt;br /&gt;
**(solution: epoxy, no one can plug anything in)&lt;br /&gt;
**Electromagnetic emissions&lt;br /&gt;
***(solution: live in a Faraday cage, almost completely isolated from any EM transmission)&lt;br /&gt;
&lt;br /&gt;
=====Computer on a network=====&lt;br /&gt;
&lt;br /&gt;
*Threats:&lt;br /&gt;
**All local attacks (all the physical attack will be there too)&lt;br /&gt;
**An attacker can send arbitrary network data to system&lt;br /&gt;
**An attacker can listen in on network traffic&lt;br /&gt;
**An attacker can change outgoing traffic&lt;br /&gt;
**(they can listen anything on the computer, can listen anything going out of the computer, can send arbitrary network data to the computer, can change data and leaving the computer going elsewhere)&lt;br /&gt;
*How to protect against that?&lt;br /&gt;
*Basic defense: network crypto&lt;br /&gt;
**Encrypt to hide, sign data to protect integrity, verify authenticity&lt;br /&gt;
*We need to distinguish between who is trying to access the computer&lt;br /&gt;
*Who will access?&lt;br /&gt;
**Authenticated/authorized users&lt;br /&gt;
**Unauthorized individuals/systems&lt;br /&gt;
**Attackers (can be either of the above)&lt;br /&gt;
*How can an attacker be “authorized” ?&lt;br /&gt;
**Social engineering (can you please reset my password?)&lt;br /&gt;
**Brute force (try all the passwords)&lt;br /&gt;
**Technical compromise of credentials (keylogger)&lt;br /&gt;
**Authorized user turns/is malicious (insider attack)(most dangerous, because they are not only authorized, they also know the system)&lt;br /&gt;
&lt;br /&gt;
=====And now the web=====&lt;br /&gt;
&lt;br /&gt;
*Why is the web so nasty?&lt;br /&gt;
*Who can access your application?&lt;br /&gt;
**ANYBODY&lt;br /&gt;
**For most public web apps, ANYBODY is an authorized user&lt;br /&gt;
**There are different levels of insider attacks. Just because of you have account on gmail doesn’t mean you have access to the inside system. You don’t have full access, but you have some access, that is potentially dangerous.&lt;br /&gt;
*So from this we can see that web security is going to be hard&lt;br /&gt;
*The other half of the nightmare is the browser&lt;br /&gt;
*Ideally, to secure systems you isolate components&lt;br /&gt;
**Build big walls&lt;br /&gt;
*Your web browser has walls between pages... but there are BIG HOLES (on purpose)&lt;br /&gt;
*The tabs in the browser are not so isolated (e.g Log in to an account on one tab then refresh another tab on the same page... it will be logged in as well). They are connected.&lt;br /&gt;
*Cookies are being shared between the pages, it is a shared data source&lt;br /&gt;
*This is bad because the scope of cookies is determined by DNS (Domain Name System)&lt;br /&gt;
*DNS has almost no security&lt;br /&gt;
*There is DNSSEC but nobody uses it, yet at least&lt;br /&gt;
**If you want to know more about this, you can find the article on [https://www.usenix.org/blog/security-symposium-talk-measuring-practical-impact-dnssec-deployment usenix.org]&lt;br /&gt;
*You can better protect cookies by using HSTS&lt;br /&gt;
**This forces HTTPS everywhere on a page/domain&lt;br /&gt;
**Protects against mixes of HTTP/HTTPS communications and downgrade attacks&lt;br /&gt;
*Why we do we have cookies in the first place?&lt;br /&gt;
**Because HTTP was supposed to be stateless&lt;br /&gt;
**The cookies are used instead to create a state between the client and server&lt;br /&gt;
*If we could get past these problems, would we have proper security?&lt;br /&gt;
**Definitely not&lt;br /&gt;
*There are other issues...&lt;br /&gt;
&lt;br /&gt;
======Cross-Site Scripting (XSS) Attacks======&lt;br /&gt;
&lt;br /&gt;
*Not necessarily cross-site, and not necessarily scripting&lt;br /&gt;
*More like “web injection attacks”&lt;br /&gt;
*This can happen anywhere an attacker can inject content into a page&lt;br /&gt;
**Ads&lt;br /&gt;
**Comments&lt;br /&gt;
**Social media&lt;br /&gt;
**User-generated content&lt;br /&gt;
*Problems can occur when there is a failure to sanitize untrusted input that is inserted into a web page&lt;br /&gt;
**This allows users to insert arbitrary HTML, CSS, and JavaScript into the page&lt;br /&gt;
&lt;br /&gt;
======Cross-Site Request Forgery======&lt;br /&gt;
&lt;br /&gt;
*Cross-site scripting is more straight-forward, cross-site request forgery is a little bit weird&lt;br /&gt;
*This involves having a link from a page sent by one server cause a request to be sent off to another server&lt;br /&gt;
*If you are logged in at the other server, this can cause things to happen which you didn&#039;t expect or want to happen&lt;br /&gt;
**For example, while logged in to the course wiki, a link from a page on a different website may cause a page to be deleted from the wiki by sending an appropriate request&lt;br /&gt;
*This makes use of cookies automatically being sent to a server, no matter where the link came from&lt;br /&gt;
*How can we stop this?&lt;br /&gt;
**One way is to try to verify where the link came from&lt;br /&gt;
**In the browser tools, go to the network tab and check the referer header&lt;br /&gt;
***This header indicates where the request came from&lt;br /&gt;
**So in principle, to stop a cross-site request forgery, we can check this header in the requests received on the server&lt;br /&gt;
***If it came from one of our pages, then we can trust the request&lt;br /&gt;
***Otherwise we don’t&lt;br /&gt;
**That does not actually work. It kind of works, but not always&lt;br /&gt;
**Why? Because the Referer header can often be scrapped by a proxy&lt;br /&gt;
**An alternative solution is to randomize your links&lt;br /&gt;
**Instead of using a predictable url, stick a random string in the middle of it&lt;br /&gt;
***The string is connected to the client&#039;s cookie so that the attacker can’t guess it&lt;br /&gt;
&lt;br /&gt;
======Same-Origin Policy======&lt;br /&gt;
&lt;br /&gt;
*Data should only loaded from the originating server but, you can load almost anything else from anywhere&lt;br /&gt;
**Images&lt;br /&gt;
**Sound&lt;br /&gt;
**JavaScript&lt;br /&gt;
*So what about JSON?&lt;br /&gt;
**when you load it with AJAX, you have the same-origin policy&lt;br /&gt;
**But what if you just treated it as a script? (why not just load it in the page?)&lt;br /&gt;
**And what if you were logged in?&lt;br /&gt;
***Consider a bank sending data as JSON (Could I from another tab just grab your bank account data as a JSON data in the background and see what exactly what you have? It doesn’t work.)&lt;br /&gt;
*JSON files are valid JavaScript structure (JSON is a subset of JavaScript)&lt;br /&gt;
*JSON files do not specify a name to give to the data structure so you can’t access it by name&lt;br /&gt;
*However, to build the object in the first place, its constructor must be called&lt;br /&gt;
**Why not replace the constructor with our own method?&lt;br /&gt;
***e.g., override Array&lt;br /&gt;
**This is solved in regular browsers for JSON by only using a clean JavaScript environment for JSON.parse()&lt;br /&gt;
**But what about code?&lt;br /&gt;
***This doesn’t help you for code, but who cares about code, right?&lt;br /&gt;
**Turns out many websites dynamically generate JavaScript and put personal information into it (different people have different scripts)&lt;br /&gt;
***Solution? Don’t mix code and data! (treat the JSON separately, let the code just be loaded on the system, don’t mix it with anything else)&lt;br /&gt;
&lt;br /&gt;
====Web Assembly====&lt;br /&gt;
&lt;br /&gt;
*Many, many people hate JavaScript&lt;br /&gt;
**There is a lot of code that isn’t JavaScript but people want everything to run on the web in a browser (JavaScript is the language of the web)&lt;br /&gt;
*Past efforts at having alternative languages all had a basic problem&lt;br /&gt;
**They couldn’t see the DOM&lt;br /&gt;
***e.g., Java applets, Flash, Silverlight&lt;br /&gt;
*And, what about all those other languages?&lt;br /&gt;
**C, C++?&lt;br /&gt;
**How about games?&lt;br /&gt;
***[https://www.unrealengine.com/html5/ Unreal Engine runs in a web page] because there’s WebGL which is pretty fast (WebGL is a subset of OpenGL)&lt;br /&gt;
*So why can’t we compile code and have it run in the browser?&lt;br /&gt;
*Two old solutions:&lt;br /&gt;
**PNaCl/NaCl (Google)&lt;br /&gt;
***Portable Native Client (PNaCl) is a sandbox for running compiled C and C++ code in the browser efficiently and securely, independent of the user’s operating system or architecture (e.g. x86 or ARM). (NaCl is more or less the same except it only can be used by extensions/plugins and depends on the user&#039;s CPU architecture; you can only use an x86 NaCl app on x86.)&lt;br /&gt;
**asm.js (Mozilla)&lt;br /&gt;
***This uses a compiler that takes arbitrary programs and compiles them to JavaScript&lt;br /&gt;
***asm.js is perfectly legal JavaScript, it is tightly restricted JavaScript&lt;br /&gt;
***You cannot read asm.js code, it looks like binary&lt;br /&gt;
*Google and Mozilla joined up and are now making WebAssembly&lt;br /&gt;
**You can compile arbitrary code to run inside of the browser with WebAssembly&lt;br /&gt;
**This will be good for functionality and bad for security&lt;br /&gt;
***Security won’t go well because the code isn’t designed for the web&lt;br /&gt;
***But it will be cool to play games in a browser at full speed&lt;/div&gt;</summary>
		<author><name>Zero</name></author>
	</entry>
	<entry>
		<id>https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_22&amp;diff=20947</id>
		<title>WebFund 2016W Lecture 22</title>
		<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_22&amp;diff=20947"/>
		<updated>2016-04-11T17:21:27Z</updated>

		<summary type="html">&lt;p&gt;Zero: Added PNaCl vs NaCl.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Video==&lt;br /&gt;
&lt;br /&gt;
The video for the lecture given on March 31, 2016 [http://homeostasis.scs.carleton.ca/~soma/webfund-2016w/lectures/comp2406-2016w-lec22-31Mar2016.mp4 is now available].&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&lt;br /&gt;
===In Class===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Lecture 22&lt;br /&gt;
------------&lt;br /&gt;
Web Security&lt;br /&gt;
&lt;br /&gt;
Security in isolated systems&lt;br /&gt;
 - no networking&lt;br /&gt;
&lt;br /&gt;
What is the threat model?&lt;br /&gt;
&lt;br /&gt;
Threat model&lt;br /&gt;
 - what attacks are you trying to defend against&lt;br /&gt;
 - what attacks are you NOT trying to defend against&lt;br /&gt;
&lt;br /&gt;
Computer in an isolated room&lt;br /&gt;
 - ignore physical attacks, e.g. sledgehammers&lt;br /&gt;
&lt;br /&gt;
How to compromise this computer?&lt;br /&gt;
 - someone bad starts typing&lt;br /&gt;
 - someone inserts malicious media/device&lt;br /&gt;
   - parking lot flashdrive attack&lt;br /&gt;
     (solution: epoxy)&lt;br /&gt;
 - electromagnetic emissions&lt;br /&gt;
     (live in a faraday cage)&lt;br /&gt;
&lt;br /&gt;
Computer on a network&lt;br /&gt;
 - all local attacks&lt;br /&gt;
 - attacker can send arbitrary network data to system&lt;br /&gt;
 - attacker can listen in on network traffic&lt;br /&gt;
 - attacker can change outgoing traffic&lt;br /&gt;
&lt;br /&gt;
Basic defense: network crypto&lt;br /&gt;
 - encrypt to hide, sign data to protect integrity,&lt;br /&gt;
   verify authenticity&lt;br /&gt;
&lt;br /&gt;
Who will access?&lt;br /&gt;
 - authenticated, authorized users&lt;br /&gt;
 - unauthorized individuals/systems&lt;br /&gt;
 - attackers (can be either of the above)&lt;br /&gt;
&lt;br /&gt;
How can an attacker be &amp;quot;authorized&amp;quot;?&lt;br /&gt;
 - social engineering&lt;br /&gt;
   (can you please reset my password?)&lt;br /&gt;
 - brute force (try all the passwords)&lt;br /&gt;
 - technical compromise of credentials (keylogger)&lt;br /&gt;
 - authorized user turns/is malicious&lt;br /&gt;
   (insider attack)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
And now the web&lt;br /&gt;
&lt;br /&gt;
Who can access your application?&lt;br /&gt;
 - ANYBODY&lt;br /&gt;
 - for public web apps, ANYBODY is an authorized user&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So just from this we can see that web security is going&lt;br /&gt;
to be hard.&lt;br /&gt;
&lt;br /&gt;
The other half of the nightmare: the browser&lt;br /&gt;
&lt;br /&gt;
Ideally, to secure systems you isolate components&lt;br /&gt;
  - build big walls&lt;br /&gt;
&lt;br /&gt;
Your web browser has walls between pages...but there are&lt;br /&gt;
BIG HOLES (on purpose)&lt;br /&gt;
&lt;br /&gt;
 - cookies, in particular, are shared&lt;br /&gt;
 - this is bad because the scope of cookies is&lt;br /&gt;
   determined by DNS (domain name system)&lt;br /&gt;
&lt;br /&gt;
DNS has almost no security&lt;br /&gt;
 - there is DNSSEC but nobody uses it, yet at least&lt;br /&gt;
&lt;br /&gt;
You can better protect cookies by using HSTS&lt;br /&gt;
 - force HTTPS everywhere on a page/domain&lt;br /&gt;
 - protects against mixes of http/https content and&lt;br /&gt;
   downgrade attacks&lt;br /&gt;
&lt;br /&gt;
Why do we have cookies in the first place?&lt;br /&gt;
 - because HTTP was supposed to be stateless&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Also...&lt;br /&gt;
&lt;br /&gt;
Cross-site Scripting (XSS) attacks&lt;br /&gt;
 - not necessarily cross-site, not necesarily scripting&lt;br /&gt;
 - &amp;quot;web injection attacks&amp;quot;&lt;br /&gt;
 - see anywhere attacker can inject content into a page&lt;br /&gt;
   - (ads)&lt;br /&gt;
   - comments&lt;br /&gt;
   - social media&lt;br /&gt;
   - &amp;quot;user-generated content&amp;quot;&lt;br /&gt;
 - failure to sanitize untrusted input that is inserted&lt;br /&gt;
   into a web page&lt;br /&gt;
   (adding a comment to a page)&lt;br /&gt;
 - otherwise, you can insert arbitrary HTML, CSS,&lt;br /&gt;
   and JavaScript into the page&lt;br /&gt;
&lt;br /&gt;
Cross-site request forgery&lt;br /&gt;
 - makes use of cookies automatically being sent&lt;br /&gt;
   to domain, no matter where the link came from&lt;br /&gt;
 - can stop using tokens in URLs, or checking&lt;br /&gt;
   Referer/Origin headers (and a few other ways)&lt;br /&gt;
&lt;br /&gt;
Same-origin policy&lt;br /&gt;
 - data should only be loaded from the originating&lt;br /&gt;
   server&lt;br /&gt;
 - but, you can load almost anything else from&lt;br /&gt;
   anywhere&lt;br /&gt;
    - images&lt;br /&gt;
    - sound&lt;br /&gt;
    - javascript&lt;br /&gt;
&lt;br /&gt;
So what about JSON?&lt;br /&gt;
 - when you load it with AJAX, you have same origin&lt;br /&gt;
   policy&lt;br /&gt;
 - but if you just treated it as a script...&lt;br /&gt;
 - and what if you were logged in&lt;br /&gt;
   - bank sending data as JSON&lt;br /&gt;
&lt;br /&gt;
JSON files are valid JavaScript but they don&#039;t specify&lt;br /&gt;
the name to give to the data structure&lt;br /&gt;
 - so you can&#039;t access it, unless&lt;br /&gt;
&lt;br /&gt;
To build an object, you have to call the object&#039;s&lt;br /&gt;
constructor&lt;br /&gt;
 - why not replace the constructor with our own method?&lt;br /&gt;
   e.g., override Array&lt;br /&gt;
 - this is solved in regular browsers for JSON by&lt;br /&gt;
   only using a clean JavaScript environment for&lt;br /&gt;
   JSON.parse()&lt;br /&gt;
&lt;br /&gt;
This doesn&#039;t help you for code, but who cares about&lt;br /&gt;
code, right?&lt;br /&gt;
 - many websites dynamically generate JavaScript and put&lt;br /&gt;
   personal information into it&lt;br /&gt;
&lt;br /&gt;
Solution?  Don&#039;t mix code and data!&lt;br /&gt;
&lt;br /&gt;
WebAssembly&lt;br /&gt;
-----------&lt;br /&gt;
&lt;br /&gt;
* Many, many people hate JavaScript&lt;br /&gt;
* Lots of code that isn&#039;t JavaScript&lt;br /&gt;
* But people want everything to run on the web&lt;br /&gt;
  in a browser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Past efforts at having alternative languages all&lt;br /&gt;
had a basic problem&lt;br /&gt;
 - they couldn&#039;t see the DOM&lt;br /&gt;
 - e.g., Java applets, Flash, Silverlight&lt;br /&gt;
&lt;br /&gt;
And, what about all those other languages?&lt;br /&gt;
 - C, C++??!&lt;br /&gt;
 - how about games?&lt;br /&gt;
&lt;br /&gt;
Unreal runs in a web page&lt;br /&gt;
 - there&#039;s WebGL which is pretty fast&lt;br /&gt;
&lt;br /&gt;
So, why can&#039;t we compile code and have it run in the&lt;br /&gt;
browser?&lt;br /&gt;
&lt;br /&gt;
Two old solutions:&lt;br /&gt;
 - NaCl (Google)&lt;br /&gt;
 - asm.js (Mozilla)&lt;br /&gt;
 &lt;br /&gt;
They joined up and are now making WebAssembly&lt;br /&gt;
&lt;br /&gt;
This will be good for functionality and bad for&lt;br /&gt;
security.&lt;br /&gt;
 - security won&#039;t go well because code isn&#039;t&lt;br /&gt;
   designed for the web&lt;br /&gt;
 - but it will be cool to play games in a browser at&lt;br /&gt;
   full speed :-)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Student Notes===&lt;br /&gt;
&lt;br /&gt;
====Administrative====&lt;br /&gt;
&lt;br /&gt;
*There is a study session on April 11 morning.&lt;br /&gt;
*Students can come to tutorial next week and consider it as extended office hours&lt;br /&gt;
&lt;br /&gt;
====Web Security====&lt;br /&gt;
&lt;br /&gt;
*There are certain fundamental things of the web that make it very hard to secure&lt;br /&gt;
*When considering security, we want to consider a threat model&lt;br /&gt;
**What attacks are you trying to defend against?&lt;br /&gt;
**What attacks are you NOT trying to defend against?&lt;br /&gt;
&lt;br /&gt;
=====Computer in an isolated room=====&lt;br /&gt;
&lt;br /&gt;
*Ignore physical attacks, e.g. sledgehammers&lt;br /&gt;
*If we talking about software level, how can the computer be compromised?&lt;br /&gt;
**Someone bad starts typing&lt;br /&gt;
**Someone inserts malicious media/device&lt;br /&gt;
**Parking lot flashdrive attack (a flashdrive is left in a parking lot for someone to pick up and plug in)&lt;br /&gt;
**(solution: epoxy, no one can plug anything in)&lt;br /&gt;
**Electromagnetic emissions&lt;br /&gt;
***(solution: live in a Faraday cage, almost completely isolated from any EM transmission)&lt;br /&gt;
&lt;br /&gt;
=====Computer on a network=====&lt;br /&gt;
&lt;br /&gt;
*Threats:&lt;br /&gt;
**All local attacks (all the physical attack will be there too)&lt;br /&gt;
**An attacker can send arbitrary network data to system&lt;br /&gt;
**An attacker can listen in on network traffic&lt;br /&gt;
**An attacker can change outgoing traffic&lt;br /&gt;
**(they can listen anything on the computer, can listen anything going out of the computer, can send arbitrary network data to the computer, can change data and leaving the computer going elsewhere)&lt;br /&gt;
*How to protect against that?&lt;br /&gt;
*Basic defense: network crypto&lt;br /&gt;
**Encrypt to hide, sign data to protect integrity, verify authenticity&lt;br /&gt;
*We need to distinguish between who is trying to access the computer&lt;br /&gt;
*Who will access?&lt;br /&gt;
**Authenticated/authorized users&lt;br /&gt;
**Unauthorized individuals/systems&lt;br /&gt;
**Attackers (can be either of the above)&lt;br /&gt;
*How can an attacker be “authorized” ?&lt;br /&gt;
**Social engineering (can you please reset my password?)&lt;br /&gt;
**Brute force (try all the passwords)&lt;br /&gt;
**Technical compromise of credentials (keylogger)&lt;br /&gt;
**Authorized user turns/is malicious (insider attack)(most dangerous, because they are not only authorized, they also know the system)&lt;br /&gt;
&lt;br /&gt;
=====And now the web=====&lt;br /&gt;
&lt;br /&gt;
*Why is the web so nasty?&lt;br /&gt;
*Who can access your application?&lt;br /&gt;
**ANYBODY&lt;br /&gt;
**For most public web apps, ANYBODY is an authorized user&lt;br /&gt;
**There are different levels of insider attacks. Just because of you have account on gmail doesn’t mean you have access to the inside system. You don’t have full access, but you have some access, that is potentially dangerous.&lt;br /&gt;
*So from this we can see that web security is going to be hard&lt;br /&gt;
*The other half of the nightmare is the browser&lt;br /&gt;
*Ideally, to secure systems you isolate components&lt;br /&gt;
**Build big walls&lt;br /&gt;
*Your web browser has walls between pages... but there are BIG HOLES (on purpose)&lt;br /&gt;
*The tabs in the browser are not so isolated (e.g Log in to an account on one tab then refresh another tab on the same page... it will be logged in as well). They are connected.&lt;br /&gt;
*Cookies are being shared between the pages, it is a shared data source&lt;br /&gt;
*This is bad because the scope of cookies is determined by DNS (Domain Name System)&lt;br /&gt;
*DNS has almost no security&lt;br /&gt;
*There is DNSSEC but nobody uses it, yet at least&lt;br /&gt;
**If you want to know more about this, you can find the article on [https://www.usenix.org/blog/security-symposium-talk-measuring-practical-impact-dnssec-deployment usenix.org]&lt;br /&gt;
*You can better protect cookies by using HSTS&lt;br /&gt;
**This forces HTTPS everywhere on a page/domain&lt;br /&gt;
**Protects against mixes of HTTP/HTTPS communications and downgrade attacks&lt;br /&gt;
*Why we do we have cookies in the first place?&lt;br /&gt;
**Because HTTP was supposed to be stateless&lt;br /&gt;
**The cookies are used instead to create a state between the client and server&lt;br /&gt;
*If we could get past these problems, would we have proper security?&lt;br /&gt;
**Definitely not&lt;br /&gt;
*There are other issues...&lt;br /&gt;
&lt;br /&gt;
======Cross-Site Scripting (XSS) Attacks======&lt;br /&gt;
&lt;br /&gt;
*Not necessarily cross-site, and not necessarily scripting&lt;br /&gt;
*More like “web injection attacks”&lt;br /&gt;
*This can happen anywhere an attacker can inject content into a page&lt;br /&gt;
**Ads&lt;br /&gt;
**Comments&lt;br /&gt;
**Social media&lt;br /&gt;
**User-generated content&lt;br /&gt;
*Problems can occur when there is a failure to sanitize untrusted input that is inserted into a web page&lt;br /&gt;
**This allows users to insert arbitrary HTML, CSS, and JavaScript into the page&lt;br /&gt;
&lt;br /&gt;
======Cross-Site Request Forgery======&lt;br /&gt;
&lt;br /&gt;
*Cross-site scripting is more straight-forward, cross-site request forgery is a little bit weird&lt;br /&gt;
*This involves having a link from a page sent by one server cause a request to be sent off to another server&lt;br /&gt;
*If you are logged in at the other server, this can cause things to happen which you didn&#039;t expect or want to happen&lt;br /&gt;
**For example, while logged in to the course wiki, a link from a page on a different website may cause a page to be deleted from the wiki by sending an appropriate request&lt;br /&gt;
*This makes use of cookies automatically being sent to a server, no matter where the link came from&lt;br /&gt;
*How can we stop this?&lt;br /&gt;
**One way is to try to verify where the link came from&lt;br /&gt;
**In the browser tools, go to the network tab and check the referer header&lt;br /&gt;
***This header indicates where the request came from&lt;br /&gt;
**So in principle, to stop a cross-site request forgery, we can check this header in the requests received on the server&lt;br /&gt;
***If it came from one of our pages, then we can trust the request&lt;br /&gt;
***Otherwise we don’t&lt;br /&gt;
**That does not actually work. It kind of works, but not always&lt;br /&gt;
**Why? Because the Referer header can often be scrapped by a proxy&lt;br /&gt;
**An alternative solution is to randomize your links&lt;br /&gt;
**Instead of using a predictable url, stick a random string in the middle of it&lt;br /&gt;
***The string is connected to the client&#039;s cookie so that the attacker can’t guess it&lt;br /&gt;
&lt;br /&gt;
======Same-Origin Policy======&lt;br /&gt;
&lt;br /&gt;
*Data should only loaded from the originating server but, you can load almost anything else from anywhere&lt;br /&gt;
**Images&lt;br /&gt;
**Sound&lt;br /&gt;
**JavaScript&lt;br /&gt;
*So what about JSON?&lt;br /&gt;
**when you load it with AJAX, you have the same-origin policy&lt;br /&gt;
**But what if you just treated it as a script? (why not just load it in the page?)&lt;br /&gt;
**And what if you were logged in?&lt;br /&gt;
***Consider a bank sending data as JSON (Could I from another tab just grab your bank account data as a JSON data in the background and see what exactly what you have? It doesn’t work.)&lt;br /&gt;
*JSON files are valid JavaScript structure (JSON is a subset of JavaScript)&lt;br /&gt;
*JSON files do not specify a name to give to the data structure so you can’t access it by name&lt;br /&gt;
*However, to build the object in the first place, its constructor must be called&lt;br /&gt;
**Why not replace the constructor with our own method?&lt;br /&gt;
***e.g., override Array&lt;br /&gt;
**This is solved in regular browsers for JSON by only using a clean JavaScript environment for JSON.parse()&lt;br /&gt;
**But what about code?&lt;br /&gt;
***This doesn’t help you for code, but who cares about code, right?&lt;br /&gt;
**Turns out many websites dynamically generate JavaScript and put personal information into it (different people have different scripts)&lt;br /&gt;
***Solution? Don’t mix code and data! (treat the JSON separately, let the code just be loaded on the system, don’t mix it with anything else)&lt;br /&gt;
&lt;br /&gt;
====Web Assembly====&lt;br /&gt;
&lt;br /&gt;
*Many, many people hate JavaScript&lt;br /&gt;
**There is a lot of code that isn’t JavaScript but people want everything to run on the web in a browser (JavaScript is the language of the web)&lt;br /&gt;
*Past efforts at having alternative languages all had a basic problem&lt;br /&gt;
**They couldn’t see the DOM&lt;br /&gt;
***e.g., Java applets, Flash, Silverlight&lt;br /&gt;
*And, what about all those other languages?&lt;br /&gt;
**C,C++?&lt;br /&gt;
**How about games?&lt;br /&gt;
***Unreal runs in a web page because there’s WebGL which is pretty fast (WebGL is a subset of openGL)&lt;br /&gt;
*So why can’t we compile code and have it run in the browser?&lt;br /&gt;
*Two old solutions:&lt;br /&gt;
**PNaCl/NaCl (Google)&lt;br /&gt;
***Portable Native Client (PNaCl) is a sandbox for running compiled C and C++ code in the browser efficiently and securely, independent of the user’s operating system or architecture (e.g. x86 or ARM). (NaCl is more or less the same except it only can be used by extensions/plugins and depends on the user&#039;s CPU architecture; you can only use an x86 NaCl app on x86.)&lt;br /&gt;
**asm.js (Mozilla)&lt;br /&gt;
***This uses a compiler that takes arbitrary programs and compiles them to JavaScript&lt;br /&gt;
***asm.js is perfectly legal JavaScript, it is tightly restricted JavaScript&lt;br /&gt;
***You cannot read asm.js code, it looks like binary&lt;br /&gt;
*Google and Mozilla joined up and are now making WebAssembly&lt;br /&gt;
**You can compile arbitrary code to run inside of the browser with WebAssembly&lt;br /&gt;
**This will be good for functionality and bad for security&lt;br /&gt;
***Security won’t go well because the code isn’t designed for the web&lt;br /&gt;
***But it will be cool to play games in a browser at full speed&lt;/div&gt;</summary>
		<author><name>Zero</name></author>
	</entry>
	<entry>
		<id>https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_22&amp;diff=20946</id>
		<title>WebFund 2016W Lecture 22</title>
		<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_22&amp;diff=20946"/>
		<updated>2016-04-11T17:14:11Z</updated>

		<summary type="html">&lt;p&gt;Zero: I believe this is the correct URL?&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Video==&lt;br /&gt;
&lt;br /&gt;
The video for the lecture given on March 31, 2016 [http://homeostasis.scs.carleton.ca/~soma/webfund-2016w/lectures/comp2406-2016w-lec22-31Mar2016.mp4 is now available].&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&lt;br /&gt;
===In Class===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Lecture 22&lt;br /&gt;
------------&lt;br /&gt;
Web Security&lt;br /&gt;
&lt;br /&gt;
Security in isolated systems&lt;br /&gt;
 - no networking&lt;br /&gt;
&lt;br /&gt;
What is the threat model?&lt;br /&gt;
&lt;br /&gt;
Threat model&lt;br /&gt;
 - what attacks are you trying to defend against&lt;br /&gt;
 - what attacks are you NOT trying to defend against&lt;br /&gt;
&lt;br /&gt;
Computer in an isolated room&lt;br /&gt;
 - ignore physical attacks, e.g. sledgehammers&lt;br /&gt;
&lt;br /&gt;
How to compromise this computer?&lt;br /&gt;
 - someone bad starts typing&lt;br /&gt;
 - someone inserts malicious media/device&lt;br /&gt;
   - parking lot flashdrive attack&lt;br /&gt;
     (solution: epoxy)&lt;br /&gt;
 - electromagnetic emissions&lt;br /&gt;
     (live in a faraday cage)&lt;br /&gt;
&lt;br /&gt;
Computer on a network&lt;br /&gt;
 - all local attacks&lt;br /&gt;
 - attacker can send arbitrary network data to system&lt;br /&gt;
 - attacker can listen in on network traffic&lt;br /&gt;
 - attacker can change outgoing traffic&lt;br /&gt;
&lt;br /&gt;
Basic defense: network crypto&lt;br /&gt;
 - encrypt to hide, sign data to protect integrity,&lt;br /&gt;
   verify authenticity&lt;br /&gt;
&lt;br /&gt;
Who will access?&lt;br /&gt;
 - authenticated, authorized users&lt;br /&gt;
 - unauthorized individuals/systems&lt;br /&gt;
 - attackers (can be either of the above)&lt;br /&gt;
&lt;br /&gt;
How can an attacker be &amp;quot;authorized&amp;quot;?&lt;br /&gt;
 - social engineering&lt;br /&gt;
   (can you please reset my password?)&lt;br /&gt;
 - brute force (try all the passwords)&lt;br /&gt;
 - technical compromise of credentials (keylogger)&lt;br /&gt;
 - authorized user turns/is malicious&lt;br /&gt;
   (insider attack)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
And now the web&lt;br /&gt;
&lt;br /&gt;
Who can access your application?&lt;br /&gt;
 - ANYBODY&lt;br /&gt;
 - for public web apps, ANYBODY is an authorized user&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So just from this we can see that web security is going&lt;br /&gt;
to be hard.&lt;br /&gt;
&lt;br /&gt;
The other half of the nightmare: the browser&lt;br /&gt;
&lt;br /&gt;
Ideally, to secure systems you isolate components&lt;br /&gt;
  - build big walls&lt;br /&gt;
&lt;br /&gt;
Your web browser has walls between pages...but there are&lt;br /&gt;
BIG HOLES (on purpose)&lt;br /&gt;
&lt;br /&gt;
 - cookies, in particular, are shared&lt;br /&gt;
 - this is bad because the scope of cookies is&lt;br /&gt;
   determined by DNS (domain name system)&lt;br /&gt;
&lt;br /&gt;
DNS has almost no security&lt;br /&gt;
 - there is DNSSEC but nobody uses it, yet at least&lt;br /&gt;
&lt;br /&gt;
You can better protect cookies by using HSTS&lt;br /&gt;
 - force HTTPS everywhere on a page/domain&lt;br /&gt;
 - protects against mixes of http/https content and&lt;br /&gt;
   downgrade attacks&lt;br /&gt;
&lt;br /&gt;
Why do we have cookies in the first place?&lt;br /&gt;
 - because HTTP was supposed to be stateless&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Also...&lt;br /&gt;
&lt;br /&gt;
Cross-site Scripting (XSS) attacks&lt;br /&gt;
 - not necessarily cross-site, not necesarily scripting&lt;br /&gt;
 - &amp;quot;web injection attacks&amp;quot;&lt;br /&gt;
 - see anywhere attacker can inject content into a page&lt;br /&gt;
   - (ads)&lt;br /&gt;
   - comments&lt;br /&gt;
   - social media&lt;br /&gt;
   - &amp;quot;user-generated content&amp;quot;&lt;br /&gt;
 - failure to sanitize untrusted input that is inserted&lt;br /&gt;
   into a web page&lt;br /&gt;
   (adding a comment to a page)&lt;br /&gt;
 - otherwise, you can insert arbitrary HTML, CSS,&lt;br /&gt;
   and JavaScript into the page&lt;br /&gt;
&lt;br /&gt;
Cross-site request forgery&lt;br /&gt;
 - makes use of cookies automatically being sent&lt;br /&gt;
   to domain, no matter where the link came from&lt;br /&gt;
 - can stop using tokens in URLs, or checking&lt;br /&gt;
   Referer/Origin headers (and a few other ways)&lt;br /&gt;
&lt;br /&gt;
Same-origin policy&lt;br /&gt;
 - data should only be loaded from the originating&lt;br /&gt;
   server&lt;br /&gt;
 - but, you can load almost anything else from&lt;br /&gt;
   anywhere&lt;br /&gt;
    - images&lt;br /&gt;
    - sound&lt;br /&gt;
    - javascript&lt;br /&gt;
&lt;br /&gt;
So what about JSON?&lt;br /&gt;
 - when you load it with AJAX, you have same origin&lt;br /&gt;
   policy&lt;br /&gt;
 - but if you just treated it as a script...&lt;br /&gt;
 - and what if you were logged in&lt;br /&gt;
   - bank sending data as JSON&lt;br /&gt;
&lt;br /&gt;
JSON files are valid JavaScript but they don&#039;t specify&lt;br /&gt;
the name to give to the data structure&lt;br /&gt;
 - so you can&#039;t access it, unless&lt;br /&gt;
&lt;br /&gt;
To build an object, you have to call the object&#039;s&lt;br /&gt;
constructor&lt;br /&gt;
 - why not replace the constructor with our own method?&lt;br /&gt;
   e.g., override Array&lt;br /&gt;
 - this is solved in regular browsers for JSON by&lt;br /&gt;
   only using a clean JavaScript environment for&lt;br /&gt;
   JSON.parse()&lt;br /&gt;
&lt;br /&gt;
This doesn&#039;t help you for code, but who cares about&lt;br /&gt;
code, right?&lt;br /&gt;
 - many websites dynamically generate JavaScript and put&lt;br /&gt;
   personal information into it&lt;br /&gt;
&lt;br /&gt;
Solution?  Don&#039;t mix code and data!&lt;br /&gt;
&lt;br /&gt;
WebAssembly&lt;br /&gt;
-----------&lt;br /&gt;
&lt;br /&gt;
* Many, many people hate JavaScript&lt;br /&gt;
* Lots of code that isn&#039;t JavaScript&lt;br /&gt;
* But people want everything to run on the web&lt;br /&gt;
  in a browser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Past efforts at having alternative languages all&lt;br /&gt;
had a basic problem&lt;br /&gt;
 - they couldn&#039;t see the DOM&lt;br /&gt;
 - e.g., Java applets, Flash, Silverlight&lt;br /&gt;
&lt;br /&gt;
And, what about all those other languages?&lt;br /&gt;
 - C, C++??!&lt;br /&gt;
 - how about games?&lt;br /&gt;
&lt;br /&gt;
Unreal runs in a web page&lt;br /&gt;
 - there&#039;s WebGL which is pretty fast&lt;br /&gt;
&lt;br /&gt;
So, why can&#039;t we compile code and have it run in the&lt;br /&gt;
browser?&lt;br /&gt;
&lt;br /&gt;
Two old solutions:&lt;br /&gt;
 - NaCl (Google)&lt;br /&gt;
 - asm.js (Mozilla)&lt;br /&gt;
 &lt;br /&gt;
They joined up and are now making WebAssembly&lt;br /&gt;
&lt;br /&gt;
This will be good for functionality and bad for&lt;br /&gt;
security.&lt;br /&gt;
 - security won&#039;t go well because code isn&#039;t&lt;br /&gt;
   designed for the web&lt;br /&gt;
 - but it will be cool to play games in a browser at&lt;br /&gt;
   full speed :-)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Student Notes===&lt;br /&gt;
&lt;br /&gt;
====Administrative====&lt;br /&gt;
&lt;br /&gt;
*There is a study session on April 11 morning.&lt;br /&gt;
*Students can come to tutorial next week and consider it as extended office hours&lt;br /&gt;
&lt;br /&gt;
====Web Security====&lt;br /&gt;
&lt;br /&gt;
*There are certain fundamental things of the web that make it very hard to secure&lt;br /&gt;
*When considering security, we want to consider a threat model&lt;br /&gt;
**What attacks are you trying to defend against?&lt;br /&gt;
**What attacks are you NOT trying to defend against?&lt;br /&gt;
&lt;br /&gt;
=====Computer in an isolated room=====&lt;br /&gt;
&lt;br /&gt;
*Ignore physical attacks, e.g. sledgehammers&lt;br /&gt;
*If we talking about software level, how can the computer be compromised?&lt;br /&gt;
**Someone bad starts typing&lt;br /&gt;
**Someone inserts malicious media/device&lt;br /&gt;
**Parking lot flashdrive attack (a flashdrive is left in a parking lot for someone to pick up and plug in)&lt;br /&gt;
**(solution: epoxy, no one can plug anything in)&lt;br /&gt;
**Electromagnetic emissions&lt;br /&gt;
***(solution: live in a Faraday cage, almost completely isolated from any EM transmission)&lt;br /&gt;
&lt;br /&gt;
=====Computer on a network=====&lt;br /&gt;
&lt;br /&gt;
*Threats:&lt;br /&gt;
**All local attacks (all the physical attack will be there too)&lt;br /&gt;
**An attacker can send arbitrary network data to system&lt;br /&gt;
**An attacker can listen in on network traffic&lt;br /&gt;
**An attacker can change outgoing traffic&lt;br /&gt;
**(they can listen anything on the computer, can listen anything going out of the computer, can send arbitrary network data to the computer, can change data and leaving the computer going elsewhere)&lt;br /&gt;
*How to protect against that?&lt;br /&gt;
*Basic defense: network crypto&lt;br /&gt;
**Encrypt to hide, sign data to protect integrity, verify authenticity&lt;br /&gt;
*We need to distinguish between who is trying to access the computer&lt;br /&gt;
*Who will access?&lt;br /&gt;
**Authenticated/authorized users&lt;br /&gt;
**Unauthorized individuals/systems&lt;br /&gt;
**Attackers (can be either of the above)&lt;br /&gt;
*How can an attacker be “authorized” ?&lt;br /&gt;
**Social engineering (can you please reset my password?)&lt;br /&gt;
**Brute force (try all the passwords)&lt;br /&gt;
**Technical compromise of credentials (keylogger)&lt;br /&gt;
**Authorized user turns/is malicious (insider attack)(most dangerous, because they are not only authorized, they also know the system)&lt;br /&gt;
&lt;br /&gt;
=====And now the web=====&lt;br /&gt;
&lt;br /&gt;
*Why is the web so nasty?&lt;br /&gt;
*Who can access your application?&lt;br /&gt;
**ANYBODY&lt;br /&gt;
**For most public web apps, ANYBODY is an authorized user&lt;br /&gt;
**There are different levels of insider attacks. Just because of you have account on gmail doesn’t mean you have access to the inside system. You don’t have full access, but you have some access, that is potentially dangerous.&lt;br /&gt;
*So from this we can see that web security is going to be hard&lt;br /&gt;
*The other half of the nightmare is the browser&lt;br /&gt;
*Ideally, to secure systems you isolate components&lt;br /&gt;
**Build big walls&lt;br /&gt;
*Your web browser has walls between pages... but there are BIG HOLES (on purpose)&lt;br /&gt;
*The tabs in the browser are not so isolated (e.g Log in to an account on one tab then refresh another tab on the same page... it will be logged in as well). They are connected.&lt;br /&gt;
*Cookies are being shared between the pages, it is a shared data source&lt;br /&gt;
*This is bad because the scope of cookies is determined by DNS (Domain Name System)&lt;br /&gt;
*DNS has almost no security&lt;br /&gt;
*There is DNSSEC but nobody uses it, yet at least&lt;br /&gt;
**If you want to know more about this, you can find the article on [https://www.usenix.org/blog/security-symposium-talk-measuring-practical-impact-dnssec-deployment usenix.org]&lt;br /&gt;
*You can better protect cookies by using HSTS&lt;br /&gt;
**This forces HTTPS everywhere on a page/domain&lt;br /&gt;
**Protects against mixes of HTTP/HTTPS communications and downgrade attacks&lt;br /&gt;
*Why we do we have cookies in the first place?&lt;br /&gt;
**Because HTTP was supposed to be stateless&lt;br /&gt;
**The cookies are used instead to create a state between the client and server&lt;br /&gt;
*If we could get past these problems, would we have proper security?&lt;br /&gt;
**Definitely not&lt;br /&gt;
*There are other issues...&lt;br /&gt;
&lt;br /&gt;
======Cross-Site Scripting (XSS) Attacks======&lt;br /&gt;
&lt;br /&gt;
*Not necessarily cross-site, and not necessarily scripting&lt;br /&gt;
*More like “web injection attacks”&lt;br /&gt;
*This can happen anywhere an attacker can inject content into a page&lt;br /&gt;
**Ads&lt;br /&gt;
**Comments&lt;br /&gt;
**Social media&lt;br /&gt;
**User-generated content&lt;br /&gt;
*Problems can occur when there is a failure to sanitize untrusted input that is inserted into a web page&lt;br /&gt;
**This allows users to insert arbitrary HTML, CSS, and JavaScript into the page&lt;br /&gt;
&lt;br /&gt;
======Cross-Site Request Forgery======&lt;br /&gt;
&lt;br /&gt;
*Cross-site scripting is more straight-forward, cross-site request forgery is a little bit weird&lt;br /&gt;
*This involves having a link from a page sent by one server cause a request to be sent off to another server&lt;br /&gt;
*If you are logged in at the other server, this can cause things to happen which you didn&#039;t expect or want to happen&lt;br /&gt;
**For example, while logged in to the course wiki, a link from a page on a different website may cause a page to be deleted from the wiki by sending an appropriate request&lt;br /&gt;
*This makes use of cookies automatically being sent to a server, no matter where the link came from&lt;br /&gt;
*How can we stop this?&lt;br /&gt;
**One way is to try to verify where the link came from&lt;br /&gt;
**In the browser tools, go to the network tab and check the referer header&lt;br /&gt;
***This header indicates where the request came from&lt;br /&gt;
**So in principle, to stop a cross-site request forgery, we can check this header in the requests received on the server&lt;br /&gt;
***If it came from one of our pages, then we can trust the request&lt;br /&gt;
***Otherwise we don’t&lt;br /&gt;
**That does not actually work. It kind of works, but not always&lt;br /&gt;
**Why? Because the Referer header can often be scrapped by a proxy&lt;br /&gt;
**An alternative solution is to randomize your links&lt;br /&gt;
**Instead of using a predictable url, stick a random string in the middle of it&lt;br /&gt;
***The string is connected to the client&#039;s cookie so that the attacker can’t guess it&lt;br /&gt;
&lt;br /&gt;
======Same-Origin Policy======&lt;br /&gt;
&lt;br /&gt;
*Data should only loaded from the originating server but, you can load almost anything else from anywhere&lt;br /&gt;
**Images&lt;br /&gt;
**Sound&lt;br /&gt;
**JavaScript&lt;br /&gt;
*So what about JSON?&lt;br /&gt;
**when you load it with AJAX, you have the same-origin policy&lt;br /&gt;
**But what if you just treated it as a script? (why not just load it in the page?)&lt;br /&gt;
**And what if you were logged in?&lt;br /&gt;
***Consider a bank sending data as JSON (Could I from another tab just grab your bank account data as a JSON data in the background and see what exactly what you have? It doesn’t work.)&lt;br /&gt;
*JSON files are valid JavaScript structure (JSON is a subset of JavaScript)&lt;br /&gt;
*JSON files do not specify a name to give to the data structure so you can’t access it by name&lt;br /&gt;
*However, to build the object in the first place, its constructor must be called&lt;br /&gt;
**Why not replace the constructor with our own method?&lt;br /&gt;
***e.g., override Array&lt;br /&gt;
**This is solved in regular browsers for JSON by only using a clean JavaScript environment for JSON.parse()&lt;br /&gt;
**But what about code?&lt;br /&gt;
***This doesn’t help you for code, but who cares about code, right?&lt;br /&gt;
**Turns out many websites dynamically generate JavaScript and put personal information into it (different people have different scripts)&lt;br /&gt;
***Solution? Don’t mix code and data! (treat the JSON separately, let the code just be loaded on the system, don’t mix it with anything else)&lt;br /&gt;
&lt;br /&gt;
====Web Assembly====&lt;br /&gt;
&lt;br /&gt;
*Many, many people hate JavaScript&lt;br /&gt;
**There is a lot of code that isn’t JavaScript but people want everything to run on the web in a browser (JavaScript is the language of the web)&lt;br /&gt;
*Past efforts at having alternative languages all had a basic problem&lt;br /&gt;
**They couldn’t see the DOM&lt;br /&gt;
***e.g., Java applets, Flash, Silverlight&lt;br /&gt;
*And, what about all those other languages?&lt;br /&gt;
**C,C++?&lt;br /&gt;
**How about games?&lt;br /&gt;
***Unreal runs in a web page because there’s WebGL which is pretty fast (WebGL is a subset of openGL)&lt;br /&gt;
*So why can’t we compile code and have it run in the browser?&lt;br /&gt;
*Two old solutions:&lt;br /&gt;
**NaCl (Google)&lt;br /&gt;
***Native Client is a sandbox for running compiled C and C++ code in the browser efficiently and securely, independent of the user’s operating system&lt;br /&gt;
**asm.js (Mozilla)&lt;br /&gt;
***This uses a compiler that takes arbitrary programs and compiles them to JavaScript&lt;br /&gt;
***asm.js is perfectly legal JavaScript, it is tightly restricted JavaScript&lt;br /&gt;
***You cannot read asm.js code, it looks like binary&lt;br /&gt;
*Google and Mozilla joined up and are now making WebAssembly&lt;br /&gt;
**You can compile arbitrary code to run inside of the browser with WebAssembly&lt;br /&gt;
**This will be good for functionality and bad for security&lt;br /&gt;
***Security won’t go well because the code isn’t designed for the web&lt;br /&gt;
***But it will be cool to play games in a browser at full speed&lt;/div&gt;</summary>
		<author><name>Zero</name></author>
	</entry>
	<entry>
		<id>https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_22&amp;diff=20945</id>
		<title>WebFund 2016W Lecture 22</title>
		<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_22&amp;diff=20945"/>
		<updated>2016-04-11T17:11:03Z</updated>

		<summary type="html">&lt;p&gt;Zero: Typo.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Video==&lt;br /&gt;
&lt;br /&gt;
The video for the lecture given on March 31, 2016 [http://homeostasis.scs.carleton.ca/~soma/webfund-2016w/lectures/comp2406-2016w-lec22-31Mar2016.mp4 is now available].&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&lt;br /&gt;
===In Class===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Lecture 22&lt;br /&gt;
------------&lt;br /&gt;
Web Security&lt;br /&gt;
&lt;br /&gt;
Security in isolated systems&lt;br /&gt;
 - no networking&lt;br /&gt;
&lt;br /&gt;
What is the threat model?&lt;br /&gt;
&lt;br /&gt;
Threat model&lt;br /&gt;
 - what attacks are you trying to defend against&lt;br /&gt;
 - what attacks are you NOT trying to defend against&lt;br /&gt;
&lt;br /&gt;
Computer in an isolated room&lt;br /&gt;
 - ignore physical attacks, e.g. sledgehammers&lt;br /&gt;
&lt;br /&gt;
How to compromise this computer?&lt;br /&gt;
 - someone bad starts typing&lt;br /&gt;
 - someone inserts malicious media/device&lt;br /&gt;
   - parking lot flashdrive attack&lt;br /&gt;
     (solution: epoxy)&lt;br /&gt;
 - electromagnetic emissions&lt;br /&gt;
     (live in a faraday cage)&lt;br /&gt;
&lt;br /&gt;
Computer on a network&lt;br /&gt;
 - all local attacks&lt;br /&gt;
 - attacker can send arbitrary network data to system&lt;br /&gt;
 - attacker can listen in on network traffic&lt;br /&gt;
 - attacker can change outgoing traffic&lt;br /&gt;
&lt;br /&gt;
Basic defense: network crypto&lt;br /&gt;
 - encrypt to hide, sign data to protect integrity,&lt;br /&gt;
   verify authenticity&lt;br /&gt;
&lt;br /&gt;
Who will access?&lt;br /&gt;
 - authenticated, authorized users&lt;br /&gt;
 - unauthorized individuals/systems&lt;br /&gt;
 - attackers (can be either of the above)&lt;br /&gt;
&lt;br /&gt;
How can an attacker be &amp;quot;authorized&amp;quot;?&lt;br /&gt;
 - social engineering&lt;br /&gt;
   (can you please reset my password?)&lt;br /&gt;
 - brute force (try all the passwords)&lt;br /&gt;
 - technical compromise of credentials (keylogger)&lt;br /&gt;
 - authorized user turns/is malicious&lt;br /&gt;
   (insider attack)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
And now the web&lt;br /&gt;
&lt;br /&gt;
Who can access your application?&lt;br /&gt;
 - ANYBODY&lt;br /&gt;
 - for public web apps, ANYBODY is an authorized user&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So just from this we can see that web security is going&lt;br /&gt;
to be hard.&lt;br /&gt;
&lt;br /&gt;
The other half of the nightmare: the browser&lt;br /&gt;
&lt;br /&gt;
Ideally, to secure systems you isolate components&lt;br /&gt;
  - build big walls&lt;br /&gt;
&lt;br /&gt;
Your web browser has walls between pages...but there are&lt;br /&gt;
BIG HOLES (on purpose)&lt;br /&gt;
&lt;br /&gt;
 - cookies, in particular, are shared&lt;br /&gt;
 - this is bad because the scope of cookies is&lt;br /&gt;
   determined by DNS (domain name system)&lt;br /&gt;
&lt;br /&gt;
DNS has almost no security&lt;br /&gt;
 - there is DNSSEC but nobody uses it, yet at least&lt;br /&gt;
&lt;br /&gt;
You can better protect cookies by using HSTS&lt;br /&gt;
 - force HTTPS everywhere on a page/domain&lt;br /&gt;
 - protects against mixes of http/https content and&lt;br /&gt;
   downgrade attacks&lt;br /&gt;
&lt;br /&gt;
Why do we have cookies in the first place?&lt;br /&gt;
 - because HTTP was supposed to be stateless&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Also...&lt;br /&gt;
&lt;br /&gt;
Cross-site Scripting (XSS) attacks&lt;br /&gt;
 - not necessarily cross-site, not necesarily scripting&lt;br /&gt;
 - &amp;quot;web injection attacks&amp;quot;&lt;br /&gt;
 - see anywhere attacker can inject content into a page&lt;br /&gt;
   - (ads)&lt;br /&gt;
   - comments&lt;br /&gt;
   - social media&lt;br /&gt;
   - &amp;quot;user-generated content&amp;quot;&lt;br /&gt;
 - failure to sanitize untrusted input that is inserted&lt;br /&gt;
   into a web page&lt;br /&gt;
   (adding a comment to a page)&lt;br /&gt;
 - otherwise, you can insert arbitrary HTML, CSS,&lt;br /&gt;
   and JavaScript into the page&lt;br /&gt;
&lt;br /&gt;
Cross-site request forgery&lt;br /&gt;
 - makes use of cookies automatically being sent&lt;br /&gt;
   to domain, no matter where the link came from&lt;br /&gt;
 - can stop using tokens in URLs, or checking&lt;br /&gt;
   Referer/Origin headers (and a few other ways)&lt;br /&gt;
&lt;br /&gt;
Same-origin policy&lt;br /&gt;
 - data should only be loaded from the originating&lt;br /&gt;
   server&lt;br /&gt;
 - but, you can load almost anything else from&lt;br /&gt;
   anywhere&lt;br /&gt;
    - images&lt;br /&gt;
    - sound&lt;br /&gt;
    - javascript&lt;br /&gt;
&lt;br /&gt;
So what about JSON?&lt;br /&gt;
 - when you load it with AJAX, you have same origin&lt;br /&gt;
   policy&lt;br /&gt;
 - but if you just treated it as a script...&lt;br /&gt;
 - and what if you were logged in&lt;br /&gt;
   - bank sending data as JSON&lt;br /&gt;
&lt;br /&gt;
JSON files are valid JavaScript but they don&#039;t specify&lt;br /&gt;
the name to give to the data structure&lt;br /&gt;
 - so you can&#039;t access it, unless&lt;br /&gt;
&lt;br /&gt;
To build an object, you have to call the object&#039;s&lt;br /&gt;
constructor&lt;br /&gt;
 - why not replace the constructor with our own method?&lt;br /&gt;
   e.g., override Array&lt;br /&gt;
 - this is solved in regular browsers for JSON by&lt;br /&gt;
   only using a clean JavaScript environment for&lt;br /&gt;
   JSON.parse()&lt;br /&gt;
&lt;br /&gt;
This doesn&#039;t help you for code, but who cares about&lt;br /&gt;
code, right?&lt;br /&gt;
 - many websites dynamically generate JavaScript and put&lt;br /&gt;
   personal information into it&lt;br /&gt;
&lt;br /&gt;
Solution?  Don&#039;t mix code and data!&lt;br /&gt;
&lt;br /&gt;
WebAssembly&lt;br /&gt;
-----------&lt;br /&gt;
&lt;br /&gt;
* Many, many people hate JavaScript&lt;br /&gt;
* Lots of code that isn&#039;t JavaScript&lt;br /&gt;
* But people want everything to run on the web&lt;br /&gt;
  in a browser&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Past efforts at having alternative languages all&lt;br /&gt;
had a basic problem&lt;br /&gt;
 - they couldn&#039;t see the DOM&lt;br /&gt;
 - e.g., Java applets, Flash, Silverlight&lt;br /&gt;
&lt;br /&gt;
And, what about all those other languages?&lt;br /&gt;
 - C, C++??!&lt;br /&gt;
 - how about games?&lt;br /&gt;
&lt;br /&gt;
Unreal runs in a web page&lt;br /&gt;
 - there&#039;s WebGL which is pretty fast&lt;br /&gt;
&lt;br /&gt;
So, why can&#039;t we compile code and have it run in the&lt;br /&gt;
browser?&lt;br /&gt;
&lt;br /&gt;
Two old solutions:&lt;br /&gt;
 - NaCl (Google)&lt;br /&gt;
 - asm.js (Mozilla)&lt;br /&gt;
 &lt;br /&gt;
They joined up and are now making WebAssembly&lt;br /&gt;
&lt;br /&gt;
This will be good for functionality and bad for&lt;br /&gt;
security.&lt;br /&gt;
 - security won&#039;t go well because code isn&#039;t&lt;br /&gt;
   designed for the web&lt;br /&gt;
 - but it will be cool to play games in a browser at&lt;br /&gt;
   full speed :-)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Student Notes===&lt;br /&gt;
&lt;br /&gt;
====Administrative====&lt;br /&gt;
&lt;br /&gt;
*There is a study session on April 11 morning.&lt;br /&gt;
*Students can come to tutorial next week and consider it as extended office hours&lt;br /&gt;
&lt;br /&gt;
====Web Security====&lt;br /&gt;
&lt;br /&gt;
*There are certain fundamental things of the web that make it very hard to secure&lt;br /&gt;
*When considering security, we want to consider a threat model&lt;br /&gt;
**What attacks are you trying to defend against?&lt;br /&gt;
**What attacks are you NOT trying to defend against?&lt;br /&gt;
&lt;br /&gt;
=====Computer in an isolated room=====&lt;br /&gt;
&lt;br /&gt;
*Ignore physical attacks, e.g. sledgehammers&lt;br /&gt;
*If we talking about software level, how can the computer be compromised?&lt;br /&gt;
**Someone bad starts typing&lt;br /&gt;
**Someone inserts malicious media/device&lt;br /&gt;
**Parking lot flashdrive attack (a flashdrive is left in a parking lot for someone to pick up and plug in)&lt;br /&gt;
**(solution: epoxy, no one can plug anything in)&lt;br /&gt;
**Electromagnetic emissions&lt;br /&gt;
***(solution: live in a Faraday cage, almost completely isolated from any EM transmission)&lt;br /&gt;
&lt;br /&gt;
=====Computer on a network=====&lt;br /&gt;
&lt;br /&gt;
*Threats:&lt;br /&gt;
**All local attacks (all the physical attack will be there too)&lt;br /&gt;
**An attacker can send arbitrary network data to system&lt;br /&gt;
**An attacker can listen in on network traffic&lt;br /&gt;
**An attacker can change outgoing traffic&lt;br /&gt;
**(they can listen anything on the computer, can listen anything going out of the computer, can send arbitrary network data to the computer, can change data and leaving the computer going elsewhere)&lt;br /&gt;
*How to protect against that?&lt;br /&gt;
*Basic defense: network crypto&lt;br /&gt;
**Encrypt to hide, sign data to protect integrity, verify authenticity&lt;br /&gt;
*We need to distinguish between who is trying to access the computer&lt;br /&gt;
*Who will access?&lt;br /&gt;
**Authenticated/authorized users&lt;br /&gt;
**Unauthorized individuals/systems&lt;br /&gt;
**Attackers (can be either of the above)&lt;br /&gt;
*How can an attacker be “authorized” ?&lt;br /&gt;
**Social engineering (can you please reset my password?)&lt;br /&gt;
**Brute force (try all the passwords)&lt;br /&gt;
**Technical compromise of credentials (keylogger)&lt;br /&gt;
**Authorized user turns/is malicious (insider attack)(most dangerous, because they are not only authorized, they also know the system)&lt;br /&gt;
&lt;br /&gt;
=====And now the web=====&lt;br /&gt;
&lt;br /&gt;
*Why is the web so nasty?&lt;br /&gt;
*Who can access your application?&lt;br /&gt;
**ANYBODY&lt;br /&gt;
**For most public web apps, ANYBODY is an authorized user&lt;br /&gt;
**There are different levels of insider attacks. Just because of you have account on gmail doesn’t mean you have access to the inside system. You don’t have full access, but you have some access, that is potentially dangerous.&lt;br /&gt;
*So from this we can see that web security is going to be hard&lt;br /&gt;
*The other half of the nightmare is the browser&lt;br /&gt;
*Ideally, to secure systems you isolate components&lt;br /&gt;
**Build big walls&lt;br /&gt;
*Your web browser has walls between pages... but there are BIG HOLES (on purpose)&lt;br /&gt;
*The tabs in the browser are not so isolated (e.g Log in to an account on one tab then refresh another tab on the same page... it will be logged in as well). They are connected.&lt;br /&gt;
*Cookies are being shared between the pages, it is a shared data source&lt;br /&gt;
*This is bad because the scope of cookies is determined by DNS (Domain Name System)&lt;br /&gt;
*DNS has almost no security&lt;br /&gt;
*There is DNSSEC but nobody uses it, yet at least&lt;br /&gt;
**If you want to know more about this, you can find the article on [usenix.org usenix.org]&lt;br /&gt;
*You can better protect cookies by using HSTS&lt;br /&gt;
**This forces HTTPS everywhere on a page/domain&lt;br /&gt;
**Protects against mixes of HTTP/HTTPS communications and downgrade attacks&lt;br /&gt;
*Why we do we have cookies in the first place?&lt;br /&gt;
**Because HTTP was supposed to be stateless&lt;br /&gt;
**The cookies are used instead to create a state between the client and server&lt;br /&gt;
*If we could get past these problems, would we have proper security?&lt;br /&gt;
**Definitely not&lt;br /&gt;
*There are other issues...&lt;br /&gt;
&lt;br /&gt;
======Cross-Site Scripting (XSS) Attacks======&lt;br /&gt;
&lt;br /&gt;
*Not necessarily cross-site, and not necessarily scripting&lt;br /&gt;
*More like “web injection attacks”&lt;br /&gt;
*This can happen anywhere an attacker can inject content into a page&lt;br /&gt;
**Ads&lt;br /&gt;
**Comments&lt;br /&gt;
**Social media&lt;br /&gt;
**User-generated content&lt;br /&gt;
*Problems can occur when there is a failure to sanitize untrusted input that is inserted into a web page&lt;br /&gt;
**This allows users to insert arbitrary HTML, CSS, and JavaScript into the page&lt;br /&gt;
&lt;br /&gt;
======Cross-Site Request Forgery======&lt;br /&gt;
&lt;br /&gt;
*Cross-site scripting is more straight-forward, cross-site request forgery is a little bit weird&lt;br /&gt;
*This involves having a link from a page sent by one server cause a request to be sent off to another server&lt;br /&gt;
*If you are logged in at the other server, this can cause things to happen which you didn&#039;t expect or want to happen&lt;br /&gt;
**For example, while logged in to the course wiki, a link from a page on a different website may cause a page to be deleted from the wiki by sending an appropriate request&lt;br /&gt;
*This makes use of cookies automatically being sent to a server, no matter where the link came from&lt;br /&gt;
*How can we stop this?&lt;br /&gt;
**One way is to try to verify where the link came from&lt;br /&gt;
**In the browser tools, go to the network tab and check the referer header&lt;br /&gt;
***This header indicates where the request came from&lt;br /&gt;
**So in principle, to stop a cross-site request forgery, we can check this header in the requests received on the server&lt;br /&gt;
***If it came from one of our pages, then we can trust the request&lt;br /&gt;
***Otherwise we don’t&lt;br /&gt;
**That does not actually work. It kind of works, but not always&lt;br /&gt;
**Why? Because the Referer header can often be scrapped by a proxy&lt;br /&gt;
**An alternative solution is to randomize your links&lt;br /&gt;
**Instead of using a predictable url, stick a random string in the middle of it&lt;br /&gt;
***The string is connected to the client&#039;s cookie so that the attacker can’t guess it&lt;br /&gt;
&lt;br /&gt;
======Same-Origin Policy======&lt;br /&gt;
&lt;br /&gt;
*Data should only loaded from the originating server but, you can load almost anything else from anywhere&lt;br /&gt;
**Images&lt;br /&gt;
**Sound&lt;br /&gt;
**JavaScript&lt;br /&gt;
*So what about JSON?&lt;br /&gt;
**when you load it with AJAX, you have the same-origin policy&lt;br /&gt;
**But what if you just treated it as a script? (why not just load it in the page?)&lt;br /&gt;
**And what if you were logged in?&lt;br /&gt;
***Consider a bank sending data as JSON (Could I from another tab just grab your bank account data as a JSON data in the background and see what exactly what you have? It doesn’t work.)&lt;br /&gt;
*JSON files are valid JavaScript structure (JSON is a subset of JavaScript)&lt;br /&gt;
*JSON files do not specify a name to give to the data structure so you can’t access it by name&lt;br /&gt;
*However, to build the object in the first place, its constructor must be called&lt;br /&gt;
**Why not replace the constructor with our own method?&lt;br /&gt;
***e.g., override Array&lt;br /&gt;
**This is solved in regular browsers for JSON by only using a clean JavaScript environment for JSON.parse()&lt;br /&gt;
**But what about code?&lt;br /&gt;
***This doesn’t help you for code, but who cares about code, right?&lt;br /&gt;
**Turns out many websites dynamically generate JavaScript and put personal information into it (different people have different scripts)&lt;br /&gt;
***Solution? Don’t mix code and data! (treat the JSON separately, let the code just be loaded on the system, don’t mix it with anything else)&lt;br /&gt;
&lt;br /&gt;
====Web Assembly====&lt;br /&gt;
&lt;br /&gt;
*Many, many people hate JavaScript&lt;br /&gt;
**There is a lot of code that isn’t JavaScript but people want everything to run on the web in a browser (JavaScript is the language of the web)&lt;br /&gt;
*Past efforts at having alternative languages all had a basic problem&lt;br /&gt;
**They couldn’t see the DOM&lt;br /&gt;
***e.g., Java applets, Flash, Silverlight&lt;br /&gt;
*And, what about all those other languages?&lt;br /&gt;
**C,C++?&lt;br /&gt;
**How about games?&lt;br /&gt;
***Unreal runs in a web page because there’s WebGL which is pretty fast (WebGL is a subset of openGL)&lt;br /&gt;
*So why can’t we compile code and have it run in the browser?&lt;br /&gt;
*Two old solutions:&lt;br /&gt;
**NaCl (Google)&lt;br /&gt;
***Native Client is a sandbox for running compiled C and C++ code in the browser efficiently and securely, independent of the user’s operating system&lt;br /&gt;
**asm.js (Mozilla)&lt;br /&gt;
***This uses a compiler that takes arbitrary programs and compiles them to JavaScript&lt;br /&gt;
***asm.js is perfectly legal JavaScript, it is tightly restricted JavaScript&lt;br /&gt;
***You cannot read asm.js code, it looks like binary&lt;br /&gt;
*Google and Mozilla joined up and are now making WebAssembly&lt;br /&gt;
**You can compile arbitrary code to run inside of the browser with WebAssembly&lt;br /&gt;
**This will be good for functionality and bad for security&lt;br /&gt;
***Security won’t go well because the code isn’t designed for the web&lt;br /&gt;
***But it will be cool to play games in a browser at full speed&lt;/div&gt;</summary>
		<author><name>Zero</name></author>
	</entry>
	<entry>
		<id>https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_11&amp;diff=20731</id>
		<title>WebFund 2016W Lecture 11</title>
		<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_11&amp;diff=20731"/>
		<updated>2016-02-23T20:54:53Z</updated>

		<summary type="html">&lt;p&gt;Zero: Added more in-class notes.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Notes==&lt;br /&gt;
&lt;br /&gt;
===In-class Notes===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Lecture 11&lt;br /&gt;
----------&lt;br /&gt;
&lt;br /&gt;
Databases&lt;br /&gt;
&lt;br /&gt;
/var/spool/mail&lt;br /&gt;
  - where email is stored&lt;br /&gt;
  - one file per user&lt;br /&gt;
&lt;br /&gt;
my mail inbox in /var/spool/mail/soma&lt;br /&gt;
&lt;br /&gt;
Who accesses this file?&lt;br /&gt;
  - mail client&lt;br /&gt;
  - mail server&lt;br /&gt;
&lt;br /&gt;
What happens if the mail server delivers mail while I&#039;m going&lt;br /&gt;
through my email (deleting, filing)&lt;br /&gt;
 - unless you lock it, you lose mail, mail client will overwrite&lt;br /&gt;
   inbox and delete new messages&lt;br /&gt;
 - solution: lock the inbox&lt;br /&gt;
     create a soma.lock file&lt;br /&gt;
     (inside it has the process ID of the accessing process)&lt;br /&gt;
&lt;br /&gt;
This is a bad idea that does not scale&lt;br /&gt;
Instead, use a database&lt;br /&gt;
 - concurrent access&lt;br /&gt;
 - data persistence&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
What kind of database?&lt;br /&gt;
 - key-value stores&lt;br /&gt;
    like a filesystem for very small files,&lt;br /&gt;
    with search&lt;br /&gt;
 - document store  &amp;lt;-- we&#039;ll use this&lt;br /&gt;
    values have structure&lt;br /&gt;
    can index on values&lt;br /&gt;
 - relational database&lt;br /&gt;
    sets of tables&lt;br /&gt;
    tables have rows and columns&lt;br /&gt;
    relations between tables&lt;br /&gt;
    example: names and addresses&lt;br /&gt;
      - rows are individual people&lt;br /&gt;
      - columns are first name, last name, address, city, etc.&lt;br /&gt;
    relation example: customers and purchases&lt;br /&gt;
      - each purchase (invoice) has item purchased, price, and&lt;br /&gt;
        customer ID&lt;br /&gt;
      - customer table connects customer ID and name, address, etc&lt;br /&gt;
&lt;br /&gt;
We&#039;re going to use MongoDB, a document store, not a relational&lt;br /&gt;
database.&lt;br /&gt;
  - stores JSON-like documents&lt;br /&gt;
  - scriptable in JavaScript&lt;br /&gt;
&lt;br /&gt;
If we were to use a relational database, we&#039;d have to learn SQL&lt;br /&gt;
  - Structured Query Language&lt;br /&gt;
  - many man implementations&lt;br /&gt;
     Oracle, MySQL (MariaDB), PostgreSQL, MS SQL Server, SQLite, etc&lt;br /&gt;
  - you mainly need a relational database to handle transactions&lt;br /&gt;
&lt;br /&gt;
Transaction&lt;br /&gt;
 - what if a change to a database involves multiple tables?&lt;br /&gt;
 - a transaction ensures all tables are changed or none are&lt;br /&gt;
&lt;br /&gt;
Classic example: airline tickets&lt;br /&gt;
&lt;br /&gt;
Tables:&lt;br /&gt;
 - seat reservations&lt;br /&gt;
 - payment&lt;br /&gt;
 - customer info&lt;br /&gt;
&lt;br /&gt;
When you buy a ticket, you want to change all three&lt;br /&gt;
&lt;br /&gt;
A transaction ensures atomic behavior&lt;br /&gt;
  all happen or none happen&lt;br /&gt;
&lt;br /&gt;
MongoDB        Relational DB&lt;br /&gt;
Document   =&amp;gt;  row&lt;br /&gt;
Collection =&amp;gt;  table&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Web Architecture&lt;br /&gt;
----------------&lt;br /&gt;
&lt;br /&gt;
web browser (interprets HTML, CSS, JavaScript)&lt;br /&gt;
&lt;br /&gt;
  |&lt;br /&gt;
  |  HTTP&lt;br /&gt;
  |&lt;br /&gt;
&lt;br /&gt;
web server (runs arbitrary code, in this class JavaScript in node)&lt;br /&gt;
&lt;br /&gt;
  |&lt;br /&gt;
  |  SQL or MongoDB protocol&lt;br /&gt;
  |&lt;br /&gt;
&lt;br /&gt;
database (persistent store, allows concurrent access safely)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Zero</name></author>
	</entry>
	<entry>
		<id>https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_11&amp;diff=20730</id>
		<title>WebFund 2016W Lecture 11</title>
		<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_11&amp;diff=20730"/>
		<updated>2016-02-23T20:20:24Z</updated>

		<summary type="html">&lt;p&gt;Zero: Added more in-class notes.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Notes==&lt;br /&gt;
&lt;br /&gt;
===In-class Notes===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Lecture 11&lt;br /&gt;
----------&lt;br /&gt;
&lt;br /&gt;
Databases&lt;br /&gt;
&lt;br /&gt;
/var/spool/mail&lt;br /&gt;
  - where email is stored&lt;br /&gt;
  - one file per user&lt;br /&gt;
&lt;br /&gt;
my mail inbox in /var/spool/mail/soma&lt;br /&gt;
&lt;br /&gt;
Who accesses this file?&lt;br /&gt;
  - mail client&lt;br /&gt;
  - mail server&lt;br /&gt;
&lt;br /&gt;
What happens if the mail server delivers mail while I&#039;m going&lt;br /&gt;
through my email (deleting, filing)&lt;br /&gt;
 - unless you lock it, you lose mail, mail client will overwrite&lt;br /&gt;
   inbox and delete new messages&lt;br /&gt;
 - solution: lock the inbox&lt;br /&gt;
     create a soma.lock file&lt;br /&gt;
     (inside it has the process ID of the accessing process)&lt;br /&gt;
&lt;br /&gt;
This is a bad idea that does not scale&lt;br /&gt;
Instead, use a database&lt;br /&gt;
 - concurrent access&lt;br /&gt;
 - data persistence&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
What kind of database?&lt;br /&gt;
 - key-value stores&lt;br /&gt;
    like a filesystem for very small files,&lt;br /&gt;
    with search&lt;br /&gt;
 - document store  &amp;lt;-- we&#039;ll use this&lt;br /&gt;
    values have structure&lt;br /&gt;
    can index on values&lt;br /&gt;
 - relational database&lt;br /&gt;
    sets of tables&lt;br /&gt;
    tables have rows and columns&lt;br /&gt;
    relations between tables&lt;br /&gt;
    example: names and addresses&lt;br /&gt;
      - rows are individual people&lt;br /&gt;
      - columns are first name, last name, address, city, etc.&lt;br /&gt;
    relation example: customers and purchases&lt;br /&gt;
      - each purchase (invoice) has item purchased, price, and&lt;br /&gt;
        customer ID&lt;br /&gt;
      - customer table connects customer ID and name, address, etc&lt;br /&gt;
&lt;br /&gt;
We&#039;re going to use MongoDB, a document store, not a relational&lt;br /&gt;
database.&lt;br /&gt;
  - stores JSON-like documents&lt;br /&gt;
  - scriptable in JavaScript&lt;br /&gt;
&lt;br /&gt;
If we were to use a relational database, we&#039;d have to learn SQL&lt;br /&gt;
  - Structured Query Language&lt;br /&gt;
  - many man implementations&lt;br /&gt;
     Oracle, MySQL (MariaDB), PostgreSQL, MS SQL Server, SQLite, etc&lt;br /&gt;
  - you mainly need a relational database to handle transactions&lt;br /&gt;
&lt;br /&gt;
Transaction&lt;br /&gt;
 - what if a change to a database involves multiple tables?&lt;br /&gt;
 - a transaction ensures all tables are changed or none are&lt;br /&gt;
&lt;br /&gt;
Classic example: airline tickets&lt;br /&gt;
&lt;br /&gt;
Tables:&lt;br /&gt;
 - seat reservations&lt;br /&gt;
 - payment&lt;br /&gt;
 - customer info&lt;br /&gt;
&lt;br /&gt;
When you buy a ticket, you want to change all three&lt;br /&gt;
&lt;br /&gt;
A transaction ensures atomic behavior&lt;br /&gt;
  all happen or none happen&lt;br /&gt;
&lt;br /&gt;
MongoDB        Relational DB&lt;br /&gt;
Document   =&amp;gt;  row&lt;br /&gt;
Collection =&amp;gt;  table&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Zero</name></author>
	</entry>
	<entry>
		<id>https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_11&amp;diff=20729</id>
		<title>WebFund 2016W Lecture 11</title>
		<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_11&amp;diff=20729"/>
		<updated>2016-02-23T19:56:14Z</updated>

		<summary type="html">&lt;p&gt;Zero: Added partial in class notes.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Notes==&lt;br /&gt;
&lt;br /&gt;
===In-class Notes===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Lecture 11&lt;br /&gt;
----------&lt;br /&gt;
&lt;br /&gt;
Databases&lt;br /&gt;
&lt;br /&gt;
/var/spool/mail&lt;br /&gt;
  - where email is stored&lt;br /&gt;
  - one file per user&lt;br /&gt;
&lt;br /&gt;
my mail inbox in /var/spool/mail/soma&lt;br /&gt;
&lt;br /&gt;
Who accesses this file?&lt;br /&gt;
  - mail client&lt;br /&gt;
  - mail server&lt;br /&gt;
&lt;br /&gt;
What happens if the mail server delivers mail while I&#039;m going&lt;br /&gt;
through my email (deleting, filing)&lt;br /&gt;
 - unless you lock it, you lose mail, mail client will overwrite&lt;br /&gt;
   inbox and delete new messages&lt;br /&gt;
 - solution: lock the inbox&lt;br /&gt;
     create a soma.lock file&lt;br /&gt;
     (inside it has the process ID of the accessing process)&lt;br /&gt;
&lt;br /&gt;
This is a bad idea that does not scale&lt;br /&gt;
Instead, use a database&lt;br /&gt;
 - concurrent access&lt;br /&gt;
 - data persistence&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Zero</name></author>
	</entry>
	<entry>
		<id>https://homeostasis.scs.carleton.ca/wiki/index.php?title=Fundamentals_of_Web_Applications_(Winter_2016)&amp;diff=20654</id>
		<title>Fundamentals of Web Applications (Winter 2016)</title>
		<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=Fundamentals_of_Web_Applications_(Winter_2016)&amp;diff=20654"/>
		<updated>2016-02-03T00:01:09Z</updated>

		<summary type="html">&lt;p&gt;Zero: As stated in the outline, a wiki account is no longer required.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Course Outline==&lt;br /&gt;
&lt;br /&gt;
[[Fundamentals of Web Applications: Winter 2016 Course Outline|Here]] is the course outline.&lt;br /&gt;
&lt;br /&gt;
==Lectures and Exams==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table style=&amp;quot;width: 100%;&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;tr valign=&amp;quot;top&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;th&amp;gt;&lt;br /&gt;
    &amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;Date&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;th&amp;gt;&lt;br /&gt;
    &amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;Topic&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 7&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 1|Lecture 1]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 12&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 2|Lecture 2]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 14&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 3|Lecture 3]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 19&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 4|Lecture 4]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 21&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 5|Lecture 5]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 26&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 6|Lecture 6]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 28&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 7|Lecture 7]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Feb. 2&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 8|Lecture 8]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Feb. 4&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 9|Lecture 9]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Feb. 9&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 10|Midterm Review]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Feb. 11&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Midterm (in class)&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Feb. 23&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 11|Lecture 11]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Feb. 25&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 12|Lecture 12]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 1&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 13|Lecture 13]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 3&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 14|Lecture 14]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 8&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 15|Lecture 15]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 10&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 16|Lecture 16]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 15&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 17|Lecture 17]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 17&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 18|Lecture 18]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 22&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 19|Lecture 19]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 24&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 20|Lecture 20]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 29&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 21|Lecture 21]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 31&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 22|Lecture 22]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Apr. 5&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 23|Lecture 23]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;April 7&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 24|Lecture 24]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;TBA&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Final Exam&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Tutorials==&lt;br /&gt;
&lt;br /&gt;
Each week you will get a progress grade from 0-4, given to you by a TA.  If you are being diligent, you should be able to get 4&#039;s every week.  The easiest way to get your grade is to come to tutorial and meet with your TA; alternately, you can meet a TA in their office hours or, at their discretion, discuss things with them online.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table style=&amp;quot;width: 100%;&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;tr valign=&amp;quot;top&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;th&amp;gt;&lt;br /&gt;
    &amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;Date&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;th&amp;gt;&lt;br /&gt;
    &amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;Tutorials&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 13, 14, 15, 18&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Tutorial 1|Asynchronous Code in JavaScript]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 20, 21, 22, 25&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Tutorial 2|Tiny web server]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 27, 28, 29, Feb. 1&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Tutorial 3|Express, Form demo]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Feb. 3, 4, 5, 8&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Tutorial 4|Exam forms]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Feb. 24, 25, 26, 29&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Tutorial 5|TBA]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 2, 3, 4, 7&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Tutorial 6|TBA]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 9, 10, 11, 14&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Tutorial 7|TBA]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 16, 17, 18, 21&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Tutorial 8|TBA]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 23, 24, 25, 28&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Tutorial 9|TBA]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 30, 31, Apr. 1, 4&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Tutorial 10|TBA]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Assignments==&lt;br /&gt;
&amp;lt;table style=&amp;quot;width: 100%;&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;tr valign=&amp;quot;top&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;th&amp;gt;&lt;br /&gt;
    &amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;Due Date&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;th&amp;gt;&lt;br /&gt;
    &amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;Assignments&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 20&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Assignment 1|Assignment 1]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;&amp;lt;b&amp;gt;Jan. 31 (extended)&amp;lt;/b&amp;gt;&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Assignment 2|Assignment 2]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Feb. 9, 2:30 PM&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Assignment 3|Assignment 3]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 2&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Assignment 4|Assignment 4]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 9&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Assignment 5|Assignment 5]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 16&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Assignment 6|Assignment 6]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 23&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Assignment 7|Assignment 7]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 30&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Assignment 8|Assignment 8]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Apr. 6&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Assignment 9|Assignment 9]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Course Software==&lt;br /&gt;
&lt;br /&gt;
In this course we will be developing web applications using [http://nodejs.org/ node.js] and [http://www.mongodb.org/ mongoDB].  You are welcome to use whatever operating system and development tools you like; however, we will supporting the use of a course virtual machine appliance running [http://www.lubuntu.net/ Lubuntu], a low-resource variant of [http://www.ubuntu.com/ Ubuntu] Linux distribution.&lt;br /&gt;
&lt;br /&gt;
===In the labs===&lt;br /&gt;
&lt;br /&gt;
In the SCS labs you should be able to run the course VM by starting Virtualbox (listed in the Applications menu) and selecting the COMP 2406 virtual machine image.  After the VM has fully booted up you can login to the student account using the password &amp;quot;tneduts!&amp;quot;.  This account has administrative privileges; in addition, there is the admin account in case your student account gets corrupted for any reason.  The password for it is &amp;quot;nimda!&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
We highly recommend running your VM in full-screen mode (select from the menu, not by maximizing the window).  Do all of your work inside of the VM; it should be fast enough and you won&#039;t have any issues with sharing files or with firewalls/network connectivity. Keep in mind that the browser is likely out of date and you should not log into any important services (e.g., Gmail) due to missing security patches.&lt;br /&gt;
&lt;br /&gt;
You can save the work you do from the course VM (in the student account) to your SCS account and restore it to any other copy of the class VM (on your machines or in the labs) by running using the following commands:&lt;br /&gt;
&lt;br /&gt;
  save2406 &amp;lt;SCS username&amp;gt;&lt;br /&gt;
  restore2406 &amp;lt;SCS username&amp;gt;&lt;br /&gt;
  compare2406 &amp;lt;SCS username&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you use these commands, &#039;&#039;&#039;use them consistently&#039;&#039;&#039;.  That means run &amp;lt;tt&amp;gt;restore2406&amp;lt;/tt&amp;gt; when you first log in, and run &amp;lt;tt&amp;gt;save2406&amp;lt;/tt&amp;gt; just before logging out.  If you don&#039;t do this, you will &#039;&#039;&#039;erase&#039;&#039;&#039; the work that you had done previously when you save.&lt;br /&gt;
&lt;br /&gt;
If you forgot to restore and you want to save, try running this:&lt;br /&gt;
&lt;br /&gt;
   rsync -a -v --progress ~/ &amp;lt;SCS username&amp;gt;@access.scs.carleton.ca:COMP2406/&lt;br /&gt;
&lt;br /&gt;
This is the same as the &amp;lt;tt&amp;gt;save2406&amp;lt;/tt&amp;gt; command minus the options (--delete and --force) that deletes files in the destination that don&#039;t exist in the source.  As a check, you may want to add the &amp;lt;tt&amp;gt;-n&amp;lt;/tt&amp;gt; option to do a dry run.&lt;br /&gt;
&lt;br /&gt;
====Working directly off network drive (sshfs)====&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t want to bother running save2406 and restore2406 all the time, you can optionally mount the network drive.&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install sshfs # You may already have this package&lt;br /&gt;
  mkdir ~/network-drive/ # Pick any name you want.&lt;br /&gt;
  sshfs -o reconnect,transform_symlinks ~/network-drive/ &amp;lt;SCS username&amp;gt;@access.scs.carleton.ca:/&lt;br /&gt;
&lt;br /&gt;
At this point, you should see all of your files in ~/network-drive/COMP2406/.&lt;br /&gt;
&lt;br /&gt;
Note: There is no concept of &amp;quot;restore&amp;quot; or undo. If you delete or overwrite a file, it&#039;s gone.&lt;br /&gt;
&lt;br /&gt;
===Running the VM on your own machines===&lt;br /&gt;
&lt;br /&gt;
If you want to run the VM appliance on your own system (running essentially any desktop operating system you want), just download the [http://homeostasis.scs.carleton.ca/~soma/VMs/COMP%202406,%20Winter%202016.ova virtual appliance file] and import into [http://www.virtualbox.org VirtualBox] or VMware Workstation/Fusion ([https://secure.scs.carleton.ca/vmware/ free to Carleton SCS students]).  The SHA1 hash of this file is:&lt;br /&gt;
&lt;br /&gt;
    97fc4de4544505178b580d27487085a20961e91e [http://homeostasis.scs.carleton.ca/~soma/VMs/COMP%202406,%20Winter%202016.ova COMP 2406, Winter 2016.ova]&lt;br /&gt;
&lt;br /&gt;
On Windows you can compute this hash for your downloaded file using the command &amp;lt;a href=&amp;quot;http://support.microsoft.com/kb/889768&amp;quot;&amp;gt;&amp;lt;tt&amp;gt;FCIV -sha1 COMP 2406 &amp;amp; 3000, Fall 2015.ova&amp;lt;/tt&amp;gt;&amp;lt;/a&amp;gt;.  If the hash is different from above, your download has been corrupted.&lt;br /&gt;
&lt;br /&gt;
If your virtualization platform is not VirtualBox, you&#039;ll need to:&lt;br /&gt;
* Have the VM platform ignore any errors in the structure of the appliance found during the import process;&lt;br /&gt;
* Uninstall the VirtualBox guest additions by typing starting a terminal application and running&lt;br /&gt;
   sudo /opt/VBoxGuestAdditions-*/uninstall.sh&lt;br /&gt;
* Install your platform&#039;s own Linux guest additions, if available.&lt;br /&gt;
&lt;br /&gt;
===Configuring Linux===&lt;br /&gt;
&lt;br /&gt;
If you already run Linux and you want to use the same packages we do in class, you should do the following:&lt;br /&gt;
&lt;br /&gt;
* Install the latest node.js version using [https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager a package manager].  (You generally don&#039;t use the version that comes with your distribution, it is probably too old.)&lt;br /&gt;
* Install [http://www.mongodb.org/ mongoDB] - it probably goes by mongodb in your package manager.  The version doesn&#039;t matter too much.&lt;br /&gt;
&lt;br /&gt;
Note that the binary of the node.js executable may be &amp;lt;tt&amp;gt;node&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;nodejs&amp;lt;/tt&amp;gt;, or something similar.&lt;br /&gt;
&lt;br /&gt;
That&#039;s it!&lt;br /&gt;
&lt;br /&gt;
===Configuring Windows===&lt;br /&gt;
&lt;br /&gt;
It is also possible to do everything in this class in native Windows.  Here are some tips on getting things running.&lt;br /&gt;
&lt;br /&gt;
* You can install the [https://nodejs.org/en/download/ official Node.js package] to get basic node and npm functionality.&lt;br /&gt;
* See [[Run MongoDB on Windows]].&lt;br /&gt;
* If you want to run Emacs on Windows, look at the [[Running Emacs on Windows|following tips]].&lt;br /&gt;
* [https://atom.io/ Atom] is a another popular free GUI text editor.&lt;br /&gt;
&lt;br /&gt;
===Configuring Mac OS X===&lt;br /&gt;
&lt;br /&gt;
It is possible, and recommended, to configure Node and mongoDB to run on your Mac.&lt;br /&gt;
&lt;br /&gt;
====Homebrew method (recommended)====&lt;br /&gt;
Homebrew is a package manager for OS X that works similarly to Linux-style package managers like &amp;lt;tt&amp;gt;apt&amp;lt;/tt&amp;gt;. Homebrew provides access to thousands of Linux and BSD packages to install natively on your Mac. You have a perfectly capable UNIX system in front of you. Make good use of it!&lt;br /&gt;
&lt;br /&gt;
* Install [http://brew.sh/ Homebrew] (copy the installation text on that page to Terminal.app)&lt;br /&gt;
* Install Node and mongoDB&lt;br /&gt;
&lt;br /&gt;
Run the following commands in your terminal:&lt;br /&gt;
&lt;br /&gt;
    brew update&lt;br /&gt;
    brew install node&lt;br /&gt;
    brew install mongo&lt;br /&gt;
&lt;br /&gt;
That&#039;s it!&lt;br /&gt;
&lt;br /&gt;
====Manual method====&lt;br /&gt;
Alternatively, you can download and install Node and mongo directly.&lt;br /&gt;
&lt;br /&gt;
* Download and install the &#039;&#039;Mac OS X Installer&#039;&#039; from [https://nodejs.org/en/download/stable/ the download page].&lt;br /&gt;
* Download the binaries from [https://www.mongodb.org/downloads#production MongoDB&#039;s download page]&lt;br /&gt;
* Follow [https://docs.mongodb.org/manual/tutorial/install-mongodb-on-os-x/#install-mongodb-community-edition-manually these instructions]&lt;br /&gt;
&lt;br /&gt;
==Resources==&lt;br /&gt;
&lt;br /&gt;
In general any text published by [http://www.oreilly.com/ O&#039;Reilly] is worth your time.  Many (but not all) of the texts below are published by them.&lt;br /&gt;
&lt;br /&gt;
===JavaScript===&lt;br /&gt;
&lt;br /&gt;
[http://shop.oreilly.com/product/9780596517748.do JavaScript: The Good Parts] by Douglas Crockford is an excellent text on JavaScript and it is short.  We highly suggest you obtain a copy and read it.&lt;br /&gt;
&lt;br /&gt;
The easiest way to get started with JavaScript and get basic understanding of web technologies is to go through the interactive lessons on [http://codeacademy.com Code Academy].  I suggest you go through their JavaScript, Web Fundamentals, and jQuery tracks.  They shouldn&#039;t take you very long to do given that you already know how to program.&lt;br /&gt;
&lt;br /&gt;
Crockford also has a lot of online resources on JavaScript, including videos of talks he&#039;s given that cover much of the content in his book.  Look at his [http://javascript.crockford.com/ JavaScript page] and this [http://yuiblog.com/crockford/ page of his videos].&lt;br /&gt;
&lt;br /&gt;
Another good book is [http://eloquentjavascript.net/ Eloquent JavaScript: A Modern Introduction to Programming] by Marijn Haverbeke.  A version of this book is available online for free.  The for-sale version is apparently updated and edited.&lt;br /&gt;
&lt;br /&gt;
The standard reference for JavaScript is [http://shop.oreilly.com/product/9780596805531.do JavaScript: The Definitive Guide] by David Flanagan.  It is a big book, but it is comprehensive.&lt;br /&gt;
&lt;br /&gt;
===Node===&lt;br /&gt;
&lt;br /&gt;
[http://shop.oreilly.com/product/0636920024606.do Learning Node] by Shelley Powers is the recommended resource for learning about Node.&lt;br /&gt;
&lt;br /&gt;
Another introduction to node.js is [http://www.nodebeginner.org/ The Node Beginner Book] by Manuel Kiessling.&lt;br /&gt;
&lt;br /&gt;
[http://evanhahn.com/understanding-express-js/ This page by Evan Hahn] has a good overview of the express/connect/node software stack.&lt;br /&gt;
&lt;br /&gt;
===MongoDB===&lt;br /&gt;
&lt;br /&gt;
[http://shop.oreilly.com/product/0636920028031.do MongoDB: The Definitive Guide] by Kristina Chodorow (1st or 2nd ed) is the recommended text for learning more about MongoDB.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Lecture Notes Guidelines==&lt;br /&gt;
&lt;br /&gt;
As specified in the course outline you can get up to 6% extra credit on your final grade (2% per time) for writing up notes from lecture.  Here are the guidelines for those notes.&lt;br /&gt;
&lt;br /&gt;
Lee Croft (LeeCroft at cmail.carleton.ca) will be handling course notes.  Please contact him if you would like to volunteer.  Note that you should email him in advance and he will give you the next available slot.  There are over 200 students in class and only 20 lectures so opportunities may go fast!&lt;br /&gt;
&lt;br /&gt;
You will send your notes to Lee to verify that your notes are of sufficient quality to merit the extra credit; this may require a few rounds of revisions. However, if you follow the guidelines below it shouldn&#039;t be too bad.&lt;br /&gt;
&lt;br /&gt;
You should plan on organizing your notes as follows:&lt;br /&gt;
* Organize them in at least the following sections: Topics &amp;amp; Readings, Audio &amp;amp; Video, and Notes.&lt;br /&gt;
* The Topics &amp;amp; Readings section lists the main topics covered in the course, e.g. &amp;quot;Scoping rules in JavaScript&amp;quot;.  Please use an unordered bulleted list (using *&#039;s in wiki markup).  In this section also list readings relevant to the lecture that were mentioned in class.&lt;br /&gt;
* Leave the Audio and Video section blank.  Anil will fill this out.&lt;br /&gt;
* Put your notes in the Notes section.&lt;br /&gt;
&lt;br /&gt;
Use (nested) lists if appropriate for the notes; however, please have some text that isn&#039;t bulleted.  Please try to make the notes even if you did not attend lecture; however, you don&#039;t need to cover every small bit of information that was covered.  In particular the notes do not need to include digressions into topics only tangentially related to the course.  Complete sentences are welcome but not required.&lt;br /&gt;
&lt;br /&gt;
Once your notes meet the guidelines, Lee will post the notes for you.&lt;/div&gt;</summary>
		<author><name>Zero</name></author>
	</entry>
	<entry>
		<id>https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_8&amp;diff=20652</id>
		<title>WebFund 2016W Lecture 8</title>
		<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_8&amp;diff=20652"/>
		<updated>2016-02-02T20:30:14Z</updated>

		<summary type="html">&lt;p&gt;Zero: Added some notes. Not the greatest, somebody else should actually finish them.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Student Notes==&lt;br /&gt;
&lt;br /&gt;
===Agenda===&lt;br /&gt;
&lt;br /&gt;
* Spoke/explained the solutions for [[WebFund 2016W: Assignment 2|assignment 2]].&lt;br /&gt;
* Answered questions about the upcoming [[WebFund 2016W: Assignment 3|assignment 3]].&lt;br /&gt;
&lt;br /&gt;
===Topics (from assignment 2 &amp;amp; 3)===&lt;br /&gt;
&lt;br /&gt;
* What does the regular expression on line 92 of tinywebserver.js do? (Answer: Prevents breaking out of the current directory by using &amp;lt;tt&amp;gt;..&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;~&amp;lt;/tt&amp;gt;)&lt;br /&gt;
* What does path.normalize do? (Answer: Tries to fix a malformed path. e.g. &amp;lt;tt&amp;gt;/home//dave/&amp;lt;/tt&amp;gt; becomes &amp;lt;tt&amp;gt;/home/dave/&amp;lt;/tt&amp;gt;)&lt;br /&gt;
* What is Jade? (Answer: Templating language.)&lt;/div&gt;</summary>
		<author><name>Zero</name></author>
	</entry>
	<entry>
		<id>https://homeostasis.scs.carleton.ca/wiki/index.php?title=User:Zero&amp;diff=20623</id>
		<title>User:Zero</title>
		<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=User:Zero&amp;diff=20623"/>
		<updated>2016-01-29T01:55:21Z</updated>

		<summary type="html">&lt;p&gt;Zero: Use HTTPS.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://www.google.com/recaptcha/mailhide/d?k=01sDNx0w0evmNHUjPrRHXNDA==&amp;amp;c=EUckNBLbP39p5lu7CVKLHL9A3qmF8PeG7RO1TesVKY1-23rQ9oQJE3lGAEDqhIiD Click here] for my email address if you want to send me any comments/questions.&lt;/div&gt;</summary>
		<author><name>Zero</name></author>
	</entry>
	<entry>
		<id>https://homeostasis.scs.carleton.ca/wiki/index.php?title=User:Zero&amp;diff=20622</id>
		<title>User:Zero</title>
		<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=User:Zero&amp;diff=20622"/>
		<updated>2016-01-29T01:52:56Z</updated>

		<summary type="html">&lt;p&gt;Zero: Added page.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[http://www.google.com/recaptcha/mailhide/d?k=01sDNx0w0evmNHUjPrRHXNDA==&amp;amp;c=EUckNBLbP39p5lu7CVKLHL9A3qmF8PeG7RO1TesVKY1-23rQ9oQJE3lGAEDqhIiD Click here] for my email address if you want to send me any comments/questions.&lt;/div&gt;</summary>
		<author><name>Zero</name></author>
	</entry>
	<entry>
		<id>https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_7&amp;diff=20620</id>
		<title>WebFund 2016W Lecture 7</title>
		<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_7&amp;diff=20620"/>
		<updated>2016-01-28T21:27:35Z</updated>

		<summary type="html">&lt;p&gt;Zero: No in-class notes this time.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Video==&lt;br /&gt;
&lt;br /&gt;
The video for the lecture given on January 28, 2016 [http://homeostasis.scs.carleton.ca/~soma/webfund-2016w/lectures/comp2406-2016w-lec01-07Jan2016.mp4 is now available].&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&lt;br /&gt;
===In-class Poll===&lt;br /&gt;
&lt;br /&gt;
https://pollev.com/anilsomayaji565&lt;/div&gt;</summary>
		<author><name>Zero</name></author>
	</entry>
	<entry>
		<id>https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_7&amp;diff=20618</id>
		<title>WebFund 2016W Lecture 7</title>
		<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_7&amp;diff=20618"/>
		<updated>2016-01-28T19:47:55Z</updated>

		<summary type="html">&lt;p&gt;Zero: Added some of the in-class notes.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Notes==&lt;br /&gt;
&lt;br /&gt;
===In-class Poll===&lt;br /&gt;
&lt;br /&gt;
https://pollev.com/anilsomayaji565&lt;br /&gt;
&lt;br /&gt;
===In-class Notes===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Lecture #7&lt;br /&gt;
---------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Zero</name></author>
	</entry>
	<entry>
		<id>https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_6&amp;diff=20611</id>
		<title>WebFund 2016W Lecture 6</title>
		<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_6&amp;diff=20611"/>
		<updated>2016-01-26T20:52:23Z</updated>

		<summary type="html">&lt;p&gt;Zero: Added more in-class notes.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Notes==&lt;br /&gt;
&lt;br /&gt;
===In-class Notes===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Lecture #6&lt;br /&gt;
---------&lt;br /&gt;
&lt;br /&gt;
PLAN&lt;br /&gt;
* Assignment 2&lt;br /&gt;
  - aliases&lt;br /&gt;
  - headers&lt;br /&gt;
  - other clarifications?&lt;br /&gt;
&lt;br /&gt;
* Objects&lt;br /&gt;
  - associative hashes with inheritance&lt;br /&gt;
  - prototypes using Object.create&lt;br /&gt;
  - &amp;quot;global&amp;quot; object&lt;br /&gt;
  - &amp;quot;Object&amp;quot; object&lt;br /&gt;
  - Object.prototype&lt;br /&gt;
  - hasOwnProperty and Object.hasOwnProperty&lt;br /&gt;
&lt;br /&gt;
* Function calling and &amp;quot;this&amp;quot;&lt;br /&gt;
 - functions in regular scope&lt;br /&gt;
 - methods&lt;br /&gt;
 - constructors with new&lt;br /&gt;
 - call/apply&lt;br /&gt;
 - functions in global scope&lt;br /&gt;
&lt;br /&gt;
* form demo!&lt;br /&gt;
&lt;br /&gt;
------------------&lt;br /&gt;
&lt;br /&gt;
If a function starts with a capital letter, it is an object&lt;br /&gt;
constructor that you call with new.&lt;br /&gt;
 - why?  because it keeps JavaScript programmers sort of sane&lt;br /&gt;
&lt;br /&gt;
if (x.a) { blah}     instead do &lt;br /&gt;
&lt;br /&gt;
if (x.hasOwnProperty(a) &amp;amp;&amp;amp; x.a) better, but&lt;br /&gt;
&lt;br /&gt;
if (hasOwnProperty.call(x,a) &amp;amp;&amp;amp; x.a) is even better&lt;br /&gt;
&lt;br /&gt;
Why not tinywebserver?&lt;br /&gt;
&lt;br /&gt;
* templates: otherwise, have to manually generate web pages using&lt;br /&gt;
  variable data&lt;br /&gt;
* routing: otherwise, you&#039;ll be using regexp&#039;s to match each &lt;br /&gt;
  incoming URL and then call the right function&lt;br /&gt;
  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Zero</name></author>
	</entry>
	<entry>
		<id>https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_6&amp;diff=20610</id>
		<title>WebFund 2016W Lecture 6</title>
		<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_6&amp;diff=20610"/>
		<updated>2016-01-26T19:44:59Z</updated>

		<summary type="html">&lt;p&gt;Zero: Typo.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Notes==&lt;br /&gt;
&lt;br /&gt;
===In-class Notes===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Lecture #6&lt;br /&gt;
---------&lt;br /&gt;
&lt;br /&gt;
PLAN&lt;br /&gt;
* Assignment 2&lt;br /&gt;
  - aliases&lt;br /&gt;
  - headers&lt;br /&gt;
  - other clarifications?&lt;br /&gt;
&lt;br /&gt;
* Objects&lt;br /&gt;
  - associative hashes with inheritance&lt;br /&gt;
  - prototypes using Object.create&lt;br /&gt;
  - &amp;quot;global&amp;quot; object&lt;br /&gt;
  - &amp;quot;Object&amp;quot; object&lt;br /&gt;
  - Object.prototype&lt;br /&gt;
  - hasOwnProperty and Object.hasOwnProperty&lt;br /&gt;
&lt;br /&gt;
* Function calling and &amp;quot;this&amp;quot;&lt;br /&gt;
 - functions in regular scope&lt;br /&gt;
 - methods&lt;br /&gt;
 - constructors with new&lt;br /&gt;
 - apply&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Zero</name></author>
	</entry>
	<entry>
		<id>https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_6&amp;diff=20609</id>
		<title>WebFund 2016W Lecture 6</title>
		<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_6&amp;diff=20609"/>
		<updated>2016-01-26T19:41:33Z</updated>

		<summary type="html">&lt;p&gt;Zero: Added in-class notes from the beginning of the lecture.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Notes==&lt;br /&gt;
&lt;br /&gt;
===In-class Notes===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Lecture #6&lt;br /&gt;
---------&lt;br /&gt;
&lt;br /&gt;
PLAN&lt;br /&gt;
* Assignment 2&lt;br /&gt;
  - aliases&lt;br /&gt;
  - headers&lt;br /&gt;
  - other clarifications?&lt;br /&gt;
&lt;br /&gt;
* Objects&lt;br /&gt;
  - associative hashes with inheritance&lt;br /&gt;
  - prototypes using Object.create&lt;br /&gt;
  - &amp;quot;global&amp;quot; object&lt;br /&gt;
  - &amp;quot;Object&amp;quot; object&lt;br /&gt;
  - Object.prototype&lt;br /&gt;
  - hasOwnProperty and Object.hasOwnPropert&lt;br /&gt;
&lt;br /&gt;
* Function calling and &amp;quot;this&amp;quot;&lt;br /&gt;
 - functions in regular scope&lt;br /&gt;
 - methods&lt;br /&gt;
 - constructors with new&lt;br /&gt;
 - apply&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Zero</name></author>
	</entry>
	<entry>
		<id>https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_4&amp;diff=20575</id>
		<title>WebFund 2016W Lecture 4</title>
		<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_4&amp;diff=20575"/>
		<updated>2016-01-22T03:04:37Z</updated>

		<summary type="html">&lt;p&gt;Zero: Added nosniff header.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Video==&lt;br /&gt;
&lt;br /&gt;
The video for the lecture given on January 19, 2016 [http://homeostasis.scs.carleton.ca/~soma/webfund-2016w/lectures/comp2406-2016w-lec04-19Jan2016.mp4 is now available].&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&lt;br /&gt;
===In-class Notes===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Lecture 4&lt;br /&gt;
---------&lt;br /&gt;
Web servers&lt;br /&gt;
&lt;br /&gt;
What does a web server do?&lt;br /&gt;
Listens on port 80, 443, or other port&lt;br /&gt;
INPUT: HTTP requests&lt;br /&gt;
OUTPUT: HTTP responses &amp;amp; requested documents&lt;br /&gt;
&lt;br /&gt;
tinywebserver.js&lt;br /&gt;
 - written in JavaScript (Node)&lt;br /&gt;
 - can only serve files&lt;br /&gt;
 - understands only a few file types&lt;br /&gt;
&lt;br /&gt;
So tinywebserver is how web servers worked in 1995&lt;br /&gt;
&lt;br /&gt;
What changed since then is now web servers run code to generate responses&lt;br /&gt;
&lt;br /&gt;
Why use frameworks?&lt;br /&gt;
 - because we don&#039;t want to build up HTML from scratch&lt;br /&gt;
 - and, we want logic that is abstracted away&lt;br /&gt;
 - and, we want routing&lt;br /&gt;
   - have someone else decide which function to call in response to requests&lt;br /&gt;
&lt;br /&gt;
But for this week, bare bones&lt;br /&gt;
&lt;br /&gt;
Debugging&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Student Notes===&lt;br /&gt;
====Announcements====&lt;br /&gt;
*Assignment 1 due tomorrow (now pushed back to Thursday before class)&lt;br /&gt;
*Basics for tutorial 2 and assignment 2 are up!&lt;br /&gt;
&lt;br /&gt;
====Web Servers====&lt;br /&gt;
*What does a web server do? &lt;br /&gt;
**Listens on port 80 (usually HTTP), 443 (usually HTTPS) or some other port.&lt;br /&gt;
***If the web server is listening on a non-standard port, you must specify the port in the URL (using something like “localhost:8080”)&lt;br /&gt;
**Input: HTTP requests&lt;br /&gt;
**Output: HTTP responses with requested documents&lt;br /&gt;
***HTTP responses always have a response code&lt;br /&gt;
****200: OK, used for successful request&lt;br /&gt;
****404: Not Found&lt;br /&gt;
**In other words it services requests&lt;br /&gt;
*Need root privileges to listen on ports &amp;lt;~1024&lt;br /&gt;
**Do not do development as root if you can, it is risky!&lt;br /&gt;
*Popular Web Servers: Apache, NginX&lt;br /&gt;
&lt;br /&gt;
====Tiny Web Server====&lt;br /&gt;
*Written in JavaScript(Node)&lt;br /&gt;
*Can only serve files! (most modern servers can do more)&lt;br /&gt;
*Understands limited file types&lt;br /&gt;
*Similar to web servers from 1995 &lt;br /&gt;
*To try to understand what the code is doing, we can start by looking at the bottom of the file&lt;br /&gt;
&lt;br /&gt;
=====http.createServer()=====&lt;br /&gt;
*Apart from the loading of some modules and the definitions of some objects and functions, the first real code to run in this script is the &amp;lt;code&amp;gt;createServer()&amp;lt;/code&amp;gt; method&lt;br /&gt;
*We are calling a method of the &amp;lt;code&amp;gt;http&amp;lt;/code&amp;gt; object (loaded from a module) in order to create an object which will act as the server (which we then store in the &amp;lt;code&amp;gt;server&amp;lt;/code&amp;gt; variable)&lt;br /&gt;
*This method takes a single argument, &amp;lt;code&amp;gt;request_handler&amp;lt;/code&amp;gt;&lt;br /&gt;
**&amp;lt;code&amp;gt;request_handler&amp;lt;/code&amp;gt; is a function which is intended to handler incoming requests&lt;br /&gt;
**By providing this function as the argument, we are telling the server to call the function every time a request comes in&lt;br /&gt;
&lt;br /&gt;
=====server.listen()=====&lt;br /&gt;
*Here we are calling the &amp;lt;code&amp;gt;listen()&amp;lt;/code&amp;gt; method of the &amp;lt;code&amp;gt;server&amp;lt;/code&amp;gt; object that was just created&lt;br /&gt;
*This tells the server to start listening for incoming requests&lt;br /&gt;
*The first two arguments are telling the server where to listen (on port 8080 of localhost)&lt;br /&gt;
**This information came from the &amp;lt;code&amp;gt;options&amp;lt;/code&amp;gt; object which was defined at the top of the file&lt;br /&gt;
*The third argument is a callback function&lt;br /&gt;
**This will run once the server has started listening&lt;br /&gt;
**It simply prints a message in the console to indicate that the server is ready&lt;br /&gt;
&lt;br /&gt;
=====request_handler()=====&lt;br /&gt;
*This function gets called every time a request comes in (because we provided it as an argument to the &amp;lt;code&amp;gt;http.createServer()&amp;lt;/code&amp;gt; method)&lt;br /&gt;
*There are two arguments &lt;br /&gt;
**&amp;lt;code&amp;gt;request&amp;lt;/code&amp;gt; is an object which represents the request that was received&lt;br /&gt;
**&amp;lt;code&amp;gt;response&amp;lt;/code&amp;gt; is an object which represents the response that will be sent&lt;br /&gt;
*At a high level, this function checks for the existence of a requested file and responds with either the file or an error code&lt;br /&gt;
*There are many nested callback functions here&lt;br /&gt;
**Although this makes the code more difficult to read, why is this preferable to doing things synchronously?&lt;br /&gt;
***This ensures that the &amp;lt;code&amp;gt;request_handler()&amp;lt;/code&amp;gt; function will return very quickly&lt;br /&gt;
***All the bulk of the work is done asynchronously&lt;br /&gt;
***This allows the server to be available to handle another request again very quickly&lt;br /&gt;
***This is important in order to keep the server responsive for numerous requests &lt;br /&gt;
&lt;br /&gt;
====MIME Types====&lt;br /&gt;
*MIME types are used to specify the type of data being sent via HTTP&lt;br /&gt;
*In Tiny Web Server, there is an object &amp;lt;code&amp;gt;MIME_TYPES&amp;lt;/code&amp;gt; defined near the top of the file which contains the types of files that the server recognizes&lt;br /&gt;
*The &amp;lt;code&amp;gt;MIME_TYPES&amp;lt;/code&amp;gt; object is used in the &amp;lt;code&amp;gt;get_mime()&amp;lt;/code&amp;gt; function to determine the type of a requested file&lt;br /&gt;
*Similarly, the &amp;lt;code&amp;gt;MIME_TYPES&amp;lt;/code&amp;gt; object is used to set the Content-Type header of the HTTP response that is sent by the server&lt;br /&gt;
*We can break ‘image/jpg’  by changing it to ‘imaage/jpg’&lt;br /&gt;
**The web browser does not know how to handle it because it does not recognize imaage&lt;br /&gt;
*Web browsers can deal with broken content type for some types of files&lt;br /&gt;
**For example, putting a jpg as png in &amp;lt;code&amp;gt;MIME_TYPES&amp;lt;/code&amp;gt;, will not break the content and Firefox is smart enough to render it correctly as jpg&lt;br /&gt;
**To prevent the browser from attempting to detect what format the content is, the &amp;lt;tt&amp;gt;X-Content-Type-Options: nosniff&amp;lt;/tt&amp;gt; header can be added.&lt;br /&gt;
&lt;br /&gt;
====Response Headers====&lt;br /&gt;
*Some headers of the HTTP response are set in the &amp;lt;code&amp;gt;respond()&amp;lt;/code&amp;gt; function&lt;br /&gt;
**This is done using the &amp;lt;code&amp;gt;response.writeHead()&amp;lt;/code&amp;gt; method&lt;br /&gt;
**We could add more headers here if we want to&lt;br /&gt;
*Some other headers are set for us by the code in the &amp;lt;code&amp;gt;http&amp;lt;/code&amp;gt; module&lt;br /&gt;
*We can see these headers from within the dev tools of the web browser after a response has been received&lt;br /&gt;
*There are not many headers used here because Tiny Web Server is not very complex&lt;br /&gt;
&lt;br /&gt;
====Frameworks and Modern Servers====&lt;br /&gt;
How have things improved since 1995?&lt;br /&gt;
*We use code to generate responses to requests&lt;br /&gt;
**We often use frameworks to do much of the work for us&lt;br /&gt;
&lt;br /&gt;
Why use frameworks?&lt;br /&gt;
*Because we don’t want to build up HTML from scratch&lt;br /&gt;
*Abstracted away logic&lt;br /&gt;
*We also want routing (dispatcher): have someone else decide which function to call in response to requests &lt;br /&gt;
&lt;br /&gt;
====Debugging====&lt;br /&gt;
*You can use the node debugger by typing &amp;lt;code&amp;gt;node debug script.js&amp;lt;/code&amp;gt; in the terminal&lt;br /&gt;
*This will stop the program on the first line of code that is run&lt;br /&gt;
*You can continue execution of the code by typing &amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;&lt;br /&gt;
*You can learn about other useful commands by typing &amp;lt;code&amp;gt;help&amp;lt;/code&amp;gt;&lt;br /&gt;
*In particular, you can type &amp;lt;code&amp;gt;repl&amp;lt;/code&amp;gt; to enter a read-evaluate-print loop from which you can inspect or modify objects or other data&lt;br /&gt;
*You can also write &amp;lt;code&amp;gt;debugger;&amp;lt;/code&amp;gt; in the script to create a break point where the debugger will pause the execution of the program&lt;br /&gt;
*There is also a debugger available in the web browser&lt;br /&gt;
**This is for client side code and will not work for any server-side code&lt;br /&gt;
&lt;br /&gt;
====HTML====&lt;br /&gt;
*You can use the inspect in the web browser dev tools to see the the tree-structure HTML which makes up a web page&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;amp;lt;div&amp;amp;gt;&amp;lt;/code&amp;gt; tags are used for sections in HTML&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;amp;lt;a&amp;amp;gt;&amp;lt;/code&amp;gt; tags are used for links (review on CodeAcademy)&lt;/div&gt;</summary>
		<author><name>Zero</name></author>
	</entry>
	<entry>
		<id>https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W:_Tutorial_2&amp;diff=20558</id>
		<title>WebFund 2016W: Tutorial 2</title>
		<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W:_Tutorial_2&amp;diff=20558"/>
		<updated>2016-01-20T22:05:01Z</updated>

		<summary type="html">&lt;p&gt;Zero: Quite a few people in the tutorial are getting into trouble with this.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In this tutorial you&#039;ll be playing with [http://homeostasis.scs.carleton.ca/~soma/webfund-2016w/code/tinywebserver.js tinywebserver.js], a static file webserver in node.js that has no dependencies outside of the core node.js modules.  It is based on a [https://github.com/rodw/tiny-node.js-webserver tiny node.js web server] written by [http://heyrod.com/ Rod Waldhoff].  (Note that the original is written in [http://coffeescript.org/ CoffeeScript].)&lt;br /&gt;
&lt;br /&gt;
To run it, just type &amp;quot;node tinywebserver.js&amp;quot;.  It will begin serving on the web the pages in the same directory as the script.  You&#039;ll want to have some files files to serve; to start off, try having it serve [http://homeostasis.scs.carleton.ca/~soma/webfund-2016w/code/hello.html hello.html] from class.  Then, move on to saving pages from the web and serving those.  (Note: they probably will be broken in some way by tinywebserver.)&lt;br /&gt;
&lt;br /&gt;
You can run tinywebserver under the debugger by typing &amp;quot;node debug tinywebserver.js&amp;quot;.  See below for instructions on how to use the node debugger.  You may also want to use the browser developer tools to see how the web browser is interacting with the server.&lt;br /&gt;
&lt;br /&gt;
===Questions===&lt;br /&gt;
# What port is the web server listening on?&lt;br /&gt;
# What file is returned when you access a directory?  Why?&lt;br /&gt;
# What sort of URL do you give to get the insecure URL warning (403 Forbidden response code)?&lt;br /&gt;
# What URL do you need to get a 500 error?&lt;br /&gt;
&lt;br /&gt;
===Tasks===&lt;br /&gt;
# Change the port the server listens on to be 3000.&lt;br /&gt;
# Change the server to serve files from /home/student/public_html rather than the current directory.  Be sure to put some files in it!  (Hint: you can grab HTML files from any webserver using wget or curl.)&lt;br /&gt;
# Change tinywebserver.js so it returns a simple HTML error page in response to 404 errors (page not found). &#039;&#039;(Hint: Make sure you keep all your JavaScript and HTML files in the same folder!)&#039;&#039;&lt;br /&gt;
# Make the options object be stored in a file options.json and read on server startup.  This load may be synchronous!  Use [https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse JSON.parse()] to convert the file data into an object.&lt;br /&gt;
&lt;br /&gt;
==Node debugger==&lt;br /&gt;
&lt;br /&gt;
Node has a [http://nodejs.org/api/debugger.html built-in debugger].  Start it by running &amp;lt;tt&amp;gt;node debug tinywebserver.js&amp;lt;/tt&amp;gt;.  This will stop on the first line of the file.  Type &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt; to step to the next line of the file. Type &amp;lt;tt&amp;gt;c&amp;lt;/tt&amp;gt; to continue to the next breakpoint.  Breakpoints are set by adding a &amp;lt;tt&amp;gt;debugger;&amp;lt;/tt&amp;gt; statement to the javascript source.  &lt;br /&gt;
&lt;br /&gt;
At any time you can type &amp;lt;tt&amp;gt;repl&amp;lt;/tt&amp;gt; into the debugger to drop into a read-eval-print loop where you can evaluate JavaScript statements in the current context.  Ctrl-C will get you out of the REPL.&lt;br /&gt;
&lt;br /&gt;
For example, consider this source for &amp;lt;tt&amp;gt;test.js&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&amp;lt;source line lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var x = 5;&lt;br /&gt;
var y = 10;&lt;br /&gt;
&lt;br /&gt;
debugger;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
You can run &amp;lt;tt&amp;gt;node debug test.js&amp;lt;/tt&amp;gt; to start the debugger.&lt;br /&gt;
&lt;br /&gt;
It which will stop on the first line of the file (&amp;lt;tt&amp;gt;var x = 5;&amp;lt;/tt&amp;gt;). If you enter &amp;lt;tt&amp;gt;c&amp;lt;/tt&amp;gt; node will continue executing until the &amp;lt;tt&amp;gt;debugger;&amp;lt;/tt&amp;gt; statement where it will stop. From here if you enter &amp;lt;tt&amp;gt;repl&amp;lt;/tt&amp;gt; you can execute Javascript in the current context. In the &amp;lt;tt&amp;gt;repl&amp;lt;/tt&amp;gt; prompt if you enter &amp;lt;tt&amp;gt;x;&amp;lt;/tt&amp;gt; it will return 5. If you enter &amp;lt;tt&amp;gt;x + y;&amp;lt;/tt&amp;gt; it will return 15, etc.&lt;br /&gt;
&lt;br /&gt;
==Browser developer tools==&lt;br /&gt;
&lt;br /&gt;
* [https://developer.mozilla.org/en-US/docs/Tools Firefox developer tools]: Tools-&amp;gt;Web Developer-&amp;gt;Toggle Tools&lt;br /&gt;
* [https://developer.chrome.com/devtools/index Chrome/Chromium developer tools]: Tools-&amp;gt;Developer Tools&lt;br /&gt;
The above links have full documentation on the respective developer tools.&lt;br /&gt;
&lt;br /&gt;
Select the Network tab to see HTTP traffic.&lt;br /&gt;
Select Inspector (Firefox) or Elements (Chrome/Chromium) to see the HTML document (DOM).&lt;/div&gt;</summary>
		<author><name>Zero</name></author>
	</entry>
	<entry>
		<id>https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_4&amp;diff=20551</id>
		<title>WebFund 2016W Lecture 4</title>
		<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_4&amp;diff=20551"/>
		<updated>2016-01-19T20:52:37Z</updated>

		<summary type="html">&lt;p&gt;Zero: Added in-class notes.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Notes==&lt;br /&gt;
&lt;br /&gt;
===In-class Notes===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Lecture 4&lt;br /&gt;
---------&lt;br /&gt;
Web servers&lt;br /&gt;
&lt;br /&gt;
What does a web server do?&lt;br /&gt;
Listens on port 80, 443, or other port&lt;br /&gt;
INPUT: HTTP requests&lt;br /&gt;
OUTPUT: HTTP responses &amp;amp; requested documents&lt;br /&gt;
&lt;br /&gt;
tinywebserver.js&lt;br /&gt;
 - written in JavaScript (Node)&lt;br /&gt;
 - can only serve files&lt;br /&gt;
 - understands only a few file types&lt;br /&gt;
&lt;br /&gt;
So tinywebserver is how web servers worked in 1995&lt;br /&gt;
&lt;br /&gt;
What changed since then is now web servers run code to generate responses&lt;br /&gt;
&lt;br /&gt;
Why use frameworks?&lt;br /&gt;
 - because we don&#039;t want to build up HTML from scratch&lt;br /&gt;
 - and, we want logic that is abstracted away&lt;br /&gt;
 - and, we want routing&lt;br /&gt;
   - have someone else decide which function to call in response to requests&lt;br /&gt;
&lt;br /&gt;
But for this week, bare bones&lt;br /&gt;
&lt;br /&gt;
Debugging&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Zero</name></author>
	</entry>
	<entry>
		<id>https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_2&amp;diff=20545</id>
		<title>WebFund 2016W Lecture 2</title>
		<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_2&amp;diff=20545"/>
		<updated>2016-01-18T18:34:01Z</updated>

		<summary type="html">&lt;p&gt;Zero: New section added.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Video==&lt;br /&gt;
&lt;br /&gt;
The video from the lecture given on January 12, 2016 [http://homeostasis.scs.carleton.ca/~soma/webfund-2016w/lectures/comp2406-2016w-lec02-12Jan2016.mp4 is now available].&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&lt;br /&gt;
===In-class Notes===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Lecture #2&lt;br /&gt;
----------&lt;br /&gt;
JavaScript&lt;br /&gt;
&lt;br /&gt;
* no declared types&lt;br /&gt;
  - strings&lt;br /&gt;
  - objects&lt;br /&gt;
  - arrays&lt;br /&gt;
  - numbers (floats)&lt;br /&gt;
  - boolean&lt;br /&gt;
&lt;br /&gt;
With Node&lt;br /&gt;
 - asynchronous (non-blocking) I/O&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Student Notes===&lt;br /&gt;
&lt;br /&gt;
* Administration Reminders&lt;br /&gt;
** [[Fundamentals_of_Web_Applications:_Winter_2016_Course_Outline#Course_Information|Office hours have been added.]]&lt;br /&gt;
** [[Fundamentals_of_Web_Applications:_Winter_2016_Course_Outline#Grading|Midterm date has been tentatively created.]]&lt;br /&gt;
** [[WebFund_2016W:_Assignment_1|Assignment #1 has been posted.]]&lt;br /&gt;
&lt;br /&gt;
====JavaScript: As a Language====&lt;br /&gt;
&lt;br /&gt;
* JavaScript has &#039;&#039;&#039;nothing&#039;&#039;&#039; to do with Java.&lt;br /&gt;
** Why is it even called JavaScript then? At first it wasn&#039;t; it was developed as Mocha, changed to LiveScript and then finally renamed to JavaScript due to an agreement with Sun (acquired by Oracle).&amp;lt;ref&amp;gt;[http://stackoverflow.com/a/2475528]&amp;lt;/ref&amp;gt;&lt;br /&gt;
* The only similarity between Java/JavaScript is some of the syntax, but that can be said for a lot of languages.&lt;br /&gt;
&lt;br /&gt;
* What&#039;s different about JavaScript?&lt;br /&gt;
** No declared data types; it&#039;s a &amp;quot;loose&amp;quot; language.&lt;br /&gt;
*** Instead of int i = 0, it&#039;s simply var i = 0.&lt;br /&gt;
** There&#039;s seven data types&amp;lt;ref&amp;gt;[https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures]&amp;lt;/ref&amp;gt; (examples in brackets)&lt;br /&gt;
*** Boolean (true, false)&lt;br /&gt;
*** Number (3.1337, 1337, etc. There&#039;s no integer or long, everything is a float)&lt;br /&gt;
*** String (&amp;quot;Dave&amp;quot;)&lt;br /&gt;
*** Symbol&lt;br /&gt;
*** Object&lt;br /&gt;
*** Null&lt;br /&gt;
*** Undefined&lt;br /&gt;
&lt;br /&gt;
====How should I learn JavaScript?====&lt;br /&gt;
&lt;br /&gt;
* Practice! While attending the lectures is a great start, you &#039;&#039;will&#039;&#039; have to practice outside of class. This will not be graded, but will ultimately affect your performance in the course (and in the workplace).&lt;br /&gt;
** [https://www.codecademy.com/learn/javascript Codecademy] has a lot of good resources for beginners.&lt;br /&gt;
** For more advanced students, check on [https://github.com/search?l=javascript&amp;amp;o=desc&amp;amp;q=stars%3A%3E1&amp;amp;s=stars&amp;amp;type=Repositories GitHub] to see if there&#039;s any projects you&#039;re interested in contributing to. If you plan to work in web development, it&#039;s very likely you will be asked in an interview if you&#039;ve contributed to any open source projects (having a good portfolio will help a &#039;&#039;lot&#039;&#039; in getting a first job).&lt;br /&gt;
* The Mozilla Developer Network maintains a [https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference JavaScript reference] that is recommend. &#039;&#039;(Note: There is no official documentation for Google Chrome&#039;s V8 engine, although there is an [http://v8.paulfryzel.com/docs/master/index.html unofficial reference].)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
====Working with Variables====&lt;br /&gt;
&lt;br /&gt;
If you&#039;ve previously worked with Java, the first large difference you&#039;ve noticed is likely that variables are very &amp;quot;flexible&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
* If you attempt to use a variable that has not been declared, you will &#039;&#039;&#039;not&#039;&#039;&#039; get a compiler error. Instead, the type &amp;lt;tt&amp;gt;undefined&amp;lt;/tt&amp;gt; will be returned. This can making debugging a bit of a challenge!&lt;br /&gt;
* Likewise with most languages, a symbol (e.g., &amp;lt;tt&amp;gt;x&amp;lt;/tt&amp;gt;) can only reference &#039;&#039;one&#039;&#039; object (which can optionally encapsulate other objects).&lt;br /&gt;
* You can have several types of data inside  single object (e.g., &amp;lt;tt&amp;gt;x.y&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;x.y.z&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;x.y.x.qwerty&amp;lt;/tt&amp;gt;, etc).&lt;br /&gt;
* &amp;lt;tt&amp;gt;x.size&amp;lt;/tt&amp;gt; (dot notation) is the same as &amp;lt;tt&amp;gt;x[&amp;quot;size&amp;quot;]&amp;lt;/tt&amp;gt; (array notation).&lt;br /&gt;
* JavaScript engines use a garbage collector, so you do not need to manually deallocate memory (in C you need to). Unlike Java, you can &amp;quot;reuse&amp;quot; a variable name and use a completely different type; e.g. creating &amp;lt;tt&amp;gt;var x = 1337&amp;lt;/tt&amp;gt; and then &amp;lt;tt&amp;gt;x = &amp;quot;Dave&amp;quot;&amp;lt;/tt&amp;gt; later is completely valid.&lt;br /&gt;
&lt;br /&gt;
====Regular Expressions (Regex)====&lt;br /&gt;
&lt;br /&gt;
While this topic is technically outside of the course material, you will likely need to use it in some assignments. Regex is the same across different languages, so you will not need to relearn it all for every language.&lt;br /&gt;
&lt;br /&gt;
https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions&lt;br /&gt;
&lt;br /&gt;
====Synchronous vs. Asynchronous====&lt;br /&gt;
&lt;br /&gt;
* Synchronous (blocking) functions are where a task must be fully complete before the next task can be begin.&lt;br /&gt;
** Examples:&lt;br /&gt;
*** Waiting on a single network connection before accepting additions requests.&lt;br /&gt;
*** Waiting for a file to be fully loaded before displaying it in a text editor.&lt;br /&gt;
* Asynchronous (non-blocking) functions are where the program is allowed to continue with other tasks while another one is in process.&lt;br /&gt;
** Examples:&lt;br /&gt;
*** Accepting new network connections while another connection is already in progress.&lt;br /&gt;
&lt;br /&gt;
====Node.js====&lt;br /&gt;
&lt;br /&gt;
Node.js is designed to provide a server side environment of JavaScript. Instead of using Google&#039;s V8 JavaScript inside Chrome/Chromium, Node.js uses the V8 engine directly. Because Node.js is meant to be used outside of the browser, there&#039;s some slight differences.&lt;br /&gt;
&lt;br /&gt;
* Contains a package manager called npm to manage dependencies (libraries).&lt;br /&gt;
* Has specialized libraries for networking, file system access, etc that you usually wouldn&#039;t find in a browser (mostly for security reasons). These functions have their own set of [https://nodejs.org/api/ documentation].&lt;br /&gt;
* Has no default graphic frontend such as WebKit (although there are libraries to provide that if you wish).&lt;br /&gt;
&lt;br /&gt;
=====Why use Node.js?=====&lt;br /&gt;
&lt;br /&gt;
* JavaScript makes it easier to write asynchronous functions.&lt;br /&gt;
* You can reuse your knowledge on client-side JavaScript to apply to server-side Node.js applications.&lt;br /&gt;
&lt;br /&gt;
=====Getting started with Node.js=====&lt;br /&gt;
&lt;br /&gt;
To open up Read-Eval-Print-Loop (REPL), run &amp;lt;tt&amp;gt;node&amp;lt;/tt&amp;gt; in a terminal. For more details on setting your environment up, see [[WebFund_2016W:_Tutorial_1#Running_the_VM|Tutorial 1]].&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
{{Reflist}}&lt;/div&gt;</summary>
		<author><name>Zero</name></author>
	</entry>
	<entry>
		<id>https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_2&amp;diff=20544</id>
		<title>WebFund 2016W Lecture 2</title>
		<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_2&amp;diff=20544"/>
		<updated>2016-01-18T18:22:30Z</updated>

		<summary type="html">&lt;p&gt;Zero: /* Student Notes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Video==&lt;br /&gt;
&lt;br /&gt;
The video from the lecture given on January 12, 2016 [http://homeostasis.scs.carleton.ca/~soma/webfund-2016w/lectures/comp2406-2016w-lec02-12Jan2016.mp4 is now available].&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&lt;br /&gt;
===In-class Notes===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Lecture #2&lt;br /&gt;
----------&lt;br /&gt;
JavaScript&lt;br /&gt;
&lt;br /&gt;
* no declared types&lt;br /&gt;
  - strings&lt;br /&gt;
  - objects&lt;br /&gt;
  - arrays&lt;br /&gt;
  - numbers (floats)&lt;br /&gt;
  - boolean&lt;br /&gt;
&lt;br /&gt;
With Node&lt;br /&gt;
 - asynchronous (non-blocking) I/O&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Student Notes===&lt;br /&gt;
&lt;br /&gt;
* Administration Reminders&lt;br /&gt;
** [[Fundamentals_of_Web_Applications:_Winter_2016_Course_Outline#Course_Information|Office hours have been added.]]&lt;br /&gt;
** [[Fundamentals_of_Web_Applications:_Winter_2016_Course_Outline#Grading|Midterm date has been tentatively created.]]&lt;br /&gt;
** [[WebFund_2016W:_Assignment_1|Assignment #1 has been posted.]]&lt;br /&gt;
&lt;br /&gt;
====JavaScript: As a Language====&lt;br /&gt;
&lt;br /&gt;
* JavaScript has &#039;&#039;&#039;nothing&#039;&#039;&#039; to do with Java.&lt;br /&gt;
** Why is it even called JavaScript then? At first it wasn&#039;t; it was developed as Mocha, changed to LiveScript and then finally renamed to JavaScript due to an agreement with Sun (acquired by Oracle).&amp;lt;ref&amp;gt;[http://stackoverflow.com/a/2475528]&amp;lt;/ref&amp;gt;&lt;br /&gt;
* The only similarity between Java/JavaScript is some of the syntax, but that can be said for a lot of languages.&lt;br /&gt;
&lt;br /&gt;
* What&#039;s different about JavaScript?&lt;br /&gt;
** No declared data types; it&#039;s a &amp;quot;loose&amp;quot; language.&lt;br /&gt;
*** Instead of int i = 0, it&#039;s simply var i = 0.&lt;br /&gt;
** There&#039;s seven data types&amp;lt;ref&amp;gt;[https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures]&amp;lt;/ref&amp;gt; (examples in brackets)&lt;br /&gt;
*** Boolean (true, false)&lt;br /&gt;
*** Number (3.1337, 1337, etc. There&#039;s no integer or long, everything is a float)&lt;br /&gt;
*** String (&amp;quot;Dave&amp;quot;)&lt;br /&gt;
*** Symbol&lt;br /&gt;
*** Object&lt;br /&gt;
*** Null&lt;br /&gt;
*** Undefined&lt;br /&gt;
&lt;br /&gt;
====How should I learn JavaScript?====&lt;br /&gt;
&lt;br /&gt;
* Practice! While attending the lectures is a great start, you &#039;&#039;will&#039;&#039; have to practice outside of class. This will not be graded, but will ultimately affect your performance in the course (and in the workplace).&lt;br /&gt;
** [https://www.codecademy.com/learn/javascript Codecademy] has a lot of good resources for beginners.&lt;br /&gt;
** For more advanced students, check on [https://github.com/search?l=javascript&amp;amp;o=desc&amp;amp;q=stars%3A%3E1&amp;amp;s=stars&amp;amp;type=Repositories GitHub] to see if there&#039;s any projects you&#039;re interested in contributing to. If you plan to work in web development, it&#039;s very likely you will be asked in an interview if you&#039;ve contributed to any open source projects (having a good portfolio will help a &#039;&#039;lot&#039;&#039; in getting a first job).&lt;br /&gt;
* The Mozilla Developer Network maintains a [https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference JavaScript reference] that is recommend. &#039;&#039;(Note: There is no official documentation for Google Chrome&#039;s V8 engine, although there is an [http://v8.paulfryzel.com/docs/master/index.html unofficial reference].)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
====Working with Variables====&lt;br /&gt;
&lt;br /&gt;
If you&#039;ve previously worked with Java, the first large difference you&#039;ve noticed is likely that variables are very &amp;quot;flexible&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
* If you attempt to use a variable that has not been declared, you will &#039;&#039;&#039;not&#039;&#039;&#039; get a compiler error. Instead, the type &amp;lt;tt&amp;gt;undefined&amp;lt;/tt&amp;gt; will be returned. This can making debugging a bit of a challenge!&lt;br /&gt;
* Likewise with most languages, a symbol (e.g., &amp;lt;tt&amp;gt;x&amp;lt;/tt&amp;gt;) can only reference &#039;&#039;one&#039;&#039; object (which can optionally encapsulate other objects).&lt;br /&gt;
* You can have several types of data inside  single object (e.g., &amp;lt;tt&amp;gt;x.y&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;x.y.z&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;x.y.x.qwerty&amp;lt;/tt&amp;gt;, etc).&lt;br /&gt;
* &amp;lt;tt&amp;gt;x.size&amp;lt;/tt&amp;gt; (dot notation) is the same as &amp;lt;tt&amp;gt;x[&amp;quot;size&amp;quot;]&amp;lt;/tt&amp;gt; (array notation).&lt;br /&gt;
* JavaScript engines use a garbage collector, so you do not need to manually deallocate memory (in C you need to). Unlike Java, you can &amp;quot;reuse&amp;quot; a variable name and use a completely different type; e.g. creating &amp;lt;tt&amp;gt;var x = 1337&amp;lt;/tt&amp;gt; and then &amp;lt;tt&amp;gt;x = &amp;quot;Dave&amp;quot;&amp;lt;/tt&amp;gt; later is completely valid.&lt;br /&gt;
&lt;br /&gt;
====Regular Expressions (Regex)====&lt;br /&gt;
&lt;br /&gt;
While this topic is technically outside of the course material, you will likely need to use it in some assignments. Regex is the same across different languages, so you will not need to relearn it all for every language.&lt;br /&gt;
&lt;br /&gt;
https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions&lt;br /&gt;
&lt;br /&gt;
====Node.js====&lt;br /&gt;
&lt;br /&gt;
Node.js is designed to provide a server side environment of JavaScript. Instead of using Google&#039;s V8 JavaScript inside Chrome/Chromium, Node.js uses the V8 engine directly. Because Node.js is meant to be used outside of the browser, there&#039;s some slight differences.&lt;br /&gt;
&lt;br /&gt;
* Contains a package manager called npm to manage dependencies (libraries).&lt;br /&gt;
* Has specialized libraries for networking, file system access, etc that you usually wouldn&#039;t find in a browser (mostly for security reasons). These functions have their own set of [https://nodejs.org/api/ documentation].&lt;br /&gt;
* Has no default graphic frontend such as WebKit (although there are libraries to provide that if you wish).&lt;br /&gt;
&lt;br /&gt;
=====Why use Node.js?=====&lt;br /&gt;
&lt;br /&gt;
* JavaScript makes it easier to write asynchronous functions.&lt;br /&gt;
* You can reuse your knowledge on client-side JavaScript to apply to server-side Node.js applications.&lt;br /&gt;
&lt;br /&gt;
=====Getting started with Node.js=====&lt;br /&gt;
&lt;br /&gt;
To open up Read-Eval-Print-Loop (REPL), run &amp;lt;tt&amp;gt;node&amp;lt;/tt&amp;gt; in a terminal. For more details on setting your environment up, see [[WebFund_2016W:_Tutorial_1#Running_the_VM|Tutorial 1]].&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
{{Reflist}}&lt;/div&gt;</summary>
		<author><name>Zero</name></author>
	</entry>
	<entry>
		<id>https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_2&amp;diff=20543</id>
		<title>WebFund 2016W Lecture 2</title>
		<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_2&amp;diff=20543"/>
		<updated>2016-01-18T18:20:52Z</updated>

		<summary type="html">&lt;p&gt;Zero: /* Node.js */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Video==&lt;br /&gt;
&lt;br /&gt;
The video from the lecture given on January 12, 2016 [http://homeostasis.scs.carleton.ca/~soma/webfund-2016w/lectures/comp2406-2016w-lec02-12Jan2016.mp4 is now available].&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&lt;br /&gt;
===In-class Notes===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Lecture #2&lt;br /&gt;
----------&lt;br /&gt;
JavaScript&lt;br /&gt;
&lt;br /&gt;
* no declared types&lt;br /&gt;
  - strings&lt;br /&gt;
  - objects&lt;br /&gt;
  - arrays&lt;br /&gt;
  - numbers (floats)&lt;br /&gt;
  - boolean&lt;br /&gt;
&lt;br /&gt;
With Node&lt;br /&gt;
 - asynchronous (non-blocking) I/O&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Student Notes===&lt;br /&gt;
&lt;br /&gt;
* Administration Reminders&lt;br /&gt;
** [[Fundamentals_of_Web_Applications:_Winter_2016_Course_Outline#Course_Information|Office hours have been added.]]&lt;br /&gt;
** [[Fundamentals_of_Web_Applications:_Winter_2016_Course_Outline#Grading|Midterm date has been tentatively created.]]&lt;br /&gt;
** [[WebFund_2016W:_Assignment_1|Assignment #1 has been posted.]]&lt;br /&gt;
&lt;br /&gt;
====JavaScript: As a Language====&lt;br /&gt;
&lt;br /&gt;
* JavaScript has &#039;&#039;&#039;nothing&#039;&#039;&#039; to do with Java.&lt;br /&gt;
** Why is it even called JavaScript then? At first it wasn&#039;t; it was developed as Mocha, changed to LiveScript and then finally renamed to JavaScript due to an agreement with Sun (acquired by Oracle).&amp;lt;ref&amp;gt;[http://stackoverflow.com/a/2475528]&amp;lt;/ref&amp;gt;&lt;br /&gt;
* The only similarity between Java/JavaScript is some of the syntax, but that can be said for a lot of languages.&lt;br /&gt;
&lt;br /&gt;
* What&#039;s different about JavaScript?&lt;br /&gt;
** No declared data types; it&#039;s a &amp;quot;loose&amp;quot; language.&lt;br /&gt;
*** Instead of int i = 0, it&#039;s simply var i = 0.&lt;br /&gt;
** There&#039;s seven data types&amp;lt;ref&amp;gt;[https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures]&amp;lt;/ref&amp;gt; (examples in brackets)&lt;br /&gt;
*** Boolean (true, false)&lt;br /&gt;
*** Number (3.1337, 1337, etc. There&#039;s no integer or long, everything is a float)&lt;br /&gt;
*** String (&amp;quot;Dave&amp;quot;)&lt;br /&gt;
*** Symbol&lt;br /&gt;
*** Object&lt;br /&gt;
*** Null&lt;br /&gt;
*** Undefined&lt;br /&gt;
&lt;br /&gt;
====How should I learn JavaScript?====&lt;br /&gt;
&lt;br /&gt;
* Practice! While attending the lectures is a great start, you &#039;&#039;will&#039;&#039; have to practice outside of class. This will not be graded, but will ultimately affect your performance in the course (and in the workplace).&lt;br /&gt;
** [https://www.codecademy.com/learn/javascript Codecademy] has a lot of good resources for beginners.&lt;br /&gt;
** For more advanced students, check on [https://github.com/search?l=javascript&amp;amp;o=desc&amp;amp;q=stars%3A%3E1&amp;amp;s=stars&amp;amp;type=Repositories GitHub] to see if there&#039;s any projects you&#039;re interested in contributing to. If you plan to work in web development, it&#039;s very likely you will be asked in an interview if you&#039;ve contributed to any open source projects (having a good portfolio will help a &#039;&#039;lot&#039;&#039; in getting a first job).&lt;br /&gt;
* The Mozilla Developer Network maintains a [https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference JavaScript reference] that is recommend. &#039;&#039;(Note: There is no official documentation for Google Chrome&#039;s V8 engine, although there is an [http://v8.paulfryzel.com/docs/master/index.html unofficial reference].)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
====Working with Variables====&lt;br /&gt;
&lt;br /&gt;
If you&#039;ve previously worked with Java, the first large difference you&#039;ve noticed is likely that variables are very &amp;quot;flexible&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
* If you attempt to use a variable that has not been declared, you will &#039;&#039;&#039;not&#039;&#039;&#039; get a compiler error. Instead, the type &amp;lt;tt&amp;gt;undefined&amp;lt;/tt&amp;gt; will be returned. This can making debugging a bit of a challenge!&lt;br /&gt;
* Likewise with most languages, a symbol (e.g., &amp;lt;tt&amp;gt;x&amp;lt;/tt&amp;gt;) can only reference &#039;&#039;one&#039;&#039; object (which can optionally encapsulate other objects).&lt;br /&gt;
* You can have several types of data inside  single object (e.g., &amp;lt;tt&amp;gt;x.y&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;x.y.z&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;x.y.x.qwerty&amp;lt;/tt&amp;gt;, etc).&lt;br /&gt;
* &amp;lt;tt&amp;gt;x.size&amp;lt;/tt&amp;gt; (dot notation) is the same as &amp;lt;tt&amp;gt;x[&amp;quot;size&amp;quot;]&amp;lt;/tt&amp;gt; (array notation).&lt;br /&gt;
* JavaScript engines use a garbage collector, so you do not need to manually deallocate memory (in C you need to). Unlike Java, you can &amp;quot;reuse&amp;quot; a variable name and use a completely different type; e.g. creating &amp;lt;tt&amp;gt;var x = 1337&amp;lt;/tt&amp;gt; and then &amp;lt;tt&amp;gt;x = &amp;quot;Dave&amp;quot;&amp;lt;/tt&amp;gt; later is completely valid.&lt;br /&gt;
&lt;br /&gt;
====Regular Expressions (Regex)====&lt;br /&gt;
&lt;br /&gt;
While this topic is technically outside of the course material, you will likely need to use it in some assignments. Regex is the same across different languages, so you will not need to relearn it all for every language.&lt;br /&gt;
&lt;br /&gt;
https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions&lt;br /&gt;
&lt;br /&gt;
====Node.js====&lt;br /&gt;
&lt;br /&gt;
Node.js is designed to provide a server side environment of JavaScript. Instead of using Google&#039;s V8 JavaScript inside Chrome/Chromium, Node.js uses the V8 engine directly. Because Node.js is meant to be used outside of the browser, there&#039;s some slight differences.&lt;br /&gt;
&lt;br /&gt;
* Contains a package manager called npm to manage dependencies (libraries).&lt;br /&gt;
* Has specialized libraries for networking, file system access, etc that you usually wouldn&#039;t find in a browser (mostly for security reasons). These functions have their own set of [https://nodejs.org/api/ documentation].&lt;br /&gt;
* Has no default graphic frontend such as WebKit (although there are libraries to provide that if you wish).&lt;br /&gt;
&lt;br /&gt;
=====Why use Node.js?=====&lt;br /&gt;
&lt;br /&gt;
* JavaScript makes it easier to write asynchronous functions.&lt;br /&gt;
* You can reuse your knowledge on client-side JavaScript to apply to server-side Node.js applications.&lt;br /&gt;
&lt;br /&gt;
=====Getting started with Node.js=====&lt;br /&gt;
&lt;br /&gt;
To open up Read-Eval-Print-Loop (REPL), run &amp;lt;tt&amp;gt;node&amp;lt;/tt&amp;gt; in a terminal. For more details on setting your environment up, see [[WebFund_2016W:_Tutorial_1#Running_the_VM|Tutorial 1]]&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
{{Reflist}}&lt;/div&gt;</summary>
		<author><name>Zero</name></author>
	</entry>
	<entry>
		<id>https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_2&amp;diff=20542</id>
		<title>WebFund 2016W Lecture 2</title>
		<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_2&amp;diff=20542"/>
		<updated>2016-01-18T18:15:50Z</updated>

		<summary type="html">&lt;p&gt;Zero: /* How should I learn JavaScript? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Video==&lt;br /&gt;
&lt;br /&gt;
The video from the lecture given on January 12, 2016 [http://homeostasis.scs.carleton.ca/~soma/webfund-2016w/lectures/comp2406-2016w-lec02-12Jan2016.mp4 is now available].&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&lt;br /&gt;
===In-class Notes===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Lecture #2&lt;br /&gt;
----------&lt;br /&gt;
JavaScript&lt;br /&gt;
&lt;br /&gt;
* no declared types&lt;br /&gt;
  - strings&lt;br /&gt;
  - objects&lt;br /&gt;
  - arrays&lt;br /&gt;
  - numbers (floats)&lt;br /&gt;
  - boolean&lt;br /&gt;
&lt;br /&gt;
With Node&lt;br /&gt;
 - asynchronous (non-blocking) I/O&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Student Notes===&lt;br /&gt;
&lt;br /&gt;
* Administration Reminders&lt;br /&gt;
** [[Fundamentals_of_Web_Applications:_Winter_2016_Course_Outline#Course_Information|Office hours have been added.]]&lt;br /&gt;
** [[Fundamentals_of_Web_Applications:_Winter_2016_Course_Outline#Grading|Midterm date has been tentatively created.]]&lt;br /&gt;
** [[WebFund_2016W:_Assignment_1|Assignment #1 has been posted.]]&lt;br /&gt;
&lt;br /&gt;
====JavaScript: As a Language====&lt;br /&gt;
&lt;br /&gt;
* JavaScript has &#039;&#039;&#039;nothing&#039;&#039;&#039; to do with Java.&lt;br /&gt;
** Why is it even called JavaScript then? At first it wasn&#039;t; it was developed as Mocha, changed to LiveScript and then finally renamed to JavaScript due to an agreement with Sun (acquired by Oracle).&amp;lt;ref&amp;gt;[http://stackoverflow.com/a/2475528]&amp;lt;/ref&amp;gt;&lt;br /&gt;
* The only similarity between Java/JavaScript is some of the syntax, but that can be said for a lot of languages.&lt;br /&gt;
&lt;br /&gt;
* What&#039;s different about JavaScript?&lt;br /&gt;
** No declared data types; it&#039;s a &amp;quot;loose&amp;quot; language.&lt;br /&gt;
*** Instead of int i = 0, it&#039;s simply var i = 0.&lt;br /&gt;
** There&#039;s seven data types&amp;lt;ref&amp;gt;[https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures]&amp;lt;/ref&amp;gt; (examples in brackets)&lt;br /&gt;
*** Boolean (true, false)&lt;br /&gt;
*** Number (3.1337, 1337, etc. There&#039;s no integer or long, everything is a float)&lt;br /&gt;
*** String (&amp;quot;Dave&amp;quot;)&lt;br /&gt;
*** Symbol&lt;br /&gt;
*** Object&lt;br /&gt;
*** Null&lt;br /&gt;
*** Undefined&lt;br /&gt;
&lt;br /&gt;
====How should I learn JavaScript?====&lt;br /&gt;
&lt;br /&gt;
* Practice! While attending the lectures is a great start, you &#039;&#039;will&#039;&#039; have to practice outside of class. This will not be graded, but will ultimately affect your performance in the course (and in the workplace).&lt;br /&gt;
** [https://www.codecademy.com/learn/javascript Codecademy] has a lot of good resources for beginners.&lt;br /&gt;
** For more advanced students, check on [https://github.com/search?l=javascript&amp;amp;o=desc&amp;amp;q=stars%3A%3E1&amp;amp;s=stars&amp;amp;type=Repositories GitHub] to see if there&#039;s any projects you&#039;re interested in contributing to. If you plan to work in web development, it&#039;s very likely you will be asked in an interview if you&#039;ve contributed to any open source projects (having a good portfolio will help a &#039;&#039;lot&#039;&#039; in getting a first job).&lt;br /&gt;
* The Mozilla Developer Network maintains a [https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference JavaScript reference] that is recommend. &#039;&#039;(Note: There is no official documentation for Google Chrome&#039;s V8 engine, although there is an [http://v8.paulfryzel.com/docs/master/index.html unofficial reference].)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
====Working with Variables====&lt;br /&gt;
&lt;br /&gt;
If you&#039;ve previously worked with Java, the first large difference you&#039;ve noticed is likely that variables are very &amp;quot;flexible&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
* If you attempt to use a variable that has not been declared, you will &#039;&#039;&#039;not&#039;&#039;&#039; get a compiler error. Instead, the type &amp;lt;tt&amp;gt;undefined&amp;lt;/tt&amp;gt; will be returned. This can making debugging a bit of a challenge!&lt;br /&gt;
* Likewise with most languages, a symbol (e.g., &amp;lt;tt&amp;gt;x&amp;lt;/tt&amp;gt;) can only reference &#039;&#039;one&#039;&#039; object (which can optionally encapsulate other objects).&lt;br /&gt;
* You can have several types of data inside  single object (e.g., &amp;lt;tt&amp;gt;x.y&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;x.y.z&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;x.y.x.qwerty&amp;lt;/tt&amp;gt;, etc).&lt;br /&gt;
* &amp;lt;tt&amp;gt;x.size&amp;lt;/tt&amp;gt; (dot notation) is the same as &amp;lt;tt&amp;gt;x[&amp;quot;size&amp;quot;]&amp;lt;/tt&amp;gt; (array notation).&lt;br /&gt;
* JavaScript engines use a garbage collector, so you do not need to manually deallocate memory (in C you need to). Unlike Java, you can &amp;quot;reuse&amp;quot; a variable name and use a completely different type; e.g. creating &amp;lt;tt&amp;gt;var x = 1337&amp;lt;/tt&amp;gt; and then &amp;lt;tt&amp;gt;x = &amp;quot;Dave&amp;quot;&amp;lt;/tt&amp;gt; later is completely valid.&lt;br /&gt;
&lt;br /&gt;
====Regular Expressions (Regex)====&lt;br /&gt;
&lt;br /&gt;
While this topic is technically outside of the course material, you will likely need to use it in some assignments. Regex is the same across different languages, so you will not need to relearn it all for every language.&lt;br /&gt;
&lt;br /&gt;
https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions&lt;br /&gt;
&lt;br /&gt;
====Node.js====&lt;br /&gt;
&lt;br /&gt;
Node.js is designed to provide a server side environment of JavaScript. Instead of using Google&#039;s V8 JavaScript inside Chrome/Chromium, Node.js uses the V8 engine directly. Because Node.js is meant to be used outside of the browser, there&#039;s some slight differences.&lt;br /&gt;
&lt;br /&gt;
* Contains a package manager called npm to manage dependencies (libraries).&lt;br /&gt;
* Has specialized libraries for networking, file system access, etc that you usually wouldn&#039;t find in a browser (mostly for security reasons). These functions have their own set of [https://nodejs.org/api/ documentation].&lt;br /&gt;
* Has no default graphic frontend such as WebKit (although there are libraries to provide that if you wish).&lt;br /&gt;
&lt;br /&gt;
=====Getting started with Node.js=====&lt;br /&gt;
&lt;br /&gt;
To open up Read-Eval-Print-Loop (REPL), run &amp;lt;tt&amp;gt;node&amp;lt;/tt&amp;gt; in a terminal. For more details on setting your environment up, see [[WebFund_2016W:_Tutorial_1#Running_the_VM|Tutorial 1]]&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
{{Reflist}}&lt;/div&gt;</summary>
		<author><name>Zero</name></author>
	</entry>
	<entry>
		<id>https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_2&amp;diff=20540</id>
		<title>WebFund 2016W Lecture 2</title>
		<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_2&amp;diff=20540"/>
		<updated>2016-01-18T18:10:25Z</updated>

		<summary type="html">&lt;p&gt;Zero: /* Node.js */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Video==&lt;br /&gt;
&lt;br /&gt;
The video from the lecture given on January 12, 2016 [http://homeostasis.scs.carleton.ca/~soma/webfund-2016w/lectures/comp2406-2016w-lec02-12Jan2016.mp4 is now available].&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&lt;br /&gt;
===In-class Notes===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Lecture #2&lt;br /&gt;
----------&lt;br /&gt;
JavaScript&lt;br /&gt;
&lt;br /&gt;
* no declared types&lt;br /&gt;
  - strings&lt;br /&gt;
  - objects&lt;br /&gt;
  - arrays&lt;br /&gt;
  - numbers (floats)&lt;br /&gt;
  - boolean&lt;br /&gt;
&lt;br /&gt;
With Node&lt;br /&gt;
 - asynchronous (non-blocking) I/O&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Student Notes===&lt;br /&gt;
&lt;br /&gt;
* Administration Reminders&lt;br /&gt;
** [[Fundamentals_of_Web_Applications:_Winter_2016_Course_Outline#Course_Information|Office hours have been added.]]&lt;br /&gt;
** [[Fundamentals_of_Web_Applications:_Winter_2016_Course_Outline#Grading|Midterm date has been tentatively created.]]&lt;br /&gt;
** [[WebFund_2016W:_Assignment_1|Assignment #1 has been posted.]]&lt;br /&gt;
&lt;br /&gt;
====JavaScript: As a Language====&lt;br /&gt;
&lt;br /&gt;
* JavaScript has &#039;&#039;&#039;nothing&#039;&#039;&#039; to do with Java.&lt;br /&gt;
** Why is it even called JavaScript then? At first it wasn&#039;t; it was developed as Mocha, changed to LiveScript and then finally renamed to JavaScript due to an agreement with Sun (acquired by Oracle).&amp;lt;ref&amp;gt;[http://stackoverflow.com/a/2475528]&amp;lt;/ref&amp;gt;&lt;br /&gt;
* The only similarity between Java/JavaScript is some of the syntax, but that can be said for a lot of languages.&lt;br /&gt;
&lt;br /&gt;
* What&#039;s different about JavaScript?&lt;br /&gt;
** No declared data types; it&#039;s a &amp;quot;loose&amp;quot; language.&lt;br /&gt;
*** Instead of int i = 0, it&#039;s simply var i = 0.&lt;br /&gt;
** There&#039;s seven data types&amp;lt;ref&amp;gt;[https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures]&amp;lt;/ref&amp;gt; (examples in brackets)&lt;br /&gt;
*** Boolean (true, false)&lt;br /&gt;
*** Number (3.1337, 1337, etc. There&#039;s no integer or long, everything is a float)&lt;br /&gt;
*** String (&amp;quot;Dave&amp;quot;)&lt;br /&gt;
*** Symbol&lt;br /&gt;
*** Object&lt;br /&gt;
*** Null&lt;br /&gt;
*** Undefined&lt;br /&gt;
&lt;br /&gt;
====How should I learn JavaScript?====&lt;br /&gt;
&lt;br /&gt;
* Practice! While attending the lectures is a great start, you &#039;&#039;will&#039;&#039; have to practice outside of class. This will not be graded, but will ultimately affect your performance in the course (and in the workplace).&lt;br /&gt;
** [https://www.codecademy.com/learn/javascript Codecademy] has a lot of good resources for beginners.&lt;br /&gt;
** For more advanced students, check on [https://github.com/search?l=javascript&amp;amp;o=desc&amp;amp;q=stars%3A%3E1&amp;amp;s=stars&amp;amp;type=Repositories GitHub] to see if there&#039;s any projects you&#039;re interested in contributing to. If you plan to work in web development, it&#039;s very likely you will be asked in an interview if you&#039;ve contributed to any open source projects (having a good portfolio will help a &#039;&#039;lot&#039;&#039; in getting a first job).&lt;br /&gt;
&lt;br /&gt;
====Working with Variables====&lt;br /&gt;
&lt;br /&gt;
If you&#039;ve previously worked with Java, the first large difference you&#039;ve noticed is likely that variables are very &amp;quot;flexible&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
* If you attempt to use a variable that has not been declared, you will &#039;&#039;&#039;not&#039;&#039;&#039; get a compiler error. Instead, the type &amp;lt;tt&amp;gt;undefined&amp;lt;/tt&amp;gt; will be returned. This can making debugging a bit of a challenge!&lt;br /&gt;
* Likewise with most languages, a symbol (e.g., &amp;lt;tt&amp;gt;x&amp;lt;/tt&amp;gt;) can only reference &#039;&#039;one&#039;&#039; object (which can optionally encapsulate other objects).&lt;br /&gt;
* You can have several types of data inside  single object (e.g., &amp;lt;tt&amp;gt;x.y&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;x.y.z&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;x.y.x.qwerty&amp;lt;/tt&amp;gt;, etc).&lt;br /&gt;
* &amp;lt;tt&amp;gt;x.size&amp;lt;/tt&amp;gt; (dot notation) is the same as &amp;lt;tt&amp;gt;x[&amp;quot;size&amp;quot;]&amp;lt;/tt&amp;gt; (array notation).&lt;br /&gt;
* JavaScript engines use a garbage collector, so you do not need to manually deallocate memory (in C you need to). Unlike Java, you can &amp;quot;reuse&amp;quot; a variable name and use a completely different type; e.g. creating &amp;lt;tt&amp;gt;var x = 1337&amp;lt;/tt&amp;gt; and then &amp;lt;tt&amp;gt;x = &amp;quot;Dave&amp;quot;&amp;lt;/tt&amp;gt; later is completely valid.&lt;br /&gt;
&lt;br /&gt;
====Regular Expressions (Regex)====&lt;br /&gt;
&lt;br /&gt;
While this topic is technically outside of the course material, you will likely need to use it in some assignments. Regex is the same across different languages, so you will not need to relearn it all for every language.&lt;br /&gt;
&lt;br /&gt;
https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions&lt;br /&gt;
&lt;br /&gt;
====Node.js====&lt;br /&gt;
&lt;br /&gt;
Node.js is designed to provide a server side environment of JavaScript. Instead of using Google&#039;s V8 JavaScript inside Chrome/Chromium, Node.js uses the V8 engine directly. Because Node.js is meant to be used outside of the browser, there&#039;s some slight differences.&lt;br /&gt;
&lt;br /&gt;
* Contains a package manager called npm to manage dependencies (libraries).&lt;br /&gt;
* Has specialized libraries for networking, file system access, etc that you usually wouldn&#039;t find in a browser (mostly for security reasons). These functions have their own set of [https://nodejs.org/api/ documentation].&lt;br /&gt;
* Has no default graphic frontend such as WebKit (although there are libraries to provide that if you wish).&lt;br /&gt;
&lt;br /&gt;
=====Getting started with Node.js=====&lt;br /&gt;
&lt;br /&gt;
To open up Read-Eval-Print-Loop (REPL), run &amp;lt;tt&amp;gt;node&amp;lt;/tt&amp;gt; in a terminal. For more details on setting your environment up, see [[WebFund_2016W:_Tutorial_1#Running_the_VM|Tutorial 1]]&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
{{Reflist}}&lt;/div&gt;</summary>
		<author><name>Zero</name></author>
	</entry>
	<entry>
		<id>https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_2&amp;diff=20539</id>
		<title>WebFund 2016W Lecture 2</title>
		<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_2&amp;diff=20539"/>
		<updated>2016-01-18T18:07:56Z</updated>

		<summary type="html">&lt;p&gt;Zero: /* Working with Variables */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Video==&lt;br /&gt;
&lt;br /&gt;
The video from the lecture given on January 12, 2016 [http://homeostasis.scs.carleton.ca/~soma/webfund-2016w/lectures/comp2406-2016w-lec02-12Jan2016.mp4 is now available].&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&lt;br /&gt;
===In-class Notes===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Lecture #2&lt;br /&gt;
----------&lt;br /&gt;
JavaScript&lt;br /&gt;
&lt;br /&gt;
* no declared types&lt;br /&gt;
  - strings&lt;br /&gt;
  - objects&lt;br /&gt;
  - arrays&lt;br /&gt;
  - numbers (floats)&lt;br /&gt;
  - boolean&lt;br /&gt;
&lt;br /&gt;
With Node&lt;br /&gt;
 - asynchronous (non-blocking) I/O&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Student Notes===&lt;br /&gt;
&lt;br /&gt;
* Administration Reminders&lt;br /&gt;
** [[Fundamentals_of_Web_Applications:_Winter_2016_Course_Outline#Course_Information|Office hours have been added.]]&lt;br /&gt;
** [[Fundamentals_of_Web_Applications:_Winter_2016_Course_Outline#Grading|Midterm date has been tentatively created.]]&lt;br /&gt;
** [[WebFund_2016W:_Assignment_1|Assignment #1 has been posted.]]&lt;br /&gt;
&lt;br /&gt;
====JavaScript: As a Language====&lt;br /&gt;
&lt;br /&gt;
* JavaScript has &#039;&#039;&#039;nothing&#039;&#039;&#039; to do with Java.&lt;br /&gt;
** Why is it even called JavaScript then? At first it wasn&#039;t; it was developed as Mocha, changed to LiveScript and then finally renamed to JavaScript due to an agreement with Sun (acquired by Oracle).&amp;lt;ref&amp;gt;[http://stackoverflow.com/a/2475528]&amp;lt;/ref&amp;gt;&lt;br /&gt;
* The only similarity between Java/JavaScript is some of the syntax, but that can be said for a lot of languages.&lt;br /&gt;
&lt;br /&gt;
* What&#039;s different about JavaScript?&lt;br /&gt;
** No declared data types; it&#039;s a &amp;quot;loose&amp;quot; language.&lt;br /&gt;
*** Instead of int i = 0, it&#039;s simply var i = 0.&lt;br /&gt;
** There&#039;s seven data types&amp;lt;ref&amp;gt;[https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures]&amp;lt;/ref&amp;gt; (examples in brackets)&lt;br /&gt;
*** Boolean (true, false)&lt;br /&gt;
*** Number (3.1337, 1337, etc. There&#039;s no integer or long, everything is a float)&lt;br /&gt;
*** String (&amp;quot;Dave&amp;quot;)&lt;br /&gt;
*** Symbol&lt;br /&gt;
*** Object&lt;br /&gt;
*** Null&lt;br /&gt;
*** Undefined&lt;br /&gt;
&lt;br /&gt;
====How should I learn JavaScript?====&lt;br /&gt;
&lt;br /&gt;
* Practice! While attending the lectures is a great start, you &#039;&#039;will&#039;&#039; have to practice outside of class. This will not be graded, but will ultimately affect your performance in the course (and in the workplace).&lt;br /&gt;
** [https://www.codecademy.com/learn/javascript Codecademy] has a lot of good resources for beginners.&lt;br /&gt;
** For more advanced students, check on [https://github.com/search?l=javascript&amp;amp;o=desc&amp;amp;q=stars%3A%3E1&amp;amp;s=stars&amp;amp;type=Repositories GitHub] to see if there&#039;s any projects you&#039;re interested in contributing to. If you plan to work in web development, it&#039;s very likely you will be asked in an interview if you&#039;ve contributed to any open source projects (having a good portfolio will help a &#039;&#039;lot&#039;&#039; in getting a first job).&lt;br /&gt;
&lt;br /&gt;
====Working with Variables====&lt;br /&gt;
&lt;br /&gt;
If you&#039;ve previously worked with Java, the first large difference you&#039;ve noticed is likely that variables are very &amp;quot;flexible&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
* If you attempt to use a variable that has not been declared, you will &#039;&#039;&#039;not&#039;&#039;&#039; get a compiler error. Instead, the type &amp;lt;tt&amp;gt;undefined&amp;lt;/tt&amp;gt; will be returned. This can making debugging a bit of a challenge!&lt;br /&gt;
* Likewise with most languages, a symbol (e.g., &amp;lt;tt&amp;gt;x&amp;lt;/tt&amp;gt;) can only reference &#039;&#039;one&#039;&#039; object (which can optionally encapsulate other objects).&lt;br /&gt;
* You can have several types of data inside  single object (e.g., &amp;lt;tt&amp;gt;x.y&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;x.y.z&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;x.y.x.qwerty&amp;lt;/tt&amp;gt;, etc).&lt;br /&gt;
* &amp;lt;tt&amp;gt;x.size&amp;lt;/tt&amp;gt; (dot notation) is the same as &amp;lt;tt&amp;gt;x[&amp;quot;size&amp;quot;]&amp;lt;/tt&amp;gt; (array notation).&lt;br /&gt;
* JavaScript engines use a garbage collector, so you do not need to manually deallocate memory (in C you need to). Unlike Java, you can &amp;quot;reuse&amp;quot; a variable name and use a completely different type; e.g. creating &amp;lt;tt&amp;gt;var x = 1337&amp;lt;/tt&amp;gt; and then &amp;lt;tt&amp;gt;x = &amp;quot;Dave&amp;quot;&amp;lt;/tt&amp;gt; later is completely valid.&lt;br /&gt;
&lt;br /&gt;
====Regular Expressions (Regex)====&lt;br /&gt;
&lt;br /&gt;
While this topic is technically outside of the course material, you will likely need to use it in some assignments. Regex is the same across different languages, so you will not need to relearn it all for every language.&lt;br /&gt;
&lt;br /&gt;
https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions&lt;br /&gt;
&lt;br /&gt;
====Node.js====&lt;br /&gt;
&lt;br /&gt;
Node.js is designed to provide a server side environment of JavaScript. Instead of using Google&#039;s V8 JavaScript inside Chrome/Chromium, Node.js uses the V8 engine directly. Because Node.js is meant to be used outside of the browser, there&#039;s some slight differences.&lt;br /&gt;
&lt;br /&gt;
* Contains a package manager called npm to manage dependencies (libraries).&lt;br /&gt;
* Has specialized libraries for networking, file system access, etc that you usually wouldn&#039;t find in a browser (mostly for security reasons).&lt;br /&gt;
* Has no default graphic frontend such as WebKit (although there are libraries to provide that if you wish).&lt;br /&gt;
&lt;br /&gt;
=====Getting started with Node.js=====&lt;br /&gt;
&lt;br /&gt;
To open up Read-Eval-Print-Loop (REPL), run &amp;lt;tt&amp;gt;node&amp;lt;/tt&amp;gt; in a terminal. For more details on setting your environment up, see [[WebFund_2016W:_Tutorial_1#Running_the_VM|Tutorial 1]]&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
{{Reflist}}&lt;/div&gt;</summary>
		<author><name>Zero</name></author>
	</entry>
	<entry>
		<id>https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W:_Assignment_1&amp;diff=20536</id>
		<title>WebFund 2016W: Assignment 1</title>
		<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W:_Assignment_1&amp;diff=20536"/>
		<updated>2016-01-18T03:00:17Z</updated>

		<summary type="html">&lt;p&gt;Zero: Corrected typo.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This assignment is due on January 20th on cuLearn.&lt;br /&gt;
&lt;br /&gt;
In this assignment you will writing two programs, &amp;lt;tt&amp;gt;words-sync.js&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;words-async.js&amp;lt;/tt&amp;gt;.  These programs will make use of synchronous and asynchronous I/O is the manner of the programs from [[WebFund 2016W: Tutorial 1|Tutorial 1]].&lt;br /&gt;
&lt;br /&gt;
These programs should both behave as follows:&lt;br /&gt;
&lt;br /&gt;
* They should take two arguments, an input text file and an output file to create.  Thus you run them by typing &amp;quot;node words-sync.js document.txt wordlist.txt&amp;quot;, with document.txt being the file to be read and wordlist.txt is the file to be created.&lt;br /&gt;
* The output file should contain a list of words in the input file, one word per line, with each line terminated by a newline character (&#039;\n&#039;).  These words should be sorted in ascending order, as ordered by the standard JavaScript [https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort Array.sort() method] (with no comparison function specified).  All duplicates should be removed and there should be no blank lines.&lt;br /&gt;
* Once the output file has been created, the program should output &amp;quot;Finished!&amp;quot; to the console.&lt;br /&gt;
* For the purposes of this program, words can be defined as anything matching the \w operator.  In other words, to split the document into words you may call [https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split split()] using /\W/ as the split [https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions regular expression].&lt;br /&gt;
* You may assume that the input file exists and is readable and the output file is writable.  In other words you do not need to do any error checking (although it is appreciated).&lt;br /&gt;
&lt;br /&gt;
In creating this program, don&#039;t forget that you can use standard JavaScript methods such as [https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/push push()], [https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/pop pop()], [https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/shift shift()], and [https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/unshift unshift()].  And of course you&#039;ll need the methods from [https://nodejs.org/api/fs.html the Node fs module].&lt;br /&gt;
&lt;br /&gt;
There are 10 points, allocated as follows:&lt;br /&gt;
* 3 points for producing the correct output given well-formed input.&lt;br /&gt;
* 2 points for correctly structuring the code in the synchronous version.&lt;br /&gt;
* 5 points for correctly structuring the code in the asynchronous version.  In particular, &amp;quot;Finished!&amp;quot; should only be output when the program is truly finished!&lt;br /&gt;
&lt;br /&gt;
Please submit your answers as a zip file called &amp;quot;&amp;lt;username&amp;gt;-comp2406-assign1.zip&amp;quot;, where username is your MyCarletonOne username. This zip file should uncompress to a directory called &amp;quot;&amp;lt;username&amp;gt;-comp2406-assign1&amp;quot; and inside this directory should be three files: &amp;quot;words-sync.js&amp;quot;, &amp;quot;words-async.js&amp;quot;,  and a text file &amp;quot;comments.txt&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;comments.txt&amp;quot; should:&lt;br /&gt;
* list any references you used to complete the assignment (documentation web sites, for example),&lt;br /&gt;
* list your collaborators, and&lt;br /&gt;
* optionally, should discuss any issues or concerns you had when completing this assignment.&lt;br /&gt;
Remember that while you are allowed to collaborate with others, plagiarism is not allowed. In other words you should not be copying any code or data directly from anywhere, and any assistance or inspiration should be credited. Any significant code similarity (beyond the code already given to you) will be considered plagiarism and will be reported to the Dean.&lt;/div&gt;</summary>
		<author><name>Zero</name></author>
	</entry>
	<entry>
		<id>https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W:_Assignment_1&amp;diff=20535</id>
		<title>WebFund 2016W: Assignment 1</title>
		<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W:_Assignment_1&amp;diff=20535"/>
		<updated>2016-01-18T01:21:09Z</updated>

		<summary type="html">&lt;p&gt;Zero: Undo revision 20534 by Zero (talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This assignment is due on January 20th on cuLearn.&lt;br /&gt;
&lt;br /&gt;
In this assignment you will writing two programs, &amp;lt;tt&amp;gt;words-sync.js&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;words-async.js&amp;lt;/tt&amp;gt;.  These programs will make use of synchronous and asynchronous I/O is the manner of the programs from [[WebFund 2016W: Tutorial 1|Tutorial 1]].&lt;br /&gt;
&lt;br /&gt;
These programs should both behave as follows:&lt;br /&gt;
&lt;br /&gt;
* They should take two arguments, an input text file and an output file to create.  Thus you run them by typing &amp;quot;node words-sync.js document.txt wordlist.txt&amp;quot;, with document.txt being the file to be read and wordlist.txt is the file to be created.&lt;br /&gt;
* The output file should contain a list of words in the input file, one word per line, with each line terminated by a newline character (&#039;\n&#039;).  These words should be sorted in ascending order, as ordered by the standard JavaScript [https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort Array.sort() method] (with no comparison function specified).  All duplicates should be removed and there should be no blank lines.&lt;br /&gt;
* Once the output file has been created, the program should output &amp;quot;Finished!&amp;quot; to the console.&lt;br /&gt;
* For the purposes of this program, words can be defined as anything matching the \w operator.  In other words, to split the document into words you may call [https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split split()] using &amp;quot;/\W//&amp;quot; as the split [https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions regular expression].&lt;br /&gt;
* You may assume that the input file exists and is readable and the output file is writable.  In other words you do not need to do any error checking (although it is appreciated).&lt;br /&gt;
&lt;br /&gt;
In creating this program, don&#039;t forget that you can use standard JavaScript methods such as [https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/push push()], [https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/pop pop()], [https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/shift shift()], and [https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/unshift unshift()].  And of course you&#039;ll need the methods from [https://nodejs.org/api/fs.html the Node fs module].&lt;br /&gt;
&lt;br /&gt;
There are 10 points, allocated as follows:&lt;br /&gt;
* 3 points for producing the correct output given well-formed input.&lt;br /&gt;
* 2 points for correctly structuring the code in the synchronous version.&lt;br /&gt;
* 5 points for correctly structuring the code in the asynchronous version.  In particular, &amp;quot;Finished!&amp;quot; should only be output when the program is truly finished!&lt;br /&gt;
&lt;br /&gt;
Please submit your answers as a zip file called &amp;quot;&amp;lt;username&amp;gt;-comp2406-assign1.zip&amp;quot;, where username is your MyCarletonOne username. This zip file should uncompress to a directory called &amp;quot;&amp;lt;username&amp;gt;-comp2406-assign1&amp;quot; and inside this directory should be three files: &amp;quot;words-sync.js&amp;quot;, &amp;quot;words-async.js&amp;quot;,  and a text file &amp;quot;comments.txt&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;comments.txt&amp;quot; should:&lt;br /&gt;
* list any references you used to complete the assignment (documentation web sites, for example),&lt;br /&gt;
* list your collaborators, and&lt;br /&gt;
* optionally, should discuss any issues or concerns you had when completing this assignment.&lt;br /&gt;
Remember that while you are allowed to collaborate with others, plagiarism is not allowed. In other words you should not be copying any code or data directly from anywhere, and any assistance or inspiration should be credited. Any significant code similarity (beyond the code already given to you) will be considered plagiarism and will be reported to the Dean.&lt;/div&gt;</summary>
		<author><name>Zero</name></author>
	</entry>
	<entry>
		<id>https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W:_Assignment_1&amp;diff=20534</id>
		<title>WebFund 2016W: Assignment 1</title>
		<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W:_Assignment_1&amp;diff=20534"/>
		<updated>2016-01-17T04:29:23Z</updated>

		<summary type="html">&lt;p&gt;Zero: There&amp;#039;s no darn quotes. That&amp;#039;s half an hour I&amp;#039;m never going to get back.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This assignment is due on January 20th on cuLearn.&lt;br /&gt;
&lt;br /&gt;
In this assignment you will writing two programs, &amp;lt;tt&amp;gt;words-sync.js&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;words-async.js&amp;lt;/tt&amp;gt;.  These programs will make use of synchronous and asynchronous I/O is the manner of the programs from [[WebFund 2016W: Tutorial 1|Tutorial 1]].&lt;br /&gt;
&lt;br /&gt;
These programs should both behave as follows:&lt;br /&gt;
&lt;br /&gt;
* They should take two arguments, an input text file and an output file to create.  Thus you run them by typing &amp;quot;node words-sync.js document.txt wordlist.txt&amp;quot;, with document.txt being the file to be read and wordlist.txt is the file to be created.&lt;br /&gt;
* The output file should contain a list of words in the input file, one word per line, with each line terminated by a newline character (&#039;\n&#039;).  These words should be sorted in ascending order, as ordered by the standard JavaScript [https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort Array.sort() method] (with no comparison function specified).  All duplicates should be removed and there should be no blank lines.&lt;br /&gt;
* Once the output file has been created, the program should output &amp;quot;Finished!&amp;quot; to the console.&lt;br /&gt;
* For the purposes of this program, words can be defined as anything matching the \w operator.  In other words, to split the document into words you may call [https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split split()] using /\W// as the split [https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions regular expression].&lt;br /&gt;
* You may assume that the input file exists and is readable and the output file is writable.  In other words you do not need to do any error checking (although it is appreciated).&lt;br /&gt;
&lt;br /&gt;
In creating this program, don&#039;t forget that you can use standard JavaScript methods such as [https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/push push()], [https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/pop pop()], [https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/shift shift()], and [https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/unshift unshift()].  And of course you&#039;ll need the methods from [https://nodejs.org/api/fs.html the Node fs module].&lt;br /&gt;
&lt;br /&gt;
There are 10 points, allocated as follows:&lt;br /&gt;
* 3 points for producing the correct output given well-formed input.&lt;br /&gt;
* 2 points for correctly structuring the code in the synchronous version.&lt;br /&gt;
* 5 points for correctly structuring the code in the asynchronous version.  In particular, &amp;quot;Finished!&amp;quot; should only be output when the program is truly finished!&lt;br /&gt;
&lt;br /&gt;
Please submit your answers as a zip file called &amp;quot;&amp;lt;username&amp;gt;-comp2406-assign1.zip&amp;quot;, where username is your MyCarletonOne username. This zip file should uncompress to a directory called &amp;quot;&amp;lt;username&amp;gt;-comp2406-assign1&amp;quot; and inside this directory should be three files: &amp;quot;words-sync.js&amp;quot;, &amp;quot;words-async.js&amp;quot;,  and a text file &amp;quot;comments.txt&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;comments.txt&amp;quot; should:&lt;br /&gt;
* list any references you used to complete the assignment (documentation web sites, for example),&lt;br /&gt;
* list your collaborators, and&lt;br /&gt;
* optionally, should discuss any issues or concerns you had when completing this assignment.&lt;br /&gt;
Remember that while you are allowed to collaborate with others, plagiarism is not allowed. In other words you should not be copying any code or data directly from anywhere, and any assistance or inspiration should be credited. Any significant code similarity (beyond the code already given to you) will be considered plagiarism and will be reported to the Dean.&lt;/div&gt;</summary>
		<author><name>Zero</name></author>
	</entry>
	<entry>
		<id>https://homeostasis.scs.carleton.ca/wiki/index.php?title=Fundamentals_of_Web_Applications_(Winter_2016)&amp;diff=20533</id>
		<title>Fundamentals of Web Applications (Winter 2016)</title>
		<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=Fundamentals_of_Web_Applications_(Winter_2016)&amp;diff=20533"/>
		<updated>2016-01-17T01:00:02Z</updated>

		<summary type="html">&lt;p&gt;Zero: Typo.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Course Outline==&lt;br /&gt;
&lt;br /&gt;
[[Fundamentals of Web Applications: Winter 2016 Course Outline|Here]] is the course outline.&lt;br /&gt;
&lt;br /&gt;
==Lectures and Exams==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table style=&amp;quot;width: 100%;&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;tr valign=&amp;quot;top&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;th&amp;gt;&lt;br /&gt;
    &amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;Date&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;th&amp;gt;&lt;br /&gt;
    &amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;Topic&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 7&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 1|Lecture 1]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 12&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 2|Lecture 2]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 14&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 3|Lecture 3]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 19&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 4|Lecture 4]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 21&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 5|Lecture 5]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 26&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 6|Lecture 6]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 28&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 7|Lecture 7]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Feb. 2&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 8|Lecture 8]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Feb. 4&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 9|Lecture 9]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Feb. 9&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 10|Midterm Review]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Feb. 11&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Midterm (in class)&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Feb. 23&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 11|Lecture 11]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Feb. 25&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 12|Lecture 12]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 1&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 13|Lecture 13]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 3&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 14|Lecture 14]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 8&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 15|Lecture 15]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 10&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 16|Lecture 16]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 15&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 17|Lecture 17]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 17&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 18|Lecture 18]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 22&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 19|Lecture 19]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 24&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 20|Lecture 20]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 29&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 21|Lecture 21]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 31&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 22|Lecture 22]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Apr. 5&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 23|Lecture 23]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;April 7&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 24|Lecture 24]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;TBA&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Final Exam&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Tutorials==&lt;br /&gt;
&lt;br /&gt;
Each week you will get a progress grade from 0-4, given to you by a TA.  If you are being diligent, you should be able to get 4&#039;s every week.  The easiest way to get your grade is to come to tutorial and meet with your TA; alternately, you can meet a TA in their office hours or, at their discretion, discuss things with them online.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table style=&amp;quot;width: 100%;&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;tr valign=&amp;quot;top&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;th&amp;gt;&lt;br /&gt;
    &amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;Date&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;th&amp;gt;&lt;br /&gt;
    &amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;Tutorials&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 13, 14, 15, 18&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Tutorial 1|Asynchronous Code in JavaScript]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 20, 21, 22, 25&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Tutorial 2|Tiny web server]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 27, 28, 29, Feb. 1&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Tutorial 3|Express, Form demo]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Feb. 3, 4, 5, 8&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Tutorial 4|TBA]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Feb. 24, 25, 26, 29&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Tutorial 5|TBA]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 2, 3, 4, 7&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Tutorial 6|TBA]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 9, 10, 11, 14&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Tutorial 7|TBA]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 16, 17, 18, 21&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Tutorial 8|TBA]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 23, 24, 25, 28&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Tutorial 9|TBA]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 30, 31, Apr. 1, 4&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Tutorial 10|TBA]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Assignments==&lt;br /&gt;
&amp;lt;table style=&amp;quot;width: 100%;&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;tr valign=&amp;quot;top&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;th&amp;gt;&lt;br /&gt;
    &amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;Due Date&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;th&amp;gt;&lt;br /&gt;
    &amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;Assignments&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 20&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Assignment 1|Assignment 1]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 27&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Assignment 2|Assignment 2]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Feb. 3&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Assignment 3|Assignment 3]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Feb. 9, 2:30 PM&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Assignment 4|Assignment 4]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 2&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Assignment 5|Assignment 5]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 9&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Assignment 6|Assignment 6]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 16&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Assignment 7|Assignment 7]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 23&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Assignment 8|Assignment 8]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 30&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Assignment 9|Assignment 9]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Apr. 6&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Assignment 10|Assignment 10]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Course Software==&lt;br /&gt;
&lt;br /&gt;
In this course we will be developing web applications using [http://nodejs.org/ node.js] and [http://www.mongodb.org/ mongoDB].  You are welcome to use whatever operating system and development tools you like; however, we will supporting the use of a course virtual machine appliance running [http://www.lubuntu.net/ Lubuntu], a low-resource variant of [http://www.ubuntu.com/ Ubuntu] Linux distribution.&lt;br /&gt;
&lt;br /&gt;
===In the labs===&lt;br /&gt;
&lt;br /&gt;
In the SCS labs you should be able to run the course VM by starting Virtualbox (listed in the Applications menu) and selecting the COMP 2406 virtual machine image.  After the VM has fully booted up you can login to the student account using the password &amp;quot;tneduts!&amp;quot;.  This account has administrative privileges; in addition, there is the admin account in case your student account gets corrupted for any reason.  The password for it is &amp;quot;nimda!&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
We highly recommend running your VM in full-screen mode (select from the menu, not by maximizing the window).  Do all of your work inside of the VM; it should be fast enough and you won&#039;t have any issues with sharing files or with firewalls/network connectivity. Keep in mind that the browser is likely out of date and you should not log into any important services (e.g., Gmail) due to missing security patches.&lt;br /&gt;
&lt;br /&gt;
You can save the work you do from the course VM (in the student account) to your SCS account and restore it to any other copy of the class VM (on your machines or in the labs) by running using the following commands:&lt;br /&gt;
&lt;br /&gt;
  save2406 &amp;lt;SCS username&amp;gt;&lt;br /&gt;
  restore2406 &amp;lt;SCS username&amp;gt;&lt;br /&gt;
  compare2406 &amp;lt;SCS username&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you use these commands, &#039;&#039;&#039;use them consistently&#039;&#039;&#039;.  That means run &amp;lt;tt&amp;gt;restore2406&amp;lt;/tt&amp;gt; when you first log in, and run &amp;lt;tt&amp;gt;save2406&amp;lt;/tt&amp;gt; just before logging out.  If you don&#039;t do this, you will &#039;&#039;&#039;erase&#039;&#039;&#039; the work that you had done previously when you save.&lt;br /&gt;
&lt;br /&gt;
If you forgot to restore and you want to save, try running this:&lt;br /&gt;
&lt;br /&gt;
   rsync -a -v --progress ~/ &amp;lt;SCS username&amp;gt;@access.scs.carleton.ca:COMP2406/&lt;br /&gt;
&lt;br /&gt;
This is the same as the &amp;lt;tt&amp;gt;save2406&amp;lt;/tt&amp;gt; command minus the options (--delete and --force) that deletes files in the destination that don&#039;t exist in the source.  As a check, you may want to add the &amp;lt;tt&amp;gt;-n&amp;lt;/tt&amp;gt; option to do a dry run.&lt;br /&gt;
&lt;br /&gt;
====Working directly off network drive (sshfs)====&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t want to bother running save2406 and restore2406 all the time, you can optionally mount the network drive.&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install sshfs # You may already have this package&lt;br /&gt;
  mkdir ~/network-drive/ # Pick any name you want.&lt;br /&gt;
  sshfs -o reconnect,transform_symlinks ~/network-drive/ &amp;lt;SCS username&amp;gt;@access.scs.carleton.ca:/&lt;br /&gt;
&lt;br /&gt;
At this point, you should see all of your files in ~/network-drive/COMP2406/.&lt;br /&gt;
&lt;br /&gt;
Note: There is no concept of &amp;quot;restore&amp;quot; or undo. If you delete or overwrite a file, it&#039;s gone.&lt;br /&gt;
&lt;br /&gt;
===Running the VM on your own machines===&lt;br /&gt;
&lt;br /&gt;
If you want to run the VM appliance on your own system (running essentially any desktop operating system you want), just download the [http://homeostasis.scs.carleton.ca/~soma/VMs/COMP%202406,%20Winter%202016.ova virtual appliance file] and import into [http://www.virtualbox.org VirtualBox] or VMware Workstation/Fusion ([https://secure.scs.carleton.ca/vmware/ free to Carleton SCS students]).  The SHA1 hash of this file is:&lt;br /&gt;
&lt;br /&gt;
    97fc4de4544505178b580d27487085a20961e91e [http://homeostasis.scs.carleton.ca/~soma/VMs/COMP%202406,%20Winter%202016.ova COMP 2406, Winter 2016.ova]&lt;br /&gt;
&lt;br /&gt;
On Windows you can compute this hash for your downloaded file using the command &amp;lt;a href=&amp;quot;http://support.microsoft.com/kb/889768&amp;quot;&amp;gt;&amp;lt;tt&amp;gt;FCIV -sha1 COMP 2406 &amp;amp; 3000, Fall 2015.ova&amp;lt;/tt&amp;gt;&amp;lt;/a&amp;gt;.  If the hash is different from above, your download has been corrupted.&lt;br /&gt;
&lt;br /&gt;
If your virtualization platform is not VirtualBox, you&#039;ll need to:&lt;br /&gt;
* Have the VM platform ignore any errors in the structure of the appliance found during the import process;&lt;br /&gt;
* Uninstall the VirtualBox guest additions by typing starting a terminal application and running&lt;br /&gt;
   sudo /opt/VBoxGuestAdditions-*/uninstall.sh&lt;br /&gt;
* Install your platform&#039;s own Linux guest additions, if available.&lt;br /&gt;
&lt;br /&gt;
===Configuring Linux===&lt;br /&gt;
&lt;br /&gt;
If you already run Linux and you want to use the same packages we do in class, you should do the following:&lt;br /&gt;
&lt;br /&gt;
* Install the latest node.js version using [https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager a package manager].  (You generally don&#039;t use the version that comes with your distribution, it is probably too old.)&lt;br /&gt;
* Install [http://www.mongodb.org/ mongoDB] - it probably goes by mongodb in your package manager.  The version doesn&#039;t matter too much.&lt;br /&gt;
&lt;br /&gt;
Note that the binary of the node.js executable may be &amp;lt;tt&amp;gt;node&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;nodejs&amp;lt;/tt&amp;gt;, or something similar.&lt;br /&gt;
&lt;br /&gt;
That&#039;s it!&lt;br /&gt;
&lt;br /&gt;
===Configuring Windows===&lt;br /&gt;
&lt;br /&gt;
It is also possible to do everything in this class in native Windows.  Here are some tips on getting things running.&lt;br /&gt;
&lt;br /&gt;
* You can install the [https://nodejs.org/en/download/ official Node.js package] to get basic node and npm functionality.&lt;br /&gt;
* See [[Run MongoDB on Windows]].&lt;br /&gt;
* If you want to run Emacs on Windows, look at the [[Running Emacs on Windows|following tips]].&lt;br /&gt;
* [https://atom.io/ Atom] is a another popular free GUI text editor.&lt;br /&gt;
&lt;br /&gt;
===Configuring Mac OS X===&lt;br /&gt;
&lt;br /&gt;
It is possible, and recommended, to configure Node and mongoDB to run on your Mac.&lt;br /&gt;
&lt;br /&gt;
====Homebrew method (recommended)====&lt;br /&gt;
Homebrew is a package manager for OS X that works similarly to Linux-style package managers like &amp;lt;tt&amp;gt;apt&amp;lt;/tt&amp;gt;. Homebrew provides access to thousands of Linux and BSD packages to install natively on your Mac. You have a perfectly capable UNIX system in front of you. Make good use of it!&lt;br /&gt;
&lt;br /&gt;
* Install [http://brew.sh/ Homebrew] (copy the installation text on that page to Terminal.app)&lt;br /&gt;
* Install Node and mongoDB&lt;br /&gt;
&lt;br /&gt;
Run the following commands in your terminal:&lt;br /&gt;
&lt;br /&gt;
    brew update&lt;br /&gt;
    brew install node&lt;br /&gt;
    brew install mongo&lt;br /&gt;
&lt;br /&gt;
That&#039;s it!&lt;br /&gt;
&lt;br /&gt;
====Manual method====&lt;br /&gt;
Alternatively, you can download and install Node and mongo directly.&lt;br /&gt;
&lt;br /&gt;
* Download and install the &#039;&#039;Mac OS X Installer&#039;&#039; from [https://nodejs.org/en/download/stable/ the download page].&lt;br /&gt;
* Download the binaries from [https://www.mongodb.org/downloads#production MongoDB&#039;s download page]&lt;br /&gt;
* Follow [https://docs.mongodb.org/manual/tutorial/install-mongodb-on-os-x/#install-mongodb-community-edition-manually these instructions]&lt;br /&gt;
&lt;br /&gt;
==Resources==&lt;br /&gt;
&lt;br /&gt;
In general any text published by [http://www.oreilly.com/ O&#039;Reilly] is worth your time.  Many (but not all) of the texts below are published by them.&lt;br /&gt;
&lt;br /&gt;
===JavaScript===&lt;br /&gt;
&lt;br /&gt;
[http://shop.oreilly.com/product/9780596517748.do JavaScript: The Good Parts] by Douglas Crockford is an excellent text on JavaScript and it is short.  We highly suggest you obtain a copy and read it.&lt;br /&gt;
&lt;br /&gt;
The easiest way to get started with JavaScript and get basic understanding of web technologies is to go through the interactive lessons on [http://codeacademy.com Code Academy].  I suggest you go through their JavaScript, Web Fundamentals, and jQuery tracks.  They shouldn&#039;t take you very long to do given that you already know how to program.&lt;br /&gt;
&lt;br /&gt;
Crockford also has a lot of online resources on JavaScript, including videos of talks he&#039;s given that cover much of the content in his book.  Look at his [http://javascript.crockford.com/ JavaScript page] and this [http://yuiblog.com/crockford/ page of his videos].&lt;br /&gt;
&lt;br /&gt;
Another good book is [http://eloquentjavascript.net/ Eloquent JavaScript: A Modern Introduction to Programming] by Marijn Haverbeke.  A version of this book is available online for free.  The for-sale version is apparently updated and edited.&lt;br /&gt;
&lt;br /&gt;
The standard reference for JavaScript is [http://shop.oreilly.com/product/9780596805531.do JavaScript: The Definitive Guide] by David Flanagan.  It is a big book, but it is comprehensive.&lt;br /&gt;
&lt;br /&gt;
===Node===&lt;br /&gt;
&lt;br /&gt;
[http://shop.oreilly.com/product/0636920024606.do Learning Node] by Shelley Powers is the recommended resource for learning about Node.&lt;br /&gt;
&lt;br /&gt;
Another introduction to node.js is [http://www.nodebeginner.org/ The Node Beginner Book] by Manuel Kiessling.&lt;br /&gt;
&lt;br /&gt;
[http://evanhahn.com/understanding-express-js/ This page by Evan Hahn] has a good overview of the express/connect/node software stack.&lt;br /&gt;
&lt;br /&gt;
===MongoDB===&lt;br /&gt;
&lt;br /&gt;
[http://shop.oreilly.com/product/0636920028031.do MongoDB: The Definitive Guide] by Kristina Chodorow (1st or 2nd ed) is the recommended text for learning more about MongoDB.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Lecture Notes Guidelines==&lt;br /&gt;
&lt;br /&gt;
As specified in the course outline you can get up to 6% extra credit on your final grade (2% per time) for writing up notes from lecture.  Here are the guidelines for those notes.&lt;br /&gt;
&lt;br /&gt;
Lee Croft (LeeCroft at cmail.carleton.ca) will be handling course notes.  Please contact him if you would like to volunteer.  Note that you should email him in advance and he will give you the next available slot.  There are over 200 students in class and only 20 lectures so opportunities may go fast!&lt;br /&gt;
&lt;br /&gt;
Lee or Anil will set you up with an account on this wiki.  You&#039;ll enter your initial draft notes here and then work with Lee to make sure they are of sufficient quality.  This may require a few rounds of revisions; however, if you follow the guidelines below it shouldn&#039;t be too bad.&lt;br /&gt;
&lt;br /&gt;
You should plan on organizing your notes as follows:&lt;br /&gt;
* Organize them in at least the following sections: Topics &amp;amp; Readings, Audio &amp;amp; Video, and Notes.&lt;br /&gt;
* The Topics &amp;amp; Readings section lists the main topics covered in the course, e.g. &amp;quot;Scoping rules in JavaScript&amp;quot;.  Please use an unordered bulleted list (using *&#039;s in wiki markup).  In this section also list readings relevant to the lecture that were mentioned in class.&lt;br /&gt;
* Leave the Audio and Video section blank.  Anil will fill this out.&lt;br /&gt;
* Put your notes in the Notes section.&lt;br /&gt;
&lt;br /&gt;
Use (nested) lists if appropriate for the notes; however, please have some text that isn&#039;t bulleted.  Please try to make the notes even if you did not attend lecture; however, you don&#039;t need to cover every small bit of information that was covered.  In particular the notes do not need to include digressions into topics only tangentially related to the course.  Complete sentences are welcome but not required.&lt;/div&gt;</summary>
		<author><name>Zero</name></author>
	</entry>
	<entry>
		<id>https://homeostasis.scs.carleton.ca/wiki/index.php?title=Fundamentals_of_Web_Applications_(Winter_2016)&amp;diff=20532</id>
		<title>Fundamentals of Web Applications (Winter 2016)</title>
		<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=Fundamentals_of_Web_Applications_(Winter_2016)&amp;diff=20532"/>
		<updated>2016-01-17T00:59:44Z</updated>

		<summary type="html">&lt;p&gt;Zero: Added sshfs.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Course Outline==&lt;br /&gt;
&lt;br /&gt;
[[Fundamentals of Web Applications: Winter 2016 Course Outline|Here]] is the course outline.&lt;br /&gt;
&lt;br /&gt;
==Lectures and Exams==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table style=&amp;quot;width: 100%;&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;tr valign=&amp;quot;top&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;th&amp;gt;&lt;br /&gt;
    &amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;Date&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;th&amp;gt;&lt;br /&gt;
    &amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;Topic&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 7&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 1|Lecture 1]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 12&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 2|Lecture 2]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 14&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 3|Lecture 3]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 19&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 4|Lecture 4]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 21&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 5|Lecture 5]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 26&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 6|Lecture 6]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 28&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 7|Lecture 7]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Feb. 2&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 8|Lecture 8]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Feb. 4&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 9|Lecture 9]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Feb. 9&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 10|Midterm Review]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Feb. 11&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Midterm (in class)&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Feb. 23&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 11|Lecture 11]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Feb. 25&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 12|Lecture 12]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 1&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 13|Lecture 13]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 3&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 14|Lecture 14]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 8&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 15|Lecture 15]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 10&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 16|Lecture 16]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 15&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 17|Lecture 17]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 17&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 18|Lecture 18]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 22&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 19|Lecture 19]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 24&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 20|Lecture 20]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 29&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 21|Lecture 21]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 31&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 22|Lecture 22]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Apr. 5&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 23|Lecture 23]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;April 7&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 24|Lecture 24]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;TBA&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Final Exam&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Tutorials==&lt;br /&gt;
&lt;br /&gt;
Each week you will get a progress grade from 0-4, given to you by a TA.  If you are being diligent, you should be able to get 4&#039;s every week.  The easiest way to get your grade is to come to tutorial and meet with your TA; alternately, you can meet a TA in their office hours or, at their discretion, discuss things with them online.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table style=&amp;quot;width: 100%;&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;tr valign=&amp;quot;top&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;th&amp;gt;&lt;br /&gt;
    &amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;Date&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;th&amp;gt;&lt;br /&gt;
    &amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;Tutorials&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 13, 14, 15, 18&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Tutorial 1|Asynchronous Code in JavaScript]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 20, 21, 22, 25&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Tutorial 2|Tiny web server]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 27, 28, 29, Feb. 1&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Tutorial 3|Express, Form demo]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Feb. 3, 4, 5, 8&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Tutorial 4|TBA]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Feb. 24, 25, 26, 29&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Tutorial 5|TBA]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 2, 3, 4, 7&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Tutorial 6|TBA]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 9, 10, 11, 14&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Tutorial 7|TBA]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 16, 17, 18, 21&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Tutorial 8|TBA]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 23, 24, 25, 28&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Tutorial 9|TBA]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 30, 31, Apr. 1, 4&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Tutorial 10|TBA]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Assignments==&lt;br /&gt;
&amp;lt;table style=&amp;quot;width: 100%;&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;tr valign=&amp;quot;top&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;th&amp;gt;&lt;br /&gt;
    &amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;Due Date&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;th&amp;gt;&lt;br /&gt;
    &amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;Assignments&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 20&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Assignment 1|Assignment 1]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 27&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Assignment 2|Assignment 2]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Feb. 3&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Assignment 3|Assignment 3]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Feb. 9, 2:30 PM&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Assignment 4|Assignment 4]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 2&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Assignment 5|Assignment 5]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 9&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Assignment 6|Assignment 6]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 16&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Assignment 7|Assignment 7]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 23&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Assignment 8|Assignment 8]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 30&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Assignment 9|Assignment 9]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Apr. 6&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Assignment 10|Assignment 10]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Course Software==&lt;br /&gt;
&lt;br /&gt;
In this course we will be developing web applications using [http://nodejs.org/ node.js] and [http://www.mongodb.org/ mongoDB].  You are welcome to use whatever operating system and development tools you like; however, we will supporting the use of a course virtual machine appliance running [http://www.lubuntu.net/ Lubuntu], a low-resource variant of [http://www.ubuntu.com/ Ubuntu] Linux distribution.&lt;br /&gt;
&lt;br /&gt;
===In the labs===&lt;br /&gt;
&lt;br /&gt;
In the SCS labs you should be able to run the course VM by starting Virtualbox (listed in the Applications menu) and selecting the COMP 2406 virtual machine image.  After the VM has fully booted up you can login to the student account using the password &amp;quot;tneduts!&amp;quot;.  This account has administrative privileges; in addition, there is the admin account in case your student account gets corrupted for any reason.  The password for it is &amp;quot;nimda!&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
We highly recommend running your VM in full-screen mode (select from the menu, not by maximizing the window).  Do all of your work inside of the VM; it should be fast enough and you won&#039;t have any issues with sharing files or with firewalls/network connectivity. Keep in mind that the browser is likely out of date and you should not log into any important services (e.g., Gmail) due to missing security patches.&lt;br /&gt;
&lt;br /&gt;
You can save the work you do from the course VM (in the student account) to your SCS account and restore it to any other copy of the class VM (on your machines or in the labs) by running using the following commands:&lt;br /&gt;
&lt;br /&gt;
  save2406 &amp;lt;SCS username&amp;gt;&lt;br /&gt;
  restore2406 &amp;lt;SCS username&amp;gt;&lt;br /&gt;
  compare2406 &amp;lt;SCS username&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you use these commands, &#039;&#039;&#039;use them consistently&#039;&#039;&#039;.  That means run &amp;lt;tt&amp;gt;restore2406&amp;lt;/tt&amp;gt; when you first log in, and run &amp;lt;tt&amp;gt;save2406&amp;lt;/tt&amp;gt; just before logging out.  If you don&#039;t do this, you will &#039;&#039;&#039;erase&#039;&#039;&#039; the work that you had done previously when you save.&lt;br /&gt;
&lt;br /&gt;
If you forgot to restore and you want to save, try running this:&lt;br /&gt;
&lt;br /&gt;
   rsync -a -v --progress ~/ &amp;lt;SCS username&amp;gt;@access.scs.carleton.ca:COMP2406/&lt;br /&gt;
&lt;br /&gt;
This is the same as the &amp;lt;tt&amp;gt;save2406&amp;lt;/tt&amp;gt; command minus the options (--delete and --force) that deletes files in the destination that don&#039;t exist in the source.  As a check, you may want to add the &amp;lt;tt&amp;gt;-n&amp;lt;/tt&amp;gt; option to do a dry run.&lt;br /&gt;
&lt;br /&gt;
====Working directly off network drive (sshfs)====&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t want to bother running save2406 and restore2406 all the time, you can optionally mount the network drive.&lt;br /&gt;
&lt;br /&gt;
  sudo apt-get install sshfs # You may already have this package&lt;br /&gt;
  mkdir ~/network-drive/ # Pick any name you want.&lt;br /&gt;
  sshfs -o reconnect,transform_symlinks ~/network-drive/ &amp;lt;SCS username@access.scs.carleton.ca:/&lt;br /&gt;
&lt;br /&gt;
At this point, you should see all of your files in ~/network-drive/COMP2406/.&lt;br /&gt;
&lt;br /&gt;
Note: There is no concept of &amp;quot;restore&amp;quot; or undo. If you delete or overwrite a file, it&#039;s gone.&lt;br /&gt;
&lt;br /&gt;
===Running the VM on your own machines===&lt;br /&gt;
&lt;br /&gt;
If you want to run the VM appliance on your own system (running essentially any desktop operating system you want), just download the [http://homeostasis.scs.carleton.ca/~soma/VMs/COMP%202406,%20Winter%202016.ova virtual appliance file] and import into [http://www.virtualbox.org VirtualBox] or VMware Workstation/Fusion ([https://secure.scs.carleton.ca/vmware/ free to Carleton SCS students]).  The SHA1 hash of this file is:&lt;br /&gt;
&lt;br /&gt;
    97fc4de4544505178b580d27487085a20961e91e [http://homeostasis.scs.carleton.ca/~soma/VMs/COMP%202406,%20Winter%202016.ova COMP 2406, Winter 2016.ova]&lt;br /&gt;
&lt;br /&gt;
On Windows you can compute this hash for your downloaded file using the command &amp;lt;a href=&amp;quot;http://support.microsoft.com/kb/889768&amp;quot;&amp;gt;&amp;lt;tt&amp;gt;FCIV -sha1 COMP 2406 &amp;amp; 3000, Fall 2015.ova&amp;lt;/tt&amp;gt;&amp;lt;/a&amp;gt;.  If the hash is different from above, your download has been corrupted.&lt;br /&gt;
&lt;br /&gt;
If your virtualization platform is not VirtualBox, you&#039;ll need to:&lt;br /&gt;
* Have the VM platform ignore any errors in the structure of the appliance found during the import process;&lt;br /&gt;
* Uninstall the VirtualBox guest additions by typing starting a terminal application and running&lt;br /&gt;
   sudo /opt/VBoxGuestAdditions-*/uninstall.sh&lt;br /&gt;
* Install your platform&#039;s own Linux guest additions, if available.&lt;br /&gt;
&lt;br /&gt;
===Configuring Linux===&lt;br /&gt;
&lt;br /&gt;
If you already run Linux and you want to use the same packages we do in class, you should do the following:&lt;br /&gt;
&lt;br /&gt;
* Install the latest node.js version using [https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager a package manager].  (You generally don&#039;t use the version that comes with your distribution, it is probably too old.)&lt;br /&gt;
* Install [http://www.mongodb.org/ mongoDB] - it probably goes by mongodb in your package manager.  The version doesn&#039;t matter too much.&lt;br /&gt;
&lt;br /&gt;
Note that the binary of the node.js executable may be &amp;lt;tt&amp;gt;node&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;nodejs&amp;lt;/tt&amp;gt;, or something similar.&lt;br /&gt;
&lt;br /&gt;
That&#039;s it!&lt;br /&gt;
&lt;br /&gt;
===Configuring Windows===&lt;br /&gt;
&lt;br /&gt;
It is also possible to do everything in this class in native Windows.  Here are some tips on getting things running.&lt;br /&gt;
&lt;br /&gt;
* You can install the [https://nodejs.org/en/download/ official Node.js package] to get basic node and npm functionality.&lt;br /&gt;
* See [[Run MongoDB on Windows]].&lt;br /&gt;
* If you want to run Emacs on Windows, look at the [[Running Emacs on Windows|following tips]].&lt;br /&gt;
* [https://atom.io/ Atom] is a another popular free GUI text editor.&lt;br /&gt;
&lt;br /&gt;
===Configuring Mac OS X===&lt;br /&gt;
&lt;br /&gt;
It is possible, and recommended, to configure Node and mongoDB to run on your Mac.&lt;br /&gt;
&lt;br /&gt;
====Homebrew method (recommended)====&lt;br /&gt;
Homebrew is a package manager for OS X that works similarly to Linux-style package managers like &amp;lt;tt&amp;gt;apt&amp;lt;/tt&amp;gt;. Homebrew provides access to thousands of Linux and BSD packages to install natively on your Mac. You have a perfectly capable UNIX system in front of you. Make good use of it!&lt;br /&gt;
&lt;br /&gt;
* Install [http://brew.sh/ Homebrew] (copy the installation text on that page to Terminal.app)&lt;br /&gt;
* Install Node and mongoDB&lt;br /&gt;
&lt;br /&gt;
Run the following commands in your terminal:&lt;br /&gt;
&lt;br /&gt;
    brew update&lt;br /&gt;
    brew install node&lt;br /&gt;
    brew install mongo&lt;br /&gt;
&lt;br /&gt;
That&#039;s it!&lt;br /&gt;
&lt;br /&gt;
====Manual method====&lt;br /&gt;
Alternatively, you can download and install Node and mongo directly.&lt;br /&gt;
&lt;br /&gt;
* Download and install the &#039;&#039;Mac OS X Installer&#039;&#039; from [https://nodejs.org/en/download/stable/ the download page].&lt;br /&gt;
* Download the binaries from [https://www.mongodb.org/downloads#production MongoDB&#039;s download page]&lt;br /&gt;
* Follow [https://docs.mongodb.org/manual/tutorial/install-mongodb-on-os-x/#install-mongodb-community-edition-manually these instructions]&lt;br /&gt;
&lt;br /&gt;
==Resources==&lt;br /&gt;
&lt;br /&gt;
In general any text published by [http://www.oreilly.com/ O&#039;Reilly] is worth your time.  Many (but not all) of the texts below are published by them.&lt;br /&gt;
&lt;br /&gt;
===JavaScript===&lt;br /&gt;
&lt;br /&gt;
[http://shop.oreilly.com/product/9780596517748.do JavaScript: The Good Parts] by Douglas Crockford is an excellent text on JavaScript and it is short.  We highly suggest you obtain a copy and read it.&lt;br /&gt;
&lt;br /&gt;
The easiest way to get started with JavaScript and get basic understanding of web technologies is to go through the interactive lessons on [http://codeacademy.com Code Academy].  I suggest you go through their JavaScript, Web Fundamentals, and jQuery tracks.  They shouldn&#039;t take you very long to do given that you already know how to program.&lt;br /&gt;
&lt;br /&gt;
Crockford also has a lot of online resources on JavaScript, including videos of talks he&#039;s given that cover much of the content in his book.  Look at his [http://javascript.crockford.com/ JavaScript page] and this [http://yuiblog.com/crockford/ page of his videos].&lt;br /&gt;
&lt;br /&gt;
Another good book is [http://eloquentjavascript.net/ Eloquent JavaScript: A Modern Introduction to Programming] by Marijn Haverbeke.  A version of this book is available online for free.  The for-sale version is apparently updated and edited.&lt;br /&gt;
&lt;br /&gt;
The standard reference for JavaScript is [http://shop.oreilly.com/product/9780596805531.do JavaScript: The Definitive Guide] by David Flanagan.  It is a big book, but it is comprehensive.&lt;br /&gt;
&lt;br /&gt;
===Node===&lt;br /&gt;
&lt;br /&gt;
[http://shop.oreilly.com/product/0636920024606.do Learning Node] by Shelley Powers is the recommended resource for learning about Node.&lt;br /&gt;
&lt;br /&gt;
Another introduction to node.js is [http://www.nodebeginner.org/ The Node Beginner Book] by Manuel Kiessling.&lt;br /&gt;
&lt;br /&gt;
[http://evanhahn.com/understanding-express-js/ This page by Evan Hahn] has a good overview of the express/connect/node software stack.&lt;br /&gt;
&lt;br /&gt;
===MongoDB===&lt;br /&gt;
&lt;br /&gt;
[http://shop.oreilly.com/product/0636920028031.do MongoDB: The Definitive Guide] by Kristina Chodorow (1st or 2nd ed) is the recommended text for learning more about MongoDB.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Lecture Notes Guidelines==&lt;br /&gt;
&lt;br /&gt;
As specified in the course outline you can get up to 6% extra credit on your final grade (2% per time) for writing up notes from lecture.  Here are the guidelines for those notes.&lt;br /&gt;
&lt;br /&gt;
Lee Croft (LeeCroft at cmail.carleton.ca) will be handling course notes.  Please contact him if you would like to volunteer.  Note that you should email him in advance and he will give you the next available slot.  There are over 200 students in class and only 20 lectures so opportunities may go fast!&lt;br /&gt;
&lt;br /&gt;
Lee or Anil will set you up with an account on this wiki.  You&#039;ll enter your initial draft notes here and then work with Lee to make sure they are of sufficient quality.  This may require a few rounds of revisions; however, if you follow the guidelines below it shouldn&#039;t be too bad.&lt;br /&gt;
&lt;br /&gt;
You should plan on organizing your notes as follows:&lt;br /&gt;
* Organize them in at least the following sections: Topics &amp;amp; Readings, Audio &amp;amp; Video, and Notes.&lt;br /&gt;
* The Topics &amp;amp; Readings section lists the main topics covered in the course, e.g. &amp;quot;Scoping rules in JavaScript&amp;quot;.  Please use an unordered bulleted list (using *&#039;s in wiki markup).  In this section also list readings relevant to the lecture that were mentioned in class.&lt;br /&gt;
* Leave the Audio and Video section blank.  Anil will fill this out.&lt;br /&gt;
* Put your notes in the Notes section.&lt;br /&gt;
&lt;br /&gt;
Use (nested) lists if appropriate for the notes; however, please have some text that isn&#039;t bulleted.  Please try to make the notes even if you did not attend lecture; however, you don&#039;t need to cover every small bit of information that was covered.  In particular the notes do not need to include digressions into topics only tangentially related to the course.  Complete sentences are welcome but not required.&lt;/div&gt;</summary>
		<author><name>Zero</name></author>
	</entry>
	<entry>
		<id>https://homeostasis.scs.carleton.ca/wiki/index.php?title=Fundamentals_of_Web_Applications_(Winter_2016)&amp;diff=20531</id>
		<title>Fundamentals of Web Applications (Winter 2016)</title>
		<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=Fundamentals_of_Web_Applications_(Winter_2016)&amp;diff=20531"/>
		<updated>2016-01-17T00:51:11Z</updated>

		<summary type="html">&lt;p&gt;Zero: Security warning.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Course Outline==&lt;br /&gt;
&lt;br /&gt;
[[Fundamentals of Web Applications: Winter 2016 Course Outline|Here]] is the course outline.&lt;br /&gt;
&lt;br /&gt;
==Lectures and Exams==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table style=&amp;quot;width: 100%;&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;tr valign=&amp;quot;top&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;th&amp;gt;&lt;br /&gt;
    &amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;Date&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;th&amp;gt;&lt;br /&gt;
    &amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;Topic&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 7&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 1|Lecture 1]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 12&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 2|Lecture 2]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 14&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 3|Lecture 3]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 19&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 4|Lecture 4]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 21&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 5|Lecture 5]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 26&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 6|Lecture 6]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 28&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 7|Lecture 7]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Feb. 2&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 8|Lecture 8]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Feb. 4&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 9|Lecture 9]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Feb. 9&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 10|Midterm Review]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Feb. 11&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Midterm (in class)&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Feb. 23&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 11|Lecture 11]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Feb. 25&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 12|Lecture 12]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 1&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 13|Lecture 13]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 3&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 14|Lecture 14]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 8&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 15|Lecture 15]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 10&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 16|Lecture 16]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 15&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 17|Lecture 17]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 17&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 18|Lecture 18]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 22&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 19|Lecture 19]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 24&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 20|Lecture 20]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 29&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 21|Lecture 21]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 31&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 22|Lecture 22]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Apr. 5&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 23|Lecture 23]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;April 7&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 24|Lecture 24]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;TBA&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Final Exam&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Tutorials==&lt;br /&gt;
&lt;br /&gt;
Each week you will get a progress grade from 0-4, given to you by a TA.  If you are being diligent, you should be able to get 4&#039;s every week.  The easiest way to get your grade is to come to tutorial and meet with your TA; alternately, you can meet a TA in their office hours or, at their discretion, discuss things with them online.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table style=&amp;quot;width: 100%;&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;tr valign=&amp;quot;top&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;th&amp;gt;&lt;br /&gt;
    &amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;Date&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;th&amp;gt;&lt;br /&gt;
    &amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;Tutorials&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 13, 14, 15, 18&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Tutorial 1|Asynchronous Code in JavaScript]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 20, 21, 22, 25&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Tutorial 2|Tiny web server]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 27, 28, 29, Feb. 1&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Tutorial 3|Express, Form demo]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Feb. 3, 4, 5, 8&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Tutorial 4|TBA]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Feb. 24, 25, 26, 29&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Tutorial 5|TBA]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 2, 3, 4, 7&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Tutorial 6|TBA]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 9, 10, 11, 14&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Tutorial 7|TBA]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 16, 17, 18, 21&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Tutorial 8|TBA]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 23, 24, 25, 28&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Tutorial 9|TBA]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 30, 31, Apr. 1, 4&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Tutorial 10|TBA]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Assignments==&lt;br /&gt;
&amp;lt;table style=&amp;quot;width: 100%;&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;tr valign=&amp;quot;top&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;th&amp;gt;&lt;br /&gt;
    &amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;Due Date&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;th&amp;gt;&lt;br /&gt;
    &amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;Assignments&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 20&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Assignment 1|Assignment 1]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 27&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Assignment 2|Assignment 2]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Feb. 3&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Assignment 3|Assignment 3]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Feb. 9, 2:30 PM&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Assignment 4|Assignment 4]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 2&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Assignment 5|Assignment 5]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 9&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Assignment 6|Assignment 6]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 16&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Assignment 7|Assignment 7]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 23&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Assignment 8|Assignment 8]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 30&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Assignment 9|Assignment 9]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Apr. 6&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Assignment 10|Assignment 10]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Course Software==&lt;br /&gt;
&lt;br /&gt;
In this course we will be developing web applications using [http://nodejs.org/ node.js] and [http://www.mongodb.org/ mongoDB].  You are welcome to use whatever operating system and development tools you like; however, we will supporting the use of a course virtual machine appliance running [http://www.lubuntu.net/ Lubuntu], a low-resource variant of [http://www.ubuntu.com/ Ubuntu] Linux distribution.&lt;br /&gt;
&lt;br /&gt;
===In the labs===&lt;br /&gt;
&lt;br /&gt;
In the SCS labs you should be able to run the course VM by starting Virtualbox (listed in the Applications menu) and selecting the COMP 2406 virtual machine image.  After the VM has fully booted up you can login to the student account using the password &amp;quot;tneduts!&amp;quot;.  This account has administrative privileges; in addition, there is the admin account in case your student account gets corrupted for any reason.  The password for it is &amp;quot;nimda!&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
We highly recommend running your VM in full-screen mode (select from the menu, not by maximizing the window).  Do all of your work inside of the VM; it should be fast enough and you won&#039;t have any issues with sharing files or with firewalls/network connectivity. Keep in mind that the browser is likely out of date and you should not log into any important services (e.g., Gmail) due to missing security patches.&lt;br /&gt;
&lt;br /&gt;
You can save the work you do from the course VM (in the student account) to your SCS account and restore it to any other copy of the class VM (on your machines or in the labs) by running using the following commands:&lt;br /&gt;
&lt;br /&gt;
  save2406 &amp;lt;SCS username&amp;gt;&lt;br /&gt;
  restore2406 &amp;lt;SCS username&amp;gt;&lt;br /&gt;
  compare2406 &amp;lt;SCS username&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you use these commands, &#039;&#039;&#039;use them consistently&#039;&#039;&#039;.  That means run &amp;lt;tt&amp;gt;restore2406&amp;lt;/tt&amp;gt; when you first log in, and run &amp;lt;tt&amp;gt;save2406&amp;lt;/tt&amp;gt; just before logging out.  If you don&#039;t do this, you will &#039;&#039;&#039;erase&#039;&#039;&#039; the work that you had done previously when you save.&lt;br /&gt;
&lt;br /&gt;
If you forgot to restore and you want to save, try running this:&lt;br /&gt;
&lt;br /&gt;
   rsync -a -v --progress ~/ &amp;lt;SCS username&amp;gt;@access.scs.carleton.ca:COMP2406/&lt;br /&gt;
&lt;br /&gt;
This is the same as the &amp;lt;tt&amp;gt;save2406&amp;lt;/tt&amp;gt; command minus the options (--delete and --force) that deletes files in the destination that don&#039;t exist in the source.  As a check, you may want to add the &amp;lt;tt&amp;gt;-n&amp;lt;/tt&amp;gt; option to do a dry run.&lt;br /&gt;
&lt;br /&gt;
===Running the VM on your own machines===&lt;br /&gt;
&lt;br /&gt;
If you want to run the VM appliance on your own system (running essentially any desktop operating system you want), just download the [http://homeostasis.scs.carleton.ca/~soma/VMs/COMP%202406,%20Winter%202016.ova virtual appliance file] and import into [http://www.virtualbox.org VirtualBox] or VMware Workstation/Fusion ([https://secure.scs.carleton.ca/vmware/ free to Carleton SCS students]).  The SHA1 hash of this file is:&lt;br /&gt;
&lt;br /&gt;
    97fc4de4544505178b580d27487085a20961e91e [http://homeostasis.scs.carleton.ca/~soma/VMs/COMP%202406,%20Winter%202016.ova COMP 2406, Winter 2016.ova]&lt;br /&gt;
&lt;br /&gt;
On Windows you can compute this hash for your downloaded file using the command &amp;lt;a href=&amp;quot;http://support.microsoft.com/kb/889768&amp;quot;&amp;gt;&amp;lt;tt&amp;gt;FCIV -sha1 COMP 2406 &amp;amp; 3000, Fall 2015.ova&amp;lt;/tt&amp;gt;&amp;lt;/a&amp;gt;.  If the hash is different from above, your download has been corrupted.&lt;br /&gt;
&lt;br /&gt;
If your virtualization platform is not VirtualBox, you&#039;ll need to:&lt;br /&gt;
* Have the VM platform ignore any errors in the structure of the appliance found during the import process;&lt;br /&gt;
* Uninstall the VirtualBox guest additions by typing starting a terminal application and running&lt;br /&gt;
   sudo /opt/VBoxGuestAdditions-*/uninstall.sh&lt;br /&gt;
* Install your platform&#039;s own Linux guest additions, if available.&lt;br /&gt;
&lt;br /&gt;
===Configuring Linux===&lt;br /&gt;
&lt;br /&gt;
If you already run Linux and you want to use the same packages we do in class, you should do the following:&lt;br /&gt;
&lt;br /&gt;
* Install the latest node.js version using [https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager a package manager].  (You generally don&#039;t use the version that comes with your distribution, it is probably too old.)&lt;br /&gt;
* Install [http://www.mongodb.org/ mongoDB] - it probably goes by mongodb in your package manager.  The version doesn&#039;t matter too much.&lt;br /&gt;
&lt;br /&gt;
Note that the binary of the node.js executable may be &amp;lt;tt&amp;gt;node&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;nodejs&amp;lt;/tt&amp;gt;, or something similar.&lt;br /&gt;
&lt;br /&gt;
That&#039;s it!&lt;br /&gt;
&lt;br /&gt;
===Configuring Windows===&lt;br /&gt;
&lt;br /&gt;
It is also possible to do everything in this class in native Windows.  Here are some tips on getting things running.&lt;br /&gt;
&lt;br /&gt;
* You can install the [https://nodejs.org/en/download/ official Node.js package] to get basic node and npm functionality.&lt;br /&gt;
* See [[Run MongoDB on Windows]].&lt;br /&gt;
* If you want to run Emacs on Windows, look at the [[Running Emacs on Windows|following tips]].&lt;br /&gt;
* [https://atom.io/ Atom] is a another popular free GUI text editor.&lt;br /&gt;
&lt;br /&gt;
===Configuring Mac OS X===&lt;br /&gt;
&lt;br /&gt;
It is possible, and recommended, to configure Node and mongoDB to run on your Mac.&lt;br /&gt;
&lt;br /&gt;
====Homebrew method (recommended)====&lt;br /&gt;
Homebrew is a package manager for OS X that works similarly to Linux-style package managers like &amp;lt;tt&amp;gt;apt&amp;lt;/tt&amp;gt;. Homebrew provides access to thousands of Linux and BSD packages to install natively on your Mac. You have a perfectly capable UNIX system in front of you. Make good use of it!&lt;br /&gt;
&lt;br /&gt;
* Install [http://brew.sh/ Homebrew] (copy the installation text on that page to Terminal.app)&lt;br /&gt;
* Install Node and mongoDB&lt;br /&gt;
&lt;br /&gt;
Run the following commands in your terminal:&lt;br /&gt;
&lt;br /&gt;
    brew update&lt;br /&gt;
    brew install node&lt;br /&gt;
    brew install mongo&lt;br /&gt;
&lt;br /&gt;
That&#039;s it!&lt;br /&gt;
&lt;br /&gt;
====Manual method====&lt;br /&gt;
Alternatively, you can download and install Node and mongo directly.&lt;br /&gt;
&lt;br /&gt;
* Download and install the &#039;&#039;Mac OS X Installer&#039;&#039; from [https://nodejs.org/en/download/stable/ the download page].&lt;br /&gt;
* Download the binaries from [https://www.mongodb.org/downloads#production MongoDB&#039;s download page]&lt;br /&gt;
* Follow [https://docs.mongodb.org/manual/tutorial/install-mongodb-on-os-x/#install-mongodb-community-edition-manually these instructions]&lt;br /&gt;
&lt;br /&gt;
==Resources==&lt;br /&gt;
&lt;br /&gt;
In general any text published by [http://www.oreilly.com/ O&#039;Reilly] is worth your time.  Many (but not all) of the texts below are published by them.&lt;br /&gt;
&lt;br /&gt;
===JavaScript===&lt;br /&gt;
&lt;br /&gt;
[http://shop.oreilly.com/product/9780596517748.do JavaScript: The Good Parts] by Douglas Crockford is an excellent text on JavaScript and it is short.  We highly suggest you obtain a copy and read it.&lt;br /&gt;
&lt;br /&gt;
The easiest way to get started with JavaScript and get basic understanding of web technologies is to go through the interactive lessons on [http://codeacademy.com Code Academy].  I suggest you go through their JavaScript, Web Fundamentals, and jQuery tracks.  They shouldn&#039;t take you very long to do given that you already know how to program.&lt;br /&gt;
&lt;br /&gt;
Crockford also has a lot of online resources on JavaScript, including videos of talks he&#039;s given that cover much of the content in his book.  Look at his [http://javascript.crockford.com/ JavaScript page] and this [http://yuiblog.com/crockford/ page of his videos].&lt;br /&gt;
&lt;br /&gt;
Another good book is [http://eloquentjavascript.net/ Eloquent JavaScript: A Modern Introduction to Programming] by Marijn Haverbeke.  A version of this book is available online for free.  The for-sale version is apparently updated and edited.&lt;br /&gt;
&lt;br /&gt;
The standard reference for JavaScript is [http://shop.oreilly.com/product/9780596805531.do JavaScript: The Definitive Guide] by David Flanagan.  It is a big book, but it is comprehensive.&lt;br /&gt;
&lt;br /&gt;
===Node===&lt;br /&gt;
&lt;br /&gt;
[http://shop.oreilly.com/product/0636920024606.do Learning Node] by Shelley Powers is the recommended resource for learning about Node.&lt;br /&gt;
&lt;br /&gt;
Another introduction to node.js is [http://www.nodebeginner.org/ The Node Beginner Book] by Manuel Kiessling.&lt;br /&gt;
&lt;br /&gt;
[http://evanhahn.com/understanding-express-js/ This page by Evan Hahn] has a good overview of the express/connect/node software stack.&lt;br /&gt;
&lt;br /&gt;
===MongoDB===&lt;br /&gt;
&lt;br /&gt;
[http://shop.oreilly.com/product/0636920028031.do MongoDB: The Definitive Guide] by Kristina Chodorow (1st or 2nd ed) is the recommended text for learning more about MongoDB.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Lecture Notes Guidelines==&lt;br /&gt;
&lt;br /&gt;
As specified in the course outline you can get up to 6% extra credit on your final grade (2% per time) for writing up notes from lecture.  Here are the guidelines for those notes.&lt;br /&gt;
&lt;br /&gt;
Lee Croft (LeeCroft at cmail.carleton.ca) will be handling course notes.  Please contact him if you would like to volunteer.  Note that you should email him in advance and he will give you the next available slot.  There are over 200 students in class and only 20 lectures so opportunities may go fast!&lt;br /&gt;
&lt;br /&gt;
Lee or Anil will set you up with an account on this wiki.  You&#039;ll enter your initial draft notes here and then work with Lee to make sure they are of sufficient quality.  This may require a few rounds of revisions; however, if you follow the guidelines below it shouldn&#039;t be too bad.&lt;br /&gt;
&lt;br /&gt;
You should plan on organizing your notes as follows:&lt;br /&gt;
* Organize them in at least the following sections: Topics &amp;amp; Readings, Audio &amp;amp; Video, and Notes.&lt;br /&gt;
* The Topics &amp;amp; Readings section lists the main topics covered in the course, e.g. &amp;quot;Scoping rules in JavaScript&amp;quot;.  Please use an unordered bulleted list (using *&#039;s in wiki markup).  In this section also list readings relevant to the lecture that were mentioned in class.&lt;br /&gt;
* Leave the Audio and Video section blank.  Anil will fill this out.&lt;br /&gt;
* Put your notes in the Notes section.&lt;br /&gt;
&lt;br /&gt;
Use (nested) lists if appropriate for the notes; however, please have some text that isn&#039;t bulleted.  Please try to make the notes even if you did not attend lecture; however, you don&#039;t need to cover every small bit of information that was covered.  In particular the notes do not need to include digressions into topics only tangentially related to the course.  Complete sentences are welcome but not required.&lt;/div&gt;</summary>
		<author><name>Zero</name></author>
	</entry>
	<entry>
		<id>https://homeostasis.scs.carleton.ca/wiki/index.php?title=Fundamentals_of_Web_Applications_(Winter_2016)&amp;diff=20530</id>
		<title>Fundamentals of Web Applications (Winter 2016)</title>
		<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=Fundamentals_of_Web_Applications_(Winter_2016)&amp;diff=20530"/>
		<updated>2016-01-17T00:45:59Z</updated>

		<summary type="html">&lt;p&gt;Zero: Minor bits of info for the M$ users.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Course Outline==&lt;br /&gt;
&lt;br /&gt;
[[Fundamentals of Web Applications: Winter 2016 Course Outline|Here]] is the course outline.&lt;br /&gt;
&lt;br /&gt;
==Lectures and Exams==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table style=&amp;quot;width: 100%;&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;tr valign=&amp;quot;top&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;th&amp;gt;&lt;br /&gt;
    &amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;Date&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;th&amp;gt;&lt;br /&gt;
    &amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;Topic&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 7&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 1|Lecture 1]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 12&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 2|Lecture 2]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 14&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 3|Lecture 3]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 19&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 4|Lecture 4]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 21&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 5|Lecture 5]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 26&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 6|Lecture 6]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 28&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 7|Lecture 7]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Feb. 2&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 8|Lecture 8]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Feb. 4&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 9|Lecture 9]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Feb. 9&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 10|Midterm Review]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Feb. 11&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Midterm (in class)&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Feb. 23&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 11|Lecture 11]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Feb. 25&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 12|Lecture 12]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 1&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 13|Lecture 13]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 3&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 14|Lecture 14]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 8&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 15|Lecture 15]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 10&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 16|Lecture 16]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 15&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 17|Lecture 17]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 17&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 18|Lecture 18]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 22&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 19|Lecture 19]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 24&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 20|Lecture 20]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 29&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 21|Lecture 21]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 31&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 22|Lecture 22]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Apr. 5&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 23|Lecture 23]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;April 7&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 24|Lecture 24]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;TBA&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Final Exam&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Tutorials==&lt;br /&gt;
&lt;br /&gt;
Each week you will get a progress grade from 0-4, given to you by a TA.  If you are being diligent, you should be able to get 4&#039;s every week.  The easiest way to get your grade is to come to tutorial and meet with your TA; alternately, you can meet a TA in their office hours or, at their discretion, discuss things with them online.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table style=&amp;quot;width: 100%;&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;tr valign=&amp;quot;top&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;th&amp;gt;&lt;br /&gt;
    &amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;Date&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;th&amp;gt;&lt;br /&gt;
    &amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;Tutorials&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 13, 14, 15, 18&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Tutorial 1|Asynchronous Code in JavaScript]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 20, 21, 22, 25&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Tutorial 2|Tiny web server]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 27, 28, 29, Feb. 1&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Tutorial 3|Express, Form demo]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Feb. 3, 4, 5, 8&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Tutorial 4|TBA]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Feb. 24, 25, 26, 29&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Tutorial 5|TBA]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 2, 3, 4, 7&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Tutorial 6|TBA]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 9, 10, 11, 14&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Tutorial 7|TBA]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 16, 17, 18, 21&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Tutorial 8|TBA]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 23, 24, 25, 28&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Tutorial 9|TBA]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 30, 31, Apr. 1, 4&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Tutorial 10|TBA]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Assignments==&lt;br /&gt;
&amp;lt;table style=&amp;quot;width: 100%;&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;tr valign=&amp;quot;top&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;th&amp;gt;&lt;br /&gt;
    &amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;Due Date&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;th&amp;gt;&lt;br /&gt;
    &amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;Assignments&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 20&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Assignment 1|Assignment 1]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 27&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Assignment 2|Assignment 2]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Feb. 3&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Assignment 3|Assignment 3]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Feb. 9, 2:30 PM&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Assignment 4|Assignment 4]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 2&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Assignment 5|Assignment 5]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 9&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Assignment 6|Assignment 6]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 16&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Assignment 7|Assignment 7]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 23&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Assignment 8|Assignment 8]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 30&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Assignment 9|Assignment 9]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Apr. 6&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Assignment 10|Assignment 10]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Course Software==&lt;br /&gt;
&lt;br /&gt;
In this course we will be developing web applications using [http://nodejs.org/ node.js] and [http://www.mongodb.org/ mongoDB].  You are welcome to use whatever operating system and development tools you like; however, we will supporting the use of a course virtual machine appliance running [http://www.lubuntu.net/ Lubuntu], a low-resource variant of [http://www.ubuntu.com/ Ubuntu] Linux distribution.&lt;br /&gt;
&lt;br /&gt;
===In the labs===&lt;br /&gt;
&lt;br /&gt;
In the SCS labs you should be able to run the course VM by starting Virtualbox (listed in the Applications menu) and selecting the COMP 2406 virtual machine image.  After the VM has fully booted up you can login to the student account using the password &amp;quot;tneduts!&amp;quot;.  This account has administrative privileges; in addition, there is the admin account in case your student account gets corrupted for any reason.  The password for it is &amp;quot;nimda!&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
We highly recommend running your VM in full-screen mode (select from the menu, not by maximizing the window).  Do all of your work inside of the VM; it should be fast enough and you won&#039;t have any issues with sharing files or with firewalls/network connectivity.&lt;br /&gt;
&lt;br /&gt;
You can save the work you do from the course VM (in the student account) to your SCS account and restore it to any other copy of the class VM (on your machines or in the labs) by running using the following commands:&lt;br /&gt;
&lt;br /&gt;
  save2406 &amp;lt;SCS username&amp;gt;&lt;br /&gt;
  restore2406 &amp;lt;SCS username&amp;gt;&lt;br /&gt;
  compare2406 &amp;lt;SCS username&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you use these commands, &#039;&#039;&#039;use them consistently&#039;&#039;&#039;.  That means run &amp;lt;tt&amp;gt;restore2406&amp;lt;/tt&amp;gt; when you first log in, and run &amp;lt;tt&amp;gt;save2406&amp;lt;/tt&amp;gt; just before logging out.  If you don&#039;t do this, you will &#039;&#039;&#039;erase&#039;&#039;&#039; the work that you had done previously when you save.&lt;br /&gt;
&lt;br /&gt;
If you forgot to restore and you want to save, try running this:&lt;br /&gt;
&lt;br /&gt;
   rsync -a -v --progress ~/ &amp;lt;SCS username&amp;gt;@access.scs.carleton.ca:COMP2406/&lt;br /&gt;
&lt;br /&gt;
This is the same as the &amp;lt;tt&amp;gt;save2406&amp;lt;/tt&amp;gt; command minus the options (--delete and --force) that deletes files in the destination that don&#039;t exist in the source.  As a check, you may want to add the &amp;lt;tt&amp;gt;-n&amp;lt;/tt&amp;gt; option to do a dry run.&lt;br /&gt;
&lt;br /&gt;
===Running the VM on your own machines===&lt;br /&gt;
&lt;br /&gt;
If you want to run the VM appliance on your own system (running essentially any desktop operating system you want), just download the [http://homeostasis.scs.carleton.ca/~soma/VMs/COMP%202406,%20Winter%202016.ova virtual appliance file] and import into [http://www.virtualbox.org VirtualBox] or VMware Workstation/Fusion ([https://secure.scs.carleton.ca/vmware/ free to Carleton SCS students]).  The SHA1 hash of this file is:&lt;br /&gt;
&lt;br /&gt;
    97fc4de4544505178b580d27487085a20961e91e [http://homeostasis.scs.carleton.ca/~soma/VMs/COMP%202406,%20Winter%202016.ova COMP 2406, Winter 2016.ova]&lt;br /&gt;
&lt;br /&gt;
On Windows you can compute this hash for your downloaded file using the command &amp;lt;a href=&amp;quot;http://support.microsoft.com/kb/889768&amp;quot;&amp;gt;&amp;lt;tt&amp;gt;FCIV -sha1 COMP 2406 &amp;amp; 3000, Fall 2015.ova&amp;lt;/tt&amp;gt;&amp;lt;/a&amp;gt;.  If the hash is different from above, your download has been corrupted.&lt;br /&gt;
&lt;br /&gt;
If your virtualization platform is not VirtualBox, you&#039;ll need to:&lt;br /&gt;
* Have the VM platform ignore any errors in the structure of the appliance found during the import process;&lt;br /&gt;
* Uninstall the VirtualBox guest additions by typing starting a terminal application and running&lt;br /&gt;
   sudo /opt/VBoxGuestAdditions-*/uninstall.sh&lt;br /&gt;
* Install your platform&#039;s own Linux guest additions, if available.&lt;br /&gt;
&lt;br /&gt;
===Configuring Linux===&lt;br /&gt;
&lt;br /&gt;
If you already run Linux and you want to use the same packages we do in class, you should do the following:&lt;br /&gt;
&lt;br /&gt;
* Install the latest node.js version using [https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager a package manager].  (You generally don&#039;t use the version that comes with your distribution, it is probably too old.)&lt;br /&gt;
* Install [http://www.mongodb.org/ mongoDB] - it probably goes by mongodb in your package manager.  The version doesn&#039;t matter too much.&lt;br /&gt;
&lt;br /&gt;
Note that the binary of the node.js executable may be &amp;lt;tt&amp;gt;node&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;nodejs&amp;lt;/tt&amp;gt;, or something similar.&lt;br /&gt;
&lt;br /&gt;
That&#039;s it!&lt;br /&gt;
&lt;br /&gt;
===Configuring Windows===&lt;br /&gt;
&lt;br /&gt;
It is also possible to do everything in this class in native Windows.  Here are some tips on getting things running.&lt;br /&gt;
&lt;br /&gt;
* You can install the [https://nodejs.org/en/download/ official Node.js package] to get basic node and npm functionality.&lt;br /&gt;
* See [[Run MongoDB on Windows]].&lt;br /&gt;
* If you want to run Emacs on Windows, look at the [[Running Emacs on Windows|following tips]].&lt;br /&gt;
* [https://atom.io/ Atom] is a another popular free GUI text editor.&lt;br /&gt;
&lt;br /&gt;
===Configuring Mac OS X===&lt;br /&gt;
&lt;br /&gt;
It is possible, and recommended, to configure Node and mongoDB to run on your Mac.&lt;br /&gt;
&lt;br /&gt;
====Homebrew method (recommended)====&lt;br /&gt;
Homebrew is a package manager for OS X that works similarly to Linux-style package managers like &amp;lt;tt&amp;gt;apt&amp;lt;/tt&amp;gt;. Homebrew provides access to thousands of Linux and BSD packages to install natively on your Mac. You have a perfectly capable UNIX system in front of you. Make good use of it!&lt;br /&gt;
&lt;br /&gt;
* Install [http://brew.sh/ Homebrew] (copy the installation text on that page to Terminal.app)&lt;br /&gt;
* Install Node and mongoDB&lt;br /&gt;
&lt;br /&gt;
Run the following commands in your terminal:&lt;br /&gt;
&lt;br /&gt;
    brew update&lt;br /&gt;
    brew install node&lt;br /&gt;
    brew install mongo&lt;br /&gt;
&lt;br /&gt;
That&#039;s it!&lt;br /&gt;
&lt;br /&gt;
====Manual method====&lt;br /&gt;
Alternatively, you can download and install Node and mongo directly.&lt;br /&gt;
&lt;br /&gt;
* Download and install the &#039;&#039;Mac OS X Installer&#039;&#039; from [https://nodejs.org/en/download/stable/ the download page].&lt;br /&gt;
* Download the binaries from [https://www.mongodb.org/downloads#production MongoDB&#039;s download page]&lt;br /&gt;
* Follow [https://docs.mongodb.org/manual/tutorial/install-mongodb-on-os-x/#install-mongodb-community-edition-manually these instructions]&lt;br /&gt;
&lt;br /&gt;
==Resources==&lt;br /&gt;
&lt;br /&gt;
In general any text published by [http://www.oreilly.com/ O&#039;Reilly] is worth your time.  Many (but not all) of the texts below are published by them.&lt;br /&gt;
&lt;br /&gt;
===JavaScript===&lt;br /&gt;
&lt;br /&gt;
[http://shop.oreilly.com/product/9780596517748.do JavaScript: The Good Parts] by Douglas Crockford is an excellent text on JavaScript and it is short.  We highly suggest you obtain a copy and read it.&lt;br /&gt;
&lt;br /&gt;
The easiest way to get started with JavaScript and get basic understanding of web technologies is to go through the interactive lessons on [http://codeacademy.com Code Academy].  I suggest you go through their JavaScript, Web Fundamentals, and jQuery tracks.  They shouldn&#039;t take you very long to do given that you already know how to program.&lt;br /&gt;
&lt;br /&gt;
Crockford also has a lot of online resources on JavaScript, including videos of talks he&#039;s given that cover much of the content in his book.  Look at his [http://javascript.crockford.com/ JavaScript page] and this [http://yuiblog.com/crockford/ page of his videos].&lt;br /&gt;
&lt;br /&gt;
Another good book is [http://eloquentjavascript.net/ Eloquent JavaScript: A Modern Introduction to Programming] by Marijn Haverbeke.  A version of this book is available online for free.  The for-sale version is apparently updated and edited.&lt;br /&gt;
&lt;br /&gt;
The standard reference for JavaScript is [http://shop.oreilly.com/product/9780596805531.do JavaScript: The Definitive Guide] by David Flanagan.  It is a big book, but it is comprehensive.&lt;br /&gt;
&lt;br /&gt;
===Node===&lt;br /&gt;
&lt;br /&gt;
[http://shop.oreilly.com/product/0636920024606.do Learning Node] by Shelley Powers is the recommended resource for learning about Node.&lt;br /&gt;
&lt;br /&gt;
Another introduction to node.js is [http://www.nodebeginner.org/ The Node Beginner Book] by Manuel Kiessling.&lt;br /&gt;
&lt;br /&gt;
[http://evanhahn.com/understanding-express-js/ This page by Evan Hahn] has a good overview of the express/connect/node software stack.&lt;br /&gt;
&lt;br /&gt;
===MongoDB===&lt;br /&gt;
&lt;br /&gt;
[http://shop.oreilly.com/product/0636920028031.do MongoDB: The Definitive Guide] by Kristina Chodorow (1st or 2nd ed) is the recommended text for learning more about MongoDB.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Lecture Notes Guidelines==&lt;br /&gt;
&lt;br /&gt;
As specified in the course outline you can get up to 6% extra credit on your final grade (2% per time) for writing up notes from lecture.  Here are the guidelines for those notes.&lt;br /&gt;
&lt;br /&gt;
Lee Croft (LeeCroft at cmail.carleton.ca) will be handling course notes.  Please contact him if you would like to volunteer.  Note that you should email him in advance and he will give you the next available slot.  There are over 200 students in class and only 20 lectures so opportunities may go fast!&lt;br /&gt;
&lt;br /&gt;
Lee or Anil will set you up with an account on this wiki.  You&#039;ll enter your initial draft notes here and then work with Lee to make sure they are of sufficient quality.  This may require a few rounds of revisions; however, if you follow the guidelines below it shouldn&#039;t be too bad.&lt;br /&gt;
&lt;br /&gt;
You should plan on organizing your notes as follows:&lt;br /&gt;
* Organize them in at least the following sections: Topics &amp;amp; Readings, Audio &amp;amp; Video, and Notes.&lt;br /&gt;
* The Topics &amp;amp; Readings section lists the main topics covered in the course, e.g. &amp;quot;Scoping rules in JavaScript&amp;quot;.  Please use an unordered bulleted list (using *&#039;s in wiki markup).  In this section also list readings relevant to the lecture that were mentioned in class.&lt;br /&gt;
* Leave the Audio and Video section blank.  Anil will fill this out.&lt;br /&gt;
* Put your notes in the Notes section.&lt;br /&gt;
&lt;br /&gt;
Use (nested) lists if appropriate for the notes; however, please have some text that isn&#039;t bulleted.  Please try to make the notes even if you did not attend lecture; however, you don&#039;t need to cover every small bit of information that was covered.  In particular the notes do not need to include digressions into topics only tangentially related to the course.  Complete sentences are welcome but not required.&lt;/div&gt;</summary>
		<author><name>Zero</name></author>
	</entry>
	<entry>
		<id>https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_2&amp;diff=20516</id>
		<title>WebFund 2016W Lecture 2</title>
		<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_2&amp;diff=20516"/>
		<updated>2016-01-15T03:16:50Z</updated>

		<summary type="html">&lt;p&gt;Zero: Typo. Thanks Lee.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Video==&lt;br /&gt;
&lt;br /&gt;
The video from the lecture given on January 12, 2016 [http://homeostasis.scs.carleton.ca/~soma/webfund-2016w/lectures/comp2406-2016w-lec02-12Jan2016.mp4 is now available].&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&lt;br /&gt;
===In-class Notes===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Lecture #2&lt;br /&gt;
----------&lt;br /&gt;
JavaScript&lt;br /&gt;
&lt;br /&gt;
* no declared types&lt;br /&gt;
  - strings&lt;br /&gt;
  - objects&lt;br /&gt;
  - arrays&lt;br /&gt;
  - numbers (floats)&lt;br /&gt;
  - boolean&lt;br /&gt;
&lt;br /&gt;
With Node&lt;br /&gt;
 - asynchronous (non-blocking) I/O&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Student Notes===&lt;br /&gt;
&lt;br /&gt;
* Administration Reminders&lt;br /&gt;
** [[Fundamentals_of_Web_Applications:_Winter_2016_Course_Outline#Course_Information|Office hours have been added.]]&lt;br /&gt;
** [[Fundamentals_of_Web_Applications:_Winter_2016_Course_Outline#Grading|Midterm date has been tentatively created.]]&lt;br /&gt;
** [[WebFund_2016W:_Assignment_1|Assignment #1 has been posted.]]&lt;br /&gt;
&lt;br /&gt;
====JavaScript: As a Language====&lt;br /&gt;
&lt;br /&gt;
* JavaScript has &#039;&#039;&#039;nothing&#039;&#039;&#039; to do with Java.&lt;br /&gt;
** Why is it even called JavaScript then? At first it wasn&#039;t; it was developed as Mocha, changed to LiveScript and then finally renamed to JavaScript due to an agreement with Sun (acquired by Oracle).&amp;lt;ref&amp;gt;[http://stackoverflow.com/a/2475528]&amp;lt;/ref&amp;gt;&lt;br /&gt;
* The only similarity between Java/JavaScript is some of the syntax, but that can be said for a lot of languages.&lt;br /&gt;
&lt;br /&gt;
* What&#039;s different about JavaScript?&lt;br /&gt;
** No declared data types; it&#039;s a &amp;quot;loose&amp;quot; language.&lt;br /&gt;
*** Instead of int i = 0, it&#039;s simply var i = 0.&lt;br /&gt;
** There&#039;s seven data types&amp;lt;ref&amp;gt;[https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures]&amp;lt;/ref&amp;gt; (examples in brackets)&lt;br /&gt;
*** Boolean (true, false)&lt;br /&gt;
*** Number (3.1337, 1337, etc. There&#039;s no integer or long, everything is a float)&lt;br /&gt;
*** String (&amp;quot;Dave&amp;quot;)&lt;br /&gt;
*** Symbol&lt;br /&gt;
*** Object&lt;br /&gt;
*** Null&lt;br /&gt;
*** Undefined&lt;br /&gt;
&lt;br /&gt;
====How should I learn JavaScript?====&lt;br /&gt;
&lt;br /&gt;
* Practice! While attending the lectures is a great start, you &#039;&#039;will&#039;&#039; have to practice outside of class. This will not be graded, but will ultimately affect your performance in the course (and in the workplace).&lt;br /&gt;
** [https://www.codecademy.com/learn/javascript Codecademy] has a lot of good resources for beginners.&lt;br /&gt;
** For more advanced students, check on [https://github.com/search?l=javascript&amp;amp;o=desc&amp;amp;q=stars%3A%3E1&amp;amp;s=stars&amp;amp;type=Repositories GitHub] to see if there&#039;s any projects you&#039;re interested in contributing to. If you plan to work in web development, it&#039;s very likely you will be asked in an interview if you&#039;ve contributed to any open source projects (having a good portfolio will help a &#039;&#039;lot&#039;&#039; in getting a first job).&lt;br /&gt;
&lt;br /&gt;
====Working with Variables====&lt;br /&gt;
&lt;br /&gt;
If you&#039;ve previously worked with Java, the first large difference you&#039;ve noticed is likely that variables are very &amp;quot;flexible&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
* If you attempt to use a variable that has not been declared, you will &#039;&#039;&#039;not&#039;&#039;&#039; get a compiler error. Instead, the type &amp;lt;tt&amp;gt;undefined&amp;lt;/tt&amp;gt; will be returned. This can making debugging a bit of a challenge!&lt;br /&gt;
* Likewise with most languages, a symbol (e.g., &amp;lt;tt&amp;gt;x&amp;lt;/tt&amp;gt;) can only reference &#039;&#039;one&#039;&#039; object.&lt;br /&gt;
* You can have several types of data inside  single object (e.g., &amp;lt;tt&amp;gt;x.y&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;x.y.z&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;x.y.x.qwerty&amp;lt;/tt&amp;gt;, etc).&lt;br /&gt;
* &amp;lt;tt&amp;gt;x.size&amp;lt;/tt&amp;gt; (dot notation) is the same as &amp;lt;tt&amp;gt;x[&amp;quot;size&amp;quot;]&amp;lt;/tt&amp;gt; (array notation).&lt;br /&gt;
* JavaScript engines use a garbage collector, so you do not need to manually deallocate memory (in C you need to). Unlike Java, you can &amp;quot;reuse&amp;quot; a variable name and use a completely different type; e.g. creating &amp;lt;tt&amp;gt;var x = 1337&amp;lt;/tt&amp;gt; and then &amp;lt;tt&amp;gt;x = &amp;quot;Dave&amp;quot;&amp;lt;/tt&amp;gt; later is completely valid.&lt;br /&gt;
&lt;br /&gt;
====Regular Expressions (Regex)====&lt;br /&gt;
&lt;br /&gt;
While this topic is technically outside of the course material, you will likely need to use it in some assignments. Regex is the same across different languages, so you will not need to relearn it all for every language.&lt;br /&gt;
&lt;br /&gt;
https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions&lt;br /&gt;
&lt;br /&gt;
====Node.js====&lt;br /&gt;
&lt;br /&gt;
Node.js is designed to provide a server side environment of JavaScript. Instead of using Google&#039;s V8 JavaScript inside Chrome/Chromium, Node.js uses the V8 engine directly. Because Node.js is meant to be used outside of the browser, there&#039;s some slight differences.&lt;br /&gt;
&lt;br /&gt;
* Contains a package manager called npm to manage dependencies (libraries).&lt;br /&gt;
* Has specialized libraries for networking, file system access, etc that you usually wouldn&#039;t find in a browser (mostly for security reasons).&lt;br /&gt;
* Has no default graphic frontend such as WebKit (although there are libraries to provide that if you wish).&lt;br /&gt;
&lt;br /&gt;
=====Getting started with Node.js=====&lt;br /&gt;
&lt;br /&gt;
To open up Read-Eval-Print-Loop (REPL), run &amp;lt;tt&amp;gt;node&amp;lt;/tt&amp;gt; in a terminal. For more details on setting your environment up, see [[WebFund_2016W:_Tutorial_1#Running_the_VM|Tutorial 1]]&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
{{Reflist}}&lt;/div&gt;</summary>
		<author><name>Zero</name></author>
	</entry>
	<entry>
		<id>https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_3&amp;diff=20510</id>
		<title>WebFund 2016W Lecture 3</title>
		<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_3&amp;diff=20510"/>
		<updated>2016-01-14T20:53:55Z</updated>

		<summary type="html">&lt;p&gt;Zero: Added in-class notes.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Notes==&lt;br /&gt;
&lt;br /&gt;
===In-class Notes===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Lecture 3&lt;br /&gt;
---------&lt;br /&gt;
What is the web?&lt;br /&gt;
&lt;br /&gt;
Web != Internet&lt;br /&gt;
&lt;br /&gt;
So, what is the Internet?!&lt;br /&gt;
&lt;br /&gt;
Network of networks&lt;br /&gt;
&lt;br /&gt;
What is a network?&lt;br /&gt;
&lt;br /&gt;
Networks allow computers to talk to each other&lt;br /&gt;
&lt;br /&gt;
WiFi, Ethernet, LTE - different standards for computer networks&lt;br /&gt;
&lt;br /&gt;
Layers of networking (OSI)&lt;br /&gt;
* Physical layer&lt;br /&gt;
* Data link layer&lt;br /&gt;
* Network layer &amp;lt;---- &lt;br /&gt;
* Application layer (and such)&lt;br /&gt;
&lt;br /&gt;
Internet Protocol (IP)&lt;br /&gt;
 - packet-based protocol (NOT a stream or continuous protocol)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Old POTS&lt;br /&gt;
 - wire from your house to a switching station&lt;br /&gt;
 - wires between switching stations A and B&lt;br /&gt;
 ...&lt;br /&gt;
 ...&lt;br /&gt;
 - wires between switching station Y to Z&lt;br /&gt;
 - wire from switching station to house&lt;br /&gt;
&lt;br /&gt;
Packet switching networks multiplex physical wires over time. (Multiple communication connections over one wire by them taking turns.)&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;turn&amp;quot; is the packet&lt;br /&gt;
&lt;br /&gt;
IP protocol is a &amp;quot;best effort&amp;quot; protocol. NO error correction or retransmission.&lt;br /&gt;
&lt;br /&gt;
TCP means Transmission Control Protocol&lt;br /&gt;
turns packets into a reliable data data stream&lt;br /&gt;
&lt;br /&gt;
Network Firewalls block &amp;quot;unwanted traffic&amp;quot;&lt;br /&gt;
 - really, block all those protocols that aren&#039;t safe on the open Internet&lt;br /&gt;
&lt;br /&gt;
TCP adds a &amp;quot;port&amp;quot; to the IP address&lt;br /&gt;
 - the port identifies which program to talk to&lt;br /&gt;
 - some are ephemeral (temporary)&lt;br /&gt;
 - others are &amp;quot;well known&amp;quot;, meaning protocol on that port is standardized&lt;br /&gt;
&lt;br /&gt;
Port 25 is for SMTP (email)&lt;br /&gt;
80: HTTP&lt;br /&gt;
443: HTTPS&lt;br /&gt;
22: ssh&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Web is transmitted over HTTP&lt;br /&gt;
&lt;br /&gt;
Major HTTP commands&lt;br /&gt;
 * GET: get documents from server&lt;br /&gt;
  - can be CACHED&lt;br /&gt;
 * POST: send form contents to server&lt;br /&gt;
  - are not cached&lt;br /&gt;
&lt;br /&gt;
You can GET almost anything&lt;br /&gt;
 - MS Word .doc&lt;br /&gt;
 - tiff&lt;br /&gt;
 - PDF&lt;br /&gt;
&lt;br /&gt;
But the real web is&lt;br /&gt;
 - JPEG, GIF, PNG for images&lt;br /&gt;
 - CSS for style sheets&lt;br /&gt;
 - HTML for content&lt;br /&gt;
 - JavaScript for code&lt;br /&gt;
&lt;br /&gt;
.swf is flash.  Flash is not a web standard.  AVOID&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Zero</name></author>
	</entry>
	<entry>
		<id>https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_2&amp;diff=20507</id>
		<title>WebFund 2016W Lecture 2</title>
		<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_2&amp;diff=20507"/>
		<updated>2016-01-14T15:50:44Z</updated>

		<summary type="html">&lt;p&gt;Zero: Added bit about garbage collectors.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Video==&lt;br /&gt;
&lt;br /&gt;
The video from the lecture given on January 12, 2016 [http://homeostasis.scs.carleton.ca/~soma/webfund-2016w/lectures/comp2406-2016w-lec02-12Jan2016.mp4 is now available].&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&lt;br /&gt;
===In-class Notes===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Lecture #2&lt;br /&gt;
----------&lt;br /&gt;
JavaScript&lt;br /&gt;
&lt;br /&gt;
* no declared types&lt;br /&gt;
  - strings&lt;br /&gt;
  - objects&lt;br /&gt;
  - arrays&lt;br /&gt;
  - numbers (floats)&lt;br /&gt;
  - boolean&lt;br /&gt;
&lt;br /&gt;
With Node&lt;br /&gt;
 - asynchronous (non-blocking) I/O&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Student Notes===&lt;br /&gt;
&lt;br /&gt;
* Administration Reminders&lt;br /&gt;
** [[Fundamentals_of_Web_Applications:_Winter_2016_Course_Outline#Course_Information|Office hours have been added.]]&lt;br /&gt;
** [[Fundamentals_of_Web_Applications:_Winter_2016_Course_Outline#Grading|Midterm date has been tentatively created.]]&lt;br /&gt;
** [[WebFund_2016W:_Assignment_1|Assignment #1 has been posted.]]&lt;br /&gt;
&lt;br /&gt;
====JavaScript: As a Language====&lt;br /&gt;
&lt;br /&gt;
* JavaScript has &#039;&#039;&#039;nothing&#039;&#039;&#039; to do with Java.&lt;br /&gt;
** Why is it even called JavaScript then? At first it wasn&#039;t; it was developed as Mocha, changed to LiveScript and then finally renamed to JavaScript due to an agreement with Sun (acquired by Oracle).&amp;lt;ref&amp;gt;[http://stackoverflow.com/a/2475528]&amp;lt;/ref&amp;gt;&lt;br /&gt;
* The only similarity between Java/JavaScript is some of the syntax, but that can be said for a lot of languages.&lt;br /&gt;
&lt;br /&gt;
* What&#039;s different about JavaScript?&lt;br /&gt;
** No declared data types; it&#039;s a &amp;quot;loose&amp;quot; language.&lt;br /&gt;
*** Instead of int i = 0, it&#039;s simply var i = 0.&lt;br /&gt;
** There&#039;s seven data types&amp;lt;ref&amp;gt;[https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures]&amp;lt;/ref&amp;gt; (examples in brackets)&lt;br /&gt;
*** Boolean (true, false)&lt;br /&gt;
*** Number (3.1337, 1337, etc. There&#039;s no integer or long, everything is a float)&lt;br /&gt;
*** String (&amp;quot;Dave&amp;quot;)&lt;br /&gt;
*** Symbol&lt;br /&gt;
*** Object&lt;br /&gt;
*** Null&lt;br /&gt;
*** Undefined&lt;br /&gt;
&lt;br /&gt;
====How should I learn JavaScript?====&lt;br /&gt;
&lt;br /&gt;
* Practice! While attending the lectures is a great start, you &#039;&#039;will&#039;&#039; have to practice outside of class. This will not be graded, but will ultimately affect your performance in the course (and in the workplace).&lt;br /&gt;
** [https://www.codecademy.com/learn/javascript Codecademy] has a lot of good resources for beginners.&lt;br /&gt;
** For more advanced students, check on [https://github.com/search?l=javascript&amp;amp;o=desc&amp;amp;q=stars%3A%3E1&amp;amp;s=stars&amp;amp;type=Repositories GitHub] to see if there&#039;s any projects you&#039;re interested in contributing to. If you plan to work in web development, it&#039;s very likely you will be asked in an interview if you&#039;ve contributed to any open source projects (having a good portfolio will help a &#039;&#039;lot&#039;&#039; in getting a first job).&lt;br /&gt;
&lt;br /&gt;
====Working with Variables====&lt;br /&gt;
&lt;br /&gt;
If you&#039;ve previously worked with Java, the first large difference you&#039;ve noticed is likely that variables are very &amp;quot;flexible&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
* If you attempt to use a variable that has not been declared, you will &#039;&#039;&#039;not&#039;&#039;&#039; get a compiler error. Instead, the type &amp;lt;tt&amp;gt;undefined&amp;lt;/tt&amp;gt; will be returned. This can making debugging a bit of a challenge!&lt;br /&gt;
* Likewise with most languages, a symbol (e.g., &amp;lt;tt&amp;gt;x&amp;lt;/tt&amp;gt;) can only reference &#039;&#039;one&#039;&#039; object.&lt;br /&gt;
* You can have several types of data inside  single object (e.g., &amp;lt;tt&amp;gt;x.y&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;x.y.z&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;x.y.x.qwerty&amp;lt;/tt&amp;gt;, etc).&lt;br /&gt;
* &amp;lt;tt&amp;gt;x.size&amp;lt;/tt&amp;gt; (dot notation) is the same as &amp;lt;tt&amp;gt;x[&amp;quot;size&amp;quot;]&amp;lt;/tt&amp;gt; (array notation).&lt;br /&gt;
* JavaScript engines use a garbage collector, so you do not need to manually deallocate memory (in C you need to). Unlike Java, you can &amp;quot;reuse&amp;quot; a variable name and use a completely different type; e.g. creating &amp;lt;tt&amp;gt;var x = 1337&amp;lt;/tt&amp;gt; and then &amp;lt;tt&amp;gt;x = &amp;quot;Dave&amp;quot;&amp;lt;/tt&amp;gt; later is completely valid.&lt;br /&gt;
&lt;br /&gt;
====Regular Expressions (Regex)====&lt;br /&gt;
&lt;br /&gt;
While this topic is technically outside of the course material, you will likely need to use it in some assignments. Regex is the same across different languages, so you will not need to relearn it all for every language.&lt;br /&gt;
&lt;br /&gt;
https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions&lt;br /&gt;
&lt;br /&gt;
====Node.js====&lt;br /&gt;
&lt;br /&gt;
Node.js is designed to provide a server side environment of JavaScript. Instead of using Google&#039;s V8 JavaScript inside Chrome/Chromium, Node.js uses the V8 engine directly. Because Node.js is meant to be used outside of the browser, there&#039;s some slightly differences.&lt;br /&gt;
&lt;br /&gt;
* Contains a package manager called npm to manage dependencies (libraries).&lt;br /&gt;
* Has specialized libraries for networking, file system access, etc that you usually wouldn&#039;t find in a browser (mostly for security reasons).&lt;br /&gt;
* Has no default graphic frontend such as WebKit (although there are libraries to provide that if you wish).&lt;br /&gt;
&lt;br /&gt;
=====Getting started with Node.js=====&lt;br /&gt;
&lt;br /&gt;
To open up Read-Eval-Print-Loop (REPL), run &amp;lt;tt&amp;gt;node&amp;lt;/tt&amp;gt; in a terminal. For more details on setting your environment up, see [[WebFund_2016W:_Tutorial_1#Running_the_VM|Tutorial 1]]&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
{{Reflist}}&lt;/div&gt;</summary>
		<author><name>Zero</name></author>
	</entry>
	<entry>
		<id>https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_2&amp;diff=20506</id>
		<title>WebFund 2016W Lecture 2</title>
		<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_2&amp;diff=20506"/>
		<updated>2016-01-14T15:46:03Z</updated>

		<summary type="html">&lt;p&gt;Zero: Typo fix.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Video==&lt;br /&gt;
&lt;br /&gt;
The video from the lecture given on January 12, 2016 [http://homeostasis.scs.carleton.ca/~soma/webfund-2016w/lectures/comp2406-2016w-lec02-12Jan2016.mp4 is now available].&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&lt;br /&gt;
===In-class Notes===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Lecture #2&lt;br /&gt;
----------&lt;br /&gt;
JavaScript&lt;br /&gt;
&lt;br /&gt;
* no declared types&lt;br /&gt;
  - strings&lt;br /&gt;
  - objects&lt;br /&gt;
  - arrays&lt;br /&gt;
  - numbers (floats)&lt;br /&gt;
  - boolean&lt;br /&gt;
&lt;br /&gt;
With Node&lt;br /&gt;
 - asynchronous (non-blocking) I/O&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Student Notes===&lt;br /&gt;
&lt;br /&gt;
* Administration Reminders&lt;br /&gt;
** [[Fundamentals_of_Web_Applications:_Winter_2016_Course_Outline#Course_Information|Office hours have been added.]]&lt;br /&gt;
** [[Fundamentals_of_Web_Applications:_Winter_2016_Course_Outline#Grading|Midterm date has been tentatively created.]]&lt;br /&gt;
** [[WebFund_2016W:_Assignment_1|Assignment #1 has been posted.]]&lt;br /&gt;
&lt;br /&gt;
====JavaScript: As a Language====&lt;br /&gt;
&lt;br /&gt;
* JavaScript has &#039;&#039;&#039;nothing&#039;&#039;&#039; to do with Java.&lt;br /&gt;
** Why is it even called JavaScript then? At first it wasn&#039;t; it was developed as Mocha, changed to LiveScript and then finally renamed to JavaScript due to an agreement with Sun (acquired by Oracle).&amp;lt;ref&amp;gt;[http://stackoverflow.com/a/2475528]&amp;lt;/ref&amp;gt;&lt;br /&gt;
* The only similarity between Java/JavaScript is some of the syntax, but that can be said for a lot of languages.&lt;br /&gt;
&lt;br /&gt;
* What&#039;s different about JavaScript?&lt;br /&gt;
** No declared data types; it&#039;s a &amp;quot;loose&amp;quot; language.&lt;br /&gt;
*** Instead of int i = 0, it&#039;s simply var i = 0.&lt;br /&gt;
** There&#039;s seven data types&amp;lt;ref&amp;gt;[https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures]&amp;lt;/ref&amp;gt; (examples in brackets)&lt;br /&gt;
*** Boolean (true, false)&lt;br /&gt;
*** Number (3.1337, 1337, etc. There&#039;s no integer or long, everything is a float)&lt;br /&gt;
*** String (&amp;quot;Dave&amp;quot;)&lt;br /&gt;
*** Symbol&lt;br /&gt;
*** Object&lt;br /&gt;
*** Null&lt;br /&gt;
*** Undefined&lt;br /&gt;
&lt;br /&gt;
====How should I learn JavaScript?====&lt;br /&gt;
&lt;br /&gt;
* Practice! While attending the lectures is a great start, you &#039;&#039;will&#039;&#039; have to practice outside of class. This will not be graded, but will ultimately affect your performance in the course (and in the workplace).&lt;br /&gt;
** [https://www.codecademy.com/learn/javascript Codecademy] has a lot of good resources for beginners.&lt;br /&gt;
** For more advanced students, check on [https://github.com/search?l=javascript&amp;amp;o=desc&amp;amp;q=stars%3A%3E1&amp;amp;s=stars&amp;amp;type=Repositories GitHub] to see if there&#039;s any projects you&#039;re interested in contributing to. If you plan to work in web development, it&#039;s very likely you will be asked in an interview if you&#039;ve contributed to any open source projects (having a good portfolio will help a &#039;&#039;lot&#039;&#039; in getting a first job).&lt;br /&gt;
&lt;br /&gt;
====Working with Variables====&lt;br /&gt;
&lt;br /&gt;
If you&#039;ve previously worked with Java, the first large difference you&#039;ve noticed is likely that variables are very &amp;quot;flexible&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
* If you attempt to use a variable that has not been declared, you will &#039;&#039;&#039;not&#039;&#039;&#039; get a compiler error. Instead, the type &amp;lt;tt&amp;gt;undefined&amp;lt;/tt&amp;gt; will be returned. This can making debugging a bit of a challenge!&lt;br /&gt;
* Likewise with most languages, a symbol (e.g., &amp;lt;tt&amp;gt;x&amp;lt;/tt&amp;gt;) can only reference &#039;&#039;one&#039;&#039; object.&lt;br /&gt;
* You can have several types of data inside  single object (e.g., &amp;lt;tt&amp;gt;x.y&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;x.y.z&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;x.y.x.qwerty&amp;lt;/tt&amp;gt;, etc).&lt;br /&gt;
* &amp;lt;tt&amp;gt;x.size&amp;lt;/tt&amp;gt; (dot notation) is the same as &amp;lt;tt&amp;gt;x[&amp;quot;size&amp;quot;]&amp;lt;/tt&amp;gt; (array notation).&lt;br /&gt;
&lt;br /&gt;
====Regular Expressions (Regex)====&lt;br /&gt;
&lt;br /&gt;
While this topic is technically outside of the course material, you will likely need to use it in some assignments. Regex is the same across different languages, so you will not need to relearn it all for every language.&lt;br /&gt;
&lt;br /&gt;
https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions&lt;br /&gt;
&lt;br /&gt;
====Node.js====&lt;br /&gt;
&lt;br /&gt;
Node.js is designed to provide a server side environment of JavaScript. Instead of using Google&#039;s V8 JavaScript inside Chrome/Chromium, Node.js uses the V8 engine directly. Because Node.js is meant to be used outside of the browser, there&#039;s some slightly differences.&lt;br /&gt;
&lt;br /&gt;
* Contains a package manager called npm to manage dependencies (libraries).&lt;br /&gt;
* Has specialized libraries for networking, file system access, etc that you usually wouldn&#039;t find in a browser (mostly for security reasons).&lt;br /&gt;
* Has no default graphic frontend such as WebKit (although there are libraries to provide that if you wish).&lt;br /&gt;
&lt;br /&gt;
=====Getting started with Node.js=====&lt;br /&gt;
&lt;br /&gt;
To open up Read-Eval-Print-Loop (REPL), run &amp;lt;tt&amp;gt;node&amp;lt;/tt&amp;gt; in a terminal. For more details on setting your environment up, see [[WebFund_2016W:_Tutorial_1#Running_the_VM|Tutorial 1]]&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
{{Reflist}}&lt;/div&gt;</summary>
		<author><name>Zero</name></author>
	</entry>
	<entry>
		<id>https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_2&amp;diff=20505</id>
		<title>WebFund 2016W Lecture 2</title>
		<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_2&amp;diff=20505"/>
		<updated>2016-01-14T15:44:55Z</updated>

		<summary type="html">&lt;p&gt;Zero: Added section on Node.js.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Video==&lt;br /&gt;
&lt;br /&gt;
The video from the lecture given on January 12, 2016 [http://homeostasis.scs.carleton.ca/~soma/webfund-2016w/lectures/comp2406-2016w-lec02-12Jan2016.mp4 is now available].&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&lt;br /&gt;
===In-class Notes===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Lecture #2&lt;br /&gt;
----------&lt;br /&gt;
JavaScript&lt;br /&gt;
&lt;br /&gt;
* no declared types&lt;br /&gt;
  - strings&lt;br /&gt;
  - objects&lt;br /&gt;
  - arrays&lt;br /&gt;
  - numbers (floats)&lt;br /&gt;
  - boolean&lt;br /&gt;
&lt;br /&gt;
With Node&lt;br /&gt;
 - asynchronous (non-blocking) I/O&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Student Notes===&lt;br /&gt;
&lt;br /&gt;
* Administration Reminders&lt;br /&gt;
** [[Fundamentals_of_Web_Applications:_Winter_2016_Course_Outline#Course_Information|Office hours have been added.]]&lt;br /&gt;
** [[Fundamentals_of_Web_Applications:_Winter_2016_Course_Outline#Grading|Midterm date has been tentatively created.]]&lt;br /&gt;
** [[WebFund_2016W:_Assignment_1|Assignment #1 has been posted.]]&lt;br /&gt;
&lt;br /&gt;
====JavaScript: As a Language====&lt;br /&gt;
&lt;br /&gt;
* JavaScript has &#039;&#039;&#039;nothing&#039;&#039;&#039; to do with Java.&lt;br /&gt;
** Why is it even called JavaScript then? At first it wasn&#039;t; it was developed as Mocha, changed to LiveScript and then finally renamed to JavaScript due to an agreement with Sun (acquired by Oracle).&amp;lt;ref&amp;gt;[http://stackoverflow.com/a/2475528]&amp;lt;/ref&amp;gt;&lt;br /&gt;
* The only similarity between Java/JavaScript is some of the syntax, but that can be said for a lot of languages.&lt;br /&gt;
&lt;br /&gt;
* What&#039;s different about JavaScript?&lt;br /&gt;
** No declared data types; it&#039;s a &amp;quot;loose&amp;quot; language.&lt;br /&gt;
*** Instead of int i = 0, it&#039;s simply var i = 0.&lt;br /&gt;
** There&#039;s seven data types&amp;lt;ref&amp;gt;[https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures]&amp;lt;/ref&amp;gt; (examples in brackets)&lt;br /&gt;
*** Boolean (true, false)&lt;br /&gt;
*** Number (3.1337, 1337, etc. There&#039;s no integer or long, everything is a float)&lt;br /&gt;
*** String (&amp;quot;Dave&amp;quot;)&lt;br /&gt;
*** Symbol&lt;br /&gt;
*** Object&lt;br /&gt;
*** Null&lt;br /&gt;
*** Undefined&lt;br /&gt;
&lt;br /&gt;
====How should I learn JavaScript?====&lt;br /&gt;
&lt;br /&gt;
* Practice! While attending the lectures is a great start, you &#039;&#039;will&#039;&#039; have to practice outside of class. This will not be graded, but will ultimately affect your performance in the course (and in the workplace).&lt;br /&gt;
** [https://www.codecademy.com/learn/javascript Codecademy] has a lot of good resources for beginners.&lt;br /&gt;
** For more advanced students, check on [https://github.com/search?l=javascript&amp;amp;o=desc&amp;amp;q=stars%3A%3E1&amp;amp;s=stars&amp;amp;type=Repositories GitHub] to see if there&#039;s any projects you&#039;re interested in contribution to. If you plan to work in web development, it&#039;s very likely you will be asked in an interview if you&#039;ve contributed to any open source projects (having a good portfolio will help a &#039;&#039;lot&#039;&#039; in getting a first job).&lt;br /&gt;
&lt;br /&gt;
====Working with Variables====&lt;br /&gt;
&lt;br /&gt;
If you&#039;ve previously worked with Java, the first large difference you&#039;ve noticed is likely that variables are very &amp;quot;flexible&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
* If you attempt to use a variable that has not been declared, you will &#039;&#039;&#039;not&#039;&#039;&#039; get a compiler error. Instead, the type &amp;lt;tt&amp;gt;undefined&amp;lt;/tt&amp;gt; will be returned. This can making debugging a bit of a challenge!&lt;br /&gt;
* Likewise with most languages, a symbol (e.g., &amp;lt;tt&amp;gt;x&amp;lt;/tt&amp;gt;) can only reference &#039;&#039;one&#039;&#039; object.&lt;br /&gt;
* You can have several types of data inside  single object (e.g., &amp;lt;tt&amp;gt;x.y&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;x.y.z&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;x.y.x.qwerty&amp;lt;/tt&amp;gt;, etc).&lt;br /&gt;
* &amp;lt;tt&amp;gt;x.size&amp;lt;/tt&amp;gt; (dot notation) is the same as &amp;lt;tt&amp;gt;x[&amp;quot;size&amp;quot;]&amp;lt;/tt&amp;gt; (array notation).&lt;br /&gt;
&lt;br /&gt;
====Regular Expressions (Regex)====&lt;br /&gt;
&lt;br /&gt;
While this topic is technically outside of the course material, you will likely need to use it in some assignments. Regex is the same across different languages, so you will not need to relearn it all for every language.&lt;br /&gt;
&lt;br /&gt;
https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions&lt;br /&gt;
&lt;br /&gt;
====Node.js====&lt;br /&gt;
&lt;br /&gt;
Node.js is designed to provide a server side environment of JavaScript. Instead of using Google&#039;s V8 JavaScript inside Chrome/Chromium, Node.js uses the V8 engine directly. Because Node.js is meant to be used outside of the browser, there&#039;s some slightly differences.&lt;br /&gt;
&lt;br /&gt;
* Contains a package manager called npm to manage dependencies (libraries).&lt;br /&gt;
* Has specialized libraries for networking, file system access, etc that you usually wouldn&#039;t find in a browser (mostly for security reasons).&lt;br /&gt;
* Has no default graphic frontend such as WebKit (although there are libraries to provide that if you wish).&lt;br /&gt;
&lt;br /&gt;
=====Getting started with Node.js=====&lt;br /&gt;
&lt;br /&gt;
To open up Read-Eval-Print-Loop (REPL), run &amp;lt;tt&amp;gt;node&amp;lt;/tt&amp;gt; in a terminal. For more details on setting your environment up, see [[WebFund_2016W:_Tutorial_1#Running_the_VM|Tutorial 1]]&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
{{Reflist}}&lt;/div&gt;</summary>
		<author><name>Zero</name></author>
	</entry>
	<entry>
		<id>https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_2&amp;diff=20504</id>
		<title>WebFund 2016W Lecture 2</title>
		<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_2&amp;diff=20504"/>
		<updated>2016-01-14T15:31:24Z</updated>

		<summary type="html">&lt;p&gt;Zero: Added link.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Video==&lt;br /&gt;
&lt;br /&gt;
The video from the lecture given on January 12, 2016 [http://homeostasis.scs.carleton.ca/~soma/webfund-2016w/lectures/comp2406-2016w-lec02-12Jan2016.mp4 is now available].&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&lt;br /&gt;
===In-class Notes===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Lecture #2&lt;br /&gt;
----------&lt;br /&gt;
JavaScript&lt;br /&gt;
&lt;br /&gt;
* no declared types&lt;br /&gt;
  - strings&lt;br /&gt;
  - objects&lt;br /&gt;
  - arrays&lt;br /&gt;
  - numbers (floats)&lt;br /&gt;
  - boolean&lt;br /&gt;
&lt;br /&gt;
With Node&lt;br /&gt;
 - asynchronous (non-blocking) I/O&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Student Notes===&lt;br /&gt;
&lt;br /&gt;
* Administration Reminders&lt;br /&gt;
** [[Fundamentals_of_Web_Applications:_Winter_2016_Course_Outline#Course_Information|Office hours have been added.]]&lt;br /&gt;
** [[Fundamentals_of_Web_Applications:_Winter_2016_Course_Outline#Grading|Midterm date has been tentatively created.]]&lt;br /&gt;
** [[WebFund_2016W:_Assignment_1|Assignment #1 has been posted.]]&lt;br /&gt;
&lt;br /&gt;
====JavaScript: As a Language====&lt;br /&gt;
&lt;br /&gt;
* JavaScript has &#039;&#039;&#039;nothing&#039;&#039;&#039; to do with Java.&lt;br /&gt;
** Why is it even called JavaScript then? At first it wasn&#039;t; it was developed as Mocha, changed to LiveScript and then finally renamed to JavaScript due to an agreement with Sun (acquired by Oracle).&amp;lt;ref&amp;gt;[http://stackoverflow.com/a/2475528]&amp;lt;/ref&amp;gt;&lt;br /&gt;
* The only similarity between Java/JavaScript is some of the syntax, but that can be said for a lot of languages.&lt;br /&gt;
&lt;br /&gt;
* What&#039;s different about JavaScript?&lt;br /&gt;
** No declared data types; it&#039;s a &amp;quot;loose&amp;quot; language.&lt;br /&gt;
*** Instead of int i = 0, it&#039;s simply var i = 0.&lt;br /&gt;
** There&#039;s seven data types&amp;lt;ref&amp;gt;[https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures]&amp;lt;/ref&amp;gt; (examples in brackets)&lt;br /&gt;
*** Boolean (true, false)&lt;br /&gt;
*** Number (3.1337, 1337, etc. There&#039;s no integer or long, everything is a float)&lt;br /&gt;
*** String (&amp;quot;Dave&amp;quot;)&lt;br /&gt;
*** Symbol&lt;br /&gt;
*** Object&lt;br /&gt;
*** Null&lt;br /&gt;
*** Undefined&lt;br /&gt;
&lt;br /&gt;
====How should I learn JavaScript?====&lt;br /&gt;
&lt;br /&gt;
* Practice! While attending the lectures is a great start, you &#039;&#039;will&#039;&#039; have to practice outside of class. This will not be graded, but will ultimately affect your performance in the course (and in the workplace).&lt;br /&gt;
** [https://www.codecademy.com/learn/javascript Codecademy] has a lot of good resources for beginners.&lt;br /&gt;
** For more advanced students, check on [https://github.com/search?l=javascript&amp;amp;o=desc&amp;amp;q=stars%3A%3E1&amp;amp;s=stars&amp;amp;type=Repositories GitHub] to see if there&#039;s any projects you&#039;re interested in contribution to. If you plan to work in web development, it&#039;s very likely you will be asked in an interview if you&#039;ve contributed to any open source projects (having a good portfolio will help a &#039;&#039;lot&#039;&#039; in getting a first job).&lt;br /&gt;
&lt;br /&gt;
====Working with Variables====&lt;br /&gt;
&lt;br /&gt;
If you&#039;ve previously worked with Java, the first large difference you&#039;ve noticed is likely that variables are very &amp;quot;flexible&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
* If you attempt to use a variable that has not been declared, you will &#039;&#039;&#039;not&#039;&#039;&#039; get a compiler error. Instead, the type &amp;lt;tt&amp;gt;undefined&amp;lt;/tt&amp;gt; will be returned. This can making debugging a bit of a challenge!&lt;br /&gt;
* Likewise with most languages, a symbol (e.g., &amp;lt;tt&amp;gt;x&amp;lt;/tt&amp;gt;) can only reference &#039;&#039;one&#039;&#039; object.&lt;br /&gt;
* You can have several types of data inside  single object (e.g., &amp;lt;tt&amp;gt;x.y&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;x.y.z&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;x.y.x.qwerty&amp;lt;/tt&amp;gt;, etc).&lt;br /&gt;
* &amp;lt;tt&amp;gt;x.size&amp;lt;/tt&amp;gt; (dot notation) is the same as &amp;lt;tt&amp;gt;x[&amp;quot;size&amp;quot;]&amp;lt;/tt&amp;gt; (array notation).&lt;br /&gt;
&lt;br /&gt;
====Regular Expressions (Regex)====&lt;br /&gt;
&lt;br /&gt;
While this topic is technically outside of the course material, you will likely need to use it in some assignments. Regex is the same across different languages, so you will not need to relearn it all for every language.&lt;br /&gt;
&lt;br /&gt;
https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
{{Reflist}}&lt;/div&gt;</summary>
		<author><name>Zero</name></author>
	</entry>
	<entry>
		<id>https://homeostasis.scs.carleton.ca/wiki/index.php?title=Fundamentals_of_Web_Applications_(Winter_2016)&amp;diff=20503</id>
		<title>Fundamentals of Web Applications (Winter 2016)</title>
		<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=Fundamentals_of_Web_Applications_(Winter_2016)&amp;diff=20503"/>
		<updated>2016-01-13T20:54:57Z</updated>

		<summary type="html">&lt;p&gt;Zero: Added poll link.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Course Outline==&lt;br /&gt;
&lt;br /&gt;
[[Fundamentals of Web Applications: Winter 2016 Course Outline|Here]] is the course outline.&lt;br /&gt;
&lt;br /&gt;
==Lectures and Exams==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table style=&amp;quot;width: 100%;&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;tr valign=&amp;quot;top&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;th&amp;gt;&lt;br /&gt;
    &amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;Date&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;th&amp;gt;&lt;br /&gt;
    &amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;Topic&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 7&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 1|Lecture 1]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 12&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 2|Lecture 2]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 14&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 3|Lecture 3]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 19&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 4|Lecture 4]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 21&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 5|Lecture 5]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 26&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 6|Lecture 6]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 28&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 7|Lecture 7]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Feb. 2&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 8|Lecture 8]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Feb. 4&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 9|Lecture 9]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Feb. 9&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 10|Midterm Review]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Feb. 11&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Midterm (in class) (Tentative, [https://culearn.carleton.ca/moodle/mod/choice/view.php?id=779191 click here for poll.])&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Feb. 23&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 11|Lecture 11]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Feb. 25&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 12|Lecture 12]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 1&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 13|Lecture 13]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 3&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 14|Lecture 14]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 8&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 15|Lecture 15]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 10&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 16|Lecture 16]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 15&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 17|Lecture 17]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 17&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 18|Lecture 18]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 22&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 19|Lecture 19]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 24&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 20|Lecture 20]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 29&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 21|Lecture 21]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 31&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 22|Lecture 22]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Apr. 5&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 23|Lecture 23]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;April 7&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W Lecture 24|Lecture 24]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;TBA&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Final Exam&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Tutorials==&lt;br /&gt;
&lt;br /&gt;
Each week you will get a progress grade from 0-4, given to you by a TA.  If you are being diligent, you should be able to get 4&#039;s every week.  The easiest way to get your grade is to come to tutorial and meet with your TA; alternately, you can meet a TA in their office hours or, at their discretion, discuss things with them online.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table style=&amp;quot;width: 100%;&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;tr valign=&amp;quot;top&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;th&amp;gt;&lt;br /&gt;
    &amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;Date&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;th&amp;gt;&lt;br /&gt;
    &amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;Tutorials&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 13, 14, 15, 18&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Tutorial 1|Asynchronous Code in JavaScript]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 20, 21, 22, 25&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Tutorial 2|Tiny web server]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 27, 28, 29, Feb. 1&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Tutorial 3|Express, Form demo]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Feb. 3, 4, 5, 8&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Tutorial 4|TBA]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Feb. 24, 25, 26, 29&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Tutorial 5|TBA]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 2, 3, 4, 7&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Tutorial 6|TBA]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 9, 10, 11, 14&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Tutorial 7|TBA]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 16, 17, 18, 21&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Tutorial 8|TBA]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 23, 24, 25, 28&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Tutorial 9|TBA]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 30, 31, Apr. 1, 4&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Tutorial 10|TBA]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Assignments==&lt;br /&gt;
&amp;lt;table style=&amp;quot;width: 100%;&amp;quot; border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;tr valign=&amp;quot;top&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;th&amp;gt;&lt;br /&gt;
    &amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;Due Date&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;th&amp;gt;&lt;br /&gt;
    &amp;lt;p align=&amp;quot;left&amp;quot;&amp;gt;Assignments&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/th&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 20&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Assignment 1|Assignment 1]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Jan. 27&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Assignment 2|Assignment 2]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Feb. 3&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Assignment 3|Assignment 3]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Feb. 9, 2:30 PM&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Assignment 4|Assignment 4]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 2&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Assignment 5|Assignment 5]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 9&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Assignment 6|Assignment 6]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 16&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Assignment 7|Assignment 7]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 23&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Assignment 8|Assignment 8]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Mar. 30&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Assignment 9|Assignment 9]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;Apr. 6&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
      &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;p&amp;gt;[[WebFund 2016W: Assignment 10|Assignment 10]]&lt;br /&gt;
      &amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Course Software==&lt;br /&gt;
&lt;br /&gt;
In this course we will be developing web applications using [http://nodejs.org/ node.js] and [http://www.mongodb.org/ mongoDB].  You are welcome to use whatever operating system and development tools you like; however, we will supporting the use of a course virtual machine appliance running [http://www.lubuntu.net/ Lubuntu], a low-resource variant of [http://www.ubuntu.com/ Ubuntu] Linux distribution.&lt;br /&gt;
&lt;br /&gt;
===In the labs===&lt;br /&gt;
&lt;br /&gt;
In the SCS labs you should be able to run the course VM by starting Virtualbox (listed in the Applications menu) and selecting the COMP 2406 virtual machine image.  After the VM has fully booted up you can login to the student account using the password &amp;quot;tneduts!&amp;quot;.  This account has administrative privileges; in addition, there is the admin account in case your student account gets corrupted for any reason.  The password for it is &amp;quot;nimda!&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
We highly recommend running your VM in full-screen mode (select from the menu, not by maximizing the window).  Do all of your work inside of the VM; it should be fast enough and you won&#039;t have any issues with sharing files or with firewalls/network connectivity.&lt;br /&gt;
&lt;br /&gt;
You can save the work you do from the course VM (in the student account) to your SCS account and restore it to any other copy of the class VM (on your machines or in the labs) by running using the following commands:&lt;br /&gt;
&lt;br /&gt;
  save2406 &amp;lt;SCS username&amp;gt;&lt;br /&gt;
  restore2406 &amp;lt;SCS username&amp;gt;&lt;br /&gt;
  compare2406 &amp;lt;SCS username&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you use these commands, &#039;&#039;&#039;use them consistently&#039;&#039;&#039;.  That means run &amp;lt;tt&amp;gt;restore2406&amp;lt;/tt&amp;gt; when you first log in, and run &amp;lt;tt&amp;gt;save2406&amp;lt;/tt&amp;gt; just before logging out.  If you don&#039;t do this, you will &#039;&#039;&#039;erase&#039;&#039;&#039; the work that you had done previously when you save.&lt;br /&gt;
&lt;br /&gt;
If you forgot to restore and you want to save, try running this:&lt;br /&gt;
&lt;br /&gt;
   rsync -a -v --progress ~/ &amp;lt;SCS username&amp;gt;@access.scs.carleton.ca:COMP2406/&lt;br /&gt;
&lt;br /&gt;
This is the same as the &amp;lt;tt&amp;gt;save2406&amp;lt;/tt&amp;gt; command minus the options (--delete and --force) that deletes files in the destination that don&#039;t exist in the source.  As a check, you may want to add the &amp;lt;tt&amp;gt;-n&amp;lt;/tt&amp;gt; option to do a dry run.&lt;br /&gt;
&lt;br /&gt;
===Running the VM on your own machines===&lt;br /&gt;
&lt;br /&gt;
If you want to run the VM appliance on your own system (running essentially any desktop operating system you want), just download the [http://homeostasis.scs.carleton.ca/~soma/VMs/COMP%202406%20&amp;amp;%203000,%20Fall%202015.ova virtual appliance file] and import.  The SHA1 hash of this file is:&lt;br /&gt;
&lt;br /&gt;
    a8a70ec2e1b49699f4de29c872ecec7cee21888f [http://homeostasis.scs.carleton.ca/~soma/VMs/COMP%202406%20&amp;amp;%203000,%20Fall%202015.ova COMP 2406 &amp;amp; 3000, Fall 2015.ova]&lt;br /&gt;
&lt;br /&gt;
On Windows you can compute this hash for your downloaded file using the command &amp;lt;a href=&amp;quot;http://support.microsoft.com/kb/889768&amp;quot;&amp;gt;&amp;lt;tt&amp;gt;FCIV -sha1 COMP 2406 &amp;amp; 3000, Fall 2015.ova&amp;lt;/tt&amp;gt;&amp;lt;/a&amp;gt;.  If the hash is different from above, your download has been corrupted.&lt;br /&gt;
&lt;br /&gt;
If the application is not VirtualBox, you&#039;ll need to:&lt;br /&gt;
* Have the VM platform ignore any errors in the structure of the appliance found during the import process;&lt;br /&gt;
* Uninstall the VirtualBox guest additions by typing starting a terminal application and running&lt;br /&gt;
   sudo /opt/VBoxGuestAdditions-*/uninstall.sh&lt;br /&gt;
* Install your platform&#039;s own Linux guest additions, if available.&lt;br /&gt;
&lt;br /&gt;
===Configuring Linux===&lt;br /&gt;
&lt;br /&gt;
If you already run Linux and you want to use the same packages we do in class, you should do the following:&lt;br /&gt;
&lt;br /&gt;
* Install the latest node.js version using [https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager a package manager].  (You generally don&#039;t use the version that comes with your distribution, it is probably too old.)&lt;br /&gt;
* Install [http://www.mongodb.org/ mongoDB] - it probably goes by mongodb in your package manager.  The version doesn&#039;t matter too much.&lt;br /&gt;
&lt;br /&gt;
Note that the binary of the node.js executable may be &amp;lt;tt&amp;gt;node&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;nodejs&amp;lt;/tt&amp;gt;, or something similar.&lt;br /&gt;
&lt;br /&gt;
That&#039;s it!&lt;br /&gt;
&lt;br /&gt;
===Configuring Windows===&lt;br /&gt;
&lt;br /&gt;
It is also possible to do everything in this class in Windows.  Here are some tips on getting things running.&lt;br /&gt;
&lt;br /&gt;
* You can just install the [http://nodejs.org/download/ windows node package] to get basic node and npm functionality.&lt;br /&gt;
* [[Run MongoDB on Windows]].&lt;br /&gt;
* If you want to run Emacs on Windows, look at the [[Running Emacs on Windows|following tips]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Resources==&lt;br /&gt;
&lt;br /&gt;
In general any text published by [http://www.oreilly.com/ O&#039;Reilly] is worth your time.  Many (but not all) of the texts below are published by them.&lt;br /&gt;
&lt;br /&gt;
===JavaScript===&lt;br /&gt;
&lt;br /&gt;
[http://shop.oreilly.com/product/9780596517748.do JavaScript: The Good Parts] by Douglas Crockford is an excellent text on JavaScript and it is short.  We highly suggest you obtain a copy and read it.&lt;br /&gt;
&lt;br /&gt;
The easiest way to get started with JavaScript and get basic understanding of web technologies is to go through the interactive lessons on [http://codeacademy.com Code Academy].  I suggest you go through their JavaScript, Web Fundamentals, and jQuery tracks.  They shouldn&#039;t take you very long to do given that you already know how to program.&lt;br /&gt;
&lt;br /&gt;
Crockford also has a lot of online resources on JavaScript, including videos of talks he&#039;s given that cover much of the content in his book.  Look at his [http://javascript.crockford.com/ JavaScript page] and this [http://yuiblog.com/crockford/ page of his videos].&lt;br /&gt;
&lt;br /&gt;
Another good book is [http://eloquentjavascript.net/ Eloquent JavaScript: A Modern Introduction to Programming] by Marijn Haverbeke.  A version of this book is available online for free.  The for-sale version is apparently updated and edited.&lt;br /&gt;
&lt;br /&gt;
The standard reference for JavaScript is [http://shop.oreilly.com/product/9780596805531.do JavaScript: The Definitive Guide] by David Flanagan.  It is a big book, but it is comprehensive.&lt;br /&gt;
&lt;br /&gt;
===Node===&lt;br /&gt;
&lt;br /&gt;
[http://shop.oreilly.com/product/0636920024606.do Learning Node] by Shelley Powers is the recommended resource for learning about Node.&lt;br /&gt;
&lt;br /&gt;
Another introduction to node.js is [http://www.nodebeginner.org/ The Node Beginner Book] by Manuel Kiessling.&lt;br /&gt;
&lt;br /&gt;
[http://evanhahn.com/understanding-express-js/ This page by Evan Hahn] has a good overview of the express/connect/node software stack.&lt;br /&gt;
&lt;br /&gt;
===MongoDB===&lt;br /&gt;
&lt;br /&gt;
[http://shop.oreilly.com/product/0636920028031.do MongoDB: The Definitive Guide] by Kristina Chodorow (1st or 2nd ed) is the recommended text for learning more about MongoDB.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Lecture Notes Guidelines==&lt;br /&gt;
&lt;br /&gt;
As specified in the course outline you can get up to 6% extra credit on your final grade (2% per time) for writing up notes from lecture.  Here are the guidelines for those notes.&lt;br /&gt;
&lt;br /&gt;
Lee Croft (LeeCroft at cmail.carleton.ca) will be handling course notes.  Please contact him if you would like to volunteer.  Note that you should email him in advance and he will give you the next available slot.  There are over 200 students in class and only 20 lectures so opportunities may go fast!&lt;br /&gt;
&lt;br /&gt;
Lee or Anil will set you up with an account on this wiki.  You&#039;ll enter your initial draft notes here and then work with Lee to make sure they are of sufficient quality.  This may require a few rounds of revisions; however, if you follow the guidelines below it shouldn&#039;t be too bad.&lt;br /&gt;
&lt;br /&gt;
You should plan on organizing your notes as follows:&lt;br /&gt;
* Organize them in at least the following sections: Topics &amp;amp; Readings, Audio &amp;amp; Video, and Notes.&lt;br /&gt;
* The Topics &amp;amp; Readings section lists the main topics covered in the course, e.g. &amp;quot;Scoping rules in JavaScript&amp;quot;.  Please use an unordered bulleted list (using *&#039;s in wiki markup).  In this section also list readings relevant to the lecture that were mentioned in class.&lt;br /&gt;
* Leave the Audio and Video section blank.  Anil will fill this out.&lt;br /&gt;
* Put your notes in the Notes section.&lt;br /&gt;
&lt;br /&gt;
Use (nested) lists if appropriate for the notes; however, please have some text that isn&#039;t bulleted.  Please try to make the notes even if you did not attend lecture; however, you don&#039;t need to cover every small bit of information that was covered.  In particular the notes do not need to include digressions into topics only tangentially related to the course.  Complete sentences are welcome but not required.&lt;/div&gt;</summary>
		<author><name>Zero</name></author>
	</entry>
	<entry>
		<id>https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_2&amp;diff=20502</id>
		<title>WebFund 2016W Lecture 2</title>
		<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_2&amp;diff=20502"/>
		<updated>2016-01-13T20:50:15Z</updated>

		<summary type="html">&lt;p&gt;Zero: /* Student Notes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Video==&lt;br /&gt;
&lt;br /&gt;
The video from the lecture given on January 12, 2016 [http://homeostasis.scs.carleton.ca/~soma/webfund-2016w/lectures/comp2406-2016w-lec02-12Jan2016.mp4 is now available].&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&lt;br /&gt;
===In-class Notes===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Lecture #2&lt;br /&gt;
----------&lt;br /&gt;
JavaScript&lt;br /&gt;
&lt;br /&gt;
* no declared types&lt;br /&gt;
  - strings&lt;br /&gt;
  - objects&lt;br /&gt;
  - arrays&lt;br /&gt;
  - numbers (floats)&lt;br /&gt;
  - boolean&lt;br /&gt;
&lt;br /&gt;
With Node&lt;br /&gt;
 - asynchronous (non-blocking) I/O&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Student Notes===&lt;br /&gt;
&lt;br /&gt;
* Administration Reminders&lt;br /&gt;
** [[Fundamentals_of_Web_Applications:_Winter_2016_Course_Outline#Course_Information|Office hours have been added.]]&lt;br /&gt;
** [[Fundamentals_of_Web_Applications:_Winter_2016_Course_Outline#Grading|Midterm date has been tentatively created.]]&lt;br /&gt;
** [[WebFund_2016W:_Assignment_1|Assignment #1 has been posted.]]&lt;br /&gt;
&lt;br /&gt;
====JavaScript: As a Language====&lt;br /&gt;
&lt;br /&gt;
* JavaScript has &#039;&#039;&#039;nothing&#039;&#039;&#039; to do with Java.&lt;br /&gt;
** Why is it even called JavaScript then? At first it wasn&#039;t; it was developed as Mocha, changed to LiveScript and then finally renamed to JavaScript due to an agreement with Sun (acquired by Oracle).&amp;lt;ref&amp;gt;[http://stackoverflow.com/a/2475528]&amp;lt;/ref&amp;gt;&lt;br /&gt;
* The only similarity between Java/JavaScript is some of the syntax, but that can be said for a lot of languages.&lt;br /&gt;
&lt;br /&gt;
* What&#039;s different about JavaScript?&lt;br /&gt;
** No declared data types; it&#039;s a &amp;quot;loose&amp;quot; language.&lt;br /&gt;
*** Instead of int i = 0, it&#039;s simply var i = 0.&lt;br /&gt;
** There&#039;s seven data types&amp;lt;ref&amp;gt;[https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures]&amp;lt;/ref&amp;gt; (examples in brackets)&lt;br /&gt;
*** Boolean (true, false)&lt;br /&gt;
*** Number (3.1337, 1337, etc. There&#039;s no integer or long, everything is a float)&lt;br /&gt;
*** String (&amp;quot;Dave&amp;quot;)&lt;br /&gt;
*** Symbol&lt;br /&gt;
*** Object&lt;br /&gt;
*** Null&lt;br /&gt;
*** Undefined&lt;br /&gt;
&lt;br /&gt;
====How should I learn JavaScript?====&lt;br /&gt;
&lt;br /&gt;
* Practice! While attending the lectures is a great start, you &#039;&#039;will&#039;&#039; have to practice outside of class. This will not be graded, but will ultimately affect your performance in the course (and in the workplace).&lt;br /&gt;
** [https://www.codecademy.com/learn/javascript Codecademy] has a lot of good resources for beginners.&lt;br /&gt;
** For more advanced students, check on [https://github.com/search?l=javascript&amp;amp;o=desc&amp;amp;q=stars%3A%3E1&amp;amp;s=stars&amp;amp;type=Repositories GitHub] to see if there&#039;s any projects you&#039;re interested in contribution to. If you plan to work in web development, it&#039;s very likely you will be asked in an interview if you&#039;ve contributed to any open source projects (having a good portfolio will help a &#039;&#039;lot&#039;&#039; in getting a first job).&lt;br /&gt;
&lt;br /&gt;
====Working with Variables====&lt;br /&gt;
&lt;br /&gt;
If you&#039;ve previously worked with Java, the first large difference you&#039;ve noticed is likely that variables are very &amp;quot;flexible&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
* If you attempt to use a variable that has not been declared, you will &#039;&#039;&#039;not&#039;&#039;&#039; get a compiler error. Instead, the type &amp;lt;tt&amp;gt;undefined&amp;lt;/tt&amp;gt; will be returned. This can making debugging a bit of a challenge!&lt;br /&gt;
* Likewise with most languages, a symbol (e.g., &amp;lt;tt&amp;gt;x&amp;lt;/tt&amp;gt;) can only reference &#039;&#039;one&#039;&#039; object.&lt;br /&gt;
* You can have several types of data inside  single object (e.g., &amp;lt;tt&amp;gt;x.y&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;x.y.z&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;x.y.x.qwerty&amp;lt;/tt&amp;gt;, etc).&lt;br /&gt;
* &amp;lt;tt&amp;gt;x.size&amp;lt;/tt&amp;gt; (dot notation) is the same as &amp;lt;tt&amp;gt;x[&amp;quot;size&amp;quot;]&amp;lt;/tt&amp;gt; (array notation).&lt;br /&gt;
&lt;br /&gt;
====Regular Expressions (Regex)====&lt;br /&gt;
&lt;br /&gt;
While this topic is technically outside of the course material, you will likely need to use it in some assignments. Regex is the same across different languages, so you will not need to relearn it all for every language.&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
{{Reflist}}&lt;/div&gt;</summary>
		<author><name>Zero</name></author>
	</entry>
	<entry>
		<id>https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_2&amp;diff=20501</id>
		<title>WebFund 2016W Lecture 2</title>
		<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_2&amp;diff=20501"/>
		<updated>2016-01-13T20:43:25Z</updated>

		<summary type="html">&lt;p&gt;Zero: /* Working with Variables */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Video==&lt;br /&gt;
&lt;br /&gt;
The video from the lecture given on January 12, 2016 [http://homeostasis.scs.carleton.ca/~soma/webfund-2016w/lectures/comp2406-2016w-lec02-12Jan2016.mp4 is now available].&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&lt;br /&gt;
===In-class Notes===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Lecture #2&lt;br /&gt;
----------&lt;br /&gt;
JavaScript&lt;br /&gt;
&lt;br /&gt;
* no declared types&lt;br /&gt;
  - strings&lt;br /&gt;
  - objects&lt;br /&gt;
  - arrays&lt;br /&gt;
  - numbers (floats)&lt;br /&gt;
  - boolean&lt;br /&gt;
&lt;br /&gt;
With Node&lt;br /&gt;
 - asynchronous (non-blocking) I/O&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Student Notes===&lt;br /&gt;
&lt;br /&gt;
* Administration Reminders&lt;br /&gt;
** [[Fundamentals_of_Web_Applications:_Winter_2016_Course_Outline#Course_Information|Office hours have been added.]]&lt;br /&gt;
** [[Fundamentals_of_Web_Applications:_Winter_2016_Course_Outline#Grading|Midterm date has been tentatively created.]]&lt;br /&gt;
** [[WebFund_2016W:_Assignment_1|Assignment #1 has been posted.]]&lt;br /&gt;
&lt;br /&gt;
====JavaScript: As a Language====&lt;br /&gt;
&lt;br /&gt;
* JavaScript has &#039;&#039;&#039;nothing&#039;&#039;&#039; to do with Java.&lt;br /&gt;
** Why is it even called JavaScript then? At first it wasn&#039;t; it was developed as Mocha, changed to LiveScript and then finally renamed to JavaScript due to an agreement with Sun (acquired by Oracle).&amp;lt;ref&amp;gt;[http://stackoverflow.com/a/2475528]&amp;lt;/ref&amp;gt;&lt;br /&gt;
* The only similarity between Java/JavaScript is some of the syntax, but that can be said for a lot of languages.&lt;br /&gt;
&lt;br /&gt;
* What&#039;s different about JavaScript?&lt;br /&gt;
** No declared data types; it&#039;s a &amp;quot;loose&amp;quot; language.&lt;br /&gt;
*** Instead of int i = 0, it&#039;s simply var i = 0.&lt;br /&gt;
** There&#039;s seven data types&amp;lt;ref&amp;gt;[https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures]&amp;lt;/ref&amp;gt; (examples in brackets)&lt;br /&gt;
*** Boolean (true, false)&lt;br /&gt;
*** Number (3.1337, 1337, etc. There&#039;s no integer or long, everything is a float)&lt;br /&gt;
*** String (&amp;quot;Dave&amp;quot;)&lt;br /&gt;
*** Symbol&lt;br /&gt;
*** Object&lt;br /&gt;
*** Null&lt;br /&gt;
*** Undefined&lt;br /&gt;
&lt;br /&gt;
====How should I learn JavaScript?====&lt;br /&gt;
&lt;br /&gt;
* Practice! While attending the lectures is a great start, you &#039;&#039;will&#039;&#039; have to practice outside of class. This will not be graded, but will ultimately affect your performance in the course (and in the workplace).&lt;br /&gt;
** [https://www.codecademy.com/learn/javascript Codecademy] has a lot of good resources for beginners.&lt;br /&gt;
** For more advanced students, check on [https://github.com/search?l=javascript&amp;amp;o=desc&amp;amp;q=stars%3A%3E1&amp;amp;s=stars&amp;amp;type=Repositories GitHub] to see if there&#039;s any projects you&#039;re interested in contribution to. If you plan to work in web development, it&#039;s very likely you will be asked in an interview if you&#039;ve contributed to any open source projects (having a good portfolio will help a &#039;&#039;lot&#039;&#039; in getting a first job).&lt;br /&gt;
&lt;br /&gt;
====Working with Variables====&lt;br /&gt;
&lt;br /&gt;
If you&#039;ve previously worked with Java, the first large difference you&#039;ve noticed is likely that variables are very &amp;quot;flexible&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
* If you attempt to use a variable that has not been declared, you will &#039;&#039;&#039;not&#039;&#039;&#039; get a compiler error. Instead, the type &amp;lt;tt&amp;gt;undefined&amp;lt;/tt&amp;gt; will be returned. This can making debugging a bit of a challenge!&lt;br /&gt;
* Likewise with most languages, a symbol (e.g., &amp;lt;tt&amp;gt;x&amp;lt;/tt&amp;gt;) can only reference &#039;&#039;one&#039;&#039; object.&lt;br /&gt;
* You can have several types of data inside  single object (e.g., &amp;lt;tt&amp;gt;x.y&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;x.y.z&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;x.y.x.qwerty&amp;lt;/tt&amp;gt;, etc).&lt;br /&gt;
* &amp;lt;tt&amp;gt;x.size&amp;lt;/tt&amp;gt; (dot notation) is the same as &amp;lt;tt&amp;gt;x[&amp;quot;size&amp;quot;]&amp;lt;/tt&amp;gt; (array notation).&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
{{Reflist}}&lt;/div&gt;</summary>
		<author><name>Zero</name></author>
	</entry>
	<entry>
		<id>https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_2&amp;diff=20500</id>
		<title>WebFund 2016W Lecture 2</title>
		<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_2&amp;diff=20500"/>
		<updated>2016-01-13T20:33:45Z</updated>

		<summary type="html">&lt;p&gt;Zero: Added new section.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Video==&lt;br /&gt;
&lt;br /&gt;
The video from the lecture given on January 12, 2016 [http://homeostasis.scs.carleton.ca/~soma/webfund-2016w/lectures/comp2406-2016w-lec02-12Jan2016.mp4 is now available].&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&lt;br /&gt;
===In-class Notes===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Lecture #2&lt;br /&gt;
----------&lt;br /&gt;
JavaScript&lt;br /&gt;
&lt;br /&gt;
* no declared types&lt;br /&gt;
  - strings&lt;br /&gt;
  - objects&lt;br /&gt;
  - arrays&lt;br /&gt;
  - numbers (floats)&lt;br /&gt;
  - boolean&lt;br /&gt;
&lt;br /&gt;
With Node&lt;br /&gt;
 - asynchronous (non-blocking) I/O&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Student Notes===&lt;br /&gt;
&lt;br /&gt;
* Administration Reminders&lt;br /&gt;
** [[Fundamentals_of_Web_Applications:_Winter_2016_Course_Outline#Course_Information|Office hours have been added.]]&lt;br /&gt;
** [[Fundamentals_of_Web_Applications:_Winter_2016_Course_Outline#Grading|Midterm date has been tentatively created.]]&lt;br /&gt;
** [[WebFund_2016W:_Assignment_1|Assignment #1 has been posted.]]&lt;br /&gt;
&lt;br /&gt;
====JavaScript: As a Language====&lt;br /&gt;
&lt;br /&gt;
* JavaScript has &#039;&#039;&#039;nothing&#039;&#039;&#039; to do with Java.&lt;br /&gt;
** Why is it even called JavaScript then? At first it wasn&#039;t; it was developed as Mocha, changed to LiveScript and then finally renamed to JavaScript due to an agreement with Sun (acquired by Oracle).&amp;lt;ref&amp;gt;[http://stackoverflow.com/a/2475528]&amp;lt;/ref&amp;gt;&lt;br /&gt;
* The only similarity between Java/JavaScript is some of the syntax, but that can be said for a lot of languages.&lt;br /&gt;
&lt;br /&gt;
* What&#039;s different about JavaScript?&lt;br /&gt;
** No declared data types; it&#039;s a &amp;quot;loose&amp;quot; language.&lt;br /&gt;
*** Instead of int i = 0, it&#039;s simply var i = 0.&lt;br /&gt;
** There&#039;s seven data types&amp;lt;ref&amp;gt;[https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures]&amp;lt;/ref&amp;gt; (examples in brackets)&lt;br /&gt;
*** Boolean (true, false)&lt;br /&gt;
*** Number (3.1337, 1337, etc. There&#039;s no integer or long, everything is a float)&lt;br /&gt;
*** String (&amp;quot;Dave&amp;quot;)&lt;br /&gt;
*** Symbol&lt;br /&gt;
*** Object&lt;br /&gt;
*** Null&lt;br /&gt;
*** Undefined&lt;br /&gt;
&lt;br /&gt;
====How should I learn JavaScript?====&lt;br /&gt;
&lt;br /&gt;
* Practice! While attending the lectures is a great start, you &#039;&#039;will&#039;&#039; have to practice outside of class. This will not be graded, but will ultimately affect your performance in the course (and in the workplace).&lt;br /&gt;
** [https://www.codecademy.com/learn/javascript Codecademy] has a lot of good resources for beginners.&lt;br /&gt;
** For more advanced students, check on [https://github.com/search?l=javascript&amp;amp;o=desc&amp;amp;q=stars%3A%3E1&amp;amp;s=stars&amp;amp;type=Repositories GitHub] to see if there&#039;s any projects you&#039;re interested in contribution to. If you plan to work in web development, it&#039;s very likely you will be asked in an interview if you&#039;ve contributed to any open source projects (having a good portfolio will help a &#039;&#039;lot&#039;&#039; in getting a first job).&lt;br /&gt;
&lt;br /&gt;
====Working with Variables====&lt;br /&gt;
&lt;br /&gt;
If you&#039;ve previously worked with Java, the first large difference you&#039;ve noticed is likely that variables are very &amp;quot;flexible&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
{{Reflist}}&lt;/div&gt;</summary>
		<author><name>Zero</name></author>
	</entry>
	<entry>
		<id>https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_2&amp;diff=20499</id>
		<title>WebFund 2016W Lecture 2</title>
		<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_2&amp;diff=20499"/>
		<updated>2016-01-13T20:29:47Z</updated>

		<summary type="html">&lt;p&gt;Zero: Added new section.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Video==&lt;br /&gt;
&lt;br /&gt;
The video from the lecture given on January 12, 2016 [http://homeostasis.scs.carleton.ca/~soma/webfund-2016w/lectures/comp2406-2016w-lec02-12Jan2016.mp4 is now available].&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&lt;br /&gt;
===In-class Notes===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Lecture #2&lt;br /&gt;
----------&lt;br /&gt;
JavaScript&lt;br /&gt;
&lt;br /&gt;
* no declared types&lt;br /&gt;
  - strings&lt;br /&gt;
  - objects&lt;br /&gt;
  - arrays&lt;br /&gt;
  - numbers (floats)&lt;br /&gt;
  - boolean&lt;br /&gt;
&lt;br /&gt;
With Node&lt;br /&gt;
 - asynchronous (non-blocking) I/O&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Student Notes===&lt;br /&gt;
&lt;br /&gt;
* Administration Reminders&lt;br /&gt;
** [[Fundamentals_of_Web_Applications:_Winter_2016_Course_Outline#Course_Information|Office hours have been added.]]&lt;br /&gt;
** [[Fundamentals_of_Web_Applications:_Winter_2016_Course_Outline#Grading|Midterm date has been tentatively created.]]&lt;br /&gt;
** [[WebFund_2016W:_Assignment_1|Assignment #1 has been posted.]]&lt;br /&gt;
&lt;br /&gt;
====JavaScript: As a Language====&lt;br /&gt;
&lt;br /&gt;
* JavaScript has &#039;&#039;&#039;nothing&#039;&#039;&#039; to do with Java.&lt;br /&gt;
** Why is it even called JavaScript then? At first it wasn&#039;t; it was developed as Mocha, changed to LiveScript and then finally renamed to JavaScript due to an agreement with Sun (acquired by Oracle).&amp;lt;ref&amp;gt;[http://stackoverflow.com/a/2475528]&amp;lt;/ref&amp;gt;&lt;br /&gt;
* The only similarity between Java/JavaScript is some of the syntax, but that can be said for a lot of languages.&lt;br /&gt;
&lt;br /&gt;
* What&#039;s different about JavaScript?&lt;br /&gt;
** No declared data types; it&#039;s a &amp;quot;loose&amp;quot; language.&lt;br /&gt;
*** Instead of int i = 0, it&#039;s simply var i = 0.&lt;br /&gt;
** There&#039;s seven data types&amp;lt;ref&amp;gt;[https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures]&amp;lt;/ref&amp;gt; (examples in brackets)&lt;br /&gt;
*** Boolean (true, false)&lt;br /&gt;
*** Number (3.1337, 1337, etc. There&#039;s no integer or long, everything is a float)&lt;br /&gt;
*** String (&amp;quot;Dave&amp;quot;)&lt;br /&gt;
*** Symbol&lt;br /&gt;
*** Object&lt;br /&gt;
*** Null&lt;br /&gt;
*** Undefined&lt;br /&gt;
&lt;br /&gt;
====How should I learn JavaScript?====&lt;br /&gt;
&lt;br /&gt;
* Practice! While attending the lectures is a great start, you &#039;&#039;will&#039;&#039; have to practice outside of class. This will not be graded, but will ultimately affect your performance in the course (and in the workplace).&lt;br /&gt;
** [https://www.codecademy.com/learn/javascript Codecademy] has a lot of good resources for beginners.&lt;br /&gt;
** For more advanced students, check on [https://github.com/search?l=javascript&amp;amp;o=desc&amp;amp;q=stars%3A%3E1&amp;amp;s=stars&amp;amp;type=Repositories GitHub] to see if there&#039;s any projects you&#039;re interested in contribution to. If you plan to work in web development, it&#039;s very likely you will be asked in an interview if you&#039;ve contributed to any open source projects (having a good portfolio will help a &#039;&#039;lot&#039;&#039; in getting a first job).&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
{{Reflist}}&lt;/div&gt;</summary>
		<author><name>Zero</name></author>
	</entry>
	<entry>
		<id>https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_2&amp;diff=20496</id>
		<title>WebFund 2016W Lecture 2</title>
		<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_2&amp;diff=20496"/>
		<updated>2016-01-13T20:17:56Z</updated>

		<summary type="html">&lt;p&gt;Zero: Broken URL.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Video==&lt;br /&gt;
&lt;br /&gt;
The video from the lecture given on January 12, 2016 [http://homeostasis.scs.carleton.ca/~soma/webfund-2016w/lectures/comp2406-2016w-lec02-12Jan2016.mp4 is now available].&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&lt;br /&gt;
===In-class Notes===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Lecture #2&lt;br /&gt;
----------&lt;br /&gt;
JavaScript&lt;br /&gt;
&lt;br /&gt;
* no declared types&lt;br /&gt;
  - strings&lt;br /&gt;
  - objects&lt;br /&gt;
  - arrays&lt;br /&gt;
  - numbers (floats)&lt;br /&gt;
  - boolean&lt;br /&gt;
&lt;br /&gt;
With Node&lt;br /&gt;
 - asynchronous (non-blocking) I/O&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Student Notes===&lt;br /&gt;
&lt;br /&gt;
* Administration Reminders&lt;br /&gt;
** [[Fundamentals_of_Web_Applications:_Winter_2016_Course_Outline#Course_Information|Office hours have been added.]]&lt;br /&gt;
** [[Fundamentals_of_Web_Applications:_Winter_2016_Course_Outline#Grading|Midterm date has been tentatively created.]]&lt;br /&gt;
** [[WebFund_2016W:_Assignment_1|Assignment #1 has been posted.]]&lt;br /&gt;
&lt;br /&gt;
====JavaScript: As a Language====&lt;br /&gt;
&lt;br /&gt;
* JavaScript has &#039;&#039;&#039;nothing&#039;&#039;&#039; to do with Java.&lt;br /&gt;
** Why is it even called JavaScript then? At first it wasn&#039;t; it was developed as Mocha, changed to LiveScript and then finally renamed to JavaScript due to an agreement with Sun (acquired by Oracle).&amp;lt;ref&amp;gt;[http://stackoverflow.com/a/2475528]&amp;lt;/ref&amp;gt;&lt;br /&gt;
* The only similarity between Java/JavaScript is some of the syntax, but that can be said for a lot of languages.&lt;br /&gt;
&lt;br /&gt;
* What&#039;s different about JavaScript?&lt;br /&gt;
** No declared data types; it&#039;s a &amp;quot;loose&amp;quot; language.&lt;br /&gt;
*** Instead of int i = 0, it&#039;s simply var i = 0.&lt;br /&gt;
** There&#039;s seven data types&amp;lt;ref&amp;gt;[https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures]&amp;lt;/ref&amp;gt; (examples in brackets)&lt;br /&gt;
*** Boolean (true, false)&lt;br /&gt;
*** Number (3.1337, 1337, etc. There&#039;s no integer or long, everything is a float)&lt;br /&gt;
*** String (&amp;quot;Dave&amp;quot;)&lt;br /&gt;
*** Symbol&lt;br /&gt;
*** Object&lt;br /&gt;
*** Null&lt;br /&gt;
*** Undefined&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
{{Reflist}}&lt;/div&gt;</summary>
		<author><name>Zero</name></author>
	</entry>
	<entry>
		<id>https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_2&amp;diff=20495</id>
		<title>WebFund 2016W Lecture 2</title>
		<link rel="alternate" type="text/html" href="https://homeostasis.scs.carleton.ca/wiki/index.php?title=WebFund_2016W_Lecture_2&amp;diff=20495"/>
		<updated>2016-01-13T20:16:55Z</updated>

		<summary type="html">&lt;p&gt;Zero: Removed the ref titles.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Video==&lt;br /&gt;
&lt;br /&gt;
The video from the lecture given on January 12, 2016 [http://homeostasis.scs.carleton.ca/~soma/webfund-2016w/lectures/comp2406-2016w-lec02-12Jan2016.mp4 is now available].&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&lt;br /&gt;
===In-class Notes===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Lecture #2&lt;br /&gt;
----------&lt;br /&gt;
JavaScript&lt;br /&gt;
&lt;br /&gt;
* no declared types&lt;br /&gt;
  - strings&lt;br /&gt;
  - objects&lt;br /&gt;
  - arrays&lt;br /&gt;
  - numbers (floats)&lt;br /&gt;
  - boolean&lt;br /&gt;
&lt;br /&gt;
With Node&lt;br /&gt;
 - asynchronous (non-blocking) I/O&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Student Notes===&lt;br /&gt;
&lt;br /&gt;
* Administration Reminders&lt;br /&gt;
** [[Fundamentals_of_Web_Applications:_Winter_2016_Course_Outline#Course_Information|Office hours have been added.]]&lt;br /&gt;
** [[Fundamentals_of_Web_Applications:_Winter_2016_Course_Outline#Grading|Midterm date has been tentatively created.]]&lt;br /&gt;
** [[WebFund_2016W:_Assignment_1|Assignment #1 has been posted.]]&lt;br /&gt;
&lt;br /&gt;
====JavaScript: As a Language====&lt;br /&gt;
&lt;br /&gt;
* JavaScript has &#039;&#039;&#039;nothing&#039;&#039;&#039; to do with Java.&lt;br /&gt;
** Why is it even called JavaScript then? At first it wasn&#039;t; it was developed as Mocha, changed to LiveScript and then finally renamed to JavaScript due to an agreement with Sun (acquired by Oracle).&amp;lt;ref&amp;gt;[http://stackoverflow.com/a/2475528]&amp;lt;/ref&amp;gt;&lt;br /&gt;
* The only similarity between Java/JavaScript is some of the syntax, but that can be said for a lot of languages.&lt;br /&gt;
&lt;br /&gt;
* What&#039;s different about JavaScript?&lt;br /&gt;
** No declared data types; it&#039;s a &amp;quot;loose&amp;quot; language.&lt;br /&gt;
*** Instead of int i = 0, it&#039;s simply var i = 0.&lt;br /&gt;
** There&#039;s seven data types&amp;lt;ref&amp;gt;[https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures.]&amp;lt;/ref&amp;gt; (examples in brackets)&lt;br /&gt;
*** Boolean (true, false)&lt;br /&gt;
*** Number (3.1337, 1337, etc. There&#039;s no integer or long, everything is a float)&lt;br /&gt;
*** String (&amp;quot;Dave&amp;quot;)&lt;br /&gt;
*** Symbol&lt;br /&gt;
*** Object&lt;br /&gt;
*** Null&lt;br /&gt;
*** Undefined&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
{{Reflist}}&lt;/div&gt;</summary>
		<author><name>Zero</name></author>
	</entry>
</feed>