2015년 12월 9일 수요일

[미완] [책] 수수께끼 풀이는 저녁식사 후에

[미완] [책] 수수께끼 풀이는 저녁식사 후에

책은 좀 당황스럽다.
어떤 사건을 한권동안 풀줄 알았는데
6개의 사건이 나오는 단편이다.

보면서 만화책(김전일, 코난)이 생각났다.
사건이 발생하고 용의자들이 나오고
사건을 해결하고 끝

단편이라 당황했지만
부담없이 편하게 읽을수 있다.

2015년 12월 2일 수요일

[미완] 책 Windows 구조와 원리

[미완] 책 Windows 구조와 원리 : OS를 관통하는 프로그래밍의 원리
저자: 정덕영
출판사: 한빛미디어

별: 3개

책은 로우레벨에대해서 자세히 설명을 하고 있지만

책을 보는 내 수준이 안되어서 중간이후부터는 이해를 못하고 그냥 끝까지 읽었다.

나는 응용프로그램머라서 WinDBG는 쓸줄모르고 로우레벨딴 프로그램은 거의 안 짜바서 그렇고

시스템이나 드라이버 관련자들은
이 책은 많은 도움이 될것 같다.


* 나에게 시스템 관련 책은
윤성우 저자의 뇌를 자극하는 윈도우즈 시스템 프로그래밍이
맞는것 같다.

[미완] 리눅스 민트에서 코드블럭 컴파일시 에러

[미완] 리눅스 민트에서 코드블럭 컴파일시 에러

g++와 xterm 설치

g++: c++ 컴파일을 위해서
xterm: 터미널 실행을 위해서

2015년 11월 3일 화요일

[미완] [Win32/MFC] 작업관리자의 프로세스와 응용프로그램 추출

[미완] [Win32/MFC] 작업관리자의 프로세스와 응용프로그램 추출


위 그림에서 프로세스 이름(보라)와 타이틀명(빨강) 추출하는 법
프로세스 이름(보라)는 2가지가 있고 타이틀명(빨강)은 1개 올림
블로그로 보면 상당히 지저분한데 소스는 헤더파일로 분리해서 심플합니다.
단 VS6에서 잘 돌아가나 유니코드때문에 다른 버전은 수정을 해야 합니다.
(*지금은 그냥 올리고 나중에 유니코드로 수정해서 다시 올리 예정)

소스 다운로드
http://cfile218.uf.daum.net/attach/246D7D4A563822CF31088D

타이틀명(빨강) 추출
#include <windows.h>
#include <stdio.h>
#include <tlhelp32.h>
#include <vdmdbg.h>
#include <tchar.h>
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
    _TCHAR szTitle[MAX_PATH] = {0, };
    DWORD dwPID = 0;

    PROCESSENTRY32 pEntry;
    memset(&pEntry, 0x00, sizeof(PROCESSENTRY32));
    pEntry.dwSize = sizeof(pEntry);

    // process list(like taskmgr)
    DWORD exStyle = GetWindowLong(hwnd, GWL_EXSTYLE);
    BOOL isVisible = IsWindowVisible(hwnd);
    BOOL isToolWindow = (exStyle & WS_EX_TOOLWINDOW);
    BOOL isAppWindow = (exStyle & WS_EX_APPWINDOW);
    BOOL isOwned = GetWindow(hwnd, GW_OWNER) ? TRUE : FALSE;

    if (!(isVisible && (isAppWindow || (!isToolWindow && !isOwned))))
        return TRUE;

    GetWindowText(hwnd, szTitle, MAX_PATH); // get caption
    GetWindowThreadProcessId(hwnd, &dwPID);

    HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, dwPID);
    Process32First(hSnapShot, &pEntry);

    HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, dwPID);

    while (!(dwPID == pEntry.th32ProcessID) && IsWindowVisible(hwnd))
    {
        if (FALSE == Process32Next(hSnapShot, &pEntry))
            break;
 
        hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, dwPID);
    }

    _TCHAR szRes[MAX_PATH] = {0, };
    _stprintf(szRes, _T("PID : 0x%08x, Title : %s, Filename : %s\n"), dwPID, szTitle, pEntry.szExeFile);
 _tprintf( szRes );

    return TRUE;
}

프로세스 이름(보라) 추출 방벙 1
#include <windows.h>
#include <stdio.h>
#include <tlhelp32.h>
#include <vdmdbg.h>
#include <tchar.h>
BOOL ProcessList()
{
    HANDLE   hProcess = NULL;
    PROCESSENTRY32 ppe = {0};

    hProcess = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
    ppe.dwSize = sizeof( PROCESSENTRY32 );

    if( Process32First( hProcess, &ppe ) )
    {
        do
        {
            _tprintf(_T("%-30s (%d) \n"), ppe.szExeFile, ppe.th32ProcessID);
  
        } while ( Process32Next( hProcess, &ppe ) );
    }

    CloseHandle (hProcess);

    return TRUE;
}

프로세스 이름(보라) 추출 방벙 2
#include <windows.h>
#include <stdio.h>
#include <tlhelp32.h>
#include <vdmdbg.h>
#include <tchar.h>
typedef BOOL (CALLBACK *PROCENUMPROC)(DWORD, WORD, LPSTR, LPARAM);
typedef struct {
   DWORD          dwPID;
   PROCENUMPROC   lpProc;
   DWORD          lParam;
   BOOL           bEnd;
} EnumInfoStruct;
BOOL WINAPI EnumProcs(PROCENUMPROC lpProc, LPARAM lParam);
BOOL WINAPI Enum16(DWORD dwThreadId, WORD hMod16, WORD hTask16,
      PSZ pszModName, PSZ pszFileName, LPARAM lpUserDefined);
//
// The EnumProcs function takes a pointer to a callback function
// that will be called once per process with the process filename
// and process ID.
//
// lpProc -- Address of callback routine.
//
// lParam -- A user-defined LPARAM value to be passed to
//           the callback routine.
//
// Callback function definition:
// BOOL CALLBACK Proc(DWORD dw, WORD w, LPCSTR lpstr, LPARAM lParam);
//
BOOL WINAPI EnumProcs(PROCENUMPROC lpProc, LPARAM lParam) {
   OSVERSIONINFO  osver;
   HINSTANCE      hInstLib  = NULL;
   HINSTANCE      hInstLib2 = NULL;
   HANDLE         hSnapShot = NULL;
   LPDWORD        lpdwPIDs  = NULL;
   PROCESSENTRY32 procentry;
   BOOL           bFlag;
   DWORD          dwSize;
   DWORD          dwSize2;
   DWORD          dwIndex;
   HMODULE        hMod;
   HANDLE         hProcess;
   char           szFileName[MAX_PATH];
   EnumInfoStruct sInfo;
   // ToolHelp Function Pointers.
   HANDLE (WINAPI *lpfCreateToolhelp32Snapshot)(DWORD, DWORD);
   BOOL (WINAPI *lpfProcess32First)(HANDLE, LPPROCESSENTRY32);
   BOOL (WINAPI *lpfProcess32Next)(HANDLE, LPPROCESSENTRY32);
   // PSAPI Function Pointers.
   BOOL (WINAPI *lpfEnumProcesses)(DWORD *, DWORD, DWORD *);
   BOOL (WINAPI *lpfEnumProcessModules)(HANDLE, HMODULE *, DWORD,
         LPDWORD);
   DWORD (WINAPI *lpfGetModuleBaseName)(HANDLE, HMODULE, LPTSTR, DWORD);
   // VDMDBG Function Pointers.
   INT (WINAPI *lpfVDMEnumTaskWOWEx)(DWORD, TASKENUMPROCEX, LPARAM);
   // Retrieve the OS version
   osver.dwOSVersionInfoSize = sizeof(osver);
   if (!GetVersionEx(&osver))
      return FALSE;
  
   // If Windows NT 4.0
   if (osver.dwPlatformId == VER_PLATFORM_WIN32_NT
         && osver.dwMajorVersion == 4) {
      __try {
         // Get the procedure addresses explicitly. We do
         // this so we don't have to worry about modules
         // failing to load under OSes other than Windows NT 4.0
         // because references to PSAPI.DLL can't be resolved.
         hInstLib = LoadLibraryA("PSAPI.DLL");
         if (hInstLib == NULL)
            __leave;
         hInstLib2 = LoadLibraryA("VDMDBG.DLL");
         if (hInstLib2 == NULL)
            __leave;
         // Get procedure addresses.
         lpfEnumProcesses = (BOOL (WINAPI *)(DWORD *, DWORD, DWORD*))
               GetProcAddress(hInstLib, "EnumProcesses");
         lpfEnumProcessModules = (BOOL (WINAPI *)(HANDLE, HMODULE *,
               DWORD, LPDWORD)) GetProcAddress(hInstLib,
               "EnumProcessModules");
         lpfGetModuleBaseName = (DWORD (WINAPI *)(HANDLE, HMODULE,
               LPTSTR, DWORD)) GetProcAddress(hInstLib,
               "GetModuleBaseNameA");
         lpfVDMEnumTaskWOWEx = (INT (WINAPI *)(DWORD, TASKENUMPROCEX,
               LPARAM)) GetProcAddress(hInstLib2, "VDMEnumTaskWOWEx");
        
         if (lpfEnumProcesses == NULL
               || lpfEnumProcessModules == NULL
               || lpfGetModuleBaseName == NULL
               || lpfVDMEnumTaskWOWEx == NULL)
            __leave;
         //
         // Call the PSAPI function EnumProcesses to get all of the
         // ProcID's currently in the system.
         //
         // NOTE: In the documentation, the third parameter of
         // EnumProcesses is named cbNeeded, which implies that you
         // can call the function once to find out how much space to
         // allocate for a buffer and again to fill the buffer.
         // This is not the case. The cbNeeded parameter returns
         // the number of PIDs returned, so if your buffer size is
         // zero cbNeeded returns zero.
         //
         // NOTE: The "HeapAlloc" loop here ensures that we
         // actually allocate a buffer large enough for all the
         // PIDs in the system.
         //
         dwSize2 = 256 * sizeof(DWORD);
         do {
            if (lpdwPIDs) {
               HeapFree(GetProcessHeap(), 0, lpdwPIDs);
               dwSize2 *= 2;
            }
            lpdwPIDs = (LPDWORD) HeapAlloc(GetProcessHeap(), 0,
                  dwSize2);
            if (lpdwPIDs == NULL)
               __leave;
           
            if (!lpfEnumProcesses(lpdwPIDs, dwSize2, &dwSize))
               __leave;
         } while (dwSize == dwSize2);
         // How many ProcID's did we get?
         dwSize /= sizeof(DWORD);
         // Loop through each ProcID.
         for (dwIndex = 0; dwIndex < dwSize; dwIndex++) {
            szFileName[0] = 0;
           
            // Open the process (if we can... security does not
            // permit every process in the system to be opened).
            hProcess = OpenProcess(
                  PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
                  FALSE, lpdwPIDs[dwIndex]);
            if (hProcess != NULL) {
               // Here we call EnumProcessModules to get only the
               // first module in the process. This will be the
               // EXE module for which we will retrieve the name.
               if (lpfEnumProcessModules(hProcess, &hMod,
                     sizeof(hMod), &dwSize2)) {
                  // Get the module name
                  if (!lpfGetModuleBaseName(hProcess, hMod,
                        szFileName, sizeof(szFileName)))
                     szFileName[0] = 0;
               }
               CloseHandle(hProcess);
            }
            // Regardless of OpenProcess success or failure, we
            // still call the enum func with the ProcID.
            if (!lpProc(lpdwPIDs[dwIndex], 0, szFileName, lParam))
               break;
            // Did we just bump into an NTVDM?
            if (_stricmp(szFileName, "NTVDM.EXE") == 0) {
               // Fill in some info for the 16-bit enum proc.
               sInfo.dwPID = lpdwPIDs[dwIndex];
               sInfo.lpProc = lpProc;
               sInfo.lParam = (DWORD) lParam;
               sInfo.bEnd = FALSE;
               // Enum the 16-bit stuff.
               lpfVDMEnumTaskWOWEx(lpdwPIDs[dwIndex],
                  (TASKENUMPROCEX) Enum16, (LPARAM) &sInfo);
               // Did our main enum func say quit?
               if (sInfo.bEnd)
                  break;
            }
         }
      } __finally {
         if (hInstLib)
            FreeLibrary(hInstLib);
         if (hInstLib2)
            FreeLibrary(hInstLib2);
         if (lpdwPIDs)
            HeapFree(GetProcessHeap(), 0, lpdwPIDs);
      }
   // If any OS other than Windows NT 4.0.
   } else if (osver.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS
         || (osver.dwPlatformId == VER_PLATFORM_WIN32_NT
         && osver.dwMajorVersion > 4)) {
      __try {
         hInstLib = LoadLibraryA("Kernel32.DLL");
         if (hInstLib == NULL)
            __leave;
         // If NT-based OS, load VDMDBG.DLL.
         if (osver.dwPlatformId == VER_PLATFORM_WIN32_NT) {
            hInstLib2 = LoadLibraryA("VDMDBG.DLL");
            if (hInstLib2 == NULL)
               __leave;
         }
         // Get procedure addresses. We are linking to
         // these functions explicitly, because a module using
         // this code would fail to load under Windows NT,
         // which does not have the Toolhelp32
         // functions in KERNEL32.DLL.
         lpfCreateToolhelp32Snapshot =
               (HANDLE (WINAPI *)(DWORD,DWORD))
               GetProcAddress(hInstLib, "CreateToolhelp32Snapshot");
         lpfProcess32First =
               (BOOL (WINAPI *)(HANDLE,LPPROCESSENTRY32))
               GetProcAddress(hInstLib, "Process32First");
         lpfProcess32Next =
               (BOOL (WINAPI *)(HANDLE,LPPROCESSENTRY32))
               GetProcAddress(hInstLib, "Process32Next");
         if (lpfProcess32Next == NULL
               || lpfProcess32First == NULL
               || lpfCreateToolhelp32Snapshot == NULL)
            __leave;
         if (osver.dwPlatformId == VER_PLATFORM_WIN32_NT) {
            lpfVDMEnumTaskWOWEx = (INT (WINAPI *)(DWORD, TASKENUMPROCEX,
                  LPARAM)) GetProcAddress(hInstLib2, "VDMEnumTaskWOWEx");
            if (lpfVDMEnumTaskWOWEx == NULL)
               __leave;
         }
         // Get a handle to a Toolhelp snapshot of all processes.
         hSnapShot = lpfCreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
         if (hSnapShot == INVALID_HANDLE_VALUE) {
            FreeLibrary(hInstLib);
            return FALSE;
         }
         // Get the first process' information.
         procentry.dwSize = sizeof(PROCESSENTRY32);
         bFlag = lpfProcess32First(hSnapShot, &procentry);
         // While there are processes, keep looping.
         while (bFlag) {
           
            // Call the enum func with the filename and ProcID.
            if (lpProc(procentry.th32ProcessID, 0,
                  procentry.szExeFile, lParam)) {
               // Did we just bump into an NTVDM?
               if (_stricmp(procentry.szExeFile, "NTVDM.EXE") == 0) {
                  // Fill in some info for the 16-bit enum proc.
                  sInfo.dwPID = procentry.th32ProcessID;
                  sInfo.lpProc = lpProc;
                  sInfo.lParam = (DWORD) lParam;
                  sInfo.bEnd = FALSE;
                  // Enum the 16-bit stuff.
                  lpfVDMEnumTaskWOWEx(procentry.th32ProcessID,
                     (TASKENUMPROCEX) Enum16, (LPARAM) &sInfo);
                  // Did our main enum func say quit?
                  if (sInfo.bEnd)
                     break;
               }
               procentry.dwSize = sizeof(PROCESSENTRY32);
               bFlag = lpfProcess32Next(hSnapShot, &procentry);
            } else
               bFlag = FALSE;
         }
      } __finally {
         if (hInstLib)
            FreeLibrary(hInstLib);
         if (hInstLib2)
            FreeLibrary(hInstLib2);
      }
   } else
      return FALSE;
   // Free the library.
   FreeLibrary(hInstLib);
   return TRUE;
}

BOOL WINAPI Enum16(DWORD dwThreadId, WORD hMod16, WORD hTask16,
      PSZ pszModName, PSZ pszFileName, LPARAM lpUserDefined) {
   BOOL bRet;
   EnumInfoStruct *psInfo = (EnumInfoStruct *)lpUserDefined;
   bRet = psInfo->lpProc(psInfo->dwPID, hTask16, pszFileName,
      psInfo->lParam);
   if (!bRet)
      psInfo->bEnd = TRUE;
   return !bRet;
}

BOOL CALLBACK MyProcessEnumerator(DWORD dwPID, WORD wTask,
      LPCSTR szProcess, LPARAM lParam) {
   if (wTask == 0)
      printf("%5u   %s\n", dwPID, szProcess);
   else
      printf("  %5u %s\n", wTask, szProcess);
   return TRUE;
}

2015년 10월 21일 수요일

[미완] [Win32/MFC] 파일유무 확인

[Win32/MFC] 파일유무 확인

#include <Shlwapi.h>
#pragma comment(lib, "shlwapi.lib")

// 파일유무 확인
 int nRet = PathFileExists( TEXT("파일명.txt") );
 if ( 1 == nRet ) // 존재 하면
 {

 }
 else    // 없으면
 {

 }

2015년 10월 20일 화요일

[미완] [미국드라마] How to Get Away with Murder

[미완] [미국드라마] How to Get Away with Murder

로스쿨학생 4명이 살인사건에 연관되면서 발생하는 일

(2015.10.20) 미국에서 시즌 2반영중
나는 시즌 1 시청 중

재미있다.

드라마는
살인이 발생한 현재와 함께 3개월전에 이 4명이 만나는 부분부터 시작해서
살인까지 오게된 것을 같이 보여준다.

s1x09에서 현재와 과거가 만나게 되면서 엄청나게 흡입력이 있다.

2015년 8월 6일 목요일

[C언어/C++] TinyXML

[C언어/C++] TinyXML

C++ XML Parser로 오픈소스이고 상용에 사용해도 무료다.
(NotePad++에서도 사용)

그리고 TinyXML-2도 있습니다.
1에 비해 가볍고 빠르다고 합니다.
(TinyXML-2 사용법은 다음에)

* C++ XML 라이브러리 소개

--- TinyXML 간단한 사용법
TinyXML v2.6.2, Visual Studio 2008로 테스트 했습니다.

1. lib
다운로드한 TinyXML을 컴파일하면 .lib가 생성되고 이것을 사용하면 됨.
하지만 VS 2008에서 컴파일이 안되서 이것도 다음에
2. .h, .cpp 추가
6개파일(tinystr.h, tinystr.cpp, tinyxml.h, tinyxml.cpp, tinyxmlerror.cpp, tinyxmlparser.cpp)을
프로젝트에 추가하면 됨.

TinyXML 관련 6개 파일을 추가 후
#include "tinyxml.h" 선언

1. xml 만들기
위와 같은 간단한 xml 만들기

void CreateXml( void )
{
TiXmlDocument doc;

// 선언
TiXmlDeclaration* pDecl = new TiXmlDeclaration( "1.0", "euc-kr", "" );
doc.LinkEndChild( pDecl );

// Root Node
TiXmlElement* pRootNode = new TiXmlElement( "Root_Node" );
doc.LinkEndChild( pRootNode );

// A Node
TiXmlElement* pANode = new TiXmlElement( "A_Node" );
pRootNode->LinkEndChild( pANode );

TiXmlElement* pAElement1 =new TiXmlElement( "A_Element_1" );
pAElement1->LinkEndChild( new TiXmlText( "A Element 1 Text" ));
pANode->LinkEndChild( pAElement1 );

TiXmlElement* pAElement2 = new TiXmlElement( "A_Element_2" );
pAElement2->LinkEndChild( new TiXmlText( "A Element 2 Text" ));
pANode->LinkEndChild( pAElement2 );

// B Node
TiXmlElement* pBNode = new TiXmlElement( "B_Node" );
pRootNode->LinkEndChild( pBNode );
pBNode->SetAttribute( "Attribute", "Data" );
pBNode->SetAttribute( "int", 100 );
pBNode->SetDoubleAttribute("double", 123.45 ); // 소수점 입력

// C Node
TiXmlElement* pCNode = new TiXmlElement( "C_Node" );
pRootNode->LinkEndChild( pCNode );

TiXmlElement* pCElement = new TiXmlElement( "C_Element" );
pCElement->LinkEndChild( new TiXmlText( "C Element Text" ) );
pCNode->LinkEndChild( pCElement );

TiXmlElement* pCAttribute = new TiXmlElement( "C_Attribute" );
pCNode->LinkEndChild( pCAttribute );
pCAttribute->SetAttribute( "Attribute", "Data" );
pCAttribute->SetAttribute( "int", 100 );
pCAttribute->SetDoubleAttribute("double", 123.45 ); // 소수점 입력

// 주석
TiXmlComment* pComment = new TiXmlComment();
pComment->SetValue(" Comment " );
pRootNode->LinkEndChild( pComment );

// .xml 저장
doc.SaveFile("text.xml");
}

2. xml 읽기
void ReadXml( void )
{
// .xml 로드
TiXmlDocument doc;
doc.LoadFile( "text.xml" );
// 변수로 로드시
//char* Path = "text.xml";
//doc.Parse( Path );

// Root Node 접근
TiXmlElement* pRootNode = doc.FirstChildElement( "Root_Node" );
if ( NULL == pRootNode )
return;

// A_Node Type의 값 읽기
// 원하는 Node의 Element 접근 후 값 읽기
TiXmlElement* pANodeElem = pRootNode->FirstChildElement( "A_Node" )->FirstChildElement( "A_Element_1" );
if ( NULL == pANodeElem )
return;
const char* pszANode = pANodeElem->Value(); // pszNode=A_Element_1
const char* pszAText = pANodeElem->GetText(); // pszText=A Element 1 Text

// B_Node Type의 값 읽기
TiXmlElement* pBNodeElem = pRootNode->FirstChildElement( "B_Node" );
if ( NULL == pBNodeElem )
return;

// 방법 1
const char* psz1 = pBNodeElem->Attribute( "Attribute" ); // psz1=Data
const char* psz2 = pBNodeElem->Attribute( "int" ); // psz2=100
const char* psz3 = pBNodeElem->Attribute( "double" ); // psz3=123.45

// 방법 2
TiXmlAttribute* pAttribute = pBNodeElem->FirstAttribute();
const char* pszAttribute = pAttribute->Value(); // pszAttribute=Data

pAttribute = pAttribute->Next();
int nInt = pAttribute->IntValue(); // nInt=100

pAttribute = pAttribute->Next();
double ddouble = pAttribute->DoubleValue(); // ddouble=123.45
}

3. 수정
void WriteXml( void )
{
TiXmlDocument doc;
doc.LoadFile( "text.xml" );

// Root Node 접근
TiXmlElement* pRootNode = doc.FirstChildElement( "Root_Node" );
if ( NULL == pRootNode )
return;

// 삭제 후 새로저장
TiXmlElement* pCNodeElem = pRootNode->FirstChildElement( "C_Node" )->FirstChildElement( "C_Element" );
if ( NULL == pCNodeElem )
return;
pCNodeElem->Clear();
pCNodeElem ->LinkEndChild( new TiXmlText("Write_C_Element") );

// 수정 후 저장
TiXmlElement* pCNodeAttribute = pRootNode->FirstChildElement( "C_Node" )->FirstChildElement( "C_Attribute" );
if ( NULL == pCNodeAttribute )
return;
TiXmlAttribute* pAttribute = pCNodeAttribute->FirstAttribute();
pAttribute->SetValue( "Write_Data" );

pAttribute = pAttribute->Next();
pAttribute->SetIntValue( 200 );

pAttribute = pAttribute->Next();
pAttribute->SetDoubleValue( 567.89 );

doc.SaveFile( "text.xml" );
}

테스트파일 링크 겁니다.
http://cfile216.uf.daum.net/attach/2749493455C3159D1CD6E4

2015년 7월 15일 수요일

[미완] [미국드라마] Empire (엠파이어)

[미완] [미국드라마] Empire (엠파이어)

FOX
Season 1: 2015.01.07 ~ 2015.03.18 [12부작]
Season 2: 2015.09.23 (방영예정)

시즌 1 1회까지 시청

[줄거리]
엠파이어라는 힙합 회사의 대표가 루게릭병 판정을 받자
세명의 아들 중에 한명을 후계자로 뽑으려고 한다.

첫째는 경영을 잘하지만 대표는 뮤직션에게 회사를 물려 주고 싶어 한다.
둘째는 음악에 천재이지만 게이라서 대표가 싫어한다.
셋째는 노래를 잘하지만 철이없다.

이때 부인이 17년만에 감옥에서 출소한다.

엠파이어의 미래는...

---
2014~2015년 미국 신규 드라마 뿐만 아니라
드라마 전체 중에서 가장 핫한 드라마다.

매회 시청률이 계속 상승하다가 마지막회는18-49 시청률 1위를 기록했다.

2015년 7월 14일 화요일

2015년 6월 23일 화요일

[미완] [미국드라마] Scandal

[미완] [미국드라마] Scandal

Season 1: 2012.04.05 ~ 2012.05.17 (7부작)
Season 2: 2012.09.27 ~ 2013.05.16 (22부작)
Season 3: 2013.10.03 ~ 2014.04.17 (18부작)
Season 4: 2014.09.25 ~ 2015.05.14 (22부작)
Season 5: 2015.09.24 반영예정

현재 Season 3 1회까지 시청
별: 4개

*문제발생 현재 자막을 시즌 3 8회까지밖에 못 구했다.

[줄거리]
백악관 출신 주인공(올리비아 포프)이 위기관리 회사를 설립하고
동료들과 함께 유명인사들의 스캔들을 조용히 처리한다.

매회 새로운 고객의 스캔들과
시즌 전체를 관통하는 백악관 이야기
이렇게 2개의 중심 축으로 전개가 된다.

보통 미드는 매회 새로운 에피소드(고객의 스캔들)가 나오고
큰 줄거리(백악관 관련된)는 조금씩 보여주는데

이 드라마는 시즌2 중반부터는 큰 줄거리가 거의 메인으로 나온다.
(24처럼 전편을 안보면 안됨 - 이런류의 미드 좋아함)

---
시즌1: 엄청나게 스피드하고 많은 대사량으로 전개가 스피드하게 진행된다.
피날레때 한인물의 정체에 대한 궁금증을 유발하면서 끝난다.
괜찮게 봤다.

시즌2: 13회가 진정한 시즌 1의 끝이라고 생각한다.
과거에 이야기(선거)가 모두 나온다.
14회부터는 새로운 인물이 나오고 과거이야기(선거)가 다시 나오지만 완전히 해결이 된다.
피날레때 새로운 사건이 터지고 새로운 인물의 정체(세다)가 밝혀 진다.
시즌 2 중반부터 13회까지 이 부분을 특히 재미있게 봤다. 과거(선거)가 밝혀지는 부분이다.

시즌3: 1회때 과거이야기(선거)는 끝났고 새로운 이야기(대통령과거)가 나오는데...

2015년 6월 18일 목요일

[미완]warning LNK4076 증분 상태 파일이 잘못되었습니다. 비증분 링크합니다

warning LNK4076 증분 상태 파일이 잘못되었습니다. 비증분 링크합니다

Debug, Release 폴더르 삭제 후 다시 컴파일 하면 된다.

[미완] warning LNK4222: 내보낸 'DllRegisterServer' 기호를 서수로 지정하면 안 됩니다.

[미완] warning LNK4222: 내보낸 'DllRegisterServer' 기호를 서수로 지정하면 안 됩니다.

.def에 기존(vs6.0) 스타일로 되어 있었서

DllRegisterServer @1 PRIVATE
=> DllRegisterServer PRIVATE

로 수정한다.(@1, @2, ...삭제)

[미완] error PRJ0019: 도구에서 오류 코드를 반환했습니다. 위치: "Registering ActiveX Control..."

error PRJ0019: 도구에서 오류 코드를 반환했습니다. 위치: "Registering ActiveX Control..."

Visual Studio를 관리자 권한으로 실행 안해서 발생함.

Visual Studio를 관리자 권한으로 실행해도 안되면
regedit.exe를 항상 관리자 권한으로 설정함.

2015년 6월 5일 금요일

[미완] 3번째 지리산 종주

3번째 지리산 종주 기록

날짜: 2015.05.22 (금) 22:00 ~ 2015.05.25 (월) 00:20

총경비: 76,210원 + 마트에서 산 식량

버너 불붙이는 부분이 고장나서 사람들에게 라이터를 빌려 사용했음.
그래서 커피는 못먹음.T.T
(꼭 라이터를 가져가세요)

2015.05.06 (수) 10시: 장터목, 버스 예약

05.22 (금)
22:00 남부터미널 버스 탑승 (버스비: 21,900원)

05.23 (토) - 소나기가 중간 중간 조금씩 옴
01:20 구례버스터미널 도착
03:10 편의점(아침-컵라면, 삼각김밥, 맥주) 3,450원
03:50 성삼재행 버스 탑승 (버스비: 4,500원 카드가능)
04:25 성상재 도착
04:55 1.5KM 첫계단 입구
05:10 노고단 대피소 (과일, 초코렛)
05:55 노고단 계곡(노고단은 입산제한 시간으로 못감)
06:45 돼지령
07:00 피아골 감거리
07:10 임걸령(샘터)
07:55 노룩목
08:20 삼도봉
09:00 화계장 - 이제부터 사람들이 말이 없고 땅만 봐.
09:50 토끼봉
11:30 연하천 1KM전 계단 - 이 1KM가 오늘의 마지막 고비다. 여기만 넘기면 삼겹살이 기다린다.
12:15 연하천 대피소 도착(삼겹살, 햇반, 김치, 소주)
12:55 연하천 대피소 출발
13:10 삼각고점
14:40 벽소령 대피소 도착(라면, 햇반, 스팸, 김치, 소주)
숙박 8천원 + 도포 4천원(2천원x2)

05.24 (일) - 화대종주 마라톤때문에 무지게 선수들에게 길 비켜줬다.
06:00 기상 (초코파이), 불이없어서 커피는 못 마심
06:30 벽소령 대피소 출발
07:35 선비샘(샘터)
09:35 연신봉
09:55 세셕 대피소(라면, 햇반, 스팸, 소주)
11:05 세셕 대피소 출발
11:25 촛대봉
12:40 연하봉
12:50 일출봉
13:00 장터목 대피소(초코렛)
13:30 장터목 대피소 출발
13:50 제석봉 (장터목에서 제석봉이 가장 힘들었다)
14:20 천왕봉 500M전 (마지막이다)
14:40 천왕봉 도착
15:00 천왕봉 출발
15:30 개전문??
16:20 로터리 대피소(초코렛)
16:40 출발
17:15 맘바위
18:00 칼바위
18:20 증산리
중산리 안내소에서 원지(진주, 부산)가는 버스 타는 곳은
20분이라고 팻말이 걸려있는데...
이미 몸은 지칠대로 지쳐고 등산을 끝났다고 생각한 상태에서
가도가도 끝이 없다. 정말 멀게 느겨졌다.
버스정류소까지 택시를 강력 추천합니다.
19:10 중산리 버스 정류소
19:40 원지행 마지막 버스 탑승(3,800원)
20:25 원지버스터미널
20:50 서울남부행 버스탑승(18,200원)

05.25 (월) - 석가탄신일
00:20 서울남부 도착
집까지 택시비 12,360원

2015년 5월 6일 수요일

[미완] [미국드라마] Scorpion

[미완] [미국드라마] Scorpion

스콜피온

내용: 아이큐 197의 주인공과 친구들이 정부를 도와서 테러나 사건을 해결하는 내용.

2014년 새 드라마 중에서 가장 인기가 있는 드라마라고 생각된다.
(물론 엠파이어 나오기 전까지 이지만)

CSI처럼 각 에피소드는 독립이 되어 있고
사건이 발생하면 천재들답게 해결책을 제시한다.
하지만 실재 실전에 들어가면 일이 꼬이면서 이야기가 전개된다.

전체적으로 밝은 수사물이다.

2015년 4월 21일 화요일

[미완] Visual Studio warning D9035 : 'Wp64' 옵션은 더 이상 사용되지 않으므로 이후 릴리스에서 제거될 예정입니다.

[미완] Visual Studio

warning D9035 : 'Wp64' 옵션은 더 이상 사용되지 않으므로 이후 릴리스에서 제거될 예정입니다.

프로젝트 > 속성 > 구성 속성 > C/C++ > 일반
64비트 이식성 문제점 검색
예(/Wp64) -> 아니요로 교체


2015년 3월 25일 수요일

[미완] Mac OS X Yosemite에서 WireShark 실행

맥 요세미티에서 와이어샤크 실행법

1. WireShark 다운 및 설치
http:s//www.wireshark.org/download.html
맥 os에 맞는 버전이 표시된다.
다운 후 설치한다.

2. X11 설치
WireShark를 실행하면 X11이 없다면서 안내 페이지가 나온다.
설치를 들어가면 안내페이지를 통해서 x11페이지에서 다운을 받는다.


아니면 http://xquartz.macosforge.org/landing/ 로 들어가도 된다.
다운 후 설치를 한다.

3. 터미널로 실행
WireShark와 X11을 설치 후 WireShark를 또는 X11를 실행 후 WireShark를 다이렉트롤 실행해도 안된다.

이때는 터미널로 X11을 실행시키고 나서 WireShark를 실행시켜야 한다.
3.1 터미널 실행
3.2 sudo In -s /opt/x11/usr/x11 입력
3.3 Password 입력
3.4 sudo wireshark 입력
WireShark 실행 모습

2015년 3월 9일 월요일

[미완] .msi 파일 관리자 권한으로 설치

[미완] .msi 파일 관리자 권한으로 설치

일부 .msi 프로그램 설치시
관리자 권한으로 설치해야 설치가 되는 프로그램들이 있다.
특히 Windows 8에서 심함.

하지만 .msi 파일을 마우스 우클릭시 "관리자 권한으로 실행"이 안 보인다.

.msi 마우스 우클릭시 "관리자 권한으로 실행"을 출력하게 하려면
레지스트리에 등록하면 된다.

메모장 열어서

[HKEY_CLASSES_ROOT\Msi.Package\Shell\runas]
"HasLUAShield"=""

[HKEY_CLASSES_ROOT\Msi.Package\shell\runas\Command]
@=hex(2):22,00,25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,\
  00,25,00,5c,00,53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,6d,00,\
  73,00,69,00,65,00,78,00,65,00,63,00,2e,00,65,00,78,00,65,00,22,00,20,00,2f,\
  00,69,00,20,00,22,00,25,00,31,00,22,00,20,00,25,00,2a,00,00,00

입력 후 .reg로 저장 후 실행하 된다고 한다.

개인적으로 레지스트리를 건들리는것을 안 좋아한다.
그래서 수동으로 설치하는 법이다.

cmd.exe를 "관리자 권한으로 실행"
cmd.exe 위치는 C:\Windows\System32 or (64bits는) C:\Windows\SysWOW64 에 있다.

cmd로 .msi파일이 있는 곳으로 이동 후
.msi 파일을 실행시키면 된다.
(참고로 .msi 파일명에 띄어쓰기가 있으면 에러가 발생합니다.)

정리 msi를 cmd를 이용해서 설치하면 된다.

2015년 3월 6일 금요일

[미완] [맛집] 일산 은참치

[미완] [맛집] 일산 은참치

일산 라페스타의 신한은행 옆에 있는데

일산에서 일했던 친구가 추천해서
룸잡고 먹었는데
상당히 만족했다.

한때 홍대 이춘복 참치집을 많이 갔는데
거기보다 여기가 더 좋다.
(물론 이춘복에서 실장추천만 시켜서
여기와 비슷한 가격대는 못 먹어봤다.)

주소: 경기도 고양시 일산동구 장항동 775
Tel) 031-907-9566

2015년 3월 2일 월요일

[미완] Subversion(서브버전)

[미완] Subversion(서브버전)

오늘은 생각나는대로 적고 추후에 자세히 적을 예정임

줄여서 "SVN"이라고 함

소스관리 프로그램들은 소스세이프(vss), cvs, svn, git, mercurial등등 많이 존재한다.

실제 프로젝트에서는 기존에 쓰던 소스관리 그냥 쓴다.ㅎㅎ

vss는 거의 사장되었고
CVS 단점을 보완한게 SVN이다.
git는 리눅스 커널이 사용하는 것으로
기존 리눅스 커널 개발때 사용하던 소스관리 업체와 트러블이 생겨서
리눅스 토파즈가 직접 개발(기존에 쓰던 소스관리의 단점들을 보완)
Mercurial는 git와 같은 분산환경인데 윈도우즈에서 주로 사용을 한다.

단순하게 생각해서 정리하면
VSS와 CVS는 안쓰고 SVN을 사용.
대규모 프로젝트에서 분산환경(?) 소스관리로 Git와 Mercurial을 사용하는데
Git는 리눅스, Mercurial는 윈도우즈에서 사용하는데 Git가 대세 같다.
즉 SVN 아니면 Git 사용

이번에 SVN을 사용하게 되어서 여기에 끄적거리고 있음

나는 윈도우즈만 쓰는 사람으로써
우선 SVN서버는 VisualSVN Server이 있다. 윈도우즈용이고 무료고 쉽고 마음에 든다.
그 다음으로 TortoiseSVN이 있다. 이것은 정확히는 클라이언트SVN인데 서버 기능(로컬용)도 있다. 즉 혼자개발 할때 쓰면된다.

클라이언트 SVN은 TortoiseSVN을 사용한다. 윈도우즈용이고 무료다.
다른 프로그램으로 RapidSVN이 있는데 무료고 이것의 강점은 크로스플랫폼이다.
그래서 윈도우, 리눅스, 맥에서 쓸수 있다.

Visual Studio로 개발을 하기때문에 플러그인으로 VisualSVN과 AnkSVN이 있다.
가장 큰 차이점은 VisualSVN은 유료, AnkSVN은 무료이다.

---
VisualSVN Server, TortoiseSVN 간단한 사용법 추가해야함.

2015년 1월 28일 수요일

[미완] [맛집] 인천 신포닭강정

[미완] [맛집] 인천 신포닭가정

시장 끝에 있다.

한쪽에서 닭을 튀기면
다른쪽에서 양념을 뭍혀서 포장집에 담아준다.
주의 포장시 닭을 랜덤으로 담아서 살만 있을수도 있다.ㅎㅎ

기다리면서 맞은편 찬누리닭강정 집을 봤느데
줄은 약간 있는데
신포닭강정보다 약간 많이 주는것 같다.
신포닭강정은 포장지에 약간 부족하게 주는데
찬누리 닭강정은 거의 맞쳐서 준다.

맛은 달줄 알았는데
고추때문에 매운맛이 더 강한다.

시장근청에 있는 공영주차장을 이용했는데
주변도로들이 일방에 양옆으로 불법주차가 되어 있었서
운전하는데 짜증이..
그리고 월요일은 휴무

신포닭강정
인천시 중구 신포동 1-12
032-762-5800



[미완] [맛집] 인천 차이나타운 만다복, 십리향

[미완] [맛집] 인천 차이나타운 만다복, 십리향

인천 차이나타운 만다복에 갔다.

일반짜장은 말 그대로 동네짜장과 비슷하고

100년짜장이 이집의 특징인데
고기위주의 소스를 비벼먹는데 많이 넣으면 짜다 주의

해물짬뽕은 시원한게 좋았다.

탕수육은 찹쌀이 좀 들어갔나 쫄긴쫄긴하게 좋았다.

결론: 맛있게 잘 먹었다.

만다복
인천시 중구 북송동2가 9-11
032-773-3838

차이나타운에 만다복말고
대통령이 왔다는 "연경"(청나라백짜장-콩)과 최초 짜장면집인 "공화춘"이 있다.
주의할것은 "공화춘"이 최초 짜장면집은 맞지만 1980년대 문을 닫았고
현재 "공화춘"은 상호만 같은거다.(짜장이 만원임. 비싸;)



화덕만두집이 십리향에 갔다.
고기, 고구마, 흰호박, 팥 이렇게 4개가 있는데 다 먹어봤다.
고구마, 흰호박, 팥은 그냥 빵(?) 같다. 이것은 만두가 아니다.
고기는 안에 고기들이 뭉쳐서 떡갈비 느낌이 난다.

결론: 고구마, 흰호박, 팥은 별로고 고기는 보통이다.

십리향
인천시 중구 북성동2가 10-26
032-762-5888

2015년 1월 26일 월요일

[미완] [미국드라마] 브로드처치

[미완] [미국드라마] 브로드처치

줄거리: 외딴 마을에 어린 아이가 살행되는 사건이 발생하고 새로온 형사와 이곳 형사 2명이 범위를 추적한다.

특징은 영국드라마이고 8부작이다.

영국드라마는 셜록이후에 처음인데 재미있게 봤다.
아름다운 영상과 역광, 슬로우모션 그리고 적절한 음악까지 전체적으로 드라마는 좋다.

범인를 추적하는 과정에서 이 마을에 사고있는 사람들의 과거가 하나씩 나온다.

어떻게 보면 CSI같은 범인 추적과정 보다는 마을사람들의 사람이야기에 초점이 가 있다.

내가 좋았던 부분은
이런 류의 소설을 쓰고 싶다.
살인사건이라는 큰 줄거리가 있지만 거기에 나오는 사람들의 과거나 관계가 나오는 소설.
살인사건만 쓰면 책이 앏아 질것 같고 주위 사람들의 이야기로 책을 채운다 ㅎㅎ
그리고 개인적으로 시나리오가 좋았던 것은
불륜, 소아성애자, 알콜중독자, 딸을 성폭해하는 남편을 둔 여자 등등 많은 내용이 나오는데
마지막에 이 내용(말)이 돌어온다.
이런 부분을 다음에 소설을 쓰게되면 넣고 싶다.

현재 시즌2를 제작한다고 한다.
살인사건 이후에 마을 이야기가 주 내용이라고 한다.

[미완] [미국드라마] True Detective(트루 디텍티브)

[미완] [미국드라마] True Detective(트루 디텍티브)

HBO

Season 1: 2014.01.12 ~ 2014.05.09
Season 2: 2015.06.21 ~ (4회까지 방송)

Season 2 3회까지 시청


[ 줄거리]
Season 1
연쇄살인범을 쫒는 두 형사 이야기.

전개는 독특하다.
특이한 살인사건이 발생해서
과거에 비숫한 살인사건을 수사한 두 형사를 인터뷰해서
과거 살인사건의 범인을 어떻게 추적했는지 듣는다.

이 드라마의 장점은 HBO방송사이고 배우의 연기다.

HBO답게 요락용은 아니다.잔인하기도 하고 우울하기도 하다.
어떻게 보면 이 드라마의 정상인 보통 사람은 없는것 같기도 하다;

8부작이고 한 사건만 이야기 하다보니 전개가 빠르지는 않고 지루할수도 있지만
괜찮다.

Season 2
시즌 1과의 연관성은 없고 새로운 인물의 새로운 이야기.

시즌1은 두 파트너가 연쇄살인범을 찾는 찾는데 집중하는 얘기인데.
시즌2는 각자 문제가 있는 3명의 형사가 한팀이 되어서 범인을 쫒는데
여기저기 이해관계가 연결되어서 복잡하다.

현재 초반인데 문제가 있는 등장인물들의 이야기가 주고
범인에 관한 것은 거의 없다.(속도가 엄청 느리네)
재미없다. 완결되면 그때 한번에 봐야 하나

[미완], [미국드라마] 홈랜드

[미완], [미국드라마] 홈랜드

줄거리: CIA에서 외국에 잡혀있는 포로중 변절자가 있다는 정보를 입수했는다.
이때 전사한 줄 알았던 해병이 구출되는데
CIA는 이 해병이 변절자인지 의심한다.

시즌 1
백수일때 지루해서 미드를 검색하던중
오바바가 좋아하고 테러 이야기라고 해서 신청하게 되었다.
24를 좋아하는 사람으로써 테러이므로 24와 같은 스타일 인 줄 봤는데...
드라마는 조용하다 못해 지루하다.(총 쏘는 씬이 3,4번 나오나;)

액션보다는 죽으줄 알았던 남편이자 아버지가 돌아온 가정은
어떻게 받아들여야 할지.
오랜시간 포로였다가 사회에 적응하는 과정등등.

어떻게 보면 이게 진짜 같다. 테러리스트들은 조심조심 테러를 준비하고
CIA는 증거하나 하나 분석해서 테러리스트들을 추적하고
그러다보니 24같은 테러 드라마인 줄 알고 본 나는 실망할 수 밖에...

그래도 사람들이 재미있다고 해서 참고 봤다.

시즌 2
엄청 지루했던 시즌 1을 보고 나서 시즌 2를 보니 엄청 재미있다.
매회 사건이 발생한다. 상당히 재미있게 봤다.
그리고 시즌 피날레때... 짱

시즌 3
기존에 주 내용이였던 주인공이 변절자인지 아닌지
그리고 테러 막고 테러리스트를 잡는 이 2가지 내용이 다 해결되었고
시즌 2 피날레때 사건을 어떻게 마무리 될지 궁금해서 보게 되었고 엄청 재미있지는 않다.

시즌 4
원래 시즌 3에서 끝나는 걸로 알고 있었는데 인기때문에 제작하게 되었다.
시즌 1~3이 하나의 이어지는 이야기라고 하면
시즌 4부터는 완전히 새로인 이야기가 시작된다.
그러다보니 초반에는 새로운 환경들의 설명으로 인하여 좀 지루하다가
후반으로 이야기가 재미이였지다가 11회때 정점을 찍고
12회 피날레(나는 피날레인지도 몰랐다)를 보는데 졸려 죽는 줄 알았다.
시즌 5를 위한 인물들의 설정과 환경을 셋팅한다.
아닌 이것은 시즌 5 1회때 하면 되는 내용을 왜 11회 정점을 만들고 하는지 정말 어의가 없다.
물론 시즌 5회때 몇달 후의 이야기로 진행하기 위해서 시즌 4 피날레때 한것 같은데
내가 이때까지 본 미드 중 최악의 시즌 피날레다.

2015년 1월 16일 금요일

[미완] [C/C++] 스마트 포인터( new > auto_ptr > shared_ptr)

[미완] [C/C++] 스마트 포인터( new > auto_ptr > shared_ptr)

#include <iostream>
using namespace std;

#include <memory> // auto_ptr, shared_ptr

class CTest {
public:
CTest() { cout << "CTest()" << endl; };
~CTest() { cout << "~CTest()" << endl; };
};

void New( void )
{
cout << "New() ----------------" << endl;
CTest* p = new CTest;
// delete p;
}

void AutoPtr( void )
{
cout << "AutoPtr() ----------------" << endl;
std::auto_ptr<CTest> p(new CTest);
}

void SharedPtr( void )
{
cout << "SharedPtr() ----------------" << endl;
std::tr1::shared_ptr<CTest> p (new CTest);
}

int main()
{
New();

AutoPtr();

SharedPtr();
}

1. new
당연히 delete를 해야하지만 인간이지라 함수 중간에 return을 만날수도 있고 try-catch에 걸리수도 있고 해서 delete를 못하면 메모리누수가 발생한다. New()함수

2. auto_ptr
그래서 나온게 auto_ptr이다. 소멸자에 객체해제가 있었서 사용자가 delete를 신경 안써도 된다. AutoPtr() 함수
하지만 문제점 발생: auto_ptr은 소유권개념이 있다.

std::auto_ptr<int> p1(new int(10)); // p1=10
std::auto_ptr<int> p2(p1);            // p2=10, p1=null

//cout << *p1 << endl; // 에러발생
cout << *p2 << endl; // 10출력

p2가 p1을 복사하는 순간 new int(10)의 소유권이 p2에게 넘어가서
p1은 null이고 p2가 new int(10)을 가리킨다.

이로 인해서 STL컨테이너에서는 사용하면 안된다.
(C++11부터 사용 중지권고했고 C++17부터는 제거 돼었다고 합니다.)

3. shared_ptr
그래서 나온게 shared_ptr이다. 참조 카운팅이 추가되었다.

std::tr1::shared_ptr<int> p1(new int(10)); // 참조 카운팅=1
std::tr1::shared_ptr<int> p2(p1);            // 참조 카운팅=2

cout << *p1 << endl; // 10출력
cout << *p2 << endl; // 10출력

p2가 p1를 복사하는 순간 참조 카운팅은 2가 된다.
이 참조 카운팅이 0이 되는 순간에 delete를 한다.

하지만 문제점 발생
배열을 delete[]하지 않는다.

std::tr1::shared_ptr<CTest> p (new CTest[10]); // 생성자 10번 호출하지만 소멸자는 1번만 호출
이처럼 배열을 할당하면 소멸시 문제가 발생한다.

여러해결책이 있는데
배열대신 Vector를 사용하라고 한다.

std::vector<std::tr1::shared_ptr<CTest>> p(10); // 벡터 생성

std::tr1::shared_ptr<CTest> p1(new CTest); // 생성자 호출
std::tr1::shared_ptr<CTest> p2(new CTest); // 생성자 호출
// 2번 생성했으므로 소멸자 2번 호출함

2015년 1월 5일 월요일

[미완] [맛집] 홍대 들풀 한정식

[미완] [맛집] 홍대 들풀 한정식

별: 2개

가족 네명이 가서 꽃다지 정식(15,000원) 먹음

새해인 1월1일에 갔다.
새해이므로 직원들이 몇명만 출근한 것일수도 있음.
직원들이 바빠서 그런지 음식들이 제때 잘나오지 않고 늦게 나왔다가 ...

맛은
육류에 자극적인 맛을 좋아하는 나로서
여기 음식들은 나물들과 간도 간단히 한 음식들...

주소: 서울시 마포구 서교동 351-16
전화: 02) 325-7224
주차 음식점 앞에 4개 있음

지도추가해야함