반응형

python version: 2.7


자바(Java)의 try { ... } catch (Exception e) { e.printStackTrace(); } 과 비슷한 개념으로 코드의 trace stack을 확인하는 방법:


import traceback


try:

    ....

except:

    traceback.print_exc()



오히려 try, except 없이 그냥 코드를 실행하면 프로세스는 당장 중단되더라도 call stack을 볼 수 있었는데, try, except로 감싸고 나서는 익셉션을 보는 방법이 뭔지 몰라서 그냥 print나 대충 해보다가 찾아보게 되었다. 이와 관련해서 StackOverflow에 올라온 글을 보니 내가 모르고 있어서 그렇지 traceback 관련 사용법도 sys.exc_info와 연동하는 등 다양한 것 같다 [1].


여담이지만, 자바에서는 Exception이 throw되는 지점에서 try, catch를 작성하지 않으면 컴파일 에러를 내면서 작성을 강요하는 데 비해 파이썬은 익셉션 처리를 하든지 말든그냥 두는 것이 참... 비슷한 경우로 변수의 타입을 지정하지 않고 쓰는 것과 궤를 같이 하는 것 같기도 하고, 아무튼 C/C++, Java에만 익숙해져 있다가 참 적응이 안되는 기분이다.


그래도 지금은 빨리 코딩해서 데이터부터 만들어 내야 하니까 일단 적응이 안되든지 말든지 빨리 코딩하는 걸로.



<참고자료>

[1] http://stackoverflow.com/questions/3702675/how-to-print-the-full-traceback-without-halting-the-program

반응형
블로그 이미지

Bryan_

,
반응형

OS: Windows 10 Professional (64-bit)

Target: Synology NAS (고정IP 보유)


노트북의 하드디스크를 포맷하고 윈도우 10을 새로 설치했는데, 설치하고 나서 처음에 계정을 설정할 때 그냥 시키는 대로 Microsoft 계정으로 로그인하도록 지정했다.


어차피 로컬 계정이나 마이크로소프트 계정이나 일반적인 데스크탑 PC처럼 쓰는 경우에는 큰 차이가 없기 때문에 별로 상관하지 않았는데, 문제는 NAS에 연결하려고 시도해 보니까 아예 NAS에 로그인하는 과정 자체가 진행이 되지 않았다.

그러니까 "내 PC > 네트워크 드라이브 연결" 버튼을 누르고 \\주소\폴더 를 입력한 뒤에 "찾아보기" 버튼을 누르면 원래 로그인하라고 팝업 창이 떠야 되는데, 그 창이 뜨기 전에 접근할 수 없다는 오류 메세지만 뜨는 것이었다.


윈도우 로그인 계정을 로컬 계정으로 전환하고 나서는 네트워크 드라이브 추가가 잘 되길래, 일단 그렇게 쓰고 있다.

근본적인 해결 방법으로써 마이크로소프트 계정을 쓰는 상태에서 NAS에 접속하는 방법은 직접 확인하지는 못했지만 아마 이 문제 (http://www.theprojecty.net/wp/461) 같다.



반응형
블로그 이미지

Bryan_

,
반응형

부끄러운 사실이지만, 최근 들어서야 코딩할 때 파이썬(python)을 쓰기 시작했다.

말이 최근이지 불과 이틀 전이다. ㅡㅡ;;


애초에 네트워크 시뮬레이션 특성상 핵심 구현은 C/C++을 쓸 수밖에 없고, 똑같은 것을 실제 장비에서 실험을 해보려면 리눅스 디바이스 드라이버를 고쳐야 해서 결국 C를 써야 한다. 전에 연구실에서 IoT 테스트베드 구현에 깊게 참여하던 당시에는 IoT 미들웨어가 순수 Java로만 되어 있었고, 과제 연차평가를 보여줄 시연용 모바일 기기도 안드로이드여서 Java 기반이니 지금껏 Java와 C/C++만 줄기차게 써온 셈이다.


물론 스크립트 언어를 안 쓴 것은 아닌데, 그게 리눅스 쉘(shell) 스크립트와 awk였다. QualNet이나 ns-3가 만들어 내는 수많은 반복 시뮬레이션을 batch로 실행하고, 실행 후에 만들어지는 여러 개의 데이터 텍스트 파일들을 정리해서 엑셀이나 Gnuplot에 붙이기 좋게 만들 필요가 있었다. 

문제는 shell (bash)이든 awk든 스크립트 언어라서 바로바로 돌려볼 수 있기는 한데, 왠지 코드가 쉽게 써지지 않는 것은 단지 나의 기분탓이었을까? (...)


사실 bash나 awk 모두 잘(?) 쓰면 아주 강력한 스크립트 언어인 것은 분명하지만, 이상하게 빨리 익숙해지는 느낌은 잘 들지 않았다. 내가 집중적으로 실험할 때에만 폭풍처럼 몰아쳐서 스크립트를 만들다가 또 한참 안쓰고 잊어버려서 그런 것일지도? 아무튼 awk로 내가 머릿속에서 상상하는 것처럼 텍스트를 예쁜 과일 자르듯 쉽게 파싱하려면 상당한 시간의 구글링과 trial-and-error를 거쳐야만 했다.


최근에도 bash와 awk의 조합으로 ns-3 시뮬레이션을 대량으로 돌리고, 그 결과로 생성되는 텍스트 파일 중에서 몇몇 지정된 노드 번호에 대해서만 로그 데이터를 읽어들여서 파싱하는 작업을 했는데, 최근에 요구사항이 추가돼서 결과 데이터를 한번 더 가공해야 하는 상황이 되었다.

이미 만들어 놓은 awk 코드를 또 고치려니 선뜻 손이 가지 않아서, 차라리 파이썬으로 해 봐야겠다는 생각이 들어서 그냥 파이썬의 파일 입출력 예제 코드와 string 포맷팅 등의 기초적인 정보를 구글링해서 만들어 보았다.


그랬더니,


...15분 만에 결과 데이터가 내가 원하는 형태로 터미널 화면에 뙇.


Aㅏ...


기존의 awk와 shell 스크립트를 뜯어고치면 절대 완성하지 못할 시간인데...

그리고 다른 데이터에 대한 유사한 후처리 작업을 ns-3 시뮬레이션 상에서 C++ 함수로 구현해 둔 것도 있는데, 그 당시에 구현하던 때에도 30분 넘게 걸렸었는데 파이썬은 문법을 구글링하고 vi에서 생으로 코드를 짰는데도 15분이라니.

게다가 그동안 자바로 코딩했던 경험상, 똑같은 기능을 자바로 구현하면 100줄은 쉽게 넘어갈 코드가 파이썬에서 주석과 디버그용 print문 합쳐서 45라인...


...난 지금까지 뭘 한거지? ㅋㅋㅋㅋㅋ


예전에 오버레이 네트워크 상에서 돌리는 라우팅 프로토콜을 만들어야 된다고 징징거릴 때, 주변에서 파이썬으로 먼저 만들어 보는 건 어떠냐는 제안에도 파이썬을 써본 적이 전혀 없어서 익숙한 Java로 하겠다고 그랬는데...

테스트용 웹서버 구축할 때에도 Spring Boot 상에서 자바로 노동(?)을 하고 있을 때에도 옆에서 아는 형이 Django로 파이썬으로 만들면 더 빠르다고 했을 때에도 선뜻 바꿀 생각을 못했는데... @_@ (정신 가출)


다양한 프로그래밍 언어로 문자열 처리 어플리케이션 개발 시 소요되는 시간 비교(Prechelt and Garret) (출처: HACKERNOON [1])


위의 그래프가 충분히 이해가 가는 순간이다.


게다가 내가 목표로 하는 개발환경은 실행속도 따위(...) 그다지 의미가 없고, 코드만 빨리 완성되면 가상 머신 여러 개 만들어서 밤에 자는 동안 batch로 잔뜩 돌려놓기만 하면 되니까... 진작에 파이썬을 여기저기 적용해서 쓸 걸 ㅠㅠ


게다가 파이썬을 단 한번도 써본 적 없다고 괜히 겁먹은 거잖아?!

기존에 다른 프로그래밍 언어들을 장시간 다뤄본 사람 입장에서 파이썬은 배울 필요 없이 그냥 일단 쓰고 보면 되는 거였다. ㅡㅡ;;


물론 텍스트를 잘 파싱/편집/재구성하는 가장 강력한 도구로써 awk를 쓰는 것이 여전히 더 유리한 상황은 있을 것이다. 하지만 비교적 단순한 스트링 파싱은 그냥 파이썬에서 직관적인 코드를 써서 훨씬 더 빨리 만들어낼 수 있음을 이번에 경험으로 알게 되었다.

앞으로는 C++ 시뮬레이션 코드를 bash로 반복 실행을 하고, awk로 여기저기 흩어진 데이터를 한데 모으는 것까지만 하고, 그 뒤의 스트링 파싱이나 평균 계산 등은 다 파이썬으로 하면 될 것 같다.


생산성이 좋다고 주변에서 일관되게 얘기하면 그러한 줄 알고 신속하게 적용할 수 있는 사고방식의 중요성을 느낀다. ㅠㅠ

외곬수가 되지 말자...



<참고자료>

[1] Nick Humrich, "Yes, Python is Slow, and I Don’t Care," HACKERNOON,

https://hackernoon.com/yes-python-is-slow-and-i-dont-care-13763980b5a1



반응형
블로그 이미지

Bryan_

,
반응형

1. 찾아서 바꾸기 기능 쓸 경우:


:%s/\t/[원하는 공백 크기]/g


예를 들어, 4칸의 공백으로 바꿀 경우,


:%s/\t/    /g




2. VIM에 정의된 다른 명령어의 조합으로:


:set expandtab

:set ts=4

:retab


set ts=4에서 ts를 원하는 숫자로 바꾸면 바뀐 크기만큼 적용된다.




반응형
블로그 이미지

Bryan_

,
반응형

OS: Ubuntu 16.04 (amd64)

Version: ns-3.26

gcc: 4.8.4



*결론부터 말하면, 소스 파일 확장자를 반드시 .cc 로 맞추자.



ns-3 에서 바로 시뮬레이션 코드를 테스트할 때 scratch 디렉토리에 소스코드를 집어넣으면 되고, 이 때 객체지향 컨셉을 적당히 쓰기 위해 하나의 클래스를 독립된 헤더와 소스 파일로 만드는 경우가 있다.


헤더와 소스 파일을 만들 때, [클래스 이름].h, [클래스 이름].cc 로 맞춰서 만들어야 하는데, 실수로 소스 파일 확장자를 cc가 아닌 cpp 또는 그외 다른 확장자로 쓰게 되면 ns-3의 waf 스크립트에서 소스 파일만 인식을 못해서 빌드 과정에서 "undefined reference to X" 에러가 발생한다.


문제는 이클립스 CPP 환경에서 ns-3를 프로젝트로 로드해 와서 scratch 폴더 내부에 클래스를 생성할 때에는 소스 파일의 확장자가 .cc이든 .cpp이든 아무 경고 메세지가 발생하지 않는다. 나도 이클립스 CPP에서 New > Class 메뉴를 통해서 자동으로 클래스를 만들면서 소스 파일 확장자가 .cpp로 만들어지는 것을 미처 인지하지 못해서 이 링크 에러를 보게 되었다.


ns-3.26/build/scratch 디렉토리를 살펴 보니 아예 내가 만든 클래스에 대한 오브젝트 파일(.o) 파일이 존재하지 않았다. 그 원인은 ns-3.26/wscript 파일에서 소스 파일을 자동으로 불러올 때 .cc 파일만 인식하게 되어 있기 때문이다.


(ns-3.26/wscript 파일 일부)

...(앞부분 생략)...

elif filename.endswith(".cc"):

name = filename[:-len(".cc")]

...(이하 생략)



wscript 파일을 고쳐서 cpp 파일도 자동 인식하도록 만들어도 되지만, 일단 ns-3에서 scratch 디렉토리에 대해서 미리 정해져 있는 컨벤션이고, 나중에 시뮬레이션 코드만 다른 컴퓨터의 다른 ns-3 버전에서 돌려야 할 때 같은 문제가 또 발생하게 되므로, 그냥 소스 파일을 .cc로 맞추는 것이 안전한 방법이 되겠다.



반응형
블로그 이미지

Bryan_

,