11월, 2012의 게시물 표시

curses 라이브러리 간단한 정리

이미지
Ruby에서의 curses 라이브러리가 windows XP의 command 창에서도 동작하길래 몇가지 명령어만 간단히 정리해 봅니다. 기본 형식 init_screen으로 실행하고 ensure 문을 사용해서 반드시 close_screen이 호출되도록 한다 require 'curses' include Curses init_screen begin # 실행코드 ensure close_screen end 커서 관련 setpos 함수로 커서 위치 지정하고 curs_set 함수로 커서를 보이게 하거나 감춘다 화면 입출력 출력은 addstr 함수, 한글자 입력은 getch, 문자열 입력은 getstr 함수 사용자 입력을 보이지 않게 하려면 noecho 함수 호출 사용자가 enter 입력할 때까지 line buffer 방식으로 입력받으면 nocbreak 함수, 인터액티브하게 사용자가 한글자 입력할 때마다 바로 받으려면 cbreak 함수 호출 컬러 init_screen 호출 이후 start_color 함수 호출 color 사용 가능한지는 has_colors? 함수로 알 수 있고 사용가능한 색의수는 colors 함수로 알 수 있다. 색을 표시하려면 init_pair 함수로 pair에 글자색과 배경색을 지정한 다음 attron 함수로 색을 지정하고 출력한다. 색 자체를 RGB 조합으로 지정하려면 init_color 함수를 호출하면 될듯 (시험해보지 않음) init_pair(COLOR_RED,COLOR_RED,COLOR_BLACK) init_pair(COLOR_YELLOW, COLOR_YELLOW, COLOR_BLACK) setpos((lines - 5) / 2, 20) attron(color_pair(COLOR_RED) | A_NORMAL) { addstr("한글 시험") } attron(color_pair(COLOR_YELLOW) | A_BOLD) { addstr("...

교보 e 리더기 앱 깔기

지난번 포스팅에 올렸던 교보 e 리더기에 오늘 킨들 프로그램으로 아마존에서 구입한 책을 받으려니 싱크(sync)가 제대로 이루어지지 않았습니다. 리더기에는 킨들 프로그램 2.6.X 버전이 깔려있지만 최신 버전은 2.7.X. 아마도 버전 문제 때문인가보다 싶어 adb와 퀄컴 드라이버를 다시 설치하고 프로그램도 지우고 다시 설치하니 아마존에서 구매한 책들을 받을 수 있었습니다. 은근 귀찮아서 검색해 보니 DropBox 프로그램에서 프로그램을 설치하는 방법이 있네요. 간단히 정리해 봅니다. 옮기고 싶은 어플을 구글 플레이에서 받고 아스트로 관리자를 이용해 apk 파일로 만든 다음 핸드폰에서 dropbox 계정으로 옮깁니다. WIFI 접속된 상태의 eBook 리더기에서 dropbox 프로그램을 실행시키고 apk 파일을 다운 받으면 프로그램을 설치할지 물어보고 예를 누르면 바로 설치됩니다. 이제부터는 USB 케이블이나 adb 없이 필요한 프로그램을 설치할 수 있겠네요. 참 쉽죠잉~ eBook 리더기에 dropbox 프로그램을 설치하기 위해서는 일단 adb install을 사용한 이전의 방법을 사용해야 합니다. 구글 드라이브나 구글 플레이를 설치해 보려고 했지만 설정에 구글 계정이 없으므로 프로그램이 제대로 실행되지 않습니다.

ScalaFx 설치와 데모 베껴보기

이미지
ScalaFX를 설치했습니다. ScalaFX는 JavaFX를 scala에서 불러쓸 수 있도록 해 놓은 것입니다. 아직 문서가 자세하게 만들어져 있지 않아 여기저기 맨땅에 헤딩하면서 설치하고 간단한 데모 띄우기까지 성공했습니다. 먼저 JavaFX를 설치해야 합니다. 저는 Oracle Java 설치 프로그램을 받아서 그대로 실행했습니다. ScalaFX는 구글 코드에서 소스를 받아와 다음과 같이 설치했습니다. $ brew install mercurial $ hg clone https://code.google.com/p/scalafx/ $ cd scalafx $ sbt clean compile package publish-local 간단히 데모를 실행시켜보니 제대로 동작하지 않습니다. build.sbt 파일을 다루어야 한다는 것을 알게 되었습니다. 다음과 같이 ScalaFx와 JavaFx를 찾을 수 있도록 해 주었습니다. libraryDependencies += "org.scalafx" % "scalafx" % "1.0-SNAPSHOT" javaHome := Some(file("/Library/Java/JavaVirtualMachines/jdk1.7.0_07.jdk/Contents/Home")) unmanagedJars in Compile += Attributed.blank(file(System.getenv("JAVA_HOME") + "/jre/lib/jfxrt.jar")) 이제 데모를 띄워봅니다. 인터넷에서 찾은 데모 에 한국어만 바꾸어 보았습니다. 한글이 마음에 들지 않아 JavaFx 문서를 보니 CSS 방식으로 스타일을 바꿀수 있다고 합니다. 최종 수정한 소스와 스타일시트입니다. 폰트는 애플 명조로만 변경가능했는데 시스템의 다른 한글 폰트를 사용하는 방법을 찾아봐야 되겠습니다. 스타일 시트는 src/main/resources에 있지 않으면 전...

map 안의 map

Scala 예제중에 n 미만의 두 숫자 합이 소수가 되는 조합을 찾아내는 것으로 다음과 같은 것이 있습니다. 물론 나중에 나오는 for 문을 사용하면 다 간단하고 이해하기 쉽겠지요. List.range(1, n) .map(i => List.range(1, i).map(x => (i, x))) .foldRight(List([Int, Int])()) { (xs, ys) => xs ::: ys } .filter(pair => isPrime(pair._1 + pair._2) map 문 내부에 map이 있는 것을 보고 ruby에서도 지원해줄지 궁금해서 한번 시험해 보았습니다. 결론은 지원해 주네요. Scala에서 flatMap을 사용하지 않고 foldRight를 써서 엄밀하게 일대일로 대응되는 코드는 아닙니다만. (1...n).flat_map( |i| (1...i).map { |j| [i, j] }}.select { |i, j| (i+j).prime? }

소수(prime)에 대하여

다음은 stackoverflow에 올라온 scala의 소수 생성 방법 에 대한 간단한 분석(?!)입니다. 원 질문자의 소스는 다음과 같습니다. object Euler0007 { def from(n: Int): Stream[Int] = n #:: from(n + 1) def sieve(s: Stream[Int]): Stream[Int] = s.head #:: sieve(s.filter(_ % s.head != 0)) def primes = sieve(from(2)) def main(args: Array[String]): Unit = { println(primes(10001)) } } Scala 강좌에도 나온 에라스토테네스 방법입니다. Stream으로 끝이 정해지지 않은 연속된 자연수를 만들고 sieve 함수에서 stream의 뒷쪽 부분을 filter로 제거하는... 누군가의 비유대로 뱀이 자신의 꼬리를 먹는 것 같은 구현입니다. 문제는 프로그램 실행중 메모리 부족 에러가 발생한다는 것. 그에 대한 대답으로 올라온 소스는 다음과 같습니다. object Sieve { val primes = 2 #:: sieve(3) def sieve(n: Int) : Stream[Int] = if (primes.takeWhile(p => p*p 앞의 소스보다는 좀 더 이해하기 쉬운 편입니다. primes 변수는 2 부터 시작하는 stream이며 sieve 함수에서는 인자로 주어진 숫자 n이 소수인지 판단하고 소수이면 stream에 포함시키고 다음 홀수를 검사하게 됩니다. 소수중 유일하게 짝수인 2는 처음에 포함시켜버리고 홀수만 검사하되 소수 p가 n의 sqrt 값보다 작은 경우까지만 검사합니다 (p => p*p <= n). 깔끔하면서 함수적 프로그래밍을 잘 구현했습니다. 앞의 소스가 sieve stream을 def로 정의해서 매번 처음부터 소수를 구하는 반면 이번은 primes stream을 val로 정의해서 ...

Ruby는 얼마나 좋아졌을까

Ruby는 2.0 preview1 버전이 발표되었습니다. 근래 Scala를 공부했는데 특징중에 Java에 비해 크게 속도가 떨어지지 않고 객체지향과 함수형 언어를 지향한다는 것을 보고 각종 ruby와 scala를 한번 비교해 보았습니다. 여러가지 검사를 시행해야 정확하겠지만 단순히 모 사이트에 나와 있는 문제를 푸는 프로그램을 작성해 보았습니다. Fibonacci 수열중에 4000000보다 작은 값들 중 짝수값들의 합을 구하는 것입니다. 먼저 Ruby 소스. INFINITY = 1.0/0 MAX = 4000000 def fib(n) case n when 1..2 then n else fib(n-1) + fib(n-2) end end # ruby 1.9.3, jruby 1.7.0, macruby 0.12 n = 1 sum = 0 while (c = fib(n)) 다음은 scala 소스 입니다. 그리 잘 만들었다고 생각되지는 않지만 방식은 대충 같습니다. object App { def fibSumUnder(m:Int) = { def fib(n:Int):Int = if (n = m) sum else if (fibResult % 2 == 0) fibSumUnder0(n+1, sum+fibResult) else fibSumUnder0(n+1, sum) } fibSumUnder0(1, 0) } def main(args:Array[String]) = { print(fibSumUnder(4000000)) } } App.main(args) Ruby는 rvm을 사용해서 ruby 1.9.3p125, ruby 2.0.0dev, jruby 1.7.0, macruby 0.12을 설치해서 사용했고, scala는 2.9.2입니다. 프로그램 실행시간은 다음과 같은 방식으로 2번 측정해서 빠른 값을 얻었습니다. $ time ruby fib_test.rb $ time scala fib_test.scala 결과는 다음과 같습니다....

Ruby 2.0 설치

얼마전 ruby 2.0의 feature freeze가 시행되었고 preview 버전이 발표되었습니다. 더 이상의 새로운 기능 추가는 없고 버그를 잡고 속도를 빠르게 하는 작업만 남아 있는 셈이지요. 설치해 보았습니다. XCode는 설치되어 있지만 command에서 gcc가 설치되어 있지 않아서 developer.apple.com 에서 command line tool 받아서 설치 brew, rvm 이용해 ruby 설치 $ brew install autoconf $ brew install automake $ brew install libyaml $ rvm install ruby-head -C --with-readline-dir=$HOME/.rvm/usr --with-gcc=clang $ rvm use ruby-head 다음은 사용하면서 알게된 한두가지 언어의 업데이트들... &:foo 구문. map과 같은 함수에서 & 다음에 symbol을 주면 각 object에 to_proc 함수를 호출해서 반환한다는 이해하기 어려운 말이 쓰여져 있는데 예제는 간단합니다. tags.map(&:name).join(' ') 위의 구문은 다음 2가지와 같은 역할을 합니다. 마지막 라인의 것은 많이 사용하게 되는데 위와 같이 간단히 줄여쓸 수 있군요. tags.map(:name.to_proc).join(' ') tags.map{|tag| tag.name }.join(' ') lazy 구문. Scala 공부하면서 멋지다고 생각했는데 ruby에도 도입되었습니다. 무한대의 개념을 도입할 수 있다는게 큰 장점인것 같습니다. :) require 'prime' INFINITY=1.0/0 (1..INFINITY).lazy.select(:&prime?).take(100).to_a

Blogger에서 syntax highlight 사용 정리

이미지
Blogger를 사용하면서 아쉬운 점중에 하나는 code syntax highlight를 사용하기 어렵다는 것입니다. 구글링을 해 보고 좀 불편하지만 나름 동작하는 방법을 찾아냈기에 간단히 정리해 봅니다. blogger 메뉴의 템플릿을 선택하고 HTML 편집 버튼을 누른다 <head>뒤에 다음의 코드를 입력한다. (4줄중 뒤의 두줄은 scala나 sql을 쓸 일이 없다면 생략해도 되겠습니다) <link href="http://google-code-prettify.googlecode.com/svn/trunk/styles/sunburst.css" rel="stylesheet" type="text/css"/> <script src="http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.js" type="text/javascript"/> <script src='http://google-code-prettify.googlecode.com/svn/trunk/src/lang-scala.js' type='text/javascript'/> <script src='http://google-code-prettify.googlecode.com/svn/trunk/src/lang-sql.js' type='text/javascript'/> <body>를 찾아 다음과 같이 수정한다. <body onLoad="prettyPrint()"> 템플릿 저장 버튼을 누르고 빠져나온다 위와 같이 하면 dynamic view가 아닌 경우 code의 syntax highlight를 사용할 수 있습니다. dynamic view의 경우 body의 onLoad 자바 스크립트가 실행되지 않으므로(...