블로그 이미지
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

'프로그래밍'에 해당되는 글 4

  1. 2007.01.25 사람을 위한 디자인
  2. 2006.08.11 윈도우시계
  3. 2006.08.08 자만하지 말자
  4. 2004.06.02 자주쓰이는 3개의 언어로 구현한 Levenshtein Distance2
  프로그래밍에는 항상 주어진 문제를 해결하는 데 수없이 다양한 방법들이 존재한다. 경험 많은 프로그래머들은 최적의 해법을 찾기 위해 선택 가능한 것들을 탐색하다 보면, 때때로 수백 줄의, 심지어는 수천 줄의 코드를 없앨 수 있게 해주는 어떤 기법을 우연히 발견하는 경우가 있다는 것을 알고 있다. 이는 프로그래머가 개념적으로 아주 귀중한 도약을 이루었을 때에만 벌어지는 일이다. 그녀가 많은 양의 코드를 던져버릴 수 있다면, 그녀의 프로그램이 더 나아지는 것이다. 더 적은 코드는 더 낮은 복잡성과 더 적은 수의 버그, 의미없는 인터랙션의 더 낮은 가능성, 더 쉬운 유지 보수를 의미한다.

  인터랙션 디자이너들도 이러한 감각을 공유한다. 그들은 선택 가능한 방법들을 탐구하면서 전체 화면이나 크고 복잡한 대화 상자를 없애도 되는 지점을 발견하게 된다. 디자이너들은 사용자 인터페이스의 요소 하나 하나가 사용자에게 부담이라는 사실을 알고 있다. 각각의 버튼이나 아이콘은 사용자가 진짜로 원하는 것을 얻기 위해 이해해야 하고 사용할 줄 알아야 하는 것이 하나 더 늘어나는 것에 불과하다. 적은 것을 가지고 많은 일을 하는 것이 언제나 더 나은 것이다.

  만약 디자이너가 일을 잘하고 있다면, 그녀는 제품에서 인터페이스를 제거하고 있는 것이다. 그녀는 버튼과 기타 등등으로 가득 찬 수많은 화면들을 디자인하고 있는 것이 아니다.

"정신병원에서 뛰쳐나온 디자인/앨런 쿠퍼/안그라픽스" p328~329
posted by progh2
2006. 8. 11. 16:56 데이터뱅크
Clock 060811빌드버전.

초깔끔을 자랑(...)

제가 WinAPI 정복책을 보면서 만들어본 시계입니다.
WinAPI를 공부하면서 최초로 만든 자작 프로그램입니다.(예제 변형한 것 말고요.) 옛날 윈도우에 들어있었던 기본시계를 따라 만들어봤습니다.
아직 별 기능이 없습니다만,  앞으로 알람기능 같은 것을 추가해볼 생각입니다. 예를들어 50분이 되면 "좀 쉬세요~"라는 메시지를 출력하며 노래가 나온다던가, 정각이 되면 "일하셈~"이라며 확인 메시지 박스를 누를때까지 노래가 나온다던가 하는 기능 말입니다. 그리고 아직 제목의 날짜가 바뀌었을 경우 갱신되지 못하는 버그(?)도 있습니다.(아직 변경법을 모릅니다. 10장쯤 보면 나오려나요?)
invalid-file

Clock 060811에 제작. 실행파일 달랑 하나 있음.


ps) 벌써 버그가 하나 발견되서 수정했습니다. |||Orz 오후12시가 넘으면 시침이 나타나지 않는 버그였습니다. (..)
시침이없는Clock

시간이 없어!!

posted by progh2
요즘 맛들린 WinAPI 공부. 하지만 몇번이나 경험하는 것이지만 잘 고쳐지지 않는 것이 있다. 그것은 바로 자만. 책을 여러번 읽고 기본적인 프로그램 제작 감이 잡히면서 지레짐작으로 이건 이렇겠지, 이런거였지 하고 실습할 때 책의 소스를 제대로 안보고 수정해서 쳐넣는다. 이때 무엇인가 알 수 없는 에러가 생기기 마련이다. 보통 이런 상태에 빠지면 몇시간동안 삽질을하며 비쥬얼스튜디오2006의 버그네 뭐네 하며 남 탓을 한다. 하지만 지금까지 제외한 나머지(그 1번은 프로젝트 설정에서 언어변경이었다. 과거식으로 프로그래밍하려면 필요한 설정.) 모두 나의 코딩 문제였다. 2번은 WNDCLASS생성에 필요한 속성을 빼먹어서 일어난 것이었고, 이번에는 커서와 아이콘을 변경할 때(역시 WNDCLASS설정) 기본아이콘을 지정할 때는 NULL로 해주었던 것이 hInstance을 해주어야 하는걸 그냥 NULL로 냅두고 혼자서 삽질한 것이다. 덕분에 이런 부분을 처리할 때 좀 더 신중해지는 것 같지만, 또 앞으로 마찬가지의 삽질을 하게될지 모르겠다. "빨리빨리 다음까지 봐놔야지"라는 조급한 마음이 대충대충, 빨리빨리 하게 만드는 것 같다. 옛날에는 실행 전에 소스들을 찬찬히 뜯어보며 문제가 없는지 확인 후 실행했는데... 총 파지법도 익숙치 못한데 눈감고 쏘기를 하고 있는 것 같다고 할까.. 신중하자. 핵미사일 프로그래밍 한다고 생각하고. (..덜덜덜)
posted by progh2
예전에 컴프 수업을 들으면서 번역했던 문서.
하드 정리중에 발견
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
prev 1 next