
pixel skylines
I'd rather be in outer space ๐ธ
i don't do bad sauce passes

โ

็ฅๆฅ / Permanent Vacation
Three Goblin Art

Kaledo Art
DEAR READER
Cosimo Galluzzi

romaโ
let's talk about Bridgerton tea, my ask is open
tumblr dot com

Janaina Medeiros
๐ชผ
Stranger Things
Misplaced Lens Cap
Claire Keane

Origami Around
taylor price
art blog(derogatory)
seen from India
seen from United States
seen from Tรผrkiye
seen from United States
seen from Malaysia
seen from United States
seen from United States
seen from Romania
seen from Germany

seen from Tรผrkiye
seen from Oman
seen from United States
seen from United States

seen from Tรผrkiye
seen from United States

seen from Indonesia
seen from France

seen from United States
seen from United States

seen from Singapore
@tehilee
2015๋ 4์ 23์ผ
Meteor์์ CPU ์ฌ์ฉ๋์ ์ค์ด๋ ๋ฐฉ๋ฒ from Kadira
NodeJS Buffer to String
nodejs์์ POST, PUT๋ฑ์ ๋ฉ์๋๋ฅผ ์จ์ ๊ฐ์ ๋ฐ์ผ๋
Buffer 61 73 64 66
์ ๊ฐ์ ๊ฐ์ console์ด ๋ด๋ฑ์๋ค. ์์ ์๋๊ฐ์ "asdf"์๋ค.
asdf๋ฅผ ํฅ์ค๊ฐ์ผ๋ก ๋ณํํ ๊ฐ์ด๋ค.
์ด ๊ฐ์ ํ์์ ์ ๋๋ก ์ก์ผ๋ ค๋ฉด
console.log 'STARTED!!' HTTP.methods '/hello': put: (data) -> console.log data.toString 'utf8'
์ ๊ฐ์ด .toString('utf-8')๋ฅผ ์ฐ๋ฉด ๋๋ค.
์ค์๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ ํต์ ํ์ด์ง์ด ๋ถํ์ํ ์ด์
๋ณต์์ ํ์ด์ง๊ฐ ์๋ ์ด์ ?
๊ตฌ๊ธ ๊ฒ์๊ฒฐ๊ณผ์ ๊ฐ์ด ์ฐ์๋๋ 10๊ฐ์ post๋ฅผ ๊ฐ๊ฐ ๋ณด์ฌ์ฃผ๋ ๋์ ์ โ๋ฌดํ ํ์ด์งโ ๋ฐฉ์์ ์ฌ์ฉํ๋ ์ด์ ๋ ๋ฌด์์ผ๊น? ๊ทธ๊ฒ์ ์ฌ์ค์ ๋ฏธํฐ์ด๊ฐ ๋ฐ์๋ค์ธ ์ค์๊ฐ ํจ๋ฌ๋ค์ ๋๋ฌธ์ด๋ค.
๊ตฌ๊ธ ๊ฒฐ๊ณผ ํ์ด์ง ํจํด์ ์ฌ์ฉํ์ฌ Posts ์ปฌ๋ ์ ์ ๋ํ ํ์ด์ง์ ํ๋๋ฐ, ํ์ฌ 2 ํ์ด์ง์ ์์นํ์ฌ 10๋ฒ์งธ์์ 20๋ฒ์งธ์ post ๋ชฉ๋ก์ ๋ณด์ฌ์ฃผ๊ณ ์๋ค๊ณ ๊ฐ์ ํด๋ณด์. ๋ง์ฝ ๋ค๋ฅธ ์ฌ์ฉ์๊ฐ ์ด์ 10๊ฐ์ post ์ค์ ์ด๋ ๊ฒ์ด๋ผ๋ ์ญ์ ํ๋ค๋ฉด ๋ฌด์จ ์ผ์ด ์ผ์ด๋ ๊น?
์ฐ๋ฆฌ ์ฑ์ ์ค์๊ฐ์ด๋ฏ๋ก, ๋ฐ์ดํฐ ์ธํธ๊ฐ ๋ณ๊ฒฝ๋ ๊ฒ์ด๋ค. 10๋ฒ post๋ ์ด์ 9๋ฒ post๊ฐ ๋๋ฏ๋ก, ์ฐ๋ฆฌ ์์ผ์์ ๋น ์ง๋ ๋ฐ๋ฉด์, 11๋ฒ post๋ ๋ฒ์์์ ์๊ฒ ๋๋ค. ๊ถ๊ทน์ ๊ฒฐ๊ณผ๋ ์ฌ์ฉ์๋ ์๋ฌด๋ฐ ์ด์ ๋ ์์ด post๋ชฉ๋ก์ด ๊ฐ์๊ธฐ ๋ณํ๋ ๊ฒ์ ๋ณด๊ฒ ๋ ๊ฒ์ด๋ค!
์ฐ๋ฆฌ๊ฐ ์ค์ฌ ์ด๋ฐ ๊ธฐ๋ฌํ UX๋ฅผ ๋ฐ์๋ค์ธ๋ค ํด๋, ์ ํต์ ์ธ ํ์ด์ง ๋ฐฉ์์ ๊ธฐ์ ์ ์ด์ ๋ก๋ ๊ตฌํํ๊ธฐ๊ฐ ์ด๋ ต๋ค.
์ด์ ์์ ๋ก ๋์๊ฐ๋ณด์. ์ฐ๋ฆฌ๋ Posts ์ปฌ๋ ์ ์์ 10๋ฒ์งธ์์ 20๋ฒ์งธ ๊น์ง์ post ๋ชฉ๋ก์ ๋ฐํํ๊ณ ์๋ค. ํด๋ผ์ด์ธํธ์์ ์ด๋ป๊ฒ ๊ทธ post ๋ชฉ๋ก์ ์ฐพ์๊น? ํด๋ผ์ด์ธํธ ์ชฝ์ ๋ฐ์ดํฐ ์ธํธ์๋ 10๊ฐ์ post๋ง ์์ผ๋ฏ๋ก 10๋ฒ์งธ์์ 20๋ฒ์งธ๊น์ง์ post ๋ชฉ๋ก์ ์ถ์ถํ์ง ๋ชปํ๋ค.
ํ ๊ฐ์ง ํด๋ฒ์ ์๋ฒ์์ ๊ทธ 10๊ฐ์ post ๋ชฉ๋ก์ ๋ฐํํ๋ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ํด๋ผ์ด์ธํธ ์ชฝ์์ Posts.find()๋ฅผ ํธ์ถํ์ฌ ๋ชจ๋ ๋ฐํ post ๋ชฉ๋ก์ ๊ฐ์ ธ์จ๋ค.
์ด๊ฒ์ ํ๋์ ๊ตฌ๋ ๋ง ์๋ค๋ฉด ๋์ํ๋ค. ๊ทธ๋ฌ๋ ๊ณง ํด๋ณด๊ฒ ์ง๋ง, post ๊ตฌ๋ ์ ํ๋ ์ด์์ ๊ฐฏ์๋ก ์์ํ๋ฉด ์ด๋ป๊ฒ ํ๋?
ํ๋์ ๊ตฌ๋ ์ด 10์์ 20๊น์ง์ post ๋ชฉ๋ก์ ์๊ตฌํ๋ค๊ณ ํด๋ณด์. ๊ทธ๋ฆฌ๊ณ ๋ ๋ค๋ฅธ ๊ฒ์ด 30์์ 40๊น์ง์ ๋ชฉ๋ก์ ์๊ตฌํ๋ค๊ณ ํ์. ์ด์ ํด๋ผ์ด์ธํธ์์ ์ด๋ ๊ตฌ๋ ์ ์ํ๋ ์ง ๋ชจ๋ฅธ์ฑ๋ก ์ด 20๊ฐ์ post๋ฅผ ๊ฐ์ง๊ฒ ๋๋ค.
์ด๋ฐ ์ด์ ๋ก, ์ ํต์ ์ธ ํ์ด์ง ๋ฐฉ์์ ๋ฏธํฐ์ด์์๋ ๋ณ ์๋ฏธ๊ฐ ์๋ค.
ํ์ฌ ๋คํธ์ํฌ git ์ค์
๋ด ์์ด๋งฅ์ ์๋ฒ๋ก ์ฐ๊ธฐ์ํ ๋ฐ์ ๊ณผ์ ์ ๊ทธ๋ ค๋์๋ค
์ค์
[์์คํ ํ๊ฒฝ์ค์ ] - [๊ณต์ ]๋ก ๋ค์ด๊ฐ์ ์๊ฒฉ ๋ก๊ทธ์ธ์ ์ฒดํฌ๋ฅผ ํ๋ค. ์๋์ฐ์ ๋นํด์ ๊น๋ํ ์ค์ ์ด๋ค.
์ด์ฉํ ์ฌ์ฉ์๋ฅผ ์ถ๊ฐํ ํ ์ปดํจํฐ ์ด๋ฆ์ ์ค์ ํ๋ค
๋ก์ปฌ ๋คํธ์ํฌ์ ์๋ ์ปดํจํฐ๊ฐ ๋ค์์ ์๋ ์ฌ์ฉ์์ ์ปดํจํฐ์ ์ฐ๊ฒฐํ ์ ์์: MySever.local
์์ ๊ฐ์ด ์ค์ ์ด ๋์๋ค๋ฉด ๋์ ์ปดํจํฐ ์ด๋ฆ์ "MySever.local" ์ด ๋๋ค
ํ ์คํธ
username์ ์์์ ์ ์ํ์ฉํ ์ ์ ์ด๋ฆ์ ์ ๋ ฅํ๊ณ ๋ค์๋ ๋ก์ปฌ ์์ดํผ ์ฃผ์์ด๋ค. ์์ ๋ฐฉ๋ฒ ๋ง๊ณ ์ปดํจํฐ ์ด๋ฆ์ผ๋ก ์ ์ํ๋ ๋ฐฉ๋ฒ์
์ด๋ฐ์์ผ๋ก ์ ์ํ ์ ์๋ค. ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ ฅํ๋ฉด ssh๋ก ์ ์์ด ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๋ณด์ ์ค์
์๋์ ๋งํฌ๋ฅผ ํ์ธํ๋๋ก ํ๋ค http://blog.smitec.net/posts/setting-up-a-git-server-on-osx/
git repository ์ค์
Server side
$ mkdir newrepo.git
$ cd newrepo.git
$ git init --bare
Client side
$ git clone ssh://[email protected]/path/to/newrepo.git
์ด๋ ๊ฒ๋๋ฉด newrepo ํด๋์ ํ๋ก์ ํธ๊ฐ ๋ณต์ฌ๋ ๊ฒ์ ๋ณผ ์ ์๋ค
Tip : git ์ฌ์ฉํ๊ธฐ
git add
$ git add *
$ git add filename
$ git add -all
git status
$ git status
git commit
$ git commit -m "message"
git push
$ git push origin master
Hooks๋ฅผ ์ด์ฉํ์ฌ ๋ฐ๋ก deploy
git respository๋ก ์ค์ ํ ๋๋ ํ ๋ฆฌ์ ๋ณด๋ฉด hooksํด๋๊ฐ ์๋ค
cd hooks
post-receive ํ์ผ ์์
vi post-receive
#!/bin/sh git --work-tree=/var/www/domain.com --git-dir=/var/repo/site.git checkout -f
chmod +x post-receive
์๋ฆฌ๋ push๊ฐ ๋ค์ด์ฌ๋๋ง๋ค ํ์ผ์ ๊ฒ์ฌํด ํด๋น ํด๋๋ก checkoutํ๋ ๊ฒ์ด๋ค.
์ฐ๋ฆฌ๊ฐ ๋ชฝ๊ณ ๋๋น๋ฅผ ์ฌ์ฉํ์ง ์์์ผ ํ๋ ์ด์
๋ฏธ์๋ฐ์ ์ฉ๊ธฐ
์ฃผ๋ง์ n์ ๋ง๋๋ฉด์ ๋ง์ ์๊ฐ๋ค์ ํ๋ค. N์ ์๋ค๋ฌ์ ๋ฏธ์๋ฐ์ ์ฉ๊ธฐ๋ผ๋ ์ฑ ์ ์ถ์ฒํด์ฃผ์๋๋ฐ ์๋ค๋ฌ๋ผ๋ ์ฒ ํ์์ ๋ํด์๋ ๊ทธ๋ฆฌ๊ณ ์ฒ ํ์ ๋ํด์๋ ์ ๋ชจ๋ฅด์ง๋ง ๊ฐ๋จํ ์๊ธฐํ์๋ฉด ์๋ค๋ฌ๋ ์ด๋ค ์ํฉ์ด ๋ฒ์ด์ก์๋ ์ธ๊ฐ์ด๋ผ๋ ์กฑ์์ ๊ทธ ๊ฒฐ๊ณผ์ ๋ํด์ ์ด์ ๋ฅผ ๊ฑฐ๊พธ๋ก ์ฐพ์ ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ๋ค๋ผ๋ ์ด๋ฏธ ์ด๋ ดํ์ด ์๊ณ ์์ผ๋ฉด์๋ ์์ฐ์ค์ ๋ฌด์ํ๋ ์ฐ์ฐํ ์ด๋ก ์ด์๋ค.
๋ด ์น๊ตฌ์ค ํ๋ช ์ ์คํจํ ์ ์ด ์๋ค. ์ ์๋์ธ ์๋ฒ์ง์ ์ ์ ์ฃผ๋ถ์ธ ์ด๋จธ๋๋ฐ์์ ์ ๋ณตํ๊ฒ ์๋์ผ๋ฉฐ ๊ทธ๋ค์๊ฒ ๋ฐ๋๋ผ๊ณ ๋ ํ๋ฒ๋ ๋ฐ์๋ณธ์ ์ด ์์ผ๋ฉฐ ๋ฏธ๊ตญ์์ ๊ณ ๋ฑ๊ณ ์ก๋ ๋ฐ์ ํ๋ง๋๋ก ์ฐ๋ฆฌ๋๋ผ์์ ์๋ฆฌํธ๋ผ๊ณ ๋ถ๋ฆฌ๋ ์์น๋ธ์ด๋ค.
๊ทธ๋ ํ๋ฌ์ฌ์ ์ ์ฌ์ ์ ํ๋ค๊ฐ ์คํจํ์๋๋ฐ ์ผ๋ง์ ์ ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ๋ํ์ฌ ํ ๋ก ํ๊ฒ ๋์๋ค.
ํ์ฐธ ์๊ธฐํ๋ ๋์ค ๋ด ์ ์์ โ์คํจ์ ์ด์ โ๋ผ๋ ๋ง์ด ๋์ค์ ๊ทธ๋ ๊ทธ๊ฒ ์ ์คํจ๋๋ฉฐ ๋๋ฅผ ๋๋ฌด๋๋ค. ๊ทธ๋ ๋น์์๋ ๋ฏผ๊ฐํ ๋ถ๋ถ์ ๊ฑด๋๋ ค์ ๋ฏธ์ํ๋ค๊ณ ๋งํ์ง๋ง ์๊ฐ์ด ํ๋ฅธ ์ง๊ธ๋ ๋๋ ์คํจ๋ผ๊ณ ์๊ฐํ๋ค.
๊ทธ๊ฐ ๋๋ ค์ํ๋ ๊ฒ์ ๊ธ์๊ทธ๋๋ก ์คํจ๋ผ๋ ๋ง์ด์๋ค. ๊ทธ๋ ๋จ์๊ฒ์ ์คํจ๋ผ๋ ๋ง์ ๋ฃ์ง ์๊ธฐ ์ํด ๊ณผ๊ฑฐ๋ก๋ถํฐ ํ๊ณ๋ฅผ ๋ง๋ค์๋ค.
๊ฒฝ์์ฌ ์ง์๋ค์ ์ด๋ป๋ค๋ผ๋๋ฅ ๊ทธ์ ๋นํด์ ์ฐ๋ฆฌ ์ง์๋ค์ ์ด๋ ๋ค๋ผ๋๋ฅ ์์ ์ ์ด์ ๋ฅผ ์ ์ธํ ์จ๊ฐ ๋ชจ๋ ์ด์ ๋ค๋ก ๋๋ฅผ ์ค๋์ํค๋ ค๊ณ ํ๋ค.
๋ฌผ๋ก ๊ทธ ์ด์ ๋ค์ด ๋ง์ด ์๋๋ ๊ฒ์ ์๋์ง๋ง ๋๋ ๊ทธ ๋ง๋ค์์ ์๋ค๋ฌ์ ์ฐ์งํจ์ด ๋๊ปด์ก๋ค.
์๋ํ๋ฉด ์ ๋ง์ด ๋ง๋ค๋ฉด ๊ทธ๋ ์คํจํ ์ด์ ๋ฅผ ๋ปํ ์๊ณ ์์ผ๋ฉด์๋ ๋ฐฉ๊ดํ ๊ผด์ด๋๋ค.
์ ๋ฐ ํฌ๋ฆฌํฐ์ปฌํ(?) ์ด์ ๋ค์ด ์คํจ ์ ์ ์กด์ฌํ๋ค๋ฉด ์ฐ๋ฆฌ๋ ๋๊ฐ์ง ์ ํ์ ํ ์ ์๋ค. ์ด์ ๋ค์ ํ๋์ฉ ์ก์๋๊ฐ์ ์ฑ๊ณตํ ๊ณ๋จ์ ๋ง๋ค๋์ง ์๋๋ฉด ๋ฌด์ํ๋์ง.
๊ทธ๋ ๋ฌด์ํ๋ค. ์ด๋ป๊ฒ๋ ๋๊ฒ ์ง๋ ์๊ฐ์ ํ๊ณ ๋์ค์ ๋์ด์์ผ ๊ทธ ๊ณ๋จ์ ๋ชป์ด ๋น ์ก๊ณ ๋๋ฌด๋ ์ฉ์์ผ๋ฉฐ ์์ ์ ์ด์ด ์์ด ๊ทธ ๊ณ๋จ์ ๋ฐ์๋ค๊ณ ์ฃผ์ฅํ๋ค. ์๋ค๋ฌ์ ์ฐ์งํจ์ ๋ฐํํ๋ ์๊ฐ์ด๋ค.
์ ์คํจ๋ผ๋ ๋ง์ ๋๋ ค์ํ๋์ง ๊ทธ๋ฆฌ๊ณ ํ๊ณ๋ฅผ ๋ง๋ค๋ฉฐ ์์ ์ ์ง๋ฐ๋์ง ๋ชจ๋ฅด๊ฒ ๋ค. ์ด๋ค๋ณด๋ฉด ์ด๋ค ์ด์ ์์๋ ์ฉ์ ๋๋ฌด๊ณ๋จ์ ๋ฐ์ ๋๊ฐ ์๋ค. ๋ฌผ๋ก ๊ทธ ๊ณ๋จ์ ๋ฐ์ง ์๊ธฐ์ํด ๋๋๋ ค๋ณด๊ณ ์ ๊ด์ฐฐํ๋ ์งํ๋ ํ์ํ์ง๋ง ๋ง์ฝ ๋ฐ์์๊ฒฝ์ฐ ๋ง์ด ๋ค์น์ง ์๋ ๋ฐฉ๋ฒ์ ๊ฐ๊ตฌํด์ผํ๋ค. ๊ตํต์ฌ๊ณ ๊ฐ ๋์ ์ฌ๋์ด ๋ค์ณค๋๋ฐ ์๋ก์ ๊ณผ์ค์ ๋ฐ์ง๋๋ผ ์ฌ๋์ด ์ฃฝ์ด๊ฐ๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ๋ก ์๋ค.
๋ํ ์ผ์ด๋ผ๋ ํ์๋ฅผ ํจ์ ์์ด์ ใ ก ์ผ์ ๋ํ ํ๊ตญ์ ์ธ ์ ์๋ ๋ค๋ฅธ ํฌ์คํธ์์ ์ธ๊ธํ๋๋ก ํ๊ฒ ๋ค ใ ก ์ฌ๋์ด ์ผ๋ง๋ ์ค์ํ์ง ๊ทธ๋ ๋ชจ๋ฅด๊ณ ์์๋ค. ์ง๊ธ ์ฌ๊ธฐ์ ๋งํ๋ ์ฌ๋์ด๋ ์ธ๊ฒฉ์ฒด๋ก์์ ์ฌ๋์ด์ง ๋ฅ๋ ฅ์ ๊ฐ์ง ์ธ๊ฐ์ด ์๋๋ค.
์ธ์์๋ 2x2 ์ข ๋ฅ์ ์ฌ๋์ผ๋ก ๋๋ ์ ์๋๋ฐ ์ฒซ๋ฒ์งธ ๊ธฐ์ค์ ๋ง๋์ผ ํ๋ ์ฌ๋ or ๋ง๋์ง ์์๋ ๋๋ ์ฌ๋์ผ๋ก ๋๋๊ณ ๋๋ฒ์งธ ๊ธฐ์ค์ ๋ง๋๊ณ ์ถ์ ์ฌ๋ or ๋ง๋๊ธฐ ์ซ์ ์ฌ๋์ผ๋ก ๋๋๋ค.
๊ทธ๋์ ๋๊ฐ์ง x ๋๊ฐ์ง = 4์ ํ์ ์ฌ๋์ผ๋ก ๋๋์ ์๋ค.(๋ฌผ๋ก ๊ฐ๋จํ๊ฒ ๋๋ ๊ธฐ์ค์ด๋ค)
์ฌ๊ธฐ์ ๋ด๊ฐ ์ฃผ๋ชฉํ๋ ์ ์ ๊ทธ๊ฐ ์น๊ตฌ๋ก ์๊ฐํ๋ ์ฌ๋์ ๋ฐ๋ก ๋ง๋์ผ ํ๋ ์ฌ๋ + ๋ง๋๊ณ ์ถ์ ์ฌ๋์ ์กฐํฉ๋ฟ์ด๋ผ๋ ์ฌ๋์ด๋ค. ์ฌ๊ธฐ์ ์น๊ตฌ์ ๊ฐ๋ ์ด ๋์ ๋ง์ด ์ฐจ์ด๊ฐ ๋๋๋ฐ ์น๊ตฌ๋ ๋ง๋์ผ ํ๋ ์ฌ๋์ ๊ตฌ์๋์ง ์์ผ๋ฉฐ ๋ฌด์กฐ๊ฑด ๋ง๋๊ณ ์ถ์ ์ฌ๋์ด๋ผ๋ ์์๋ฅผ ํฌํจํด์ผ ํ๋ค๊ณ ์๊ฐํ๋ค. ๊ทธ๊ฒ์ด ๋ฐ๋ก ์ฐ์ ์ด๋ฉฐ ์ฐ์ ์ ์ธ๋ฐ์๋ ์ด์ผ๊ธฐ๋ก ๋ ๋ฐค์ ๊น ์ ์๊ณ ์ ์ธ๊ณผ ํค์ด์ก์๋ ํจ๊ป ์ ์์ ๊ธฐ์ธ์ด๋ฉฐ ๋๋ฌผ ํ๋ฆฌ๊ณ ๋ค์๋ ์ถ๊ทผ๊ธธ์ ์์ ํจ๊ป ๋ถ์ฌ์ก๊ณ xx๋์ด๋ผ๋ฉฐ ์นดํก์ ํ ์ ์๊ฒ ํ๋ ํน์ดํ ํธ๋ฅด๋ชฌ์ด๋ค.
๋ฌผ๋ก ๊ทธ์๊ฒ๋ ๊ทธ๋ฐ ์ถ์ต์ ๊ฐ์ง ์น๊ตฌ๊ฐ ์๋ค. ๊ทธ๋ฐ ๊ฒฝํ๋ ์๋ค. ๊ทธ์ ์ด ๋๋ฌด๋ ์ํ๊น๊ณ ์์ฐ๋ฝ๋ค. ์๋ํ๋ฉด ์คํจ๋ฅผ ๊ฒช์์๋ ํจ๊ปํ ์น๊ตฌ๊ฐ ์๊ณ ์์ ์ ํจ๋ฐฐ์๋ก ๋ง๋ค์ง ์๊ธฐ ์ํด ๋ฐ๋ฒ๋ฅ์น๊ธฐ ๋๋ฌธ์ด๋ค.
์ด์ผ๊ธฐ๋ฅผ ํ๋ค๋ณด๋ ๊ณ ์ํ ํ์ฅ๋์ ๋ง์์ด ๋ ์ค๋ฅธ๋ค.
ํ์ฅ๋์ ์ด๋ค ํ์ฌ์ ํฌ์๋ฅผ ํ์ญ๋๊น?
์ ๋ ํ์ ๋ด ๋๋ค. ํ์ฌ๋ ์ฌ๋์ด ์ด๋์ด๊ฐ๋ ๊ฒ์ด๊ณ ๊ทธ๊ฒ์ ํ์ ๋๋ค. ๋ฅ๋ ฅ์๋ CEO๋ ์์ ์ด ๋ฐ์ด๋ ์ฌ๋์ด ์๋๋ผ ๋ฅ๋ ฅ์๋ ์ฌ๋์ ์๊ธฐํธ์ผ๋ก ๋ง๋๋ ์ฌ๋์ ๋๋ค.
Meteor Up - Meteor deployment tool
๋ฏธํฐ์ด๋ฅผ ์ฌ์ฉํ๋ฉด์ ๊ฐ์ฅ ๋ถํธํ๋ ๊ฒ์ด ์๋ฒ์ ๋ํ๋ก์ด ํ๋๊ฒ์ด ํ๋ค๋ค๋ ๊ฒ์ด์๋ค. ๋ฐฉ๋ฒ๋ค์ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์์ง๋ง(๋ฌผ๋ก ๋ด ๋ธ๋ก๊ทธ์๋ ์๋ค) ๊ทธ์ค์ ํ๋๋ ๋ฌผ๋ก ํ๋์ ํด์ ์ฌ์ฉํ๋ ๊ฒ์ด์๋ค.
์ด ๊ธ์์๋ Meteor up ์ ๋ํด์ ์ค๋ช ํ๋ค.
Meteor up์ ํน์ง์ ์ค์ ํ์ผ ํ๋๋ง ๋ง๋ค์ด๋ nodejs, mongoDB, PhantomJS ๋ฑ์ dependency๋ค์ ์ค์นํด์ค๋ฟ๋ง ์๋๋ผ mup deploy๋ผ๋ ๊ฐ๋ ฅํ ๋ช ๋ น์ด ํ๋๋ก ์๋ฒ์ ๋ํ๋ก์ดํ ์ ์๋ค ๋ํ mup start, stop, restart ๋ช ๋ น์ด๋ฅผ ํตํด ์์ฝ๊ฒ ์ฑ์ ์ผ๊ณ ๋์ ์๋ค
ํ์ฌ ์งํํ๋ ์๋ฒ๋ https://www.digitalocean.com์์ ์๋น์ค๋๋ Ubuntu 14.04์ด๊ณ nodejs v0.12.0, npm ์ด ์ค์น๋์ด ์๋ค.
Meteor ์ค์น
curl https://install.meteor.com/ | sh
๋ฏธํฐ์ด์ ์ข์์ ์ค์ ํ๋๋ ์ด ๊ฐ๋จํ ์ค์น ์ฝ๋๋ผ๊ณ ์๊ฐํ๋ค :)
nginx ์ค์น
sudo apt-get install nginx
- ngnix ์ค์
cd /etc/nginx/sites-available/ sudo vi custom
- /etc/nginx/sites-available/custom
server { listen *:80; server_name mycustomappname.com; access_log /var/log/nginx/app.dev.access.log; error_log /var/log/nginx/app.dev.error.log; location / { proxy_pass http://127.0.0.1:3000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header X-Forwarded-For $remote_addr; } }
- Create a Symbolic Link for custom
ln -s /etc/nginx/sites-available/custom /etc/nginx/sites-enabled/custom
- default ์ญ์
rm /etc/nginx/sites-enabled/default
-- ๋ง์ฝ์ ์ํด ํ ์คํธ!
nginx -t
- Restart nginx
sudo service nginx restart
ip๋ก ์ ์ํ์๋ ์ด์ ๊ฐ์ด ๋ฌ๋ค๋ฉด ์ฑ๊ณต!
Meteor up ์ค์น
sudo npm install -g mup
Create a New Meteor Project
meteor create myApp cd myApp
Setup Meteor up
- Initialize mup
mup init vi mup.json
์์ ์ ์ ๋ง์ ๋ง๊ฒ ์ค์ ์ ๋ฐ๊ฟ์ค๋ค
{ // Server authentication info "servers": [ { "host": "my-ip-address", "username": "root", "password": "password" // or pem file (ssh based authentication) //"pem": "~/.ssh/id_rsa" } ], // Install MongoDB in the server, does not destroy local MongoDB on future setup "setupMongo": true, // WARNING: Node.js is required! Only skip if you already have Node.js installed on server. "setupNode": false, // WARNING: If nodeVersion omitted will setup 0.10.36 by default. Do not use v, only version number. "nodeVersion": "0.12.0", // Install PhantomJS in the server "setupPhantom": true, // Application name (No spaces) "appName": "myApp", // Location of app (local directory) "app": ".", // Configure environment "env": { "PORT": "3000", // The port you want to bind to on your server. "UPSTART_UID": "meteoruser", // The user you want to run meteor as. "ROOT_URL": "http://mycustomappname.com" }, // Meteor Up checks if the app comes online just after the deployment // before mup checks that, it will wait for no. of seconds configured below "deployCheckWaitTime": 15 }
- Setup mup
sudo visudo
์๋์ ์ค์ %sudo ALL=(ALL) ALL ์ด๋ ๊ฒ ์์ ํ๋ค %sudo ALL=(ALL) NOPASSWD:ALL
sshpass ์ค์น
sudo apt-get install sshpass sudo apt-get update
mup setup
mup setup
์ฌ๊ธฐ์๋ถํด ์๊ฐ์ด ์ค๋๊ฑธ๋ฆฌ๋ฏ๋ก ๋ด์ง์ ํ๋๋ก ํ์ :)
์์ ๊ฐ์ด ๋์๋ค๋ฉด ์์ฃผ ์ฑ๊ณต! ์๋๋ผ๋ฉด ์ฒ์๋ถํฐ ๋ค์...
Deploy!!!
mup deploy
์์ ์ url๋ก ์ ์ํด๋ณด๋ฉด...
์์ ์ ์๋ฒ๋ฅผ ๊ฐ๋๋ค๋๊ฑด ์ ๋ง ํ๋ ์ผ์ด๋ค. ์ฒ์ ์ค์ ์ snapshot์ ์ฐ์ด๋๊ณ (snapshot์ด๋ ์ฝ๊ฒ ๋งํ๋ฉด ์๋ฒ ๋ฐฑ์ ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.) ์คํจํ๋ฉด ๋ค์ ๊ทธ snapshot์ restoreํด์ ๋ค์ ์ธํ ํด๋ณด๊ณ ํ๋ ์์ ์ ๋ฐ๋ณตํ๋ค๋ณด๋ฉด ์ด๋์ ๋ค๋ฅธ ๋ธ๋ก๊ทธ์์ ๋ฐ๋ผํ๋ ์ฝ๋๋ค์ ์ดํดํ๊ฒ ๋๋ค.
๋ด๊ฐ ์ฌ์ฉํ๋ ์๋ฒ๋ Digitalocean์์ ์ ๊ณตํ๋ ์๋ฒ์ธ๋ฐ ์ฑ๊ฐํด๋ก ์์น๋ฅผ ์ค์ ํ๋ฉด ๊ทธ๋ ๊ฒ ๋๋ฆฌ์ง๋ ์๊ณ ์๋๋ ๋นจ๋ผ ์ธ๋งํ๋ค.
์๋ ๊ฒฝ๋ก๋ก ๋ค์ด๊ฐ๋ฉด digitalocean 10๋ฌ๋ฌ ์ฟ ํฐ์ ์ป์ ์ ์์ผ๋ฏ๋ก ๋ฌด๋ฃ๋ก ์ฌ์ฉํด๋ณด๋๋ก ํ์
https://www.digitalocean.com
Meteor 1.0.4 Deploy ํ๋ ๋ฐฉ๋ฒ - Ubuntu 14.04
Install Meteor
curl https://install.meteor.com/ | sh
๋ฐ๋ผํ๊ธฐ
https://www.digitalocean.com/community/tutorials/how-to-deploy-a-meteor-js-application-on-ubuntu-14-04-with-nginx
MongoDB Create New User
use admin db.addUser('theadmin', '12345'); db.auth('theadmin','12345');
์ฃผ์ํ ์
502 Bad Gateway
/var/log/upstart/todos.log ํ์ผ์ bcrypt ์๋ฌ๊ฐ ๋ฐ์ํ์ ๊ฒฝ์ฐ npm ๋๋ ํ ๋ฆฌ์์ bcrypt ๋๋ ํ ๋ฆฌ๋ฅผ ์ ๋ถ ์ญ์ ํ๋ค
npm install bcrypt command
MongoDB์ ์ํธ๋ฅผ ์ค์ ํ ๊ฒฝ์ฐ
/etc/init/todos.conf ํ์ผ์ MONGO_URL์ ์๋์ ๊ฐ์ด ์์ ํ๋ค
export MONGO_URL=mongodb://username:password@localhost:27017/todos?authSource=admin
Meteor ์์ํ๊ธฐ
Install Meteor
Meteor ์ค์นํ๊ธฐ ๋ฐ ํํ ๋ฆฌ์ผ
Meteor์์ ์ธ๋ถ MongoDB ์ฌ์ฉํ๊ธฐ
MONGO_URL=mongodb://localhost:27017/meteor-project-name meteor run
Meteor Packages ์ฐพ๊ธฐ
https://atmospherejs.com/
Meteor ์ข ๋ฃ
kill -9 `ps ax | grep node | grep meteor | awk '{print $1}'`
Meteor: Learn Meteor Fundamentals and Best Practices
์๋์ ๊ธ์ ๋ฏธํฐ์ด๋ฅผ ์ฒ์ ์ ํ๋์ฌ๋์๊ฒ ์ถ์ฒํ๋ค.
2012๋ ๊ธ์ด๋ผ์ ๋ฌธ๋ฒ์ ๋ง์ด ํ๋ฆฌ์ง๋ง ๊ฐ๋ ์ ์ดํดํ๊ธฐ ์ข๋ค
http://dogfeet.github.io/articles/2012/meteor-fundametals-and-best-practices.html
Meteor ๊ฐ์๋ชจ์
https://github.com/ericdouglas/Meteor-Learning
Meteor 1.0 Tutorial
http://www.webtempest.com/meteorjs-fromscratch-1
Building a customized accounts ui for Meteor
http://blog.benmcmahen.com/post/41741539120/building-a-customized-accounts-ui-for-meteor
MeanJS 1์๊ฐ ์ฒดํํ๊ธฐ
Dependencies ๋๋ฌธ์ ๊ณจ๋จธ๋ฆฌ๋ฅผ ์ฉ๊ธดํ์ง๋ง ์ค์น๋ฅผ ์๋ฃํ๊ณ yeoman์ ์ด์ฉํ์ฌ ์ค์นํ๋ ๊ฒ ๊น์ง ์ข์๋ค.
์ค์น๋ฅผ ๋๋ด์ ํํ์ด์ง ํ๋๊ฐ ์์ฑ๋์ด ์์๋ค
bootstrap, jquery๋ฑ๋ฑ ์ฌ๋ฌ๊ฐ์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํฌํจ๋์ด ์์ ๋ฟ๋ง ์๋๋ผ ๊ธฐ๋ณธ์ ์ธ ๋ค๋น๊ฒ์ด์ ๊ณผ ๋ก๊ทธ์ธ, ํ์๊ฐ์ (์ฌ์ง์ด ์์ -ํ์ด์ค๋ถ, ํธ์ํฐ, github, linkedin ๋ก๊ทธ์ธ ๊ธฐ๋ฅ)๊น์ง ๊ตฌ์ถ์ด ๋์ด ์์๋ค
์ข์๋ฐ... yo ์ปค๋งจ๋๋ฅผ ์ด์ฉํ๋ฉด CRUD ๋ชจ๋ธ, ์ปจํธ๋กค๋ฌ, ๋ทฐ, Route ๋ฑ๋ฑ ๋ชจ๋ ๋ช ๋ น์ด ํ๋๋ก ๊ตฌ์ถ ๊ฐ๋ฅํ๋ค
๊ทธ๋ฐ๋ฐ ์์ง ์ ์ฒด์ ์ธ ๊ตฌ์กฐ๋ฅผ ๋ชฐ๋ผ์ ๊ทธ๋ฐ๊ฑด์ง ํ์ด ๋๋ฌด ์๋ฒฝํ๊ฒ ์ด์ดํ๊ฒ ์ง์ฌ์์ด์ ๊ทธ๋ฐ๊ฑด์ง ๋ชจ๋ฅด๊ฒ ์ง๋ง ์ด๋ป๊ฒ ์ปค์คํฐ๋ง์ด์ง์ ํด์ผํ ์ง ๊ฐ์ด ์กํ์ง ์์๋ค
์ผ๋ฐ์ ์ธ ๊ฒ์ํ ๊ตฌ์กฐ์ ์น์ฌ์ดํธ๋ผ๋ฉด ์ด๊ฑธ ์ฐ๋๊ฒ ์ข์๊ฑฐ ๊ฐ๋ค๊ณ ์๊ฐ๋์๋ค
๊ทธ๋ฐ๋ฐ ๋ ์๋๋ฏ๋ก ํจ์คํ๊ธฐ๋ก ํ๊ณ ๋ค์ ํ๋ ์์ํฌ Meteor๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ํ๋ค
MEAN Stack ์์ํ๊ธฐ
MEAN Stack์ ์๋ก์ด ์๋ฒ์ ์ค์นํ๋ฉด์ ๊ทธ ๊ณผ์ ๋ค์ ๊ธฐ๋กํ์๋ค
์ด ํ์ด์ง๋ 2015๋ 3์ 16์ผ ์์์ผ์ ์์ฑ๋์์ผ๋ฉฐ ์๋ฒ๋ Ubuntu 14.04 with Node.js v0.12.0 ์ด๋ค
ํ ์คํธ ์๋ฒ๋ ๋์งํธ์ค์ (Digitalocean)์์ ๊ตฌ์ ํ์์ผ๋ฉฐ ์๋์ ๋งํฌ๋ฅผ ์ด์ฉํ์ฌ ๊ฐ์ ํ๋ฉด $10 ์ฟ ํฐ์ ์ป์ ์ ์๋ค
https://www.digitalocean.com
Basic Settings
1. Install Node.js
2. Install MongoDB
3. Install expressโs generator
npm install -g express-generator
์๋์ผ๋ก ํ๋ก์ ํธ๋ฅผ ์์ฑํด์ฃผ๋ express's generator๋ฅผ global๋ก ์ค์นํ๋ค
4. Create A New Project
express --ejs flapper-news cd flapper-news
jade๊ฐ ์๋ html์ ์ฌ์ฉํ๋ ํ๋ก์ ํธ๋ฅผ ์์ฑํ๋ค
5. Install Packages
npm install
node modules๋ฅผ ์ค์นํ๋ค
6. Install Mongoose via npm
npm install --save mongoose
mongoDB๋ฅผ node.js์์ ์ฌ์ฉํ ์ ์๋๋ก mongoose๋ฅผ ์ค์นํ๋ค
7. Create a new folder called 'models'
mkdir models
์๋ ๋งํฌ์์ ๋ชจ๋ ๊ณผ์ ์ ํ์ธํ ์ ์๋ค
See https://thinkster.io/mean-stack-tutorial/
Deployment Settings
๋ค์ ์ค๋ช ์ ๋ก์ปฌ์๋ฒ(๊ฐ๋ฐ์๋ฒ, Staging server)์์ Production server๋ก deployํ๋ ์์ํ ๋ฐฉ๋ฒ์ ์๊ฐํ๋ค
Install Forever
์คํฌ๋ฆฝํธ๊ฐ ์์ํ ์คํ๋๋๋ก ํ๋ forever๋ฅผ ์ค์นํ๋ค
npm install -g forever
forever๋ฅผ globalํ๊ฒ ์ค์นํ๋ค
forever start bin/www
forever stop bin/www
forever stopall
forever list
์์์๋ถํฐ ์ฐจ๋ก๋ก ์คํ, ์ข ๋ฃ, ๋ชจ๋์ข ๋ฃ, ๋ฆฌ์คํธ๋ณด๊ธฐ
Create A Deploy User
sudo useradd --create-home -s /bin/bash deploy sudo adduser deploy sudo sudo passwd deploy
deploy๋ผ๋ ์ด๋ฆ์ ์ ์ ๋ฅผ ์์ฑํ์ฌ deployํ ๋์๋ root๊ฐ ์๋ deploy๊ณ์ ์ ์ฌ์ฉํ๋๋ก ํ๋ค
Install flightplan
flightplan์ ์์ฐจ์ ์ผ๋ก ์๋ฒ ๋ช ๋ น์ด๋ฅผ ์คํํ ์ ์๋๋ก ํ๋ nodejs๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค
์ฌ๊ธฐ์๋ flightplan์ผ๋ก ๊ฐ๋ฐ์๋ฒ์์ ํ๋ก๋์ ์๋ฒ๋ก ํผ๋ธ๋ฆฌ์ฑ ํ๋ ๊ณผ์ ์ ์๊ฐํ๋ค
npm install -g flightplan
flightplan์ global ํ๊ฒ ์ค์นํ๋ค
Install flightplan in your Project as Development
npm install flightplan --save-dev
flightplan ํจํค์ง๋ฅผ ๊ฐ๋ฐ์ฉ์ผ๋ก ์ค์นํ๋ค
Create flightplan.js
flightplan.jsํ์ผ์ ํ๋ก์ ํธ ํด๋์ ๋ง๋ค๊ณ ์๋์ ๊ฐ์ด ๋ณต๋ถํ๋ค
staging๊ณผ production์ ์๋ ip์ฃผ์์ ๋น๋ฐ๋ฒํธ๋ฅผ ์์ ํ๋ค
๋์์๋ฆฌ๋ rsyncํ symbolic link๋ฅผ ๋ง๋ค์ด ๋๋ ํ ๋ฆฌ๋ฅผ ํฌ์ธํ ํ๋ ๋ฐฉ๋ฒ์ด๋ค. ๋ฐ๋ผ์ ๋ฐฑ์ ๋น์ค๋ฌด๋ฆฌํ๊ฒ ํด๋๋ค์ด ๋จ๋๋ค
var plan = require('flightplan'); var appName = 'node-app'; var username = 'deploy'; var startFile = 'bin/www'; var tmpDir = appName+'-' + new Date().getTime(); // configuration plan.target('staging', [ { host: '104.131.93.214', username: username, password: 'your-password', } ]); plan.target('production', [ { host: '104.131.93.215', username: username, agent: process.env.SSH_AUTH_SOCK }, //add in another server if you have more than one // { // host: '104.131.93.216', // username: username, // agent: process.env.SSH_AUTH_SOCK // } ]); // run commands on localhost plan.local(function(local) { // uncomment these if you need to run a build on your machine first // local.log('Run build'); // local.exec('gulp build'); local.log('Copy files to remote hosts'); var filesToCopy = local.exec('git ls-files', {silent: true}); // rsync files to all the destination's hosts local.transfer(filesToCopy, '/tmp/' + tmpDir); }); // run commands on remote hosts (destinations) plan.remote(function(remote) { remote.log('Move folder to root'); remote.sudo('cp -R /tmp/' + tmpDir + ' ~', {user: username}); remote.rm('-rf /tmp/' + tmpDir); remote.log('Install dependencies'); remote.sudo('npm --production --prefix ~/' + tmpDir + ' install ~/' + tmpDir, {user: username}); remote.log('Reload application'); remote.sudo('ln -snf ~/' + tmpDir + ' ~/'+appName, {user: username}); remote.exec('forever stop ~/'+appName+'/'+startFile, {failsafe: true}); remote.exec('forever start ~/'+appName+'/'+startFile); });
Deploy!
๊ฐ๋ฐ์๋ฒ๋ staging์ผ๋ก ํ๋ก๋์ ์๋ฒ๋ production์ผ๋ก fly! ํ๋ค
fly staging
fly production
See https://www.youtube.com/watch?v=XxRuW1pfGTI See also https://gist.github.com/learncodeacademy/35045e64d2bbe6eb14f9
Create a Service for your App
๋ง๋ ์ดํ๋ฆฌ์ผ์ด์ ์ ์๋น์ค๋ก ๋ง๋ค์ด์ ์๋ฒ๊ฐ ์ฌ์์๋๊ฑฐ๋ ์ดํ๋ฆฌ์ผ์ด์ ์ด ์ ๋ฐ์ดํธ๋ ๋ ์๋์ผ๋ก ์์/์ฌ์์๋๋๋ก ํ๋ ๋ฐฉ๋ฒ
1. ssh in as root(์๋ฒ์ root๋ก ๋ก๊ทธ์ธ)
2. Create node-app.conf
vi /etc/init/node-app.conf
node-app.conf ํ์ผ์ ๋ง๋ค๊ณ ์๋ ๋ด์ฉ์ ๋ณต๋ถํ๋ค. ๋ฌผ๋ก ๋๋ ํ ๋ฆฌ ์ด๋ฆ์ด๋ env ํ๋ผ๋ฉํฐ๋ ๋ฐ๊ฟ์ค๋ค
start on filesystem and started networking respawn chdir /home/deploy/node-app env NODE_ENV=production #change this to staging if this is a staging server env PORT=3000 exec /usr/local/bin/node bin/www
์๋๋ ์์์๋ถํฐ ์์๋๋ก ์ดํ๋ฆฌ์ผ์ด์ ์ ์คํ, ์ข ๋ฃ, ์ฌ์์, ์๋น์ค ๋ฆฌ์คํธ๋ฅผ ๋ณด๋ ๋ฐฉ๋ฒ์ด๋ค
start node-app
stop node-app
restart node-app
initctl list
3. Give your deploy user permission to restart the node-app service without requiring a password
deploy ์ ์ ๊ฐ ํจ์ค์๋์์ด sudo node-app restart๋ฅผ ์คํํ ์ ์๋๋ก ๊ถํ์ ๋ถ์ฌํ๋ค. ๋ฌผ๋ก deploy ์ ์ ๋ start๋ stop์ ์ฌ์ฉ๋ถ๊ฐํ๋ค
echo "deploy ALL=(root) NOPASSWD: /sbin/restart node-app" >> /etc/sudoers
4. Modify flightplan.js
flightplan.js ํ์ผ์ ์์ ํ์ฌ ํผ๋ธ๋ฆฌ์ฑํ ๋ forever ๋ช ๋ น์ด ๋์ node-app์ ์ฌ์คํํ๋๋ก ํ๋ค
remote.log('Reload application'); remote.sudo('ln -snf ~/' + tmpDir + ' ~/'+appName, {user: username}); remote.exec('sudo restart node-app');
๊ธฐํ ์ค์
MongoDB ์ธ๋ถ์ ์ ์ค์
sudo vi /etc/mongodb.conf
bind_ip = 0.0.0.0
sudo service mongod restart
ํฌํธ 3000์ ํฌํธ 80์ผ๋ก ๋ณ๊ฒฝํ๊ธฐ
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3000
์ด ์ฝ๋๋ 80ํฌํธ๋ก ์จ ์์ฒญ์ 3000ํฌํธ๋ก ๋งคํ์์ผ์ค๋ค
์๋ฒ๊ฐ ์ฌ๋ถํ ํ ๋๋ ์ด ๋ช ๋ น์ด๊ฐ ์คํ๋๊ฒ ํ๊ธฐ ์ํด /etc/rc.local ํ์ผ์ ์๋์ ๊ฐ์ด ๋ณ๊ฒฝํ๋ค
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3000
FTP(vsftpd) ์ค์นํ๊ธฐ
https://www.digitalocean.com/community/tutorials/how-to-set-up-vsftpd-on-ubuntu-12-04
Computer programmers know far more about computers and code than the average person does, and honestly some of itโs scary. Fact #1 "Under the hood, most critical software you use every day (like Mac OS X, or Facebook) contains...
"ํ๋ก๊ทธ๋๋จธ๋ง ์๋ ์ํ๊ฐ์ง ์ง์ค"
๋ณ ์๊ฐ ์์ด ์ฝ์ผ๋ ค ํ๋๋ฐ ์ฒซ๋ฒ์งธ์ ํ ํฐ์ก๋ค. ์! ์ด ๋น๋ฐ ๋ง์ ์ธ์์ ๊ผญ ์๋ ค์ผ ํ๋ค.
์ฌ์ค #1: "์์ ์ด์ด ๋ณด๋ฉด, (๋งฅ OS X๋ ํ์ด์ค๋ถ ๊ฐ์ด) ์ฐ๋ฆฌ๊ฐ ๋งค์ผ ์ฌ์ฉํ๋ ์ค์ํ ์ํํธ์จ์ด ๋๋ถ๋ถ์ ์์ฒญ๋ ์์ ๋๋์ง๊ณผ ๋์ง์ด ์ด๊ฑฐ์ง๋ก ์ง๋ง์ถ์ด์ ธ ๋์๊ฐ๋ค. ๋ง์น ์ ํ 747์ ๋ถํดํ๋๋ ์ฐ๋ฃ ๊ณต๊ธ์ ์ ์ท๊ฑธ์ด๋ก, ์ฐฉ๋ฅ์ฅ์น๋ ๊ณต์ ์ฉ ํ ์ดํ๋ก ๊ณ ์ ๋ ์ฌ์ค์ ์๊ฒ ๋ ๊ฒ๊ณผ ๊ฐ๋ค. Under the hood, most critical software you use every day (like Mac OS X, or Facebook) contains a terrifying number of hacks and shortcuts that happen to barely fit together into a working whole. It would be like taking apart a brand-new 747 and discovering that the fuel line is held in place by a coat-hanger and the landing gear is attached with duct tape." - ๋ฐด ์ฒด๋ฆฌ(Ben Cherry)
์ด ์ฌ์ค์ ์ฝ๋์ ๊ธฐ๋ฌํ ์ธก๋ฉด์ด๋ค. ์น์ฌ์ดํธ๋ ํ๋ก๊ทธ๋จ์ด ์๋ฆ๋ต๊ฒ ๋์๊ฐ ์๋ ์๋ค. ๋ถ๋๋ฝ๊ฒ ๋์ํ ์๋ ์๊ณ , ์ฌ์ฉ์๊ฐ ๋ณด๊ธฐ์ ์ ๋ง ์๋ฆ๋ค์ธ ์๋ ์๋ค. ํ์ง๋ง ๊ทธ ํ๋ก๊ทธ๋จ์ด ๋์ํ๋๋ก ํ๋ ์ด๋ฉด์ ๋ชจ๋ ๊ฒ์๋ ๊ฒจ์ฐ ๋์ํ๊ฑฐ๋ ๋์ํ ์ ์๋๋ฐ ์ ์ ์๋ ์ด์ ๋ก ๋์ํ๋ ์ค๋ฅ์ ๋์ง๋ก ๊ฐ๋ํ๋ค. That's the funny thing about code, the website or program may work beautifully, it may run smoothly, and it may be absolutely beautiful on the front-end side (what the user sees). But, behind everything that makes it work it will have so many errors, and work arounds that barely work and that shouldn't work, but do for some strange reason.
์ฌ๋ฌ๋ถ! ์ธ์์๋ ๋ถ๋ช ํ ๊ธฐ์ ์ด ์์ด์!
๋๋จธ์ง ์ฌ์ํ ์ฌ์ค 8๊ฐ์ง๋...
์ฌ์ค #2: ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ฑํ๋ ์๊ฐ์ 25%๋ ์ฌ์ฉ์๊ฐ ๋ญ๊ฐ ์๋ชปํ๋๋ก ๋ง๋๋ ๋ฐฉ๋ฒ์ ์ฐพ๋๋ฐ ์ฐ์ธ๋ค. - ๋ธ๋ผ์ด์ธ ํ์ค(Brian Humes)
์ฌ์ค #3: ํ๋ก๊ทธ๋๋จธ๋ PC ์๋ฆฌ๊ณต์ด ์๋๋ค.
์ฌ์ค #4: ํ๋ก๊ทธ๋๋ฐ์ ํ์ดํ์ด ์๋๋ผ ์ฌ๊ณ ํ๋ ํ๋์ด๋ค.
์ฌ์ค #5: ์ซ์๋ 0๋ถํฐ ์ผ๋ค.
์ฌ์ค #6: ํ๋ก๊ทธ๋๋ฐ์ ๋ชฐ์ ์ ์์ญ์ ์์ ๋ ๊ฐ์ฅ ์ฑ๊ณผ๊ฐ ์ข๋ค. ์ด ์์ญ์ ์๋ฌด ๋ฐฉํด ์๊ณ ๋ชจ๋ ์ผ์ด ์ฌ์ ๋ณด์ด๋ (์ฆ๊ฑฐ์ด) ๋ง์์ ์ํ๋ฅผ ๋งํ๋ค. ์ด๋ ์์ ๊ฐ์ ์ด๋ ์ ์์๊ฒ ๋ชฐ์ ํ๋ ์๊ฐ์ด ์๋ ๊ฒ๊ณผ ๊ฐ์ ์ด์น์ด๋ค.
์ฌ์ค #7: ๋ฌธ์ ๋ฅผ ๊ณ ๋ฏผํ๋ฉฐ ์ ๋ค๋ฉด ํด๊ฒฐ์ด ๋๋ค.
์ฌ์ค #8: ๋ถ๋ชจ๋ ์์์๊ฒ ํ ๋นํ ์์ ์ด ์์ผ๋ฉด ๊ทธ ์์์ ์ฃฝ์ผ ๊ฒ์ด๋ค.
์ฌ์ค #9: ํ๋ก๊ทธ๋๋จธ๋ค์ด ์ปดํจํฐ์ ๋ํ ์ง์์ ์๋ํ ๋ ์ฌ๋๋ค์ด ๋ณ ๊ฐํฅ์ ๋๋ผ์ง ๋ชปํ๋ ๊ฒ์ฒ๋ผ, ํ๋ก๊ทธ๋๋จธ๋ค์ ์ฌ๋๋ค์ด ์์ ์ด ์ผ๋ง๋ ์ปดํจํฐ์ ๋ชจ๋ฅด๋์ง ์๋ํ ๋ ๊ฐํฅ์ ๋๋ผ์ง ๋ชปํ๋ค.
MEAN Stack Tutorials ์ ํฌ๋ธ ๋์์ ๊ฐ์
์๋ฒ ๊ตฌ์ฑ๋ถํฐ ์ฝ๋ฉ๊น์ง ์ ๋ถ ๋ค!
Validate and view JSON documents
๋ ํญ์ json ๋ฐ์ดํฐ๋ฅผ ๋ณผ๋ print_r์ ์ฌ์ฉํ๋๋ฐ ์ด์ ๋ ๊ทธ๋ด ํ์๊ฐ ์์ด์ก๋ค.
IntroductionThere are basically two different ways of implementing server side authentication for apps with a frontend and an A...
AngularJS๋ฅผ ์ด์ฉํ authentication ๋ฐฉ๋ฒ