돼지고기 김치찌개
개인적으로 된장 찌개를 잘 못먹는다. 그래서 부모님은 항상 김치 찌개를`대신 해주셨는데 갑자기 생각나서 나름 엄마표 김치 찌개를 해보았다. (비주얼은 이상;)
마침 찌개용 돼지고기가 무려 30%나 할인해서 기분이 좋았다. 나름 맛있다. 엄마의 맛은 아니지만.

JVL
Alisa U Zemlji Chuda
trying on a metaphor
One Nice Bug Per Day

shark vs the universe
Mike Driver
NASA
cherry valley forever
No title available
"I'm Dorothy Gale from Kansas"
hello vonnie
AnasAbdin
Sweet Seals For You, Always

Andulka

#extradirty

★
Lint Roller? I Barely Know Her
No title available
TVSTRANGERTHINGS

seen from Malaysia
seen from United Kingdom
seen from Canada

seen from United States
seen from United States

seen from Poland

seen from Germany

seen from Malaysia
seen from United Kingdom

seen from United States

seen from Türkiye
seen from United States

seen from United States

seen from United States
seen from United States
seen from United States
seen from United States
seen from United States
seen from United States
seen from United States
@dainelpark
돼지고기 김치찌개
개인적으로 된장 찌개를 잘 못먹는다. 그래서 부모님은 항상 김치 찌개를`대신 해주셨는데 갑자기 생각나서 나름 엄마표 김치 찌개를 해보았다. (비주얼은 이상;)
마침 찌개용 돼지고기가 무려 30%나 할인해서 기분이 좋았다. 나름 맛있다. 엄마의 맛은 아니지만.
Automatic Server-Side with Etcd and Node.js
Automatic Server-Side with Etcd and Node.js
Introduction
서비스의 서버는 Down되어서는 안된다. 설령 Down이 된다고 하더라도 빠른 시간 안에 복구할 수 있어야한다. 실제로 런칭된 서비스 대부분이 이러한 시스템을 가지고 있다. 왜냐 하면, 서버가 Down되는 시간이 길어지면 길어질수록 사용자의 Active는 줄어들기 때문이다. 스타트업의 경우엔 치명적인 부분이다.
이 글에서는 etcd 서버를 구축한 후 MongoDB 서버가 죽었을 때 다시 되살려주는 Watcher Instance를 개발한다. 이를 통하여 서버 Down이 없는 서버를 개발해보는 것이 목적이다.
Why etcd?
Apache ZooKeeper로 서버를 구축하여 Watcher Instance를 개발할 수 있지만 더 간단한 구조이면서도 좋은 성능을 가진 etcd를 이용해본다. 단점으로는 자료가 얼마 없다. 구글에 검색을 해보아도 자료는 정말로 얼마 없다. 빠르게 구현하길 원한다면 자료가 많은 zk가 적합하다..
etcd?
etcd는 Consistent한 Key-Value 저장소이다.
Simple : Curl을 이용하여 API를 테스트할 수 있다. (HTTP + JSON)
Secure : SSL을 지원한다.
Fast : 하나의 Instance 당 1000s의 쓰기 연산을 할 수 있다.
Reliable : Raft라는 알고리즘이 사용되고 있다.
etcd는 Go 언어로 작성되어졌다. Brew와 같은 툴로 설치하는 것이 아닌 소스 코드를 Build하고 사용하려면 Go 언어를 설치해야한다.
TIP : MongoDB처럼 JSON Document를 저장하기 위해서는 JSON을 String으로 변환해야한다. Node.js에서는 JSON.Stringify를 이용하면 된다.
Requirement
1. etcd 2. Node.js 3. MongoDB (Option)
Use etcdctl, Node.js for Automatic Server-Side
etcd를 사용하기 위해서, 우리는 Key로 Service를 표현해야하며 Value는 JSON 문서 형식으로 Service에 필요한 유용한 정보들을 표현할 수 있다. 예를 들면, Hostname, Port, Pid(Process Id), createdNodeIndex 등이 존재한다.
이를 위해서, etcd에서는 etcdctl를 지원한다.
$ etcdctl set /services/db "{\"hostname\": \"127.0.0.1\", \"port\": 3000}" {"hostname": "127.0.0.1", "port": 3000} $ etcdctl ls /services /services/server $ etcdctl get /services/server {"hostname": "127.0.0.1", "port": 3000}
이제 Node.js로 코드를 작성해야한다. Node.js에서 etcd를 사용하기 위해서는 node-etcd를 사용하면 된다.
node-etcd의 set을 이용하여 Key를 생성할 수 있다.
var Etcd = require('node-etcd'); var etcd = new Etcd(); etcd.set(key, JSON.stringify({ hostname: '127.0.0.1', port: '3000', pid: process.pid}), function () {}); Options에 { wait : true }를 하면 etcdctl을 이용하여 watcher를 실행할 수 있다.
위와 같이 코드를 작성해보면 서버를 실행시켜본다.
$ node index { action: 'set', node: { key: '/services/db', value: '{"hostname":"127.0.0.1","port":"3000","pid":2174}', modifiedIndex: 40, createdIndex: 40 } }
성공적으로 생성된 것을 볼 수 있다. 이제 생성된 Key에 해당하는 Value를 찾아보자. 매우 간단하다.
$ node index etcd.get(key, function (err, value)) { console.log(value); }
Key에 해당하는 Value가 출력된다. 이제 따로 config에 설정들을 분리시켜주자.
config.json "mongod" : "mongod --port 20000 --dbpath /data/db/rs1--replSet master
따로 Watcher.js를 생성하여 서버 상태를 봐주는 코드를 작성해보도록 하자.
var Etcd = require('node-etcd'), exec = require('child_process').exec, config = require('./config'); var etcd = new Etcd(); var api = { watch: function (key) { etcd.set(config.etcd.key1, config.mongod1, function set() { exec(config.mongod1, function (err, stdout, stderr) { setTimeout(set, 10); }); }); } } module.exports = api;
해당 코드는 app.js에서 실행할 것이기 때문에 module.exports를 잊지 않는다.
var api = require('./watcher'), config = require('config'); console.log('watcher start'); api.watch(config.etcd.key1);
sudo node app으로 서버를 실행시킨다. 그 후에 ps aux | grep mongod를 실행하여 mongod 프로세스를 확인해보자.
$ ps aux | grep mongod root 17150 0.5 0.8 2735688 35568 s002 S+ 11:30PM 0:01.93 mongod --port 20000 --dbpath /data/db/replSet1 --replSet db
정상적으로 MongoDB 서버가 작동 중인 것을 확인할 수 있다. 이제 강제적으로 프로세스를 Down 시켜본 후, MongoDB 서버가 복구되는 것을 확인해보자.
$ sudo kill -9 [process_id] $ ps aux | grep mongod root 17892 0.7 1.2 2726472 50880 s002 S+ 11:41PM 0:00.10 mongod --port 20000 --dbpath /data/db/replSet1 --replSet db
위의 과정을 통하여 MongoDB 서버가 다시 정상적으로 복구되는 모습을 확인할 수 있다. 이러한 자동화 시스템을 구축하지않는다면 개발자는 밤에 일어나서 수동적으로 복구를 해야한다.
여러 개의 서버를 복구하기 위해서는 따로 클러스터를 구성하도록 한다.
etcd를 공부한 내용을 기록한 것입니다. 혹시 틀린 점이 있다면 과감히 말씀해주세요. 다시 고치도록 하겠습니다.
(후루룩짭짭) 참치김치찌개
매운걸 잘 못 먹어서 김치를 크게 좋아하진 않지만 김치찌개는 엄청나게 좋아한다. 부모님은 나 때문에 항상 된장찌개를 못 먹을 정도(된장을 못 먹음...)니까.
준비물 : 묵은 김치, 참기름, 마늘 2개, 양파, 참치, 간장, 고추가루
1. 냄비에 김치와 참치, 그리고 참기름을 넣고 볶는다. 2. 볶음김치처럼 되었을 때 물을 붓는다. (육수면 좋음. 근데 자취생한테 큰 걸 바라면 안되잖아.) 3. 양파를 썰고 마늘을 다진다음에 넣는다. 4. 끓이면서 고추가루와 간장으로 간과 매운맛을 조절한다.
깔끔하게 되었다. 끝맛이 상쾌하다.
(야식용) 간장계란볶음밥
(헠헠... 또 먹고 싶따...)
엄마가 해주셨던 볶음밥에서 아쉬웠던 점은 빠삭함이 없었다는 것이다. 자취생의 로망은 취향따라 요리할 수 있는 것이 아니겠는가? 오늘도 나는 야식을 만들어먹는다.
준비물 : 간장, 계란, 참기름, 올리브유, 후추, 소금, 남은 밥
1. 올리브유 휘릭한 후 계란후라이를 만든다. (소금간 소금소금!) 2. 참기름과 간장, 밥을 투하한다. (간장간장!) 3. 볶는다. 빠삭하게. 4. 마지막에 후추를 뿌리고 또 볶는다. 빠삭하게. 5. 비주얼은 개떡같지만 맛은 있는 간장계란볶음밥 완성!
어찌된 것이 내 블로그는 개발 블로그였는데 요리 블로그가 되가고있... 계란을 스크럼블해서 볶아도 맛있을 듯(이건 면 볶을 때 쓰면 짱 좋을 듯.)
(식재료 다 썩어서 힘들게 만든) 볶음밥
솔직히 나는 배고플 때가 세상에서 가장 화가 나는 순간인 것같다. 집에 와서 냉장고를 오랜만에 열어보니, 하... 한숨밖에 나오지 않았다. 내게 주어진 모든 식재료가 곰팡이가 폈다. 밑반찬은 그렇다 쳐도, 마늘과 콩나물까지 곰팡이가 피어난 현실에 난 좌절하였고, 온전한 식재료를 찾기 시작하였다. 그 결과, 나는 양파와 김치를 찾았다. (사실 양파와 간장만 있으면 왠만하면 맛있게 요리할 수 있음.)
준비물 : 양파, 김치(익어야 맛있다), 간장, 참치캔, 꼬들꼬들 밥
1. 팬을 달군다. 2. 참치 기름과 함께 참치를 팬에 넣는다. (올리브유조차 없었다...) 3. 양파와 김치(손질은 기본), 그리고 울금 가루를 넣는다. 4. 밥을 넣음과 동시에 간장으로 간을 해준다. 5. 볶으면서 적정량의 후추를 넣으면 완성!
올리브 유를 한 다음에 무조건 마늘을 노릇노릇하게 한 다음에 재료를 볶는 걸 선호하는데(마늘 좋아함!) 그걸 못해서 아쉽... 했으면 더 맛있었을텐데...
결론 : 누가 식재료 좀 사주세요...
(유통기한때문에 급하게 만든) 다진 고기 볶음밥
평소에 식재료를 사놓고서 밖에서 밥 먹다가 깜빡하고 유통기한이 지나는 일이 허다하다. 파프리카같은 건 유통기한 지나면 “어? 다시 사지 뭐 ㅋ” 이러지만 다진고기는 절대 그럴 수 없었다. 밖에 나가야하기도 하고 급하게 요리했다.
준비물 : 다진 고기, 찬 밥, 양파, 마늘, 새송이버섯, 후추, 간장, 참기름
1. 팬에 카놀라 유 휘릭한다. 2. 마늘을 채썬다. 사실 다지는 게 더 좋은데 귀찮아. 3. 양파, 새송이버섯 투하 4. 다진 고기를 투하한 후, 소금과 후추로 간을 조금 해준다. 5. 조금 볶다가 간장과 참기름 그리고 밥을 투하한다. 6. 환상적인 팬 스킬로 밥을 볶는다.
끝. 근데 고기로 요리하면 육즙때문에 무조건 맛있으니까 알아서 그냥 막 하는게 답. 헤헤... 그리고 간장으로 간을 자주 하는 이유는 소금보다 먹기 좋게 보이기 때문!
(콩나물무침하려다가 그냥 만든) 얼큰콩나물 국
개인적으로 콩나물국은 매우 친숙한 요리다. 고등학교 등교할 때, 부모님은 간단한 식사를 위해 종종 콩나물국을 해주시곤 했다. 사실 이번에는 콩나물무침(참기름에 해서 밥이랑 같이 비벼먹으면 밥 한 공기 뚞딲 ㄹㅇ...)을 해먹으려고 했는데 오랜만에 밥 먹어보고 싶기도 하고 얼큰한 국물을 마시고 싶어서 요리해보았다.
준비물 : 마늘 2개, 멸치(육수 용), 대파, 콩나물, 고추가루, 국간장
1. 콩나물을 차가운 물에 넣어둔다. 원래 콩나물은 비린내가 장난아니여서 비린내를 잡기 위해서 차가운 물에 넣는다. 안 그러면 국은 맛있는데 냄새때문에 맛없어지는 효과를 경험할 수 있음. 2. 그냥 마늘을 곱게 다지고 대파를 손질해준다. 3. 멸치를 끓는 물에 넣어서 육수를 우려낸다. (나같은 경우에는 멸치 건지는 것이 귀찮아서 그냥 멸치 내장 정리하고 가루로 갈아놓는다.) 4. 좀 끓이면 다진 마늘, 양파, 그리고 개인 취향에 따라 고추 가루를 넣는다. (좀 거친 고추가루를 넣는게 좋은 것같다. 점도 변화가 크게 없어서 먹는데 좋음(?)) 5. 콩나물을 넣고 간장으로 간을 해준다. 6. 알아서 끓여준다. 개인적으로 소금보단 간장으로 간을 하는 편입니당.
그리고서 따뜻한 밥이랑 같이 먹는다. 존맛... 뒤에 어묵 볶음도 나중에 올려야겠땅.
(먹다남은 동원)참치 파스타
개인적으로 밥보다는 면 요리를 더 좋아한다. 면은 밥보다 빠르게 할 수 있기 때문이다. 요리 방법 또한 꽤나 간단하다.
준비물 : 마늘, 양파 1/2, 청양 고추, 울금 가루 (카레 가루로 대체 가능), 파스타 면(칼국수 면으로 해도 되는데 전분을 없애고 해야한다. 안 그러면 점도가 극혐... 핵극혐... 씹핵극혐...), 버섯(개인 취향에 따라 선택)
1. 올리브 유를 두른다. (카놀라 유도 상관 없음)
2. 마늘을 곱게 다지고, 버섯, 양파와 청양 고추를 잘 썬다. 3. 팬에 다져놓은 마늘부터 넣는다. 마늘이 조금 노란 색이 되면서 향이 올라올 때, 썰어놓은 청양 고추와 양파 그리고 버섯을 넣는다. 4. 울금 가루를 넣는다. 이게 카레 가루의 향신료로 쓰이는 거라 카레 가루 넣어도 된다. 개인적으로 카레 가루보다는 울금의 향을 좋아해서 카레 가루를 안 쓴다. 5. 먹다 남은 참치를 넣고서 휙휙 젓는다. 6. 이 때 쯤이면 파스타 면이 다 삶아졌을테니 약간의 물과 함께 팬에 투하한다. 7. 후추와 소금으로 조금 간을 한다. (간장을 조금 넣어도 되는데 하거나 말거나~)
끝!
15분 정도밖에 안 걸리는데 나름 영양식인데다가 매운 걸 잘 못 먹는 나한테는 약간의 칼칼함을 주는 좋은 식사가 되어줬다!
Virtualenv로 파이썬 개발 환경 구축하기
Mac OS X Yosemite 기준
1. sudo pip install virtualenv 2. . venv/bin/activate 3. 2번 단계를 거치면 Shell에 venv가 표시된다. 4. pip install -r requirements.txt 로 virtualenv에 package를 설치한다.
그 여자가 내 옆을 지나간다. 여름이지만 시원했다. 더위조차 달콤했다.
그 여자가 커피를 주었다. 뜨거우면서도 시원했다. 쓰디 쓴 그 맛조차 달콤했다.
집단지성 프로그래밍 (1)
일반적으로 구글, 왓챠 등과 같은 서비스를 이용할 때 사용자에게 취향에 맞는 정보를 보여주도록 하고 있다. 오프라인에서는 지인들에게 추천받는 것과 같다고 볼 수 있다. 하지만 이와 같은 경우에 문제점은 선택의 여지가 많을 수록 점점 비현실적인 결과를 나타낸다는 것이다. 그렇기 때문에 협업 필터링(Collaborative Filtering)이라는 기법이 개발되었다.
사용자간의 취향이 얼마나 유사한지 유사도를 알아내기 위해서는 데이터를 수집해야한다. 수집한 데이터를 바탕으로 수학적인 공식을 이용하여 유사도를 도출해낸다.
여러 가지 방법이 있지만, 유클라디안 거리점수와 피어슨 상관점수를 통한 계산 방법을 책에서 공부한다. (그래서 이거 2개밖에 모름... 공부하자 부들부들...)
유클리디안 거리점수
우리가 중학교 수학 때 공부한 것과 같다. 두 점 사이의 거리를 구하면 된다. A(2,4), B(3,5)라고 가정하였을 때, 파이썬 코드로 나타내면 sqrt(pow(x2 - x1, 2) + pow(y2 - y1, 2)) 이다. 계산하였을 때, A와 B 사이가 유사할 수록 작은 값을 가지게 된다.
참고 : O’REILLY 집단지성 프로그래밍
장마가 오기 전, 역동적인 구름의 모습 :)
서울로 이사왔다. 소프트웨어 마에스트로 과정을 위하여, 그리고 나 자신을 성장하기 위하여 오게되었다.
항상 초심을 잃지 말고 열심히 하자. 부족함이 있다면 받아들이고 치열하게 배우자.
SW_Maestro 6기 최종 합격
SW_Maestro 6기에 최종 합격하게 되었다. 그리고 삼성 소프트웨어 멤버십을 포기하게 된다. 사실 안정적인 직장으로는 삼성 소프트웨어 멤버십이 더 좋겠으나 “인생이 안정적이기만 하면 무슨 재미겠나?” 라는 생각에 의외로 쉽게 포기하게 되었다.
이제 지긋지긋한 대학 생활을 뒤로 하고 새로운 여정에 나서게 된다. 항상 좋을 순 없겠지만 잘 극복해나가며 성장해나갔으면 좋겠다.
차세대 보안리더 양성 프로그램 BoB(Best of the Best) 멘토의 변이 아닌 변(?) 안녕하세요 차세대 보안리더 양성프로그램의 심준보라고 합니다. 차세대보안리더 양성프로그램 Best of the Best(이하 BoB)는 미래창조과학부의 지원에 힘입어 한국정보기술연구원(KITRI)가 주관하는 인력양성 프로그램입니다. 현재 4기 모집 평가가 한창인 가운데 작년 BoB 프로그램 모집시에 BoB 정구홍 멘토님의 글처럼 멋있는 글은 (http://hac..
"이 학생들이 자라서 자신이 이룬 가장 큰 성과는 BoB를 할 때 이룬 것이다 라는 말을 듣고자 하는 것이 아니라 자신이 이룬 가장 큰 성과는 BoB의 토대가 있었기때문이다 라는 말을 듣고자 함입니다."
우리는 ‘창의적인 인재 육성을 위한 교육’을 외치지만 현실은 ‘실적을 위한 교육'을 시행한다. 대표적으로 ‘대학 교육'을 꼽을 수 있을 것같다.
오늘의 지성과 내일의 지성을 책임져야할 대학 교육이 높은 취업률과 정부 사업을 얼마나 지원받았는가에만 관심을 기울이고 있다. 교육 커리큘럼에 대한 토론보다는 현재 수준에 만족한다. 그러면서 한국의 누군가를 만들겠다고 선언한다.
창의적인 교육을 홍보하기보다는 높은 취업률을 홍보한다. 대학 홍보에서부터 벌써 창의적인 교육보다는 월급쟁이의 삶을 만들어줄 수 있는 확률이 높다며 자화자찬한다.
학생이 길을 만드는 걸 도와준다기보다는 길을 정해놓는다. 그런데 더 어어없는 건 학부모들이 이것에 동의한다. 뭐부터 잘못되었는지 생각하기 어렵다.
삼성 소프트웨어 멤버십 하반기 25-2기 기술전형에 최종 합격하게 되었다. 이제 소프트웨어 마에스트로 발표만 남았다. 소프트웨어 마에스트로... 정말 합격했으면 좋겠다.
Seoul Square.