2009년 7월 20일 월요일

재밌는 사이트 하나 - http://kr.picjoke.com

진을 가지고 재밌는 효과를 한 번 내보는 건 어떨까? 하는 생각이 있는 분들은 관심을 가져보면 좋을 듯 한 사이트이다.
우연찮게 구글 애드센스를 통해서 알게된 사이트인데 이미지 프로세싱을 아주 잘 하는 곳이다.
먼저 picjoke.com 을 통해서 만든 사진을 보면 더 재밌을 거 같다^^

사용자 삽입 이미지

작은 아들 사진을 가지고 만들어 본 것인데 얼굴이 제대로 나왔다. 하지만...

사용자 삽입 이미지

































큰 아들 사진을 가지고 해 보니 얼굴을 정확하게 검출하지 못한 것을 볼 수 있다. 눈치로 봐서는 얼굴 사진을 찍을 경우 대부분 정중앙에 놓고 찍는다는 것을 전제로 한 모양이다. 그래도 다양한 스타일을 가지고 여러 가지를 연출할 수 있다.

사용자 삽입 이미지


































또한 블로그에 사진을 올린 것처럼 변환파일을 다운받을 수 있어 유용하게 사용할 수도 있을 듯 하다.

현재 picjoke.com 사이트에서는 별다른 판매등이 없는 거 같은데, 이걸 이용해서 재밌는 일을 해 볼 수 있지 않을까?^^


드디어 '트랜스포머II-패자의 역습'을 보다!!

사용자 삽입 이미지

주말은 가능한 아내와 아이들과 시간을 보내고 있다.
또한 두 아들의 아내가 가능한 힘들까봐 잠시 외출을 혼자서 하게 하기도 한다.
그동안 두 아들을 집에서 보고 있는다.
지난 토요일 아내가 친구들과 시간을 보내고 있던 중에 전화가 왔다.
트랜스포머 보러갈 준비를 빨리 하란다. 무슨 소린가 했더니 아내의 친구들이 아이들을 봐 준단다...
믿을 수 없었지만 안면을 익혀놓은 덕분에 큰 아들도 문제가 없단다...

우왕~~ 아내와 친구들이 도착하고서는 미친듯이 큰 아들을 속이고(?) 도망나왔다.
가장 가까운 신림역 포도몰 롯데시네마 시간도 PM 2:30~~~
5시까지 돌아와야 한다는 친구들과의 약속도 지킬 수 있다....ㅋㅋㅋ

그리고 우린 1년이 넘는 시간동안 영화를 보지 못했던 한을 트랜스포머를 보면서 흥분에 쌓여 풀었당...ㅋㅋ
아내의 친구들에게 고마움을 표시해야 할 텐데...ㅎㅎ

블로그가 접속이 안 되었던 이유...

주말엔 특별한 일이 없는 한은 컴퓨터를 사용할 일이 없다.
그래서인지 블로그를 별도로 점검할 수도 없는 일...

월요일 출근해서 블로그를 점검해 보면 종종 죽어 있는 경우가 있었다.
꼭 주말이나 자리를 비울 때 이런 일이 일어난다...ㅡㅡ;;

이번엔 또 뭔가? 해서... 살펴보니 하드웨어는 돌아가고 있는거 같았다.
그래도 모르니 강제로 재부팅을 하고서는 원격으로 접속을 해 보니 접속이 되질 않았다.
'어~ 부팅이 정상적으로 되는 걸 확인했는데...'

서버에서 브라우저를 구동해 보니 정말로 인터넷이 되질 않았다.
흠... 그런데 IP가 잡혀 있고...ㅜㅜ;;
난공불락인듯 보였는데 네트워크 선을 살펴보니 서버에 연결된 것도 아닌 허브에 연결된 쪽이 빠져 있는 것이 아닌가?ㅡㅡ;;
다행히 가까운 곳에 있길 망정이지... 허허~~ 멀리있는 허브나 서버였으면 하루 종일 붙들고 있을 뻔 했다...ㅎㅎ

흠... 직접 서버를 운영하는 것이 쉬운 일이 아니다.
한편으론 경험삼아 해 보는 것인데 블로그를 tistory로 이전을 해야 할까?
업무하면서 글을 쓰는 것도 쉬운 일이 아닌데 종종 하드웨어적인 일이 발생할 때면 제법 시간을 빼았긴다.
그래도 나름 재밌기는 해도 바쁠 때 곤혹이다...

다시 티스토리로 이전할까? 나중에 다시 도메인을 다른 용도로 사용을 하더라도... 고민이당...쩝...

2009년 7월 16일 목요일

JUnit을 이용한 UI 테스트

흔히, GUI가 있는 프로그램은 일일이 개발자가 눈으로 보거나 이벤트를 날려보는 식으로 테스트가 진행된다.
쉽지 않은 일이기에 TDD 에서는 이것마저 테스트가 가능하다고 한다. 하지만 이것 역시나 쉽지 않은 것이 GUI 프로그램인 경우에는 아무리 생각해 보아도 TDD를 적용하기 힘들다는 생각을 버리기 힘들다.

그리고 최근 사내에서 TDD를 전파하는 중인데 웹 애플리케이션을 많이 하는 곳이 아니고 핸드셋 단말을 많이 개발하는 곳이어서 아무래도 UI 이슈가 많은 곳이다.
그러다보니 TDD를 적용해 보기에 어려움이 많은 부분이 있다. 그래서인지 설득력있게 이야기해 보아도 쉽게 적용하는 개발자를 보질 못했다.
더군다나 나역시 로직컬한 부분에서는 TDD를 적용해 오긴 했지만 UI에 TDD를 적용해 보진 않았다.

그런중에 안드로이드 애플리케이션을 개발해야 하는데, 아무래도 UI 이슈가 많아진다.
그리고 개발하고자 하는 프로젝트가 2D Graphics 영역이어서 일일이 랜더링해야 하는 코드가 많아져 graphics 쪽으로 공부를 하는 중이다.
그런 중에 책의 소스코드를 unit test 할 수 있는 방법이 없을까?하는 생각으로 간단하게 UI를 JUnit 을 이용하여 테스트해 보았다.
작은 시간이니 하나씩 UI에 적용할 방법을 찾는 것도 좋은 방법이란 생각이 든다^^

먼저, ApplicationFrame.java 라는 정말로 심플한 UI 코드를 보자. Frame이 중앙에 모니터의 중앙에 위치하도록 center() 라는 메소드를 가지고 있다.

import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Toolkit;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

/**
 * @author Sang-Hyup, Lee
 *
 */
public class ApplicationFrame extends Frame {

 public ApplicationFrame() {
  super("ApplicationFrame v1.0");
 }
 
 public ApplicationFrame(String title) {
  super(title);
  createUI();
 }

 protected void createUI() {
  // TODO Auto-generated method stub
  setSize(500, 400);
  center();
 
  addWindowListener(new WindowAdapter() {
   public void windowClosing(WindowEvent e) {
    dispose();
    System.exit(0);
   }
  });
 }

 public void center() {
  // TODO Auto-generated method stub
  Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
  Dimension frameSize = getSize();
 
  int x = (screenSize.width - frameSize.width) / 2;
  int y = (screenSize.height - frameSize.height) / 2;
 
  setLocation(x, y);
 }
 
}


 여기서 테스트를 해 보고 싶은 것이 모니터의 실질적인 width, height 값과 중앙에 위치했을 때 center() 메소드에서 사용한 알고리즘이 맞는가? 하는 것이다.
간단한 알고리즘이어서 오류가 발생할 경우는 거의 없지만 TDD 개발 책에서도 대부분은 이렇게 심플한 예제로 설명하니 부담이 오히려 없을 듯 하다.

만약, 자신의 모니터의 width, height 값을 정확하게 알아본 후 다음의 테스트 코드를 적용해 볼 수 있을 것이다.


import java.awt.Dimension;
import java.awt.Point;
import java.awt.Toolkit;

import junit.framework.TestCase;

import com.mediachorus.java2d.graphics.frame.ApplicationFrame;

/**
 * @author Sang-Hyup, Lee
 *
 */
public class ScreenSizeTest extends TestCase {

 public void testScreenSize() {
  Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();

  assertEquals(1280, screenSize.width);
  assertEquals(1024, screenSize.height);
 }
 
 public void testGetLocation() {
  ApplicationFrame appFrame = new ApplicationFrame("This is test frame");
 
  appFrame.center();
 
  Point point = appFrame.getLocation();
 
  assertEquals(390, point.x);
  assertEquals(312, point.y);
 
  assertEquals(390.0d, point.getX());
  assertEquals(312.0d, point.getY());
 }
 
}


모니터가 1280 * 1024 인 경우 해당 Dimension 클래스를 이용한 width, height 값을 통해서 알 수 있고, testGetLocation() 테스트 메소드를 통해서 center() 메소드가 실제로 정상적으로 작동하는지 검증할 수 있다.

간단한 UI 테스트를 통한 TDD 적용이다. 위의 코드를 이용해서 각자 모니터, center() 알고리즘의 검증, 계산 등을 해보면 좋은 경험이 될 것이다.
이런 테스트 코드를 가지고 있으면 좋은 점 또 하나는 일일이 로그를 찍어보지 않아도 해당하는 값들을 예측할 수 있다는 것이다.

우리 닮았나요?

사용자 삽입 이미지

언제나 내게 가장 소중한 아이들이다^^
많이 닮았죠?

밤늦게서야 아이들을 재워놓고 사진을 정리하던 중에 둘째 녀석 돌잔치 날에 두 녀석이 모두 잠이 든 틈을 노려 너무 귀엽게 포즈가 잡혀 찍어둔 사진이다.

노동자가 소유한 ‘알짜 기업’이 한국에 있다

우리나라에서는 참으로 보기드문 회사 하나를 소개한다.

기사의 제목부터가 심상치 않았다.
더군다나 기사의 내용을 보자면 연매출 700억원에 영업이익이 연 20억 가량의 회사가 노동자가 소유한 기업이란다.
이에 더해 사훈이 '공동소유, 공동분배, 공동책임' 이란다.

내 호기심을 끌기에는 충분한 기업이다. 키친아트 브랜드를 그대로 사명으로 하고 40년간 존속했던 기업을 노동자 스스로 포기하지 않고 알짜기업으로 만든 짤막한 기사는 새삼 내 마음을 흥분하게 만들기에 충분했다.

아픈 상처를 안고 있는 회사.
하지만 아픔을 딛고 스스로 일어서서 참된 가치를 추구하는 회사이다.

히야~~ 관심을 끌기에 충분하지 않은가?
기업에 대한 바른 가치, 경영에 대한 참된 가치의 추구, 이상으로 생각한 것을 현실화시킨 주인공들...
대한민국의 기업 경영에 화두를 던져보기에 충분하다.

바라기는 더 좋고 훌륭한 회사. 정말로 위대한 회사가 되었으면 좋겠다.
먼 발치에서나마 응원을 해 주고 싶은 회사이다.

사용자 삽입 이미지



2009년 7월 15일 수요일

소유의 종말 The Age of Access

사용자 삽입 이미지
번역서의 제목보다는 원제목이 책의 의미를 휠씬 돋보이게 하는 책이다.
자칫 제목으로 인해 딱딱함 또는 노동, 사회운동 등에 대한 책이 아닐까? 하는 선입견을 가질거 같아서 제목에 대한 소개를 짤막하게 해 보았다.

중요한 건 제목에 있지 않고 저자의 미래에 대한 탁월한 전망에 집중해야 한다는 것이다. 원제목에서 알 수 있듯이 단순히 소유(사유재산, 자본주의의 결과?)의 종말에 관심을 두고 있는 것이 아니라 '접속의 시대'를 내다 보는 혜안이 정말로 탁월하다고 할 수 있다.

접속의 시대를 대표하는 인터넷 - 초고속 통신망 - 에 대한 이해는 1999년 책이 출판되었는데, 준비기간이 6년 가량 되었다고 한 것을 생각해 본다면 정말이지 놀라지 않을 수 없다.
2009년 웹2.0, 모바일 2.0, 아이폰, 안드로이드, 오픈소스, IPTV, 클라우드 컴퓨팅 등 이루 헤아릴 수 없이 많은 기술과 트랜드를 가히 예상했었다고 말할 수 밖에 없다.
다만, 표현이 다르고 조금의 서비스, 명칭이 틀릴 뿐이라는 생각이 들 정도이다.

흠... 개인적으로는 이 책을 통해서 많은 아이디어들을 얻어간다.
공유, 플랫폼, 신뢰, 문화에 대한 여러 가지 생각을 해 볼 수 있는 기회였고 생각지도 못한 혜안으로 어쩌면 또 몇 년 앞에 주어질 기회를 다시금 이 책을 읽었을 때 찾을 수 있을지도 모르겠다는 생각이 들 정도이다.

피터 드러커, 앨빈 토플러 등과는 또 다른 매력을 지니고 있다. 방대한 자료, 해석, 연구에 의한 결과물이라는 것을 금방 알 수 있다. 1999년 책이 출판되었지만 아직도 이해하지 못하는 부분이 있을 정도이다.
단순히 미래학, 경영학, 사회서적이라고 구분짓기도 힘들 정도로 다양한 분야를 다루고 있고 그에 대한 비판과 선견지명 등을 담고 있다.

시간이 허락한다면 한 번더 손에 들고 하루, 이틀 정도에 완독하고 싶은 책이다.
책의 중간중간에 제법 메모를 해 두었지만 신기하게도 책의 가장 말미에 저자가 직접 잘 정리해 둔 대목이 있다. 정말로 책의 가장 말미이다. 계속해서 여운이 남는 느낌이어서 소개한다.

접속의 시대는 <우리는 타인과 맺는 가장 기본적인 인간 관계를 과연 어떤 방향으로 재설정하고 싶어하는가>라는 근본적 물음으로 우리를 내몰 것이다. 접속이라는 것은 참여의 수준만이 아니라 참여의 유형을 결정하는 문제이기도 하기 때문이다. 그것은 단순히 누가 접속권을 얻느냐의 문제가 아니라 어떤 유형의 체험과 세계가 과연 접속할 만한 가치가 있고 추구할 만한 가치가 있는가를 따지는 물음이다. 21세기에 우리가 만들어나갈 사회의 성격은 이 답변에 좌우될 것이다.

[관련 블로그 리뷰]
잠시 찾아본 블러거들의 리뷰 중에 괜찮은 리뷰가 있어 소개한다. 도시리뷰를 작성하고 다른 블로거들의 리뷰를 본 것도 처음인 듯 하다^^
둘 다 좋은 리뷰이다.


Swing 튜토리얼 - JComponent

링크와 함께 원문을 실어 놓는다.
어디가에 계실 번역자님~~~ 글을 복사한 것에 따른 문의가 있으면 언제든지 연락주세요...
링크로 바꿀께요^^;; 다음에 원문을 혹시나 찾지 못할까봐ㅎㅎ

코드 분석을 위해 새삼스럽게 Java swing 쪽을 잠시 보고 있는데 나름 부담되었는데 도움이 되었다^^


출처 : http://java.sun.com/docs/books/tutorial/uiswing/components/jcomponent.html

JComponent클래스
최상위 컨테이너를 제외하고 이름이 J로 시작하는 모든 Swing콤포넌트는 JComponent클래스를 상속한다.
예를 들면, JPanel, JScrollPane, JButton, JTable등은 모두 JComponent클래스를 상속했다.
그러나, JFrame, JDialog는 그렇지 않은 데, 그것들은 최상위 컨테이너 이다.
JComponent클래스는 Container클래스를 상속하며, Container컨테이너 클래스는 다시 Component클래스를 상속한다.

Component클래스는 레이아웃 힌트를 제공하는 것부터 그리기, 이벤트를 제공하는 것까지 모든 것을 포함한다.

Container클래스는 콤포넌트를 컨테이너에 추가하고, 레이아웃을 설정하는 것을 지원한다.

이 문서의 API 표는 JComponent클래스 뿐만이 아니라, Component, Container클래스의 가장 자주 사용되는 메소드들을 요약했다.


JComponent클래스의 기능

JComponent클래스의 기능은 다음 카테고리로 나눌 수 있다.
  • 툴팁
  • 그리기와 테두리
  • 프로그램 전체에 영향을 끼치는 룩앤필
  • 사용자정의 속성
  • 레이아웃 지원
  • 노약자, 장애인을 위한 접근성 지원
  • 드랙앤드롭 지원
  • 이중 버퍼링
  • 키바인딩(Key bindings)
툴팁
setToolTipText메소드로 문자열을 지정하면, 콤포넌트 사용자에게 도움말을 제공할 수 있다.
커서가 콤포넌트 위에서 머물면, 콤포넌트 옆의 작은 창에 지정된 문자열이 보인다.
더  자세한 정보는 How to Use Tool Tips 을 참조한다.
그리기와 테두리
setBorder메소드는 콤포넌트가 가장자리에 보여주는 테두리를 설정할 수 있도록 한다.
콤포넌트 안쪽을 그리기 위해서는 paintComponent메소드를 오버라이드 하면 된다.
자세한 내용은 How to Use Borders와  Performing Custom Painting을 참조한다.
프로그램 전체에 영향을 끼치는 룩앤필
모든 JComponent객체는 그에 해당된는 ComponentUI객체를 가지고 있으며,
ComponentUI객체는 그리기와 이벤트 처리, 크기조절등의 역할을 행한다.
정확히 어떤 ComponentUI객체가 사용되는 지는 현재의 룩앤필에 따라 다르다.
UIManager.setLookAndFeel메소드를 사용해서 현재의 룩앤필을 설정할 수 있다.
자세한 내용은 How to Set the Look and Feel을 참조한다.
사용자정의 속성
모든 JComponent객체를 한 개 이상의 속성(이름/객체 쌍)과 연관시킬 수 있다.
예를 들면, 레이아웃 관리자는 속성을 사용해서 레이아웃 관리자가 관리하는 모든 콤포넌트와 제약 객체(constraints object)를 연관시킬 수 있다. putClientProperty메소드를 이용해서 속성을 설정하고, getClientProperty를 이용해서 속성을 가져온다.
속성에 대한 일반적인 정보를 얻고 싶으면 Properties를 참고한다.
레이아웃 지원
AWT의 Component클래스는 getPreferredSize, getAlignmentX와 같은 레이아웃 힌트 메소드는 제공하지만,  이러한 레이아웃 힌트를 설정할 수 있는 방법을 제공하지 않는다. JComponent클래스느 레이아웃 힌트를 설정하는 메소드를 제공한다. setMinimumSize, setMaximumSize, setAlignmentX, setAlignmentY 메소드가 그것이다.
더 자세한 정보는 Laying Out Components Within a Container를 참조한다.
노약자, 장애인을 위한 접근성 지원
JComponent클래스는 스크린 리더가 콤포넌트로부터 정보를 가져가는 것을 돕는 등의 접근기술을 도와주는 API와 기본기능이 있다.
How to Support Assistive Technologies을 참조한다.
드래그앤드드롭 지원
JComponent클래스는 콤포넌트의 이전 처리기(transfer handler)를 설정하는 API를 제공한다.
이전 처리기는 Swing 드래그앤드드롭의 기반이 된다.
자세한 사항은 Introduction to Drag and Drop and Data Transfer을 참조한다.
이중 버퍼링
이중 버퍼링(double buffering) 화면에서 부드러운 그리기 동작을 보여준다.
Performing Custom Painting을 참조한다.
키 바인딩
이 기능을 사용하면 사용자가 키보드의 특정 키를 누를 때 콤포넌트가 반응하도록 만들 수 있다.
예를 들면, 많은 룩앤필의 경우 버튼이 포커스를 가지고 있을 때, 스페이스 키를 누르는 것은 마우스로 클릭하는 것과 동일한 효과를 가진다. 룩앤필은 자동적으로 스페이스키를 누르는 것과 버튼의 결과적인 효과를 바인딩(결속) 시켜준다.
더 자세한 정보는 How to Use Key Bindings을 참조한다.

JComponent API

JComponent클래스는 많은 새로운 메소드를 제공하며, Component클래스와 Container클래스로부터 많은 메소드를 상속 받았다. 다음 표는 가장 많이 사용하는 메소드를 요약했다.
  • 콤포넌트 외양을 커스터마이징
  • 콤포넌트 상태를 설정하거나 가져오기
  • 이벤트 처리하기
  • 콤포넌트 그리기
  • 포함계층구조를 처리하기
  • 콤포넌트 레이아웃
  • 크기와 위치정보를 가져오기
  • 크기와 위치를 지정하기
콤포넌트 외양을 커스터마이스징
메소드용도
void setBorder(Border) 
Border getBorder()
콤포넌트의 테두리를 설정하거나 가져온다.
자세한 내용은 How to Use Borders 을 참조한다.
void setForeground(Color)
void setBackground(Color)
콤포넌트의 전면색상 혹은 배경색상을 설정한다.
전면색상은 주로 콤포넌트 안에 문자를 그려넣는 데 사용되는 색상이다. 배경색상은 콤포넌트가 불투명하다는 전제하에서 콤포넌트의 뒷배경영역의 색상이다.

Color getForeground() 
Color getBackground()
콤포넌트의 전면색상 혹은 배경색상을 가져온다.
void setOpaque(boolean) 
boolean isOpaque()
콤포넌트가 불투명(opaque)한지 여부를 설정하거나 가져온다.
불투명한 콤포넌트는 그 배경을 배경색상을 채워넣는다.
void setFont(Font) 
Font getFont()
콤포넌트의 글꼴을 설정하거나 가져온다.
만약 콤포넌트의 글꼴이 설정되지 않았다면, 부모콤포넌트의 글꼴이 반환된다.
void setCursor(Cursor)
Cursor getCursor()
커서를 갖다대었을 때 표시되는 커서모양을 설정하거나 가져온다. 예를 들면 aPanel.setCursor( Cursor.getPredefinedCursor( Cursor.WAIT_CURSOR));
콤포넌트의 상태 설정하기
메소드용도
void setComponentPopupMenu(String)JComponent객체의 JPopupMenu설정하기.
바인딩을 등록하고 필요한 리스너를 추가해서 적절한 타이밍에 JPopMenu객체가 보여지게 하는 것은 UI가 담당한다.
JPopMenu가 보여지는 시점은 룩앤필에 따라 다르다. 어떤 룩앤필은 마우스 이벤트에 보여줄 것이고, 어떤 이벤트는 키바인딩을 가능하게 할 것이다.
popup이 null이고, getIngeritsPopupMenu가 true를 반환하면, getComponentPopupMenu메소드는 부모객체로 위임될 것이다. 이 방식으로 자식 콤포넌트가 부모 콤포넌트의 popupmenu를 상속할 수 있다.
void setTransferHandler(TransferHandler)
TransferHandler getTransferHandler()
transferHandler속성을 설정하거나 제거한다.
TransferHandler는 드래그앤드드롭 혹은 클립보드 로 (부터)의 잘라내기, 복사, 붙여넣기를 통해서 데이터를 교환하는 것을 지원한다.
더 자세한 내용은 Introduction to Drag and Drop and Data Transfer을 참조한다.
void setToolTipText(String)툴팁에 보여줄 문자열을 설정한다.
더 많은 정보는 How to Use Tool Tips을 참조한다.
void setName(String) 
String getName()
콤포넌트의 이름을 설정하거나 가져온다.
이  메소드는 텍스트를 표시하지 않는 콤포넌트와 문자열을 연결시킬 때 유용할 수 있다.
boolean isShowing()콤포넌트가 화면에 보여지는 지를 결정한다.
이것의 의미는 콤포넌트가 visible이어야 하고, visible하고 show된 컨테이너에 포함되어야 한다는 의미이다.
void setEnabled(boolean) 
boolean isEnabled()
콤포넌트가 활성화 여부를 설정하거나 가져온다.
활성화된 콤포넌트는 사용자 입력에 반응하고 이벤트를 생성할 수 있다.
void setVisible(boolean) 
boolean isVisible()
콤포넌트가 visible인지를 설정하고 가져온다.
최상위 콤포넌트를 제외한 모든 콤포넌트는 초기값으로 visible하다.
이벤트 처리
(자세한 사항은
Writing Event Listeners을 참조한다.)
메소드용도
void addHierarchyListener(hierarchyListener l) 
void removeHierarchyListener(hierarchyListener l) 
계층구조가 변경되었다는 이벤트를 처리하기 위한 지정된 hierarchy listener를 추가하거나 제거한다.
리스너가 null이면, 예외를 발생시키지 않으며, 아무런 행동도 취해지지 않는다.
void addMouseListener(MouseListener) 
void removeMouseListener(MouseListener)
마우스 리스너(mouse listener)를 추가하거나 제거한다.
마우스 리스너는 사용자가 마우스를 사용해서 콤포넌트와 상호작용을 할 때 통보받는다.
void addMouseMotionListener(MouseMotionListener) 
void removeMouseMotionListener(MouseMotionListener)
마우스 동작 리스너(mouse motion listener )를 추가하거나 제거한다.
마우스 동작 리스너� 사용자가 해당 콤포넌트 안엣 마우스커서를 움직일 대 통보받는다.
void addKeyListener(KeyListener) 
void removeKeyListener(KeyListener)
키 리스터(key listener)를 추가하거나 제거한다.
키 리스너는 콤포넌트가 키보드 포커스를 가지고 있고, 사용자가 키보드를 타이핑하면 통보받는다.
void addComponentListener(ComponentListener) 
void removeComponentListener(ComponentListener)
콤포넌트 리스너(component listener )를 추가하거나 제거한다.
콤포넌트 리스너는 콤포넌트가  숨겨지거나, 보여지거나, 이동하거나, 크기변경이 될 때 통보받는다.
boolean contains(int, int) 
boolean contains(Point)
지정된 점(point)가 콤포넌트 내부에 있는 지 결정한다.
파라메터는 콤포넌트 좌표 시스템으로 지정되어야 한다.
정수값은 각각 x, y값을 나타낸다.
Component getComponentAt(int, int)
Component getComponentAt(Point)
입력된 x, y지점을 포함하는 콤포넌트를 반환한다.
만약 콤포넌트가 겹쳐져 있다면 가장 왼쪽위 콤포넌트를 반환한다.
이것은 Component.contains()메소드의 인덱스가 0에 제일 가까운 콤포넌를 찾아내는 것으로 결정한다.
Component setComponentZOrder(component comp, int index)
지정된 콤포넌트를 컨테이너의 지정된 z축 인덱스로 이동시킨다.

만약 콤포넌트가 다른 컨이너의 자식객체이면, 그 콤포넌트는 이 컨테이너에 추가되기 전에 이전의 컨테이너에서 제거된다.
java.awt.Container.add(Component, int)메소드와 중요한 차이점은 이 메소드는 이전 컨테이너에서 콤포넌트를 제거할 때, 허용되고 필요하지 않다면 removeNotify메소드를 호출하지 않는다는 것이다. 이 방식으로 만약 콤포넌트가 키보드 포커스를 가지고 있다면, 새로운 위치로 이동했을 때에도 키보드 포커스를 유지한다.

참고:  z축은  콤포넌트가 그려지는 순서를 결정한다. z축 값이 제일 큰 콤포넌트가 먼저 그려지고, 낮은 z축 값이 가장 낮은 콤포넌트가 가장 늦게 그려진다. 콤포넌트가 겹쳐진다면, z축 값이 낮은 콤포넌트가 z축 값이 높은 콤포넌트 위에 그려진다.

Component getComponentZOrder(component comp)
컨테이너 내부의 콤포넌트의 z축 값을 반환한다. z축에서 위에 있을 수록 인덱스 값은 낮다.
z축 값이 가장 낮은 콤포넌트는 가장 늦게 모든 자식 콤포넌트 위에 그려진다.
콤포넌트 그리기
(자세한 사항은
Performing Custom Painting을 참조한다.)
메소드용도
void repaint() 
void repaint(int, int, int, int)
콤포넌트의 전체가 다시 그려지도록 요청한다.
4개의 int형 파라메터는 다시 그릴 경계선을 지정하며, x, y, 폭, 높이를 의미한다.
void repaint(Rectangle)콤포넌트 내의 지정된 영역이 다시 그려지도록 요청한다.
void reval!idate()콤포넌트와 해당 컨테이너가 레이아웃을 다시 잡도록 요청한다. 콤포넌트가 visible된 이후에 명시적으로 크기조절, 정열 힌트 변경 조절, 포함계층구조 변경등을 하지 않았다면 이 메소드를 호출할 필요할 필요가 없다.
reval!idate메소드를 호출한 다음에는 항상 repaint메소드를 호출하도록 한다.
void paintComponent(Graphics)콤포넌트를 그린다.
이 메소드를 오버라이드해서 사용자정의 콤포넌트의 그리기를 구현한다.
포함계층구조 다루기
(더 자세한 내용은 최상위 컨테이너를 참조한다.
)
메소드
용도
Component add(Component) 
Component add(Component, int) 
void add(Component, Object)
지정된 콤포넌트를 이 컨테이너에 추가한다. 파라메터가 1개  사용되는 것은 콤포넌트를 컨테이너의 끝에 추가한다. int형 파라메터는 컨테이너 내의 새로운 콤포넌트의 위치를 표시한다. Object형 파라메터는 현재의 레이아웃 관리자에게 레이아웃 제한을 제공한다.
void remove(int) 
void remove(Component)
void removeAll()
이 컨테이너에서 1개 혹은 모든 콤포넌트를 제거한다.
int형 파라메터는 콤포넌트를 제거할 컨테이너 내부의 위치를 나타낸다.
JRootPane getRootPane()Get the root pane that contains the component.
Container getTopLevelAncestor()Get the topmost container for the component — a Window, Applet!, or null if the component has not been added to any container.
Container getParent()Get the component's immediate container.
int getComponentCount()Get the number of components in this container.
Component getComponent(int) 
Component[] getComponents()
Get the one of or all of the components in this container. The int argument indicates the position of the component to get.
Component getComponentZOrder(int)
Component[] getComponentZOrder()
Returns the z-order index of the component inside the container. The higher a component is in the z-order hierarchy, the lower its index. The component with the lowest z-order index is painted last, above all other child components.
Laying Out Components 
(see
Laying Out Components Within a Container for more information)
MethodPurpose
void setPreferredSize(Dimension) 
void setMaximumSize(Dimension) 
void setMinimumSize(Dimension)
Set the component's preferred, maximum, or minimum size, measured in pixels. The preferred size indicates the best size for the component. The component should be no larger than its maximum size and no smaller than its minimum size. Be aware that these are hints only and might be ignored by certain layout managers.
Dimension getPreferredSize() 
Dimension getMaximumSize() 
Dimension getMinimumSize()
Get the preferred, maximum, or minimum size of the component, measured in pixels. Many JComponent classes have setter and getter methods. For those non-JComponent subclasses, which do not have the corresponding setter methods, you can set a component's preferred, maximum, or minimum size by creating a subclass and overriding these methods.
void setAlignmentX(float) 
void setAlignmentY(float)
Set the alignment along the x- or y- axis. These values indicate how the component would like to be aligned relative to other components. The value should be a number between 0 and 1 where 0 represents alignment along the origin, 1 is aligned the furthest away from the origin, and 0.5 is centered, and so on. Be aware that these are hints only and might be ignored by certain layout managers.
float getAlignmentX() 
float getAlignmentY()
Get the alignment of the component along the x- or y- axis. For non-JComponent subclasses, which do not have the corresponding setter methods, you can set a component's alignment by creating a subclass and overriding these methods.
void setLayout(LayoutManager) 
LayoutManager getLayout()
Set or get the component's layout manager. The layout manager is responsible for sizing and positioning the components within a container.
void applyComponentOrientation(ComponentOrientation)void setComponentOrientation(ComponentOrientation)Set the ComponentOrientation property of this container and all the components contained within it. See Setting the Container's Orientation for more information.
Getting Size and Position Information 
MethodPurpose
int getWidth() 
int getHeight()
Get the current width or height of the component measured in pixels.
Dimension getSize() 
Dimension getSize(Dimension)
Get the component's current size measured in pixels. When using the one-argument version of this method, the caller is responsible for creating the Dimension instance in which the result is returned.
int getX() 
int getY()
Get the current x or y coordinate of the component's origin relative to the parent's upper left corner measured in pixels.
Rectangle getBounds()
Rectangle getBounds(Rectangle)
Get the bounds of the component measured in pixels. The bounds specify the component's width, height, and origin relative to its parent. When using the one-argument version of this method, the caller is responsible for creating the Rectangle instance in which the result is returned.
Point getLocation() 
Point getLocation(Point) 
Gets the current location of the component relative to the parent's upper left corner measured in pixels. When using the one-argument version of getLocation method, the caller is responsible for creating the Point instance in which the result is returned.
Point getLocationOnScreen()Returns the position relative to the upper left corner of the screen.
Insets getInsets()Get the size of the component's border.
Specifying Absolute Size and Position 
(see
Doing Without a Layout Manager (Absolute Positioning) for more information)
MethodPurpose
void setLocation(int, int) 
void setLocation(Point)
Set the location of the component, in pixels, relative to the parent's upper left corner. The twoint arguments specify x and y, in that order. Use these methods to position a component when you are not using a layout manager.
void setSize(int, int) 
void setSize(Dimension)
Set the size of the component measured in pixels. The two int arguments specify width and height, in that order. Use these methods to size a component when you are not using a layout manager.
void setBounds(int, int, int, int) 
void setBounds(Rectangle)
Set the size and location relative to the parent's upper left corner, in pixels, of the component. The four int arguments specify x, y, width, and height, in that order. Use these methods to position and size a component when you are not using a layout manager.

2009년 7월 9일 목요일

[소개] fileformat.info

개발을 하다보면 Hex, Decimal, UTF-8 등의 값들을 알아야 할 때가 있다.

만약 자바 코드 상으로 "\u2212" 를 UTF-16(Hex)로 표현하면?
그리고 UTF-8 으로 표현하면?

위와 같은 질문에 대한 답을 이미지까지 표현해서 대부분의 문자셋으로 표현해 준다.
C/C++, Java, Python source code 형태로도 알려주기 때문에 문자셋을 알아야 할 경우 빠른 시간내에 알 수 있다.

사용자 삽입 이미지


2009년 7월 8일 수요일

구글, 드디어 테스크톱 OS 시장에도 도전장을 내밀다

이미 안드로이드를 기반으로 한 모바일 디바이스, 셋탑박스, 넷북 등으로 OS 시장을 넓혀가고 있는 구글...
안드로이드라는 모바일 OS를 내어 놓았지만 몇 년 전부터 구글이 MS에 대항할 OS를 내 놓을 것이라는 것은 공공연하게 사실로 받아들여지고 있었다.
그 실체가 궁금했을 뿐이지...- 우분투를 기반으로 한 테스크탑 OS, 구글이 커널부터 새로 만든 OS 등 - 구글이 OS 시장을 넘볼 것이라는 것은 거의 사실로 받아들여지고 있었던 것이다.

그리고 드디어 '크롬 OS'라는 이름으로 오픈소스 형태로 무료로 배포한다고 한다.
어찌보면 국내 티맥스 소프트에서 '티백스 윈도우'를 내 놓은 것과는 상반된 형태인데 구글스럽다는 생각이 든다.
어차피 구글은 소프트웨어를 팔아서 돈을 많이 버는 기업이 아니라 검색엔진을 기반으로 한 광고를 통해서 돈을 버는 회사이니 굳이 OS라고 해서 돈을 받고 팔 이유가 없는 것이다.

'크롬 OS'를 통해서 웹에 쉽게 접근할 수 있도록 제공하고 웹에서 구글 오피스, 지메일, 노트 등을 쉽게 사용할 수 있도록 제공하고 그에 따른 노출광고 등으로 수익구조를 가져 가지 않을까? 하는 것은 거의 대부분 알 수 있을 듯 하다.

그래도 이러한 행보를 걷는 것 자체가 대단한 것이다.
많은 돈을 들여 배포하는 OS를 관점에서 볼 때 역시나 티맥스와는 비교가 되지 않을 수 없다. 티맥스의 경우 정식 출시가 되면 아마도 상당 부분을 공공기간이나 정부에 먼저 납품을 할 것이다.
발표 자료를 보면 기존 마이크로소프트와의 호환성에 초점이 맞추어져 있음으로 MS-Office, 메일, 인터넷만 되면 공공기간 등에서는 쓰지도 못할 일도 없는 것이다.
공공기간이나 정부기간에서 게임이나 개발을 하는 것도 아니니 일반 사원급 등에 해당하는 분들은 문서(Office, 한글등)만 잘 보고 사용할 수 있더라고 사용하기에는 불편함이 없을 거니깐...
국내 딱! 맞는 OS이고 영업인 것이다.
결코 잘 했다, 잘 못 했다는 관점에서 접근하는 것이 아니다. 그저 그렇다는 이야기이다.

그에 반한 구글의 위와 같은 행보는 전세계를 대상으로 하는 구글의 OS가 무섭게 느껴지는 것이다.
사람들이 우스개 소리처럼 하는 '구글의 세계 정복'의 밑바탕을 완전히 그린 것이 아닐까?

흠... 간단하게 기사를 소개하는 걸로도 만족할 수 있는데, 잠시 드는 생각을 정리하지도 않고 적어본 것이 양이 많아졌다.
다음은 '구글, 크롬 OS 무료 배포' 관련된 기사 링크이다.




2009년 7월 7일 화요일

make sdk 명령어를 이용한 SDK 빌드하기

이전 글 - 안드로이드 전체 소스코드 빌드 - 을 통해서 안드로이드 전체 소스코드를 빌드해 보았다.
이번엔 간단하게 "make sdk" 명령어를 통해서 SDK만 빌드해 보자.

사실 안드로이드 전체 소스코드를 빌드하는 것은 상당한 많은 시간이 소요된다.
때문에 필요에 따라서 모듈별로 빌드하면 좋은데 이번엔 간단하게 SDK를 빌드해 보는 것이다.

안드로이드 소스를 다운 받은 디렉토리로 이동해서 다음과 같은 커맨드를 내려준다.
만약 mydroid 디렉토리에 소스 코드를 다운받았다면 다음과 같다.

leesh@ubuntu:~/mydroid$make sdk

실제 SDK를 빌드해 본 결과, 듀얼 CPU에서 약 10분이 걸리지 않은 거 같다.

이렇게 SDK를 빌드해 보아야 할 이슈 중에 가장 큰 이유는 SDK에 포함된 Application 들을 분석하기 위함인거 같은데 나 역시 같은 이유로 살펴보고 있는 중이다.

다음엔 모듈별로 빌드하는 것을 조금더 살펴볼 예정이다.

2009년 7월 6일 월요일

Android MMS Sequence Diagram

안드로이드 패키지에는 디폴트로 MmsApp 가 포함되어 있다.
MMS의 특성상 SMIL를 플레이해 주어야 하는데 안드로이드에서는 이러한 소스를 제공해 준다.
회사 내에서 세미나를 진행해야 할 일이 있어 공부하면서 그려본 Sequence Diagram을 공개한다.

사용자 삽입 이미지

Sequence Diagram을 그린 툴을 잠시 소개하면 "Violet UML Editor" 이다.
Microsoft Visio는 너무 둔탁하기도 하고 많은 내용을 채우기에는 부족한 면이 많아서 이번 기회에 오픈소스로 된 UML 도구를 찾다가 알게된 툴이다.
간단하게 sequence diagram과 class diagram을 그리기에는 좋은 툴이란 평을 받고 있다.

2009년 7월 1일 수요일

xhtmlrenderer(XML/XHTML/CSS 2.1 Renderer)

The flying saucer project 라는 이름으로 XHTML Render 처리를 해 주는 프로젝트가 있다.

브라우저 또는 XHTML, XML 랜더링을 처리하는 프로젝트와 관련된 곳에서 참조할 만한 프로젝트이다.
더군다나 순수 100% 자바로 구현되어있다.
많이 보질 않아서 그런지 조금은 복잡하게 구성이 되어 있는 듯 해서 불편한 느낌도 있다.

중요 컨셉등은 해당 프로젝트 파일에서 문서를 참고하면 되고,
특징 중에 하나는 XHTML DOM 처리는 w3c에서 정의한 Document 인터페이스를 implements 하고 이를 XHTML DOM으로 확장을 해서 사용할 것이라고 생각했는데 그렇치 않다.
그냥 w3c에서 정의해 둔 Document 인터페이스를 구현한 Java XML API를 곧바로 사용한다.

그래서인지 모든 웹 페이지를 다 열어볼 수 있는 것은 아니다.
Javascript 등은 처리하는 구조가 없다. 이유는 Javascript 등을 처리해 주려면 w3c에서 정의한 Document 인터페이스를 실제로 구현하하고 이를 XHTML 또는 HTML 에 맞게 다시금 확장해서 구현해 주어야 하는 데 이에 대한 처리가 없다.
Full browsing 프로젝트가 아니어서 그럴 수도 있을 듯 하다.

흠... 암튼 많이 분석해야 할 프로젝트가 아니어서 여기즘 해서 정리하려고 한다. 프로젝트 중에 중요한 XHTMLPanel 소스가 있는데 이에 대한 클래스 다이어그램을 그려둔 게 있어 올려 놓는다.

사용자 삽입 이미지

더불어서 분석 중에 그려둔 sequence diagram 도 올려 놓는다. Sequence diagram은 HTMLTest.java 를 이용한 디버깅 시에 참고하면 된다.

사용자 삽입 이미지