Another Testing

 포스팅을 위해서는 일반 내용을 작성하고 나서 HTML 모드로 바꾸어 code를 따로 붙여줘야 한다. def hello = println("안녕? 여러분!") def double(i: Int) = i + i

시험 포스팅

Blogo 란 앱을 사용한 포스팅입니다. 다음은 소스 코드 입니다. object Test { def main(as:Array[String]) = println(“Hello, world”) } C로… void main(void) { printf(“Hello, world\n”); return; }

Add a Post Title

간만의 업데이트 Blogger에는 아주 많은 장점들의 합을 넘어선 단점이 있으니 소스 코드의 syntax highlight 를 지원해주지 않는다는 것입니다. DeskPM이란 OSX의 앱을 사용하고 있는데 이번에 2.0으로 업데이트하면서 이를 지원하게 되었습니다. 따라서 시험삼아 올려보겠습니다. [code language="scala"] val msg = "Hello, world" println(msg) [/code] Markdown 형식의 메시지 두번째 메시지 그만하지 딴건 지원이 되는데 소스코드 하이라이트는 자체적으로 지원하는 기능이 아닌가 봅니다. 아니면 조만간 지원이 되려나요? -.-

Ruby-processing 설치

요즘 웬만한 일은 scala로 처리하려고 하지만 사용자로 코드를 받아 eval 한다거나 하는 기능은 무리일것 같아 한동안 손놓았던 ruby를 건드려 볼까 생각중이다. 설치및 데모 실행 brew install rbenv : rbenv 설치 brew install ruby-build rbenv install -l : 설치 가능한 ruby 버전들 보기 rbenv install jruby-1.7.11 : ruby-build 설치 가능한 것 중 최신 버전 설치 rbenv global jruby-1.7.11 : jruby를 기본 ruby로 설정 (이건 안하는게 나을수도 있겠다) ruby -v : 1.7.11이 실행되는 것 확인 gem install ruby-processing : ruby processing gem 설치 brew install wget : 아래의 install_jruby_complete 실행에 필요함 rbenv exec install_jruby_complete rbenv which rp5 : rp5 명령이 위치한 디렉토리 확인 ~/.rp5rc 파일에 PROCESSING_ROOT: "/Applications/Processing.app/Contents/Java" 저장 ruby-processing의 샘플 디렉토리로 이동 - 위와 같이 설치한 경우 .rbenv/versions/jruby-1.7.11/lib/ruby/gems/shared/gems/ruby-processing-2.4.4/samples rbenv exec rake 실행하고 깜짝 놀라기 ;) 이리저리 살펴보다 nodebox 란 것을 알게 되었다. Python 유저들이 processing과 비슷하게 만든것 같은데 Nodebox3은 튜토리얼 대충 눈대중만 보아도 상당히 재밌을 것 같다. Ruby나 scala로 비슷하게 만들어 보는 것도 좋을 듯.

Canvas element에서 key이벤트 받기

HTML5의 canvas 엘리먼트는 그래픽을 표시하기에 좋으며 마우스 관련 이벤트는 onmouse… 이벤트 핸들러를 사용하면 바로 이용할 수 있지만 키보드 관련 이벤트는 onkeydown , onkeyup 이벤트 핸들러를 등록해도 호출되지 않는다. Stackoverflow 에 따르면 canvas 엘리먼트는 기본적으로 키보드 이벤트를 받지 않도록 설계되었기 때문이며 canvas에 tabindex를 지정해 주면 이후 키보드 이벤트를 사용할 수 있게 된다. tabindex = "1000" > scala.js에서 dom 사용하는 경우에는 다음과 같이 canvas . tabIndex = 1000

implicit 형 변환 함수로 각도 변환

implicit 변환 Scala는 형을 가지고 있는 static type의 언어이지만 implicit 함수를 통해 여러 형들을 손쉽게 변환해 준다. 다음은 degree와 radian를 새로운 형으로 정의하고 degree에서 radian으로 implicit 함수를 정의해서 사용하는 예이다. implicit로 변환함수만 한번 정의해 놓고 나면 다음부터 필요한 경우 컴파일러가 자동으로 형변환을 찾아서 삽입해준다. type Degree = Int // 필요에 따라 Double형으로 정의 type Radian = Double implicit def deg2rad ( d : Degree ): Radian = d * math . Pi / 180 val r : Radian = 45 : Degree // 0.785

최후의 생존자

최후의 생존자 알고리듬 책에 나온 문제이다. 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 등을 바로 사용할 수 있다

터미널에서 스칼라 파일 직접 컴파일, 실행

항상 sbt나 eclipse 파일 받아서 실행시키다 보니 처음부터 만드는 방법을 아직 모르고 있다. 일단 컴파일및 실행. scalac -classpath ".:/외부라이브러리패스/*" demo.scala scala 클래스이름 스칼라의 기본 라이브러리만 사용하는 경우에는 classpath를 지정할 필요없지만 외부 자바라이브러리라도 사용하려면 위와 같이 지정해주어야 한다. 쌍따옴표(")를 사용하지 않으면 IO에러가 발생하며 *.jar와 같이 지정해 주어도 제대로 찾지 못한다. 앞의 '.'를 지정하지 않으면 scala 실행시 현재 디렉토리에서 클래스를 찾지 않는다. 반복적으로 사용하는 경우 .bash_profile에 다음과 같이 환경변수로 지정 export CLASSPATH=".:/외부라이브러리패스/*"

그 외 scala에서 함수 정의하기

def f1 = "Hello, world" def f2 = { "Hello, world" } def f3() = "Hello, world" def f4()() = "Hello, world" def f5 = () => "Hello, world" def f6() = () => "Hello, world" def f7 = () => ( () => "Hello, world" ) def f8(c: =>String) = c def f9(c: =>String) = () => c f1을 정의하고 나면 다음에 f1을 만날 때 "Hello, world"로 대치된다. f2는 f1과 동일하게 동작한다. {}안에는 여러 식을 사용할 수 있으며 마지막 식이 전체의 값이 된다. f3는 f1과 동일하다. 괄호없이 단순히 f3로 적어도 "Hello, world"값이 대치되며 f3()로 적어도 된다. f4는 f1, f3와 동일하게 사용할 수 있으나 f4, f4(), f4()() 모두 "Hello, world" 문자열로 대치된다. REPL에서 식을 입력해 보면 f1, f2는 String이지만 f3는 ()String f4는 ()()String이다. 일종의 currying이 아닐까 싶은데 인자가 없기 때문에 그냥 함수 이름만 적어도 여러 단계를 한번에 확장해 버리는 것 같다. f5의 type은 () => String이다. 다시 말해 f5는 아무런 인자도 가지지 않고 문자열을 반환하는 함수로 대치된다. 단순히 f5로 적으면 type과 함수임을 보여주며 실행시키려면 f5()와 같이 명시적으로 실행시켜야 한다. f6의 type은 ()() => String이며 단순히 f6를 입력하면 f5와 동일하게 보이나 f6()를 입력하면 문자열이 바로 반환되지 않으며 f6()()와 같이 ...

Scala에서의 9가지 함수 정의

def f1(n:Int) = println(n) def f2 = (n:Int) => println(n) 오랫만에 scalafx를 만져보다 위의 차이점에 대해 궁금하게 되었다. 결론부터 이야기하자면 f1은 하나의 정수 인자를 받아 출력하는 함수이며 f2는 하나의 정수인자를 받아 출력하는 함수를 반환하는 함수이다. f1의 type은 Int=>Unit이며 f2는 ()=>(Int=>Unit)이 되는 셈이다. StackOverflow 에는 Scala에서 함수를 정의하는 9가지 방법이라는 질문이 나와있다. def f1 = 10 def f2 {10} def f3 = {10} def f4() = 10 def f5() {10} def f6() = {10} def f7 = () => 10 def f8 = () => {10} def f9 = {() => {10}} 가장 좋은 평가를 받은 답을 간단히 요약하면 =을 사용하지 않은 함수 def는 Unit을 반환 하게 되므로 f1과 f5는 같은 함수이고 f2, f3, f4, f6는 아무런 인자를 가지지 않고 정수값을 반환하는 동일한 함수들이며 f7, f8, f9는 아무런 인자를 가지지 않고 정수값을 반환하는 함수를 반환하는 동일한 함수들이 된다. scalafx에서 이벤트 핸들러는 다음과 같이 실행하는데 keyHandler2를 keyHandler1과 같이 사용하지 못하는 이유를 찾아보다 알게 되었다. keyHandler2를 쓰려면 keyHandler2를 반환하는 handler2Wrapper와 같은 함수를 이용해야 한다. scene = new Scene { onKeyPressed = keyHandler1 } def keyHandler1 = (e:KeyEvent) => println(e.code) def keyHandler2(e:KeyEvent) = println(e.code) def handler2Wrapper:KeyEven...

아이맥 구입

이미지
얼마전 업데이트된 하스웰 기반의 아이맥을 구입하였습니다. 데스크 탑에서는 하스웰의 잇점이 거의 없다고 하지만 푸젼 드라이브를 설치했으니 부팅속도에서 잇점이 있을것 같습니다. 지금까지 쓰고 있던 맥은 2006년 하반기 구입. 7년이 지나다보니 더 이상 OS 업데이트도 되지 않는 지경에다 함께 사용하고 있던 NAS가 조금씩 정신이 왔다갔다 하는 바람에 새 모델 나오기를 기다렸다 구입했습니다. 근데 한참동안 꺼두었던 NAS가 제대로 동작하지 않는 문제에 봉착했네요. 이녀석 거의 사망직전인듯 합니다. 블랙박스같이 되어 있어서 문제없이 사용할 때는 편리하지만 문제가 발생한 경우 외부에서 접근할 수 있는 한두가지 방법이 통하지 않으면 도대체 무슨 문제인지 에러 메시지나 로그도 볼 수 없는게 단점이군요. 자료는 정신이 오락가락 할때 외장하드에 백업해 놓았습니다만 이걸 사용한다면 Aperture나 iTunes의 태그 같은 걸 새로 지정해야 할것 같으니 머리가 지끈 아프네요. 얼른 무사히 자료 이전이 끝나면 좋겠습니다. 그리고 개인적으로 NAS를 자료 저장소와 백업을 함께 하는 용도로 사용하지는 않아야 한다는 것을 알게 되었습니다. 하드 한개가 고장나는 경우 자료를 복구할 수 있지만 NAS 자체가 고장나면 결국 무용지물이 되니까요.

루빅스 큐브 기본

완전 초짜들을 위한 가이드 에 의하면 루빅스 큐브는 가운데에 고정되어 있는 1개의 면을 가지는 6큐브를 중심으로 2개의 면을 가지는 에지 큐브가 12개와 3개의 면을 가지는 모서리 큐브 8개가 모여서 이루어진다. 결국 주사위와 마찬가지로 축을 이루는 색깔간의 관계는 바뀌지 않고 에지와 모서리 큐브의 위치에 따라 상태(state)가 결정되는 셈이다. 어쩌면 큐브를 푸는 프로그램을 만들어 볼 수 있을것 같다.

scala에서 processing 사용하기

Scala에서 processing을 사용하는 예제들이 있는데 시험해 보면 size 명령이 제대로 동작하지 않는 경우가 있다. 보통 첫번째 방법을 많이 사용하는데 setup에서 size 명령이 제대로 먹히지 않는 반면 두번째 방법을 사용하니 제대로 동작한다. Windows 시스템에 한정된 일인지는 명확하지 않다. import processing.core._ object Test extends PApplet { private var test:Test = _ def main(args: Array[String]) = { test = new Test val frame = new javax.swing.JFrame("Test") frame.getContentPane().add(test) test.init frame.pack frame.setVisible(true) } } class Test extends PApplet { override def setup() = { } override def draw() = { } } import processing.core._ object Test { def main(args: Array[String]) = PApplet.main(Array[String]("Test")) } class Test extends PApplet { override def setup() = { } override def draw() = { } }

순열 만들기

Scala에서 순열을 만드는 2가지 방식을 생각해 볼 수 있겠습니다. 물론 더 여러가지가 있을 수 있겠지만... 1. 한번에 숫자 하나씩 처리하기 인자로 받은 리스트의 항목을 하나씩 가지고 결과물을 만들어 나가는 방법입니다. 매번 리스트 항목에서 하나를 선택해서 이미 만들어진 리스트의 앞, 중간, 뒤에 그 항목을 끼워넣습니다. List(1, 2, 3), List() -> List(2, 3), List(List(1)) -> List(3), List(List(2, 1), List(1, 2)) -> List(), List(List(3, 2, 1), List(2, 3, 1), List(2, 1, 3), List(3, 1, 2), List(1, 3, 2), List(1, 2, 3)) def permutation[A](xs:List[A]):List[List[A]] = { def mutate(x:A, ys:List[A]):List[List[A]] = { // ys의 앞, 중간, 뒤에 x를 끼워넣은 리스트를 반환 def helper(zs:List[A], prev:List[A], acc:List[List[A]]):List[List[A]] = zs match { case Nil => (ys :+ x)::acc case z::zs1 => helper(zs1, prev :+ z, (prev ++ (x::zs))::acc) } helper(ys, List(), List()) } def helper(ys:List[A], acc:List[List[A]]):List[List[A]] = ys match { case Nil => acc case y::ys1 => helper(ys1, acc.flatMap(mutate(y, _))) } helper(xs, List(Nil)) } ...