" 프로그래밍(으)로 태그된 글들"
페이지:123»

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 . 으로 열 수 있음.)

HTML5:getUserMedia를 이용한 초간단 웹캠 뷰어

5월 17, 2012   //   alexken작성   //   기술  //  7 Comments
<html>
  <body>
    <video src="" id="myvideo"  autoplay></video>
    <script type="text/javascript">
      var video = document.getElementById('myvideo');
      navigator.webkitGetUserMedia("video", success);
   
      function success(stream){
        video.src = window.webkitURL.createObjectURL(stream);
      }
    </script>
  </body>
</html>

핵심만 요약한게 아니라 실제 동작하는 전체코드.

HTML5 RTC getUserMedia를 이용.
프로그램을 짰다라기 보다, 브라우저에서 getUserMedia를 지원만 한다면 이함수 호출 하나로 그냥 웹캠 뷰어가 됨.
getUserMedia로 웹캠 뷰어는 날로먹고, Skype 정도의 프로그램도 WebSocket과 함께 쓰면 웹앱으로 코딩 몇줄로 끝.

Chrome18 이후(Canary 아니더라도)인 경우, chrome://flags에서 Media Stream 항목만 활성화하면 이용할 수 있음.
Chrome21부터는 기본으로 활성활 될꺼라고 한다.(2012.08.09추가)

위 코드는 표준 코드가 아니고 현재 Chrome에서 동작하기 위한 코드이고, 향후 표준화 완료되면 다음과 같이 수정되어야 함.

  navigator.webkitGetUserMedia("video", success);
  => navigator.getUserMedia({video:true}, success);
 
  window.webkitURL.createObjectURL(stream);
  => URL.createObjectURL(stream);

getusermedia
웹캠이 장착되어 있고, 크롬 브라우저에 플래그 활성화하면 본페이지를 보면 위와 같이 카메라 사용여부를 사용자에게 물어보고 허락해주면 아래 웹캠 화면이 보여야 함.

더 보기 >>

[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 일단 오늘은 여기까지…..

XSLT로 만든 XMLViewer

1월 30, 2009   //   alexken작성   //   기술  //  No Comments

xml의 많은 장점에도 불구하고 떨어지는 readability엔 불만이다.
업무상 xml을 자주 만지다 보니 xml 내의 정보를 쉽게 보는 도구가 간절했고, 그래서 예전에 java로 만든 TreeView 형태의 XmlViewer도 만들었다.

이번에는 xlst로 만들었는데 생각보다 깔끔하고 맘에 든다.
TreeView 형태보다 쉽게 포함관계를 표현한다.

맨 처음, element와 attribute를 일일히 지정하면서 xslt를 작성하다 보니 1000라인이 넘어 섰다.
그래서 거의 90% 완성된 시점에서 처음부터 다시 시작해 element와 attribute의 이름을 지정하지 않는 형태로 바꾸었더니 css, javascript를 포함해서 120라인 가량으로 끝낼 수 있을 뿐더러 특정 dtd/schema의 xml 뿐만 아니라 범용 XMLViewer로 사용가능해 졌다.

만들다 보니 포함관계만 표시하는 심플한 뷰, 모든정보를 빠짐없이 보여주는 뷰를 표현하기 위해 javascript를 이용했고 web에서 찾은 코드를 근간으로 했는데
원리는 숨기거나 보여질 영역을 < div class="ClassName" >으로 설정한뒤 해당 class를 가지는 element를 돌면서 처리하는 루틴이었다.

문제는 C 스타일의 for 루프문

for( var i=0; i<Max; i++){
   BLOCK;
}

이 내가 주로 사용하는 브라우저인 safari에서는 돌지 않았다.

그래서

for( var i in Collection){
   BLOCK;
}

형태로 바꿔서 브라우저 의존성을 제거하고,

포함관계를 색상으로 표현하기 위해서 CSS에서

*              {background: none;}
div            {background: #6666ff;}
div>div        {background: #7777ff;}
div>div>div    {background: #8888ff;}

형태로 가능했다.

내가 javascript/CSS 쪽은 거의 문외한이라 이게 최적의 코드인지는 모르지만, 내가 원래 의도했던 기능이나 목표는 다 동작해서 맘에 든다.

그리고 지금까지

< xsl:apply-templates/>

는 select로 자식 element를 지정해야지만 되는줄 알았는데,
그냥 apply-templates만 불러주니 알아서 자식 element들을 알아서 불러주네…(오늘 첨 알았음 ^^;)

Simple View

Complex View

<?xml version='1.0' encoding='utf-8'?>
<xsl:stylesheet version='2.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:template match="/">
<html>
<head>
<title>XML Viewer</title>
<style type="text/css">
div.element{
    float:      left;
    display:    block;
    padding:    1em;    
    border:     solid 1px black;    
    margin:     1em;
}

/*
    element의 이름과 attr을 header-area로 싸는 이유
    attr 옆에 하위 element가 붙는게 보기 싫어서...
    정답은   overflow:auto;
*/
div.header-area{
    overflow:         auto;
    background:  none;
}

div.attr{
    float:            left;
    margin-right:  2em;
    background:  none;
}

i.att_name{ color:  #333333}
i.att_value{ color: #666666}

/*
    nested elemement를 다른 색으로 표시하기
    이게 제일 좋은 방법인지는 모르겠지만...
*/
*                                        {background: none;}
div                                      {background: #6666ff;}
div>div                                  {background: #7777ff;}
div>div>div                              {background: #8888ff;}
div>div>div>div                          {background: #9999ff;}
div>div>div>div>div                      {background: #aaaaff;}
div>div>div>div>div>div                  {background: #bbbbff;}
div>div>div>div>div>div>div              {background: #ccccff;}
div>div>div>div>div>div>div>div          {background: #ddddff;}
div>div>div>div>div>div>div>div>div      {background: #eeeeff;}
div>div>div>div>div>div>div>div>div>div  {background: #ffffff;}
</style>

<script type="text/javascript" language="JavaScript">

    function toggle(obj){
        if(obj.style.display != "block")
            obj.style.display = "block";
        else
            obj.style.display = "none";
    }

    function toggle_all_attr(){
        var divs = document.getElementsByTagName('div');
        var tcl = " attr ";
        for( var i in divs ){
             var test = " " + divs[i].className + " ";
             if(test.indexOf(tcl) != -1){
                toggle(divs[i]);
             }
        }
    }

</script>
</head>
<body>
    <h2><a href="#" onclick="toggle_all_attr()">simple/complex</a></h2>
    <xsl:apply-templates/>
</body>
</html>
</xsl:template>

<!-- element 처리 -->
<xsl:template match="*">
    <div class="element">
   
        <!-- 본인의 attr 처리하고 -->
        <div class="header-area">
            <h3><xsl:value-of select="name(.)"/></h3>
            <xsl:apply-templates select="@*"/>
        </div>

        <!-- sub element들 처리... -->
        <xsl:apply-templates/>
       
    </div>
</xsl:template>

<!-- attribute 처리 -->
<xsl:template match="@*">
    <div class="attr">
        <i class="att_name"><xsl:value-of select="name(.)"/></i><br/>
        <i class="att_value"><xsl:value-of select="."/></i>
    </div>
</xsl:template>
</xsl:stylesheet>

airclick으로 eyetv 컨트롤 하기

1월 7, 2009   //   alexken작성   //   기술  //  1 Comment

pinnacle
내 방에서는 TV를 MacOSX 상에 pinnacle HDTV stick과 eyetv로 보고 있다.eyetv2
Windows에서 TV를 볼때는 마지 못해 보는거였지만, Mac에서는 TV로 보는거 보다 훨씬 더 편하고 좋다.
MacOS 탓이라기 보다는 EyeTV라는 프로그램이 훌륭해서다.
물론 신호 내의 한글로 된 EPG는 다 깨먹지만 말이다.

airclick
pinnacle HDTV stick용 리모콘이 요즘 안보인다. 하늘이 소행으로 보이지만 물증이 없다.
그래서 불편하던 차에, 원래 가지고 있던 AirClick으로 EyeTV를 컨트롤 하려고 찾아봤더니 insanelymac에 해당 정보를 찾았다.
Windows용은 컴파일해야 하지만, Mac은 script로 만들어 놓고, functions.plist만 편집하면 되는 형태.
앞으로도 다양한 용도로 활용 가능해 질거 같은 느낌이다….

functions.plist파일을
/Applications/AirClick.app/Contents/Resources/
나머지 applescript 파일들을
/Applications/AirClick.app/Contents/Resources/scripts/
폴더에 복사하면 된다.

eyetv

[.NET] 달랑 3줄로 동영상 플레이어 만들기

5월 22, 2008   //   alexken작성   //   기술  //  2 Comments

1. 무작정 Visual Studio 2008을 띄우고 C# WinForm 프로젝트 생성
2. [Add Reference]에서 Microsoft.DirectX.AudioVideoPlayback를 추가해주고(DirectX는 깔려 있어야 함)
3. Form을 더블 클릭하고 다음과 같이 쳐준다.

using Microsoft.DirectX.AudioVideoPlayback;

private void Form1_Load(object sender, EventArgs e){
    Video v = Video.FromFile(@"c:\test.avi");
    v.Owner = this;
    v.Play();
}

4. F5를 누른다.

근데 안된다.

[Debug]-[Exceptions]-[LoaderLock]의 Thrown 항목을 꺼준다.

loaderlock.png
5. F5를 누른다.

ㅋㅋㅋ 성공 ….
form1.jpg

[잡설]
이번 일주일간 WDM 디바이스 드라이버 프로그래밍 교육중이다.
Kernel Mode 프로그램에서는 좀만 잘못하면 블루 스크린…
오랜만에 보는 VisualStudio… 안보던 사이 많이 바뀌었었네…

[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이 왜 필요한지 왜 써야 하는지 이해가 가지 않았는데,
이것참 물건이다.

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

페이지:123»

블로그 카테고리

천체사진 갤러리