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)을 유의해야한다.

2010년 11월 26일 금요일

API로 WAV파일을 재생시켜보자...

Resource Files(리소스파일)에서 오른쪽 버튼>>Add(추가)>>Resource(리소스)>>Import(가져오기(?))>>원하는 사운드wave 고르기>>resource.h에서 define 무엇으로 되어있나 확인>>소스파일에서 #include"resource.h"하고 소리재생에 필요한 헤더파일 인클루드 하고 (windows먼저인클루드)>>PlaySound(MAKEINTRESOURCE(IDR_WAVE1), NULL, SND_RESOURCE );와 같이 재생
예>>
#include<windows.h>
#include<mmsystem.h>
#include"resource.h"
#pragma comment (lib,"winmm")
int main()

{
      PlaySound(MAKEINTRESOURCE(IDR_WAVE1), NULL, SND_RESOURCE );
}


// sndPlaySound 함수를 사용하려면 mmsystem.h 파일을 include 시켜야 하며
// 메뉴에서 Project -> Settings를 선택하면 project setting 대화상자가 출력되는데
// 이 대화상자에서 link 탭의 Object/library modules : 입력란에 winmm.lib 를 등록한다.


1. 특정 경로에 있는 wave 파일을 한번만 실행시키려면 아래와 같이 사용하면 된다.
   // sndPlaySound 함수에서 wave 파일을 실행시킬 모드 종류
    // SND_ASYNC : 지정한 wave 파일이 실행될 때 언제든지 중지시킬 수 있다.
    // SND_LOOP : 지정한 wave 파일이 무한반복으로 실행된다.
    // SND_MEMORY : 사운드가 메모리에 있다.
    // SND_NODEFAULT : 지정한 경로에 wave 파일이 없어도 경고음이 나오지 않게한다.
    // SND_NOSTOP : wave 파일이 실행될 때 다른 사운드로 같이 재생시킬 수 있다.
    // SND_SYNC   : 지정한 wave 파일이 실행될 때 중지시킬 수 없다.
    sndPlaySound("c:\\temp\\test.wav", SND_ASYNC);

2. 특정 경로에 있는 wave 파일을 반복해서 실행시키려면 아래와 같이 사용하면 된다.
    sndPlaySound("c:\\temp\\test.wav", SND_ASYNC | SND_LOOP);
    // 반복해서 실행되는 소리를 중지하고 싶다면 중지하고 싶은 위치에 아래의 함수를 호출한다.    sndPlaySound(NULL, SND_ASYNC);
--------------------------------------------------------------------------------------------------------------
winmm.lib를 사용하기 위해 Project Settings 대화상자에 이름을 명시해도 되고 전처리기를 
사용하여 아래와 같이 사용하셔도 됩니다. 
#pragma comment(lib, "winmm.lib") 
전처리기는 헤더파일 인클루드 하는 아래쪽에서 사용하시면 됩니다.
--------------------------------------------------------------------------------------------------------------

API에서 Bitmap 투명하게 출력하기


예전에는 투명하게 칠하기 위해서 매우 복잡한 과정을 거쳤었다. 가장 대표적인 것이 마스크 연산이었다. 마스크 연산이란 두 이미지를 AND 연산하여 배경을 잘라내는 것을 말한다.

Window98/2000 이상의 운영체제에서는 투명한 비트맵을 그리기 위해서 복잡한 과정을 거칠 필요가 없이 단 하나의 API를 사용하여 해결 할수 있다. 다음과 같이 코드를 변경한다 .

 //dc.BitBlt(0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, &MemDC, 0, 0, SRCCOPY);
 ::TransparentBlt(dc.m_hDC, 
      0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, 
      MemDC.m_hDC,
      0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, 
      RGB(192, 192, 192));
 //dc.StretchBlt(bmpInfo.bmWidth, 0, bmpInfo.bmWidth*2, bmpInfo.bmHeight*2, &MemDC, 0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, SRCCOPY);
 ::TransparentBlt(dc.m_hDC, 
      bmpInfo.bmWidth, 0, 
      bmpInfo.bmWidth * 2, bmpInfo.bmHeight * 2, 
      MemDC.m_hDC, 
      0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, 
      RGB(192, 192, 192));

코딩 후 프로그램을 빌드해 보면 링크드 Error 가 난다. ::TransparentBlt() 함수의 선언은 있으나 라이브러리 파일을 연결하지 못해서 발생한 문제인데, 이와 같이 링크 문제가 발생했을 때는 선언만 있고 실체가 없기 때문이다. 간혹 전역 함수나 변수에 대한 선언만 있고 실제 구현이 없어도 이와 비슷한 에러가 링크 시에 발생한다. 그러므로 주의해야 한다.

암튼 현재 예제에서 이 문제를 해결하려면 :: TransparentBlt() 함수가 들어 있는 라이브러리 파일을 설정해 주어야 한다. [Alt + F7] 키를 눌러서 설정 부분을 본 다음에 링크 탭에서 다음과 같이 라이브러리 모듈 부분에 Msimg32.lib 라고 추가해 준다.

BOOL TransparentBlt(
  HDC
 hdcDest,        // handle to destination DC
  int nXOriginDest,   // x-coord of destination upper-left corner
  int nYOriginDest,   // y-coord of destination upper-left corner
  int nWidthDest,     // width of destination rectangle
  int hHeightDest,    // height of destination rectangle
  HDC hdcSrc,         // handle to source DC
  int nXOriginSrc,    // x-coord of source upper-left corner
  int nYOriginSrc,    // y-coord of source upper-left corner
  int nWidthSrc,      // width of source rectangle                        <=    1
  int
 nHeightSrc,     // height of source rectangle                       <=    2
  UINT crTransparent  // color to make transparent
);

  1 (소스의 가로)   과   2 (소스의 세로) 는 소스의 원래 값보다 작아야 한다 .
즉, 1 과 2는 소스 DC가 소스비트맵을  선택하고 있을경우 소스 비트맵의 가로와
세로길이보다 커서는 안된다 . (크면 출력 안됨) 
  그런데  StretchBlt 함수의  1과 2는 소스 비트맵의 가로와 세로길이보다
 커도 출력잘된다. 

필요한 lib파일.
Msimg32.lib

이 ::TransparentBlt() 함수의 인자는 StretchBlt() 함수와 거의 비슷핟. 다만 CDC 객체에 대한 포인터가 들어가는 자리에 DC의 핸들값이 들어가야 하므로 CDC의 데이터 멤버인 m_hDC를 인자로 두었다. 윈도우 객체가 윈도우 핸들을 데이터 멤버로 가지고 있는 것처럼 모든 GDI 클래스들로 핸들을 데이터 멤버로 가지고 있다. API 함수들은 C++이 아니라 기본 C 스타일이므로 각각을 식별하는 핸들 값을 인자로 사용한다.
 
그리고 맨 마지막 인자에는 어떤 모드 값이 들어 가는 것이 아니라 투명하게 처리될 이미지의 색상을 RGB 값으로 명시한다. 우리가 출력한 이미지의 배경색의 RGB값은 192, 192, 192인 회색이었다. 그러므로 배경 부분이 투명하게 처리되도록 배경의 RGB값을 인자로 주었다. 만일 RGB(255, 255, 255)준다면 흰색이 투명하게 되어 화면에 출력될 것이다.
이처럼 배경을 투명하게 하는 것이 아니라 이미지자체를 투명하게 (반투명) 출력하는 방법도 있다. ::AlphaBlend() API가 이러한 기능을 제공하는데 이미지의 투명한 정도를 직접 조절할 수도 있으므로 잘 사용하면 매우 보기좋은 사용자 인티페이스를 만들 수 있다. 기왕 MSN의 이너테피스와 비슷하게 만들어 보기로 했으니 좀더 그 모습에 근접하도록 예제를 변경해 보자. 우선 클라이언트 뷰 클래스에 WM_ERASEBKGND 메시지 핸들러를 등록하여 추가적으로 코딩해 보자.

< DrawBk Click!! >
void CMSN_CopyView::DrawBk(CDC *pDC)
{
 CRect Rect;
 int nR, nG, nB;
 int nH = 0, nW = 0;

 GetClientRect(&Rect);
 nW = Rect.Width();
 nH = Rect.Height();
 // 화면의 절반에 그라데이션 효과를 주기위한 펜 객체들을 생성한다. 
 CPen* pPen[64];
 for(int i=0; i<64; ++i)
 {
  nB = 245 + (i);
  if(nB > 255) nB = 255;

  nG = 210 + (i + 4);
  if(nG > 255) nG = 255;

  nR = 200 + (i + 7);
  if(nB > 255) nB = 255;
  pPen[i] = new CPen(PS_SOLID, 1, RGB(nR, nG, nB));
 }
 // 화면의 절반에 선을 그려 넣어, 그라데이션 효과를 준다. 
 for(i=0; i<nH/2; ++i)
 {
  pDC->SelectObject(pPen[(i * 63) / nH]);
  pDC->MoveTo(0, i);
  pDC->LineTo(nW, i);
 }
 // 펜 객체들을 제거한다. 
 for(i=0; i<64; i++) delete pPen[i];
 // 나머지 반은 단순히 흰색으로 채운다. 
 pDC->SelectStockObject(WHITE_PEN);
 for(int j = nH / 2; j < nH; j++)
 {
  pDC->MoveTo(0, j);
  pDC->LineTo(nW, j);
 }
 pDC->SelectStockObject(BLACK_PEN);
}

< 설 명 >
방금 코딩한 DrawBk() 함수는 배경에 그라데이션 효과를 주는 함수이다. 그라데이션의 범위는 클라이언트 뷰 화면의  절반 부분인데, 색상이 아래로 갈수록 점점 밝아지도록 하였다. 이를 위해서 총 64개의 펜 객체를 각각 색상이 점점 증가하도록 하였다. 그리고 화면의 나머지 절반에 대해서는 단순히 흰색을 칠했다. 이 흰색으로 칠한 부분은 영역과 브러시를 만들어서 칠하여도 상관없고 단순한 흰색의 사각형으로 해도 좋을 것이다.
중요한 것은 DrawBk() 함수를 호출하는 곳이 바로 WM_ERASEBKGND 메지시 핸들러 인데, 이 메시지 핸들러는 WM_PAINT가 발생하기 전에 호출된다. 따라서 OnPaint() 함수에서 출력된 결과는 OnEraseBkgnd() 함수에서 출력한 겨로가보다 위로 나타나기 마련이다.
지금 당장 좋은 결과를 보았으나 나중에 서브 클래싱을 통한 컨트롤 프로그래밍에서는 보다 더 나은 사용자 인터페이스를 보게 해줄 것이다. 그리고 OnEraseBkgnd() 메시지 핸들러에서 맨 마지막에 "return CView::OnEraseBkgnd(pDC); " 코드를 주석처리 하여 CView 클래스의 OnEraseBkgnd() 함수를 명시적으로 호출하지 ㅇ낳도록 하여야 한다. 그렇지 않으면 CView 클래스의 코드가 동작하게 되면서 배경을 다시 그려 버린다. 그렇게 되면 지금 작성한 코드가 동작은 하지만 결국 덮어쓰여서 겨로가를볼 수 없게 된다. 때문에 그냥 TRUE 를 리턴하도록 위저드가 생성한 코드를 수정한 것이다. 화면에 그리기를 처리하는데 있어서 OnPaint() 함수만 있는 것이 아니라는 사실을 본 예제를 통해서 꼭 알아두길 바란다.
OnEraseBkgnd() 함수에서는 IDB_Bitmap_Alpha 비트맵 리소스를 화면에 출력하도록 하는데, 이 이미지를 BitBlt() 함수를 이용하여 출력하고 그 오른쪽에 :: AlphaBlend() API 함수를 이용하여 두 번 출력 하였다.
결국 두 이미지는 같은 것이며 화면에 보이는 효과만 다를 뿐이다. ::AlphaBlend() 함수의 인자는 ::TransparenetBlt() 함수나 StretchBlt() 함수와 거의 동일하다. 다만 마지막 인자로 BLENDFUNCTIOIN 구조체가 주어지는데 구조체의 선언은 다음과 같다.

typedef struct _BLENDFUNCTION {
   BYTE   BlendOp;
   BYTE   BlendFlgs;
   BYTE   SourceConstantAlpha;
   BYTE   AlphaFormat;
}BLENDFUNCTION, *PBLENDFUNCTION, *LPBLENDCTION;

첫 번째 멤버 : 출력 옵션인데, 현재 이 값은 AC_SRC_OVER 값만 사용되며 플래그는 사용되지 않는 멤버이다.
세 번째 멤버 : 비트맵의 투명도를 정해 주는 것인데, 0에서 255 사이의 값이 올 수 있으며 0이면 완전히 투명해 지고 255이면 불투명해 진다. 그러므로 중간의 값을 필요에 따라 적절히 사용하여야 할것이다.
마지막 멤버 : 비트맵을 해석하는 방법을 설정하는 것인데, 현재 이 값은 AC_SRC_ALPHA라는 값이나 0이 되어야 한다. 앞서 RGB값에 대해서 이야기 할 때 각각이 9비트이므로 총 24비트로 색상을 표현한다고 말했었다. 그렇다면 왜 32비트 컬러라고 하며 나머지 8비트는 어떤 역할을 하는 것일까? 이는 색상이 아니라 색상의 투명도를 명시하는 값이 되는 것이다.

2010년 11월 21일 일요일

chkdsk

USB 또는 외장하드가 깨져서 불량섹터가 생겼을때... 파일을 지우려도해도 깨져서 지워지지도 않고 잉여로 남아있을때 해결방법.

윈도우 보조프로그램중 [디스크 오류검사]를 활용하면 된다.

먼저 내컴퓨터를 더블클릭 후, 해당 드라이브 우클릭을 하고 [속성]을 클릭.
 그 후 아래 그림과 같이 [도구]탭으로 이동하여 오류검사 범위안에 [지금검사]를 클릭
 마지막으로 디스크검사옵션을 모두 체크해주고 [시작]을 누르고, 기다리면 된다.

별거 아니지만, 모르면 정말 답답한 정보라서 Posting

2010년 11월 20일 토요일

MySQL 재설치시 오류 해결

DataBase 과제하려고 환경잡는데만 몇시간이 걸린걸까 ㅡ.ㅡ..;;
시키는대로 설치하다가 잘 안되서 삭제하고 재설치하는데 ...

처음설치시에는 넘어갔던 부분에서 같은 오류가 계속 발생했다..
구글링해서 겨우 찾아낸 정보 Posting...

같은 문제로 고생하는 사람이 없기를...

1. 먼저 기존 설치되어 있는 MySQL을 삭제(제어판삭제 + 설치폴더삭제)

재설치할 때 Custom 선택 후 Next

MySQL Server Datafiles 폴더를 기존 설치폴더와 다르게 해준다. [Change...]버튼을 누르면 된다.


Client Programs의 설치폴더도 기존에 설치됬던 폴더와 다른 폴더로 수정해준다.



이렇게 하면 Could not start the service 라는 에러메시지가 더이상 뜨지 않는다.

2010년 11월 12일 금요일

Piano stairs - TheFunTheory.com - Rolighetsteorin.se




독특하고 재미있다.
바람직한 행동이나 방향으로 나의 메세지를 상대방에게 전하는 (nudge) 개념.
창의적인 마인드 ㅎㅎ. 간만에 자극받았다.

2010년 11월 8일 월요일

Covered Call ETF 연내 상장계획

완만한 상승장이나 횡보장에서 옵션을 활용해 시장 대비 초과수익을 얻을 수 있는 이른바 '커버드콜' 상장지수펀드(ETF)가 국내에 첫 선을 보인다.
7일 업계에 따르면 마이다스에셋자산운용은 한국거래소(KRX)가 지난달 1일부터 산출ㆍ발표하고 있는 커버드콜지수를 추종하는 ETF를 만들어 이를 연내에 상장시킨다는 계획이다.
커버드콜이란 코스피200 구성종목을 매수하는 동시에 콜옵션을 매도하는 합성 투자 전략이며, 옵션을 활용한 형태의 ETF는 이번이 처음이다.
커버드콜 전략을 활용할 경우 코스피200이 하락 또는 완만하게 상승할 때 코스피200 대비 초과 수익을 얻을 수 있다는 장점이 있다. 콜옵션 매도 프리미엄에 의한 추가 수익이 더해지기 때문이다. 단 코스피200지수가 옵션 행사 가격 이상으로 크게 상승할 경우에는 수익률이 일정 상태에서 고정된다. KRX의 커버드콜지수의 경우는 한달에 코스피200지수가 5% 이상 상승하지 않으면 코스피200 대비 초과 수익을 얻을 수 있다.

"급등장에서는 수익이 제한되나 완만한 상승장에서나 횡보장, 하락장에서는 지수 대비 우월한 성과를 낼 수 있다는 장점이 있다"면서 "주식 수익률에 더해 매월 받는 옵션 프리미엄이 누적되면서 장기로 갈수록 투자 성과가 우수할 것"이라고 설명했다.
커버드콜ETF가 상장되면 옵션을 직접적으로 사용한 최초의 상품이 될 것

2배 레버리지 ETF 출시

KODEX레버리지(122630)

Kospi200의 일일 변동폭의 2배로 연동하여 가격이 움직임.

 투자 전략 포인트

강세장 강한 확신 -> 거치식 매수
강세장 예상 -> 적립식 매수
박스권 예상 -> 박스권 하단 반복 매수, 박스권 고점 부분 매도
약세장 예상&확신 -> 매도 후 KODEX200 적립식 매수

증권투자상담사

증권투자상담사(Certified Securities Investment Advisor)
금융투자회사(법제22조에 따른 겸영금융투자업자는 제외한다)에서 일반투자자를 상대로 증권(집합투자증권은 제외)에 대하여 투자권유를 하거나 투자에 관한 상담 업무를 수행하는 인력

참고 : http://license.kofia.or.kr/home/introduce/introduce5.asp
(시험과목 및 배점)

응시자격 : 제한없음

100문항 120점 (4과목, 40%미만 과락, 60이상 합격)

비전공자로서 비교적 난이도가 낮은 자격증 취득이 유리.
금융자격증 전반의 기초가 된다고 할 수 있음.

2010년 4월초, 9월초에 시험 예정(신청은 3월초, 9월초)

2010년 11월 7일 일요일

주식 성적...



주식을 시작한지 어느새 2년정도 시간이 지난것같다.
처음에는 재태크의 목적으로 소액 100만원정도로 시작한것같은데... 재미를 조금보다보니 추가입금 추가입금, 거기에 수익이 난것도 조금 합치니 500만원이 넘는돈이 아마 원금인것같다.  소심플레이로 2009년의 상승세를 먹은것 치고는 수익이 굉장히 작은 편이지만, 주식으로 많이 배웠고... 수업료도 지불하지 않은 것 치고는 상당히 선방했다고 개인적으로 생각한다.ㅎㅎㅎ

2009년에 700만원찍으면 쏜다고 했던것같은데 ㅋㅋㅋ 이제 막 700만원이 될랑말랑하고 있는것같다. ^^

초심을 잃지 말자.
먹은 수익률에 만족할 줄 알자.

아래 2가지는 확신하게 된 주식 매매기법이다.
강한 Box권은 배신하지 않는다.
전망과 시장평가가 카오스인 업종의 대표주는 매수하고 두눈감고 두귀를 막으면 결국수익이 난다.

2010년 11월 5일 금요일

네트워크 공부하기 좋은 블로그

http://idkhs04.blog.me/

네트워크뿐만 아니라 컴퓨터에 관한 전반적인 내용이 깔끔하게 정리가 잘되있는 블로그

알약에서 바이러스 치료 후 재발견되는 현상

http://blog.naver.com/hahaj1?Redirect=Log&logNo=20063325353

혹시 링크가 깨질것을 우려하여
위 글을 그대로 Copy한 내용입니다.








[원인]
바이러스 백신 프로그램에서 바이러스를 제대로 처리하지 못하는 원인은, 크게 나눠보면 운영체제에 보안 결함이 있거나 또는 보안 제품의 성능 부족 등이라고 생각해 볼 수 있다. 또한 이미 바이러스에 감염된 컴퓨터에 백신을 설치하여 사후 해결하는 경우도 쉽지 않을 수 있다.


[현상]
알약 백신에서는 다음과 같은 개체(isys32.exe ; V.WOM.SillyFDC-CJ)가 검출되었다. 검사 완료 후 “치료하기”를 통해 조치를 하게 되면(알약 백신의 치료 의미는 삭제 후 검역소 보관) 정상적으로 절차를 마치게 된다. 그러나 다시 검사해 보면 재검출된다. 한마디로 처리가 안된 것이다.







[해결 Step1] 휴지통(RECYCLER) 안에 위장한 폴더로 직접 이동하여 살펴보면, 해당 개체(파일)가 그대로 남아 있음을 알 수 있다. 참고적으로 해당 개체의 단순 삭제는 거부된다.
나의 경우 폴더로 직접 이동한 결과 탐색기에서는 폴더옵션에서 [숨김파일보기] 2가지 옵션을 설정했음에도 불구하고 exe파일을 볼 수 없었다.
볼 수 없다고 확신한 이유는 해당 폴더를 알집으로 검사하면 exe파일이 바이러스에 감염되었다고 나오기 때문이다.
exe파일을 보기 위해서 그래서 NexusFile 프로그램을 설치하였다.

[해결 Step2]
알약의 “마우스 오른쪽 버튼 검사”를 통해 해당 개체를 검사해 보면 정상 검출이 된다. 그런데 “치료하기”를 선택하면, 위 2-1에서 특별한 메시지를 보여주지 않고 완료되는 것과 달리, 재부팅을 해야 한다고 안내하고 있다. 동일 개체임에도 불구하고 차이가 발생하는 이유는 이해하기 어렵다(또한 진단명 “Backdoor.Hamweq.1”도 차이가 있다). 아무튼, 전자 2-1에서의 치료하기는 문제가 있는 것 같다. 즉 치료하기를 하더라도 실제 처리에 대한 확인을 하지 않는 것으로 보인다.




 






 


그런데, 알약에서는 위의 개체(2-3에서 마우스 오른쪽 버튼 검사의 경우)에 대해 왜 재부팅을 요구하는 것일까? Unlocker 프로그램을 이용하여 isys32.exe를 확인해 보면 Explorer.EXE 프로세스가 연결된 것을 알 수 있다. 결국 알약에서는 바이러스 파일이 특정 프로세스에 들러붙어 있을 경우 제대로 처리하지 못한다고 볼 수 있다.
참고적으로 다른 백신의 경우, Explorer.EXE를 강제 종료한 후(작업이 끝나면 재시작) 바이러스를 처리하기도 한다. 아무튼 본인의 경우, Unlocker 프로그램에서 “모두풀기”를 선택한 후 isys32.exe 파일을 직접 삭제함으로써, 재부팅 필요없이 간단히 해결하였다.
나의 경우 리사이클폴더가 숨김으로 되어있어서 Unlocker로 폴더까지 접근이 어려웠다. 그래서 Ctrl+Alt+Del을 눌러 프로세스중에 explorer.exe 프로세스를 강제종료 시킨뒤 넥서스파일에서 exe파일을 삭제하였다.


NexusFile 프로그램 사용법 : http://blog.naver.com/hahaj1/20054704901
Unlocker프로그램 사용법 : http://blog.naver.com/hahaj1/20063329268

127.0.0.1

127.0.0.1 = 'localhost'
127.0.0.1은 자기 자신의 컴퓨터를 가리키는 가상의 ip이다.
네트워크와 연결 됬을 때 자신의 ip가 결정되겠지만, 127.0.0.1은 네트웍과 연결되어 있지 않아도 작동한다는 점에서 다르다.

예를 들어 자신의 ip가 203.253.31.1일 때 이 ip를 통해 무언가를 보낸다고 가정하자. 우리 집의 다른 방에 있는 아버지에게 편지를 보내는 것해 비유한다면...

1) 203.253.31.1을 이용한다면 우체국에 자신의 집 주소와 아버지 이름을 적고 보내는 것과 유사하다. 자신의 ip라도 어쨌든 패킷은 게이트웨이에게 갔다가 로컬 네트웍을 거쳐서 다시 자기에게 돌아오게 된다.
2) 127.0.0.1을 이용한다면 집 편지함에 편지를 직접 가져다 놓는 것과 같다. 네트웍에 연결되어 있지 않아도 127.0.0.1이 가능한 이유이다. 그래서 자신의 집 주소를 몰라도(실제 ip를 몰라도) 상관이 없다.

127.0.0.1을 이용하면 네트웍 프로그램을 테스트하기 편해서 좋다. 또한 자신의 컴퓨터에 어떤 데몬을 띄워 놓고 그냥 로컬로만 쓰는데 늘 네트웍에 접속해야 한다면 피곤한 일이다. 유동 ip면 자신의 ip도 일일이 체크해 줘야 한다. 127.0.0.1을 쓰면 이런 불편이 없어진다.