'Technical Note'에 해당되는 글 134건

Technical Note/JAVASCRIPT & JQUERY

jQuery Proven Performance Tips And Tricks


퍼포먼스 향상 패턴을 사용하는 것이 왜 중요한가요?


프로그램 코드는 간단 명료해야지 엉성하게 만들면 안됩니다.

좋은 코딩 습관은 문제를 해결하는데 적합한 방법을 제공합니다.

퍼포먼스에 좋은 패턴을 사용하지 않고 코딩을 한다면 브라우저가 그 만큼 일을 더 많이 하게 됩니다.

더 많은 일 = 더 많은 메모리 사용 = 느린 프로그램

..


퍼포먼스 향상 Tip 1


항상 최신 버전의 jQuery를 사용하세요


가능하다면 항상 최신 버전의 jQuery를 사용하세요

최신 버전은 이전 버전에 비해 성능이 향상되고 버그가 수정된 경우가 많습니다.

jQuery 파일을 최신 버전으로 교체해도 문제가 생기는 경우는 많지 않은편입니다.

퍼포먼스 향상 Tip 2


셀렉터를 어떻게 사용하느냐에 따라 성능이 향상됩니다.


모든 셀렉터가 같은 방법으로 jQuery 객체를 생성하는 것은 아닙니다.

jQuery는 셀렉터를 사용하는 다양한 방법을 제공하지만, 각 방법별로 내부적 처리가 다르기 때문에 어떤 것은 빠르고 어떤 것은 느립니다.

jQuery는 DOM 노드를 탐색할 때, 가능하면 브라우저 내장 메서드를 사용해서 탐색해서 속도를 향상시키지만 브라우저 내장 메서드가 지원이 안되는 경우 모든 DOM 노드를 순회해야 하기 때문에 느려집니다.

ID & Element 셀렉터가 가장 빠릅니다.

$(‘#Element, form, input’)

이 셀렉터들은 내부적으로 브라우저 내장 메서드인 getElementById(), getElementsByTagName()을 사용하기 때문에 가장 빠릅니다.

꼭 셀렉터의 경우가 아니더라도 코딩을 할 때 가능한 경우 브라우저 내장 메서드를 사용하는 것이 가장 빠릅니다.

Class 셀렉터는 느립니다.

$(‘.element’)

클래스를 선택할 수 있는 브라우저 내장 메서드인 getElementsByClassName()은 IE5~8에서는 지원되지 않습니다.

그래서 클래스 셀렉터를 사용하면 IE5~8에서는 느립니다. 브라우저 내장 메서드 대신 jQuery가 직접(모든 DOM 노드 순회) 클래스를 찾기 때문입니다.

Pseudo & Attribute 셀렉터는 가장 느립니다.

$(‘:visible, :hidden’)

$(‘[attribute=value]‘)

이 셀렉터는 브라우저의 내장 메서드가 없기 때문에 jQuery가 직접 찾아야 해서 느립니다.

최신 브라우저들 중 CSS 셀렉터로 DOM 탐색이 가능한 querySelector(), querySelectorAll() 을 지원하는 브라우저에서는 빠릅니다.

Pseudo & Attribute 는 매우 편리하지만 가능 느릴수 도 있기 때문에 사용에 주의를 기울여야 합니다.

퍼포먼스 향상 Tip 3


Parent and Children 셀렉터를 사용할 때 좋은 패턴에 대해 알아봅니다. 아래 패턴에서 $parent는 $(‘#parent’) 를 담아놓은 변수입니다. $(‘#parent’) 을 미리 처리했으므로 여기에 수행되는 시간은 고려하지 않는다는 의미입니다.


$(‘.child’, $parent).show();    // context

$parent.find(‘.child’).show();    // find()

$parent.children(‘.child’).show();    // immediate children

$(‘#parent > .child’).show();    // child combinator selector

$(‘#parent .child’).show();    // class selector

$(‘.child’, $(‘#parent’)).show();    // created context

1) $(‘.child’, $parent).show();

이 패턴은 내부적으로 $parent.find(‘.child’).show(); 으로 변환되어 처리됩니다.

가장 빠른 방법에 비해 ~5-10% 느립니다.

2) $parent.find(‘.child’).show();

이 방법이 가장 빠릅니다.

여기에 대한 설명은 곧 하겠습니다.

3) $parent.children(‘.child’).show();

이 방법은 내부적으로 $.sibling 과 자바스크립트의 nextSibling() 메서드를 사용합니다.

가장 빠른 방법에 비해 ~50% 느립니다.

4) $(‘#parent > .child’).show();

jQuery는 내부적으로 Sizzle 이라는 CSS 셀렉터 엔진을 사용하는데 Sizzle은 셀렉터를 오른쪽에서 왼쪽으로 읽어서 사용합니다.

즉, .child 를 먼저 다 찾고 그 중에서 부모가 #parent 를 가진 것을 찾는 식입니다.

가장 빠른 방법에 비해 ~70% 느립니다.

5) $(‘#parent .child’).show();

4번과 마찬가지로 .child를 찾고 #parent를 찾습니다.

내부적으로 .find() 메서드도 사용합니다.

가장 빠른 방법에 비해 ~77% 느립니다.

6) $(‘.child’, $(‘#parent’)).show();

내부적으로 $(‘#parent’).find(‘.child’) 로 동작합니다.

2번 가장 빠른 방법과 비슷하게 생겼지만 2번 방법은 미리 $(‘#parent’)를 계산해 놓은 $parent 변수를 사용하고 있어서 더 빠릅니다.

가장 빠른 방법에 비해 ~23% 느립니다.

가장 빠른 방법은 2) $parent.find(‘.child’).show(); 입니다. $parent 는 $(‘#parent’) 를 변수에 담아놓은 것입니다. 이런 패턴을 캐싱이라고 합니다. 즉, 자주 사용할 jQuery객체를 변수에 담아놓아서 나중에 사용할 때 다시 jQuery 객체를 만드는데 사용할 시간을 절약하는 것입니다.

무엇보다 getElementById 와 같은 브라우저 내장 메서드를 사용하는 것이 가장 빠릅니다. 가능하다면 이 것을 사용하세요

위에서 .find() 메서드를 많이 사용하고 있는데 .find() 메서드는 위에서 아래로 재귀적으로 탐색을 한다는 사실도 알아두세요

퍼포먼스 향상 Tip 4


꼭 필요한 경우가 아니라면 jQuery를 사용하지 마세요


$() 를 한번 수행할 때마다 당연히 시간이 소요됩니다. 필요하지 않은 경우라면 안쓰는 것이 성능향상에 좋습니다. jQuery 대신 “보통의” 자바스크립트 코드를 사용하세요

jQuery로 작성된 소스코드에 보통 자바스크립트 코드를 사용하면 안될 것 같은 느낌이 드신다면 전혀 걱정하지 않으셔도 됩니다. jQuery도 그냥 자바스크립트로 만들어진 함수입니다. jQuery와 보통 자바스크립트를 섞어쓰셔도 아무 문제가 없습니다.

$(‘a’).bind(‘click’, function () {

    console.log(‘You clicked: ‘ + $(this).attr(‘id’));

});

이렇게 작성하시지 마시고


$(‘a’).bind(‘click’, function () {

    console.log(‘You clicked: ‘ + this.id);

});

이렇게 작성하세요. function () {} 안에서 사용할 수 있는 this 는 a 태그가 만든 DOM 객체입니다. 여기에서 id 어트리뷰트에 접근하기 위해 $(this).attr(‘id’); 를 할 필요는 없습니다. 그냥 this.id 와 같이 DOM 객체 – 프로퍼티 접근방법을 사용하시면 되고, 더 빠릅니다.


퍼포먼스 향상 Tip 5


캐싱(Caching) 을 사용하세요. 위에서도 잠깐 말씀드렸지만 캐싱은 단지 나중에 다시 사용할 것 같은 “좀 시간이 걸렸던 작업” 을 변수에 저장해서 나중에 사용할 때는 그 시간이 걸렸던 작업을 다시 안해도 되게 해주는 패턴입니다.


이 글에서 말하는 캐싱은 셀렉터를 사용해 jQuery 객체를 만드는 작업을 캐싱하는 것입니다.


var parents = $(‘.parents’),    // caching

    children = $(‘.parents’).find(‘.child’),    // bad

    kids = parents.find(‘.child’);  // good

위 코드에서 children 변수는 캐싱해놓은 parents 변수를 사용하지 않고 $(‘.parents’)를 또 만들었습니다. kids 변수는 캐싱해놓은 parents 변수를 사용하고 그래서 children 보다 빠릅니다.


var foo = $(‘.item’).bind(‘click’, function () {

    foo.not(this).addClass(‘bar’)

                .removeClass(‘foobar’)

                .fadeOut(500);

});

위 코드는 $(‘.item’) 을 foo 라는 변수에 캐싱하고 있습니다. 그리고 $(‘.item’) 에 click 이벤트 핸들러로 등록해 놓은 함수안에서 foo 변수를 사용하고 있습니다. item 이라는 클래스를 가진 엘리먼트들이 클릭되었을 때 자기 자신만 빼고 나머지 item 들에 대해 addClass, removeClass, fadeOut 하는 코드입니다. 캐싱을 통해 성능도 향상되고 소스코드도 더 간결해 보이는 것 같습니다.


퍼포먼스 향상 Tip 6


메서드 체이닝을 사용하세요


var parents = $(‘.parents’).doSomething().doSomethingElse();

위 코드에서 doSomething() 메서드를 실행한 다음에 연달아서 doSomething() 메서드를 실행하고 있습니다. 이 것을 메서드 체이닝 또는 그냥 체이닝이라고 합니다.

$(‘.parents’).doSomething(); $(‘.parents’).doSomethingElse(); 이렇게 두 번 한것과 같은 실행을 하면서 속도는 더 빠릅니다.

대부분의 jQuery 메서드들은 체이닝을 지원합니다. 체이닝이 가능해지는 원리는 간단합니다. $(‘.parents’).doSomething(); 의 실행결과 리턴값이 $(‘.parents’) 이기 때문에 거기에 연달아서 .을 찍고 doSomethingElse(); 를 실행해도 되는 것입니다.

코드도 짧아지고 가독성도 높아집니다. 아래의 코드처럼 엔터를 몇 번 쳐주면 가독성은 더 좋아집니다.

// Without chaining

$(‘#notification’).fadeIn(‘slow’);

$(‘#notification’).addClass(‘.activeNotification’);

$(‘#notification’).css(‘marginLeft’, ’50px’);

// With chaining

$(‘#notification’).fadeIn(‘slow’)

                .addClass(‘.activeNotification’)

                .css(‘marginLeft’, ’50px’);

퍼포먼스 향상 Tip 7


이벤트 위임(event delegation)을 사용하세요 이벤트 위임은 이벤트의 bubble 속성을 사용한 것입니다. A 엘리먼트에 이벤트 핸들러를 등록하고 싶을 때 그 엘리먼트에 바로 붙이지 않고 그보다 상위 엘리먼트에 B에 등록합니다. 이벤트가 A에서 발생했어도 B로 bubble 되어 올라가는데 이때 B에 등록된 핸들러에서 A에서 발생한 것인지 살펴보고 맞으면 이벤트 핸들러를 실행하는 방식이 이벤트 위임입니다.


몇몇 엘리먼트에 이벤트 핸들러를 등록할 때는 이벤트 위임이 별로 효과가 없습니다. 하지만 어떤 ul에 li가 100개 있는데 li에 click 이벤트 핸들러를 등록하는 경우가 있다면, li 하나하나마다 등록해서 이벤트 핸들러 100개를 만드는 것보다 ul에 이벤트 핸들러 하나를 등록하는 것이 성능면에서 좋을 것입니다.


jQuery에서 엘리먼트에 이벤트 핸들러를 등록하는데 사용되는 메서드는 엘리먼트에 직접 등록하는 .bind() 메서드, 이벤트 위임을 사용하는 .live() 메서드, .delegate() 메서드가 있습니다. 이때 .live() 보다는 .delegate() 가 성능면에서 더 좋습니다.


최근에 나온 jQuery 1.7 버전에는 이벤트를 등록할 수 있는 새로운 메서드인 .on() 메서드가 나왔습니다. 그리고 .bind(), .live(), .delegate() 메서드 모두 jQuery 내부적으로는 .on() 메서드를 사용하게 소스코드가 바뀌었습니다. 그래서 jQuery 1.7 이상 버전을 사용하신다면 여러 메서드들 중 하나를 선택하실 필요없이 그냥 .on() 메서드를 사용하시면 됩니다.


퍼포먼스 향상 Tip 8


DOM 에 노드를 추가하거나 삭제하는 작업은 최소화하는 것이 좋습니다.


DOM 접근은 (성능면에서) 비용이 많이 드는 작업입니다.

이 것은 .append(), .insertBefore(), .insertAfter() 등의 메서드 사용을 최소화 하면 성능이 향상된다는 것을 의미합니다.

정보의 저장/조회 용도라면 .text(), .html() 보다 .data() 를 사용하는 것이 좋습니다.

Tip 1: 더 나은 .append() 사용법


.append() 는 한 번만 사용할 수 있는 방법을 찾으십시오

append를 여러 번 하는 것은 한 번 사용하는 것보다 90% 까지 느려질 수 있습니다. 그리고 캐싱되지 않은 jQuery 객체에 append 한다면 추가로 20%까지 느려집니다.

Tip 2: .detach() 를 사용하세요


.detach() 는 노드를 DOM에서 제거하면서 캐싱합니다. 그래서 나중에 다시 DOM에 넣을 수 있습니다.

이벤트 핸들러가 많이 걸려있는 노드를 DOM에서 제거했다가 나중에 다시 넣는다면, 이벤트 핸들러를 다시 등록해줘야 할텐데 .detach() 를 사용하면 그냥 다시 DOM에 넣기만 하면 됩니다. .detach() 로 DOM에서 삭제하면 노드에 붙은 이벤트 핸들러 정보를 그대로 가지고 있기 때문입니다.

.detach() 를 사용하지 않은 경우보다 60%까지 빠릅니다.

// .detach() example

$(‘p’).click(function () {

    $(this).toggleClass(‘off’);

});

var p;

$(‘button’).click(function () {

    if (p) {

        /* ..additional modification */

        p.appendTo(‘body’);

        p = null;

    } else {

        p = $(‘p’).detach();

    }

});

Tip 3: 더 나은 .data() 사용법


보통 .data() 메서드는 $(‘#elem’).data(key, value); 와 같은 형태로 사용합니다.

이보다는 $.data(elem, key, value); 처럼 사용하는 것이 더 빠릅니다. 여기서 첫 번째 인자인 elem은 var elem = document.getElementById(‘#elem’); 과 같이 만들어진 DOM 객체를 의미합니다.

(jQuery 객체).data(..) 형태로 사용하는 것보다 $.data(DOM객체, ..) 형태로 사용하는 것이 더 빠르다는 의미입니다.

위에서 보신 것처럼 var elem; 을 DOM 객체로 만드는 수고가 한 번 더 들지만, 만약 미리 만들어 놓은 상황이라면 $.data() 를 사용하는 것이 더 빠릅니다.

퍼포먼스 향상 Tip 9


loop를 잘 사용하세요 – 반복문, jQuery 에서는 $.each() 와 .each()


jQuery의 $.each() 와 .each() 보다 자바스크립트 본래의 for, while 문이 더 빠르다는 것을 알고 계신가요?

jQuery의 loop는 편리하지만 항상 최고의 성능을 발휘하는 것은 아닙니다.

그리고 꼭 jQuery의 loop 가 아니더라도 프로그래밍을 할 때 가능하다면 반복문은 피하는 것이 좋습니다. loop는 느립니다.

퍼포먼스 향상 Tip 10


꼭 필요한 경우가 아니라면 jQuery 객체를 만들지 마세요


개발자들은 대체 가능한 더 간단한 방법이 있는 경우에도 jQuery 객체를 만들어 쓰곤 합니다. Tip 4 에서 살펴봤던 것처럼 $(this).attr(‘id’) 보다는 this.id 가 더 빠릅니다.

$.method() 형태가 $.fn.method() 보다 빠릅니다. Tip 8 에서 살펴본 것처럼 $.data() 가 .data() 보다 빠릅니다. 그래서 가능하다면 이렇게 사용하면 좋습니다.

하지만 $.data() 를 사용하기 위해서는 역시 Tip 8 에서 살펴본 것처럼 DOM 객체를 미리 만들어 놔야 하므로, 상황에 따라 가능할 경우 그렇게 하면 됩니다.

보너스 Tip


DRY 하세요~ Don’t Repeat Yourself – 같은 코드를 반복적으로 사용하지 않는 방법을 연구하면 좋습니다.


간단한 예제 소스를 보겠습니다.


// Let’s store some default values to be read later

var defaultSettings = {};

defaultSettings['carModel'] = ’Mercedes’;

defaultSettings['carYeasr'] = 2012;

defaultSettings['carMiles'] = 5000;

defaultSettings['carTint'] = ’Metallic Blue’;

// Non-DRY code

$(‘.someCheckbox’).click(function () {

    if (this.checked) {

        $(‘#input_carModel’).val(defaultSettings.carModel);

        $(‘#input_carYear’).val(defaultSettings.carYear);

        $(‘#input_carMiles’).val(defaultSettings.carMiles);

        $(‘#input_carTint’).val(defaultSettings.carTint);

    } else {

        $(‘#input_carModel’).val(”);

        $(‘#input_carYear’).val(”);

        $(‘#input_carMiles’).val(”);

        $(‘#input_carTint’).val(”);

    }

});

// DRY code

var props = ['carModel', 'carYear', 'carMiles', 'carTint'];

$(‘.someCheckbox’).click(function () {

    var checked = this.checked;

    /*

        Non-DRY code 에서는 무엇을 반복하고 있나요?

        1. input_ .. 형태로 생긴 field 명 들

        2. 값을 설정하기 위한 $(‘#input_ .. ‘).val(defaultSettings. .. );

        3. 값을 초기화하기 위한 $(‘#input_ .. ‘).val(”);

        DRY code 에서는 어떻게 바꿀 수 있나요?

        1. input_ .. 형태로 생긴 field 명 들을 자동으로 생성

        2. $.each 로 loop를 돌면서 key를 받아서 defaultSettings[key] 형태로 사용

        3. 삼항연산자를 사용해서 – checked ? 설정 : 초기화 – 코드를 간략하게 만듬

    */

    $.each(props, function (i, key) {

        $(‘#input_’ + key).val(checked ? defaultSettings[key] : ”);

    });

});

참조: http://codefactory.kr/2011/12/07/jquery-performance-tips-and-tricks/

Technical Note/IT TREND

메인 PC가 맥으로 바뀐지 오래되었는데도

사용하는 단축키만 사용하게 되네... 


맥북 단축키 정리된 자료입니다. 맥북 키보드의 기능키와 단축키를 알아두면 편리합니다.


⌘(Cmd) : 스페이스바 옆의 커맨드키입니다. 주로 단축키 조합에 많이 쓰이며, 윈도우즈에서 쓰던 컨트롤키 대신 사용하면 많은 부분에서 대응이 됩니다.

⌥(Opt) : 옵션키(option)입니다.

⌃(Ctrl) : 컨트롤키입니다.

↩(return) : 리턴키입니다.

⇧(Shift) : 시프트키입니다.

⌫(Delete) : 딜리트키입니다.

⎋(esc) : 이스케이프키(escape)키입니다.

⏏(eject) : 미디어 추출키입니다.



1. 시동할 때 (시동 할 때 계속 누르고 있어야 합니다.)


[C] : CD로 시동

[D] : 첫번째 파티션으로 시동

[N] : 네트워크 서버로 시동

[T] : 맥을 파이어와이어 타겟 디스크 모드로 설정

[Shift] : 시작 아이템이 열리는 것을 방지

[Opt] : 모든 시동 디스크의 아이콘을 보여주며, 시동 디스크를 선택할 수 있음


[Cmd]+[Opt] + [Del] : 외장 드라이브로 시동

[Cmd]+[Opt]+[P]+[R] : PRAM (Parameter RAM)을 억제

[Cmd]+[Opt]+[O]+[F] : 열려 있는 펌웨어를 스크린에 보여줌

[Cmd]+[V] : 시동되는 동안 Unix 콘솔 메시지를 보여줌

[Cmd]+[S] : 1 사용자 모드로 시동

[마우스 버튼] : 안 나오는 CD/DVD를 추출

[Shift] (시동 후) : 커넬 확장자 (kernel extensions)를 끔

[Shift] (로그인 후) : 파인더와 시작 아이템이 열리는 것을 방지




2. 파인더 사용 시


[Cmd]+[W] : 활성화된 파인더 윈도우를 닫음

[Cmd]+[Q] : 활성화된 프로그램을 종료window에서 Alt+f4와 같음

[Cmd]+[Opt] + [W] : 모든 파인더 윈도우를 닫음

[오른쪽 방향키] : 목록 보기에서 선택된 폴더를 확장

[왼쪽 방향키] : 목록 보기에서 선택된 폴더를 축소

[Opt]+[오른쪽 방향키] : 목록 보기에서 선택된 폴더와 그 안의 모든 폴더를 확장

[Opt]+[왼쪽 방향키] : 목록 보기에서 선택된 폴더와 그 안의 모든 폴더를 축소

[Cmd]+[위 방향키] : 기본 파인더를 열음

[Cmd]+[Opt]+[Shift] + [위 방향키] : 데스크탑을 선택

[Cmd]+[아래 방향키] : 선택된 아이콘을 열음

[Cmd]+[Sift]+[A] : /Application 폴더열기 맥에서 이폴더는 윈도우에서 프로그램 폴더와 유사함. 많이쓰입니다.

[Cmd]+[Sift]+[U] : Utilly 폴더를 열기 

[Tab] : 알파벳 순으로 다음 아이콘 선택

[Shift]+[Tab] : 알파벳 순으로 이전 아이콘 선택

[Cmd]+[Del] : 선택된 아이콘을 휴지통으로 옮김 | 레퍼드에선 Cmd --> Opt

[Cmd]+[Sift] + [Del] : 휴지통 비우기 |레퍼드에선 Cmd --> Opt

[스페이스] : 훑어보기

[Opt] (CD를 삽입할 때) : 각 세션을 각각의 아이콘으로 보여줌




3. 전원키


[Ctrl]+[Cmd]+[eject] : 강제 재시동

[Ctrl]+[Opt]+[Cmd]+[eject] : 종료

[Opt]+[Cmd]+[eject] : 잠자기



4. 프로그램을 사용할 때


[Cmd]+[Tab] : 최근에 사용한 열려있는 프로그램을 앞뒤로 선택함

[Cmd]+[Tab] (Cmd를 누른 상태에서) : Tab을 누를 때마다 열려있는 프로그램을 Dock에 있는 순서대로 선택함

[Cmd]+[Shift] (Cmd를 누른 상태에서) : Shift를 누를 때마다 열려있는 프로그램을 Dock에 있는 반대 순서대로 선택함

[Cmd]+[~] : 프로그램 내에서 다음 윈도우를 선택함

[Opt]+[Cmd]+[Esc] : "강제 종료" 대회창 열림

[Shift]+[Cmd]+[3] : 데스크탑에 현재 스크린 이미지를 png 파일로 캡쳐함

[Shift]+[Cmd]+[4] : 타겟 모양을 생성, 원하는 스크린 이미지를 드래그해서 캡쳐할 수 있음

[Cmd]+[스페이스] : 키보드 언어 전환(한/영전환)


[Opt]+"Empty Trash" : "확인" 대화창 없이 휴지통을 비움

[Opt]+Dock아이콘/윈도우 클릭 : 이 프로그램을 선택하고 이전 프로그램을 숨김

[Cmd]+[Opt]+[드래그] : 파인더 윈도우에서 아무 방향으로 스크롤할 수 있음

[Cmd]+[드래그] : 메뉴렛이나 툴바 아이콘을 재정리/삭제

[Cmd]+윈도우 제목 클릭 : 팝업 메뉴가 열리면서 그 폴더의 경로를 보여줌

[Opt]+Zoom 버튼 클릭 : 윈도우를 전체 화면으로 확대

[Opt]+Minimize 버튼 클릭 : 모든 파인더 윈도우를 최소화

[Opt]+Close 버튼 클릭 : 모든 파인더 윈도우를 닫음

[Shift]+Minimize/Close 버튼 클릭 :느린 동작으로 윈도우를 최소화/닫음


[Cmd]+[Opt]+[D] : Dock을 숨김/보여줌

[Cmd]+Dock 아이콘 클릭 : 파인더에 있는 실제 아이콘이 나타남

[Cmd]+[Opt]+Dock 아이콘 클릭 : 이 프로그램을 선택하고 나머지 프로그램들은 모두 숨김

[Ctrl]+Dock 아이콘 클릭 : 프로그램의 환경 메뉴를 열음

[Cmd]+아이콘을 Dock 아이콘으로 드래그 : Dock 아이콘이 움직이는 것을 방지해서 아이콘을 그 사이에 드랍할 수 있음

[Cmd]+[Opt]+아이콘을 Dock으로 드래그 : 드랍하는 아이콘을 바로 열게 함

[Cmd]+[Opt]+ 8 :화면을 확대 모드로 토글합니다. 

[Cmd]+[Opt]+ +/- :화면을 확대모드로 토글되상태에서 +/-를 누르면 마우스 포인터의 위치에서 확대되거나 축소됩니다. ([Ctrl]+마우스 휠 동작과 동일함)

[Cmd]+[Ctrl]+[Opt]+8 : 화면의 색상을 반전 시킵니다. 반저된 사진을 볼때 유용합니다.

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


1 2 3 4 5 6 7 ··· 27
블로그 이미지

zzikjh