error C2146: 구문 오류 : ';'이(가) 'PVOID64' 식별자 앞에 없습니다.
 
이렇게 되어 있던것을
typedef void *PVOID;
typedef void * POINTER_64 PVOID64;   
 
요�게 바꾸면 됩니다
typedef void* PVOID;
typedef void* POINTER_64;
typedef POINTER_64 PVOID64;

'Develop' 카테고리의 다른 글

유니코드 소스코드 작성법  (0) 2009.11.05
#define enumstr(a) (#a)  (0) 2009.11.05
궁금해  (0) 2009.11.02
동적바인딩 Virtual의 사용[링크]  (0) 2009.10.31
C++ 의 추상 클래스와 Java 의 interface 의 차이[펌]  (0) 2009.10.31
scopelock
java interface
static_cast

'Develop' 카테고리의 다른 글

error C2146: 구문 오류 : ';'이(가) 'PVOID64' 식별자 앞에 없습니다.  (1) 2009.11.05
궁금해  (0) 2009.11.02
C++ 의 추상 클래스와 Java 의 interface 의 차이[펌]  (0) 2009.10.31
Interface란?  (0) 2009.10.31
set, get  (0) 2009.10.31
 
오랜만에 C++ 코딩을 하느라 정신이 없습니다. 그런 와중에도 한가지 적을만한 내용이 있어서 적어봅니다.

C++ 에는 아시다 시피 interface 라는 것이 컴파일러 차원에서 재공되지 않습니다. Java 에서는 interface 라는 키워드도 있고 interface 구현 할때는 내부 구현을 못하도록 강제로 막아 주기도 하지요. 디자인 적인 차원에서 매우 훌륭한 특징이라고 생각합니다.

대신에 C++ 에서는 Abstract class 라는 것을 지원하는데 구현 함수중의 적어도 한개를 virtual 로 선언하고 구현을 Null 값으로 할당해서 구현을 비워두면 자동으로 추상 클래스가 됩니다. Java 의 interface 와의 차이점은, Java 에서는 내부 구현을 전혀 못하도록 강제하는 반면에  C++ 에서는 일부 구현을 허용한다는 점이 다릅니다.

그러면 C++ 의 추상 클래스를 사용해서 Java 의 interface 와 완전히 똑같은 것을 사용하려면 어떻게 해야하는가? 하는 것이 사실 이 글의 요점입니다. 컴파일러의 도움없이 수작업으로 모든 함수들을 공란으로 비워두면 interface 와 비슷해지지만, 완전히 같아지지는 않습니다. 문제는 C++ 에서는 interface 같은 형태로 사용하려면 다중 상속의 개념이 적용되는데 C++ 에서 상속을 할때에는 반듯이 소멸자가 virtual 로 선언되어야 합니다. 그런데 소멸자는 선언이 되면 반듯이 구현도 같이 해줘야 하는 문제가 덩달아 생겨납니다.

그래서 아무리 비슷하게 하려고 해도 아래와 같이 소멸자는 구현이 되어야 한다는 것입니다.
class EventListener {
public:
    virtual ~EventListener() {} // 이 부분이 구현이 된 것입니다.

    virtual void handleEvent(EventPtr evt) = 0; // 함수를 virtual 로 선언하고 구현을 비워둡니다.
};
그래서 결론은 비슷하게 사용할수 있지만 interface 인 녀석이 구현을 담고 있다는 것이 여전히 꺼림직 합니다.

'Develop' 카테고리의 다른 글

궁금해  (0) 2009.11.02
동적바인딩 Virtual의 사용[링크]  (0) 2009.10.31
Interface란?  (0) 2009.10.31
set, get  (0) 2009.10.31
[셰이더] D3DVERTEXELEMENT9  (0) 2009.10.29

interface란 어떤 기능을 하는 매소드를 정의하는데 있어어 세세한 기능자체를
구현한것이아니고 어떤 매소드를 만들겠다고 추상적으로 선언만 해놓은
비슷한 매소드 모아놓은 것.

3. Interface
 
3.1 Interface의 특징
   
1) 클래스 -> 다중 상속
   
2) 객체를 발생 할 수 없는 클래스 이다.
        ex) interfatc A{ }
            A ap =
new A();   // new A()에서 에러 발생

    3) 포함 멤버 : 단 두가지 밖에 없다.
     
a) Field : public static final 자료형 변수명 = 값    // 무조건 이 종류만 포함 할 수 있다.
        ex)
           
interface A {
               
int x = 10;     //public static final가 생략되어 있는 형태이다.
            }
        A.
x 와 같이 클래스명으로의 접근이 가능하다.(static이 생략된 형태이므로)

     
b) Method : public abstract 결과형리턴값 Method명(매개변수) 예외전가;  //abstract Method만 포함을 시킬 수 있다.
        interface A {
           
int x = 80;      //public static final 생략된 형태
            void aaa();      //public abstract가 생략된 형태
        }

   
4) 하위클래스로 상속 시킨다음 존재하는 MEthod 모두를 overriding 해야함
        ex)
           
interface A { }    A ap = new A() // 사용 안됨

            interface B extends A { }    B bp = new B() // 사용 안됨
            class C implements B { }
            A ap =
new C();    //사용 가능
            B bp = new C();    //사용 가능
            C cp = new C();    //사용 가능

            // 상위에 메소드가 존재하면 overriding이 있어야 한다.

            5) 순수 디자인 목적으로 사용

//------------------------------------------------------------------//
질문
   ex) Abstract
   
abstract class A {
       
int x = 10;
        A(
int x) {
           
this.x = x;
        }
       
abstract void view();
    }

   
class B extends A {
       
int x = 20;
        B(
int x, int x1) {
           
super(x);
           
this.x = x;
        }
       
void view() {      // view1()이나 int view(), view(int x)라고 하면 overriding 되어있지 않으으므로 A bp = new B();  에서 에러가 발생한다. abstract 정의를 필요로 한다는 에러 메세지 출력됨.
            System.......(super.x);
           
System.......(this.x);
        }
    }
   
    A ap =
new A();     // 안됨 -> abstract 클래스이므로...
    A bp = new B();     // 실행 가능
    System.out.println(bp.x);      // 10출력

    abstract 메소드를 재정의 하지 않으면.. 에러메세지를 발생한다.


  ex)
interface
    interface A {
       
int x = 100;
       
void view();
    }
   
class B implements A {
       
int x = 200;
       
//B(int x, int x1) {
        // super(x);  //인터페이스는 생성자를 가질 수 없으므로 에러가 발생한다. super가 올수가 없다.
        B(int x) {
           
this.x = x;
        }
       
public void view() {      // void view() 로 사용하면 에러 발생 -> 클래스 A의 view()는 .. public abstract 가 생략되어 있기 때문이다.
            System.out.println(super.x);
           
System.out.println(this.x);
        }
    }

    A ap =
new A(); // 사용 안됨
    System.out.println(A.x);    // 100출력
    A.view();
    A ap =
new B();
    B bp =
new B();
   
System.out.println(B.x);    // 200출력
    ap.view();                  // 두개 모두.. B의 view가 실행 된다.
    bp.view();


 

'Develop' 카테고리의 다른 글

동적바인딩 Virtual의 사용[링크]  (0) 2009.10.31
C++ 의 추상 클래스와 Java 의 interface 의 차이[펌]  (0) 2009.10.31
set, get  (0) 2009.10.31
[셰이더] D3DVERTEXELEMENT9  (0) 2009.10.29
XML  (0) 2009.10.28

namespace first1031
{
    class Program
    {
        private int pay;
        public int Pay
        {
            get { return pay; }
            set { pay = value; }

        }

        static void Main(string[] args)
        {
            Program p = new Program();
            Console.WriteLine(p.Pay);
            p.Pay = 10;
            Console.WriteLine(p.Pay);
        }
    }
}

'Develop' 카테고리의 다른 글

C++ 의 추상 클래스와 Java 의 interface 의 차이[펌]  (0) 2009.10.31
Interface란?  (0) 2009.10.31
[셰이더] D3DVERTEXELEMENT9  (0) 2009.10.29
XML  (0) 2009.10.28
VI사용법 [펌]  (0) 2009.10.24

D3DVERTEXELEMENT9 VertexDeclModelerRigid[]
{   { 0, 0,  D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 },
    { 0, 12,  D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 6 },
    { 0, 16,  D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 1 },
    { 0, 20,  D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 7 },
    { 0, 24,  D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 0 },
    { 0, 28,  D3DDECLTYPE_SHORT4N, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0 },
    { 0, 36,  D3DDECLTYPE_SHORT4N, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_BINORMAL, 0 },
    { 0, 44,  D3DDECLTYPE_SHORT2N, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 },
    { 0, 48,  D3DDECLTYPE_SHORT2N, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 1 },
    { 0, 52,  D3DDECLTYPE_SHORT2N, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 2 },
    { 0, 56,  D3DDECLTYPE_SHORT2N, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 3 },
    { 0, 60,  D3DDECLTYPE_SHORT2N, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 4 },
    { 0, 64,  D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 5 },
}
두번째 인자는 시작하는 지점.
세번째 인자의 변수형 만큼 쓰겠다는 의미.
왜 이건 책에도 안써있는거야 -- 햇갈리게

'Develop' 카테고리의 다른 글

Interface란?  (0) 2009.10.31
set, get  (0) 2009.10.31
XML  (0) 2009.10.28
VI사용법 [펌]  (0) 2009.10.24
네트워크 통신 (Server)  (0) 2009.10.23

W3C | 번역

XML에서의 10가지

XML, XLink, Namespace, DTD, Schema, CSS, XHTML 등 ... 만약 XML을 새로이 접하게 된다면, 이와같은 용어는 매우 어렵게 느껴질것이다. 이 요약은 XML의 초보자들에게 기본적인 개념에 대하여 10 가지를 제공 함으로써 나무를 통하여 숲을 볼 수 있도록 하기 위한것이다. 그리고 만약에 XML에 대하여 발표를 하게 된다면, 이 10 가지에 대하여 시작해보지 않으시겠습니까?

1. XML은 구조적인 데이타를 위한것이다

스프레드 시트, 주소록, 형상 파라미터, 비지니스 트랜잭션, 그리고 기술 도면 등 구조를 가지는 데이타는 사물을 포함한다. XML은 텍스트 포맷을 설계하기 위한 규칙(가이드 라인이나 관례라고 생각할 수 있다)들의 집합이며, 이러한 규칙을 통하여 데이타를 체계화한다. XML은 프로그래밍 언어가 아니며, 따라서 XML을 배우거나 사용하기 위하여 프로그래머가 될 필요는 없다. XML은 컴퓨터가 쉽게 데이타를 생성하고, 읽고, 데이타 구조가 모호하지 않도록 하게 한다. XML은 언어를 설계하는데 일상적인 오류를 범하지 않도록 하며, 확장 가능하고, 플랫폼 독립적이며, 국제화와 지역화를 지원한다. XML은 유니코드를 충실히 지원한다.

2. XML은 다소 HTML과 같이 보인다

HTML과 같이 XML은 태그('<'와 >'등의 꺽쇠괄호)와 속성(이름="값"형태)을 이용한다. HTML이 각 태그와 속성의 의미가 무엇이고, 태그들 가운데의 텍스트가 어떻게 브라우저에 보일것인지를 기술하는 반면에, XML은 태그를 데이타들의 분리자로 사용할 뿐만 아니라 데이타에 대한 해석을 완전히 그것을 읽는 응용 프로그램에 맡긴다. 바꾸어 말하면, 만약 "<p>" 태그가 XML에 있다면, 이를 절(paragraph)로 추측하지 말아야 한다. 문맥에 의존적으로 값(price), 파라미터(parameter), 사람(person), 또다른 p...가 될 수 있다.

3. XML은 텍스트이며, 읽혀지는것만을 의미하지 않는다

스프레드 시트, 주소록, 그리고 다른 구조 데이타를 만들어내는 프로그램들은 종종 그 데이타를 바이너리나 다른 텍스트 형태로 디스크에 저장한다. 텍스트 포맷의 장점은 필요하다면 사람으로 하여금 그 데이타를 생산해내는 프로그램 없이 볼 수 있으며, 급할때는 텍스트 편집기로 텍스트 포맷을 읽을 수 있다. 또한, 텍스트 포맷은 개발자로 하여금 응용 프로그램을 더욱 쉽게 디버그 할 수 있도록 한다. HTML과 같이 XML 화일은 텍스트 화일이고, 사람들은 이를 직접 읽을 필요는 없으나, 필요하다면 읽을 수는 있다. HTML과 다른것은, XML 화일을 위한 규칙은 엄격하다. 태그들이 일치하지 않거나, 속성이 큰따옴표 없이 사용되면, XML 화일은 사용할 수 없게 된다. 반면에 HTML에서는 그러한 것에 대하여 관대하고, 또 명시적으로 허용한다. 공식적 XML 명세는 어플리케이션들이 잘못된 XML 화일의 생성을 만드는것을 금하고 있으며, 만약 XML 파일이 잘못되었다면, 그 즉시 처리를 중단하고, 에러를 알려야 한다.

4. XML은 크기가 커진다

XML이 텍스트 포맷이고 데이타를 구별하기 위하여 태그를 사용하기 때문에 XML 화일은 바이너리 포맷과 비교하면, 거의 그 크기가 크다. 텍스트 포맷의 장점은 명백하며(3번 항목 참조), 단점은 다른 방법으로 상쇄될 수 있다. 디스크 크기는 사용되어지는 것보다는 그리 고비용이 아니며, zip과 gzip과 같은 압축 프로그램은 빠르고 좋게 화일을 압축한다. 더욱이, 모뎀 프로토콜과 웹의 핵심 프로토콜인 HTTP/1.1과 같은 통신 프로토콜은 데이타를 즉각적으로 압축하고, 바이너리 포맷만큼 효과적으로 대역폭을 절약할 수 있다.

5. XML은 기술의 집합이다

XML 1.0 은 "태그"와 "속성"을 정의하는 명세이다. XML 1.0 이면에는 중요하고 자주 요청되는 일들에 유용한 서비스를 제공하는 모듈의 집합인 "XML 군(family)"이 있다. Xlink는 XML 화일에 하이퍼링크를 기술하는 표준 방법을 설명하고 있다. XPointerXFragments는 XML 문서의 일부분을 가르키기 위한 구문이다. XPointer는 URL과 비슷하나, URL이 웹상의 문서만을 가르키는 대신에 XPointer는 XML 내의 데이타 일부분을 가르킨다. CSS은 스타일 쉬트 언어로서 XML을 HTML과 같이 보이도록 하는데 적용된다. XSL은 스타일 쉬트를 정의할 수 있도록 개선된 언어이다. XSL은 태그들과 속성들을 재배치하고, 추가나 삭제하기 위하여 사용되는 변환 언어인 XSLT를 기반으로 한다. DOM은 프로그래밍 언어에서 XML(및 HTML) 화일을 조작하기 위한 표준 함수들의 집합이다. XML Schemas12는 개발자로 하여금 정확하게 XML 기반의 포맷의 구조를 정의하는데 이용된다. 이밖에도 더많은 모듈과 툴들을 이용할 수 있으며, 개발중에 있다. W3C의 기술 문서 페이지를 지켜보기 바란다.

6. XML은 새롭지만, 그렇게 새로운것은 아니다

XML의 개발은 1996년에 시작되었고, 1998년 2월에 W3C의 권고안으로 제정되었으나 다소 미완성의 기술이었다. 사실, 기술은 새로운것이 아니었다. XML 이전에 1980년대 중반에 개발되고 1986년에 ISO 표준으로 제정되었으며, 대용량 문서 프로젝트에 광범위하게 사용되는 SGML이 있었으며, 1990년에 개발된 HTML이 있었다. XML 설계자는 HTML의 시도를 참고로 단순히 SGML의 장점만을 취하여 SGML과 못지않은 기능을 제공하였으며, 더욱 사용하기 쉽되록 하였다. 그러나, 일부 진화된 모습을 혁명으로 말하기는 어렵다... 그리고, SGML이 대부분 기술 문서에 이용되고, 다른 종류의 데이타에는 덜 이용되는 반면에, XML은 그렇지 않다고 말할 수 있다.

7. XML은 HTML에서 XHTML로 이끌었다

중요한 XML 응용은 문서 포맷이고, HTML이후의 W3C의 XHTML이 바로 그것이다. XHTML은 HTML과 많은 부분에서 같은 엘리먼트가 이용된다. 문법은 XML의 규칙을 준수하기 위하여 약간만 변경되었다. "XML 기반의" 문서는 XML로부터 문법을 상속받았으며, 어떤 부분에서는 제약(예를 들어, XHTML은 "<p>"은 허용하지만, "<r>"은 허용하지 않는다)을 받으며; 그 문법에 의미(XHTML에서는 "<p>"이 "절(paragraph)"을 나타내며, "가격(price)", "사람(person)" 또다른 것을 의미하지 않는다)를 추가하기도 한다.

8. XML은 모듈식이다

XML은 다른 포맷을 조합하거나 재사용함으로써 새로운 문서 포맷을 정의하는것을 허용한다. 두개의 포맷이 독립적으로 개발되었을때 같은 이름의 엘리먼트나 어트리뷰트를 가질 수 있으며, 이를 조합할때는 주의하여야 한다. ("<p>"는 어떤 포맷에서는 "절(paragraph)"을 의미하지만, 다른 포맷에서는 "사람(person)"을 의미한다. 이름 혼동을 배제하기 위해서 포맷이 조합될 때, XML은 이름공간 메커니즘을 제공한다. XSL과 RDF는 이름공간을 사용하는 XML 기반 포맷의 좋은 예이다. XML 스키마는 두개의 스키마를 결합하여 합병된 문서 구조를 가진 또다른 스키마를 만들어내기 용이하게 함으로써, XML 문서 구조 정의의 단계에서 모듈화를 지원을 반영하기 위하여 설계되었다.

9. XML은 RDF와 시맨틱 웹의 토대이다

W3C의 RDF는 음악 연주 리스트, 사진 수집, 서지 목록과 같은 자원 설명과 메타데이타 응용을 지원하기 위한 XML 텍스트 포맷이다. 예를 들어, RDF는 개인 연락 리스트로부터의 정보를 이용하여 웹 사진 앨범의 사람을 식별하며, 자동적으로 웹상의 사진에 있는 사람들에게 메시지를 보내는데 이용된다. HTML이 문서, 메뉴 시스템, 그리고 폼 어플리케이션을 초창기 웹에 통합한것과 같이, RDF는 어플리케이션과 에이전트를 시맨틱 웹에 통합한다. 사람이 대화에 사용되는 단어의 의미에 합의하는것이 필요하듯이, 컴퓨터도 효과적으로 커뮤니케이션하기 위한 단어의 의미에 합의하는 메커니즘이 필요하다. 어떤 분야(예를 들어 쇼핑 또는 제조)에서 용어의 형식적인 설명은 온톨로지를 필요하게 되고, 그러한것은 시맨틱 웹의 필수적인 부분이다. RDF, 온톨로지, 그리고 의미의 표현은 컴퓨터가 사람에게 일하는것을 도와주게 되고, 그러한 모든것이 시맨틱 웹 활동의 주제이다.

10. XML은 라이센스 제약이 없으며, 플랫폼 독립적이고, 많은 지원이 있다

프로젝트에 기본으로서 XML을 선택함으로써, XML 관련 툴(이들은 이미 원하는 것을 할 수 있다)을 위한 크고 활동적인 커뮤니티를 접근하는 이득을 얻고, 기술적인 부분에서의 기술자들의 결험을 얻는것이다. XML을 채택하는것은 데이타베이스를 위하여 SQL을 선택하는것과 약간 비슷하다. - 자신의 데이타베이스를 만들어야 하며, 그를 위한 프로그램과 조작을 위한 프로시듀어를 만들어야 하지만, 이용할 수 있는 많은 툴이 있고, 도움을 줄 수 있는 많은 사람들이 있다는 부분에서 비슷한 것이다. 그리고, XML이 라이센스에 제약이 없기 때문에, 어떠한 사람에게 어떠한것을 지불하지 않고도 자신의 소프트웨어를 만들 수 있다. 또한 많은 지원과 성장적인 지원의 의미는 단일 회사에 묶여서 있는것이 아니라는 것이다. XML은 항상 최고의 해결책은 아니지만, 항상 고려할만한 가치는 있다.


W3C 커뮤니케이션 팀 , w3t-comm@w3.org
2001년 11월 13일 개정(최종 수정일 : $Date: 2001/12/20 10:34:31 $)
생성일 1999년 3월 27일, 버트 보스(Bert Bos)
(이전 버전)

Copyright © 1999-2000 W3C® ( MIT, INRIA, Keio), All Rights Reserved.

http://www.w3c.or.kr/Translation/XML-in-10-points.html.kr  [펌]

'Develop' 카테고리의 다른 글

set, get  (0) 2009.10.31
[셰이더] D3DVERTEXELEMENT9  (0) 2009.10.29
VI사용법 [펌]  (0) 2009.10.24
네트워크 통신 (Server)  (0) 2009.10.23
네트워크 통신 (Client)  (0) 2009.10.23
편집 시작
=========

$vi fname

Vi 편집기 작업은 명령모드와 입력모드의 두 상태가 있다.
초기 'vi fname'을 실행하면 창이 바뀌면서 명령모드(Command mode)가 된다.

1) 명령모드: 커서의 이동, 글자/단어/줄의 삭제나 블럭의 설정 등
   . 입력이 아닌 상태.
   . 작업 중 언제든지 를 누르면 명령모드가 된다.

2) 입력모드: 키보드로 입력되는 모든 글자가 입력되는 상태.
   .입력모드(Insert mode) 들어가기 : 'i'나 'a'(커서 다음에 입력)
    화면 하단에 "Insert" 표시 됨.
   .입력모드에서는 커서를 이동시킬 수 없다.
    다만 버젼과 환경에 따라 화살표 키(-> <- up, down)로 이동이 되는 경우도 있음.
   .입력모드 나가기(exit):
   .다음줄 입력 : 'o'

3) Cursor 이동: up 'k', down 'j', left 'h', right 'l'
   * 명령모드에서만 사용하여야 함.

4) 삭제:
   .Delete 1 character: 'x'
   .Delete multi character (ex 3 letters): '3x'
   .Delete line 'dd'
   .Paste 'p' (next line), 'P' (previous line)
      dd 후 사용
   .Delete multi line (ex 3 lines delete): '3dd'

5) 수정:
   .Modify 1 letter 'r' 화면 하단에 "Replace" 표시 됨.
   .Modify multi letters 'R'

6) 현재 로드된 파일 정보
   .Refresh(다시 보기) '^L'
   .Current information(파일 정보) '^G'
   .Search a word(찾기) '/word'
   .Search again(다시 찾기) 'n'

7) Undo(실행 취소) 'u'
8) Repeat(실행 반복) '.'

9) 저장:
   .Save ':w'
   .Save file name as tt('tt'라는 이름으로 저장) ':w tt'
   .Save and exit(현재의 파일로 저장하고 나가기) 'ZZ', ':wq'
   .Exit(Vi 나가기) ':q'
   .Exit without saving(저장하지 않고 나가기) ':q!'

10) Tips: 다음 과 ^L(refresh)를 자주 사용하시오!

11) 라인(줄) 명령:
   .Line 명령은 ':'로 시작한다. 화면 하단에 ":" 표시.
   .Read and insert a file fnme('fname' 파일을 커서 앞에 끼워 넣기) ':r fname'
  Cancel all modification and edit again(저장한 이후 모든 작업을 취소하고 다시 편집함) ':e!'


* vi 편집기 유용한 팁(습관):

1) [ESC]를 수시로 눌러 명령모드를 작업 기준모드로 삼는다.
   [ESC]는 몇번을 눌러도 좋으며, 키가 잘 안눌리는 수도 있으니 수시로
   [ESC] 키를 누르는 것이 좋다.

2) 글자가 깨지거나 화면이 이상할 때마다 CTRL-L을 수시로 눌러 화면을
   깨끗케한다. CTRL-L도 수시로 사용하는 것이 좋다.


입력 예 1)
==========

1) $vi test.c
-----------------------------------------------------------
|~                                                        |
|                                                         |
|                                                         |
|                                                         |
|                                                         |
|                                                         |
|                                                         |
|                                                         |
|                                                         |
|                                                         |
|                                                         |
|                                                         |
|                                                         |
|                                                         |
|                                                         |
|                                                         |
|                                                         |
|"test.c" [New File]                                        |
-----------------------------------------------------------

2) [ESC], 'i'  입력모드

3) 입력하고자 하는 내용을 넣는다.
   main()
   {  printf("Hello! Internet Programming !!!\n");
   }

4) [ESC] key나 'ZZ'(대문자 Z 주의)를 눌러 입력모드를 나온다.

5) :wq 저장하고 vi 편집기 마침

6) ls -l test.c 파일 확인

7) more test.c 파일 내용 확인


편집 수정 예 2)
===============

1) $vi test.c

2) [ESC], cursor 이동 명령(k, j, h, l)을 이용하여 고치고자 하는 문자에 커서를
   위치한다. 예로써 커서를 Programming의 g에 놓는다.

3) 'i' 입력모드 실행

4) ' is fun'을 입력하고 [ESC] key를 눌러 입력모드를 나온다.
   main()
   {  printf("Hello! Internet Programming is fun !!!\n");
   }

5) ':wq'나 'ZZ'(대문자 Z 주의)를 눌러 저장하고 vi 편집기를 나간다.

6) ls -l test.c 파일 확인

7) more test.c 파일 내용 확인


편집 수정 예 3)
===============

1) $vi test.c

2) [ESC], cursor 이동 명령(k, j, h, l)을 이용하여 고치고자 하는 문자에 커서를
   위치한다. 예로써 커서를 fun의 f에 놓는다.

3) 'x'를 세번 혹은 '3x'하여 'fun'을 삭제한다.

4) 'i' 입력모드 실행

5) 'very interesting'을 입력하고 [ESC] key를 눌러 입력모드를 나온다.
   main()
   {  printf("Hello! Internet Programming is very interesting !!!\n");
   }

6) ':wq'나 'ZZ'(대문자 Z 주의)를 눌러 저장하고 vi 편집기를 나간다.

7) ls -l test.c 파일 확인

8) more test.c 파일 내용 확인


편집 수정 예 4)
===============

1) $vi test.c

2) [ESC], cursor 이동 명령(k, j, h, l)을 이용하여 고치고자 하는 문자에 커서를
   위치한다. 예로써 커서를 두 번째 줄에 놓는다.

3) 'o' 다음 줄 입력모드 실행

4) 'printf("My name is Seo Kyeong Dae.\n");'을 입력하고 [ESC] key를 눌러 입력모드를 나온다.
   main()
   {  printf("Hello! Internet Programming is very interesting !!!\n");
      printf("My name is Seo Kyeong Dae.\n");
   }

5) ':wq'나 'ZZ'(대문자 Z 주의)를 눌러 저장하고 vi 편집기를 나간다.

6) ls -l test.c 파일 확인

7) more test.c 파일 내용 확인


편집 수정 예 5) : 인터넷 실행을 위한 수정
=========================================

1) cd ~/public_html 웹 디렉토리로 이동.
   만약에 public_html 디렉토리가 없으면
   cd ~로 홈 디렉토리로 이동 후  'mkdir public_html'로 디렉토리를 만든다.

2) 다시 'mkdir cgi-bin'으로 cgi-bin 디렉토리를 만든다.

3) cp test.c cgi-bin/myname.c <== 'test'를 'myname.cgi'로 복사

4) cd cgi-bin

5) $vi myname.c

6) [ESC], cursor 이동 명령(k, j, h, l)을 이용하여 고치고자 하는 문자에 커서를
   위치한다. 예로써 커서를 두 번째 줄 '{ '의 빈 칸(space)으로 이동시킨다.
   main()
   {_ printf("Hello! Internet Programming is very interesting !!!\n");
      printf("My name is Seo Kyeong Dae.\n");
   }

7) 'i' 다음 줄 입력모드 실행

8) 'printf("Content-Type: text/html\n\n"); # 줄바꿈
    printf("
\n");'
      printf("

Hello! Internet Programming is very interesting !!!

\n");
      printf("My name is Seo Kyeong Dae.\n");
      printf("
\n");
   }

15) ':wq'나 'ZZ'(대문자 Z 주의)를 눌러 저장하고 vi 편집기를 나간다.

16) ls -l myname.c 파일 확인

17) more myname.c 파일 내용 확인

18) gcc -o myname.cgi myname.c

19) ./myname.cgi 테스트 실행 및 결과 확인.

20) 웹 브라우저에서 'http://cim.skuniv.ac.kr/~id/cgi-bin/myname.cgi'로 실행
    확인.


----------------------------------------------------------------------------------------------------------------------------------

Vi 편집기 입문(Begging Editor vi)

Vi 편집기 작업은 명령모드와 입력모드의 두 상태가 있다.
초기 'vi fname'을 실행하면 창이 바뀌면서 명령모드(Command mode)가 된다.

1) vi 시작:
   . $vi fname
	vi			vi편집기를 호출한다.
	vi filename		기존에 있는 파일이면 그 파일을 열고 없는 파일이면 새로 만든다. 
	vi + 10filename		지정화일의 10번째 행부터 화일열기 
	vi +/"school" filename  지정화일내의 school이란 단어가 처음나오는 시점부터 열기 
	vi -r filename		손상된 파일을 복구 
	view filename		수정없이 읽기전용으로 열기 
	vi filenames		여러 파일명이나 와일드카드(*,?)로 여러 파일을
				차례로 불러 편집할 수 있다.(':n' next)

2) 명령모드: 커서의 이동, 글자/단어/줄의 삭제나 블럭의 설정 등
   . 입력이 아닌 상태.
   . 작업 중 언제든지 를 누르면 명령모드가 된다.

3) 입력모드: 키보드로 입력되는 모든 글자가 입력되는 상태.
   . 입력모드(Insert mode) 들어가기 : 'i'나 'a'(커서 다음에 입력)
     화면 하단에 "Insert" 표시 됨(표시가 안되는 화면도 있음).
   . 입력모드에서는 커서를 이동시킬 수 없다.
     다만 버젼과 환경에 따라 화살표 키(-> <- up, down)로 이동이 되는 경우도 있음.
   . 입력모드 나가기(exit): 
   . 다음줄 입력 : 'o'
	a 	커서 오른쪽에 문자삽입 
	A 	커서 오른쪽, 행의끝에 문자삽입 
	i 	커서 왼쪽에 문자삽입 
	I 	커서왼쪽, 행의 처음에 문자삽입 
	o 	커서 아래에 행 삽입 
	O 	커서 위에 행 삽입 
	 	작업완료후 반드시 입력 
 
4) Cursor 이동: up 'k', down 'j', left 'h', right 'l'
   * 명령모드에서만 사용하여야 함.
	h 	왼쪽으로 이동 				k
	j	아래로 이동 				^
	k	위로 이동 			h  <-	_   ->	l
	l 	오른쪽으로 이동 
	w 	한단어 오른쪽으로이동			v
	b 	한단어 왼쪽으로 이동 			j
	Return 	한행아래로 이동 
	Backspace 한문자 왼쪽으로 이동 
	Spacebar 한문자 오른쪽으로 이동 
	H 	화면의 맨위로 이동 
	M 	화면의 중간으로 이동 
	L 	화면의 맨 아래로 이동 
	^F 	한화면 앞으로 이동 
	^D 	반화면 앞으로 이동 
	^B 	한화면 뒤로 이동 
	^U 	반화면 뒤로 이동 

5) 삭제:
   . Delete 1 character: 'x'
   . Delete multi character (ex 3 letters): '3x'
   . Delete line 'dd'
   . Paste 'p' (next line), 'P' (previous line)
      dd 후 사용
   . Delete multi line (ex 3 lines delete): '3dd'
	x	문자삭제 
	dw	단어삭제 
	dd	행 삭제 
	D	커서 오른쪽 행 삭제 
	:5,10 d	 5-10째 행 삭제 

6) 수정:
   . Modify 1 letter 'r' 화면 하단에 "Replace" 표시 됨.
   . Modify multi letters 'R' 
	cw	단어 변경 
	cc	행 변경 
	C	커서 오른쪽의 행 변경 
	s	커서가 위치한 문자열 대체 
	r	커서 위치 문자를 다른 문자로 대체 
	r-Return 행 분리 
	J	현재 행과 아래 행 결합 
	xp	커서 위치 문자와 오른쪽 문자교환 
	-	문자형(대,소문자) 변경 
	u	이진 명령 취소 
	U	행 변경 사항 취소 
	:u	이전의 최종행 취소 

8) 텍스트 복사 및 이동
	yy	현재 커서가 있는 행의 전체 복사
	Y	행 yank(버퍼에 복사)
	yw	현재 커서가 있는 단어 복사
	y$	현재 커서가 있는 곳에서 그 행의 끝까지 복사 
	y^	현재 커서가 있는 곳에서 그 행의 시작까지 복사
	p	yank 되거나 삭제된 행을 현재 행 아래에 삽입 
	P	yank되거나 삭제된 행을 현재 행 위에 삽입 
	:1,2 co 3	1-2행을 3행 다음으로 복사 
	:4,5 m 6	4-5행을 6행 다음으로 이동 

9) 행 찾기 및 각 행마다 번호 표시
	G		파일의 마지막 행으로 가기 
	12G		파일의 12번째 행으로 가기 
	:set nu		행번호 표시 
	:set nonu	행번호 숨기기 

10) 단어나 문장 찾기 및 바꾸기
	/string/ 	string탐색 
	?string?  	string 역 방향 탐색 
	n(N) 		string의 다음(이전) 계속 탐색 
	:g/search-string/s//replace-string/gc 각 발생 탐색후 확인하고 대체 
	:s/str/rep/ 	현재 행의 str을 rep로 대체 
	:1,.s/str/rep/ 	1부터 현재 행의 str을 rep로 전부 대체 
	:%s/str/rep/g 	파일 전체 str을 rep로 전부 대체 

11) 마크 설정과 마크 호출
    . 문자 'm' 다음에 마크 이름으로 'a'에서 'z' 사이의 문자 하나를 선택한다.
      예) 'a'라는 이름으로 마크 설정: ma
    . 이동이나 호출은 '(single quotation mark)후 'a'에서 'z' 사이의 문자 하나를 선택 한다.
      예) 'a		설정된 마크 'a'로 이동
      예) :'a, d	마크 a에서부터 현재 커서가 있는 줄까지 삭제.

12) Buffering(특정 이름의 버퍼에 저장)
    . "(a-z)nyy		(a-z)라는 이름의 버퍼에 n줄 저장
      예) "a5yy		'a'라는 이름의 버퍼에 현재 줄부터 5줄을 저장.
    . "(a-z)p		(a-z)버퍼의 내용을 다음 줄에(p) 넣음.

13) 다른 파일 삽입
	:r filename 	커서 다음에 파일 삽입 
	:20 r filename 	파일을 20번째 행 다음에 삽입 
 
14) 단축 단어나 키(abbreviation) 사용법
    . :ab 약어(단축단어나 키) 바꿀 단어나 키
      예) :ab WW w! /tmp/test	':WW'명령 /tmp/test'로 저장.
      예) :ab inp internet programming
          입력모드에서 'inp'를 넣고 빈칸이나 줄바꿈 등을 치면 'internet programming'으로
          바뀐다.

15) 현재 로드된 파일 정보
   . Refresh(다시 보기) '^L'
   . Current information(파일 정보) '^G'
   . Search a word(찾기) '/word'
   . Search again(다시 찾기) 'n'
   . 현재 설정된 vi 환경보기 ':set'

16) Undo(실행 취소) 'u'

17) Repeat(실행 반복) '.'

18) 일련의 명령들을 하나의 명령으로 만들기
    :map (a-z,A-Z) 명령들
    예) :map z ncwPARK^[  'z' 명령으로 앞에서 찾은 단어('/단어' 실행)를 찾은(n) 후
		해당 단어를 PARK로 바꾼다.('^['는 로 '^V'로 입력한다.)
    예) :map Z dwwP	명령 'Z'는 현재 커서가 위치한 단어와 다음 단어를
			맞바꾼다.

19) 저장:
   . 저장 ':w'
   . 'tt'라는 이름으로 저장 ':w tt'
   . 'tt'라는 이름의 파일이 이미 존재할 때에는 덮어쓰기(강제 save)의 의미로
     '!'을 추가.  ':w! tt'
   . 현재의 파일로 저장하고 나가기(종료) 'ZZ', ':wq'
   . Vi 나가기 ':q'
   . 저장하지 않고 나가기 ':q!'
	:w 	변경사항 저장 
	:w filename 지정한 파일로 저장 
	:wq 	변경사항 저장후 vi종료 
	ZZ 	변경사항 저장후 vi종료 
	:q!  	변경사항을 저장하지 않고 vi종료 
   . MS Windows OS에서 사용하는 Vim이나 윈도우 텍스트 편집기 등에서 작성된
     문서는 다음줄(줄 바꾸기) 문자코드가 유닉스()와 다르다. DOS(Windows)
     텍스트 문서를 유닉스 vi로 보면 ^M로 보인다(DOS 형식인데 안 보일 수도 있음).
     문서를 저장하기 전에 :set로 보아 fileformat=unix 혹은 fileformat=dos로
     저장 형식을 알 수 있다. 아래 환경설정 참조)
     :set fileformat=unix 한 후 저장하면 유닉스 형식으로 저장된다.
     혹은 모든 '^M'코드를 삭제하면 유닉스형식이 된다. ':%s/^M//'
     여기서 '^M'은 '^V^M'로 입력할 수 있다.
	:set fileformat=unix	저장시 유닉형식 설정.
	:set fileformat=dos	저장시 DOS 형식 설정.

20) Tips: 다음 과 ^L(refresh)를 자주 사용하시오!

21) 라인(줄) 편집 명령:
   . Line 명령은 ':'로 시작한다. 화면 하단에 ":" 표시.
   . :[n1,n2] command	[범위] 명령
     예1) Read and insert a file fnme('fname' 파일을 커서 앞에 끼워 넣기) ':r fname'
     예2) Cancel all modification and edit again(저장한 이후 모든 작업을 취소하고 다시 편집함) ':e!'

22) 환경 설정
   . :set 

'Develop' 카테고리의 다른 글

[셰이더] D3DVERTEXELEMENT9  (0) 2009.10.29
XML  (0) 2009.10.28
네트워크 통신 (Server)  (0) 2009.10.23
네트워크 통신 (Client)  (0) 2009.10.23
키보드 이벤트  (0) 2009.10.23
server부분

----- protocol -----
Evt_Move = Event(2)
Evt_Move.key = {
 id = 1,
 x = 2,
 y = 3,
}

----- server -----
class 'testaServerApp' (ServerApp)

function testaServerApp:__init() super() 
 ..생략
 self:InitHandler()
end

function testaServerApp:OnMove(clientProxy, msg)
 self:SendToAll(msg)
end

function testaServerApp:InitHandler()
 self:SetMsgHandler(Evt_Move, self.OnMove)
end


전체적으로는 Client와 비슷하다.
프로토콜과 함수를 연결시키고, 해당 함수에서 일을 한다.
서버는 주로 패킷 중계, 데이터 저장, 로딩이 주된 일이다.
# iDoGame은 서버에서만 데이터에 접근할 수 있다.
브로드캐스팅 함수는
self:SendToAll(msg)
이다

첨부파일은 통신과 키보드 입력을 받으려고 연습한 프로젝트파일이다.
클라이언트는 두개까지 붙을 수 있고,
하나씩 붙을때마다 화면에 사각형의 스프라이트가 생긴다.
조작은 방향키.


'Develop' 카테고리의 다른 글

XML  (0) 2009.10.28
VI사용법 [펌]  (0) 2009.10.24
네트워크 통신 (Client)  (0) 2009.10.23
키보드 이벤트  (0) 2009.10.23
GDI 객체  (0) 2009.10.21

+ Recent posts