발생일: 2017.01.05 키워드: AWS ELB, x-forwarded-for, IP 스푸핑, IP Spoofing 문제: 우린 앱서버로 node.js의 express를 사용한다. express 로그에서 요청 IP를 파악할 땐, X-Forwarded-For 헤더의 값을 참조한다. 헌데, 로그를 살펴보니 X-Forwarded-For 헤더에 예상했던 것보다 많은 IP가 포함되어 있는 경우가 있다. 프록시를 여러 번 걸쳐 들어온 것 같은 요청도 있고, IP 스푸핑으로 보이는 것들도 있다. X-Forwarded-For 헤더의 여러 IP 중에서 어떤 걸 진짜 사용자의 IP라고 보면 될까? 해결책: 우리는 express 서버 앞 단에 AWS ELB(엘라스틱 로드밸런서)와 nginx를 뒀다. Client -> E..
발생일: 2017.01.03 키워드: crontab, 크론탭, 크론, cron, 스케쥴, 첫 평일, first weekday, 젠킨스, jenkins 문제: 해당 달의 첫 평일(비즈니스 데이)에 태스크를 실행하는 젠킨스 크론 스케쥴을 정의하려고 한다. 해결책: 음... 설명하기 좀 복잡하다. 여튼, 아래처럼 하면 된다.ㅎㅎㅎ H 10 1-3 * 1 H 10 1 * 2 H 10 1 * 3 H 10 1 * 4 H 10 1 * 5 참고: http://www.switchplane.com/blog/how-to-run-a-cron-job-on-the-first-weekday-of-the-month/
발생일: 2017.01.18 키워드: matchbox recommendation, out of memory 문제: MS Azure의 Matchbox Recommendation 알고리즘으로 추천 모델을 만들어봤다. 특정 피처 컬럼의 타입을 String으로 설정하고 학습시켰는데, Out of memory 란다. 얼라. 데이터가 그리 크지 않은 것 같은데, 왜 그런 걸까? 해결책: Matchbox Recommendation은 Collaborator Filtering에 기반하고 있다. 모델을 만들 때, 각 피처의 로우 * 피처의 고유값 개수만큼의 배열을 생성해 계산한다. 문제가 발생했던 컬럼은 카테고리로 구분하기 적합하지 않은 데이터였는데, 타입을 String으로 설정한 것이 잘못이었다. 이런 데이터라면, 선형..
발생일: 2017.02.06 키워드: mysql, fulltext search, fulltext 검색, 하이픈, 대시, hypen, dash, - 문제: MySQL의 BINARY MODE 의 Fulltext search에서 하이픈(hypen, 또는 대시, -) 캐릭터를 검색 대상에 포함하고 싶다. 어떻게 하면 될까? 해결책: 기본적으로 MySQL의 fulltext search는 letter, digits, ', _ 로 구성된 것을 단어로 본다. -는 word break 역할을 해서, mysql에서는 -로 구분된 단어를 검색하는 것과 동일하게 동작한다. 따옴표로 묶어도 동일하다 "12-34" "12 34" "12+34" "12~34" 모두 같은 결과를 리턴한다. 한 자리 검색어가 따옴표로 묶이는 경우, 검..
발생일: 2016.11.11 키워드: surrogate key, natural key 문제: 각 컬럼의 값이 유니크하다면, 전체 컬럼을 프라이머리로 만들어도 되지 않을까? 해결책: 각 컬럼이 유니크하더라도 각 행을 대표할 수 있는 키를 별도로 넣는 게 좋다는 조언이다. 데이터베이스의 모델 관리와 비즈니스 문제를 분리하기 위한 목적이라고 한다. 이렇게 비즈니스와 관계 없이 테이블의 row를 대표하는 키를 서로게이트 키라고 한단다. 반대로 비즈니스 개념을 대표하던 것은 내추럴 키이고. http://dba.stackexchange.com/questions/760/is-there-any-benefit-of-a-primary-key-that-comprises-all-columns-of-the-table
발생일: 2016.11.11 키워드: phantomjs, jsdom, cheerio 문제: DOM 파싱을 위한 몇 가지 유명한 노드 모듈이 있다. phantomjs, jsdom, cheerio 이고, 우리 프로젝트에서도 골고루 사용하고 있다. 어떻게 구분해 사용하면 좋을까? 해결책: 이렇게 접근하면 되겠다.ㅎㅎ 1. DOM 파싱이 필요하다면 cheerio, 2. 여기에 더해 헤드리스 브라우저가 필요하다면 jsdom 3. 여기에 더해 렌더링이 필요하다면 phantomjs
발생일: 2016.10.19 키워드: nginx log rotation, logrotate, logrotated, 로그 로테이트, log rotate, midsize, maxsize, size 문제: nginx 로그를 특정 주기로 저장해서 AWS의 S3에 저장하고 싶다. 어떻게 접근하면 될까? 해결책: 로그를 주기적으로 분리 저장하는 목적의 모듈이 있다. log rotate 모듈이고, 대부분의 유닉스 시스템엔 이미 설치되어 있다. 검색해보니, 워낙 잘 작성한 포스트가 많아 링크로 대체한다. How To Configure Logging and Log Rotation in Nginx on an Ubuntu VPS - https://www.digitalocean.com/community/tutorials/ho..
발생일: 2016.11.10 키워드: 날짜 처리, date feature, 날짜 속성, 날짜 피처 문제: 학습 데이터를 준비할 때 날짜 부분은 어떻게 표현하는 게 좋을까? 선형적인 데이터로 만들려면 숫자로 바꿔야 할 것 같다. 예를 들면, 2016년 1월 데이터는, 2016-01 표시하는 게 좋을까, 아니면 201601, 아니면 타임스탬프로 출력하는 게 나을까? 해결책: 날짜를 계산 가능한 숫자로 바꾸는 게 중요한 게 아니라, 내가 데이터를 어떻게 생각하고 바라보고 있느냐가 중요하다. 그 기준에 따라 그 값이 타임스탬프일 수도 있고, 의미있는 기준값으로부터의 차일 수도 있다. 단순히 절대적인 값보다는 데이터가 의미하는 잘 이해하는 것부터 시작하는 것이 중요하다. 참고: http://stats.stacke..
발생일: 2016.10.27 키워드: AWS, s3, 와일드카드, wildcard 문제: S3 버킷에 있는 특정 날짜의 nginx access 로그를 모두 다운로드 하려고 한다. aws CLI 모듈을 사용하려는데, 와일드카드가 기대처럼 동작하지 않는다. 해결책: --recursive --exclude "*" --include "*pattern*" 으로 사용한다. 문제에서처럼, 특정 날짜의 nginx 로그를 다운로드 하려면 아래처럼 하면 된다. $ aws s3 cp s3://[BUCKET NAME]/nginx/ . --recursive --exclude "*" --include "access*2016-10-23*" 논의: --exclude 를 먼저 하고, --include를 해야 한다. 반대로 하면 안되더..