2020/12/05

NVIDIA 그래픽스 카드에서 40 FPS로 고정되는 문제 수정 방법 - How to fix stuck at 40 fps on NVIDIA graphics card

"Whisper Mode"가 켜져 있을 경우에 기본 값인 40 FPS에 고정된다.

노트북에서 조용하게 게임하기 위한 옵션인데, 조용하게 게임할 필요가 없으면 아래와 같이 "Whisper Mode"를 비활성화한다. 

아래는 GEFORCE EXPERIENCE 화면이며 NVIDIA 제어판에서 게임별로 조정도 가능하다.


When "Whisper Mode" is on, it was fixed to the default value of 40 FPS.

This is an option to play quietly on a laptop, but if you don't need to play quietly, disable "Whisper Mode" as shown above.

It can also be adjusted for each game in the NVIDIA control panel.

2020/10/09

MakeHuman - 에셋 다운로더 플러그인 사용 방법(How to install asset downloader in MakeHuman)

1. Download and Install MakeHuman v1.1.1

아래의 링크에서 v1.1.1 버전을 받으면 됩니다. v1.2.0이 예정이고 여러모로 편하긴 한데 에셋 다운로더를 실행하면 크래시가 발생하기 때문에 v1.1.1을 사용하도록 합니다.

http://www.makehumancommunity.org/content/downloads.html


2. Download MHAPI for v1.1x

아마 MakeHuman에서 사용하는 API들을 플러그인에서 사용할 수 있도록 도와주는 플러그인 같은데, 에셋 다운로더 실행을 위해서는 필수입니다. 화면에 보이는 Code -> Download ZIP을 선택하면 됩니다.

https://github.com/makehumancommunity/community-plugins-mhapi/tree/last_version_for_mh_11x

주의할 점은 master 브랜치는 v1.2.0으로 업그레이드를 준비 중인지 v1.1.1에서는 동작하지 않습니다.

zip파일을 통채로 makehuman-1.1.1-win32의 plugins 폴더에 넣고 "여기에 풀기"를 하시면 됩니다.


3. Download Asset Downloader for v1.1x

MHAPI와 같이 아래에서 파일을 받아 압축을 풀어줍니다.

https://github.com/makehumancommunity/community-plugins-assetdownload/tree/last_version_for_mh_11x


4. Launch MakeHuman

MakeHuman을 실행하면 Community 탭이 생긴 것을 볼 수 있습니다.

Synchronization을 한번 해줍니다. 엄청 오래 걸립니다.


추가로 인텔 및 엔비디아 GPU를 모두 가지고 있는 하드웨어에서는 캐릭터가 깨지는 문제가 있는데 "Run with graphics processor -> High Performance NVIDIA Processor"를 선택하면 캐릭터가 깨지지 않고 나옵니다. v1.2.0에서는 해결이 된 것 같은데 빨리 v1.2.0 안정화 버전이 나왔으면 좋겠네요. (Please launch with High Performance NVIDIA Processor if you have graphic problems when rendering the character in MakeHuman v1.1.1)

2019/09/28

How to Install Mame on Jetson Nano

I confirmed launching mame for ubuntu 18.04 on Jetson Nano.
Option 1 is confirmed at this time, but option 2 is examining now.

You can install mame by APT for ubuntu 18.04 - L4T - (Option 1)
$ sudo apt install mame
$ DBUS_FATAL_WARNINGS=0 mame

But you can build latest version of mame - (Option 2)
$ git clone https://github.com/mamedev/mame.git -b mame0214
$ cd mame
$ make

Building mame takes long time to compile, so you need more patient than using apt

You can check it out and create branch after clone
$ git clone https://github.com/mamedev/mame.git
$ git checkout tags/mame0214 -b mame0214

Fix desktop sharing setting on L4T - Ubuntu 18.04


1. Fix crash when entering Desktop Sharing in Settings
  • $ sudo nano /usr/share/glib-2.0/schemas/org.gnome.Vino.gschema.xml
  • Add lines below at proper position
    <key name="enabled" type="b">
      <summary>Enable remote access to the desktop</summary>
      <description>
        If true, allows remote access to the desktop via the RFB
        protocol. Users on remote machines may then connect to the
        desktop using a VNC viewer.
      </description>
      <default>false</default>
    </key>
  • $ sudo glib-compile-schemas /usr/share/glib-2.0/schemas

2. Launch Desktop Sharing at startup 
  • Select a button at top left on Desktop after logged in
  • Search "Startup Applications" and select it
  • Select "Add" and fill some information on dialog
    • Name: Desktop Sharing
    • Command: /usr/lib/vino/vino-server
    • Comment: Launch Desktop Sharing

3. Reboot and connect by using your VNC viewer
  • $ sudo reboot

References:
https://bugs.launchpad.net/ubuntu/+source/unity-control-center/+bug/1741027/comments/11
https://askubuntu.com/questions/1062727/how-to-get-vino-vnc-server-to-start-on-startup-in-ubuntu-18-04-1

2018/09/11

블렌더 - 텍스쳐 머터리얼 사용하기 (Blender - Using Texture Material)

다른 사이트에 있는 내용이 너무 복잡하고, 안쓰면 자꾸 까먹어서 정리합니다.

0. 블렌더를 실행해서, 제일 먼저 아래의 Viewport Shading을 Material로 바꿔줍니다. (이거 안해주면, 백날 텍스쳐나 머터리얼에서 만지작해봐야 나오지가 않아요)


1. 하단의 Panel도 UV/Image Editor로 바꿉니다.



2. 아래의 화면에서 Cube를 선택하고 Tab키를 눌러 Edit 모드로 들어갑니다.



3. 오른쪽 Panel에서 Texture를 선택하고 Type은 Image or Movie로 변경합니다.


4. Type을 변경하면 생기는 New를 선택한다. 이미지 이름(여기서는 Texture Image)과 Width, Height 정하고 OK. 이미 이미지가 있으면 Open을 선택하고 부끄러우니까 이 페이지를 닫아주세요.


5. 이제 4번에서 만든 이미지를 디스크에 써줄껀데, 아까 1번에서 열었던 화면 아래의 UV/Image Editor에서 그림을 클릭하고 4번에서 만든 이미지를 선택합니다.


6. 그런 다음, Image > Save as Image를 선택해서 파일로 저장합니다.
혹시 이미지 편집을 하고 싶으면 여기서 저장한 이미지를 포토샵, Paint.NET 또는 GIMP 같은 이미지 편집 툴을 이용해서 수정하면 됩니다.



7. 마지막! 다시 오른쪽 Properties 패널로 가서 Reload 버튼을 선택하면 끝! 이미지 수정한 경우에도 Reload 버튼을 다시 한번 눌러주세요.


결과물!!!!


주의: 라이팅 위치 때문에 텍스쳐가 제대로 보이지 않을 때도 있습니다. 텍스쳐가 계속 검게 나오면 라이팅 위치를 이리저리 옮겨보세요.

2011/10/13

Linux에서 Android Target 연결하기

1. Android SDK 설치

2. Target 을 USB로 연결

3. USB ID 획득
    lsusb 명령어로 Target의 USB ID를 확인

    Bus 001 Device 002: ID 04e8:685e [Manufacturer]
    Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

    새로 연결된 타겟 뒤의 ID만 확인하시면 됩니다.

4. /etc/udev/rules.d/ 51-android.rules 파일에 USB ID 등록
위에서 얻은 ID를 해당 파일에 넣어주면 됩니다.
    파일은 보통 존재하지 않으며, 새로 만들어주시면 됩니다.

    sudo vi /etc/udev/rules.d/51-android.rules

    파일을 연 후에 아래와 같이 적어주시면 됩니다.

    SUBSYSTEMS=="usb", ATTRS{idVendor}=="04e8", ATTRS{idProduct}=="685e", MODE="0666"

    타겟마다 ID가 틀릴 수 있기 때문에 lsusb 명령어를 통해 얻은 ID를 확인해주셔야합니다.

 
5. Target 분리 후 다시 연결


6. adb devices 명령어로 확인하였을 때 아래와 같이 나오면 됩니다.

    List of devices attached
    M110823949234 device

[출처] http://www.appcreator.com/app-inventor-connecting-ubuntu-and-samsung-galaxy-s

2010/07/20

Application에 할당되는 Maximum VM Heap Size의 변경

간혹 OpenGL 기반 Application이나 메모리 사용량이 많은 Application을 개발할 때, Heap이 부족하여, 메모리 할당을 받지 못해 Application이 정상적으로 동작하지 않는 경우가 있다. Application단에서 이를 해결할 방법은 없으며, Framework에서 수정되어야 한다.

파일: android/frameworks/base/core/jni/AndroidRuntime.cpp
수정 전: property_get("dalvik.vm.heapsize", heapsizeOptsBuf+4, "16m");
수정 후: property_get("dalvik.vm.heapsize", heapsizeOptsBuf+4, "48m");

만약 48MiB도 작다면, 맘껏 늘려보자. :-p


[Update] 
욱's님에 의하면, build.prop에 있는 dalvik.vm.heapsize의 값을 원하는 값으로 설정해줘야 한다고 합니다.

2010/07/19

Emulator의 SD Card를 Mount하는 방법

타겟에서 작업할때는 별 상관 없지만, Emulator를 주로 사용하다보면 DDMS에서 볼 수 없는 파일들을 볼 일이 생길 경우가 있다. 이럴 경우에 mksdcard 명령으로 만들어진 이미지를 리눅스에서 간단하게 Mounting 할 수 있다.

$sudo mount -o loop <android sdcard file name> <mounting point>

2010/07/09

Eclair Full Build!

가정: "Get Android Source Code" 과정은 생략

 

~$ mkdir bin

~$ curl http://android.git.kernel.org/repo ~/bin/repo

~$ chmod a+x ~/bin/repo

~$ mkdir mydroid

~$ cd mydroid

~$ repo init-u git://android.git.kernel.org/platform/manifest.git -b eclair

~$ repo sync

 

소스를 다 받은 후, (엄청 오래 걸린다.)

 

~$ make

Eclair 빌드 후 Project 생성시 XML에러 문제

Eclair 버전에서 SDK를 만들어 이클립스와 연동한 다음, 프로젝트를 생성하면 아래와 같은 에러가 발생한다.

W/ResourceType(267): Unable to get buffer of resource asset file
ERROR No resource identifier found for attribute 'orientation' in package 'android'
...

해결 방법:
http://www.mail-archive.com/android-developers@googlegroups.com/msg21641.html

프로젝트 빌드 중 APP가 android.jar 파일안의 "resource.arsc" 파일을 버퍼에 넣을 때 버퍼의 사이즈가 작아 압축 실패가 원인이다.

[mydroid]/frameworks/base/include/utils/Asset.h 파일의 아래 내용을 다음으로 교체하면 해결됨.

수정 전:
#ifdef HAVE_ANDROID_OS
        UNCOMPRESS_DATA_MAX = 1 * 1024 * 1024
#else
        UNCOMPRESS_DATA_MAX = 2 * 1024 * 1024
#endif

수정 후:
#ifdef HAVE_ANDROID_OS
        UNCOMPRESS_DATA_MAX = 4 * 1024 * 1024
#else
        UNCOMPRESS_DATA_MAX = 4 * 1024 * 1024
#endif

안드로이드를 풀빌드하는 경우 HAVE_ANDROID_OS가 정의되어 있는 것으로 보임.
수정 후 빌드 완료!

2010/06/04

Windows Dev: Console 강제로 띄우는 방법

#ifdef _DEBUG
#pragma comment(linker,"/entry:WinMainCRTStartup /subsystem:console")
#endif

2010/04/20

NDK: Assert 걸렸을 때 PC 값의 주소 보는 방법

출처: http://groups.google.com/group/android-developers/browse_thread/thread/73f89bb8739c24bb/5228e7a5dcfff090

Assert가 걸렸을 때 Symbol들(eg. Function name)이 보이지 않는 이유는 Device에 Install 될 때, Library의 Symbol들을 떼어 버리기 때문이다.

Symbol들을 보기 위해서는 addr2line을 쓰는 방법과 gdb/gdbserver를 쓰는 방법이 있는데, 비교적 사용법이 간단한 addr2line을 사용하는 방법을 알아본다.

사용법은 아래와 같다.

cygwin의 Bash를 띄운 후 아래와 같이 입력하면 된다.
arm-eabi-addr2line.exe -f -e <library name> <address>

-f: Show function names
-e: Set the input file names

만약 아래와 같이 Assert가 발생했다고 하자.

Build fingerprint: XXXX
pid: 1917, tid: 1960  >>> XXXX <<<
signal 11 (SIGSEGV), fault addr 450774f0
 r0 ffffffa5  r1 ffec01a4  r2 450774f0  r3 45235310
 r4 fffffb00  r5 ff000000  r6 ff000000  r7 000001df
 r8 00ff00ff  r9 4767fca4  10 4767fcc0  fp 00000780
 ip 000000ff  sp 4767fac0  lr 80d1c041  pc 80d1c176  cpsr a0000030
         #00  pc
0001c176  YYYY.so         #01  pc 0003b026  YYYY.so         #02  pc 00005aba  YYYY.so         #03  pc 0000312a  YYYY.so         #04  pc 0000f1f4  /system/lib/libdvm.so


위에서 PC 값에 적힌, 주소를 Library와 함께 넣어주면 된다.
arm-eabi-addr2line.exe -f -e YYYY.so 0001c176
출력>
[Symbol Name]
??:0

arm-eabi-addr2line.exe -f -e YYYY.so 0003b026
출력>
[Symbol Name]
??:0

주) arm-eabi-addr2line.exe는 NDK의 build\prebuilt\windows\arm-eabi-4.4.0\bin\에 존재한다.

2010/02/11

Aphorism

"If the only tool you have is a hammer, you approach every problem as if it were a nail." - Bobby Knight, the basket ball coach at Texas Tech University.

2010/01/13

MPEG4 Visual Overview

MPEG-4 비쥬얼(ISO/IEC 14496의 파트 2, "오디오-비쥬얼 객체의 부호화")은 비쥬얼 정보의 표현과 부호화와 관련된 기능들에 대해 넓은 범위를 커버하는 겁내 큰 문서이다. 이 표준은 다음의 데이터 종류를 다룬다.

* 움직이는 비디오(사각 프레임)
* 비디오 객체(움직이는 비디오의 임의의 모양을 가진 영역들)
* 2D 그리고 3D 메쉬 객체(변형 가능한 객체로 표현)
* 움직이는 얼굴 및 몸
* 정적 텍스쳐(스틸 이미지들)

이 표준은 부호화 도구들의 집합을 기술한다. 이는 부호화된 형태로 이들 데이터의 타입을 표현하기 위해 디자인되어 있다. 다양하게 지원되는 데이터 타입과 도구들의 집합과 함께 MPEG-4 비쥬얼 표준은 다음을 포함한 많은 서로 다른 응용 프로그램을 지원할 수 있다.
* 디지털 TV 방송, 비디오 회의, 비디오 저장소등과 같은 레거시 비디오 응용 프로그램들
* 각각 부호화된 서로 다른 많은 비디오 객체들로 구성된 비디오 장면이 있는 오브젝트 지향하는 비디오 응용 프로그램들
* 변형 가능한 2D 또는 3D 메쉬 지오메트리 또는 움직이는 사람의 얼굴 및 몸을 사용한 렌더된 컴퓨터 그래픽스
* 실제 세계 비디오, 정지 영상 그리고 컴퓨터로 생성된 그래픽스를 조합한 하이브리드 비디오 응용 프로그램
* 인터넷이나 모바일 채널들을 통한 스트리밍 비디오
* 스튜디오 생산 환경을 위한 고급 비디오 편집과 배포

표준에 의해 기술된 당황스러울 정도의 범위의 부호화 툴들에도 불구하고, MPEG-4 비쥬얼의 중심은 간단한 비디오 부호화 메커니즘이다. 양자화와 엔트로피 부호화 그리고 DCT에 의한 움직임 보상을 사용하는 블록 기반 비디오 코덱이다. 이 핵심 코덱의 체계는 특정 제약을 제외하고는 H.263과 동일하다. 표준에 의해 지원되는 다른 기능들과 도구들의 대부분은 이 핵심에 추가적인 피쳐들을 추가함으로써 얻게된다. 반면에 메쉬, 정지 영상과 얼굴/몸 에니메이션의 부호화를 위한 툴들은 분리되어 개발된다.

2010/01/06

TortoiseSVN에서 ssh+svn 사용 방법

학교 서버에 설치된 SVN에 접근을 하기 위해, TortoiseSVN으로 로긴을 하려고 했습니다.
ssh+svn을 사용하고 있었는데, 문제는 로긴을 3번이나 해야 접근이 가능했습니다.
도대체 이 현상이 이해가 가지 않아, TortoiseSVN 도움말을 보았는데 부록에 뭔가 이상한게 있더군요.

"G. Securing Svnserve using SSH"

뭐지 이건? 일반 SVN이 아니라 SSH를 이용한 SVN을 접근하려면 뭔가 다른 짓을 해줘야 할 것 같다는 느낌이 들더군요. 그래서 있는 그대로 따라해봤는데, Key를 Pageant에 등록만 하면 로긴 자체가 필요가 없더군요. 따라서 위 문제도 자동으로 해결!


1. 아래의 링크에서 Putty, Plink, Pageant, Puttygen을 받습니다.
   나중에 서버에서 생성된 파일을 얻기 위해 WinSCP도 받는게 좋더군요.
  
Putty Family: http://www.chiark.greenend.org.uk/~sgtatham/putty/
WinSCP : http://winscp.net/eng/download.php2. 자, 이제 Public Key와 Private Key를 생성합니다.
   Putty를 이용하여 서버에서 아래의 명령어를 칩니다.
   암호라고 되어 있는 부분에 자신이 사용할 암호를 적습니다.



   이 암호는 아래의 단계들에서 계속 사용하므로 잘 기억하고 있는게 좋습니다.

ssh-keygen -b 1024 -t dsa -N 암호 -f keyfile

3. ls 명령으로 keyfile(개인 키)과 keyfile.pub(공개 키)가 만들어 진 것을 확인 합니다.

4. 자신의 폴더(~)에 .ssh 라는 폴더가 없으면 만들고, 여기에 keyfile.pub을 authorized_keys라는 파일명으로 저장합니다.

cd ~
mkdir .ssh
cat keyfile.pub >> /home/당신/.ssh/authorized_keys


5. 이제 TortoiseSVN을 사용할 로컬(Windows PC)로 이동해서 개인키를 등록합니다.
   WinSCP를 이용해서 서버에 있는 개인키(keyfile)를 로컬로 이동시킨 다음,
   PuttyGen을 실행해서 Conversions -> Import Key를 실행하고, keyfile을 넣은 다음
   Save Private key를 실행해서 keyfile.ppk로 저장합니다.
  
6. Pageant를 실행한 다음, Add keys를 선택하고 keyfile.ppk를 넣어줘야 합니다.

7. 이제 TortoiseSVN 으로 접속하면, 로긴 창이 뜨지도 않고 로긴 됩니다!
   단, 접속할 때 svn+ssh://당신아이디@URL 식으로 //와 @사이에 넣어줘야
   ID를 안 물어봅니다. 만약 이 작업을 하지 않으면, 아이디만 3번 물어보더군요.

2009/12/18

GQL 결과를 JSON 포맷으로 변환시 Entity ID 얻어오기

이전 GAE에서 DB검색 결과를 JSON 포맷으로 가져오기라는 글에서의 JSON으로 뽑아낸 결과에는 Entity의 ID가 들어있지 않습니다. 이를 넣어주기 위해서는 아래의 코드를 json.py의 default 함수를 약간 변경해야 합니다.

[code python] ... def default(self, obj): ... elif isinstance(obj, db.Model): properties = obj.properties().items() output = {} for field, value in properties: # Added in order to include entity's id into JSON format output[field] = getattr(obj, field) output['id'] = obj.key().id() return output ... [/code]

2009/12/07

UIAlertView 서브클래스하기

Cocoa를 사용하여 어플을 만들다보면, 이뻐보이던 팝업(Alert View, UIAlertView) 눈에 익숙해져서 어느 순간부터 촌스러워 보이기 시작합니다. 사실 팝업 자체로 보면, 투명 효과와 그림자 효과, 그리고 에니메이션까지.. 이 모든 것을 Core Animation과 Quartz로 구현하려면 아마 몇일 걸릴겁니다. 근데, 역시 구글은 모든 해답을 가지고 있네요. 천재들 :-)

iPhone SDK는 사용자에게 팝업을 보여주기 위한 UIAlertView 클래스를 제공합니다. 예를 들어, 애플은 이 팝업을 문자 메시지가 도착했을 때 사용합니다. 어플리케이션 개발자들은 이와 같은 팝업을 사용할 수 있습니다. 최상위의 특수한 윈도우 레벨에 보여집니다. 팝업 아래의 컨텐츠들에 대한 사용자의 입력은 팝업이 사라질 때까지 무시됩니다.

나의 최근 프로젝트들 중, 하나의 뷰가 모든 다른 컨텐츠들의 최상위에 보여져야만 했습니다. Spotlight dim effect와 사용자 입력을 막는 것은 재사용할 수 있었으나, 파란색의 UIAlertView 스타일은 나의 요구와 맞지 않았습니다. 처음부터 나만의 뷰를 만드는 대신, UIAlertView가 제공하는 것을 재사용하고 모든 불필요한 기능들을 제거하기로 결심했습니다.

이 페이지는 아래에 나온 피가 튀기는 것 같은 변형된 Alert를 생성하기 위해 무엇이 필요한지 설명할 것입니다.

[그림 생략 - 위 링크에서 보세요]

팝업을 우리가 원하는 어떤 것으로든 변형할 수 있지만, 단순함을 유지하려고 했습니다. 피가 튀기는 팝업은 두 가지 주요 파트들로 구성되어져 있습니다. 배경 이미지와 텍스트 레이블. 위의 비교에서 볼 수 있듯이, 우리는 버튼과 기본 텍스트를 무시할 겁니다. 새로운 초기화 함수는 JKCustomAlert에게 정보를 제공하기 위해 사용될 것입니다.

[code cpp]-(id) initWithImage:(UIImage *)backgroundImage text:(NSString *)text;[/code]

자체 Initializer를 사용함으로써, 기본 타이틀과 메시지는 설정되지 않습니다. 만약 지금 시점에서 팝업을 보여준다면, 비어있고 작지만, 기본 모습을 가진 팝업이 나타날겁니다.

팝업의 배경을 기본에서 자체 배경으로 변경하기 위해서 drawRect: 는 Override 되어야 합니다. 우리가 해야할 것은 배경 이미지를 뿌리는 것 뿐입니다.

[code cpp] -(void) drawRect:(CGRect)rect { // do not call the super drawRect CGSize imageSize = self.backgroundImage.size; [self.backgroundImage drawInRect:CGRectMake(0, 0, imageSize.width, imageSize.height)]; } [/code]

마지막으로 할 것은 배경 이미지의 크기에 맞게 JKCustomAlert의 크기를 변경하는 것입니다. show 함수는 팝업의 크기를 재설정하고 애니메이션할 책임이 있습니다. 에니메이션을 시작하고 뷰의 크기를 맞추기 위해 super 함수를 호출합니다.

[code cpp] -(void) show { // call the super show method to initiate the animation [super show]; // resize the alert view to fit the image CGSize imageSize = self.backgroundImage.size; self.bounds = CGRectMake(0, 0, imageSize.width, imageSize.height); } [/code]

팝업에 나타나는 Text label은 addSubView: 함수에 추가되고, 위치는 layoutSubviews 함수 안에서 설정됩니다.

사용자에게 버튼을 제공하지 않기 때문에, dismissWithClickedButtonIndex:animated셀렉터를 사용하여 팝업을 수동으로 없애야 합니다. 그렇지 않으면, 프로그램은 팝업이 보이는 동안 멈추어 있을 것입니다.

2009/11/29

View-based Application을 이용한 Table View 만들기


XC: XCode, IB:Interface Builder

1. [XC] File -> New Project -> View-based Application 선택
2. [XC] Application 이름 설정(여기서는 VBA로 지정)
3. [XC] VBAViewController.xib 더블 클릭
4. [IB] Library에서 Table View를 가져다가 VBAViewController.xib의 View의 자식으로 놓는다.
5. [IB] File's Owner의 view가 Table View되도록 한다.
6. [IB] Table View의 datasource와 delegate가 Files'Owner(VBAViewController)가 되도록 한다.
7. [XC] VBAViewController.h를 열어 부모 클래스를 UIViewController에서 UITableViewController로 변경한다.
8. [XC] VBAViewController.m을 열어 아래의 함수를 추가한다.
펼쳐두기..
9. Build & Go!

매번 귀찮네. Template을 만들던지 해야지 원!

2009/11/27

GAE에서 DB의 검색 결과를 JSON 포맷으로 가져오기

Google App Engine에서는 django를 기본으로 제공합니다. django를 사용하여 View와 Logic을 구분할 수도 있지만, 이 뿐만 아니라 simplejson을 사용할 수 있기 때문에 서버로부터 DB의 데이터를 JSON 포맷로 가져오거나 서버로 JSON 포맷의 데이터를 보내 DB를 업데이트 하는 동작을 할 수 있습니다. 물론 JSON Parser가 필요하지만, 왠만한 모든 언어로 포팅이 되어 있습니다.

더 편한 방법이 있겠지만, 구글의 예제 중 simplejson.JSONEncoder를 상속받은 GqlEncoder를 사용하면 매우 편하게 GqlQuery의 결과를 JSON으로 뿌릴 수 있습니다.
json.py...

아래는 위 파일을 가져다가 사용한 예제입니다. 바로 사용 가능한 완벽한 예제는 아닙니다.
펼쳐두기..
나중에 시간나면, 간단하지만 뭔소리인지 모르겠는 json.py를 뜯어 보겠습니다. 일단 문제 해결!

2009/11/24

kd-tree

친구의 블로그에서 글을 읽다가 문제 하나를 봤습니다.
x와 y좌표를 가진 N개의 점들이 있는데, 원점에 가까운 10개의 점을 무려 O(n) 시간으로 찾으라는 무지막지한 문제. 해결 자체는 kd-tree로 가능하지만, O(n) 이라면 kd-tree가 답은 아니겠군요. kd-tree 생성에만 O(n*log(n))이 걸린다던데. 설마 넌센스인가?
근데 시간 복잡도를 제외하면, 예전에 자료구조 혹은 알고리즘 시간에 교수님이 냈던 과제랑 같은거 같네요. 그 땐 무식하게 푼 기억이 어렴풋이 납니다.

kd-tree
컴퓨터 과학에서 kd-tree는 k-차원 공간에 있는 점들을 조직하기 위한 공간-분할 데이터 구조입니다. kd-tree는 다차원 공간 탐색 키를 사용하는 탐색과 같은 응용에 유용한 데이터 구조입니다.(예를 들어, 범위 검색과 근접 검색). kd-tree는 BSP tree의 특별한 경우입니다.

kd-tree는 모든 노드(Node)가 k-차원의 점인 이진 트리(Binary tree)입니다. 리프(Leaf)가 아닌 모든 노드는 공간을 두 개의 작은 공간들(Subspaces)로 나눈 분리 경계면(초평면, Hyperplane)을 만듭니다. 분리 경계면 왼쪽의 점들은 노드의 왼쪽 서브 트리(Sub-tree)를 나타내고, 오른쪽의 점들은 오른쪽 서브 트리를 나타냅니다. 분리 경계면의 방향은 다음의 방법에 의해 선택됩니다. 서브 트리에 의해 쪼개진 모든 노드는 k-차원들 중 하나와 연관 됩니다. 분리 경계면은 방향 벡터에 수직입니다. 예를 들면, 선택된 x축으로 나뉘어진다면, x값보다 작은 서브 트리의 모든 점들은 오른쪽에 나타나고, x값 보다 큰 값들은 오른쪽 서브 트리에 나타납니다.

출처: http://en.wikipedia.org/wiki/Kd_tree