Structural subtyping, Upper bounds, Implicite Parameter & View bounds

Scala에서 insertion sort는 다음과 같이 구현할 수 있습니다. def isort[T](less:(T,T)=>Boolean)(xs:List[T]):List[T] = { def insert(x:T, xs:List[T]):List[T] = xs match { case Nil => List(x) case x1::xs1 => if (less(x, x1)) x::xs else x1::insert(x, xs1) } xs match { case Nil => Nil case x::xs1 => insert(x, isort(less)(xs1)) } } println(isort((x:Int, y:Int)=> x x Int형이라면 < 연산자를 사용하고 비교하기 위해 less 연산자를 사용하지 않겠지만 Double이나 Char를 정렬하고 싶은 경우도 생기기 때문에 일반적인 형 T에 대해 사용할 수 있도록 적은 것입니다. 하지만 Double, Char 모두 < 연산자를 제공하고 있는데 반복적인 less를 사용하는 것이 불편합니다. Programming Scala 책에는 structural subtype 에 대해 클래스 이름이 아니라 특정한 메소드를 가지는 것으로 subtype을 결정하는 것이라고 나와 있습니다. 다음과 같이 시도해 봅니다. def isort2[T List(x) case x1::xs1 => if (x Nil case x::xs1 => insert(x, isort(xs1)) } } 위에서 의미하고자 하는 것은 같은 형과 비교하는 연산자 <를 가지는 클래스 T를 말하는 것입니다만, structural subtype에서는 아직 정의되지 않은 T를 사용할 수 없다며 컴파일 오류가 발생합니다. 다른 형의 메소드라면 이 방법으로 해결할 수 있었겠지만 같은 형을 비교해서 Boolean을 반환하는 함수형은 이 방법을 사용할 수 없습...

소수 계산

val primeStream:Stream[Int] = 2 #:: Stream.from(3, 2).filter(i => primeStream.takeWhile(j => j*j i%k != 0)) stackoverflow 에 올라와 있는 scala의 소수(prime) stream 예제 위 코드를 한글로 번역하면 2와 3 이상의 홀수 중에서 제곱해서 자신보다 작은 이미 찾아낸 소수들 모두로 나누어지지 않는 수가 된다. val로 정의되어 있으므로 이미 찾아낸 값을 다시 계산하지 않는다. 2 3 - 2*2 5 - takeWhile에서 선택되는 소수는 2. 2는 5%2!=0을 만족하므로 채택 7 - takeWhile에서 선택되는 소수는 2. 2는 7%2!=0을 만족하므로 채택 9 - takeWhile에서 선택되는 소수는 2,3. 9%3 == 0이므로 채택되지 않음 11 - takeWhile에서 선택되는 소수는 2,3. 2,3 모두 11 나누면 나머지가 있으므로 채택 위의 방식으로 계속 찾아내게 된다.

OSX에서 Octave 설치

brew가 설치된 상태에서 % brew install octave # octave 받고 필요한 패키지들을 설치함. terminal에서 octave 실행시키고 명령어 내려볼 수 있다. graph 함수 실행시키면 동작하지 않는다. XQuartz 받아서 설치하고 다음의 명령어들을 실행 % brew install gnuplot # gnuplot과 필요 패키지들 설치 % cat ~/.octaverc # 홈 디렉토리에 .octaverc 파일을 만들고 내용을 다음과 같이 설정 setenv GNUTERM x11 이후 plot 명령 실행시키면 화면에 그래프 표시된다.

Scala에서 Tuple의 zipped

Scala 2.10.1 val a = List.range(1, 4) // List(1,2,3) val b = List.range(10, 40, 10) // List(10,20,30) a zip b // List((1, 10), (2, 20), (3, 30)) a zip b map ((x,y) => x+y) // ERROR : wrong number of parameters, expected 1 a zip b map (((x, y)) => x+y) // ERROR : not a legal formal parameter a zip b map (Tuple2(x,y) => x+y) // ERROR : not a legal formal parameter (a, b).zipped.map(_+_) // List(11, 22, 33) val c = List.range(100, 400, 100) // List(100, 200, 300) a zip b zip c // List(((1,10), 100), ((2, 20), 200), ((3, 30), 300)) a.zip(b, c) // ERROR : too many arguments (a, b, c).zipped.toList // List((1, 10, 100), (2, 20, 200), (3, 30, 300)) (a, b, c).zipped.map(_+_+_) // List(111, 222, 333)

루비에서 파일 체크섬 검사

파일 체크섬을 조사할 때 전용 프로그램을 사용할수도 있지만 ruby가 설치되어 있다면 다음과 같은 방법으로 검사할 수 있습니다. require 'digest' Digest::SHA1.file("파일이름").hexdigest 많이 사용하는 SHA1, MD5이외에도 SHA2, HMAC, RMD160 등의 방식도 사용할 수 있는것 같습니다.

ActiveX가 싫어요!

주말에 윈도우즈8을 64비트로 새로 인스톨하면서 이번에 ActiveX 없는 시스템을 한번 만들어보려고 가상머신(Virtual Machine)을 설치해 보았습니다. 윈도우즈 7 프로페셔널 버전에는 가상 XP라고 XP 시스템을 사용할 수 있도록 해 주었는데 버전이 8로 바뀌면서 윈도우즈 8을 사용하는 경우 마이크로 소프트사에서 다운로드는 가능하지만 사용할 수 없도록 막아놓았습니다. (자기들도 지긋지긋하겠지요. 새로운 버전으로 넘어갔으면 싶을테고.) Hyper-V 라는 윈도우즈 8에 포함된 가상머신에 XP 이미지를 올리니까 작동은 합니다만 윈도우즈 정품이 아니라는 메시지가 출력되면서 30일간 사용할 수 있다고 합니다. 정품을 구입하라는 링크를 누르면 XP는 지원하지 않고 윈도우즈7 구매 메시지가 나오구요. 검색을 해 보니 오라클에서 배포하는 가상머신 VirtualBox에서 머신의 바이오스를 다른 것(?!)으로 바꾸면 동작하다고 합니다. 설명대로 해보니 과연 정품 인증도 통과하고 모든 것이 잘 돌아갑니다만... ActiveX를 설치하려니 TouchEn Key라는 키보드 보안 관련 ActiveX가 설치되는 순간 가상머신이 리부팅되어 버립니다. 기왕 해보는 김에 이번에는 Vmware Player를 다운받아서 설치해 보았습니다. (개인이 사용하는 경우는 무료로 사용할 수 있습니다. 가상머신도 여럿이 되다보니 그런가봅니다.) VirtualBox의 디스크 이미지를 ovf란 포맷으로 export한 다음 Vmware에서 import하니까 그대로 이전이 가능했습니다만, 부팅하는 순간 다시 정품이 아니라는 메시지가 나옵니다. Vmware Player 자체에서 XP mode를 지원하기는 합니다만, 윈도우즈 7에서만 사용할 수 있고 윈도우즈 8에서는 사용할 수 없다고 합니다... OTL 결국 제대로 설치하려면 가상머신에 윈도우즈를 새로 설치해야 할것 같은데... 그러기 위해서는 어둠의 경로에 들어가야 할것 같아서 마음을 접고 그냥 시스템에 ActiveX를 설치하기로 했습니다. 이런...

익스페리아 Z 사용

이미지
원래는 주말쯤 주문한 케이스가 도착하면 그때부터 전화로 사용하려고 생각했었는데... 도착한 물건을 어찌 와이파이만 연결해서 사용하겠습니까. 이전 핸드폰에서 유심 꺼내서 장착한채 사용중입니다. 박스 내부에는 핸드폰 외에 전원어댑터, USB 케이블, 이어폰 그리고 보호 필름이 들어 있습니다. 보호 필름이 들어 있는 줄 미리 알았다면 케이스 주문하지 않았을텐데요. 일본에서는 기본으로 독이 들어있다고 하는데 영국에서 판매하는 제품에는 포함되어 있지 않습니다. 박스 내용물 이전 핸드폰 램이 1G가 안 되는 녀석이다 보니 2G 램에 젤리빈을 돌리는 녀석은 불편함 없이 쌩쌩 돌아가는 군요. 아마 집에서 6-7년째 사용중인 아이맥 보다 사양이 높을것 같습니다.  성능에 대해서는 다른 핸드폰과 크게 다른 점은 없을 듯. 사양이 받쳐주는 안드로이드는 아이폰 부럽지 않네요. 애플은 좀 더 새로운 혁신이 필요한 시점이 된듯. 처음 유심을 꼽고 전원을 켜니 자동으로 네트워크가 잡히지는 않았습니다. 수동으로 선택하도록 하고나니 통신회사들이 나오는데 LG도 LTE로 나오는 군요. 실제 접속해서 사용할 수 있는지는 모르겠습니다. LG Uplus LTE 과연 사용할 수 있을까? 처음에는 MMS 문자가 제대로 표시되지 않던데 설정의 Xperia 메뉴 아래 Internet settings라고 인터넷과 MMS 세팅을 다운로드 받고 나니 제대로 표시됩니다. 소니 제품 답게 멀티미디어쪽으로 자체 프로그램들이 설치되어 있고 DLNA 지원되는 앰프나 NAS 등에 자유롭게 접속하고 음악을 플레이할 수 있는 점이 나름 특징이 되겠습니다.  방수, 방진이 되는 제품이므로 USB 충전, 헤드폰 단자 등이 모두 실링되는 커버로 덮혀있습니다. 충전할때마다 커버를 열었다 닫았다 하는게 은근 귀찮으니 올려놓으면 충전되는 독은 다음에 물량이 풀리면 구매하는게 좋을듯 합니다. 카메라는 처음에 덮혀진 보호비닐을 아직 제거하지 않은 관계로 ...