WebFund 2016W Lecture 17: Difference between revisions
Created page with "==Video== The video from the lecture given on March 15, 2016 [http://homeostasis.scs.carleton.ca/~soma/webfund-2016w/lectures/comp2406-2016w-lec17-15Mar2016.mp4 is now availa..." |
No edit summary |
||
(One intermediate revision by the same user not shown) | |||
Line 3: | Line 3: | ||
The video from the lecture given on March 15, 2016 [http://homeostasis.scs.carleton.ca/~soma/webfund-2016w/lectures/comp2406-2016w-lec17-15Mar2016.mp4 is now available]. | The video from the lecture given on March 15, 2016 [http://homeostasis.scs.carleton.ca/~soma/webfund-2016w/lectures/comp2406-2016w-lec17-15Mar2016.mp4 is now available]. | ||
==Notes== | ==Student Notes== | ||
===Instructor comments | ===Administrative=== | ||
*Assignment 5 is due on March 24th | |||
**The marking scheme has been updated for the assignment (now has 20 marks) | |||
***2 for uploading logs | |||
***4 for storing logs in MongoDB properly | |||
***6 for listing entries in response to a query | |||
***2 for allowing such listings to be downloaded IN THE ORDER they were in the original file | |||
***6 for graphing daily frequency of logs | |||
**This is worth 2 assignments since we now have less assignments | |||
*Assignment 6 is due on April 7th (last day of class) | |||
**This is worth 2 assignments since we have less assignments | |||
*The solutions for our assignment 4 will be posted soon | |||
*Solutions for assignments 5 & 6 will be posted by the end of the semester | |||
===Assignment 5=== | |||
*The template we’re given should give you everything you need to start the assignment | |||
*Each output type includes instructions with what needs to be displayed | |||
**‘Download’ displays the log entries as text (similar to queryLogs in web application form) | |||
**‘Show’ will have similar functionality to ‘Download’ but you’ll be putting the logs onto a text box you can scroll through | |||
**‘Visualize’ can be done in a similar fashion to the graph tutorial | |||
***Chart.js is a graphing script ([http://www.chartjs.org/docs/ http://www.chartjs.org/docs/]) that allows you to visualize your data | |||
***For our assignment, we are setting up all of the data needed for the graph on the server and then passing it into the Jade template to be rendered into a script tag | |||
***The code in the script tag will be run as client-side code in the web browser to build the graph | |||
*In the <code>doQuery()</code> function, you can see that our query types are listed here (visualize, show and download) | |||
**For ‘Download’, you just send the logs as plain text | |||
**For ‘Show’, we use the template given for Show.jade | |||
**For ‘Visualize’, we specify the data as a result of calling <code>analyzeSelected()</code> | |||
***The <code>analyzeSelected()</code> function has to take the logs and analyze them and to generate the values and counts | |||
***To get the logs you need to implement the <code>getLogs()</code> function which is included in the template | |||
***The <code>analyzeSelected()</code> function does produces a string of JavaScript code with the data object in JSON format | |||
****This is passed in to the Visualize.jade template | |||
===Introduction to Instances=== | |||
*Access the SCS OpenStack web portal at: [https://openstack.scs.carleton.ca/horizon/auth/login/?next=/horizon/ https://openstack.scs.carleton.ca/horizon/auth/login/?next=/horizon/] | |||
*You can only access the SCS OpenStack machines when you’re on the Carleton Network (CU-Wireless) | |||
**If you’re attempting to access OpenStack outside the network, you’ll need a VPN (Virtual Private Network) for Carleton’s network | |||
*Log in using: | |||
**Username: your MyCarletonOne username | |||
**Password: your MyCarletonOne username (all lowercase) and your student number (no spaces between the two) | |||
*To create/launch your own instance in the COMP2406 subcategory | |||
**You’re going to have to use Google Chrome! | |||
**Make sure you are in the COMP2406 project (You can change at the top of the page, to the right of the OpenStack logo) | |||
**Go to Project → Compute → Instances | |||
**Click the Launch Instance button to bring up the new instance interface | |||
***You can name your own instance (ex// anilsomayaji-comp2406-1) | |||
***Instance Boot Source : Boot from snapshot | |||
***Instance Snapshot: COMP2406-W16 | |||
***Go to the Access & Security tab | |||
****Check ping, ssh, https and default. | |||
****Ignore the Key Pair option | |||
***Go to the Networking tab | |||
****Under Selected networks, add the “comp2406-net-26” available network (or “comp2406-net-31”) | |||
***After following this procedure, you’ll be able to launch to create an instance! | |||
**Find you instance on the list of instances and under the Actions menu, select Allocate Floating IP | |||
***Select an IP address with a subnet matching the network that you joined (either 134.117.26.xx or 134.117.31.xx) | |||
*Now you can connect to your instance via ssh | |||
**In a terminal, enter <code>ssh [floating IP address] -l student</code> | |||
**The password is tneduts! | |||
*You are now connected to your own virtual machine! You can use it to run a web server! | |||
*Transfer a web application to the instance using wget or some FTP utility | |||
*When running your server, instead of using localhost, we can use our IP address to access our server | |||
**We only have access to port 443 for the server on this instance but we need elevated priviledges to use it | |||
**TO FIX: <code>sudo setcap ‘cap_net_bind_service=+ep’ /user/bin/www/nodejs</code> | |||
*Now you can run your server with <code>PORT=443 bin/www</code> (It should now be listening on port 443) | |||
*Though all the capabilities of the OpenStack instance can be done on the course virtual machine, using OpenStack allows you to deploy Node.js in a production environment | |||
===Tutorial 7 - Downloading Files=== | |||
*First we need to make a download button in account.jade | |||
**Inside the each loop, we add a form to go along with each file | |||
**We use a hidden field in the form to store the file name as a value to be sent as form data in the body of the POST request | |||
<code><pre> | |||
li #{s.name}: #{s.size} | |||
form (method=”post”, action=”/downloadFile”) | |||
p #{s.name}: #{s.size} | |||
input(type=”hidden”, value=s.name, name=”downloadFile”) | |||
input(type=”submit”, value=”Download”, name=”submit”)#{s.name} | |||
</pre></code> | |||
*Next, in index.js, we add the code to handle this new request | |||
<code><pre> | |||
function downloadFile(req, res){ | |||
var theFile = req.body.downloadFile; | |||
var allFiles = req.session.files; | |||
var i; | |||
var sent = false; | |||
if(theFile){ | |||
for(i = 0; i < allFiles.length; i++){ | |||
if(allFiles[i].originalname === theFile){ | |||
response = Buffer(allFiles[i].buffer.data).toString(‘utf8’); | |||
res.send(response); | |||
sent = true; | |||
break; | |||
} | |||
} | |||
if(!sent) | |||
res.send(“File not found”); | |||
} | |||
} | |||
router.post(“/downloadFile”, downloadFile); | |||
</pre></code> | |||
*The <code>downloadFile()</code> searches through the array of uploaded files from the <code>req.session</code> object for a file whose name matches the name received in the request | |||
**If such a file is found, it is sent in the response | |||
**Note the use of the <code>Buffer()</code> constructor | |||
***This is to get a round a bug where the file buffer was not preserved in its Buffer format during storage in memory | |||
==Instructor comments== | |||
In class I had trouble with downloading the file. Everything worked except that the downloaded file became [Object object]. | In class I had trouble with downloading the file. Everything worked except that the downloaded file became [Object object]. |
Latest revision as of 19:49, 19 March 2016
Video
The video from the lecture given on March 15, 2016 is now available.
Student Notes
Administrative
- Assignment 5 is due on March 24th
- The marking scheme has been updated for the assignment (now has 20 marks)
- 2 for uploading logs
- 4 for storing logs in MongoDB properly
- 6 for listing entries in response to a query
- 2 for allowing such listings to be downloaded IN THE ORDER they were in the original file
- 6 for graphing daily frequency of logs
- This is worth 2 assignments since we now have less assignments
- The marking scheme has been updated for the assignment (now has 20 marks)
- Assignment 6 is due on April 7th (last day of class)
- This is worth 2 assignments since we have less assignments
- The solutions for our assignment 4 will be posted soon
- Solutions for assignments 5 & 6 will be posted by the end of the semester
Assignment 5
- The template we’re given should give you everything you need to start the assignment
- Each output type includes instructions with what needs to be displayed
- ‘Download’ displays the log entries as text (similar to queryLogs in web application form)
- ‘Show’ will have similar functionality to ‘Download’ but you’ll be putting the logs onto a text box you can scroll through
- ‘Visualize’ can be done in a similar fashion to the graph tutorial
- Chart.js is a graphing script (http://www.chartjs.org/docs/) that allows you to visualize your data
- For our assignment, we are setting up all of the data needed for the graph on the server and then passing it into the Jade template to be rendered into a script tag
- The code in the script tag will be run as client-side code in the web browser to build the graph
- In the
doQuery()
function, you can see that our query types are listed here (visualize, show and download)- For ‘Download’, you just send the logs as plain text
- For ‘Show’, we use the template given for Show.jade
- For ‘Visualize’, we specify the data as a result of calling
analyzeSelected()
- The
analyzeSelected()
function has to take the logs and analyze them and to generate the values and counts - To get the logs you need to implement the
getLogs()
function which is included in the template - The
analyzeSelected()
function does produces a string of JavaScript code with the data object in JSON format- This is passed in to the Visualize.jade template
- The
Introduction to Instances
- Access the SCS OpenStack web portal at: https://openstack.scs.carleton.ca/horizon/auth/login/?next=/horizon/
- You can only access the SCS OpenStack machines when you’re on the Carleton Network (CU-Wireless)
- If you’re attempting to access OpenStack outside the network, you’ll need a VPN (Virtual Private Network) for Carleton’s network
- Log in using:
- Username: your MyCarletonOne username
- Password: your MyCarletonOne username (all lowercase) and your student number (no spaces between the two)
- To create/launch your own instance in the COMP2406 subcategory
- You’re going to have to use Google Chrome!
- Make sure you are in the COMP2406 project (You can change at the top of the page, to the right of the OpenStack logo)
- Go to Project → Compute → Instances
- Click the Launch Instance button to bring up the new instance interface
- You can name your own instance (ex// anilsomayaji-comp2406-1)
- Instance Boot Source : Boot from snapshot
- Instance Snapshot: COMP2406-W16
- Go to the Access & Security tab
- Check ping, ssh, https and default.
- Ignore the Key Pair option
- Go to the Networking tab
- Under Selected networks, add the “comp2406-net-26” available network (or “comp2406-net-31”)
- After following this procedure, you’ll be able to launch to create an instance!
- Find you instance on the list of instances and under the Actions menu, select Allocate Floating IP
- Select an IP address with a subnet matching the network that you joined (either 134.117.26.xx or 134.117.31.xx)
- Now you can connect to your instance via ssh
- In a terminal, enter
ssh [floating IP address] -l student
- The password is tneduts!
- In a terminal, enter
- You are now connected to your own virtual machine! You can use it to run a web server!
- Transfer a web application to the instance using wget or some FTP utility
- When running your server, instead of using localhost, we can use our IP address to access our server
- We only have access to port 443 for the server on this instance but we need elevated priviledges to use it
- TO FIX:
sudo setcap ‘cap_net_bind_service=+ep’ /user/bin/www/nodejs
- Now you can run your server with
PORT=443 bin/www
(It should now be listening on port 443) - Though all the capabilities of the OpenStack instance can be done on the course virtual machine, using OpenStack allows you to deploy Node.js in a production environment
Tutorial 7 - Downloading Files
- First we need to make a download button in account.jade
- Inside the each loop, we add a form to go along with each file
- We use a hidden field in the form to store the file name as a value to be sent as form data in the body of the POST request
li #{s.name}: #{s.size}
form (method=”post”, action=”/downloadFile”)
p #{s.name}: #{s.size}
input(type=”hidden”, value=s.name, name=”downloadFile”)
input(type=”submit”, value=”Download”, name=”submit”)#{s.name}
- Next, in index.js, we add the code to handle this new request
function downloadFile(req, res){
var theFile = req.body.downloadFile;
var allFiles = req.session.files;
var i;
var sent = false;
if(theFile){
for(i = 0; i < allFiles.length; i++){
if(allFiles[i].originalname === theFile){
response = Buffer(allFiles[i].buffer.data).toString(‘utf8’);
res.send(response);
sent = true;
break;
}
}
if(!sent)
res.send(“File not found”);
}
}
router.post(“/downloadFile”, downloadFile);
- The
downloadFile()
searches through the array of uploaded files from thereq.session
object for a file whose name matches the name received in the request- If such a file is found, it is sent in the response
- Note the use of the
Buffer()
constructor- This is to get a round a bug where the file buffer was not preserved in its Buffer format during storage in memory
Instructor comments
In class I had trouble with downloading the file. Everything worked except that the downloaded file became [Object object].
The problematic line was this, in downloadFile()
response = allFiles[i].buffer.toString('utf8');
This line should work because when we stored the file in uploadText() it did. But in between (perhaps when stored as a session property) it was changed.
Before, we had:
{ '0': 123, '1': 10, '2': 32, '3': 32, ... }
But now this got changed into:
{ type: 'Buffer', data: [ 123, 10, 32, 32, ... ] }
The former is of type Buffer (as reported by Buffer.isBuffer()), the latter is not.
While this is strange behavior, the fix is easy:
response = Buffer(allFiles[i].buffer.data).toString('utf8');
This is definitely a bug in node or express. If anyone wants to try isolating this bug and reporting it, let me know!