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

[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

๋Œ“๊ธ€

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

์นด์นด์˜ค ์˜คํ”ˆ๋นŒ๋”์™€ ์™ธ๋ถ€ API ์—ฐ๋™(feat.Nodejs)

์นด์นด์˜ค ์˜คํ”ˆ๋นŒ๋”์™€ ์™ธ๋ถ€ API ์—ฐ๋™(feat.Nodejs) ์ด์ „์— ํ”Œ๋Ÿฌ์Šค ์นœ๊ตฌ์™€ ์™ธ๋ถ€ API ์—ฐ๋™์— ๊ด€ํ•œ ๊ธ€์„ ์ž‘์„ฑํ•œ ์  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ง€๋‚œ 2๋…„๋™์•ˆ ํ”Œ๋Ÿฌ์Šค ์นœ๊ตฌ์— ๋งŽ์€ ๋ณ€ํ™”๊ฐ€ ์ƒ๊ฒผ๋Š”๋ฐ์š”. ์นด์นด์˜ค ํ”Œ๋Ÿฌ์Šค ์นœ๊ตฌ์˜ ๋ช…์นญ์ด ์นด์นด์˜ค ์ฑ„๋„๋กœ ๋ฐ”๋€Œ๊ณ , ์ฑ—๋ด‡ ์„ธํŒ… ๋ฐฉ์‹์ด ๊ธฐ์กด [์นด์นด์˜ค ํ”Œ๋Ÿฌ์Šค ์นœ๊ตฌ - ์™ธ๋ถ€ API ์—ฐ๋™] ๊ตฌ์กฐ์—์„œ ์˜คํ”ˆ๋นŒ๋”๊ฐ€ ์ถ”๊ฐ€๋˜์–ด [์นด์นด์˜ค ์ฑ„๋„(๊ตฌ ํ”Œ๋Ÿฌ์Šค ์นœ๊ตฌ) - ์นด์นด์˜ค i ์˜คํ”ˆ๋นŒ๋” - ์™ธ๋ถ€ API ์—ฐ๋™] ๊ตฌ์กฐ๋กœ ๋ฐ”๋€Œ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ์˜คํ”ˆ๋นŒ๋”์˜ ์ฑ—๋ด‡ ์‹œ๋‚˜๋ฆฌ์˜ค ๊ด€๋ฆฌ ๊ธฐ๋Šฅ์„ ๊ฐ„๋‹จํžˆ ์†Œ๊ฐœํ•˜๊ณ  ์™ธ๋ถ€ API๋ฅผ ์—ฐ๋™ํ•˜๋Š” ์˜ˆ์ œ๋ฅผ ๋‹ค๋ค„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. (์—ฐ๋™ํŒŒํŠธ๋Š” 5๋ฒˆ ํ•ญ๋ชฉ๋ถ€ํ„ฐ ๋ณด์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.) 1. ๋ธ”๋ก ๋ธ”๋ก์€ ์˜คํ”ˆ๋นŒ๋”์—์„œ ์งˆ์˜/์‘๋‹ต์„ ๊ด€๋ฆฌํ•˜๋Š” ์ตœ์†Œ ๋‹จ์œ„๋กœ, ์‚ฌ์šฉ์ž์˜ ๋ฐœํ™”์™€ ์ฑ—๋ด‡์˜ ๋Œ€๋‹ต์„ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด ์ธ์‚ฌ๋ผ๋Š” ๋ธ”๋ก์„ ๋งŒ๋“ค๊ณ  ์ธ์‚ฌ์— ํ•ด๋‹นํ•˜๋Š” ์‚ฌ์šฉ์ž ๋ฐœํ™” ํŒจํ„ด๋“ค์„ ์ž…๋ ฅํ•ด๋‘๋ฉด, ์‹ค์ œ ์ฑ„๋„ ํ†ก๋ฐฉ์—์„œ ๊ทธ์— ํ•ด๋‹นํ•˜๋Š” ๋ฐœํ™”๊ฐ€ ๋“ค์–ด์™”์„๋•Œ ์ž…๋ ฅํ•ด๋‘” ์‘๋‹ต์ด ๋‚˜์˜ค๋Š” ํ˜•์‹์ž…๋‹ˆ๋‹ค. ์˜ˆ์ „์—๋Š” ํŒจํ„ด๊ณผ ๋ฐœํ™” ํ‚ค์›Œ๋“œ๊ฐ€ 1:1 ๋งค์นญ, ์ฆ‰ ์ž…๋ ฅํ•ด๋‘” ํŒจํ„ด๊ณผ ์‚ฌ์šฉ์ž ๋ฐœํ™”์˜ string์ด ์ •ํ™•ํžˆ ์ผ์น˜ํ• ๋•Œ๋งŒ ๋ธ”๋ก์ด ์‹คํ–‰๋์—ˆ๋Š”๋ฐ, ๋ฐœํ™” ํŒจํ„ด์„ 20๊ฐœ ์ด์ƒ ๋“ฑ๋กํ•˜๋ฉด ๋จธ์‹ ๋Ÿฌ๋‹ ๊ธฐ๋Šฅ์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ธฐ๋Šฅ์ด ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ ์œ ์‚ฌ๋„ ๋ถ„์„ ๊ฐœ๋…์ด ๊ธฐ๋ณธ์œผ๋กœ ๋“ค์–ด๊ฐ€์žˆ์„ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ธ”๋ก์˜ ์ฃผ์ œ์™€ ๋ฒ—์–ด๋‚˜๋Š” ๋„ˆ๋ฌด ๋œฌ๊ธˆ์—†๋Š” ๋ฐœํ™”ํŒจํ„ด๋“ค์„ ๋งŽ์ด ๋„ฃ์ง€ ์•Š๋„๋ก ํ•˜๋Š”๊ฑธ ๊ถŒ์žฅํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. 2. ์‹œ๋‚˜๋ฆฌ์˜ค ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” '๋ธ”๋ก'๋“ค์„ ๋ฌถ์–ด์„œ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋‹จ์œ„๋กœ, ์ผ์ข…์˜ ํด๋” ๊ตฌ์กฐ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์‰ฝ์Šต๋‹ˆ๋‹ค. ์˜คํ”ˆ๋นŒ๋”์—์„œ ์ขŒ์ธก ์ƒ๋‹จ์— ํŒŒ๋ž€ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ๋ชจ๋“  ๋ธ”๋ก์„ ๊ด€๋ฆฌํ•˜๋ฉด ์ฑ—๋ด‡ ๋„๋ฉ”์ธ์ด ์ปค์งˆ์ˆ˜๋ก ๊ด€๋ฆฌ๊ฐ€ ์–ด๋ ค์›Œ์ง€๋‹ˆ ์•„๋ž˜ ๊ฐ™์€์‹์œผ๋กœ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ธ”๋ก์„ ๊ตฌ์กฐํ™”ํ•˜๋ฉด ์šด์˜ ์ธก๋ฉด์—์„œ ์ˆ˜์›”ํ•ด์ง‘๋‹ˆ๋‹ค. 3. ์ปจํ…์ŠคํŠธ ์ปจํ…์ŠคํŠธ๋Š” ๋งฅ๋ฝ์ด๋ผ๋Š” ๋œป ์ž…๋‹ˆ๋‹ค. ์˜คํ”ˆ๋นŒ๋”์— ์กด์žฌํ•˜๋Š” ์ปจํ…์ŠคํŠธ๋Š” ์ž์—ฐ์–ด ๋ถ„์„์„ ํ†ตํ•ด์„œ ๋งฅ...

AWS instance๋กœ Nodejs ๊ตฌํ˜„ํ•˜๊ธฐ

AWS instance๋กœ Nodejs ๊ตฌํ˜„ํ•˜๊ธฐ ์„œ๋ฒ„์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ ์ฐจ์›์—์„œ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„  ๋กœ์ปฌ๋ณด๋‹ค๋Š” ์„œ๋ฒ„๋ฅผ ํ˜ธ์ŠคํŒ…ํ•ด์„œ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ์šฐ๋ฆฌ๋Š” Nodejs๋ฅผ ๊ตฌ๋™ํ•˜๊ธฐ ์œ„ํ•ด AWS์—์„œ ์ธ์Šคํ„ด์Šค๋ฅผ ํ• ๋‹น๋ฐ›์„ ๊ณ„ํš์ด๋‹ค. ์ธ์Šคํ„ด์Šค์˜ pemํ‚ค๋ฅผ ๋ฐœ๊ธ‰๋ฐ›์•„ nodejs์™€ npm๊นŒ์ง€๋Š” ์„ค์น˜๋ฅผ ์™„๋ฃŒํ•œ ์ƒํƒœ์ด๋‹ค. $ sudo npm install -g express ๋‹ค์Œ์˜ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๊ธ€๋กœ๋ฒŒ ์˜ต์…˜์œผ๋กœ ์–ด๋А path์—์„œ๋“  express๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ์„ค์น˜ํ•œ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹คํ–‰์ด ๋œ๋‹ค๋ฉด ์„ฑ๊ณต์ด๋‹ค. ์ดํ›„ Express generator๋ฅผ ์„ค์น˜ํ•œ๋‹ค. $ sudo npm install -g express-generator@4 ๋ฒ„์ „์€ 4.x์ด๋ฉฐ ์ด ์—ญ์‹œ ๊ธ€๋กœ๋ฒŒ ์˜ต์…˜์œผ๋กœ ์„ค์น˜ํ•ด ์ค€๋‹ค. ์ด์ œ Node monitoring์„ ์œ„ํ•ด nodemon์„ ์„ค์น˜ํ•ด ์ค€๋‹ค. $ sudo npm install -g nodemon ๋ชจ๋“  ์„ค์น˜๊ฐ€ ๋๋‚ฌ๋‹ค. ์ด์ œ nodejs๋ฅผ ์‹คํ–‰์‹œํ‚ฌ ํ”„๋กœ์ ํŠธ์šฉ directory๋ฅผ ๋งŒ๋“ ๋‹ค. ์ด๋ ‡๊ฒŒ ๋งŒ๋“ค์–ด ์ฃผ๊ณ  express๋ฅผ ์‹คํ–‰์‹œํ‚ค๋ฉด ๋œ๋‹ค. $ express -e ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๋ฉด ๋œ๋‹ค. ์ด์ œ node package๋ฅผ ์„ค์น˜ํ•˜๋Š” ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜์ž. $ sudo npm install ์ด์ œ vi๋ฅผ ํ†ตํ•ด ํฌํŠธ๋ฒˆํ˜ธ๋ฅผ ์ •์˜ํ•ด๋ณด์ž. app.set์˜ ๋งˆ์ง€๋ง‰์— ํ•œ์ค„์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋œ๋‹ค. app.set('port', process.env.PORT || 9000); ์ด๋กœ์จ ์šฐ๋ฆฌ๋Š” 9000๋ฒˆ ํฌํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ๋˜ํ•œ ๋งˆ์ง€๋ง‰์ค„์— ์„œ๋ฒ„๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ž. module.exports = app; var server = app.listen(app.get('port'), function() { console.log('Express server listening on port ' + server.address().port); }); ์ด...

20.03.24 ShareBook TIL

20.03.24 ShareBook TIL Project/TIL 20.03.24 ShareBook TIL ์ค‘๊ฐ„ ๋ฐฐํฌ๋ฅผ ์œ„ํ•ด EC2, RDS๋ฅผ ๋‹ค์‹œ ์„ค์ •ํ•˜์˜€๋‹ค. EC2์— git์—์„œ clone์„ ํ•˜๊ณ  ์„œ๋ฒ„๋ฅผ ์ž‘๋™์‹œ์ผœ๋ณด๋‹ˆ ts๋กœ ๋Œ๋ ค์„œ ๊ทธ๋Ÿฐ์ง€ ์ž‘๋™ํ•˜์ง€ ์•Š๊ณ  ๋Œ€๊ธฐ ์ƒํƒœ๋กœ ์žˆ๋‹ค๊ฐ€ timeout๊ฐ™์€ ์‹œ๊ฐ„ ์ดˆ๊ณผ ์—๋Ÿฌ๊ฐ€ ๋‚ฌ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ‘์ž๊ธฐ EC2 ์ž์ฒด๊ฐ€ ๋А๋ ค์ ธ์„œ nodejs๋ฅผ ์‚ญ์ œํ•˜๊ณ  ๋‹ค์‹œ nvm์œผ๋กœ ๋†’์€ ๋ฒ„์ „์˜ node๋ฅผ ์„ค์น˜ํ•˜์˜€๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚˜์„œ ํ˜น์‹œ js๋กœ ๋Œ๋ฆฌ๋ฉด ๋ ๊นŒ ํ•ด์„œ tsc๋กœ js๋กœ ๋ณ€ํ™˜ํ•œ๋’ค ๋Œ๋ ค๋ณด๋‹ˆ RDS์™€ ์—ฐ๊ฒฐ์ด ๋˜์ง€ ์•Š๋Š” ์—๋Ÿฌ๊ฐ€ ์ƒ๊ฒผ๋‹ค. workbench๋กœ RDS๋ฅผ ์—ฐ๊ฒฐํ–ˆ์„ ๋•Œ๋Š” ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•ด์„œ EC2์—์„œ ์ž˜ ๋ชป ์„ค์ •ํ•œ๊ฒŒ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ local์—์„œ ํ•œ๋ฒˆ config.json์„ ์ˆ˜์ •ํ•˜๊ณ  ์—ฐ๊ฒฐํ•˜์—ฌ๋„ ๋˜‘๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. ๊ทธ๋Ÿผ ๋ณด์•ˆ ์„ค์ •์—์„œ ๋ฌธ์ œ์ธ๊ฐ€ ์‹ถ์–ด์„œ EC2, RDS ๋ณด์•ˆ ๊ทธ๋ฃน์—์„œ ์„ค์ •์„ ๋ง‰ ๋งŒ์ ธ๋ณด๋‹ค RDS์—์„œ Custom TCP์— ์ฒ˜์Œ RDS์—์„œ ์„ค์ •ํ•œ ํฌํŠธ๋ฅผ ๋„ฃ์–ด์ฃผ์—ˆ๋”๋‹ˆ ์—ฐ๊ฒฐ๋˜์—ˆ๋‹ค. config.json๋‚ด์šฉ์„ EC2์—๋„ ๋˜‘๊ฐ™์ด ์ ์šฉ์‹œ์ผœ๋ณด๋ ค๊ณ  jsonํŒŒ์ผ์„ vim์œผ๋กœ ์ž‘์„ฑํ•ด์„œ ๋„ฃ์–ด ์ฃผ์—ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ๊ฐ™์€ ์—๋Ÿฌ๋ฅผ ๋ฐ˜๋ณตํ•˜์˜€๋‹ค. ๊ทธ๋Ÿผ json ํŒŒ์ผ์„ ๋ชป ์ฝ์–ด๋‚ด๋Š”๊ฒŒ ์•„๋‹Œ๊ฐ€ ์‹ถ์–ด์„œ ๊ทธ๋ƒฅ module์— index.js์—์„œ sequelize๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ถ€๋ถ„์— ์ง์ ‘ ๋„ฃ์–ด ์ฃผ์—ˆ๋”๋‹ˆ ๋งˆ์นจ๋‚ด ์—ฐ๊ฒฐ์ด ๋˜์—ˆ๋‹ค. ํ•ด๊ฒฐํ•˜๊ณ  ๋‚œ ๋’ค ์ƒ๊ฐ์˜ ํ๋ฆ„์„ ์ ์–ด๋ณด๋‹ˆ ๋งค์šฐ ์งง์ง€๋งŒ ์ •์ž‘ ์˜ค๋Š˜ ์•„์นจ 10์‹œ ๋ฐ˜๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ ์ €๋… 10์‹œ ๋ฐ˜๊นŒ์ง€ 12์‹œ๊ฐ„์„ ๊ณ ๋ฏผํ•˜๊ณ ๋‚˜์„œ์•ผ ํ•ด๊ฒฐ๋˜์—ˆ๋‹ค. from http://three-five.tistory.com/46 by ccl(A) rewrite - 2020-03-25 00:54:05