๊ธฐ๋ณธ ์ฝ˜ํ…์ธ ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ

[NodeJS] path.join ๊ณผ path.resolve ์ฐจ์ด ๐Ÿ“‹ / path.join์ด๋ž€? / path...

[NodeJS] path.join ๊ณผ path.resolve ์ฐจ์ด ๐Ÿ“‹ / path.join์ด๋ž€? / path...

Path.join

path.join([...paths]) * ...paths ์ธ์ž๋“ค์€ ํ•ญ์ƒ string์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ฒฝ๋กœ๋“ค์„ string ์œผ๋กœ ๋ฐ›์•„ ํ•ฉ์ณ์ค๋‹ˆ๋‹ค.

์˜ˆ์‹œ)

path.join('/foo', 'bar', 'baz/asdf', 'quux', '..'); // Returns: '/foo/bar/baz/asdf' path.join('foo', {}, 'bar'); // Throws 'TypeError: Path must be a string. Received {}'

(Node.js ํ™ˆํŽ˜์ด์ง€ ์ œ๊ณต)

์ฒซ๋ฒˆ์งธ ์˜ˆ์‹œ์˜ ๊ฒฝ์šฐ, ํ•˜๋‚˜ํ•˜๋‚˜ stirng๋“ค์„ ๊ฒฝ๋กœ๋ผ๊ณ  ์ƒ๊ฐํ•ด์„œ /๋กœ ๊ตฌ๋ถ„์ง€์–ด ์ƒˆ๋กœ์šด ๊ฒฝ๋กœ๋ฅผ ๋งŒ๋“ค์–ด๋ƒ…๋‹ˆ๋‹ค.

quux๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” '..' ๊ฐ€ ์ƒ์œ„ ํด๋” ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ธฐ ๋•Œ๋ฌธ❗

Path.resolve

path.resolve([...paths]) * ...paths ์ธ์ž๋“ค์€ ํ•ญ์ƒ string์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

path.resolve ๋„ path.join๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ๊ฒฝ๋กœ๋“ค์„ ๋ฌถ์–ด ์ƒˆ๋กœ์šด ๊ฒฝ๋กœ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ)

path.resolve('/foo/bar', './baz'); // Returns: '/foo/bar/baz' path.resolve('/foo/bar', '/tmp/file/'); // Returns: '/tmp/file' path.resolve('wwwroot', 'static_files/png/', '../gif/image.gif'); // If the current working directory is /home/myself/node, // this returns '/home/myself/node/wwwroot/static_files/gif/image.gif'

์˜ˆ์‹œ๋ฅผ ๋ณด์‹œ๋ฉด path.join๊ณผ๋Š” ๋‹ค๋ฅธ์ ๋“ค์ด ๋ณด์ž…๋‹ˆ๋‹ค.

resolve๋งŒ์˜ ์ฐจ์ด์ 

์˜ค๋ฅธ์ชฝ์—์„œ ์™ผ์ชฝ์œผ๋กœ ๊ฒฝ๋กœ๋“ค์„ ์ฝ์Šต๋‹ˆ๋‹ค.

'/ํด๋”๋ช…' ์„ ๋งŒ๋‚˜๋ฉด ์ ˆ๋Œ€๊ฒฝ๋กœ๋กœ ์ธ์‹ํ•ด์„œ ๊ทธ ๊ฒฝ๋กœ๋ฅผ ๋ฐ”๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๊ฒฝ๋กœ๋ฅผ ํ•ฉ์น˜๊ธฐ์œ„ํ•ด์„œ๋Š” ์ƒ๋Œ€๊ฒฝ๋กœ์ธ './ํด๋”๋ช…' ์œผ๋กœ ํ™•์‹คํ•˜๊ฒŒ ๊ตฌ๋ถ„ํ•ด์ค˜์•ผํ•ฉ๋‹ˆ๋‹ค.

์‰ฝ๊ฒŒ ๋งํ•˜์ž๋ฉด path.resolve๋Š” ์˜ค๋ฅธ์ชฝ์—์„œ ์™ผ์ชฝ์œผ๋กœ ์ฝ์œผ๋ฉฐ path.join ๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ ์ƒ๋Œ€๊ฒฝ๋กœ์™€ ์ ˆ๋Œ€๊ฒฝ๋กœ๋ฅผ ์ธ์‹ํ•˜์—ฌ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค!

from http://programming119.tistory.com/106 by ccl(A) rewrite - 2020-03-07 22:54:23

๋Œ“๊ธ€

์ด ๋ธ”๋กœ๊ทธ์˜ ์ธ๊ธฐ ๊ฒŒ์‹œ๋ฌผ

[Mac OS X] ๋ฐ์Šคํฌํƒ‘ ์‘์šฉํ”„๋กœ๊ทธ๋žจ ๊ฐœ๋ฐœ์‹œ์ž‘

[Mac OS X] ๋ฐ์Šคํฌํƒ‘ ์‘์šฉํ”„๋กœ๊ทธ๋žจ ๊ฐœ๋ฐœ์‹œ์ž‘ ํ˜„์žฌ ํšŒ์‚ฌ์—์„œ ๋‹ค์Œ ํ”„๋กœ์ ํŠธ๋กœ Mac OS X๋ฅผ ๊ฐœ๋ฐœํ•ด์•ผ ํ•˜๋Š” ์ผ์ •์ด ์ƒ๊ฒจ ๋‚œ์ƒ ์ฒ˜์Œ ๋ฐ์Šคํฌํƒ‘ ์‘์šฉํ”„๋กœ๊ทธ๋žจ์„ ๊ฐœ๋ฐœํ•˜๊ธฐ ๊ณต๋ถ€๋ฅผ ์‹œ์ž‘ํ–ˆ๊ณ  ์—ฌ๋Ÿฌ๊ฐ€์ง€ ํ”Œ๋žซํผ์ด ์žˆ๋‹ค๋Š”๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ๋‹ค. ์–ด๋–ค ํ”Œ๋žซํผ์„ ์‚ฌ์šฉํ•ด์•ผํ•  ์ง€ ๋จผ์ € ๊ณ ๋ฏผํ•ด๋ณด์ž. ๋ฌด์—‡์œผ๋กœ ๊ฐœ๋ฐœํ• ๊ฒƒ์ธ๊ฐ€? Xcode & Swfit or Objective-C Mac OS X ๋Š” objective-c๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค์–ด์กŒ๋‹ค. apple์—์„œ ์ œ๊ณตํ•˜๋Š” Xcode์™€ objective-c ํ˜น์€ Swift๋กœ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. Electron Electron ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด javascript, HTML, CSS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํฌ๋กœ์Šค ํ”Œ๋žซํผ ๋ฐ์Šคํฌํƒ‘ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. react-native-desktop Qt ํ”„๋ ˆ์ž„ ์›Œํฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœํ•˜๋Š” ํฌ๋กœ์Šค ํ”Œ๋žซํผ์ด๋‹ค. react-native ์™€ javascript๋กœ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. Qt๋Š” ์ปดํ“จํ„ฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ GUI ํ”„๋กœ๊ทธ๋žจ ๊ฐœ๋ฐœ์— ๋„๋ฆฌ ์“ฐ์ด๋Š” ํฌ๋กœ์Šค ํ”Œ๋žซํผ ํ”„๋ ˆ์ž„์›Œํฌ. ๊ฐ ํ”Œ๋žซํผ์˜ ์žฅ๋‹จ์ ์€ ๋ฌด์—‡์ธ๊ฐ€? Xcode & Swfit or Objective-C - ์žฅ์  ๋ชจ๋“  OSX API์— ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. Xcode๋ฅผ ํ†ตํ•ด App Store์— ์‰ฝ๊ฒŒ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋‹ค. - ๋‹จ์  Windows ์ „์šฉ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ๋‹ค์‹œ ๊ฐœ๋ฐœํ•ด์•ผํ•œ๋‹ค. Swift์–ธ์–ด๋ฅผ ๋ชจ๋ฅธ๋‹ค๋ฉด ์ƒˆ๋กœ ๊ณต๋ถ€ํ•ด์•ผ ํ•œ๋‹ค. Electron - ์žฅ์  ์›น์Šคํƒ์„ ๊ฐ€์ง€๊ณ  ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ๋‹ค์–‘ํ•œ ํ”Œ๋žซํผ์„ ์ง€์›ํ•œ๋‹ค. - ๋‹จ์  Native์–ธ์–ด๋กœ ๊ฐœ๋ฐœํ• ๋•Œ ๋ณด๋‹ค ์„ฑ๋Šฅ์ด ๋–จ์–ด์งˆ ์ด์Šˆ๊ฐ€์žˆ๋‹ค. OS X API๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ๋ณต์žกํ•˜๋‹ค. *API์— ๋Œ€ํ•œ JavaScript ๋ž˜ํผ๊ฐ€ ์—†์œผ๋ฉด ์ž์ฒด ๋ž˜ํผ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š๋Š” ํ•œ ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. React-native-desktop - ์žฅ์  ํ˜„์žฌ ๊ฐœ๋ฐœ์Šคํƒ๊ณผ ์™„์ „ํžˆ ๋™์ผํ•˜๋ฏ€๋กœ ๋” ๋น ๋ฅด๊ฒŒ ๊ฐœ๋ฐœ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค์–‘ํ•œ ํ”Œ๋žซํผ์„ ์ง€์›ํ•œ๋‹ค. - ๋‹จ์  N...

AWS CI/CD ํŒŒ์ดํ”„๋ผ์ธ์— Slack ์•Œ๋žŒ ์ ์šฉ(Lambda, CloudWatch Events ์—ฐ๋™)

AWS CI/CD ํŒŒ์ดํ”„๋ผ์ธ์— Slack ์•Œ๋žŒ ์ ์šฉ(Lambda, CloudWatch Events ์—ฐ๋™) ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ๊ตฌ์ถ•๋œ CI/CD ํŒŒ์ดํ”„๋ผ์ธ๊ณผ Slack ์•Œ๋žŒ์„ ์—ฐ๋™ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณผ ๊ฒƒ์ด๋‹ค. CI/CD ํŒŒ์ดํ”„๋ผ์ธ ์‹œ์ž‘/์ข…๋ฃŒ(์„ฑ๊ณต/์‹คํŒจ) ์‹œ Amazon CloudWatch Events์—์„œ ํ•ด๋‹น ์ด๋ฒคํŠธ๋ฅผ ๊ฐ์ง€ํ•œ ํ›„ AWS Lambda๋กœ ํŠธ๋ฆฌ๊ฑฐ ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ด๋ฉด AWS Lambda์—์„œ Slack์ฑ„๋„๋กœ ์•Œ๋žŒ์„ ๋ณด๋‚ด๋Š” ํ”„๋กœ์„ธ์Šค๋‹ค. ๊ธ€์˜ ์ˆœ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. Amazon CloudWatch Events, AWS Lambda๋ž€? ์‹ค์Šต ์ „ ์ค€๋น„์‚ฌํ•ญ Slack Webhook ์ƒ์„ฑ AWS Lambda ํ•จ์ˆ˜ ์ƒ์„ฑ AWS CloudWatch Events ์ƒ์„ฑ ํ…Œ์ŠคํŠธ ์œ„์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๊ตฌ์ถ•์„ ํ•˜๋ฉด ์ตœ์ข… ํ”„๋กœ์„ธ์Šค๋Š” ๋‹ค์Œ ๊ทธ๋ฆผ๊ณผ ๊ฐ™๋‹ค (์šฐ๋ฆฌ๊ฐ€ ์ด ๊ธ€์—์„œ ์ง„ํ–‰ํ•˜๋Š” ๋‚ด์šฉ์€ ๋นจ๊ฐ„์ƒ‰์œผ๋กœ ํ‘œ์‹œ๋œ ๋ถ€๋ถ„) 1. Amazon CloudWatch Events, AWS Lambda๋ž€? 1-1. Amazon CloudWatch Events๋ž€? Amazon CloudWatch Event(ํ˜น์€ AWS CloudWatch Events)๋Š” AWS ์ƒํƒœ ๋ณ€๊ฒฝ ๋“ฑ์„ ๊ฐ์‹œํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค. ๋งŒ์•ฝ ์‚ฌ์šฉ์ž๊ฐ€ ๋งŒ๋“  ๊ทœ์น™์— ๋งž๋Š” ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๋ฉด ํ•ด๋‹น ์ด๋ฒคํŠธ๊ฐ€ ์‚ฌ์ •์— ์ •์˜๋œ ๊ทœ์น™๊ณผ ์ผ์น˜ํ•  ๊ฒฝ์šฐ ํ•˜๋‚˜ ์ด์ƒ์˜ ๋Œ€์ƒ ์ž‘์—…์„ ํ˜ธ์ถœํ•œ๋‹ค. ์ด๋ฒคํŠธ ์œ ํ˜•์— ๋”ฐ๋ผ ์•Œ๋žŒ์„ ๋ณด๋‚ด๊ฑฐ๋‚˜, ์ด๋ฒคํŠธ ์ •๋ณด๋ฅผ ์บก์ณํ•˜๊ฑฐ๋‚˜, ๊ต์ •์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜, ์ด๋ฒคํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๊ฑฐ๋‚˜, ๊ธฐํƒ€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ๋Œ€์ƒ ์ž‘์—…์€ AWS Lambdaํ•จ์ˆ˜, AWS Kinesis ์ŠคํŠธ๋ฆผ, AWS SQS, Amazon SNS ๋“ฑ์ด ์žˆ๋‹ค. ์‚ฌ์šฉ๋˜๋Š” ์‚ฌ๋ก€๋กœ๋Š” 1) ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด Lambdaํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Slack์ฑ„๋„๋กœ ์•Œ๋ฆผ์„ ์ „๋‹ฌํ•˜๊ฑฐ๋‚˜, 2) AWS ์ƒํƒœ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด Lambda ๋ฐ CloudWatch Events๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Amazon SNS๋กœ ์‚ฌ์šฉ์ž ์ง€์ • ํ…์ŠคํŠธ ๋˜๋Š” SMS ์•Œ๋ฆผ์„ ๋ณด๋‚ด๋Š” ๋“ฑ...

[2020-angstromCTF] web - A peculiar query write-up

[2020-angstromCTF] web - A peculiar query write-up English write-up UI seems like below. If you click the 'the source' link, you can get back-end source code. const express = require("express"); const rateLimit = require("express-rate-limit"); const app = express(); const { Pool, Client } = require("pg"); const port = process.env.PORT || 9090; const path = require("path"); const client = new Client({ user: process.env.DBUSER, host: process.env.DBHOST, database: process.env.DBNAME, password: process.env.DBPASS, port: process.env.DBPORT }); async function query(q) { const ret = await client.query(`SELECT name FROM Criminals WHERE name ILIKE '${q}%';`); return ret; } app.set("view engine", "ejs"); app.use(express.static("public")); app.get("/src", (req, res) => { res.sendFile(path.join(__dirname, "index.js")); }); app.get("/", async (req, res) => { if (req.query...