microtime 의 비밀, microtime을 로컬타임으로 변환하기.

오늘은 Microtime 에 대해서 이야기 해봐야겠당. 사실 나도 정확히 요놈에 대해 알지 못한다. 그런데 오늘 이놈 때문에 삽질을 한게 있어서 적고 넘어간다. 사실 내가 하고 싶었던건, zeroboard에서 reg_date로 들어가 있는 날짜를 jsp에서 불러와 출력하고 싶었다. 내가 검색 능력이 딸려서 못찾은건지, php에서는 기본 함수로 있는데.. jsp에서는 microtime을 현재 시간으로 변환해주는 메소드를 찾지 못했다.

여기저기 Q/A를 뒤져봤지만.. 못찾았다.. 그래서 그냥 나몰라라 접어두고 있었는데.. 오늘 마침 TDD(테스트 주도개발) 연습을 하면서 날짜를 컨트롤하는 예제를 뚝딱뚝딱 하고 있었다. 그래서 이왕 하는 김에 DateTime  클래스를 java로 구현해봤다. 이놈의 역할은 간단하다. microtime 을 인자로 받아서 현재시간으로 출력해주기위한 클래스다. 이것을 구현하기 위해 microtime을 다시 찾아봤다.

검색 결과에 의하면, microtime은 100/1 초까지 유닉스시간형태로 반환을 해준다고 한다. 기준은 1970년 1월 1일 0시 ㅇ분 00초를 부터 시작이다. 중요한건 1970년 1월 1일 0시 00분 00초가 기준이라는것이다. 아마도 1970년도가 유닉스 탄생해가 아닌가하는 추측해본다. 물론 찾아보지 않았다..귀찮아서..( 누군가 유닉스 탄생시기를 알려주겠지?~ ㅎㅎ)

다시 본론으로 돌아와서 zeroboard 의 reg_date는 mysql에 int(13)으로 잡혀있다. 실제로 값을 불러오면, 10자리 숫자가 나온다. 추측해보건데,.. 이 10자리 숫자를 환산하면, 0000년 00월 00일 00시 00분 00초로 나올것이다. 마침 32비트 컴퓨터의 int형 범위도 대략 10자리수가 나온다. 여기서 재밌는 사실을 알아냈다. microtime의 유효범위가 2037년쯤 된다고 한다. 만약에 2037년이 지나면, 이상해 진다고 하던데.. 아마도 그 이유는 int 범위에 굉장히 밀접한 관계가 있지 싶다.

시간을 계산해 보면,
1분은 60초,
1시간은 3600초,
하루는 86400초,
한달은 날짜마다 계산이 다르다.
단, 1년은 365일이고, 윤년일 경우 1년은 366일..
즉, 1년은 31536000초이고, 윤년인 해일 경우엔, 31622400초가 된다.

int의 최대범위는 2147483647 이고, 이것을 평년으로 나누면,..대략 68년이 나온다. 그러므로 1970년을 기준으로하면 2038년이 딱떨어진다. ㅋㅋㅋ 이것으로, 마이크로타임은 32비트 컴에서 내부적으로 int형 4바이트로 구현되어 있음을 짐작 할수있다. 이미 microtime을 로컬타임으로 변환하기 위한, 모든 아이디어는 앞에 서술한거 같다.

다시한번 짚어보면,
윤년을 계산해 내야하고,
날짜를 계산해 내기 위해, 달별로 일수를 짚어내야한다.
물론 윤년이 낀 해의 2월은 29일이다.
요 날짜만 구해낸다면, 시간은 식은죽먹기~!
시간구할때 한가지 더 생각해봐야할껀 로컬타임..
우리나라의 경우 +9 시간을 해야한다.

그밖에

TDD 연습을 위한 페이지

AJax 토글형 댓글 링크 버튼 만들기

제목을 어떻게 해야할찌 몰라서.. 일단 [Ajax 토글형 댓글 링크 버튼] 이라고 적고 시작한다.
이게 어떤거냐면,.. Me2day에 있는 댓글(0) 버튼이라고 생각하면 된다.
미투데이에 요 버튼이 좀 재밌는데.. 버튼이라고 하면, 보통 input 태그를 이용한 버튼을 이용하지만..
요건 링크와 자바스크립트 그리고 CSS 스타일을 적절히 이용한다.

먼저 링크,
링크는 보통 아래처럼 이용한다.
<a href=”이동할 주소”>이동링크이름</a>
<a href=”./comment”>댓글</a>

여기에 자바 스크립트를 적용해서 이벤트를 걸면,..
<a onclick=”이벤트함수이름();” href=”이동할 주소”>이동 링크 이름</a>
<a onclick=”comment_list_toggle();” href=”./comment”>댓글</a>

위에 처럼 쓰는게 보통인데.. 위에 경우엔 보통 링크를 클릭하면 해당 링크로 점프를 띤다.
그러면 당근 버튼 효과를 내지 못한다.. 그래서 아래처럼..

<a onclick=”이벤트함수이름(); return false;” href=”이동할 주소”>이동 링크 이름</a>
<a onclick=”comment_lists_toggle(); return false;” href=”./comment”>댓글</a>

자바스크립트에 false를 리턴하게 되면, 클라이언트에서 서버로 전송을 하지않고, 클라이언트에서 함수만 실행하고 종료를 하게 된다. 보통 취소 버튼을 구현할때 요걸 많이 쓴다.

그러면 바로 요 이벤트 함수를 통해서 comment 라고 지정해둔 id 태그의 스타일을 변화시키면 된다.
<script type=”text/javascript”>
//<![CDATA[
        function comment_lists_toggle() {
            if(document.getElementById(“comment”).style.display==”none”)
            {
                document.getElementById(“comment”).style.display=””;
            }   
            else
                document.getElementById(“comment”).style.display=”none”;          
        }
//]]>
</script>


기본은 머 저렇게 하면되는데… 기본적으로 Ajax 콜백에 대한 이해가 있으면,..
어렵지 않게 구현할수 있을것이다..

사실 내가 젤 어려웠떤건,..-_- 따옴표 처리문제..ㅜㅜ..
아무대로 에디터를 한번 따로 만들어봐야겠다..

————— updated 2012.07 —————–
간혹 리피러를 확인해보는데, 이 포스트가 검색에 걸려 읽으시는 분들에게…
이글은 2008년 2월에 작성한 글로써, 매우 전문적인지 않은 글이니… 그냥 그려려니 참고만하세요. 🙂

윗 글에서 몇가지 정정한다면,
1. 엘리먼트의 return false;
 

 <a onclick=”이벤트함수이름(); return false;” href=”이동할 주소”>이동 링크 이름</a>

여기서 클릭 이벤트에 return false;를 하는 이유는 본래 a태그가 하는 기본 기능을 수행하지 않겠다는 의미입니다.  a 태그의 기본 기능은 바로 href로 지정된 url로 이동하는 기능을 말합니다.
따라서 위와 같이 걸면, a 태그의 기본기능을 수행하지 않게 되는 거죠!
이거 a 태그뿐만 아니라 기본 기능이 걸려있는 모든 엘리먼트에 해당하는 내용입니다.
 href=’#’ 으로 해시 값을 지정했을때는 새로 고침하지 않고, URL 뒤에 # 해시가 붙게 되는데,..
이런 해시값이 지저분하다고 느낄때도 return false를 넣어서 처리하곤 합니다.

2. 인라인 이벤트는 가급적 피하세요!
인라인 이벤트라 함은 앞에서 처럼 HTML 마크업에 바로 onclick=’어쩌고 저쩌고’ 하고 이벤트 핸들러를 할당하는 경우죠. 이거보다는 addEventListener 함수를 이용해 이벤트를 따로 등록하는 것이 좋습니다.
왜 이게 좋냐면,..
1. 마크업이 깨끗해집니다.
2. 같은 이벤트에 여러 핸들러를 중복해서 추가 할수있습니다. (인라인은 덮어버리죠!)
3. 인라인 핸들러가 정의되지 않는 시점(마크업이 그려지고 있는 시점)에 클릭하면 에러가 날수있습니다.

따라서 되도록이면 모든 마크업이 다 그려지고 나서 자바스크립트를 한번에 로드하고 처리하세요!

작업의 중단과 재개

요새 나의 키워드 중에 하나는 HI, 휴먼 인터페이스다.
그래서 얼마 전부터 휴먼 인터페이스에 대한 글을 써보기로 작정을 했다.
드디어 오늘 그 첫번째 시간!
뚜뚱…

들어가기에 앞서, 내가 작성하는 휴먼 인터페이스와 관련된 글은 요즘 한창 재밌게 읽고 있는
Humane Interface 라는 책에서 많은 내용이 발췌됐음을 사전에 일러두는 바이다.

그럼, 시작해보까나..^^

나는 현재 4대의 컴퓨터를 보유하고 있다. 집에 있는 느려빠진 AMD XP 1800+ 데스크탑과 고성능을 자랑하는 연구실 데스크탑 한대. 그리고 오래된 명품 애물단지 에버라텍 M11 과 최근에 내 분신처럼 붙어다니는 맥북까지 요렇게 4대가 있다.

혹시 이 글을 읽고 있는 그대들은 컴퓨터를 몇대를 보유하고 있는가?
머 컴퓨터 댓수가 중요한게 아니다.
아마도 대부분은 컴퓨터가 부팅이 되자마자 브라우저를 열 것이다.
그리고 “네이버”로 초기화면이 되어있는 사람은 나도 모르게 뉴스를 클릭하고 있을찌도 모른다

누구나 한번쯤은 경험해봤을 것이다. 무언가를 하고자 하고, 컴퓨터를 켰는데..
녹색의 NAVER 마크를 보는 순간, 머릿 속은 리셋이 되어버린다.

그래서 몇몇은 아예 브라우저의 초기화면을 지정해 놓지 않는 경우도 있다.
그러나 브라우저를 여는 순간 자기도 모르게.. 따따따( www….)를 치고 있는 모습을 발견하게된다.
정말 안습이다..ㅜㅜ..

네이버를 포함한 대부분의 포탈들은 우리들의 관심과 집중을 빼았는다..
포탈의 입장에서 보면, 지극히 당연한 것이지만
이것은 절대 사용자에게 유익한 인터페이스라고 할수 없다.
인터페이스는 사용자가 하고자 하는 작업에 해가 되서는 안되기때문이다.

보통 포탈을 브라우저의 시작페이지로 지정해 놓으면서 불필요하게 소비되는 시간이 얼마나 될까?
아마도 족히 하루에 한시간은 넘을것이다.

여기서 발생하는 문제점은 작업의 중단작업의 재개라는 다소 원론적인 이야기를 이해하면,
간단한 해결책이 나온다.

우리는 보통 어떤 일을 할때, 다른 일에 의해 작업이 중단되는 경우가 비일 비재하다.
예로들면, 청소하다가 전화를 받는다든가 열심히 보고서를 작성중인데 팀장이 급하게 호출을 한다든가..
머 이런저런 이유로 하던 일을 잠시 멈추고, 나중에 다시 재개 해야하는 일 발생한다.

이럴 경우 작업이 중단된 시간이 짧다면, 바로 와서 작업을 재개하는데는 아무런 문제가 되지 않는다.
대개 문제가 되는경우는 작업이 중단된 텀이 길어지는 경우다. 이렇게 텀이 길어지면, 도대체 내가 뭘하고 있었지? 라는 질문을 스스로에게 던지게 된다. 심한 경우는 아예 이런 질문조차 하지 않게 된다.

 이런 상황에서 작업을 재개하는 방법은 생각보다 간단하다. 즉, 이전 작업환경을 그대로 보여주면 된다.
청소하던 사람은 청소기가 널부러져있는 상황을 보고, 청소를 다시 재개할것이고, 보고서를 작성중인 사람은 워드로 작업중인 문서안에 깜빡이는 커서를 보고 작업을 재개할것이다.

그럼 다시 브라우저로 돌아가서,..

도대체 브라우저는 무슨 죄가 있을까?
간단하다 브라우저를 닫았다가 다시 열면 시작 페이지가 다시 새로뜬다. 이것이 문제다. 보통 우리는 뉴스를 본다든지, 블로그의 글을 본다든지 메일을 본다든지.. 하다가..퇴근시간이 되서 혹은 글을 다읽어서 브라우져를 습관적으로 닫는다.그리고 다시 브라우저를 열고 처음부터 다시 시작한다.
이것은 윈도우 환경에서는 그렇다.

반면 맥 OS 환경에서는 브라우저를 닫으면 종료가 아니라..배경뒤로 숨는다.
그리고 다시 열면 숨었던 브라우져가 다시 보인다.

별다른 차이가 없을지도 모르지만, 작업의 중단과 재개 라는 면에서 보면, 분명 맥 OS 환경이 보다 뛰어난 인터페이스임이 틀림없다.

하지만 그렇다고 모두가 맥 OS를 쓰라는건 아니다.

놀라운건 나도 이런 윈도우 인터페이스에 놀랍도록 적응이되서 나름대로의 최적화 방안을 고안해 내서 쓰고 있었다는 것이다. 방법은 아주 사소한 습관에 있었다.

연구실 컴퓨터 환경자체가 윈도우2003 서버환경이고 하드웨어 성능이 워낙에 좋다보니, 이것저것 바탕화면에 띄워놓고 사용하기 일쑤였다. 그리고 중요한건 퇴근하고 집에 갈때도.. 그냥 모니터만 끄고 집에 가는 습관이 있다. 부팅시간을 기다리는게 귀찮아서..그리고 프로그램 로딩시간이 싫어서 생긴 습관이다.
이게 머 별거냐? 하겠지만… 집에 있는 성능구린 데스크탑과 배터리 압박이 있는 노트북은 상상도 할수 없다.

이 별거 아닌 습관이 나에게 가져오는 작업의 효율은 정말이지 놀랍다.
얼마전까지 되풀이 됐던 브라우저를 열고 닫으면서 삼첨포로 빠지는 일이 드물게 되고, 기존에 작업했던 개발환경을 그대로 둔상태에서 다시 재개하니까 이전 작업을 이어가는데 무리가 없었다.

만약에 이글을 일고 있는 그대들도 자신의 작업을 최적화 시키고 싶다면,.. 지금당장 메모리부터 2GB로 업그레이드하고,..되도록 작업했던 프로그램을 닫지말고 사용해 보기 바란다.
그리고 시스템 종료보다는 시스템 최대 절전모드를 이용해 보기바란다 .