블로그 이미지
progh2
지루한 것에서 벗어나 재미난 것 속으로 풍덩~☆

calendar

1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31

Notice

Recent Post

Recent Comment

Archive

'옛날카테고리/함장(?)일지'에 해당되는 글 556

  1. 2004.06.02 자주쓰이는 3개의 언어로 구현한 Levenshtein Distance2
  2. 2004.05.30 FreeBSD2
  3. 2004.05.24 No Free in this World
  4. 2004.05.20 책 사기에 대해서.. 1
  5. 2004.05.16 혈액형 별 살찌는 음식.
  6. 2004.05.16 마인드맵
  7. 2004.05.16 캐논 A75의 TvOut 버그 발견!
  8. 2004.05.15 20040515 나의 기분1
예전에 컴프 수업을 들으면서 번역했던 문서.
하드 정리중에 발견
URL: http://www.merriampark.com/ld.htm

자주쓰이는 3개의 언어로 구현한 Levenshtein Distance

작성자: Michael Gilleland, Merriam Park Software

이 짧은 에세이를 쓰게 된 것은 Levenshtein distance 알고리즘에 대해서
설명하고 또 그것이 각각의 세가지 프로그래밍 언어에서 어떻게 구현되는가를
보이기 위해서입니다.

Levenshtein Distance이란 무엇인가?
데모
알고리즘
세가지 언어로 구현된 소스코드
레퍼런스
다른 언어로 구현

Levenshtein Distance이란 무엇인가?

Levenshtein Distance(이하 LD)는 두 문자열의 비슷한 정도를 측정하기위해 고안되었습니다.
여기서 원문자열을 (s)로, 대상문자열을 (t) 라고 나타낸다고 하겠습니다. distance란 s를
t로 변형시키기 위해 삭제, 추가, 또는 수정이 필요한 횟수를 뜻합니다. 예를든다면,

* s가 "test"이고 t도 "test"라면, LD(s,t) = 0 이 됩니다. 왜냐하면 문자열들이 이미 동일하여 변환이 필요하지 않기 때문입니다.

* s가 "test"이고 t가 "tent"라면, LD(s,t) = 1 이 됩니다. 왜냐하면 s를 t로 만들기 위해서는 "s"를 "n"으로 한번 수정이 필요하기 때문입니다.

Levenshtein distance는 string 간의 차이가 클수록 위대함을 느낄 수 있습니다.

Levenshtein distance는 러시아 과학자인 Vladimir Levenshtein가 1965년에 고안하여 그렇게 이름지어졌습니다.
Levenshtein 이란 단어가 쓰거나 읽기 힘들기 때문에 종종 edit distance라고도 불립니다.

Levenshtein distance 알고리즘은 다음과 같은 분야에 쓰여집니다:

* 철자 검사
* 음성 인식
* DNA 분석
* 표절여부 검사

데모

아래의 간단한 자바 애플릿으로 두 문자열의 Levenshtein distance를 알아보세요.

원래 문자열
대상 문자열


알고리즘

알고리즘 작동 단계
단계 설명
1
s의 문자열 길이를 n에 넣는다.
t의 문자열의 길이를 m에 넣는다.
만약 n = 0 이라면, m 을 리턴하고 종료한다.
만약 m = 0 이라면, n 을 리턴하고 종료한다.
0..m 행과, 0..n 열로 이루어진 행열을 만든다.
2
첫번째 행인 0..n을 초기화 한다.
첫번째 열인 0..m을 초기화 한다.
3
s의 각 문자(i는 1부터 n까지)를 검사한다.
4
t의 각 문자(j는 1부터 m까지)를 검사한다.
5
s[i]와 t[j]가 같다면, 변경하기 위한 비용은 0이 된다.
s[i]와 t[j]가 같지 않다면, 비용은 1이 된다.
6
행열의 셀 d[i,j]에 다음의 것들 중 가장 작은 값을 넣는다.
a. 바로 위의 셀이 더하기 1이 되는 경우: d[i-1, j] + 1
b. 바로 왼쪽 셀이 더하기 일이 되는 경우: d[i,j-1] + 1
c. 대각선으로 연속적인, 바로 왼,위쪽 셀의 비용: d[i-1,j-1] + cost
7
(3, 4, 5, 6) 단계를 반복하여 완료되면, d[n, m]셀에 있는 것이 distance가 된다.

예제

이 예제절에서는 원래 문자열이 "GUMBO"이고 대상 문자열이 "GAMBOL"이라 할 때
어떻게 Levenshtein distance가 계산되는지에 대해서 다룬다.

1 과 2 단계

i가 1일 때 3에서 6 단계

i가 2일 때 3에서 6 단계

i가 3일 때 3에서 6 단계

i가 4일 때 3에서 6 단계

i가 5일 때 3에서 6 단계

7단계
행열의 가장 오른쪽 아래에 있는 값이 distance가 된다.(여기서는 2)
이 결과는 "GUMBO"가 "GAMBOL"이 되기 위해서 "U"를 "A"로 바꾸고
"L"을 추가해야한다는, 직관적으로 알 수 있는 결과와 일치합니다.
( 1번의 수정과 1번의 추가 = 2 번의 변경 )

세가지 언어로 구현된 소스코드

프로그래밍 언어들간에 차이에 대해서 토론하는 엔지니어들 사이에서는 종교 전쟁이 일어나기도합니다.
이러한 예로, 전형적인 주장은 JavaWorld article에서 일어난(July 1999) Allen Holub의 주장입니다.:
"예를들자면, 비주얼 베이식은 전혀 객체지향이라고 말할 수 없다. Microsoft Foundation Classes(MFC)
또는 대부분의 다른 마이크로소프트의 테크놀러지는 어느것도 객체지향이라 주장할 수 없다."

Salon에 계제된(Jan. 8, 2001) Simson Garfinkels의 글에서 다른 진영의 반박이 이루어졌습니다.
이 글은 "Java: 느리고, 꼴사납고, 부적절한 언어"라는 제목으로 알려져 있는데, 명료하게
표현하자면 "나는 자바를 증오해"라고 나타낼 수 있습니다.

우리는 이러한 종교 전쟁들 속에서 자연스럽고 조심스런 입장을 취하로 했습니다. 배우기 위한 교재로써,
하나의 프로그래밍 언어에서만 해결할 수 있는 문제라면 대개 다른 언어에서도 마찬가지로 해결할 수
있을 것입니다. 우수한 프로그래머는 완전히 새로운 언어를 배우면서 한다고 하더라도 하나의 언어에서
다른 언어로 비교적 쉽게, 큰 어려움에 당면하지 않고 옮길 수 있습니다. 프로그래밍 언어라는 것은
목적을 이루기 위한 것이지, 그 자체가 목적은 아닌 것입니다.

이러한 중도의 입장에서, 우리는 Levenshtein distance 알고리즘을 아래에 있는 프로그래밍 언어들로
구현하여 소스코드를 보였습니다.

* Java
* C++
* Visual Basic

소스코드들 (블라블라)

참고문헌

Levenshtein distance에 관련된 다릍 토의를 다음 링크들에서 발견하실 수 있습니다.

* http://www.csse.monash.edu.au/~lloyd/tildeAlgDS/Dynamic/Edit.html (Lloyd Allison)
* http://www.cut-the-knot.com/do_you_know/Strings.html (Alex Bogomolny)
* http://www-igm.univ-mlv.fr/~lecroq/seqcomp/node2.html (Thierry Lecroq)

다른 언어로 구현

아래 있는 분들은 그들 각자가 다양한 언어로 Levenshtein Distance 알고리즘을 구현한 것을
여기서 사용할 수 있게 친절히 승낙해 주셨습니다.

* Eli Bendersky 은 펄로 구현해주셨습니다.
* Barbara Boehmer 은 Oracle PL/SQL 로 구현해주셨습니다.
* Rick Bourner Objective-C 로 구현해주셨습니다.
* Joseph Gama 는 TSQL로 Planet Source Code 에 있는 TSQL 함수 패키지의 한 파트로 구현해주셨습니다.
* Anders Sewerin Johansen 는 C++로 제가 만든 것보다 C++의 정신에 가깝게, 더 최적화되고 세련되게 구현해주셨습니다.
* Lasse Johansen 는 C#으로 구현해 주셨습니다.
* Alvaro Jeria Madariaga는 Delphi로 구현해 주셨습니다.
* Lorenzo Seidenari 는 C로 구현해 주셨습니다.
* Steve Southwell는 Progress 4gl로 구현해 주셨습니다.

이 페이지 밖에 있는 다른 구현들:

* Art Taylor의 Emacs Lisp로의구현.
* Magnus Lie Hetland의 Python로의 구현.
* Richard Suchenwirth의 Tcl로의 구현(링크가 깨진 것을 알려주신 Stefan Seidler님 감사합니다).
posted by progh2
저는 데비안과 젠투와 함께 FreeBSD가 정책적, 경제적, 기술적 측면에서 굉장히 좋다고 생각해왔습니다. 앞의 두개는 GNU 시스템으로 GNU 정책을 따르면서 빨간모자(레드햇)네보다 더 우수한 성능과 정책을 가지고 있습니다. 빨간모자의 것들은 분명 인터페이스라든가, 처음 접하는 사용자에게는 유용할지 모르지만 그외의 모든 면에서 뒤떨어진다고 생각하기 때문에 좋아하지 않습니다. 또한 그러한 몇몇 이유때문이라면 이미 국내에서 나오는 한컴리눅스나 다른 배포판들이 이미 따라잡았다고 생각하기 때문에 더더욱 그렇습니다.

GNU시스템과 달리, (물론 GNU 시스템의 파일들을 사용하기는 하지만) FreeBSD는 386BSD에서 파생된 FreeBSD 라이센스를 사용하는 유닉스계열 시스템입니다. 이 프로젝트는 시작한지 십여년이 지났기 때문에 코드의 성숙도도 높고, 더 보수적이며 더 안정적입니다. 어찌보면 데비안의 Stable 배포버전을 떠올릴 수 있는데, 이보다 더 보수적이면서도 새 어플들을 빠르게 받아들여서 더 합리적으로 진행되는 프로젝트 같습니다. 데비안처럼 Stable 과 Current 버전이 있습니다만 데비안의 것과는 약간 다른 개념이 들어가 있습니다.

FreeBSD의 특징을 꼽으라면, Ports 시스템이라는 것이 존재한다는 것입니다. 이것은 데비안의 apt 와 비슷하게 생각할 수 있는데, 결정적으로는 Ports는 소스파일을 근거로하여 소스를 다운받아 컴파일해서 설치해주는 소스차원의 것이고 데비안의 APT는 이미 컴파일 되어있는 바이너리차원의 것이라는 것에 있습니다. 물론 데비안의 APT도 소스를 가져와서 컴파일할 수는 있지만, 소스의 컴파일 옵션 설정 등 에서 FreeBSD의 방식을 따라가지 못합니다. (아니면 소스를 받아와 재피키징을 빌드하면 되긴 하지만, 이것은 매우 번잡스럽습니다.) 즉 데비안은 바이너리 설치에 최적화 되어있어 짧은시간에 훌륭한 시스템을 구축할 수 있고, FreeBSD는 컴파일 시간 등이 필요해서 오래걸리긴 하지만 최적화된 시스템을 구성할 수 있다는 말로 요약이 됩니다. Gentoo 는 이러한 FreeBSD 의 장점을 가져온 것으로 Emerge 시스템이란 것이 Ports 시스템과 데비안의 APT를 혼합하여 만든 것으로 매우 호평을 받고 있습니다. 수년 후에 더 성숙해진다면 더욱 매력적으로 성장해 있을 것으로 생각됩니다.

GNU시스템이나 FreeBSD시스템이나 모두 GNU 프로그램들을 사요하기 때문에 (특히 X환경에서는 )언듯보면 그다지 차이점을 찾을 수 없을지도 모릅니다. 모두 UNIX-like O/S이고, 유닉스 프로그램들이 대부분 잘 작동하기 떄문입니다. 큰 차이점이라고 한다면 라이센스가 있겠습니다. GNU 시스템은 GNU 라이센스인 GPL을 따릅니다. 이 GPL은 한마디로 요약하자면, "GPL 로 작성, 재배포된 프로그램은 GPL이어야 한다"와 "이외의 모든 제한은 걸 수 없다" 입니다. 앞의 말은 한번 GPL이면 그 대대손손 모두 GPL 라이센스를 가져야한다 뿐입니다. 뒤의 말은 프로그램의 소스공개는 물론 수정 배포, 판매 등 앞서의 말만 빼면 모두 허용되어야 한다는 말이지요. 즉 GPL은 GPL로 된 프로그램을 어떤 특정인이나 단체만을 위해 사용되지 못하게 막는 것입니다. 반면 FreeBSD 라이센스는 "맘대로 하라"입니다. GPL 보다 더 Free 한 개념으로 어찌보면 저작권이 없는 것과 같습니다. FreeBSD 라이센스 프로그램은 그 프로그램을 자신의 이름으로 팔던, 조금 고쳐서 소스를 공개 안하고 팔든 상관 안합니다. 리차드 스톨만은 이러한 점을 기업들이 악용할 소지가 매우 크며 궁극적으로 일반유저들에게 좋지 못할 것이라는 경고를 했습니다. 뭐, 적절한 예인지는 잘 모르겠지만 우리가 잘 아는 Windows NT 계열(윈도우2000을 포함하여), 미려한 O/S로 알려진 애플의 OS X 이 이러한 경우입니다.

실은 이러한 FreeBSD에 대한 좋은 문서를 찾았다는 글을 남기려 했는데, 이렇게 비교해서 생각하게된 글을 남기게 되었군요 (웃음) 이들에 대해 관심있는 분들과 후에 제가 다시 접근하기 위해 링크 정보들을 남깁니다.

http://www.bsdnet.co.kr/articles/
국내 BSD네트웍으로 FreeBSD관련 상품도 판매하고 좋은 글도 많고 유익한 곳이라 생각합니다.
http://www.kr.freebsd.org/
국내 FreeBSD 사용자 모임 사이트로 역시 FreeBSD에 대해 연구한다면 반드시 북마크 해둬야 하는 곳입니다.
http://openlook.org/
국내 FreeBSD 커뮤터 중 한분인 퍼키님의 홈피입니다. 거의 실시간(?) FreeBSD에 대한 정보를 얻을 수 있으며 제가 FreeBSD에 눈길을 돌리게 영향을 끼치신 분이기도 합니다. 재미있습니다. :D
http://www.kr.freebsd.org/~cjh/
국내 FreeBSD 커뮤터 중 한분인 최준호님의 홈피입니다. 역시 좋은 문서들이 가득합니다. ;)
http://canon.chungbuk.ac.kr/
FreeBSD 유저의 홈피인듯. 이런저런 문서가 있음.
http://bbs.kldp.org/
Linux 유저들의 곳이지만 동시에 FreeBSD의 유저분들도 많습니다. 이쪽계열(..)에 관심이 깊으면 항상 놀러가야 하는 곳입니다. (네, 그런 것입니다. 후후)
http://www.gnu.org/philosophy/philosophy.ko.html
GNU 사상에 대한 글입니다. 읽어보시길 추천합니다.
posted by progh2
세상에 공짜란 없다.

또한

없어야 한다.

모든 것은 그에 대한 댓가가 있어야 한다.

이것은 "공평한 것"과는 다른 개념으로,
긍정적인 것일 수도 있고 부정적인 것일 수도
있으나 분명 존재하는 자연의 법칙 같은 것이다.

이 법칙을 가지고 세상을 바라보면 사뭇 다르게 보인다.
복잡하고 유기적으로 얽힌 재미있고도 잔혹한 세계가.

이 법칙에 충실해야 한다.
경제행위처럼, 이 법칙은 사람들간의 표준 프로토콜 같은 것이다.
견고할수록 이러한 신뢰성을 보장받을 수 있다.


나는 '모르는 세계'가 감ㅎ다는 것을 깯다게 되었다. 아니, '이 세계에 대해 모르는 것'이라고 해야 정확한 표현이겠지. 나는 주로 이러한 것을 일본관련물에서 얻었다. 사실이 아닌, 소설이나 애니메이션, 게임 같은 것에서라 진실성의 여부에는 논란의 여지가 있다만 나름대로의 현실의 투영이라고 본다면 그런 관점에서 꽤 괜찮은 생각이 아닌가 한다. 이러한 것은 한국의 책들에서는 왜 나타나지 않는가? 여러 신문, 잡지들이 특정 시각에 치우쳐 있다는 뻔한 것을 알면서도 그대로 존재할 수 있는가 등 의문스러운 점이 많다. 아무튼 이처럼 재미있고 흥미진진한 숨겨진 것들이 많은 세상이라는 생각을 하게 되니 가벼운 두근두근한 기분이 든다. 알고싶다. 하지만 알아서 어디에 쓸 것인가에 대해서는 생각을 해봐야 할 것이다.

앎의 댓가를.

무언가 다시 태어난 느낌이다.
먹은 것이 잘 소화되지 않는 것 같다는 현실을 빼면 말이다.

나는 살아있다. 그리고 계속 살아있고 싶다. 살아있는 것에 대한 댓가도 치루어야 한다. 그리고 마음껏 살아있음을 느끼고 살아있을 수 있는 조취를 취해야 한다. 이러한 것을 할 수 있는 것을 살아있기 때문에만 가능한 것이니까. 감사해야 한다. 살아있는 것을 그러기 위해 많은 댓가가 필요했음을 떠올리면서. 그에 대한 최고의 보상은 자신이 태어날 가치가 있었음을 증명하는 것이다. 그 방법과 목표, 결과는 자기자신마다 다르겠지만. 그리고 그 과정에 겪는 경험과 기분, 마음도.

자, 나에게 있어서 가치의 증명은 무엇인가? 어떠한 것이 자신을 최고의 가치로 만들어 줄 것인가?
posted by progh2
http://hanasama.scscian.net/cgi-bin/tt/index.php?pl=38&nc=1 에 대한 트랙백글

저도 종종 서평이나 신문의 관련글, 인터넷 상의 유혹말(..어휘딸림;;)에 혹해서 "이거구나!"하고 샀다가 실제 온 책을 보면 다른 세계의 것인 경우가 있었어요. 아니면 전~혀 딴소리를 하고 있다던가 부실하다던가 상밖이라던가 하는..

그래서 그런책은 사보기전에 교X문고에서 읽어보고 '소장할 가치'가 있을 때만 사보기로 했지만서두 잘 되지 않더군요. ^^;

무엇보다도 집에 사놓고 읽지 않은 책이 몇년치 분은 있다는 것을 생각해내면 죄의식에 사로집혀버리지만..
특히 한권에 최소 2 ~ 3 만원이나 하는 수많은 컴퓨터책들..

..저것들 모두 정가에 팔면 100 ~ 200 만원은 가뿐히 넘지 않을까..
하아..

워낙 죄진 것이 많은 인간이라 피흘릴 양심 한방울 조차
남아있지 않은 것 같지만...

그러고보니 제대로 80%이상 학습한 컴퓨터 책은 6권 밖에 없군요.
투덜이PHP, PHP4 깃털책이랑 c언어 10분 가이드랑 데비안리눅스랑 ms-sql, 일러스트레이터10..

50% 이하에서 멈춘 책들이 대부분이라 넓고 얕은 지식층이 형성되어 어중간한 인간이 되버렸지만.
이렇게 끝까지 판 것들이 그나마 아는체 할 수 있게 해주는 것 같네요.
그래도 여전히 빈약하다고 생각 되는 것은..
너무 너무 너무! 공부를 안하는 것 같아.... 휴우..

50%에 달성한 터보C정복.. 입영하기 전에 끝까지 보고 갈 수 있었으면 좋을련만. 몇일 전에 산 포토샵웍스도.

정말이지, 게임의 폐해인지도 모르겠네요.
책을 사서 "장착"하면 그 지식을 사용할 수 있게된다! 식으로 내심
굳게 믿고 있는 것이 아닌지.. (웃음)
posted by progh2
꽃님누나 블로그의 "혈액형 별 살찌는 음식"에 대한 트랙백. http://hanasama.scscian.net/cgi-bin/tt/index.php?pl=25&nc=1&ct1=5

기훈은 AB형이다. 이러한 것에 관심이 있어서, 관련 책도 꽤 가지고 있다.(웃음) 이 내용은 본지 꽤 된 내용인데, 뭐 나의 경우에는 그럭저럭 맞는다고 생각한다. 위산이 부족해서 커피로 보충하는 건가? ^^

소화력이 떨어진다고 자신도 생각하고 있으며, 그래서인지 소화할 때 에너지 소모가 심한 편이다. (피곤해진다 --) 난 육식을 좋아한다. 이런 것이 몸이 단백질을 원해! 라고 말하는 것인지, 단지 습관인지는 잘 모르겠지만... 두부도 좋아한다. 토마토는 주로 방울토마토를 먹는데 거의 매일 먹고 있다. 가끔 신맛나는 괴물 방울토마토와 단맛나는 좋은 방울토마토의 구분이 불가능하다는 것이 아쉽지만.
posted by progh2
내가 중학교 2학년 때, 처음으로 마인드맵을 접하게 되었다. 계기는, 학급문고에 "반갑다, 마인드 맵"이란 책이 있었기 때문이다. ..라고는 해도, 처음부터 관심있었던 것도 아니었고 내 기억이 옳다면, 2학년 내내 읽어본 적이 없었다. 어째서 접하게 되었냐고 물으면, 자랑은 아니지만 학년말에 가장 책을 많이 읽은 사람에게 벌금으로 사 모은 학급문고 책 1권을 선택해서 가질 수 있는 기회를 주었기 때문에다. 즉 나는 중2때 학급문고를 가장 많이 애용한 학생이었다. ( 실은 자랑이다! 히히~ 감사해요, 전인배 선생님!!! )
posted by progh2
posted by progh2
인간들아.
posted by progh2