| @ -1,91 +0,0 @@ | |||||
| /** | |||||
| * Main server file for the blog. This file is responsible for | |||||
| * creating the server and listening for clients. The main run | |||||
| * function parses the url and calls a sub module to make the | |||||
| * appropriate pages. | |||||
| * | |||||
| * @author Jeffery Russell 7-21-18 | |||||
| */ | |||||
| //http server | |||||
| const http = require('http'); | |||||
| //parsing request url | |||||
| const url = require('url'); | |||||
| //express app | |||||
| const express = require("express"); | |||||
| const app = express(); | |||||
| //session data for login | |||||
| const session = require('express-session'); | |||||
| //sending static content | |||||
| const includes = require('./includes/includes.js'); | |||||
| //used for file io | |||||
| const utils = require('./utils/utils.js'); | |||||
| //cache -- only used for static contents | |||||
| const cache = require('memory-cache'); | |||||
| //Initializes sessions for login | |||||
| app.use(session({ secret: utils.getFileLine('../session_secret'), cookie: { maxAge: 6000000 }})); | |||||
| //port to listen for the admin server on | |||||
| const port = 8001; | |||||
| /** | |||||
| * Parses the request url and calls correct JS files | |||||
| */ | |||||
| app.use(function(request, result) | |||||
| { | |||||
| //prevents people from pointing their dns at my IP:port for my site | |||||
| if(request.headers.host.includes("localhost:" + port) || | |||||
| request.headers.host.includes("jrtechs.net")) | |||||
| { | |||||
| const filename = url.parse(request.url, true).pathname; | |||||
| //handles image requests | |||||
| if(filename.includes("/img/") || filename.includes(".jpg") || filename.includes(".png")) | |||||
| { | |||||
| includes.sendJS(result, filename, cache); | |||||
| } | |||||
| else if(filename.includes("/css/") || filename.includes(".woff2")) | |||||
| { | |||||
| includes.sendCSS(result, filename, cache) | |||||
| } | |||||
| else if(filename.includes("/js/") || filename.includes(".js")) | |||||
| { | |||||
| includes.sendJS(result, filename, cache); | |||||
| } | |||||
| else | |||||
| { | |||||
| result.writeHead(200, {'Content-Type': 'text/html'}); | |||||
| const file = "./admin/admin.js"; | |||||
| Promise.all([includes.printAdminHeader(), | |||||
| require(file).main(request), | |||||
| includes.printFooter()]).then(function(content) | |||||
| { | |||||
| result.write(content.join('')); | |||||
| result.end(); | |||||
| }).catch(function(err) | |||||
| { | |||||
| console.log(err); | |||||
| throw err; | |||||
| }); | |||||
| } | |||||
| } | |||||
| else | |||||
| { | |||||
| // utils.printWrongHost(result); | |||||
| result.writeHead(418, {}); | |||||
| result.end(); | |||||
| } | |||||
| }); | |||||
| http.createServer(app).listen(port); | |||||
| @ -1,7 +0,0 @@ | |||||
| #!/bin/bash | |||||
| # | |||||
| # Runs the admin nodejs server for jrtechs.net | |||||
| # | |||||
| # 8/18/18 Jeffery Russell | |||||
| nodejs admin.js | |||||
| @ -0,0 +1,104 @@ | |||||
| # Insertion Sort | |||||
| # Heap Sort | |||||
| # Merge Sort | |||||
| #Quick Sort | |||||
| ## Memory Greedy Solution | |||||
| ``` | |||||
| def quickSortNormal(data): | |||||
| """ | |||||
| This is the traditional implementation of quick sort | |||||
| where there are two recursive calls. | |||||
| """ | |||||
| if len(data) == 0: | |||||
| return [] | |||||
| else: | |||||
| less, equal, greater = partition(data) | |||||
| return quickSortNormal(less) + equal + quickSortNormal(greater) | |||||
| ``` | |||||
| ## Accumulation Solution | |||||
| ``` | |||||
| def quick_sort_accumulation(data, a): | |||||
| """ | |||||
| Implementation of quickSort which forces tail recursion | |||||
| by wrapping the second recursive in the tail positioned | |||||
| recursive call and added an accumulation variable. | |||||
| """ | |||||
| if len(data) == 0: | |||||
| return a | |||||
| less, equal, greater = partition(data) | |||||
| return quick_sort_accumulation(less, | |||||
| equal + quick_sort_accumulation(greater, a)) | |||||
| def quicksort(data): | |||||
| """ | |||||
| Wrapper function for quick sort accumulation. | |||||
| """ | |||||
| return quick_sort_accumulation(data, []) | |||||
| ``` | |||||
| ## In-Place Sorting Implementation | |||||
| ``` | |||||
| def iterative_partition(data, left, right): | |||||
| """ | |||||
| Function which partitions the data into two segments, | |||||
| the left which is less than the pivot and the right | |||||
| which is greater than the pivot. The pivot for this | |||||
| algo is the right most index. This function returns | |||||
| the ending index of the pivot. | |||||
| :param data: array to be sorted | |||||
| :param left: left most portion of array to look at | |||||
| :param right: right most portion of the array to look at | |||||
| """ | |||||
| x = data[right] | |||||
| i = left - 1 | |||||
| j = left | |||||
| while j < right: | |||||
| if data[j] <= x: | |||||
| i = i + 1 | |||||
| data[i], data[j] = data[j], data[i] | |||||
| j = j+1 | |||||
| data[i + 1], data[right] = data[right], data[i + 1] | |||||
| return i + 1 | |||||
| def iterative_quick_sort(data): | |||||
| """ | |||||
| In place implementation of quick sort | |||||
| Wrapper function for iterative_quick_sort_helper which | |||||
| initializes, left, right to be the extrema of the array. | |||||
| """ | |||||
| iterative_quick_sort_helper(data, 0, len(data) -1) | |||||
| return data | |||||
| def iterative_quick_sort_helper(data, left, right): | |||||
| """ | |||||
| Uses the divide and conquer algo to sort an array | |||||
| :param data: array of data | |||||
| :param left: left index bound for sorting | |||||
| :param right: right bound for sorting | |||||
| """ | |||||
| if left < right: | |||||
| pivot = iterative_partition(data, left, right) | |||||
| iterative_quick_sort_helper(data, left, pivot -1) | |||||
| iterative_quick_sort_helper(data, pivot+1, right) | |||||
| ``` | |||||
| @ -1,64 +0,0 @@ | |||||
| //file io | |||||
| const utils = require('../utils/utils.js'); | |||||
| //used to parse the request URL | |||||
| const url = require('url'); | |||||
| /** | |||||
| * @author Jeffery Russell 10-30-18 | |||||
| * | |||||
| * @type {{main: (function(*=, *): Promise)}} | |||||
| */ | |||||
| module.exports= | |||||
| { | |||||
| /** | |||||
| * Calls posts and sidebar modules to render blog contents in order | |||||
| * | |||||
| * @param requestURL | |||||
| * @returns {Promise|*} | |||||
| */ | |||||
| main: function(request, result, baseURL) | |||||
| { | |||||
| //const filename = url.parse(request.url, true).pathname | |||||
| var filename = url.parse(request.url, true).pathname; | |||||
| if(filename.includes(".svg") || filename.includes(".svg")) | |||||
| { | |||||
| result.writeHead(200, {'Content-Type': 'image/svg+xml'}); | |||||
| } | |||||
| else if(filename.includes("/img/") || filename.includes(".jpg") || | |||||
| filename.includes(".png") || filename.includes(".ico")) | |||||
| { | |||||
| result.writeHead(200, {'Content-Type': 'image/png'}); | |||||
| } | |||||
| else if(filename.includes("/css/") || filename.includes(".woff2") || | |||||
| filename.includes(".txt")) | |||||
| { | |||||
| result.writeHead(200, {'Content-Type': 'text/css'}); | |||||
| } | |||||
| else if(filename.includes("/js/") || filename.includes(".js")) | |||||
| { | |||||
| result.writeHead(200, {'Content-Type': 'application/javascript'}); | |||||
| } | |||||
| else | |||||
| { | |||||
| result.writeHead(200, {'Content-Type': 'text/html'}); | |||||
| } | |||||
| if(filename == baseURL || filename == baseURL.substring(0, baseURL.length - 1)) | |||||
| { | |||||
| filename = baseURL + "index.html"; | |||||
| } | |||||
| utils.include("./blogContent/projects" + filename).then(function(content) | |||||
| { | |||||
| result.write(content); | |||||
| result.end(); | |||||
| }).catch(function(error) | |||||
| { | |||||
| console.log(error); | |||||
| }); | |||||
| } | |||||
| }; | |||||
| @ -0,0 +1,50 @@ | |||||
| //used to append static content to result | |||||
| const includes = require('../includes/includes.js'); | |||||
| /** | |||||
| * @author Jeffery Russell 10-30-18 | |||||
| * | |||||
| * @type {{main: (function(*=, *): Promise)}} | |||||
| */ | |||||
| module.exports= | |||||
| { | |||||
| serveStaticContent: function(request, result, filename, baseURL) | |||||
| { | |||||
| console.log(filename); | |||||
| if (filename.includes(".svg") || filename.includes(".svg")) | |||||
| { | |||||
| includes.sendSVG(result, baseURL + filename); | |||||
| return true; | |||||
| } | |||||
| //handles image requests | |||||
| else if (filename.includes(".jpg") || | |||||
| filename.includes(".png") || filename.includes(".ico")) | |||||
| { | |||||
| includes.sendImage(result, baseURL + filename); | |||||
| return true; | |||||
| } | |||||
| //css and font files | |||||
| else if (filename.includes(".woff2") || filename.includes(".css") || | |||||
| filename.includes(".txt")) | |||||
| { | |||||
| includes.sendCSS(result, baseURL + filename); | |||||
| return true; | |||||
| } | |||||
| //scripts | |||||
| else if (filename.includes(".js")) | |||||
| { | |||||
| includes.sendJS(result, baseURL + filename); | |||||
| return true; | |||||
| } | |||||
| //html | |||||
| else if (filename.includes(".html")) | |||||
| { | |||||
| includes.sendHTML(result, baseURL + filename); | |||||
| return true; | |||||
| } | |||||
| return false; | |||||
| } | |||||
| }; | |||||
| @ -0,0 +1,48 @@ | |||||
| //sending static content | |||||
| const includes = require('../includes/includes.js'); | |||||
| //used to append static content to result | |||||
| const contentLoader = require('../includes/staticContentServer.js'); | |||||
| /** | |||||
| * @author Jeffery Russell 11-3-18 | |||||
| * | |||||
| * @type {{main: (function(*=, *): Promise)}} | |||||
| */ | |||||
| module.exports= | |||||
| { | |||||
| /** | |||||
| * Calls posts and sidebar modules to render blog contents in order | |||||
| * | |||||
| * @param requestURL | |||||
| * @returns {Promise|*} | |||||
| */ | |||||
| main: function(request, result, filename) | |||||
| { | |||||
| if(contentLoader.serveStaticContent(request, result, filename, "")) | |||||
| { | |||||
| //do nothing | |||||
| } | |||||
| else | |||||
| { | |||||
| result.writeHead(200, {'Content-Type': 'text/html'}); | |||||
| const file = "../admin/admin.js"; | |||||
| Promise.all([includes.printAdminHeader(), | |||||
| require(file).main(request), | |||||
| includes.printFooter()]).then(function(content) | |||||
| { | |||||
| result.write(content.join('')); | |||||
| result.end(); | |||||
| }).catch(function(err) | |||||
| { | |||||
| console.log(err); | |||||
| throw err; | |||||
| }); | |||||
| } | |||||
| } | |||||
| }; | |||||
| @ -0,0 +1,83 @@ | |||||
| //used to append static content to result | |||||
| const includes = require('../includes/includes.js'); | |||||
| //used to append static content to result | |||||
| const contentLoader = require('../includes/staticContentServer.js'); | |||||
| //caching program to make the application run faster | |||||
| const cache = require('memory-cache'); | |||||
| /** | |||||
| * @author Jeffery Russell 11-3-18 | |||||
| * | |||||
| * @type {{main: (function(*=, *): Promise)}} | |||||
| */ | |||||
| module.exports= | |||||
| { | |||||
| /** | |||||
| * Calls posts and sidebar modules to render blog contents in order | |||||
| * | |||||
| * @param requestURL | |||||
| * @returns {Promise|*} | |||||
| */ | |||||
| main: function(request, result, filename) | |||||
| { | |||||
| if(contentLoader.serveStaticContent(request, result, filename, "")) | |||||
| { | |||||
| //do nothing | |||||
| } | |||||
| //downloads | |||||
| else if (filename.includes("/downloads/")) | |||||
| { | |||||
| require("../includes/downloads.js").main(result, filename); | |||||
| } | |||||
| else if (filename.includes("/contact")) | |||||
| { | |||||
| require("../includes/contact.js").main(request, result); | |||||
| } | |||||
| else | |||||
| { | |||||
| const html = cache.get(filename); | |||||
| result.writeHead(200, {'Content-Type': 'text/html'}); | |||||
| if (html == null) { | |||||
| var file = ""; | |||||
| if (filename === '' || filename === '/') | |||||
| { | |||||
| file = "../posts/homePage.js"; | |||||
| } | |||||
| else | |||||
| { | |||||
| var urlSplit = filename.split("/"); | |||||
| if (urlSplit.length >= 2 && urlSplit[1] === 'category') //single category page | |||||
| file = "../posts/category.js"; | |||||
| else | |||||
| file = "../posts/posts.js"; | |||||
| } | |||||
| Promise.all([includes.printHeader(), | |||||
| require(file).main(filename, request), | |||||
| includes.printFooter()]).then(function (content) | |||||
| { | |||||
| result.write(content.join('')); | |||||
| result.end(); | |||||
| cache.put(filename, content.join('')); | |||||
| }).catch(function (err) | |||||
| { | |||||
| console.log(err); | |||||
| throw err; | |||||
| }); | |||||
| } | |||||
| else | |||||
| { | |||||
| result.write(html); | |||||
| result.end(); | |||||
| } | |||||
| } | |||||
| } | |||||
| }; | |||||
| @ -0,0 +1,41 @@ | |||||
| //file io | |||||
| const utils = require('../utils/utils.js'); | |||||
| //used to parse the request URL | |||||
| const url = require('url'); | |||||
| //used to append static content to result | |||||
| const contentLoader = require('../includes/staticContentServer.js'); | |||||
| /** | |||||
| * @author Jeffery Russell 10-30-18 | |||||
| * | |||||
| * @type {{main: (function(*=, *): Promise)}} | |||||
| */ | |||||
| module.exports= | |||||
| { | |||||
| /** | |||||
| * Calls posts and sidebar modules to render blog contents in order | |||||
| * | |||||
| * @param requestURL | |||||
| * @returns {Promise|*} | |||||
| */ | |||||
| main: function(request, result, baseURL) | |||||
| { | |||||
| var filename = url.parse(request.url, true).pathname; | |||||
| if(filename == baseURL || filename == baseURL.substring(0, baseURL.length - 1)) | |||||
| { | |||||
| filename = baseURL + "index.html"; | |||||
| } | |||||
| if (!contentLoader.serveStaticContent(request, result, filename, "/blogContent/projects")) | |||||
| { | |||||
| //do something? | |||||
| } | |||||
| } | |||||
| }; | |||||