| @ -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? | |||
| } | |||
| } | |||
| }; | |||