All posts by Chun Kang

정채봉 – 오늘의 명언

 

해가 들면 어떻고,
바람이 불면 어떻고,
눈이 오면 어떠랴.

해가 들어주어도 고맙고,
바람이 불어주어도 고맙고,
눈이 와주어도 고마울 뿐.

그렇다, 고맙지 않은 것이 없다.

밤은 밤이어서 고맙고,
새벽은 새벽이어서 고맙고,
낮은 낮이어서 고맙다.

아, 고마운 삼라만상이여!

윤영돈 – 한 번 쓰러지면 일어나기 힘들다.

많은 사람들이 실패는 성공의 어머니다 말한다.

하지만, 그 실패가 치명적인 실수라면 결코 성공의 어머니가 될 수 없다. 특히 자기가 어떤 환경에 놓여있는지 우선 파악하는 것이 매우 중요하다.



二曰天

이왈천 <시계편計篇第>

이기기 위해 두 번째로 중요한 것은 기상조건이다.



당신은 지금 주위를 둘러보라.

어디에 있는가? 화장실에, 사무실에, PC방에 장소에 따라 어울리는 행동이 있기 마련이다.

자기 경영은 주위 환경에 따라 다른 방법으로 승부해야 한다.

지금 억수 같은 비가 오는데, 우산이 없다면 어떻게 할 것인가.



출퇴근이 정해진 회사원이라면 잘못된 시간관리로 시간이 없어 자기계발을 하지 못한다는 핑계를 대서는 안된다.

똑같은 일을 주더라도 어떤 사람은 단 몇시간 만에 자신의 할 일을 다하는 반면, 어떤 사람은 어떻게 처리해야 할 지 고민하느냐고 몇일이 걸릴지 모른다. 중요도에 따라서 실수도 용납될 수 있으냐 없으냐가 문제인 것이다. 즉 자신이 처해 있는 환경을 정확하게 파악해서 한 번 실수로 쓰러지지 않도록 노력해야 할 것이다.

아라시 – 사쿠라 사케

아라시의 사쿠라 사케


握りしめた手が何か言う &#39366;け出せば間に合うさと
니기리시메타테가나니카유- 카케다세바마니아우사토
꽉 잡은 손이 뭔가 말했어 달려나가면 시간에 맞출수 있을거라고
コンビにで&#38609;誌立ち&#35501;みしてた 昨日の僕に Bye-Bye
콤비니데잣-시타치요미시테타키노-노보쿠니바이바이
편의점에 서서 잡지를 읽던 어제의 나에게 바이바이
走り出した街の音は &#27475;&#22768;のよう
하시리다시타마치노오토와칸-세이노요-
달려나갔던 거리의 소음은 환호성 같아
サクラ&#21682;け 僕の胸のなかに 芽生えた名もなき夢たち
사쿠라사케보쿠노무네노나카니메바에타나모나키유메다치
벚꽃이여 피어라! 나의 가슴 속에 싹튼 이름없는 꿈들
振り向くな 後ろには明日はないから前を向け
후리무쿠나우시로니와아스와나이카라마에오무케
돌아보지마 뒤에는 내일은 없으니까 앞을 향해라!

&#39365;前で誰か歌ってる それは君の好きな歌
에키마에데다레카우탓-테루소레와키미노스키나우타
역 앞에서 누군가 노래하고 있어 그건 그대가 좋아하는 노래
遠く離れても決して消えない だから別れじゃない
토오쿠하나레테모켓시테키에나이다카라와카레쟈나이
멀리 떨어져도 결코 사라지지 않아 그러니 이별이 아니야
いつかふたり 望む場所でめぐり合いたい
이쯔카후타리노조무바쇼데메구리아이타이
언젠가 둘이서 바라는 장소에서 다시 만나고싶어
サクラ&#21682;け 君の胸のなかで&#25594;れてた小さな&#34174;よ
사쿠라사케키미노무네노나카데유레테타치이사나츠보미요
벚꽃이여 피어라! 그대의 가슴 속에 흔들리던 자그마한 봉오리여
負けないように くじけないように 今歌うから
마케나이요-니쿠지케나이요-니이마우타우카라
지지 않도록 꺾이지 않도록 지금 노래할테니

未&#26469;なんてさ すぐに&#22793;わる &#22793;えてみせる
미라이난테사스구니카와루카에테미세루
미래따윈 금방 변해 바꿔보이겠어

(RAP)
「右へ ならえ」から 踏み出すこの一&#27497;を
미기에나라에카라후미다스코노입-뽀오
「오른쪽에 정렬」로부터 내딛는 이 한 걸음을
打った点が分ける結果 陰と陽
웃타텐카와케루켁카 인토요-
쳤던 부분이 나누는 음과 양
だから 知っとこう 生きるヒントを
다카라싯토코- 이키루힌토오
그러니까 알아두자 살아가는 힌트를
かすむ蜃&#27671;&#27004;すらも つかむ勢い
카스무신키로-스라모쯔카무이키오이
희미해지는 신기루조차도 잡을 기세로
今蒔けば 種 花 &#21682;かす
이마마케바타네하나사카스
지금 뿌린 씨앗이 꽃을 피울거야
やった後 言うなら まだ分かるんだ
얏타아토유-나라 마다와카룬다
해낸 다음 말해보면 알수 있을거야
そう そりゃ 時間なんてのは かかる
소- 소랴 지칸난테노와카카루
그래, 그야 시간이 걸리겠지
春には 大きな花を&#21682;かす
하루니와오오키나하나오사카스
봄에는 커다란 꽃을 피울거야

めぐり合いたい 必ず
메구리아이타이 카나라즈
만나고 싶어 반드시

サクラ&#21682;け 君の胸の中で&#25594;れてた小さなつぼみよ
사쿠라사케키미노무네노나카데유레테타치이사나츠보미요
벚꽃이여 피어라! 그대의 가슴 속에 흔들리던 자그마한 봉오리여
負けないように くじけないように 今歌うから
마케나이요-니쿠지케나이요-니이마우타우카라
지지 않도록 꺾이지 않도록 지금 노래할테니
サクラ&#21682;け 僕の胸の中に芽生えた名もない夢たち
사쿠라사케보쿠노무네노나카니메바에타나모나키유메다치
벚꽃이여 피어라! 나의 가슴 속에 싹튼 이름없는 꿈들
振り向くな 後ろには明日はないから前へ前へ
후리무쿠나우시로니와아스와나이카라마에에마에에
돌아보지마 뒤에는 내일은 없으니까 앞으로, 앞으로-

wave 파일 mixing 하기. (웨이브 믹싱)

용도는.. 배경음에다 목소리 합칠때 사용하는 겁니다.
검증은 좀 덜됐지만, 이런식으로 하면.. 얼마든지 응용이 가능할꺼 같네요.
그럼.. 문제 있으시면 답글 부탁드립니다.
 
 
 
// WAVE 파일을 Mixing 한다. – 배경음 + 목소리용
// [in] pFile1 : 목소리 파일
// [in] pFile2 : 배경음 파일(목소리 파일보다 커야한다.)
// [in]nPreMargineSec : 몇초 후부터 음성을 합칠것인가. (배경음만 출력되는 초기시간)
 
int WavFileMix(char *pFile1, char *pFile2, char *pFileRes, int nPreMargineSec)
{
    int len1, len2, len;
    short *in1, *in2;
    short *out;
    char pWaveHeader[44];
 
    CFile cf1, cf2, cfRes;
 
    if(!cf1.Open(pFile1, CFile::modeRead)) {
        return -1;
    }
 
    if(!cf2.Open(pFile2, CFile::modeRead)) {
        return -1;
    }
 
    DWORD dwFileSize1 = cf1.GetLength();
    len1 = dwFileSize1 – 44;
 
    DWORD dwFileSize2 = cf2.GetLength();
    len2 = dwFileSize2 – 44;
 
    int nRead2 = cf2.Read(pWaveHeader, 44);         // wave 헤더를 읽어온다.
    if(nRead2 <= 0)
        return -1;
 
    int nSamplesPerSec;
    memcpy(&nSamplesPerSec, &pWaveHeader[24], 4);   // 초당 샘플링을 읽어온다.
 
    if(len1 > len2)
        len = len1;
    else
        len = len2;
    
    in1 = (short*)malloc(sizeof(short)*len1);
    in2 = (short*)malloc(sizeof(short)*len2);
    out = (short*)malloc(sizeof(short)*len);
 
    cf1.Read(in1, len1);
    cf1.Close();
    
    cf2.Read(in2, len2);
    cf2.Close();
 
    // wave data mix
    WavMix(in1, in2, out, len1, len2, nPreMargineSec, nSamplesPerSec);
    
    //save output file  
    if(!cfRes.Open(pFileRes, CFile::modeCreate | CFile::modeWrite)) {
        free(in1);
        free(in2);
        free(out);
        return -1;
    }
 
    cfRes.Write(pWaveHeader, 44);                   // wave 헤더를 먼저 기록.
    cfRes.Write(out, len);
    cfRes.Close();
 
    free(in1);
    free(in2);
    free(out);
 
    return 0;
}
 
// Music + Voice 용도로만 사용한다. (목소리 재생시 배경음악은 볼륨을 낮춘다.)
// WAVE 데이터를 합성한다.
void WavMix(short *in1, short *in2, short *out, int nVoiceSize, int nMusicSize, int nPreMargineSec, int nSamplesPerSec)
{
    int i;
    float tmp;
    float nTemp;
 
    int nVoiceMute = nSamplesPerSec * nPreMargineSec/*초*/;
 
    for(i = 0 ;i < nMusicSize; i++)
    {
        if(i < (nVoiceSize/2)+nVoiceMute)
        {
            if( i >= nVoiceMute && i < nVoiceMute+20)
            {
                // 합쳐지는 부분의 순간 잡음을 없애기 위해.
                // 추후 Fade Out , Fade In 사용예정
                out[i] = 0;
            }
            else if(i < nVoiceMute)
            {
                // 앞에 x초는 배경음만
                out[i] = (short)in2[i];
            }
            else
            {
                // 합친다. (합친후 다시 나누기할때의 배율은 입맛에 맞게 조절한다.)
                nTemp = in1[i-nVoiceMute];
                nTemp += (float)(in2[i]*0.7);
                //tmp = (float)(nTemp / 2.0);
                tmp = (float)(nTemp / 1.7);
 
                out[i] = (short)tmp;
            }
        }
        else
        {
            // 배경음 뒷부분은 그대로..
            out[i] = (short)in2[i];
        }
    }
}

ATL/ActiveX 에서 자바스크립트로 데이터(문자열) 보내기

음.. 보통 param 으로 엑티브X로 값을 넘겨 받아서 쓰는데요

그 반대도 궁금해서 찾아봤더니 자료가 별로 없더군요.

혹시나 해서 올립니다.

1. 클래스뷰 인터페이스항목에서 메서드를 추가합니다

2. 매개 변수 형식을 VARIANT*  로 하고 특성에 out과 retval을 설정합니다. (메서드 이름과 변수 이름은 적당히…)

3. 구현부분을 다음과 같이 합니다.

STDMETHODIMP CTest::TestMethod(VARIANT* pVal)
{
    // TODO: 여기에 구현 코드를 추가합니다.
    pVal->vt=VT_BSTR;    // VARIANT 속성을 문자열로 합니다.
    pVal->bstrVal=L”테스트합니다. 이문자를 전송합니다.”;
    return S_OK;
}
 

4. 자바스크립트 추가
 

<script language=”JavaScript”>
<!–
function MyTest()
{
    var v_test;
    v_test=document.Test.TestMethod();
    alert(v_test);
}
//–>
</script>

 

<OBJECT  ID=”Test” …. >

<input type=”button” value=”문자열 받기” onClick=”MyTest();”>

 

 

 

요기서 주목할건 
 

v_test=document.Test.TestMethod();  이부분 입니다.
 

메서드 추가시 retval 항목을 선택하면 실제 리턴값은 pVal값이 됩니다. S_OK의 리턴값은 확인할수 없습니다만 ㅠ
 

신기한게 자바는 원래 포인터를 따로 쓰는게 아니라 가끔 원하지 않는 동작이 나더군요…
 

(이걸 전문용어로 설명할수 없습니다 ㅠ)
 

예를 들어 아래 처럼 하면 에러가 납니다.
 

 

retval 항목을 끄고
 

document.Test.TestMethod(v_test); 
 

라고 하면 될것 같지만 대번 에러납니다. 실력이 모자란 관계로 처음에 무척당황했습니다 -_-a
 

실제 디버그 해보면
 

STDMETHODIMP CTest::TestMethod(VARIANT* pVal)   ->   이부분에서 pVal값이 NULL이 나옵니다. ㅠ
 

이상 허접한 팁이었습니다 ㅠ
 

한분에게라도 작은 도움이 되었으면 하는 바람입니다. 🙂

System Log-Off, Suspend, Reboot, Shutdown 시키기

윈도우에서 시스템 Shutdown, Reboot, Log-Off는 ExitWindowsEx 함수로, Suspend는 SetSystemPowerState 함수로 가능합니다.
윈도우 NT를 베이스로 하는 2000, XP의 경우는 시스템을 컨트롤 하기 위해서는 권한을 변경하는 과정이 필요합니다.
 
BOOL IsWindowsNT()
{
    OSVERSIONINFO verInfo;
    verInfo.dwOSVersionInfoSize = sizeof(verInfo);
    GetVersionEx(&verInfo) ;
    switch(verInfo.dwPlatformId)
    {
        case VER_PLATFORM_WIN32_WINDOWS:
              return FALSE;
        case VER_PLATFORM_WIN32_NT:
              return TRUE;
     }
   return FALSE;
}

BOOL AdjustSystemForShutdown()
{
        if(IsWindowsNT() == FALSE)
               return FALSE ;

        HANDLE hTk;
        TOKEN_PRIVILEGES tp;

        /* Get a token for this process. */
        if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hTk))
                return FALSE;

        /* Get the LUID for the shutdown privilege. */
        LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tp.Privileges[0].Luid);

        tkp.PrivilegeCount = 1; /* one privilege to set */
        tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

        /* Get the shutdown privilege for this process. */
        return AdjustTokenPrivileges(hTk, FALSE, &tp, 0, (PTOKEN_PRIVILEGES)NULL, 0);
}
 

이렇게 해서, 권한 변경에 성공하면 ExitWindowsEx, SetSystemPowerState 함수로 자신이 원하는 대로 시스템을 컨트롤 할 수 있습니다.
 
     // Windows 2000, XP       
     // Log Off
      ExitWindowsEx(EWX_LOGOFF|EWX_FORCEIFHUNG , SHTDN_REASON_FLAG_PLANNED );  

       // Shutdown
       ExitWindowsEx(EWX_POWEROFF|EWX_FORCEIFHUNG , SHTDN_REASON_FLAG_PLANNED ); // NT
 
       // Reboot
       ExitWindowsEx(EWX_REBOOT|EWX_FORCEIFHUNG,SHTDN_REASON_FLAG_PLANNED );

       // Suspend
       SetSystemPowerState(TRUE, TRUE ); // force suspend
 
      // Windows 95, 98, ME
      // Log Off
      ExitWindowsEx(EWX_LOGOFF|EWX_FORCE , 0 );  

       // Shutdown
       ExitWindowsEx(EWX_SHUTDOWN|EWX_FORCE, 0 ); // Windows 98, Windows ME

       // Reboot
       ExitWindowsEx(EWX_REBOOT|EWX_FORCE, 0 );

       // Suspend
       SetSystemPowerState(TRUE, TRUE ); // force suspend

GDI+ 에서 이미지 반투명 처리하기..

GDI 에선 AlphaBlend 라는 함수로 가능하기는 하는데

찍을 부분의 이미지 색상과 혼합을 해야 제대로 구현이 됩니다

계산식이야 MSDN 에도 있고 여기 Q&A 에 검색해도 있습니다.

AlphaBlend 로 하다가 계산하는거 짜증나서

GDI+ 찾아 보니까 있더군여..

MSDN 에서 발췌했습니다.

여기 검색해봐도 없길래… 갖다 붙여 넣습니다… 참고하세요..

 

 
Using a Color Matrix to Set Alpha Values in Images

The Bitmap class (which inherits from the Image class) and the ImageAttributes class provide functionality for getting and setting pixel values. You can use the ImageAttributes class to modify the alpha values for an entire image, or you can call the SetPixel method of the Bitmap class to modify individual pixel values. For more information on setting individual pixel values, see Setting the Alpha Values of Individual Pixels.

The following example draws a wide black line and then displays an opaque image that covers part of that line.

Bitmap bitmap(L”Texture1.jpg”);
Pen pen(Color(255, 0, 0, 0), 25);

// First draw a wide black line.
graphics.DrawLine(&pen, Point(10, 35), Point(200, 35));

// Now draw an image that covers part of the black line.
graphics.DrawImage(&bitmap,
   Rect(30, 0, bitmap.GetWidth(), bitmap.GetHeight()));

The following illustration shows the resulting image, which is drawn at (30, 0). Note that the wide black line doesn’t show through the image.

The ImageAtributes class has many properties that you can use to modify images during rendering. In the following example, an ImageAttributes object is used to set all the alpha values to 80 percent of what they were. This is done by initializing a color matrix and setting the alpha scaling value in the matrix to 0.8. The address of the color matrix is passed to the SetColorMatrix method of the ImageAttributes object, and the address of the ImageAttributes object is passed to the DrawImage method of a Graphics object.

 

 

// 다음 코드가 반투명 효과를 일으키게하는 소스이며.. 주석과 같이 4행4열의 0.8값을 주의깊게 보십시요

// 이 값을 바꿔주면서 이미지를 확인해 보시면 잘 알수 있을겁니다…

// 그럼.. 참고하세요..

 

 

// Create a Bitmap object and load it with the texture image.
Bitmap bitmap(L”Texture1.jpg”);
Pen pen(Color(255, 0, 0, 0), 25);

// Initialize the color matrix.
// Notice the value 0.8 in row 4, column 4.
ColorMatrix colorMatrix = {1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
                           0.0f, 1.0f, 0.0f, 0.0f, 0.0f,
                           0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
                           0.0f, 0.0f, 0.0f, 0.8f, 0.0f,
                           0.0f, 0.0f, 0.0f, 0.0f, 1.0f};

// Create an ImageAttributes object and set its color matrix.
ImageAttributes imageAtt;
imageAtt.SetColorMatrix(&colorMatrix, ColorMatrixFlagsDefault,
   ColorAdjustTypeBitmap);

// First draw a wide black line.
graphics.DrawLine(&pen, Point(10, 35), Point(200, 35));

// Now draw the semitransparent bitmap image.
INT iWidth = bitmap.GetWidth();
INT iHeight = bitmap.GetHeight();
graphics.DrawImage(
   &bitmap,
   Rect(30, 0, iWidth, iHeight),  // Destination rectangle
   0,                             // Source rectangle X
   0,                             // Source rectangle Y
   iWidth,                        // Source rectangle width
   iHeight,                       // Source rectangle height
   UnitPixel,
   &imageAtt);

During rendering, the alpha values in the bitmap are converted to 80 percent of what they were. This results in an image that is blended with the background. As the following illustration shows, the bitmap image looks transparent; you can see the solid black line through it.

Where the image is over the white portion of the background, the image has been blended with the color white. Where the image crosses the black line, the image is blended with the color black.

자기자신 IP알아내기(로칼컴퓨터)

^^.
여러가지 방법이 올라와 있지만 제 컴에는 이넘 밖에 되지 않았습니다.
Test 컴파일러 : VC++6.0 , VC++.NET
 
 
#include <windows.h>
#include <winsock.h>
#include <stdio.h>
#pragma comment(lib, “ws2_32.lib”)
 
 
 
 CString CLogToNmdDlg::GetMyIp(void)
{  
    CString strHostName=””;
    CString strLocalIP=””;
 
    char  szHostName[512] = { 0, };
    DWORD dwIP    = inet_addr(“1.2.3.4”);
    PBYTE pIP     =  (PBYTE)(&dwIP);
    DWORD dwTest  = dwIP;
    printf(“%03d %03d %03d %03d
“, pIP[0], pIP[1], pIP[2], pIP[3]);
    printf(“%03d %03d %03d %03d

        , (dwTest >> 24) & 0x000000FF
        , (dwTest >> 16) & 0x000000FF
        , (dwTest >>  8) & 0x000000FF
        ,  dwTest        & 0x000000FF
        );
    if((dwTest & 0x000000FF) != pIP[4]) //printf(“당신의 시스템은 ‘호스트 바이트 오더’를 사용합니다
“);
        AfxMessageBox(“당신의 시스템은 ‘호스트 바이트 오더’를 사용합니다
“);
    else                                //printf(“당신의 시스템은 ‘네트워크 바이트 오더’를 사용합니다
“);
        AfxMessageBox(“당신의 시스템은 ‘네트워크 바이트 오더’를 사용합니다
“);
 
 
    GetMyNetworkInfo(&dwIP, szHostName, 512);
    //printf(“당신의 호스트 네임 : %s
“, szHostName);
    strHostName.Format(“당신의 호스트 네임 : %s”, szHostName);
    //printf(“당신의 아이피 주소 : %d.%d.%d.%d
“, pIP[0], pIP[1], pIP[2], pIP[3]);
    strLocalIP.Format(“당신의 아이피 주소 : %d.%d.%d.%d”, pIP[0], pIP[1], pIP[2], pIP[3]);
    //AfxMessageBox(strLocalIP);

    return strLocalIP;
}
 
BOOL CLogToNmdDlg::GetMyNetworkInfo(DWORD* pdwIP, char* szHostName, int nHostNameLength)
{
    // 인자확인
  if(!pdwIP || !szHostName || (0 >= nHostNameLength)) return false;
 
  // WSAStartup() 실행.
  WSADATA wsaData;
  WORD    wVersion = MAKEWORD(1, 1);
  if(WSAStartup(wVersion, &wsaData) == 0)
  {
    // 버전확인.
    if(wsaData.wVersion >= wVersion)
    {
      // 나의 호스트 네임 알아오기.
      if((gethostname(szHostName, nHostNameLength)) == 0)
      {
        // 나의 호스트 상세성보 알아 오기(IP알아오기)
        HOSTENT *HostEnt = gethostbyname(szHostName);
        if(HostEnt)
        {
          (*pdwIP) = (*(DWORD*)HostEnt->h_addr);
          sprintf(szHostName, HostEnt->h_addr + 4);
        }
      }
    }
 
    // WSACleanup() 실행.
    WSACleanup();
    return false;
  }
  return false;
}

프로세스명으로 프로세스 죽이는 함수

/*
    사용법 : ExitProcessName(“IEXPLORE.EXE”); //한줄이면 됨..ㅋ
*/

#include “psapi.h” // Psapi.lib 라이브러리 추가 해야 됨 [VS 2003 프로젝트 속성-링커-입력-추가종속성]에 넣어줄것 [VS6.0-project-settings-Link 탭에 Object/library modles에 넣어 줄것! ]

//psapi.h MS에서 지원해주는 거임 2003은 그냥 컴파일되나 6.0은 SDK 설치 해야 됨..

 

void ExitProcessName(CString strProcessName)
{
    DWORD aProcesses[1024], cbNeeded, cProcesses;
    unsigned int i;

    if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
        return;

    // Calculate how many process identifiers were returned.
    cProcesses = cbNeeded / sizeof(DWORD);

    // Print the name and process identifier for each process.

    for ( i = 0; i < cProcesses; i++ )
    {
        char szProcessName[MAX_PATH] = “unknown”;

        HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
            PROCESS_VM_READ,
            FALSE, aProcesses[i] );
 

        if (NULL != hProcess )
        {
            HMODULE hMod;
            DWORD cbNeeded;

            if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod),
                &cbNeeded) )
            {
                GetModuleBaseName( hProcess, hMod, szProcessName,
                    sizeof(szProcessName) );
            }
        }

        bool bRet;

            if(strcmp(szProcessName,(LPSTR)(LPCTSTR)strProcessName)==0)
            {
                HANDLE hProcess = NULL;

                hProcess = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, aProcesses[i]);
                if(hProcess != NULL)
                {        
                    DWORD    ExitCode = 0;

                    GetExitCodeProcess( hProcess, &ExitCode );
                    bRet = ::TerminateProcess(hProcess, ExitCode );                

                    if( bRet )
                    {
                        ::WaitForSingleObject(hProcess, INFINITE);
                    }

                    ::CloseHandle(hProcess);
                }
            }
            CloseHandle( hProcess );
    }
}

빈폴더 찾아내기

주어진 경로 하위에 위치한 빈폴더를 모두 찾아내 삭제하는 함수입니다.

수정해야 할부분이 있다면 알려주세요 ^^




BOOL DelEmptyFolder(CString strPath)
{       
    CFileFind finder;
    int nValidCnt = 0;

    BOOL bWorking = finder.FindFile(strPath + “*.*”);

    
    while (bWorking)
    {
        bWorking = finder.FindNextFile();

        if(finder.IsDots()) continue;
        else if(finder.IsDirectory())
        {
            if(DelEmptyFolder(finder.GetFilePath()) == TRUE)
                nValidCnt++;                
        }
        else
            nValidCnt++;        
    }

    if(nValidCnt == 0)
    {
        // 폴더 삭제 명령 작성할 위치
        cout << “Del: ” << (LPCTSTR)strPath << endl;
        return FALSE;
    }

    return TRUE;
}

Virtusertable

참고 ~ http://www.oops.org/lecture.php?n=4&sb=sendmail


이 part는 virtual hosting시에 여려명의 user가 서로 같은 계정을 요구할때의 곤란함을 해결하기 위한 방법을 제시한다. 이 방법은 sendmail의 virtual user table을 이용하며 sendamil의 compile 방법 및 기본 설정에 대해서는 KLDP에 한글 자료가 있으니 참고하기를 바라고, 이 강좌에서 설정할 virtual user table 기능을 추가하기 위해서는 sendmail의 공식 홈페이지에서 virtual hosting 관련 page를 참고하기 바란다. 또는 FTP 의 sendmail을 이용하는 것도 가능하다. 또한 요즘의 왠만한 배포본에 들어 있는 sendmail 의 경우에는 기본적으로 지원을 하는 추세이다.



Hanterm – cat /etc/mail/virtusertable

[root@oops mail]# cat virtusertable

# 이 file은 virtual user를 설정하는 file이다.
# 실제로 없는 계정을 mapping 할수 있으며, 같은 이름 역시
# domain 별로 다르게 mapping 할수 있다.
#                                                                      
# 작성후
# makemap hash /etc/mail/virtusertable < /etc/mail/virtusertable
# 명령을 실행 해 줘야 한다.
#
#                  작성  김정균. <admin at oops.org>      

admins@oops.org bbuwoo@chollian.net
sales@oops.org oops
help@oops.org oops
                                                  
admins@abc.co.kr abc
sales@abc.co.kr abc
help@abc.co.kr abc@abc-kr.co.kr      
@abc.co.kr error: nouser Unknown User

@asdf.com asdf
@bbc.co.kr %1@other.oops.org

[root@oops mail]#





이 file은 sendmail의 virtual user를 이용하기 위한 설정 file이다. virtual user table을 이용하기 위해서 즉, 이 file을 이용하기 위해서는 /etc/mail/sendmail.cf에서


Kvirtuser hash /etc/mail/virtusertable
과 virtual user handle 이 정의 되어 있어야 하며 FTP 에서 받은 package에는 미리 이 설정들을 정의를 해 놓았으니 걱정할 필요는 없다.

그럼 위의 file에서 설정한 것들에 대해 간단하게 설명을 하겠다. 이 설정으로 보아 이 설정 file이 존재하는 host에는 oops.org 이라는 domain과 abc.co.kr 이라는 2개의 domain을 가지고 있는 것으로 예상을 할수가 있다. 그리고 대충 눈치를 보아서 oops라는 계정과 abc라는 계정을 가지고 있다는 것도 눈치가 빠른 사람이라면 금방 알수 있을 것이다.

그럼 간단하게 세 줄을 가지고 이 file에 대해서는 설명을 할수가 있다.


admins@oops.org bbuwoo@chollian.net
admins@abc.co.kr abc
@asdf.com asdf


보통 sendmail에서 위의 하나의 host에 여러개의 account를 가지고 있다고 해도 e-mail address의 ID가 같다면 모두 동일한 계정으로 가게된다. 하지만 sendmail 의 Virtual User Table을 사용하여 위와 같이 설정을 함에 따라 admin이라는 계정이 없음에도 불구하고 또한 같은 account 임에도 불구하고 mail address의 domain에 따라서 admins@oops.org으로 가는 mail은 bbuwoo@chollian.net 으로 mapping 하며, admins@abc.co.kr 으로 가는 mail을 abc 라는 계정으로 갈수 있게 하는 것이다. 앞부분은 가상의 e-mail account가 되는 것이며 뒷부분은 가상의 e-amil address로 오는 mail을 실제로 받는 계정이 된다. 또한 마지막 예는 asdf.com으로 보내는 메일은 어떤 계정으로 보내더라도 모두 asdf 라는 계정으로 메일을 가게 하는 것을 뜻한다.

localhost의 account로 mapping을 할수도 있으며, 다른 host의 account로도 mapping이 가능하다. 이 virtual user table을 잘만 이용한다면 aliases는 별 사용할 필요가 없어 지기도 한다.

그럼 다음의 예를 보도록 한다.


  @abc.co.kr error: nouser Unknown User
  @bbc.co.kr %1@other.oops.org


위에서 이 설정들의 용도를 살펴 보자면 일단 첫번째줄 부터 설명을 하겠다. 첫번째 줄의 경우 admins@abc.co.kr, sales@abc.co.kr, help@abc.co.kr 외에 abc.co.kr 이라는 도메인으로 오는 메일들은 virtusertable에서는 해당 설정이 없기 때문에 다음 단계인 aliases file로 넘어가게 되며 aliases에서도 해당 설정이 없으면 실제 계정을 찾게 된다. 그럼 문제는 대형 메일 서버일경우 이렇게 실제 계정을 찾는 단계까지 갔음에도 불구하고 없는 계정이라면 상당한 서버 부하를 가져 올수도 있는 문제가 발생한다. 그래서 이 설정을 함으로서 admin, sales, help 외의 계정으로 abc.co.kr이라는 도에민으로 오는 메일들은 virtusertable 차원에서 return을 시켜 버리는 역할을 하게 되는 것이다. 잘 사용하면 그만큼 부하를 낯출수도 있는 것이다.

그럼 다음줄을 보면 이상한 것을 볼수 있다. 즉 “%1” 이라는 표현법을 볼수 있다. 이 %1은 실제 메일 header에 들어 있는 메일 주소의 account부분 즉 admins@abc.co.kr로 온 메일이라면 이중 admin 을 %1에 match를 하게 된다.

이 file의 설정을 끝냈다고 해서 설정이 그대로 적용되지는 않는다. sendmail에서는 대체로 text 설정 file들을 DB화 하여 db file들을 이용하여 설정을 적용시킨다. 이 virtusertable file을 db화 하여 놓은 file이 /etc/mail/virtusertable.db 이다. virtusertable을 db file로 적용시키기 위하여 virtusertable을 저장한 후에 shell에서


makemap hash /etc/mail/virtusertable < /etc/mail/virtusertable
명령으로서 virtusertable.db file을 갱신 시켜 줘야 한다. 만약 NDBM으로 sendmail을 compile했다면 모든 설정 file들의 hash를 dbm 으로 바꾸어 줘야 한다. hash는 버클리 DB(NEWDBM)을 의미한다.
이곳의 패키지를 설치를 했다면 좀더 쉽게 할수가 있다. /etc/mail밑에 보면 makemap.sh 라는 file이 존재를 한다. 그럼 /etc/mail 로 이동을 하여 SHELL> ./makemap.sh virt 를 실행하면 위의 방법과 동일한 결과를 가져 온다.

이 정도면 virtual user table에 대한 설명은 끝났다. 좀더 정밀한 setting은 이 page의 상단에 link되어 있는 sendmail page의 virtual hosting 문서를 살펴 보기 바란다.

웹서버 및 웹메일 설정 방법

# 가상 유저 (virtual user) 설정방법

/etc/mail/virtual***
파일에 설정하고자 하는 user를 설정하고 다음과 같이 실행
rm -rf *.db
make
/etc/rc.d/init.d/sendmail restart


# 다중 도메인 (virtual domain; 가상 도메인) 설정 방법

/etc/mail/local-domain-names 파일에 쓰고자하는 도메인명을 추가하고 다음과 같이 실행

rm -rf *.db
make
/etc/rc.d/init.d/sendmail restart


# POP3 서버 및 SMTP 서버 설정 방법
자세한 것은 첨부파일 참조…

음력-양력 변환기

$Lunar_Month = array(
/* 1881 */ // 1881년 1월 30일은 음력 1월 1일
    “1”,”2″,”1″,”2″,”1″,”2″,”2″,”3″,”2″,”2″,”1″,”2″,”1″,   “1”,”2″,”1″,”2″,”1″,”2″,”1″,”2″,”2″,”1″,”2″,”2″,”0″,
    “1”,”1″,”2″,”1″,”1″,”2″,”1″,”2″,”2″,”2″,”1″,”2″,”0″,   “2”,”1″,”1″,”2″,”1″,”3″,”2″,”1″,”2″,”2″,”1″,”2″,”2″,  
    “2”,”1″,”1″,”2″,”1″,”1″,”2″,”1″,”2″,”1″,”2″,”2″,”0″,   “2”,”1″,”2″,”1″,”2″,”1″,”1″,”2″,”1″,”2″,”1″,”2″,”0″,
    “2”,”2″,”1″,”2″,”3″,”2″,”1″,”1″,”2″,”1″,”2″,”1″,”2″,   “2”,”1″,”2″,”2″,”1″,”2″,”1″,”1″,”2″,”1″,”2″,”1″,”0″,  
    “2”,”1″,”2″,”2″,”1″,”2″,”1″,”2″,”1″,”2″,”1″,”2″,”0″,   “1”,”2″,”3″,”2″,”1″,”2″,”2″,”1″,”2″,”1″,”2″,”1″,”2″,  
/*1891*/
    “1”,”2″,”1″,”2″,”1″,”2″,”1″,”2″,”2″,”1″,”2″,”2″,”0″,   “1”,”1″,”2″,”1″,”1″,”2″,”3″,”2″,”2″,”1″,”2″,”2″,”2″,
    “1”,”1″,”2″,”1″,”1″,”2″,”1″,”2″,”1″,”2″,”2″,”2″,”0″,   “1”,”2″,”1″,”2″,”1″,”1″,”2″,”1″,”2″,”1″,”2″,”2″,”0″,  
    “2”,”1″,”2″,”1″,”2″,”3″,”1″,”2″,”1″,”2″,”1″,”2″,”1″,   “2”,”2″,”2″,”1″,”2″,”1″,”1″,”2″,”1″,”2″,”1″,”2″,”0″,
    “1”,”2″,”2″,”1″,”2″,”1″,”2″,”1″,”2″,”1″,”2″,”1″,”0″,   “2”,”1″,”2″,”3″,”2″,”2″,”1″,”2″,”1″,”2″,”1″,”2″,”1″,  
    “2”,”1″,”2″,”1″,”2″,”1″,”2″,”2″,”1″,”2″,”1″,”2″,”0″,   “1”,”2″,”1″,”1″,”2″,”1″,”2″,”2″,”3″,”2″,”2″,”1″,”2″,  
/*1901*/
    “1”,”2″,”1″,”1″,”2″,”1″,”2″,”1″,”2″,”2″,”2″,”1″,”0″,   “2”,”1″,”2″,”1″,”1″,”2″,”1″,”2″,”1″,”2″,”2″,”2″,”0″,
    “1”,”2″,”1″,”2″,”1″,”3″,”2″,”1″,”1″,”2″,”2″,”1″,”2″,   “2”,”2″,”1″,”2″,”1″,”1″,”2″,”1″,”1″,”2″,”2″,”1″,”0″,  
    “2”,”2″,”1″,”2″,”2″,”1″,”1″,”2″,”1″,”2″,”1″,”2″,”0″,   “1”,”2″,”2″,”1″,”4″,”1″,”2″,”1″,”2″,”1″,”2″,”1″,”2″,
    “1”,”2″,”1″,”2″,”1″,”2″,”2″,”1″,”2″,”1″,”2″,”1″,”0″,   “2”,”1″,”1″,”2″,”2″,”1″,”2″,”1″,”2″,”2″,”1″,”2″,”0″,  
    “1”,”2″,”3″,”1″,”2″,”1″,”2″,”1″,”2″,”2″,”2″,”1″,”2″,   “1”,”2″,”1″,”1″,”2″,”1″,”2″,”1″,”2″,”2″,”2″,”1″,”0″,  
/*1911*/
    “2”,”1″,”2″,”1″,”1″,”2″,”3″,”1″,”2″,”2″,”1″,”2″,”2″,   “2”,”1″,”2″,”1″,”1″,”2″,”1″,”1″,”2″,”2″,”1″,”2″,”0″,
    “2”,”2″,”1″,”2″,”1″,”1″,”2″,”1″,”1″,”2″,”1″,”2″,”0″,   “2”,”2″,”1″,”2″,”2″,”3″,”1″,”2″,”1″,”2″,”1″,”1″,”2″,  
    “2”,”1″,”2″,”2″,”1″,”2″,”1″,”2″,”1″,”2″,”1″,”2″,”0″,   “1”,”2″,”1″,”2″,”1″,”2″,”2″,”1″,”2″,”1″,”2″,”1″,”0″,
    “2”,”1″,”3″,”2″,”1″,”2″,”2″,”1″,”2″,”2″,”1″,”2″,”1″,   “2”,”1″,”1″,”2″,”1″,”2″,”1″,”2″,”2″,”2″,”1″,”2″,”0″,  
    “1”,”2″,”1″,”1″,”2″,”1″,”2″,”3″,”2″,”2″,”1″,”2″,”2″,   “1”,”2″,”1″,”1″,”2″,”1″,”1″,”2″,”2″,”1″,”2″,”2″,”0″,  
/*1921*/
    “2”,”1″,”2″,”1″,”1″,”2″,”1″,”1″,”2″,”1″,”2″,”2″,”0″,   “2”,”1″,”2″,”2″,”1″,”3″,”2″,”1″,”1″,”2″,”1″,”2″,”2″,
    “1”,”2″,”2″,”1″,”2″,”1″,”2″,”1″,”2″,”1″,”1″,”2″,”0″,   “2”,”1″,”2″,”1″,”2″,”2″,”1″,”2″,”1″,”2″,”1″,”1″,”0″,  
    “2”,”1″,”2″,”2″,”3″,”2″,”1″,”2″,”2″,”1″,”2″,”1″,”2″,   “1”,”1″,”2″,”1″,”2″,”1″,”2″,”2″,”1″,”2″,”2″,”1″,”0″,
    “2”,”1″,”1″,”2″,”1″,”2″,”1″,”2″,”2″,”1″,”2″,”2″,”0″,   “1”,”2″,”3″,”1″,”2″,”1″,”1″,”2″,”2″,”1″,”2″,”2″,”2″,  
    “1”,”2″,”1″,”1″,”2″,”1″,”1″,”2″,”1″,”2″,”2″,”2″,”0″,   “1”,”2″,”2″,”1″,”1″,”2″,”3″,”1″,”2″,”1″,”2″,”2″,”1″,
/*1931*/
    “2”,”2″,”2″,”1″,”1″,”2″,”1″,”1″,”2″,”1″,”2″,”1″,”0″,   “2”,”2″,”2″,”1″,”2″,”1″,”2″,”1″,”1″,”2″,”1″,”2″,”0″,
    “1”,”2″,”2″,”1″,”2″,”4″,”1″,”2″,”1″,”2″,”1″,”1″,”2″,   “1”,”2″,”1″,”2″,”2″,”1″,”2″,”2″,”1″,”2″,”1″,”2″,”0″,  
    “1”,”1″,”2″,”1″,”2″,”1″,”2″,”2″,”1″,”2″,”2″,”1″,”0″,   “2”,”1″,”1″,”4″,”1″,”2″,”1″,”2″,”1″,”2″,”2″,”2″,”1″,
    “2”,”1″,”1″,”2″,”1″,”1″,”2″,”1″,”2″,”2″,”2″,”1″,”0″,   “2”,”2″,”1″,”1″,”2″,”1″,”1″,”4″,”1″,”2″,”2″,”1″,”2″,  
    “2”,”2″,”1″,”1″,”2″,”1″,”1″,”2″,”1″,”2″,”1″,”2″,”0″,   “2”,”2″,”1″,”2″,”1″,”2″,”1″,”1″,”2″,”1″,”2″,”1″,”0″,
/*1941*/
    “2”,”2″,”1″,”2″,”2″,”1″,”4″,”1″,”1″,”2″,”1″,”2″,”1″,   “2”,”1″,”2″,”2″,”1″,”2″,”2″,”1″,”2″,”1″,”1″,”2″,”0″,
    “1”,”2″,”1″,”2″,”1″,”2″,”2″,”1″,”2″,”2″,”1″,”2″,”0″,   “1”,”1″,”2″,”1″,”4″,”1″,”2″,”1″,”2″,”2″,”1″,”2″,”2″,  
    “1”,”1″,”2″,”1″,”1″,”2″,”1″,”2″,”2″,”2″,”1″,”2″,”0″,   “2”,”1″,”1″,”2″,”1″,”1″,”2″,”1″,”2″,”2″,”1″,”2″,”0″,
    “2”,”2″,”3″,”1″,”2″,”1″,”1″,”2″,”1″,”2″,”1″,”2″,”2″,   “2”,”1″,”2″,”1″,”2″,”1″,”1″,”2″,”1″,”2″,”1″,”2″,”0″,  
    “2”,”2″,”1″,”2″,”1″,”2″,”1″,”3″,”2″,”1″,”2″,”1″,”2″,   “2”,”1″,”2″,”2″,”1″,”2″,”1″,”1″,”2″,”1″,”2″,”1″,”0″,  
/*1951*/
    “2”,”1″,”2″,”2″,”1″,”2″,”1″,”2″,”1″,”2″,”1″,”2″,”0″,   “1”,”2″,”1″,”2″,”1″,”4″,”2″,”1″,”2″,”1″,”2″,”1″,”2″,
    “1”,”2″,”1″,”1″,”2″,”2″,”1″,”2″,”2″,”1″,”2″,”2″,”0″,   “1”,”1″,”2″,”1″,”1″,”2″,”1″,”2″,”2″,”1″,”2″,”2″,”0″,  
    “2”,”1″,”1″,”4″,”1″,”1″,”2″,”1″,”2″,”1″,”2″,”2″,”2″,   “1”,”2″,”1″,”2″,”1″,”1″,”2″,”1″,”2″,”1″,”2″,”2″,”0″,
    “2”,”1″,”2″,”1″,”2″,”1″,”1″,”2″,”3″,”2″,”1″,”2″,”2″,   “1”,”2″,”2″,”1″,”2″,”1″,”1″,”2″,”1″,”2″,”1″,”2″,”0″,  
    “1”,”2″,”2″,”1″,”2″,”1″,”2″,”1″,”2″,”1″,”2″,”1″,”0″,   “2”,”1″,”2″,”1″,”2″,”2″,”3″,”2″,”1″,”2″,”1″,”2″,”1″,  
/*1961*/
    “2”,”1″,”2″,”1″,”2″,”1″,”2″,”2″,”1″,”2″,”1″,”2″,”0″,   “1”,”2″,”1″,”1″,”2″,”1″,”2″,”2″,”1″,”2″,”2″,”1″,”0″,
    “2”,”1″,”2″,”1″,”3″,”2″,”1″,”2″,”1″,”2″,”2″,”2″,”1″,   “2”,”1″,”2″,”1″,”1″,”2″,”1″,”2″,”1″,”2″,”2″,”2″,”0″,  
    “1”,”2″,”1″,”2″,”1″,”1″,”2″,”1″,”1″,”2″,”2″,”1″,”0″,   “2”,”2″,”2″,”3″,”2″,”1″,”1″,”2″,”1″,”1″,”2″,”2″,”1″,
    “2”,”2″,”1″,”2″,”2″,”1″,”1″,”2″,”1″,”2″,”1″,”2″,”0″,   “1”,”2″,”2″,”1″,”2″,”1″,”2″,”3″,”2″,”1″,”2″,”1″,”2″,  
    “1”,”2″,”1″,”2″,”1″,”2″,”2″,”1″,”2″,”1″,”2″,”1″,”0″,   “2”,”1″,”1″,”2″,”2″,”1″,”2″,”1″,”2″,”2″,”1″,”2″,”0″,  
/*1971*/
    “1”,”2″,”1″,”1″,”2″,”3″,”2″,”1″,”2″,”2″,”2″,”1″,”2″,   “1”,”2″,”1″,”1″,”2″,”1″,”2″,”1″,”2″,”2″,”2″,”1″,”0″,
    “2”,”1″,”2″,”1″,”1″,”2″,”1″,”1″,”2″,”2″,”2″,”1″,”0″,   “2”,”2″,”1″,”2″,”3″,”1″,”2″,”1″,”1″,”2″,”2″,”1″,”2″,  
    “2”,”2″,”1″,”2″,”1″,”1″,”2″,”1″,”1″,”2″,”1″,”2″,”0″,   “2”,”2″,”1″,”2″,”1″,”2″,”1″,”2″,”3″,”2″,”1″,”1″,”2″,
    “2”,”1″,”2″,”2″,”1″,”2″,”1″,”2″,”1″,”2″,”1″,”1″,”0″,   “2”,”2″,”1″,”2″,”1″,”2″,”2″,”1″,”2″,”1″,”2″,”1″,”0″,  
    “2”,”1″,”1″,”2″,”1″,”2″,”4″,”1″,”2″,”2″,”1″,”2″,”1″,   “2”,”1″,”1″,”2″,”1″,”2″,”1″,”2″,”2″,”1″,”2″,”2″,”0″,  
/*1981*/
    “1”,”2″,”1″,”1″,”2″,”1″,”1″,”2″,”2″,”1″,”2″,”2″,”0″,   “2”,”1″,”2″,”1″,”3″,”2″,”1″,”1″,”2″,”2″,”1″,”2″,”2″,
    “2”,”1″,”2″,”1″,”1″,”2″,”1″,”1″,”2″,”1″,”2″,”2″,”0″,   “2”,”1″,”2″,”2″,”1″,”1″,”2″,”1″,”1″,”2″,”3″,”2″,”2″,  
    “1”,”2″,”2″,”1″,”2″,”1″,”2″,”1″,”1″,”2″,”1″,”2″,”0″,   “1”,”2″,”2″,”1″,”2″,”2″,”1″,”2″,”1″,”2″,”1″,”1″,”0″,
    “2”,”1″,”2″,”2″,”1″,”2″,”3″,”2″,”2″,”1″,”2″,”1″,”2″,   “1”,”1″,”2″,”1″,”2″,”1″,”2″,”2″,”1″,”2″,”2″,”1″,”0″,  
    “2”,”1″,”1″,”2″,”1″,”2″,”1″,”2″,”2″,”1″,”2″,”2″,”0″,   “1”,”2″,”1″,”1″,”2″,”3″,”1″,”2″,”1″,”2″,”2″,”2″,”2″,  
/*1991*/
    “1”,”2″,”1″,”1″,”2″,”1″,”1″,”2″,”1″,”2″,”2″,”2″,”0″,   “1”,”2″,”2″,”1″,”1″,”2″,”1″,”1″,”2″,”1″,”2″,”2″,”0″,
    “1”,”2″,”2″,”3″,”2″,”1″,”2″,”1″,”1″,”2″,”1″,”2″,”1″,   “2”,”2″,”2″,”1″,”2″,”1″,”2″,”1″,”1″,”2″,”1″,”2″,”0″,  
    “1”,”2″,”2″,”1″,”2″,”2″,”1″,”2″,”3″,”2″,”1″,”1″,”2″,   “1”,”2″,”1″,”2″,”2″,”1″,”2″,”1″,”2″,”2″,”1″,”2″,”0″,
    “1”,”1″,”2″,”1″,”2″,”1″,”2″,”2″,”1″,”2″,”2″,”1″,”0″,   “2”,”1″,”1″,”2″,”1″,”3″,”2″,”2″,”1″,”2″,”2″,”2″,”1″,  
    “2”,”1″,”1″,”2″,”1″,”1″,”2″,”1″,”2″,”2″,”2″,”1″,”0″,   “2”,”2″,”1″,”1″,”2″,”1″,”1″,”2″,”1″,”2″,”2″,”1″,”0″,  
/*2001*/
    “2”,”2″,”2″,”1″,”3″,”2″,”1″,”1″,”2″,”1″,”2″,”1″,”2″,   “2”,”2″,”1″,”2″,”1″,”2″,”1″,”1″,”2″,”1″,”2″,”1″,”0″,
    “2”,”2″,”1″,”2″,”2″,”1″,”2″,”1″,”1″,”2″,”1″,”2″,”0″,   “1”,”2″,”3″,”2″,”2″,”1″,”2″,”1″,”2″,”2″,”1″,”1″,”2″,  
    “1”,”2″,”1″,”2″,”1″,”2″,”2″,”1″,”2″,”2″,”1″,”2″,”0″,   “1”,”1″,”2″,”1″,”2″,”1″,”2″,”3″,”2″,”2″,”1″,”2″,”2″,
    “1”,”1″,”2″,”1″,”1″,”2″,”1″,”2″,”2″,”2″,”1″,”2″,”0″,   “2”,”1″,”1″,”2″,”1″,”1″,”2″,”1″,”2″,”2″,”1″,”2″,”0″,  
    “2”,”2″,”1″,”1″,”2″,”3″,”1″,”2″,”1″,”2″,”1″,”2″,”2″,   “2”,”1″,”2″,”1″,”2″,”1″,”1″,”2″,”1″,”2″,”1″,”2″,”0″,  
/*2011*/
    “2”,”1″,”2″,”2″,”1″,”2″,”1″,”1″,”2″,”1″,”2″,”1″,”0″,   “2”,”1″,”2″,”4″,”2″,”1″,”2″,”1″,”1″,”2″,”1″,”2″,”1″,
    “2”,”1″,”2″,”2″,”1″,”2″,”1″,”2″,”1″,”2″,”1″,”2″,”0″,   “1”,”2″,”1″,”2″,”1″,”2″,”1″,”2″,”2″,”3″,”2″,”1″,”2″,  
    “1”,”2″,”1″,”1″,”2″,”1″,”2″,”2″,”2″,”1″,”2″,”2″,”0″,   “1”,”1″,”2″,”1″,”1″,”2″,”1″,”2″,”2″,”1″,”2″,”2″,”0″,
    “2”,”1″,”1″,”2″,”1″,”3″,”2″,”1″,”2″,”1″,”2″,”2″,”2″,   “1”,”2″,”1″,”2″,”1″,”1″,”2″,”1″,”2″,”1″,”2″,”2″,”0″,  
    “2”,”1″,”2″,”1″,”2″,”1″,”1″,”2″,”1″,”2″,”1″,”2″,”0″,   “2”,”1″,”2″,”2″,”3″,”2″,”1″,”1″,”2″,”1″,”2″,”1″,”2″,  
/*2021*/
    “1”,”2″,”2″,”1″,”2″,”1″,”2″,”1″,”2″,”1″,”2″,”1″,”0″,   “2”,”1″,”2″,”1″,”2″,”2″,”1″,”2″,”1″,”2″,”1″,”2″,”0″,
    “1”,”2″,”3″,”2″,”1″,”2″,”1″,”2″,”2″,”1″,”2″,”1″,”2″,   “1”,”2″,”1″,”1″,”2″,”1″,”2″,”2″,”1″,”2″,”2″,”1″,”0″,  
    “2”,”1″,”2″,”1″,”1″,”2″,”3″,”2″,”1″,”2″,”2″,”2″,”1″,   “2”,”1″,”2″,”1″,”1″,”2″,”1″,”2″,”1″,”2″,”2″,”2″,”0″,
    “1”,”2″,”1″,”2″,”1″,”1″,”2″,”1″,”1″,”2″,”2″,”2″,”0″,   “1”,”2″,”2″,”1″,”2″,”3″,”1″,”2″,”1″,”1″,”2″,”2″,”1″,  
    “2”,”2″,”1″,”2″,”2″,”1″,”1″,”2″,”1″,”1″,”2″,”2″,”0″,   “1”,”2″,”1″,”2″,”2″,”1″,”2″,”1″,”2″,”1″,”2″,”1″,”0″,  
/*2031*/
    “2”,”1″,”2″,”3″,”2″,”1″,”2″,”2″,”1″,”2″,”1″,”2″,”1″,   “2”,”1″,”1″,”2″,”1″,”2″,”2″,”1″,”2″,”2″,”1″,”2″,”0″,
    “1”,”2″,”1″,”1″,”2″,”1″,”2″,”3″,”2″,”2″,”2″,”1″,”2″,   “1”,”2″,”1″,”1″,”2″,”1″,”2″,”1″,”2″,”2″,”2″,”1″,”0″,  
    “2”,”1″,”2″,”1″,”1″,”2″,”1″,”1″,”2″,”2″,”1″,”2″,”0″,   “2”,”2″,”1″,”2″,”1″,”1″,”4″,”1″,”1″,”2″,”1″,”2″,”2″,
    “2”,”2″,”1″,”2″,”1″,”1″,”2″,”1″,”1″,”2″,”1″,”2″,”0″,   “2”,”2″,”1″,”2″,”1″,”2″,”1″,”2″,”1″,”1″,”2″,”1″,”0″,  
    “2”,”2″,”1″,”2″,”2″,”3″,”2″,”1″,”2″,”1″,”2″,”1″,”1″,   “2”,”1″,”2″,”2″,”1″,”2″,”2″,”1″,”2″,”1″,”2″,”1″,”0″,  
/*2041*/
    “2”,”1″,”1″,”2″,”1″,”2″,”2″,”1″,”2″,”2″,”1″,”2″,”0″,   “1”,”2″,”3″,”1″,”2″,”1″,”2″,”1″,”2″,”2″,”2″,”1″,”2″,
    “1”,”2″,”1″,”1″,”2″,”1″,”1″,”2″,”2″,”1″,”2″,”2″,”0″
);

function is_yun_year($year)
{
        if ($year % 4 != 0) return 0;   /* not yun year */
        if ($year % 100 != 0) return 1; /* yun year */
        if ($year % 400 != 0) return 0;  /* not yun year */
        return 1;                                               /* yun year */
}


function how_many_days($year, $month)
{
    switch($month)
    {
    case 1: case 3: case 5: case 7: case 8: case 10: case 12:
        return 31;
    case 4: case 6: case 9: case 11:
        return 30;
    case 2:
        if (is_yun_year($year)) return 29;
        else return 28;
    }
}

function end_day_of_lunar_month($year, $month)
{
    global $Lunar_Month;

    for ($i = 0; $i < $month; $i++) {
        $flag = $Lunar_Month[$year-1880][$i];
        if ($flag == ‘3’ || $flag == ‘4’) break;
    }
    if ($i != month)
        $flag = $Lunar_Month[($year-1880)*13+$month];
    else $flag = $Lunar_Month[($year-1880)*13+$month-1];

    if ($flag == ‘1’) return 29;
    else return 30;
}

function solar_to_lunar($year, $month, $day)
{
    global $Lunar_Month , $lunar_date;
    $total_day = 0;

    // 해의 범위를 측정한다.
    if ($year < 1881 || $year > 2043) return -1;

    for ($i = 0; $i < 163; $i++) {
        $Sum_of_Lunar_Day[$i]=0;  // 1년의 음력 날자의 합을 저장하는 배열

        $list_of_year[$i]=1881+$i;

        for ($j = 1; $j <= 13; $j++) {
            $this_month = $i*13+$j-1;
            switch($Lunar_Month[$this_month]) {
                case ‘0’:
                    break;
                case ‘1’: case ‘3’:
                    $Sum_of_Lunar_Day[$i] = $Sum_of_Lunar_Day[$i] + 29;
                    $imsi=29;
                    break;
                case ‘2’: case ‘4’:
                    $Sum_of_Lunar_Day[$i] = $Sum_of_Lunar_Day[$i] + 30;
                    $imsi=30;
                    break;
            }
        }
    }

    /* 오늘까지의 양력 날자의 합구하기. */
    /* 1881-1-30이 음력 1월 1일이나깐 1880년까지 날에 29일을 더한다. */
    $sum_of_1881 = (int)(1880*365 + 1880/4 – 1880/100 + 1880/400 + 29);

    /* 입력받은 날까지의 날짜의 합구하기 */
    //— 작년 까지의 날짜의 합 —//
    $last_year=$year-1;
    $sum_of_today = (int)($last_year*365 + $last_year/4 – $last_year/100 + $last_year/400);

    //— 자난 달 까지의 날짜의 합 —//
    for($i = 1; $i < $month ; $i++){
        $sum_of_today = $sum_of_today + how_many_days($year,$i);
    }

    //— 오늘까지의 날짜의 합 —//
    $sum_of_today = $sum_of_today + $day;

    // 오늘까지의 날짜 합에서 1881년 1월 29일의 날짜의 합을 뺀다.//
    // $total_day는 날짜의 차이..
    if($year == 1881) $total_day  = $sum_of_today – $sum_of_1881;
    else $total_day  = $sum_of_today – $sum_of_1881 -1;

    //——————————————————————–//
    // 이제 부터 음력을 계산 한다..
    $total_imsi = $Sum_of_Lunar_Day[0];
    for($i = 0; $i < 163; $i++) {
        if ($total_day <= $total_imsi) break;
        else $total_imsi = $total_imsi + $Sum_of_Lunar_Day[$i + 1];
    }

    $lun_year = $i + 1881; // 음력 년도 구함..

    $ext_total_day = $total_day – $total_imsi + $Sum_of_Lunar_Day[$i];;

    if ($Lunar_Month[$i*13+12] == ‘0’) $count = 12;
    else $count = 13;

    $m2 = 0;
    for ($j = 0; $j < $count; $j++) {
        $this = $i*13+$j;
        if ($Lunar_Month[$this] == 1) {
            $m2++;
            $m1 = $Lunar_Month[$this] + 28;
            $is_yun_month = 0;
        }
        else if ($Lunar_Month[$this] == 2) {
            $m2++;
            $m1 = $Lunar_Month[$this] + 28;
            $is_yun_month = 0;
        }
        else if ($Lunar_Month[$this] == 3) {
            $m1 = $Lunar_Month[$this] + 26;
            $is_yun_month = 1;
        }
        else {
            $m1 = $Lunar_Month[$this] + 26;
            $is_yun_month = 1;
        }

        // 다음달이 윤달인지 아닌지를 리턴한다..
        // 넘기는 이유는 생일자의 쿼리 전송을 위해서..
        // 음력 윤달의 생일자 또는 평달에 태어난 생일자가
        // 윤달이 다음달에도 나오지 않게.
        // 그러니깐 생일이 두번 생기지 않도록

        $next = $i*13+$j+1;
        if ($Lunar_Month[$next] == 1) $next_is_yun_month = 0;
        else if ($Lunar_Month[$next] == 2) $next_is_yun_month = 0;
        else if ($Lunar_Month[$next] == 3) $next_is_yun_month = 1;
        else $next_is_yun_month = 1;


        if ($ext_total_day <= $m1) break;
        $ext_total_day = $ext_total_day – $m1;
    }

    $lunar_year = $lun_year;
    $lunar_month = $m2;
    $lunar_day = (int)($ext_total_day);
    $is_lunar = $is_yun_month;
    $next_is_lunar =$next_is_yun_month;

    if($lunar_month <10) $lunar_month=”0″.$lunar_month;
    if($lunar_day <10) $lunar_day=”0″.$lunar_day;

    $lunar_date = “$lunar_year”.”년”.” “.”$lunar_month”.”월”.” “.”$lunar_day”.”일”;

return $lunar_date;
}
$Y = date(“Y”);
$M = date(“m”);
$D = date(“d”);
solar_to_lunar($Y, $M, $D);
echo $lunar_date;

PHP에서 메일 함수가 동작하지 않을때

 

php.ini 파일에 보면 sendmail 설정 부분이 있습니다. 그곳에 -i 옵션이 설정되어 있는지 확인해보세요.


[mail function]
SMTP                    =       localhost                       ;for win32 only
;sendmail_from  =       me@localhost.com        ;for win32 only
sendmail_path   =       /usr/sbin/sendmail -t -i ;for unix only, may supply arguments as well (default is ‘sendmail -t -i’) (linux 시스템의 일반적인 sendmail 위치.. 확인해보고 바르게 지정해보세요.)

어떤 파라메터가 넘어왔는지 알아내는 함수

 

어떤 변수들이 post 또는 get method로 넘어왔는지 알아낼 수 있는 함수

//HTTP_POST_VARS 란 인수에서 POST 값들을 이름:값 형식으로 하나씩 추출해 냅니다.

while(list($Post_Name, $Post_Val)=each($HTTP_POST_VARS))
{
  echo(“$Post_Name: $Post_Val<br>
“);
}

이 방법을 사용하면 http://m.kurapa.com/?바보=천치 라는 식으로 파라메터를 보낼때

바보라는 파라메터를 사용했는지 알아 낼 수 있다.

참고로 GET Method일때는 다음의 방법을 사용하기 바란다.

  while(list($Post_Name, $Post_Val)=each($HTTP_GET_VARS))
  {
    $rss = $Post_Name;
    break;
  }