Programming Language
-
Node.js에서 스케줄러 Graceful Shutdown 시키기Programming Language/JavaScript 2020. 10. 3. 15:24
Node.js에는 대표적인 스케줄러 모듈로 node-schedule과 node-cron이 있다. 단순히 스타 수와 사용자가 많다는 이유로 node-schedule을 사용하고 있었는데 node-schedule을 사용하면서 문제가 생겼다. 스케줄러 특성상 실시간 HTTP API에서 서비스 DBMS와 트랜잭션이 힘든 기능들을 실행하는 경우가 자주 있는데(외부 서비스 연동 등) 시스템에서 인터럽트를 발생시키면 동작 중인 코드가 다 실행되는 것을 기다리는 것이 아닌 그냥 종료시키는 것이었다. node-schedule 코드를 잠깐 확인해 보니 이런 상황을 방지하기 위해선 모듈 외부가 아닌 내부에서 처리를 하던가, API를 추가해야 하는 듯 했다. 그래서 이런 기능을 추가하여 컨트리뷰션 해도 되는지 이슈를 남겼는데 ..
-
파이썬의 메모리 관리Programming Language/Python 2019. 12. 6. 18:14
참고 - https://github.com/python/cpython - https://devguide.python.org/compiler/ 파이썬은 메모리 관리를 쉽게 하기 위해 PyArena와 Arena라는 것을 사용한다. 이 둘의 차이는 PyArena는 파이썬 코드를 AST로 컴파일한 객체의 메모리 관리를 위해 사용되는 것이고,(.py 파일을 실행할 때 사용됨) Arena는 실제로 우리가 생각하는 객체의 메모리 관리에 사용한다. 그렇다고 둘이 아예 분리해서 생각하면 안 된다. PyArena에서 사용되는 객체(변수, 상수 등 a_objects에 저장)는 Arena에서 관리되기 때문이다. PyArena는 pyarena.h/pyarena.c에 상당히 깔끔한 코드로 구현되어 있고, Arena는 비교적 지저..
-
[Python] arsenic을 이용한 웹 크롤링Programming Language/Python 2018. 9. 6. 02:45
브라우저 제어로 크롤링을 한다면 보통 Selenium을 사용합니다.하지만 Python Selenium은 Sync Syntax로 동작합니다. 병렬로 크롤링을 하려면 프로세스를 여러 개 실행시키거나, 스레드를 생성해야 하는 번거로움이 있습니다. arsenic은 async/await syntax 를 지원하므로 기존 async function을 호출하는 방식과 동일하게 Async programming을 할 수 있습니다.속도에는 영향이 크게 없지만 AsyncIO Project에서 같은 syntax를 사용하여 Selenium과 동일한 방식으로 크롤링 가능하다는 이점이 있습니다. arsenic은 Python 3.6 이상부터 사용가능합니다.3.6 미만 버전에서 설치하고 실행하면 3.6 버전에서 추가된 문법으로 인해 S..
-
인라인 함수Programming Language/C++ 2017. 8. 8. 22:19
(2014년에 네이버 블로그에서 작성했던 글을 티스토리로 옮기며 이관했습니다) 인라인 함수는 속도 감량에 매우 큰 도움이 됩니다. 인라인 함수는 보통 함수를 호출할 경우 눈에 보이는 것처럼 그 함수에 가서 코드를 실행하는 것이 아니라 해당 코드에서 바로 함수 내부의 코드를 실행시키기 때문에 매개변수를 복사하거나, 다음 코드로 가게 하는 흐름을 생략해 주기 때문이죠. 그럼 "모든 함수를 인라인 함수로 선언해 주면 되겠다." 라는 생각이 분명히 들게 됩니다. 하지만 그럴 수는 없습니다. 프로그래머가 인라인 함수를 선언했다고 해도 그 함수가 인라인 함수가 되느냐 안 되느냐는 컴파일러가 결정하기 때문이죠. 인라인 함수가 안 되는 경우는 다음과 같습니다 1. 재귀함수 2. 다른 코드에서 함수의 주소를 가져와서 호..
-
[Win32 API] 윈도우 모니터 중간으로 위치 이동하기Programming Language/C++ 2017. 8. 8. 22:15
(2014년에 네이버 블로그에서 작성했던 글을 티스토리로 옮기며 이관했습니다) 폼 위치는 WNDCLASS 구조체나, CreateWindow 파라미터로 지정할 수 없기 때문에 WM_CREATE 메시지지로, SetWindowPos 또는 MoveWindow API로 변경합니다. 보통 폼 위치만 바꾸는 기능은 MoveWindow이기 때문에 SetWindowPos 보다는 MoveWindow를 많이 사용합니다. BOOL MoveWindow(HWND hWnd, int X, int Y, int nWidth, int nHeight, BOOL bRepaint); hWnd - 크기를 변경할 윈도우의 핸들 X - left Y - top nWidth - right nHeight - bottom bRepaint - 1 또는 0(..
-
[Win32 API] 다이얼로그 아이콘 변경Programming Language/C++ 2017. 8. 8. 22:12
(2014년에 네이버 블로그에서 작성했던 글을 티스토리로 옮기며 이관했습니다) CreateWindow API를 사용해서 폼을 생성하는 경우 WNDCLASS 구조체의 icon 멤버에 LoadIcon API를 사용하여 아이콘을 변경해 주면 되지만 다이얼로그는 조금 다릅니다. HICON 변수에 LoadImage API로 아이콘 이미지를 넣고, WM_INITDIALOG 메시지가 호출될 시 SendMessage API로 WM_SETICON 메시지를 호출시켜야 합니다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 #include "resource.h" #include HICON hIcon; BOOL ..
-
OS X에서 pyenv / virtualenv / virtualenvwrapper 설치 및 사용하기Programming Language/Python 2017. 8. 5. 21:21
homebrew가 설치된 환경에서 포스팅합니다. pyenv: 다양한 파이썬 버전을 설치할 수 있는 독립적인 환경을 제공합니다.virtualenv: 패키지를 독립적인 환경에서 각각 설치할 수 있도록 합니다.virtualenvwrapper: 가상환경이 설치된 경로를 기억해야 한다는 virtualenv의 단점을 보완 1. 먼저 pip를 설치합니다. 1sudo easy_install pipcs 2. brew로 pyenv를 설치하고, pip로 virtualenv, virtualenvwrapper를 설치합니다. 1234567891011# pyenv 설치brew updatebrew install pyenv # virtualenv 설치pip install virtualenv # virtualenvwrapper 설치pi..
-
LRESULT / CALLBACK / WPARAM / LPARAMProgramming Language/C++ 2017. 7. 9. 04:09
(2014년에 네이버 블로그에서 작성했던 글을 티스토리로 옮기며 이관했습니다) Win32 API 경험자라면 LRESULT CALLBACK Func(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); 형태의 콜백 함수를 많이 보셨을 겁니다. 의미를 알기 쉬웠던 HWND(핸들), UINT(unsigned int)를 제외한 키워드들이 어떤 의미를 함축하고 있는지 알아보겠습니다. 1. LRESULT LRESULT은 이렇게 선언돼 있습니다. 1 2 #typedef long LONG_PTR #typedef LONG_PTR LRESULT cs long 과 같습니다. 왜 typedef로 재정의가 되었냐면 개발 시 리턴값임을 명시해 주기 위해서입니다. 2. CALLBACK..