2016년 2월 16일 화요일

[zsh, YADR, dotfiles] environment variable path / 환경변수 설정

[zsh, YADR(dotfiles)] environment variable path / 환경변수 설정




이 글은 여러분이 linux, mac에서의 환경 변수 설정을 할수 있다는 가정하에 진행됩니다.
만약 linux, mac 에서의 환경 변수 설정을 모른다면 아래 글을 참조하세요.
This article is based on the assumption that you can set the environment variable in linux, mac.
If you see the following articles if you do not know the environment variables set in the linux, mac.

[Linux, Mac] environment variable path / 환경변수 설정





1. zsh 유저 환경변수
1. zsh user environment variables


YADR 즉 dotfiles는 zsh기반으로 동작하며
zsh은 기존 linux, mac 시스템이 사용하는 ~/.bash_profile 파일의 설정을 따르지 않고
~/.zshrc 파일의 설정을 따릅니다.
따라서 기존 linux, mac 시스템에서 .bash_profile 파일에 등록한것과 같이 아래 형태로 환경변수를 정의하면 됩니다.
That YADR dotfiles operates as zsh-based
zsh existing linux, mac system does not follow the set of ~/.bash_profile file to use
Follow the settings in ~/.zshrc file.
Therefore, as registered in the .bash_profile file in the existing linux, mac system, you can define an environment variable in the form below.


export VARIABLE=DIR



2. zsh 전역 환경변수
2. zsh global environment variables



zsh의 환경 변수 설정 위치에 대해 stack overflow 검색을 할경우 
아래 세개의 파일이 언급됩니다.
When a stack overflow search for the location of the csh environment variable settings
The three files mentioned below.

~/.zshrc
~/.zshenv
~/.zprofile


~/.zshenv 파일을 열어보면 아래와 같이 환경변수들을 정의하라는 메시지와
쉘에 로그인하지 않은경우에 대해서 보장한다고 명시되어있습니다.
If you open the ~ /.zshenv file and prompts you to define the environment variable as follows: It stated that the guarantees for the shell if you are not logged in.


설치 방법, 운영체제에 따라 .zshenv파일의 위치는
~/.zshenv 또는 /etc/zsh/zshenv 에 있습니다.
만약 ~/.zshenv 가 없을경우 /etc/zsh/zshenv 파일을 수정하세요.
How to install, the location of the file, depending on which operating system is .zshenv
~/.zshenv or in /etc/zsh/zshenv 
If ~/.zshenv is not the case, edit the /etc/zsh/zshenv file.






3. 기존 linux, mac시스템 환경변수 include
3. The existing linux, mac system environment variables include



위에서 zsh에 유저 환경변수, 전역변수에 대해 언급하였지만
기존 시스템을 사용하던중에 zsh을 사용할경우
모든 변수들을 옮겨서 적어줘야 하는것은 매우 불편한 일입니다.
On the user environment variables in zsh, but referring to global variables
If you use zsh were used in the existing system
It is very inconvenient to have to write all the variables move.


이경우 .zshenv 파일하단에 아래와같이 추가하면 기존 .bash_profile에 설정된 환경변수를 모두 로딩합니다.
In this case, add the following to the bottom .zshenv file loads all existing environment variables set in the .bash_profile.



source "$HOME/.bash_profile"




만약 ~/.bash_profile이 아니라 전역 환경변수인 /etc/profile을 로드하고 싶다면
아래와 같이 작성하세요.
If ~/.bash_profile, not if you want to load a global environment variable in /etc/profile
Write below.


source "/etc/profile"





[Linux, Mac] environment variable path / 환경변수 설정

[Linux, Mac] environment variable path / 환경변수 설정




1.유저 환경변수

1. The user environment variables


리눅스,맥 환경변수 설정은 ~/.bash_profile 에 설정합니다.
기본적으로 유저 홈에 .bash_profile이 존재하며 터미널을 처음 실행시켰을때 기본 위치는 유저홈 입니다.
Linux, Mac to set the environment variable is set to ~ / .bash_profile.
By default, the user's home .bash_profile exists, and the default location when you first run the terminal user's home.


터미널을 열고 아래 명령어를 실행하세요
Open a terminal and run the following command

$ vi ~/.bash_profile



첫 테스트로 아래와 같이 입력한후 저장합니다.
After typing the following and save

export TEST="first test"









reboot 하거나 터미널을 새로 열지 않는다면 환경변수는 바로 적용되지 않습니다.
하지만 아래 명령어로 현재 shell에 바로 적용할수 있습니다.
If the reboot or open a new terminal environment variables do not take effect immediately.
However, you can apply right down to the current shell commands.


$ source ./bash_profile


이제 방금 입력한 TEST 변수가 잘 작동하는지 확인합니다.
Now the TEST variable you just entered to verify that it works well.

$ echo $TEST










잘 실행되었다면 두번째 스텝으로 변수를 복합적으로 적어봅니다.
If executed well, try to write down a complex variable to the second step.

export TEST="first test"
export TEST2=$TEST"second test"




저장후에 아래 명령어들로 어떤 결과가 나오는지 확인합니다.
After storage, check the instructions below what the result comes out.

$ source ./bash_profile

$ echo $TEST

$ echo $TEST2












여기까지 잘 되었다면 이제 이 내용들을 응용해서
여러분들만의 환경변수를 구축하시면 됩니다.
Well here it is now, if the application is more
If you are building an environment variable for you only.




아래 이미지는 제가 사용하는 환경변수중 일부입니다.
도움이 되길 바래요.
The image below shows some of the environmental variables that I use.
Hope this helps.








2.전역 환경변수

2. The global environment variables



지금까지 작성했던 ~/.bash_profile 설정은 각 유저별로 적용이 됩니다.
만약 모든 유저가 사용할 환경 변수(전역 환경변수)를 지정하고싶다면 /etc/profile 을 수정해야합니다.

~ /.bash_profile Set had written so far is applied for each user.
If you want to specify all the user environment variables (global environment variable) used to modify the /etc/profile.

$ vi /etc/profile


작성후에 이전에 실행한것처럼 아래 명령어를 실행합니다.
After you create and run the following command to run as before.

$ source /etc/profile





2016년 2월 13일 토요일

[MEANI-Stack] - #6 (Node.js & Express) Mongoose setting

[MEANI-Stack] - #6 (Node.js & Express) Mongoose setting








Mongoose.js는 MongoDB를 한층 강력하게 만들어주는 라이브러리 입니다.

Mongoose는 ODM(Object Model and a Document Database)으로써
ORM(Object Model and a Relational Database)과 흡사한 형태를 가집니다.




홈페이지에 들어가면 위와같은 친절한 예제가 기다리고 있네요.









예제를 따라 신나게 실행하려는데 오류가 저를 반기는군요...
'kerberos'가 정의되지 않았답니다.

처음엔 제가 뭔가 잘못한건가 하고 열심히 검색 해 보았지만
다운 그레이드 해서 해결했다는 말밖에 없더군요.

changelog를 확인해 봐야겠다는 생각으로 몽구스 깃허브로 들어갔습니다.
몽구스 깃허브 : https://github.com/Automattic/mongoose



몽구스를 설치한 날짜가 2월 8일입니다.





4.4.3 버전에서 해결이 되었군요.
바로 업그레이드 하고 실행해봅니다.





에러없이 깔끔하게 잘됩니다.






이제 테스트를 하기위해 서버에서 사용할 스키마 모델을 아래와 같이 하나 생성해봅니다.



app/models/test.server.model.js 에 스키마를 생성하고

mongoose.js에서 해당 모델을 require한 후에

app/controller/tests.server.controller.js 에 test모델을 추가합니다.

그리고 app/routers/test.serve.routes.js에 api를 등록합니다.

드디어 express를 사용하게되었군요.


스키마 생성시 타입은 아래 링크를 참조하세요
http://mongoosejs.com/docs/schematypes.html






postman을 이용해서 API를 호출해봅니다.



생성은 잘 된듯하나 response데이터가 뭔가 이상합니다.
생성할때 넘긴 name과 age가 넘어오지 않습니다.

몇번더 생성해보고
list를 호출해 보았습니다만 마찬가지로 name과 age가 넘어오지 않습니다.







mongodb에 콘솔로 들어가 확인해 보았지만 마찬가지 입니다.

저장이 안되고 있습니다.





리퀘스트에 문제가 있진 않은지 아래처럼 확인해 보았습니다.





안옵니다. 리퀘스트 body자체를 가져오지 못하고 있습니다!?




아주 중요한 bodyPaser를 잊고 있었네요
아래 명령어를 실행하여 body-parser를 설치합니다.
$ npm install body-parser




설치후 아래와 같이 express.js 파일에 코드를 추가해 줍니다.




body-parser 의 github페이지는 아래 링크를 참조하세요






다시 테스트를 해봅니다.



좋습니다 제대로 들어간것 같군요

리스트를 호출해봅니다.





아주 잘 들어갔습니다.



아래 주소에 push까지 완료하였습니다.
https://github.com/polyglotm/PP-MEANI-stack-back-end


이제 node로 API를 작성할수 있는 환경이 조금씩 갖춰져 가고 있습니다. 



태스크 진행의 마무리는 마무리는 애자일보드 중간점검입니다



다음번 태스크는 (Ionic 2) Seed Project 생성 이 될 예정입니다.


2016년 2월 9일 화요일

[MEANI-Stack] - #5 Project DownScale & 요구사항 재정의

[MEANI-Stack] - #5 Project DownScale & 요구사항 재정의


근래들어 동료 개발자분들과 펫 프로젝트 관련한 대화를 많이 나누었는데
저뿐만 아닌 대다수의 개발자분들이 펫 프로젝트 계획을 가지고 있거나 이미 실행중 이었습니다.

흥미로운 새로운 기술 접목에 대한 추천도 있었지만
그중에도 펫 프로젝트를 자주 진행하시는 분이 계셨는데
그분이 말씀하시기를 펫 프로젝트는 최대한 다운 스케일을 해서
설 연휴 안에 끝낼만큼 스케일로 작게 할 계획이다 라고 하셨습니다.

이 말을 듣고 몇일간 진지한 고민에 빠졌는데
실제 업무에서 애자일을 그렇게 외치고 기능이 많다고 좋은게 아니라는것을 그렇게 되새기면서도
제가 진행하는 펫 프로젝트에서는 정 반대로 행동하고 있었습니다.




펫 프로젝트의 최대 장점이자 단점은
모든것을 제가 결정 해야 한다는 것입니다.

아무도 "이건 꼭 필요한 기능이 아니야"라고 말해줄 사람이 없습니다.

기한을 길게 잡을수록 디테일한 부분에 투자할 시간이 많아지고
꼭 필요한 기능이 아님에도
"있으면 좋을것 같은"설익은 아이디어들만 덕지덕지 붙어서
정체성 없는 어플리케이션이 되지 않을까 하는 생각이 들었습니다.

이 부분들에 대해 많은 생각을 해본 결과
개발, 디자인 할것 없이 "끝"이라는것이 없는것 같습니다.

사람 마음이란게 조금더 멋지게, 조금더 아름답게, 조금더 편하게,
조금더 심플하게, 조금더 빠르게,
자꾸만 "조금더 낳은"것을 추구하기 때문에

기한이 길면 자칫 "불필요 하진 않지만, 꼭 필요하지 않은" 디테일한 부분에 푹 빠져서
정작 꼭 필요한 부분을 제대로 구현하지 못할수 있다 라는 생각이 들더군요.

주말에만 진행하는 프로젝트라 할지라도
시간이 부족한만큼 진행하면서 요구사항을 점점 덜어내더라도
펫 프로젝트는 3개월로 진행하는게 정신건강에 좋을듯 합니다.

기간이 너무길면 자칫 루즈해질수 있으니까요.




이러한 생각끝에 Project DownScale & 요구사항 재정의 task로 올려놓고 
이번 포스팅을 진행하게 되었습니다.



Project DownScale & 요구사항 재정의

0.프로젝트명
 happy-restaurant(이하 HR)

1.목표
 일반 이용자에게 실시간 예약 서비스를 제공한다.
 식당 오너는 예약 업무및 정산을 HR을 통해 진행할수 있어야 한다.


2.세부사항

회원가입 및 비밀번호 찾기 프로세스
 1.회원 아이디는 email로진행, 회원가입시 role선택


 일반이용자 요구사항
  1.위치기반으로 식당 위치를 파악할수 있어야 한다.
  2.날짜 및 시간대, 인원 선택시 지도기반으로 예약 가능 식당을 확인할수 있어야 한다.
  3.특정 식당 검색/ 또는 2번에서 진입한 일반 이용자는
    날짜에 대한 예약 가능 시간대를 캘린더 형태 또는 리스트 형태로 확인하고
   예약할수 있어야 한다.
  4.특정 식당에 대한 메뉴및 가격을 확인 할 수 있어야 한다.
  5.손님은 식당을 예약때 휴대폰 어플리케이션을 통해 메뉴를 미리 주문 할수 있어야 한다.
  6.메뉴를 미리 주문한경우 또는 어플리케이션으로 주문한경우 후기를 남길수 있어야 한다.


 식당 오너 요구사항
   1.회원가입시 위치 기반으로 위치 선택이 가능해야한다.
   2.테이블 수 및 좌석수를 입력 할 수 있어야 한다.
   3.특정 시간대 범위에 따라서 예약용 좌석수를 조절 할수 있어야 한다.
     ex) am 10:00 ~ pm 17:00 20석
           pm 17:00 ~ pm 18:00 10석
           pm 18:00 ~ pm 20:00 6석
   4.특정 인원이상 초과시 별도 문의 옵션이 가능해야 한다.
     ex) 4명이 max일경우 5명은 자동으로 예약불가로 변경되야함.
   
   5.메뉴 및 가격을 등록 할 수 있어야 한다.
   6.온라인 쿠폰 발행이 가능해야 한다.
   7.사장은 어플리케이션 주문에 대하여 식사완료 버튼을 눌러야 대금을 지급 받을수 있다.
   8.사전메뉴 주문시만 예약 가능 옵션을 제공해야 한다.
 
   *시간이 남으면 구현할 사항. (식당오너에게 고급 데이터를 제공하여 가입 유도)
    9.매출 날짜, 시간대, 연령, 성별, 가격별 매출율 통계 제공




꼭 필요한 정책적인 부분

사전결제가 없이 손님/사장 상호평가의 경우.
식당 오너가 손님의 예약 성공율을 90%이상일경우만 예약 받는등의 옵션을 부여 할 수 있지만
카드 결제 수수료등을 우회하고자 도착한 손님에 대해서도 현금만 받는등의 논리적 오류가 발생할 수 있다.

이경우 손님의 예약 성공율은 지속적으로 떨어지게되고 no-show족 방지가 불가능해지므로
이에 따라 사전결제 옵션을 추가해야 한다.

사전결제 옵션.
 사전 결제 옵션 미제공시 다수의 계정으로 활동하는 no-show족의 등장을 방지하기 힘들다.
 사전 결제 옵션으로 사용자가 사전 결제를 통해 사장은 no-show족을 완전히 방지 할 수 있다.

그러나 결제 부분은 이번 펫 프로젝트에서 진행하기에 시간을 많이 할애하는 부분이므로
카드결제 및 휴대폰 결제를 포함한 모든 결제는 "된다"라는 가정하에 진행한다



3.상용화 진행시 필요한 세부사항 (펫 프로젝트에서 전혀 불필요한 사항)

공통사항
 1.비밀번호 찾기 이메일 인증 구현 (비밀번호 분실시)

일반이용자
 1.휴대폰 인증
 2.카드정보 입력(사전 결제 진행으로 no-show족 완전방지)
 3.카드정보 미입력시 휴대폰 결제 제공.

식당 오너
 1. 이메일 인증, 휴대폰 인증 필수. 미 인증시 식당 등록 불가
 2.환급 계좌정보 입력 및 확인 절차
 *상용화 구현시 예약 손님에 대해 포스기 결제 및 오프라인 쿠폰 발행이 불필요함.


4.프로젝트 task순위
 기능적인 부분을 최 우선으로 진행하며 UI부분은 마지막에 한번에 마감처리한다.

2016년 2월 7일 일요일

[MEANI-Stack] - #4 Mac MongoDB 설치

[MEANI-Stack] - #4 Mac MongoDB 설치







이번에 진행할 내용은 Mac mongoDB를 설치입니다.






구글에 mongodb install mac으로 검색하니  공식사이트의 guide가 바로 나오네요.
https://docs.mongodb.org/manual/tutorial/install-mongodb-on-os-x/



거두절미하고 설치하는 방법은 터미널에서 아래 명령어를 실행하면 됩니다.
brew install mongodb






설치가 완료되었으면 mongoDB에서 사용할 기본 directory를 아래 명령어로 생성해 줍니다.
sudo mkdir -p /data/db





잘 설치되었는지 터미널에서 아래 명령어로 확인해 봅니다.
mongod












네 멋진 에러가 저를 반겨주는군요... 
하지만 설치는 되긴 된거같네요. 버전 3.2.1이라고 뜹니다.

바로 stack over flow를 검색합니다.









그렇습니다. 
서비스 시작을 시켜줘야지만 응답하는 당연한걸 안해줬네요...


stack over flow에 나온대로 아래 명령어를 실행합니다.

$ brew services start mongodb








네! 드디어 잘됩니다!





오랜만이라 기억이 잘 안나는 정도가 아니라
아무것도 기억이 안납니다.

별거 있나요 help 한번 멋지게 눌러줍니다.








use pp-meani-stack명령어를 사용해
현재 db를 pp-meani-stack으로 변경하고
아무거나 한번 생성해봅니다.




네 아주 잘 동작합니다.










그럼 이번 태스크를 마치고 중간점검을 해보겠습니다.



(MongoDB)seed Project생성태스크는 불필요하다 판단하여 삭제하였고


(Node & Express) Mongoose setting task와
Project DownScale & 요구사항 재정의 task를 추가 하였습니다.


다음 태스크는
Project DownScale & 요구사항 재정의 task부터 진행한 후에
(Node & Express) Mongoose setting task를 진행하도록 하겠습니다.


2016년 2월 6일 토요일

[MEANI-Stack] - #3 Node.js & Express Seed Project

[MEANI-Stack] - #3 Node.js & Express Seed Project








오늘 진행할 태스크는 (Node & Express) Seed Project 생성입니다.









github에서 express seed키워드로 검색해보니 대부분 MEAN스택을 full제공합니다.

저는 TypeScript를 써야하기 때문에 다른 부분은 신경쓰지 않고
Directory 구조가 가장 심플하고 express만 잘 돌아가는 프로젝트를 선정하려고 합니다.






위 사진의 star1406개를 기록하고 있는

/angular-express-seed

프로젝트에 들어가보니 

디렉터리 구조가 정말 깔끔하고 좋습니다.








바로 내려 받아서 실행해 보았습니다.




멋진 에러가 저를 반겨줍니다.
몇분간 수정해보았지만 계속되는 에러들이 저를 반겨줍니다.








그냥 지난주에 구매한 [중급 개발자를 위한 MEAN스택 공략]에
나온 예제를 참고해서 직접 만들기로 결정!


결정된 directory 구조는 아래와 같습니다.


app/
  controllers/      --> cotroller의 집합
  models/           --> model의 집합
  routes/           --> route의 집합
  views/            --> view의 집합

config/             --> express config파일들

package.json        --> for npm

public/             --> all of the files to be used in on the client side

server.js           --> app 







확장하기 쉬운 구조의 친절한 예제입니다.
이전에 Node.js & express로 프로젝트를 진행 하였을때도
이렇게 깔끔한 디렉터리 구조였다면 좀더 편했을텐데 라는 생각이 드네요...


완전 잘 동작합니다.
port의 경우는 이미 front-end(Angular2)에서 3000port를 사용하고 있기 때문에
4000으로 하였습니다.




작업의 마무리는 커밋!
https://github.com/polyglotm/PP-MEANI-stack-back-end











다음 태스크는 (Mong DB) Seed Project 생성입니다.

2016년 1월 31일 일요일

[MEANI-Stack] - #2 개발환경 구축, Angular2 Seed Proejct

[MEANI-Stack] - #2 개발환경 구축, Angular2 Seed Proejct



이번 Pet-Project의 Angular2는 TypeScript기반으로 진행하기에
TypeScript를 지원할수 있는 개발환경이 필요했습니다.

사실 처음엔 이미 ECMA6는 어느정도 익숙해진 상태라 ECMA6기반으로 진행하려고 했지만 Angular2개발진이 TypeScript를 기반으로 작성하는점과 github에서 angular2 seed를 검색했을때 아래와 같이 TypeScript기반으로 된 프로젝트들이 주류를 이룬다는점이 TypeScript기반개발에 힘을 더 실어 주었습니다.










그리하여 Angular2 Seed 프로젝트를 시작하기전에 개발환경에 대해 조사를 하였습니다.

우선 첫번째로 제가 애용하고 있는 vim ...!?
에서 TypeScript가 지원하는지 찾아보았습니다.








저는 이제서야 typescript를 사용하는데
이미 typescript-vim plugin은 3년전에 나와 있었습니다...



안타깝게도 Angular2 플러그인은 없군요.

사실 플러그인이 없어도 익숙하기만 한다면 사용하는데 아무런 문제가 없습니다.
회사 업무를 진행하는데 Angular 1.x를 플러그인 없이 그냥 개발하고 있습니다.






그래서 익숙한 Vim을 사용할까 하다가
http://egghead.io 사이트에서 대부분 강의가 WebStrom 인점을 부분과
2016년부터 WebStorm이 Monthly Plan을 $5.90 에 판매중이므로  
러닝 커버를 최대한 줄이기 위해 이번엔 Pet-Proejct에서는 
처음 1달간 WebStorm을 써보려 합니다.



 https://www.jetbrains.com 에 들어가보니 역시나 괜히 사람들이 typescript + Angular2를 사용할때
WebStorm을 사용하는게 아니였군요.
아래와 같이 TypeScript와 Angular2모두 지원합니다.






이로써 IDE는 WebStrom으로 결정하여서 설치를 완료하였고


Angular2 Seed Project를 조사해 본 결과
에서 만든  Webpack Starter Seed가 제일 적절하다고 결정하였습니다.






혹시 Webpack또는 Front-End task Runner 에 익숙치 않으신분들은 아래 글을 참고 하시기 바랍니다.







바로 seed project를 clone해서 의존성 모듈들을 설치하고 프로젝트를 열고 실행해 보았습니다.




네 멋지게 TypeScript Compiler에러가 발생합니다.

일단 import하는 구조가 JetBrains에서 소개했던것과, 다른 angular2자료를 볼때는 
import { somFunc } from 'angular2/angular2'; 형식 인데
angular2 Beta버전부터는 angular2/하위에
core, router, common등으로 나뉘었습니다

현재 Webstorm 11 TyepScript compiler 에서는 
angular2를 지원하는것이지 angular2 Beta를 지원하는것이 아니었습니다.


네 그래도 상관없습니다. 이미 결제했으니까요...










에러와 상관없이 아주 잘 동작합니다.





Task목표인  Angular2 Seed Project의 준비가 완료 되었으므로  바로 github에 init합니다.














이로써 태스크 2개가 마무리 되었고 다음 단계는 Node & Express Seed Project 생성입니다.
이 프로젝트를 Angular2와 복합적으로 할까도 고민 하였지만
나중에 Ionic2를 통해 만들어진 어플리케이션들이 API를 요청하는 상황을 고려하면
서버는 따로 분리하는게 맞는듯 하여 기존 계획대로 별개의 태스크로 진행할 예정입니다.







Node & Express와 MongoDB 모두 기억이 가물가물 해서 오늘 책도 한권 구매 하였습니다.



강남 교보문고에서 MEAN스택 관련 책 3권을 보았는데

이 책은 기본적으로 Javascript를 어느정도 익숙하다는 전제 조건으로 진행되는 책입니다. 
설명도 굉장히 잘 되어 있습니다.

현업에 종사하시는 분이라면 누구라도 바로 읽어도 무방해 보입니다.




이제 다음 태스크는 Node.js & Express Seed Project입니다.

이번 글은 여기서 마치도록 하겠습니다.