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

[ruby2] (‘가’..’힣’).each{|x| print x}

10월 24, 2013   //   alexken작성   //   기술  //  No Comments

ruby라는 언어를 안건 1999년 이었지만, 줄곳 잊고 살다가 흥미를 가지고 배운것은 2008년 5월 이었다.

ruby 공부를 시작한지 2틀째 썼던 글인 [ruby] (‘가’..’힣’).each{|x| print x}는 ruby 1.8 시절에 내부 문자열 소팅을 unicode 순이 아닌 utf-8로 인코딩된째 소팅한다고 푸념하는 글이었다.

그때 막연한 희망으로 ruby 2.0에서는 unicode 순으로 해줬으면 좋겠다고 썼던적이 있다.

ruby 2.0이 나왔는 지 알게된 계기도, 오늘 쓴 ruby 2.0.0에서 iconv 사용 불가에서 썼듯이 우연히 MacOSX 를 Mavericks로 바꾸면서 알게 되었다.
혹시나 하는 맘에 ruby 2.0에서 문자열 소팅이 개선되었는지 확인해 보니 정말 바뀌어 있었다.

5년전에 생각했던,
‘가’에서 ‘힣’까지 출력하는 ruby code는

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

한줄이면 된다.

더이상 utf-8을 unicode로 디코딩해서 소팅하고, 다시 utf-8로 인코딩 안해도 되게 되었다.
혹시나 하고 찾아 보니 이런 글 이 있네.

ruby 2.0.0에서 iconv 사용 불가

10월 24, 2013   //   alexken작성   //   기술  //  1 Comment

이전에 만들어 두었던 나만을 위한 EPG가 동작을 하고 있지 않았다.

/System/Library/Frameworks/Ruby.framework/... /kernel_require.rb:45:in `require'
    : cannot load such file -- iconv (LoadError)

이유를 살펴 보니, 날마다 EPG 데이터에서 HTML페이지를 생성하는 ruby 코드 내에서 사용한 iconv 때문에 requre 문에서 부터 오류가 발생했다. 문제를 추적해 가보니, 근원은 MacOSX를 “Mavericks”로 업그레이드 해서 발생한 문제였다.

  • MacOSX 10.8(“Mountain Lion”)에 기본으로 설치된 ruby 버전은 1.8.7이었다.
  • 반면 MacOSX 10.9(“Mavericks”)에서 2.0.0으로 판올림 되었다.
  • 그 과정에서 iconv가 deprecated 되었다가 1.9.3부터는 아예 빠져 버렸다고 한다. 해결책은 iconv를 추가로 까는 방법도 있겠지만, deprecated한 취지 대로, string의 encode로 바꾸었다.

기존 iconv 사용 코드

requrie 'iconv'
conv = Iconv.new('UTF-8//IGNORE','KS_C_5601-1987')
utf8_str = conv.iconv(ksc5601_str)

string.encode로 변경한 새 코드

utf8_str = ksc5601_str.encode("UTF-8", "KS_C_5601-1987")

MacOSX용 대한민국 우편번호 사전 만들기

7월 17, 2012   //   alexken작성   //   기술  //  2 Comments

binWord/blog Leopardの「辞書」アプリで郵便番号辞書を使う란 MacOS용 시스템 사전을 응용한 일본 우편번호 사전 만들기 포스트를 보고 한국어 버전으로 만들어 보았음.

우정사업본부에서도 우편번호 데이터를 얻을 수 있지만,
인터넷에서 아래와 같이 정리된 데이터를 이용하였음.(2012년5월, 51,989항목)

135-806 서울  강남구 개포1동    경남아파트                      1
135-807 서울  강남구 개포1동    우성3차아파트    (1∼6동)         2
135-806 서울  강남구 개포1동    우성9차아파트    (901∼902동)     3
135-770 서울  강남구 개포1동    주공아파트       (1∼16동)        4

아래와 같이 작성한 ruby 코드로 데이터를 사전용 xml 포맷으로 변환하고, XCode에 있는 사전 도구를 이용해서 make 한방 때리면 사전이 튀어 나옴.

#!/usr/bin/env ruby

puts < <XML_HEAD
<?xml version="1.0" encoding="UTF-8"?>
< d:dictionary xmlns="http://www.w3.org/1999/xhtml"
              xmlns:d="http://www.apple.com/DTDs/DictionaryService-1.0.rng">
XML_HEAD

class File
  def File.open_and_process(*args)
    f = File.open(*args)
    yield f
    f.close
  end
end

File.open_and_process(ARGV[0],'r') do |file|
  while line = file.gets
    line.gsub(/\s+/,' ').scan(/^(\S+)\s+(.*)\s+(\d+)\s+$/).each{|zip,index,id|
      puts "<d:entry d:title='#{index}' id='#{id}' from=''>"
      index.split(' ').each{ |x|
        puts "\t<d:index d:value='#{x}'/>"
      }
      puts "<section><b>#{zip}</b> #{index}</section>"
      puts "</d:entry>"
    }
  end
end

puts < <XML_TAIL
< /d:dictionary>
XML_TAIL

원래 txt 데이터는 3MB
MacOSX 사전용 xml로 변환하면 5MB
사전으로 컴파일하면 28MB
Zip으로 압축해서 5.7MB

7월19일 추가사항

배포를 하려해도 호스팅비용이 부담되어 어찌할까 하다가,
요번 참에 github 가입하고, 소스채 올림.

소스: https://github.com/alexken/korzipcode
컴파일된 사전: https://github.com/alexken/korzipcode/downloads

설치방법?
zip 파일을 다운받아 압축을 풀면 ‘한국 우편번호.dictionary’가 나오고 이것을 ~/Library/Dictionaries에 복사하면 끝.
(~/Library/Dictionaries을 파인더로 가기 힘들다면 Terminal.app에서 cd ~/Library/Dictionaries 하고 open . 으로 열 수 있음.)

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

10월 9, 2010   //   alexken작성   //   기술  //  1 Comment

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

즉 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작성   //   기술  //  5 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이 왜 필요한지 왜 써야 하는지 이해가 가지 않았는데,
이것참 물건이다.

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

블로그 카테고리

천체사진 갤러리