프로젝트 컨버터 VS2005 -> VS2003 or VS6
2006/09/14 18:03
프로젝트가 주로 VS6으로 작성되었으나...
일부 모듈이 VS2003으로 작성되어 있다...
덕분에 일괄빌드/DailyBuild를 하려고 배치파일 작성하는데...
VS6도 설치해야 하고 SDK, DDK 도 설치해야 하는데...
VS2003까지 설치하기는 좀 뭐해서...

코드프로젝트를 뒤지는 중에 발견한거...
http://www.codeproject.com/macro/vsconvert.asp

그 밑에 리플로 달아놓은 어느 중국인이 만든 변환툴이...
사실 쓰기가 더 좋다는거!
http://www.csksoft.net/blog/post/UnPrjConvertor.html

ActiveX로 만든 프로젝트는 그래도 안바뀌네...아씨...
2006/09/14 18:03 2006/09/14 18:03
Trackback Address :: 이 글에는 트랙백을 보낼 수 없습니다

  • TWEETY 2006/09/14 19:44  댓글주소  수정/삭제  댓글쓰기
    이런 툴도 종류가 많구나~
    2005도 지원한데요???
    근데 vs2005 좀 불안하죠?
    • hongyver 2006/09/14 20:35  댓글주소  수정/삭제
      아니...
      MFC 나 Win32는 아주 깔끔하게 바꿔주는데...
      다른 프로젝트는...안되는거 같어...ㅜㅜ

  • 서브버전에서 파일의 revision 또는 버전 관리...
    2006/09/08 20:29
    TRAC과 서브버전을 설치하여 사용하다보니...
    각 파일들의 버전관리가 애매하다...

    실시간 고객의 수정요구로 수정한 파일에 버전이 없다면 아무리 서브버전으로 소스관리를 잘 한다고 해도 그 파일을 다시 만들어 낼 소스코드를 찾을수 없다.

    그래서 생각한 원칙은...

    일단 수정해서 commit 을 할때는 resource.rc 파일의 버전을 1씩 증가시킨후 commit을 수행한다.
    즉 3.0.0.1 과 같은 버전이 있어 수정을 하나라도 했다면 3.0.0.2 와 같이 수정한다.
    이는 고객에게서 수정요구 사항이 들어와서 현장에서 패치(파일교체)를 수행해도 나중에 그 소스코드 찾는걸 쉽게 한다.

    문제는 3.0.0.1121 와 같이 숫자가 크게 되는 경우는 어떻게 할까?
    9999 즉 10000 이상이 되면 세번째 버전을 증가 시키는 방법등 여러가지 방법이 있겠다.

    제품버전이 2.0 이라면
    각 파일별 버전은 3.0.1.1231 와 같은 식으로 이루어 진다...
    제품버전과 파일별 버전에 유사성 또는 통일성을 갖을수는 없을까?
    아...코딩할 생각은 안하고 맨날 쓸데없는 생각만...
    (다음주는 Daily Build 시스템을 구축해야 하는데....)

    2006/09/08 20:29 2006/09/08 20:29
    Trackback Address :: 이 글에는 트랙백을 보낼 수 없습니다

  • TWEETY 2006/09/11 08:54  댓글주소  수정/삭제  댓글쓰기
    오빠..그 회사 일없지? ㅋㅋㅋ ㅡㅡ;
    우리나라 코딩업계에서 그런거 할 시간이 있다니...
    놀랍소.. 난 포기.. 걍 내맘대로~ ㅠㅠ

  • 서브버전에서 Branch를 할때
    2006/08/25 09:57

    서브버전의 디렉토리 구조는

    ─┬──  trunk
       ├──  tags
       ├──  branches

    위와 같은 구조로 나뉜다.

    Tags는 릴리즈된 코드(적어도 외부에 한번이라도 공개된 코드)를 보관하면 된다.
    (소스코드 전체가 보관되는게 아니니 용량 걱정 할 필요도 없고 버전만 확인하여 배포된 소스코드를 그대로 얻을수 있으니 편리하다)

    문제는 Branches 의 용도인데...
    "서브버전을 이용한 실용적인 버전관리" 에서는 릴리즈시(릴리즈 몇일전부터) trunk에서 분리해서 간단한 버그만 수정하여 trunk에서 작업은 그대로 계속진행하고 릴리즈 작업을 branches에서 진행하도록 한다 라고 조언한다.

    그러면 테스트 삼아 작성되는 새로운 기능추가나 별도의 작업으로 진행되다 나중에 추가되는것들은 어떻게 진행되어야 할까?
    2006/08/25 09:57 2006/08/25 09:57
    Trackback Address :: 이 글에는 트랙백을 보낼 수 없습니다

  • TWEETY 2006/08/25 12:50  댓글주소  수정/삭제  댓글쓰기
    trunk... 아녜요? ㅡ,.ㅡ
    • hongyver 2006/08/25 13:19  댓글주소  수정/삭제
      메인줄기는 trunk에서 관리하고...
      릴리즈시만 잠시...릴리즈후 태그에 복사해 놓구...
      다시 trunk에 merge

      좀더 읽어봐야겠어 ㅡㅡ?
  • daewonyoon 2006/09/12 20:49  댓글주소  수정/삭제  댓글쓰기
    저희 개발팀에선 브랜치로 잠시 작업하다가, 메인트렁크가 완전히 브랜치로 옮겨버렸답니다. 멍청한 짓인 것 같은데, 뭐 별 상관이 없어서 그냥 거기 브랜치에서 받아라 그랬죠. 좀 더 현명하게 머징도 해 주고 그러는 기능이 있는 것도 같은데, 어차피 다시 한번 훑어 봐야 하는 것 같아요.
    • hongyver 2006/09/12 23:24  댓글주소  수정/삭제
      그러게 쓰다보면...무언가 답이 보일듯...
      꼭 틀에 얽매혀 쓰여 효율을 지나친다면 그것도 역행하는거겠죠?

  • Dr.Watson
    2006/08/22 08:07

    Dr.watson을 이용하여 에러가 발생하는 곳을 찾아보자.

    먼저 윈도우 98에서는 drwatson.exe를 실행시키면 되고 이렇게 만들어진 추적 파일은 \Windows\Drwatson 폴더에 .wlg 파일로 저장된다.
    NT계열에서는 drwtsn32를 실행시키고 C:\Documents and Settings\All Users\Application Data\Microsoft\Dr Watson 에 .log 파일로 저장된다.

    Dr. Watson 설정
    시스템은 레지스트리 편집기의 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug

    Auto 항목이  1 이면 시스템이 자동으로 디버거를 시작하고 메시지 상자를 만들지 않는다.
    시스템에 Windows가 설치된 경우 Auto 항목의 값은 기본값 1로 설정되고 Debugger 항목의 값은 Dr. Watson을 시작하는 명령을 지정한다. 이는 프로그램 오류가 발생했을 때 Windows용 Dr. Watson이 자동으로 오류를 진단하고 해당 진단 정보를 로그에 기록
    하지만 NET이 설치되면 값은 아래와 같이 설정된다.

    NET경우일때 registry값
    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug]
    "Auto"="0"
    "Debugger"="\"C:\\WINDOWS\\system32\\vsjitdebugger.exe\" -p %ld -e %ld"
    "UserDebuggerHotKey"=dword:00000000

    VC++ 6.0 일때
    "Debugger"="C:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin\msdev.exe" -p %ld -e %ld

    Dr.Watson을 설정하고 나서...
    예제로 아래와 같이 NULL 포인터에 값을 대입하면 예외가 발생한다.
    char* pch1 = NULL;
    ...
    *pch1 = 0;
    ...
    delete pch1;

    그럼 윈도우는 아래와 같은 오류보고 창을 띄운다. 오류 보고를 하면 MS로 오류보고 되지만 보내지 않을경우 log와 dump를 남기게 된다. dump 파일에 대한 이야기는 나중에 하고 오늘은 log를 보자.



    아래 로그 파일을 보면...
    "401867 이라는 주소에 오류->" 라고 표시한곳을 볼수 있다. 이곳이 에러(예외)가 발생한곳인데..
    이 주소를 가지고 우리는 우선 2가지를 짐작할수 있다.
    첫번째는 0x00400000 으로 시작되는 주소로 보아 EXE 파일(DLL은 0x10000000)이라는 점하고
    두번째는 에러가 발생한 지점이 1867 이라는 곳이다.
    그럼 소스코드에서 에러가 발생한 지점을 어떻게 알수 있을까?

    로그 보기 펼치기..

    빌드시 아래의 그림처럼 MAP 파일을 생성하자.
    Project Options에 /mapinfo:lines 도 추가해준다.

    그러면 우리는 아래와 같은 MAP 파일을 얻을수 있다.

    Line numbers for .\Debug\dumptestDlg.obj(D:\project\dumptest\dumptestDlg.cpp) segment .text

      41 0001:000002f0    44 0001:00000322    53 0001:00000380    64 0001:000003b0

    중간생략

      162 0001:000007e6   164 0001:000007ee   169 0001:00000810   170 0001:0000082d
      171 0001:00000833   175 0001:00000840   177 0001:0000085d   179 0001:00000864
      181 0001:0000086a
      183 0001:0000087c

    401867 - 400000 - 1000 = 867 이라는 주소는 179 와 181 사이에 있다.
    즉 코드의 179와 181 사이에서 에러가 발생했다는것을 알수가 있다.

    실제로 해본결과 Project Options에 Optimizations(Maxmize speed /O2 Minimize Size / O1)  옵션을 추가했을경우 제대로된 log 파일을 얻을수 없었다.

    Release 빌드시 위의 옵션 이외의 Default(/D) 옵션으로 해도 지장이 있을지 없을지는 아직 모르겠다. (Reversing이나 해킹방지차원에서)

    참고서적 Debugging Applications for .NET and Windows - John robbins
    그외에 유경상님 블러그, 정성태님홈피

    2006/08/22 08:07 2006/08/22 08:07
    Trackback Address :: 이 글에는 트랙백을 보낼 수 없습니다

  • TWEETY 2006/08/22 09:57  댓글주소  수정/삭제  댓글쓰기
    저 책에 이런 내용이 있어요? ㅋㅋㅋ
    난 왜 못봤지? 너무 뜨문뜨문 봔나?

    난 지금 컴터가 맛가서 testPC에다가 연결해서 놀구 있어요.ㅜㅜ
    미치겐네.. 할 일이 산더민데... as기사는 언제올까..
  • 정성태 2006/08/22 10:20  댓글주소  수정/삭제  댓글쓰기
    "로그 보기" 의 링크가 ^^ 잘못된 것 같습니다.

    참고로, VS.NET 2005 (VC++ 8.0) 에서는 LINE INFO 를 생성하는 것이 아예 없어졌답니다. ^^
    • hongyver 2006/08/22 10:26  댓글주소  수정/삭제
      내용이 길어 more.../less... 버튼처리했습니다.
      누르면 아래로 쫘악...

      line info 생성이 없어졌다는건 옵션만 없어지고 디폴트로 생성된다는뜻인가요? 아님...
      아예 그런 기능이 없어졌다는 뜻인가요?

  • 증분링크
    2006/08/11 09:40

    증분링크(incremental link)는 바이너리를 가능한 빠르게 링크하고자 함수 호출시 직접적인 주소를 참조하지 않고 별도의 테이블(ILT, 증분링크테이블)로 관리를 하여 함수가 수정되어 크기가 변하여도 모든 CALL 명령을 찾아 수정을 가하는게 아니고 테이블만 변경할수 있도록 하여 링크 속도를 높인다.

    ILT 테이블 예
    @ILT+0(_wmain):
    00401005 jmp wmain(401070h)
    @ILT+5 (??_GCResString@@UAEPAXI@Z)
    0040100A jmp CResString::'scalar deleting destructor' (401B40h)

    증분링크시 추가적인 패딩데이타가 실행파일에 추가되어 용량이 커진다.

    /INCREMENTAL:yes 또는 no로 설정할수 있고 이와 관련된 정보는 .ilk에 저장되어 사용된다.

    디버그 모드에서 실행중 수정하면서 진행하려면 증분링크로 빌드되어야 한다. (VS에서는 /DEBUG 시 자동적으로 /INCREMENTAL 이 지정된다.)

    그외에 /OPT:REF /OPT:ICF 를 선택하면 증분링크는 무시되고 비증분링크를 수행한다.

    API Hooking시 증분링크에 대한 체크가 필요하다.

    // 증분 링크 체크
    // Microsoft Visual C++은 실행중에도 코드를 수정할 수 있게끔
    // 증분 링크를 사용하여 함수의 주소가 실제 함수를 가리키지 않고, 실제 함수로 jmp 하는 명령의 주소로 되어 있다.
    // 참고: System DLL일 경우에 무시
    if ((DWORD)fnApi < 0x80000000 && *(PBYTE)fnApi == 0xE9)
    {
      fnApi = (PROC)((int)(fnApi) + (*(int *)((PBYTE)fnApi+1)) + 5);
    }

    2006/08/11 09:40 2006/08/11 09:40
    Trackback Address :: 이 글에는 트랙백을 보낼 수 없습니다

  • 윤제석 2006/08/11 23:42  댓글주소  수정/삭제  댓글쓰기
    홍선임님 그럼 해결책을 찾으셨내요!!

  • VS2005으로 작성한 코드가 다른 컴퓨터에서 작동을 안할때..
    2006/08/03 11:18
    이런 황당할때가...
    간단한 코드를 테스트하려고 VS.NET으로 작성한 MFC가 다른 VS.NET이 설치되지 않은 컴퓨터에서 작동하지 않는다.
    라이브러리를 복사해도 마찬가지고...

    응용 프로그램 구성이 올바르지 않기 때문에 이 응용 프로그램을 시작하지...

    혹은 msvcr80.dll 를 찾을수 없다는 에러가 난다면...

    해결방법 :

    1. VS.NET용 라이브러리
    릴리즈 버전은
    C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86
    디버그 버전은
    C:\Program Files\Microsoft Visual Studio 8\VC\redist\Debug_NonRedist
    에서 CRT, MFC, ATL에 맞는 dll을 실행파일과 같은 경로명에 복사해주면 된다.
    (Microsoft.VC80.*.manifest 도 포함해서)

    2. C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\BootStrapper\Packages\vcredist_x86 또는

    http://www.microsoft.com/downloads/details.aspx?FamilyID=32bc1bee-a3f9-4c13-9c99-220b62a191ee&DisplayLang=ko

    자신에 맞는(x86등등) 것을 다운받아서 설치하면 된다.


    원인 :

    Windows XP에서는 DLL Hell[각주]새로운 프로그램을 설치할때 다른 프로그램이 사용하는 DLL을 덮어 쓰거나 혹은 버전의 불일치로 오는 문제로 기존의 프로그램들이 제대로 동작하지 않는 경우가 있다.[/각주]을 빠져나가려고 Side-by-Side Assembly라는 개념을 만들었다. 이건 여러 버전의 DLL을 동시에 시스템에 존재할 수 있게 해주고, DLL을 사용하는 응용프로그램이 원하는 DLL 버전을 골라서 쓸 수 있도록 해주는 방법이다.
    SideBySideAssembly 의 강력한 점은 응용프로그램에서 직,간접적으로 로드하는 모든 DLL이 이 설정의 영향을 받는다는 것이다. 이전에는 응용프로그램이 로드한 DLL에 의해서 간접적으로 로드되는 DLL을 제어할 수 있는 방법이 없었다.

    이러한 새로운 방식으로 기존방식대로 VS.NET 라이브러리를 복사하는것으로 끝나지 않고 배포를 위한 별도의 작업이 필요하게 된다.

    문제 해결에 대한 페이지
    http://www.serious-code.net/moin.cgi/RedistributingVisualCppRunTimeLibrary
    http://www.codeproject.com/cpp/vcredists_x86.asp
    http://cafe.naver.com/solidcode.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=8
    2006/08/03 11:18 2006/08/03 11:18
    Trackback Address :: 이 글에는 트랙백을 보낼 수 없습니다

  • TWEETY 2006/08/04 09:09  댓글주소  수정/삭제  댓글쓰기
    VS 7.0부터 이런 일이 일어났던 거죠?
    괜히 7.0으로 개발했다가...
    한 참을 고생한 기억이 있어요.
    그 놈은 msvcr70.dll이 원인이었죠.
    찾아내는라 죽는 줄 알았음..-_-;;;
    PE?? 그런거 뒤져가지고 알아냈었어요. ㅠㅠ;
    • hongyver 2006/08/04 09:43  댓글주소  수정/삭제
      dll 이 문제가 아니라...
      CRT나 MFC,ATL의 배포라이브러러리를 같이 배포해도 예전같으면 같은 경로명에 있어도 실행이 당연 됐는데...
      그게 안되더라구...
      별도의 배포용 파일(vcredist_x86.exe)를 실행해주어야 한다는 사실...
      귀찮아 졌으...

  • 최적화(Optimization)
    2006/08/01 09:21
    비주얼스튜디오에서 릴리즈모드시 최적화 옵션은 Maxmize Speed(/O2)로 설정되어 있다.
    최종 컴파일시 실행코드를 가장빠른 코드로 실행 되도록 컴파일 하겠다는건데...
    아래의 예제를 보자...

    for ( int i = 0; i < 100; ++i )
    {
        j = sqrtf( 0.5f ) * function(1.0, 2.0);
      // 다른 작업수행
    }
    최적화 옵션을 키고 컴파일을 수행한다면...
    j = sqrtf( 0.5f ) * function(1.0, 2.0);
    for ( int i = 0; i < 100; ++i )
    {
      // 다른작업 수행
    }


    j의 값이 for문 내부에서 변하지 않으니 for문 밖에서 한번의 계산을 수행하여 속도를 높이겠다는 의도인데...
    만약 function 내부에서 j값을 참조하여 값이 변한다거나 다른 Thread에서 j값을 참조한다거나 하면...(과장된 가정이긴하다...)
    의도와는 달리 배는 산으로 간다...

    늘 그렇듯이 최고가 능사는 아니다 싶다...
    최적화옵션은 써야하고 그러한 문제를 방지하고 싶다면 volatile 라는 키워드를 사용하면 된다.
    volatile int j; 라고 선언하면 된다.
    2006/08/01 09:21 2006/08/01 09:21
    Trackback Address :: 이 글에는 트랙백을 보낼 수 없습니다


    컴퓨터 견적...
    2006/07/29 00:15

    어머니 성화에 못 이기는척...하면서 은근슬쩍 내가 원하는 사양을...
    대충 골라 보니...

    인텔 코어 2 듀오 [각주]이른바 콘로, 펜티엄이란 이름은 이제 프로세서 시장에서 사라진다. 10년간 데스크탑PC 의 프로세서용으로 많은 모델을 출시한 펜티엄은 펜티엄D를 끝으로 [코어2듀오]란 이름의 새로운 프로세서로 대체된다.[/각주]E6400 [2.13Ghz, FSB 1066MHz, L2 2MB]
    아수스(에스티컴) P5W DH Deluxe 콘로 [Core 2 Duo][Intel 975x, LGA775]
    디지웍스 2GB DDR SDRAM [각주]콘로의 성능을 제대로 끌어내기 위해서는 DDR2 800의 램을 사용하면 좋다.[/각주][PC6400, DDR800]
    웨스턴디지털 WD 1600JS 160GB SATA2[각주]IDE방식에서 SATA방식으로 단순히 속도만 빨라지는게 아니다. Plug&Play도 지원[/각주] 8MB [7200rpm]
    삼성전기 3.5인치 FDD SFD-321B/LBL2 [블랙]
    아수스(에스티컴) 지포스 EN6600 TD 256MB 128bit [PCi-E]
    LG 플래트론 L1740PQ
    LG전자 16X DVD-ROM GDR-8164B
    마이크로닉스 ML-10 올블랙 [파워별도,ATX]
    ZM 360B-APS
    앤디코 AiO 이지랙 300 블랙 (5.25인치 베이 장착형)
    넷메이트 NMU702 Plus (3.5  내외장 카드리더기/XD지원)
    직접 조립을 할까? 이만원주고 조립을 해달라고 할까?
    목하 고민중...

    포토샵이고 뭐고 막 날라다닐듯 해서...
    컴퓨터 본체 근처에 방충막을 쳐야겠어...
    2006/07/29 00:15 2006/07/29 00:15
    Trackback Address :: 이 글에는 트랙백을 보낼 수 없습니다

  • maro 2006/07/31 14:52  댓글주소  수정/삭제  댓글쓰기
    이제 팬티엄은 없구나 .. 우후훗
    하드에 관심 끊은지 언~~~ 수억년
    뭔소린지 암것도 몰것당 @.@
  • maro 2006/08/01 16:43  댓글주소  수정/삭제  댓글쓰기
    아하하핫 .. 알려주삼

  • 재밌는 코드...
    2006/07/27 08:52
    직업이 직업이다보니...
    남이 작성한 코드를 보다가 실로 경악을 금치못하는 코드를 볼때...
    난 썅칼라[각주][감탄사] 놀랍거나 혹은 일이 잘 안풀린데 하는말. 유사단어로 제기랄, 젠장, 된장등이 있음 [/각주]를 외친다...

    + swap 할때 temp 변수가 꼭 필요할까?
    void swap(int &a, int &b)
    {
      a = a + b;
      b = a - b;
      a = a - b;
    }
    XOR 를 이용하면 더 좋다.
    void swap(int &a, int &b)
    {
      a ^= b ^= a ^= b;
    }


    +  주석처리
    번갈아 가면서 테스트 해야할때 아래처럼 주석처리 해놓으면...
    //*/
    int a = 10;
    /*/
    int a = 20;
    //*/
    아랫줄이 필요하다면...
    /*/
    int a = 10;
    /*/
    int a = 20;
    //*/


    + 리턴값으로...
    if((code >= KEYCODE_0) && (code <= KEYCODE_9))
    {
      if(ShiftKeyPressed())
      {
           return ")!@#$%^&*("[code - KEYCODE_0];
      }
      else
      {
           return '0' + (code - KEYCODE_0);
      }
    }



    아! 머리좋은 인간들이여...코딩하지말고 정치해라...

    2006/07/27 08:52 2006/07/27 08:52
    Trackback Address :: 이 글에는 트랙백을 보낼 수 없습니다

    1. Subject: 코드 주석 처리 팁

      Tracked from RERIC.COM 2006/07/27 09:27  삭제

      두 개의 서로 다른 코드로 테스트 할 때 유용하다. /**/ Run here /*/ code /**/ /** code /*/ Run here /**/ via http://eclipsians.net/more.php?id=37_0_1_10_M //*/ Run here /*/ code //*/ //* code /*/ Run here //*/ via http://hongyver.pe...

  • TWEETY 2006/07/27 13:49  댓글주소  수정/삭제  댓글쓰기
    return ";)!@#$%^&*("[code - KEYCODE_0];

    이게 모에요??? -.-a
    • hongyver 2006/07/27 14:02  댓글주소  수정/삭제
      "!@#$%^&*("[0] = !
      "!@#$%^&*("[1] = @

      즉 "!@#$%^&*(" 는 배열의 포인터고..
      배열[n] 번째 값을 취한다는거지...
  • 우스 2007/02/01 00:24  댓글주소  수정/삭제  댓글쓰기
    썅칼라!!!!!!!!!!!!!!!!!!!!!!!!!!! 우와~~~~
  • 김순철 2007/03/04 10:05  댓글주소  수정/삭제  댓글쓰기
    어허! 좋은 내용이네요. 퍼가도 되죠? 퍼갈께요~
  • 구루마루 2008/11/26 12:16  댓글주소  수정/삭제  댓글쓰기
    이야.. 마지막 부분은 생각도 못했던 코드군요.

  • 시계
    2006/07/11 18:13

    바코드 시계 너무 맘에 드는걸?
    손목시계로 나온다면 구매할 용의 있음.


    이런 시계도 있다우...

    근데 왜 자바코드는 안붙을까? 흠
    2006/07/11 18:13 2006/07/11 18:13
    Trackback Address :: 이 글에는 트랙백을 보낼 수 없습니다

  • maro 2006/07/13 08:09  댓글주소  수정/삭제  댓글쓰기
    바코드시계 ... 맨유에서 지성씨한테 칩 넣는 것 같은 기분
  • maro 2006/07/14 08:12  댓글주소  수정/삭제  댓글쓰기
    맨유에서 선수들에게 칩을 살짝 심어서
    효과적인 훈련을 체크한다고 발표했었어욤
    축구하는 기계를 만들려하는건지 ....

    바코드를 보면 그런쪽으로 생각이 흘러서 훔훔훔
    • hongyver 2006/07/14 08:28  댓글주소  수정/삭제
      아하...
      진작 그렇게 설명해야지...
      이번주는 어디 출사 안가? 연휴인데...