Languages & Frameworks
[python] pdb : 디버깅
[python] pdb : 디버깅
2018.11.12gdb처럼 쓰면 된다. ```python(Pdb) n # 함수 진입 안하고 한줄 실행(Pdb) s # 함수 진입 하면서 한줄 실행(Pdb) l 10 def mkList2(): 11 result = [value for value in range(1000)] 12 return result 13 14 15 -> print("mkList1 : ", timeit(mkList1, number=1000), "s") 16 print("mkList2 : ", timeit(mkList2, number=1000), "s") 17 [EOF] (Pdb) b 16 Breakpoint 1 at d:\source\rapts\test.py:16 (Pdb) c mkList1 : 2.6512367244046393 s > d:\source..
[python] 성능 측정, 프로파일링(profiling)
[python] 성능 측정, 프로파일링(profiling)
2018.11.12PyCharm같은 IDE에서도 지원하기 때문에, 굳이 직접 돌리지 않아도 된다. 상단에 Run, Debug 아이콘 옆에 보면 프로파일링 다양하게 지원함. python 기본 내장 라이브러리 benchmarking 목적 : timeit profiling 목적 : cProfile 근데, 시스템 함수까지 다 출력되어 보기 불편하고 복잡하다. ``bash python -m cProfile -s cumulative file.py`` 진짜 간단하게 함수의 수행 시간을 측정하고 싶을 때 : timeit ```python from timeit import timeit def mkList1(): result = [] for value in range(1000): result.append(value) return resul..
[python] socket
[python] socket
2018.11.102017/08/25 - [Coding Syntax/etc] - Socket programming Tips socket 객체에서 로컬 (주소, 포트) 리모트 (주소, 포트) 가져오기accept 할 때 addr을 별도로 저장할 필요가 없다. ``py class SocketType`` 에 정의되어 있다.```pythonsock.getsockname() -- return local address('192.168.0.2', 31234)sock.getpeername() -- return remote address [*]('192.168.110.131', 6627)``` 그냥 socket.connect() 보다 socket.create_connection()https://docs.python.org/3/library..
[python] Flask
[python] Flask
2018.11.05http://flask.pocoo.org/docs/1.0/quickstart/#variable-rules http://jinja.pocoo.org/docs/2.10/templates/ 컨텍스트 전역 변수 수신한 HTTP request 정보에 접근하기 위해서 컨텍스트 전역 변수를 사용한다. 이런 정보들을 리퀘스트를 수신할 때 마다 뷰 함수의 인자로 넘기도록 해도 되는데, 쓸데없이 인자를 많이 가지고 있게 되는 것을 피하기 위해 플라스크는 이를 전역 변수 형식으로 제공한다. 근데 실제 전역 변수는 아니다. 멀티스레드 환경에서 못쓰니까. `` request`` 변수가 전역변수 처럼 동작하기는 하지만 실제로는 스레드들은 각각 다른 오브젝트를 처리하게 된다. 컨텍스트는 어플리케이션 컨텍스트/리퀘스트 컨텍스트로 나..
[python] docstring, 문서화
[python] docstring, 문서화
2018.10.15docstring 작성 포맷https://stackoverflow.com/questions/3898572/what-is-the-standard-python-docstring-formatgoogle style은 다음과 같은데 타입 적는게 :가 아니라 괄호 안에 들어가서 마음에 안들고, 들여쓰기 때문에 가로축도 많이 차지하고, VSCode에서 힌트 팝업으로 보여줄 때도 bold나 글꼴 크기같은게 안예쁘게 들어간다.```pyArgs: path (str): 설명Returns: int: 설명```Sphinx와 잘 붙는건 reST 스타일인데, ``py :param v1:``과 ``py :type v1:``을 따로 적어주어야 한다는 점이 마음에 들지 않고 가독성도 썩 좋지 않은 것 같다.가독성은 Numpydoc 스타..
[C++] 다양한 mutex, lock 중 뭘 써야하나.
[C++] 다양한 mutex, lock 중 뭘 써야하나.
2018.09.13그냥 락 거는 것 보다, 다음 API들을 사용하는게 좋다. 스코프를 벗어나면 자동으로 해제되는 lock을 걸기 위해서는 (since C++ 17 || boost)```cpp#include std::mutex mutex1;std::mutex mutex2;std::scoped_lock lock(mutex1, mutex2);// lock.unlock();```이는 ``cpp std::lock_guard``에 여러 mutex들을 한번에 lock할 수 있는 기능을 추가한 완전한 상위 호환 API다. mutex 하나 넘길 때도 퍼포먼스 걱정 안해도 된다고 함. 다양한 기능을 지원하는 unique_lockhttps://github.com/CppKorea/CppConcurrencyInAction/wiki/Chapter..
[C++] 생성자에서 throw하면(exception) 객체가 없어질까? / thread는 start() 함수로?
[C++] 생성자에서 throw하면(exception) 객체가 없어질까? / thread는 start() 함수로?
2018.09.12결론부터 말하자면 없어진다.함수들이 전후 호출 순서 종속성이 생기는 경우 생성자에서 처리하는게 깔끔하다. 생성자에서 처리 안하고 ``c f1()`` 호출하고 ``c f2()`` 호출하는 식이면, 이 호출 순서를 강제할 수 없으니 ``c f2()``에서 내부에 종속성 변수가 ``c NULL``인지와 같이 잘 초기화되었는지 체크해주는 루틴이 들어가 줘야 한다. 생성자는 리턴이 안되니 exception 처리가 애매한 부분이 있었으나 throw하면 없어진다고 하니 그냥 생성자에서 초기화해주는게 좋을 것 같다. https://kldp.org/node/48121 C++ Standard 15.2Quote:An object that is partially constructed or partially destroyed ..
[C++] thread는 context가 필요하다.
[C++] thread는 context가 필요하다.
2018.09.11전역 함수를 threadMain으로 지정해 실행하는건 그냥 다른 언어 처럼 하면 되는데, 객체의 메서드를 threadMain으로 지정하는건 몇 가지 신경써야 할 부분이 있다.보통 다른 언어 같으면, `` Thread`` 클래스 상속받아서 ``c t.run()`` 해주면 끝인데, C++은 그렇지 못하다. 구식 방법원래 클래스 내부의 메서드를 threadMain으로 지정하기 위해서는, threadMain가 될 메서드를 static으로 빼고,static 메서드는 클래스 내부의 일반 멤버에 접근하지 못하기 때문에 일반 메서드의 wrapper처럼 사용하고, 진짜 _threadMain은 일반 메서드로 구성한 다음, 그 일반 메서드를 호출하기 위해threadMain 메서드에서 ``c void*`` 형을 인자로 받은 ..
[C++] lambda (bind 보다는 lambda를 쓰자)
[C++] lambda (bind 보다는 lambda를 쓰자)
2018.09.03lambda가 왜 필요하냐면,함수 포인터는 함수이기 때문에 상태를 가질 수 없다.반복문 같은데 인자로 함수를 넘겨야 하는 상황에서 그 함수가 상태를 가져야 하는 경우, 함수 포인터를 사용할 수 없다.따라서 상태를 가지는 함수를 만들기 위해서 함수 객체라는 트릭을 사용해야 했다.함수 객체는 객체인데, ``cpp operator()``를 오버로드해서 함수처럼 호출할 수 있는 객체를 의미한다. Function object는 보통 Functor라고 부른다.```cppstruct Functor { void operator()() { std::cout
[C++] 컨테이너 안에 클래스가 들어있을 때, 클래스 안의 멤버들을 순회하는 이터레이터를 반환받는 방법 + mem_fn
[C++] 컨테이너 안에 클래스가 들어있을 때, 클래스 안의 멤버들을 순회하는 이터레이터를 반환받는 방법 + mem_fn
2018.09.03``cpp vector``가 있을 때, `` cls.value``들만 뽑아내고 싶은 경우가 빈번하게 있다.일반적인 경우 그냥 반복문 돌면서 처리해주면 되지만,라이브러리 등을 사용할 때는 반드시 `` cls.value``로 이루어진 iterator를 넘겨야만 하는 경우가 있다. 이런 경우 처음으로 드는 생각은 함수형의 ``cpp filter()``인데, 이는 copy가 발생하게 된다.copy 없이 `` cls`` 내의 멤버인 `` cls.value``들만 순회하는 iterator는 다음과 같은 방식으로 만들 수 있다. boost::transform_iterator내부적으로 정확히 어떻게 동작하는건지는 찾아보지 않았지만, 첫 번째 인자로 지정된 iterable의 원소를 하나 씩 꺼내서 두 번째 인자로 지정된..
[C/C++] strncpy()는 NULL문자를 넣어주지 않는다.
[C/C++] strncpy()는 NULL문자를 넣어주지 않는다.
2018.08.21```cint main() { int size = 4; char buf[size] = {'*', '*', '*', '*'}; strncpy(buf, "asd", size - 1); // buf[size - 1] = '\0'; printf("%s\n", buf); return 0;}``````asd*�FUUUU```따라서 명시적으로 ``c '\0'``을 넣어주어야 한다.쓰려는 src문자열의 길이가, 명시된 `` n``보다 작은 경우는 NULL문자를 넣어주지만, src문자열의 길이가 `` n``과 같거나 큰 경우 `` n``까지만 쓰고 그냥 그만두기 때문에, 명시적으로 넣어주는 것이 좋다.
[C++] \r이 포함된 문자열 출력할 때 이상하게 출력되는 현상
[C++] \r이 포함된 문자열 출력할 때 이상하게 출력되는 현상
2018.08.21```cpp#include #include using namespace std; int main() { string item = "abc\r\ndef\nghi"; // contain \r istringstream stream(item); while (getline(stream, item)) { cout