'임베디드/Algorithm'에 해당되는 글 6건

  1. 2009.03.03 한글 오토마타-오픈프로젝트-
  2. 2009.03.02 POSIX semaphore 4
  3. 2009.02.11 CRC32, CRC16 1
  4. 2009.01.29 알고리즘등 프로그래밍 관련 정보가 풍부한 블로그 1
  5. 2009.01.29 정렬 알고리즘 정리 1
  6. 2009.01.29 Hash의 기본 개념 2
임베디드/Algorithm2009. 3. 3. 13:45
http://chem.skku.ac.kr/~kle/main/%BB%F5%B3%AA%B7%E7



새로운 Windows용 한글 입력기 새나루


개발자로 퍼키님 WkPark님이 참여하고 있습니다.

기존 입력기와 차별화된 점은, 자판 개발을 염두해두고 개발된 력기라는 것이며, KLDPWiki:오픈소스프로젝트이다.

준비중인 사이트 http://saenaru.i18n.org/

기존에 있던 한글 IME와 차별되는 점은

  1. krisna님의 유닉스/리눅스용 한글 입력기 nabi의 소스와 KLDP:libhangul 프로젝트와 연계성 있게 개발되고 있습니다. 현 새나루의 Automata엔진은 nabi의 소스를 krisna님의 허락을 얻어 차용하고 개선된 것입니다.
  2. 오픈소스이며 자유 소프트웨어입니다. 소스가 완전히 개방되어 있어 누구나 소스를 보실 수 있으며, 오픈소스 라이센스하(BSD라이센스에 준함)에 자유롭게 소스를 쓰실 수 있습니다.

특징 

  1. 두벌식세벌식벌식390, 벌식순아래를 기본지원.
  2. 보락 자판 자체 지원: Key Hook를 이용하여 드보락 자판을 자체 지원합니다.
  3. 보락용 키보드 드라이버도 제공하므로 콘솔에서도 드보락을 지원합니다. (개발판)
  4. shift-space 자체 지원: 리눅스 및 아래아 한글 사용자들이 자주 쓰는 shift-space를 지원하며, 101 Type 3키보드 드라이버와 같이 사용하는 경우에도 충돌하지 않습니다.
  5. 편리한 자판 설정: 세벌식 사용자를 위해 자판을 쉽게 바꿀 수 있도록 했습니다.
  6. 사용자 자판 지원: 사용자가 원하는 자판을 만들 수 있습니다.
  7. 한자<->한글 변환 지원. 

한글 IME 2002에 비해 좋은 점 

  1. 커서 위치가 옳게 표시된다: 한글 IME 2002는 커서 위치가 올바르지 않습니다.
  2. gvim에서 한글 입력이 자연스럽다: 한글 상태에서도 i,o,a등의 명령이 곧바로 먹힙니다.
  3. IME를 지원하지 않은 어플에서도 한글 IME 2002보다 한결 자연스러운 한글 입력
  4. 드보락을 한글과 자연스럽게 쓸 수 있습니다. (자체 key hook 혹은 자체 키보드 드라이버 사용)
  5. 한자<->한글 변환 지원: 윈도우에 기본으로 지원되는 한글 IME 2002/2003보다 좀 더 편리한 한자<->한글 변환을 지원합니다. 


실험적 기능
  1. 동시치기 지원: 실험적 기능이며, 동시치기가 지원되는 키보드를 이용하면 동시치기를 무리없이 쓸 수 있도록 했습니다.
  2. 일본어 입력기와 마찬가지로, 한글 조합이 "단어"단위 입력도 지원. 기존 입력기는 한글 한 음절 단위로 commit했으나, 단어 단위 입력도 지원하기 때문에, 한자 사전도 쓸 수도 있습니다.
  3. Mode_Switch 기능: 한글 입력 상태에서 오른쪽 Alt키를 누른채로 자판을 누르면 영문이 눌러집니다. (리눅스/유닉스의 Mode_Switch기능 구현)

Download 

이제 설치 프로그램으로 설치하실 수 있습니다.

새나루/개발버전: 최신 개발판 

새나루/Build 

빌드하기 위해서는 WindowsDDK와 WindowSDK가 필요하다. DDK의 빌드 환경 CMD를 실행한후 TopSourceDir에서 build 라고 치면 된다.

ScreenShots 

Please see also 새나루/ScreenShots

Language bar 

langbar1.png
(IME 2002 )
langbar2.png
(IME 2002 TSF)
langbar3.png
(새나루)

빠른 메뉴 

qmenu.png

환경 설정 

langenv.png

개발 일지 

한자/기호 지원 2003-11-25 추가

saenaru_han.png
saenaru_sym.png

한자 뜻 지원 04/10/10:

nabi에서 사용하는 파일을 읽을 수 있습니다.

nhanja.png

cmd_han.png

saenaru2.png

2003-11-22: 삽질 끝에 XP 언어 툴바에 붙이고, 자판설정에 한해서 기본적인 동작이 되게끔 만들습니다. 위의 그림에서, 툴바의 키보드 아이콘을 누르면 자판을 쉽게 변경할 수 있고, 설정창에서 또한 자판을 바꿀수도 있습니다. 현재, imhangul/nabi의 루틴을 그대로 가져왔습니다. 오토마타 부분은 imhangul/nabi를 참조해서 만들었으나 새로 작성했으며 두벌식/세벌식 오토마타만 지원하며 옛한글을 지원하기 위해서는 거의 다시 만들어야 합니다. --WkPark

lua 대신에 SUN에서 만든 오토마타 전용 언어를 사용하도록 변경

2003-11-14: #gnome에서 말씀하길, lua 스크립트 엔진을 붙이고 계시다고 합니다. lua는 매우 작은 스크립트 언어로서,새나루의 오토마타 엔진이 될 것이라고 합니다. 오토마타 엔진을 lua로 써서 만들면, 입력기의 특성을 거의 자유 자재로 만들 수 있게 될 것입니다.

루리님의 소개글 

윈도우즈 98에서 작동 안됨 

saenaru98.png
윈98에서 새나루를 설치할 때 에러를 내고 설치가 안됩니다. --김수구

saenaru.inf를 살짝 고치니 이 에러는 나지 않더군요. 98에서 쓰려면 MSDN에서 unicows.dll도 받아서 설치해야 할것으로 생각됩니다. --WkPark

윈도우즈 2000에서는 오피스 없이도 돌아갑니다. (한글 윈도우즈 2000 프로페셔널, SP4, 그밖에 대다수 올림) -- 이 정민

windows 2000에서는 IME 상태표시를 해도 화면에 나타나지 않는군요.--황수진

IME상태표시는 현재 제대로 고치지 않아서, 소스상으로 꺼둔 상태입니다. --WkPark
fakeime는 윈도우즈 98이상에서 모두 작동되는 IME였습니다. 그러므로, XP와 관련된 툴바에 나오는 메뉴 등등을 제외하고는 98/2000에서 작동하게끔 개발될 것입니다. 제 개발 환경이 XP여서 XP상에서 컴파일하고, 테스트를 XP에서만 했기 때문에 98및 2000에서의 작동여부는 알 수 없고, 그곳에서 컴파일 할 수 있는 환경이 되면 문제점을 알게 되지 않을까 합니다. --WkPark

Windows2000에서 새나루가 됩니다. 제 컴에는 Office 2000이 깔려있지만, Office2003을 깔아야만 되는지는 모르겠습니다. 새나루를 설치하면 제어판-국가별옵션-입력로케일에서 새나루가 나타나는데요.--황수진

프로그램이 사용한 API를 보니 새나루는 유니코드 기반이네요. 9x에서 동작하지 않는 게 당연합니다. 개발자 누리집에 "Windows 98에서는 안된다는 보고가 있습니다"라고 적어 놓는 정도가 아니라, MSDN에 있는 유니코드 호환성 레이어로 프로그램을 다시 빌드하든가, 윈도우 2000/XP 전용이라고 선언을 해야 합니다. (김 용묵*님의 글) --루리

fakeime 소스는 원래 95도 지원되고 유니코드(98 이상)도 지원되었습니다. 새나루는 2바이트 문자 지원을 아예 빼고 유니코드만 지원하기때문에, 소스코드상으로는 98부터 지원됩니다. 설마 요즘까지 95쓰시는 분은 없겠고요 :)새나루소스가 OpenSource이기 때문에, 소스를 다운받아서 98쓰시는 분이라면 98DDK를 받아서 컴파일해 보시기 바랍니다. --WkPark

XPDDK에는 컴파일러가 내장되어있으나, 98DDK는 VC++을 설치해야 하는군요. ㅡㅡ;; --WkPark

windows 2000 의 경우 office xp 의 입력기를 설치하면 트레이에 상태표시가 나옵니다. (설치하지 않으면 태극기만 나오네요.)

기호 문제 

기호가 많이 부족하군요(일본어 히라가나 따위). ㄲ, ㄸ, ㅃ, ㅆ, ㅉ 자리가 아직 비어 있으니.. 그곳에 채워넣으면 될 듯하네요. 그리고 기호 배당도 다시 체계적으로 정리해야겠읍니다.--루리

히라가나 입력은 버그였네요. 윈도우즈의 기호입력체계는 저의 개인적인 의견으로는 없느니만 못하다고 생각합니다. 현재는 KSX 1001의 한글 자모 영역만 제외하고 거의 전체 기호를 모두 집어넣은 형태이고, 다음과 같이 제 임의대로 다시 할당했습니다.
ㅁ: 그림문자
ㄱ: 괄호문자
ㄲ: 그리스 문자
ㅅ: 수학문자
ㅍ: 표문자
ㅊ: 첨자
ㅈ: 전각
ㄴ: 한글 낱자
ㅎ: 히라가나
ㅋ: 카다가나
ㄹ: 로마숫자
ㅇ: 원문자
ㅂ: 박스문자
ㄷ: 단위문자
ㅌ: 괄호문자
ㄸ: 미배당
ㅃ: 미배당
ㅉ: 미배당
ㅆ: 미배당

기호입력 부분은 saenaru.dic을 고치면 사용자가 원하는 대로 고칠 수 있습니다. 기호 입력에 대한 입력 의견이 있으시면 saenaru.dic을 고쳐서 올려주시면 고맙겠습니다. --WkPark

2006년 버전부터 기호를 분리하고, 윈도우즈 호환용 기호 사전을 symwin.dic이라는 이름으로 따로 배포에 포함시켰습니다.

질문과 답변 

Q: 새로 업데이트되는 새나루는 그냥 설치만 하면 되는겁니까? --황수진 A: 그냥 설치하시면 됩니다. 단, 현재 선택된 입력기가 새나루가 아니어야 합니다. 현재 선택된 기본 입력기 새나루라면 다른 입력기로 고치신 후에 재부팅하고 설치해야하지만, 기본 입력기가 새나루가 아닐 경우는 재부팅하지 않아도 됩니다.

RootRightMenu1,RootRightMenu2,RootRightMenu3는 무얼 말합니까? 저는 Windows 2000을 씁니다.--황수진
fakeime 원 소스에 있는 부분입니다. 아마도 그렇게 만들 수 있다는 예를 들어놓은 것일텐데, XP에서는 그 메뉴가 아예 나오지 않습니다. 그것이 어떤 모양인지도 잘 모릅니다 ^^;; --WkPark

프로그램마다 설정이 따로 존재하는 것처럼 보이는군요. 예로 메모장을 두개 띄워 메모장 a에서 세벌식으로 고쳐도 메모장 b에서는 두벌식으로 설정되어 있습니다. xp 를 쓰고 있습니다. --네엉
언어 툴박스(자판 아이콘을 누를 때 나오는)를 통해서 설정하면 열린 프로그램마다 다르게 쓰게끔 되며, "환경 설정"을 통해서 설정하면 전체 설정이 바뀝니다. 즉, "환경설정"에 들어가셔서 고치면 원하는 설정을 하실 수 있게 됩니다. --WkPark 

Windows 2000에서는 "환경설정"이 없네요. ---황수진

11월29일자 버전인데 윈2000서버에서 잘되네요.. 오피스같은거 안깔린 상태인데..

Dvorak 자판 

다음이나, 프리챌등 로그인할때 아이디까지는 제대로 드보락으로 입력할 수 있는데, 비밀번호 입력시엔 쿼티로 입력을 해야되네요. 그 문제도 해결가능한지요? 윈도상에서 제공해주는 드보락 입력기로는 되거든요. 그리고 어쩌다보면 드보락도, 쿼르티로 아닌 배열이 나올때가 있습니다. 12일버전에서는 한글모드로 들어가서 태극기표시 나온상태에서 영문으로 전환하면 그 문제가 해결되었었는데.. 15일자버전은 태극기 모양이 안나오고 그냥 '가', 'A'표시만 나오네요. 윈도상에서 제공해주는 드보락입력기랑 혼용(시프트 스페이스때문에 그랬었거든요^^)해서 그런가.. 지금은 제거했습니다. 그래도 엉뚱한 배열 나오면 다시 올릴께요. --박영석

새나루에서는 드보락 입력을 표준적인 방법이 아닌 hook방법을 쓰기때문에, 프로그램에 따라서 제대로 작동하기도 하고 그렇지 않기도 합니다. 동시 지원을 위해서는 어쩔 수 없는 선택이지만 모든 프로그램에서 일관되게 작동하는 것을 보장할 수 없습니다. ㅡㅡ;; --WkPark

메모장이나...익스플로어, 워드패드등에서 단축키는 쿼티로 먹히네요. 아.. 이건 일부러 그렇게 하셨나보다.. 기존배열이 더 편할수도 있으니... --박영석

새나루가 드보락을 지원하는 구현방식(hook)때문에 그런 식으로 작동하는 것입니다. 일부러 그렇게 의도한 것은 아닌데 파생 효과네요. 새나루는 "드보락"이 활성화 되어 있을 경우 WM_CHAR를 가로채서 드보락 자판 배열로 바꿔줍니다. 단축키의 경우는 WM_CHAR가 아닌 WM_SYSKEYDOWN에 의해 작동합니다. --WkPark

윈도2000 커맨드창(도스창)에서 드보락 안 먹히고 쿼티로 되네요... --박영석

도스창은 뭔가 다른 방법을 쓰나보군요 ^^;; 내년에나 볼 수 있을 듯 하네요 --WkPark

2006년 개발판 버전부터는 콘솔 커맨드창에서도 드보락을 지원합니다. --WkPark

동시치기 문제 

ㅕ+ㅣ=ㅖ,ㅑ+ㅣ=ㅒ 때문에 세벌식 모아치기에 문제가 생긴다는 지적이 있군요. 두벌식에서는 쉬프트 누름 횟수를 줄이기 위해서 그런 조합이 필요한지도 모르겠으나 공세벌식은 ㅖ,ㅒ를 그냥 치는 것이 조합하는 것보다 편합니다(배열을 보시면 아실테죠..이동거리 증가에 한손가락 련타에). 그리고 ㅡ+ㅣ=ㅢ 조합도 세벌식 모아치기에서는 도움이 안됩니다. 또 세벌식 모아치기를 위해서 날개셋*에서 지원하는 것은 겹모음용 ㅗ,ㅜ 와 홑모음용 ㅗ,ㅜ 를 구분해서 인식하는 것입니다. 그래서 홑모음용 ㅗ,ㅜ 를 쳤을 때는 모음 조합을 하지 않는 것입니다. 즉 겹모음용 ㅗ,ㅜ 만 '중성2'를 받을 수 있는 것이지요. 결론은 공세벌식 부류에서는 ㅕ+ㅣ=ㅖ,ㅑ+ㅣ=ㅒ 조합을 없애고, 환경설정에서 세벌식 모아치기를 선택하면 ㅡ+ㅣ=ㅢ 조합을 없애주며 동시에 겹모음용 ㅗ,ㅜ 와 홑모음용 ㅗ,ㅜ 를 구분해서 인식하게 해 주어야 합니다. --루리

ㅕ+ㅣ 조합과 동시치기와는 전혀 상관없이 작동합니다. 각 자판의 조합지도를 지정할 수 있게끔 구현되면 이 문제는 모두 해결됩니다. --WkPark 

ㅕ+ㅣ,ㅑ+ㅣ 조합은 모아·동시치기가 안되기 때문이 아니라 도깨비불 현상을 없애기 위해서 지워야 합니다. 여->예->여이->여인. 그리고 나머지 지적한 조합은 모아치기를 온전히 실현하기 위해서 필요한 것이고요. --루리

'각 자판의 조합지도를 지정할 수 있게끔 구현되면 이 문제는 모두 해결됩니다.'라고 말씀해주셨는데, 그렇다면 동시치기에서 '계계'라고 칠 경우 '겨기ㅖ'가 되는 경우와 '모장'을 칠 경우 '뫄장'이 되는 경우,'묵묵묵'칠때 '묵묶무'등도 해결 가능하겠죠? --박영석

앗. 동시치기가 제대로 구현되지 않았던 것이였습니다. 12일자로 수정해서 올려놓습니다. --WkPark

감사합니다. 근데 모장을 동시치기할때 '뫄장'으로 되는 문제는 아직 해결이 안된듯하네요.아마도 초성과 종성이 쳐질때 자동으로 'ㅏ'가 들어가는 이유로 뒤에 가야될 'ㅏ'가 앞으로 가버리는 거 같네요. '모'치고 '장'칠때 'ㅈ'과'ㅇ'만 쳐도 'ㅏ'가 자동 생성되는데 그 이유로 'ㅏ'가 모에 붙네요. 물론 그냥 '장'칠때 'ㅈ'과 'ㅇ'만 치는게 더 편하긴하네요.. ^^ 습관들이면 되겠지만...이것도 설정에 옵션으로 해놓으면 좋겠네요. 암튼 감사합니다.--박영석

이건 좀 까다롭습니다. "모장" "조장" "고단" 등등의 (초/중) + (중+종+초)에서 발생하는 현상입니다. 이것은 "초 + 중 + 중 + 종 + 초"이 되는데, 현재의 오토마타로는 (초 + 중1 + 중2) + (종 +초)로 해석이 되어서 생기는 문제입니다. 이걸 제대로 되게 하려면, 앞에 입력된 자모 "두개"의 상태를 기억해야 합니다. (현재는 최종으로 입력된 키의 VKey값을 한개만 저장합니다) --WkPark

안마태 자판을 위한 동시치기를 제대로 구현하려면, 이 이외에 몇가지를 더 추가해야 합니다. 현재의 동시치기 오토마타는 초+중 중+종 종+초 결합에 대해서만 고려하고 있지만 안마태 자판의 쌍초성,겹중성,쌍종성 등등을 구현하려면 동시치기용 매핑이 따로 고려되어야 합니다.

최소 구현비용이 무엇일지 생각해보고 있습니다. --WkPark

초성+종성을 눌렀을 때 자동으로 중성 "ㅏ"가 들어가는 것은 별로 좋아보이지 않기 때문에 다른 방법을 생각하고 있습니다. 예를 들어, 아예 글자 조합을 하지 않는다거나 (안마태 자판 키보드 Hook 드라아버처럼)하는.. --WkPark

모아치기 동시치기 문제 

겹모음용 ㅗ,ㅜ 와 홑모음용 ㅗ,ㅜ 를 구분해서 홑모음용 ㅗ,ㅜ 다음에는 '중2'를 받지 않게 하면 "동시치기의 겹중성 문제"는 해결될 문제입니다. --루리

현재로서 홑모음 겹모음을 따로 인식하는 문제는 고려하고 있지 않습니다. 겹중성 문제로 이것을 고려하는 것 보다는 차라리 동시치기를 정확하게 구현하는 것이 구현비용이 더 적게 듭니다. --WkPark

반대로 겹모음일경우 받침이 먼저오더라도 중성이 오면 결합이 되야될거 같네요. '된'을 칠 경우 '도'를 먼저 친후 '인'을 치는데.. '도인'이 될때가 많네요.아마 이것도 홑모음 겹모음 구분이 안되있어서 그런거 같네요. --박영석

불편하지요 ? 마지막에 조금 고친 부분이 있습니다. 다시 그부분을 비활성화 시키고 12월12일자로 돌려야겠네요.

아.. '모장'이 '뫄장'되는 거 고치셨었네요. 몰랐습니다.. --박영석

새나루 잘 쓰고 있습니다. 종성+초성을 하면 ㅏ 가 삽입되는 것 외에는 아주 좋군요. 그 정도야 참을 수 있지요. 다른 문제가 있는지는 아직 모르겠습니다. 이제는 새나루로 쓰는 일이 많답니다. 고맙습니다. --황수진

종성+초성을 하면 ㅏ 가 삽입되는 문제는 김용묵님에게서 조언을 구하면 안되나요?--황수진

"ㅏ"가 넣어지는 것은 현재 편법입니다. 안마태키보드 드라이버처럼 아예 화면에 표시 안되게 하거나 하는 방법을 쓰면 되겠죠. 종성+초성이 표시되게 하는 방법은 없습니다. --WkPark

안마태 자판 문제 

안마태 자판은 ㄱ+ㅇ = ㄲ이 되는데, 그 역변환 (ㄲ->ㄱ+ㅇ)을 하려면 버퍼가 따로 필요하군요. 안마태 자판은 이러한 문제점 때문에, 새나루+안마태드라이버를 같이 쓰는 방식으로 해결을 한다고 합니다. --WkPark

한자입력 문제 

입력방식에서 '한글', '영문' 말고 '한자'는 기능이 무엇입니까.(일본어 입력기에서 딸려 온 것입니까?)--루리*

한자를 많이 입력할 경우 특별히 한자 입력모드를 만들기 위해서 실험적으로 그렇게 해 두었습니다. 일본어 입력기의 손쉬운 한자입력 부분에서 쓰는 방법을 사용할 것입니다. --WkPark

저는 한자를 거의 쓰지 않으므로 상관없읍니다만 한자 배열 기준은 무엇인지요? 전에 일본웹 검색을 하려고 自를 치는데 세번째 목록에 있더군요. --루리*

한자 배열은 KS X 1001배열 순서 그대로입니다. 한글 IME 2002의 한자 배열은 유니코드 배열순서도 아니고 KS X 1001배열 순서도 아니더군요. 아마도 한자 빈도수를 고려하거나 한 ?? --WkPark

검색창 같은 데에서는 선택 목록도 뜨지 않아 한자키나 화살표를 계속 눌러야만 합니다. 선택목록이 뜨지 않는 이유도 알았으면 합니다. --루리*

버그입니다. 선택목록(candidata창)이 뜨지 않는 문제는.. fakeime에서 원래 있던 문제점입니다. --WkPark 

저는 한자를 많이 쓴답니다. 그래서 저로서는 아래아한글을 안 쓸 수가 없지요. 다른 MS word나 훈민워드(통일워드)는 한자가 약한 것 같아서. 그래서 저의 바램은 한자를 제대로 쓸 수 있도록 많이 보강을 해 주셨으면 좋겠습니다. (아래아한글 가격이 만원 정도만 하면 얼마나 좋을고!) --황수진

예. 그래서, 한자를 많이 입력하는 경우를 고려해서 일본어 입력기식의 한자 입력방법 지원을 고려하고 있습니다. 이른바 한자 입력 모드가 바로 그것입니다. --WkPark

2006년 한자 입력을 제대로 지원하기 위한 Reconversion 기능을 구현했습니다. 적어도 IME 2003보다는 똑똑하게 작동합니다. --WkPark

Shift-space 한글 전환 

모질라 1.5에서 텍스트 영역에 입력하는 도중에, shift-space 로 한영 전환을 하면 한영 전환은 되지만, 공백이 하나 입력됩니다. --wafe
저는 XP일 경우인데 잘 됩니다 --WkPark

아 그리고 Shift-space로 전환하는거 옵션에서 끌 수 있게도 가능하게해 주시겠죠? 영어를 열심히 치다보면 대문자 칠 때 자꾸 한글로 변환되기 쉽더군요. 제 손이 이상한건지 자꾸 대문자 치다보면 한글로 전환되더라고요. --박영석

이 옵션은 200412xx 버전 이후부터 적용되었습니다

고고타자 

개발자님 오랫만입니다. 작년부터 매일매일 오는데 업데이트는 없더군요. ㅅ.ㅅ; 제가 실력이 뒤따라준다면 소스를 분석해서 어떻게 해보고싶기도 한데... ㅋㅋ 암튼 고고타자에서 예전부터 제가 지나쳤었던게 있었는데.. 채팅중 말고 겜중이나 연습시에 문장을 동시입력으로 할 경우 종종 '있, 을, 은, 연, 억, 였, 악, 안'등등으로 끝나는 어절다음에 'ㅇ'이 들어가는 현상때문에 곤란한때(맥이 끊겨서 더이상 진행이 안되고 버벅대죠)가 많습니다. 어쩔경우에는 모음('ㅏ')도 들어가는거 같기도 한데... 암튼 세이클럽에서는 기가막히게 잘 되거든요 ㅎㅎㅎ 아마도 프로그램상 '종성+중성' 혹은 '중성+종성'일 경우 자동으로 'ㅇ'이 삽입되고 '초성+종성' 혹은 '종성+초성'일때는 자동으로 'ㅏ'가 삽입되기때문일 거라 생각되네요. 고고타자 같은 경우 겜진행시 문장을 칠때 일단 글자 하나를 맞게 치면 더 이상 수정이 불가한데 중성과 종성이 초성보다 먼저 눌러질경우 'ㅇ'이 자동 삽입되어 글자가 더 이상 수정이 불가능한 상태에서 추가(사실 추가는 아니지만 고고타자에서는 추가로 인식하겠죠)로 'ㅇ'이 눌러져서 그 다음 음절에 찍히죠. 'ㅏ'문제도 마찬가지인거 같네요. 그래서 제가 어떻게 해결할까 생각해봤더니 답이 나오더군요. 그렇잖아도 동시입력시 눌러야될 키 갯수가 조금 부담스러운데....프로그램상에서 지원해주는데로 간편하게 '초+중+종'로 된 글자일 경우 'ㅇ'나 'ㅏ'를 생략하는거더군요. 진작에 그렇게 깊은 뜻을 못헤아린 제가 부끄럽네요 ㅎㅎ

근데 그렇게 해봤더니 아마도 고고타자 게임 진행시엔 문제가 전혀 없겠지만... 반대로 고고타자상에서 채팅시나 세이클럽, 혹은 딴데서 타자칠경우 생각지도 않은 또다른 문제에 봉착되더군요.

'감사합니다'를 위에 간편한 방식으로 입력해보면, '감ㅅ힙나ㄷ'가 되더군요. -ㅅ- 'ㄱ+ㅁ=감' 로 보이지만 상태는 ㄱㅁ상태가 유지 되는거 같네요.그래서 그다음에 사를 칠경우.. 'ㅏ'를 훔쳐가더군요. 'ㅎ+ㅂ=합'처럼 보이지만 상태는 'ㅎㅂ'라서 '니'란 글자를 치면 'ㅣ'를 빼앗아서 '힙'이 되네요. 그러니 연쇄반응으로 이어지더군요. '온천'도 마찬가지 효과로 '촌언'이 될 수도 있습니다. 화학반응에서 분자끼리 서로 빼앗고 뺏기는거 같네요 ㅅ.ㅅ

그러고 보면 12월15일자 첫번째 버전(12월 12일자로 되돌리기 전 버전인 '모장'이 '뫄장' 되는거 수정해 주셨던게)이 최종(12월30일)보다 훨씬 더 편한거 같네요 ㅅ.ㅅ 솔직히 그래서 오늘까지도 12월 15일자의 첫번째 버전을 고수해왔습니다. '수정'이 '숴장'이 될 염려도 없고, '될' 처럼 이중모음에 받침 들어간거야 뭐 '도'먼저 치고 그담 순서대로 풀어치면 문제 될것이 없으니...

암튼 아쉬운게 있다면.. 자동으로 'ㅇ', 'ㅏ' 삽입되는걸 100% 오타없이 쓸 수 없는다는거죠. 정말 간편하고 좋은거 같은데 다음 글자의 음소를 빼앗을 수 있다는 약점때문에..... 좀 불편하네요.

개인적인생각으로 단기적으로는 15일자 버전(첫번째)에서 'ㅇ', 'ㅏ'문제가 해결되었으면 좋겠네요 ㅅ.ㅅ

물론 개발자님은 최종적으로는 이중모음까지도 완벽 동시입력 지원을 지향하시겠지만요..(저도 그럴날이 빨리 오길 바랍니다 ㅅ.ㅅ) --박영석

한메타자교사 

한메타자교사는 한글 입력상태에서 기호가 입력되지 않는 문제점이 있습니다. 한메타자교사 자체적으로 WM_IME_COMPOSITION을 한글만 허용하는 것 같습니다. --WkPark

Shift-Home 

한글 상태에서 글을 쓰다가 쓰고 있는 줄을 블럭으로 묶기 위해 쉬프트+Home 키를 누르면 쉬프트 키가 적용이 안되서 블럭이 안잡힌 상태로 커서만 이동하는데.. 방법이 없을까요?(다시 해보니 저도 되네요-_-; 아까는 계속 안되었었는데.. 죄송합니다 ^^;) --착이

XP에서 노트패드, 워드패드, 모질라, 익스플로러 모두에서 문제가 없습니다. --WkPark

음 위의 문제 다시 발생 했는데-_-; 어떤 환경일 때 나타나는 현상일까요..; 윈2003에 오피스는 아직 설치하지 않은 상태입니다.. 원격데스크톱으로 연결해서 그런가? 조금 더 지켜보고 신고하겠습니다 ^^;--착이

저도 윈도2000서버 사용하는데 노트패드, 워드패드, 익스플로어(지금 글 쓰고 있는 여기서조차)등에서 안먹히네요. 기호로 끝나거나 한번 지웠다가 다시 쓰거나 처음 실패후 다시하는 경우만 되네요. 처음 시도시는 안먹히고 커서만 이동하네요. 아마 윗분도 되었다 안되었다 해서 헷갈리셨을거 같네요. 되긴 되는데.. 순수 한글로만 백스페이스 없이 치다 블럭 씌울 경우에는 안 먹히네요. --박영석

처음에 쓰다가 보니 정상적으로 작동을 안해서.. 이곳에 문의 했는데 답변을 보고 나서 다시 해보니 정말 다시 되더라구요(당황스러웠음-_-) 그래서 한동안 정말 제대로 됬었는데 지금도 제대로 동작을 안하네요..; --착이

포멧하고 XP를 깔았는데.. 처음 새나루 설치 하니 잘 동작했는데 조금 쓰다가 지금은 또 안되네요-_-; 재부팅 하면 안되는건가.. --착이

Esc로 한글 -> 영문 전환 (for Vim mania :> ) 

2004년 11월30일 버전에 적용됨

Mode_switch키 기능 

아주 좋네요..그런데 오른쪽 alt는 어떤 손가락으로 눌러야 하나요? 엄지! 혹은 새끼?

간단히 Windows XP의 메모장과 모질라 1.5에서 사용해 보았습니다. 메모장에서는 잘 동작하는데, 모질라에서 웹페이지의 텍스트 영역에 글을 쓰는 도중에는 Alt를 누른 상태에서 자판을 누르면 메뉴가 떠버리더군요. --wafe
저는 둘 다 잘 됩니다. --WkPark
아... 그렇군요. 뭔가 정보를 더 드렸으면 좋겠는데, 모질라 1.5에서 동작이 잘 안된다는 것 외에는 별로 드릴 말씀이 없고, 좀더 관찰해보겠습니다. --wafe 

Capslock 

흠..장점도 있고 단점도 있읍니다. 공세벌식에서 숫자 칠 때 편하기는 하겠으나, 두벌식에서는 소용 없고, 한글 입력상태에서 Capslock을 신경써야 한다는 것을 반기지 않는 사람이 있기도 하지요. --루리

caps lock을 누르면 숫자키와 부호만 나오도록 하면 좋을 것 같습니다. 아니면 caps lock상태의 키배열을 사용자가 정의할 수 있게하여, 자판에 없으나 각자 자주쓰는 특수기호를 caps를 눌러 바로 쓸 수 있게한다면 어떨까 하는 생각도 들고, 이런걸 오히려 불편해 할 사람도 있을테니, 환경설정에서 사용자정의Caps배열을 켜고 끌 수 있으면 더할 나위 없겠다는 생각도 듭니다. 그냥 의견입니다...(ㅅ.ㅅ) 지금의 새나루도 너무나 만족하며 잘 쓰고있습니다. 감사합니다. 즐거운 성탄, 그리고 행복한 새해 되세요. --박경남

Caps Lock은 한글 IME2002의 방식만을 따르도록 할것입니다. 특별한 아이디어가 아니라면, 새로운 기능은 새나루가 릴리즈된 이후에 고려하게 될 것 같습니다. 현재는 버그를 잡는 것 / 작동되지 않는 어플에 대한 고려 등등이 우선입니다 --WkPark

벌레 보고 합니다. 1.메뉴에서 키보드보기가 나타났다 사라졌다 합니다. 처음에는 없다가 주소창을 한번 클릭하고 나면 메뉴에 나타납니다. 2.주소창에 입력시에는 키보드 보기를 클릭하면 소프트키보드가 나타나고 다시 클릭하면 소프트키보드가 사라지지만, 메모장에서는 소프트키보드를 한번 띄우면 메뉴에서 다시 클릭해도 사라지지 않습니다.그리고 메모장을 종료하면 함께 사라집니다. 3.메모장 입력시 소프트키보드가 떠있을 경우에도 메뉴에는 체크 표시가 안나타납니다. --바람

의견하나! 메뉴에 “문자표”도 있었으면 좋겠습니다. 주소창등에서 특수문자입력기능이 제대로 작동하지 않거나, 배당된 글쇠를 잘 모를때 바로 문자표를 불러내어 입력할 수 있도록하는 것도 좋을 것 같습니다. --바람

소프트키보드 보기는 ime에 원래 있는 기능이지만 문자표 보기 기능은 ime에 없습니다. 새나루에서 외부 프로그램이 실행되는 작은 메뉴같은 것을 원하시는 듯? --WkPark

버그? 아래아한글 2004 버전에서 “윈도우 입력기(새나루)”를 사용할 경우 스페이스바(띄어쓰기)가 작동하지 않습니다. 아래아한글의 자체 입력기의 세벌식 자판이 별로 마음에 들지 않아 새나루의 세벌식 최종을 사용하는데 이 문제 때문에 꽤나 불편합니다. 운영체제는 한글 Windows Server 2003입니다. -- 정원호

또하나. 버그인지는 모르겠지만 프로그램을 전환하면 자꾸 한글자판에서 영문자판으로 바뀝니다. 기본이 영문인가요? 한번 설정한 자판이 계속 유지되었으면 합니다. --정원호

Shift+스페이스로 한영변환시에 정확한 이유는 모르겠지만, 어쩌다가 2벌식으로 변환되는 문제가 있습니다. 이것은 어쩌다가 한/영키를 누르면 해결이 가능하였습니다만 버그인듯 합니다. 환경은 타입3형태의 키보드 타입을 사용합니다. --강정한

글자를 쓰면서 마우스 휠기능을 사용할 경우 다시 한글을 적을땐 “ㅇ ㅖ ㅈ ㅔ : ㅇ ㅏ ㄴ ㄴ ㅕ ㅇ ㅎ ㅏ ㅅ ㅔ ㅇ ㅛ” 이런씩으로 글자가 나타납니다. -- 강정한

자동 "ㅏ" 삽입의 경우 ㄱ + ㅇ 눌러 "강"이 만들어 졌을때 지우게 되면 백스페이스키로 지우게 되면 "ㄱ"이 남아 다시 글자를 조합하려고 하려면 조합되지 않고, 다음글자로 가는 현상이 있습니다. -- 강정한

한글패치한 디아블로2 게임에서 새나루 사용시에 스페이스키를 2번 눌러야 스페이스 기능이 됩니다. -- 강정한

OFFICE 2000 제품의 경우 한자를 선택시에 팝업메뉴처럼 한자가 나오지 않고, 한자키를 반복적으로 눌러서 찾아야 하는 불편함이 있습니다. 한자 선택은 어쩔 수 없다고 하더라도 한자키를 누르고 있으면 선택할 한자가 변환되게 해 주시면 감사하겠습니다. -- 강정한

관련된 문제점을 발견하였고 해결법도 찾았습니다. 보고해주셔서 감사합니다 :) --WkPark

울트라 에디트류의 2바이트 문자 지원이 완벽하지 않는 프로그램에서는 마지막 글자가 짤리는 현상이 생깁니다. IME 2002에서는 정상동작 -- 강정한

다른 사람과 같이 쓸 경우에는 한자 기능을 쓸 때 두 번 누르는 것이 불편합니다. 두 칸 위에 "누르고 있으면 변환되는" 방식과 "한자키 누르면 목록이 나오는 방식을" 변환(토글)할 수 있었으면 좋겠습니다. 그리고 지금 세 칸 위에 "디아블로2 게임에서 스페이스키를 2번 눌러야" 한다고 했는데, 저는 "지금 이 글을 쓰는데 스페이스키를 2번 눌러야" 합니다. 아무래도 새나루에서 한 자 치고 스페이스키 누르면 글자 만드는 모드(왜 "잘"을 칠 때 ㅈ→자→잘 되는 거)에서 스페이스를 누르면 "탈출을 하고 스페이스를 눌러야" 되는데 "탈출만 하는" 그런 버그 같군요. --lsch

새나루에서 트레이 아이콘에 나오는 한자아이콘은 IME2002와는 다른 의미를 가집니다. 이른바 "한자입력"모드가 됩니다. lsch님은 새나루의 한자입력방식을 잘 못 이해하고 계십니다. 보통의 방법으로 한자를 입력하려면 그냥 한자키만 누르세요. --WkPark 

음.. 다시 읽어보니 디아블로에서 스페이스를 두번 눌러야 하는 버그가 한자키 기능과 관련이 있는게 아닌가 하군요. --WkPark

/!\ 내용이 갑자기 없어졌을 경우 놀라지 마세요 :) 다른 분들도 모두 읽었을만큼 충분히 시간이 지난 내용중에 특별히 새나루와 관련 없는 내용은 지워지며, 필요한 내용들은 적절한 위치로 재 조정됩니다.

엔키퍼를 깔았더니 웹상에서 새나루가 이상하게 타이핑되네요. --황수진

Wish List 

로마자 입력, 영문 메시지. 한국어가 모국어가 아닌 사람들도 쓸 수 있는 한글 입력기가 있어야 하지 않을까요? 로마자 입력은 HWP 등에 들어있는 오토마타와 호환이 되게 하면 될테고요. -- 박종대

한글입력기/로마자한글페이지에 관련 토론을 열었습니다 -- WkPark 2006-11-11 17:20:41

Bug Report 

<!> 적당한 위치 혹은 관련된 곳을 찾거나, 혹은 적당한 위치가 없으면 이곳에 버그보고를 해주세요.

Posted by 삼스
임베디드/Algorithm2009. 3. 2. 17:53

POSIX 함수에 대해 글 쓴 지가 너무 오래 전이라 까맣게 잊고 있었다. 오늘은 두서 없이 세마포어라는 놈을 건들여보도록 하자. 일단 세마포어 하면 유명한 예제가 있다. 철학자라는 것들이 가서 포크랑 나이프랑 한 벌 씩 더 가져오면 해결할 수 있는 문제를 굳이 앉아서 남이 썼던 것 더럽게 씻지도 않고 빌려쓰고... 암튼 그런 드러운 문제를 해결하기 위해 세마포어가 탄생했다...라고 하는데 드럽긴 마찬가지고 좀 그렇다. 세마포어 개념은 안드로메다 같은 곳에서 찾아보길 바란다. 그래도 귀찮은 사람은 세마포어를 들어갈 수 있는 사람 수를 한정한 매점(PX?)이라고 생각해도 좋을 것이다. '세마포어 값'은 매장에 들어갈 수 있는 사람 수 여분을 뜻한다.

일단 세마포어도 SysV에서 뛰쳐나온 
IPC개념인데, 일전에 알아봤던 것과 비슷한 API를 제공한다. semget, semop, semctl 이 바로 그것인데, 역시나 유명한 녀석이라 자세한 설명은 생략한다. 대충 semget으로 커널에 세마포어 객체 만들어달라고 떼를 쓴 뒤에 semop을 통해 세마포어 값을 증감하고, semctl을 통해 커널에 세마포어 객체 파괴하여 정리하는 역을 한다. 이 역시 IPC이므로 명시적으로 세마포어 객체를 커널에서 제거하지 않으면 리부팅할 때까지는 커널자원을 차지한다. - 설명 끝 -

이번에도 SysV는 별 관심사는 아니고, 세마포어 
개념을 거의 그대로 가져온 POSIX API가 있다. 아, 그전에 미리 설명해야할 것이 있는데, 세마포어에도 이름이 있는 녀석(named-)이 있고, 없는 녀석(unnamed-)이 있다. 뭐더게 이름 있고 없는 녀석을 만들었는지는 각자가 판단해야할 것 같지만, 보통 이름이 있는 녀석은 세마포어를 만든 녀석과 그것을 공유하고 싶은 녀석끼리 별 관련 없을 때 사용하고, 이름 없는 녀석은 동일 프로세스 내 쓰레드끼리 또는 부모자식 같은 관계가 있을 경우에만 공유해서 사용하고 싶을 때 사용한다. 이름이 있냐 없냐 따라 생성 및 해체 API가 다르지만, 락을 걸고(값 감소), 푸는(값 증가) API는 동일하다.

먼저 이름이 있는 녀석부터 알아보자. 이름이 있는 녀석은 마치 세마포어 객체를 파일처럼 관리한다. 물론 정확히 파일은 아니므로, read/write/close 함수를 쓸 수 없다. 초기화는 sem_open 함수를 이용하며 형태는 아래와 같다.
sem_t* sem_open(const char* name, int oflag, mode_t mode, unsigned int value);

name은 이름 있는 녀석이므로 당연히 이름이 들어가야하고, 공유메모리처럼 '/'으로 시작하는 파일명을 써주는 것을 추천하는 바이다.

oflag는 열 때 어떤 방식으로 여는 가인데, O_CREAT, O_EXCL 말고는 쓸 일이 거의 없을 것 같다.

mode는 접근제어로 'S_'로 시작하는 매크로를 OR연산으로 묶어서 사용할 수 있다. 이것 역시 공유메모리 그것처럼 사용하는 것이다.

value는 세마포어 초기값을 설정할 때 사용한다.

당연한 이야기이겠지만, mode, value는 oflag에 O_CREAT를 설정해야만 의미가 있으며, man페이지에서 sem_open이 다른 모습으로 같이 소개하는 것도 있다. 뭐 이렇다~하는 정도만 알고 넘어 가자.

제대로 초기화를 끝내면 sem_t 포인터 형으로 세마포어 컨텍스트를 퉤!하고 뱉어준다. 물론 실패하면 NULL과 함께 그에 상응하면 errno를 세팅한다.

이렇게 만들어진 세마포어 객체는 sem_wait, sem_timedwait, sem_trywait 등을 통해 락을 걸고, sem_post를 통해 락을 푼다. 가용 락 개수는 sem_getvalue를 통해 얻을 수 있으며, 이것이 가지는 초기값은 sem_open에서 준 value와 동일하다.

잘 사용하고 더 이상 쓸 필요가 없는 세마포어 객체는 sem_close 함수를 통해 닫을 수 있지만, 없어지진 않는다. 파일과 마찬가지로 생성한 뒤에 닫는다고 파일이 없어지는 것이 아니듯, sem_unlink를 통해 세마포어 객체를 OS에 반환 신청을 해야한다. 물론 파일과 마찬가지로 반환신청했다고 바로 없어지는 것은 아니고, 해당 세마포어를 참조하는 프로세스가 모두 없어져야 비로소 세마포어 객체가 사라진다.

다음은 이름이 없는 세마포어. 이것 역시 이름 있는 녀석과 살짝 다르게 sem_t 객체를 미리 만들어놓고 시작해야한다. sem_t 라는 구조체 내부는 POSIX에서 정의하지 않았으며, 알 필요도 없다. 다만 사용범위에 따라 동일 프로세스 안에 쓰레드끼리 공유하는 객체로 사용하려면, 쓰레드끼리 같이 접근할 수 있는 메모리 영역(예를 들면 전역변수!)에 만들어야하며, 부모자식 프로세스끼리 공유하기 위해서는 semget+semat이나 shm_open+mmap으로 얻은 공유메모리에 만들지 않으면 원하는 결과를 얻을 수 없다. 이게 좀 귀찮다.

아무튼, 이름 없는 세마포어는 sem_open/sem_close 대신 sem_init/sem_destroy를 사용한다. sem_init은 다음과 같다.
int sem_init(sem_t* sem, int pshared, int value);

sem은사용범위에 따라 전역변수 또는 공유메모리에 선언한 변수 포인터이다.

pshared는 프로세스끼리 공유하는지 여부를 알려주는 플래그이며, sem을 전역변수 선언하여 쓰레드끼리만 쓰는 것이라면 '0'을, 그렇지 않고 부모자식 프로세스끼리 공유까지 열어주려면 '0' 이외 값으로 설정한다.

value는 sem_open에서 설명한 value와 동일하다. 세마포어 초기값이다.

논외지만, pshared라는 값을 지정해줘야 하는 까닭은 API 내부 입장에서 sem이 전역변수영역인지 공유메모리영역인지 모르며 또한 프로세스끼리 공유한다고 치면 sem_t 내부에 레퍼런스 카운터 같은 것이 있어 그것을 증감시켜야하기 때문이 아닐까 조심스레 
추측해본다. 아님 말고~ (딴따라당스러워~)

sem_destroy를 할 때는 반드시 락을 걸려고 시도하는 쓰레드가 없어야 한다. 또한 sem_destroy를 하지 않으면, 구현방식에 따라 메모리가 좔좔 샐 수도 있다고 하니 주의하도록 하자.

예제도 있으면 참 좋겠지만, 귀찮은 관계로 그냥그냥 넘어가자.


덧글: 살째기 재밌는 사실 하나 덧붙이자면, Linux2.6에서 sem_open하면 shm_open처럼 /dev/shm에 파일이 생긴다.
Posted by 삼스
임베디드/Algorithm2009. 2. 11. 11:54
unsigned int calc_crc32(unsigned char *first, unsigned char *last)
{
register unsigned char *Ptr;
    static unsigned int CRC32[256] = {
        0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9,
        0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005,
        0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,
        0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd,
        0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9,
        0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,
        0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011,
        0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd,
        0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
        0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5,
        0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81,
        0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,
        0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49,
        0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95,
        0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,
        0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d,
        0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae,
        0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,
        0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16,
        0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca,
        0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,
        0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02,
        0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066,
        0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
        0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e,
        0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692,
        0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,
        0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a,
        0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e,
        0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,
        0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686,
        0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a,
        0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,
        0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb,
        0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f,
        0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,
        0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47,
        0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b,
        0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
        0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623,
        0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7,
        0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,
        0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f,
        0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3,
        0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,
        0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b,
        0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f,
        0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,
        0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640,
        0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c,
        0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,
        0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24,
        0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30,
        0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
        0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088,
        0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654,
        0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,
        0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c,
        0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18,
        0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,
        0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0,
        0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c,
        0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,
        0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
    };

unsigned int i_crc = 0xffffffff;
for (Ptr = first; Ptr< last; Ptr++) {
i_crc = (i_crc<<8) ^ CRC32[ (i_crc>>24) ^ ((unsigned int)*Ptr) ];
}

    return  i_crc;
}

WORD calc_crc16(char *pByteArray, WORD length)
{

static USHORT crcTable[256] = {
0x0000U, 0x1021U, 0x2042U, 0x3063U, 0x4084U, 0x50a5U, 0x60c6U, 0x70e7U,
0x8108U, 0x9129U, 0xa14aU, 0xb16bU, 0xc18cU, 0xd1adU, 0xe1ceU, 0xf1efU,
0x1231U, 0x0210U, 0x3273U, 0x2252U, 0x52b5U, 0x4294U, 0x72f7U, 0x62d6U,
0x9339U, 0x8318U, 0xb37bU, 0xa35aU, 0xd3bdU, 0xc39cU, 0xf3ffU, 0xe3deU,
0x2462U, 0x3443U, 0x0420U, 0x1401U, 0x64e6U, 0x74c7U, 0x44a4U, 0x5485U,
0xa56aU, 0xb54bU, 0x8528U, 0x9509U, 0xe5eeU, 0xf5cfU, 0xc5acU, 0xd58dU,
0x3653U, 0x2672U, 0x1611U, 0x0630U, 0x76d7U, 0x66f6U, 0x5695U, 0x46b4U,
0xb75bU, 0xa77aU, 0x9719U, 0x8738U, 0xf7dfU, 0xe7feU, 0xd79dU, 0xc7bcU,
0x48c4U, 0x58e5U, 0x6886U, 0x78a7U, 0x0840U, 0x1861U, 0x2802U, 0x3823U,
0xc9ccU, 0xd9edU, 0xe98eU, 0xf9afU, 0x8948U, 0x9969U, 0xa90aU, 0xb92bU,
0x5af5U, 0x4ad4U, 0x7ab7U, 0x6a96U, 0x1a71U, 0x0a50U, 0x3a33U, 0x2a12U,
0xdbfdU, 0xcbdcU, 0xfbbfU, 0xeb9eU, 0x9b79U, 0x8b58U, 0xbb3bU, 0xab1aU,
0x6ca6U, 0x7c87U, 0x4ce4U, 0x5cc5U, 0x2c22U, 0x3c03U, 0x0c60U, 0x1c41U,
0xedaeU, 0xfd8fU, 0xcdecU, 0xddcdU, 0xad2aU, 0xbd0bU, 0x8d68U, 0x9d49U,
0x7e97U, 0x6eb6U, 0x5ed5U, 0x4ef4U, 0x3e13U, 0x2e32U, 0x1e51U, 0x0e70U,
0xff9fU, 0xefbeU, 0xdfddU, 0xcffcU, 0xbf1bU, 0xaf3aU, 0x9f59U, 0x8f78U,
0x9188U, 0x81a9U, 0xb1caU, 0xa1ebU, 0xd10cU, 0xc12dU, 0xf14eU, 0xe16fU,
0x1080U, 0x00a1U, 0x30c2U, 0x20e3U, 0x5004U, 0x4025U, 0x7046U, 0x6067U,
0x83b9U, 0x9398U, 0xa3fbU, 0xb3daU, 0xc33dU, 0xd31cU, 0xe37fU, 0xf35eU,
0x02b1U, 0x1290U, 0x22f3U, 0x32d2U, 0x4235U, 0x5214U, 0x6277U, 0x7256U,
0xb5eaU, 0xa5cbU, 0x95a8U, 0x8589U, 0xf56eU, 0xe54fU, 0xd52cU, 0xc50dU,
0x34e2U, 0x24c3U, 0x14a0U, 0x0481U, 0x7466U, 0x6447U, 0x5424U, 0x4405U,
0xa7dbU, 0xb7faU, 0x8799U, 0x97b8U, 0xe75fU, 0xf77eU, 0xc71dU, 0xd73cU,
0x26d3U, 0x36f2U, 0x0691U, 0x16b0U, 0x6657U, 0x7676U, 0x4615U, 0x5634U,
0xd94cU, 0xc96dU, 0xf90eU, 0xe92fU, 0x99c8U, 0x89e9U, 0xb98aU, 0xa9abU,
0x5844U, 0x4865U, 0x7806U, 0x6827U, 0x18c0U, 0x08e1U, 0x3882U, 0x28a3U,
0xcb7dU, 0xdb5cU, 0xeb3fU, 0xfb1eU, 0x8bf9U, 0x9bd8U, 0xabbbU, 0xbb9aU,
0x4a75U, 0x5a54U, 0x6a37U, 0x7a16U, 0x0af1U, 0x1ad0U, 0x2ab3U, 0x3a92U,
0xfd2eU, 0xed0fU, 0xdd6cU, 0xcd4dU, 0xbdaaU, 0xad8bU, 0x9de8U, 0x8dc9U,
0x7c26U, 0x6c07U, 0x5c64U, 0x4c45U, 0x3ca2U, 0x2c83U, 0x1ce0U, 0x0cc1U,
0xef1fU, 0xff3eU, 0xcf5dU, 0xdf7cU, 0xaf9bU, 0xbfbaU, 0x8fd9U, 0x9ff8U,
0x6e17U, 0x7e36U, 0x4e55U, 0x5e74U, 0x2e93U, 0x3eb2U, 0x0ed1U, 0x1ef0U
};
int offset = 0;

// 초기값
USHORT crc = 0xffff;
for(int i = offset, end = offset+length; i < end; i++)
{
crc = crcTable[((crc >> 8) ^ pByteArray[i]) & 0xff] ^ (crc << 8);
}
// 최종적으로 
return ~crc;
}

Posted by 삼스
임베디드/Algorithm2009. 1. 29. 10:14

http://sweeper.egloos.com/



Posted by 삼스
임베디드/Algorithm2009. 1. 29. 10:09

출처 -> http://sweeper.egloos.com/921858

정렬 알고리즘 정리

1. 비교 정렬 리스트

아래 테이블에서 n은 개체수이고 k는 키들의 평균적인 길이이다. 클릭해서 보도록...

연결 리스트를 머지 소트할 경우는 메모리 차지가 O(1)로 줄어들게 된다.

2. !비교 정렬 리스트

n = 개체수
k = 각 key의 크기
s = 구현에 사용된 chunk 크기

비교 정렬이 아닌 알고리즘들은 O(n(log n))의 lower bound 제한에 걸리지 않는다. 즉, O(n(log n))보다 더 좋은 성능을 낼 수도 있다. 하지만 기수 정렬(Radix sort)을 예로 설명하면 키의 크기가 제한적일 때 성능이 좋아지는 등, 여러 가지 제약이 있다.

3. Memory usage patterns and index sorting

정렬해야 될 데이터가 물리 메모리의 한계를 넘어서면 디스크 스왑을 사용해야 하는데, 이 경우 RAM 영역에서 효과적으로 정렬되던 방식들이 사실상 비현실적일 정도로 성능을 내지 못할 수 있다. 이 상황에서는 비교 횟수 보다 swap 등 데이터의 이동 회수가 훨씬 중요하게 여겨져 복사나 값 교환 작업이 알고리즘의 성능을 좌우하게 된다.

예를 들어 가장 인기있는 퀵 소트 알고리즘은 RAM 영역에서 상당히 만족스러운 성능을 제공하지만 리스트의 일부를 복사하는 순환 방식 때문에 디스크 상에서는 상당히 비효율적인 알고리즘이 된다. 고로 더 많은 비교 회수를 요구하더라고 좀 더 적합한 알고리즘을 사용해야 한다.

위 같은 상황을 극복할 수 있는 방법을 살펴보자.

(관계형 데이터베이스에서와 같은) 복합 레코드들을 key 값으로 정렬하듯이, 리스트 자체를 정렬하지 말고 인덱스를 만들어 그 인덱스로 정렬을 하는 방법이 있다. 인덱스는 전체 리스트보다 훨씬 작으므로 전체 물리 메모리에 못 들어갈 데이터들을 RAM 영역에서 정렬할 수 있으며 효과적으로 디스크 스와핑을 없앨 수 있다. 이 과정은 종종 "tag sort"라 불리기도 한다.

메모리 한계를 극복하는 또 다른 방법은 전체적인 성능 향상을 위해 두 알고리즘의 강점을 조합하는 것이다. 예를 들어 배열은 RAM 영역에 쉽게 포함될 수 있는 크기 단위로 나뉘어 질 수 있을 것이고 나뉘어진 분할 리스트들을 각기 퀵 소트나 힙 소트로 정렬한다. 그리고 정렬된 분할 리스트들을 머지 소트로 병합하는 것이다. 이렇게 하면 머지 소트만 하는 것보다 성능이 뛰어나며 퀵 소트만 하는 것 보다 작은 물리 메모리를 필요로 하게 된다.  


  • [기수 정렬] 정렬 알고리즘 중 radix sort를 C#으로 구현한 프로그램. by 브렉스톤
  • 최적 자료구조 선택의 어려움 by object
  • 프로그래머를 위한 공부론 by ssulsamo
  • 프로그래밍 공부론 펌 by wrpark
  • 같은 이름을 가진 것이 있다면 일반 알고리즘보다 멤버 함수가 더 낫다. by 쌩쥐 
  • Posted by 삼스
    임베디드/Algorithm2009. 1. 29. 10:05

    1. Hash

    데이터를 저장하고 찾는데 사용되는 자료 구조의 한 종류. 찾고자 하는 문자열을  특정한 함수(hash function)로 처리해 얻은 값으로 데이터의 위치를 찾는 방법을 말한다.

    데이터를 찾는 속도가 데이터 개수의 영향을 거의 받지 않는 특성을 지니고 있어, 효율적이고 빠르게 데이터의 위치를 찾을 수 있다. 다른의미로 데이터베이스에서 임의의 레코드를 빠르게 찾아가기 위한 직접 파일 구조를 말하기도 한다.


    2. Hash table

    레코드를 한 개 이상 보관할 수 있는 버킷들로 구성된 기억공간을 말한다. 레코드들을 보조 기억 공간에 저장할 때는 그 공간 내의 주소와 레코드 키를 한 단위로 해시 테이블에 보관하고, 이 해시 테이블을 주기억 공간에 보관하기도 한다.

    참고) 버킷(Bucket) : 어떤 종류의 레코드를 몇 개씩 묶은 것을 기억하는 장소이다. 이 경우 주소는 1버킷에 1개만 붙인다. 또 다른 의미로 여러개의 데이터를 어떤 기준에 의해 묶을 때 같은 부류에 속하는 데이터들의 모임을 말한다.

    해시 테이블의 시작 주소로부터 각 버킷들은 연속된 주소를 가지며 그 시작 주소를 기준으로 상대 주소를 산출할 수 있으므로 이 상대 주소를 이용하여 각 버킷들을 구별하면 편리하다.


    3. Hashing

    여러개의 명칭(identifier)들이 무작위로 들어있는 테이블에서 특정 명칭을 찾고자 하는 경우 원하는 키값을 가지는 테이블 항목을 검색하기 위해 특정한 변환 함수를 이용하여 키값을 항목 의 주소로 직접 바꿔서 검색하는 방법을 해슁이라 한다. 이때 변환 함수는 해쉬 함수(hash function)라 한다.

    명칭 테이블에서 키 값과 일치하는 명칭을 찾는 방법으로는 테이블에 있는 각각의 명칭을 키 값과 차례로 비교하는 방법이 있다. 이 방법을 사용하면 최악의 경우 n회의 비교가 필요하다. 해슁을 이용하면 해쉬 함수가 키값을 해당 주소로 단번에 변환해 주므로 매우 빠른 검색이 가능하다.

    정적 해싱은 고정 크기의 테이블을 이용하여 해슁하는 방법으로서 한번 저장된 명칭의 상대적 위치가 변경되지 않는다. 해싱을 이용하지 않는 경우에는 명칭들의 모든 가능한 조합을 수용할 수 있도
    록 명칭 테이블을 만들어야 한다.

    조합 가능한 명칭들 중에 실제로 존재하는 명칭들의 수는 매우 적기 때문에 대부분의 공간은 낭비된다. 명칭 테이블의 기억공간 낭비를 막기 위해 해쉬 테이블을 사용한다. 해쉬 테이블은 b개의 버켓(bucket)으로 구성되고, 하나의 버켓은 s개의 슬롯(slot)으로 구성된다. 각각의 슬롯에는 명칭 테이블 항목처럼 하나의 명칭이 저장된다.

    해쉬 테이블의 크기는 필요에 따라 달리할 수 있는데 일반적인 명칭 테이블보다는 크기가 현저히 작다. 하나의 버켓에 여러개의 슬롯을 두는 이유는 서로 다른 두개의 명칭이 해쉬 함수에 의해 동일한 주소로 변환되는 경우 두 명칭을 같은 버켓에 저장하기 위해서이다.

    해슁을 하는 경우 서로 다른 두개 이상의 명칭이 해쉬 함수에 의해 동일한 주소로 변환되는 경우가 있다. 이 현상을 "충돌(collision)"이라 한다. 충돌이 자주 발생하면 탐색 시간이 길어지는 등 성능이 저하되므로 해쉬 함수를 수정하거나 해쉬 테이블의 크기를 적절히 조절해 주어야 한다.

    충돌이 발생한 경우 같은 버켓에 있는 다른 슬롯에 명칭을 저장하면 된다. 그러나 슬롯의 갯수만큼 충돌이 생기면 빈 슬롯이 소진되어 오버플로우(overflow)가 생길 수 있다. 오버 플로우가 발생하면 해슁에 의해 원하는 명칭을 찾을 수 없게 되므로, 오버 플로우를 해결하기 위한 방법이 고안되어야 한다.

    *********************************************************************************

    덧붙이자면, Hash는 우체국에 분리된 우편물들이라고 볼 수 있다.

    각 주소는 key가 되고 우편 번호는 backet이 된다.

    Posted by 삼스