발생되는 경우 클래스 파일을 찾을 수 없는 경우
조 언 실행하려는 클래스 파일 이름이 제대로 되어 있는지 확인한다.
또한, CLASSPATH 설정이 제대로 되어 있는지 확인하며 (도스모드에서 set명령어)
만약, 되어있지 않다면 설정한다. (CLASSPATH = jdk1.3/jre/lib/rt.jar; 2-1강좌 참조)
발생되는 경우 클래스 파일을 찾을 수 없는 경우
조 언 실행하려는 클래스 파일 이름이 제대로 되어 있는지 확인한다.
또한, CLASSPATH 설정이 제대로 되어 있는지 확인하며 (도스모드에서 set명령어)
만약, 되어있지 않다면 설정한다. (CLASSPATH = jdk1.3/jre/lib/rt.jar; 2-1강좌 참조)
UTF-8 한글로 설정하기 위해서 다음과 같은 명령어를 실행하면 됩니다.
1
|
$ sudo locale-gen ko_KR.UTF-8 |
이렇게 명령을 실행하고 확인을 했는데 LANGUAGE 값이 바뀌지 않아서 다음 파일을 수정했습니다. 이부분은 참고만 하세요! 제 경우에만 해당될 수도 있습니다.
1
2
3
|
$ sudo vi /etc/default/locale LANG= "ko_KR.UTF-8" LANGUAGE= "ko_KR:ko:en_US:en" |
그리고 다음 명령으로 설정된 것을 확인하면 됩니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
$ locale LANG=ko_KR.UTF-8 LANGUAGE=ko_KR:ko:en_US:en LC_CTYPE= "ko_KR.UTF-8" LC_NUMERIC= "ko_KR.UTF-8" LC_TIME= "ko_KR.UTF-8" LC_COLLATE= "ko_KR.UTF-8" LC_MONETARY= "ko_KR.UTF-8" LC_MESSAGES= "ko_KR.UTF-8" LC_PAPER= "ko_KR.UTF-8" LC_NAME= "ko_KR.UTF-8" LC_ADDRESS= "ko_KR.UTF-8" LC_TELEPHONE= "ko_KR.UTF-8" LC_MEASUREMENT= "ko_KR.UTF-8" LC_IDENTIFICATION= "ko_KR.UTF-8" LC_ALL= |
arg-cpu
|
%user
|
%nice
|
%system
|
%iowait
|
%steal
|
%idle
|
---|---|---|---|---|---|---|
마지막 재부팅 이후의 평균 CPU 활용량 | 어플리케이션 등 사용자 모드에 소모된 시간 | nice를 사용하여 스케줄링 우선순위가 바뀐 프로세스에 소모된 시간 | 시스템(커널)이 사용한 시간 | 디스크I/O 요청 때문에 CPU가 대기한 시간 | 다른 가상 CPU가 서비스하는 동안 비자발적으로 대기한 시간 | 대기한 시간 |
Device
|
tps
|
kB_read/s
|
kB_wrtn/s
|
kB_read
|
kB_wrtn
|
---|---|---|---|---|---|
디바이스 구분 | 초당 전송(입출력) 수 | 초당 읽혀진 KB (Blk일 경우 512바이트 블록수) | 초당 쓰여진 KB (Blk일 경우 512바이트 블록수) | 지금까지 읽혀진 KB(Blk일 경우 512바이트 블록수) | 지금까지 쓰여진 KB(Blk일 경우 512바이트 블록수) |
procs | memory | swap | io | system | cpu | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
r | b | w | swpd | free | buff | cache | si | so | bi | bo | in | cs | us | sy | id | wa |
현재 실행중인 프로세스의 수(CPU 접근 대기 중인 실행 가능 프로세스 수) | 인터럽트가 불가능한 sleep 상태에 있는 프로세스의 수 (I/O 처리를 하는 동안 블럭 처리된 프로세스) | 강제로 스왑아웃된 프로세스 | 사용하고 있는 swap 메모리 양(사용된 가상 메모리 용량) | 사용가능한 메모리 양 | 버퍼로 사용되고 있는 메모리 양 | 캐시로 사용되고 있는 메모리 양 | swap in(디스크에서 메모리로 스왑된 메모리 용량) | swap out(디스크로 스왑되어 나간 메모리 용량) | 초당 블럭 디바이스로 보내는 블럭 수(블록 장치로 보내진 블록) | 초당 블럭 디바이스로부터 받은 블럭 수(블록 장치에서 받아온 블록) | 초당 인터럽트 되는 양 | 초당 context switch되는 양 | 사용자의 CPU 사용 시간 비율(CPU가 사용자 수준 코드를 실행한 시간, 백분율 단위) | 시스템의 CPU 사용 시간 비율(CPU가 시스템 수준 코드를 실행한 시간, 백분율 단위) | CPU idle time(백분율 단위) | 입출력 대기 |
PID
|
USER
|
PR
|
NI
|
VIRT
|
RES
|
SHR
|
S
|
%CPU
|
%MEM
|
TIME+
|
COMMAND
|
---|---|---|---|---|---|---|---|---|---|---|---|
프로세스 ID | 프로세스를 실행시킨 사용자 ID | 프로세스의 우선순위 | NICE 값 | 가상 메모리의 사용량(SWAP+RES) | 현재 페이지가 상주하고 있는 크기(Resident Size) | 분할된 페이지, 프로세스에 의해 사용된 메모리를 나눈 메모리의 총합 | 프로세스의 상태(Sleeping, Running, sWapped out process, Zombies) | 프로세스가 사용하는 CPU의 사용율 | 프로세스가 사용하는 메모리의 사용율 | CPU TIME, hundredths | 실행된 명령어 |
total
|
used
|
free
|
shared
|
buffers
|
cached
|
---|---|---|---|---|---|
전체 메모리의 용량으 Kbyte단위(default)로 표시 | 현재 시스템에서 사용중인 메모리의 량을 Kbyte 단위로 표시 | 현재 시스템에서 사용중이지 않은 메모리의 량을 Kbyte단위로 표시 | 현재 시스템에서 공유한 메모리의 용량을 표시 | 현재 시스템에서 buffering된 메모리의 량을 표시 | 현재 시스템에서 caching된 ㅣ메모리의 량을 표시 |
total
|
used
|
free
|
---|---|---|
시스템의 전체 스왑메모리의 량을 표시 | 전체 스왑메모리 중에서 현재 사용중인 스왑메모리의 량을 표시 | 전체 스왑메모리중에서 사용되지 않고 남아 있는 메모리의 량 |
TID | PRIO | USER | DISK READ | DISK WRITE | SWAPIN | IO | COMMAND |
---|
CPU – perf, top, htop
Memory – valgrind, smem
Disk I/O – nmon, bonnie, sysstat
Network – netperf, iftop, netstat
Cross-Domain 문제 해결방법에 대한 조사결과
AJAX를 살펴보면서 Cross-Domain 제한의 문제점에 봉착함.
Cross-Domain의 Pattern은 아래 3가지로 나눠볼 수 있음.
1. from one single domain to many targets
2. from many sources to one single target
3. from many sources to many targets.
지금 고민하는것은 2번항목임.
[지금까지 찾은 해결방법]
(1) Proxy Server 이용 : 최초 시도한 방법인데 이건 사실상 위 1번 항목에 해당하는것으로 적당하지 않고 또한 cookie나 session문제등이 있어서 몇번 사용해보다고 취소함.
(2) SignedJavaScript : Netscape계열에서만 되며 JavaScript에 대한 전자서명시 서명된 javascript는 cross-domain 제약을 극복하여 자유롭게 다른 사이트와 통신가능함. MSIE에서는 동작하지 않는다는 문제점이 있고 아직 테스트해보지 못함.
(3) Flash4AJAX : 지금까지 찾은 최상의 방법인데 ActiveX/Plugin을 사용하기는 하지만 광범위하게 배포된 Flash를 이용하여 구현함으로 Cross-Browser문제는 쉽게 극복가능함. 그러나 Flash에 대해서 잘 모르기 때문에 좀더 살펴보고 있음.
(4) JSON + WebServices : 야후 API에서 사용하고 있는데 Target서버에서 JSON Format으로 Output을 뿌려줘야하는 문제 있음. 아직 테스트 못함.
(5) ActiveX : 어떻게 보면 가장 손쉬운 방법인데 일단 하나 만들어 사용중이기는 하지만 Cross-Browser 문제해결에는 적절치 못함.
(6) Windows TrustedZone 등록 : Source Domain상의 유저가 해당 Source Domain을 Windows TrustedZone에 등록해버리면 어디든 나갈 수 있는데 사실 말이 안됨. 보안상 엄청 위험하기도함.
(7) IFrame 이용 : iframe이용하면 일단 AJAX Cross-Domain 문제는 해결되지만 frame간의 cross-domain 문제가 새롭게 대두됨. cross-domain cookie등 Security issue가 꾸준하게 제기되어온 사항임. 일단 target server로 Get Method로 데이터를 넘기기만 하는 형태로는 쓸만함. (결과수신은 아주 어려움)
[ 최종 선택한 방법 : JSON ]
JSON Format으로 결과 전달하고 Callback method로 해당 결과 수신하는 방법이 정답임.
우선 단점 : Request시 GET Method에 해당하는 정보만 전달가능하므로 정보전달 양이 한계가 있음. 그리고 미동기 통신이 안되는 문제점 있음.
그리고 장점 : 대용량 Response를 받을 수 있음. 사실상 브라우저 및 네트웍 성능에 달려 있음. 아무런 ActiveX나 Plugin이 필요치 않음. Cross-Browser 사실상 지원. JavaScript Tag가 먹히는지 여부 실제 확인 필요
(Concept)
1) Client에서 JSon Request URL 생성
2) Javascript createElement tag로 script 객체 생성
3) DOM에 해당 객체 추가하여 실제 반영. 객체추가시 즉각 Remote Server의 CGI/JSP/PHP 호출
4) Remote Server에서는 Request에 따른 업무 처리 후 결과를 callback method로 둘러싼 JSON Format으로 생성하여 화면 송출
5) Browser에서는 결과가 실제로는 script tag 내에 위치하면서 callback method를 호출한것과 동일한 효과발생.
6) callback method내에서 필요한 client측의 업무 처리.
JSON은 AJAX 통신은 아님 사실상 Dynamic Script Creation에 해당되며 script creation시 Remote Server의 script를 불러오는 형태임.
실제 업무에서 JSON과 AJAX를 적절히 섞어 쓸 필요 있음.
C 언어같은 저급 언어는 메모리 관리를 위해 malloc()
과 free()
를 사용한다. 반면, 자바스크립트는 무언가가 생성되었을 때(오브젝트나 문자열 등) 메모리를 할당하고 쓸모 없어졌을 때 ‘자동으로’ free 한다. ‘자동으로’ 라는 말에는 혼란의 여지가 있다. 이는 자바스크립트를 포함한 여러 고급 언어 개발자들에게 메모리 관리가 불가능하다는 인상을 준다. 하지만 실상은 그렇지 않다.
메모리 생존주기는 프로그래밍 언어와 관계없이 비슷하다.
첫 번째 부분과 두 번째 부분은 모든 언어에서 분명하게 기술되지만 마지막 부분은 조금 다르다. 저급 언어에서는 분명히 기술되지만 자바스크립트 같은 고급 언어에서는 분명하게 기술되지 않는다(역자: 명시적으로 free를 하지 않는다는 의미).
자바스크립트에서는 프로그래머들이 일일히 메모리 할당을 하는 수고를 덜어주기위해 값을 선언할 때 메모리를 할당한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
var n = 123; // 정수를 담기 위한 메모리 할당 var s = "azerty" ; // 문자열을 담기 위한 메모리 할당 var o = { a: 1, b: null }; // 오브젝트와 그 오브젝트에 포함된 값들을 담기 위한 메모리 할당 var a = [1, null , "abra" ]; // (오브젝트 처럼) 배열과 배열에 담긴 값들을 위한 메모리 할당 function f(a){ return a + 2; } // 함수를 위한 할당(함수는 '호출가능한' 오브젝트이다) // 함수식 또한 오브젝트를 담기위한 메모리를 할당한다. someElement.addEventListener( 'click' , function (){ someElement.style.backgroundColor = 'blue' ; }, false ); |
몇 가지 함수에서도 메모리 할당이 일어난다.
1
2
|
var d = new Date(); var e = document.createElement( 'div' ); // DOM 엘리먼트를 위해 메모리를 할당한다. |
몇 가지 메쏘드도 새로운 값이나 오브젝트를 담기 위해 메모리 할당이 일어난다.
1
2
3
4
5
6
7
|
var s = "azerty" ; var s2 = s.substr(0, 3); // s2는 새로운 문자열 // 자바스크립트에서 문자열은 immutable 값이기 때문에 메모리를 새로 할당하지 않고 단순히 [0, 3] 이라는 범위만 저장한다. var a = [ "ouais ouais" , "nan nan" ]; var a2 = [ "generation" , "nan nan" ]; var a3 = a.concat(a2); // 4개의 원소를 가진 새로운 배열 |
값 사용이란 기본적으로는 할당된 메모리를 읽고 쓰는 것을 의미한다. 변수나 오브젝트 속성 값을 읽고 쓸때 값 사용이 일어난다. 또 함수 호출시 함수에 인수를 넘길때도 일어난다.
이 단계에서 대부분의 문제가 발생한다. “할당된 메모리가 더 이상 필요없을 때”를 알아내기가 힘들기 때문이다. 이제까지는 개발자들이 메모리가 필요없어질 때를 정하고 free하곤 했다.
고급 언어 인터프리터는 “가비지 콜렉터”라는 소프트웨어를 가지고 있다. 가비지 콜렉터란 메모리 할당을 추적하고 할당된 메모리가 더 이상 필요 없어졌을 때 해제하는 작업을 한다. 이 작업은 근사적인 작업이다. 왜냐하면 일반적인 경우에 어떤 메모리가 필요없는지 알아내는 것은 알고리즘으로 풀 수 없는 비결정적인 문제이기 때문이다. (역자: 세상에 존재하는 모든 가비지 콜렉터는 안전하지만 완전하지 않다. 가비지 콜렉터는 항상 필요없어진 메모리만을 해제하지만 모든 필요없어진 메모리를 해제하는건 아니다)
위에서 언급한 것처럼 “더 이상 필요없는” 모든 메모리를 찾는건 비결정적이다. 따라서 몇 가지 제한을 두어 “더 이상 필요없는 모든 메모리”가 아니라 “더 이상 필요없는 몇몇 메모리”를 찾아보자. 몇 개의 가비지 콜렉션 알고리즘을 소개하고 한계점을 알아볼 것이다.
가비지 콜렉션 알고리즘의 핵심 개념은 참조이다. A라는 메모리를 통해 (명시적이든 암시적이든) B라는 메모리에 접근할 수 있다면 “B는 A에 참조된다” 라고 한다. 예를 들어 모든 자바스크립트 오브젝트는 prototype 을 암시적으로 참조하고 그 오브젝트의 속성을 명시적으로 참조한다.
앞으로 “오브젝트”라는 어휘의 의미를 넓혀서 기존의 자바스크립트 오브젝트뿐만 아니라 함수 스코프도 포괄하자.
참조-세기 알고리즘은 가장 무난한 알고리즘이다. 이 알고리즘은 “더 이상 필요없는 오브젝트”를 “어떤 다른 오브젝트도 참조하지 않는 오브젝트”라고 정의한다. 어떤 오브젝트를 참조하는 다른 오브젝트가 하나도 없다면 그 오브젝트에 대해 가비지 콜렉션을 수행한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
var o = { a: { b:2 } }; // 2개의 오브젝트가 생성되었다. 하나의 오브젝트는 다른 오브젝트의 속성으로 참조된다. // 나머지 하나는 'o' 변수에 할당되었다. // 명백하게 가비지 콜렉션 수행될 메모리는 하나도 없다. var o2 = o; // 'o2' 변수는 위의 오브젝트를 참조하는 두 번째 변수이다. o = 1; // 이제 'o2' 변수가 위의 오브젝트를 참조하는 유일한 변수가 되었다. var oa = o2.a; // 위의 오브젝트의 'a' 속성을 참조했다. // 이제 'o2.a'는 두 개의 참조를 가진다. 'o2'가 속성으로 참조하고 'oa'라는 변수가 참조한다. o2 = "yo" ; // 이제 맨 처음 'o' 변수가 참조했던 오브젝트를 참조하는 오브젝트는 없다(역자: 참조하는 유일한 변수였던 o2에 다른 값을 대입했다) // 이제 오브젝트에 가비지 콜렉션이 수행될 수 있을까? // 아니다. 오브젝트의 'a' 속성이 여전히 'oa' 변수에 의해 참조되므로 메모리를 해제할 수 없다. oa = null ; // 'oa' 변수에 다른 값을 할당했다. 이제 맨 처음 'o' 변수가 참조했던 오브젝트를 참조하는 다른 변수는 없으므로 가비지 콜렉션이 수행된다. |
이 알고리즘은 두 오브젝트가 서로를 참조하면 문제가 발생한다. 두 오브젝트 모두 필요 없어졌더라도 가비지 콜렉션을 수행할 수 없다.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
function f(){ var o = {}; var o2 = {}; o.a = o2; // o는 o2를 참조한다. o2.a = o; // o2는 o를 참조한다. return "azerty" ; } f(); // 두 오브젝트가 만들어지고 서로를 참조해서 순환이 일어났다. // 함수가 종료되고 나면 사실상 두 오브젝트는 의미가 없어지므로 가비지 콜렉션이 수행되어야 한다. // 그러나 위의 참조-세기 알고리즘에서는 두 오브젝트 모두 참조를 가지고 있기 때문에 둘 다 가비지 콜렉션이 일어나지 않는다. |
인터넷 익스플로러 6, 7 은 DOM 오브젝트에 대해 참조-세기 알고리즘으로 가비지 콜렉션을 수행한다. 흔히, 이 두 브라우저에서는 다음과 같은 패턴의 메모리 누수가 발생한다.
1
2
3
4
5
6
|
var div = document.createElement( "div" ); div.onclick = function (){ doSomething(); }; // div 오브젝트는 이벤트 핸들러를 'onclick' 속성을 통해 참조한다. // 이벤트 핸들러의 스코프에도 div 오브젝트가 있으므로 div 오브젝트에 접근할 수 있다. 따라서 이벤트 핸들러도 div 오브젝트를 참조한다. // 순환이 발생했고 메모리 누수가 일어난다. |
이 알고리즘은 “더 이상 필요없는 오브젝트”를 “닿을 수 없는 오브젝트”로 정의한다.
이 알고리즘은 roots 라는 오브젝트의 집합을 가지고 있다(자바스크립트에서는 전역 변수들을 의미한다). 주기적으로 가비지 콜렉터는 roots로 부터 시작하여 roots가 참조하는 오브젝트들, roots가 참조하는 오브젝트가 참조하는 오브젝트들… 을 닿을 수 있는 오브젝트라고 표시한다. 그리고 닿을 수 있는 오브젝트가 아닌 닿을 수 없는 오브젝트에 대해 가비지 콜렉션을 수행한다.
이 알고리즘은 위에서 설명한 참조-세기 알고리즘보다 효율적이다. 왜냐하면 “참조되지 않는 오브젝트”는 모두 “닿을 수 없는 오브젝트” 이지만 역은 성립하지 않기 때문이다. 위에서 반례인 순환 참조하는 오브젝트들을 설명했다.
2012년 기준으로 모든 최신 브라우저들은 가비지 콜렉션에서 표시하고-쓸기 알고리즘을 사용한다. 지난 몇 년간 연구된 자바스크립트 가비지 콜렉션 알고리즘의 개선들은 모두 이 알고리즘에 대한 것이다. 개선된 알고리즘도 여전히 “더 이상 필요없는 오브젝트”를 “닿을 수 없는 오브젝트”로 정의하고 있다.
첫 번째 예제에서 함수가 리턴되고 나서 두 오브젝트는 닿을 수 없다. 따라서 가비지 콜렉션이 일어난다.
두 번째 예제에서도 마찬가지다. div 변수와 이벤트 핸들러가 roots로 부터 닿을 수 없어지면 순환 참조가 일어났음에도 불구하고 가비지 콜렉션이 일어난다.
이 한계가 지적되었지만 실제로는 사람들은 이 문제를 비롯한 가비지 콜렉션에 별 관심이 없다.
df (disk free) : 리눅스에 연결되어 있는 디스크의 남은 공간을 보여준다.
[사용법]
df [Option] [FileSystem | File]
* Option
– k : Kilobyte 단위
-m : Megabyte 단위
[예제]
‘df -k’ : Kilobyte 단위로 현재 마운트된 파티션들의 남은 공간을 보여준다.
‘df -m’ : Megabyte 단위로 현재 마운트된 파티션들의 남은 공간을 보여준다.
‘df .’ : 현재 디렉토리가 포함된 파티션의 남은 공간을 보여준다.
du : 특정 디렉토리에서 하부디렉토리까지 포함한 디스크의 사용량을 보여준다.
[사용법]
du [Option] [Files]
* Option
-a : 디렉토리에 있는 파일 하나하나의 크기를 출력한다.
-s : 총 사용량만 표시한다.
-k : KiloByte 단위로 표시한다.
-h : 용량을 사람이 보기 가장 좋게 표시한다.
[예제]
‘du -a’ : 현재 디렉토리의 디스크 사용량을 파일단위로 모두 출력한다.
‘du -s *’ : 현재 디렉토리의 첫번째 단계까지만 디스크의 사용량을 출력한다.
‘du -h –max-depth=0 *’ 와 동일
‘du -h –max-depth=1 . ‘
–max-depth=1 은 현재 폴더에서 깊이가 1 즉 현재 폴더 내의 파일에 대해서만 용량 표시
. 은 현재 폴더
root 폴더 사용량을 확인한다면…
[명령]
‘du -h –max-depth=0 /root’ or ‘du -sh /root’
[결과]
4.1G root
인덱스가 적절히 사용되고 있는지 검토
나열된 순서는 MYSQL 이 쿼리처리에 사용하는 순서대로 출력
EXPLAIN 의 각 행 설명
1. id : SELECT 번호, 쿼리내의 SELECT 의 구분번호
2. select_type : SELECT 의 타입
3. table : table명
4. type : 조인타입, 우수한 순서대로… 뒤로갈수록 나쁜 조인형태
5. possible_keys : MySQL 이 해당 테이블의 검색에 사용할수 있는 인덱스들
possible_keys 에 나타난 인덱스들이 결과에 나타난 테이블 순서에서 실제 사용할 수 없을수도 있음
6. key : MySQL 이 실제 사용한 key(index)
7. key_len : MySQL 이 사용한 인덱스의 길이, key 컬럼값이 NULL 이면 이값도 NULL
key_len 값으로 MySQL 이 실제 복수컬럼 키중 얼마나 많은 부분을 사용할 것인지 알 수 있음
8. ref : 행을 추출하는데 키와 함께 사용된 컬럼이나 상수값
9. rows : 쿼리 수행에서 MySQL 이 예상하는 검색해야할 행수
10. Extra : MySQL 이 쿼리를 해석한 추가적인 정보를 나타냄
vi 텍스트 찾기와 바꾸기 명령어를 인터넷에서 검색해 보았습니다. 하도 산재되어 있어서 한 군데로 모은 것입니다.
1. 문서 처음부터 마지막까지의 char 를 _char_ 로 치환한다.
:%s/char/_&_/g
2. 현재(커서위치)부터 마지막까지의 char 를 _char_ 로 치환한다.
:.,$s/char/_&_/g
3. buf_.*[255], buf_in[255], buf_get[255] 와 같은 문자열을 hello 로 변경한다.
:1,10s/buf_.*\[255\]/hello/g
4. 숫자로만 이루어진 행 찾기는 다음과 같습니다.
/^\d\+$
^ : 행의 첫부분
\d : 0~9까지의 숫자
+ : 바로 앞의 글자 (여기서는 숫자)가 1개나 1개 이상 있음. (즉 숫자가 최소한 1개 있음)
$ : 행의 마지막 부분
5. 전체 문서에서 add 를 plus로 치환
:s/add/plus/g
6. 현재 편집중인 전체 문서에서 /etc/ 를 /etc/local/ 로 치환
:s/\/etc\//\/etc\/local\//g
7. ‘앗싸좋구나108계단’ 이 ‘좋구나108계단앗싸’ 로 바뀝니다.
:%s/\(앗싸\)\(좋구나\)\(108계단\)/\2\3\1/g
8. 대소문자 구분없이 바꾸려면 i 옵션을 붙입니다. 이것은 “.vimrc” 파일을 고치지 않아도 작동합니다.
:%s/foo/bar/i
9. 정확하게 foo에 일치될 때만 바꿉니다. 즉 foo는 바꾸지만, foo 앞뒤로 다른 문자열이 붙어 있는 경우에는 바꾸지 않습니다.
:%s/\/bar
10. 정렬
123 def ghi
432 ius dkf
089 cdo lks
이걸 숫자를 가운데로, 두번째는 끝, 세번째 처음으로 보내려면
:%s/\([0-9]*\) \([a-z]*\) \([a-z]*\)/\3 \2 \1/g
11. 만약 3~5자리로 이루어진 모든 숫자를 검색하고 싶다면 다음과 같이 입력한다.
/[0123456789]\{3,5\} 또는
/[0-9]\{3,5\}
12. 만약 `ab’로 시작하는 소문자로 되어 있는 모든 단어를 삭제하려면 다음과 같이 입력한다.
:%s/ab[a-z]*//g
13. 만약 test라는 파일에 cpu가 들어있는 라인을 모조리 지우고자 한다면 vi mode에서 아래와 같이 사용한다.
:g/cpu/d
# g는 모든 라인에 적용한다라는 의미이고,
# d는 delete를 의미합니다.
14. stat0,stat1…..stat9 패턴이 있는 라인을 모조리 지우기
:g/stat[0-9]/d
15. 빈 줄 두 줄을 한 줄로 바꾸기
:%s/\n\n/\n/g
16. 두 칸을 한 칸으로 줄이기
:%s/ / /g
17. 탭을 스페이스 공백으로 바꾸기
:%s/\t/ /g
18. 마지막에 한 칸 띠우고 엔터된 것을 바로 엔터한 것으로 고치기
:%s/ $//g 또는
:%s/ \n/\n/g
19. 줄 첫 칸의 띠어쓰기를 없애기
:%s/^ //g
20. 잘못 바꾸기를 했을 때 되돌리려면 그냥 u 키를 누르면 됩니다.
NAME last, lastb – 사용자들의 마지막 로그인했는 기록 목록을 보여준다. SYNOPSIS last [-R] [-num] [ -n num ] [-adx] [ -f file ] [name…] [tty…] lastb [-R] [-num] [ -n num ] [ -f file ] [-adx] [name…] [tty…] DESCRIPTION Last 명령은 /var/log/wtmp 파일이나, -f 옵션에서 지정한 파일을 통해서 사용자의 로그인, 로그아웃 시간을 보여준다. 특정 사용자의 이름이나, tty를 지정할 수 있으며, 이렇게 지정되면, 해당 사용자의 로그인 정보만을 보여준다. tty의 이름은 생략될 수 있어, last 0 명령은 last tty0 명령과 같은 기능을 한다. last가 실행 중에 SIGINT(인터럽트 글쇠, 주로 Ctrl-C에 의해서 만들어지는 신호)가 감지되거나, SIGQUIT(마침 글쇠, 주로 Ctrl-에 의해서 만들어지는 신호)가 감지되면, 실행을 마친다. 접속 사용자 이름에 reboot라고 나오는 것은 시스템이 reboot된 것을 나타낸다. 즉 last reboot 명령으로 기록 파일이 만들어진 후부터 reboot 되었는 기록을 모두 볼 수 있다. Lastb 명령은 접속 실패를 기록하는 파일인 /var/log/btmp 파일을 대상으로 한다는 것을 제외하고는 last 명령과 같다. OPTIONS -num num 만큼의 줄만 보여준다. -n num 윗 기능과 같음. -R hostname 필드를 보여주지 않음. -a hostname 필드를 마지막에 보여줌. 이 옵션은 다음 옵션과 함께 요용하게 쓰임. -d 다른 호스트에서 접속한 것만 보여줌. -x shutdown이 일어난 상태나, run level이 바뀐 상태도 보여줌. NOTES wtmp 파일이나, btmp 파일이 없을 수도 있다. 시스템은 이런 파일이 있을 경우에만, 로그인 정보를 그 파일에 기록한다. 만약 없는데, 이제부터 last 명령을 사용하고 싶다면, 단지 간단하게 touch 명령을 사용해서 각 파일을 만들어 놓으면 된다. (예를 들면, touch /var/log/wtmp). AUTHOR Miquel van Smoorenburg, miquels@cistron.nl SEE ALSO shutdown(8), login(1), init(8) |