12월, 2013의 게시물 표시

최후의 생존자

최후의 생존자 알고리듬 책에 나온 문제이다. 1번 부터 n번까지 n명의 사람이 있을 때 한명은 살고 그 다음 사람은 죽는 방법으로 생존자를 결정할 때 최후까지 남는 사람은 누구인가를 알아낸다. 예를 들어 5명이 있다면 1번은 살고 2번이 죽고 3번은 살고 4번이 죽고 5번은 살고 1번이 죽고 3번은 살고 5번이 죽고 나면 3번이 최후의 생존자가 된다. 1, 2, 3, 4, 5 1, 3, 4, 5 1, 3, 5 3, 5 3 기본 프로그램은 C로 짜 보았다. #include #include #include // 인자 크기 n의 정수 배열의 s부터 시작해서 0이 아닌 첫번째 항목을 찾는다 int searchSurvivor ( int * ms , int s , int n ) { if ( s >= n ) s = 0 ; while (*( ms + s ) == 0 ) { s ++; if ( s == n ) s = 0 ; } return s ; } // 인자 n 크기의 members 정수 배열을 할당받은 후 1로 초기화 하고 // searchSurvivor 함수로 배열에서 생존자를 찾고 한번 더 함수로 // 사망자를 찾는 방식으로 구현했다. int last ( int n ) { int i = 0 , sur , * members ; members = ( int *) malloc ( sizeof ( int )* n ); for ( i = 0 ; i n ; i ++) *( members + i ) = 1 ; sur = n ; i = 0 ; while ( sur != i ) { // 마지막은 생존자와 사망자가 같은 경우, 즉 유일한 생존자 sur = searchSurvivor ( members , i , n ); // printf("생존자 %d를 찾...

Ubuntu에서 사용자별로 자판 설정하기

집에서 놀고 있던 예전 아이맥에 우분투를 설치했습니다.  USB로 설치하려 시도해 봤지만 맥에서 USB 만드는 것은 PC에서 부팅하는 것이고 (적어도 제가 사용하는 맥에서는 옵션키를 누누르고 있어도 USB 부팅이 불가능했습니다) LTS 버전은 12.04가 최신이지만 800메가 CD보다 용량이 커진 관계로 CD로 구울 수 있는 11 버전을 설치한 다음 12로 업데이트했습니다. (가끔씩 에러메시지가 뜨기는 하지만 화이트 플라스틱 아이맥의 사운드, 블루투스 등은 특별한 삽질없이 다 잡아내는군요) 저는 드보락 자판과 세벌식390 자판을 사용하지만 집사람과 아이는 쿼티와 두벌식 자판.  제가 사용하는 계정을 따로 만들어서  .bashrc에 setxkbmap dvorak을 추가하고  시스템 설정 -> 언어지원에서 키보드 입력기를 나비로 바꾼 다음  나비에서 드보락, 세벌식 지정하고 고급탭에서 시스템 키맵 사용을 선택하니 제 계정에서만 드보락과 세벌식을 사용할 수 있게 되었습니다.  추가로 dconf-editor를 사용해서 나비를 트레이에 들어가게 했습니다.

Scala 함수 연습

Functional Programming in Scala란 책을 읽고 있습니다. 아직 베타판으로 정식으로 출판된것은 아닌데 초기의 난해한 내용에서 제법 재밌게 읽을 수 있는 책으로 바뀌었네요. 그중 함수형 언어로서의 특징을 보여주는 연습문제가 있어 풀이겸 적어봅니다. 함수형 언어의 특징중 하나는 함수 자체가 하나의 값이고 인자로 주거나 받을 수 있다는 것입니다. def curry [ A , B , C ]( f :( A , B )=> C ): A =>( B => C ) = a => ( b => f ( a , b )) 암호같이 보이는 함수 curry는 2개의 인자를 받아 값을 반환하는 함수 f를 인자로 받아 다른 함수를 반환하는데 그 함수는 하나의 값을 주면 인자 하나를 받아 원래 함수값을 계산하게 됩니다. 예로 이해하는게 쉽습니다. // plus는 새로운 함수 val plus = curry (( a : Int , b : Int )=> a + b ) // 하나의 값을 받아서 다른 함수를 반환 val n1 = plus ( 1 ) // 그 함수에 다른 값을 주면 원래 함수가 하는 일을 한다. 결과는 3 val n2 = n1 ( 2 ) curry 함수를 풀어주는 함수입니다. def uncurry [ A , B , C ]( f : A =>( B => C )):( A , B )=> C = ( a , b ) => f ( a )( b ) val plustwo = uncurry ( plus ) plustwo ( 1 , 2 ) 다음은 2개의 함수를 받아 하나의 함수로 만들어주는 함수 compose와 그 예입니다. 숫자가 짝수인지 확인해 주는 함수와 문자열의 길이를 받는 함수를 합쳐 문자열의 길이가 짝수인지 확인하는 함수를 만듭니다. def compose [ A , B , C ]( f : B => C , g : A => B ): A => C = a =>...

HyperV에 우분투 설치

이미지
아침에 일어나서 윈도우즈 컴퓨터의 윈도우즈8을 8.1로 업그레이드했습니다. 시작버튼이 새로 생겼다고 해서 기대했더니 메뉴가 나오는게 아니라 그냥 메트로 화면과 데스크탑 화면을 전환하는 것이더군요. 그래도 로그인시 바로 데스크탑 화면으로 갈 수 있는 옵션이 구석에 숨어서라도 있는게 다행입니다. 컴퓨터 켠 김에 아이가 지난번 리눅스 이야기를 하길래 윈도우즈의 Hyper-V 기능을 활성화 시키고 가상 컴퓨터에다 우분투 리눅스를 설치했습니다. 메모리는 기본 512메가 동적으로 1기가까지 확장되도록 했고 하드는 20기가를 주었습니다. 전체 화면모드에 들어가면 가끔씩 멈추는 현상이 있지만 그것외에 특별히 불편한 점은 없는듯 합니다. 리눅스도 계속 쓰기에 편해지는 것 같습니다. ActiveX와 아래아 한글 문제만 아니면 벌써 갈아 엎었을 듯...

마크다운을 이용한 블로깅

이미지
Sublime 에디터를 사용하다 보니 이 블로깅도 에디터로 할 수 있으면 좋겠다는 생각이 듭니다. Markdown Extended 와 같은 패키지를 사용하면 마크다운에 맞춰서 색을 표시해 주는 등, 웹에 접속하지 않고 간편하고 빠르게 사용하기 좋을 것 같습니다. 찾아보니 대부분 마크다운 을 이용해서 마크업을 하며 다음과 같은 몇가지 방법들이 있습니다. 워드프레스용 패키지 어떻게 사용하는지 모르겠지만 현재 사용하는 Blogger에는 쓰기 어려울것 같습니다. Blogger용으로 포스팅 목록도 볼 수 있고 마크다운도 쓰고 하는 패키지를 만들어보고 싶은 마음도 들었습니다만, 파이썬은 1.X 버전때 사용해서 이제는 거의 새로 배워야 할것 같고 sublime 패키지 작성법에다 Blogger API까지 공부해야 하니 그냥 넘어가기로 합니다. 드랍박스 를 사용하는 방법. 마크다운으로 작성한 파일을 드랍박스에다 저장하면 원격 서버에서 읽어서 포스팅을 해 줍니다. 포스팅을 올린 다음 홈페이지에 접속해서 Publish 명령을 내려줘야 하거나 소스 코드의 하이라이트닝을 지원해 주지 않아서 탈락. 간이 블로그 서버를 하나 만들어 볼까 고민하다 떠오른 생각이 사용자 컴퓨터에서 마크다운 파일을 읽어 HTML로 변환한 다음 Blogger에 올려주는 방법입니다. 이용한 자바 라이브러리들 다음과 같은 라이브러리들을 참조했습니다 Markdown4j 자바용 마크다운 변환 라이브러리입니다. 시험삼아 몇가지 돌려보니 이상하게 동작하는 경우도 있지만 PegDown 도 마찬가지였고 PegDown에 비해 간단하게 플러그인을 지원해 주기 때문에 소스 코드 하이라이트를 사용할 수 있었습니다. java-prettify 자바용 소스 코드 하이라이트 라이브러리입니다. 구글 Prettify 를 자바용으로 포팅한 것인데 스윙용 에디터까지 만들어져 있습니다. 같은 제작자가 SyntaxHighlighter 를 포팅한 java-syntax-hilighter 도 있습니다. 위 두가지 라이브러...

sbt 실행시 자바 옵션 주기

sbt는 스칼라 작업의 많은 부분을 간단하게 해 주지만 자세히 들어가면 설정하기가 적어도 내게는 어려운 편이다. 공부하던 중 test 실행시 자바에 옵션을 줄 일이 생겼는데 어떻게 해야할지 잘 몰라서 찾아보니 JVM을 fork 하는 경우 build.sbt에 javaOptions += "..." 와 같이 주는 방법이 있고 리눅스에서는 env JAVA_OPTIONS="..." sbt test 와 같이 줄수도 있으나 OSX에서는 제대로 동작하지 않았고 brew를 통해 sbt를 설치한 경우 /usr/local/bin 에 sbt 파일이 들어있는데 sbt 파일(텍스트)에 ~/.sbtconfig 파일이 있는지 검사하는 부분이 들어가 있는지 확인하고 (brew를 통해 설치하면 들어가 있다고 한다) 홈 디렉토리의 .sbtconfig 파일에 SBT_OPTS="..." 와 같이 자바 옵션을 주면 된다. 나의 경우 세번째 방법을 통해 옵션을 성공적으로 줄 수 있었다.

Scala Enumeration

StackOverflow의 Scala Enumeration 에 대한 문답을 간단히 요약 object Weekday extends Enumeration { type Weekday = Value val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value } import Weekday._ Enumeration 클래스는 Value type(실제로는 내부 클래스)이 있으며 type Weekday = Value 는 type alias val Mon, Tue, Wed, Thur, Fri, Sat, Sun = Value 는 앞서 말한 type의 대입이 아니라 변수 각각에 대해 Value 메소드가 반복되어 호출되는 것이며(아마도 companion object의 apply 메소드인듯) 메소드는 매번 새로운 Value 인스턴스를 생성해서 반환한다 이후 Weekday의 모든 변수를 import하고 나면 Mon, Tue 등을 바로 사용할 수 있다