2015-02-21

[Scala] 관련있는 데이터를 묶어서 사용하기 - alias와 case class

 Scala에서 여러 개의 값을 묶어서 새로운 타입을 정의하는 방법은 여러 가지가 있다.

Type alias

 가장 쉬운 방법은 튜플의 alias를 만드는 것이다.

 위의 코드의 4번째 줄에서 month와 date를 선언하면서 Date 타입의 변수를 쪼개 새로운 값에 할당하는 것을 decomposition이라고 한다. 이렇게 decomposition을 이용하면 구조체의 값들을 쉽게 다른 값에 할당할 수 있고, 혹은 아래와 같이 패턴매칭을 이용해서 사용할 수 있다.


 하지만 튜플의 alias를 만드는 방식은 큰 문제가 있다. 이런 방식은 타입 세이프 하지 않다. 예를 들어 위에서 정의한 Address 타입과 함께 아래와 같이 정의된 Date 타입이 같이 사용된다면 둘 다 실제로는 같은 Tuple2[String, Int] 타입이기 때문에 패턴매칭으로는 AddressDate를 구분할 방법이 없다.



case class

 튜플의 alias가  타입 세이프 하지 않다는 문제를 해결하기 때문에 보통은 data composition에 case class를 사용한다. case class를 사용하면, 실제로는 다른 같은 타입들의 묶음과 구분할 수 있을 뿐 아니라, 내부 값에 이름으로 접근해 꺼낼 수 있어서 내부 값을 더 쉽게 읽을 수도 있다.

2015-02-18

[C++] Object slicing

 Object slicing이란 상속받은 class의 instance를 부모 class의 instance로 복사함으로써 상속받은 class가 가지고 있던 정보가 손실되는 것을 말한다. 이는 기능이 아니라 stack에 값을 할당하는 value 타입의 특성 때문에 생기는 버그다. 그래서 heap에 값을 할당하는 reference 타입밖에 없는 Java 같은 언어에서는 발생하지 않는다.

 Object slice 때문에 value type에 대해서는 upcasting을 해서는 안된다. 대부분 upcasting이 필요한 경우는 이미 무언가 잘못된 경우이니 코드를 수정해야 한다. 만약 무슨 일이 있어도 upcasting을 해야 한다면 반드시 heap에 값을 할당해야 한다.

2015-02-03

Glowing Bear - 터미널에서 하던 IRC 웹에서 그대로

 나는 freenode를 구경하거나 친구들과 놀기 위한 용도로 IRC를 사용한다. 데스크탑 어플리케이션도 많이 쓰이지만, IRC라는 프로토콜의 특성상 접속하여 있지 않으면 대화를 볼 수 없어서 freenode에 있는 사람들은 IRC를 계속 접속해놓을 방법을 찾는다. 가장 쉬운 방법은 컴퓨터를 끄지 않고 다니는 방식이지만, 보통 개발자 중에 이런 방식을 사용하는 사람은 없다. 보통은 서버에 터미널 기반의 IRC 클라이언인 WeeChat이나 Irssi 띄우거나, IRC Cloud라는 서비스를 사용한다.
 하지만 터미널 클라이언트를 사용하면 언제서나 접속할 수 있는 웹 클라이언트가 아쉬워지고, IRC Cloud를 사용하기에는 한 달에 5$ 하는 비용뿐 아니라 WeeChat의 plug-in기능이 아쉬워진다. 그래서 보통은 WeeChat과 IRC Cloud 양쪽을 사용하는 방식을 택하지만, 그렇게 되면 2개의 접속이 연동되지 않기 때문에 불편한 건 어쩔 수 없다.
 그래서 WeeChat plug-in을 이용해 위와 같은 웹 서비스를 만들어볼 계획이었다. 우선 채팅 로그를 DB에 저장하는 스크립트를 만들던 중 WeeChat에 완전히 같은 목적을 가진 relay protocol이 있다는 것을 알게 되었다. Relay protocol은 WeeChat client가 relay 서버가 되어, Relay 클라이언트와 TCP socket을 이용해 통신을 하게 된다. Relay protocol을 사용하면 WeeChat과 완전히 같은 화면을 볼 수 있는 데다가 WeeChat plug-in을 그대로 사용할 수 있다는 장점이 있다.
 Relay protocol을 사용하는 client는 여러 가지가 있다. Qt를 사용해서 데스크탑 애플리케이션을 만든 QWeeChat, node.js를 이용한 웹 서버 WeeCloud 등도 많이 사용된다. 하지만 내가 사용하는 클라이언트는 Glowing Bear다. Glowing Bear는 완전히 static 한 web page에서 WebSocket을 이용해 WeeChat relay server와 통신하기 때문에 WeeCloud와 달리 웹 서버와의 통신은 필요하지 않아서 순전히 WeeChat 서버하고만 통신한다는 장점과 웹 서버 이외에 별도의 서버가 필요하지 않다는 장점이 있다.
 일단 지금 3~4일째 사용하고 있는데 키보드로 채널을 이동할 수 없다는 것을 제외하고는 딱히 문제를 찾을 수 없어서 앞으로도 계속 사용할 것으로 보인다.