언어
-
[Python] Tip - 모든 함수, 클래스, 모듈에 docstring을 작성언어/파이썬 & 장고 2017. 1. 15. 18:36
파이썬에서 문서화는 언어의 동적 특성 때문에 극히 중요합니다. 파이썬은 코드 블록에 문서를 첨부하는 기능을 기본으로 지원합니다. 대부분의 다른 언어와는 다르게 프로그램 실행 중에 소스 코드에 첨부한 문서에 직접 접근할 수 있습니다.예를 들어 함수의 def 문 바로 다음에 docstring을 직접 작성하여 문서를 추가할 수 있습니다.def palindrome(word): """ Return True if the given word is a palindrome. """ return word == word[::-1] # 함수의 __doc__라는 특별한 속성에 접근하면 파이썬 프로그램 자체에 포함된 docstring을 추출할 수 있음 print(repr(palindrome.__doc__)) # 결과 # '\n ..
-
[Python] Tip - 내장 알고리즘과 자료구조언어/파이썬 & 장고 2017. 1. 15. 18:16
많은 데이터를 처리하는 파이썬 프로그램을 구현하다 보면 결국 사용자가 작성한 코드의 알고리즘 복잡도 때문에 속도가 떨어지는 현상을 보게 됩니다. 이는 보통 파이썬 언어의 속도 때문에 생기는 결과가 아닙니다. 이런 문제는 최적의 알고리즘과 자료구조를 사용하지 않아서 일어났을 가능성이 더 큽니다.속도 이외에도 공통 알고리즘과 자료구조를 사용하면 좀 더 편해집니다.더블 엔디드 큐collections 모듈의 deque 클래스는 더블 엔디드 큐(double-ended queue)입니다. deque는 큐의 처음과 끝에서 아이템을 삽입하거나 삭제할 때 항상 일정한 시간이 걸리는 연산을 제공합니다. 이와 같은 기능은 선입선출(FIFO, First-In-First-Out) 큐를 만들 때 이상적입니다.from collec..
-
[Python] Tip - 지역시간은 time이 아닌 datetime으로 표현언어/파이썬 & 장고 2017. 1. 7. 16:28
협정 세계시(UTC)는 시간대에 의존하지 않는 표준 시간 표현입니다. UTC는 유닉스 기원 이후로 지나간 초로 시간을 표현하는 컴퓨터에서 잘 동작합니다. 하지만 사람에게는 잘 맞지 않습니다. 사람이 사용하는 시간은 현재 있는 위치를 기준으로 합니다. 사람들은 'UTC, 15:00 - 7시'가 아니라 '정오' 혹은 '오전 8시'라고 말합니다. 프로그램에서 시간을 처리해야 한다면 사람이 이해하기 쉽게 UTC와 지역 시간 사이에서 변환해야 합니다.파이썬은 두 가지 시간대 변환 방법을 제공합니다. 내장 모듈 time을 사용하는 이전 방법은 치명적인 오류가 일어날 가능성이 큽니다. 내장 모듈 datetime을 사용하는 새로운 방법은 커뮤니티에서 만든 pytz 패키지의 도움을 받아 훌륭하게 동작합니다.datetim..
-
[Python] Tip - copyreg로 pickle을 신뢰할 수 있게 하기언어/파이썬 & 장고 2017. 1. 7. 15:51
내장모듈 pickle은 파이썬 객체를 스트림으로 직렬화하거나 바이트를 객체로 역직렬화하는 데 사용합니다. pickle로 만든 바이트 스트림을 신뢰할 수 없는 부분과 통신하는 데 사용하면 안됩니다. pickle의 목적은 바이너리 채널을 통해 사용자가 제어하는 프로그램 간에 파이썬 객체를 넘겨주는 것입니다.pickle 모듈의 직렬화 포맷은 설계 관점에서 안전하지 못합니다. 직렬화한 데이터는 원래의 파이썬 객체를 재구성하는 데 필요한 프로그램을 담습니다. 이는 악성 pickle 페이로드(payload)로 파이썬 프로그램에서 해당 페이로드를 역직렬화하는 부분을 망가뜨릴 수 있음을 의미합니다.이와 달리 json 모듈은 설계 관점에서 안전합니다. 직렬화된 JSON 데이터는 객체 계층에 대한 간단한 설명을 포함합니다..
-
[Python] Tip - 재사용 가능한 try/finally 동작을 만들려면 contextlib와 with 문을 고려언어/파이썬 & 장고 2017. 1. 6. 22:27
파이썬의 with 문은 코드를 특별한 컨텍스트에서 실행함을 나타내는 데 사용합니다. 예를 들면 with문에 상호 배제 잠금을 사용하여 잠금이 설정되어 있는 동안만 들여 쓴 코드를 실행함을 나타냅니다.lock = Lock() with lock: print('Lock is held') Lock 클래스가 with 문을 제대로 지원하는 덕분에 위의 코드는 다음의 try/finally 구문에 상응합니다.lock.acquire() try: print('Lock is held') finally: lock.release() try/finally 구문에서 반복되는 코드를 작성할 필요가 없는 with 문 버전이 더 낫습니다. 내장 모듈 contextlib를 사용하면 객체와 함수를 with 문에 사용할 수 있게 만들기가 쉽..
-
[Python] Tip - functools.wraps로 함수 데코레이터를 정의언어/파이썬 & 장고 2017. 1. 6. 21:33
파이썬에는 함수에 적용할 수 있는 데코레이터라는 특별한 문법이 있습니다. 데코레이터는 감싸고 있는 함수를 호출하기 전이나 후에 추가로 코드를 실행하는 기능을 갖췄습니다. 이 기능으로 입력 인수와 반환 값을 접근하거나 수정할 수 있습니다. 이 기능은 시맨틱 강조, 디버깅, 함수 등록을 비롯해 여러 상황에 유용합니다.예를 들어 함수를 호출할 때 인수와 반한 값을 출력하고 싶다고 가정합니다. 특히, 재귀 호출에서 함수 호출의 스택을 디버깅할 때 도움이 됩니다. 그럼 이런 데코레이터를 정의해보겠습니다.def trace(func): def wrapper(*args, **kwargs): result = func(*args, **kwargs) print('%s(%r, %r) -> %r' % (func.__name__..
-
[Python] Tip - 진정한 병렬성을 실현하려면 concurrent.futures를 고려언어/파이썬 & 장고 2017. 1. 6. 21:13
파이썬 프로그램을 작성할 때 성능을 충족해야 하는 경우가 있습니다. 코드를 최적화한 이후 조차도 프로그램이 여전히 원하는 수준보다 훨씬 느리게 실행할 수도 있습니다. CPU의 코어 수가 늘어나는 현대의 컴퓨터에서는 병렬성이 한 가지 해결책이라고 봐도 무방합니다. 코드의 연산 부분을 여러 CPU 코어에서 동시에 실행할 수 있게 독립적으로 동작하는 부분으로 나눈다면 어떨까요? 불행하게도 파이썬의 전역 인터프리터 잠금(GIL)이 스레드에서 진정한 병렬성을 막으므로 이 옵션은 사용할 수 없습니다. 일반적으로 제안할 수 있는 다른 방법은 가장 성능이 중요한 코드를 C언어 확장 모듈로 재작성하는 것입니다. C로 작성하면 하드웨어에 더 가까워지고 파이썬보다 빨리 실행할 수 있어서 병렬화할 필요가 없어집니다. C확장도..
-
[Python] Tip - 많은 함수를 동시에 실행하려면 코루틴을 고려언어/파이썬 & 장고 2017. 1. 6. 20:35
파이썬 프로그래머는 스레드를 사용하여 여러 기능을 동시에 실행하는 것처럼 보여줄 수 있습니다. 하지만 스레드를 사용하는 데는 크게 세 가지 문제가 있습니다.스레드들이 서로 안전하게 동작하도록 조율하려면 특별한 도구가 필요합니다. 따라서 스레드를 사용하는 코드가 절차적인 싱글 스레드 코드보다 이해하기 어렵습니다. 또한 이런 복잡성 때문에 시간이 지날수록 스레드 코드를 확장하거나 유지보수하기 어렵습니다.스레드에는 메모리가 많이 필요합니다 (스레드당 약 8MB 정도). 많은 컴퓨터에서 스레드를 수십 개 가량 실행할 때는 문제가 되지 않습니다. 하지만 프로그램이 함수 수천 개를 동시에 실행한다면 문제가 발생합니다. 이러한 함수는 사용자가 서버에 보내는 요청, 화면의 픽셀, 시뮬레이션의 입자에 대응할지도 모릅니다..
-
[Django] uWSGI - ssl error decryption failed or bad record mac 에러 해결법언어/파이썬 & 장고 2017. 1. 6. 17:57
ssl error decryption failed or bad record mac 에러는 PostgreSQL의 isolation level을 설정할 때에 나는 에러입니다. self.conn.set_isolation_level(_ext.ISOLATION_LEVEL_AUTOCOMMIT) 과 같은 로직이 있는데 해당 부분이 에러를 낼 때도 있고 내지 않을 때도 있습니다. 원인이 문제는 uWSGI의 fork가 끝날 때 발생합니다. 마스터 프로세스로 여러 프로세스들에 대해 작업이 진행될 때, uWSGI는 마스터 프로세스 내의 어플리케이션들을 초기화하고 각각의 worker 프로세스로 어플리케이션을 복사합니다. 여기서 문제는 만약 어플리케이션을 초기화 할 때, 데이터베이스의 connection이 open된다면 여러 ..
-
[Javascript] 서버시간 구하기언어/자바스크립트 2017. 1. 4. 15:34
시간을 구하는 Date 객체가 있지만 Date()를 사용하면 사용자의 컴퓨터 시간을 참조하여 보여줍니다. 만약 사용자가 시간을 하루 전으로 돌리면 현재시간이 아닌 하루 전의 시간이 보여지게 됩니다. 자바스크립트는 클라이언트 사이드 언어이기 때문에 자바스크립트 자체로만으로는 서버 시간을 표시 할 수가 없기 때문에 서버의 시간을 가져올 중간 매개체인 XMLHttpRequest를 사용합니다. XMLHttpRequest 개체는 클라이언트와 서버 중간에서 요청과 결과를 전달하는 역할을 합니다.let xmlHttp; if (window.XMLHttpRequest) { xmlHttp = new XMLHttpRequest(); // IE 7.0 이상, 크롬, 파이어폭스 등 } else if (window.ActiveX..