CTime 사용하기CTime 사용하기

Posted at 2008. 11. 28. 01:15 | Posted in 프로그래밍 언어/C/C++/MFC
현재 timestamp 얻기
CTime time = CTime::GetCurrentTime();
__int64 timestamp = time.GetTime();

timestamp로부터 연월일시분초 얻기 (월만 얻어본다)
CTime time2 = timestamp; // operator=(__int64)
int month = time2.GetMonth(); // +1 같은거 안 해도 된다.

//

CMap::Lookup 메서드 살펴보기CMap::Lookup 메서드 살펴보기

Posted at 2008. 11. 28. 00:05 | Posted in 프로그래밍 언어/C/C++/MFC
먼저 CMap 클래스의 형태는 다음과 같다
template< class KEY, class ARG_KEY, class VALUE, class ARG_VALUE >class CMap
: public CObject

그리고 Lookup 메서드의 형태는 다음과 같다.
BOOL Lookup(
ARG_KEY key,
VALUE& rValue
) const;

Lookup 메서드는 CMap 변수가 key 값이 할당되어 있는지를 찾는 함수이다. 예를 들면

typedef struct Info{
Info(){ i=0; }

int i;
} Info;


CMap<
int, int, Info, Info> map;
map.InitHashTable(
257); // 왜 하필 257? msdn 예제에서 257 쓰길래;
Info info;

info.i =
10;
map[
0] = info;

이후 다음과 같이 Lookup을 사용한다.
Info tmp;
map.Lookup(0, tmp); // return true;
map.Lookup(1, tmp); // return false;

Lookup 함수가 true를 리턴했다면 tmp 변수는 map[0]에 저장된 변수와 같은 값을 갖게 된다.
cout << map[0].i << endl; // 10 출력
cout << tmp.i << endl; // 10 출력

여기서 중요한 점은 map.Lookup(0, tmp); 에서의 tmp 변수와
map[0]에 저장된 값은 같으나 다른 변수이다.
어떤 단어를 써야 할지 모르겠어서 '변수'라고 썼다. 설명이 허접하니 예제를 보자
map.Lookup(0, tmp);
tmp.i = 1;
cout << map[0].i << endl; // 여전히 10 출력

즉, Lookup의 두 번째 파라미터로 들어간 tmp 변수에는 map[0]과 같은 데이터가 들어가 있지만
메모리의 다른 위치에 존재한다는 것이다.


추가.
CMap에 포인터를 저장하는 방식이라면 다음과 같이 되겠다.
(조금은 억지로 만든 예제이기 때문에 실제로 이렇게 코딩하면 안 된다;;)
CMap<int, int, Info*, Info*> map;
map.InitHashTable(257);
Info info;
info.i = 10;
map[0] = &info;

Info* tmp;
map.Lookup(0, tmp);
tmp->i = 1;

cout << map[0]->i << endl; // 1 출력

포인터니까 당연히 1이 출력된다. 특이한 거 아니다.
추가. 부분의 예제는 아무 의미 없는 예제다;;
굳이 쓰자면;
class A
{
public:
~A()
{

POSITION pos = m_Map.GetStartPosition();
int key;
Info* value;
while( pos )
{
m_Map.GetNextAssoc(pos, key, value);
delete value;
}
m_Map.RemoveAll(); // 이렇게 removeall 만 한다고 되는게 아니다.
// Method() 에서 동적할당 한 형태이므로 다 남아있다.
// RemoveAll() 하기 전에 하나하나 다 delete 해야 한다.
}
void A()
{
 m_Map[0] = new Info;
m_Map[11] = new Info;
}
void Increase()
{
Info* tmp;
m_Map.Lookup(11, tmp);
tmp->i++;
}
private:
CMap<int, int, Info*, Info*> m_Map;
}

그지같은 예제다.
소멸자에 주석으로 달아놓은 문제는 C++에서 new 로 동적할당하고
포인터를 stl 저장소에 넣었을 때 주의점이다.

//

[Google Code Jam] Round 1A A번 - Minimum Scalar Product[Google Code Jam] Round 1A A번 - Minimum Scalar Product

Posted at 2008. 11. 23. 20:43 | Posted in 프로그래밍 언어/코딩연습
문제 : http://code.google.com/codejam/contest/dashboard?c=agdjb2RlamFtchALEghjb250ZXN0cxiE2QUM

v1 = (x1,x2,x3....xn), v2 = (y1,y2,y3...yn)
이렇게 두 개의 벡터가 주어졌을 때 scalar product 값은
x1*y1 + x2*y2 + x3*y3 + ... + xn*yn 이다.

Minimum Scalar Product는 v1과 v2의 각 요소를 재배치하여
scalar product 값을 최소화 시키는 문제이다.

예를 들어 v1=(1 3 -5)  v2=(-2 4 1) 일 때
그냥 scalar product = 1*-2 + 3*4 + -5*1 = 5 이고
Minimum Scalar Product = -5*4 + 3*-2 + 1*1 = -25 이다.

이 문제는 주어진 인풋에 대해 각 벡터의 Minimum Scalar Product 값을 구하면 된다.

대충 알고리즘은 이렇다.
1. v1의 각 요소들을 오름차순으로 정렬한다
2. v2의 각 요소들을 내림차순으로 정렬한다.
3. Scalar Product를 수행한다.

저렇게 했을 때 최소값이 나온다. 나는 증명 못한다. 증명은 구글에게 물어볼 것.

대충 소스코드는 다음과 같다.(전체 소스코드는 생략함)

    void Algorithm()
    {
        std::string line;
        ReadLineFromFile(line);
        int nCases = atoi(line.c_str());
        for(int i=0; i<nCases; i++) // nCases=Minimum Scalar Product 문제 개수
        {
            /* n=v1,v2 벡터에 몇 개의 요소들이 있는가 */
            do{
                ReadLineFromFile(line);
            }while(line == "");
            int n = atoi(line.c_str());

            int* v1 = new int[n];
            int* v2 = new int[n];
           
            /* v1 저장 */
            for(int j=0; j<n; j++)
                ReadIntToken(v1[j]);

            /* v2 저장 */
            for(int j=0; j<n; j++)
                ReadIntToken(v2[j]);

            /* 오름차순 정렬 (작은값이먼저) */
            qsort(v1, n, sizeof(int), MinimumScalarProduct::AscOrder);
            /* 내림차순 정렬 (큰값이먼저) */
            qsort(v2, n, sizeof(int), MinimumScalarProduct::DescOrder);

            long long sum = 0;
            /* 각 벡터 요소의 곱이 integer의 범위를 넘기도 한다 */
            for(int j=0; j<n; j++)
                sum += (long long)v1[j]*(long long)v2[j];
           
            /* 출력 형태 맞추기 */
            char out[50];
            /* %I64d로 출력해야 long long(__int64 출력된다) */
            sprintf_s(out, 50, "Case #%d: %I64d", i+1, sum);
            WriteLineToFile(out);

            delete[] v1;
            delete[] v2;
           
        }
    }
    static int __cdecl AscOrder(const void* a, const void* b)
    { return (*(int*)a) - (*(int*)b); }
    static int __cdecl DescOrder(const void* a, const void* b)
    { return (*(int*)b) - (*(int*)a); }

하이라이팅 쉽게 하는 법 없을까;

SyntaxHighLighter 는 색이 맘에 안 들고;
vs2005에서 작성된 코드를 복사해서 마소 워드에 붙여넣어 다시 복사하여 블로그에 붙여넣으면 되긴 하는데
html 코드가 매~~~~~~~우 더러워진다. 워드용 xml 까지 덕지덕지 ㄷㄷㄷ
//

네이버는 블로그의 저작권 침해물을 어떻게 필터링하고 있을까?네이버는 블로그의 저작권 침해물을 어떻게 필터링하고 있을까?

Posted at 2008. 11. 23. 02:51 | Posted in 이야기 방/IT 이야기
무한도전 관련 포스팅 때리는데 동영상 편집 20초 남짓짜리 올렸는데 글 쓴지 몇 분 안 되서 짤렸다.


네이버가 소규모 커뮤니티도 아니고 관리자/알바가 모니터링하다가 지우는 방식도 아닐텐데
올린지 몇 분 안 되서 짤리는 걸 보면 기술적으로 필터링하는 것 같은데 어떤 방법일까?

동영상 내 몇 프레임 thumbnail 만들어서 필터링 DB랑 비교하는 건가?
그러려면 네이버 서버에는 방송 동영상이 일부라도 잔뜩 있어야 될텐데...

아니면 업로드 파일 이름이나 동영상에 붙은 글에 포함된 단어를 기반으로 필터링하는 건가?

이 방법은 방송 감상문에 상관없는 동영상이 걸려 있어도 필터링 될 것 같네...


네이버 블로그에 방송 관련 감상문 같은거 쓰고 관련 동영상을 mncast나 YouTube에 올리고

블로그 포스트에 삽입하는 방법도 필터링 해낼까?


저작권 관련 필터링에 대해 실험하다가 험한 꼴 당하기 싫으니 이렇게 추측만 지껄여본다-_-


뭐 어떻게든 네이버의 필터링을 피해 저작권을 침해하고 싶은 생각이 있는 것은 아니다.

방송 풀 동영상을 올려놓는 것도 아니고;;


내가 재밌게 본 부분을 말로만 표현하는 데에는 한계가 있기에 그 부분만 짧게 편집해서 올린 것이다.

내가 느낀 것이 다른 사람에게 좀 더 쉽고 잘 전달되었으면 하는 바람과 함께..

이게 법적으로 문제가 되니까 문제지ㅠㅠ


동영상이라 문제가 되는 건가? 스크린샷은 괜찮은 걸까?

스크린샷을 연결한 플래시 파일은 어떨까? 동영상 파일의 frame을 매우 많이 낮춘 거나 매한가지일텐데

데이터 포멧이 문제가 아니니까 이것도 해결책이라 볼 수는 없겠지..

그런데 인터넷기사 보면 무한도전 스샷 찍어서 붙인 기사들도 종종 있던데

이런 경우 방송사에 허가를 받고 하는 건가?? 방송사로부터 제공받은 사진 같아 보이지는 않던데...


'어떻게 하면 저작권을 침해하지 않으면서 다른 사람에게 내가 느낀 바를 잘 전할 수 있을까?'


나에게 있어 해결하고 싶은, 그러나 해결되지 않는 문제다.

//

하드디스크 정리 중 발견한 다음 팟플레이어의 용량!!하드디스크 정리 중 발견한 다음 팟플레이어의 용량!!

Posted at 2008. 11. 23. 01:32 | Posted in 이야기 방/일상 이야기

프로그램 추가/제거 보는데 다음 팟플레이어(이하 다음팟) 용량이 800메가를 넘는 것이다.

'아니 무슨 놈의 플레이어가 800메가가 넘어? 바이러스라도 집어삼켰나?'
라는 생각에 직접 폴더에 가보니

캐쉬 폴더가 800메가-_-;;
내가 이놈을 가지고 스타를 많이 보긴 했다만; 뭘 캐슁하고 있었던걸까;
실시간 동영상은 수십초 내외로 앞/뒤로 왔다갔다 할 수 있는 기능이 있는데 그것 때문일까?

여하튼 싹 날려버렸다.

매일매일 캐슁을 한 용량이 이 정도는 아닐 것 같은데,
내가 오늘 본 것만 이정도라는 거야!?!??!?!
아, 오늘 김택용vs허영무 MSL 결승 보긴 했는데 그것때문인가-_-;;;

//