기본 콘텐츠로 건너뛰기

3월, 2017의 게시물 표시

[python] 간단한 getter와 setter를 구현할 때는 property, 복잡해질 경우 descriptor를 사용하자

http://meonggae.blogspot.kr/2016/11/python-getter-setter-property-setter.html 필자가 전에 한번 getter와 setter에 관련되서 글을 쓴 적이 있다. 이때 getter와 setter함수를 구현하지 말고 @property를 이용해서 구현을 하라고 했다 하지만 코드를 작성하다보면 @property가 복잡해지는 경우가 발생을 할 것이다. 이럴떄는 descriptor를 사용을 하여 코드를 좀더 깔끔하게 할 수 있다. class test: @property def t(self): return self._t @t.setter def t(self, value): print('setter 작동') self._t = 10 a = test() a.t = 10 property를 이용하여 코드를 작성을 할 수 있습니다. property를 이용하영 외부에서 _t를 접근 할 수 있도록 하였습니다. $ python3 app.py setter 작동 외부에서 t를 접근 할 때 정상적으로 t()가 실행 됬음을 확인 할 수 있습니다. 그런데 이는 외부 뿐 아니라 내부에서 접근을 할 때에도 실행이 됩니다. class test: def __init__(self): self.t = 1 @property def t(self): return self._t @t.setter def t(self, value): print('setter 작동') self._t = 10 a = test() a.t = 10 해당 코드를 실행을 시켜봅시다. $ python3 app.py setter작동 setter작동 t()가 두번 실행됬습니다. test()에서 __init__이 호출이 되면서 내부적으로 self

[알고리즘] snake게임 알고리즘

막무가네로 알고리즘을 공부하면 재미가 없으니 게임을 접목하여 다루어 보도록 하겠습니다. 게임의 대상은 스네이크 게임입니다. 많은 사람들은 어릴 때 뱀게임을 많이 해봤을 것 입니다. 이번에 다뤄볼 주제는 뱀이 움직임을 어떻게 구현을 할지 알아보겠습니다. 뱀은 크게 3가지의 경우가 있습니다 1. 가장 중요한 뱀을 움직이기 2. 음식먹기 이때 뱀은 크기가 늘어나야 합니다. 3. 뱀이 움직이는 정책   - 뱀이 움직이지 못하는 경우는 : 우측방향에서 좌측 방향으로 OR 위에 아래 방향고 같이 180도 반전되는 움직임은 막겠습니다. 순수한 알고리즘을 만드는 과정이기 때문에 음식을 먹었는지 안먹었는지 판단하는 부분은 랜덤으로 판단을 하도록 하겠습니다. def is_eat(): return random.choice([1, 0]) 랜덤으로 1, 0을 반환을 해줍니다. 실제로 게임을 만든다면 해당 함수는 뱀의 머리가 음식의 좌표와 같은지 검사를 해주면 되겠습니다. key_position_map = { 'w': [-1, 0], # up 's': [1, 0], # down 'a': [0, -1], # left 'd': [0, 1] # right } direction = key_position_map.get('d') 다음으로는 키맵핑을 한 오브젝트 입니다. direction은 현재 뱀의 방향을 나타냅니다. snake_body = [[2, 3], [1, 3],[1, 2], [1, 1]] 주인공이 되는 뱀의 좌표들 입니다. while True: key = input() new_direction = key_position_map.get(key) if new_direction and direction_check(direction, new_direction): directi

[python] datetime을 이용하여 utc값 가져오기

datetime을 이용하여 utc값을 가져와보자 import datetime def get_time(): now_utc = datetime.datetime.utcnow() return now_utc.strftime('%s') def get_utc_convert(): return (datetime.datetime.utcnow() + datetime.timedelta(hours=9)).strftime('%Y-%m-%d') get_time은 utc값을 가져와 준다. get_utc_convert는 utc값을 서울 시간 기준을 맞추어 가져와 준다. datetime은 type이 datetime이기 때문에 str으로 변환하여 사용하는 것이 안전하다

[git] stash명령을 통해 쓸데없는 커밋 방지하기

git에서는 특정 브랜치를에서 작업 중 갑자기 타 브랜치로 옮겨야 하는 경우가 종종 있다(자주 있는거 같기도 하다) 이럴 때 stash를 사용하지 않는다면 커밋을 하고 타 브랜치로 옮겨야 한다.  이때 만약 커밋을 할 타이밍이 아니라면 쓸데없이 커밋 로그가 한줄 쌓일 것이다. 이러한 것이 쌓이다보면 커밋을 보기가 싫어진다. 이럴때 stash를 이용하면 쓸데없는 커밋을 남기지 않고도 타 브랜치를 움직일 수 있다. $ git checkout -b test # test branch 생성 $ vim test.py # test.py파일 생성 '''코드수정''' :wq $ git status On branch test Changes not staged for commit: (use "git add ..." to update what will be committed) (use "git checkout -- ..." to discard changes in working directory) modified: test Untracked files: (use "git add ..." to include in what will be committed) test.py no changes added to commit (use "git add" and/or "git commit -a") (/Users/bagjeongtae/anaconda) bagjeongtaeui-MacBook-Pro:git_test bagjeongtae$ 파일을 추가를 하거나 수정을 하고나서 status 명령을 통해 어떤 파일이 생성, 갱신, 삭제가 되었느지 알 수 있다. 문제는 이러한 상태에서는 checkout, pull을 수행 할 수가 없게된다. 위와같은 상태에서 commit이나

[db] mac에서 mysql환경설정 셋팅하기 1편 - 설치 및 접속, ERROR 2002 (HY000) : Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) 해결방법

mac에서 mysql을 환경설정하는 방법에 대해서 다뤄보도록 하겠습니다. 그동안 aws에서 제공하는 rds를 사용했기 때문에 로컬 디비를 거의 안썼는데 테스트 하고 싶은것이 있어 로컬에 디비설치를 하려고 했더니 몇몇 문제가 발생하여 공유하기 위해 정리를 해봅니다. 크게 설치 및 접속, 보안 및 chatset에 대해서 알아보겠습니다. 우선 아래의 설명은 homebrew가 설치가 되어있어 brew를 사용할 수 있다는 가정하에 설명을 진행을 하도록 하겠습니다. $ brew install mysql brew를 이용하여 mysql을 설치를 해줍니다. 리눅스 같은 경우는 mysql-server를 설치를 하는데 mac에서는 mysql을 설치를 하네요 $ mysql -u root -p Enter password: ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) 접속을 시도해 보았더니 로컬 서버에 접속을 할 수 없다고 뜹니다. 에러발생 원인: 디비서버 열려있지 않음. 해결방법: 디비서버 실행 디비를 설치를 했지만 실행을 하지 않았기 때문에 위와같은 에러가 발생을 하게 됩니다. 만약 linux사용자라면 service를 이용하여 서버를 실행시키겠지만 맥에서는 service를 지원을 하지 않는것 같아 다른 방법으로 시도를 해보았습니다. $ mysql.server start Starting MySQL . SUCCESS! mysql.server 명령어를 실행을 시켜주게 되면 /usr/local/bin/mysql.server 가 실행이 됩니다.

webpack을 이용한 javascript 모듈관리

안녕하세요 멍개입니다. javascript로 구현가능 부분이 많아지면서 javascript 코드의 양이 점점 많아지고 있습니다. 코드의 양이 많아질 수록 모듈화를 통해 코드를 관리를 하게 됩니다. javascript언어 자체에서는 모듈 시스템을 지원을 하지 않기 때문에 여러가지 도구를 활용하게 됩니다 그중의 하나가 webpack입니다. 즉, webpack은 javascript 모듈관리 도구입니다. webpack말고도 commonJS나 AMD(Asynchronous Module Definition)이 있습니다. webpack은 이 두가지의 기능을 모두 지원을 하기때문에 다른 도구보다 많이 사용되고 있습니다. webpack을 사용하면 어떤식으로 모듈을 관리를 할 수 있는지 알아보겠습니다. 우선 우리는 webpack을 설치를 해야합니다. 하지만 npm이 설치되어 있다면 매우 손쉽게 설치를 할 수 있습니다. $ npm install -g webpack 로컬환경에서 전역으로 사용하기위해 -g 글로벌 옵션 설정을 해줍니다. 아래와 같이 코드를 작성해줍니다. // test.js module.exports = {message: 'webpack'}; object하나를 외부에서 사용 할 수 있도록 하였습니다. // app.js console.log(require('./test')); 이제 test모듈을 app에서 사용하기 위해 require을 사용합니다. 이렇게 만든 app은 브라우저에서 직접 실행 할 수 없습니다 webpack을 이용하여 웹브라우저에서 사용할 수 있는 형태로  컴파일을 해주어야 합니다. 컴파일을 하지 않은채 웹 브라우저에서 호출을 해보도록 하겠습니다. 1 2 3 4 5 6 7 8 9 10 < !DOCTYPE   html > < html   lang = "en" > < h

[git] hook을 이용하여 코드 스타일 검사 - pep8 검증

pep을 사용해서 매번 검사를 하는건 꽤나 귀찮은 일입니다. 이러한 검사 과정을 특정 행위를 하기 이전에 먼저 수행함으로써 귀찮음을 해결 할 수 있습니다. git hook의 pre-commit을 이용하여 커밋이 되기 이전에 pep 검사를 수행 후 결과에 따라 커밋 결정 유무를 판단을 해보도록 하는 hook을 만들어 보갰습니다. $ git status On branch master Your branch is ahead of 'origin/master' by 1 commit. (use "git push" to publish your local commits) Changes to be committed: (use "git reset HEAD ..." to unstage) new file: .app.py.swp new file: app.py new file: app2.py 커밋 대상의 파일을 보실 수 있습니다. status를 통해 app.py, app2.py가 add되어 cache되었음을 알 수 있습니다. 어떤 코드가 cache되었는지 확인을 하기 위해서는 diff의 명령어를 사용하면 됩니다. $ git diff --stahed 또는 git diff --cached # 같은 결과입니다. diff --git a/.app.py.swp b/.app.py.swp new file mode 100644 index 0000000..6cf6386 Binary files /dev/null and b/.app.py.swp differ diff --git a/app.py b/app.py new file mode 100644 index 0000000..aa07c85 --- /dev/null +++ b/app.py @@ -0,0 +1,41 @@ +''' +2017.03.04 +''' +import requests + +class a_te

[git] pylint, pep8를 사용하여 코드스타일 검사

프로젝트의 규모가 커질수록 코드 스타일 통일이 매우 중요합니다. python에서는 pylint와 pep8을 사용하여 스타일 검사가 다릅니다. 엄밀히 따지면 이둘은 약간 성격이 다릅니다. 우선 pylint에 대해서 먼저 알아보도록 하겠습니다. $ vim app.py import requests as rq def test(): print('test') if __name__ == "__main__": test() $ pylint app.py ************* Module app W:  4, 0: Found indentation with tabs instead of spaces (mixed-indentation) W:  7, 0: Found indentation with tabs instead of spaces (mixed-indentation) C:  1, 0: Missing module docstring (missing-docstring) C:  3, 0: Missing function docstring (missing-docstring) W:  1, 0: Unused requests imported as rq (unused-import) ... 중략 3종류의 메시지가 출력이 됩니다. 1. 탭을 사용하지 않고 스페이스를 사용 2. docstring을 사용하지 않음 3. 사용하지 않는 모듈을 import docstring이란? docstring은 modlue, class, function의 설명을 작성하는 부분입니다. python에서는 ''' 설명... :parameter {type} : 설명 :return {type} : 설명 ''' 의 형태로 작성이 됩니다. 그럼 위의 메시지를 바탕으로 수정을 해보도록 하겠습니다. $ vim app.p

[git] git hooks(훅)

git에서도 hook을 추가 할 수 있습니다. 프로그래밍에서 hook이란 특정 이벤트 또는 함수가 호출 되기 전,후에 호출이 되는 코드를 말합니다. git에서의 이벤츠는 커밋, 풀, 머지 등과 같은 작업으로부터 특정 스크립트를 실행을 시킬 수 있습니다. (해당 스크립트는 perl, python등과 같은 스크립트 언어로 작성이 가능 합니다.) git은 크게 local과 remote두가지로 나눌 수 있늗데 hooks또란 이 두가지경우 모든 설정을 각각 해 줄 수 있습니다. git과 연동된 프로젝트에서 .git이라는 디렉토리를 확인 할 수 있습니다. $ ls -ahl . .. .git 해당 디렉토리는 숨긴상태로 뜨기 때문에 -ahl이라는 옵션을 추가 해 줍니다. 윈도우의 경우 디렉토리 옵션에 들어가서 숨긴 폴더표시를 눌러주시면 됩니다. $ cd .git $ ls applypatch-msg.sample pre-push.sample commit-msg.sample pre-rebase.sample post-update.sample pre-receive.sample pre-applypatch.sample prepare-commit-msg.sample pre-commit.sample update.sample .git/hooks 아래에 .sample로 이미 만들어진 hooks파일이 존재합니다. 해당 훅을 사용하기 위해서는 .sample을 지워주기만 하면 됩니다. 클라이언트 훅 1.  커밋 훅 commit훅은 pre-commit, prepare-commit-msg, commit-msg, post-commit 4가지가 존재합니다. pre-commit : 커밋할 때 가장먼저 호출되는 훅입니다. 커밋 메시지를 작성하기 전에 호출이 됩니다. 이 훅에서  커밋하는 스냅샷을 검사를 합니다. 빠트린 것이 없는지, 테스트 유무를 점검을 하게 됩니다. 커밋할 때 꼭 확