발생일: 2019.05.31 키워드: Array.sort, sort, 정렬 문제: 아래와 같이 sort() 함수로 정렬했는데, [1, 5, 10, 20].sort(); 결과가 아래와 같이 기대했던 것처럼 나오지 않는다. [1, 10, 20, 5] 으잉? 해결책: 나만 몰랐나... Array.sort() 의 기본 정렬 기준은 문자열의 유니코드 포인트였다. 숫자로 정렬하려면 아래와 같이 compareFunction 을 넘겨주면 된다. [1, 5, 10, 20].sort((a, b) => a - b); 기존에 비슷한 코드도 확인해봐야겠다... 논의: 우린 유틸리티 모듈로 언더스코어(underscore.js)를 쓰고 있는데, 언더스코어의 _.sortBy 는 의도대로 숫자로 정렬된다. 코드를 확인해보니, 기본 c..
발생일: 2019.04.22 키워드: mysql, view, 뷰 문제: 기존 변수를 모두 변경하면서 관련된 테이블의 이름도 함께 변경하려고 한다. 테이블 앨리어스가 있다면 가장 쉽게 운영 중인 서비스에도 문제 없이 적용할 수 있을 것 같다. 가만, view 가 업데이트도 가능했던가? 해결책: 단일 테이블로 생성한 뷰는 업데이트나 인서트도 가능하다. - view 조건에 해당되지 않는 경우에도 업데이트나 인서트가 가능하다. CREATE VIEW emp_view AS SELECT * FROM emp WHERE age > 10 INSERT INTO emp_view (iage) VALUES (5); - 뷰 생성 시 컬럼 앨리어스를 사용한 경우에도 인서트나 업데이트 된다. CREATE VIEW emp_view AS..
발생일: 2019.05.13 키워드: 인증서, https, ssl, letsencrypt, cordova, phonegap, 코르도바, 폰갭, certbot, 자가 서명 인증서, self-signed certificate 문제: 로컬 환경에서 https 를 구성하기 위해 자가 서명 인증서를 만들어 적용했다. (자가 서명 인증서는 https://ohgyun.com/429 참고) 브라우저에서는 잘 테스트했는데, 시뮬레이터에서는 동작하지 않는다. 왜 그럴까? 해결책: 우리 서비스는 코르도바 기반의 하이브리드 앱으로 구현되어 있다. 코르도바 보안 가이드에 따르면, 자체 서명된 인증서는 보안에 취약하기 때문에 기본적으로는 허용하지 않는다고 한다. 디버깅 옵션을 주면 된다고 하는데, 실제 환경과 비슷하게 테스트할 ..
발생일: 2019.04.05 키워드: psycopg2, pg_config 문제: 얼마 전, 파이썬 배치 작업들이 모두 실패했다. 오류 문구는 아래와 같다. Collecting psycopg2 Using cached https://files.pythonhosted.org/packages/c7/ca/75236b17f1b951950ffc55d657c5aa408d3d0327a1b6c4c0f7cb16ef7e7b/psycopg2-2.8.tar.gz Complete output from command python setup.py egg_info: running egg_info creating pip-egg-info/psycopg2.egg-info writing pip-egg-info/psycopg2.egg-info/..
발생일: 2017.12.06 키워드: nginx, default_server, 기본 server 문제: 엥?? 도메인이 다른 전혀 관련 없는 웹페이지가 우리 서비스를 프록시로 걸어 제공하고 있었다. 어처구니가 없는 행동이지만, 그 전에 왜 nginx는 도메인이 다른 접근에 응답하고 있었던 걸까? nginx 설정의 서버 블럭에는 아래와 같이 server_name 이 명시되어 있었다. server { server_name ohgyun.com; ... } 해결책: nginx의 "첫 번째" 서버 블럭은 server_name 이 매칭되지 않았을 때 동작하는 기본 서버 블럭이다. 서버 블럭을 하나만 정의했었기 때문에, 도메인이 매칭되지 않았을 때에도 동일하게 첫 번째 블럭이 실행된 것이 문제였다. 아래와 같이 기본..
발생일: 2017.07.31 키워드: nginx, 용량, 로그 용량, copytruncate, logrotate, 로그 로테이트 문제: 서버 용량이 가득 차서 리스타트에 실패하는 문제가 발생했다. nginx 로그 때문으로 추측되는데, 실제로 로그 디렉토리 내의 로그 파일의 용량은 문제가 될 만큼 크지 않다. 뭐가 문제일까? 해결책: nginx 로그는 로테이트해 S3로 업로드한 후에 삭제한다. 확인해보니, 원인은 로그가 제대로 로테이트되지 않고 프로세스가 삭제된 기존 파일을 계속 물고 있었기 때문이다. 로그 로테이트 옵션에 copytruncate 을 추가하는 것으로 해결했다. 아래는 작업과 관련된 스크립트: # 현재 머신의 용량을 확인해본다 df -h # 어떤 디렉토리에서 가장 많이 차지하는지 확인한다 s..
발생일: 2019.03.02 키워드: Google Apps Script, 구글 앱스 스크립트, clasp 문제: 구글 앱스 스크립트를 로컬에서 개발하고 싶다. 기존엔 파일이 크지 않아 온라인에서 수정하거나, 수정 사항이 좀 있을 땐 에디터에 복사해서 수정하고 붙여넣곤 했다. 규모가 조금 커지다보니 더 이상 귀찮아서 못하겠다. 뭔가 도구가 있을 테다. 해결책: 유후. 로컬에서 개발하고 배포할 수 있는 clasp 라는 도구가 있다. 진작에 찾아볼 걸. https://github.com/google/clasp npm 으로 바로 설치할 수 있다. $ sudo npm i @google/clasp -g 구글 계정에서 Apps API 권한을 허용해준 다음, https://script.google.com/home/us..
발생일: 2019.03.01 키워드: node, npm 문제: code EBADKEY invalid config key requested: config npm install 할 때, 위 문구가 나오면서 설치되지 않는다. 해결책: 검색해서 몇 가지 방법을 시도해봤는데, 잘 되지 않았다. 노드 관련 파일을 모두 제거 후에 다시 설치했다. - 루트 node_modules 제거 npm 루트 경로는 아래 명령으로 찾으면 된다 $ npm root -g # npm - node 제거 노드 파일은 아래 명령으로 찾으면 된다 $ type node - n 으로 노드 신규 설치 $ curl -L https://git.io/n-install | bash 오랜만에 깨끗해졌다~ ㅎㅎ
발생일: 2018.10.22 키워드: JSON.stringify, RangeError, Invalid string length, max-old-space-size, 메모리 부족, RangeError 문제: 배치 작업 과정 중에 아래와 같은 오류가 발생하면서 프로세스가 종료됐다. RangeError: Invalid string length at JSON.stringify () 메모리 이슈인 것 같아 노드의 max-old-space-size 파라미터로 힙 사이즈를 필요한 만큼 지정해 실행했는데도 동일하게 발생한다. 왜 그런 걸까? 해결책: 확인해보니, V8은 구조적 문제로 객체의 크기를 1.9기가로 제한하고 있다고 한다. 사이즈가 큰 객체를 stringify 하는 과정에서 문자열의 크기가 지나치게 커진 것이..
발생일: 2017.08.18 키워드: re, 정규식, lookbehind, 그룹, group, regular expression, regex, split 문제: 문자열을 정규식으로 split 할 때, 정규식 구문에 그룹이 포함되어 있었더니 원하는 결과가 나오지 않는다. 왜 그런 걸까? 해결책: split()으로 전달하는 패턴에 그룹이 있으면, 분할한 결과 뒤에 그룹 매칭값이 붙는다. 아래 예제를 보면 쉽게 이해할 수 있다. re.split('-', 'aaa-bbb') -> ['aaa', 'bbb'] re.split('(-)', 'aaa-bbb') # 그룹으로 묶음 -> ['aaa', '-', 'bbb'] # split 결과에 그룹이 포함된다 re.split('(-)', 'aaa-bbb-ccc') # 여러..