달력

082018  이전 다음

  •  
  •  
  •  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  •  


[오류메세지]
연결된 서버 "SMC_WMS_TEST"의 OLE DB 공급자 "SQLNCLI10"이(가) 분산 트랜잭션을 시작할 수 없으므로 요청한 작업을 수행할 수 없습니다.

[해결방법]
EXEC
sp_serveroption @server=N'LGWMS', @optname=N'remote proc transaction promotion', @optvalue=N'FALSE'
Posted by 알이씨


첫 포스트.. 되도록이면 각 단계를 무시하지 않고 포스팅 하기로 했다.

프로젝트를 한번 만들어보자... 좀 쉬운 느낌(?)

Visual Studio 2008 - 파일 - 새로 만들기 - 프로젝트 - Visual C# - WPF


위의 그림대로 하면 프로젝트가 만들어진다.


프로젝트를 생성하면 좌측의 프로젝트에 필요한 파일들과 클래스를 보여주는 트리뷰

중간에 실시간으로 UI를 보여주는 곳, 그 바로 아래에 UI 구성의 소스를 보여주는 XAML 코드

우측에는 항목들의 속성값을 보여주는 뷰...

아래쪽에는 코드 정의, 출력, 검색 등에 관련된 뷰가 들어 있다.

여기까진 대부분의 Visual Studio와 비슷한 모양이므로.....  

Visual Studio의 코딩 방식을 Visual C++ 형태를 좋아해서 사용하는데 그래서 모양이 좀 다를 수도 있다.

이번 포스트는 끝~

'Programming > WPF' 카테고리의 다른 글

WPF 프로젝트 생성  (0) 2011.01.14
WPF 를 시작하며...  (0) 2011.01.14
Posted by 알이씨
TAG WPF


이 카테고리에는 WPF를 공부하며 필요한 내용들만 소스 위주로 간단한 설명과 함께 정리할 것이다.

후에 내가 살펴보며 기억을 더듬을 수 있을 것이고..

다른 분들이 보고 소스를 따라하면서 WPF를 공부할 수 있게 도움을 줄 수 있을 것이라 생각한다.



'Programming > WPF' 카테고리의 다른 글

WPF 프로젝트 생성  (0) 2011.01.14
WPF 를 시작하며...  (0) 2011.01.14
Posted by 알이씨
TAG WPF


통신 프로그램을 만들 때 프로토콜을 구조체로 잡고 바이트 배열로 쏘는 경우가 생기는데

아래와 같이 하면 된다.

// 구조체를 바이트 배열로 변환
public static int CvtStructToBin(object obj, out byte[] bin)
{
      bin = new byte[Marshal.SizeOf(obj)];

      unsafe
      {
          fixed (byte* fixed_buffer = bin)
          {
              Marshal.StructureToPtr(obj, (IntPtr)fixed_buffer, false);
          }
      }

      return bin.Length;

}

// 바이트 배열을 구조체로 변환

        public static int CvtBinToStruct(byte[] bin, object obj)
        {
            
            unsafe
            {
                fixed (byte* fixed_buffer = bin)
                {
                    Marshal.PtrToStructure((IntPtr)fixed_buffer, obj);
                }
            }

            return 0;
        }

'Programming > C#' 카테고리의 다른 글

구조체 -> 바이트 배열, 바이트 배열 -> 구조체  (0) 2010.03.16
C#에서 로그 함수 만들기  (0) 2010.03.05
Posted by 알이씨


C나 C++에서 콘솔이나 UI의 디버깅창에 로그를 남기면서 파일로도 로그를 남기는 작업을 했었다.

주로 서버 개발이나 펌웨어 개발할 때 썼었는데 이번 프로젝트는 c#을 사용해야 하기에 맘먹고 만들어봤다.

소스코드는 아래에 있고 로그 발생지(eBlk)나 로깅 수준(eLevel)은 입맛대로 바꿔서 쓰면 될듯...

보통 릴리즈 후에는 어느정도 버그를 잡았다고 보기 때문에 ERROR, ABNORMAL, ESSENTIAL 정도만 남겨두고 나머지 로깅 수준은 꺼두는 것이 좋다.

이러한 로깅 수준 조정은 설정 파일을 따로 두어서 설정 내용에 따라 조정하면 되겠다. 아래 소스에서는 일단 모두 보이게 하는 것으로 해두었다.

public enum eBlk
    {
        BLK_GATE = 0,
        BLK_MNGR,
        BLK_MAIN,
        BLK_DB,
        MAX_BLK
    }

    public enum eLevel
    {
        D_ERROR = 0,
        D_ABNORMAL,
        D_ESSENTIAL,
        D_PRIMITIVE,
        D_NORMAL,
        D_TIMER,
        D_PERIODIC,
        D_HEXA,
        D_MAX_LEVEL
    }

    public static class MBzPrintf
    {
        static string[] S_BLK = new string[(int)eBlk.MAX_BLK];
        static string[] S_TYPE = new string[(int)eLevel.D_MAX_LEVEL];
        static byte[] BLK_OP = new byte[(int)eLevel.D_MAX_LEVEL];

        public static void MBzInitPrintf()
        {
            S_BLK[(int)eBlk.BLK_GATE] = "[G W]";
            S_BLK[(int)eBlk.BLK_MNGR] = "[MNG]";
            S_BLK[(int)eBlk.BLK_MAIN] = "[M N]";
            S_BLK[(int)eBlk.BLK_DB] = "[ DB]";

            S_TYPE[(int)eLevel.D_ERROR] = "[ERR]";
            S_TYPE[(int)eLevel.D_ABNORMAL] = "[ABN]";
            S_TYPE[(int)eLevel.D_ESSENTIAL] = "[ESS]";
            S_TYPE[(int)eLevel.D_PRIMITIVE] = "[PRI]";
            S_TYPE[(int)eLevel.D_NORMAL] = "[NOR]";
            S_TYPE[(int)eLevel.D_TIMER] = "[TMR]";
            S_TYPE[(int)eLevel.D_PERIODIC] = "[PRD]";
            S_TYPE[(int)eLevel.D_HEXA] = "[HEX]";

// 모든 로깅 수준을 다 풀었다.
            for(int i = 0; i < (int)eLevel.D_MAX_LEVEL; i++){
                BLK_OP[i] = 1;
            }           
        }

        public static int MBzWriteLine(eBlk blk, eLevel level, string format, params object[] args)
        {
            if((int)blk > (int)eBlk.MAX_BLK){
                return 0;
            }

            if (BLK_OP[(int)level] == 0)
            {
                return 0;
            }

            string log_str;
            log_str = String.Format(DateTime.Now.ToString("yyyy-MM-dd HH:mm") + " {0}{1} ", S_BLK[(int)blk], S_TYPE[(int)level]);
            log_str += String.Format(format, args);

            Console.WriteLine(log_str);

// Todo: 여기쯤에 파일에 기록하는 것도 넣으면 좋겠다.

            return log_str.Length;
        }
    }


사용하는 곳에서 아래와 같이 먼저 초기화 해주고.

MBzPrintf.MBzInitPrintf();

아래 처럼 로깅하면 된당...
MBzPrintf.MBzWriteLine(eBlk.BLK_MAIN, eLevel.D_NORMAL,
                    "=============== 서버를 시작합니다.==================");

MBzPrintf.MBzWriteLine(eBlk.BLK_MAIN, eLevel.D_NORMAL,
                    "=============== 서버를 끌께요.==================");

C#에 익숙치 않아서 시행착오가 참 많은데 아직까진 다 해결중...

enum 쓰는게 엄청 불편한데.. c처럼 되면 얼마나 좋아.. ㅜㅜ;

'Programming > C#' 카테고리의 다른 글

구조체 -> 바이트 배열, 바이트 배열 -> 구조체  (0) 2010.03.16
C#에서 로그 함수 만들기  (0) 2010.03.05
Posted by 알이씨
TAG C#, 로깅



본 문서는 인터넷 조회를 통해 얻은 내용을 정리한 내용입니다.

 

1. HTTP의 동작방식과 쿠키

 

HTTP 프로토콜의 특성상 클라이언트(브라우저)에서 서버에 데이터를 요청하여 원하는 데이터를 받고 나면, 바로 소켓 Connection을 해제하는 비상태 프로토콜(Stateless Protocol)이다. 즉, 지속적인 연결을 하고 있으면서 데이터를 주고 받는 것이 아니라 필요할 때마다 소켓을 연결하고 데이터를 받자마자 바로 Connection을 끊어버리는 방식이 바로 HTTP 프로토콜의 연결 메커니즘이다.
이는 서버 자원의 낭비를 최소화하는 장점이 되고 있으나, 다음과 같이 페이지를 이동하더라도 지속적인 상태의 유지가 필요한 경우에는 심각한 문제를 유발하지 않을 수가 없게 된다.

 

예를 들어, 전자상거래 사이트에서 로그인후에 물건을 구입하기 위해서 다른 페이지로 이동하면 이전의 상태를 상실하기 때문에 어떤 이름으로 로그인을 했으며, 누가 물건을 구입했는지를 알 수가 없다는 것이다. 고객의 입장에서도 방금전에 구입하기로 하여 장바구니에 넣은 물건이 다른 페이지로 이동하면 자동적으로 상실되는 결과가 초래되기 때문에, 정상적인 전자상거래가 이루어질 수가 없는 것이다.

 

이에 따라 HTTP의 한계를 보완하기 위해 개발된 기술이 쿠키(Cookies)로서, 연결상태의 유지에 필요한 정보를 클라이언트(Client)에 저장하였다가 필요시에 자신이 갖고 있는 정보를 서버(Server)에 보냄으로서 자신이 누군인지 혹은 기타의 상태를 유지하는 개념이다.

 

2. 쿠키의 개념과 동작방식

 

쿠키(Cookies)는 Netscape사에서 정보의 지속성을 위해 고안한 방법으로 HTTP 프로토콜상에서 클라이언트의 상태 정보를 클라이언트의 하드 디스크상에 저장한 후 재사용하는 방식이다. 여기서, 쿠키란 이름 자체는 서버가 클라이언트에 전송하여 저장하는 텍스트 조각(패킷)을 가리키는 것으로, HTTP 헤더에 포함되어 같이 전송된다.

일반적으로 웹 서버가 보통의 HTML 페이지를 보낼 경우 HTTP 헤더는 다음과 같이 설정된다.

    Content-type: text/html

그러나, 웹서버가 HTML 페이지에 쿠키를 설정하고자 할 경우에는 HTTP 헤더에 Set-Cookie 필드가 추가되어 전송된 후 여기서 설정된 쿠키정보가 클라이언트에 저장되는 것이다.

    Content-type: text/html
    Set-Cookie:name=gildong;path=/;expires Mon, 26-Aug-2002  20:13:00 GMT 

여기서 Cookie의 이름은 name이며 이의 값은 gildong으로서 Root 디렉토리 이하에 모두 유효하며 GMT 기준으로 2002년 8월 26일 20:13까지 유효하게 존재하다가 이후 자동으로 삭제된다.

 

3. 쿠키의 사용

3-1. JavaScript 에서의 쿠키 사용

<PRE>function setCookie(name, value, expire) { document.cookie = name + "=" + escape(value) + ( (expire) ? "; expires=" + expire.toGMTString() : "")}</PRE>

여기서 name은 기록할 이름이고 value는 저장할 값이고 expire는 자동삭제 시간입니다. escape(value)는 semicolons, commas, spaces 같은 특수문자를 사용자가 입력했을 경우를 대비해서 해줍니다. 쿠키설정 코드를 짤때 name에도 특수문자를 넣었다면 name도 escape(name)으로 해주어야 합니다. toGMTString()은 cookie에 삭제기간을 지정할 때 사용할 수 있는 함수입니다. 여기에서 domain, path, secure는 지정하지 않았습니다. domain과 path는 지정하지 않으면 현재의 쿠키를 설정하고 있는 domain과 path가 지정되고 secure는 서버의 channel과 연관된 것입니다.

<PRE>function register(uName) { var today = new Date() var expire = new Date(today.getTime() + 60*60*24*31*1000) setCookie("userName", uName, expire)}<form onSubmit="register(this.txt.value)"> 이름이 뭐죠? <input type=text name=txt><input type=submit></form></PRE>

사용자가 이름을 입력하고 submit 하면 31일 후로 자동삭제 기간을 지정하고 userName라는 이름으로 cookie를 설정합니다.

<PRE>function getCookie(uName) { var flag = document.cookie.indexOf(uName+'='); if (flag != -1) { flag += uName.length + 1 end = document.cookie.indexOf(';', flag) if (end == -1) end = document.cookie.length return unescape(document.cookie.substring(flag, end)) }}</PRE>

이 코드로 cookie를 읽습니다. cookie에 저장되는 방식은 저장이름=저장값으로 저장합니다. 저장이름이 다른것이 2개 이상이 저장되어 있다면 저장이름=저장값; 저장이름=저장값 식으로 저장이 됩니다. 등호(=)와 (;)는 자동으로 붙습니다. nn은 브라우저가 있는 폴더에 cookie.txt로 저장하고 ie4는 window가 설치된 곳에 Cookies 폴더에 저장됩니다.

<PRE>function cookieComment() { var userName = getCookie("userName"); if ( userName ) { alert("\n돌아오신 것을 환영합니다.\n\n" + userName + " 님.."); } else alert("\n처음 오셨군요.. 반갑습니다..");}<body onLoad="cookieComment()"></PRE>

Cookie를 읽고 두개 중의 하나의 환영 alert창을 엽니다.

 

Cookie는 사용자가 설정을 선택을 지정할 수 있습니다. 기본값으로는 선택되어 있지만 끌수도 있습니다. 그래서 cookie를 사용하여 특별한 작업을 하기 위해서는 사용자에게 cookie를 선택해 놓으라고 알려 주어야 합니다. cookie를 Client-Side, Server-Side에서 사용하던 마찬가지입니다.

ie4, ie5는 Navigator 객체의 cookieEnabled 라는 요소가 있습니다. 사용 허용은 true 값을 가지고 있고 선택을 꺼놓은 허용 불가는 false 값을 가집니다. 그래서 아래로 cookie를 사용하게 선택해 놓았는지 알 수 있습니다. <PRE>if(navigator.cookieEnabled) { cookie 작업 구문..}else alert("cookie를 꺼놓았습니다. 선택해 주세요..")</PRE>

ie4, ie5에는 cookieEnabled 라는 요소로 알 수 있지만 nn4 이하는 이 요소가 없습니다. 그래서 직접적인 방법을 사용하지 않고 다른 방법을 사용하여야 합니다. 방법은 임시로 아무 cookie 값을 지정하고 그 cookie 값이 있는지 확인하는 방법입니다.

<PRE>document.cookie = 1if(document.cookie) { cookie 작업 구문..}else alert("cookie를 꺼놓았습니다. 선택해 주세요..")</PRE>

cookie에 아무 값이나 지정하고 그 값을 사용하여 그것을 읽으면 굳이 cookie 지정여부를 말해주는 요소가 없어도 nn3 이상의 대부분의 브라우저에서 확인할 수 있습니다

 

* 본 소스는 javascript로 cookie를 가지고 놀자를 참조하였습니다.

<html>
<head>
 <title>Cookie Test</title>
 <script language=javascript type="text/javascript">
  function setCookie ()
  {
   var strValue = getValue();

   var objExpireDate = new Date();

   objExpireDate.setDate(objExpireDate.getDate() + 360);
   
   document.cookie = strValue + "=" + escape(strValue) + "; path=/; expires=" + objExpireDate.toGMTString() + ";";

   initTextBox();
  }

  function delCookie ()
  {
   var strValue = getValue();

   var objExpireDate = new Date();

   objExpireDate.setDate(objExpireDate.getDate() - 1);
   
   document.cookie = strValue + "=;expires=" + objExpireDate.toGMTString();

   initTextBox();
  }

  function getCookieValue (strName)
  {
   var strCookieName = strName + "=";
   var objCookie = document.cookie;
   
   if (objCookie.length > 0)
   {
    var nBegin = objCookie.indexOf(strCookieName);
    
    if (nBegin < 0)
    {
     return;
    }

    nBegin += strCookieName.length;
    
    var nEnd = objCookie.indexOf(";", nBegin);
    
    if (nEnd == -1)
    {
     nEnd = objCookie.length;
    }
   }
   
   return unescape(objCookie.substring(nBegin, nEnd));
  }

  function getAll ()
  {
   var alCookie = document.cookie.split(";")

   var alResult = new Array();
   
   for (i=0; i < alCookie.length; i++)
   {
    if (null == alCookie[i] || "" == alCookie[i])
    {
     continue;
    }

    cookieName = alCookie[i].split("=")[0];
    
    alResult.push(getCookieValue(cookieName));
   }
   
   return alResult;
  }

  function print ()
  {
   var alCookie = getAll();

   alert(alCookie.join());
  }

  function getValue ()
  {
   return document.getElementById("value").value;
  }

  function initTextBox ()
  {
   document.getElementById("value").value = "";
  }
 </script>
</head>
<body bgcolor=white>
 <input type="text" id="value"></input><br />
 <button onclick="setCookie()">set</button>
 <button onclick="delCookie()">del</button>
 <button onclick="print()">print</button>
</body>
</html>

 

4. 쿠키의 제한

* 전체적으로 300개의 쿠키가 저장될 수 있습니다.

* 각 쿠키별로 이름과 값을 합해서 4kb까지 저장될 수 있습니다.

* 서버나 도메인별로 20개의 쿠키가 저장될 수 있습니다.

 

5. 주의 사항

프락시 서버(proxy server)를 이용할 경우 쿠키가 캐쉬되므로 캐쉬되지 않도록 HTTP의 Pragma General Header을 no-cache로 해야 합니다.

 

6. Cookie의 취약점

Cookie Sniffing은 WWW 환경에서 해커가 사용자나 관리자의 Cookie 혹은 Session과 같이 중요한 정보를 가로채는 기법을 말하고 Cookie Spoofing은 이 정보를 이용하여 해커가 자신의 신분을 속이는 행위를 하는 것을 말합니다.

참조 : http://beist.org/research/public/autocookie/index.html Cookie Sniffing 에 사용될 수 있는 자동 공격 프로그램

 

참조 : http://www.cyberu.co.kr/docs/jsp/docs/cookies.asp JSP 프로그래밍 - 쿠키

           http://user.chollian.net/~spacekan/source/cookie/cookie.htm COOKIE

           http://blog.naver.com/kcharon/120049210223 javascript로 cookie를 가지고 놀자

Posted by 알이씨


어느새 어플리케이션 개발 분야에 새로운 바람이 불고 있다.

Adobe의 FLEX, AIR

MS의 Silverlight, WPF, WCF 등등

그리고 Java 진영의 JavaFX...

VS6.0으로 MFC를 하고 2005로 asp.net 정도로 한 나에게 이런 기술들은 생소하기만 한데

일단 첫 느낌은 "와 멋지다!!!"

기술적인 부분에 있어서 어디까지 가능한지 모르겠지만

RIA(Rich Internet Application)를 표방하므로 데스크탑 어플리케이션이 가지는 대부분의 기능들이 가능하리라 본다.

물론 시스템 프로그래밍과 같은 부분은 힘들겠지만...

그렇다면 이런 기술들을 가지고 데스크탑 어플리케이션도 만들 수 있는건가?

웹브라우저를 벌어날 수 있다면 사용자 기반 데스크탑 어플리케이션도 큰 변화를 맞이할 수 있을 것 같다.

2009년에는 Adobe와 MS에서 분리되어 있는 이러한 기술들을 통합한다고 한다.

언젠가 나도 이러한 흐름에 동참해야 하는게 아닌가 하는 생각도 하고 있고.

웹 검색을 하던중 Adobe AIR 기술을 이용한 데스크탑 어플리케이션을 하나 소개하고자 한다.

파일 전송을 할 수 있는 프로그램인데 아래 주소로 가서 무료로 다운받아 사용할 수 있다.

http://www.piczza.com

외국에는 이미 활발하게 개발을 하고 있는 것 같은데. 국내에는 아직은 많이 활용되고 있지는 않은 것 같다.

내년이 기대가 되며 앞으로의 변화에 대해 적응을 할 수 있을지 두려운 마음도 든다.


Posted by 알이씨


MSSQL을 이용하여 ADO를 래핑하여 특정 DB를 위한 라이브러리 클래스들을 만들어 작업하고 있다.

그 와중에 내부적으론 ADO를 사용하므로 각 객체들의 인수라던지 함수, 프러퍼티 등을 사용하게 되는데

아래 링크에 잘 정리된 내용이 있어서 링크를 걸어둔다.

책이나 MSDN에서 시키는데로 했다가 내용을 알게 되니 상황에 맞게 객체들을 변형시켜 사용할 수 있을 듯 하다.

http://cafe.naver.com/xmastx.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=42

'Programming > MFC' 카테고리의 다른 글

ADO 객체 정리  (0) 2008.11.12
버그 트랩  (0) 2008.04.02
Tape 백업 장치 제어 관련 라이브러리  (0) 2008.01.04
[스크랩] IP Helper API를 사용해서 Ethernet Card 정보 알아내기  (0) 2007.04.13
Posted by 알이씨


ActiveX의 안정성 코드에 대해 좋은글 링크

http://ancdesign.tistory.com/18

Posted by 알이씨


exec sp_replmonitorhelpmergesession @publisher = N'OMC-SRV1', @publisher_db = N'DB800', @publication = N'DB_Pub'
Posted by 알이씨

티스토리 툴바