2010년 12월 29일 수요일

ACM 채점서버 (ACM IPCP Problem Online Judge)

http://acmicpc-live-archive.uva.es/nuevoportal/

이름 Jung Wook Sung 으로 등록되어 있고, 닉네임 'Code상인'이다.

요즘 4843부터 문제풀어보고 있다. (ACM IPCP 대전 지역 본선)

문제 순위권에 내이름이 랭크되는 것을 보니 희열이....ㅋㅋ 내가 살아 있음을 느낀다. (이 맛에 코딩하지 ㅡ.,ㅡ.ㅋㅋㅋ)

여러분도 함께 코딩하자 ^^

Let's code together !

2010년 12월 23일 목요일

`통화 ETF` 나온다

우리자산운용(KOSEF), 내년초 상품 출시
미국 달러선물지수 정·역방향 추종

통화 지수를 추종하는 상장지수펀드(ETF)가 첫 선을 보인다.

17일 거래소와 우리자산운용에 따르면, 이 회사는 이르면 내년초 미국달러 선물 지수를 추종하는 `통화ETF` 2종을 거래소에 상장할 예정이다.

통화 관련 지수를 추종하는 ETF 상장은 우리나라에서 이번이 처음이다. `코세프(KOSEF)미국달러선물ETF`와 `코세프미국달러선물인버스ETF`가 그 주인공.

두 상품은 거래소에서 만든 지수인 미국달러선물지수(F-USD KRW)를 추종하도록 만들어졌다. 각각 추종지수에 대해 정방향과 역방향으로 움직인다. 추종지수에서 기준가를 산출할 때 곱해지는 승수는 10으로 결정됐다.

예를 들어 추종지수가 1150원인 상태에서 상장되면 정방향ETF 상장기준가는 1만1500원이 된다. 이 지수가 10% 오르면 ETF의 기준가 역시 10% 올라 1만2650원이 된다. 역방향 ETF의 경우 선물지수가 오르면 기준가가 지수의 10배만큼 빠지는 구조다.

에프앤가이드(FnGuide)에 따르면 현재(16일 기준) 국내에서 ETF를 상장한 운용사는 모두 12개로, 상장 종목은 총 67개에 이른다.

지난 2002년 ETF 도입 이후 국내외 주식과 채권, 금·원유와 같은 원자재 등의 다양한 선물 지수를 추종하는 상품이 출시됐지만 통화지수를 활용한 ETF는 이번이 처음이다.
----------------------------------------------------------------------------------------------------------

달러에 투자 할수있는 방안으로 외화예금을 생각하고있었는데,
내년초에 통화ETF가 나온다니 반가운 소식이다. 거기에다가 통화 인버스 까지 ㅋㅋ
내가 생각해온 전략을 실행할 수 있는 날이 곧 오겠다.ㅋ 돈 좀 만지겠다.

API 글자색 변경 출력

컨셉 : 문자열을 배열에 넣고, index로 control 하면서 원하는 문자를 원하는 색으로 print
제기되는 문제 : 문자의 너비가 'AaWt '와 같이 글자글자마다 다르다. 자간 간격도 조금씩 다르다.
해결방안 : DrawTextEx( ) 에서 DT_CALCRECT 사용.

RECT out_rt = {0,0,0,0} 
DrawTextEx(hdc, dest, -1, &out_rt, DT_CALCRECT, NULL);
//실제 문자열은 찍지 않고, 그려질 area만 측정되어 out_rt에 저장된다.
DrawTextEx(hdc, dest, -1, &out_rt, DT_VCENTER | DT_WORDBREAK ,NULL);
//실제 문자열을 찍는 문장. out_rt에 출력한다.
//참고로 dest는 char array

SetTextColor(hdc, RGB(255, 0, 0));
//이 함수를 이용해 원하는 색을 RGB값으로 표현하여 사용한다.
SetBkColor(hdc,RGB(255, 255, 255));
//참고로 이 함수를 back ground color 변경함수



적용 결과

2010년 11월 29일 월요일

C++ STL : list 사용

#include <iostream>
#include <list>
#include <iterator>

int main()
{
    using namespace std;
    list<int> one(5, 2);
    int stuff[5] = {1, 2, 4, 8, 6};
    list<int> two;
    two.insert(two.begin(), stuff, stuff + 5);
    int more[6] = {6, 4, 2, 4, 6, 5};
    list<int> three(two);
    three.insert(three.end(), more, more + 6);

    cout << "List one: ";
    ostream_iterator<int,char> out(cout, " ");
    copy(one.begin(), one.end(), out);
    cout << endl << "List two: ";
    copy(two.begin(), two.end(), out);
    cout << endl << "List three: ";
    copy(three.begin(), three.end(), out);
    three.remove(2);
    cout << endl << "Delete '2's from List three: ";
    copy(three.begin(), three.end(), out);
    three.splice(three.begin(), one);
    cout << endl << "List three after splice(): ";
    copy(three.begin(), three.end(), out);
    cout << endl << "List one: ";
    copy(one.begin(), one.end(), out);
    three.unique();
    cout << endl << "List three after unique(): ";
    copy(three.begin(), three.end(), out);
    three.sort();
    three.unique();
    cout << endl << "List three after sort(), and unique(): ";
    copy(three.begin(), three.end(), out);
    two.sort();
    three.merge(two);
    cout << endl << "Merge sorted 'list two' with 'list three': ";
    copy(three.begin(), three.end(), out);
    cout << endl;

    return 0;
}

결과
List one: 2 2 2 2 2 
List two: 1 2 4 8 6 
List three: 1 2 4 8 6 6 4 2 4 6 5 
Delete '2's from List three: 1 4 8 6 6 4 4 6 5 
List three after splice(): 2 2 2 2 2 1 4 8 6 6 4 4 6 5 
List one: 
List three after unique(): 2 1 4 8 6 4 6 5 
List three after sort(), and unique(): 1 2 4 5 6 8 
Merge sorted 'list two' with 'list three': 1 1 2 2 4 4 5 6 6 8 8 


[출처] C++ STL : list 사용 예|작성자 seungmin

2010년 11월 28일 일요일

[Win32] _beginthreadex()와 CreateThread()의 사용

* _beginthreadex()
 ; Win32용 API로 원래 CreateThread()가 있지만 이 함수는 완전히 Win32용 API와의 호환성을 지원하는 목적으로 만들어졌기 때문에 윈도우의 서브 시스템의 하나인 POSIX와 호환성을 보장하지 못한다. 그래서 윈도우에서는 POSIX C/C++ 라이브러리와 호환성을 보장하기 위해 '_beginThreadex()'함수를 지원한다.

*_beginthreadex() 사용시 에러 해결
- '_beginthreadex' : undeclared identifier
- 'unresolved external symbol'
 => 비주얼 스튜디오 6.0에서는 단일 스레드 라이브러리 상태가 기본적으로 설정되어있기 때문에 위와 같은 에러 발생시 다음과 같이 설정해본다.

> Project - Settings


- Category => Code Generation
- USE run-time library -> Multithreaded DLL


* CreateThread()와 _beginThreadex()의 형식 비교

#include <windows.h>
HANDLE CreateThread(                                                              //리턴 타입 HANDLE (void*)
             LPSECURITY_ATTRIBUTES lpThreadAttributes,        //보안 디스크립터(구조체)
             SIZE_T dwStackSize,                                                        //초기 스택 사이즈 (unsigned long)
             LPTHREAD_START_ROUTINE lpStartAddress,           //스레드 함수 모듈 (반환형 DWORD)
             LPVOID lpParameter,                                                      //스레드 인자 (void*)
             DWORD dwCreationFlags,                                              //생성 옵션 (unsigned long)
             LPDWORD lpThreadID                                                       //스레드 ID (unsigned long*)
);
 => 주로 인자의 자료형이 DWORD(unsigned long)이다.


#include <process.h>
unsigned long _beginthreadex(                                        //리턴 타입 unsigned long
             void* security,                                                          //보안 변수 (void*)
              unsigned stack_size,                                               //초기 스택 사이즈 (unsigned int)
              unsigned (*start_address)(void*),                     //스레드 함수 모듈 (반환형 UINT)
              void* arglist,                                                             //스레드 인자 (void*)
              unsigned initflag,                                                     //생성 옵션 (unsigned int)
              unsigned* thrdaddr                                                 //스레드 ID (unsigned int*)
);
 => 주로 인자의 자료형이 unsigned int 타입이다. (int는 생략 가능하므로...) 윈도우에서는unsigned int를 UINT로 매크로 정의하고 있다. 두 함수의 인자를 비교해보면 아무 형식이나 입력 가능해야 하는 스레드 인자를 제외하고는 모두 데이터 타입이 다르다. 그리고 애시당초 헤더 파일도 다르다...


그럼 간단한 스레드 생성의 예를 보자.
- CreateThread()...의 경우
#include <windows.h>
                    ...
DWORD WINAPI ThreadFunc(void *arg)
{
     //스레드 구현
}
                   ...
HANDLE hThread;
DWORD dwThreadID;
                   ...{
     hThread = CreateThread(NULL, 0, ThreadFunc, NULL, 0, &dwThreadID);             //스레드 생성
}
                   ...
=> 스레드 함수의 리턴 타입(DWORD), 스레드ID(DWORD)의 데이터 타입을 유의하자.


- _beginthreadex()...의 경우
#include <process.h>
                ...
UINT WINAPI ThreadFunc(void *arg)
{
      //스레드 구현
}
                ...
HANDLE hThread;
UINT dwThreadID;
                ...
{
     hThread = (HANDLE)_beginthreadex(NULL, 0, ThreadFunc, NULL, 0, &dwThreadID);
}                ...
=> CreateThread()와 데이터 타입이 다르므로 주의한다. 스레드의 리턴 타입(UINT), _beginthreadex()의 리턴 타입은 HANDLE 타입이 아니므로 타입 캐스팅을 해야한다. 그리고 스레드ID의 타입(UINT)을 유의해야한다.