336x280


Webpack/React 기능 정리 by beizix


webpack --watch 
==> js파일을 수정할 때마다, webpack 에 지정한 output 파일(예. scripts.min.js)에 자동 빌드해준다. 

webpack-dev-server --content-base src
==> 웹팩 개발서버를 구동하면 웹브라우저에서 결과물 확인이 가능한데 이때 여러 폴더중 컨텐츠와 관련있는것(src)만 올리고 싶은데 --content-base 옵션이 쓰인다. 

webpack-dev-server --inline --hot
==> 위 옵션을 주면, 파일을 수정할 때마다 브라우저가 자동갱신되어 개발할 때 편리하다. 개발자가 자꾸 refresh 를 해줘야하는 번거로움을 덜어준다.  

react-router 는 싱글 페이지 어플리케이션에서 헤쉬값에 따라 다른 컨텐츠를 보여주는 핵심 역할을 담당한다.

docker 명령어 정리 by beizix

우선, MAC 에서 실행시 항상 런쳐패드에 있는 Docker Terminal 아이콘 클릭해서 쉘을 열자. 

docker images 
- 현재 설치된 docker 이미지 목록 보기. 

docker ps 
- 현재 실행된 docker 컨테이너 목록 보기. 

docker rmi -f <Image ID> 
- 해당 이미지 삭제 

docker stop <Container ID> 
- 해당 컨테이너 동작 중단시키기 

docker run -i -t ubuntu:12.04 /bin/bash
ubuntu:12.04 이미지를 실행하고 bash 쉘로 들어가기 

docker-machine ls
- 현재 docker machine 목록 보기 

docker-machine ip default
- docker machine ip 정보얻기 


// ===========
// 유용한 정보
// ===========
http://blog.nacyot.com/articles/2014-01-27-easy-deploy-with-docker/

TCP : Flow Control by beizix

이 글은 http://chimera.labs.oreilly.com/books/1230000000545/ch02.html#CONGESTION_AVOIDANCE_AND_CONTROL 의 내용을 번역한 글입니다.

Flow Control(흐름 제어)

흐름제어는 송신측(sender)이 수신측(receiver)이 처리하기 버거울 정도로 데이터 양을 과도하게 전송하는 것을 방지하기 위한 메커니즘이다. - 수신측은 여러 작업을 하느라 부화가 걸렸을 수도 있고, 어쩌면 고정된 버퍼 용량만큼만 받고 싶어 할수도 있다.- 이를 위해 양쪽 TCP 커넥션은 들어오는 데이터를 처리할 수 있는 가용 버퍼의 크기를 알리기 위해 자신의 receive window (rwnd) 를 서로에게 공표(advertise) 한다.   


커넥션이 처음 맺어질 때 양측은 자신의 기본 시스템 셋팅에 맞춰 rwnd 값을 초기화 한다. 일반적인 웹페이지는 클라이언트 receive window 가 병목에 빠질만큼 대부분의 데이터를 서버에서 클라이언트로 전송한다. 그런데, 이미지나 비디오 업로드 처럼 클라이언트가 서버로 큰 데이터 용량을 전송하면 서버의 rwnd 가 제한요인이 된다. 


어떤 이유에서든지 둘 중 하나가 더이상 현재 창크기를 유지할 수 없다면, 더 작은 창크기를 송신측에 공표할 수 있다. 창크기가 zero(0) 가 되면, 어플리케이션 레이어에 의해 버퍼에 담긴 데이터가 지워질 때 까지 데이터를 보내서는 안된다는 신호로 여겨지게 된다. 이러한 작업은 모든 TCP 커넥션이 유지되는 동안 지속된다. 양측 모두 ACK 패킷에 최신 rwnd 정보를 담아 보내기에 용량에 맞게 데이터 양과 처리 속도를 동적으로 조절할 수 있다.


(이미지 출처: http://chimera.labs.oreilly.com/books/1230000000545/ch02.html#CONGESTION_AVOIDANCE_AND_CONTROL)



Window Scaling (RFC 1323)


초기 TCP 스펙에서는 송신과 수신측은 양측이 서로 주고받는 최대 receive window size 로 16bit 값(216, or 65,535 bytes)만을 허용했다. 하지만 이는 높은 대역폭은 가진 네트워크 환경에서 성능 최적화를 충족시키기에 충분한 값이 아니었다. 이를 해결하기 위해,  RFC 1323 에서 최대 창 크기를 65,353 bytes 에서 1 gigabyte 로 올릴 수 있도록 "TCP window scaling" 옵션이 제안되었다. 


이제 TCP window scalling 은 모든 메이저 플랫폼에서 기본 제공되고 있다. 하지만, 중간 노드(Nodes)나 라우터, 방화벽에 의해 재 작성되거나 이 옵션이 아예 삭제가 되버릴 수도 있다. 만약, 서버 혹은 클라이언트로의 커넥션이 대역폭을 전부 사용하지 못한다면, 선언된 창크기가 영향을 받는지 확인해봐야 합니다. 리눅스에서는 다음 명령어로 옵션 값을 확인하고 활성화 시킬 수 있습니다. 

  • $> sysctl net.ip4.tcp_window_scaling
  • $> sysctl -w net.ip4.tcp_window_scaling=1



TCP : Handshake by beizix

이 글은 구글의 성능 엔지니어 Ilya Grigorik이 작성한 High Performance Browser Networking 의 TCP 챕터의 일부를 번역한 문서입니다.(http://chimera.labs.oreilly.com/books/1230000000545/ch02.html#TCP_HANDSHAKE)


Three-Way Handshake

모든 TCP 커넥션은 three-way handshake 로 부터 시작됩니다. 클라이언트와 서버가 실제 데이터를 주고 받기 전에 양쪽은 서로의 패킷 시퀀스 번호를 주고 받는 동의 절차가 필요합니다. 시퀀스 번호는 보안상의 이유로 랜덤하게 생성됩니다.

 

SYN

클라이언트는 랜덤하게 생성한 시퀀스 번호 x 를 추가적인 TCP 플래그와 옵션값값들과 함께 SYN 패킷에 담아 보냅니다. 

SYN ACK

서버는 전달받은 x 값을 1 증가 시키고, 랜덤하게 시퀀스 번호 y 를 만듭니다. 그리고 플래그와 옵션값과 함께 응답에 담아 보냅니다.

ACK

클라이언트는 x와 y 값을 1씩 증가시키고, 마지막 ACK 패킷을 보냄으로써 handshake 를 마칩니다. 


(이미지 출처 : http://chimera.labs.oreilly.com/books/1230000000545/ch02.html#TCP_HANDSHAKE)



three-way handshake 가 완료되면, 클라이언트와 서버간의 데이타 교환이 가능해집니다. 클라이언트는 ACK 패킷을 보낸 후 즉시 데이터 패킷을 전송할 수 있고, 서버는 데이터를 전송하기 전에 반드시 클라이언트의 ACK 패킷을 기다려야 합니다. 이러한 시작 과정은 모든 TCP 커넥션에 적용되기에 TCP 를 사용하는 모든 네트워크 어플리케이션의 성능에 중요한 영향을 끼칩니다. 새로운 커넥션이 만들어지면 실제 데이터를 주고 받기 전에 양측을 전부 오가는 full roundtrip 지연(latency) 시간을 갖게 됩니다. 


three-way handshake 과정이 만든 지연요인은 새 TCP 연결을 맺는 비용을 크게 증가시킵니다. 이 점이 TCP를 이용한 어플리케이션들이 커넥션을 재사용하는 것이 성능 최적화에 있어서 굉장히 중요한 요인이 되는 이유입니다. 


* 참고

TCP 커넥션 재사용을 위한 HTTP persistent connection 은 HTTP 1.1 기본 스펙이며, Chrome/Firefox/IE 등 대부분의 브라우저에서 사용되는 방식입니다. 이에 대한 자세한 내용과 이를 사용했을 때의 장단점을 http://en.wikipedia.org/wiki/HTTP_persistent_connection 에서 확인할 수 있습니다.


자바스크립트 function 의 비밀(#1) - prototype 과 new by beizix

자바스크립트는 프로토타입(prototype) 속성과 new 연산자를 이용해서 새로운 인스턴스를 생성할 수 있습니다. 프로토타입에 추가된 메서드는 이를 근간으로 하는 모든 객체가 사용할 수 있는 공용 메서드가 됩니다. 또한, 명시적인 접근 제어자가 없어도 클로저(closure) 기법을 이용해 private 속성을 정의할 수 있습니다.

이번 포스팅의 키워드는 다음과 같습니다.
  • function
  • prototype
  • new
  • this
  • private

function

자바스크립트의 모든 객체는 자신만의 프로토타입 속성을 갖습니다. 이 프로토타입이 외부 객체와 연결되면, 연결된 외부 객체의 속성을 자신의 프로토타입으로 흡수합니다. 이 과정에서 자연스럽게 상속(inheritance)이 발생합니다. 자바스크립트에서 function 이 중요한 이유는 사용자가 정의할 수 있는 prototype 속성을 제공하는 유일한 객체이기 때문입니다.

function func () {};
var obj = {};
var array = [];

func.prototype; // Object
obj.prototype; // undefined
array.prototype // undefined


prototype

위의 func 함수가 생성될 때 자동으로 부여받은 프로토타입 속성을 다음과 같습니다. 
func.prototype = {
constructor: function func () {},
__proto__ : Object
}
constructor 속성에는 func 함수가 생성될 때 사용된 함수 객체가 담겨 있습니다. __proto__는 현재 프로토타입에 연결된 부모 객체(Object.prototype)를 나타냅니다. Firefox, Chrome, Safari 브라우저에서는 이 속성을 __proto__ 라는 이름으로 노출하므로 개발자가 사용할 수 있지만, 그 외의 브라우저는 스크립트로 이 속성에 접근할 수 없습니다. Object.prototype 을 상속받은 func 함수는 toString 과 hasOwnProperty 같은 메서드를 사용할 수 있습니다.

func.toString(); // "function func() {}"
func.hasOwnProperty('name') // false

new

func 를 호출용 함수로만 사용한다면, 프로토타입 객체는 그다지 유용하지 않습니다. new 연산자를 앞에 붙이고 함수를 호출할 때, 프로토타입 객체는 중요한 역할을 수행합니다. 

var result = func(); // result 는 undefined.
var result = new func(); // result 는 Object

func 는 텅 빈 함수이기에 반환값도 없지만, new 연산자와 함께 호출하면 호출된 함수의 프로토타입을 근간으로 하는 신규 객체가 반환됩니다. result 는 다음과 같은 구조를 갖습니다. 

result = {
__proto__ : {
constructor : function func() {},
__proto__ : Object
}
}


this

그리고, new 뒤의 함수를 실행하는데 여기에 this 와 함께 사용한 구문이 있다면, 신규 객체를 this 에 바인딩하여여 구문을 실행합니다. 이를 살펴보기 위해 사각형의 길이와 높이, 그리고 면적을 반환하는 함수를 this 키워드와 함께 추가해 봅시다. 

function rectangle (w, h) {
this.width = w;
this.height = h;
this.get_area : function () {
return this.width * this.height;
}
}

var rect = new rectangle(10, 15);

this 에 바인딩된 신규 객체는 width, height, get_area 속성을 갖습니다. 이때 rect 의 구조는 다음과 갖습니다.

rect = {
width : 10,
height: 15,
get_area: function () { ... },
__proto__ : function () {
constructor: function rectangle() {},
__proto__: Object
}
}

신규객체가 할당된 rect 는 의도한 대로 동작합니다.

var rect = new rectangle(10, 15);
rect.get_area(); // 150

내부 메카니즘을 제하고 외형만 본다면, rectangle 함수는 마치 클래스처럼 동작합니다. new 연산자를 이용해 클래스의 새 인스턴스를 생성했고, 인스턴스는 자신의 속성과 메서드를 갖습니다. 이것이 다른 클래스 기반의 언어를 흉내낸 자바스크립트의 Pseudo Class 구현 원리 입니다. 


prototype 맴버

위의 rect 객체를 좀 더 보완해 보겠습니다. new 이용해 생성해낸 객체는 width, height, get_area 세가지 프로퍼티를 가집니다. width 나 height 는 객체별로 다를 수 있지만, get_area 는 동일합니다. rectangle 함수에서 파생된 객체들이 공유하게끔 만든 메서드를 일반적인 프로퍼티로 사용하는 것은 비합리 적입니다.

이를 해결하기 위해 프로토타입이 사용됩니다. rectangle.prototype 에 메서드를 추가하면, 이를 근간으로 하는 모든 신규 객체는 부모의 프로토타입 객체에 담긴 메서드를 사용할 수 있습니다. 

function rectangle (w, h) {
this.width = w;
this.height = h;
}

rectangle.prototpye.get_area = function () {
return this.width * this.height;
}

var rect1 = new rectangle(7, 5);
var rect2 = new rectangle(10, 7);

rect1.get_area(); // 35
rect2.get_area(); // 70

rect1 은 다음과 같은 구조를 갖습니다.

rect1 = {
width : 7,
height: 5,
__proto__ : {
get_name : function () { .. },
constructor: function rectangle () { .. },
__proto__ : Object
}
}

이제 rectangle 에서 파생된 객체는 어느 정도 제대로된 구성을 갖춘 듯 합니다. width 와 height 는 자신 만의 프로퍼티로 정의했고, 부모의 프로토타입에 선언된 get_area 함수를 공용 메서드 처럼 사용하고 있습니다.


private

하지만 여기서도 한가지 문제가 있습니다. 인스턴스가 가진 width 와 height 속성은 외부에 public 으로 노출되어 있어 악의적인 코드나 값들로 동작이 쉽게 변경됩니다.

var rect1 = new rectangle(10, 15);

rect1.width = "hacked!";
rect1.get_area(); // NaN

앞의 예에서 확인했듯이, new 연산자로 객체를 생성할 때, this 키워드로 선언된 속성성들은 신규 객체의 public 속성으로 할당됩니다. 이 점을 활용하여 외부의 접근을 맊고자 하는 속성에 var 키워드를, 외부에 공개될 속성에 this 키워드를 사용함으로서 해결할 수 있습니다. 

function rectangle (w, h) {
var width = w,
     height = h;

this.get_area = function () {
return this.width * this.height;
};
}

rect1 의 구조를 살펴보면 이전과 다른점이 있습니다. 

rect1 = {
get_area : function () { .. },
__proto__ : Object
}

면적을 반환하는 get_area 메서드는 보이지만, 메서드 내에서 계산에 사용되는 width 와 height 는 감춰져 외부에 노출되지 않습니다. get_area 메서드가 참조하는 width 와 height 는 메서드를 담은 rectangle 함수가 new 생성자와 함께 실행되는 시점에 할당된 값을 참조하고 있습니다. 이를 클로저(Closure) 라고 부르며, width 와 height 는 클로저가 동작에 의해 private 이 됩니다. 이런 경우, rect1 외부에서 절대 width 와 height 속성을 바꿀 수 없습니다. 

var rect1 = new rectangle(10, 15);

rect1.width = "hacked!";
rect1.get_area(); // 150

아쉬운 점은 get_area 를 프로토타입 맴버로 등록하지 못해, 인스턴스 별로 메서드를 가지고 있다는 점입니다. 프로토타입에 등록되어 공용 메서드로 사용할 수 있는 이점은 여기서 사라집니다. 이런 경우 별도의 부모 객체를 정의해서 공용 메서드나 상수들을 위치시키고 이를 상속받는 방식으로 보완할 수 있습니다. 


함수를 new 생성자로 호출하도록 강제하는 방법

한가지 작업을 더 해보려 합니다. rectangle 함수는 new 연산자와 함께 사용하도록 정의된 생성자 함수 입니다. 하지만 사용자가 new 를 빼먹고 호출하는 실수를 저지르면 예측하지 못한 결과가 나옵니다. 자바스크립트에는 명시적인 클래스 선언이 없기에 이를 강제할 방법이 없습니다. 이를 보완하고자 생성자 함수 이름을 대문자로 시작하도록 정의하는 관례례가 많이 쓰이지만 선택은 개인의 몫입니다. 

간단한 구문을 추가하여 new 연산자와 함께 호출하든 그냥 호출하든 동일한 결과를 반환하도록 만들 수 있습니다. 생성자 함수 내부에서 this 가 해당 함수의 인스턴스 인지를 확인하고, 그렇지 않다면 new 와 함께 자신을 재호출 하도록 처리하면 됩니다. 여기서 현재 실행중인 함수 자신을 나타내는 argument.callee 속성이 사용됩니다. 

function rectangle (w, h) {
if (!(this instanceOf arguments.callee)) return new arguments.callee(w, h);

var width = w,
     height = h,

this.get_area = function () {
     return width * height;
}
}

이제 new rectangle() 과 rectangle() 은 동일한 결과를 반환합니다. 물론 두 경우 다 width, height 는 private 로 외부에서 접근할 수 없습니다. 

IE 호환성 보기로 인한 문제가 발생할 때 by beizix

IE8 과 IE9 버전에서 퍼블리싱을 하고  호환성 보기 버튼을 클릭하면 군데군데 모양이 어긋나는 문제가 있었다. 
이때 아래 meta 테그를 넣어주어 문제를 해결했다. 
이 메타 테그는 호환성 보기를 클릭해도 브라우저 자신의 최신 엔진으로 렌더링하도록 강제하는거 같다.  

<meta http-equiv="X-UA-Compatible" content="IE=EDGE" />


자바스크립트로 HTML 붙여넣을 때 주의점 by beizix

document.getElementById('contents').innerHTML = html; 

이 경우, script 와 style 테그가 먹히지 않는 문제가 있다. 그래서 jquery 를 사용해 보았다. 

$('#contents').html(html);  

위와 같이 jquery를 사용한 경우, IE8 에서   html 에 <style> 테그가 사라지는 문제 발생. (<script>는 먹힘) 

$('#contents').append( $(html) );

아래와 같이 해주면 해결된다. 

jquery 의 $(html) 을 사용하면서 얻는 또다른 이득은 문제의 소지가 되는 테그들이 제거되어 배열에 담겨진다는 점이다. 

html 에 DOCTYPE 선언이나 <html><body> 등 본문에 삽입되기에 부적절한 테그들은 배열에서 제외된다. 

우아하게 가난해지는 방법 by beizix

제겐 인생의 지침서 같은 이 책의 주옥같은 내용들을 뽑아 정리합니다. 아쉽게도 책은 절판되어 더이상 출간되지 않네요..


p.57 - 일을 줄이고 인생을 즐겨라 편에서 발췌 

"무슨 일에 종사하지시요?" 이 물음은 속물적이고 고루한 것이다.

점점 더 많은 사람들이 일자리를 잃고 있기 때문에, 종사하는 직업을 가지고 사람을 규정하던 시대는 지나갔다. 아직 해고되지 않은 사람들도 일이 삶에 의미를 부여하는 유일한 가능성이라고 보지 않는게 좋다. 일은 원래 에덴동산에서 이브가 저지른 불손에 대한 징벌로 생각된 것이었다. <이마의 땀을 흘려야 너희는...> 그러다 루터와 칼뱅에 의해서 일은 도덕적인 계율, 삶의 필수적인 것이 되었다. 그러나 일은 대부분 진정한 삶에서의 도피와 같은 의미이기 때문에, 삶의 내용에는 거의 보탬이 되지 않는다. 그러다 일과 더불어 일에 따르는 사회적인 인정, 존중, 지위가 어느날 갑자기 모조리 사라져 버리는 경우에, 인간은 공허함에 직면하게 된다.

....
..
.

10년 전에 일과 자신을 1백 퍼센트 동일시하라고 권장했던 조언서들이 흥미롭게도 일을 순전히 밥벌이의 수단으로 보고 삶의 의미를 가족과 여가시간에서 찾아야 한다고 말한다. 이런 조언은 무척 고맙지만, 둘 다 별로 탐탁하지 않기는 마찬가지다. 자신이 하는 일을 순전히 밥벌이의 수단으로 보고서 일에 조금도 정열을 투자하지 않는 사람은 일을 거의 종교처럼 숭상하는 사람들과 다름없이 스스로를 불행하게 만든다. 긴장을 풀고서 자연스럽게 유희하듯 일을 대하는 비결이 있다. 일을 놀이로 받아들이는 사람은 마치 놀이를 하듯 일에 몰두한다. 누구나 놀이를 하는 동안에는, 역시 놀이도 진지하게 받아들이며 놀이를 단순히 시간때우기 심심풀이라고 생각하지 않는다. 놀이가 끝나더라도 공허함에 시달리지 않고, 또 놀이에서 지는 경우에는 새로운 놀이를 시작할 수 있다. 

 



Ubuntu 에서 Aptana plugin 삭제하기 by beizix

aptana 플러그인들이 자꾸 문제를 일으켜 삭제하기로 마음먹었다. 
이상하게 elicpse 에서 지우려 하면 uninstall 버튼이 비활성화되어 지울수 없었다. 

결국 
/usr/lib/eclipse/feature
/usr/lib/eclipse/plugins
/usr/lib/eclipse/configuration 

디렉토리에서 aptana 혹은 radrails, rubypeople, .aptana-setting 등 aptana 관련 파일들을 
수동으로 지워주니 깔끔하게 해결되었다. 


이벤트 로그 기록 by beizix

시나리오 1 
-
ActivityTest 가 처음 시작되며, 버튼 클릭으로 SubActivity 를 뛰운다. 그리고 SubActivity 에서 버튼을 클릭하여 자신의 finish() 를 호출한다.
이때 발생하는 이벤트 로그를 기록해보았다. 
** 로그기록중 onUserInteraction 와 onUserLeaveHint 는 버튼클릭시 발생하는 이벤트임에 유의하자.

==================
ActivityTest 시작 
==================

08-04 07:02:31.059: INFO/**(246): ActivityTest :: onApplyThemeResource
08-04 07:02:31.088: INFO/**(246): ActivityTest :: onWindowAttributesChanged
08-04 07:02:31.148: INFO/**(246): ActivityTest :: onWindowAttributesChanged
08-04 07:02:31.209: INFO/**(246): ActivityTest :: onContentChanged
08-04 07:02:31.219: INFO/**(246): ActivityTest :: onStart
08-04 07:02:31.219: INFO/**(246): ActivityTest :: onPostCreate
08-04 07:02:31.219: INFO/**(246): ActivityTest :: onTitleChanged
08-04 07:02:31.219: INFO/**(246): ActivityTest :: onResume
08-04 07:02:31.219: INFO/**(246): ActivityTest :: onPostResume
08-04 07:02:31.309: INFO/**(246): ActivityTest :: onWindowFocusChanged

=================
SubActivity 시작
=================

08-04 07:03:06.859: INFO/**(246): ActivityTest :: onUserInteraction
08-04 07:03:07.169: INFO/**(246): ActivityTest :: onUserInteraction
08-04 07:03:07.178: INFO/**(246): ActivityTest :: onUserLeaveHint
08-04 07:03:07.178: INFO/**(246): ActivityTest :: onSaveInstanceState
08-04 07:03:07.178: INFO/**(246): ActivityTest :: onPause
08-04 07:03:07.219: INFO/**(246): SubActivity :: onApplyThemeResource
08-04 07:03:07.229: INFO/**(246): SubActivity :: onWindowAttributesChanged
08-04 07:03:07.238: INFO/**(246): SubActivity :: onWindowAttributesChanged
08-04 07:03:07.249: INFO/**(246): SubActivity :: onContentChanged
08-04 07:03:07.249: INFO/**(246): SubActivity :: onStart
08-04 07:03:07.249: INFO/**(246): SubActivity :: onPostCreate
08-04 07:03:07.249: INFO/**(246): SubActivity :: onTitleChanged
08-04 07:03:07.249: INFO/**(246): SubActivity :: onResume
08-04 07:03:07.249: INFO/**(246): SubActivity :: onPostResume
08-04 07:03:07.259: INFO/**(246): ActivityTest :: onWindowFocusChanged
08-04 07:03:07.309: INFO/**(246): SubActivity :: onWindowFocusChanged
08-04 07:03:07.418: INFO/**(246): ActivityTest :: onCreateDescription
08-04 07:03:07.418: INFO/**(246): ActivityTest :: onStop

=============================
SubActivity finish() 호출 시 
=============================

08-04 07:04:19.259: INFO/**(246): SubActivity :: onUserInteraction
08-04 07:04:19.389: INFO/**(246): SubActivity :: onPause
08-04 07:04:19.429: INFO/**(246): ActivityTest :: onRestart
08-04 07:04:19.429: INFO/**(246): ActivityTest :: onStart
08-04 07:04:19.429: INFO/**(246): ActivityTest :: onResume
08-04 07:04:19.429: INFO/**(246): ActivityTest :: onPostResume
08-04 07:04:19.478: INFO/**(246): ActivityTest :: onWindowFocusChanged
08-04 07:04:19.528: INFO/**(246): SubActivity :: onWindowFocusChanged
08-04 07:04:19.548: INFO/**(246): SubActivity :: onStop
08-04 07:04:19.578: INFO/**(246): SubActivity :: onDestroy


시나리오 2
-
ActivityTest 가 시작되었다. 근데 전화가 걸려왔다. 그리고 통화를 마친다. 

==================
ActivityTest 시작 
==================

08-04 07:02:31.059: INFO/**(246): ActivityTest :: onApplyThemeResource
08-04 07:02:31.088: INFO/**(246): ActivityTest :: onWindowAttributesChanged
08-04 07:02:31.148: INFO/**(246): ActivityTest :: onWindowAttributesChanged
08-04 07:02:31.209: INFO/**(246): ActivityTest :: onContentChanged
08-04 07:02:31.219: INFO/**(246): ActivityTest :: onStart
08-04 07:02:31.219: INFO/**(246): ActivityTest :: onPostCreate
08-04 07:02:31.219: INFO/**(246): ActivityTest :: onTitleChanged
08-04 07:02:31.219: INFO/**(246): ActivityTest :: onResume
08-04 07:02:31.219: INFO/**(246): ActivityTest :: onPostResume
08-04 07:02:31.309: INFO/**(246): ActivityTest :: onWindowFocusChanged

================
전화가 걸려왔다
================

08-04 16:12:58.249: INFO/**(3143): ActivityTest :: onSaveInstanceState
08-04 16:12:58.259: INFO/**(3143): ActivityTest :: onPause
08-04 16:12:58.299: INFO/**(3143): ActivityTest :: onWindowFocusChanged
08-04 16:13:00.349: INFO/**(3143): ActivityTest :: onCreateDescription
08-04 16:13:00.349: INFO/**(3143): ActivityTest :: onStop

=================
통화를 마친다
=================

08-04 16:13:13.379: INFO/**(3143): ActivityTest :: onRestart
08-04 16:13:13.379: INFO/**(3143): ActivityTest :: onStart
08-04 16:13:13.379: INFO/**(3143): ActivityTest :: onResume
08-04 16:13:13.379: INFO/**(3143): ActivityTest :: onPostResume
08-04 16:13:13.579: INFO/**(3143): ActivityTest :: onWindowFocusChanged



1 2 3 4 5 6 7 8 9