30 May 2016

몇주전에 성신님께서 python에서의 범위 표현에 대해 질문하셨었다.

    >>> a = [0, 1, 2]
    >>> a[0:2]
    [0, 1]

인 경우, 어째서 a[0:2]는 [0, 1, 2]가 아닌 [0, 1]인 지 궁금하시다는 것이었다.

python에서 정수 범위를 표현할 때에는 반 열림 구간(half-open interval)을 사용한다. 반 열림 구간은 시작과 끝을 a, b로 한 경우 a <= x < b 인 x(x는 정수)의 집합을 의미한다. 만약, 닫힘 구간을 사용한다면 a <= x <= b인 x의 집합일 것이다.

반 열림 구간을 사용할 때에는 닫힘 구간에 비해 여러가지 장점이 있다.

1. 공집합이나 비어있는 구간을 쉽게 표현할 수 있다.

    >>> range(0, 0)
    []

만약 닫힘 구간으로 공집합을 나타내고자 한다면, 아래와 같을 것이다.

    >>> range(0, -1)

2. 구간의 끝 값에 시작 값을 빼주면 구간의 크기를 쉽게 알 수 있다.

    >>> len(range(10))
    10
    >>> len(range(1, 10))
    9

3. range를 합치는 경우, 훨씬 직관적이다.

    >>> range(0, 2) + range(2, 4)
    [0, 1, 2, 3]

닫힘 구간을 사용하는 경우에는 아래와 같을 것이다.

    >>> range(0, 2) + range(2, 4)
    [0, 1, 2, 2, 3, 4]

4. list의 인덱스 범위를 쉽게 표현할 수 있다.

    >>> l = [1, 2, 3, 4]
    >>> for i in range(0, len(l)):
    ...     print l[i]

이와 같이, 반 열림 구간을 사용하면 여러모로 직관적이고 편리하다. 그럼에도 불구하고 PHP이나 ruby와 같은 몇몇 언어는 닫힘 구간을 사용하는 경우가 있다. 정확한 이유는 모르겠지만, 아마 정수 이외의 값을 range로 다루기 위함이 아닐까 싶다. 실제로 PHP와 ruby에서는 문자의 range를 생성할 수 있다.

29 May 2016

4달 전부터 neovim을 사용하고 있다. IDE보다 텍스트 에디터를 선호하게 된 이후로 vim, sublime text, atom 등의 텍스트 에디터를 써왔는데 지금은neovim에 무척만족하고 있고, 별다른 이슈가 없다면 neovim을 계속 사용할 생각이다.

neovim의 비전에 공감이 가기도 했지만, neovim을사용하게 된 직접적인 이유는 비동기 플러그인이 가능한Plugin UI architecture를 가지고 있기 때문이었다.

그동안 게임 개발을 위해 주로 Unity3d 엔진과 C#을 사용했는데, 기본 IDE인 MonoDevelop이 썩 마음에 들지 않았다. 미묘하게 반응성이 안 좋은 것도 그렇고, 전반적으로 내 입맛에 맞게 세팅해두고 사용하기도 어려웠다. Windows 환경에서 개발한다면 Visual Studio를 사용하는 방법도 있었지만, OSX를 사용하는 나에겐 적절한 대안이 아니었다. 당시에 주로 사용하던 sublime text를 사용하려고 했지만, 적어도 나에겐 C#은 자동완성 기능 없이 코딩하기에는 너무 고통스러운 언어였다. 그래서 찾았던 것이 omnisharp-vim이었다.

omnisharp-vim은 vim을 C# IDE처럼 쓸 수 있게 해주는 플러그인이다. 다만 vim이 비동기 플러그인 제작이 어렵기 때문에, 자동완성 후보를 가져오는 동안 vim 자체가 blocking 되는 이슈가 있었다. 우리 프로젝트에서는 그 blocking 시간이 0.5~1초 정도 되었는데, 이래서는 텍스트 에디터를 쓰는 보람이 없었다. 훌륭하게도, omnisharp-vim의 IDE 기능들은 OmniSharp server라는 서버로 나누어져 있었다. 이전에 sublime text 플러그인 중 anaconda라는 python IDE 플러그인이 서버-클라이언트 구조로 비동기 자동완성을 구현한 것을 본 적이 있었기 때문에 omnisharp-sublime이라는 비동기 자동완성 플러그인을개발해서 사용했었다.

이런 경험을 하면서 아쉬웠던 것은 vim의 플러그인들이 동기 방식으로 동작한다는 점이었다. 이전부터 vim을 주력으로 쓰려고 시도할 때마다 걸렸던 것은 플러그인, 특히 자동 완성 플러그인을 사용하면 vim이 비약적으로 느려진다는 점이었다. 텍스트 에디터 역할 본연에만 집중하고 나머지는 shell을 활용하는 작업 흐름은 마음에 들었지만, IDE 환경에서 개발을 시작했던 나에겐 자동완성을 완전히 포기하기는 쉽지 않았다.

neovim은 이 문제를 훌륭하게 해결했다. 그 뿐만 아니라, VimL이 아닌 python, lua, nodejs, ruby 등 이미 익숙한 언어로 플러그인을 손쉽게 개발할 수 있게 해주었다. neovim 플러그인 중, deoplete을 사용하면 간단하게 원하는 언어에 대한 비동기 자동완성을 구현할 수 있다. 실제로 급한데로 omnisharp-vim의 자동완성 부분만 deoplete를 통해 비동기자동완성을 하는 플러그인을 짜서 사용했는데, vim으로 Unity C# 코딩을 원활하게 할 수 있었다.

neovim에서는 그동안 vim으로는 어려웠던 무거운 자동완성 플러그인도 사용할 수 있게 되었다. 적어도 자동완성이 필요한 개발자가 vim을 외면하게 문제를 해결한 것이다. python, ruby, nodejs등으로 손쉽게 플러그인을 구현할 수 있는 점도 이슈가 생기면 플러그인을 개발해서 해결하면 된다는 안정감을 준다.

24 May 2016

목적

대부분의 개발에서 코딩과 결과물을 확인하는 주기를 짧게 하는 것은있게 생산성에 도움이 될 뿐만 아니라 좀 더 즐거운 개발이 가능하게 합니다. 작성한 코드로 결과물이 발전해나가는 것을 빠르게 확인하고, 목표를 작게 자르고 달성해나가는 것은 정말 즐겁고 보람있습니다.

이 글의 목적은 cocos2d-x(jsb) 와 browsersync를 활용하여, 코드 저장 즉시 결과물을 확인할 수 있는 live reload를 구성하는 것입니다. live reload는 코딩과 결과물까지의 확인까지의 주기를 매우 짧게 해주며, 이를 통해 빠르고 즐겁게 게임 개발을 할 수 있게 도와줍니다.

소개

cocos2d-x (javascript)

cocos2d-x는 2D 게임 개발을 위한 오픈소스 멀티 플랫폼 프레임워크입니다. 유니티를 제외하면 2D 모바일 게임 개발을 위해 가장 흔히 선택되는 프레임워크이기도 합니다. cocos2d-x를 사용할 때에는 개발 언어로 C++, lua, javascript 중 하나를 선택할 수 있습니다. 구조는 아래와 같습니다.

cocos2d-x의 아키텍쳐

이중, 이번에 사용할 것은 javascript API입니다. javascript API를 사용하면, 엔진으로 웹에서는 Cocos2d Javascript 엔진을, 네이티브 플랫폼에서는 C++ engine을 사용할 수 있습니다. 모든 API가 완벽하게 호환되는 것은 아니지만, 대부분의 API가 호환되며, javascript로 게임을 개발하면 하나의 소스로 Web, Android, iOS등 다양한 플랫폼을 타겟으로 빌드를 할 수 있습니다.

Browsersync

Browsersync를 사용하면 웹 개발에서 live reload를 구성할 수 있습니다. 적절하게 세팅해주면, 코드 및 리소스가 변화하는 즉시 브라우저에 반영됩니다. Browersync는 gulp와 grunt 등의 node용 빌드 툴들과 통합될 수 있습니다.

구성하기

requirements

  • node

cocos2d-x 설치

https://github.com/cocos2d/cocos2d-x 를 참고하여 cocos2d-x를 설치합니다.

프로젝트 생성

터미널에서 아래와 같이 명령어를 입력해줍니다. (boilerplate는 프로젝트 이름입니다.)

$ cocos new -l js boilerplate

프로젝트 실행해보기

cocos의 기본 기능으로 web에서 프로젝트를 실행해봅니다.

 $ cocos run -p web

npm 프로젝트 시작하기

$ npm init

gulp와 browsersync 설치하기

https://github.com/gulpjs/gulp/blob/master/docs/getting-started.md

 $ npm install --global gulp-cli
 $ npm install --save-dev gulp browser-sync

gulpfile 만들기

실질적으로 이 부분이 프로젝트를 live reload 되도록 구성하는 부분입니다. 프로젝트 루트 경로에 gulpfile.js를 아래와 같이 만들어 줍니다.

var gulp = require(‘gulp’); var browserSync = require(‘browser-sync’).create();

gulp.task(‘browser-sync’, function() { browserSync.init({ server: { baseDir: “./” } });

gulp.watch("src/*.js").on('change', browserSync.reload);
gulp.watch("./index.html").on('change', browserSync.reload); });

실행 및 테스트

 $ gulp browser-sync

를 실행하면 웹브라우저에서 위에서 실행해봤던 Hello World 화면이 뜰 것입니다. 이 상태에서 src/app.js 파일을 수정하고 저장하면, 해당 내용이 웹브라우저에 자동으로 반영되는 것을 확인할 수 있을 겁니다.

나아가서

본 포스트에서는 cocos2d-x (javascript)와 browsersync, gulp를 사용하여 live reload를 구성해봤습니다. gulp를 사용하기 때문에 나아가, 자신의 환경과 문제에 맞춰 다양한 빌드 프로세스와 live reload를 연동할 수 있습니다. 예를 들어,

  • browserify나 webpack으로 CommonJS 스타일로 모듈 사용하기
  • babel을 연동하여, ECMAScript 6 사용하기
  • javascript 대신 coffeescript 사용하기
  • 리소스 빌드 파이프라인 추가하기

등 여러가지 방식으로 응용할 수 있습니다.

06 Aug 2014

예전부터 하려고 했지만, 작심삼일로 끝나버린 것이 한두가지가 아니다.

  1. 블로그에 주기적으로 글 쓰기
  2. 운동일지 쓰기
  3. 영어 공부 - 스피킹 맥스, 듀오링고
  4. 일기 쓰기
  5. 일본어 복습 & 단어 외우기
  6. GTD에 맞춰서 개인 일정 관리하기
  7. evernote로 개인 메모하고 리뷰하기
  8. 뽀모도로 테크닉 활용하기

그런 반면, 작심삼일로 끝나지 않고 성공했던 것도 몇가지 있다.

  1. 운동하는 습관 들이기
  2. 다이어트
  3. 운전면허 따기

성공한 것은 몇가지 안되서 민망하긴 하지만, 어떤 차이점이 있었는 지 생각해보자. 일단 가장 먼저 눈에 띄는 것은 운전면허 따기. 성공/실패가 확실하고, 비교적 난이도도 낮다. 그리고 장기적인 프로젝트라기보다는 단기적인 목표이다. 실제로도 2주 정도 밖에 안걸렸다. 앞으로 했으면 하는 것 중에 이런 속성을 지닌 것은 별로 많지 않을 것 같고, 있더라도 달성까지는 잘 할 자신이 있다.

지금은 수술 때문에 어쩔 수 없이 쉬고 있지만, 운동하는 습관을 들이는 것은 1년 반정도 유지한 것으로 보아, 성공적이었다고 볼 수 있을 것 같다. 운동을 전혀 안하고 살던 나에게는 나름대로 만족스러운 성과이다. 일주일에 3번가량 크로스핏을 하며, 자전거도 자주 타고 있다. 크로스핏은 시간과 요일이 정해져있다는 점에서 지켜지기 쉬운 것 같다. 운동을 하는 습관을 만들 수 있었던 것은 일정이 정해져 있다는 점이 크게 작용한 것 같다.

결국은 일정인 것일까? 다만, 그 일정이 ‘매일’인 경우 잘 지켜지지 않았던 것 같다. 일기 쓰기 같은 경우도 그랬고, 영어 공부하기, 운동일지 쓰기도 그렇다. 이런 것들은 매일하기로 했지만, 하루 쉬는 순간부터 안하게 되었던 것 같다. 이런 ‘실패’에 대해서 좀 더 유연해질 필요가 있을 것 같다. 계획을 세울 때, 이런 실패에 대한 Plan B를 세울 필요가 있을 것 같다. 예를 들어, ‘일기를 쓰는 것에 실패하면 그 다음날에 일기를 빼먹은 이유를 간단하게 적고 넘어간다’라고 계획을 세우는 방법도 괜찮을 것 같다.

너무 조바심을 내는 것도 좋지 않은 것 같다. 예를 들어, 일본어 복습 & 단어 외우기를 충실히하면서 매일 영어 공부를 병행하는 것은 욕심이 과한 것 같다. 한번에 한가지에 집중하는 편이 달성하는 것에 도움이 될 것 같다. 잊고 넘어가는 경우도 줄어들 것 같고.

성취감을 느낄 수 있도록 하는 것도 중요한 것 같다. 요즘 성취감을 느끼는 빈도가 무척 적은 편인데, 이 부분을 개선한다면 작심삼일하는 경우도 줄어들지 않을까? 개인 업적 관리 시스템 같은 것이 있으면 좋을 것 같다. 찾아봐야겠다. ios appstore에서 “Rare Candy”라는 앱을 찾았다. 이걸 한 번 써봐야겠다.

17 Jun 2014

크로스핏을 시작한지 5개월 가량이 지났다. 체력과 잔근육은 약간 늘었지만 만족스럽지는 않다. 항상 내일부터는 더 열심히 해야겠다고 결심하지만, 그런 결심이 항상 그렇듯 상황과 기분이 조금만 달라져도 없던 일로 하기 일쑤이다. 아무래도 운동일지를 글로 남겨야겠다.

2014년 06월 17일 (화)

오늘은 크로스핏을 쉬었기 때문에 키핑 풀업과 T2B라도 연습하기 위해서 공원에 갔다. 비참하게도 키핑 풀업은 한 세트에 5회 이상 하기 힘들었고, T2B 역시 8회를 넘기기 힘들었다. 원인은 메달린 상태를 유지가 되지 않는다는 점. 실험을 위해 철봉에 메달려서 버티기를 시도했지만, 30초도 버티기 힘들었다. 10초만 넘어도 손이 풀리기 시작해서, 20초가 되면 더 이상 버틸 수가 없는 상태가 되었다. 예전에는 1분정도는 버텼었던 것 같은데 충격적인 결과였다.

일단 바에 메달려서 버티는 훈련이 필요할 것 같다. 아래와 같이 훈련을 진행해보고자 한다.

  • 2일에 1회 이상 바에 매달리기 30초씩 3세트
  • 일주일 간격으로 매달리는 시간을 10초씩 늘린다

2014년 06월 18일 (수)

WOD

CrossFit Technique / Efficiency Thrusters and Kettlebell Swings

Conditioning

5:00 AMRAP of: * 5 KBS 32/24 * 10 WBS

Rest 5:00

5:00 AMRAP of:

  • 5 T2B
  • 10 Supermans

Rest 5:00

5:00 AMRAP of:

  • 5 Pull-ups
  • 5 Thrusters 95/65#

추가로 바에 매달리기를 해봤는데 60초를 버티는 것이 가능했다. 17일에는 철봉이 미끄러워서 버티기 힘들었던 듯.

2014년 06월 20일 (금)

WOD

Threshold Training 7 Rounds of: 2:00/4:00

  • 200m Sprint
  • 10 Burpee Box Jumps
  • ME KBS 24/16

케틀벨 스윙을 빠르고 편하게 하는 방법을 중간에 터득했다. 아직 감을 잡는데 시간이 필요하곘지만.

2014년 06월 22일 (일)

크로스핏을 쉬고 자전거 타고 팔당에 다녀왔다. 잠깐 쉬는 시간에 스트릭 풀업 5회씩 4세트를 했다.

2014년 06월 23일 (월)

WOD

Strength

  • Bench Press x 3
  • Find a new 3RM

Conditioning

  • 5 RFT
  • Row 30 cal
  • 15 Wallball Shots 20/14#

Record

165lbs / 15:10(14lbs)

벤치 프레스 3RM은 165lbs를 기록했다. 시간이 좀더 있었다면 175lbs까지는 성공했을 것 같다. 추가로 싯업 100회를 했다.

© Song Jaehak. All rights reserved. Powered by GitHub Pages