공룡호가 사는 세상 이야기

다운로드
심포니 소개
상품 소개
참여하기

Lotus라 하여, IBM에서 무료 오피스를 내 놓았다. 베타 버전이긴 하지만, 간단히 한번 써 본 결과 꽤 우수하다.
어차피, 사람들이 돈을 내고 오피스 툴을 사용하는 것은 아니지만, 성능이 우수하다면 쓰는 것도 괜찮지 않을까.
무엇보다 MS오피스에 비해 가볍다는 것이 장점이다. 그리고 기업 입장에서도 반가운 일이 아닐까.
한번씩 경험 해 보고 리뷰 아티클을 작성하고 상품도ㅇ0ㅇ - 솔직히 나는 블투헤드셋이 탐난다 -

오픈오피스가 무엇인지는 다들 알 것이다. (모르시는 분들은 살짝 검색을 -ㅁ-)
무엇이든지 오픈되어 있다는 것은 입맛대로 커스터마이징이 가능해진다는 점이 가장 큰 장점이다.
XML로 저장된 데이터로 워드 프로세싱 문서를 만들기 위해 필터를 만들 수 있다.
이번 Article은 튜토리얼(Tutorial)로 이루어져 있어 난이도는 중급에 속하나, 크게 어렵지 않을 것이다.

오픈 오피스에는 가져오기/내보내기(Import/Export)필터 기능이 존재하는데, 이것을 사용하여 일반 문서인 XML데이터를 열 수 있는 방법을 다룬다. 이를 이용하면 사용자들은 더욱 자연스럽게 문서를 편집하고,
이를 네이티브 포맷으로 다시 저장할 수 있게 된다. 또한 이 특징을 사용하여 문서를 XML데이터로 쉽게 변경이 가능해 진다.

XML 파일 포맷의 구문에 익숙하고 XSLT(XML Style Language Transformations)를 조금 다루어 본 사람이라면 오픈오피스를 XML 기반 데이터를 위한 맞춤 편집기로 사용할 때 그 발전가능성은 무궁무진하다.
이 튜토리얼에서는 XSLT필터 파일과 함께 작동하여 플러그인에서 XML형식으로 된 어떤 데이터라도 지원할 수 있도록 한다. 즉, 데이터를 기계가 처리하기 좋은 XML로 저장하면서 이를 사람에게 편한 방식으로 편집할 수 있다는 것이다. 전자는 쉬운 검색, 의미 맥락(semantic context)과 정보 찾아오기를 가능케 하고 후자는 더 높은 수준의 하이퍼텍스트 환경에서 효율적인 편집을 가능하게 한다.

먼저 XSLT에 대해서 조금 알아보자 (Article에서는 XSLT를 알고 있다는 전제를 하고 있으므로)

XSLT는 XML문서에 XSLT를 적용하여 또다른 XML, HTML, TXT등으로 변환하는 방법을 기술한 표준 방법이다. 확장 스타일시트 언어(XSL)의 확장으로서 XML문서가 다른 데이터 형식으로 재구성되는 방법이라고 간단히 보면 된다. 자세한 내용을 일일이 열거하기에는 어렵고 XSL에 대한 이해가 부족한 사람은 아래 링크에서 간단히 학습을 하면 이번 튜토리얼을 따라하는데 큰 어려움이 없을 것이다.

IBM XSLT 입문 : http://www.ibm.com/developerworks/kr/library/tutorial/x-xsltopenoff/section3.html
Lecture #1 : http://cafe.naver.com/javalove/217
Lecture #2 : http://cafe.naver.com/javalove/218
Lecture #3 : http://cafe.naver.com/javalove/219
Lecture #4 : http://cafe.naver.com/javalove/220

이제 XSL이 무엇인지 어느정도 이해할 수 있을 것이다. 그럼 이번 튜토리얼을 따라하기 위해,
다음과 같은 것이 필요하다.
오픈오피스 2.0(+), 이번 예제에는 2.2를 사용한다. 리눅스 용, 윈도우 용 모두 상관없다.
XML편집기는 XML과 XSLT파일을 편집할 수 있어야 한다. 기본적인 Text Editor라면 상관없다 유닉스에서는 vim.
순서는 다음과 같이 진행된다.

  • 개요
  • XSLT입문
  • 가져오기 필터
  • 내보내기 필터와 다른 포맷으로 내보내기
  • 요약
  • 다운로드
  • 참고자료
  • 필자소개

튜토리얼이 자세하게 나와 있어(XSL에 대한 부분이 조금 약하긴 하지만), 1시간만에 튜토리얼을 따라할 수 있었다. XML의 모든 장점을 가지면서도 리치 텍스트 편집을 쉽게 가능하게 해 준다.
XML을 사랑하고 오픈오피스를 사용하는 사람이라면, 한번쯤 꿈꿔본 일이 아닐까.
또한, XSLT를 사용하면 편집된 문서를 어떻게 XML이 아닌 포맷으로 내보낼 수 있는지도 설명되어 있다.
XML이라는 것을 가장 처음 접했을 때가 00년도였다. 7년이 지난 지금 XML의 중요성은 날이갈 수록 증대되고 있는데 웹의 발전과 더불어 XML은 의외로 많은 것들을 가능하게 해 줄 것이다.
이전에 리뷰했던 VXML또한 그것의 일부가 아닐까?

다음 링크를 클릭하고, 커피 한잔, 그리고 비스켓을 씹으면서 따라해 보자-
링크 : http://www.ibm.com/developerworks/kr/library/tutorial/x-xsltopenoff/index.html

이번에는 좀 더 쉬운 초급용 Ajax Article을 골라 보자.
11월 6일 IBM dW에 업데이트된 기사로, PHP, Dynamic HTML(DHTML), Asynchronous JavaScript + XML(Ajax)와 같은 기술들을 사용하여 사용자의 관심을 끌 수 있는 컨텐츠를 만드는 방법이다.

먼저 결과 화면부터 보자.

텍스트에 적용된 결과이다. 마우스를 텍스트 위에 올려 놓으면, 우측의 그림처럼 작업 팝업과 같은 형식으로 마치 툴팁과도 같은 모습을 보여준다.
마우스를 작동하기 전의 텍스트팝업 창
체험하기 : http://www.muttmansion.com/lightbox/tooltips/


다음은 이미지에 적용된 결과이다. 이 그림을 클릭할 경우, 우측의 그림처럼 섬네일의 원래 크기의 이미지가 창 중앙에 디스플레이 된다. 더욱이 백그라운드의 모든 Material이 흐려지기 때문에, 사용자는 중앙의 컨텐츠에 더욱 집중할 수 있다.
클릭하기 전의 이미지원래 크기의 이미지의 라이트박스
체험하기 : http://www.muttmansion.com/lightbox/lightbox/


또한 다음과 같이 페이지 자체적으로 윈도우용 컨텐츠를 가지고 있고, 사용자가 폼에서 Login버튼을 클릭하면 Ajax.Request 객체를 사용하여 서버에서 로그인을 요청한다. 그래서 우측의 그림처럼 매우 참신한 Web2.0 스타일의 로그인 윈도우를 볼 수 있게 된다.
이러한 방식은 애플리케이션에 팝업을 가져올 수 있고, 사용자들에게 웹 보다는 데스크탑 애플리케이션과 비슷한 것을 사용하고 있다는 인식을 줄 수 있다는 점이 매력적이다.
로그인 링크로그인 윈도우
체험하기 : http://www.muttmansion.com/lightbox/window/


이러한 방식으로 자신의 웹 페이지에 유저들의 관심을 효과적으로 끌 수 있는 방법들을 다루고 있는데, 모든 예제는 Prototype.js JavaScript 라이브러리를 기반으로 구현한다.
첫번째 예제는 너무나도 간단하다. 먼저, 보여줄 페이지(index.html)를 구성하되, 마우스가 롤오버 되었을 경우 효과를 보여줄 텍스트를 <div>태그로 감싸주고 이름을 설정한다. 두번째로 롤오버 되었을 경우에 보여줄 텍스트를 text.php에 추가한다. 세번째로, JavaScript를 정의하는데,

<script type="text/javascript">
new Ajax.Updater( 'popup1', 'text.php' );
new Tooltip('설정한 div 이름', 'popup1')
</script>

이것으로 끝이다. 너무나 간단하지 않은가- 자신의 블로그에 굳이 다른 페이지를 통해 표시할 필요가 없는 각종 Contents들은 이러한 방식으로 간단히 표현가능하게 해 주며, 사용자의 관심도 끌 수 있다.
이런식으로 페이지를 어지럽히지 않고 사용자들에게 Contents를 On Demand 방식으로 상세한 내용을 보여줄 수 있으며, 상세한 내용은 텍스트 뿐 아니라 이미지, 테이블 포멧팅 등이 될 수도 있다.

가장 기본적인 예제를 맛보았는데, 상단에서 볼 수 있는 다른 예제들은 IBM dW에서 직접 보도록 하자.
그 외에도 '페이더(fader) 메시지'에 대한 예제도 볼 수가 있는데 html과 JavaScript에 대한 기본적인 이해만 있으면 어렵지 않게 구현할 수 있을 것이다.
또한 이는 모듈 겸, 프레임웍 같이 되어 있어 활용성도 높을 듯 하다.
링크 : http://www.ibm.com/developerworks/kr/library/x-ajaxxml6/index.html

또한, 이것을 그대로 적용한 예제들도 볼 수가 있는데, 아래 링크를 따라가 보자.
링크 : http://www.huddletogether.com/projects/lightbox2/

각자 자신의 블로그에 멋진 이미지 갤러리 하나씩 삽입 해 보는것도 괜찮지 않을까 싶다.

선발 과정이 생각보다 꽤 길어져서 떨어졌구나 하고 생각했는데, 다행히도 선발되었다.
IBM 에서 모니터 요원을 할 때 부터 dW의 Article의 난이도에 대해 보고를 많이 올렸었는데,
내부적으로도 난이도 문제로 현업 개발자 외에 학생 개발자에게는 다가가기가 어렵다는 사실을 인지하였는지,
이번 Review Blogger를 통해, Article에 대한 접근도를 향상시켜보고자 하는 모양이다.
유명 포털 사이트에 배너광고도 좋지만, 가격대 성능비를 따져 보아도 그렇고,
이런 개발자들을 위한 자료는 리뷰가 있어야, 접근도가 좀 더 향상되지 않을까 하는 측면에서는 좋은 것 같다.
그런데 생각보다 선발자가 적다. 부담스러워 해야 하는 것인지, 좋아해야 하는 것인지 ㅎㅎ
담당 분야는 '웹개발, SOA와 웹서비스, XML'

아래는, IBM의 선발 발표 이미지 (클릭하면 본래 사이즈를 볼 수 있다)

사용자 삽입 이미지

링크 : http://www.ibm.com/developerworks/kr/event/reviewer/final.html

'일상다반사' 카테고리의 다른 글

논문, 취업, 그리고 진학.  (1) 2007.11.28
뉴욕의 프로그래머 (Programmer in New York)  (2) 2007.10.23
요즘,  (2) 2007.07.29
ROBOCODE KOREA CUP 64강 진출!  (2) 2007.07.27
IBM developerWorks 4월 정례모임  (2) 2007.04.24

사용자 삽입 이미지





사용자 삽입 이미지


















http://www.ibm.com/developerworks/kr/robocode/robocode_koreacup_4/robocode_koreacup_4_robocode_rumble_64.html

제출 이틀 전, 부랴부랴 급조한 로봇이 64강에 진출했다.
작년, 제작년 순위권 로봇들과의 전투결과가 썩 좋지 못해서 기대도 하지 않았는데, 그래도 64강에 올라가주다니 -_-
3개 로봇중에 1번 로봇이 올라갔다. 1번 로봇이 단체전용이고, 2번로봇이 개인전용, 3번 로봇은 학습로봇이다.
사실, 3번 로봇에 가장 큰 기대를 했었다. 다른 로봇과 싸우면서 한번 싸워본 로봇들의 패턴들을 인터넷에다가 기록을 하고, 매번 진화를 거듭하게 작성을 했었는데, 기록 부분을 찾아보니 하나도 없다.
제출을 잘못했던가, 아니면 오동작이 분명하다.
어쨌든 32강은 큰 꿈이 아닐까? 한 번만 이기면 32강이긴 하지만, 그래도 올해에는 참가자가 굉장히 많았다고 하는데, 64강까지 올라와 준 '찐찐'로봇에게 박수를.

'일상다반사' 카테고리의 다른 글

IBM developerWorks Review Blogger 선발~  (4) 2007.09.05
요즘,  (2) 2007.07.29
IBM developerWorks 4월 정례모임  (2) 2007.04.24
내가 이것 밖에 안되던가.  (1) 2007.04.18
PORTFOLIO  (0) 2007.03.10

Factored wall avoidance !! ㅋㅋㅋ

모두들 따라해 보자는 뜻에서 간단한 튜토리얼을...
번역 안된 영문주소 :
http://www-128.ibm.com/developerworks/library/j-fwa/

코너에 갇히거나 원하는 이동 방향에서 너무 많이 벗어나지 않으면서, 로봇과 벽 사이의 간격을 유지하는 알고리즘은 간단히 만들 수 없는 것 같다. 한 가지 간단한 솔루션으로, Factored wall avoidance가 있다.

With a few additions to the bot we built in "상대편의 움직임 추적하기"에서 구현했던 로봇에 몇 가지를 더 추가하여, 기존의 움직임 알고리즘 또는 문제가 많은 움직임 알고리즘에 Factored Wall Avoidance를 추가할 수 있다. Factored Wall Avoidance는 자신의 로봇과 벽의 근접성에 따라서 안전한 방향 설정(heading)으로 원하는 방향을 팩토링 함으로써 최상의 방향을 찾는 것이다

일반 수학적 계산에 헬퍼 메소드 추가하기

우선 자주 사용되는 수학적 알고리즘에 헬퍼 메소드를 로봇에 추가한다.

calculateBearingToXYRadians() 메소드는 java.lang.Math 메소드 atan2()를 사용하여 sourceX,sourceY에서 targetX,targetY까지 절대 위치(absolute bearing)를 계산한 다음, 이 값을 sourceHeading에 관련된 위치로 변환한다.

그리고 normalizeAbsoluteAngleRadians() 메소드와 normalizeRelativeAngleRadians() 메소드도 필요하다.

수학 헬퍼 메소드

private static final double DOUBLE_PI = (Math.PI * 2);
private static final double HALF_PI = (Math.PI / 2);

public double calculateBearingToXYRadians(double sourceX, double sourceY,
    double sourceHeading, double targetX, double targetY) {
        return normalizeRelativeAngleRadians(
           Math.atan2((targetX - sourceX), (targetY - sourceY)) -
               sourceHeading);
    }

public double normalizeAbsoluteAngleRadians(double angle) {
   if (angle < 0) {
        return (DOUBLE_PI + (angle % DOUBLE_PI));
    } else {
        return (angle % DOUBLE_PI);
    }
}

public static double normalizeRelativeAngleRadians(double angle) {
    double trimmedAngle = (angle % DOUBLE_PI);
    if (trimmedAngle > Math.PI) {
        return -(Math.PI - (trimmedAngle % Math.PI));
    } else if (trimmedAngle < -Math.PI) {
        return (Math.PI + (trimmedAngle % Math.PI));
    } else {
        return trimmedAngle;
    }
}

AdvancedRobot을 back-as-front 기능으로 확장하기

다음으로, 로봇을 반대로 이동시키기 위한 back-as-front 기능을 제공하기 위해 AdvancedRobot 클래스 기능을 몇 가지 헬퍼 메소드로 확장할 필요가 있다.

- getRelativeHeading() 메소드는 로봇의 현재 위치와 관련하여 정확한 방향을 계산한다.

- reverseDirection() 메소드는 매우 단순하다. direction 인스턴스 변수를 토글링(toggle) 하고 로봇의 방향을 바꾼다. 감속할 때에는 시간이 걸리기 때문에 로봇은 속도에 따라서, 방향을 바꾸기 전에 최대 네 개의 프레임까지 같은 방향으로 움직일 수도 있다.

- setAhead()와 setBack() 메소드는 AdvancedRobot 클래스에서 같은 이름의 메소드를 오버라이드 한다. 현재 방향에 대한 로봇의 속도를 설정하고, direction 인스턴스 변수를 필요에 따라 조정한다. 비례 연산은 로봇이 현재 움직이고 있는 방향과 관련이 있다.

- setTurnLeftRadiansOptimal()과 setTurnRightRadiansOptimal() 메소드는 (Math.PI / 2) 보다 크게 회전하여 로봇의 방향을 바꾼다. adjustHeadingForWalls 메소드를 사용할 때 이러한 메소드들을 사용해야 하는데, 나중에 설명하겠다.

로봇 헬퍼 메소드

public double getRelativeHeadingRadians() {
    double relativeHeading = getHeadingRadians();
    if (direction < 1) {
        relativeHeading =
                normalizeAbsoluteAngleRadians(relativeHeading + Math.PI);
    }
    return relativeHeading;
}

public void reverseDirection() {
    double distance = (getDistanceRemaining() * direction);
    direction *= -1;
    setAhead(distance);
}

public void setAhead(double distance) {
    double relativeDistance = (distance * direction);
    super.setAhead(relativeDistance);
    if (distance < 0) {
        direction *= -1;
    }
}

public void setBack(double distance) {
    double relativeDistance = (distance * direction);
    super.setBack(relativeDistance);
    if (distance > 0) {
        direction *= -1;
    }
}

public void setTurnLeftRadiansOptimal(double angle) {
    double turn = normalizeRelativeAngleRadians(angle);
    if (Math.abs(turn) > HALF_PI) {
        reverseDirection();
        if (turn < 0) {
            turn = (HALF_PI + (turn % HALF_PI));
        } else if (turn > 0) {
            turn = -(HALF_PI - (turn % HALF_PI));
        }
    }
    setTurnLeftRadians(turn);
}

public void setTurnRightRadiansOptimal(double angle) {
    double turn = normalizeRelativeAngleRadians(angle);
    if (Math.abs(turn) > HALF_PI) {
        reverseDirection();
        if (turn < 0) {
            turn = (HALF_PI + (turn % HALF_PI));
        } else if (turn > 0) {
            turn = -(HALF_PI - (turn % HALF_PI));
        }
    }
        setTurnRightRadians(turn);
}

Factored Wall Avoidance 추가하기

우리가 추가할 마지막 메소드는 adjustHeadingForWalls()이다.

이 메소드의 초반부는 벽과의 근접성에 기반하여 안전한 x,y 위치를 선택한다. (이것은 로봇의 현재 x 또는 y 좌표 또는 로봇이 벽에 가까이 있을 경우 중심점이 될 것이다.) 이 메소드의 후반부는 "안전한" 방향을 계산하고 로봇이 벽에 얼마나 근접해 있는가에 비례하여 원하는 방향으로 이를 팩토링 한다.

로봇이 벽으로 나아가는 정도는 WALL_AVOID_INTERVALWALL_AVOID_FACTORS 상수를 사용하여 조정될 수 있다.

벽 피하기 메소드

private static final double WALL_AVOID_INTERVAL = 10;
private static final double WALL_AVOID_FACTORS = 20;
private static final double WALL_AVOID_DISTANCE =
        (WALL_AVOID_INTERVAL * WALL_AVOID_FACTORS);

private double adjustHeadingForWalls(double heading) {
    double fieldHeight = getBattleFieldHeight();
    double fieldWidth = getBattleFieldWidth();
    double centerX = (fieldWidth / 2);
    double centerY = (fieldHeight / 2);
    double currentHeading = getRelativeHeadingRadians();
    double x = getX();
    double y = getY();
    boolean nearWall = false;
    double desiredX;
    double desiredY;

    // If we are too close to a wall, calculate a course toward
    // the center of the battlefield.
    if ((y < WALL_AVOID_DISTANCE) ||
            ((fieldHeight - y) < WALL_AVOID_DISTANCE)) {
        desiredY = centerY;
        nearWall = true;
    } else {
        desiredY = y;
    }
    if ((x < WALL_AVOID_DISTANCE) ||
            ((fieldWidth - x) < WALL_AVOID_DISTANCE)) {
        desiredX = centerX;
        nearWall = true;
    } else {
        desiredX = x;
    }

    // Determine the safe heading and factor it in with the desired
    // heading if the bot is near a wall
    if (nearWall) {
        double desiredBearing =
           calculateBearingToXYRadians(x,
                                       y,
                                       currentHeading,
                                       desiredX,
                                       desiredY);
        double distanceToWall = Math.min(
                Math.min(x, (fieldWidth - x)),
                Math.min(y, (fieldHeight - y)));
        int wallFactor =
                (int)Math.min((distanceToWall / WALL_AVOID_INTERVAL),
                              WALL_AVOID_FACTORS);
        return ((((WALL_AVOID_FACTORS - wallFactor) * desiredBearing) +
                 (wallFactor * heading)) / WALL_AVOID_FACTORS);
    } else {
        return heading;
    }
}

결론
나머지는 쉽다. 현재의 네비게이션 알고리즘을 사용하고 adjustHeadingForWalls() 메소드를 통해 그 결과를 제공함으로써 벽을 피할 수 있다.

벽 피하기 메소드
public void run() {
    while(true) {
        setTurnRightRadiansOptimal(adjustHeadingForWalls(0));
        setAhead(100);
        execute();
    }
}

끝이다.
간단하지만 효과적이지 않은가!!!!!
냐하하 -_-; 졸린다.... 내일 시험이 2개인데 ㅡㅜ

'프로그래밍' 카테고리의 다른 글

WebPage Redirect (MFC / API)  (0) 2007.05.16
SetTimer()  (0) 2007.05.14
우연히 보게 된 코드  (2) 2007.04.19
공사  (0) 2007.04.17
매시업 데이터  (0) 2007.04.15

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

확인

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

확인


IBM developerWorks
(이하 IBM dW)는 개발 입문자부터 고급 개발자까지 개발자를 위한 정보 포탈로
매주 새로운 최신 기술이나 자료/국내 개발자 소식 등을 제공한다.
여러가지 영역이 있는데, 그 중 기술영역에 포커스를 맞추어 보면 대략 다음과 같다.
그리드컴퓨팅, 리눅스, 무선기술, 오픈소스, 웹 아키텍처, 자바, 아키텍처, 자율컴퓨팅, SOA웹서비스와 같이 9개의 카테고리를 대 분류로 하여 기술/자료/소식 등을 포털을 통해 제공하고 있다.
그 외에도 로컬 컨텐츠 영역에는 국내 유명 개발자들이 릴레이식으로 인터뷰를 하고 있고, 컬럼란에는 개발자의 고민과 철학 등 일반 유저가 참여할 수 있는 공간도 마련하고 있는데, 아직은 인지도가 많지 않은 모양이다.

상반기 IBM dW의 대학생 1기 모니터 요원으로 간단한 설문을 해 보고자 합니다.
이 게시물을 보시는 대학생 여러분들의 많은 코멘트/트랙백을 조심스럽게 부탁드려 봅니다. (__)
성명 :
학교 :
학부/학과 :

1. 얼마나 오래 dW를 사용하셨습니까?
2. 언제 dW를 찾으십니까?
3. dW의 어느 contents를 가장 자주 이용하십니까?
4. 어떻게 dW를 알게 되셨나요?
5. dW로부터 무엇을 얻고자 하십니까?
6. 대학생들에게 dW가 한발 더 다가서기 위해 dW가 무엇을 해야 할까요?

'자유발언대' 카테고리의 다른 글

돌아오지 않는 2루주자 임수혁  (1) 2007.04.03
openAPI ? 메쉬업?  (0) 2007.03.27
갈대  (0) 2006.07.09
말이 필요할 때.  (0) 2006.07.08
종착역을 바라보며...  (2) 2006.06.17