'기타'에 해당되는 글 26건

  1. 2020.07.13 Goodbye OOP
  2. 2012.12.13 GameKit for iOS build 3
  3. 2012.12.07 Build OGRE for android 5
  4. 2012.12.07 Ogre Source Build 2
  5. 2012.11.14 SHA256 java and iOS 2
  6. 2011.06.27 MoSync code goole site and way to build 3
  7. 2011.03.18 음성인식 방법. 1
  8. 2010.11.02 BONDI Feature Access (1) 372
  9. 2010.10.12 SSL의 이해!! 1
  10. 2010.08.12 PendingOperation 4
기타2020. 7. 13. 15:42

https://medium.com/@cscalfani/goodbye-object-oriented-programming-a59cda4c0e53

 

Charles scalfani의 글이 흥미로워서 정리해보았다.

 

수십년간 개발자로 살아온 나에게도 OOP는 종교였다. 

상속, 캡슐화, 다형성은 이 페러다임의 3개의 기둥이다.

 

이 기둥 3개로 우리는 실세계의 모든 상황을 모델링할 수 있다고 배웠다.

 

필자는 더이상 잘못된 방향으로 살고 싶지 않았다며 본인의 감회를 풀어낸다.

 

먼저 상속..

 

 

첫번째 문제 상속

 

OOP의 가장 큰 장점으로 설명되며 아주 전통적인 예로 Shape를 가지고 설명들을 한다.

 

 

 

 

많이 보았을 거다. 그리고 우리는 재사용성이라는 외마디를 외치게 된다. 신념에 차서.

 

재사용을 위한 모든 준비는 되어 있고 언제든 이를 다시 사용할 시기만 학수고대 할것이다.

 

Banana Monkey Jungle Problem

 

그리고 마침내 새로운 프로젝트가 시작되고 나의 소중한 코드들을 가져와서 사용하려고 할것이다.

 

이런! 부모클래스도 필요하네?

이런! 부모의 부모클래스, 그 부모의 부모클래스도 필요하네??

아 하지만 문제 없어 난 할수 있어~

이런 다 했는데 왜 컴파일이 안되지? 오 이런 이 클래스가 저 클래스를 참조하자나.. 저것도 가져와야 해.. 

머 가져오지 머.. 문제 없어.

 

오~ 이런 난 이런 클래스들은 필요가 없다구. 먼가 잘못되었어..

 

Erlang의 창시자인 Joe Amstrong의 말이 있지.

 

"OOP의 문제는 당신은 단지 바나나를 원하지만 그 바나나는 바나나와 정글전체를 쥐고 있는 고릴라라는 것이다"

 

이를 두고 banana monkey jungle 문제라고 한다.

 

이 문제를 해결하기 위해 필자는 hierarchy를 너무 깊이 설계하지 않는다. 

하지만 재사용성을 상속의 핵심이라고 한다면 메커니즘에 이런 제한을 주는것은 재사용의 이점에 대한 제한이 될것이다.

 

그러면 진짜 속시원한 해결책은 무엇일까?

 

포함(contain)과 위임(delegate)라고 생각한다.

 

Diamond Problem(다중상속문제)

 

 

 

 

대부분의 객체지향언어는 논리적으로 작성된것 같지만 이를 지원하지 않는다. 객체지향언어가 이를 지원하기 위해 어려운 이유에 대해서는 다음 의사코드를 한번 보자

 

Class PoweredDevice {

}

 

Class Scanner inherits from PowerdDevice {

  function start() {

  }

}

 

Class Printer inherits from PoweredDevice {

  function start() {

  }

}

 

Class Copier inherits from Scanner, Printer {

}

 

위 의사코드를 보면 Scanner와 Printer 클래스가 모두 start함수를 구현하고 있다.

Copier의 start를 호출하면 Scanner나 Printer의 어떤 start가 호출될 수 있을까? 알수 없다.

 

이에 대한 해결책은 간단하며 위와 같이 설계하지 않고 따로 따로 구현하면 된다.

하지만....... 어떻게 모델링해야 하지?? 재사용은 포기하고 싶지 않고?

 

이 때 포함 위임을 통해서 해결리 가능하다.

 

Class PoweredDevice {

}

 

Class Scanner inherits from PoweredDevice {

  function start() {

  }

}

 

Class Printer inherits from PoweredDevice {

  function start() {

  }

}

 

Class Copier {

  Scanner scanner

  Printer printer

  function start() {

    printer.start()

  }

}

 

Copier클래스가 이제 Printer와 Scanner의 인스턴스를 포함하고 있다.  start함수의 구현은 Printer 클래스에 위임하고 있다. 이는 쉽게 Scanner에 위임이 가능하다.

 

 

깨지기 쉬운 기반클래스 문제

 

이제 나는 상속을 얕게 만들고 다중상속되지 않도록 하여 Diamond문제는 발생하지 않게 하였다.

 

모든건 잘 될거라고 생각하지만...

 

어떤날은 잘 동작하고 어떤날은 동작을 멈춘다.. 코드는 변경된바가 없는 체로...

 

버그가 있겠지.. 하지만 변경한적이 없는걸...

 

이라고 개발자들은 자기위안을 삼지만... 이 코드의 세계는 그렇게 호락호락하지 않다.. 거기에 버그는 있게 마련이다. 반드시~

 

내가 작성한 코드에는 문제가 없었지만 내가 상속한 클래스에서 변경이 발견되었다면... 가능하다.

 

어떻게 내가 상속했던 기반클래스이 변경이 왜 나의 코드에 예외를 발생하는것일까?

 

다음의 자바코드를 살펴보자

 

import java.util.ArrayList;

 

public class Array {

  private ArrayList<Object> a = new ArrayList<Object>();

  public void add(Object element) {

    a.add(element);

  }

  public void addAll(Object element[]) {

    for (int i=0; i<element.length; i++) {

      a.add(element[i]); // this line is going to be changed..

    }

  }

}

주석된 라인의 코드에 주목하자. 여기서 바로 향후 예외가 발생할 수 있다.

 

여기 add와 addAll함수가 있다. add는 엘리먼트하나를 addAll은 다수의 엘리먼트를 추가하는데 add를 호출하여 추가하고 있다.

 

이제 상속한 클래스를 하나 정의해보겠다.

 

public class ArrayCount extends Array {

  private int count = 0;

  @Overrie

  public void add(Object element) {

    super.add(element);

    ++ count;

  }

  @Override

  public void addAll(Object elements[]) {

    super.addAll(elements);

    count += elements.length;

  }

}

 

ArrayCount클래스는 일반적인 Array 클래스의 특별한 버전이다. 다른점은 ArrayCount는 count로 엘리먼트의 개수를 저장하고 있다는 것이다.

 

두 클래스를 자세히 살펴보자. 자세히 ...

 

Array add는 로컬 ArrayList에 엘리먼트를 추가

Array addAll은 로컬 ArrayList에 엘리먼트들을 추가

 

ArrayCount add는 부모의 add를 호출하고 count를 추가한다.

ArrayCount addAll은 부모의 addAll을 호출하고 엘리먼트의 개수만큼 count를 추가한다.

 

예상한데로 정확히 동작한다.

 

자 이제 예외를 유발하는 변경을 주석된 라인부분을 다음과 같이 수정되었다고 하자.

 

public void addAll(Object elements[]) {

  for (int i=0; i<elements.lenggh; ++i) {

    add(elements[i];

  }

}

 

기반클래스의 소유자가 의도한 대로 자동 테스트는 여전히 패스된다.

 

하지만 소유자는 상속한 사실을 잘 잊게 마련이고 미련하기도 하다.

 

ArrayCount addAll은 부모의 addAll을 호출하고 내부에서 오버라이드된 상속된 클래스의 add를 호출하게 된다. 이는 상속된 클래스에서 addAll에서 추가되면서 카운트가 한번더 증가될수 있다. 

 

중복해서 카운트가 증가될 수 있다는 것이다. 실제 엘리먼트 개수와 다르게..

 

만일 이런 문제가 발생한다면 개발자는 기반클래스가 어떻게 구현되어 있는지 확인이 필요하게 되며 기반클래스 작성자는  변경이 발생하게 되면 이 클래스를 사용하는 개발자들에게 모두 알려야 한다. 

 

이런 잠재적인 문제는 상속이라는 기둥에 대해 불신하게 한다.

 

이에 대한 해결책은 다시한번 포함과 위임이다.

 

포함과 위임으로 우리는 화이트박스프로그래밍에서 블랙박스프로그래밍으로 갈수 있다. 화이트박스프로그래밍에서는 기반클래스의 구현을 알아야 한다.

 

블랙박스프로그래밍은 기반클래스에 코드를 주입할 수 없기 때문에 완전하게 무시할 수 있다. 단지 인터페이스에 집중할 수 있다.

 

이 트렌트는 혼란스럽다.

 

상속은 재사용에 있어서 큰승리로 여겨졌다.

객체지향언어는 포함과 위임보다 상속이 쉽게 설계되었다.

 

이젠 상속에 대해 근원적인 의시밍 생기기 시작했을것이다. 중요한것은 계층을 통한 분류를 맹신하지 않아야 한다는 것이다.

 

 

계층화의 문제

 

새로운 회사를 시작할 때 마다 회사문서를 어디에 위치시킬지 고민하게 된다. 예를 들어 직원명부등..

 

문서폴더를 만들고 회사폴더를 만들건지. 또는 회사폴더를 만들고 문서폴더를 만들지...

 

어떤게 맞고 최선인건가....?

 

분류기반 계층화에서 기반클래스는 좀더 일번적인것이고 상속(자식)클래스는 좀더 특화된 것들이다. 그리고 좀 더 특화된 것들이 상속체인의 끝부분에 위치하게 된다.

 

하지만 그 위치를 변경하면 이 모델에서 먼가 확실하게 잘못되게 된다.

 

이게 머가 잘못된 것일까...?

어떤 계층구조가 맞는 것인가..?

 

포함

 

실세계를 살펴본다면 포함계층화(배타적소유계층화)를 어디에서든지 보게 될것이다. 찾아볼수 없는것은 분류기반계층화이다. 객체기반 페러다임은 실세계 모델링을 기반으로 하며 하나는 객체로 간주된다. 이는 잘못된 모델이다. 실세계는 없다.

실제로 실세계는 포함계층화에 가깝다. 당신의 양말이 아주 훌룡한 예이다. 양말은 서랍에 포함되고 옷장에 포함되고 침실에 포함되고 집에 포함되어 있다.

 

PC 저장장치도 그 예 인데. 파일들을 포함한다.

 

그래서 이제 어떻게 분류할건가?

 

자 이제 회사문서를 생각해보자면 어디에 위치하던지 문제가 안된다. document폴더나 stuff폴더에 위치시킬수 있다.

그리고 분류는 태크로 가능해진다. 다음과 같은 태그로 태그할 수 있다.

 

Document

Company

Handbook

 

태그는 순서나 계층이 없다. 이는 diamond 문제도 해결한다.

태그는 문서에 대해 여러 타입을 지정할 수 있어서 인터페이스와 유사하다.

 

균열이 너무 많으면 상속기둥이 무너진것처럼 보인다.

 

 

두번째문제 캡슐화

 

캡슐화는 객체지향이 갖고 있는 두번째 큰 장점이다.

객체의 상태는 외부에서 보호된다. 

누군가에 의해 접근되는 글로벌변수에 대한 걱정을 더이상 할 필요가 없다.

 

캡슐화는 변수들에 대해 안전하다. 아주 끝내준다. 원원하라 캡슐화여..

 

참조의 문제

 

캡슐화는 참조의 문제가 있다. 

객체는 함수에 전달될 때 값이 아니라 참조로 전달된다.

 

이는 함수는 객체를 전달하지 않으며 대신에 참조나 객체의 포인터를 전달하게 된다는 것이다.

 

만일 객체가 객체생성자에 참조로 전달된다면 이 생성자에서는 캡슐화로써 내부에 private 변수로 참조를 저장할 수 있다.

 

이제 전달된 객체는 안전하지 않다.

 

왜냐구? 일련의 다른 코드에서 객체의 포인터를 갖게 되기 때문이다. 그 코드는 생성자로 호출된다. 그렇다면 생성사로 전달 할 수 없는 객체에 대한 참조를 가져야 하나?

 

해결책은 생성자는 전달되는 객체를 복재해야 한다. 그리고 얕은 복제가 아니고 깊은 복제이어야 한다. 즉 객체가 포함하는 객체들이 있다면 모두 복제되어야 한다.

 

여기서 망하는 지점이 있다. 모든 객체가 복제가 가능한것이 아니다. 일부 운영체제 리소스들은 불가할 수 있다.

 

싱글메인스트림의 객체기반 언어들을 이 문제를 가지고 있다.

 

안녕.. 캡슐화

 

 

세번째 문제 다형성

 

다형성은 객체지향 삼위일체의 빨간머리 의붓자식이다. 일종의 Larry Fine이다.

그가 어디 있던지 그는 하나의 캐릭터이다.

 

다형성이 위대하지 않다는것이 아니다  객체지향언어에서 취할필요는 없다는 것이다.

 

인터페이스가 이를 지원할것이다. 그리고 인터페이스는 얼마든지 다양한 행위에 대해서 섞어서 제한없이 구현이 가능하다.

 

따라서 우리는 객체지향다형성에 대해서는 안녕을 고하고 인터페이스기반의다형성을 반겨야 할 때 이다.

 

 

 

약속의 깨기

 

자 객체지향은 그동안 오랬동안 약속을 해왔다. 이런 약속은 교실에 앉아있는 네이티브프로그래머, 블로그의 읽을거리들 그리고 온라인코스를 학습자들에게 여전히 유효하다.

 

객체지향의 거짓말을 깨닫는데 몇년이 걸렸다. 눈은 없어서 경험이 없고 신뢰를 했다.

그리고 나는 완전히 타버렸다.

 

안녕.. 객체지향!

 

 

 

그럼 어쩌라고?

 

함수형 프로그래밍~ 이다. 수년동안 아주 잘 사용되어 왔다. 

 

한번 타버리면 창피함이 두배가 된다 

 

 

 

세줄정리

 

1. 상속은 재사용의 어머니 이지만 나에게 필요없는 넘들까지 줄줄이 딸려온다.

2. 캡슐화는 객체가 참조로 전달될 수 있다는 점에서 쉽게 깨진다.

3. 다형성은 복잡하기만 하며 인터페이스로 단순하게 얼마든지 다양하게 구현이 가능하다.

 

이를 보완하기 위한 방법들은 포함과 위임이 있으며 최근에는 함수형프로그래밍으로 대체가 가능하므로 객체지향과는 안녕을 고하자..

 

 

Posted by 삼스
기타/Ogre3D2012. 12. 13. 11:26


http://blenderartists.org/forum/showthread.php?155310-GameKit-new-Blender-game-engine-using-Ogre-Bullet-DirectX-OpenGL-Mac-Linux-iPhone&p=1701697#post1701697

I am newbie in the area of opengl and iphone development, but I found this project very interesting and spent a few days to get know it better . Following this steps I successfully run that demo on iPhone Simulator:

  1. xcode - I've downloaded and installed latest Xcode (xcode_3.2.3_and_ios_sdk_4.0.2.dmg) from apple developer page.
  2. cmake - usign existing macports I've installed cmake 2.8.2 (with command line
    Code:
    port install cmake
    ), I suppose that downloading compiled version from http://www.cmake.org/cmake/resources/software.htmlshould be even easier.
  3. source - using svn from command line, in my Documents folder I've executed
    Code:
    svn co http://gamekit.googlecode.com/svn/trunk/ gamekit-read-only
    . And checked out revision nr 615 of the source tree.
  4. crate project - cd into new gamekit-read-only directory, create buil directory and execute cmake
    Code:
    cd gamekit-read-only
    mkdir build && cd build
    cmake .. -G Xcode -D OGREKIT_BUILD_IPHONE=1 -D OGREKIT_BUILD_GLESRS=1
     OGREKIT_BUILD_GLRS=0
  5. build - run Xcode and open and build project OGREKIT.xcodeproj from gamekit-read-only/build/ . Building process took c.a. 20-30 minutes.
I've also tried to run it on real iPad device, with some problems, but finally it worked:
  1. change target config - Targeted Device Family - to iPad
  2. change Architecture i Valid Architecture to armv7
  3. put valid Code Signing Identity
  4. check off Compile for Thumb - I'm not sure if this is right solution, but with this option checked on I got 6 compile errors f.e."error: branch out of range in Engine/AI/gkNavPath.cpp"
Ok, it's working now, but with some issues, I've only tried the "Debug" compile mode, maybe this is the source of some problems.
  • It is staring/loading - 40 seconds.
  • It starts only once, or only run via Xcode and usb cable. After disconecting from mac, and trying to run by pressing app icon it just shows black screen for 40 seconds and switches off.
  • It looks and sounds great, render fast, but it restponds to touch events after 15-20 seconds.

Posted by 삼스
기타/Ogre3D2012. 12. 7. 18:04


http://www.ogre3d.org/tikiwiki/CMake%20Quick%20Start%20Guide?tikiversion=Android

Download the dependencies and extract inside the OGRE src dir. The deps are compiled for armeabi and armeabi-v7a.

http://sourceforge.net/projects/ogre/files/ogre-dependencies-android/1.9/AndroidDependencies.zip/download

  
Windows:

1. Download and install the android sdk
http://developer.android.com/sdk/index.html

2. After the install open the "Android SDK Manager" and download & install your target API. 
Here we target the lowest possible API - which is API10 Android 2.3.3. 
Due the usage of the native activity and the asset manager if we would skip these we could go a bit lower but that would not make much sense because OGRE still needs a decent hardware to run.

3. Now add the install directory to your enviroment variables -> ANDROID_SDK = C:\Users\wolfmanfx\AppData\Local\Android\android-sdk

  • Append %ANDROID_SDK%\tools and %ANDROID_SDK%\platform-tools to your PATH variable

4. Download the android ndk

  • Extract the content to C:/android/ndk and create a env var %ANDROID_NDK%
  • Add %ANDROID_NDK% to your path
http://dl.google.com/android/ndk/android-ndk-r8c-windows.zip
Android NDK revision 8b is not supported due a bug in the toolchain

5. We need ant (http://ant.apache.org/bindownload.cgi) to build projects from the command line

Apache Ant(TM) version 1.8.4 compiled on May 22 2012

6. The build command for the deps (using Visual Studio command prompt)

cmake -G"NMake Makefiles" -DCMAKE_TOOLCHAIN_FILE=..\cmake\android.toolchain.cmake -DANDROID_ABI=armeabi ..
nmake

7. The build command for ogre (for armeabi - if you want to build for armeabi v7a just remove -DANDROID_ABI=armeabi) create a build dir inside the OGRE src tree and cd to this dir and execute this command:

cmake -G"NMake Makefiles" -DCMAKE_TOOLCHAIN_FILE=..\cmake\toolchain\android.toolchain.cmake -DOGRE_DEPENDENCIES_DIR=..\AndroidDependencies -DANDROID_ABI=armeabi -DANDROID_NATIVE_API_LEVEL=9 ..

OSX:

cmake -DCMAKE_TOOLCHAIN_FILE="`pwd`/../CMake/toolchain/android.toolchain.cmake" -DOGRE_DEPENDENCIES_DIR="`pwd`/../AndroidDependencies" -DANDROID_ABI=armeabi -DANDROID_NATIVE_API_LEVEL=9 ..

  


Posted by 삼스
기타/Ogre3D2012. 12. 7. 14:45


OGRE build가이드

오거는 Cmake를 사용한다. 이 가이드는 이에 대한 설명이다.

1. CMake?

CMake는 cross-platform build system이다. CMake script들의 셋으로 native build시스템을 오거 빌드를 위해 만들어준다.

2. CMake는 어디서 나나?

http://www.cmake.org(Resources -> Downloads)에서 구할수 있다. 소스로도 받을 수 있지만 이미 컴파일된 모든 플랫폼의 바이너리들을 다운받을 수 있다. 

3. Dependency들은 어디서 구하나?

freetype lib가 필요한데 그 외에 다른 것들이 더 필요하다. 소스또는 바이너리를 각 배포사이트를 통해서 얻을 수 있다. ogre에서도 몇몇 플랫폼들에 대해서 미리컴파일된 디펜던시들을 별도로 제공하고 있다.

http://www.ogre3d.org/download/source 를 참조하라.

Linux에서는 디펜던시를 바로 설치가 가능하다. Ubuntu Karmic의 경우 다음 명령으로 설치가 가능하다.

> sudo apt-get install libfreetype6-dev libboost-date-time-dev \

>   libboost-thread-dev nvidia-cg-toolkit libfreeimage-dev \

>   zlib1g-dev libzzip-dev libois-dev libcppunit-dev doxygen \

>   libxt-dev libxaw7-dev libxxf86vm-dev libxrandr-dev libglu-dev

해당 디펜던시의 미리컴파일된 바이너리를 구할 수 없다면 아래기술한 리스트를 참조해서 소스를 해당 웹사이트에서 구한 후 직접 빌드해서 사용해야 한다.
필수 디펜던시
* freetype: http://www.freetype.org
권장 디펜던시
* Boost: http://www.boost.org (+)
* Cg: http://developer.nvidia.com/object/cg_toolkit.html
* DirectX SDK: http://msdn.microsoft.com/en-us/directx/
* FreeImage: http://freeimage.sourceforge.net
* zlib: http://www.zlib.net
* zziplib: http://zziplib.sourceforge.net

(+) Boost는 threaded version의 ogre에서 사용된다. boost-thread와 boost-date_time lib만 필요하다. VisualC++의 경우 http://www.boostpro.com에서 설치 가능하다. 대안으로 POCO나 TBB를 사용할 수 있다.

4. 빌드환경 준비
Ogre source가 있는 소스외부에 빌드를 위한 디렉토리를 만들어야 한다. 이 디렉토리는 CMake가 당신이 선택한 플랫폼과 컴파일러 그리고 Ogre lib이 컴파일될 디렉토리이다.
이렇게 하야 Ogre source 디렉토리는 항상 깨끗하게 유지할 수 있고 여러가지 빌드환경을 만들 수 있게 된다.
윈도우환경이라면 'Dependencies'라고 불리는 공통리텍토리에 컴파일된 모든 바이너리들을 모아야 한다. 여기에 bin, lib, include디렉토리가 있어야 하 고 각각 .dll, .lib 그리고 헤더파일들을 위치시켜야 한다(만일 미리컴파일된 바이너리 패키지를 사용한다면 이미 이러한 형태로 만들어져 있을 것이다.)

5. Cmake 실행하기
이제 cmake-gui를 실행해라. 'Where is the source code'필드에 Ogre source 디렉토리를 입력한다. 'Where to build the binaries"필드에 4.에서 생성한 빌드디렉토리를 입력한다.
'Configure'를 누른다. generator중 하나를 선택하라는 대화상자가 뜬다. 원하는 platform과 compilier를 선택한다. Unix에서는 'Unix Makefiles'를 VisualStudio는 해당하는 버전과 (Win32 | Win64)를 그리고 애플은 Xcode를 선택한다.
'Finish'를 누른다. CMake는 이제 빌드환경에 대한 정보들을 수집하고 의존성들을 배치할것이다. 
이 때 빌드옵션들을 보여줄것이다. 이 때 링크설정을 변경할 수 있는데 예를 들어서 OGRE_BUILD_XXX옵션을 켜거나 끌수 있다. 한번 설정이 다 되면 'Configure'를 다시한번 누르고 'Generate'를 누른다. 그러면 CMake가 빌드시스템을 만들어 준다.
의존성 배치 -> 만일 의존성관련해서 에러가 나면(3.을 잘 수행했음에도 불구하고), CMake가 어딜 바라보고 있는지 확인해야 한다. Unix의 경우 CMake는 standard location들에 설치되었다면 모든 의존성을 찾을 수 있어야 한다.  만일 4.의 절차를 정상적으로 수행하였다면 OGRE_DEPENDENCIES_DIR에 디렉토리가 정상적으로 지정되었는지 확인해야 한다. 그렇지 않으면 각 의존성별로 디렉토리를 설정해주어야 한다. 'Add entry'를 선택하고 CMake variable을 추가하면 되는데 'PATH'를 선택한다. variable의 이름은 XXX_HOME인데 XXX는 각 의존성패키지명이다(ex: ZLIB_HOME, ZZIP_HOME, FREETYPE_HOME). 각 디렉토리들을 입력하고 'Ok'를 누른다. 설정이 끝났으면 'Configure'를 다시 진행한다.

6. Ogre 빌드하기
빌드디렉토리로 이동한다. CMake는 빌드시스템을 하나 만들었다. VisualStudio를 사용한다면 OGRE.sln이 생겼을 것이다. 이 파일을 열고 'BUILD_ALL'타겟을 컴파일해보아라. MacOS에서는 xcode project가 생겼을 것이다. 이를 열어서 빌드해보아라.
Makefile generator를 선택하였다면 console을 열고  빌드디렉토리로 이동해서 make를 호출해라.
> make
doxygen이 설치되어 있다면 다음 명령으로 API문서를 생성할 수 있다.
> make doc

7. Ogre 설치하기
빌드가 성공하면 빌드된 라이브러리와 헤더들을 따로 관리할 수 있다.  VisualStudio에서 'INSTALL'타겟으로 빌드를 하면 'sdk'폴더를 만들고 거기에 복사한다. Makefile 빌드에서는 >make install or >sudo make install로 설치할 수 있다. 리눅스에서는 /usr/local에 설치하게 되는데 이걸 바꾸고 싶다면 CMAKE_INSTALL_PREFIX를 수정하면 된다.

8. MacOS에서 iOS향으로 빌드하기
cmake-gui에서 OGRE_BUILD_PLATFORM_APPLE_IOS를 확인해야 함. 불행히도 몇가지 옵션을 수동으로 해주어야 한다.
빌드디렉토리에 xcode project가 생성되어있기 때문에 ogre를 빌드하려면 OGRE.xcodeproj를 열고 빌드하면 된다. 단말에서 돌릴려면 아시다시피 개발다 인증서가 설치되어야 한다.
CMake가 당신이 어떤 Xcode project format을 원하는지 알수 없기 때문에 당신이 직접 수정해야 한다. Project메뉴를 열어서 Edit Project Setting를 선택해라. General tab을 선택하고 Project Format을 Xcode 3.1-compatible로 변경해라.
또 다른하나는 Info.plist에서 bundle ID를 수정하는것이다. 이것은 Code signing id와 연관되며 이와 관련된 설정은 여기서 다루지 않는다. 이에 대한 자세한 정보는 http://developer.apple.com/library/ios/documentation/Xcode/Conceptual/iphone_development/index.html
 를 참조하라.



Posted by 삼스
기타/Security2012. 11. 14. 14:40



http://blog.naver.com/PostView.nhn?blogId=olovesun&logNo=10117984983



Posted by 삼스
기타/MoSync2011. 6. 27. 18:24

빌드한번 해보려는데 머 이렇게 깔아야 하는게 많은지... ㅎㅎ;;;

1. official site
http://code.google.com/p/mosync/

2. way to SDK build
http://www.mosync.com/documentation/manualpages/building-mosync-source-windows
http://www.mosync.com/documentation/manualpages/building-mosync-sdk-source-os-x

3. windows에서 빌드하기 팁
아래 문서에 나온데로 그대로 진행하면 몇가지 문제로 인해 빌드가 되지 않는다.
http://www.mosync.com/documentation/manualpages/building-mosync-source-windows

먼저 문서의 8번째 스텝에 오타가 있는듯 하다.
아래 위치의 gdiplus로 시작하는 헤더파일들을 다른곳으로 복사하라고 했는데 문서에는 동일한 위치에 복사하란다.
C:\Program Files\Windows CE Tools\wce500\Windows Mobile 5.0 Smartphone SDK\Include\Armv4i\gdiplus*.h

이런 오타를 안고치고 있다니.. 참나

어쨋든 삽질하여 얻어낸 결론은 동일위치가 아니라 아래 위치에 복사해야 한단 것이다.
C:\Program Files\Microsoft Visual Studio 8\SmartDevices\SDK\Smartphone2003\Include 

그리고 VisualStudio 2005 프로젝트 파일에 WarnAsError컴파일 옵션이 모두 "true"로 되어 있다. 이 것을 "false"로 바꾸어야 빌드가 정상적으로 된다 안바꾸면 Warning을 Error로 인식하여 중단된다.
 
그리고 Simbian SDK 3rd FP1을 설치해야 하는데 노키아 개발자 사이트에서도 찾을수가 없었다. FP2가 현재 배포중이다. FP1으로 빌드스크립트가 짜져 있기 때문에 문제가 있다.

그래서 별수 없이 Simbian 플랫폼은 빌드하지 않도록 하여 성공하였다. 이렇게 하기 위해서는 ruby script를 좀 알아야 한다.

여러 오픈소스르 다루어 보았지만 이 소스는 좀 다루기가 짜증난다. 빌드하는데 이틀이나 걸리다니.. ㅎㅎ;;;
물론 나의 내공의 문제겠지만... 
Posted by 삼스
기타/Sound technology2011. 3. 18. 09:59

마이크로부터 음성을 샘플링 하였다면 어떻게 음성인식을 수행하는 걸까...

일단 ADC를 하였다면 샘플링은 끝난것이다.
음성인식을 위해서는 이제 특징벡터를 추출하고 인식어휘를 훈련하는 과정이 필요하다. 이 때 사용되는 알고리즘은 크게 HMM, DTW, NNet등이 있고 음성인식의 특징벡터는 MFCC, LPCC가 있는데 MFCC가 더 많이 쓰인다.

이 알고리즘을 통해 인식어휘를 훈련하여 특징벡터를 얻은 후 이제 마이크로 입력된 음성으로부터 동일방식으로 특징벡터를 얻어서 두 데이터를 비교하여 가장 근접한 대상어휘를 인식결과로 출력하면 된다.

여기서 중요한것은 바로 이 인식어휘를 확보하여 DB로 구축하는것이다.

자신의 음성을 인식하고자 한다면 자신의 음성으로 특징벡터를 구하여 DB를 구축하면 된다.
여러사람의 음성을 인식하고자 한다면 여러사람의 음성으로 특징벡터를 구하여 DB를 구축하면 된다.

참고서적 
  Multimedia Sound Programming : 영진출판사 한학용,하성옥,허강인공저
  음성언어정보처리 : 홍릉과학출판사 오영환저
 
Posted by 삼스
기타/BONDI2010. 11. 2. 17:04



BONDI Feature Access


Features의 인식과 구성에 관한것과 웹애플리케이션에서 그 정보에 어떻게 억세스하는지에 대한 요구사항에 대해 설명한다.


요구사항 요약과 원리

BONDI Web app의 의존성은 하나 이상의 features의 구성에 의해 결정된다.

하나의 Feature는 웹런타임에서 제공하는 연관된 기능에 대응된다. 이는 자바스크립트 인터페이스와 웹런타임의 동작에 대한 집합으로 정의된다.

하나의 feature는 유일한 IRI로 구분되며 BONDI web app에 의해서 의존성을 표현하는 하나의 유닛이다.

BONDI는 하나의 feature를 정의하거나 몇개의 feature를 정의하기도 한다. 각각은 인터페이스를 정의한다. BONDI framework에서 JavaScript API를 확장하고 싶다면 대응되는 feature를 반드시 정의해야 한다. JavaScript API와 feature를 추가하였다면 feature-set도 또한 정의해야 한다. IRI로 구분이 되며 feature들의 집합이다. 


framework과 연관된 요구사항들은 아래의 원칙들로 규합된다.

1. Feature 추가 : JavaScript API의 집합은 고정되어 있지 않다. 그리고 나중에 확장되기를 기대하고 있다. 

2. Feature 혁신 : 각 JavaScript API들은 스스로 시간이 지남에 따라 진화한다. 새로운 디바이스의 능력을 반영하기도 하고 새로운 유스케이스 또는 에러 수정, 이전 버전의 JavaScript의 결점을 보완하는것등을 통해서 진화한다. 

3. feature 정의의 분산 : feature의 정의는 어느 집단에 의해 제한되지 않는다. 누구나 정의가능하다(다만 다른디바이스와 호환은 포기).  feature의 정의는 단말생산자, 네트워운영자, 특별히 관심있는자, 각 서비스제공자나 퍼블리셔들에 의해 정의가능하다. 

프레임웍은 또한 동적으로 feature를 제공하기 위한 방안을 고려하여 설계 되었다.

4. 동적 feature 제공 : 확장메커니즘을 통해서 필드에 존재하는 디바이스에 새로운 feature를 추가할 수 있는 기능. 이 기능은 일반적으로 디바이스 플래싱을 다시하는 방법이 아니다. 확장메커니즘은 OS에서 제공가능한 방법이 되며 ActiveX나 브라우져의 플러그인등이 그방법이 될수 있다. 하지만 이 메커니즘은 반드시 제공되어야 하는 것은 아니며 feature 제공을 위해 표준화가 완전히 이루어진것도 아니다.

이런 원리가 의미하는것은 아래에 설명된다.

5. Feature들(interface와 구현을 포함하는)는 IRI로 구분이 가능하다.

6. 모든 Web App(website or widget)은 feature를 사용하기 위해 반드시 feature를 정의해야 한다.  이 정보는 Widget Recource의 Widget Configuration Document에 선언되어 있거나 또는 BONDI-defined API를 이용하여 프로그램으로 선언한수도 있다.

이 선언은 다음을 허용한다.

  - 웹런타임이 그 feature를 제공하는지 확인한다.

  - feature의 동적 제공을 허용한다.

  - 웹어플리케이션이 그 feature를 사용할 수 있는지 확인하는 억세스컨트롤을 허용한다.

  - 웹런타임이 어떤 feature를 로드하고 바인드해야 하는지 결정하는데 필요.

  - Widget User Agent가 위젯을 설치하기 전에 웹런타임에서 동작가능한 위젯인지 결정하는데 필요.


BONDI는 자체적으로 두종류의 feature를 정의한다.

1. BONDI JavaScript APIs : 이 feature는  BONDI-defined API와 직접적으로 연관된다. http://bondi.omtp.org/api/로부터 정의되어진다.

2. BONDI processing assertions : metadata와 assertions그리고 웹어플리케이션을 처리하기 위해 관련된 다른 directive들로 구성된다. http://bondi.omtp.org/meta/로부터 정의되어 진다.


위젯을 위해서 BONDI는 Widget Configuration Document에서 <feature> 태그로 위젯의 feature의존성을 기술할 수 있다.


의존성의 표현

BONDI는 다음 4가지를 정의한다.

1. Device Capability

2. JavaScript API

3. Feature

4. Feature Set


WebApplicaiton은 feature 의존성을 반드시 명시적으로 기술해야 한다. 웹런타임은 해당 feature가 명시적으로 요구되지 않은 상태에서는 유효한 feature가 없고 Security Policy에 의해 허용되면 접근가능지는 것을 보장해야 한다.

활성화된 접근성은 허용된 Web Application에 대해서만 유효하다.


요구사항

AS-0351 : 웹런타임은 반드시 명시적으로 연관된 feature를 기술하고 그 권한을 획득한 경우에만 JavaScript API를 사용할수 있게 해주어야 한다.

AS-0552 : 이미 유효한 feature가 있는지 결정할 수 있어야 함.


의존성의 정적 선언

Widget Configuration Document에 <widget> tag의 <feature> tag에 name과 required 속성으로 기술한다.

ex)

<widget xmlns="http://www.w3.org/ns/widgets" version="5602:5719M"id="http://tests.bondi.omtp.org/widgets/appconfig.wgt" width="640" height="480">

<name>BONDI appconfig compliance</name>

<author email="hendry@aplix.co.jp">Kai Hendry</author>

<feature name="http://bondi.omtp.org/api/bondi.requestfeature" />

</widget>

존성의 프로그래밍 표현

BONDI-defined APIrequestFeature를 통해서 표현 가능하다.

PendingOperation requestFeature(

      in RequestFeatureSuccessCallback successCallback,

      in ErrorCallback   errorCallback,

      in DOMString       name);


이 함수는 명명된 feature를 비동기로 요청을 하며 리턴값으로 pending operation object를 받는다. 성공하면 successCallback이 호출되며 실패하면 errorCallback에 DeviceAPIError가 발생한다. 


요청된 feature와 연관된 JavaScript API가 존재하면 모든 API들의 global property들이 successCallback이 호출되기 전에 접근가능해진다. 보통 해당 API set의 root object를 생성하며 생성이 성공하면 successCallback에 인자로 넘겨진다. 

Posted by 삼스
기타/Security2010. 10. 12. 17:10
기초적인 내용에 대해 잘 설명됨.

http://wiki.kldp.org/wiki.php/DocbookSgml/SSL-Certificates-HOWTO
Posted by 삼스
기타/BONDI2010. 8. 12. 16:33

BONDI interface API에서 PendingOperation은 비동기 호출에 있어서 중요한 요소이다.

이는 비동기 호출을 동기적으로 할 수 있는 방안을 제공하기도 한다. 즉 비동기 호출이지만 동기적으로 처리하고 싶을 때 사용할 수 있다.

아래와 같이 두개의 함수가 준비되어 있다.

PendingOperation.

        interface PendingOperation {
                boolean cancel();

                void wait();
        };

동작을 취소할 수 있는 방안을 제공하기 위해 고안된 비동기적으로 리턴하는 인터페이스이다.

cancel 함수

비동기적으로 백그라운드로 동작중인 동작의 취소를 호출한다. 이 함수는 항상 바로 리턴한다. false 리턴은 pending operation이 이미 끝났거나 기술적인 한계로 인해 cancel이 성공하지 못했을 때 한다. 결과적으로 동작은 완료 여부는 연계된 callback에 의해 결정난다. true 리턴은 취소가 성공했을 때 한다. 취소된 pending operation의 callback은 호출되지 않는다. wait중인 pending operation에 대해 cancel을 호출하면 false를 리턴한다. 즉 cancel은 성공하지 않는다.

wait 함수

비동기적인 동작이 끝날때 까지 대기한다. BONDI 비동기 메소드를 동기메소드인양 사용코자 할 때 사용가능하다.  동작이 끝날때 까지 thread는 대기 한다. 관련된 callback이 모두 처리된 후 리턴한다. 


아래의 예에서 "Feature loading accomplished"보다 "SUCCESS"나 "ERROR"가 먼저 뜨게 된다.
Code example
 var loadingsuccessful = 0;
 
 function successCB()
 {
                alert("SUCCESS");
                loadingsuccessful = 1;
 }
 
 function errorCB()
 {
                alert("ERROR");
                loadingsuccessful = 0;
 }
 
 function loadFeatureSynchronously()
 {
                var asyncop = bondi.requestFeature(successCB, errorCB, "http://bondi.omtp.org/api/messaging");
                asyncop.wait(); // waiting for messaging API to be loaded
                alert("Feature loading accomplished");
      return loadingsuccessful; // if 1, the messaging API was loaded synchronously and successfully
 }
 
 // The bondi.requestFeature() method is asynchronous by design.
 // bondi.requestFeature() start dummy asynchronous operation.
 // The call to loadFeatureSynchronously() results in SUCCESS or ERROR prompt prior to Feature loading accomplished prompt.
 
Posted by 삼스