앞으로 단축키를 사용할때 어디에서 사용하는지를 나타내기 위해 아래의 4개의 모드(Normal Mode, Insert Mode, Visual Mode, Command Mode)를 사용할 것이다. 각각의 Mode 가 어떤것인지는 약간의 테스트를 한다면 금방 알 것이다.

   - Edit Mode : 문서의 삽입과 편집에서 사용하는 모드이다. 이는 아래의 3개의 모드로 나뉜다.

        1. Normal Mode : 커서로 이동할 수 있는 모드. Insert Mode중에 ESC키를 누르면 나오는
Normal Mode 이다.
        2. Insert Mode : 문서에 내용을 처넣는 Mode. 글자 치는 족족 입력이 된다.
        3. Visual Mode : Normal Mode에서 v, shift + v, ctrl + v등으로 선택할경우 나오는
                         모드이다. 선택영역을 지정할 때 뜨는 모드라고 생각하면 쉽다.

   - Command Mode : Normal Mode에서 콜론(:)을 입력했을때 아래에 명령어를 쳐 넣을수 있게 커서
                    가 뜨는데, 이때를 Command Mode라고 한다.

기본 사용 법 (Normal Mode)
     - 방금전에 입력한 것 또 입력하기 :    .
          만약 i를 눌러서 입력을 std::를 하고 ESC키를 누르면 방금 입력했던 istd::ESC가(키를 눌럿던
          모든 정보) 레지스터에 저장된다. 이때 다른곳에도 똑같은 입력을 하고자 한다면 입력하고자
          하는곳에 커서를 두고  . 을 누르면 방금전에 입력했던 std::가 입력될것이다.

기본 사용 법 (Insert Mode)

기본 사용 법 (Visual Mode)

기본 사용 법 (Command Mode)

고급 사용법 (Normal Mode)
   - 나뉘어진 창 두개를 switch 하기 : ctrl-w 그다음 r
      (주의 : 스위치할 반대편 창이 나뉘면 회전 안됨)

   - 반대편 괄호로 이동
       1. {} 괄호의 처음으로 이동 : [{
       2. {} 괄호의   끝으로 이동 : ]}
       3. () 괄호의 처음으로 이동 : [(
       4. () 괄호의   끝으로 이동 : ])

   - 특정 범위 접기 펴기
       1. 접기 : v 관련 녀석으로 범위를 설정z + f
       2. 펴기 : 접은 위치에서 z o

   - 북마크 하기
       1. 한문서 내에서 북마크 설정 : m + [a~z]
       2. 한문서 내에서 설정한 북마크로 이동 : ' (엔터키 옆의 작은따옴표) + 설정한 소문자
       3. 여러 문서 사이의 북마크 설정 : m + [A~Z]
       4. 여러 문서 사이의 이동 : ' + 설정한 대문자

   - 매크로 등록 및 사용 : 매크로는 에디터를 종료해도 저장된다.
       1. 매크로 등록 : q + 단축키 + 당신의 행동 + q
       2. 매크로 사용 : @ + 단축키

   - 현재커서의 단어를 색인대상으로 잡기 : #

   - 버퍼에 로드된 파일 닫기(버퍼 번호는 바뀌지 않는다) : :wb

-Wl,option : Pass option as an option to the linker.  If option contains commas, it is split into multiple options at the commas.

-g  Produce debugging information in the operating system’s native format (stabs, COFF, XCOFF, or DWARF 2).  GDB can work with this debugging information.

           Add support for multithreading using the POSIX threads library.  This option sets flags for both the preprocessor and linker.  It does not affect the thread safety of
           object code produced by the compiler or that of libraries supplied with it.  These are HP-UX specific flags.

-R filename
           Read symbol names and their addresses from filename, but do not relocate it or include it in the output.  This allows your output file to refer  symbolically  to  absolute
           locations of memory defined in other programs.  You may use this option more than once.

           For compatibility with other ELF linkers, if the -R option is followed by a directory name, rather than a file name, it is treated as the -rpath option.


-rpath-link DIR
           When using ELF or SunOS, one shared library may require another.  This happens when an "ld -shared" link includes a shared library as one of the input files.

           When the linker encounters such a dependency when doing a non-shared, non-relocatable link, it will automatically try to locate the required shared library and include  it
           in  the link, if it is not included explicitly.  In such a case, the -rpath-link option specifies the first set of directories to search.  The -rpath-link option may spec-
           ify a sequence of directory names either by specifying a list of names separated by colons, or by appearing multiple times.

           This option should be used with caution as it overrides the search path that may have been hard compiled into a shared library. In such a case it is possible to use  unin-
           tentionally a different search path than the runtime linker would do.

           The linker uses the following search paths to locate required shared libraries:

           1.  Any directories specified by -rpath-link options.

           2.  Any  directories  specified  by -rpath options.  The difference between -rpath and -rpath-link is that directories specified by -rpath options are included in the exe-
               cutable and used at runtime, whereas the -rpath-link option is only effective at link time. Searching -rpath in this way is only supported by native linkers and  cross
               linkers which have been configured with the --with-sysroot option.

           3.  On  an  ELF  system,  if  the -rpath and "rpath-link" options were not used, search the contents of the environment variable "LD_RUN_PATH". It is for the native linker

           4.  On SunOS, if the -rpath option was not used, search any directories specified using -L options.

           5.  For a native linker, the contents of the environment variable "LD_LIBRARY_PATH".

           6.  For a native ELF linker, the directories in "DT_RUNPATH" or "DT_RPATH" of a shared library are searched for shared libraries needed by it. The "DT_RPATH"  entries  are
               ignored if "DT_RUNPATH" entries exist.

           7.  The default directories, normally /lib and /usr/lib.

           8.  For a native linker on an ELF system, if the file /etc/ exists, the list of directories found in that file.

           If the required shared library is not found, the linker will issue a warning and continue with the link.

--start-group archives --end-group
           The archives should be a list of archive files.  They may be either explicit file names, or -l options.

           The specified archives are searched repeatedly until no new undefined references are created.  Normally, an archive is searched only once in the order that it is specified
           on  the  command line.  If a symbol in that archive is needed to resolve an undefined symbol referred to by an object in an archive that appears later on the command line,
           the linker would not be able to resolve that reference.  By grouping the archives, they all be searched repeatedly until all possible references are resolved.

           Using this option has a significant performance cost.  It is best to use it only when there are unavoidable circular references between two or more archives.


           Link  against  dynamic  libraries.   This is only meaningful on platforms for which shared libraries are supported.  This option is normally the default on such platforms.
           The different variants of this option are for compatibility with various systems.  You may use this option multiple times on the command line: it affects library searching
           for -l options which follow it.

           Set  the  "DF_1_GROUP"  flag  in the "DT_FLAGS_1" entry in the dynamic section.  This causes the runtime linker to handle lookups in this object and its dependencies to be
           performed only inside the group.  --unresolved-symbols=report-all is implied.  This option is only meaningful on ELF platforms which support shared libraries.

           Do not link against shared libraries.  This is only meaningful on platforms for which shared libraries are supported.  The different variants of this option are  for  com-
           patibility  with  various  systems.   You may use this option multiple times on the command line: it affects library searching for -l options which follow it.  This option
           also implies --unresolved-symbols=report-all.  This option can be used with -shared.  Doing so means that a shared library is being created but that all of  the  library’s
           external references must be resolved by pulling in entries from static libraries.


           Add the archive or object file specified by namespec to the list of files to link.  This option may be used any number of times.  If namespec is of the form :filename,  ld
           will search the library path for a file called filename, otherise it will search the library path for a file called libnamespec.a.

           On systems which support shared libraries, ld may also search for files other than libnamespec.a.  Specifically, on ELF and SunOS systems, ld will search a directory for a
           library called before searching for one called libnamespec.a.  (By convention, a ".so" extension indicates a shared library.)  Note that this behavior  does
           not apply to :filename, which always specifies a file called filename.

           The linker will search an archive only once, at the location where it is specified on the command line.  If the archive defines a symbol which was undefined in some object
           which appeared before the archive on the command line, the linker will include the appropriate file(s) from the archive.  However, an undefined symbol in an object appear-
           ing later on the command line will not cause the linker to search the archive again.

           See the -( option for a way to force the linker to search archives multiple times.

           You may list the same archive multiple times on the command line.

           This type of archive searching is standard for Unix linkers.  However, if you are using ld on AIX, note that it is different from the behaviour of the AIX linker.

Test Driven Development : TDD란 개발하고자 하는 프로그램(혹은 프로그램을 구성하고 있는 컴포넌트)의 동작을 점검할 수 있는 테스트를 먼저 작성하고 테스트를 통과할 수 있게 코딩을 하는 방법을 말한다.

Unit Test : 하나의 프로그램을 일을하는 작은 단위로 잘게 나누어작은 단위들이 올바로 동작하는지를 확인하는 과정이다. Test Driven Development 를 하기위해 이용하는 하나의 매커니즘이다.

Why should we use?
 - TDD를 사용하는 이유('익스트림 프로그래밍' 책을 인용하였습니다.)

      1) 프로그램의 동작 명확화 : 프로그래밍 할때 간혹 '혹시 모르니까 넣어두자'는 식의 코드들을 추가하기 쉽다. 이 프로그램이 무엇을 해야하는지 객관적으로 명확히 명시를 하게 된다면, 코딩의 초점을 일어버리지 않는다. 다른 코드를 넣고 싶다면, 현제 작성한 테스트를 통과하게 만든 다음에 또 다른 테스트를 작성하라.

      2) 설계의 문제점 검토 : 테스트를 작성하기가 쉽지 않다는 말은, 테스트 작성 자체의 문제라기보다는 프로그램의 설계상에 문제가 있다는 것이다. 응집성이 높은 객체들의 코드는 테스트하기 쉽다.

      3) 신뢰도 증가 : 여러사람이 작성하는 프로그램의 경우 문제를 일으키게 되면 서로의 코드를 의심할 수 있다. 잘 동작하는 최적화된 코드를 작성하고 자동화된 테스트로 코드의 의도를 분명히 드러낸다면 팀원들은 쉽게 신뢰할 수 있을 것이다. 가령 프로젝트를 버전업하기 위해 다른사람이 투입되거나, 원래 개발자가 개발한지 오래 되었다면 버전업을 위해 추가한 코드가 기존의 프로그램에서 어떤 문제를 야기하는지 알기 위해서는 릴리즈 하고나서 수많은 고객 테스트를 거쳐야 알 수 있다. 그래서 TDD를 도입하여 추가기능에 대한 안정성에 대한 신뢰도를 보하려는 것이다. 또한 개발자 입장에서 테스트 코드를 보다보면 메뉴얼에 기술한 내용보다 몇배는 명확하게 다가오기 마련이다.

      4) 프로그래밍의 리듬 유지 : 본인이 가장 공감가는 이야기. 코딩을 하다보면 몇 시간씩 무엇을 해야 할 지 길을 잃고 헤매는 일이 잘 일어난다. TDD를 이용한다면 다음에 무엇을 할 지가 분명해진다. 다음 할 일이란 다른 테스트를 작성하거나 통과되지 않는 테스트를 통과하도록 만드는 일중에 한가지 이기 때문이다.

Efficient Usage

Any Problems?
 - 간과할 수 있는 사항 : 미시적 관점에서 행하는 테스트이기 때문에 '두 객체가 함께 잘 동작하는가?' 등의 사항은 고려할 수 없다는데에 한계가 있다.

사용자 삽입 이미지
솔직히 말해서 실망했다. 더 크고, 확실한 성과를 기대했던 것이다.

코드의 품질이 나아질 거라고 말했지만, 사실 내 코드의 품질은 더 나빠졌다. (사실은 제대로 읽어보면, 실질적으로 나뻐진 게 아니라, 잘못 사용하고 있던 것들을 들춰내서 표면적으로 나뻐졌다는 이야기가 나옵니다.)

끝내주는 비방(silver bullet) 같은 게 아니었다.

[그러나] 내가 말하고 싶은 것은, 나는 결코 [테스트 주도 개발(이하 TDD)을 하기] 이전으로 돌아가지 않으리라는 것이다.

코드의 품질을 낮아졌지만, 코드에 대한 나의 이해는 높아졌다.

누군가는 이렇게 말할지 모르겠다. "어떤 규칙 같은 걸 만들어서, 네가 변경하는 코드를 제대로 이해하고 있는지 확인하는 건 어때? 그걸 위해서 굳이 TDD [같은 번거로운 것]을 할 필요까지는 없잖아?" 글쎄, 나는 거의 항상 변경하려는 코드를 이해하고 있다고 생각한다. 그런데 그러고 보니까 내가 정말 내가 그러고 있기는 하나? 이게 바로 TDD가 정말 도움이 되는 부분이다.

이것이야 말로, 내가 듣지 못한 TDD의 커다란 장점이다.


My Opinion

TDD 나 Unit test 또한 짧은 시간내에 유용성을 느끼기는 쉽지 않겠지만 좋은 프로그래밍 기법의 한가지 답이 될 수 있을 것이다. 당부하고자 하는 것은, 짧은 지식으로 이것들을 맛보기만 한 후 그것이 효율적이지 않다고 결론을 내리는 우를 범하지 않길 바란다. Copy & Paste 를 남발하고, 대충 대충 코딩하는 사람은 프로그래머가 아니다. 단지 문서를 작성하는 사람일 뿐이다.

by Leanu


CppUnit Wiki :

CppUnit CookBook :
CppUnit CookBook (한글) :

Boost Unit Test Library :

Doxygen 이란 소스코드에 일정형식으로 주석을 달면

그에 따른 메뉴얼을 자동으로 생성해주는 툴이다.

정리는 이용하면서 틈틈히 채워주겠다.

<참고 site>

====================================== [ vi 관련 tip ]

< Error Msg : Unknown terminal type >

   A.     원인: 터미널 환경변수 잘못 지정
   B.      해결
                         i.         C Shell: setenv TERM vt100

                        ii.         Bourne Shell: export TERM=vt100

<자주 쓰는 명령어>



Ctrl + D

Ctrl + U

반 페이지 위로 이동

반 페이지 아래로 이동

O (대문자)

현재 커서의 본문부터 한 줄씩 내리고 새로운 한 줄 생성

0 (숫자), $

라인 처음, 끝으로 이동


라인의 첫 글자로 이동



전 함수로 이동

다음 함수로 이동

F + 모든글자

그 라인에서 입력한 글자가 처음으로 발생한 글자로 이동


:wq!  와 같음


커서 뒤의 문자열 삭제






:w file.txt

file.txt 파일로 저장

:w >> file.txt

file.txt파일에 덧붙여서 저장


vi종료(저장이 안됐을시 경고)


vi강제 종료(경고 무시)


강제 저장 후 종료

:e file.txt

file.txt파일을 불러옴


현재 파일을 불러옴





커서위치 다음 칸부터 입력


커서의 위치에 입력


커서의 다음 행에 입력


커서 위치의 한 글자를 지우고 입력






왼쪽으로 이동


오른쪽으로 이동


아래 행으로 이동


행으로 이동


다음 단어의 글자로 이동


이전 단어의 글자로 이동


행의 글자로 이동 Home키와 동일


행의 마지막 글자로 이동 End키와 동일


문서의 행으로 이동


문서의 마지막 행으로 이동


n행으로 이동 (여기서 n 숫자임)





커서 위치의 글자 삭제


단어를 삭제


커서가 있는 행을 삭제

& 붙이기>




커서가 위치한 복사




N행만큼 복사 (N 숫자임)


N번만큼 붙여넣기 (N 숫지임)

지정 관련>




블록 지정 (v 누른후 h j k l 통해 블록 지정)






대문자로 만듬


소문자로 만듬

탐색 치환>




문자열을 탐색


문서 전체에서 old new 교체

버퍼 관련 명령 요약>




버퍼의 내용을 나열


N 버퍼로 이동(N 숫자임)


N 버퍼를 완전 삭제(N 숫자며, 없으면 현재의 버퍼삭제)

<출처> "자바먹어"님의 블로그
  1. Favicon of BlogIcon leanu 2008.03.11 15:11 신고

  2. Favicon of BlogIcon 내향~* 2008.05.09 09:29 신고

    <문자열 수정>
    r - 커서 위치의 문자를 바꾼다.
    . - 최근 명령어를 반복한다.
    u - 최근 작업을 취소한다.

  3. Favicon of BlogIcon leanu 2008.05.13 19:29 신고

    차후 필요한 기능만 추려서 정리할 예정

+ Recent posts