" ruby(으)로 태그된 글들"

[Ruby] 한글날 기념 코딩. 한글 자소 분해

10 9, 2010   //   alexken작성   //   기술  //  No Comments

치매방지겸 한글날 기념으로 한글 음절을 자소로 분해하는 코딩.

즉 Unicode2.0에서 초,중,종성으로 조합가능한 모든 현대 한글 음절 11172를 빠짐없이 배치하였기에,
완성형 코드인 유니코드가 조합형 코드로서의 특징을 가지게 된다는 걸 보여주기 위해 코딩.

원래 조합형 코드에서 자소 분해는 비트를 잘라 초중종을 얻어 낸다면,
유니코드에서는 아래와 같이 나누기만 잘하면 초중종성을 얻어낼 수 있다.


한글의 과학성에 또 한번 감탄

소스 코드

#!/usr/bin/env ruby

@chosung_list = ["ㄱ","ㄲ","ㄴ","ㄷ","ㄸ","ㄹ","ㅁ","ㅂ","ㅃ","ㅅ",
                 "ㅆ","ㅇ","ㅈ","ㅉ","ㅊ","ㅋ","ㅌ","ㅍ","ㅎ" ]
@jungsung_list = ["ㅏ","ㅐ","ㅑ","ㅒ","ㅓ","ㅔ","ㅕ","ㅖ","ㅗ","ㅘ",
                  "ㅛ","ㅙ","ㅚ","ㅜ","ㅝ","ㅞ","ㅟ","ㅠ","ㅡ","ㅢ","ㅣ"]
@jongsung_list = [" ","ㄱ","ㄲ","ㄳ","ㄴ","ㄵ","ㄶ","ㄷ","ㄹ","ㄺ",
                  "ㄻ","ㄼ","ㄽ","ㄾ","ㄿ","ㅀ","ㅁ","ㅂ","ㅄ","ㅅ",
                  "ㅆ","ㅇ","ㅈ","ㅊ","ㅋ","ㅌ","ㅍ","ㅎ"]

def unicode_of(a)
    a.unpack("U*").pop
end

class String
    def succ
        head = self.unpack('U*')
        tail = head.pop
        return head.pack('U*') + [tail + 1].pack('U*')
    end
end

def split( ch )
    offset = unicode_of("가")
    unicode = unicode_of( ch )
    print ch + "=("
    #초성출력
    print @chosung_list[ (unicode-offset) /
                (@jungsung_list.length * @jongsung_list.length) ] + "+"    
    #중성출력
    print @jungsung_list[((unicode-offset)%
                    (@jungsung_list.length * @jongsung_list.length)) /
                      @jongsung_list.length ] + "+"    
    #종성출력  
print @jongsung_list[ (unicode-offset) % @jongsung_list.length ] + ")\n"   
end

("가".."힣").each{|x| split(x)}

결과

가=(ㄱ+ㅏ+ )
각=(ㄱ+ㅏ+ㄱ)
갂=(ㄱ+ㅏ+ㄲ)
갃=(ㄱ+ㅏ+ㄳ)
간=(ㄱ+ㅏ+ㄴ)
갅=(ㄱ+ㅏ+ㄵ)
갆=(ㄱ+ㅏ+ㄶ)
갇=(ㄱ+ㅏ+ㄷ)
갈=(ㄱ+ㅏ+ㄹ)
갉=(ㄱ+ㅏ+ㄺ)
...
힛=(ㅎ+ㅣ+ㅅ)
힜=(ㅎ+ㅣ+ㅆ)
힝=(ㅎ+ㅣ+ㅇ)
힞=(ㅎ+ㅣ+ㅈ)
힟=(ㅎ+ㅣ+ㅊ)
힠=(ㅎ+ㅣ+ㅋ)
힡=(ㅎ+ㅣ+ㅌ)
힢=(ㅎ+ㅣ+ㅍ)
힣=(ㅎ+ㅣ+ㅎ)

iCal을 이용한 EPG

1 31, 2009   //   alexken작성   //   기술  //  3 Comments

EPG(Electronic Program Guide) 방송 편성표를 어떻게 하면 쉽게 볼 수 있을까 하다가,

  1. xml을 xslt를 이용해 html로 변환
  2. RSS형태로 publishing

을 생각하다가 iCal에서 사용하는 ics 형태로 하면 iCal이 알아서 다 표현도 해줄것이고,

  • MacOSX에서는 iCal에서 구독 하면 되고
  • iCal과 동기되는 iPod Touch/iPhone에서도 볼수 있고
  • Windows Vista도 ics를 지원하는 캘린더가 기본 포함 되었고,
    아마 Outlook도 지원할것이고
  • Google Calender도 같은 ics를 구독하면 언제 어디서나 볼수 있고

그래서 EPG 데이터를 ICS 포맷으로 변환하면 멋지겠다는 생각이 들었다.

방송사 별로 ICS를 생성하고 각 방송사 별로 ICS는 최대한 추려서 다음과 같이 쓰기로 했다.

BEGIN:VCALENDAR
PRODID:-//TTA//EPG DATA//KO
VERSION:2.0
CALSCALE:GREGORIAN
METHOD:PUBLISH
X-WR-TIMEZONE:Asia/Seoul
X-WR-CALNAME:MBC
BEGIN:VEVENT
DTSTART:20090131T223500
DTEND:20090131T235500
UID:MBC20090131T223500
CLASS:PUBLIC
DESCRIPTION:장르 : 연예/오락-토크쇼
출연 : 윤종신,김국진,김구라,김성주,신정환,이하늘,박미선
연출 : 여운혁,김유곤
SUMMARY:명랑 히어로
TRANSP:OPAQUE
END:VEVENT
END:VCALENDAR

ruby로 만든 ics를 iCal에서 읽어보니
결과는 일단 성공…

대충 상상했던 EPG형태로 보여주기는 하나, 실생활에 편히 쓸만큼 보기 편한거 같지는 않다.

그리고, 당장 쓰기에는 또 다른 문제가 좀 있다.

  1. 주기적으로 책임감 있게 변환 script를 돌려줄 서버가 필요하고,
  2. CalDAV로 iCal에서 쓰려면 WebDAV 호스팅이 되어야 하는데, 그렇지 아니하고,
  3. ics로 변환해서 그냥 web에 두고 google calendar에서 구독하면 그걸 다시 iCal에서 불러올 수 있다.
    그래서 google calendar에서 읽어보니 한글이 깨진다…
    (분명 UTF-8으로 저장되어 있는데, KSX1001을 UTF-8으로 읽었을때 처럼 깨진다..)

OTL 일단 오늘은 여기까지…..

[ruby] (가..힣).each{|x| print x}

5 14, 2008   //   alexken작성   //   기술  //  3 Comments

루비 공부 시작한지 다음날 문득
Unicode의 한글 영역을 전부 출력하는 프로그램을 ruby로 짜면 어떻게 될까 궁금해 졌다.

머리 속에서는 직관적으로

(가..힣).each{|x| print x}

란 코드가 떠 올랐다. 겁나 멋지다.
‘가’의 Unicode가 AC00인지 모르더라도 (‘힣’의 코드 값은 외우고 있지도 않다.) Range가 지원해주지 않을까?

다른 언어라면 분명 루프가 빙빙 돌고,
‘가’가 아닌 AC00부터 code값을 증가시키면서…. 어쩌구 저쩌구 하는 코드가 될터인데….

근데 안돈다.
더 정확히는 도는듯 하다 만다.

이유는 ruby String의 내부처리가 UTF-8이어서 그랬다.
이런 젠장….

UTF-8도 Unicode 인코딩 기법중 하나 맞고, 나름 장단이 있는 유니코드 인코딩이지만,
직렬화나, 네트웍 전송시에나 적합한 인코딩이고, 메모리 내부 처리는 UCS2나 하다 못해 UCS4로 처리함이 맞다고 본다.
그래야 기껏 Unicode에서 욕먹어 가면서 현대 한글 11072자 모두 할당 받아 한글 처리가 조합형처럼 처리가 가능하고, 한글 소팅 문제나…..
기타등등…(욕까진 안먹었나? 하지만 눈치 보면서…)

아마도 ASCII가 1byte로 인코딩되는 점 때문에 (영어권 프로그래머의…)힘에서 밀린듯 하다.

암튼 String succ메소드를 건드리고야 말았다.(별 바람직해 보이진 않지만…)

class String
    def succ
        head = self.unpack('U*')
        tail = head.pop
        return head.pack('U*') + [tail + 1].pack('U*')
    end
end

("가".."힣").each{|x| print x}
("あ".."ん").each{|x| print x}

#"가나다".each_char {|x| print x}
puts "가나다".succ
가각갂갃간갅갆갇갈갉갊갋갌갍갎갏감갑값갓갔강갖갗갘같갚갛개객갞갟갠갡갢갣갤갥갦갧갨갩갪갫갬
갭갮갯갰갱갲갳갴갵갶갷갸갹갺갻갼갽갾갿걀걁걂걃걄걅걆걇걈걉걊걋걌걍걎걏걐걑걒걓걔걕걖걗걘걙
...
힟힠힡힢힣あぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとど
なにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをん가나닥

가능성은 희박하겠지만, ruby 2.0에서는 제발 UCS2나 4로 String 내부처리가 바뀌었으면 하는 바람이다.

[ruby] ruby 몰입교육중…

5 14, 2008   //   alexken작성   //   기술  //  No Comments

회사 업무에, 용도에 따라 주로 다양한 언어를 사용하지만,
한번 쓰고 말거나, 간단한 처리는 주로 perl을 이용한다.
주로 하는 일이 UI가 필요없고,
주로 Unix환경인데다가,
text처리가 대부분이라 regula expression 이 강력해서 perl이야 말로 아주 적격이다.

ruby란 언어를 처음 접한건 1999년도 일본서 공부할때다.
자연어처리 연구실이라 그곳 역서 text처리가 대부분이다.
ruby 공부하던 인간도 몇 있었지만, 그저 취미 일뿐,
실용적인 측면에서는 그 연구실 조차 perl이었다.

그래서 나도 perl을 그곳에서 배우기 시작했다.
Unix + Emacs + Perl.

그랬던 ruby가 몇년 전 부터 하도 유행이라, 나도 공부해 보고 업무에도 적용해 보고 싶었지만,
팀에 초 고수 perl 본좌가 2명이나(noise & gogma) 있는 바람에
혼자서만 ruby코드를 양산할 수 없어서, 나도 친숙하고 모두가 다 아는 perl 이 주종이었다.

최근에 이 둘을 꼬셔서 루비 공부 시작…

꼬시는데 뭐 어려운거 없었다.
황대산 님의 20분짜리 가이드한번 보여줬더니
바로 루비 광신도로 변신…

회사 도서관에 있는 ‘Programming Ruby’를 죄다 빌려다 모두 공부 중.

근데 도대체 대충 읽을 수가 없다.

한줄 한줄 의미를 곱씹으니 아주 오묘하다는 것.
특히 문법 설계가 아주 예술이다.

예전에 신군이랑 메신저로 잠깐 나눴던, Code Block이랑 Meta Programming이 왜 필요한지 왜 써야 하는지 이해가 가지 않았는데,
이것참 물건이다.

당분간 루비 얘기로 블로그가 도배될꺼 같다.

블로그 카테고리

천체사진 갤러리