프로그래밍2016. 7. 6. 14:04

1. 여러 블로그에 있듯, 먼저 Docker toolbox for Windows를 설치한다. 이런 문서 등을 참고.


2. 그다음 %DOCKER_TOOLBOX_INSTALL_PATH%에 가서 다음과 같이 start.sh를 실행하고

"%ProgramFiles%\Git\bin\bash.exe" --login -i start.sh

3. 한참 기다리고(첫 실행 시) 고래 그림이 뜨면 끝. cmd를 열고 도커용 환경변수를 설정한다. 물론 배치 파일 내에서 실행할 경우 %i는 %%i로 바꿔야 한다.

FOR /f "tokens=*" %i IN ('docker-machine env --shell cmd default') DO %i


4. 이제 도커로 다음과 같이 텐서플로 이미지를 실행하고, 브라우저에서 주피터로 실습을 하면 된다.

docker run -it -p 8888:8888 gcr.io/tensorflow/tensorflow:latest-devel



단, 구글이 제공하는 도커 이미지는 텐서플로 0.8과 파이썬 2.7용만 있는 듯하다. 이건 그렇다 쳐도 pandas나 seaborn 같은 파이썬 라이브러리가 들어 있지 않아 매번 새로 설치하기가 번거로웠다. 따라서 도커로 새로 자신만의 이미지를 만들고 쓰는 게 나을 듯. 예를 들어 Dockerfile.을 다음과 같은 식으로 작성한다.

FROM gcr.io/tensorflow/tensorflow:latest-devel
RUN pip install seaborn
RUN pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.9.0-cp27-none-linux_x86_64.whl
RUN git clone https://github.com/rickiepark/tfk-notebooks.git
CMD jupyter notebook

pandas는 seaborn의 디펜던시이므로 seaborn 설치 시 같이 설치된다. 위에 예로 쓴 깃허브 노트북은 텐서플로 코리아 블로그 운영자의 저장소이다. 위에서는 텐서플로 0.9+파이썬 2.7 바이너리 패키지를 골랐다. 다른 패키지는 텐서플로 설치 문서를 참고.


이제 이 Dockerfile.을 어디 빈 폴더에 넣고 새로운 이미지로 빌드한다.

docker build -t merong .

merong은 새 이미지의 이름(태그)이다. 빌드 후에는 위의 4단계에서 실행할 이미지를 새 이미지 이름으로 바꾼다.

docker run -it -p 8888:8888 merong



추가: 물론 변경한 파일 내용을 계속 기록하고 싶다면 도커 컨테이너를 계속해서 갱신해야 한다. 가령 컨테이너 이름을 dev로 정해서 쓴다고 하면 다음과 같은 식으로. 사실 도커를 처음 쓰다 보니 다른 사람들은 어떻게 쓰는지 모르겠다(...).

docker run -it -p 8888:8888 --name=dev merong:dev
docker commit dev merong:dev
docker rm dev


사족으로, 이 환경에서 virtualenv를 설치하고 파이썬 3 환경으로 바꾸는 시도를 했으나, matplotlib였던가 pandas였던가가 설치되지 않았다. 포기하고 2.7 기준으로 쓰기로 함.



Posted by 필유
프로그래밍2016. 4. 8. 17:38

지난 글과 비슷한데, 이번에는 그루비(Groovy) 파일을 테스트하는 방법. 테스트는 JUnit을 이용하며, 그루비에는 이게 내장되어 있어 별도로 설치할 필요는 없다.


원리는 스칼라 때와 같다. groovy.bat를 호출하면 실행만 하고 끝나므로 테스트가 불가능하므로, 컴파일 먼저 하고 테스트를 하게 수정하는 거다. groovy.bat를 보면 .groovy 파일을 실행하는 부분은 다음과 같다.

"%DIRNAME%\startGroovy.bat" "%DIRNAME%" groovy.ui.GroovyMain %*

여기 위에 한 줄을 추가한다.


call "%DIRNAME%\startGroovy.bat" "%DIRNAME%" org.codehaus.groovy.tools.FileSystemCompiler %*

스칼라 때와 마찬가지로 groovyc.bat 파일에서 컴파일하는 부분을 가져온 거다. ScalaTest는 테스트 대상이 다른 클래스를 참조할 경우 .class 파일이 필요했는데 그루비는 그렇지는 않았다. 참조되는 클래스를 먼저 컴파일해야 테스트 파일도 실행된다. 단지 소스 파일과 다른 어딘가-_-에 생성되는 듯.


이제 아톰에서 자바를 실행하기만 하면 현재 작업하는 책에 나오는 4개 언어를 다 아톰만 가지고 쓸 수 있게 되는 셈인데... 유감스럽게도 자바는 워낙 프로젝트 기반이고 라이브러리가 많아 아톰에서 일일이 설정하는 게 더 불편할 듯싶어 포기.


자바와 스칼라는 이클립스(스칼라 IDE), 자바스크립트는 웹스톰, 나머지 언어는 아톰, 이 정도로 개발(!?) 환경을 정리할 수 있을 듯.



Posted by 필유
프로그래밍2016. 4. 6. 18:12

요즘 아톰(Atom) 에디터에 푹 빠져 모든 언어(및 마크다운, 아스키독 등 문서)를 이 에디터에서 돌려보고 있다. 자세한 건 나중에 다시 쓰고...


클로저 파일을 프로젝트 만들지 않고 파일 단위로 아톰에서 실행하기 위해 라이닝겐 배치 파일을 수정한 건 이미 깃허브에 올렸고, 오늘은 스칼라 파일이 여러 개 있을 때 실행하는 방법이다. 덧붙여 스칼라테스트(ScalaTest)도 지원하게 했다. 이건 딱히 깃허브에 올릴 수가 없어(전에 올린 것도 사실 PR 보내기도 좀 거시기한 수정이었다만) 일단 여기에 올린다.


수정 방법. scala.bat를 보면 .scala 파일을 실행하는 부분은 다음과 같다.


"%_JAVACMD%" %_JAVA_OPTS% %_PROPS% -cp "%_TOOL_CLASSPATH%" scala.tools.nsc.MainGenericRunner  %*


여길 이렇게 고친다.


set _SCALA_FILE=%~n1

set _SCALA_FILE_PATH=%~dp1


"%_JAVACMD%" %_JAVA_OPTS% %_PROPS% -cp "%_TOOL_CLASSPATH%" scala.tools.nsc.Main  %*

cd %_SCALA_FILE_PATH%

"%_JAVACMD%" %_JAVA_OPTS% %_PROPS% -cp "%_TOOL_CLASSPATH%" scala.tools.nsc.MainGenericRunner  %_SCALA_FILE%

if %ERRORLEVEL%==0 goto end

"%_JAVACMD%" %_JAVA_OPTS% %_PROPS% -cp "%_TOOL_CLASSPATH%" org.scalatest.run %~n1

goto end


설명-_-하자면... .scala 파일을 단순히 실행하는 게 아니라, .class 파일로 컴파일한 다음에 실행한다. 실행 결과 오류가 나지 않았다면 종료하고, 오류가 났다면 해당 클래스를 스칼라테스트로 다시 실행한다.


findstr /c:"import org.scalatest." "%1" > nul
if %ERRORLEVEL% == 0 goto RUN_TEST
"%_JAVACMD%" %_JAVA_OPTS% %_PROPS% -cp "%_TOOL_CLASSPATH%" scala.tools.nsc.MainGenericRunner  %*
goto end

:RUN_TEST
"%_JAVACMD%" %_JAVA_OPTS% %_PROPS% -cp "%_TOOL_CLASSPATH%" org.scalatest.run %~n1
goto end

테스트가 들어 있는 파일도 그냥 오류가 나지 않을 수 있어, 그냥 대상 파일 안에 org.scalatest를 임포트하는 텍스트가 있으면 테스트로, 아니면 그냥 실행하도록 바꿨다.


스칼라테스트(scalatest ... .jar) 파일은 스칼라의 라이브러리 폴더에 이미 있다고 가정하고 따로 클래스패스를 지정하지는 않았다.


그냥 무식한 방법. 컴파일 시 생성된 .class 파일은 지우지 않고 뒀다. 클로저와는 달리, 여러 파일 실행 시 클래스 파일이 있어야 한다.


물론 스칼라 IDE에서 스칼라테스트 플러그인을 받아서 함께 사용하는 게 더 깔끔하다. 근데 그러려면 프로젝트를 만들고 어쩌고 해야 하니까 그게 귀찮을 뿐.


Posted by 필유
프로그래밍2015. 4. 8. 16:56

@2016-8-17 [Functional Reactive Programming]이라는 훌륭한 책의 설명을 덧붙인다. 이 책은 한빛미디어에서 번역되어 나올 예정이다.

FRP는 다양한 시각에서 바라볼 수 있다.

  • 널리 사용되는 관찰자 패턴(혹은 리스너나 콜백)의 대용품
  • 이벤트기반 로직을 코딩하는 합성 가능한 모듈식 방법
  • 다른 사고방식. 프로그램을 입력에 대한 응답 혹은 데이터의 흐름으로 표현한다.
  • 프로그램 상태(state) 관리에 질서를 가져다준다.
  • 뭔가 근본적인 것. 관찰자 패턴으로 문제를 해결하려던 사람이라면 누구나 결국에는 FRP를 창시하게 됐을 것이다.
  • 표준적인 프로그래밍 언어의 경량 라이브러리로 구현이 가능하다.
  • 상태유지(stateful) 로직에 사용하기 위한 튜링완전 임베디드 언어로 볼 수 있다.

도메인 특화 언어(DSL)가 뭔지 알고 있다면, FRP를 상태유지 로직에 사용하는 최소한의 튜링완전 DSL이라고 이해해도 좋다. 입출력 부분을 빼면, 가령 어떤 복잡한 게임이든 전적으로 FRP로 작성할 수 있다. 그만큼 강력하고 표현력이 있다.

그렇다고 FRP가 ‘모 아니면 도’라는 말은 아니다. 기존 프로젝트에 쉽게 도입할 수 있고, 도입하는 규모도 원하는 만큼 정할 수 있다. (2~3쪽)


여기부터는 옛날 글.

  1. 코널 엘리엇의 스택오버플로에 쓴 글이 제일 유명하다. 근데 난해하다. (이하 링크 모두 새창)
    http://stackoverflow.com/questions/1028250/what-is-functional-reactive-programming/1030631#1030631
  2. 그리고 이걸 오현석 님이 번역한 게 있다. 다만 이 글 역시 너무 어렵다. -_-
    http://www.enshahar.me/2014/07/frp.html
  3. 스택오버플로의 다른 답변으로 이런 재미난 글도 있다(재미는 있는데 정독할 필요는 없음).
    http://paulstovell.com/blog/reactive-programming
  4. 3과 같은 맥락에서 다른 답변 중 핵심을 짚은 설명으로 이런 게 있다.
    -의미론적: FRP is all about describing a system in terms of time-varying functions instead of mutable state.
    -구문론적: The essence of functional reactive programming is to specify the dynamic behavior of a value completely at the time of declaration.
  5. 4를 눈으로 확인할 수 있는 더 쉬운 예가 elm 예제 페이지다.
    http://elm-lang.org/learn/What-is-FRP.elm (예제 주소가 바뀌어 다음 주소로 수정@2015-12-28)
    http://elm-lang.org/examples/mouse-position (예제가 사라져 다음 주소로 수정@2016-8-17)
    http://elm-lang.org/examples/drag
  6. 참고로 elm은 [Seven More Languages in Seven Weeks]에서 다루는 언어다. [Seven Languages in Seven Weeks]가 국내 반응이 좋다면 이 책도 낼 수도 있...겠는데 그럴 일은 없겠지. → 없다. (@2016-8-17)



Posted by 필유
음악2008. 9. 29. 14:29

새 버전 테스트 겸.

'음악' 카테고리의 다른 글

lover, you should've come over  (0) 2008.10.09
Rex Foster - Roads of Tomorrow  (0) 2008.10.02
cranky, 기억하고 있습니까?  (3) 2008.09.07
토이 - 뜨거운 안녕  (0) 2008.08.31
작은 은총  (1) 2008.08.25
Posted by 필유