본문 바로가기

Programming Language

Objective-C에서 SQLite 사용 예제 Objective-C에서 SQLite 사용 예제 1-1. 헤더 추가하기 Objective-C에서 SQLite를 사용하려면, 다음과 같이 헤더 파일을 추가한다. Xcode 프로젝트를 새로 생성한 후, 아무 라이브러리도 추가하지 않은 상태이다. #import 1-2. SQLite의 객체 SQLite의 사용을 지원하는 객체에는, 데이터베이스 연결 정보를 가지고 있는 sqlite3와, SQL 구문을 데이터베이스로 전송하기 전 컴파일을 하는 sqlite3_stmt 객체가 있다. 각 형식을 갖는 두 객체를 선언한다. // ... sqlite3 * database; // 데이터베이스 연결정보 sqlite3_stmt * databaseStatement; // 쿼리 구문 컴파일러 //... 1-3. SQLite 데이터베.. 더보기
자바 프로그램에서 각종 내부 설정 관리 방법 자바 프로그램에서 각종 내부 설정 관리 방법 Java 프로그램(Android Application 포함)에서 실행 도중 자체적인 설정 사항들을 관리하고자 할 때 사용할 수 있는 클래스로는 java.util.Properties가 있습니다. 이 클래스를 통해 텍스트 파일 형태로 응용 프로그램에서 내부적으로 사용하기 위한 각종 설정 값들을 저장하고 불러올 수 있습니다. Properties 클래스를 통해 설정 값 저장하기 Properties 클래스를 통하여 설정 값을 저장하기 위해서는 setProperty메서드를 사용합니다. Object java.util.Properties.setProperty(String key, String value); key설정 값에 부여될 이름입니다. value저장할 값입니다. 만일 .. 더보기
C#에서 Microsoft Excel 파일 다루는 방법 C#에서 Microsoft Excel 파일 다루는 방법 본 포스팅에서는 Component Object Model(이하 COM) 객체를 로드하여 C# 프로그램에서 Microsoft Excel 형식의 데이터를 읽거나 기록하는 방법에 대해 설명합니다. 1단계. C# 프로그램에서 Microsoft Excel COM 객체 참조시키기 [참조] - [참조 추가(R)...]를 클릭합니다. "참조 관리자" 화면이 뜨면 [어셈블리] - [확장] 메뉴를 클릭합니다. 그 다음, "Microsoft.Office.Interop.Excel" 모듈을 체크한 뒤 [확인] 버튼을 눌러 해당 모듈을 C# 프로그램에 참조시킵니다. 2단계. Microsoft Excel Application 로드하기 Excel 파일을 입/출력할 메서드에는 다.. 더보기
이미지 파일 일괄 변환 PowerShell에서 이미지 파일을 일괄 변환하는 방법은 다음과 같다. # System.Drawing.dll을 로드하기 [Reflection.Assembly]::LoadWithPartialName("System.Drawing"); # 폴더 내 모든 파일 목록 얻기 $list = Get-ChildItem; foreach ($item in $list) { # 선택된 1개 파일에 대해 System.Drawing.Bitmap 객체 만들기 $image = New-Object System.Drawing.Bitmap($item.FullName); # 다른 형식으로 저장 # 두 번째 매개변수는 "BMP", "EMF", "EXIF", "GIF", "ICON", "JPEG", "PNG", "TIFF", "WMF" 중 하.. 더보기
이름 일괄 변경하기 PowerShell에서 파일의 이름을 일괄 변경하는 방법은 다음과 같다. # 현재 폴더에서 파일 이름들 얻기 $list = Get-ChildItem; foreach ($item in $list) { # Rename-Item 기존이름 새이름 Rename-Item $item.FullName (); $num++; } 더보기
SAFEARRAY의 간단한 사용법 정리 SafeArray 객체 생성 및 파괴 SafeArray를 생성하고 파괴하는 과정을 알아보기 위해 다음 코드를 작성해 본다. 배열을 구성하는 각 원소의 자료형이 부호 없는 8비트 정수(바이트 형)이고 10개로 구성된 배열의 생성법은 다음과 같다. /* Example: SafeArrayCreate, SafeArrayDestroy */ #include #include #include #include int main(int argc, char * argv[]) { HLOCAL hLocal = NULL; LPSAFEARRAYBOUND lpSafeArrayBound = NULL; LPSAFEARRAY lpSafeArray = NULL; hLocal = LocalAlloc(LHND, sizeof(SAFEARRAYBO.. 더보기
[소켓 프로그래밍]UDP 브로드캐스트에 의한 데이터 보내기 및 받기 보내기 측 코드 다운로드 시 참고: Dev-C++로 작성되었음. /* Example: main.c */ #include #include #include #include #include #include #include #define PORT 65429 int main(int argc, char *argv[]) { int temp; char message[] = "Hello, World!"; WSADATA wsaData; SOCKET sock; int fBroadcast = 1; struct sockaddr_in sockaddr1; struct sockaddr_in sockaddr2; WSAStartup(MAKEWORD(2, 2), &wsaData); /* 소켓을 생성한다. socket([IPv4 인터넷 사.. 더보기
Java의 XML 읽기/쓰기 (DOM 버전) XML 파일로부터 읽기 /* DOMRead */ public static org.w3c.dom.Document Load(String path) throws javax.xml.parsers.ParserConfigurationException, org.xml.sax.SAXException, java.io.IOException { java.io.File file = new java.io.File(path); java.io.FileInputStream fileInputStream = new java.io.FileInputStream(file); javax.xml.parsers.DocumentBuilderFactory documentBuilderFactory = javax.xml.parsers.DocumentBu.. 더보기
[GAS/XCode]64비트 어셈블리어에서 메모리 번지 지정 오류 해결 32비트에서는 Hello, World 구문을 아래와 같이 띄울 수 있습니다. /* 32bit version / GNU Assembly */ .data message: .string "Hello, World!\n" .text .global _main .extern _printf _main: # 스택 프레임 만들기 pushl %ebp movl %esp, %ebp # 함수의 본문 # printf(message); pushl $message xorb %al, %al call _printf addl $4, %esp # 스택 프레임 제거 movl %ebp, %esp popl %ebp ret 잠시 xorb %al, %al을 보자면… _printf 함수를 호출하기 전에 AL 레지스터의 값을 설정하는데, System V.. 더보기
소켓 통신 #3 - ICMP 클라이언트 구현하기(3) 소켓 통신 #3 - ICMP 클라이언트 구현하기(3) - by Tapito 2편에서 ICMP 패킷을 sendto로 보낼 때는 IP 헤더를 소켓에서 알아서 작성하도록 지정했습니다. 이번에는 IP 헤더를 직접 구성하여 패킷을 보내보도록 하겠습니다. IP 헤더를 직접 작성하기 위해서는 setsockopt 함수에서 IP_HDRINCL 속성을 지정해야 합니다. /* 예제 */ #pragma comment(lib, "ws2_32.lib") #include #include #include #include #include #include #pragma pack(push, 1) typedef struct _tagIPHDR4 { BYTE bVersionIHL; // Version and IHL BYTE bTypeOfSer.. 더보기
윈도우에서 IP 주소 얻는 방법 윈도우에서 IP 주소 얻는 방법 - by Tapito 인터넷으로 패킷을 주고 받기 위해서는 상대방과 자기 자신의 IP 주소를 알아야 합니다. 이 IP 주소는 세계 어디서나 식별 가능한 공인 IP일 수도 있고 같은 라우터에 물려있어야 식별 가능한 사설 IP일 수도 있습니다. 상대방의 IP 주소는 비교적 쉽게 얻을 수 있거나 이미 알고 있는 상태이기 때문에 문제가 되지 않지만 자기 자신의 IP를 얻는 방법은 약간 복잡합니다. 흔히 10.xxx.xxx.xxx, 172.16.xxx.xxx ~ 172.31.xxx.xxx, 192.168.xxx.xxx로 시작하는 주소는 사설 IP로서 같은 공유기에 물려있는 장치들 사이에서나 유효하며 이 범위가 아닌 IP가 아니더라도 같은 네트워크에 접속된 장치들에서만 유효한 사설 .. 더보기
소켓 통신 #3 - ICMP 클라이언트 구현하기(2) 소켓 통신 #3 - ICMP 클라이언트 구현하기(2) - by Tapito ICMP로 통신하기 위해서는 저수준 소켓을 만듭니다. 만일 Windows 운영체제에서 이 단계에 INVALID_SOCKET이 반환되고 GetLastError 함수 등을 통해 10013 오류가 확인되었다면 해당 프로그램을 관리자모드로 실행하면 됩니다. SOCKET icmpSocket = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); struct sockaddr_in icmpDestination에 ping을 보낼 대상이 미리 저장되어있다고 하면 sendto 소켓함수를 통해 상대방의 수신 여부와 무관하게 일방적으로 데이터(ICMP를 포함한 패킷 전체)를 쏩니다. 전송 성공 시 전송된 바이트 수를 반환하고 그렇.. 더보기
소켓 통신 #3 - ICMP 클라이언트 구현하기(1) 소켓 통신 #3 - ICMP 클라이언트 구현하기(1) - by Tapito ICMP 패킷 헤더 이번에는 좀 더 저수준으로 소켓을 다뤄보겠습니다. ICMP(Internet Control Message Protocol)는 ping 명령에서 사용되는 프로토콜로 목적지와의 통신이 원활한지를 확인하는데 사용됩니다. 저수준이니만큼 패킷의 구조도 직접 작성해야 하는데요, 목적지로 ping을 보내서 되돌아오기까지의 과정에서 주고받는 데이터를 에코(echo)라 합니다. 에코를 보내고 받을 때 전달되는 ICMP 구조체는 아래와 같이 선언하기로 약속(RFC 792 규격)되었습니다. /* ICMP 헤더 구조체의 예 */ typedef struct _tagICMPHDR { BYTE bType; // Type BYTE bCode.. 더보기
소켓 함수를 사용하여 도메인을 IP주소간 상호 변환하기 getnameinfo는 IP 주소에서 도메인으로 변환하는 기능을, getaddrinfo는 도메인에서 IP 주소로 변환하는 기능을 제공합니다.최근의 DNS 서버는 IP 주소에서 도메인으로 변환하는 Reverse DNS 기능을 지원하지 않기 때문에 getnameinfo 함수의 결과가 올바르지 않을 수 있습니다. /* 예제 */ /* WinSock 라이브러리를 링크합니다. */ #pragma comment(lib, "ws2_32.lib") /* 소켓 구조체를 사용하기 위한 헤더 */ #include /* getnameinfo와 getaddrinfo가 선언된 헤더 */ #include #include #include #include int main(int argc, char * argv[]) { ADDRINFO.. 더보기
소켓 통신 #2 - AF_INET 사용하기 (4) 소켓 통신 #2 - AF_INET 사용하기 (4) - by Tapito 이전 포스팅까지 해서 서버와 클라이언트간의 연결 작업은 모두 마쳤습니다. 이제 본격적으로 데이터를 교환해보겠습니다. 데이터의 교환은 전송을 담당하는 send와 수신을 담당하는 recv 함수로 수행됩니다. int send(SOCKET s, const char * buf, int len, int flags); int recv(SOCKET s, char * buf, int len, int flags); s: 데이터를 주고 받을 대상을 나타내는 소켓입니다. buf: 주고 받을 데이터가 기록되어있거나 기록될 버퍼입니다. len: 버퍼의 크기(바이트)입니다. flags: 송수신 관련 옵션입니다. 현재로서는 0으로 해도 무방합니다. 반환 값은 상.. 더보기
소켓 통신 #2 - AF_INET 사용하기 (3) 소켓 통신 #2 - AF_INET 사용하기 (3) - by Tapito 소켓을 사용하기 위해 서버와 클라이언트 모두 각 단계별로 실행할 함수에 대해 알아보았습니다. 이를 종합하여 완성된 소스는 다음과 같습니다. Linux/Unix 에서는 잘 작동 될 것이라 생각되지만, Windows 사용자는 잘 작동이 안될 수 있습니다. WinSock이라는 약간 다른 함수를 사용하기 때문입니다. /* server.c */ int main(int argc, char * argv[]) { /* 자기 자신의 포트와 IP 주소 */ struct sockaddr_in sockaddrServer; /* sockaddrServer 구조체 인스턴스의 크기 */ int sockaddrServerLength = sizeof(sockadd.. 더보기
소켓 통신 #2 - AF_INET 사용하기 (2) 소켓 통신 #2 - AF_INET 사용하기 (2) - by Tapito 이번에는 서버가 되어 접속 요청을 받아들여보겠습니다. 클라이언트에서는 접속 대상의 sockaddr_in 구조체 세팅 - socket() 함수 - connect() 함수의 3단계로 접속이 진행된 반면, 서버는 자신의 sockaddr_in 구조체 세팅 - socket() 함수 - bind() 함수 - listen() 함수 - accept() 함수의 5단계로 접속이 진행됩니다. 1단계. sockaddr_in 구조체 설정하기 sockaddr_in 구조체 설정은 클라이언트와 크게 다르지 않습니다. 다만 자신의 IP 주소를 명시하지 않는다는 차이가 있습니다. /* 사용 예 */ struct sockaddr_in sockaddr_internet;.. 더보기
소켓 통신 #2 - AF_INET 사용하기 (1) 소켓 통신 #2 - AF_INET 사용하기 (1) - by Tapito sockaddr_in 구조체를 사용해 인터넷망에 연결해보겠습니다. 여기에서는 편의상 localhost(127.0.0.1):1435번 포트에 접속해 패킷을 교환합니다. 1단계. sockaddr_in 구조체 설정하기 접속할 네트워크, 접속 대상과 포트 번호를 설정합니다. /* sock_ex01.c */ struct sockaddr_in sockaddr_internet; /* 주소 체계로서 IPv4를 사용하는 인터넷망에 접속 */ sockaddr_internet.sin_family = AF_INET; /* 접속할 대상은 127.0.0.1 */ serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1"); /.. 더보기
소켓 통신 #1 - 소켓 통신에 쓰이는 구조체 소켓 통신 #1 - 소켓 통신에 쓰이는 구조체 - by tapito sockaddr 구조체 소켓을 통해 여러 형태의 네트워크를 거의 비슷한 방식으로 데이터를 교환할 수 있습니다. sockaddr는 일종의 추상 클래스처럼 소켓으로 통신하기 위한 여러 네트워크의 상위 구조체입니다. sockaddr 아래 인터넷망을 사용해 통신하는 구조체인 sockaddr_in과 유닉스 운영체에서 프로세스간 통신을 위해 사용되는 sockaddr_un의 구조체가 선언되어 있습니다. /* sockaddr 구조체 */ struct sockaddr { sa_family_t sa_family; char sa_data[14]; }; sa_family: 소켓이 사용되는 네트워크의 종류입니다. 다음 값 중 하나가 올 수 있습니다. AF_IN.. 더보기
Java AWT로 메뉴 넣기 창을 띄웠으니 메뉴도 넣어보겠습니다. Frame을 상속한 클래스에 MenuBar를 멤버변수로 선언합니다. -- FormMain.java -- /* FormMain.java */ public class FormMain extends Frame { public static final long serialVersionUID = 0x9382942838495039L; /* 멤버로 MenuBar 선언 */ private MenuBar menuBar; public FormMain() { super(); this.setSize(800, 600); this.setVisible(true); this.addWindowListener(new FormMainWindowAdapter()); /* MenuBar 인스턴스 생성하고 .. 더보기
Java AWT로 창 닫기 구현하기 창 닫기를 포함하여 창에 입력되는 모든 동작은 이벤트 처리기를 통해 처리됩니다. 이벤트 처리기는 별도의 클래스에 따로 선언이 되어 Frame.addWindowListener 메서드로 이 창에서 사용할 이벤트처리기를 지정합니다. /* FormMain.java */ package com.tapito.ui; import java.awt.*; public class FormMain extends Frame { public static final long serialVersionUID = 0x9382942838495039L; public FormMain() { super(); this.setSize(800, 600); this.setVisible(true); this.addWindowListener(new For.. 더보기
Java AWT로 빈 프레임 띄우기 자바의 AWT로 띄울 프레임의 이름을 FormMain이라 하면, FormMain.java의 내용은 아래와 같습니다. /* FormMain.java */ /* 패키지명 지정 */ package com.tapito.ui; /* AWT 관련 클래스 사용 */ import java.awt.*; /* java.awt.Frame을 상속하여 FormMain 클래스 선언 */ public class FormMain extends Frame { /* 이 프레임의 고유 식별 번호를 지정합니다. 8바이트 정수로 임의의 값을 지정하면 됩니다. 없어도 무방하지만 컴파일 시 경고가 뜹니다. */ public static final long serialVersionUID = 0x9382942838495039L; public For.. 더보기
자바로 소켓 사용하는 예 서버측 소스 /* Server.java */ /* Socket 클래스를 사용하기 위한 패키지 import */ import java.net.*; /* 데이터의 입출력 관련 클래스를 사용하기 위한 패키지 import */ import java.io.*; public class Server { public static void main(String[] args) throws IOException { ServerSocket serverSocket = null; // 서버용 대기 소켓 Socket socket = null; // 데이터 교환 소켓 DataInputStream dataInputStream = null; // 클라이언트로부터 데이터를 받기 위한 스트림 DataOutputStream dataOutpu.. 더보기
호출 규약(calling convention) 정리 함수의 호출규약은 함수 호출 시 전달된 매개변수를 함수가 종료될 때 정리하는 방법으로서 cdecl, stdcall, fastcall, thiscall의 4가지가 존재합니다. 이 중 thiscall은 C++언어의 멤버함수에서 쓰이고 나머지는 C언어에서 사용됩니다. cdecl 호출 규약 먼저 cdecl은 C 함수 라이브러리에서 표준으로 쓰이는 호출규약으로 스택으로 전달한 매개변수를 함수를 호출한 위치에서 정리하는 방식입니다. 예를 들어 아래와 같은 C함수가 있습니다. int __cdecl _fn_cdecl(int a, int b) { return a+b; } 이를 어셈블리어로 다시 작성해봅니다. 시스템 기본 정수는 4바이트로 가정합니다. _fn_cdecl: sub esp, 4 ; 함수 종료 후 돌아갈 위치가.. 더보기
MSIL로 입출력하기 및 박싱/언박싱 //test2.il .assembly extern mscorlib { } .assembly Test { } .module test.exe .method static public void main() il managed { .entrypoint .maxstack 16 /* 이 곳에 지역 변수를 선언합니다. */ .locals init([0] string temp, [1] int32 a, [2] int32 b, [3] int32 result) /* System.Console.Write("Input the 1st integer : "); */ ldstr "Input the 1st integer : " call void [mscorlib]System.Console::Write(string) /* temp = S.. 더보기
MSIL의 기본 자료형 MSIL의 기본 자료형은 C#과 동일하게 부호 있는 정수와 부호 없는 정수 및 부동소수점으로 구성되어있습니다. 각각 .NET 기본 자료형에 대응되어 있습니다. 자료형.NET 클래스 이름설명 voidSystem.Void반환할 데이터가 없는 메서드의 반환 형식 boolSystem.BooleanTrue 또는 False charSystem.Char16비트 유니코드 문자 int8System.SByte부호 있는 8비트 정수 int16System.Int16 부호 있는 16비트 정수 int32System.Int32부호 있는 32비트 정수 int64System.Int64부호 있는 64비트 정수 native int System.IntPtr시스템 기본 크기의 부호 있는 정수 unsigned int8 System.Byte부호.. 더보기
MSIL로 닷넷 프로그램 작성하기 C#, VB.NET, J#, F#, C++/CLI, Delphi.NET 등등의 닷넷 프레임워크에서 사용되기 위한 언어는 중간언어(MSIL: Microsoft Intermediate Language)로 번역이 됩니다. 이 바이너리를 실행하는 순간 해당 CPU에 맞는 명령어들로 한번 더 번역이 되는 것이죠. MSIL은 어셈블리어보다는 심플합니다. 명령어의 수도 몇 개 되지 않고 소스 코드도 C언어와 비슷한 형태를 띱니다. // 파일명: test.il /* 닷넷의 기본 클래스들이 정의된 mscorlib를 참조해 쓰겠다는 부분입니다. */ .assembly extern mscorlib { } /* 이 어셈블리(= exe파일 또는 dll파일)의 이름은 Test입니다. */ .assembly Test { /* 어셈.. 더보기
Visual Studio 2013에서 어셈블리어 코딩 후 실행하기 Visual Studio 2013은 MASM 어셈블러가 내장되어 있습니다. 별도의 어셈블러 등 추가 설치 없이 설정만으로 어셈블리어 프로그램을 작성할 수 있습니다. 1단계. [파일(F)]-[새로 만들기(N)]-[프로젝트(P)]를 클릭합니다. [새 프로젝트] 창에서 [Visual C++]-[Win32 프로젝트]를 선택합니다. 프로젝트 이름을 지정하고 [확인] 버튼 누릅니다. 2단계. 응용 프로그램 마법사 화면에서 응용 프로그램 종류를 [콘솔 응용 프로그램]에 두고 추가 옵션에서 [빈 프로젝트]를 선택한 후 [마침] 버튼을 누릅니다. 3단계. 이 프로젝트에서 MASM을 사용하기 위해서는 솔루션 탐색기에서 프로젝트를 선택 후 마우스 오른쪽 버튼을 누르고 [빌드 종속성(B)]-[사용자 지정 빌드(B)]를 클릭합.. 더보기
이벤트 처리시 멤버에 들어간 배열 접근에서 EXC_BAD_ACCESS 오류가 뜰 경우 다음과 같이 버튼 하나 있고 내부적으로 배열을 가지고 있는 창이 하나 있다고 가정합니다. 버튼을 클릭하면 button_Click 메서드가 실행됩니다. // TestDelegate.h #import @interface TestDelegate : NSObject { NSArray * array; NSWindow * window; NSButton * button; } @property (nonatimic, retain) NSArray * array; @property (assign) IBOutlet NSWindow * window; @property (nonatomic, retain) IBOutlet NSButton * button; - (IBAction) button_Click: (NSButton *) se.. 더보기
C++11에서 추가된 클래스 - thread 최신 버전의 C++11 라이브러리에서는 운영체제의 함수를 사용하지 않고도 자체적으로 멀티스레드를 구현할 수 있습니다. std::thread 클래스가 바로 그 기능을 수행합니다. 함수를 서로 다른 스레드에서 실행시키는 방법은 다음과 같습니다. 1. 스레드 객체를 생성한다. std::thread의 생성자는 매개변수가 없는 함수의 경우: thread(함수) 매개변수가 있는 함수의 경우: thread(함수, 매개변수 순서대로 나열...) 이렇게 스레드 객체를 생성하는 것만으로도 이미 함수가 실행됩니다. 별도의 start/stop 함수를 호출하지 않습니다. 왜인지는 모르겠으나 C#처럼 해당 스레드를 일시중지시켰다 재개하는 기능은 원래 없습니다. C++의 thread클래스는 해당 함수가 스스로 종료할 때 까지 스레.. 더보기