자바 스레드 Thread 문제점 3가지, 사이클, 자원 낭비, 안전성 문제 작업마다 자바 스레드를 생성하는 정책은 상용 서비스에서 사용하기에는 무리가 있다. 왜냐하면, 특정 상황에서 엄청나게 많은 대량의 자바 스레드가 생성될 수도 있는데, 이럴 때는 아래와 같은 단점이 발생한다. Java Thread 라이브 사이클 문제 자바 스레드를 생성하고 제거하는 작업에도 자원이 소모된다. Java Thread를 생성하고 제거하는 데 실제로 얼마만큼의 자원을 소모하는지는 운영체제에 따라 다르지만, 어쨌거나 자바 스레드를 생성하는 과정에는 일정량의 시간이 필요하다. 따라서 클라이언트의 요청을 처리할 때 기본적인 딜레이가 생기고, 그동안 JVM과 운영체제는 몇 가지 기초적인 작업을 진행한다. 만약 클라이언트의 요청 내용..
[형변환 Qt] QByteArray to Unsigned Char 형변환 형변환은 어떤 언어를 다루건 필연적으로 개발자 앞에 나타난다. 어떤 언어든 (형변환이 일어나는) 퍼포먼스 향상을 위해 기본 라이브러리 보다 고정된 크기의 배열을 사용해야 하는 경우가 있다. Qt도 예외는 아닌지라 컨테이너 중 하나인 QByteArray를 char 배열로 형변환해야 할 상황이 존재한다. QByteArray는 QSerialPort()나 QTcpSocket()을 이용해 패킷을 읽어 들인 후 반환하는 기본 자료형이다. 두 라이브러리 모두 connect()에서 readyRead() 시그널을 통해 패킷을 읽어 들인 후 형변환한다. QByteArray를 unsigned char로 형변환하는 코드는 이런 통신 환경에서 유용하게 사..
자바 가상 머신(JVM), 강제종료 원인, 종료 훅 문제 자바 가상 머신 JVM이 종료되는 두 가지 경우를 생각할 수 있는데, 하나는 예정된 절차대로 종료되는 경우이고, 또 하나는 예기치 못하게 임의로 종료되는 경우이다. 절차에 맞춰 종료되는 경우에는 '일반'(데몬이 아닌) 스레드가 모두 종료되는 시점, 또는 어디에선가 System.exit 메소드를 호출하거나 기타 여러 가지 상황(예를 들면 SIGINT 시그널을 받거나 CTRL+C 키를 입력한 경우)에 자바 가상 머신 JVM 종료 절차가 시작된다. 이런 방법이 자바 가상 머신 JVM을 종료하는 가장 적절한 방법이며, 그 외에 Runtime.halt 메소드를 호출하거나 운영체제 수준에서 JVM 프로세스를 강제로 종료하는 방법(예를 들어 SIGKILL 시그..
[윈도우API] WinCE DIB 섹션 프로그래밍 (tagRGBQUAD) 앞서 설명한 것(▶DIB 섹션 포스팅 1)처럼 이미지가 픽셀당 8비트 이하인 경우 BITMAPINFOHEADER 구조체 다음에는 RGBQUAD 구조체의 배열이 이어진다. RGBQUAD 구조체는 다음과 같다. 123456typedef struct tagRGBQUAD { /* rgbq */ BYTE rgbBlue; BYTE rgbGreen; BYTE rgbRed; BYTE rgbReserved;} RGBQUAD;cs 이 구조체는 256단계의 적, 녹, 청 색상을 표현한다. 물론 이 구조체의 색상들은 디스플레이 장치의 사양에 따라서 표현되지 않을 수도 있다. RGBQUAD 구조체 배열은 DIB 팔레트를 기술한다. 팔레트란 비트맵에 사용된..
[윈도우API] DIB 섹션 프로그래밍 (WinCE 기준) 윈도우API CE에서 비트맵 파일을 읽는 작업은 쉽다. 파일을 읽어서 비트맵 정보를 얻어내는 작업 외에도 화면에 있는 비트맵을 읽어서 조작하고, 조작한 비트맵을 화면에 다시 그리는 작업이 필요할 때도 있다. 이런 작업도 DDB보다 윈도우API DIB가 쉽게 처리할 수 있다. DDB에서도 장치 의존적인 비트를 얻어낼 수 있지만 버퍼의 포맷이 장치 의존적이므로 복잡하다. DIB를 사용하면 DIB 섹션을 사용해서 디스플레이 장치의 포맷에 상관없이 이미 정의되어 있는 포맷의 비트맵으로 읽을 수 있으므로 편리하게 프로그램을 작성할 수 있다. 윈도우 운영체제의 발전과 함께 다양한 윈도우API DIB 생성 함수를 지원하게 됐지만 윈도우 CE는 가장 유용한 다..
C++ 상속, 다이아몬드 문제란? 그리고 피하는 방법 위 그림은 C++ 상속, 다이아몬드 문제를 이해하는 데 도움이 됩니다. 클래스 A에서 파생되는 클래스 B와 C가 있다고 가정합니다. 그리고 C++ 상속(다이아몬드를 유발하는 다중 상속)으로 클래스 B와 C의 파생 클래스 D도 생성합니다. (상상만으로도 한숨 나오는 C++ 상속 구조입니다) 여기서 C++ 상속, 다이아몬드 문제의 발생 이유가 나타납니다. 위 그림을 토대로 구체적인 코드를 작성해 보겠습니다. 123456789101112131415--Animal 클래스는 윗 그림의 클래스 D와 같습니다.-- class Animal { -- ... -- }; // base class{ int weight; public: int getWeight() { ret..
Jetson TK1, FTDI USB Serial 컨버터 디바이스 드라이버 모듈 설치 엔비디아의 Jetson TK1용 커널에는 FTDI USB to Serial의 Device Driver가 포함되어 있지 않습니다. 이를 해결 하기 위해선 Jetson TK1 Kernel 소스에서 FTDI USB Serial Converter의 모듈을 추출하고 부팅시 해당 모듈을 로드하여 사용토록 설정해야 합니다. 다운로드 : ftdi_sio.zip lsusb명령으로 시리얼 컨버터를 인식하는지를 먼저 확인합니다. 123$ lsusbBus 002 Device 003: ID 0403:6001 Future Technology Devices Internalional, LTd FT232 USB-Serial (UART) ICColor..
QtCreator 단축키, 주로 사용하는 것 제가 유용하게 사용하던 QtCreator 단축키 소개합니다. 모든 단축키를 항상 외우진 못해 적어놨던 것인데, 이 글을 보고 도움되는 분들이 많았으면 좋겠네요. QtCreator 단축키는 Tools > Options > Environment > Keyboard에서 확인할 수 있으며, 이 메뉴에서 단축키 변경할 수 있습니다. 아래는 제가 모은 QtCreator 주요 단축키입니다. 확인해 보세요. General Keyboard Shortcuts창 닫기 : Ctrl+W모든 창 닫기 : Ctrl+Shift+W 뒤로 이동 : Alt+Left앞으로 이동 : Alt+Right 라인으로 바로 이동 : Ctrl+L 초기화면(Welcome 모드) : Ctrl+1코드 편집 모드 ..
[R프로그래밍 기초 강좌] MySQL 연동하기, RMYSQL R프로그램과 MySQL 연동 순서 1. 컴퓨터에 RMySQL 패키지를 설치.2. dbConnect 함수를 사용해 데이터베이스 연결.3. dbGetQuer로 SELECT를 시작하고 결과 세트 반환.4. dbDisconnect를 사용해 데이터베이스 연결 종료. 여기서 소개하는 R프로그래밍 기초 강좌 레시피는 RMySQL 패키지가 컴퓨터에 설치되어 있어야 한다. 그리고 그 패키지는 다시 MySQL 클라이언트 소프트웨어가 있어야 한다. MySQL 클라이언트 소프트웨어가 아직 설치 및 환경 설정되어 있지 않다면 MySQL 문서를 읽거나 시스템 관리자에게 물어보자. dbConnect 함수는 MySQL 데이터베이스로의 연결을 만든다. 그리고 이후에 쓰이는 ..
Inline함수 문제, C++ 인라인이 실패하면? Inline함수가 인라인화될 수 없을 때 무슨 일이 발생하는가? 이론적으로, 컴파일러가 함수를 Inline함수를 거부할 때 그 함수는 보통의 함수처럼 다루어진다. 컴파일러는 그것을 위한 객체 코드를 생성하며 함수의 invocations는 그것의 메모리 주소로의 점프로 변환된다. 불행하게도 함수를 outline 화하는 것의 결과들은 그것보다 더 복잡해진다. 클래스 선언에서 Inline함수를 정의하는 것은 흔한 일이다. 예를 들면, 123456789101112// filename Time.h#include#include using namespace std; class Time{public: inline void Show() { for (int i = 0; i
라우팅테이블 - ICMP 끊김과 목적지 설정 No route to Destination앞의 예는 모두 라우팅테이블에서 해당하는 것을 찾은 경우이다. 최종적으로는 default route가 선택되기도 하였다. 그렇다면 default route가 없다면 어떻게 될까? 그리고 주어진 목적지에 해당하는 것이 없는 경우에는 어떻게 될까? 해답은 route 될 IP datagram이 호스트에서 생성되었는가 아니면 forward 되어된 것인가에 달렸다. 만일 datagram이 host에서 생성되었다면 datagram을 보낸 application으로 "host unreachable" 또는 "network unreachable"이라는 에러가 리턴된다. 만일 datagram이 forward 된 것이라면, ICMP host..
라우팅테이블, IP라우팅 초기화 및 설정 Initializing a Routing Table 라우팅테이블 entry가 어떻게 생성되는지는 아직 언급하지 않았다. interface가 초기화될 때마다(일반적으로 interface의 어드레스는 ifconfig 커맨드에 의해 세트 된다) direct route는 그 인터페이스에 대해 자동으로 생성된다. PPP link와 루프백 인터페이스에 대해서, route는 host(H flag가 세트 되어 있는)가 될 것이다. 이더넷과 같은 브로드캐스트 인터페이스에 대해서, route는 네트워크가 될 것이다. 직접 연결되지 않은 호스트나 네트워크에 대한 route는 어떤 형태로든 라우팅 테이블에 들어가야 한다. 일반적인 방법으로는 bootstrap time에 초기화 파일로부..