should는 BDD 철학에 기반을 둔 assertion package로 단위 테스트를 짤 때 유용한 assertion 함수들의 모음이라고 할 수 있다.

참고로 여기를 보면 should와 BDD와의 관계는  잘 이해할 수 있다.


= 설치 = 

역시나 npm을 이용해 편리하게 설치할 수 있다.


~$ npm install should


should는 여러 사람이 쓸 가능성이 높으므로 서버에 설치하는 경우라면 아래와 같이 global로 설치한 후에 로컬에 링크를 거는 것도 좋다.


~$ sudo npm install -g should

~$ npm link should



= 간단 사용법 =


* ok / not ok

OBJ.should.be.ok

OBJ.shoudl.not.be.ok


* true / false

OBJ.should.be.true

OBJ.should.be.false



* empty

OBJ.should.be.empty


* eql

OBJ.should.eql(OBJ)

[1,2,3].should.eql([1,2,3])


* within

OBJ.should.be.within(5, 50);


* approximately

(99.99).should.be.approximately(100, 0.1);


* type

OBJ.should.be.type('object');


* instanceOf

OBJ.shoudl.be.an.instanceOf(Class);


* above / below

OBJ.should.be.above(5);

OBJ.should.be.below(5);


* NaN, Infinity

(undefined + 0).should.be.NaN;

NUM.should.be.Infinity;


* property and value

OBJ.should.have.property('name');

OBJ.should.have.property('name', value);


* include (or contain)

[1,2,3].should.include(3);

[1,2,3].should.not.include(4);


* startWith(str), endWith(str)



* type assertions

({}).should.be.an.Object;

(1).should.be.an.Number;

[].should.be.an.Array;


* throw

(function() { throw new Error('fail'); }).shold.throw('fail')

(function() { throw new Error('fail'); }).shold.throw(/^fa/); // 정규 표현식을 쓸 수도 있다.


주의: should는 clojure를 이용하므로 throw 테스트를 할 때는 위와 같이 함수로 한번 묶은 형태로 사용하는 것이 좋다.

예를 들어 foo()함수가 인자로 -1을 받으면 예외를 발생하는 코드를 테스트 하는 경우라면 아래와 같은 코드를 이용한다.

( function() { foo(-1) } ).should.throw();




* error

should(value).Error // 특이하게 error만 대문자로 시작한다.





WRITTEN BY
trowind
자연어처리, 프로그래밍, 여행, 음식, 삶의 기록

트랙백  0 , 댓글  0개가 달렸습니다.
secret

Mocha는 expresso를 만든 TJ Holowaychuk가 만든 테스트 프레임워크로 expresso를 대체하기 위해 만든 것으로 보인다.

이미 expresso 공식 홈페이지에는 exresso가 더 이상 유지보수 되지 않으며, 대신 Mocha를 사용하라고 권하고 있다.


Mocha의 가장 큰 특징으로는 TDD 방식과 BDD 방식을 모두 지원하는 것인 것 같다. 여기서 TDD는 Test Driven Development(테스트 주도 개발)을, BDD는 Behavior Driven Development를 뜻한다. 사실 본인은 BDD라는 말을 이번에 처음 들었기 때문에 이 둘이 어떤 점이 차이가 있는지는 모른다.

다만, Mocha는 TDD와 BDD를 모두 지원하지만 기본 모드는 BDD이며, 간단하게나마 Mocha를 사용해본 바로는 TDD와 BDD간에 큰 차이는 (근본적인 철학이 어떤지는 모르겠지만) 느껴지지 않았다. 그렇더라도 프레임워크 자체에서 이렇게 두 가지를 지원한다면 나중에라도 내가 원하는 것을 선택할 수 있기 때문에 큰 장점이라고 생각한다.


그 외에도 Mocha는 정말 다양한 기능들이 있는데, 그 중에 몇가지를 뽑아보면 다음과 같다.

 * 간단한 비동기 테스트 지원

 * 테스트 커버리지 리포팅

 * 테스트에 특화된 타임아웃

 * 전역 변수 메모리 누출 탐지

 * 수행되는 루프에서 행이 걸리는 것을 막기 위한 자동 탈출(auto-exit) 기능

 * 원하는 assertion 라이브러리 사용 가능

 * mocha.opts 지원



사실 아직까지는 위 기능들 대부분을 사용해보지 못했기 때문에 부가적인 설명은 향후에 추가하려고 한다. 다만, "원하는 assertion 라이브러리 사용 가능"은 이번 기회에 써봤기 때문에 좀 더 설명을 해보겠다. 이게 무슨 말인고 하니, (짐작컨데) TDD와 같은 개발 방법론이 발전하면서 테스트 프레임워크 뿐만 아니라 테스트 코드에 사용되는 assertion 기능도 많은 발전이 있었고, 언어에서 기본으로 지원하는 assertion() 함수보다 다양한 기능을 가진 assertion 라이브러리들이 많이 개발되었다. 그러다보니 개발자 입장에서도 자신이 원하는 기능을 제공하는 assertion 라이브러리를 별도로 설치해서 사용하는 경우가 많아졌다. Node.js에서도 여러 종류의 assertion 라이브러리들이 있는데 Mocha는 자기 자신이 이를 결정하는 대신 개발자가 원하는 라이브러리를 쓸 수 있도록 해준 것이다. 

그런데, 이 말은 반대로 하면 개발자가 여러 assertion 라이브러리 중에 하나를 선택해야 한다는 것이다. 본인처럼 아직 Node.js가 낯선 사람에게는 약간의 부감으로 다가올 수 있는 부분이다. 하지만 assertion 라이브러리를 익히는 일은 다른 것에 비하면 일도 아니고, 팀에서 이미 사용하고 있는 assertion 라이브라리가 있다면 이를 선택할 수도 있으니 결과적으로는 이득이 훨씬 많다고 할 수 있다.


어쨌든 이러한 점, BDD와 TDD를 모두 지원하고, assertion 라이브러리를 선택할 수 있는 점 등등, 들은 Mocha의높은 자유도를 잘 보여주는 것들이라 할 수 있다. 하지만, Outsider's Dev Story(http://blog.outsider.ne.kr/770)에서도 언급했듯이 높은 자유도는 초반에 학습 부담이 높다는 것을 의미하기도 한다.



설치

다른 Node.js 패키지와 마찬가지로 npm을 이용해서 쉽게 설치할 수 있다. mocha는 실행 파일도 포함하고 있으므로 다음과 같이 글로벌로 설치하기를 권한다.


~$ npm install -g mocha


기본 사용법


BDD 스타일

Mocha의 기본 테스트 인터페이스는 BDD를 따르고 있다.



describe("Description for this test suite"), function() {

before( function() {

// excute before test suite

});


after( function() {

// execute after test suite

});


beforeEach( function() {

// execute before every test

});


afterEach( function() {

// execute after every test

});


describe( "#example", function() {

it ('여기에 테스트를 구현', function() {

// coding test

});

});

};




TDD 스타일

Mocha에서 지원하는 TDD 스타일은 사실 BDD에서 describe()가 suite()로, it()이 test()로 바뀐 정도라 따로 정리하지는 않는다. 이 밖에도 setup(), teardown(), suiteSetup(), and suiteTeardown() 등등의 함수를 제공한다.



비동기 코드 테스트

동기식 코드는 순차대로 실행하면서 assertion  테스트를 하면 되지만, 비동기 코드의 경우에는 done() 함수를 이용해서 callback 함수에서 테스트를 수행하고 끝나도록 지정한다.

done() 의 사용법은 대략 아래와 같다.


it("example of done", function(done) {

     some_function( arg, function(err) {

           do_something;

           assertion_test;

           done();

     });

});

k



테스트 실행

Mocha는 기본적으로 커맨드라인에서 'mocha' 프로그램을 이용해서 테스트를 수행한다. 커맨드라인 인자로 파일 이름을 주면 해당 파일만을 실행하고, 그렇지 않으면 현재 디렉토리에 있는 test 디렉토리의 모든 js파일을 실행한다.


커맨드라인 옵션

 * -w, --watch: 주어진 테스트 파일을 모니터링하다가 수정이 됐으면 자동으로 테스트를 수행한다. 상당히 편할 것 같다.

 * --global <names>: mocha는 전역 변수 메모리 누출을 감지하는 기능이 있는데, 여기에 나열된 변수들은 의도한 전역변수로 간주된다. 전역 변수 이름은 컴마를 이용해 나열한다.

 * --ignore-leaks: 전역 변수 메모리 누출이 감지되면 테스트가 실패하는데, 이 옵션을 사용하면 테스트가 실패하지 않는다.

 * -r <name> : 지정된 모듈을 자동으로 포함(require())시킨다. 어떤 경우에 유용할지는 모르겠다.

 * -R, --reporter <name> : 테스트 결과 리포팅 형식을 지정한다. 기본값은 'dot'(dot matrix)이고, 좀 더 자세한 리포팅을 원한다면 'spec' 정도를 쓰면 될 것 같다. http://visionmedia.github.io/mocha/#reporters 에 보면 리포팅 출력 예제들을 볼 수 있다. 개인적으로는 nyan이 가장 맘에 든다(도대체 누가 이따위(?) 생각을 한걸까?^^). --watch 옵션과 함께 쓰기 좋은 min 이란 것도 있다.

 * --reporters : 사용할 수있는 reporter 목록을 보여준다.

 * -t, --timeout <ms> : 지정한 시간이 지나면 테스트 실패로 간주한다.

 * -g, --grep <pattern> : 주어진 정규표현식 패턴과 일치하는 테스트만 실행한다. 


mocha.opts

자주 쓰는 옵션은 test/mocha.opts 파일에 적어놓으면 편리하다. --require 같은 것이 대표적인 예. 한 라인 당 옵션 하나씩 적으면 된다.

--require should

--reporter nyan



총평

Node.js 접한지도 얼마 안되었기 때문에 mocha가 다른 node.js용 테스트프레임워크에 비해 좋은지 나쁜지는 모른다. 하지만, 다른 언어에서 사용했던 테스트 프레임워크와 비교해보면 확실히 높은 자유도와 여러가지 유용한 옵션들을 제공하고 있다. 반드시 TDD를 따르겠다는 사용자가 아니라면 더이상 방황하지 말고 mocha에 정착해도 될 듯 싶다.



참고 자료

 * Mocha 공식 홈페이지 문서 http://visionmedia.github.io/mocha/ 

 * Introducing BDD: http://blog.jaigurudevaom.net/319 - BDD의 탄생 과정과 철학을 잘 알 수 있는 글(번역문)


WRITTEN BY
trowind
자연어처리, 프로그래밍, 여행, 음식, 삶의 기록

트랙백  0 , 댓글  0개가 달렸습니다.
secret

vi는 여타 다른 텍스트 에디터와는 다르게 마우스보다는 키 조합으로 원하는 작업을 수행한다. 이로 인해 처음 배우는 사람들에게는 매우 낯선 에디터로도 유명하지만, 일단 어느 정도 익숙해지면 훨씬 더 편한 에디터이기도 하다.  작업자는 몇 개의 키를 조합함으로써 원하는 모든 작업을 수행할 수 있다. 그리고 이것이 vi에 능숙해지면 능숙해질수록 작업 속도가 빨라지는 이유이기도 한다.


물론 예외적인 경우도 있다. 그것은 바로 GUI환경에서 vi를 사용할 때 창 자체를 이동하거나 창 크기를 바꾸고자 할 경우이다. 사실 이것은 vi가 아니라 운영체제 레벨에서 담당하는 기능이기 때문에 vi에서 조절할 수 없는 것이 당연하다. 하지만 vi를 쓰다보면 창을 이동하기 위해서 마우스를 잡는 것도 불편하다고 느껴지는 경우가 많기 때문에 사용자로서는 조금 아쉬운 부분이다. 


이것을 제외하고는  vi에서는 손을 많이 움직이지 않고도 원하는 작업을 할 수 있도록 매우 많은 키 조합을 제공하고 있어서 빠른 작업이 가능하다. 문제는 이러한 키 조합이 너무 많아서 어느 정도 숙달이 되지 않고서는 제대로 사용하기는 커녕 무엇이 있는지 조차 알기 어렵다는 점이다. 그래서 아래와 같이 vi를 사용할 때 알아두면 좋다고 생각되는 키조합들을 정리해보았다.



1. 커서 이동과 기본 편집

1-1. 일반 모드에서의 커서 이동


 * h,j,k,l : 일반 모드에서 커서를 좌,하,상,우로 한 글자씩 이동한다. 가장 기본적인 이동키로 우리가 자주 쓰는 화살표키와 동일한 기능을 한다.

 * gj, gk : display line상에서의 위, 아래 라인으로 이동. vi에서 'wrap' 세팅을 하면 화면상에 한 줄로 표시할 수 없는 긴 라인은 여러 줄로 표시되는데, 이렇게 화면에 보이는 것을 기준으로 하는 것을 display line이라고 한다. 

 * 0, g0 : 라인 첫 번째 칸으로 이동

 * ^, g^ : 라인 맨 앞에 공백이 아닌 첫 글자로 이동

 * $, g$ : 라인 맨 끝으로 이동

 * H, M, L : 화면의 맨 처음, 중간, 끝 라인의 맨 앞칸으로 이동한다. 한 화면 내에서 이동하는 것으로 알아두면 상당히 편하다.


1-2. 단어 단위 이동

 * w : 다음 단어의 맨 첫 글자로 이동

 * b : 이전 단어의 맨 첫 글자로 이동 

 * e : 현재/다음 단어의 마지막 글자로 이동

 * ge: 이전 단어의 마지막 글자로 이동

 * W, B, E, gE: 위에서 설명한 w,e,b,ge와 동일하나 단어 대신 WORD 단위로 이동함. 여기서 '단어'는 공백이나 기호로 구분되는 문자열을, WORD는 공백만으로 구분되는 문자열을 뜻한다. 즉, WORD가 좀 더 큰 단위라고 생각하면 된다.



2. 편집

2-1. 입력 중에 글자 수정하기(Insert Mode에서 수정)

타이핑 중에 이전에 입력한 글자를 지우기 위해서는 보통 백스페이스를 이용한다. 물론 vi에서도 백스페이스를 이용해도 되지만, 단어나 현재 라인 전체를 지우기 위해서는 백스페이스를 여러 번 눌러야 하는 단점이 있다. 이런 식으로 키보드를 이용하는 것은 vi 답지 않은 행동이다. vi에서는 아래와 같이 편집 중에 글자, 단어, 라인을 지울 수 있는 단축키를 제공한다.

 * <C-h> : 이전 글자 지우기 (backspace)

 * <C-w> : 이전 단어 지우기

 * <C-u> : 현재 라인 지우기. 커서는 첫라인으로 이동하고 한번 더 <C-u>를 입력하면 이전 라인으로 이동한다.


2-2. 일반 모드에서 편집하기

 * x : 현재 커서가 위치한 글자 삭제

 * dw : 현재 커서가 글자부터 단어 끝까지 삭제

 * db : 현재 커서의 이전 글자부터 단어 앞까지 삭제

 * daw: 현재 커서가 위치한 단어 + 앞 뒤 공백 문자열까지 삭제

 * diw : 현재 커사가 위치한 단어만 삭제

aw, iw는 범위를 지정하는 명령으로 'w' 대신 s, p, ] 등을 사용하여 문장, 단락, 대괄호 등으로 범위를 다르게 지정할 수 있다. aw, iw 등에 대해서는 뒤에서 좀 더 자세히 다루기로 한다.



3. 화면 이동 (스크롤)

 * <C-b> or <S-Up> : Page Up

 * <C-f> or <S-Down> : Page Down

 * <C-u> : scroll up. 'scroll' 옵션에 정해진 라인 수만큼(기본값은 화면의 절반) 라인을 아래로 내린다 (커서가 위 라인으로 올라가는 효과).

 * <C-d> : scroll down. 라인을 위로 올린다(커서가 아래도 내려가는 효과)

 * <C-y> : 화면을 한 줄 아래로 내린다. 커서도 같이 내려간다.

 * <C-e> : 화면을 한 줄 위로 올린다. 커서도 같이 올라간다. 

 * z<CR> : 현재 커서가 있는 라인을 화면의 최상단에 가도록 한다.

 * zz : 현재 커서가 있는 라인이 화면 중간에 오도록 한함

 * {num}zz : {num} 라인이 화면 중간에 오도록 함

 * zl : 화면을 왼쪽(left)으로 한칸 이동

 * zh : 화면을 오른쪽으로 한칸 이동

 * zL, zH : 화면을 왼쪽, 오른쪽으로 반화면만큼 이동



4. visual mode 활성화 및 관련 키

 * v : 글자 단위

 * V : 라인 단위

 * <C-v> : block-wise 모드

 * viw : 현재 커서가 있는 단어(단어 상에서의 위치는 상관 없음

  - 단어 상에서의 위치는 상관 없다. w까지 입력하면 커서는 해당 단어의 끝 문자로 이동한다.

 * vit : blocking tag block. <a>ABC</a> 와 같이 태그가 있는 문서에서 택스트 부분만 블록 설정을 한다

 * vi} : 중괄호({, })로 묶은 부분을 블록 설정함

 * vi" : 큰따옴표로 묶인 부분을 블록 설정함

 * switching: 어떤 비주얼 모드에서 다른 비주얼 모드로 전환

  - 예) v 모드에서 V를 입력하면 라인 단위 비주얼 모드로 전환된다

 * o: 비주얼 모드로 블럭을 지정했을 때 블록의 시작/끝으로 커서 이동


5. 대/소문자 바꾸기

 * ~ : 현재 커서가 있는 글자 하나의 대/소문자를 바꿈

 * gUiw: 현재 커서가 있는 단어를 대문자로 바꿈

 * guiw: 현재 커서가 있는 단어를 소문자로 바꿈

 * gUU: 현재 커서가 있는 라인 전체를 대문자로 바꿈


6. Jump

커서를 이동했던 위치로 다시 가는 기능이다. vi는 명령어 히스토리 기능과 마찬가지로 점프한 곳도 히스토리를 남기는데, ':ju[mps]' 명령을 이용해 지금까지 이동했던 커서의 위치에 대한 리스트를 볼 수 있다.

 * <C-o> : 이전 위치로 이동 (back-button)

 * <C-i> : 다음 위치로 이동 (forward-button)

 * % : 대응되는 괄호로  이동

 * ( , ) : 문장의 시작/끝으로 이동


6-1. Change

':ju'가 커서 위치에 관한 것이라면 ':changes'는 변경 내역을 출력한다. 변경한 부분으로 이동하는 단축키는 다음과 같다.

 * g; : 이전에 변경한 부분으로 이동

 * g, : 최근에 변경한 부분으로 이동


7. Command-line (ex 모드) 다루기

 * [normal mode] q: : ex mode history가 command-line window에 표시됨

 * [normal mode] q/ : search history가 command-iine window에 표시됨

 * [ex mode] <C-f> : ex mode에서 command-line window를 염

 

8. 글자 단위 검색

 * f{char} : {char}를 찾음 .forward

 * F{char}: {char}를 찾음. backward

 * t{char} : {char} 바로 전 글자로 커서 이동. forward

 * T{char}: {char} 다음 글자로 커서 이동. backward

 * ; : forward search 반복

 * , : backward search 반복


9 . 레지스터 (Register)

 * :reg  : 레지스터에 저정된 값들 확인

 * "0 : yank register. y키를 이용해 복사한 문자열은 0번 레지스터에 자동으로 저장된다.

 * "_ : black hole register. 해당 레지스터를 지정하면 실제로는 저장을 안함

 * "+ : system register. 운영체제 클립보드\

 * "% : name of current file

 * ". : last inserted text

 * ": : last Ex command

 * "/ : last search pattern

 * <C-r>{reg} : 입력 모드에서 {reg}에 저장된 문자열을 붙여넣기함. 입력 모드는 계속 유지됨.

 * <C-r><C-p>{reg} : <C-r>{reg}와 기본적으로 동일. 문자열을 붙여넣은 후에 들여쓰기를 알맞게 수정한다.

 * "{reg}p, "{reg}P, "{reg}gp, "{reg}gP, :put {reg} : {reg}에 저장된 문자열을 붙여넣는다. 붙여넣는 위치, 작업 수행 후의 커서 위치 등이 조금씩 다르다.



10. 매칭과 정규표현식

유닉스&리눅스 계열의 다른 프로그램들과 마찬가지로 vi에서도 매우 강력한 매칭 기능을 제공하는데, 그 내용이 워낙 방대하고 이를 응용하는 방법들도 다양해서 한번에 정리하기가 어렵다. 아래에 정리한 내용은 초보에서 조금 벗어난 수준 정도이고 나중에 내용을 보강해서 별도의 포스트로 정리해보고 싶다.


10-1. very magic vs. very non-magic 

vi의 정규표현식은 Perl등에서 사용하는 표준(de facto standard)적인 정규표현식과는 조금 차이가 있다. 특히나 vi에서는 역슬래시를 이용해 escaping해야 하는 경우가 더 많아서 정규표현식을 작성하는데 불편한 감이 있다.

예를 들어, 정규표현식의 group기능을 이용하기 위해 괄호를 사용하려면 vi에서는 이들 괄호 앞에 '\'를 넣어줘야 한다.

예) #으로 시작하는 영어 단어

#\([a-zA-Z]\)\+


이러한 불편함을 없애기 위해 vi에서는 'very magic'이라는 모드를 제공한다. 위 정규 표현식을 very magic모드로 표현하면 다음과 같다.

\v#([a-zA-Z])+


여기서 맨 앞에 있는 \v는 very magic모드로 전환하는 명령어이다. 이와는 반대로 \V는 'very non-magic'이라고 해서 역슬래시를 사용한 경우에만 특별한 의미를 가지도록 할 수도 있다.


 * capturing

 vi에서도  괄호를 이용해 grouping 기능을 사용할 수 있다. 이 부분을 다시 지칭하려면 \1, \2 등과 같이 역슬래쉬와 숫자를 이용하면 된다.

 grouping기능은 이용하되 capturing에서는 제외하려면 괄호 앞에 %를 붙이면 된다.


 * 커서 위치를 매칭된 부분 마지막에 위치하기

/{pattern}을 이용하면 커서는 패턴과 매칭되는 부분의 맨 앞에 위치한다. 만약 어떤 이유로 커서를 매칭되는 부분의 맨 뒤에 가도록 하려면 패턴 뒤에 '/e'를 입력하면 된다.

/{pattern}/e


 * Search dialog

다른 에디터에서 자주 볼 수 있는 Search Dialog를 사용하려면 :pro 명령을 입력한다. 자세한 것은 ':h :pro'를 참고하자.


 * 파일 내용 일부를 검색하기

URL과 같이 일일이 타이핑하기에 복합한 문자열들이 잔뜩 들어있는 파일이 있다고 생각해보자. 이 중에서 일부 문자열을 파일 전체에서 검색하고 싶다면 해당 문자열을 일일이 타이핑하기 보다는 copy&paste 기능을 이용해서 검색할 문자열을 입력하고 싶어질 것이다.

 1) "uyis: 파일의 일부를 레지스트리에 복사. 여기서는 u 레지스트리에 현재 커서가 위치한 문장 전체를 저장한다.

 2) /\v<C-r>u<CR> : very magic 모드로 설정하고 u 레지스트리에 저장된 내용을 붙여넣은 다음에 검색 수행.


 * 이전에 입력한 패턴 다시 이용

//를 사용하면 직전에 입력했던 패턴을 재사용할 수 있다. 이것을 이용하면 find&replace를 두 단계로 나누어서 할 수 있다.

  1) :%s/{pattern1}/{pattern2}/g : 파일 전체에서 {pattern1}에 해당하는 부분을 {pattern2}로 바꿈

  2) /{pattern1}      - {pattern1}을 찾은 다음에 

     :%s//{pattern2}/g  - 찾은 부분을 {pattern2}로 바꿈

이렇게 하면 {pattern1}이 정말로 찾고자 하는 패턴이 맞는지를 먼저 확인해볼 수 있다는 장점이 있다.


 * replace 재수행

:s/{pattern1}/{pattern2}/g 은 현재 라인에만 적용된다. 파일 전체에 적용하기 위해서는 s 앞에 %를 붙여줘야 한다. 다행이 vim에는 search history 기능을 제공하기 때문에 <ESC>:<Up><Home>% 를 입력해도 되지만, 좀 더 편하게 하고 싶다면 간단하게 <ESC>g&를 입력해도 된다 g&는 다음과 동일한 의미이다

:%s//~/&


11. Global Command

:global (줄여서 :g)는 Ex 모드에서 다른 명령어들과 함께 사용되는 명령어이다. 이것은 명령어의 적용 범위가 파일 전체가 되도록 해준다. Global 명령어의 기본 사용 형식은 다음과 같다.

:g/{pattern}/{command}

 * {pattern} : 정규 표현식

 * {command} : 수행할 작업

  - p : 프린트

  - d : 삭제

  - sort : 정렬


12. 특이한 기능들

12-1. 계산

 * <C-r>={cal}<CR>: 편집 모드에서 간단한 계산(산술 연산)값을 현재 위치에 삽입한다. <C-r>=를 입력하면 ex mode란에 커서가 가고 거기에 20*4 와 같은 식을 입력하면 계산한 값이 커서 위치에 표시된다.

 * {num}<C-a> : 현재 커서의 이후에 나오는 첫 번째 숫자에 {num}값을 더한다. 자주 사용할 일을 없겠지만, 은근히 편리할 수도 있을 것 같다. 아마 숫자를 포함한 라인을 여러 개 복사&붙여넣기 한 다음에 값을 수정하는 용도로 사용될 것 같다.

 * {num}<C-x> : 현재 커서 이후에 나오는 첫 번째 숫자에서 {num}값을 뺀다.


13. 유용한 명령어 조합


N개의 라인 맨 앞에 탭문자 추가하기

(커서를 첫 라인으로 이동)

<C-v>{N}jI{\t}<ESC>

 * 중간에 I대신 r을 사용하면 replace가 됨

 * 중간에 I대신 c를 사용하면 치환


커서 이후에 나오는 글자 X부터 문장 끝(.)까지 지우기 

 fXdt.



'Software' 카테고리의 다른 글

Mocha: Node.js 테스트 프레임워크  (0) 2013.12.26
vi (vim) 사용법 - 알아두면 유용한 키 조합  (0) 2013.10.06
[Latex 팁] argmax 사용  (0) 2012.10.14
클라우드 서비스 비교  (0) 2010.09.12

WRITTEN BY
trowind
자연어처리, 프로그래밍, 여행, 음식, 삶의 기록

TIP, vi, vim
트랙백  0 , 댓글  0개가 달렸습니다.
secret

[Latex 팁] argmax 사용

Software 2012. 10. 14. 13:27

(1) \mathop를 이용한 정의

\newcommand{\argmax}{\mathop{\mathrm{argmax}}}

 

(2) amsmath 패키지를 이용한 정의

\usepackage{amsmath}

\DeclareMathOperator*{\argmax}{\arg\max}

 

(3) amsmath를 이용한 다른 정의

\DeclareMathOperator*{\argmax}{%

 \operatorname{arg}\operatorname{max}}

출처: http://ktug.kldp.org/jsboard/read.php?table=operate&no=960&page=1089

'Software' 카테고리의 다른 글

Mocha: Node.js 테스트 프레임워크  (0) 2013.12.26
vi (vim) 사용법 - 알아두면 유용한 키 조합  (0) 2013.10.06
[Latex 팁] argmax 사용  (0) 2012.10.14
클라우드 서비스 비교  (0) 2010.09.12

WRITTEN BY
trowind
자연어처리, 프로그래밍, 여행, 음식, 삶의 기록

트랙백  0 , 댓글  0개가 달렸습니다.
secret

오늘 클라우드 서비스가 USB를 위협한다는 기사가 떴다.
그렇지 않아도 요즘 여러 회사에서 다양한 클라우드 서비스를 제공하고 있는데, 집과 학교, 그리고 노트북까지 쓰게 되면서 클라우드 서비스를 적극적으로서 써보려고 하고 있다. 무엇보다 보통 하드디스크 하나에 데이터를 저장하고 가끔씩만 백업을 하는데, 요즘에는 백업작업조자 귀찮아지면서 차라리 클라우드 서비스가 데이터 안전성이 더 낮겠다는 생각이 들었다.

국내에서 쓸 수 있는 (파일 저장 용도의) 클라우드 서비스는 대략
 * 네이버의 NDirive
  * MS의 SkyDrive
 * KT의 uCloud
 * 나우콤의 2ndrive
 * 구글의 GoogleDoc
정도가 될 것 같다.
KT가 아닌 다른 통신사도 파일 클라우드를 제공하지만, 본인이 사용할 수 없는 관계로 패스.
아마

   N드라이브  SkyDrive  uCloud  2ndrive  GoogleDoc
 저장용량 30G 25G  50G 1T  1G 
 속도  가장빠름 쓸만함   빠른 편 느림  중하(?) 그래도 2ndrive보단 빠른거 같음 
 장점  빠른 속도, 안정성  용량도 많고, 속도도 좋음, sync 기능 제공 sync 기능 제공, 업로드 파일 크기 제한없음     간단함, 모바일웹에서도 쉽게 사용가능.
 단점  파일크기<=200M, 적은 용량  싸이트 화면 전환이 다소 느림.파일크기<=50M 용량 추가 비용이 비쌈  낮은 안정성, 파일 업,다운 오류, 파일 저장 기간   별다른 부가 기능 없음. 무료저장공간이 가장 적음
 비고        아직은 쓸 수 있는 상태가 아니다  기본 용량은 적지만, 1년 5달라만 내면 20G로 업.


GoogleDoc
구글의 파일 클라우드 서비스는 아는 사람이 별로 없고, 쓰는 사람도 별로 없을거라 생각된다. 우선 구글이 그렇게 적극적으로 홍보하는 것 같지 않고, 무료로 제공하는 기본 용량이 매우 적기 때문이다.

구글은 google doc과 피카사를 위해 1G의 무료 저장 공간을 제공한다. 이것 만이라면 당연히 이걸 파일 클라우드로 쓰는 사람은 없을 것이다. 중요한 점은 구글이 유료 서비스도 제공한다는 것인데 가격이 참 착하다. 20G로 용량을 업그레이드 하는데 드는 비용은 1년에 단돈 5달러. 1달이 아니고 1년이다. 당장 uCloud만 해도 한 달에ㅣ 5000원인 걸 가만하면 정말 싼 가격이다. 물론 아직은 구글에서 파일 보관 (업/다운로드) 기능 외에 특별한 기능을 제공하지 않기 때문에 다양한 기능의 uCloud와는 직접적인 비교는 불공정할 수도 있다. 하지만, 역시 세계 최대량의 storage를 보유한 기업답게 용량 대비 가격은 참 착하다. GoogleDoc의 유료 용량 서비스에 관한 것은 여기참고하면 된다.
GoogleDoc은 별다른 기능이 없는 대신에 파일 당 용량도 제약이 없다. 따라서 자주 쓰지 않는 큰 파일들을 저장하는 용도로 적당하다.

N드라이브
네이버에서 제공하는 N드라이브는 여러가지 면에서 무난한 서비스다. sync나 버전 관리, 미디어 파일 재생과 같은 부가적인 기능을 제공하지 않는(생각해보니 다양한 문서 파일을 볼 수 있는 viewer 기능을 제공한다. 특히 HWP 파일을 볼 수 있다는 엄청난 장점이 있다.단, 변환을 거친 후에 웹페이지로 보는 것이니 만큼 레이아웃이 많이 깨지는 경우도 있다) 대신에 10G라는 적지 않은 용량과 빠른 속도를 제공한다.

파일 한 개의 용량이 200Mb까지라 FLAC 인코딩 파일을 저장해놓는 용도로 사용하기에 적당하다. 개별 파일 용량만 좀 더 올려준다면 다양한 파일을 저장할 수 있어 좋을텐데, 아쉬운 부분이다.

MS 오피스 파일들이나 한글 파일을 보여주는 것은 상당한 장점이 될 수 있지만, 어차피 완벽하지 않기 때문에 문서 저장소로서는 한계가 있지 않나 싶다. 특히나 최근에는 MS 오피스 파일들은 Windows Live 사이트에서 제공하는 Office 기능을 이용해서 웹 상에서 직접 보거나 편집을 할 수 있기 때문에 N드라이브의 이점은 더욱 줄어들 수 밖에 없다. 개인적으로는 FLAC으로 인코딩된 큰 음악파일들을 저장하는 용도로 사용하려고 한다.


uCloud
다양한 기능을 안정적으로 제공하는 서비스로 개인적으로는 가장 맘에 든다. 일단 용량 자체가 20G로 SkyDrive 다음으로 크다. 다만, uCloud는 기본적으로 유료 서비스이며, KT 사용자일 경우에만 (예전에는 스마트 요금이나 쿡 서비스 사용자만이었는데 최근에 모든 KT 서비스 사용자로 바뀌었다) 20G 무료이기 때문에 완전 무료 서비스들과 비교하는 것은 불공평한 면이 있다.

어찌됐거나, uCloud는 많은 용량, 빠른 속도와 함께 다양한 기능을 제공하는 꽤 괜찮은 서비스이다. 기능 중에는 지정한 폴더들을 서로 동기화시켜주는 sync 기능, 파일 버전 관리 기능, 자동 백업 기능 등은 파일 클라우드 서비스로서 충실하다고 생각된다. 한가지 아쉬운 점은 파일의 버전은 이전 3개 까지만이라는 점이다. 적어도 5개는 되어야 실제로 도움이 될 거 같은데, KT에서 좀 더 신경을 썼으면 하는 부분이다.

그리고, 개인적으로는 치명적인 문제점이라고 생각되는 부분은 uCloud는 기본적으로 (웹도 지원하긴 하지만) 클라이언트 애플리케이션을 통해 이용하는 서비스인데, 이 클라이언트에 등록할 수 있는 컴퓨터가 2대 밖에 되지 않는다는 점이다. 나처럼 학교(직장) 컴퓨터, 집 컴퓨터, 노트북을 쓰는 사람은 별 수 없이 한 대는 uCloud 사용을 포기해야 한다. 스마트폰에는 대수 제한을 두지 않으면서 컴퓨터만 제한하는 것은 잘못된 정책이라 생각한다.

그리고, 가끔 업로드, 다운로드 속도가 현저히 느린 경우가 있는데 이것은 빨리 서버 최적화를 통해 해결됐으면 한다.

SkyDrive
뭐랄까... 가장 그럴 듯 했으면서도 이것 저것 중구난방으로 개발이 이루어져서 정리가 안된 서비스같다. SkyDrive는 MS사의 MSN 전략의 후속 버전(?)인 Windows Live (이하 Live)서비스의 일환으로 제공되고 있다. www.live.co.kr (또는 .com)으로 접속하면 사용할 수 있는데, 일단 다른 서비스(메뉴)들과의 관계에서부터 복잡하다. SkyDrive는 Live에서 제공하는 일종에 파일 스토리지의 통칭이다. 문제는 Live에서 제공하는 최상위 메뉴들로 Hotmail, Messenger, Office, 사진, MSN 이 있는데, 여기서 Office와, 사진은 결국 SkyDrive의 폴더로 연결된다. 이는 마치 SkyDrive가 "내컴퓨터"이고 Office, 사진 메뉴는 각각 "내 문서", "내 사진" 디렉토리에 대한 바로가기라고 생각하면 된다. 이런 관계는 윈도우즈 데스크탑 환경에서야 익숙하겠지만, 웹 환경에서는 다소 이상하다고 생각한다.필자의 경우에는 이들이 서로 계층적으로 연결되어 있다는 사실을 몰라서 엉뚱한 위치에 파일을 만들거나 업로드 한 경우가 많았다.

예전에야 25G면 많은 용량이었지만, 이제는 국내 업체들도 모두 30G 이상씩 제공하기 때문에 거의 쓸 일이 없지 않을까 싶다. 

'Software' 카테고리의 다른 글

Mocha: Node.js 테스트 프레임워크  (0) 2013.12.26
vi (vim) 사용법 - 알아두면 유용한 키 조합  (0) 2013.10.06
[Latex 팁] argmax 사용  (0) 2012.10.14
클라우드 서비스 비교  (0) 2010.09.12

WRITTEN BY
trowind
자연어처리, 프로그래밍, 여행, 음식, 삶의 기록

트랙백  0 , 댓글  0개가 달렸습니다.
secret