2014-07-28

[Scala] sealed modifier

 Scala에는 sealed라는 독특한 modifier가 있다.

 같은 방식으로 사용하는데, sealed라는 modifier를 붙인 class는 선언된 파일 안에서만 상속받을 수 있다. 선언된 파일이 아닌 다른 파일에서는 사용할 수는 있지만 상속받으려고 한다면 컴파일 에러가 발생한다.
 다만, sealed의 자식은 sealed가 아니어서 주로 final modifier와 함께 쓰인다.

 Scala library 중 sealed modifier를 사용하는 대표적인 예제는 OptionTry다.
 Option은 Some과 None 2개의 자식이 있고, Try는 Success와 Failure 2개의 자식을 가지고 있다.
 Option과 Try는 sealed로 선언되어 같은 파일에서 선언한 Some, None과 Success, Failure 이외에는 자식을 가지지 못하게 하고, Some, Success, Failure는 final class로 None은 상속할 수 없는 object로 선언하여 사용자가 추가로 상속받을 방법을 막아놓았다.

2014-07-05

morse code 입력기

 자고 일어나보니 친구들이 http://morsecode.me/라는 사이트에서 놀았던 로그가 있었다.
 뭐하는 사이트인가 보니 키보드 혹은 마우스로 morse code를 입력하는 사이트였다.
 하.... 이 마니악한 인간들이라는 생각이 먼저 들었는데 조금 놀다 보니까 이게 은근히 꿀잼이다. 옛날에 들었던 논리설계실험이라는 수업에서 프로젝트 과제로 모스 기계 만들던 생각도 나고....

 모스기계의 원리는 간단하다. 어떤 임의의 unit time이 있고, one unit만큼의 signal은 short mark(기호상으로는 ., 발음은 dot 혹은 dit), 그 시간의 3배의 시간 동안 signal은 long mark(기호로는 -, 발음은 dash 혹은 dah)라고 한다. unit time만큼 입력을 쉬고 있는 것을 short gap, 3 unit times만큼 쉬는 것을 long gap이라고 하여, short gap으로 이어진 mark는 같은 character로 인식하고, character가 달라지면 medium gap이라고 부른다. word가 달라지는 건 long gap(unit time의 7배)으로 구분한다.
 문제는 원리는 간단하지만, 모스부호를 외우는 게 장난이 아니고, 외웠다고 하더라도 실수 없이 치는 게 쉬운 일이 아니다.
 그래서 translator를 만들면 조금 더 쉽게 작업할 수 있지 않을까 하여 F12를 눌러 콘솔 창을 열었다.
 처음에는 사이트가 jQuery로 짜여 있는 것을 보고 jQuery의 event trigger를 이용하면 되지 않을까 해서 시도해봤는데 trigger가 안된다. 왜지? 라고 생각하면서 코드를 봤는데, 모스부호를 입력하는데 가장 중요한 object인 Morser의 instance인 me가 그대로 노출되어 있었다.

 그래서 만들어진 스크립트는 다음과 같다.


 근데 아무리 고생스러워도 이런 건 직접 입력하면서 노는 게 더 재밌다. 스크립트 이용해서 하니까 갑자기 재미없어진다.


p.s. 코드에
* The license is closed source, proprietary, and
* prohibitive. For now. When the code, software,
* community and support for morsecode.me reaches
* maturity, I am likely to open source this project. 
라는 주석이 있는 걸 보면, 언제 바뀔지 모른다.

2014-07-03

WeeChat에서 SSL 사용하기

 지금까지 irc 클라이언트로 irssi를 쓰고 있었다.
 irssi의 기능이나 여기서 제공해주는 스크립트들에 불만이 있는 건 아니지만, perl 스크립트만 support 한다는 것이 결국 문제가 되어(원래 계획은 이 기회에 perl을 배운다는 것이었는데 굳이 irc하나 때문에 perl을 새로 배우는건 손해처럼 보였다.) WeeChat으로 갈아타기로 했다.

 WeeChat은 irssi와 매우 비슷한 look and feel의 UI를 가졌지만, extensible 하다는 것을 장점으로 내세우며 Perl은 물론이고 Lua, Ruby, Python같은 유명한 스크립트 언어들이나 TCL, scheme 같은 교육용으로 자주 쓰이는 언어까지 지원해준다.
 게다가 irssi에서 많이 쓰이는 스크립트(trackbar, nickcolor 등)은 builtin기능으로 제공해 주고, 선택할 수 있는 configuration들도 irssi보다 많다.

 다양한 스크립터언어의 지원이 마음에 들어서 WeeChat으로 옮기기로 했지만, 너무 많은 configuration이 있는 것 때문에 설정하는 게 irssi보다 복잡하다.

 이하 SSL을 사용하기 위해 삽질한 내용들이다.
 WeeChat의 기본 설정 값은 ssl을 사용하지 않아서 따로 사용하도록 설정해 줘야 한다.

 문제는
/set server.ssl = on
을 해줘도 ssl을 사용해서 freenode채널에 접속할 수 없다.
 이에 대해서는 WeeChat FAQ에 해결책이 나온다.
 WeeChat에서는 irssi와는 다르게 Diffie-Hellman key의 길이를 설정해 줄 수 있는데, WeeChat의 기본값은 2048이고 freenode에서 사용하는 key size는 1024다.
/set server.ssl_dhkey_size = 1024
 도 해줘야 한다.

 freenode는 워낙 유명한 채널이라서 FAQ에도 나와있고 금방 해결되었다.
 문제는 국내에서 많이 쓰이는 urric라는 서버에서도 SSL 인증서의 문제로 hand shake가 실패했다고 나오는데, uriirc사용자 중에서 weechat 사용자가 얼마 없는지 이에 대해 해결하는 방법은 나와있지 않았다.
 uriirc 서버의 SSL인증서가 가지는 문제는 크게 3가지이다.

  1. diffie-Hellman key size가 1024이다.
  2. 인증서가 기한 만료되었다.
  3. 인증서의 hostname이 irc.uriirc.org가 아니다.
 key size는 위와 같은 방법으로 해결하면 되는데, 공식적으로 관리되는 서버가 아니라서 그런지 인증서에 이래저래 문제가 많다.
 WeeChat 매뉴얼을 읽어보니 WeeChat은 기본적으로 SSL verify기능이 켜져있고, configuration을 통해서 꺼야한다.
 따라서
/set server.ssl_verify = off
를 해야 한다.

 irssi에서도 SSL verify 기능이 있지만, 이쪽은 default가 off라서 irssi로 접속할 때는 SSL 인증서에 문제가 있는지 모르고 써왔던 것이다.

 초기 세팅을 위해 검색하느라 시간을 조금 쓰기는 했지만, 이것저것 설정해줘야 해서 조금 더 안전하게 사용할 수 있는 것 같은 착각(?)이 든다.