기본 콘텐츠로 건너뛰기

8월, 2016의 게시물 표시

docker+alias를 사용해서 golang 편하게 쓰기

이 글은 docker 설치를 했다는 가정에서 진행한다.

먼저 go docker 버전을 가져오자
docker pull 해도 되지만 필요한 걸 추가할 수도 있을 것 같아
Dockerfile 을 만들었다.
FROM golang:1.7-alpinego 1.7을 비교적 가벼운 alpine linux버전에 올리자. docker build .해서 image를 만들자 docker images를 해서 확인할 수 있다. alpine 이 아니라 그냥 1.7도 docker pull golang:1.7 해서 가져와봤는데 
$ docker images
REPOSITORY                  TAG                 IMAGE ID            CREATED            SIZE
golang                      1.7-alpine          52493611af1e        5 days ago          241.1 MB
golang                      1.7                 fe25c00086fb        5 days ago          669.6 MB
용량 차이가 제법 난다. 1.7은 안쓸거니까 docker rmi golang:1.7 해서 바이바이.
docker run -it --rm --name migolang golang:1.7-alpine go
작동을 확인해보자. 잘되면 OK. golang:1.7-alpine이 불편하면 docker build -t migolang . 과 같이 태그를 지정할 수도 있다. docker run -it --rm --name migolang migolang go 처럼 쓸 수 있는 것.
옵션에 대해 구구절절 설명을 좀 하면 docker run -it --rm --name migolang golang:1.7-alpine go -it 옵션은 -i -t 를 붙여서 쓴건데 -i 입력을 유지하는 옵션이고 -t는 TTY 즉 docker 에서 일어난 결과를 화면 포워딩 하는 것으로 사…

ReactiveX(Rx), Promise, 그리고 Future

Rx를 하다보니 fiber/future도 새롭게 보인다.
가령 비동기 구간을 setTimeout -> ..... , 1000 으로 하는 구현을 해보자.
Rx.Observable.create (observable)->
  # callback block
  setTimeout ->
    observable.onNext "<결과값>"
  , 1000
.subscribe (res)->
  console.log res 요건 Promise로 풀면
new Promise (resolve, reject)->
  # callback block
  setTimeout ->
    resolve "<결과값>"
  , 1000
.then (res)->
  console.log res 거의 같은 모양을 하고 있다.
그 fiber/future로 풀면
doSomeAsync = ->
  future = new Future()
  setTimeout ->
    future.return "<결과값>"
  ,1000
  future.wait()
console.log doAsync() 핵심은 동기에서 return 에 들어갈 부분이 대체되고 그걸 외부에서 받는 부분이랑 한 쌍을 구성한다는 점인데 future는 c coroutine library 인 libcoro(https://github.com/ramonza/libcoro)를 사용하고 있다.  사실 coroutine만 해도 c에서 구현만 http://www.chiark.greenend.org.uk/~sgtatham/coroutines.html 이렇게 다양한데. ECMA6 (coffeescript 1.10.0) 에서 반쪽짜리 코루틴이라고 말하는 generator도 같이 비교해도 봐야하지 않을까 싶어서 보니
req=(url)->
  setTimeout ->
    it.next(url.length)
 …

[삽질주의] js에선 object를 어떻게 확장하는가? .map 만들기.

http://spectrum.egloos.com/5580651
옛날 글 소환인데 map을 object 에서도 한번 해볼려고 이렇게 시도해 보았다.

> Object.defineProperty(Object.prototype, "map", {value: function(fn) {
  for (idx in this) this[idx]=fn(this[idx]); return this;
} });
> q={a:1, b:2}
> q.map(v=>v+1)
Object {a: 2, b: 3}

ECMA5부터 Object.defineProperty 를 쓸 수 있고 prototype 삽질을 막을 수 있다.

> q={a:1, b: {c: 2, d: 4}}
> Object.defineProperty(Object.prototype, "map", {value: function(fn) {
  let map=(f,arr)=>{
    for (idx in arr)
        arr[idx]=typeof arr[idx]==="object" && map(f,arr[idx]) || f(arr[idx]);
    return arr;
  }
  return map(fn, this);
}});
> q.map(v=>v+1)
Object {a: 2, b: Object}
a:2
b:Object
  c:3
  d:5

뭐 의도한대로 잘 나오긴 한다.
value 인 경우만 fn을 실행하고 object면 재귀를 사용한다.
뭐 array만 들어와도 이건 망하겠네;
google 에서 왜 [[a,2], [b,3]] 따위 자료 구조를 썼는지 어느정도 이해가 된다.