2011. 6. 24. 13:39 IT
posted by smplnote
2011. 6. 24. 12:41 IT
Oracle 성능측정용 리포트 도구
10g 부터 지원 / 
Enterprise Edition에서만 사용 가능 
60분 간격으로 7일간의 데이터 보관 (기본정책)

License: 
Diagnostic Pack(진단 팩)에 대한 추가적인 라이센스 비용. (기본 설치는 되지만 공식적인 사용이나 기술지원은 불가 )


SYS 계정의 dba_hist_* 뷰를 이용
보고서 출력기능 제공 


9i 는 Statspack 이 유사한 역할을 함.
기타 툴 : Maxgauge
 

references
http://blog.naver.com/PostView.nhn?blogId=s70097&logNo=70079607465
http://www.sqlgate.com/kr/product/oracle/tutorial_AWR+Report_2
http://www.gurubee.net/display/DBSTUDY/AWR
http://121.254.172.39:8080/pls/apex/f?p=101:11:0::::P11_QUESTION_ID:4326300346619264
http://ukja.tistory.com/300
http://energ.tistory.com/entry/AWR-%EC%9D%B4%EB%9E%80
posted by smplnote
2011. 6. 23. 10:36 IT
1. XML Node 의text property
ex) <test>value<test>
ie : .text
etc : .textContent

2. selectbox 관련 
reInitializeSelectBox : 정확한 이유를 밝히진 못했지만 ie에서만 먹는듯 

3. selectNodes, selectSingleNode 메소드 ( ie only)
대체기능
selectNodes -> getElementsByTagName
selectSingleNode -> 미지원 기능으로 다음 함수로 대체
function selectSingleNode(xmlDoc, elementPath){   
if(document.implementation && document.implementation.createDocument){
var nodes = document.evaluate(elementPath, xmlDoc, null, XPathResult.ANY_TYPE, null);
var results=nodes.iterateNext();
     return results;
    }
}

4. select element의 method reInitializeSelectBox ( ie only )
제거..

5. window.createPopup() ( ie only)

6. style='cursor:hand' (ie only)
-> style='cursor:pointer'

7. form.elements[N].maxLength == null , form.elements[N].minLength == null (ie)
but other browser : form.elements[N].maxLength = -1

8. document.all  (IE only)
document.getElementById(XXX) (ALL)
ex) document.all.xxx -> document.getElementById('xxx');


9. elem.innerText ( IE only)
-> elem.textContent (other IE)
아래처럼 호환되는 함수를 이용 
function getText(elem){
return elem.textContent || elem.innerText;
}

10. elem.style.display='block';
-> elem.style.display='';

11. xml 을 client로 전송할때 <xml 앞에 공백이나 캐리지리턴값 등이 들어 있으면 정상적인 xml로 인식하지 못함( Firefox 등에서)
-> jsp인 경우 out.clear(); 를 호출하여 앞에 쌓인 공백, 빈라인피드 등을 제거한다음 출력처리... 
만약 OutputStream을 사용하는 경우에는 다음과 같이 작성 
out.clear();
out = pageContentx.pushBody(); 
out.flush();

http://www.w3schools.com/dom/dom_nodes_access.asp
reference : http://semin.tistory.com/entry/XML-Dom-Object-IE-Firefox-Supported  
posted by smplnote
2011. 6. 20. 16:46 IT

web.xml 에서 명시적으로 log4j 설정파일 경로를 명시하여 작업하는 경우
junit만 실행할때는 web.xml 을 참조하지 않고 실행되므로
다음과 같은 에러 메세지가 콘솔에 찍힌다. (당연히 눈에 거슬린다.)

log4j:WARN No appenders could be found for logger(...

해결책으로는 
test 소스 폴더의 디폴트 패키지 위치에 log4j.properties 를 두면 끝.

출처 : http://blog.naver.com/goethe1004/80034130033
posted by smplnote
2011. 6. 18. 15:04 1300K
아저씨
감독 이정범 (2010 / 한국)
출연 원빈,김새론
상세보기


/*
싸움은 올드보이
현실은 복수는 나의것
기본 흐름은 레옹

다른건 다좋은데
악역들이 너무 잔인하게 나와서 처음엔 제대로 보기가 힘들었다.

혼자남게된 소녀는 괜찮을까?
인자해보이는 할머니가 마약과 사람을 팔아먹는 현실에 맞서, 가난과 멸시와 유혹을 견뎌낼 수 있을까?

차안에서 습관적으로 피려던 담배를 슬며시 내리고마는 형사의 모습에서
작은 희망을 느끼게 했다.
(첫장면의 형사들이 마치 남의 구역을 습격하러온 조폭의 이미지였던 것을 떠올려본다.)
*/


posted by smplnote
2011. 6. 16. 12:29 IT

Frame으로 구성되어 있는 기존 시스템에
메뉴를 숨기는 기능을 추가하기로 했다.

어떻게 할까? 

1. frame size 를 조절할 수 있어야 하고,
2. 숨기기 버튼이 지정된 위치에 고정되어 표시되어야 하고,
3. 숨기기/보이기 버튼이 상황에 따라 활성화 되어야 한다. 

solution)
1. frameset 의 attribute에는 cols, rows 가 있다.
이 값들을 자바스크립트에서 설정할 경우 변경이 가능하다.
[Frame page]
// for menu frame size restore
function res() {
 var fs = document.getElementById('fset2');
 if (fs) {
   fs.rows = '1*';
   fs.cols = '205,*,1';
 }
}
// for menu frame size minimize
function min() {
 var fs = document.getElementById('fset2');
 if (fs) {
     fs.cols = '5%,95%';
 }
}
frameset 은 다음과 같다.
[Frame page]
<frameset id='fset2' cols='205,*,1' rows='1*'>
2. 숨기기 버튼의 위치 고정
컨텐츠 영역과 버튼 영역을 구별하고
[Menu page]
<div class="left_lnb_wrap" id="target">
... menu contents here
</div>
<div class="fold_button_area">
<div id="foldButton" class="fold_button">
<button type="button" class="button" onclick="foldSideBar('up');" title="왼쪽영역 닫기"><img src="/images/btn_left_close.jpg" width="25" height="28" alt="왼쪽영역 닫기" /></button>
</div>
<div id="unFoldButton" class="unfold_button">
<button type="button" class="button" onclick="foldSideBar('down');" title="왼쪽영역 열기"><img src="/images/btn_left_open.jpg" width="25" height="28" alt="왼쪽영역 열기" /></button>
</div>
</div>
스타일을 적용한다.  
[Menu page] 
/* 레이아웃 - 영역 열기버튼, 닫기버튼 */
#container #content_wrap.width_full {margin-left:0; margin-right:0;}
.fold_button {position:absolute; top:150px; left:150px;}
.unfold_button {display:none; position:absolute; top:150px; left:0;}
.fold_button_up {position:absolute; top:90px; right:0;}
.unfold_button_down {display:none; position:absolute; top:0; right:0;}
.fold_button_right {position:absolute; top:150px; right:150px;}
.unfold_button_right {display:none; position:absolute; top:150px; right:0;}
.fold_button_right2 {position:absolute; top:150px; right:139px;}
.unfold_button_right2 {display:none; position:absolute; top:150px; right:0;}
3. 버튼 액션 구현
선택값에 따라 메뉴 컨텐츠를 숨기거나 보이고, 버튼 이미지를 교체할 수 있게 구현한다.
물론 frameset 이 있는 페이지에서 정의한 메소드를 호출하는 것을 잊으면 안된다.
frameset page 가 최상단일 경우, window.parent 대신 window.top 을 사용할 수 있다. 
[Menu page]
function foldSideBar(togle){
var targetArea = document.getElementById("target");
if(togle == "up"){
targetArea.style.display = "none";
document.getElementById("foldButton").style.display = "none";
document.getElementById("unFoldButton").style.display = "block";
window.parent.min();
}else{
targetArea.style.display = "block";
document.getElementById("foldButton").style.display = "block";
document.getElementById("unFoldButton").style.display = "none";
window.parent.res();
}

뭐 요즘을 조금 둘러보면 나오는 기술이지만, 적용가이드 쓰는 겸해서 정리해본다. 
 
reference : http://www.cross-browser.com/toys/frame_resize.html
posted by smplnote
2011. 6. 10. 16:06 1300K
명확하게 디자인하라
국내도서>컴퓨터/인터넷
저자 : Robert Hoekman, Jr / 강민구,이석진역
출판 : 영진닷컴 2011.04.05
상세보기


훌륭한 어플리케이션의 특징...
- 사용자가 웹을 사용하는 방식 그대로를 따른다. 특정 사용자 집단이라는 대상이 아닌 사용자의 행동에 초점을 맞추고 있다.
- 사용자가 작업을 완료하기 위해 꼭 필요한 기능만 가지고 있다.
- 제품이 무슨 일을 하는지에 대한 사용자 멘탈 모델에 부응한다.
- 사용자가 빨리 익숙해지도록 도와 주어서 최대한 빠른 시일 내에 중급 사용자가 될 수 있도록 한다.
- 사용자가 실수로부터 쉽게 복구할 수 있도록 돕고, 나아가 아예 처음부터 실수 자체를 하기 어렵도록 만들었다.
- 일관성있는 인터페이스 요소를 제공하면서, 의미와 중요성을 부여하기 위해 불규칙한 요소를 활용한다.
- 혼란스러움을 최소화 한다.
p.18

웹 어플리케이션의 사용자는 다음과 같은 행동 경향을 보인다.
- 어플리케이션이 할 수 있는 것의 약 20퍼센트만 익히려는 경향
- 어떤 것을 수행하기 위한 하나의 방법만을 익히고 그것만을 사용하려는 경향
- 어플리케이션이 어떻게 작동하는지에 대한 사용자 자신들만의 논리를 형성하려는 경향
p.37

설문조사 SurveyMonkey.com

페르소나용 사진 구하기 www.iStockphoto.com http://www.gettyimages.com/ 

쭉정이 테스트 ( the Unnecessary Test)
최근에 작업을 했던 웹 어플리케이션을 열고, 아주 오래 전에 당신이 아주 중요하다고 생각했던 기능 하나를 찾는다. 그리고 스스로에게 다음의 질문을 던져본다.
"이 기능이 어플리케이션이 원래부터 지원하려고 의도했던 활동의 수행에 필요한 업무를 완수하는데 있어서 사용자에게 직접적으로 두움이 되는가?" ...
...
테스트를 마쳤으면, 어플리케이션을 종료시키고 다음의 세가지 질문을 더 해본다.
- 이 어플리케이션이 지원하는 활동은 무엇인가?
- 이 어플리케이션이 없다는 가정하에, 만약 당신은 어플리케이션이 지원하는 그 활동을 수행해야 하고, 마술나라의 요술 지팡이를 휘둘러서 그 업무를 아주 간편한 방법으로 수행할 수 있는 어플리케이션을 만들어 낼 수 있다면 그 어플리케이션은 무엇을 할 수 있겠는가?
p.79

5초 테스트 http://www.uie.com
... 사이트가 얼마나 명확한 지에 대한 통찰을 얻는 것에 그 초점....
사용자에게 각 화면들을 한번에 하나씩 5초동안 보여준 뒤 사용자에게 자신이 본 모든 것을 적도록 요구한다.
...
p.125

http://www.uie.com/articles/five_second_test 

http://www.squidoo.com/ 

정보가 주요 기반으로 구성된 웹에서 사용자가 필요한 정보를 검색하는 네가지 원칙 
- 무엇을 찾는지 알고 있는 유형
- 탐색 유형
- 무엇을 알고 싶은지 모르고 있는 유형
- 재 검색의 유형 
p.159

Poka-yoke는 실수 방지 라는 의미의 일본어다. Poka-yoke 도구는 오류를 방지하는데 쓰이는 모든 것들을 일컫는다. ...
Poke-yoke 도구에는 두가지의 형태가 있다. 하나는 예방 도구이고 하나는 탐지 도구이다. 
p.177

/*

별로 볼 시간이 없었다. 
목차에 거의 핵심 내용이 다루어졌고,
특별히 대단한 발상이 있는 것은 아니다.
그러나 기본적으로 디자이나나 UI를 고민하는 사람이라면 
여러모로 유익한 내용을 제공해준다. 

요즘 너무 허겁지겁 책을 보나??
*/




 
posted by smplnote
2011. 6. 10. 12:34 1300K

 

김종욱 찾기
감독 장유정 (2010 / 한국)
출연 임수정,공유
상세보기


/*
첫사랑에 대한 그리움을 소재로 한 영화.

대학때 같은 과 동기들 중에 "종욱" 이라는 이름(또는 비슷한 이름)의 친구들이 여럿 있었다.
그래서 2005년도였던가 연극으로 "김종욱찾기" 포스터를 보면서 그 친구들을 떠올린 기억이 난다.

그때 그 친구들 지금은 잘 지내고 있을까?


인도에 대한 색감은 의도적으로 잘표현한것 같기는 한데,
솔직히 슬럼독 밀리어네어가 더 색채적이었다. 

연극이 기대된다.

기억에 남는 대사들 
용기가 없어서 고백을 못 한 게 아니라, 절실하지 못해서 고백할 용기가 안 생긴 거였어요
인연을 붙잡아야 운명이 되는 거지
대체 어떤 나라인데 한 사람을 10년동안 잊지 않을 수 있는 건지.
맨처음 사랑만이 첫사랑은 아니다 

임수정이 그다지 예쁜 얼굴은 아니더라..  중간중간에 왜인지 대선주자 박근X 씨를 자꾸 떠올렸다.

*/ 
 

사진출처 : http://www.cine21.com
posted by smplnote
2011. 6. 10. 08:15 IT

비효율 SQL을 찾아내기 위해 FullTableScan 을 찾는 작업을 준비중이다.


실제 실행결과를 가지고 해볼 수 도 있지만 
소스코드로 정적으로 도출할 수 있는 방법으로 먼저 접근해보았다.

물론 ORACLE을 대상으로 하고 있으며 타 DB (ORACLE과 구조상 거의 유사한 Tibero는 제외)는
어떻게 유사한 기능을 제공하는지 확인하지 못했다.  
 
기본적으로 Oracle은 SQL문장을 파싱한 뒤에 선정된 Optimizer를 기반으로 실행계획을 세우게 된다.
실행계획은 PLAN_TABLE 에 기록되므로 
이 내용을 정리하면 예상되는 실행 경로를 추적하면서 비효율적으로 수행될 가능성을 찾아낼 수 있다.


장점은 다음과 같다.
1) 실행결과 없이 SQL 문장만으로 비효율성을 검사할 수 있다. ( 정적 검사)
2) 추정이 아닌 DBMS가 제공하는 기능을 이용해 높은 정확도를 제공한다. 
3) 자동화가 가능함

이슈가 될만한 사항
1) 실행계획과 실제 수행시의 경로는 달라질 수 있다. ( cf-1 참조)
2) TEST DB와 REAL DB의 환경차이로 인해 다른 결과를 얻을 수 있다.
3) FullTableScan이 허용되어야 할 경우도 존재한다. (예를 들어 코드성 테이블이나 의도적으로 FullTableScan을 유도하는 SQL 등 )
 
이슈에 대한 생각
1) 정적 검사방식의 근본적인 제약이므로 한계를 인정 ( 실행결과 기반 검사로 해결하는게 맞다. ) 
2) 달라지는게 걱정이라면 명시적인 힌트를 부여해주는 것이 더 바람직하다.
3) 문제가 될 소지가 있는 Table들만을 대상으로 검사를 한정하고, 검사결과에서도 예외를 처리한다.
(마스터성, 히스토리성 테이블, 데이터 증가율이 지나치게 높은 테이블 등이 대상이 될 수 있다.) 

확장 아이디어
1) FullTableScan인 경우에 대해 효과적인 인덱스 전략 추천 (이건 가능성 여부를 DBA와 타진해야 할듯.. )



/* 개인적으로는 Hibernate나 nosql 쪽을 해보고 싶은데 기회가 없다. */


기타 참고사항
===================================== 
- plan 생성 스크립트 : $ORACLE_HOME/rdbms/admin/utlxplan.sql
cf) SYSTEM tablespace에서 수행하지 않도록 주의 할 것

- plan 실행방법
EXPLAIN PLAN (INTO {NEW_PLAN_TABLE} ) SET STATEMENT_ID = 'plan_id' FOR {SQL}
ex) 
EXPLAIN PLAN
SET STATEMENT_ID = 'my_ex_01'
FOR
SELECT * FROM XXX
WHERE Y=100; 
 
- plan table 조회
utlxpls.sql (with serial processing), utlxplp.sql (with parallel execution)
또는 직접 SQL 조회
SELECT * FROM PLAN_TABLE WHERE STATEMENT_ID = :QUERY_ID

CF) RBO 사용시에는 COST 컬럼이 NULL 이 됨 

cf-1) PLAN과 달리 실제 수행시에 실행 경로가 변경될 수 있는데, 다음과 같은 조건에 따른다.
- bind variable type
- data volume
- accuracy & timeliness of statistics
- indexing differences
- global parameter setting, static or dynamic modified
- session parameter setting 

 
- plan 사용 절차
1. setup : connection.autocommit = false
2. execute plan : explain plan SET STATEMENT_ID = 'PLAN_ID' for {sql}
3. select plan : select * from PLAN_TABLE WHERE OPERATION = 'TABLE ACCESS' AND STATEMENT_ID ='PLAN_ID'
4. tearDown: connection.rollback; connection.autocommit = true;
 
reference) Toad Knowledge Xpert

 
posted by smplnote
2011. 6. 3. 14:03 1300K
똑바로 일하라
국내도서>경제경영
저자 : 제이슨 프라이드(Jason Fried),데이비드 하이네마이어 핸슨(David Heinemeier Hansson) / 정성묵역
출판 : 21세기북스(북이십일) 2011.01.31
상세보기

/*
깊게 생각하기보다는 아이디어 카드와 같이 굳어있는 사고를 깨고 관점을 환기시키기 좋은 글

*/
현실세계는 무시하라 계획이란 추측이다 세상을 변화시키려면 온몸을 던져라 가려운 곳은 스스로 긁어라 보여주기 위한 것은 없애버려라 열개를 대충하느니 하나라도 제대로 결정이 곧 실행이다 변하지 않는 것에 집중하라 지금 당장 보여줘라 결코 영웅이 되지마라 경쟁자보다 적게 일하라 기록하지마라 돈을 쓰지말고 가르쳐라 무대뒤를 공개하라 정말아플때 사람을 써라 문화는 자연스럽게 생겨난다
posted by smplnote