Showing
23 changed files
with
634 additions
and
59 deletions
Project/.spec.js
0 → 100644
Project/LRUCache.js
0 → 100644
| 1 | +class LRUCache{ | ||
| 2 | + constructor(capacity){ | ||
| 3 | + this.capacity = capacity; | ||
| 4 | + this.map = new Map(); | ||
| 5 | + } | ||
| 6 | + get(key){ | ||
| 7 | + const value = this.map.get(key); | ||
| 8 | + if(typeof value === "undefined"){ | ||
| 9 | + return -1; | ||
| 10 | + } | ||
| 11 | + this.map.delete(key); | ||
| 12 | + this.map.set(key, value); | ||
| 13 | + return value; | ||
| 14 | + } | ||
| 15 | + | ||
| 16 | + put(key, value){ | ||
| 17 | + let obj = {}; | ||
| 18 | + if(this.map.has(key)){ | ||
| 19 | + obj.key = key; | ||
| 20 | + obj.value = this.map.get(key); | ||
| 21 | + this.map.delete(key); | ||
| 22 | + } | ||
| 23 | + else{ | ||
| 24 | + obj.key = key; | ||
| 25 | + obj.value = value; | ||
| 26 | + } | ||
| 27 | + this.map.set(key, value); | ||
| 28 | + const keys = this.map.keys(); | ||
| 29 | + if(this.map.size > this.capacity){ | ||
| 30 | + obj.key = keys.next().value; | ||
| 31 | + obj.value = this.map.get(obj.key); | ||
| 32 | + this.map.delete(obj.key); | ||
| 33 | + } | ||
| 34 | + return obj; | ||
| 35 | + } | ||
| 36 | +} | ||
| 37 | + | ||
| 38 | +module.exports = LRUCache; | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| ... | @@ -9,13 +9,16 @@ import mongoose from "mongoose"; | ... | @@ -9,13 +9,16 @@ import mongoose from "mongoose"; |
| 9 | import session from "express-session"; | 9 | import session from "express-session"; |
| 10 | import flash from "express-flash"; | 10 | import flash from "express-flash"; |
| 11 | import MongoStore from "connect-mongo"; | 11 | import MongoStore from "connect-mongo"; |
| 12 | -import { localsMiddleware } from "./middlewares"; | 12 | +import { localsMiddleware, uploadFile } from "./middlewares"; |
| 13 | +import File from "./models/File"; | ||
| 13 | import routes from "./routes"; | 14 | import routes from "./routes"; |
| 14 | import globalRouter from "./routers/globalRouter"; | 15 | import globalRouter from "./routers/globalRouter"; |
| 15 | import fileRouter from "./routers/fileRouter"; | 16 | import fileRouter from "./routers/fileRouter"; |
| 16 | - | 17 | +import redis from 'redis'; |
| 18 | +import JSON from 'JSON'; | ||
| 17 | dotenv.config(); | 19 | dotenv.config(); |
| 18 | const app = express(); | 20 | const app = express(); |
| 21 | +const client = redis.createClient(6379,'127.0.0.1'); | ||
| 19 | 22 | ||
| 20 | const CokieStore = MongoStore(session); | 23 | const CokieStore = MongoStore(session); |
| 21 | 24 | ||
| ... | @@ -39,6 +42,84 @@ app.use( | ... | @@ -39,6 +42,84 @@ app.use( |
| 39 | app.use(flash()); | 42 | app.use(flash()); |
| 40 | app.use(localsMiddleware); | 43 | app.use(localsMiddleware); |
| 41 | app.use(routes.home, globalRouter); | 44 | app.use(routes.home, globalRouter); |
| 42 | -app.use(routes.files, fileRouter); | 45 | +//app.use(routes.files, fileRouter); |
| 46 | +app.use(function(req,res,next){ | ||
| 47 | + | ||
| 48 | + req.cache = client; | ||
| 49 | + | ||
| 50 | + next(); | ||
| 51 | + | ||
| 52 | +}) | ||
| 53 | + | ||
| 54 | +// Caching | ||
| 55 | +app.use(function(req,res,next){ | ||
| 56 | + req.cache = client; | ||
| 57 | + next(); | ||
| 58 | +}) | ||
| 59 | + | ||
| 60 | +app.get(`/files${routes.upload}`, (req, res) => | ||
| 61 | + res.render("upload", { pageTitle: "Upload" })); | ||
| 62 | + | ||
| 63 | +app.post(`/files${routes.upload}`, uploadFile, (req, res) => { | ||
| 64 | + // multer를 해야 파일이 넘어가는 것이 나타난다. | ||
| 65 | + req.accepts('application/json'); | ||
| 66 | + const key = req.body.title; | ||
| 67 | + const value = JSON.stringify(req.body); | ||
| 68 | + | ||
| 69 | + req.cache.set(key, value, (err, data) => { | ||
| 70 | + if(err){ | ||
| 71 | + console.log(err); | ||
| 72 | + res.send("error"+err); | ||
| 73 | + return; | ||
| 74 | + } | ||
| 75 | + req.cache.expire(key, 10); | ||
| 76 | + console.log(value); | ||
| 77 | + res.send(value); | ||
| 78 | + }); | ||
| 79 | +}); | ||
| 80 | +app.get('/files/:title', (req, res, next) => { | ||
| 81 | + const key = req.params.title; | ||
| 82 | + console.log('title : ' + key); | ||
| 83 | + | ||
| 84 | + req.cache.get(key, (err, data) => { | ||
| 85 | + if(err){ | ||
| 86 | + console.log(err); | ||
| 87 | + res.send("error : " + err); | ||
| 88 | + return; | ||
| 89 | + } | ||
| 90 | + | ||
| 91 | + const value = JSON.parse(data); | ||
| 92 | + res.json(value); | ||
| 93 | + }); | ||
| 94 | +}); | ||
| 95 | + | ||
| 96 | +app.get('/view_cache', (req, res) => { | ||
| 97 | + req.cache.get('/files/:title', async (err, data) => { | ||
| 98 | + if(err){ | ||
| 99 | + console.log(err); | ||
| 100 | + res.send("error : " + err); | ||
| 101 | + return; | ||
| 102 | + } | ||
| 103 | + if(!data) { | ||
| 104 | + const allData = await File.find({}).sort({ _id: -1 }); | ||
| 105 | + const dataArr = JSON.stringify(allData); | ||
| 106 | + req.cache.set('/files/:title', dataArr, (err, data) => { | ||
| 107 | + if(err){ | ||
| 108 | + console.log(err); | ||
| 109 | + res.send("error :" + err); | ||
| 110 | + return; | ||
| 111 | + } | ||
| 112 | + req.cache.expire('/files/:title', 10); | ||
| 113 | + res.send(dataArr) | ||
| 114 | + }) | ||
| 115 | + } | ||
| 116 | + else { | ||
| 117 | + res.send(data) | ||
| 118 | + } | ||
| 119 | + }); | ||
| 120 | +}); | ||
| 121 | + | ||
| 122 | + | ||
| 123 | + | ||
| 43 | 124 | ||
| 44 | export default app; // 파일을 불러올때 app object를 준다는 의미. | 125 | export default app; // 파일을 불러올때 app object를 준다는 의미. | ... | ... |
| 1 | /* eslint-disable no-console */ | 1 | /* eslint-disable no-console */ |
| 2 | import routes from "../routes"; | 2 | import routes from "../routes"; |
| 3 | import File from "../models/File"; | 3 | import File from "../models/File"; |
| 4 | + | ||
| 4 | const createCsvWriter = require('csv-writer').createObjectCsvWriter; | 5 | const createCsvWriter = require('csv-writer').createObjectCsvWriter; |
| 5 | const csvInsertWriter = createCsvWriter({ | 6 | const csvInsertWriter = createCsvWriter({ |
| 6 | path: 'insertOutput.csv', | 7 | path: 'insertOutput.csv', |
| ... | @@ -23,24 +24,31 @@ export const home = async (req, res) => { | ... | @@ -23,24 +24,31 @@ export const home = async (req, res) => { |
| 23 | res.render("home", { pageTitle: "Home", files: [] }); | 24 | res.render("home", { pageTitle: "Home", files: [] }); |
| 24 | } | 25 | } |
| 25 | }; | 26 | }; |
| 26 | -const searchTime = new Array(); | 27 | +// const searchTime = new Array(); |
| 27 | export const search = async (req, res) => { | 28 | export const search = async (req, res) => { |
| 28 | - const startTime = new Date().getTime(); | 29 | + console.log(req); |
| 30 | + // const startTime = new Date().getTime(); | ||
| 29 | const { | 31 | const { |
| 30 | query: { term: searchingBy }, | 32 | query: { term: searchingBy }, |
| 31 | } = req; // == const searchingBy = req.query.term; | 33 | } = req; // == const searchingBy = req.query.term; |
| 32 | let files = []; | 34 | let files = []; |
| 33 | try { | 35 | try { |
| 34 | files = await File.find({ | 36 | files = await File.find({ |
| 35 | - title: { $regex: searchingBy, $options: "i" }, // i를 옵션으로 추가하면 insensitive.. 대소문자 구분 안함. | 37 | + title: { $regex: searchingBy, $options: "i" }, // i를 옵션으로 추가하면 insensitive.. 대소문자 구분 안함. |
| 36 | }); | 38 | }); |
| 39 | + /* | ||
| 37 | const endTime = new Date().getTime(); // SELECT의 경우 파일 시간 측정 | 40 | const endTime = new Date().getTime(); // SELECT의 경우 파일 시간 측정 |
| 38 | searchTime.push({ms: endTime - startTime}); | 41 | searchTime.push({ms: endTime - startTime}); |
| 39 | - if (searchTime.length === 3){ | 42 | + if (searchTime.length === 50){ |
| 40 | csvSelectWriter | 43 | csvSelectWriter |
| 41 | .writeRecords(searchTime) | 44 | .writeRecords(searchTime) |
| 42 | .then(() => console.log("The CSV file was written successfully~")); | 45 | .then(() => console.log("The CSV file was written successfully~")); |
| 43 | } | 46 | } |
| 47 | + | ||
| 48 | + for (var i = 0; i < searchTime.length; i++){ | ||
| 49 | + console.log(i+1 + "번째 속도: " + Object.values(searchTime[i]) + "ms"); | ||
| 50 | + } | ||
| 51 | + */ | ||
| 44 | } catch (error) { | 52 | } catch (error) { |
| 45 | console.log(error); | 53 | console.log(error); |
| 46 | } | 54 | } |
| ... | @@ -54,7 +62,7 @@ export const getUpload = (req, res) => | ... | @@ -54,7 +62,7 @@ export const getUpload = (req, res) => |
| 54 | 62 | ||
| 55 | const insertTime = new Array(); | 63 | const insertTime = new Array(); |
| 56 | export const postUpload = async (req, res) => { | 64 | export const postUpload = async (req, res) => { |
| 57 | - const startTime = new Date().getTime(); | 65 | + // const startTime = new Date().getTime(); |
| 58 | // multer를 해야 파일이 넘어가는 것이 나타난다. | 66 | // multer를 해야 파일이 넘어가는 것이 나타난다. |
| 59 | const { | 67 | const { |
| 60 | body: { title }, | 68 | body: { title }, |
| ... | @@ -66,14 +74,20 @@ export const postUpload = async (req, res) => { | ... | @@ -66,14 +74,20 @@ export const postUpload = async (req, res) => { |
| 66 | title, | 74 | title, |
| 67 | // 여기있는 fileUrl, title은 fileDB의 속성이다. | 75 | // 여기있는 fileUrl, title은 fileDB의 속성이다. |
| 68 | }); | 76 | }); |
| 69 | - console.log(newFile); | 77 | + // console.log(newFile); |
| 78 | + /* | ||
| 70 | const endTime = new Date().getTime(); // INSERT의 경우 파일 시간 측정 | 79 | const endTime = new Date().getTime(); // INSERT의 경우 파일 시간 측정 |
| 71 | insertTime.push({ms: endTime - startTime}); | 80 | insertTime.push({ms: endTime - startTime}); |
| 72 | - if (insertTime.length === 3){ | 81 | + if (insertTime.length === 50){ |
| 73 | csvInsertWriter | 82 | csvInsertWriter |
| 74 | .writeRecords(insertTime) | 83 | .writeRecords(insertTime) |
| 75 | .then(() => console.log("The CSV file was written successfully~")); | 84 | .then(() => console.log("The CSV file was written successfully~")); |
| 76 | } | 85 | } |
| 86 | + | ||
| 87 | + for (var i = 0; i < insertTime.length; i++){ | ||
| 88 | + console.log(i+1 + "번째 속도: " + Object.values(insertTime[i]) + "ms"); | ||
| 89 | + } | ||
| 90 | + */ | ||
| 77 | res.redirect(routes.home); | 91 | res.redirect(routes.home); |
| 78 | }; | 92 | }; |
| 79 | 93 | ... | ... |
| ... | @@ -2,6 +2,7 @@ dotenv.config(); | ... | @@ -2,6 +2,7 @@ dotenv.config(); |
| 2 | import dotenv from "dotenv"; | 2 | import dotenv from "dotenv"; |
| 3 | import app from "./app"; // app.js에서 export default app했기 때문에 불러올 수 있다. | 3 | import app from "./app"; // app.js에서 export default app했기 때문에 불러올 수 있다. |
| 4 | import "./db"; | 4 | import "./db"; |
| 5 | +import "./test/lruCache.spec"; | ||
| 5 | import "./models/File"; | 6 | import "./models/File"; |
| 6 | 7 | ||
| 7 | const PORT = process.env.PORT || 80; | 8 | const PORT = process.env.PORT || 80; | ... | ... |
Project/insertOutput.csv
0 → 100644
| 1 | +time | ||
| 2 | +146 | ||
| 3 | +11 | ||
| 4 | +5 | ||
| 5 | +5 | ||
| 6 | +8 | ||
| 7 | +9 | ||
| 8 | +79 | ||
| 9 | +11 | ||
| 10 | +2 | ||
| 11 | +154 | ||
| 12 | +27 | ||
| 13 | +10 | ||
| 14 | +9 | ||
| 15 | +10 | ||
| 16 | +53 | ||
| 17 | +8 | ||
| 18 | +9 | ||
| 19 | +4 | ||
| 20 | +8 | ||
| 21 | +50 | ||
| 22 | +5 | ||
| 23 | +10 | ||
| 24 | +10 | ||
| 25 | +9 | ||
| 26 | +9 | ||
| 27 | +16 | ||
| 28 | +3 | ||
| 29 | +3 | ||
| 30 | +31 | ||
| 31 | +29 | ||
| 32 | +4 | ||
| 33 | +3 | ||
| 34 | +3 | ||
| 35 | +5 | ||
| 36 | +3 | ||
| 37 | +3 | ||
| 38 | +3 | ||
| 39 | +2 | ||
| 40 | +12 | ||
| 41 | +49 | ||
| 42 | +3 | ||
| 43 | +4 | ||
| 44 | +3 | ||
| 45 | +4 | ||
| 46 | +60 | ||
| 47 | +3 | ||
| 48 | +3 | ||
| 49 | +3 | ||
| 50 | +4 | ||
| 51 | +70 |
| ... | @@ -18,8 +18,8 @@ var LRU = require("lru-cache") | ... | @@ -18,8 +18,8 @@ var LRU = require("lru-cache") |
| 18 | , length: function (n, key) { return n * 2 + key.length } | 18 | , length: function (n, key) { return n * 2 + key.length } |
| 19 | , dispose: function (key, n) { n.close() } | 19 | , dispose: function (key, n) { n.close() } |
| 20 | , maxAge: 1000 * 60 * 60 } | 20 | , maxAge: 1000 * 60 * 60 } |
| 21 | - , cache = LRU(options) | 21 | + , cache = new LRU(options) |
| 22 | - , otherCache = LRU(50) // sets just the max size | 22 | + , otherCache = new LRU(50) // sets just the max size |
| 23 | 23 | ||
| 24 | cache.set("key", "value") | 24 | cache.set("key", "value") |
| 25 | cache.get("key") // "value" | 25 | cache.get("key") // "value" |
| ... | @@ -49,10 +49,13 @@ away. | ... | @@ -49,10 +49,13 @@ away. |
| 49 | * `max` The maximum size of the cache, checked by applying the length | 49 | * `max` The maximum size of the cache, checked by applying the length |
| 50 | function to all values in the cache. Not setting this is kind of | 50 | function to all values in the cache. Not setting this is kind of |
| 51 | silly, since that's the whole purpose of this lib, but it defaults | 51 | silly, since that's the whole purpose of this lib, but it defaults |
| 52 | - to `Infinity`. | 52 | + to `Infinity`. Setting it to a non-number or negative number will |
| 53 | + throw a `TypeError`. Setting it to 0 makes it be `Infinity`. | ||
| 53 | * `maxAge` Maximum age in ms. Items are not pro-actively pruned out | 54 | * `maxAge` Maximum age in ms. Items are not pro-actively pruned out |
| 54 | as they age, but if you try to get an item that is too old, it'll | 55 | as they age, but if you try to get an item that is too old, it'll |
| 55 | drop it and return undefined instead of giving it to you. | 56 | drop it and return undefined instead of giving it to you. |
| 57 | + Setting this to a negative value will make everything seem old! | ||
| 58 | + Setting it to a non-number will throw a `TypeError`. | ||
| 56 | * `length` Function that is used to calculate the length of stored | 59 | * `length` Function that is used to calculate the length of stored |
| 57 | items. If you're storing strings or buffers, then you probably want | 60 | items. If you're storing strings or buffers, then you probably want |
| 58 | to do something like `function(n, key){return n.length}`. The default is | 61 | to do something like `function(n, key){return n.length}`. The default is |
| ... | @@ -76,6 +79,11 @@ away. | ... | @@ -76,6 +79,11 @@ away. |
| 76 | it'll be called whenever a `set()` operation overwrites an existing | 79 | it'll be called whenever a `set()` operation overwrites an existing |
| 77 | key. If you set this option, `dispose()` will only be called when a | 80 | key. If you set this option, `dispose()` will only be called when a |
| 78 | key falls out of the cache, not when it is overwritten. | 81 | key falls out of the cache, not when it is overwritten. |
| 82 | +* `updateAgeOnGet` When using time-expiring entries with `maxAge`, | ||
| 83 | + setting this to `true` will make each item's effective time update | ||
| 84 | + to the current time whenever it is retrieved from cache, causing it | ||
| 85 | + to not expire. (It can still fall out of cache based on recency of | ||
| 86 | + use, of course.) | ||
| 79 | 87 | ||
| 80 | ## API | 88 | ## API |
| 81 | 89 | ... | ... |
This diff is collapsed. Click to expand it.
| 1 | { | 1 | { |
| 2 | - "_from": "lru-cache@^4.0.1", | 2 | + "_from": "lru-cache", |
| 3 | - "_id": "lru-cache@4.1.5", | 3 | + "_id": "lru-cache@6.0.0", |
| 4 | "_inBundle": false, | 4 | "_inBundle": false, |
| 5 | - "_integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", | 5 | + "_integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", |
| 6 | "_location": "/lru-cache", | 6 | "_location": "/lru-cache", |
| 7 | "_phantomChildren": {}, | 7 | "_phantomChildren": {}, |
| 8 | "_requested": { | 8 | "_requested": { |
| 9 | - "type": "range", | 9 | + "type": "tag", |
| 10 | "registry": true, | 10 | "registry": true, |
| 11 | - "raw": "lru-cache@^4.0.1", | 11 | + "raw": "lru-cache", |
| 12 | "name": "lru-cache", | 12 | "name": "lru-cache", |
| 13 | "escapedName": "lru-cache", | 13 | "escapedName": "lru-cache", |
| 14 | - "rawSpec": "^4.0.1", | 14 | + "rawSpec": "", |
| 15 | "saveSpec": null, | 15 | "saveSpec": null, |
| 16 | - "fetchSpec": "^4.0.1" | 16 | + "fetchSpec": "latest" |
| 17 | }, | 17 | }, |
| 18 | "_requiredBy": [ | 18 | "_requiredBy": [ |
| 19 | - "/cross-spawn" | 19 | + "#USER", |
| 20 | + "/" | ||
| 20 | ], | 21 | ], |
| 21 | - "_resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", | 22 | + "_resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", |
| 22 | - "_shasum": "8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd", | 23 | + "_shasum": "6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94", |
| 23 | - "_spec": "lru-cache@^4.0.1", | 24 | + "_spec": "lru-cache", |
| 24 | - "_where": "/Users/noblyan/Desktop/4_2/캡스톤디자인II/2017110267/Project/node_modules/cross-spawn", | 25 | + "_where": "/Users/noblyan/Desktop/4_2/캡스톤디자인II/2017110267/Project", |
| 25 | "author": { | 26 | "author": { |
| 26 | "name": "Isaac Z. Schlueter", | 27 | "name": "Isaac Z. Schlueter", |
| 27 | "email": "i@izs.me" | 28 | "email": "i@izs.me" |
| ... | @@ -31,15 +32,16 @@ | ... | @@ -31,15 +32,16 @@ |
| 31 | }, | 32 | }, |
| 32 | "bundleDependencies": false, | 33 | "bundleDependencies": false, |
| 33 | "dependencies": { | 34 | "dependencies": { |
| 34 | - "pseudomap": "^1.0.2", | 35 | + "yallist": "^4.0.0" |
| 35 | - "yallist": "^2.1.2" | ||
| 36 | }, | 36 | }, |
| 37 | "deprecated": false, | 37 | "deprecated": false, |
| 38 | "description": "A cache object that deletes the least-recently-used items.", | 38 | "description": "A cache object that deletes the least-recently-used items.", |
| 39 | "devDependencies": { | 39 | "devDependencies": { |
| 40 | "benchmark": "^2.1.4", | 40 | "benchmark": "^2.1.4", |
| 41 | - "standard": "^12.0.1", | 41 | + "tap": "^14.10.7" |
| 42 | - "tap": "^12.1.0" | 42 | + }, |
| 43 | + "engines": { | ||
| 44 | + "node": ">=10" | ||
| 43 | }, | 45 | }, |
| 44 | "files": [ | 46 | "files": [ |
| 45 | "index.js" | 47 | "index.js" |
| ... | @@ -58,14 +60,11 @@ | ... | @@ -58,14 +60,11 @@ |
| 58 | "url": "git://github.com/isaacs/node-lru-cache.git" | 60 | "url": "git://github.com/isaacs/node-lru-cache.git" |
| 59 | }, | 61 | }, |
| 60 | "scripts": { | 62 | "scripts": { |
| 61 | - "coveragerport": "tap --coverage-report=html", | 63 | + "postversion": "npm publish", |
| 62 | - "lintfix": "standard --fix test/*.js index.js", | 64 | + "prepublishOnly": "git push origin --follow-tags", |
| 63 | - "postpublish": "git push origin --all; git push origin --tags", | ||
| 64 | - "posttest": "standard test/*.js index.js", | ||
| 65 | - "postversion": "npm publish --tag=legacy", | ||
| 66 | "preversion": "npm test", | 65 | "preversion": "npm test", |
| 67 | - "snap": "TAP_SNAPSHOT=1 tap test/*.js -J", | 66 | + "snap": "tap", |
| 68 | - "test": "tap test/*.js --100 -J" | 67 | + "test": "tap" |
| 69 | }, | 68 | }, |
| 70 | - "version": "4.1.5" | 69 | + "version": "6.0.0" |
| 71 | } | 70 | } | ... | ... |
| 1 | -var Yallist = require('./yallist.js') | 1 | +'use strict' |
| 2 | - | 2 | +module.exports = function (Yallist) { |
| 3 | -Yallist.prototype[Symbol.iterator] = function* () { | 3 | + Yallist.prototype[Symbol.iterator] = function* () { |
| 4 | - for (let walker = this.head; walker; walker = walker.next) { | 4 | + for (let walker = this.head; walker; walker = walker.next) { |
| 5 | - yield walker.value | 5 | + yield walker.value |
| 6 | + } | ||
| 6 | } | 7 | } |
| 7 | } | 8 | } | ... | ... |
| 1 | { | 1 | { |
| 2 | - "_from": "yallist@^2.1.2", | 2 | + "_from": "yallist@^4.0.0", |
| 3 | - "_id": "yallist@2.1.2", | 3 | + "_id": "yallist@4.0.0", |
| 4 | "_inBundle": false, | 4 | "_inBundle": false, |
| 5 | - "_integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", | 5 | + "_integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", |
| 6 | "_location": "/yallist", | 6 | "_location": "/yallist", |
| 7 | "_phantomChildren": {}, | 7 | "_phantomChildren": {}, |
| 8 | "_requested": { | 8 | "_requested": { |
| 9 | "type": "range", | 9 | "type": "range", |
| 10 | "registry": true, | 10 | "registry": true, |
| 11 | - "raw": "yallist@^2.1.2", | 11 | + "raw": "yallist@^4.0.0", |
| 12 | "name": "yallist", | 12 | "name": "yallist", |
| 13 | "escapedName": "yallist", | 13 | "escapedName": "yallist", |
| 14 | - "rawSpec": "^2.1.2", | 14 | + "rawSpec": "^4.0.0", |
| 15 | "saveSpec": null, | 15 | "saveSpec": null, |
| 16 | - "fetchSpec": "^2.1.2" | 16 | + "fetchSpec": "^4.0.0" |
| 17 | }, | 17 | }, |
| 18 | "_requiredBy": [ | 18 | "_requiredBy": [ |
| 19 | "/lru-cache" | 19 | "/lru-cache" |
| 20 | ], | 20 | ], |
| 21 | - "_resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", | 21 | + "_resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", |
| 22 | - "_shasum": "1c11f9218f076089a47dd512f93c6699a6a81d52", | 22 | + "_shasum": "9bb92790d9c0effec63be73519e11a35019a3a72", |
| 23 | - "_spec": "yallist@^2.1.2", | 23 | + "_spec": "yallist@^4.0.0", |
| 24 | "_where": "/Users/noblyan/Desktop/4_2/캡스톤디자인II/2017110267/Project/node_modules/lru-cache", | 24 | "_where": "/Users/noblyan/Desktop/4_2/캡스톤디자인II/2017110267/Project/node_modules/lru-cache", |
| 25 | "author": { | 25 | "author": { |
| 26 | "name": "Isaac Z. Schlueter", | 26 | "name": "Isaac Z. Schlueter", |
| ... | @@ -35,7 +35,7 @@ | ... | @@ -35,7 +35,7 @@ |
| 35 | "deprecated": false, | 35 | "deprecated": false, |
| 36 | "description": "Yet Another Linked List", | 36 | "description": "Yet Another Linked List", |
| 37 | "devDependencies": { | 37 | "devDependencies": { |
| 38 | - "tap": "^10.3.0" | 38 | + "tap": "^12.1.0" |
| 39 | }, | 39 | }, |
| 40 | "directories": { | 40 | "directories": { |
| 41 | "test": "test" | 41 | "test": "test" |
| ... | @@ -58,5 +58,5 @@ | ... | @@ -58,5 +58,5 @@ |
| 58 | "preversion": "npm test", | 58 | "preversion": "npm test", |
| 59 | "test": "tap test/*.js --100" | 59 | "test": "tap test/*.js --100" |
| 60 | }, | 60 | }, |
| 61 | - "version": "2.1.2" | 61 | + "version": "4.0.0" |
| 62 | } | 62 | } | ... | ... |
| 1 | +'use strict' | ||
| 1 | module.exports = Yallist | 2 | module.exports = Yallist |
| 2 | 3 | ||
| 3 | Yallist.Node = Node | 4 | Yallist.Node = Node |
| ... | @@ -53,6 +54,8 @@ Yallist.prototype.removeNode = function (node) { | ... | @@ -53,6 +54,8 @@ Yallist.prototype.removeNode = function (node) { |
| 53 | node.next = null | 54 | node.next = null |
| 54 | node.prev = null | 55 | node.prev = null |
| 55 | node.list = null | 56 | node.list = null |
| 57 | + | ||
| 58 | + return next | ||
| 56 | } | 59 | } |
| 57 | 60 | ||
| 58 | Yallist.prototype.unshiftNode = function (node) { | 61 | Yallist.prototype.unshiftNode = function (node) { |
| ... | @@ -317,6 +320,37 @@ Yallist.prototype.sliceReverse = function (from, to) { | ... | @@ -317,6 +320,37 @@ Yallist.prototype.sliceReverse = function (from, to) { |
| 317 | return ret | 320 | return ret |
| 318 | } | 321 | } |
| 319 | 322 | ||
| 323 | +Yallist.prototype.splice = function (start, deleteCount, ...nodes) { | ||
| 324 | + if (start > this.length) { | ||
| 325 | + start = this.length - 1 | ||
| 326 | + } | ||
| 327 | + if (start < 0) { | ||
| 328 | + start = this.length + start; | ||
| 329 | + } | ||
| 330 | + | ||
| 331 | + for (var i = 0, walker = this.head; walker !== null && i < start; i++) { | ||
| 332 | + walker = walker.next | ||
| 333 | + } | ||
| 334 | + | ||
| 335 | + var ret = [] | ||
| 336 | + for (var i = 0; walker && i < deleteCount; i++) { | ||
| 337 | + ret.push(walker.value) | ||
| 338 | + walker = this.removeNode(walker) | ||
| 339 | + } | ||
| 340 | + if (walker === null) { | ||
| 341 | + walker = this.tail | ||
| 342 | + } | ||
| 343 | + | ||
| 344 | + if (walker !== this.head && walker !== this.tail) { | ||
| 345 | + walker = walker.prev | ||
| 346 | + } | ||
| 347 | + | ||
| 348 | + for (var i = 0; i < nodes.length; i++) { | ||
| 349 | + walker = insert(this, walker, nodes[i]) | ||
| 350 | + } | ||
| 351 | + return ret; | ||
| 352 | +} | ||
| 353 | + | ||
| 320 | Yallist.prototype.reverse = function () { | 354 | Yallist.prototype.reverse = function () { |
| 321 | var head = this.head | 355 | var head = this.head |
| 322 | var tail = this.tail | 356 | var tail = this.tail |
| ... | @@ -330,6 +364,23 @@ Yallist.prototype.reverse = function () { | ... | @@ -330,6 +364,23 @@ Yallist.prototype.reverse = function () { |
| 330 | return this | 364 | return this |
| 331 | } | 365 | } |
| 332 | 366 | ||
| 367 | +function insert (self, node, value) { | ||
| 368 | + var inserted = node === self.head ? | ||
| 369 | + new Node(value, null, node, self) : | ||
| 370 | + new Node(value, node, node.next, self) | ||
| 371 | + | ||
| 372 | + if (inserted.next === null) { | ||
| 373 | + self.tail = inserted | ||
| 374 | + } | ||
| 375 | + if (inserted.prev === null) { | ||
| 376 | + self.head = inserted | ||
| 377 | + } | ||
| 378 | + | ||
| 379 | + self.length++ | ||
| 380 | + | ||
| 381 | + return inserted | ||
| 382 | +} | ||
| 383 | + | ||
| 333 | function push (self, item) { | 384 | function push (self, item) { |
| 334 | self.tail = new Node(item, self.tail, null, self) | 385 | self.tail = new Node(item, self.tail, null, self) |
| 335 | if (!self.head) { | 386 | if (!self.head) { |
| ... | @@ -368,3 +419,8 @@ function Node (value, prev, next, list) { | ... | @@ -368,3 +419,8 @@ function Node (value, prev, next, list) { |
| 368 | this.next = null | 419 | this.next = null |
| 369 | } | 420 | } |
| 370 | } | 421 | } |
| 422 | + | ||
| 423 | +try { | ||
| 424 | + // add if support for Symbol.iterator is present | ||
| 425 | + require('./iterator.js')(Yallist) | ||
| 426 | +} catch (er) {} | ... | ... |
Project/output.csv
deleted
100644 → 0
This diff is collapsed. Click to expand it.
| ... | @@ -7,7 +7,7 @@ | ... | @@ -7,7 +7,7 @@ |
| 7 | "dev:server": "nodemon --exec babel-node init.js --delay 2 --ignore '.scss' --ignore 'static'", | 7 | "dev:server": "nodemon --exec babel-node init.js --delay 2 --ignore '.scss' --ignore 'static'", |
| 8 | "dev:assets": "WEBPACK_ENV=development webpack -w", | 8 | "dev:assets": "WEBPACK_ENV=development webpack -w", |
| 9 | "build:assets": "WEBPACK_ENV=production webpack", | 9 | "build:assets": "WEBPACK_ENV=production webpack", |
| 10 | - "tunnel": "ngrok http 80" | 10 | + "test": "mocha" |
| 11 | }, | 11 | }, |
| 12 | "repository": { | 12 | "repository": { |
| 13 | "type": "git", | 13 | "type": "git", |
| ... | @@ -21,11 +21,13 @@ | ... | @@ -21,11 +21,13 @@ |
| 21 | "@babel/node": "^7.8.7", | 21 | "@babel/node": "^7.8.7", |
| 22 | "@babel/polyfill": "^7.10.1", | 22 | "@babel/polyfill": "^7.10.1", |
| 23 | "@babel/preset-env": "^7.9.6", | 23 | "@babel/preset-env": "^7.9.6", |
| 24 | + "JSON": "^1.0.0", | ||
| 24 | "autoprefixer": "^9.8.0", | 25 | "autoprefixer": "^9.8.0", |
| 25 | "aws-sdk": "^2.702.0", | 26 | "aws-sdk": "^2.702.0", |
| 26 | "axios": "^0.19.2", | 27 | "axios": "^0.19.2", |
| 27 | "babel-loader": "^8.1.0", | 28 | "babel-loader": "^8.1.0", |
| 28 | "body-parser": "^1.19.0", | 29 | "body-parser": "^1.19.0", |
| 30 | + "chai": "^4.2.0", | ||
| 29 | "connect-mongo": "^3.2.0", | 31 | "connect-mongo": "^3.2.0", |
| 30 | "cookie-parser": "^1.4.5", | 32 | "cookie-parser": "^1.4.5", |
| 31 | "css-loader": "^3.5.3", | 33 | "css-loader": "^3.5.3", |
| ... | @@ -37,6 +39,7 @@ | ... | @@ -37,6 +39,7 @@ |
| 37 | "extract-text-webpack-plugin": "^4.0.0-beta.0", | 39 | "extract-text-webpack-plugin": "^4.0.0-beta.0", |
| 38 | "get-blob-duration": "^1.1.1", | 40 | "get-blob-duration": "^1.1.1", |
| 39 | "helmet": "^3.22.0", | 41 | "helmet": "^3.22.0", |
| 42 | + "lru-cache": "^6.0.0", | ||
| 40 | "mongoose": "^5.9.15", | 43 | "mongoose": "^5.9.15", |
| 41 | "morgan": "^1.10.0", | 44 | "morgan": "^1.10.0", |
| 42 | "multer": "^1.4.2", | 45 | "multer": "^1.4.2", |
| ... | @@ -52,6 +55,7 @@ | ... | @@ -52,6 +55,7 @@ |
| 52 | "perf_hooks": "0.0.1", | 55 | "perf_hooks": "0.0.1", |
| 53 | "postcss-loader": "^3.0.0", | 56 | "postcss-loader": "^3.0.0", |
| 54 | "pug": "^2.0.4", | 57 | "pug": "^2.0.4", |
| 58 | + "redis": "^3.0.2", | ||
| 55 | "sass-loader": "^8.0.2", | 59 | "sass-loader": "^8.0.2", |
| 56 | "webpack": "^4.43.0", | 60 | "webpack": "^4.43.0", |
| 57 | "webpack-cli": "^3.3.11" | 61 | "webpack-cli": "^3.3.11" |
| ... | @@ -62,7 +66,10 @@ | ... | @@ -62,7 +66,10 @@ |
| 62 | "eslint-config-prettier": "^6.11.0", | 66 | "eslint-config-prettier": "^6.11.0", |
| 63 | "eslint-plugin-import": "^2.21.1", | 67 | "eslint-plugin-import": "^2.21.1", |
| 64 | "eslint-plugin-prettier": "^3.1.3", | 68 | "eslint-plugin-prettier": "^3.1.3", |
| 69 | + "mocha": "^8.2.1", | ||
| 70 | + "loadtest": "*", | ||
| 65 | "nodemon": "^2.0.4", | 71 | "nodemon": "^2.0.4", |
| 66 | - "prettier": "^2.0.5" | 72 | + "prettier": "^2.0.5", |
| 73 | + "supertest": "^6.0.1" | ||
| 67 | } | 74 | } |
| 68 | } | 75 | } | ... | ... |
Project/redis.js
0 → 100644
Project/selectOutput.csv
0 → 100644
| 1 | +time | ||
| 2 | +24 | ||
| 3 | +4 | ||
| 4 | +6 | ||
| 5 | +6 | ||
| 6 | +3 | ||
| 7 | +3 | ||
| 8 | +3 | ||
| 9 | +3 | ||
| 10 | +3 | ||
| 11 | +3 | ||
| 12 | +2 | ||
| 13 | +2 | ||
| 14 | +3 | ||
| 15 | +2 | ||
| 16 | +3 | ||
| 17 | +2 | ||
| 18 | +2 | ||
| 19 | +2 | ||
| 20 | +2 | ||
| 21 | +11 | ||
| 22 | +7 | ||
| 23 | +5 | ||
| 24 | +3 | ||
| 25 | +2 | ||
| 26 | +2 | ||
| 27 | +2 | ||
| 28 | +2 | ||
| 29 | +3 | ||
| 30 | +2 | ||
| 31 | +2 | ||
| 32 | +2 | ||
| 33 | +2 | ||
| 34 | +2 | ||
| 35 | +2 | ||
| 36 | +2 | ||
| 37 | +6 | ||
| 38 | +3 | ||
| 39 | +2 | ||
| 40 | +13 | ||
| 41 | +39 | ||
| 42 | +3 | ||
| 43 | +2 | ||
| 44 | +2 | ||
| 45 | +2 | ||
| 46 | +2 | ||
| 47 | +2 | ||
| 48 | +3 | ||
| 49 | +2 | ||
| 50 | +1 | ||
| 51 | +3 |
Project/test/lruCache.spec.js
0 → 100644
| 1 | +/* | ||
| 2 | +const { expect } = require('chai'); | ||
| 3 | +const LRU = require('lru-cache'); | ||
| 4 | + | ||
| 5 | +const MAX = 3; | ||
| 6 | + | ||
| 7 | +const options = { | ||
| 8 | + max: MAX, | ||
| 9 | + maxAge: 1900, | ||
| 10 | + length(n, key) { return 1}, | ||
| 11 | +}; | ||
| 12 | + | ||
| 13 | +describe('LRU Cache Test', () => { | ||
| 14 | + before( () => { | ||
| 15 | + lruCache = new LRU(options); | ||
| 16 | + // 데이터들을 최대로 cache! | ||
| 17 | + lruCache.set(1, 'SampleData1'); | ||
| 18 | + lruCache.set(2, 'SampleData2'); | ||
| 19 | + lruCache.set(3, 'SampleData3'); | ||
| 20 | + }); | ||
| 21 | + | ||
| 22 | + it('LRU algorithm Test', () => { | ||
| 23 | + // Happy3을 key로 가지는 데이터를 가장 사용 안함 | ||
| 24 | + lruCache.keys().forEach( k => { | ||
| 25 | + for(let i = 0; i <= MAX - k; i++) { | ||
| 26 | + console.log("########", k, lruCache.get(k)); | ||
| 27 | + } | ||
| 28 | + }); | ||
| 29 | + | ||
| 30 | + // 새로운 데이터 cache! | ||
| 31 | + lruCache.set(4, 'SampleData4'); | ||
| 32 | + | ||
| 33 | + //LRU 알고리즘에 의해 key가 3인 데이터가 삭제되어야함 | ||
| 34 | + expect(lruCache.has(1)).to.be.equal(true); | ||
| 35 | + expect(lruCache.has(2)).to.be.equal(true); | ||
| 36 | + expect(lruCache.has(3)).to.be.equal(false); | ||
| 37 | + expect(lruCache.has(4)).to.be.equal(true); | ||
| 38 | + }); | ||
| 39 | + | ||
| 40 | + it('dump & load Test', () => { | ||
| 41 | + //dump | ||
| 42 | + let cacheEntriesArray = lruCache.dump(); | ||
| 43 | + lruCache.reset(); | ||
| 44 | + expect(lruCache.itemCount).to.be.equal(0); | ||
| 45 | + | ||
| 46 | + //load | ||
| 47 | + lruCache.load(cacheEntriesArray); | ||
| 48 | + expect(lruCache.itemCount).to.be.equal(3); | ||
| 49 | + }); | ||
| 50 | + | ||
| 51 | + | ||
| 52 | + it('Expire time Test', done => { | ||
| 53 | + //maxAge 시간 후엔 데이터 모두 만료되어야함 | ||
| 54 | + setTimeout(() => { | ||
| 55 | + cache.prune(); | ||
| 56 | + expect(lruCache.itemCount).to.be.equal(0); | ||
| 57 | + done(); | ||
| 58 | + }, 1900); | ||
| 59 | + }); | ||
| 60 | +});*/ | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| ... | @@ -7,4 +7,5 @@ block content | ... | @@ -7,4 +7,5 @@ block content |
| 7 | label(for="file") File | 7 | label(for="file") File |
| 8 | input(type="file", id="file", name="file", required=true) | 8 | input(type="file", id="file", name="file", required=true) |
| 9 | input(type="text", placeholder="Title", name="title", required=true) | 9 | input(type="text", placeholder="Title", name="title", required=true) |
| 10 | + input(type="text", placeholder="Description", name="description", required=true) | ||
| 10 | input(type="submit", value="Upload File") | 11 | input(type="submit", value="Upload File") |
| ... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
Project/측정/test1/insertOutput.csv
0 → 100644
| 1 | +time | ||
| 2 | +37 | ||
| 3 | +11 | ||
| 4 | +6 | ||
| 5 | +13 | ||
| 6 | +4 | ||
| 7 | +9 | ||
| 8 | +9 | ||
| 9 | +11 | ||
| 10 | +3 | ||
| 11 | +3 | ||
| 12 | +3 | ||
| 13 | +9 | ||
| 14 | +12 | ||
| 15 | +9 | ||
| 16 | +5 | ||
| 17 | +3 | ||
| 18 | +2 | ||
| 19 | +3 | ||
| 20 | +8 | ||
| 21 | +4 | ||
| 22 | +2 | ||
| 23 | +2 | ||
| 24 | +5 | ||
| 25 | +4 | ||
| 26 | +2 | ||
| 27 | +3 | ||
| 28 | +3 | ||
| 29 | +3 | ||
| 30 | +3 | ||
| 31 | +3 | ||
| 32 | +6 | ||
| 33 | +2 | ||
| 34 | +2 | ||
| 35 | +3 | ||
| 36 | +2 | ||
| 37 | +2 | ||
| 38 | +7 | ||
| 39 | +3 | ||
| 40 | +2 | ||
| 41 | +3 | ||
| 42 | +3 | ||
| 43 | +2 | ||
| 44 | +5 | ||
| 45 | +8 | ||
| 46 | +6 | ||
| 47 | +3 | ||
| 48 | +3 | ||
| 49 | +2 | ||
| 50 | +2 | ||
| 51 | +6 |
Project/측정/test1/selectOutput.csv
0 → 100644
| 1 | +time | ||
| 2 | +18 | ||
| 3 | +5 | ||
| 4 | +3 | ||
| 5 | +3 | ||
| 6 | +4 | ||
| 7 | +2 | ||
| 8 | +3 | ||
| 9 | +3 | ||
| 10 | +2 | ||
| 11 | +3 | ||
| 12 | +2 | ||
| 13 | +2 | ||
| 14 | +2 | ||
| 15 | +2 | ||
| 16 | +3 | ||
| 17 | +2 | ||
| 18 | +2 | ||
| 19 | +2 | ||
| 20 | +3 | ||
| 21 | +2 | ||
| 22 | +2 | ||
| 23 | +2 | ||
| 24 | +2 | ||
| 25 | +2 | ||
| 26 | +2 | ||
| 27 | +2 | ||
| 28 | +3 | ||
| 29 | +4 | ||
| 30 | +2 | ||
| 31 | +3 | ||
| 32 | +2 | ||
| 33 | +2 | ||
| 34 | +3 | ||
| 35 | +2 | ||
| 36 | +3 | ||
| 37 | +2 | ||
| 38 | +2 | ||
| 39 | +2 | ||
| 40 | +1 | ||
| 41 | +2 | ||
| 42 | +2 | ||
| 43 | +1 | ||
| 44 | +2 | ||
| 45 | +2 | ||
| 46 | +2 | ||
| 47 | +3 | ||
| 48 | +2 | ||
| 49 | +3 | ||
| 50 | +3 | ||
| 51 | +3 |
Project/측정/test2/insertOutput.csv
0 → 100644
| 1 | +time | ||
| 2 | +146 | ||
| 3 | +11 | ||
| 4 | +5 | ||
| 5 | +5 | ||
| 6 | +8 | ||
| 7 | +9 | ||
| 8 | +79 | ||
| 9 | +11 | ||
| 10 | +2 | ||
| 11 | +154 | ||
| 12 | +27 | ||
| 13 | +10 | ||
| 14 | +9 | ||
| 15 | +10 | ||
| 16 | +53 | ||
| 17 | +8 | ||
| 18 | +9 | ||
| 19 | +4 | ||
| 20 | +8 | ||
| 21 | +50 | ||
| 22 | +5 | ||
| 23 | +10 | ||
| 24 | +10 | ||
| 25 | +9 | ||
| 26 | +9 | ||
| 27 | +16 | ||
| 28 | +3 | ||
| 29 | +3 | ||
| 30 | +31 | ||
| 31 | +29 | ||
| 32 | +4 | ||
| 33 | +3 | ||
| 34 | +3 | ||
| 35 | +5 | ||
| 36 | +3 | ||
| 37 | +3 | ||
| 38 | +3 | ||
| 39 | +2 | ||
| 40 | +12 | ||
| 41 | +49 | ||
| 42 | +3 | ||
| 43 | +4 | ||
| 44 | +3 | ||
| 45 | +4 | ||
| 46 | +60 | ||
| 47 | +3 | ||
| 48 | +3 | ||
| 49 | +3 | ||
| 50 | +4 | ||
| 51 | +70 |
Project/측정/test2/selectOutput.csv
0 → 100644
| 1 | +time | ||
| 2 | +24 | ||
| 3 | +4 | ||
| 4 | +6 | ||
| 5 | +6 | ||
| 6 | +3 | ||
| 7 | +3 | ||
| 8 | +3 | ||
| 9 | +3 | ||
| 10 | +3 | ||
| 11 | +3 | ||
| 12 | +2 | ||
| 13 | +2 | ||
| 14 | +3 | ||
| 15 | +2 | ||
| 16 | +3 | ||
| 17 | +2 | ||
| 18 | +2 | ||
| 19 | +2 | ||
| 20 | +2 | ||
| 21 | +11 | ||
| 22 | +7 | ||
| 23 | +5 | ||
| 24 | +3 | ||
| 25 | +2 | ||
| 26 | +2 | ||
| 27 | +2 | ||
| 28 | +2 | ||
| 29 | +3 | ||
| 30 | +2 | ||
| 31 | +2 | ||
| 32 | +2 | ||
| 33 | +2 | ||
| 34 | +2 | ||
| 35 | +2 | ||
| 36 | +2 | ||
| 37 | +6 | ||
| 38 | +3 | ||
| 39 | +2 | ||
| 40 | +13 | ||
| 41 | +39 | ||
| 42 | +3 | ||
| 43 | +2 | ||
| 44 | +2 | ||
| 45 | +2 | ||
| 46 | +2 | ||
| 47 | +2 | ||
| 48 | +3 | ||
| 49 | +2 | ||
| 50 | +1 | ||
| 51 | +3 |
-
Please register or login to post a comment