-
안드로이드 (Deprecated) AsyncTask 대체하기Android 2020. 3. 5. 20:06
안드로이드에서 백그라운드 작업을 하기 위해 자주 사용하는 AsyncTask가 사망선고를 받았다. 작년 하반기에 올라온 이 커밋에서 AsyncTask에 @Deprecated가 붙었고, 커멘트에 다음과 같이 나와 있다. AsyncTask was intended to enable proper and easy use of the UI thread. However, the most common use case was for integrating into UI, and that would cause Context leaks, missed callbacks, or crashes on configuration changes. It also has inconsistent behavior on different versi..
-
[Mac OS] gcc 빌드시 Security Framework 링크C and C++ 2020. 3. 4. 00:02
Mac OS에서 gcc(정확히는 g++)을 이용한 빌드 중에 Undefined Symbol이 발견되었다. Undefined symbols for architecture x86_64: "_SSLClose", referenced from: ... 같은 커밋으로 리눅스에서는 멀쩡히 돌아가던 빌드였다. 간단히 원인을 찾을 수 있으리라 생각했지만, 검색해도 _SSLClose가 무슨 심볼인지도 몰라 간단하지가 않았다. 마음을 진정시키고 nm으로 OpenSSL 심볼들을 하나하나 조사까지 했는데 거기서도 나오지 않았다. 알고보니, 구글을 뒤지다 처음엔 무심코 지나간 여기에 해답이 있었다. If anyone is getting linker errors about missing "_SSLClose" and similarl..
-
[Mac OS] MongoDB 설치하기Knowledge 2020. 3. 3. 23:14
Mac OS에서 몽고 DB Server를 설치하는 방법을 정리해 본다. X-Code command-line tools 설치 커맨드라인에 필요한 도구들의 모음으로 X-Code에서 제공되지만, X-Code와 별도로 설치할 수 있다. 대부분의 환경에서 이미 설치가 되어 있을 것으로 보이지만, 혹시 없다면 터미널 앱에서 다음과 같이 설치한다. MyMAC:home Me$ xcode-select --install Homebrew 설치 Homebrew는 패키지 관리자로 애플이나 다른 리눅스 운영체제에서 제공하지 않는 패키지들을 관리해 준다. 우분투(데비안)의 apt-get과 비슷한 역할이라고 볼 수 있다. MongoDB외에도 다른 패키지들을 관리하기 좋은 툴이므로 설치해서 손해볼 것은 없다. 터미널 앱을 실행시킨 후..
-
libmongoc 소스 코드 빌드C and C++ 2020. 2. 20. 20:57
프로젝트에서 MongoDB를 사용해 보기로 했다. 아무래도 근래 제일 점유율이 높은 대세이기도 하고, 무엇보다 C로 되어있는 점이 가장 마음에 들었다. MongoDB 사용을 위해서는 먼저 MonngoDB 서버가 어딘가에 설치되어야 하고, 여기에 접근하기 위한 플랫폼별 클라이언트 Driver를 통해 서버에 접속하게 된다. 헷갈리는 용어 덕분에 처음엔 Native 단의 Device Driver를 제공하는 것으로 착각했다. 알고보니 그냥 플랫폼별로 빌드된 라이브러리였다. 다음 페이지에서 플랫폼별 드라이버를 확인할 수 있다. https://docs.mongodb.com/ecosystem/drivers/ 서버 설치 먼저 MongoDB의 서버는 플랫폼 별로 설치 가이드가 잘 나와 있었다. 우분투의 경우 다음 페이지..
-
C/C++ localtime 함수로 현재 시간 출력하기C and C++ 2019. 12. 8. 23:40
윈도우에서는 서비스나 독립된 exe 형태로 구동되고, 리눅스에서는 데몬으로 구동되는 UI가 없는 형태의 네이티브 모듈을 만들고 있었다. 그런데 모듈에 필요한 기능 중 현재의 시간을 구해 계산할 필요가 있는 부분이 나타났다. OS 플랫폼마다 시간을 구하는 방법은 다양하지만, 되도록 양쪽 플랫폼에서 모두 사용 가능한 하나의 코드베이스를 유지하는 기조를 가지고 있었다. 그리고 마이크로 세컨드 단위의 정확한 시간이 필요한 것은 아니어서, 웬만하면 오픈소스 라이브러리를 가져다 쓰지 않고 해결하고 싶기도 했다. 이 조건을 만족하는 함수가 다행히 C의 기본 라이브러리에 있었는데 localtime함수가 그것이다. 리눅스 링크는 여기에서 찾을 수 있으며, 윈도우 링크는 여기에서 찾을 수 있다. 사용 방법은 아주 간단한데..
-
[Nodejs] express-rate-limit으로 DoS 예방하기Knowledge 2019. 11. 20. 11:15
Nodejs의 express 모듈은 간편한 방식으로 Web API를 구성할 수 있게 해준다. 나름 안정성도 꽤 뛰어나 기본적으로 많이 쓰이는 모듈일 것이다. 그런데, Nodejs에 익숙하지 않아 일반적인 튜토리얼을 참고해 서버를 만들어 구동했더니, 예상치 않은 문제가 나타났다. 운영중인 서버에 단순 DoS (Denial of Service) 공격이 발생했는데, 서버 인스턴스의 모든 리소스가 순식간에 Max를 치고 서버가 무응답 상태로 전환되었다. 인스턴스가 살아는 있으나 간단한 SSH 접속 조차 불가능한 상태라 어쩔 수 없이 인스턴스 재부팅을 했다. 로그를 살펴보니 인커밍 패킷이 엄청 들어오고, CPU 점유가 맥스를 치고, 아웃고잉 패킷이 엄청 늘어났다. 대단한 서버도 아닌데, 왜 공격한지는 모르겠지만...
-
[우분투] libcurl 빌드 에러 수정 (--with-ssl, --with-zlib)C and C++ 2019. 11. 18. 13:59
프로젝트에서 libcurl을 static library 형태로 포함해 사용하고 있다. 이전에는 프로젝트를 우분투 14.04 그리고 osx에서 빌드하고 테스트를 했었는데, 이번에 우분투 18.04에서 프로젝트를 빌드하니 다음과 같은 링킹 에러가 나타났다. ... md5.o:md5.c:(.rdata+0x0): undefined reference to `MD5_Init' md5.o:md5.c:(.rdata+0x4): undefined reference to `MD5_Update' md5.o:md5.c:(.rdata+0x8): undefined reference to `MD5_Final' md5.o:md5.c:(.rdata+0x14): undefined reference to `MD5_Init' md5.o:md..
-
리눅스 gcc 빌드시 Undefined reference to dlopen 에러C and C++ 2019. 11. 18. 13:37
static Library를 포함하는 타겟 바이너리를 빌드하는 중에 황당한 에러를 만났다. ~/xxxlib.so: Undefined reference to 'dlsym' ~/xxxlib.so: undefined reference to `dlsym' ~/xxxlib.so: undefined reference to `dlerror' ~/xxxlib.so: undefined reference to `dlopen' ~/xxxlib.so: undefined reference to `dlclose' 링크에 실패한 dlxxx 함수는 다이나믹 라이브러리를 런타임에 사용하기 위한 함수이다. (참조) 기억을 더음으며 소스코드를 살펴보니 빌드시 포함시킨 static library 중 하나에 dl계열 함수가 들어있었다. gc..