내맘대로2008. 12. 23. 02:37

우리 은서가 태어난지 벌써 1년이 다 되어 간다...

2008년 1월 2일 태어나서 벌써 일년... 100일까지는 밤 낮이 바뀐 것 때문에 수면 부족이 일어나게 하더니

그 후로는 특별히 아픈데도 없이 잘 버티다가 얼마전에 원인불명 선천성 고관절 탈구라는 넘이 은서한테 찾아왔다

무려 3개월을 깁스하고 1년동안 보정기를 차고 있어야 한단다.. ㅡ_ㅡ;; 무려 15개월...

판정 받기 전까지도 아빠 엄마 말하고 혼자 잡고 일어나서 재롱 떨고 걷기까지 하는 한참 이쁠때 이렇게 되고나니

마음이 심히 아팠다... ㅠ_ㅠ

그래서 돌잔치도 취소할까 했는데 그래도 첫아이고 해주고 싶은 맘에 강행군...

다행히 은서가 깁스하고 잘 적응하고 있어서 그나마 불행중 다행이랄까?

한복입은 사진은 깁스하기 전 사진.. 이 사진도 다행히 깁스하기 전에 찍은;;;;

NIKON D300 | Aperture priority | Center-weighted average | 1/60sec | F/5.6 | 29.0mm | ISO-200


NIKON D300 | Aperture priority | Center-weighted average | 1/60sec | F/5.6 | 31.0mm | ISO-200


NIKON D300 | Aperture priority | Center-weighted average | 1/60sec | F/5.6 | 29.0mm | ISO-200



울 이쁜 은서 첫 돌잔치 인포메이숑~*

일시 : 2008년 12월 27일 토요일 늦은 6시

장소 : 분당 정자역 3번출구 오페라 하우스




Posted by 양군이당

댓글을 달아 주세요

내맘대로2008. 12. 17. 01:22
이번 WoC에도 JCO 에서 지원을 한다...

이런것도 WoC를 돕는 거겠지? ^^

About WoC
Posted by 양군이당

댓글을 달아 주세요

자바/Web2008. 12. 15. 20:29

기고한지 한달이 지나서 SDN에 올라와서 1.0 정식 버전이 발표된 후에야 이 글을 오픈한당. ㅡ_ㅡ;;

암튼 고고고~~~



필자는 작년부터 Web 2.0과 함께 부상한 RIA(Rich Internet Application)에 대해 귀가 따갑게 들어왔다. 필자가 현재 몸담고 있는 JCO내에서도 JCO가 직간접적으로 관여하는 각종 세미나 및 행사에서도 RIA는 큰 화두였으며 지금까지도 관심을 끄는 이슈로 부각되고 있다. 이런 이슈에 호응(?)하기 위해 Sun, Adobe, MS에서 JavaFX, Flex, Silverlight 라는 삼총사를 내놓았다. 세가지를 비교하는 것도 재미있는 일이겠지만 본인은 자바 프로그래머로만 10년 가까이 먹고 살았다. Silverlight는 어떤 것 이라는 것만 아는 편이고 Flex는 약간 끄적거려 보았다. 결국 가장 자신있는 Java 진영에서 나온 JavaFX 를 다루어 보기로 했다.

 

JavaFX를 처음 접한 것은 2007 JavaOne 이 끝난 후였다. 국내 유일의 자바 챔피언인 양수열 고문이(참고로 본인의 친형이다) JavaOne이 끝나고 귀국하고 만난 자리에서 JavaFX가 앞으로 엄청난 발전을 할 것이라고 흥분해서 말했던 기억이 있다. 그 후 몇 가지 관련된 글을 보았었고 2008 JavaOne에 운이 좋게 참석하게 되어 다시 보게 된 JavaFX는 정말 놀라울 정도로 발전해 있었다. 예전에 간단한 Flash ActionScript 같았던 모습에서 Multimedia 쪽이 대폭 강화되어 수많은 동영상이 화면에 Display되면서 자유롭게 떠도는 Demo를 보고 그 놀라운 Performance에 놀라움을 금치 못했다. 그러면서도 Demo가 일반적인 PC에서도 저만큼 가능할까?’ 라는 의문이 들었다. 그래서 결국 만들어 보게 되었으니

 

시작하기

JavaFX를 처음 접하면서 느낀점은 JavaFX 문법이 JavaScript와 상당히 닮아 있다는 점이었다. JavaScript Java의 절묘한 짬뽕(?)이랄까? JavaFX Application을 물론 메모장으로도 개발할 수 있지만 IDE에 길들여진 개발자들이 메모장으로 개발할리가 없다. 그리고 JavaFX를 전면에 내세운 Sun에서도 개발자들이 편하고 능률적으로 개발할 수 있도록 NetBeans 최신버전에 JavaFX plugin을 추가해 놓았다. 이전에는 JavaFX Pad라는 응용 프로그램을 활용했었으나 좀 더 융통성있고 편하게 개발할 수 있도록 NetBeans에 통합해 놓은 것이다. JavaFX Pad에서와 같이 Source Edit 창에서 코드를 변경하면 위쪽 Preview 영역에서 바로 변경된 결과물을 볼 수 있고 오른쪽 팔레트를 이용해 각종 콤포넌트나 노드 이벤트 등을 원클릭으로 소스에 적용할 수 있다.

NetBeans JavaFX plugin 설치는 신상철 박사님이 운영하시는 JavaPassion을 참고하면 편하게 설정할 수 있다. (http://www.javapassion.com/handsonlabs/javafx_basics1/)

 




[JavaFX plugin을 설치하고 실행중인 모습]

본론으로

JavaFX를 이용해 Multimedia 파일을 컨트롤 하기 위해 필요한 정보와 샘플들을 우선 수집하였다. 일차적으로 Sample Code를 몇 개 받아 mp3 파일을 재생하는 테스트 코드를 만들었을 때 mp3 파일은 아주 잘 재생되었다. 하지만 동영상 파일로 바꾸었을 때는 아래와 같은 에러를 발생시켰다.




FX Media Object caught Exception com.sun.media.jmc.MediaUnsupportedException: Unsupported media: file:/D:/Projects/NetBeans/SimpleMovie/build/classes/simplemovie/SoHot.avi

    source ='file:/D:/Projects/NetBeans/SimpleMovie/build/classes/simplemovie/SoHot.avi'

 

Exception의 이름으로 인해 해당 동영상 파일이 FX 에서 지원하지 않는 Media 형식인걸 확인하였고 빠르게 손가락은 구글링을 하여 JavaFX가 지원하는 미디어 포멧을 찾아내었다.

 

JavaFX Media 지원타입

  Container Types:

  ASF (Advanced Systems Format),MPEG-1, AVI (Audio-Video Interleaved),WAVE, MIDI (Standard MIDI)

  Encoding Types:

  WMAUDIO8 (WindowsMedia Audio 2/7/8),WMSCREEN (Windows Media Screen), WMVIDEO9 (Windows Media Video 9), Voxware, MS MPEG-4, WMVIDEO7 (Windows Media Video 7), MPEG11 Video, MPEG-1 Audio, Uncompressed video (RGB/YUV/RLE), PCM, ADPCM, MP3, MIDI

  Protocol Types:

  HTTP, FILE

  Known not to work at present are media with DRM (Digital Rights Management), and media played directly from DVD or CD.

 

Multimedia 파일을 컨트롤 하기 위해서는 항상 Codec이 문제인데 JavaFX에서는 생각보다 많은 종류의 Codec을 지원해주어 특별히 Codec에 신경 쓰지 않아도 되었다. (물론 가지고 있는 많은 수의 동영상은 실행되지 않았다.)

 

몇 가지 문제를 잡아나가면서 만들어 낸 결과물은 CustomNode를 사용해 재사용할 수 있는MediaViewNode를 만들었고 Timeline을 이용해 이 Node Animation 효과를 보여주는 프로그램을 만들어 보았다. 아래 소스를 실행하면 0.2 배율 스케일의 동영상 화면이 정지된 채로 실행되고 클릭시 회전하며 원래 비율로 커지고 실행되는 프로그램이다.

 

 

Source

/*

 * Main.fx

 *

 * Created on 2008. 11. 8, 오후 1:29:49

 */

 

package simplemovie;

 

import javafx.ext.swing.*;

import javafx.scene.*;

import javafx.scene.media.*;

import javafx.scene.effect.*;

import javafx.scene.paint.Color;

 

/**

 * @author eclips

 */

SwingFrame {

    title: "Movie Player"

    width: 800

    height: 600

    closeAction: function() {

        java.lang.System.exit( 0 );

    }

    visible: true

 

    menus: [  ]

 

    content: Canvas {

        width:800

        height:600

        background: Color.WHITE

        content: [

            MediaViewNode {

                // {__DIR__}은 클래스 파일이 있는 디렉토리이다

                mediaURL: "{__DIR__}Nobody.avi"

                viewX: 10

                viewY: 10

            }

        ]

    }

}

 

/*

 * MediaViewNode.fx

 *

 * Created on 2008. 11. 8, 오후 6:48:47

 */

 

package simplemovie;

 

/**

 * @author eclips

 */

 

import java.lang.System;

 

import javafx.scene.CustomNode;

import javafx.scene.*;

import javafx.input.*;

import javafx.scene.media.*;

import javafx.scene.effect.*;

import javafx.scene.paint.Color;

import javafx.scene.geometry.*;

import javafx.scene.transform.*;

import javafx.animation.Timeline;

import javafx.animation.KeyFrame;

import javafx.animation.Interpolator;

 

public class MediaViewNode extends CustomNode {

    /**

     * 동영상 화면의 X Sacle

     */

    public attribute viewScaleX:Number = 0.2;

   

    /**

     * 동영상 화면의 Y Scale

     */

    public attribute viewScaleY:Number = 0.2;

   

    /**

     * MediaViewNode의 회전 반경

     */

    public attribute rotation:Number = 0.0;

   

    public attribute viewX:Number = 50;

    public attribute viewY:Number = 40;

   

    /**

     * 현재 활성화 여부

     */

    private attribute actived:Boolean = false;

    /**

     * 현재 Animation 중인지 여부

     */

    private attribute moving:Boolean = false;

   

    private attribute media:Media;

    private attribute mediaView:MediaView;

   

    private attribute strokeColor:Color = Color.DARKGRAY;

   

    // 동영상 미디어 객체 URL

    public attribute mediaURL:String on replace {

        media = Media {

            source: mediaURL

        };

    }

   

    // Media Player 객체

    private attribute player =

        MediaPlayer {

            media: media,

            autoPlay: false

        }

 

   

    private attribute choiceTimeLine =

    Timeline {

        keyFrames : [

            KeyFrame {

                time: 0ms

                values: [

                    viewScaleX => 0.2,

                    viewScaleY => 0.2,

                    viewX => 10,

                    viewY => 10,

                    rotation => 0.0,

                    moving => true

                ]

            },

            KeyFrame {

                time : 500ms

                values: [

                    viewScaleX => 1.0 tween Interpolator.LINEAR,

                    viewScaleY => 1.0 tween Interpolator.LINEAR,

                    viewX => 40 tween Interpolator.LINEAR,

                    viewY => 40 tween Interpolator.LINEAR,

                    rotation => 360 tween Interpolator.LINEAR,

                    moving => false

                ]

                action: function():Void {

                    player.play();

                    mediaView.toFront();

                    actived = true;

                }

            }

        ]

    };

   

    private attribute unchoiceTimeLine =

    Timeline {

        keyFrames : [

            KeyFrame {

                time: 0ms

                values: [

                    viewScaleX => 1.0,

                    viewScaleY => 1.0,

                    viewX => 40,

                    viewY => 40,

                    rotation => 360,

                    moving => true

                ]

            },

            KeyFrame {

                time : 500ms

                values: [

                    viewScaleX => 0.2 tween Interpolator.LINEAR,

                    viewScaleY => 0.2 tween Interpolator.LINEAR,

                    viewX => 10 tween Interpolator.LINEAR,

                    viewY => 10 tween Interpolator.LINEAR,

                    rotation => 0.0 tween Interpolator.LINEAR,

                    moving => false

                ]

                action: function():Void {

                    player.pause();

                    mediaView.toBack();

                    actived = false;

                }

            }

        ]

    };

   

    public function create():Node {

        Group {

            content: [

                this.mediaView = MediaView {

                    mediaPlayer: player

                    scaleX: bind viewScaleX

                    scaleY: bind viewScaleY

                    translateX: bind viewX

                    translateY: bind viewY

                    transform: bind [Transform.rotate(rotation,200,150)]

 

                    onMouseEntered:

                        function(me:MouseEvent):Void {

                            strokeColor = Color.BLACK

                        }

                    onMouseExited:

                        function(me:MouseEvent):Void {

                            strokeColor = Color.DARKGRAY

                        }

                    onMouseClicked:

                        function(me:MouseEvent):Void {

                            System.out.println("clicked => " + actived);

                            if(moving == false) {

                                if(actived) {

                                    unchoiceTimeLine.start();

                                    System.out.println("inactive - " + viewScaleX);

                                }

                                else {

                                    choiceTimeLine.start();

                                    System.out.println("active - " + viewScaleX);

                                }

                            }

                        }

                },

                Rectangle {

                    width: 708

                    height: 472

                    scaleX: bind viewScaleX

                    scaleY: bind viewScaleY

                    translateX: bind viewX

                    translateY: bind viewY

                    stroke: strokeColor

                    strokeWidth: 10

                    transform: bind [Transform.rotate(rotation,200,150)]

 

                    onMouseEntered:

                        function(me:MouseEvent):Void {

                            strokeColor = Color.BLACK

                        }

                    onMouseExited:

                        function(me:MouseEvent):Void {

                            strokeColor = Color.DARKGRAY

                        }

                }

            ]

        }

    }

}

 

 

실행 결과

 

Clip을 클릭하면 해당 동영상 클립이 회전하면서 1:1 스케일로 커지면서 동영상이 실행된다.

 

 

아쉬운 것들

l  JavaFX Document의 부실함

n  작업을 위해 다운 받아 펼쳐본 Document는 한마디로 부실함이었다. 물론 아직 초기 버전이라 그런 것이라 생각되지만 현재의 Document는 그냥 어떤 것이 있다는 것을 설명하기 위해 만들어 놓은 수준이라고 봐야 할 것 같다. JDK SE 버전의 Document에 비하면 정말 완성도가 떨어졌다.

l  NetBeans JavaFX plugin

n  미디어 이름에 한글이 들어가거나 공백이 있을 경우 실행시 에러가 발생한다.

n  실시간으로 코딩시 에러 내용이 표시되는데 간혹 이런 에러 내용이 잘못 표시되는 문제

n  미디어의 이름을 바꿀 경우 간혹 미디어 적용이 안되 Rebuild 해야하는 불편함

n  소스에서 사용되는 클래스에 대해 자동으로 import 되지 않는 불편함

 이런 문제들은 앞으로 JavaFX 1.0 정식 버전이 나오고 plugin이 업그레이드 되면서 점점 좋아질 것이라고 생각하지만 아직까지는 약간의 불편함을 감수하고 개발해야 한다.

 

JavaFX로 간단한 동영상 실행 Application을 만들면서 어떻게 이렇게 간단할 수 있지? 하는 생각이 들었다. 이해하기 쉬운 코드 몇 줄로 꽤 대단한 애니메이션 효과를 줄 수 있었고 동영상 플레이도 코드 몇 줄로 끝났다. 자바 Application으로 만들려 했으면 엄청난 소스 코드 속에서 헤메야 간신히 나올만한 프로그램을 JavaFX의 스크립트 몇 줄이 해낸것이다. 물론 이런 힘이 JavaFX 에만 있는 것이 아니다. JavaFX가 경쟁하고 있는 Flex Silverlight도 비슷한 수준으로 지원하고 있거나 더 월등히 앞선 기능과 툴을 지원하고 있기도 하다. 지금 현재도 간단한 Application은 만들기 너무 쉽지만 정식 버전이 나올 시점이 되면 지금보다 모든 면에서 더욱 편하고 강력해져야 할 거라고 생각한다. 위쪽에서 지적한대로 Document도 현재 JDK 만큼 완성도가 높아져야 하며 IDE의 발전과 JavaFX가 적용될 수 있는 Platform도 더욱 넓어진다면 다양한 분야에서 JavaFX 가 활약하는 것을 볼 수 있을거라 생각한다.

 

참조사이트

http://www.javapassion.com/javafx/

http://www.javafx.com

http://java.sun.com/javafx/index.jsp

http://openjfx.dev.java.net

 

Posted by 양군이당

댓글을 달아 주세요

자바/Web2008. 12. 9. 17:19
아직 SDNKorea blog 에 올라가진 않았지만 JavaFX 를 이용해 동영상을 실행하는 글을 기고 했다.

해당 원고를 쓸때까지만 해도 JavaFX 가 정식이 아니었는데 오늘 간만에 들어가서 둘러보니

1.0 정식 버전이 릴리즈 되었다.

정식 전버전에는 정말 눈물날 정도로 API가 부실하고 자료도 없었는데

이번에 정식 릴리즈 되면서 다양한 샘플과 코드가 제공되고 무엇보다 달랑 한줄이나 설명도 안 붙어 있던 API가

정식으로 뜨면서 많이 정리가 되었다...

차라리 1.0 나온 다음에 기고를 할걸 그랬납다... ㅡ_ㅡ;;

JavaFX Script는 YahooUI 스크립트와 상당히 유사하게 닮아 있는데 이녀석이 Swing쪽과 짬뽕되면서

좀 더 복잡해져버려서 많이 헷갈렸는데 그나마 이제 API도 정리되고 샘플도 많이 생겨서 다행이다.

아래는 새로 나온 JavaFX 데모 캡쳐...




'자바 > Web' 카테고리의 다른 글

Web Project 에서 View에서 사용하는 파일에 대한 경로 설정 기준  (0) 2009.06.02
[SDN 기고] JavaFX 와 Multimedia  (0) 2008.12.15
드디어 JavaFX 1.0 정식 Release...  (0) 2008.12.09
Eclipse Ganymede 출동~  (0) 2008.07.02
JSON  (0) 2008.06.26
JSON vs XML  (0) 2008.06.26
Posted by 양군이당
TAG 1.0, JAVAFX

댓글을 달아 주세요

사진2008. 12. 4. 10:14

마눌님의 강력한 의지로 에버랜드로 달려갔다...

예전엔 정말 주말마다 거의 놀러다녔는데 그동안 많이 놀러다니지 못해 서운했던것 같다...

그래서 마눌님이 원하는대로 은서 데리고 어머님 모시고 에버랜드로 고고~~~

에버랜드는 한참 할로윈 축제 기간이라 다 할로윈 분위기로 꾸며져 있었다...

날씨도 살짝 쌀쌀하고 시끌시끌한 곳이라 은서가 좀 투정 부리지 않을까 했는데 다행히 잘 놀았다...

동물들을 보여주는게 좋을것 같아서 동물원 쪽을 살짝 돌고 할로윈 퍼레이드를 보기로 했다...

몇년간 에버랜드를 다녀봤지만 역시나 이번에도 아래쪽에 떨어진 주차장밖에 차를 댈수 없었다...

허구헌날 같은곳... ㅡ_ㅡ;; 막상 올라가보면 자리 있는데 겁나게 안 들여보내준다... 젠장...

암튼 주차장에 내려서 은서가 생기면서 늘어난 짐 한보따리를 내리고 유모차까지 바리 바리 내려서 이동버스 타고 고고~

입구 들어서서 행사 안내도를 슬찍 들었더니... 은서가 달랜다... ㅡ_ㅡ



NIKON D300 | Aperture priority | Pattern | 1/125sec | F/6.3 | 44.0mm | ISO-200

<음... 어디 한번 봐볼까~>


NIKON D300 | Aperture priority | Pattern | 1/320sec | F/6.3 | 46.0mm | ISO-200

<허어.. 재미있는게 많이 하네..>
대략 저러고 있다... 울 딸 자랑한다고 팔불출이랄지 모르지만.. 울 딸래미 좀 빠르다... ㅡ_ㅡ;;


NIKON D300 | Aperture priority | Pattern | 1/40sec | F/6.3 | 48.0mm | ISO-200

NIKON D300 | Aperture priority | Pattern | 1/160sec | F/6.3 | 62.0mm | ISO-200

에버랜드 동물쪽 라인을 안간동안 많이 정비해 깔끔해졌다.. 새들도 바로 볼 수 있고....



NIKON D300 | Aperture priority | Pattern | 1/320sec | F/6.3 | 62.0mm | ISO-200

동물들 보라고 하니 이렇게 좋댄다....


NIKON D300 | Aperture priority | Pattern | 1/400sec | F/6.3 | 35.0mm | ISO-200

호랭이도 보고....


NIKON D300 | Aperture priority | Pattern | 1/80sec | F/6.3 | 62.0mm | ISO-200

 북극곰도 보고... 그런데 이녀석 매우 구차니즘에 휩쌓였나부다... 저러고 고개만 돌리고 있다..


NIKON D300 | Aperture priority | Pattern | 1/160sec | F/6.3 | 50.0mm | ISO-200

신난 펭귄...


NIKON D300 | Aperture priority | Pattern | 1/160sec | F/6.3 | 25.0mm | ISO-200

중간에 호랭이 발바닥 봉을 하나 사줬더니 생각보다 잘 가지고 논다...


NIKON D300 | Aperture priority | Pattern | 1/100sec | F/5.6 | 70.0mm | ISO-200

여기 구차니즘에 빠진 녀석 하나 더 있다... 꼼짝도 안한다.... 이녀석을 본 울 은서의 표정은... ㅡ_ㅡ;;













NIKON D300 | Aperture priority | Pattern | 1/200sec | F/5.6 | 60.0mm | ISO-200

대략 이정도....??!!! ㅋㅋㅋ



NIKON D300 | Aperture priority | Pattern | 1/160sec | F/5.6 | 65.0mm | ISO-200

울 은서 외출 필수품 빵튀기를 안 가지고 왔다.. 파는데도 없고.. 좀 그렇긴 하지만 팝콘으로.. ㅡ_ㅡ;;



NIKON D300 | Aperture priority | Pattern | 1/125sec | F/5.6 | 38.0mm | ISO-200

할로윈 퍼레이드 기다리면서 할머니랑 한컷!!!



NIKON D300 | Aperture priority | Pattern | 1/200sec | F/5.6 | 60.0mm | ISO-200
NIKON D300 | Aperture priority | Pattern | 1/320sec | F/5.6 | 25.0mm | ISO-200

할로윈 퍼레이드가 시작됐다... 시끄러워서 은서가 울까봐 걱정했으나...





NIKON D300 | Manual | Pattern | 1/200sec | F/5.6 | 18.0mm | ISO-200

대략 이러고 본다... 좋댄다.. ㅡ_ㅡ;;;



NIKON D300 | Manual | Pattern | 1/200sec | F/5.6 | 18.0mm | ISO-200
NIKON D300 | Manual | Pattern | 1/160sec | F/5.6 | 18.0mm | ISO-200

< 좀 더해봐...> 이런 표정이다... ㅡ_ㅡ;;;



NIKON D300 | Manual | Center-weighted average | 1/160sec | F/5.6 | 29.0mm | ISO-200

간만에 가본 에버랜드 할로윈 퍼레이드 스케치당...


'사진' 카테고리의 다른 글

불량아빠 한테서도 은서는 잘 큰다.  (1) 2009.02.08
에버랜드 고고싱 (2008-11-02)  (0) 2008.12.04
용문산 단풍구경 (2008-10-18)  (0) 2008.12.04
은서가 이만큼 컸당!  (2) 2008.11.06
은서 100일 사진  (2) 2008.06.26
은서 50일 사진  (1) 2008.06.26
Posted by 양군이당

댓글을 달아 주세요

사진2008. 12. 4. 09:37
은서도 이제 어디 데리고 돌아다닐만큼 컸고 가을 단풍을 한번 보자는 목적으로 가뿐하게 용문산까지 갔다 왔다..

중간에 밥도 먹고 적당한 날씨에 적당히 진 단풍도 좋았는데 은서가 좀 투정을 부리긴 했다...^^

하지만 그것도 간단하게 해결되었다.. 아래 사진에서 바로 그 방법이 나온다.. ㅋㅋ

NIKON D300 | Aperture priority | Center-weighted average | 1/25sec | F/9.0 | 18.0mm | ISO-800

용문산 올라가는길에 간단한 간식거리와 기념품 파는 곳이 있다. 깔끔하게 기와로 만들어 놔서 좋다..^^



NIKON D300 | Aperture priority | Center-weighted average | 1/60sec | F/6.3 | 31.0mm | ISO-400

 이넘이 은서를 한방에 얌전하게 만들었다... 뻥튀기.. ㅡ_ㅡ;;; 울 은서 날 닮아서 그런지 먹을거 주면 조용하다...

 아직은 어려서 그냥 과자 주기는 좀 글코... 달지도 않고 깔끔한 뻥튀기 쵝오다... -_-)=b


NIKON D300 | Aperture priority | Center-weighted average | 1/25sec | F/11.0 | 18.0mm | ISO-400

 이 나무 용문산 가면 한번 볼만하다.. 얼마나 됐었더라.. ㅡ_ㅡ; 암튼 엄청 오래된 나무다... 오래된만큼 크다..


NIKON D300 | Aperture priority | Center-weighted average | 1/160sec | F/5.6 | 38.0mm | ISO-400

울 은서는 끝까지 먹는다... 손과 입에 먹을게 있으면 조용하다..ㅋㅋ


NIKON D300 | Aperture priority | Center-weighted average | 1/80sec | F/3.5 | 18.0mm | ISO-800

 은서 태어나고 처음 찍는것 같다... 물론 그전에도 거의 찍지 않았지만... 장인어른, 장모님, 마눌, 은서 나... 가족사진...

 카메라는 좋은거 사가지고 집에서 너무 썩혔나보다... 가족들이 다 같이 나들이 하면서 사진을 많이 남겨야 좋은건데...

 그동안 그렇게 살지 못했나보다... 난 사진 찍을때 이것저것 재면서 찍진 못한다.. ㅡ_ㅡ;; 구차니즘도 있지만 사진찍을때

 이것저것 재기보다는 주변사람들의 그 순간의 모습을 남기는게 중요하다고 생각한다.. 그런데 한동안 그것조차 못했다

 그동안 많이 찍던 마눌님도 못 찍어줬고 한집에 사는 어머님 아버님 조차도 거의 못 찍어드렸다.. 뭐하고 사는지..

 암튼 오랜만에 가족 소풍 잘하고 온 것 같다....

'사진' 카테고리의 다른 글

불량아빠 한테서도 은서는 잘 큰다.  (1) 2009.02.08
에버랜드 고고싱 (2008-11-02)  (0) 2008.12.04
용문산 단풍구경 (2008-10-18)  (0) 2008.12.04
은서가 이만큼 컸당!  (2) 2008.11.06
은서 100일 사진  (2) 2008.06.26
은서 50일 사진  (1) 2008.06.26
Posted by 양군이당

댓글을 달아 주세요

Database2008. 12. 4. 08:25

/*+ INDEX_DESC(table_alias_name index_name) INDEX_DESC(table_alias_name index_name) ... */
 
  지정된 index를 내림차순으로 쓰게끔 지정 합니다.
 
 
   SQL>SELECT /*+ index_desc(e1 pk_emp) index_desc(d1 pk_dep)*/  e1.empno, d1.depno
           FROM   emp e1, department d1
           WHERE  e1.empno = d1.empno and rownum = 1 ;

 

테이블 Join 시 Tablename 에 alias 를 줬을 경우 Hint 절에도 alias 이름을 줘야 한다.

 

원하는 순서대로 정렬하기 위해서는 메인 테이블을 기준으로 여러개의 hint를 줘야 한다.


Posted by 양군이당

댓글을 달아 주세요

Database2008. 12. 4. 08:24
출처 살아가는 이야기 | 서기
원문 http://blog.naver.com/tinylass/130009326659

<<Optimization Approaches and Goals - Optimization  접근과 목적>>
  

/*+ ALL_ROWS */
 
  ALL_ROWS는 Full Table Scan을 선호하며 CBO(Cost Based Optimization)는 default로
  ALL_ROWS를 선택 합니다.         
        
   SQL>SELECT /*+ ALL_ROWS */  ename, hiredate FROM emp  WHERE ename like '%%%'
       
Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=HINT: ALL_ROWS (Cost=1 Card=5 Bytes=80)
   1    0   TABLE ACCESS (FULL) OF 'EMP' (Cost=1 Card=5 Bytes=80)
 
 
 
/*+ CHOOSE */

  Hint Level의 CHOOSE는 RBO(Rule Based Optimization)인지 CBO(Cost Based Optimization)
  인지를 선택 합니다.

   만약 주어진 table의 통계 정보가 없다면 Rule Based 접근 방식을 사용 합니다.
 
 
 
/*+ FIRST_ROWS */

   Full Table Scan보다는 index scan을 선호하며
   Interactive Application인 경우 best response time을 제공 합니다.

   또한 sort merge join보다는 nested loop join을 선호 합니다.
 
   SQL>SELECT /*+ FIRST_ROWS */  ename FROM emp WHERE empno=7876
 
Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=HINT: FIRST_ROWS (Cost=1 Card=1 Bytes=20)
   1    0   TABLE ACCESS (BY INDEX ROWID) OF 'EMP' (Cost=1 Card=1 Bytes=20)
   2    1     INDEX (RANGE SCAN) OF 'PK_EMP' (UNIQUE) (Cost=1 Card=1)
 
 
 
/*+ RULE */

   Rule Based 접근 방식을 사용하도록 지정 합니다.



<<Access Methods - 접근 방법>>
 
 
/*+ CLUSTER(table_name) */

  Cluster Scan을 선택하도록 지정한다. 따라서 clustered object들에만 적용 됩니다.
 

 
/*+ FULL(table_name) */

  Table을 Full Scan하길 원할 때 사용 합니다.

 

/*+ HASH(table) */

  Hash scan을 선택하도록 지정한다.
  이 hint는 HASHKEYS parameter를 가지고 만들어진 cluster내에 저장된 table에만 적용이 됩니다.
 
 

/*+ INDEX(table_name index_name) */

  지정된 index를 강제적으로 쓰게끔 지정 합니다.
 
 
 
/*+ INDEX_ASC(table_name index_name) */

  지정된 index를 오름차순으로 쓰게끔 지정 합니다.
  Default로 Index Scan은 오름차순 입니다
 

 
/*+ INDEX_DESC(table_name index_name) */
 
  지정된 index를 내림차순으로 쓰게끔 지정 합니다.
 
 
   SQL>SELECT /*+ index_desc(emp pk_emp) */  empno
           FROM   emp
           WHERE  rownum = 1 ;
        
    위 문장은 제일 큰 것 하나만 조회되므로, max function의 기능을 대신할 수 있습니다.    



 /*+ INDEX_FFS(table index) */

  Full table scan보다 빠른 Full index scan을 유도 합니다.
 
 

/*+ ROWID(table) */

  Rowid로 Table Scan을 하도록 지정 합니다.



<<Join Orders>>


/*+ ORDERED */

  From절에 기술된 테이블 순서대로 join이 일어나도록 유도 합니다.

 



<<Join Operations>>
 
 
/*+ USE_HASH (table_name) */

  각 테이블간 HASH JOIN이 일어나도록 유도 합니다.
 
 

/*+ USE_MERGE (table_name) */

  지정된 테이블들의 조인이 SORT-MERGE형식으로 일어나도록 유도 합니다.



<<Parallel Execution>>
 
 
/*+ NOPARALLEL(table_name) */
 
  NOPARALLEL hint를 사용하면, parallel query option을 사용하지 않도록 할 수 있다.
 
  SQL>SELECT /*+ NOPARALLEL */ *  FROM emp;
 
 
 
/*+ PARALLEL(table_name, degree) */
 
  PARALLEL hint를 사용하면 query에 포함된 table의 degree를 설정할 수 있습니다.
 
  예를 들어, 다음과 같이 hint를 적어 degree 4로 parallel query option을  실행하도록 할 수 있습니다.
  이 때 parallel이란 글자와 괄호( '(' )사이에 blank를 넣지 않도록 주의해야 합니다.
  
  SQL>SELECT /*+ PARALLEL(emp, 4) */   * FROM emp;
 
 
 
* DEGREE의 의미 및 결정
 
Parallel Query에서 degree란 하나의 operation 수행에 대한 server process의 개수 입니다.
이러한 degree 결정에 영향을 주는 요인들에는 다음과 같은 것들이 있습니다.
 
(1)  system의 CPU 갯수
(2)  system의 maximum process 갯수
(3)  table이 striping되어 있는 경우, 그 table이 걸쳐있는 disk의 갯수
(4)  data의 위치 (즉, memory에 cache되어 있는지, disk에 있는지)
(5)  query의 형태 (예를 들어 sorts 혹은 full table scan)
 
한 사용자만이 parallel query를 사용하는 경우, sorting이 많이 필요한
작업과 같은 CPU-bound 작업의 경우는 CPU 갯수의 1 ~ 2배의 degree가 적당하며,
sorting보다는 table scan과 같은 I/O bound 작업의 경우는 disk drive 갯수의 1 ~ 2배가 적당합니다.
 
동시에 수행되는 parallel query가 많은 경우에는 위의 각 사용자의 degree를
줄이거나 동시에 사용하는 사용자 수를 줄여야 합니다.

Posted by 양군이당
TAG hint, oracle

댓글을 달아 주세요

  1. Sid.K

    깔끔한 요약이네요. 감사합니다~~

    2009.01.15 12:56 [ ADDR : EDIT/ DEL : REPLY ]

Database2008. 12. 4. 08:23
출처 r/oØ\ㄹı`s Blog | 아프리카
원문 http://blog.naver.com/greatysi/80021854335


1. CLOB Table 생성.

SQL> create table test_table ( content clob );

Table created.

2. 문자열 데이터 입력.

SQL> INSERT INTO test_table

                          (

                            content

                          )

             VALUES (

                            'aa bb cc'

                          );

1 row created.

SQL> INSERT INTO test_table

                          (

                            content

                          )

             VALUES (

                            'dd ee ff'

                          );
1 row created.

 

3. CLOB Table 검색.

 

  SELECT *
     FROM test_table

   WHERE DBMS_LOB.INSTR( content, 'aa' )>0;

 

 

'test_table'의 'content' 라는 필드에서 'aa' 라는 단어가 들어가 있는 row를 보여준다.

 


Posted by 양군이당
TAG clob, oracle

댓글을 달아 주세요

Database2008. 12. 4. 08:20

출처 on2uu의 블로그 | 이지
원문 http://blog.naver.com/on2uu/80028673610

[ORACLE]SQL*Plus에서 특수문자 INSERT하기 (&)

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
◎ 범례
──────────────────────────────────────────────
   대문자 : Reserved Word (오라클 예약어)
   소문자 : User Define (사용자가 직접 입력해야 하는 부분)
   [ ] : Option (지정하지 않아도 되거나 생략시 기본 설정값으로 대체됨)
   or : Choice(여러가지중 하나를 선택한다)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━


오라클의 SQL*Plus에서는 Substitution Variable을 이용하여 외부에서 값을 입력 할 수 있도록

하고 있다.

그 Default 문자를 & 로 사용하고 있으며 이 &가 사용되면 SQL*Plus는 사용자에게 해당하는 값을 입력하도록 기다리고 있게 된다.

 

예를 들어

INSERT INTO TEMPTBL (COL1) VALUES ('YOU&I')를 실행 하게되면 SQL*Plus는

Enter value for i: 와 같은 메시지를 나타내며 값을 입력할때 까지 기다리게 된다.

 

그러나 실제는 'YOU&I'라는 값이 전체적으로 입력 되어져야 하는것과 같이 특수 문자를 INSERT, UPDATE해야 하는 경우가 발생하게 되고 UPDATE, DELETE등의 WHERE절에도 값에 &등 특수

문자가 있다면 오류 또는 원하지 않는 결과를 얻게 된다.

 

──────────────────────────────────────────────

이러한 문제를 해결하기 위하여 다음의 3가지 방법이 있을 수 있다.

 

1. Substitution Variable 기능을 중단시킨 후 INSERT, UPDATE, DELETE한다.

   SET DEFINE OFF 또는 SET SCAN OFF명령을 실행하여 Substitution Variable기능을
   중단 시킨다.
  
   예제)
  
   SQL> set define off
   SQL> INSERT ITO TEMPTBL (COL1) VALUES ('YOU&I');
  
   1 row created.

   SQL> SELECT * FROM TEMPTBL;
  
   COL1
   ---------------
   YOU&I


2. Substitution Variable를 다른 문자로 지정하여 처리한다.

   SET DEFINE을 이용하여 Substitution Variable 문자를 다른 문자로 지정한다.
  
   예제)
  
   SQL> set define #
   SQL> INSERT ITO TEMPTBL (COL1) VALUES ('YOU&I');
  
   1 row created.

   SQL> SELECT * FROM TEMPTBL;
  
   COL1
   ---------------
   YOU&I


3. ESCAPE 문자를 지정하여 특수문자를 특수 기능이 아닌 문자로 인식하도록 한다.

   기본적으로 SQL*Plus는 \(Back Slash) 문자를 ESCAPE문자로 지정되어 있으며
   ESCAPE기능은 OFF로 지정되어 있다.
  
   (SHOW ESCAPE 명령을 이용하여 ESCAPE ON/OFF 상테를 알 수 있다
   SQL> show escape
   escape OFF <---- ESCAPE Mode가 OFF 되어 있다.)
  
   SET ESCAPE ON 명령을 이용하여 ESCAPE문자를 쓸 수 있도록 한다.

   SQL> set escape on
   SQL> show escape
   escape "\" (hex 5c) <---- ESCAPE Mode가 동작중이며 \ 으로 지정되어 있다.
   SQL> INSERT ITO TEMPTBL (COL1) VALUES ('YOU\&I');
  
   1 row created.

   SQL> SELECT * FROM TEMPTBL;
  
   COL1
   ---------------
   YOU&I

Posted by 양군이당

댓글을 달아 주세요