Python을 배우면서 2.x대와 3.x의 버전이 있다는 것을 들었고 더 이상 .2.x대의 업그레이드는 없다고하여 많은 고민 없이 3.x대를 쓰기 시작했다. 하지만, 실재로는 여러 이슈가 있다. Android는 여전히 2.x대를 쓰고 있다. 그래서 상황에 따라서는, 2.x 과 3.x를 병행해서 쓰게 한다거나 개발 환경을 Windows와 Linux로 나누어 PC를 2대로 운용한다던지 해야 하는 상황이 있다. 그럼에도 지금까지는 2.x는 그래도 강건너 불구경이었다.


도움 요청

네트워크 성능 최적화가 주요 업무인 후배는 network에서 실재로 전송하고 받는 packet을 캡춰해 놓은 pcacp 데이터를 많이 분석한다. 관련해서 이야기도 많이 하고 나에게 조언을 구하기도 한다. 한번은 python 이야기를 하길레 내 경험을 이야기 하고 python 강습을 듣도록 권유했다. 그래서, 나름 작업을 시작했던 것 같다. 관련된 조언을 몇번씩 구해서 같이 고민하고 간단히 답을 구하기도 하고 혹은 못 도와주기도 했다. 하지만, 이번에는 좀 더 심각해 보였다. 우리 집까지 찾아 오겠다는 것이었다.


내용은 python의 pcap 분석 툴인 captcp[1]의 포팅을 도와 달라는 것이었다. 이 툴은 dpkt[2] 모듈을 이용해서 TCP/IP 패킷을 분석하는 툴이었다. 예전에 몇번 질문한 것도 결국은 이 것과 관련 된 것이었다. 추가적인 문제점은 운용 환경이 Windows였다는 것에서 시작해서, 결국은 Python 3로 포팅해야 한다는 것이었다.


간단한 변환

새롭게 알게 된 것은 python 2 스크립트를 3로 변환하는 툴이 있었다. 기본적으로 python 3를 설치하면 [python 3]\Tools\scripts에 설치 되어 있는 툴이다. 이를 이용하여 기본 변환을 하면 된다.



아래와 간단히 명령어를 입력하면 변환이 일어난다.



미궁을 해매기

위와 같이 변환해도 Logical하게 문제가 발생하는 부분을 모두 처리해주지 못하기 때문에 바로 동작하지는 않는다. 결국에는 이 코드를 가지고 작동 시켜보면서 디버깅을 해야 하는 상황이었다. 이미 여러 이슈를 해결했지만, 최종 결과에는 이슈가 있었다. 테스트로 사용했던 동작은 statistic 옵션 이었다.



하지만, 지속적으로 error가 발생하면서 이슈를 파악하기 어려웠다 이 부분을 같이 살펴 보면서 Logical한 이슈가 무엇인지 분석을 하였다. 


결과 부터 이야기 하면, python 3로 오면서 Object의 연산자 overloading에 대한 구현 부분이 바뀐 것이다. Object의 비교 연산자가 Override 구현이 정확하게 동작하지 않고 단순 주소 비교로 되면서 처리가 완료되지 못하고 오류가 발생하는 건이었다.


근본 원인이 밝혀 지니 수정 방향도 수립이 되었다. __cmp__가 적절하지 못하는 것이 예상되었고, googling해 보니 이미 관련된 설명[3]이 있다. 이를 기반으로 __eq__로 대체 구현하였더니 동작함을 확인할 수 있었다.



돌아보며

결국은 Python2의 결과물을 Python 3로 변환하는 것은 쉬운일이 아니다. 또한, Open Source의 특성 상 지원이 있을 수도 있고 없을 수도 있기 때문이다. 하지만 또 하나의 장점은 내가 직접 변환할 수도 있다는 것이다.


최종 결과물은 내 github repsitory[4]에 저장되어 있다. 원본 Project가 2016년 부터 멈추어 있고, python 3과 연계가 어떻게 될지 불분명해 보인다. 그래서, 원본으로 pull request를 보내지는 않을 예정이다. 대신, 내 repository에 유지해 보는 것이 여러 방향으로 괜찮지 않을까 하여 유지해 보려 한다.


사족이지만 방금 찾은 것인데, python 2.7은 2020년에 퇴역(EOL)한다[5].


[1] captcp, https://github.com/hgn/captcp

[2] dpkt, https://github.com/kbandla/dpkt

[3] cmp method in python 3, https://stackoverflow.com/questions/8276983/why-cant-i-use-the-method-cmp-in-python-3-as-for-python-2

[4] captcp for python 3, https://github.com/blcktgr73/captcp

[5] Python 2.7 will retire in..., https://pythonclock.org/




Python을 처음 들었을 때에는 Linux Shell Script 혹은 Windows에서 Bat 파일과 함께 Perl을 사용해서 업무 자동화를 주로 할 때였다. 이 때의 자동화는 Software 빌드를 자동으로 하는 업무가 주여서 주어진 내용으로 충분했고, Perl의 경우도 필요한 내용만 찾아서 사용하는 정도의 수준이었다. Python도 이와 유사항 언어였고 필요성을 느끼지 모해서 배우지 않았던 것이 사실이다. 


최근에 컴퓨터 언어의 Ranking들을 살펴 보다 보니, 순위가 엄청나게 높아져 있었다. 용처도 많고, 옆의 동료가 온라인 과정을 통해서 배우고 있고 이를 통해서 자신의 업무 자동화에 활용하고 있는 것을 보고 자극이 되어서 사내 온라인 강좌를 통해서 기본적인 내용을 듣게 되었다. 목표도 어렴풋이 사내 웹싸이트에 있는 정보를 모아서 주기적으로 보고하는 것을 주기적으로 해야 하는데, Web Page의 테이블에 있는 내용들을 지속적으로 손으로 정리해서 보고 하게 되면 과제 진행하는 2~3개월 동안 보고 하게 되면 업무 효율이 나지 않았다. 그래서, 반드시 자동화를 해야하기는 했는데 어떻게 해야할지 막막했다.



온라인 강좌로 시작하다.

내가 들었던 강좌는 멀티캠퍼스의 2개의 강좌[1-2] 였다. 첫번째 수강한 강좌는 활용 보다는 전체 내용을 처음 부터 하나씩 설명하는 구조였기 때문에 지루하였다. 하지만, 책을 보고 공부하는 것도 습관이 붙어 있지 않은 상태여서 매일 조금씩 강좌를 보는 것은 꾸준히 진도를 나가는 도움이 되었다. 컴퓨터 언어를 전혀 하지 않았다면 첫번째 구조와 같은 강좌가 도움이 될 것 같고, 이미 다른 언어를 알고 있다면 [2] 강좌가 응용 예가 더 많이 소개 되기 때문에 도움이 될 것이다. 두 개의 강좌에서 살펴 보면, 크게는 다음 항목들을 다루고 있다.


0. 설치, 환경 설정 및 IDE

어느 언어든 기본적인 환경 설정이 필요하다. Python도 다운로드 받아서 설치를 해야 한다. 또한, 개발을 편리하게 해주는 Integrated Development Environment (IDE)가 있다. 모든 강좌에서는 기본적인 Python 설치를 다룬다. [2] 강좌에서는 Python 개발자들이 상당히 많이 사용하는 PyCharm[3] 을 설정하는 법을 설명한다.


1. Basic Language

어떤 언어를 배워도 다루게 되는 기본 자료형(Default Data Type, 연산자(Operator), 변수(Variable), 표준 입출력, 제어문, 함수가 우선 이 부분에 해당되었다. [1]에서는 2~6장이 여기에 해당되고, [2]에서는 2~8장까지가 여기에 해당된다고 볼 수 있다.


3. OOP, Module 과 예외 처리

Python은 OOP를 지원한다. 하지만, 간략화 된 클래스, 상속과 다형성을 포함한다. [1]에서는 7장, 8장이 여기에 속하고 [2[에서는 16장에서 설명한다. 또한, 기능들을 분리하여 관리하기 위해 모듈 기능을 제공한다. 추가적으로 예외 처리 관련 항목도 설명한다.


4. 확장 기능

기본적인 개념을 바탕으로 파일 처리, XML, 네트워크, 데이터 베이스 뿐 아니라 그래픽 관련 모듈 설명도 한다. 특히, Tkinter는 Python이 설치되면 기본적으로 제공되는 기능으로 UI를 쉽게 구성할 수 있다. Python에서는 Regular Expression, 정규식도 많이 사용된다. 2개의 강의 모두 Regular Expression을 다루지만, [2[에서는 2개의 챕터를 할애해서 설명한다.


5. 응용

[2]의 강좌가 좀 더 응용에 집중하고 있다. 엑셀, JSON을 포함한 Open API 활용, Web Scrapping, 날짜 및 자동화 기능, 메일 발송/수신까지 광범위하게 다룬다. 위에서 설명한 특정 웹 페이지에 접속해서 정보를 받아 정리하는 기능이 Web Scrapping으로 볼 수 있는데, 내가 필요로 했던 자동화 기능도 바로 이를 활용하면 가능하였다.


아들에게 가르치기: Python for Kids

일주일에 한번씩 아이들이게 가르치는 기회가 생겼다. 방학에 중학교 1학년인 아들과 아들 친구과 관심을 보였고, 어떻개 진행할까 고민하다가 책[4]을 발견하였다. 원래는 영문판을 먼저 발견했다가 번역을 하려 하다가 번역본이 있다는 것을 알게 되어 이 책을 선정하였다. 강의 계획은 아래와 같았다.


12/09: Python 소개, 기본 설정. Ch1 책소개 Ch2

12/16: 복습, Ch3, 4: Data types & Turtle graphics

12/23: 복습, Ch5, 6 (if/loop)

12/30: 복습, Ch7, 8 (function, class)

01/06: 복습, Ch9, 10 (Built-ins and useful modules)

01/13: 복습, Ch11, 12 (Graphics), Project 논의

01/20: 복습, Ch13, 14 (Bounse Ball), Project 계획

01/27: 복습, Ch15, 16 (Game2)

02/03: 복습, Ch17, 18 (Game2)





한번에 2시간 혹은 2시간 30분 정도 소요 되었다. 중간에 쉬는 시간을 가지면서 했다. 복습을 시키면서 새로운 단원을 나갔고 실습 위주로 진행하였다. 이해하지 못하는 것은 이론 설명을 충분히 하였지만, 책에 포함된 코드를 이용하여 실습에 더 많은 시간을 할해했다. 그래서 인지, 두 아이는 큰 무리 없이 따라 왔었다. 이책이 좋았던 부분은 설명 자체도 실습이 가능한 구조여서 입력하여 결과를 볼 수 있었고, 마지막에 Game을 다루기 때문에 흥미를 이끌어 내기 쉬웠다.


추가적인 부분으로, PyCharm을 처음 부터 설치하게 해서 인터프리터 기능 보다는 코딩 개념으로 설명하였다. 강의, 실습도 2명이 하기 때문에 더 진도가 잘 나갔던 것 같다. 원래 계획으로는 위의 강습 후에 Project 같은 것을 할 계획이었지만, 시간 부족으로 진행하지는 못했다. 나중에 또 기회가 있다면, 프로젝트를 하면서 여러 명이 함께 기획하고 구현하고 발표하는 시간도 3주 정도 가져보면 더 발전이 있을 것으로 예상한다. 그렇다면, 총 12주 정도의 시간이 필요했다.


업무 자동화에 활용: Web Scrapping

Python은 C++/Java와는 다르게 인터프리터를 사용하는 언어이다. 내가 가장 먼저 사용해본 인터프리터 언어는 Basic이었다. 그 당시는 마치 지금의 Windows 명령어 프람프트(Cmd.exe) 와 유사한 인터페이스였다. 다른 것은 컴퓨터를 켜면 항상 그 화면이 떴고, 수행할 내용을 입력하고 얻는 방식, 즉 인터프리터 방식이 기본이었다. 옛날 방식의 기술이 항상 나쁜 것은 아니고 상황에 따른 선택이라는 생각이 든다. 즉, 이렇게 하게 되면 컴퓨터의 동작 방법을 몇가지는 알지 않더라도 컴퓨터 언어에 접근하게 해주는 것이 장점이 되고, 그래서 Python을 비전공자에게 권하게 된다고 생각된다. 고급 사용자의 경우는, 실행할 내용을 text파일로 저장해 놓는 Script도 사용할 수 있으니 이 또한 유연한 접근 방법이다. Android에서는 2.x를 사용하지만, 나는 우선 자동화와 추후를 위해서 3.x대를 선택하여 사용하였다.


위에서 설명하였듯이 Web 페이지에 접속해서 필요한 내용을 추출해 해는 것이라고 간단히 말할 수 있겠다. 내가 필요했던 업무도 사내 홈페이지들에 흩어 져 있는 우리 부서의 정보를 원하는 형태로 취합 정리하는 것이었다. 인트라넷 홈페이지는 로그인 처리가 필요했고 개별 링크에 관련 정보들이 흩어져 있었고, Java Script를 이용한 Dynamic Web이었다. 강좌에서 소개한 Library는 Beautiful Soup이였다. 이 라이브러리는 디테일한 컨트롤이 어려웠고, 사내 홈페이지에 접속하는 것이 매우 어려웠다. 결국 Googling을 많이 하다 보니, Selenium이라는 모듈을 알게 되었고, [5]에 포함된 내용과 Googling을 통해서 원하는 기능을 구현할 수 있었다.




돌아 보며.

새셈 느낀 것이지만 필요한 목적이 있으면 배움이 더 유용하다. 그래서, 업무와 연계 시키거나 혹은 다른 목적을 찾으면 좋다. 특히, 가르치는 것은 더 많은 배움을 동반한다. 현재는 이러한 목적을 넘어선 다른 것 또한 찾고 있다. 그것이 더 좋은 공부라는 것을 알기 때문이다.


[1] 파이썬으로 배우는 실전 프로그래밍, http://www.credu.com/main/credu/user/course/zu_course_detail_R.jsp?p_subj=C90113

[2] 파이썬을 이용한 자동화 스크립트, http://www.credu.com/main/credu/user/course/zu_course_detail_R.jsp?p_subj=CB6392

[3] JetBrains PyCharm, https://www.jetbrains.com/pycharm/

[4] 제이슨 R. 브리그스 et. al, "누구나 쉽게 배우는 파이썬 프로그래밍 (Python for Kids)", BJPUBLIC. 2013

[5] Ryan Mitchel, "Web Scrapping with Python", O'Reilly 2015

사람들이 많이 쓰는 컴퓨터 언어

소프트웨어 개발자로서, 가장 먼저 배우게 되는 것이 컴퓨터 언어 (Computer Language)이다. 여기서 고민 되는 사항은 두가지 이다. "만일 내가 현재 처음 컴퓨터를 접하게 되었다면 어떤 언어를 배울 것인가?"와 "지금까지 컴퓨터 언어를 배운 것을 돌아 본다면 어떤 언어를 어떻게 공부할 것인가?" 일 것이다. 첫 번째는 내가 생각하는 컴퓨터 언어에 대한 추천이고, 두 번재는 내가 알고 있는 것을 기반으로 어떻게 확장할 것인가 이다.


우선 첫번째 질문에 대해서 고민을 해보자. 2018년 6월 6일 기준으로 구글 검색 결과 제일 처음에 나오는 3가지가 TIOB Index[1], IEEE Top Programming Language[2], 그리고 The RedMonk Programming Language Rankings [3] 이다. TIOBE Index에서는 2위가 C, 3위가 C++로 사실 둘을 합치면 1등인 Java 보다도 높다. IEEE Spectrum은 미국의 전자 공학회가 발행하는 주요 잡지에서 설문 조사한 결과로 공학자들이 많이 쓰는 언어라고 볼 수 있다.  여기에는 C가 2위 C++은 4위에 랭크하고 있다 하지만, C++이 97.1%로 대부분 이 사용하고 있다 이 링크로 알 수 있는 재미있는 사실은 많은 사람들이 한가지 언어만 하고 있지 않고 여러 컴퓨터 언어를 사용하고 97% 이상이 Python, C, Java 그리고 C++까지 사용한다고 하고 있다.



TIOBE Rank 

Spectrum Rank



이제 부터는 개인적인 의견이다. 위의 내용의 결론은 여러 언어를 배우는 것이 좋겠다는 것이다. 하지만 한꺼번에 4개를 다 시작하는 것은 좋지 않다. 우선은 목표를 고민해 보는 것이 좋겠다. 컴퓨터 관련 전공자가 될 것인지, 혹은 내 분야는 다르지만, 컴퓨터를 더 잘활용하기 위한 목적인지가 결정 포인트가 될 것이다. 



나의 추천: 비전공자 vs 전공자

만일 비전공자라면 Python으로 시작하는 것이 좋겠다. 가장 큰 이유는 Python은 컴퓨터 언어의 기본 구조는 다기지고 있으면서, 배우기가 상대적으로 쉬운 언어이다. 그럼에도 불구하고 Python은 정말 관련된 라이브러리도 많아 사무 자동화 등 여러 곳에 활용될 수 있다. 여기서 그치지 않고, 요즘 화두가 되고는 Machine Learning관련해서도 사용되고 있기도 해서 여러 활용처를 고민해 볼 수 있다. 아들에게 Python을 방학 동안 가르쳐 본 것도 이러한 판단 때문이다. 





전공자라면 Java를 추천한다. 오래된 언어이지만, 많은 대학에서 Java를 전산전공자의 처음 언어로 가르치고 있는 것으로 알고 있다. 요즘은 Smart Phone이 화두가 되고 있다. PC에서 동작하는 SW 제품을 만들기도 하지만, Web이나 Mobile에서의 SW를 만든다고 하면 Java를 기반으로 좀 더 학습하면 쉽게 접근할 수 있다.  


또한, 처음 컴퓨터 언어를 익히고 여러 프로젝트를 하면서 접하게 되는 설계 관련(Architecturing) 관련한 분야로 Design Pattern, Refactoring, Unit Testing이 Java 기반으로 설명하고 있기 때문에 내가 강하게 추천하는 이유이기도 하다.





나는 어디로?

두 번째, 지금까지 경력을 쌓았던 나의 경우 어떻게 보수 학습을 할 것인지에 관한 질문이다. 아주 개인적인 질문이다. 하지만, 기본적으로는 내가 어떤 언어들을 주로 사용했고, 현재 시점에서는 어떻게 학습해 나갈 것인지에 관한 것기 때문이다. 방향은 어찌 보면 위와 같다. 즉, Python, Java, C/C++여러 언어를 배울 것이다. 하지만, 어떤 순서로 어떤 것을 살펴 볼 것인지가 더 중요하겠다. 왜냐하면, 처음 시작하는 사람들과 같이 처음 부터 다시 다 봐야할 필요가 있지 않을 수도 있기 때문이다.


내가 가장 먼저 배운 언어는 초등학교 때, 컴퓨터를 처음 접하면서알게된 Basic언어였다. 그리고는, 대학에 입학하고 나서 학교에서는 내가 전공한 전자공학에서는 관련 언어라는 이유로 FORTRAN이 과정에 포함되어 있었다. 또한, 전산과에서는 PASCAL을 가르쳤었다. 하지만, 나는 이때에 이러한 언어들이 유행이 지났다고 생각해서, 따로 독학한 언어는 C 언어였다. 이 때에 보았던 책들을 기억해 보면 정말 함수를 만들고 문제를 해결하는 형식의 Procedural Programming Paradigm을 활용한 접근 방식이었다. 대표적으로 Main Menu가 있고 키를 눌러서 해당 함수로 호출 되게 해서 요구 사항을 만족시키는 방식이다.


회사에 입사하기 시작하면서, C++과 Java가 소개되기 시작했다. 매우 초기 버전이기 때문에 Object Oriented Paradigm이 소개 되고 이를 위한 개념들이 녹아 있는 버전의 언어들었다. 하지만, 아직, 휴대폰에는 이를 활용한 개발들이 더디게 적용 되고 있었다. 그래서, 컴퓨터 언어와 관계해서는 더 배우게 된 것이 Perl이나 Unix Shell Script, Makefile 등이었다. 실재로 프로그램하는 방식도 Procedural에서 Event-Driven으로 바뀌었다. 이는 Event Handler에서 Event의 종료를 구분하여 처리하는 구현 접근 방법이다.


Android를 시작하면서, 실재로는 Java와 C++을 더 봐야하는 입장이었지만 실재로 더 이론들을 탄탄히 하면서 진행하지 못했다. 그러면서, 결국에는 C++을 좀 더 봐야겠구나 하고 정리하게 되었고, 동료가 Python 온라인 강의를 듣는 것을 보고 배우기 시작해서 아들과 아들 친구에게 가르치는 일까지 하게 되면서 Python을 알게 되었다. 이 후, Java에서도 내가 교육을 통해 마지막으로 배웠던 것 이후에 바뀐 부분이 많다는 생각에 다시 학습하게 되었다.





사족이기는 하나, 위와 같이 공부하게 된 것도 고민을 하면서 바뀌게 된 것이다. 사실 지금돌아 보면, 역시 Java를 먼저 보강하고 C++ 그리고 Python을 다시 하는 것이 좋지 않겠나 생각하지만 이렇게 진행한 것도 나쁜 선택이라고 생각되지는 않는다.


[1] TIOBE Programming Community Index, https://www.tiobe.com/tiobe-index/

[2] The 2017 Top Programming Languages - IEEE Spectrum, https://spectrum.ieee.org/computing/software/the-2017-top-programming-languages

[3] The RedMonk Programming Language Rankings, http://redmonk.com/sogrady/2018/03/07/language-rankings-1-18/



+ Recent posts