'Technical Note/etc'에 해당되는 글 9건

Technical Note/etc

vi를 자주 사용하지만

항상 사용하는 단축키만 사용해서.. 이번기회에 다시 정리해본다


Terminal 설정 

% vi 라고 입력했을 때 에러(error)가 나는 경우 

csh(C Shell) : .login file에 setenv TERM vt100 

sh(Bourne Shell) : .profile file에 TERM=vt100; export TERM


Mode 

명령 모드 : 명령을 입력할 수 있는 모드 

입력 모드 : ‘I’를 입력하여 입력이 가능한 모드 

vi를 이용한 문서 작성 

% vi [작성할 file name] 

커서의 이동 

문자 단위의 이동 

대부분의 터미널에서는 화살표키로 이동 가능 

만약 화살표카가 지원되지 않는 경우는 다음의 키를 이용 

 

줄단위의 이동 

n : 현재 행으로부터 n번째 행으로 이동 

+ : 다음 행의 처음으로 이동 

- : 이전 행의 처음으로 이동 

단어, 문장 절 단위이동 

f 문자 : 다음에 나타나는 “문자”로 이동 

F 문자 : 이전에 나타나는 “문자”로 이동 

( : 문장의 처음으로 이동 

) : 문장의 끝으로 이동 

; : 같은 방향으로 다음 “문자”로 이동 

{ : 커서가 인접한 패러그래프의 시작위치로 이동 

} : 커서가 인접한 이전 패러그래프의 시작위치로 이동 

화면 단위 이동 

^B : 이전 화면으로 이동 

^F : 다음 화면으로 이동 

^U : 반화면 앞으로 이동 

^D : 반화면 뒤로 이동 

z :커서의 위치를 화면의 Top으로 스크롤 

z. : 커서의 위치를 화면의 중앙으로 스크롤 

z- : 커서의 위치를 화면의 bottom으로 스크롤 

^L : 화면의 재 출력


삽입과 지우기, 복구, 교체 

삽입 

i : 현재 커서의 위치부터 삽입 

a : 현재 커서의 위치 다음부터 추가 시작 

A : 현재 줄의 마지막에 추가 시작 

I : 현재 줄의 처음에 추가 시작 

o : 현재 라인의 아래에 새로운 라인을 열어준다. 

O : 현재 라인의 위에 새로운 라인을 열어준다. 

지우기 

x : 커서 위치의 한 문자를 지운다. 

X : 커서 이전의 한 문자를 지운다. 

dd : 현재의 행을 지운다. 

ndd : n개의 라인을 지운다. 

dG : 현재 행부터 file의 끝까지 지운다 

d0(숫자 0) : 행의 시작부터 현재 앞 문자까지 지운다. 

d1G : 현재 행부터 file의 시작까지 지운다. 

dnG : 현재 행에서 n번째까지 지운다. 

복구 

p : 버퍼의 내용을 현재 줄 이전에 복구한다. 

P : 버퍼의 내용을 현재 줄 다음에 복구한다. 

VI -r [작업하던 file name] : 시스템이 갑자기 꺼졌을 때 복구 명령 

교체 

cw : 현재 위치에서 단어 교체 

cfc : 현재 위치에서 'c' 문자까지 변경 

' . ' : VI에서 마지막 명령을 반복하라는 뜻이다.


검색 치환 

검색 

/문자열 : 문자열을 앞으로 검색한다. 

?문자열 : 문자열을 뒤로 검색한다.


치환 

[범위]s/old/new/[cgi] : old를 new로 치환해 준다. 

[범위] : 숫자, $, .(현재 위치)등을 지정한다. 

[cgi] : c는 변경시 변경여부를 묻는 플래그 

g는 한 줄의 모든 것을 변경하는 것이고 I 는 검색시 대소문자를 구분하지 않는다. 

예) 10,$s/old/new/g : 10줄에서 파일의 끝까지 수행 

g/foobar/s/bar/baz/g : 전체 file에서 “foobar”를 찾아서 “foobar” 중 bar를 baz로 치환한다.

 

블록 명령 

블록을 file에 저장, 첨가 

명령모드 ":" 프롬프트 상에서 

: 10,20w [file name] : 블록을 file에 저장 

: 10,20w >> [file name] : 블록을 file에 추가


블록 읽어 오기 

: 10,20r [file name] : 10에서 20까지에 file을 읽어 현재 줄에 삽입


블록 자르기 

여러분이 수정을 하거나 삭제를 하면 버퍼에 그 내용을 복사를 합니다. 여기서 필요한 부분을 버퍼에 복사하는 것을 yank 라 합니다. 이 내용을 나중에 다시 불러와서 사용할 수 있습니다. 

buffer에도 이름을 부여하여 블록을 저장할 수 있습니다. ( " 사용) 

"name5dd : 현재 줄에서 5줄을 삭제하고 name으로(여러분이 부여한) 버퍼에 기록


블록 복사 

yw : 한 단어 버퍼에 기록 

y$ : 줄의 끝까지 기록 

yy : 현재 줄을 버퍼에 기록 

역시 name을 주어 buffer에 기록 할 수 있다.


블록 붙이기 

커서를 원하는 곳으로 이동한 후 

p : 현재 커서 위치 오른쪽에 추가한다. 

P : 현재 커서 위치 왼쪽에 추가한다. 

namep : buffer에 있는 name의 블록을 현재 위치에 추가


다른 file 편집 

% vi file file file file ...... 

다른 file로 이동할 때는 : 프롬프트 상에서 :n 이라 입력한다. 

: shell 이라 치면 VI를 종료하지 않고 shell 화면으로 나갈 수 있다. 

다시 VI로 이동할 때는 exit라 입력한다.


VI 환경 설정 

VI에도 환경을 설정할 수 있습니다. 

Vi 상태에서 :set all을 입력하면 현재 사용중인 VI의 옵션 지정상태를 볼 수 있습니다. 

이러한 옵션은 여러분의 HOME DIRECTORY에 .exrc란 file에 지정하지 않으면 디폴트값을 사용합니다. 

다음은 현재 저자의 .exrc 의 내용입니다. 

 

VI 중요한 옵션 옵션

 약자

 Default Value

 의미

 

autoindent ai noai 자동 들여쓰기, 즉 바로 전의 행과 시작을 같이함 

ignorecase ic noic 탐색에 있어 대소문자를 구별하지 않음 

magic   magic * [ ~ 등을 탐색 또는 정규 표현식의 와일드 카드로 또는 메타문자로 사용 

numver nu nonu 에디터 각 행에 행번호가 매겨짐 

redraw   noredraw 각 문자를 항상 알맞은 위치에 나타내 줌

noredraw은 1200보울 이하의 느린 터미널에 쓰임 

tabstap ts ts=8 Tab키 또는 Ctrl-I에 대응되는 공백의 개수 저장 

wrapscan ws ws / 또는 ? 연산자로 탐색을 하는 경우 사용됨 

wrapmargin wm ws=0 오른쪽 여백의 크기를지정

 명령모드 ( ! 대소문자 철저히 구별 ! )

* 커서 이동 하기 *

  

좌화살표키

  커서를 한 위치 앞으로 이동

  w

  커서를 다음 단어의 첫번째 문자로 이동

  

우화살표키

  커서를 한 위치 뒤로 이동

  ]]

  커서를 다음 단락 경계로 이동

  

상화살표키

  커서를 한 위치 위로 이동

  [[

  커서를 이전 단락 경계로 이동

  

하화살표키

  커서를 한 위치 아래로 이동

  )

  커서를 다음 문장의 앞으로 이동

  

-

  커서를 앞 라인 시작위치로 이동

  (

  커서를 다음 문장의 앞으로 이동

  

+

  커서를 다음 라인 시작위치로 이동

  }

  커서를 다음 절의 앞으로 이동

  

0(영)

  커서를 현재 라인의 시작위치로 이동

  {

  커서를 이전 절의 앞으로 이동

  

$

  커서를 현재 라인의 끝으로 이동

  H

  커서를 편집버퍼의 첫번째 라인으로 이동

  

^

  커서를 현재 라인의 탭으로 이동

  L

  커서를 편집버퍼의 마지막 라인으로 이동

  

b

  커서를 이전 단어의 처음 문자로 이동

  M

  커서를 편집버퍼의 중간 라인으로 이동

  

e

  커서를 다음 단어의 마지막 문자로 이동

   

   

  

* 편집버퍼를 통해 이동하기 *

  

ctrl B

  한 화면 위로 이동

  nG

  n 번째 라인으로 이동

  

ctrl D

  반 화면 아래로 이동

  1G

  첫번째 라인으로 이동

  

ctrl F

  한 화면 아래로 이동

  G

  마지막 라인으로 이동

  

ctrl U

  한 화면 위로 이동

   

   

 

 

* vi 편집 명령 1 *

  

~

  활자체를 변경한다

  dd

  현재 라인을 삭제한다

  

move

  새 텍스트를 삽입하여 커서 위치에서  대치한다

  :line

  지정된 라인의 시작으로 간다

  

cc

  새 텍스트를 삽입하여 라인 전체를 대치한다

  :lined

  지정된 라인을 삭제한다

  

C

  새 텍스트를 라인 끝에 대치한다

  D

  커서에서 행끝까지 삭제

  

ddp

  두 라인의 순서를 바꾼다

  x

  커서의 위치에 있는 문자를 삭제

  

r

  한 문자를 대치하나 입력모드로 가지않는다

  X

  커서의 왼쪽에 있는 문자 삭제

  

s

  삽입에 의해 현재라인을 대치한다

  :liner 파일명

  지정된 라인뒤에 파일내용 삽입

  

xP

  두 문자의 순서를 바꾼다

  :r 파일명

  현재 라인뒤에 파일내용 삽입

  

deep

  두 단어의 순서를 바꾼다

  :r !command

  현재 라인뒤에 명령실행 출력 삽입

  

.

  마지막 명령을 반복한다

  :liner !command

  지정된 라인뒤에 커맨드 출력 삽입

  

u

  마지막 명령을 취소한다 (uu는취소를 취소)

  :linecotarget

  지정된 라인을 복사하고 타겟뒤에 삽입

  

U

  현재 라인을 복구

  :line,linecotarget

  지정된 범위를 복사하고 타겟뒤에 삽입 

  

ctrl I

  화면을 리프레쉬

  :linemtarget

  지정된 라인을 이동하고 타겟뒤에 삽입

  

dmove

  커서의 움직임으로 삭제한다

  :line,linemtarget

  지정된 범위를 이동하고 타겟뒤에 삽입

  

dG

  현재 라인에서 버퍼의 끝까지 삭제한다

   

   

 

 

*  vi 편집 명령 2 *

  

:!command

  vi를 멈추고 지정된 쉘 명령을 실행

  :w

  vi를 끝내지 않고 원래 파일에 저장

  

:!!

  vi를 멈추고 이전 쉘 명령을 실행

  :w 파일명

  지정된 파일명에 저장

  

:sh

  vi를 멈추고 쉘을 시작

  :w>   파일명

  지정된 파일의 끝에 데이타 저장

  

:!csh

  vi를 멈추고 C쉘을 시작

  :q

  저장하지 않고 끝내기

  

 

   

  ZZ

  데이터를 자장하고 끝내기

 

 

* vi에서  입력 모드를 호출하는 명령 *

  

a

  현재 커서뒤에 새 텍스트를 추가

  I

  현재 라인의 처음부터 새텍스트를 삽입

  

A

  현재 라인의 끝에 새 텍스틀 모드를 추가

  o

  현재 라인의 앞에 새라인을 오픈하고 추가시작

  

c

  변경을 시작한다

  O

  현재 라인의 뒤에 새라인을 오픈하고 추가시작

  

C

  라인의 끝에서 변경을 시작

  R

  새문자들로 텍스트를 덮어쓴다

  

i

  커서 위치 앞에서 텍스트를 삽입

   

   

 


vi 환경설정

 

홈디렉토리에 .exrc파일에서

..  set nocompatible " Vim 디폴트 기능들을 사용함 

set backspace=2 " 삽입 모드에서 백스페이스를 계속 허용 

set autoindent " 자동 들여쓰기 

set cindent " C 언어 자동 들여쓰기 

set smartindent " 역시 자동 들여쓰기 

set textwidth=76 " 76번째 칸을 넘어가면 자동으로 줄 바꿈 

set nowrapscan " 찾기에서 파일의 맨 끝에 이르면 계속하여 찾지 않음 

"set nobackup " 백업파일을 만들지 않음 

set novisualbell " 비주얼벨 기능을 사용하지 않음 

set nojoinspaces " J 명령어로 줄을 붙일 때 마침표 뒤에 한칸만 띔 

set ruler " 상태표시줄에 커서 위치를 보여줌 

set tabstop=4 " <Tab> 간격 

set shiftwidth=4 " 자동 들여쓰기 간격 

"set keywordprg=edic " K를 눌렀을 때 실행할 명령어 

set showcmd " (부분적인) 명령어를 상태라인에 보여줌 

set showmatch " 매치되는 괄호의 반대쪽을 보여줌 

set ignorecase " 찾기에서 대/소문자를 구별하지 않음 

set incsearch " 점진적으로 찾기 

set autowrite " :next 나 :make 같은 명령를 입력하면 자동으로 저장 

set title " 타이틀바에 현재 편집중인 파일을 표시

Technical Note/etc

CGLIB 는 코드 생성 라이브러리 (code Generator Library) 런타임에 동적으로 자바 클래스의 프록시를 생성해 주는 기능을 제공

CGLIB를 사용하면 매우 쉽게 프록시 객체를 생성할 수 있음, 성능 또한 우수하다.

더불어 인터페이스가 아닌 클래스에 대해서 동적 프록시를 생성할 수 있음

Hibernate는 자바민 객체에 대한 프록시를 생성할때 CGLIB를 사용하며, Spring은 프록시 기반의 AOP를 구현할 때 CGLIB를 사용하고 있음


Proxy에 대하여 : 핵심 기능은 원하는 메서드가 호출될때 이 메서드를 가로채어 우리가 원하는 특정 기능을 추가할 수 있도록 지원하는 것


Spring AOP는 두가지 Type의 Proxy를 지원하고 있다. 

1. JDK의 Proxy 기능 이용

2. CGLIB의 Enhancer 클래스 이용


JDK의 Proxy 

: JDK의 Proxy는 인터페이스에 대한 Proxy만을 지원하며, 클래스에 대한 Proxy를 지원할수 없다는 것이 큰 단점,

또한 이미 구현되어 있는 애플리케이션에 Proxy 기능을 추가할때 JDK Proxy를 사용한다면 클래스로 구현되어 있는 소스에서 인터페이스를 추출한 다음 Proxy를 적용할 수 밖에 없다는 것이 단점

JDK Proxy가 가지는 또 하나의 단점은 Target 클래스에 Proxy를 적용할 때 PointCut에 정보에 따라 Advice되는 메서드와 그렇지 않은 메서드가 존재한다. 그러나 JDK Proxy를 사용할 경우 Target 클래스에 대한 모든 메서드 호출이 일단 JVM에 Intercept한 다음 Advice의 invoke 메소드를 호출하게 된다. 그 후에 이 메서드가 Advice되는 메서드 인지 그렇지 않은지를 판단하게 된다. 이과정에서 JVM에 의하여 Intercept한 다음 Invoke 메소드를 호출할 때 JDK의 reflection을 호출하게 되는것이다. 이는 Proxy를 사용할 때 실행 속도를 상당히 저하시키는 원인이 된다.


CGLIB Proxy

: 이 또한 JDK Proxy처럼 Runtime시에 Target 메서드가 호출될때 해당 메서드의 Advice 적용 여부를 결정함

그러나 CGLIB는 메서드가 처름 호출되었을 때 동적으로 bytecode를 생성하여 이후 호출에서는 재사용 과정을 거침. 그러므로 두번째 호출 부터는 실행 속더의 향상을 가져옴



Technical Note/etc

Sonar 

http://blog.naver.com/PostView.nhn?blogId=stonedragony&logNo=50100178043


- codehaus에서 개발한 코드 품질 관리 플랫폼으로 유명한 오픈 소스 툴

- PMD, Checkstyle, FindBugs 에서 가져온 룰셋을 기본으로 사용 하고, rullset import도 가능 

- 소스 코드 분석은 maven을 활용하여 maven plusgin을 통해서 분석하는 듯 (maven script(pom.xml)가 필요)

- 이렇게 분석된 정보는 sonar 가 바라보는 DB(일반적으로 Derby란 DB 내장)에 저장

(참고 Derby : Apache Project 중 하나로, Java 기반으로 구현된 오픈 소스 RDB) 


기본 동작 아키텍처 

Sonar 웹 페이지 : http://docs.codehaus.org/display/SONAR/Install+Sonar

Sonar 다운로드 : http://www.sonarsource.org/downloads/

Maven 다운로드 : http://www.apache.org/dyn/closer.cgi/maven/binaries/apache-maven-3.0-bin.zip


Technical Note/etc

코드 커버리지는 소프트웨어 테스트 시 사용되는 측정 기준 중의 하나

소스코드가 테스트된 정도를 의미함

당연히, 소스코드 내부를 들여다 봐야 하므로, 화이트박스 테스트에 속한다.


코드 커버리지 기준은 다음과 같이 7개 기준이 있다

특정 테스트케이스를 어느기준을 적용하여 테스트하느냐에 따라 커버리지 비율이 틀려지게 된다.


Function coverage : 소프트웨어 내에 정의된 Function이 호출되는 정도

Statement coverage : 소프트웨어 내에 정의된 Statement 가 호출되는 정도

Decision coverage : 소프트웨어 내에 정의된 조건문이 참/거짓 모두 수행되는 정도

Condition coverage (or Predicate coverage) : 소프트웨어 내에 기술된 조건문에서 사용되는 개별 조건이 참/거짓  모두 수행되는 정도

Modified Condition / Decision Coverage (MC/DC) : 소프트웨어 내에 기술된 조건문에 참/거짓이 되기 위한 조건들의 가능한 조합 모두가 수행되는 정도

Path coverage

Entry / Exit coverage


문제는 어느 기준을 적용하여 코드 커버리지분석을 하느냐 인데,

이는 해당 소프트웨어의 중요성 및 수행비용에 따라 결정됨

당연히, 더 상세한 커버리지 분석을 위해서는 더 많은 테스트케이스가 필요하게 되며

이는 비용과 직결되게 된다.

따라서 어느 수준까지 커버리지 분석을 수행할지는 프로젝트 별로 비용 및 중요성을 판단하여 조기에 결정하여 수행하면 된다. 


1 2
블로그 이미지

zzikjh