일요일, 12월 11, 2005

Vi for Programmer!!

REF:http://www.wowlinux.com

VIM 6.0 이상 버젼에서 적용됩니다.

VIM 에서 펑션키( F1 ~ F12 )를 적당히 뜯어고쳤습니다.

아래에서 설명하는 각 문장들을 .vimrc 에 써 넣으면, 다음번 VIM 을 실행시킬때부터 적용됩니다.

< 일반적인 기능 >

1. 명령: map K -> 이 문장은 펑션키 F1 을 shift+k 로 맵핑시켜줍니다. 코딩하다가 ANSI/POSIX 표준함수의 이름위에 커서를두고 F1 을 누르면 그 함수의 man 페이지를 보여줍니다. 마치 VisualStudio 의 MSDN 과 비슷한 기능이죠.

2. 명령: map :w! -> 이 문장은 펑션키 F2 를 :w!+ENTER 로 맵핑시켜줍니다. 잘 아시겠지만, 현재 편집중인 파일을 저장하는 기능입니다. < 소스코드 이쁘게 보기 >

3. 명령: map v]}zf -> 이 문장은 펑션키 F3 을 v]}zf 로 맵핑시켜줍니다. 코딩을 하다보면 함수를 정의하는 부분이나 if() 문같은곳에 아래처럼 생긴 코드를 볼 수 있습니다.
1: int function( void )
2: { ... 중간 200라인 생략 ... 201: } 이때 커서를 { 위치에 갖다두고 F3 을 누르면 { ~ } 를 통채로 Fold 해서, 한줄로 표시해줍니다. 이렇게 폴드된 문장은 아래와 같이 생겼습니다.
1: int function( void )
201: ---- 201 Line folded ----------

4. 명령: map zo -> 이 문장은 펑션키 F4 를 zo 에 맵핑시켜줍니다. 위에서 F3 키로 Fold 된 라인에 커서를 두고 F4 를 누르면, 폴드된 내용을 복구시켜줍니다. < 파일 브라우징 >

5. 명령: map :25vs ./:set nunumber^Ww

6. 명령: map ^Ww

7. 명령: map O -> 이 문장은 아래에 어떤분이 올려주신 팁을 수정해서 만든겁니다. F5 키를 누르면 화면을 양분해서 프레임을 나눠주고, 왼쪽 프레임에 현 디렉토리의 파일 목록을 보여줍니다. 커서를 좌우프레임으로 왔다갔다 할때에는 F6 을 누릅니다. 왼쪽에 브라우징된 파일 목록에서 어떤 파일을 열고싶을때에는 열고싶은 파일에 커서를 두고 F7 을 누르면 됩니다. F5 와 F6 의 맵핑내용중 ^Ww 라는것은, 차례대로 이렇게 누릅니다. Ctrl+v, Ctrl+w, w 이렇게 세번을 차례대로 누르면 써집니다. F7 의 맵핑내용은 shift+o ( O )입니다. 열려진 양쪽 프레임중 하나를 닫고싶을때에는 닫고싶은 프레임에 커서를 두고 :q! 하시면 닫아집니다. < 소스코드 코딩/분석에 도움되는 기능 >

8. 명령: map [i -> 이 문장은 펑션키 F8 을 [i 에 맵핑시켜줍니다. 어떤 함수의 이름에 커서를 두고 F8 을 누르면, 화면 하단에 그 함수의 prototype 을 보여줍니다. 약간은 미흡하게 어긋날때도 있습니다만..^^;

9. 명령: map gd

10. 명령: map \ -> 어떤 함수 안에서 지역변수를 추적해주는 기능입니다. 가령 어떤 함수의 중간에서 var1 이라는 변수가 사용되었는데, 이게 어떤 변수였는지 잘 기억이 안난다면 변수의 이름에 커서를 두고 F9 를 누릅니다. 그러면 var1 변수가 선언된 문장으로 찾아가줍니다. 그리고 var1 변수의 이름을 모두 반전시켜서, var1 이 사용된 곳을 표시해줍니다. 이렇게 보다가 다시 원래의 위치로 되돌아가고 싶을때 F10 을 누르면 됩니다. F10 의 맵핑내용은 ; 키의 오른쪽 옆에있는 키를 두번 누른것입니다.

11. 명령: map ^]

12. 명령: map ^T -> 위의 F9, F10 기능은 오직 지역변수만을 추적할 수 있는 기능인데, F11 과 F12 는 전역변수/구조체/정의상수/함수정의를 추적해줍니다. 어떤 사용자정의함수 func() 이 있다고 가정할때, 함수의 이름에 커서를 두고 F11 을 누르면 그 파일이 선언된 문장으로 추적해 찾아가줍니다. 이렇게 추적된 상태에서 또 어떤 구조체의 내용을 보고싶으면 구조체 테그이름에 커서를 두고 F11 을 누르면 됩니다. 이런식으로 함수나 전역변수나 구조체나 #define 으로 정의된 상수를 계속 추적해 들어갈 수 있습니다. 추적에 들어간 상태에서 이전위치로 되돌아오려면 F12 를 누르면 됩니다. 즉, 원래위치부터 시작해서 F11 을 이용해 10번을 추적해 들어갔다면, 다시 원래위치로 오기위해 F12 를 10번 눌러야 합니다. 맵핑 내용중 ^] 는 Ctrl+v, Ctrl+] 를 차례로 눌러 입력합니다. 마찬가지로 ^T 는 Ctrl+v, Ctrl+t 를 차례로 눌러 입력합니다. F11, F12 의 추적기능을 이용하기 위해서는 현 디렉토리에 tag 파일이 존재해야만 합니다. tag 파일은 어떤 함수가 어느 파일의 몇번째줄에 있다, 어느 구조체가 어느 파일의 몇번째 줄에있다 하는 정보를 담고있는 파일입니다. tag 파일을 만드는 방법은 아주 간단합니다. 소스코드가 있는 디렉토리에서 ctags * -R 하셔도 되고, VIM 에서 :!ctags * -R 하셔도 됩니다.

ARM에서의 MP3 플레이어

ARM에서 사용가능한 MP3 플레이어 입니다.

일반 i386에서 사용하는 splay를 arm용으로 포팅한 것 입니다.

사용방법:# ./configure

# vi .config.cache

ac_cv_prog_CC=${ac_cv_prog_CC=arm-linux-gcc}ac_cv_prog_CPP=${ac_cv_prog_CPP=arm-linux-gcc -E}ac_cv_prog_CXX=${ac_cv_prog_CXX=arm-linux-c++}ac_cv_prog_RANLIB=${ac_cv_prog_RANLIB=arm-linux-ranlib}

위처럼 변경한다.

# ./configure

# make

# cd src/splay

# file splay

화요일, 12월 06, 2005

리눅스 pthread 계열 컴파일 방법

컴파일 하려면 gXX -D_REENTRANT -lpthread

일요일, 11월 27, 2005

마커 인터페이스 andomAccess 계열의 속도 비교!!

java.util.RandomAccess Interface [마커 인터페이스]

=================================

for (int i=0, n=list.size(); i < n; i++)
list.get(i);

이하와 같은 루프보다 신속히 실행됩니다.

for (Iterator i=list.iterator(); i.hasNext(); )
i.next();
=================================

이것이 사실이라면 iterator패턴이 무조건 좋은것은 아니라는 것인데.. 이는 RandomAccess마커 인터페이스를 상속한 ArrayList와 Vector에서는 그리 좋은 성능이 나오지 않는다는 말인것 같다. 이는 가능한 곳에는 랜덤 억세스를 하고, 불가능한 곳에는 순차 억세스를 실시하기 때문인 것으로 사료된다.

월요일, 11월 21, 2005

D-8KUDG-KUDB의 특징과 개선되어야 할 점


KUDB 특징

1. 다양한 데이터 타입 지원
- 현재 가변길이 데이터 타입을 제외한 거의 모든 자료형을 표현한다. ( 사용자 정의 데이터 타입은 지원하지 않음 )

2. 모바일 환경에 맞게 빠른 처리로 수행이 가능한다.
- B+ Tree를 이용한 인덱스를 이용하며 최대한 모바일 환경에 맞게 메모리를 적극적으로 활용하여 저장영역 엑세스를 최소화 한다.

3. 테이블의 자유로운 생성/변경/삭제가 가능하다.

- 현재 관계는 지원하지 않지만 테이블 단위의 자료를 저장할 수 있으며 이로 인한 조인 연산을 지원한다.

4. 제약 조건을 일부 지원한다.
- 개체 무결성 : PK를 가질수 있으며 이 PK는 널값을 가질 수 없다.
- 도메인 무결성 : 유효한 데이터 타입만이 저장영역에 있을수 있음을 보장한다.
- 참조무결성 : 현재 지원하지 않음( PK/FK 를 저장하는 테이블 생성/유지로 해결 )

5. 다양한 데이터처리 가능
- 관계대수가 표현할 수 있는 모든 연산을 수행할 수 있으며 내부적으로 PK에 해당하는 Selection시 최상의 속도를 보장한다.

6. JOIN연산 지원
- 이 또한 관계대수의 카티젼 프로덕트, 프로젝션 등을 이용하여 수행이 가능하다.

7. 다양한 환경에 이식 가능
- Java로 작성되어 Mobile자바 환경인 CLDC 1.1, MIDP 2.0환경에서 제작 되어 2001년 이후 출시된 거의 모든 휴대폰에서 동작하며, 호환성의 걸림돌인 RecordStore ( 휴대폰의 영속 저장공간 ) 을 클래스파일 대체 로 PC및 기타환경에서도 구동할 수 있게 interface - class 관계로 제작 되었다.

8. 쓰레드에 안전하다.
- 한 모바일 임베디드 어플리케이션에서 다중 쓰레드로 인한 접근에 안전하다. 추후 네트워크가 지원되면 다양한 잠금형식을 지원할 예정이다.

9. 시각적 확인 가능
- PC 에서 Swing을 이용한 B+트리의 삽입/삭제 연산을 보여주는 학습용 자료도 개발되었다.

현재 KUDB 문제점

1. 가변길이 데이터셋 ( varchar, binary, image 등) 미지원

- 해결책 : 바이너리 데이터의 포인터를 가지고 이는 실제 테이블에서 동일한 크기(4byte)를 가지게 한다. 가변길이 데이터만을 가지는 데이타 영역을 가진다.( ex) tablename_VAR )

- 대안의 문제점 : MIDlet Profile의 저장공간인 RecordSet은 물리적인 접근연산의 제약 이 크다. 따라서 가변길이를 유지하기가 힘들다.

- 결론 : 모바일 환경에서의 가변길이 데이타는 속도나 필요성 면에서 크게 의미 가 없어 KUDB Project에서 제외한다.

2. 지능형 인덱스 기록( 현재 KUDB는 인덱스를 메모리에서 저장영역으로 단순저장)

- 현재상황 : 모바일 기기에서 데이타 저장시마다 저장영역에서 인덱스를 갱신하는 연산은 비용을 증가시킨다. 따라서 KUDB에서는 현재 인덱스를 일괄적으로 업데이트 하는 방법을 사용한다.

- 해결책 : Thread를 이용한 유휴상태 파악 및 동적 인덱스 업데이트 필요

- 대안의 문제점 : 유휴상태 파악에의한 불필요한 연산 증가

- 결론 : 최대한 안전하고 빠른 동적 인덱스 업데이트 알고리즘 필요

3. SQL문의 미지원

- 현재상황 : 모바일 기기에서 SQL문장을 파싱하여 사용하는 것은 힙/저장공간영역에서 저장공간 부족을 야기시킨다. 현재 관계대수 최적화 루틴을 제외한 SQL Parser 는 개발완료 상태이나 사용하지 않음. 또한 KUDB의 현재 버전은 네트워크를 지원하지 않는 소규모의 Embedded Database이다.

- 해결책 : 앞으로 모바일 기기의 발전과 함께 개선될 부분이다.

- 대안의 문제점 : 앞으로 KUDB의 버전이 업데이트 되고 다양한 환경(예:PC)에서 사용되게 되면 SQL Parser와 관계대수 최적화가 필수적으로 요구된다. 또한 네트워크를 지원 하는 KUDB버전 개발시 외부에서 Data를 가져가기위해 필수적으로 SQL문장이 필요한다.

4. Transaction 지원의 미비

- 현재상황 : 데이터의 원자성(Atomicity), 일관성(Consistency), 격리성(Isolation), 영속성(Durability) 에 대한 지원이 미비, 또한 Transaction log 에 대한 지원 미비

- 해결책 : 다음 버전의 KUDB에서 지원예정, 현재버전에서는 단순히 여러 쓰레드의 접근 에 대한 안전만 지원.

- 대안의 문제점 : Mobile DB라 해서 ACID속성이 중요하지 않은것은 아니다. 모바일 환경의 제한 과 최대한 타협해야 한다.

5. 다양한 형태의 잠금 필요

- 현재상황 : 단순 쓰레드 제어로 잠금을 구현하고 있다.

- 해결책 : 잠금에 관련된 테이블을 생성하고 이 테이블에 잠금상태 및 격리수준을 저장해 항시 참조하여 데이터 접근을 허용해야 한다.

- 대안의 문제점 : Mobile환경의 COST를 증가시킨다.

6. 뷰의 미지원

- 현재상황 : 현재 KUDB에서 뷰는 지원하지 않고 있다.

- 해결책 : KUDB의 다음 버전에서 지원할 예정이다.

토요일, 11월 19, 2005

D-10 KUDG!!

KUDG일정
====================================================
11월 28일: KUDG(Kyungnam University Developers Group) 전야제
11월 29일: KUDG 전시회
11월 30일: KUDG 발표
====================================================
KUDB(Kyungnam University DataBase management system) 팀 남은 일정
11월 19일: 스마트한 잔여블록 처리, 새 인덱스 작성시 RSSOE 처리
11월 20일: Insertion/Update/Deletetion Limit Test
11월 21일: 데이터 처리관련 API확정
11월 22일: 상동
11월 23일: Table Processing(Fix the problem of auto-creation)
11월 24일: Releational tuple Processing
11월 25일:Develop Example using MIDP lcdui ( 학생, 교수의 조인예제)
11월 26일:상동 (MIDP ServerSocket interface를 이용한 간단한 웹서버)
11월 27일:키검색과 논-키검색의 속도 비교 (for presentation)
11월 28일:각종 SQL문의 실제 실행코드 생성(for presentation )
11월 29일:Presentation문서 작성, 작품 전시
11월 30일:Presentation, 뒷풀이

12월 1일~: 문서화, Capstone Design준비

금요일, 11월 18, 2005

나밖에 모르던 내가


나밖에 모르던 내가 - 쿨

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

할말있는데 차마 얼굴보고 얘기못하겠다

나.좋아하는사람 생겼어난 그럴수 없을 줄 알았는데.

너만 사랑할줄알았는데. 미안해.

오늘까지야 더이상 못참아

그만 장난쳐 이제 나 화났어

어디있는거야 빨리 전화해 줘

나이제 잠들래 눈물이 나려해

아침이 오면 언제나 그랬듯 나를 감싸며

입맞춰줄꺼지? 빨리 약속해 보고싶어..

따스한 너의 손 잡을수가 없어

so so hate you baby 이렇게 못난 날..

나에게도 다른사랑이 와

날 버려주겠니..

왜 그렇게 당당해

그걸믿어 어떻게?

울기는 왜 울어 왜

나를 지워줘 제발

또 어리석은 내가 영원을 약속했던 그 시간

정말 미칠것만 같아.. 미안해 나도 똑같은 사람인걸..

커플티에 커플반지 모든것 어딜가도

둘만의 흔적인데 너없인 아무것도 할수 없어

제발 돌아와 나 잘할께

이젠 늦었나봐 보고싶지 않아..

so so hate you baby

이렇게 변한 날.. 나에게도 다른사람이 와

날 버려주겠니..

왜 그렇게 당당해

그걸믿어 어떻게?

울기는 왜 울어 왜

나를 지워줘 제발

또 어리석은 내가 영원을 약속했던 그 시간

정말 미칠것만 같아.. 미안해

난 다를 줄 알았어..

당당하게 떠날께 (떠나~)

믿어주길 바랄께 (믿어줘~ 못난날)

울기는 왜 울어 왜(보내야 하는데~ 이렇게)

나를 지워줘 제발(사랑해)

또 어리석은 내가 영원을..(stay) 약속했던 그 시간

정말 미칠것만 같아

미안해 너밖에 모르던 내가..

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

눈물이 날것 같다 이 노래를 들으면..
내가 정아한테 너무 모질게 한 것은 아닌지 하는 생각이 들어
가슴아파 미칠것 같아.
미안해 너밖에 모르던 내가....

화요일, 11월 15, 2005

Netbeans + Mobility Pack + MIDP 의 SecurityException문제


J2SE로 한참을 프로젝트를 진행하다 마침내 J2ME환경으로 옮겨가게 되었다.

물론 KUDB프로젝트이다. Kyungnam-University Database이라는 거창한 제목을 가진 이 모바일 DB는 리소스를 먹는 귀신이라고도 볼 수 있는, 최적화가 전혀 안되는 녀석이라고 할 수 있다. J2ME환경으로 옮겨가던 중 알았던 사실은 J2ME는 J2SE의 서브셋이 아니며 오히려 독자적인 플랫폼이라 할 수 있다는 것이다.
특히 PC의 하드디스크와 같은 영구 저장영역은 RecordStore라는 레코드기반의 저장시스템을 가지며 이의 제한도 50k정도 밖에 안된다는 사실이다(이 부분은 기기에 따라 다를 가능성이 있다.)
아무튼 진행중에 모든 컴파일에러를 잡았음에도 불구하고, 실행시마다 SecurityException 이 발생한다는 암담한 상황에 빠졌다.
이리저리 돌아다니다가 구글에처 해결책을 찾았다.

방법은 넷빈즈의 메인화면에서 Projects에서 프로젝트를 선택후 Property로 들어가서 Running탭으로 들어간다. 여기서 라디오버튼중 Excute ... OTA를 선택한후 실행하면 된다. ㅠㅠ

간단한 문제로 하루를 보냈던 게 억울한 하루다. 근데 곱창에 소주는 정말 맛있겠다. 곱창생각땜시 밤에 내려갈까 말까하고 재훈하고 고민했던 하루다.


월요일, 11월 14, 2005

Hello!! World!!


싸이월드를 버린날..

나도 블로그를 가지게 되었다.

게으르지 않은 블로거가 되어보자!!

KUDB 팀 파이팅!!