선행 작업으로 Tibero가 설치된 서버에 Oracle Client 설치필요(같은 서버에 이미 오라클이 설치 되어 있으면 불필요)



1. Tibero 계정 .bash_profile파일 내용에 Oracle Client 환경변수 추가


   export TB_HOME=/home/tibero/tibero6

   export TB_SID=nextbsc

   export LD_LIBRARY_PATH=$TB_HOME/lib:$TB_HOME/client/lib

   export LANG=ko_KR.UTF-8

   export TBGW_HOME=$TB_HOME/client/gateway

   export ORACLE_BASE=/oracle11

   export ORACLE_HOME=/oracle11/opt

   export ORACLE_SID=orcl949

   export ORACLE_OWNER=oracle11

   export ORA_NLS10=$ORACLE_HOME/nls/data

   export TMPDIR=$ORACLE_BASE/tmp

   export NLS_DATE_FORMAT=YYYYMMDD

   export TMP=$ORACLE_BASE/tmp

   export TNS_ADMIN=$ORACLE_HOME/network/admin

   export NLS_LANG=KOREAN_KOREA.KO16MSWIN949

   export ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data

   export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib:$ORACLE_HOME/lib32:/usr/lib

   export SHLIB_PATH=$ORACLE_HOME/lib:$ORACLE_HOME/lib32:/usr/lib

   export PATH=$PATH:$TB_HOME/bin:$TB_HOME/client/bin:$ORACLE_HOME/bin:/usr/sbin:$PATH


   alias tblog='cd ${TB_HOME}/instance/$TB_SID/log'

   alias tbcfg='cd $TB_HOME/config'

   alias tbcfgv='vi $TB_HOME/config/$TB_SID.tip'

   alias tbi='cd ~/tbinary'




2. Oracle Client 권한변경


   chmod o+rx $ORACLE_HOME

   chmod o+rx $ORACLE_HOME/lib

   chmod o+r $ORACLE_HOME/lib/*

   chmod o+x $ORACLE_HOME/network

   chmod o+x $ORACLE_HOME/network/admin

   chmod o+r $ORACLE_HOME/network/admin/tnsnames.ora

   chmod -R o+rx $ORACLE_HOME/nls

   chmod -R o+rx $ORACLE_HOME/oracore

   chmod o+x $ORACLE_HOME/sqlplus

   chmod o+x $ORACLE_HOME/sqlplus/mesg

   chmod o+rx $ORACLE_HOME/sqlplus/mesg/*


 


3. Gateway Binary 복사


  cp $TB_HOME/client/bin/gw4orcl_11g $TBGW_HOME/gw4orcl

  (Oracle Client가 10g면 gw4orcl_10g)


  ldd $TBGW_HOME/gw4orcl

  (Not found 여부 확인)



 

4. Network Alias 설정


   vi $TB_HOME/client/config/tbdsn.tbr


   orcl10=(

            (GATEWAY=

               (LISTENER=

                  (HOST=192.168.0.242) # Tibero서버 IP(Host명 불가, 꼭 IP만 기록해야됨)

                  (PORT=9999) # 로그 기록포트

               )

               (TARGET=NEXTBSC_10g) # Oracle Client에 tnsnames.ora 접속하고자 하는 타켓명(Alias명)하고 같아야함

               (TX_MODE=GLOBAL)

            )

   )


 


 

5. Gateway 환경설정


   vi ${TB_HOME}/client/config/tbgw.cfg


   LOG_DIR=$TBGW_HOME/oracle/log

   LOG_LVL=2

   LSNR_PORT=9999 # 위 4번에서 설정한 같은 port

   MAX_LOG_SIZE=1000

   MAX_LOG_CNT=5

   FETCH_SIZE=32000




6. Database Link 생성 및 Test


   CREATE DATABASE LINK <DB LINK명> CONNECT TO <USER명> IDENTIFIED BY '<PASSWORD>' USING '<NETWORK ALIAS명>';

   SELECT COUNT(*) FROM NG02_MEMBER_INFO@<DB LINK명>;

블로그 이미지

유효하지않음

,

온나라 연계시 기존 WebLogic서버와는 문제없이 서비스 연동이 되었는데

서버가 Jeus인경우 문제점이 발생하였음.

해서 온나라헬프데스크에 문의했는데 Jeus전용 클라이언트 lib(jar)파일을 사용해야 된다더군요

(잘 모르셔서 하는이야기 겠죠..?!!)


아무튼 Tmax에서 도움을 받았지만 사실 많은 도움되지 않네요~~~.(어차피 유지보수 role은 아니니...)

Jeus쪽 lib를 하나하나 압축을 풀어보면 Apache Axis 1.x를 사용하는걸로 확인 되고....


음..... 점검사항만 간단히 기록 하겠습니다.


1. wsdl을 이용해서 ant로 패키징 완료(문제 없어야 됨)

2. weblogic 의 경우와 다르게 서버가 jeus면 package path 및 class명이 변경됩니다.


3.1 Tomcat lib쪽 등록(Jeus 5 Fix 27 서버가 제우스인 경우)

     jaxb-api.jar

     jaxb-impl.jar

     jaxb-libs.jar

     jeus.jar

     jeusjaxb.jar

     jeusutil.jar

   추가 Lib

     FastInfoset-1.2.9.jar

     mail.jar


  서비스 호출시  : QName qname = new QName("http://hamoni.mogaha.go.kr/bms", "BmsSifComServiceIFPort");

  핸들러 파일 다운로드시 : operElement.getElementQName().getLocalPart().endsWith("getExchangeFileReturn")


3.2  Tomcat lib쪽 또는 WebRoot/WEB-INF/lib쪽 (Weblogic 8.x 서버가 웹로직인 경우)

     weblogic.jar

     webserviceclient.jar

     webservices.jar

  서비스 호출시 : QName qname = new QName("http://hamoni.mogaha.go.kr/bms", "BmsSifComServicePort");

  핸들러 파일 다운로드시 : operElement.getElementName().toString().endsWith("getExchangeFileResponse")


6. 운영 구성은 아래와 같으나 개발PC에서도 문제없이 작도 되었음

  - OS : CentOS(Linux nextBscAP 3.10.0-229.4.2.el7.x86_64 #1 SMP Wed May 13 10:06:09 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux)

  - Java : java version "1.6.0_45"

           Java(TM) SE Runtime Environment (build 1.6.0_45-b06)

           Java HotSpot(TM) 64-Bit Server VM (build 20.45-b01, mixed mode)

  - Was  : Apache Tomcat 6.0.41



위 환경으로 서비스 문제없이 잘 작동하고 있습니다.

  - Tomcat 6.x(Jeus client lib)     -> Jeus, Weblogic(테스트 해보지 않음)

  - Tomcat 6.x(Weblogic client lib) -> Jeus, Weblogic


Qname의 LocalPart명을 제대로 기록하고 해당 lib가 제대로 설치되면 문제가 없는것 같습니다.

블로그 이미지

유효하지않음

,

**Vbox에 Xpenology_5.0-4458 설치


1. 준비물

  - gnoboot-alpha10.5.7z                          http://www.gnoboot.me/

  - winima90.zip                                       : http://www.winimage.com/

  - SynologyAssistantSetup-5.0-4448.exe    : http://www.synology.com/ko-kr/support/download/DS3612xs

  - DSM_DS3612xs_4458.pat                     : http://ukdl.synology.com/download/DSM/5.0/4458/


해당 링크에 관련 파일을 직접 다운로드 하거나 

https://drive.google.com/file/d/0B1YEQASgCZq8ZXQ1UE41MnNta28/edit?usp=sharing   

이 파일을 직접 다운받아 작업하면 된다.


  

gnoboot-alpha10.5.7z(압축해제 비밀번호 : 6n0boot-AlpHaTen.5) , winima90.zip 적당한 곳에 압출을 푼다.

   winimage를 실행하고 gnoboot-alpha10.5-vfat.img 파일을 읽어 드린다.


* 그냥 OK 클릭해주시고


* gnoboot-alpha10.5-vfat.img 내에 menu_alpha.lst 파일을 적당한 곳에 압축을 푼다.



menu_alpha.lst 파일을 에디터로 연후 7번째 라인에 sn=8CKIN00001 추가해준다. 8CKINxxxxx -> xxxxx는 모두 숫자만


menu_alpha.lst 수정한 파일을 드래그해서 다시 덮어쓰기하고 저장한다.




*Vbox를 실해하여 64bit 가상 머신 만들기를 시작한다.

* 중요(CMOS 설정) : 32bit 머신만 선택될 경우

   - CMOS Bios설정 부분에 Intel CPU 의 경우 VT-x, AMD CPU 의 경우 AMD-v 활성화 해야함

   - Vbox와 Windows 8.x에 Hyper-V 동시사용 불가함(Execute Disable Bit : 활성/비활성 문제)



*메모리는 512M이상으로 설정해 주시고


* 가상머신 만들기를 시작한다.





* 용량은 최소 8GB 이상으로 설정해줘야함.

* 중요 : 테스트 한다고 4GB로 설정했다가 완전 삽질했네..  pat 파일 설치시 아래 메세지를 볼수 있음...


무선 네트워크 연결을 통해 설치를 수행하고 있다면, DiskStation과 PC 클라이언트를 모두 이더넷 케이블 연결로 전환하고 

다시 시도하십시오.

설치 도중 오류가 발생했습니다. 오류 결정을 위해 DiskStation의 Telnet 서비스가 켜져 있습니다. 

포트 23을 DiskStation으로 전달할 수 있도록 라우터를 구성한 후, Synology 온라인 지원 부서로 문의 하십시오.



* 여기까지만 진행해 주시고 잠시..



* cmd 를 실행한 후 vbox 설치 폴더에서 vboxmanage로 이미지 변경 작업을 해준다.

* 생성된 xpenology_vbox.vdi 파일을 xpenology_vbox_bak.vdi 으로 복사함(추후 사용될 목적으로)



* 부팅이 가능하도록 생성된 이미지를 선택한다.



* 선택한 부팅용 이미지를 하다 디스크 속성을 IDE 프라이머리 마스터로 선택해 준다. 선택이 되지 않으면 Xpenology_5.0-4458.vdi

를 변경후 선택하면 됨.



* 네트워크 어댑터 브리지 어댑터로 선택함. 맥 주소도 확인해 주시고(틀릴수도 있으니 메모장에 복사만 해 놓자)



* 이제 시작버튼을 클릭하여 부팅시작



* 초기 인스톨시는 gnoboot.me 선택하고 엔터



* 해당 버전을 선택해주시고 엔터



* DiskStation login 확인되면 부팅완료

* URL 메모장 기록(DSM 설치시 필요)



* DSM 설치 방법은 2가지가 있다. Synology Assistant로 설치하는 방법하나.

  브라우저에서 Web Assistant 설치하는 방법 하나

* 둘중 한가지 방법으로만 설치한다.


Synology Assistant 인스톨 하면 바탕화면에서 Synology Assistant 아이콘을 클릭한다.

* 올라온 DiskStation을 확인할 수 있으며 마우스 오른쪽 클릭하여 install을 진행한다.



* 4458버전의 DSM파이을 선택해준다.



* 버전이 맞는지 다시한번 확인해 주고..


* 관리자 비밀번호와 서버명을 기록한다. 

* SSH/Telnet 접속시 기록한 비밀번호는 동일하게 구성된다.


* IP 설정해 주시고


* 인스톨진행......


* 완료...



* 브라우저에서 Web Assistant 설치하는 방법

 (Synology Assistant 통해 설치 진행 했으면 이부분은 건너뛰고 재 부팅화면으로 넘어간다.)

* 기록했던 URL로 접속을 하면 인스톨 화면을 볼 수 있다.


* DSM 파일 선택


* 해당버전을 선택한다.



* 비밀번호와 서버이름 입력

* SSH/Telnet 접속시 기록한 비밀번호는 동일하게 구성됨.




* 재부팅 화면

* Synology Assistant 또는 Web Assistant 설치후 Vbox실행창을 보면 Error 22가 나올수도 있다 내 경우엔 없었지만..

이런 에러 메세지가 나오면 추가로 복사 했던 xpenology_vbox_bak.vdi 파일 xpenology_vbox.vdi로 다시 덮어쓰고

다시 부팅을 시작한다.



* 이제는 설치가 완료 되었으니 첫번째 메뉴인 gnoboot-alpha를 선택하여 부팅


* 두번째 메뉴도 gnoboot-alpha를 선택 ...


* 설치 완료후 부팅되는 모습...


* 부팅이 완료되면 Web Assistant의 설치화면이 환영합니다로 변경됨.

* Synology Assistant 설치했으면 브라우서에 해당 IP와 PORT 기록하여 접속


* 귀찮아서 그냥 건너뜀...


* 선택해주고 이동함.



* 선택해주고 확인..


* 필요한 App설치 

* Download Station, Audio Station, Photo Station, Video Station, Surveillance Station, Plex Media Server 등...



* 설치된 App 확인


* 설치된 App 확인



* File Station에서 넥트워 드라이브 마운트 화면


* WebDAV 활성화


* SSH 서비스 활성화


* Web Station 활성화


* 계정 추가


* 추가될 계정의 정보 등록


* 추가될 계정의 그룹정보 연결


* 추가될 계정의 공유 디렉토리 권한설정


* 추가될 계정의 사용량 활성화


* 추가될 계정의 App 허용정보 등록


* 추가될 계정의 속도제한 등록


* 추가된 계정의 정보확인



* 응용 프로그램 포털에 해당 App 접속 포트 등록





* File Station 접속화면



* 윈도우 탐색기에서 네트워크 드라이브 연결



* DS관련 안드로이드 App

* DS File을 App으로 접속한 화면

* 안드로이드 탐색기 App인 X-plore에서 WebDAV로 접속한 화면


* DS video App으로 스트리밍 동영상 감상

* Plex App 유료네...




IP WebCam도 연결 가능하고 다른 App들도 많고 좋네... PC에 리눅스 설치해서 삽질 할 필요가 없어서 편함..


블로그 이미지

유효하지않음

,

라즈베리 파이에 카메라 모듈+문자인식 관련 설치 목적으로 한번 컴파일 해봄

아~ 정말... 내 일도 아닌데 간만에 삽질했네.. 시간되면 정리하고 우선 여기까지만....


Ubuntu-12.04.4-desktop-amd64로 작업함


** 관련 패키지 설치

$ sudo apt-get install build-essential

$ sudo apt-get install cmake

$ sudo apt-get install git

$ sudo apt-get install g++-arm-linux-gnueabi

$ sudo apt-get install gcc-arm-linux-gnueabi

$ sudo apt-get install g++-arm-linux-gnueabihf

$ sudo apt-get install gcc-arm-linux-gnueabihf

$ sudo apt-get install cmake-curses-gui

$ sudo apt-get install libpng12-dev

$ sudo apt-get install libjpeg62-dev 

$ sudo apt-get install libtiff4-dev

$ sudo apt-get install zlib1g-dev

$ sudo apt-get install autoconf automake libtool autotools-dev




** 혹씨모를 컴파일시 오류발생 방지를 위해 계정의 .bashrc 에 추가함
export LD_LIBRARY_PATH="/usr/local/lib:/usr/local/arm/opencv/lib:/usr/local/arm/leptonica/lib:/usr/local/arm/tesseract-ocr/lib:$LD_LIBRARY_PATH"



** 패키지 다운로드 디렉토리 생성(계정의 홈디렉토리에서 생성함)

$ pwd

/home/계정명


$ mkdir down

$ cd down




** opencv 소스 다운로드

wget http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/2.4.9/opencv-2.4.9.zip

$ unzip opencv-2.4.9.zip


** ARM gcc 컴파일 버전 확인(주버전.부버전만 확인한다 4.8)

$ arm-linux-gnueabihf-gcc --version

arm-linux-gnueabihf-gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3

Copyright (C) 2011 Free Software Foundation, Inc.

This is free software; see the source for copying conditions.  There is NO

warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


arm-linux-gnueabihf-gcc (Ubuntu/Linaro 4.8.2-16ubuntu4) 4.8.2

Copyright (C) 2013 Free Software Foundation, Inc.

This is free software; see the source for copying conditions.  There is NO

warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.





** opencv 컴파일 버전 변경

$ pwd

/home/계정명/down


$ vi opencv-2.4.9/platforms/linux/arm-gnueabi.toolchain.cmake

5라인 정도에...

set(GCC_COMPILER_VERSION "4.6" CACHE STRING "GCC Compiler version")

--> set(GCC_COMPILER_VERSION "4.8" CACHE STRING "GCC Compiler version")




** opencv 빌드 디렉토리 생성

$ cd

$ cd down

$ mkdir build

$ cd build

$ pwd

/home/계정명/down/build




** opencv 컴파일 옵션 설정

$ rm -rf CMakeCache.txt

$ cmake \

    -DCMAKE_INSTALL_PREFIX=/usr/local/arm/opencv \

    -DWITH_FFMPEG=ON \

    -DWITH_JASPER=ON \

    -DWITH_JPEG=ON \

    -DWITH_PNG=ON \

    -DWITH_TIFF=ON \

    -DWITH_VFW=ON \

    -DWITH_WEBP=ON \

    -DWITH_TBB=ON \

    -DWITH_V4L=ON \

    -DWITH_OPENEXR=ON \

    -DWITH_OPENGL=ON \

    -DBUILD_JASPER=ON \

    -DBUILD_JPEG=ON \

    -DBUILD_PNG=ON \

    -DBUILD_OPENEXR=ON \

    -DBUILD_PACKAGE=ON \

    -DBUILD_TIFF=ON \

    -DBUILD_WITH_DEBUG_INFO=ON \

    -DBUILD_WITH_STATIC_CRT=ON \

    -DBUILD_ZLIB=ON \

    -DBUILD_EXAMPLES=ON \

    -DBUILD_NEW_PYTHON_SUPPORT=ON \

    -DINSTALL_PYTHON_EXAMPLES=ON \

    -DINSTALL_C_EXAMPLES=ON \

    -DSOFTFT=ON \

    -DUSE_NEON=ON \

    -DCMAKE_TOOLCHAIN_FILE=../opencv-2.4.9/platforms/linux/arm-gnueabi.toolchain.cmake \

    ../opencv-2.4.9



** opencv 컴파일 수행, 설치

$ make

$ sudo make install




** opencv cross 컴파일된 오브젝트 버전확인(32bit ARM, 확인해 보니 git로 받은 opencv는 3.0 인가보네...)

cd /usr/local/arm/opencv/lib

file libopencv_videostab.so.2.4.9 

libopencv_videostab.so.2.4.9: ELF 32-bit LSB  shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, BuildID[sha1]=8be58a40b52473a2002b969a369fabf1b4aeba8d, not stripped



** 문자인식 관련 패키지  디렉토리 생성(계정의 홈디렉토리에서 생성함)

$ cd

$ cd down

$ mkdir ocr

$ cd ocr

$ pwd

/home/계정명/down/ocr




** 문자인식 관련 패키지 다운로드

$ wget http://www.leptonica.org/source/leptonica-1.70.tar.gz

$ wget https://tesseract-ocr.googlecode.com/files/tesseract-ocr-3.02.02.tar.gz

$ wget https://tesseract-ocr.googlecode.com/files/tesseract-ocr-3.02.kor.tar.gz




** 문자인식 관련 패키지 압축풀기

$ tar xvf tesseract-ocr-3.02.02.tar.gz

$ tar xvf tesseract-ocr-3.02.kor.tar.gz

$ tar xvf leptonica-1.70.tar.gz




** leptonica 패키지 이동

$ cd leptonica-1.70

$ pwd

/home/계정명/down/ocr/leptonica-1.70




** leptonica 컴파일 옵션 정의

CC="arm-linux-gnueabihf-gcc" CXX="arm-linux-gnueabihf-g++" \

./configure \

    --prefix=/usr/local/arm/leptonica \

    --target=arm-linux \

    --host=arm-linux




** leptonica 컴파일 수행, 설치

$ make

$ sudo make install




** leptonica cross 컴파일된 오브젝트 버전확인(32bit ARM)

cd /usr/local/arm/leptonica/lib

file liblept.so.4.0.1

liblept.so.4.0.1: ELF 32-bit LSB  shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, BuildID[sha1]=358f8173e43fa39cabe5331a71b7ec3dc7c8a812, not stripped




** tesseract 패키지 이동

$ cd

$ cd down/ocr/tesseract-ocr/

$ pwd

/home/계정명/down/ocr/tesseract-ocr




** tesseract 컴파일 옵션 정의

$ ./autogen.sh


LIBLEPT_HEADERSDIR=/usr/local/arm/leptonica/include \

 CC="arm-linux-gnueabihf-gcc" CXX="arm-linux-gnueabihf-g++" \

./configure \

    --prefix=/usr/local/arm/tesseract-ocr \

    --target=arm-linux \

    --host=arm-linux \

    --with-extra-libraries=/usr/local/arm/leptonica/lib




** tesseract 컴파일 수행, 설치

$ make

$ sudo make install




** tesseract cross 컴파일된 오브젝트 버전확인(32bit ARM)

cd /usr/local/arm/tesseract-ocr/lib

file libtesseract.so.3.0.2 

libtesseract.so.3.0.2: ELF 32-bit LSB  shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, BuildID[sha1]=18c1b84e4915b1ceeacf568cde32b7ad10be073e, not stripped




** openalpr 패키지 이동

$ cd 

$ cd down/ocr

$ pwd

/home/계정명/down/ocr




** openalpr git 소스 다운로드

$ git clone https://github.com/openalpr/openalpr.git --depth=1




** openalpr 컴파일 옵션 변경

$ pwd

/home/계정명/down/ocr


$ cd openalpr/src

$ vi CMakeLists.txt


*17라인 정도 opencv, tesseract-ocr path변경

SET(OpenCV_DIR "${CMAKE_SOURCE_DIR}/../libraries/opencv/")

SET(Tesseract_DIR "${CMAKE_SOURCE_DIR}/../libraries/tesseract-ocr")


-->  SET(OpenCV_DIR "/usr/local/arm/opencv/lib")

       SET(Tesseract_DIR "/usr/local/arm/tesseract-ocr")


* 20라인 컴파일중 에러가 난다면 include path추가
 include_directories(
         /usr/local/arm/opencv/include
         ${Tesseract_DIR}/include
         ${Tesseract_DIR}/api
         ${Tesseract_DIR}/ccutil/
         ${Tesseract_DIR}/ccstruct/
         ${Tesseract_DIR}/ccmain/
 )

 * 48라인 변경 l
ink_directories( ${Tesseract_DIR}/.api/libs/ )
--> link_directories( ${Tesseract_DIR}/lib/)



** openalpr 컴파일 옵션 정의

$ pwd

/home/계정명/down/ocr/openalpr/src


$ mkdir build

$ cd build

$ pwd

/home/계정명/down/ocr/openalpr/src/build


$ cmake \

    -DCMAKE_INSTALL_PREFIX=/usr/local/arm/openalpr \

    -DCMAKE_PREFIX_PATH=/usr/local/arm/opencv \

    -DCMAKE_CXX_COMPILER:FILEPATH=/usr/bin/arm-linux-gnueabihf-g++ \

    -DCMAKE_C_COMPILER:FILEPATH=/usr/bin/arm-linux-gnueabihf-gcc \

    ../



** openalpr 컴파일 수행, 설치

$ make

$ sudo make install



** openalpr 컴파일시 /usr/local/arm/tesseract-ocr/lib/libtesseract.so: undefined reference ... 에러메세지 출력시

$ cd /usr/arm-linux-gnueabihf/lib

$ sudo cp -r /usr/local/arm/tesseract-ocr/lib/* .

$ sudo cp -r /usr/local/arm/leptonica/lib/* .



** openalpr ract cross 컴파일된 오브젝트 버전확인(32bit ARM)

cd /usr/local/arm/openalpr/bin

file alpr

alpr: ELF 32-bit LSB  executable, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=0dd51f34e6b0e3902773df82aaa039cd3de50033, not stripped



** traineddata 파일 복사

cd ~/down/ocr/openalpr/runtime_data/ocr/tessdata

$ sudo cp *.traineddata /usr/local/ocr/tesseract-ocr/share/tessdata/

$ sudo cp *.traineddata /usr/local/share/tessdata/



블로그 이미지

유효하지않음

,

최근에 사용한 목업툴로 Balsmiq Mockups프로그램을 사용했었는데

파워포인트 플러그인 전용으로 PowerMockup이 있다는걸 얼마전에 알게되었다.

평가판을 사용해봤는데 평가판이라 여러 목업들을 사용할 수 없어 아쉽지만

그리고  비주얼스트디오를 사용하시는 분들께서는 powerpoint storyboarding add-in tool과도 함께 비교해보면서

사용해봐도 될것 같다.


PowerMockup >> http://www.powermockup.com/



평가판을 다운로드 >> http://www.powermockup.com/download

지원되는 파워포인트 버전은 PowerMockup requires Microsoft PowerPoint 2007, 2010 or 2013 for Windows to be installed.


파워포인트 2013에서 샘플로 작성한 화면



기타 파워목업의 라이브러리 화면









PowerMockup site Sample Screnshot >> http://www.powermockup.com/details/screenshots



구입 가격확인 >> http://www.powermockup.com/order


기자, 블로거에게 프리 라이선스 지급한다. 

Free licenses are available for qualified bloggers, journalists and members of non-profit organizations.

>> http://www.powermockup.com/order/free-license









블로그 이미지

유효하지않음

,
jenkins를 통해 톰켓의 2개의 서버에 배포를 해야되는 경우가 발생함
현재 배포 plugin은 다중 배포를 지원하지 않는것 같네.. 힘드네.. 

## 테스트한 plugin
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat6-maven-plugin</artifactId>
<version>2.1</version>

추후 테스트예정 plugin 들...
<groupId>org.codehaus.cargo</groupId>
<artifactId>cargo-maven2-plugin</artifactId>
<version>1.2.0</version>

테스트한거랑 같은건가...?? 모르겠네..
<groupId>org.codehaus.mojo</groupId>
<artifactId>tomcat-maven-plugin</artifactId>
<version>1.2-SNAPSHOT</version>


 ## 설정 
a서버는 6.0.35 
b서버는 6.0.37 


A서버 B서버 같은 설정
#vi $CATALINA_HOME/conf/tomcat-users.xml
	<?xml version='1.0' encoding='utf-8'?>
	<tomcat-users>
		<role rolename="manager-gui"/>
		<role rolename="manager-script"/>
		<user username="tomcat" password="1234" roles="manager-gui, manager-script"/>
	</tomcat-users>

* maven settings.xml 파일에 servers 부분에 추가함 
 #vi $MAVEN_HOME/conf/settings.xml
    <server>
        <id>aTomcat</id>
        <username>tomcat</username>
        <password>1234</password>
    </server>
    <server>
        <id>bTomcat</id>
        <username>tomcat</username>
        <password>1234</password>
    </server>

* maven pom.xml 수정 
버전 6.0.35와 6.0.37 테스트시 url부분 때문에 문제가 발생함(403 Access Denied) 
6.0.35는 /manager/html 
6.0.37은 /manager 까지만... 중요!!!
    ....

    <profiles>
        <profile>
            <id>aTomcat</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <tomcat-server>aTomcat</tomcat-server>
                <tomcat-url>http://xxx.xxx.xxx.xxx:9090/manager/html</tomcat-url>
                <tomcat-user>tomcat</tomcat-user>
                <tomcat-password>1234</tomcat-password>
                <tomcat-path>/</tomcat-path>
            </properties>
        </profile>
        <profile>
            <id>bTomcat</id>
            <properties>
                <tomcat-server>bTomcat</tomcat-server>
                <tomcat-url>http://xxx.xxx.xxx.xxx/manager</tomcat-url>
                <tomcat-user>tomcat</tomcat-user>
                <tomcat-password>1234</tomcat-password>
                <tomcat-path>/</tomcat-path>
            </properties>
        </profile>
    </profiles>

    ....

	<build>

		....

        <pluginManagement>
            <plugins>

                 ....

                <!--
                 벤더사별 plugin
                 Tomcat    : http://tomcat.apache.org/maven-plugin-2.0/
                 Jobss     : http://docs.jboss.org/jbossas/7/plugins/maven/7.4.Final/index.html
                 Weblogic  : http://docs.oracle.com/cd/E21764_01/web.1111/e13702/maven_deployer.htm
                 WebSphere : http://www.jroller.com/peter_pilgrim/entry/battling_with_maven_2_integrating
                 -->

                <plugin>
                    <groupId>org.apache.tomcat.maven</groupId>
                    <artifactId>tomcat6-maven-plugin</artifactId>
                    <version>2.1</version>
                    <configuration>
                        <server>${tomcat-server}</server>
                        <url>${tomcat-url}</url>
                        <username>${tomcat-user}</username>
                        <password>${tomcat-password}</password>
                        <path>${tomcat-path}</path>
                        <protocol>HTTP/1.1</protocol>
                        <failOnError>false</failOnError>
                        <charset>${encoding}</charset>
                        <uriEncoding>${encoding}</uriEncoding>
                        <update>true</update>
                        <mode>war</mode>
                    </configuration>
                </plugin>

                ....

            </plugins>
        </pluginManagement>

        ....

        </build>

    ....
* maven 실행시 goals 갯수만큼 실행하던가 쉘스크립트로 만들던가 해야됨 
플러그인 버전업시 지원 될라나..?? 
mvn -P aTomcat clean install tomcat6:stop tomcat6:undeploy tomcat6:deploy tomcat6:start 
mvn -P bTomcat clean install tomcat6:stop tomcat6:undeploy tomcat6:deploy tomcat6:start



# Ant 플러그인을 이용하는 방법 테스트 해보진 않았음
<plugin>
    
    ....

    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>1.6</version>
    <configuration>
        <target>
            <taskdef name="deploy" classname="org.apache.catalina.ant.DeployTask"/>
            <deploy url="http://xxx.xxx.xxx.xxx/manager" username="tomcat" password="1234"
                path="/" war="file:${project.build.directory}/${project.build.finalName}.${project.packaging}" update="true"/>

            <deploy url="http://xxx.xxx.xxx.xxx/manager" username="tomcat" password="1234"
            path="/" war="file:${project.build.directory}/${project.build.finalName}.${project.packaging}" update="true"/>
        </target>
    </configuration>

   ....
   
</plugin>


블로그 이미지

유효하지않음

,

CentOS 6.3에서 아래처럼 플러그인 초기화 실패 에러가 나오네요..


130814 10:13:15  InnoDB: Waiting for the background threads to start

130814 10:13:16 Percona XtraDB (http://www.percona.com) 5.5.30-tokudb-7.0.4-MariaDB-30.1 started; log sequence number 0

130814 10:07:58 mysqld_safe Starting mysqld daemon with databases from /data/mariadb/data

130814 10:07:58 [Warning] The syntax '--log' is deprecated and will be removed in a future release. Please use '--general-log'/'--general-log-file' instead.

130814 10:07:59 [ERROR] InnoDB: syntax error in innodb_data_file_path

130814 10:07:59 [ERROR] Plugin 'InnoDB' init function returned error.

130814 10:07:59 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.

130814 10:07:59 [Note] Plugin 'FEEDBACK' is disabled.

Transparent huge pages are enabled, according to /sys/kernel/mm/redhat_transparent_hugepage/enabled

130814 10:07:59 [ERROR] Plugin 'TokuDB' init function returned error.

130814 10:07:59 [ERROR] Plugin 'TokuDB' registration as a STORAGE ENGINE failed.

130814 10:07:59 [ERROR] mysqld: File '/data/mariadb/mysql_query.log' not found (Errcode: 13)

130814 10:07:59 [ERROR] Unknown/unsupported storage engine: TokuDB

130814 10:07:59 [ERROR] Aborting



위 메세지중 붉은색 메세지를 참조하여 아래와 같이 해주면 끝이네요.

# echo never > /sys/kernel/mm/redhat_transparent_hugepage/enabled



#vi /etc/init.d/mysql(mariadb) 스크립트 start 부분에 추가


# 추가되는 부분.

if test -f /sys/kernel/mm/redhat_transparent_hugepage/enabled; then

   echo never > /sys/kernel/mm/redhat_transparent_hugepage/enabled

fi

if test -f /sys/kernel/mm/redhat_transparent_hugepage/defrag; then

   echo never > /sys/kernel/mm/redhat_transparent_hugepage/defrag

fi




참조 #1(30p)  http://www.tokutek.com/wp-content/uploads/2013/05/Percona-Live-Tutorial-2013.pdf

참조 #2(34p~38p)  http://www.slideshare.net/sprdd/linux-performan-tuning-part-1

블로그 이미지

유효하지않음

,

OKJSP에 회원님께서 MyBatis 인터셉터 관련 내용을 문의했었는데 답변단 내용에


관련 글을 공유코자 올려봅니다.


자체적으로 인터셉터 된다는걸 알고 있지는 않았었는데 질문이 올라와 테스트겸 해 봤는데 잘되네요..ㅎㅎ


뭐든간에 매뉴얼 정독이 필요한 부분이긴 하나 그럴 시간이 부족한 현실이 조금 아쉽네요..ㅋㅋ



     <plugins>
        <plugin interceptor="handler.QueryInterceptor"/>
        <plugin interceptor="handler.UpdateInterceptor"/>
    </plugins>



package handler;


import java.util.Properties;

import org.apache.ibatis.cache.CacheKey;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Plugin;
import org.apache.ibatis.plugin.Signature;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;


@Intercepts
(
    {
        @Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})
       ,@Signature(type = Executor.class, method = "query",  args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class, CacheKey.class, BoundSql.class})
       ,@Signature(type = Executor.class, method = "query",  args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})
    }
)
public class QueryInterceptor implements Interceptor
{
    private Logger log = LogManager.getLogger(getClass());
    
    @Override
    public Object intercept(Invocation invocation) throws Throwable
    {
        Object[]        args     = invocation.getArgs();
        MappedStatement ms       = (MappedStatement)args[0];
        Object          param    = (Object)args[1];
        BoundSql        boundSql = ms.getBoundSql(param);
        
        System.out.println("====================================");
        System.out.println(invocation.getMethod().getName());
        System.out.println("====================================");
        System.out.println(ms.getId());
        System.out.println("====================================");
        System.out.println(boundSql.getSql());
        System.out.println("====================================");
        System.out.println(param);
        System.out.println("====================================");
        
        log.debug(ms.getId());
       
        return invocation.proceed();
    }


    @Override
    public Object plugin(Object target)
    {
        return Plugin.wrap(target, this);
    }


    @Override
    public void setProperties(Properties properties)
    {
    }
}



package handler;


import java.sql.Statement;
import java.util.Properties;

import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Plugin;
import org.apache.ibatis.plugin.Signature;
import org.apache.ibatis.session.ResultHandler;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;


@Intercepts
(
     {
          @Signature(type = StatementHandler.class, method = "update", args = {Statement.class})
         ,@Signature(type = StatementHandler.class, method = "query",  args = {Statement.class, ResultHandler.class}) 
     }
)
public class UpdateInterceptor implements Interceptor
{
    private Logger log = LogManager.getLogger(getClass());
    
    @Override
    public Object intercept(Invocation invocation) throws Throwable
    {
        StatementHandler handler = (StatementHandler) invocation.getTarget();
        
        //쿼리문
        String sql = handler.getBoundSql().getSql();

        //매핑 자료
        String param = handler.getParameterHandler().getParameterObject() != null ? handler.getParameterHandler().getParameterObject().toString() : "";

        System.out.println("--------------------------------");
        System.out.println(sql);
        System.out.println(param);
        System.out.println("--------------------------------");
        System.out.println(invocation.getMethod().getName());
        System.out.println(invocation.getMethod().getAnnotations());
        System.out.println("--------------------------------");
        
        log.debug(sql);
        log.debug(param);
       
        return invocation.proceed();
    }


    @Override
    public Object plugin(Object target)
    {
        return Plugin.wrap(target, this);
    }


    @Override
    public void setProperties(Properties properties)
    {
    }
}


블로그 이미지

유효하지않음

,

교차선분조건 판별

Database 2013. 1. 10. 12:09

PHPSCHOOL 톡박에 좋은 글이 올라와 포스팅 해봅니다.


많은 개발자 분들이 놓치기 쉬운 부분이네요.(OR OR OR OR 남발)





-- 교차선분조건 (A) = (1), (B) = (10) 

WITH tmp AS

(

    SELECT 0 IDX, 11 A, 12 B  FROM DUAL UNION ALL

    SELECT 1, -2,  3          FROM DUAL UNION ALL

    SELECT 2,  2,  5          FROM DUAL UNION ALL

    SELECT 3,  7, 11          FROM DUAL UNION ALL

    SELECT 4, -1, 11          FROM DUAL UNION ALL

    SELECT 5, -3, -1          FROM DUAL

)

SELECT * FROM tmp WHERE (1) < B AND (10) > A

블로그 이미지

유효하지않음

,

이벤트에 참여해서 Altibase HDB 완벽가이드 책을 받았는데(2012/01/26)

이벤트 기한은 2012/01/27까지 란다....헐~~ 오늘 책을 받았는데

회사일도 해야되고 어쩌나.....~~~ㅎㅎ

시간도 짧고 해서 기능들을 많이는 테스트 해보지 못했습니다.

잛은시간에 디비의 성능을 간단히 테스트 해보고자

다른 디비들과 백만건 정도 되는 데이터에 단순 SELECT 쿼리만 날려 보았습니다.

의외로 국산디비 성능이 다른 외산 디비에 비해 괜찮은 속도를 낸것같아..~~

앞으로 개발사에서 공격적인 마케팅과 서비스 지원이 이루어 진다면

충분이 시장에서 경쟁력이 있지 않을까라는 개인적인 생각을 해봅니다.


단순 SELECT 쿼리만 테스트 했고 테스트한 모든 디비는 같은 O/S, H/W에

테스트 해보았고, 모든 설치환경은 디폴트이고 따로 튜닝은 하지 않았습니다.
(MySQL은 속도가 안나와서 my.cnf점 수정함).
(elapsed time은 따로 기록하지 않았습니다. 간단한 리뷰를 쓰기위해  결과만 확인했으니 필요하다면 직접 해보시길..)

## H/W
CPU : i7-950/3.06Ghz/Quad Core
MEM : DDR3 SDRAM 2Gb*6(12Gb)
HDD : SATA3(7200rpm/64M)


## O/S
CentOS 5.6 64bit(Linux XXXX 2.6.18-238.12.1.el5xen #1 SMP Tue May 31 14:02:29 EDT 2011 x86_64 x86_64 x86_64 GNU/Linux)


의외인것은 Altibase, CUBRID 반응속도가 다른 DB에 비해 상당히 빨랐음
그룹처리   : ORACLE(상용), CUBRID(오픈, 국산), Altibase(국산), PostgreSQL(오픈) 속도가 MySQL보다 빨랐음(1~2초 내외)
페이징처리 : ORACLE(상용), Altibase(국산), CUBRID(오픈, 국산) 상대적으로 빨랐음
             PostgreSQL, MySQL(MariaDB ??)은 상댁적으로 느렸음

FirebirdSQL(오픈, 구 InterBase) 시간이 없어 테스트 못함 ㅎㅎㅎ

일반 개인 및 공개 사이트 개발은 MySQL(MariaDB ??) 보단 CUBRID

상용 사이트 Oracle 디비를 마이그레이션 하거나 국산 디비를 적용해야되는 정부기관에는 Altibase

Altibase의 장점은 Oracle의 쿼리와 비슷하여 마이그레이션 하는데 다른 디비에
비하여 괜찮은 장점인것 같습니다.

Altibase를 좀더 사용해바야 알겠지만 단순 설치와 쿼리/인덱스/힌트/테이블스페이스등 구문이나 실행방법이
오라클 클론인것 같습니다.
PostgreSQL의 상용버전인 http://www.enterprisedb.com/ (Oracle 구문 동일 또는 유사함)와도 비슷한것 같기도하고
아무튼 이점 넘 마음에 듭니다.ㅎㅎ

Altibase(페이징속도 빠름) = CUBRID(그룹핑 속도 빠름) >= ORACLE > MySQL(MyISAM) >= PostgreSQL >= MySQL(InnoDB)

리뷰가 넘 허접하네...ㅎㅎ

 

Altibase 설치(다른 디비는 시간되면~~~올리도록 하겠습니다. 시간이 될라나..ㅋㅋ)
( http://atc.altibase.com/download/install_guide.jsp  참조)

http://atc.altibase.com/
해당 OS에 설치할 제품을 다운로드

gcc 버전확인
#gcc -v
Target: x86_64-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-libgcj-multifile --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --disable-plugin --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre --with-cpu=generic --host=x86_64-redhat-linux
Thread model: posix
gcc version 4.1.2 20080704 (Red Hat 4.1.2-50)
 
해당 gcc버전을 확인하고 버전에 맞는 패키지를 다운받는다.
설치용 altibase-XEON_LINUX_redhat_Enterprise_release5-64bit-5.3.3.12-release-GCC4.1.2.tgz
패치용 altibase-server-5.5.1.2-LINUX-X86-64bit-patch_0_0_2_5.run

계정생성
#useradd -G dba -g dba altibase

계정변경
#su - altibase

환경변수 설정(추가함, 패치 적용하고 삭제함)
$vi .bash_profile
ALTIBASE_HOME=$HOME/altibase_home; export ALTIBASE_HOME
PATH=$ALTIBASE_HOME/bin:$PATH ;export PATH
LD_LIBRARY_PATH=$ALTIBASE_HOME/lib:$LD_LIBRARY_PATH ;export LD_LIBRARY_PATH

패키지 압축풀기
$unzip altibase-XEON_LINUX_redhat_Enterprise_release5-64bit-5.3.3.12-release-GCC4.1.2.tgz

패키지 설치(디폴트 적용)
$./altibase_install.sh

license적용(복사함, http://atc.altibase.com/download/license_guide.jsp 신청후 적용)
$ALTIBASE_HOME/conf/license

패치파일 적용(디폴트 적용)
$chmod 755 altibase-server-5.5.1.2-LINUX-X86-64bit-patch_0_0_2_5.run
$./altibase-server-5.5.1.2-LINUX-X86-64bit-patch_0_0_2_5.run

환경변수 설정
$vi .bash_profile
삭제함 ALTIBASE_HOME=$HOME/altibase_home; export ALTIBASE_HOME
삭제함 PATH=$ALTIBASE_HOME/bin:$PATH ;export PATH
삭제함 LD_LIBRARY_PATH=$ALTIBASE_HOME/lib:$LD_LIBRARY_PATH ;export LD_LIBRARY_PATH

패치적용하고 추가된부분
. /home/altibase/altibase_home/conf/altibase_user.env

환경파일 적용
$source /home/altibase/.bash_profile

서버 시작(종료:$server stop)
$server start

시스템 계정 로그인
$isql -u sys -p manager -sysdba


테스트용 테이블스페이스 생성
iSQL(sysdba)>
    CREATE TABLESPACE "TS_TEST"
    DATAFILE '/home/altibase/altibase_home/dbs/ts_test.dbf'
    SIZE 100M
    AUTOEXTEND ON NEXT 100M
    MAXSIZE UNLIMITED;
   
iSQL(sysdba)>
    CREATE MEMORY TABLESPACE "TS_TEST_MEM"
    SIZE 131072K
    AUTOEXTEND ON NEXT 131072K
    MAXSIZE UNLIMITED
    CHECKPOINT PATH '/home/altibase/altibase_home/dbs'
    SPLIT EACH 1048576K;


테스트용 계정 생성
iSQL(sysdba)>
    CREATE USER test IDENTIFIED BY test
    TEMPORARY TABLESPACE "SYS_TBS_DISK_TEMP"
    DEFAULT TABLESPACE "TS_TEST"
    ACCESS "TS_TEST_MEM" ON;
   

데이터 건수 : 1,118,003
#################################### Altibase 5.6.1 ####################################
-- Altibase
-- @/path/USE_DETAIL.SQL;
-- $isql -u username -p passwd -f /path/USE_DETAIL.SQL
CREATE TABLE USE_DETAIL
(
     ud_seq             NUMBER(20,0)                NOT NULL
    ,rc_seq             VARCHAR2(10)
    ,ma_seq             VARCHAR2(20)
    ,fd_seq             NUMBER(20,0)
    ,ui_id              VARCHAR2(20)
    ,tm_seq             VARCHAR2(10)                NOT NULL
    ,ud_type            CHAR(1)         DEFAULT 'G' NOT NULL
    ,ud_weight          NUMBER(10,3)
    ,ud_usedate         VARCHAR2(20)    DEFAULT ''  NOT NULL
    ,ud_dayofweek       NUMBER(2,0)
    ,ud_cdate           VARCHAR2(20)
    ,ud_useunixtime     NUMBER(15,0)
    ,CONSTRAINT PK_USE_DETAIL PRIMARY KEY(ud_seq)
);

CREATE UNIQUE INDEX PK_USE_DETAIL ON USE_DETAIL(ud_seq);
CREATE INDEX IDX_01 ON USE_DETAIL(ud_usedate, tm_seq, ud_type);


접    속 : isql -u username -p passwd
실행시간 : iSQL> set timing on;
종    료 : iSQL> exit;

그룹핑 테스트 SQL :
       
        SELECT  X1.ud_seq, X1.ma_seq, X1.tm_seq
        FROM    USE_DETAIL X1,
        (
            SELECT  MAX(ud_seq) AS ud_seq, ma_seq, tm_seq
            FROM    USE_DETAIL X
            WHERE   ud_usedate BETWEEN '2011-07-01' AND '2011-08-01'
            AND     tm_seq  IN('00101','00102','00103','00104','00105','00106','00107','00108')
            AND     ud_type = 'G'
            GROUP   BY ma_seq, tm_seq
        ) X2
        WHERE X1.ud_seq = X2.ud_seq;
       
페이징 테스트 SQL :
       
        SELECT  *
        FROM
        (
            SELECT  ROWNUM rnum, X1.*
            FROM
            (
                SELECT   /*+ INDEX_DESC(X pk_use_detail) */ ud_seq, ma_seq, tm_seq, ud_usedate
                FROM    USE_DETAIL X
                WHERE   ud_type    = 'G'
            ) X1
            WHERE ROWNUM  <= 900051
        )
        WHERE   rnum BETWEEN 900000 AND 900050;
또는
        SELECT * FROM use_detail LIMIT 900000, 50;


인덱스 생성방벙 :
    DROP INDEX IDX_01;
    CREATE INDEX IDX_01 ON USE_DETAIL(ud_usedate, tm_seq, ud_type);
    OR
    CREATE INDEX IDX_01 ON USE_DETAIL(ud_usedate DESC, tm_seq, ud_type);
   
   
  
데이터 건수 : 1,118,003
#################################### MySQL 5.1.4 ###################################
-- MySQL(MariaDB ??)
-- mysql>\. /path/USE_DETAIL.SQL;
-- #>mysql -uusername -p dbname < /path/USE_DETAIL.SQL
CREATE TABLE USE_DETAIL
(
     ud_seq             BIGINT(20)                  NOT NULL
    ,rc_seq             VARCHAR(10)
    ,ma_seq             VARCHAR(20)
    ,fd_seq             BIGINT(20)
    ,ui_id              VARCHAR(20)
    ,tm_seq             VARCHAR(10)                 NOT NULL
    ,ud_type            CHAR(1)                     NOT NULL DEFAULT 'G'
    ,ud_weight          DOUBLE(10,3)
    ,ud_usedate         VARCHAR(20)                 NOT NULL DEFAULT ''
    ,ud_dayofweek       TINYINT(2)
    ,ud_cdate           VARCHAR(20)
    ,ud_useunixtime     INT(15)
    ,PRIMARY KEY(ud_seq)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE UNIQUE INDEX PK_USE_DETAILON USE_DETAIL(ud_seq);
CREATE INDEX IDX_01 ON USE_DETAIL(ud_usedate, tm_seq, ud_type);


접속 : mysql -uusername -ppasswd
디비 : mysql> use dbname;
종료 : mysql> exit; or \q

그룹핑 테스트 SQL :

        SELECT  X1.ud_seq, X1.ma_seq, X1.tm_seq
        FROM    USE_DETAIL X1,
        (
            SELECT  MAX(ud_seq) AS ud_seq, ma_seq, tm_seq
            FROM    USE_DETAIL X USE INDEX FOR GROUP BY(IDX_01)
            WHERE   ud_usedate BETWEEN '2011-07-01' AND '2011-08-01'
            AND     tm_seq  IN('00101','00102','00103','00104','00105','00106','00107','00108')
            AND     ud_type = 'G'
            GROUP   BY ma_seq, tm_seq
        ) X2
        WHERE X1.ud_seq = X2.ud_seq;

페이징 테스트 SQL :

        SELECT  ud_seq, ma_seq, tm_seq, ud_usedate
        FROM    USE_DETAIL X FORCE INDEX(IDX_01)
        WHERE   ud_type = 'G'
        ORDER   BY ud_seq DESC
        LIMIT   900000, 50;

인덱스 생성방벙 : 쿼리문에 흰트사용함, my.cnf도 버퍼용량 증가시킴
    ALTER TABLE USE_DETAIL DROP INDEX IDX_01;
    CREATE INDEX IDX_01 ON USE_DETAIL(ud_usedate, tm_seq, ud_type);

기타 : MyISAM, InnoDB Engine 둘다 테스트함
 


데이터 건수 : 1,118,003
#################################### ORACLE 10g ####################################
-- ORACLE
-- SQL>@/path/USE_DETAIL.SQL;
-- $sqlplus username/passwd @/path/USE_DETAIL.SQL
CREATE TABLE USE_DETAIL
(
     ud_seq             NUMBER(20,0)                NOT NULL
    ,rc_seq             VARCHAR2(10)
    ,ma_seq             VARCHAR2(20)
    ,fd_seq             NUMBER(20,0)
    ,ui_id              VARCHAR2(20)
    ,tm_seq             VARCHAR2(10)                NOT NULL
    ,ud_type            CHAR(1)         DEFAULT 'G' NOT NULL
    ,ud_weight          NUMBER(10,3)
    ,ud_usedate         VARCHAR2(20)    DEFAULT ''  NOT NULL
    ,ud_dayofweek       NUMBER(2,0)
    ,ud_cdate           VARCHAR2(20)
    ,ud_useunixtime     NUMBER(15,0)
    ,CONSTRAINT PK_USE_DETAIL PRIMARY KEY(ud_seq)
);

CREATE UNIQUE INDEX PK_USE_DETAIL ON USE_DETAIL(ud_seq);
CREATE INDEX IDX_01 ON USE_DETAIL(ud_usedate, tm_seq, ud_type);

접    속 : sqlplus username/passwd
실행시간 : SQL> set timing on
종    료 : SQL> exit;

그룹핑 테스트 SQL :
       
        SELECT  X1.ud_seq, X1.ma_seq, X1.tm_seq
        FROM    USE_DETAIL X1,
        (
            SELECT  MAX(ud_seq) AS ud_seq, ma_seq, tm_seq
            FROM    USE_DETAIL X
            WHERE   ud_usedate BETWEEN '2011-07-01' AND '2011-08-01'
            AND     tm_seq  IN('00101','00102','00103','00104','00105','00106','00107','00108')
            AND     ud_type = 'G'
            GROUP   BY ma_seq, tm_seq
        ) X2
        WHERE X1.ud_seq = X2.ud_seq;
       
페이징 테스트 SQL :
       
        SELECT  *
        FROM
        (
            SELECT  ROWNUM rnum, X1.*
            FROM
            (
                SELECT   /*+ INDEX_DESC(X pk_use_detail) */ ud_seq, ma_seq, tm_seq, ud_usedate
                FROM    USE_DETAIL X
                WHERE   ud_type    = 'G'
            ) X1
            WHERE ROWNUM  <= 900051
        )
        WHERE   rnum BETWEEN 900000 AND 900050;

인덱스 생성방벙 :
    DROP INDEX IDX_01;
    CREATE INDEX IDX_01 ON USE_DETAIL(ud_usedate, tm_seq, ud_type);
    OR
    CREATE INDEX IDX_01 ON USE_DETAIL(ud_usedate DESC, tm_seq, ud_type);
   

데이터 건수 : 1,118,003
################################# CUBRID 2008 R4.0##################################
-- CUBRID
-- csql>;REA /path/USE_DETAIL.SQL
-- csql>;RU
-- #csql demodb -i /path/USE_DETAIL.SQL
CREATE TABLE USE_DETAIL
(
     ud_seq             INTEGER                     NOT NULL
    ,rc_seq             VARCHAR(10)
    ,ma_seq             VARCHAR(20)
    ,fd_seq             INTEGER
    ,ui_id              VARCHAR(20)
    ,tm_seq             VARCHAR(10)                 NOT NULL
    ,ud_type            CHAR(1)         DEFAULT 'G' NOT NULL
    ,ud_weight          NUMERIC(10,3)
    ,ud_usedate         VARCHAR(20)     DEFAULT ''  NOT NULL
    ,ud_dayofweek       SHORT
    ,ud_cdate           VARCHAR(20)
    ,ud_useunixtime     INTEGER
    ,CONSTRAINT PK_USE_DETAIL PRIMARY KEY(ud_seq)
);

CREATE UNIQUE INDEX PK_USE_DETAIL ON USE_DETAIL(ud_seq);
CREATE INDEX IDX_01 ON USE_DETAIL(ud_usedate, tm_seq, ud_type);


접    속 : csql -C demodb
실행시간 : csql> ;time on 
종    료 : csql> ;ex

그룹핑 테스트 SQL :

        SELECT  X1.ud_seq, X1.ma_seq, X1.tm_seq
        FROM    USE_DETAIL X1,
        (
            SELECT  MAX(ud_seq) AS ud_seq, ma_seq, tm_seq
            FROM    USE_DETAIL X
            WHERE   ud_usedate BETWEEN '2011-07-01' AND '2011-08-01'
            AND     tm_seq  IN('00101','00102','00103','00104','00105','00106','00107','00108')
            AND     ud_type = 'G'
            GROUP   BY ma_seq, tm_seq
        ) X2
        WHERE X1.ud_seq = X2.ud_seq;

페이징 테스트 SQL :

        SELECT  ud_seq, ma_seq, tm_seq, ud_usedate
        FROM    USE_DETAIL
        WHERE   ud_type = 'G'
        ORDER   BY ud_seq DESC FOR ORDERBY_NUM() BETWEEN 900000 AND 900050;
       
       
인덱스 생성방벙 :
    DROP INDEX IDX_01;
    OR
    DROP REVERSE INDEX IDX_01;
   
    CREATE INDEX IDX_01 ON USE_DETAIL(ud_usedate, tm_seq, ud_type);
    OR
    CREATE INDEX IDX_01 ON USE_DETAIL(ud_usedate DESC, tm_seq, ud_type);
    OR
    CREATE REVERSE INDEX IDX_01 ON USE_DETAIL(ud_usedate, tm_seq, ud_type);
   

데이터 건수 : 1,118,003
################################# PostgreSQL 8.4.7 ##################################
-- PostgreSQL
-- demodb=# \i /path/USE_DETAIL.SQL;
-- $psql -U username dbname < /path/USE_DETAIL.SQL
CREATE TABLE USE_DETAIL
(
     ud_seq             INTEGER                     NOT NULL
    ,rc_seq             VARCHAR(10)
    ,ma_seq             VARCHAR(20)
    ,fd_seq             INTEGER
    ,ui_id              VARCHAR(20)
    ,tm_seq             VARCHAR(10)                 NOT NULL
    ,ud_type            CHAR(1)         DEFAULT 'G' NOT NULL
    ,ud_weight          NUMERIC(10,3)
    ,ud_usedate         VARCHAR(20)     DEFAULT ''  NOT NULL
    ,ud_dayofweek       SMALLINT
    ,ud_cdate           VARCHAR(20)
    ,ud_useunixtime     INTEGER
    ,CONSTRAINT PK_USE_DETAIL PRIMARY KEY(ud_seq)
);

CREATE UNIQUE INDEX PK_USE_DETAIL ON USE_DETAIL(ud_seq);
CREATE INDEX IDX_01 ON USE_DETAIL1(ud_usedate, tm_seq, ud_type);


접    속 : psql -U postgres demodb
실행시간 : demodb=# \timing on
종    료 : demodb=# \q

그룹핑 테스트 SQL :

        SELECT  X1.ud_seq, X1.ma_seq, X1.tm_seq
        FROM    USE_DETAIL X1,
        (
            SELECT  MAX(ud_seq) AS ud_seq, ma_seq, tm_seq
            FROM    USE_DETAIL X
            WHERE   ud_usedate BETWEEN '2011-07-01' AND '2011-08-01'
            AND     tm_seq  IN('00101','00102','00103','00104','00105','00106','00107','00108')
            AND     ud_type = 'G'
            GROUP   BY ma_seq, tm_seq
        ) X2
        WHERE X1.ud_seq = X2.ud_seq;


페이징 테스트 SQL 1 :

        SELECT  ud_seq, ma_seq, tm_seq, ud_usedate
        FROM    USE_DETAIL
        WHERE   ud_type = 'G'
        ORDER   BY ud_seq DESC
        LIMIT   50 OFFSET 900000;

페이징 테스트 SQL 2 :
        SELECT  *
        FROM
        (
            SELECT  ROW_NUMBER() OVER (ORDER BY ud_usedate DESC) rnum, ud_seq, ma_seq, tm_seq, ud_usedate
            FROM    USE_DETAIL
            WHERE   ud_type = 'G'
        ) X2
        WHERE rnum BETWEEN 900000 AND 900050;

인덱스 생성방벙 :
    DROP INDEX IDX_01;
    CREATE INDEX IDX_01 ON USE_DETAIL(ud_usedate, tm_seq, ud_type);
    OR
    CREATE INDEX IDX_01 ON USE_DETAIL(ud_usedate DESC, tm_seq, ud_type);
   

####테스트 자료####
USE_DETAIL.7z

블로그 이미지

유효하지않음

,




This is the text of the Commencement address by Steve Jobs, CEO of Apple Computer and of Pixar Animation Studios, delivered on June 12, 2005.

I am honored to be with you today at your commencement from one of the finest universities in the world. I never graduated from college. Truth be told, this is the closest I've ever gotten to a college graduation. Today I want to tell you three stories from my life. That's it. No big deal. Just three stories.

The first story is about connecting the dots.

I dropped out of Reed College after the first 6 months, but then stayed around as a drop-in for another 18 months or so before I really quit. So why did I drop out?

It started before I was born. My biological mother was a young, unwed college graduate student, and she decided to put me up for adoption. She felt very strongly that I should be adopted by college graduates, so everything was all set for me to be adopted at birth by a lawyer and his wife. Except that when I popped out they decided at the last minute that they really wanted a girl. So my parents, who were on a waiting list, got a call in the middle of the night asking: "We have an unexpected baby boy; do you want him?" They said: "Of course." My biological mother later found out that my mother had never graduated from college and that my father had never graduated from high school. She refused to sign the final adoption papers. She only relented a few months later when my parents promised that I would someday go to college.

And 17 years later I did go to college. But I naively chose a college that was almost as expensive as Stanford, and all of my working-class parents' savings were being spent on my college tuition. After six months, I couldn't see the value in it. I had no idea what I wanted to do with my life and no idea how college was going to help me figure it out. And here I was spending all of the money my parents had saved their entire life. So I decided to drop out and trust that it would all work out OK. It was pretty scary at the time, but looking back it was one of the best decisions I ever made. The minute I dropped out I could stop taking the required classes that didn't interest me, and begin dropping in on the ones that looked interesting.

It wasn't all romantic. I didn't have a dorm room, so I slept on the floor in friends' rooms, I returned coke bottles for the 5¢ deposits to buy food with, and I would walk the 7 miles across town every Sunday night to get one good meal a week at the Hare Krishna temple. I loved it. And much of what I stumbled into by following my curiosity and intuition turned out to be priceless later on. Let me give you one example:

Reed College at that time offered perhaps the best calligraphy instruction in the country. Throughout the campus every poster, every label on every drawer, was beautifully hand calligraphed. Because I had dropped out and didn't have to take the normal classes, I decided to take a calligraphy class to learn how to do this. I learned about serif and san serif typefaces, about varying the amount of space between different letter combinations, about what makes great typography great. It was beautiful, historical, artistically subtle in a way that science can't capture, and I found it fascinating.

None of this had even a hope of any practical application in my life. But ten years later, when we were designing the first Macintosh computer, it all came back to me. And we designed it all into the Mac. It was the first computer with beautiful typography. If I had never dropped in on that single course in college, the Mac would have never had multiple typefaces or proportionally spaced fonts. And since Windows just copied the Mac, its likely that no personal computer would have them. If I had never dropped out, I would have never dropped in on this calligraphy class, and personal computers might not have the wonderful typography that they do. Of course it was impossible to connect the dots looking forward when I was in college. But it was very, very clear looking backwards ten years later.

Again, you can't connect the dots looking forward; you can only connect them looking backwards. So you have to trust that the dots will somehow connect in your future. You have to trust in something ? your gut, destiny, life, karma, whatever. This approach has never let me down, and it has made all the difference in my life.

My second story is about love and loss.

I was lucky ? I found what I loved to do early in life. Woz and I started Apple in my parents garage when I was 20. We worked hard, and in 10 years Apple had grown from just the two of us in a garage into a $2 billion company with over 4000 employees. We had just released our finest creation ? the Macintosh ? a year earlier, and I had just turned 30. And then I got fired. How can you get fired from a company you started? Well, as Apple grew we hired someone who I thought was very talented to run the company with me, and for the first year or so things went well. But then our visions of the future began to diverge and eventually we had a falling out. When we did, our Board of Directors sided with him. So at 30 I was out. And very publicly out. What had been the focus of my entire adult life was gone, and it was devastating.

I really didn't know what to do for a few months. I felt that I had let the previous generation of entrepreneurs down - that I had dropped the baton as it was being passed to me. I met with David Packard and Bob Noyce and tried to apologize for screwing up so badly. I was a very public failure, and I even thought about running away from the valley. But something slowly began to dawn on me ? I still loved what I did. The turn of events at Apple had not changed that one bit. I had been rejected, but I was still in love. And so I decided to start over.

I didn't see it then, but it turned out that getting fired from Apple was the best thing that could have ever happened to me. The heaviness of being successful was replaced by the lightness of being a beginner again, less sure about everything. It freed me to enter one of the most creative periods of my life.

During the next five years, I started a company named NeXT, another company named Pixar, and fell in love with an amazing woman who would become my wife. Pixar went on to create the worlds first computer animated feature film, Toy Story, and is now the most successful animation studio in the world. In a remarkable turn of events, Apple bought NeXT, I returned to Apple, and the technology we developed at NeXT is at the heart of Apple's current renaissance. And Laurene and I have a wonderful family together.

I'm pretty sure none of this would have happened if I hadn't been fired from Apple. It was awful tasting medicine, but I guess the patient needed it. Sometimes life hits you in the head with a brick. Don't lose faith. I'm convinced that the only thing that kept me going was that I loved what I did. You've got to find what you love. And that is as true for your work as it is for your lovers. Your work is going to fill a large part of your life, and the only way to be truly satisfied is to do what you believe is great work. And the only way to do great work is to love what you do. If you haven't found it yet, keep looking. Don't settle. As with all matters of the heart, you'll know when you find it. And, like any great relationship, it just gets better and better as the years roll on. So keep looking until you find it. Don't settle.

My third story is about death.

When I was 17, I read a quote that went something like: "If you live each day as if it was your last, someday you'll most certainly be right." It made an impression on me, and since then, for the past 33 years, I have looked in the mirror every morning and asked myself: "If today were the last day of my life, would I want to do what I am about to do today?" And whenever the answer has been "No" for too many days in a row, I know I need to change something.

Remembering that I'll be dead soon is the most important tool I've ever encountered to help me make the big choices in life. Because almost everything ? all external expectations, all pride, all fear of embarrassment or failure - these things just fall away in the face of death, leaving only what is truly important. Remembering that you are going to die is the best way I know to avoid the trap of thinking you have something to lose. You are already naked. There is no reason not to follow your heart.

About a year ago I was diagnosed with cancer. I had a scan at 7:30 in the morning, and it clearly showed a tumor on my pancreas. I didn't even know what a pancreas was. The doctors told me this was almost certainly a type of cancer that is incurable, and that I should expect to live no longer than three to six months. My doctor advised me to go home and get my affairs in order, which is doctor's code for prepare to die. It means to try to tell your kids everything you thought you'd have the next 10 years to tell them in just a few months. It means to make sure everything is buttoned up so that it will be as easy as possible for your family. It means to say your goodbyes.

I lived with that diagnosis all day. Later that evening I had a biopsy, where they stuck an endoscope down my throat, through my stomach and into my intestines, put a needle into my pancreas and got a few cells from the tumor. I was sedated, but my wife, who was there, told me that when they viewed the cells under a microscope the doctors started crying because it turned out to be a very rare form of pancreatic cancer that is curable with surgery. I had the surgery and I'm fine now.

This was the closest I've been to facing death, and I hope its the closest I get for a few more decades. Having lived through it, I can now say this to you with a bit more certainty than when death was a useful but purely intellectual concept:

No one wants to die. Even people who want to go to heaven don't want to die to get there. And yet death is the destination we all share. No one has ever escaped it. And that is as it should be, because Death is very likely the single best invention of Life. It is Life's change agent. It clears out the old to make way for the new. Right now the new is you, but someday not too long from now, you will gradually become the old and be cleared away. Sorry to be so dramatic, but it is quite true.

Your time is limited, so don't waste it living someone else's life. Don't be trapped by dogma ? which is living with the results of other people's thinking. Don't let the noise of others' opinions drown out your own inner voice. And most important, have the courage to follow your heart and intuition. They somehow already know what you truly want to become. Everything else is secondary.

When I was young, there was an amazing publication called The Whole Earth Catalog, which was one of the bibles of my generation. It was created by a fellow named Stewart Brand not far from here in Menlo Park, and he brought it to life with his poetic touch. This was in the late 1960's, before personal computers and desktop publishing, so it was all made with typewriters, scissors, and polaroid cameras. It was sort of like Google in paperback form, 35 years before Google came along: it was idealistic, and overflowing with neat tools and great notions.

Stewart and his team put out several issues of The Whole Earth Catalog, and then when it had run its course, they put out a final issue. It was the mid-1970s, and I was your age. On the back cover of their final issue was a photograph of an early morning country road, the kind you might find yourself hitchhiking on if you were so adventurous. Beneath it were the words: "Stay Hungry. Stay Foolish." It was their farewell message as they signed off. Stay Hungry. Stay Foolish. And I have always wished that for myself. And now, as you graduate to begin anew, I wish that for you.

Stay Hungry. Stay Foolish.

Thank you all very much.

 


오늘 나는, 세계에서 가장 훌륭한 대학의 한 곳을 졸업하면서 새 출발을 하는 여러분들과 함께하는 영광을 가졌습니다. 나는 대학을 졸업하지 않았습니다. 사실을 말하자면, 이번이 내가 대학졸업식이라는 데 가장 가까이 다가간 경우입니다. 오늘 나는 여러분들에게 내 인생에 관한 세 가지 이야기를 하려고 합니다. 뭐 그리 대단한 것은 아닌, 그저 세 가지의 이야기입니다.


  첫번째 얘기는 점(點)을 잇는 것에 관한 이야기입니다.


나는 리드 대학이라는 곳을 첫 6개월 다닌 후 그만 두었습니다. 그후 18개월 동안은 비정규 청강생으로 머물렀고 그 후 진짜로 그만두었습니다. 내가 왜 대학을 그만두었을까요?


이 얘기는 내가 태어나기 전부터 시작됩니다. 내 생모는 젊은 미혼의 대학생이었는데, 나를 낳으면 다른 사람에게 입양을 시키기로 결심했습니다. 생모는 내가 대학을 졸업한 부부에게 입양되어야 한다는 생각을 강하게 갖고 있었습니다. 그래서 나는 태어나면 바로 어떤 변호사 부부에게 입양되기로 되어있었고, 그것으로 모든 것이 다 끝난 것처럼 보였습니다.

그러나 내가 태어났을 때 나를 입양키로 한 부부는 마음을 바꿔, 자신들은 여자아이를 원한다고 했습니다. 그래서 내 생모는 한밤중에 입양대기자 명단에 있는 다른 부부에게 전화를 걸어 "우리가 예기치 않은 사내아이를 갖게 되었는데 아이를 원하느냐"고 물었습니다. 이들 부부는 "물론"이라고 대답했습니다.


내 생모는 나중에야 내 어머니(양모)가 대학을 나오지 않았고, 내 아버지(양부)는 고등학교도 졸업하지 않았다는 사실을 알았습니다. 생모는 이 때문에 최종적인 입양서류에 서명을 하지 않다가, 몇달후 내 양부모가 나를 나중에 대학에 보낼 것이라는 약속을 하고서야 마음을 바꿨습니다.


17년이 지난 후 나는 정말 대학에 갔습니다. 그러나 나는 그때, 스탠포드와 거의 맞먹는 수준의 학비가 드는 대학을 선택했고, 노동자였던 내 부모(양부모)는 저축한 모든 돈을 내 대학등록금에 써야 했습니다. 그렇게 6개월이 지난후 나는 그만한 돈을 쓰는 데 대한 가치를 느낄 수 없었습니다. 나는 내가 내 삶에서 무엇을 하길 원하는지 알지 못했고, 대학이 그것을 아는 데 어떤 도움을 줄 것인지도 알지 못했습니다. 그런데도 내 부모들은 전 인생을 통해 저축해놓은 모든 돈을 내 학비를 위해 쓰고 있었던 것입니다.


그래서 나는 대학을 그만두기로 했습니다. 나는 모든 것이 잘될 것이라는 믿음을 가졌습니다. 그 당시 그런 결정은 다소 두려운 것이기도 했지만, 지금 돌아보면 그것이 내가 지금까지 한 가장 훌륭한 결정중 하나였습니다.


 내가 학교를 그만두는 그 순간, 나는 내게는 흥미가 없었던 필수과목을 들을 이유가 없어졌고, 내게 흥미롭게 보이는 다른 과목들을 청강할 수 있게 되었습니다.


 다 낭만적인 얘기는 아닙니다.  나는 기숙사에 방이 없었기 때문에 친구들의 방바닥에서 잠을 잤습니다. 음식을 사기위해 되돌려주면 5센트를 주는 콜라병을 모으는 일을 했고, 해어 크리슈나 사원에서 일주일에 한번 주는 식사를 얻어먹기 위해 일요일밤마다 7마일을 걸어가곤 했습니다. 나는 그걸 사랑했습니다. 그리고 내가 나의 호기심과 직관을 따라 가다가 부딪힌 것들중 많은 것들은 나중에 값으로 매길 수 없는 가치들로 나타났습니다. 한가지 사례를 들어보이겠습니다.


 내가 다녔던 리드대학은 그 당시 미국에서 최고의 서예 교육 기관이었다고 생각합니다. 캠퍼스 전체를 통해 모든 포스터, 모든 표지물들은 손으로 그려진 아름다운 글씨체로 장식되어 있었습니다. 나는 정규과목들을 더이상 들을 필요가 없어졌기 때문에 이런 글자체들을 어떻게 만드는지를 배워 보려고 서체과목을 듣기 시작했습니다. 나는 세리프나 산세리프 활자체를 배웠고, 무엇이 훌륭한 활자체를 만드는지에 대해 배웠습니다. 그것은 과학이 알아내지 못하는, 아름답고 역사적이며 예술적인 미묘함을 갖고 있었습니다. 나는 거기에 매료되었습니다.


 당시 나에겐 이런 모든 것이 내 삶에서 실제로 응용될 것이란 어떤 희망도 없었습니다. 그러나 10년 후, 우리가 최초의 매킨토시 컴퓨터를 만들 때 그 모든 것이 되살아 났습니다. 우리의 맥 컴퓨터는 아름다운 글자체를 가진 최초의 컴퓨터가 되었습니다. 내가 만일 대학의 그 과목을 듣지 않았다면 맥 컴퓨터는 결코 다양한 서체를 가진 컴퓨터가 될 수 없었을 것입니다. (마이크로소프트의) 원도즈는 맥 컴퓨터를 단지 베낀 것에 불과하기 때문에, 맥 컴퓨터가 그렇게 하지 않았다면 어떤 개인용 컴퓨터도 그런 아름다운 서체를 갖지 못했을 것입니다. 내가 만일 정규과목을 그만두지 않았고, 서체과목에 등록하지 않았더라면, 개인용 컴퓨터는 지금과 같은 놀라운 서체를 갖지 못했을 것입니다.


 물론 내가 대학에 있을 때는 미래를 내다보면서 점을 잇는 것은 불가능했습니다. 하지만 10년이 지난 후 과거를 되돌아 볼 때 그것은 너무나 분명합니다.


 다시 말하지만, 우리는 미래를 내다보면서 점을 이을 수는 없습니다. 우리는 오직 과거를 돌이켜 보면서 점을 이을 수 있을 뿐입니다. 따라서 여러분들은 지금 잇는 점들이 미래의 어떤 시점에 서로 연결될 것이라는 믿음을 가져야만 합니다. 여러분들은 어떤 것들에--자신의 내면, 운명, 인생, 카르마, 그 무엇이든지 신념을 가져야 합니다.  이런 접근법은 나를 결코 낙담시키지 않았고, 내 삶의 모든 변화를 만들어 내었습니다.


   나의 두번째 이야기는 사랑과 상실에 관한 것입니다.


 나는 내 삶의 이른 시기에 하고 싶은 것을 발견한 행운을 가졌습니다.  우즈(스티브 우즈니액, 애플 공동창업자)와 나는 애플을 우리 부모님의 차고에서 시작했습니다. 그때 나는 스무살이었습니다. 우리는 열심히 일했습니다. 10년이 지난후 애플은, 우리 둘만의 차고에서 20억 달러에다 4000명의 직원을 가진 회사로 성장했습니다.


 우리는 우리의 가장 훌륭한 발명품인 맥킨토시 컴퓨터를 1년 빨리 시장에 출시했는데 그 때 나는 막 서른 살이 될 때였습니다. 그리고 나는 해고를 당했습니다. 어떻게 자신이 만든 회사에서 해고를 당할 수 있느냐구요? 글쎄, 애플이 커가면서 우리는 회사를 운영할 어떤 사람을 고용했고 첫해는 그럭저럭 잘 되어 갔습니다. 그러나 그 후 우리들의 미래에 대한 관점에 차이가 나기 시작했습니다. 마침내 우리는 추락하기 시작했습니다. 우리 회사 이사회는 그를 지지했고, 서른 살이었던 나는 쫓겨났습니다. 성인으로서 내 삶의 초점이었던 모든 것들이 사라져버리고, 나는 참혹함에 빠졌습니다.


첫 몇달동안 나는 무엇을 할지 정말 몰랐습니다. 나는 앞서의 기업가 세대는 물러나게 된다는 어떤 느낌, 지휘봉을, 내게 전해진 것처럼 그렇게 내려놓았다는 느낌을 가졌습니다.  나는 데이비드 팩커드와 밥 노이스를 만났고 그들을 그렇게 못살게 군 데 대해 사과했습니다. 나는 아주 공식적인 실패자였습니다. 실리콘 밸리로부터 도망쳐 떠나버릴까도 생각했습니다.


그러나 어떤 것이 내게 떠오르기 시작했습니다.  나는 여전히 내가 하는 일을 사랑하고 있다는 것이었습니다. 애플에서의 일이 그것을 조금도 바꾸진 않았습니다. 나는 거부당했지만, 여진히 내 일을 사랑하고 있다는 것입니다. 나는 새롭게 출발하기로 결심했습니다.


그때는 전혀 몰랐지만, 애플에서 해고된 일은 내게 일어날 수 있었던 일중 최고의 경우였습니다. 성공에 대한 부담은, 모든 것에 확신은 갖고 있지는 않았지만, 새롭게 다시 시작할 수 있다는 가벼움으로 대체되었습니다. 그것이 내가 내 삶에서 가장 창조적이었던 시기로 들어갈 수 있도록 자유롭게 해 주었습니다.


이후 5년동안 나는 NeXT라는 회사, Pixar라는 이름의 다른 회사를 시작했고, 나중 내 처가 된 한 여성과 사랑에 빠졌습니다. 픽사는 세계 최초로 컴퓨터 애니메이션 영화인 토이스토리를 만들었고, 지금은 세계에서 가장 성공적인 애니메이션 회사가 되었습니다. 사건의 놀라운 반전 속에서 애플은 넥스트를 사들였고 나는 애플로 복귀했습니다. 그리고 내가 넥스트에서 개발한 기술은 애플의 현재 르네상스의 핵심이 되었습니다. 또한 로린과 나는 함께 한 가족을 만들었습니다.


내가 애플에서 해고되지 않았더라면 이런 일중 어떤 것도 일어나지 않았을 것이라고 나는 확신합니다. 그것은 두려운 시험약이었지만, 환자는 그것을 필요로 하는 것이었습니다. 인생이란 때로 여러분들을 고통스럽게 하지만, 신념을 잃지 말기 바랍니다. 나를 이끌어간 유일한 것은, 내가 하는 일을 사랑했다는 것이었다고 나는 믿습니다. 여러분들은 여러분이 사랑하는 것을 찾아야 합니다. 당신이 사랑하는 사람을 찾는 것과 마찬가지로 일에서도 같습니다.


여러분이 하는 일은 여러분 인생의 많은 부분을 채울 것입니다. 여러분이 진정으로 만족하는 유일한 길은 여러분 스스로 훌륭하다고 믿는 일을 하는 것입니다. 그리고 훌륭한 일을 하는 유일한 길은 여러분이 하는 일을 사랑하는 것입니다. 만일 그것을 아직 찾지 못했다면, 계속 찾으십시오. 주저앉지 마십시오. 언젠가 그것을 발견할 때 여러분은 마음으로부터 그것을 알게 될 것입니다. 그리고 어떤 훌륭한 관계에서 처럼, 그것은 해가 지나면서 점점 좋아질 것입니다. 그러므로 그것을 발견할 때까지 계속 찾으십시오. 주저앉지 마십시오.


   세번째 이야기는 죽음에 관한 것입니다.


내가 열일곱 살이었을 때, 나는 이런 비슷한 것을 읽은 적이 있습니다. "만일 당신이 매일을 삶의 마지막날처럼 산다면 언젠가 당신은 대부분 옳은 삶을 살았을 것이다." 나는 그것에 강한 인상을 받았고, 이후 33년동안 매일 아침 거울을 보면서 나 자신에게 말했습니다. "만일 오늘이 내 인생의 마지막 날이라면, 내가 오늘 하려는 것을 할까?" 그리고 여러날동안 그 답이 '아니오'라는 것으로 이어질 때, 나는 어떤 것을 바꿔야 한다는 것을 알게 되었습니다.


내가 곧 죽을 것이라는 것을 생각하는 것은, 내가 내 삶에서 큰 결정들을 내리는 데 도움을 준 가장 중요한 도구였습니다. 모든 외부의 기대들, 모든 자부심, 모든 좌절과 실패의 두려움, 그런 거의 모든 것들은 죽음 앞에서는 아무것도 아니기 때문에, 진정으로 중요한 것만을 남기게 됩니다. 당신이 죽을 것이라는 것을 기억하는 것은, 당신이 어떤 잃을 것이 있다는 생각의 함정을 피하는 가장 좋은 길이라고 나는 생각합니다. 여러분은 이미 벌거숭이입니다. 그러므로 여러분의 마음을 따라가지 못할 어떤 이유도 없습니다.


약 1년 전 나는 암 진단을 받았습니다. 나는 아침 7시30분에 스캔을 받았는데, 췌장에 분명한 종양이 발견되었습니다. 당시 나는 췌장이라는게 무엇인지도 몰랐습니다. 의사들은 이것이 치료가 불가능한 종류의 암이 거의 확실하다면서 내가 길어봐야 3개월에서 6개월밖에 살수 없다고 했습니다. 의사는 내게 집으로 가서 주변을 정리하라고 충고했습니다. 의사들이 말하는 죽음의 준비입니다. 그것은 가족에게 작별을 고하는 것입니다.


나는 그 진단을 하루종일 생각했습니다. 그날 저녁 늦게 나는 목구멍을 통해 내시경을 넣는 조직검사를 받았습니다. 몇점의 세포를 췌장에서 떼어내 조사를 했는데, 의사들은 놀랍게도 나의 경우 매우 드물게도 수술로 치료할 수 있는 종류의 췌장암임이 밝혀졌다고 아내에게 말했습니다. 나는 수술을 받았고 지금은 괜찮아 졌습니다.


이것이 내가 죽음에 가장 가까이 간 경우였습니다. 그리고 나는 앞으로 몇십년간은 그렇기를 바랍니다. 그런 과정을 거쳐 살았기 때문에, 나는 이제 죽음이라는 것을, 유용하긴 하지만 지적 개념만으로 알고 있었던 때보다는 좀 더 확신을 갖고 말할 수 있습니다.


누구도 죽기를 원하지 않습니다. 하늘나라 천국으로 가기를 원하는 사람조차 거기에 가기위해 죽기를 원하지는 않습니다. 하지만 죽은은 우리 모두가 함께하는 목적지 입니다. 누구도 거기에서 벗어나지 못했습니다. 죽음은 바로 그런 것입니다. 죽음은 생명의 가장 훌륭한 창조일 수 있습니다. 그것은 생명의 교체를 만들어 내는 매개체입니다. 죽음은 낡음을 청소하고 새로움을 위한 길을 열어줍니다.


지금 이순간, 그 새로움은 여러분들입니다. 그러나 미래의 어느날, 지금으로부터 그리 멀지 않을 그때, 여러분들도 점차 낡음이 되고 청소될 것입니다. 미안하지만 이것은 진실입니다.


여러분들의 시간은 한정되어 있습니다. 그러므로 다른 사람의 삶을 사느라고 시간을 허비하지 마십시오. 과거의 통념, 즉 다른 사람들이 생각한 결과에 맞춰 사는 함정에 빠지지 마십시오. 다른 사람들의 견해가 여러분 자신의 내면의 목소리를 가리는 소음이 되게 하지 마십시오. 그리고 가장 중요한 것은, 당신의 마음과 직관을 따라가는 용기를 가지라는 것입니다.  당신이 진정으로 되고자 하는 것이 무엇인지 그들은 이미 알고 있을 것입니다. 다른 모든 것들은 부차적인 것들입니다.


내가 젊었을 때, "전세계 목록"이라는 놀라운 책이 있었습니다. 우리 세대에게 그 책은 바이블과 같은 것이었습니다. 그 책은 이곳에서 멀지 않은 곳에 있는 스튜워트 브랜드라는 사람이 만든 것으로, 그는 시적인 면들을 가미해 책에 생명을 불어넣었습니다. 그 책이 나온 게 1960년대로, 그 당시에는 개인용 컴퓨터도 데스크탑 출판도 없었기 때문에, 모든 것이 타이프라이터와 가위, 폴라로이드 사진들로 만들어진 것이었습니다. 말하자면 종이책형태의 구글 같은 것이었는데, 구글이 나타나기 35년전의 일입니다.


스튜어트와 그의 팀은 이 책을 여러번 개정했고, 결국 그 책의 역할을 다 했을 때 최종판을 내었습니다. 그것이 1970년대 중반이었습니다. 바로 내가 여러분의 나이 때입니다. 그 최종판의 뒷표지에는, 여러분이 탐험여행을 하다가 지나가는 자동차를 얻어타기 위해 손을 드는 곳과 같은, 이른 아침 시골길을 찍은 사진이 인쇄돼 있었습니다. 그 밑에 이런 말이 적혀 있었습니다.

"늘 배고프고, 늘 어리석어라"(Stay Hungry. Stay Foolish)

이것이, 그들이 책을 더이상 찍지 않기로 하면서 한 작별의 메시지입니다. Stay Hungry. Stay Foolish. 나는 나 자신에게 늘 이러기를 바랬습니다. 그리고 지금, 여러분이 새로운 출발을 위해 졸업하는 이 시점에서, 여러분들이 그러기를 바랍니다.

Stay Hungry. Stay Foolish.

감사합니다.


원문 : http://goworld.tistory.com/234



======== 연설문 MP3 ========


블로그 이미지

유효하지않음

,
[출처]http://miniwolf.tistory.com/78




"부패한 정부는 모든것을 민영화한다" 
미국의 양심 언어학의 혁명가라 불리는 노암 촘스키가 한 말입니다. 
  
  

노암 촘스키 미국 매사추세츠공과대학 언어학과 교수의 말이다. 
촘스키는 그의 저서 '누가 무엇으로 세상을 지배하는가'에서 
"공기업의 민영화는 공공부문을 민간기업과 
다국적 자본에 팔아넘기려는 속임수일 뿐"이라고 주장한다. 
  

촘스키의 분석은 2008년 대한민국에서 일어나고 있는 대대적인 공기업 민영화 
또는 선진화 계획의 본질을 정확히 설명해준다. 
이날 이 대통령의 발언을 정리하면 정부가 지난달 발표했던 305개 
공공부문 개혁방안을 그대로 유지하고 있음을 알 수 있다. 
  
  
촘스키의 지적처럼 
정부의 진짜 관심은 민영화 과정에서 얻게 될 천문학적인 규모의 매각대금에 있다. 
지난해 말 기준으로 정부 출자지분은 납입자본금 기준으로 76조5000억 원에 이른다. 
여기에 자산관리공사와 예금보험공사, 산업은행 등이 보유하고 있는 구조조정 기업들의 
주식을 더하면 100조 원을 거뜬히 넘어선다. 
이 돈은 대규모 감세로 헐렁하게 된 정부 재정을 메우는데 들어갈 가능성이 크다. 
(2008년 06월 20일 미디어 오늘) 
  
  
노암 촘스키는 FTA를 반대하는 게 아니라 본질적인 문제들이 해결되지 않은 상태에서 
(미국소 문제를 예를 들자면, 검역주권이라든지, 광우병 감염될 확률이 높은 부위를 들여오는 문제, 월령 문제 등) 
FTA를 체결할 경우 대재앙의 위기에 직면하게 될 수 있다고 했습니다. 
  

그만큼 FTA를 신중하게 처리해야 한다는 겁니다. 그러나 현 정부는 어떻습니까? 
속전속결, 무식한 불도저식 밀어붙이기로 끝장을 보려고 하고 있지요. 
  

국민의 80%가 반대하는 미국소를 월령제한도, 광우병 위험 물질 제거도 없이, 
광우병 걸려도 수입 중단이 될 수 없고, 
검역주권도 빼앗긴 채 들여오고 있는 현실입니다. 



이명박 정부는 민영화하기를 계속해서 추진하고 있습니다. 
국민들이 거세게 반대하자 '선진화'라는 말로 바꾸어 
이미 27개 공기업을 민영화한다고 발표했습니다. 
공기업 선진화 방안은 결국 민영화인 겁니다. 



이렇듯 꼼수를 부리는 이명박 정부에 과연 얼마만큼의 믿음을 가질 수 있을까요? 
대한민국2%만을 위한 정부와 여당. 이 모든 것을 봐도 
노암 촘스키의 말에 고개가 절로 고개가 끄덕여질 뿐입니다.
블로그 이미지

유효하지않음

,


블로그 이미지

유효하지않음

,
[출처] 이정환 닷컴

금산분리 완화는 삼성의 오래된 숙원 과제였다. 정부 관료들은 "이러다가는 국내 은행들이 모두 외국에 넘어간다"고 설레발을 쳤고 언론은 "돈 출신을 묻지 말자"고 바람을 잡았다. 론스타는 안 되고 삼성은 된다? 그것 참 이상한 발상이다. 핵심은 국내냐 해외냐를 막론하고 금융기관의 대주주가 될 자격이 없는 자본에 은행의 지분을 넘겨서는 안 된다는 것이다. 은행은 영리기업이 아니다. 은행을 싸게 사들여 비싸게 되팔겠다는 론스타나 은행을 끼고 계열사들 지배 구조를 강화하려는 이건희 일가나 위험하기는 마찬가지다. 오죽하면 은행은 군대보다 더 무서운 무기라고 하겠는가. 

전에 말했던 MB악법 반대 릴레이 만화 단행본에 들어갈 짧은 해설. 딱 200자로 줄여달라고 그래서 이렇게 써서 보냈다. 박철권의 만화와 함께 실릴 거라고 한다.

블로그 이미지

유효하지않음

,

먼저 ERWin 7.3을 사용했습니다.

아직까진 MySQL을 Oracle처럼 깔끔하게 지원하지 않네요..(새로 나온 8.x에서는 지원될려나 모르겠는데..과자 구하기가 힘드네요.ㅎㅎㅎ)

문제는 DEFAULT CHARSET UTF-8, InnoDB, COMMENT 등이 생성되지 않고

매번 SQL 스크립트 수정하는것도 귀찮고 힘들고 시간에 쫓기고 해서 ERWin 생성 스크립트를 아예 수정했습니다.


* 순서대로 Physical/Logical 로 파일을 생성한다.
* Physical 모드에서 모델(테이블)을 선택한후 우클릭해서
  Table Properties > Comment 를 클릭해서  테이블 코멘트를 입력함.(중요, 꼭입력함)




* Physical 모드



* Logical 모드



* Logical 모드의 Attribute 명을 Physical 모드의 코멘트로 변환 (별도로 코멘트를 등록했다면 이부분은 넘어가도됨!!!)
  Physical 모드 메뉴에서 Model > Domain Dictionary 선택
  Tab 메뉴에서 Comment 선택하고 Comment Inherited by Col:*  %AttName  입력하고 OK 버튼 클릭



 다시 Physical 모드에서 모델(테이블)을 선택한후 우클릭해서 Columns 선택한후 Reset 버튼 클릭함

 


 All columns of table [table name](선택 테이블만 적용) 또는 All columns in model(전체적용) 체크하고
 Select Properties to Reset: 에서 Comment 만 체크함(중요) OK 버튼을 클릭함. 



* 실제 스크립트 생성하기
메뉴 > Tools > Forward Engineer > Schema Generation 선택
설정 내용을 아래 이미지처럼 설정한 후 별도로 설정내용을 저장해 두자.
















첨부한 파일을 특정 디렉토리에 복사한뒤 파일을 적용하고 Preview 버튼을 클릭해서 생성 스크립트를 확인해 본다.

 

* 실제 적용한 스크립트 내용임


 

** MySQL 5.X 적용 ER-win 스크립트 **
==========================================

==========================================
블로그 이미지

유효하지않음

,