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
자려다가 우연히 하는 걸 보게 되었다.
지구 온난화에 대한 경고 메시지들.

이산화탄소의 꾸준한 배출.
기온의 상승.
해수면 상승.
괴물태풍의 등장.
댐수위상승으로 인한 방류.
냉각수의 온도 상승, 그리고 해파리 증가.
화력, 원자력 발전소의 발전중지.
유일한 희망인 수력발전. 하지만 방류로 인한 물부족.
바전을 위한 방류로 식수 부족 우려. 딜레마에 빠짐.
정전으로 인한 물공급 중단.
온도 상승으로 일어나는 인체의 변화는 인체가 적응하지를 못한다.
바다 온도의 상승은 바다 밑에 저장되있는 얼음형태의 메탄을 녹이고,
그 메탄들은 대기에 쌓인다.
대기의 메탄이 5%만 있어도 번개가 수시로 치고,
폭발을 하게 된다.
지구는 불바다가 된다.

뭐 이런 시나리오인데.
기억이 나지 않는것도 많다.
무섭다 이런 시나리오.

내가 실천할 수 있는 것은 무엇이 있을까..

'Think' 카테고리의 다른 글

칭찬의 역효과  (0) 2011.04.09
KGC2009 10/07  (0) 2009.10.08
편집 시작
=========

$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
Client 부분.

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

------ client -----
class 'testaClientApp' (ClientApp)

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

function testaClientApp:OnMove(server, msg)
 local id = msg:GetValue(Evt_Move.key.id)
 local x = msg:GetValue(Evt_Move.key.x)
 local y = msg:GetValue(Evt_Move.key.y)
 if id == 1 then
  self.scene.mal1:SetXPos(self.scene.mal1:GetXPos() + x)
  self.scene.mal1:SetYPos(self.scene.mal1:GetYPos() + y)
 elseif id == 2 then
  self.scene.mal2:SetXPos(self.scene.mal2:GetXPos() + x)
  self.scene.mal2:SetYPos(self.scene.mal2:GetYPos() + y)
 end
end

function testaClientApp:InitHandler()
 self:SetMsgHandler(Evt_Chat, self.OnChat)
 self:SetMsgHandler(Evt_Move, self.OnMove)
end

function testaClientApp:InitHandler() 에서 프로토콜과 함수를 매치시키고,
function testaClientApp:__init() super() 에서 호출한다.

프로토콜 아래의 key값들은 데이터를 실어서 보낼 변수들이다.
Evt_Move = Event(2)
Evt_Move.key = {
 id = 1,
 x = 2,
 y = 3,
}

그 변수들에서 값을 가져오는 함수는
msg:GetValue(Evt_Move.key.id)
이다.

'Develop' 카테고리의 다른 글

VI사용법 [펌]  (0) 2009.10.24
네트워크 통신 (Server)  (0) 2009.10.23
키보드 이벤트  (0) 2009.10.23
GDI 객체  (0) 2009.10.21
그리기, 쓰기 등등 함수  (0) 2009.10.21
사용자 입력처리는 Scene에서 처리 한다.

 class 'testaScene' (Scene)

function testaScene:__init(id) super(id)
 self:SetupUIObjects()
 self:SetMsgHandler(Evt_KeyboardDown, self.OnKeyDown)
 self.playerNumber = 0
end

function testaScene:OnKeyDown(msg)
 local move = 3
 local dir = Vector2(0, 0)
 local pressedL, optL = self:GetKeyPressed(UIConst.KeyLeft)
 local pressedU, optU = self:GetKeyPressed(UIConst.KeyUp)
 local pressedR, optR = self:GetKeyPressed(UIConst.KeyRight)
 local pressedD, optD = self:GetKeyPressed(UIConst.KeyDown)

 if pressedL then dir.x = dir.x-move end
 if pressedR then dir.x = dir.x+move end
 if pressedU then dir.y = dir.y-move end
 if pressedD then dir.y = dir.y+move end
 
 --local keyValue = msg:GetValue(Evt_KeyboardDown.key.Value)
 --if keyValue == UIConst.KeyUp then dir.y = dir.y - move end
 --if keyValue == UIConst.KeyDown then dir.y = dir.y + move end
 --if keyValue == UIConst.KeyLeft then dir.x = dir.x - move end
 --if keyValue == UIConst.KeyRight then dir.x = dir.x + move end

 local msgChat = Message(Evt_Move)
 msgChat:SetValue(Evt_Move.key.id, self.playerNumber)
 msgChat:SetValue(Evt_Move.key.x, dir.x)
 msgChat:SetValue(Evt_Move.key.y, dir.y)
 gameapp:SendToServer(msgChat)

end


방향키의 입력에 따라서 서버로 패킷을 보내는 함수다.

이벤트를 function testaScene:__init(id) super(id) 안에 등록 해줘야 한다.

방향키 입력 받는 걸 두가지 방식으로 생각해봤다.
self:GetKeyPressed()
msg:GetValue(Evt_KeyboardDown.key.Value)
이 두가지 함수가 있다.
첫번째 것은 다른 이벤트에서도 사용할 수 있다.
동시에 여러개의 키가 눌려있는지 검사하므로 대각선도 인식이 된다.
두번째 것은 키다운 이벤트에서만 사용 가능하다.
동시에 여러개의 키가 눌려있는지 검출이 안된다.

정의된 프로토콜을 이용해서 패킷을 서버로 보낸다.

'Develop' 카테고리의 다른 글

네트워크 통신 (Server)  (0) 2009.10.23
네트워크 통신 (Client)  (0) 2009.10.23
GDI 객체  (0) 2009.10.21
그리기, 쓰기 등등 함수  (0) 2009.10.21
Device Context (DC)  (0) 2009.10.21
GDI 객체를 사용하는 과정
1. GDI 객체를 스택에 생성한다.
2. 생성된 GDI 객체를 디바이스 컨텍스트에 선택하고 이전에 선택되어 있던 같은 종류의 GDI 객체의 주소를 저장해둔다. (CDC::SelectObject())
3. GDI 함수를 이용하여 추력을 한다.
4. 이전의 GDI 객체를 디바이스 컨텍스트에 선택함으로써 기존에 선택된 GDI 객체를 선택 해제한다. (CDC::SelectObject())
5. GDI 객체가 범위를 벗어나면 소멸자가 자동으로 호출되면서 파괴된다.





CPaintDC dc(this);
CPen pen(PS_SOLID, 1, RgB(255, 0, 0));
CPen *pOldPen = dc. SelectObject(&pen);
dc.Rectangle(100, 100, 200, 200)
dc.SelectObject(pOldPen);

브러시
솔리드 : CBrush(RGB(255,0,0));
해치 : CBrush(HS_DIACROSS, RGB(255,0,0));
패턴 : CBitmap bitmap;
         bitmap.LoadBitmap(IDB_BITMAP1);
         CBrush brush(&bitmap);

폰트
CPaintDC dc(this);
CFont font;
font.CreatePointFont(400, "Arial"); // 40 (=400/10) 폰트크기
dc.SelectObject(&font);
dc.TextOut(...);

내장객
윈도우에 미리 정의된
객체.
CDC::SelectStockObject()함수를 사용.

dc.SelectStockObject(NULL_PEN);
dc.SelectStockObject(GRAY_BRUSH);
dc.Rectangle(...);

비트맵

비트맵 정보
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP1);
BITMAP bmpinfo;
bmpinfo.GetBitmap(&bmpinfo);

# SelectObject(::GetStockObject(NULL_BRUSH)

비트맵 출력
1. CDC::CreateCompatibleDC() 함수를 이용하여 메모리 디바이스 컨텍스트를 만든다.
2. CDC::SelectObject() 함수를 이용하여 비트맵을 메모리 디바이스 컨텍스트에 선택한다.
3. CDC::BitBlt() 또는 CDC::StretchBlt() 함수를 이용하여 화면에 출력한다.


 

'Develop' 카테고리의 다른 글

네트워크 통신 (Client)  (0) 2009.10.23
키보드 이벤트  (0) 2009.10.23
그리기, 쓰기 등등 함수  (0) 2009.10.21
Device Context (DC)  (0) 2009.10.21
MFC 전역함수  (0) 2009.10.21
점찍기

GetPixel()

화면의 특정 위치에 해당하는 점의 색을 얻는다.
SetPixel()
화면의 특정 위치에 원하는 색의 점을 찍으며, 원래의 점의 색을 리턴한다.
SetPixelV()
SetPixel() 함수와 기능은 동일하지만 원래의 점의 색을 리턴하지 않으므로 속도가 빠르다.

선그리기

MoveTo()

현재 위치를 옮긴다.
LineTo()
현재 위치로부터 특정 위치까지 선을 그린 후 현재 위치를 갱신한다.

도형그리기

Rectangle()

사각형을 그린다.
Ellipse()
사각형에 내접하는 타원을 그린다.

CWnd::GetClientRect()
함수 원형 : void GetClientRect(LPRECT lpRect)
CRect는 RECT를 상속받았기 때문에 업캐스팅으로 바로 사용할 수 있다.


텍스트함수

TextOut()

특정 위치에 문자열을 출력한다.
DrawText()
사각형을 기준으로 문자열을 출력한다.
SetTextColor()
문자의 색을 바꾼다.
SetBkColor()
문자의 배경색을 바꾼다.
SetTextAlign()
기준 위치에 대한 문자열의 정렬 방식을 정한다.
SetBkMode()
불투명과 투명을 설정.

매핑 모드
: 윈도우 운영체제는 정해진 규칙에 따라, 프로그래머가 사용하는 논리 단위를 장치 단위로 변환하는 방법

SetMapMode()

MM_TEXT
기본 매핑 모드, 논리 단위와 장치 단위가 1대 1로 대응된다.
오른쪽, 아래쪽이 +

MM_LOMETRIC, MM_HIMETRIC, MM_LOENGLISH, MM_HIENGLISH, MM_TWIPS
장치 종류에 관계없이 물리적 길이가 항상 일정하도록 설계
오른쪽, 위쪽이 +

MM_ISOTROPIC, MM_ANISOTROPIC
사용자가 논리단위와 장치단위의 변환 관계를 정의할 수 있다. (프로그래밍 가능한 모드)
CDC::SetWindowEXt(), CDC::SetViewportExt()
#종횡비를 유지하는가, 그렇지 않은가 차이.
종횡비를 유지하는 방식을 레터박스모드, 그렇지 않은 방식을 확장, 팬스캔 모드라 부른다.


좌표변환
논리 좌표를 장치 좌표로 또는 그 반대로 바꿔주는 함수.
void LPtoDP(), void DPtoLP()

스크린 좌표를 클라이언트 좌표로 또는 그 반대로 바꿔주는 함수.
void ScreenToClient(), void ClientToScreen()

'Develop' 카테고리의 다른 글

키보드 이벤트  (0) 2009.10.23
GDI 객체  (0) 2009.10.21
Device Context (DC)  (0) 2009.10.21
MFC 전역함수  (0) 2009.10.21
CObject 클래스의 서비스  (0) 2009.10.21
Windows SDK (API) 에선?
1. 윈도우 운영체제에게 디바이스 컨텍스트르 요청한다.
2. 운영체제로부터 받은 디바이스 컨텍스트 핸들을 사용하여 출력을 한다.
3. 운영체제에게 디바이스 컨텍스트 사용이 끝났음을 알린다.

MFC 에선?
1. 디바이스 컨텍스트 객체를 생성한다.
2. 객체의 맴버함수를 호출하여 출력한다.
- 지역변수로 선언된 CDC객체는 생성자와 소멸자를 이용하여
   DC핸들의 요청과 소멸이 자동적으로 일어나므로 메모리 누수를 막을수 있다.
-생성자 : GetDC() 호출  |  소멸자 : ReleaseDC() 호출

CPaintDC
클라이언트 영역에 출력할 때(WM_PAINT 메시지 핸들러에서만 사용)

CClientDC
클라이언트 영역에 출력할 때(WM_PAINT 메시지 핸들러를 제외한 다른 모든 곳에서 사용)

CWindowDC
윈도우의 전체 영역(클라이언트 영역 + 비 클라이언트 영역)에 출력할 때

CMetaFileDC
메타파일에 출력할 때
#메타파일은 GDI 명령어를 저장할 수 있는 일종의 파일로, 디스크에 저장하거나 임시로 사용할 때는 메모리에 생성할 수도 있다.

'Develop' 카테고리의 다른 글

GDI 객체  (0) 2009.10.21
그리기, 쓰기 등등 함수  (0) 2009.10.21
MFC 전역함수  (0) 2009.10.21
CObject 클래스의 서비스  (0) 2009.10.21
Hash Table [펌]  (0) 2009.10.21

AfxMessageBox()
메시지 상자를 표시한다.

AfxGetApp()
응용 프로그램 객체의 주소를 리턴한다.
전역 응용 프로그램 객체의 주소값 (theApp)

AfxGetMainWnd()
메인 윈도우 객체의 주소를 리턴한다.
프레임 윈도우 객체의 주소값 (theApp.m_pMainWnd)
Multi Document 프로젝트에서 원하는 뷰와 도큐먼트를 찾아가기 위해 사용.
메인스레드가 아닌 다른 스레드에서 메인 윈도우가 필요할 경우 AfxGetApp()함수를 사용한다.
CWinApp *pApp = AfxGetApp();
CWnd *pMainWnd = pApp->GetMainWnd();

AfxGetAppName()
응용 프로그램의 이름을 리턴한다.
확장자를 제외한 실행파일 이름

AfxGetInstanceHandle()
인스턴스 핸들을 리턴한다.

AfxBeginThread()
스레드를 시작한다.

AfxEndThread()
스레드를 종료한다.

'Develop' 카테고리의 다른 글

그리기, 쓰기 등등 함수  (0) 2009.10.21
Device Context (DC)  (0) 2009.10.21
CObject 클래스의 서비스  (0) 2009.10.21
Hash Table [펌]  (0) 2009.10.21
네트워크 프로그래밍 [퍼옴]  (0) 2009.10.12

+ Recent posts