Python 개발 노트

Python으로 개발하면서 작성한 메모로, 기본적인이지만 오랜만에 Python을 사용할 때 참고할 만한 내용을 적어봤다. Python 2.7 버전 기준이다.

if문

예외처리

버전 알아내기

SQLAlchemy

SQLAlchemy는 Python에서 인기있는 ORM 모듈이다.

Flask

Flask는 가벼운 Python 웹프로임웍이다. RESTful API를 아주 쉽고 간단하게 만들 수 있다.

API의 예외 처리

Implementing API Exceptions 페이지에 아주 잘 나타나있다.

우선 예외 클래스를 만든다.

어떤 API에서 예외가 발생했을 때 표시할 페이지의 응답부분을 만든다.

이제 API에서 예외가 발생했을 때, invalidUsage 클래스를 사용해서 예외를 전파하면 된다.

Jsonify 에러

Flask의 이와 관련한 이슈에 따르면 simplejson을 설치하면 자동으로 jsonify가 그것을 사용한다고 했다.

PIP

설치

사용

에러

DistributionNotFound

setuptools를 설치한다.

맥(OSX)에서 nginx 설치하고, 서비스에 등록하기

nginx를 다운 받아서 설치한다. 필요한 옵션을 추가한다.

/usr/local/nginx 디렉토리에 nginx가 설치됐다.

이제 nginx를 재부팅 후에도 실행될 수 있게, 서비스를 만들겠다. 다음과 같이 plist 파일을 하나 만든다.

/Library/LaunchDaemons/local.nginx.plist:

시작 서비스로 등록한다.

서비스를 해제하는 방법이다.

언인스톨하기

MySQL Deadlock 발생하는 문제(Sqlalchemy)

내가 Python(Flask 프레임웍)으로 개발했던 서비스에서 월 초만 되면 api 에러가 발생했다. DB는 MySQL, ORM으로는 Sqlalchemy를 사용했다. API 에러는 다음과 같았다.

OperationalError 에러이고, 락을 가져오려고 할 때, Deadlock이 발견됐으니까 트랜잭션을 다시 시작하라는 내용이다.

문제가 되는 부분을 찾았는데, insert 하고, commit 하는 부분이었다.

그래서 에러메시지 내용에 따라 예외 처리를 했다.

이 상태에서 예외를 처리하지 않으면, 다시말해서 rollback을 하지 않으면 이 API(세션)는 더 이상 DB Select 조차 할 수 없다. 그 때 발생하는 에러는 다음과 같다.

Dead Lock 발생으로 서비스가 되지 않는 문제는 rollback으로 해결했다. 이제 Dead Lock이 걸리는 원인을 찾아야겠다.

일단 2개의 Mysql 이벤트가 있다.

  • 이벤트 A : 월마다 한 번 오전 9시에 A 테이블에 파티션 추가하는 프로시저 실행
  • 이벤트 B : 매일 한 번 오전 11시에 B 테이블에 파티션 추가하는 프로시저 실행

특이사항은:

  • 스토리지 엔진은 MyISAM.
    • 엔진 자체가 트랜잭션을 지원하지 않으므로, Sqlalchemy가 애플리케이션 단에서 처리하는 것 같음.
  • 매일 11시에 INSERT가 많이 발생한다.
  • lock 걸렸는지 확인한 결과 문제가 없었다.
  • 에러가 발생하고, Wait 상태인 프로세스도 없었다.
  • API만 재시작하면 정상 동작한다. 이것은 그 세션만 문제라는 얘기다.

그래서 개발서버에서 재현하려고 시도했다. jMeter로 API에 Insert를 대량 발생시켰다. 그러나 에러는 발생하지 않았다.

여러가지 설정도 바꿔봤지만 Dead Lock은 전혀 발생하지 않았다.

  • concurrent_insert
  • table_lock_wait_timeout

개발서버와 실서버의 mysql 버전 차이도 영향이 있을까?

  • Development : 5.1.73-log
  • Production 5.5.27-log

실서버에서는 발생하는게, 왜 개발서버에서는 발생하지 않을까? 정확한 원인은 찾지 못했지만, 이벤트에서 테이블 락을 걸어주고 프로시저 작업이 끝나면 락을 풀어줘야겠다. 에러가 발생하는지 확인해봐야겠다.

Nginx Lua Module, Shared Memory set 할 때, 순서 바뀌는 문제

Nginx Lua Module을 개발할 때 Shared Memory를 사용했었다. 다음과 같은 함수로 Shared Memory를 다룰 수 있다.

  • ngx.shared.DICT:get
  • ngx.shared.DICT:set
  • ngx.shared.DICT:add

그런데 한 가지 문제가 생겼다. 예를들어 :

이런 결과가 나타나길 기대했지만,

실제로 이런 결과가 나타났다.

순서는 그대로 두고, Shared Memory의 값이나 expires를 변경하고 싶었는데, 그렇게 되지 않았다.

replace라는 메소드가 있어서 확인해봤다.

set과 비슷하지만, 키가 존재할 때 ngx.shared.DICT 딕셔너리에 key-value 쌍을 보관한다. 이미 만료되었거나 딕셔너리에 키가 존재하지 않으면 success 리턴 값은 false가 되고, err 리턴 값은 “not found”가 된다고 했다. 따라서 replace는 해결 방법은 아니다.

모든 메소드를 확인해봤는데, 결국 해결방법을 찾을 수 없었다. 그래서 구조를 다음과 같이 바꿨다.

  • DICT : 만료시간도 주고, 값을 set 할 수 있는 공유 메모리
  • DICT_IDX : add만 하는 공유 메모리. 오직 delete만 할 수 있다.

이렇게 DICT_IDX라고, 새로운 공유 메모리를 추가하는 방식으로 해결했다.

리눅스(Centos) 모니터링 도구 모음

일을 할 때 보통 Centos 계열을 많이 사용하고 다루는 편이다. 이 글에서는 시스템의 상태를 확인할 때 자주 사용하는 커맨드와 툴에 대해 알아보겠다.

htop

top보다 강력한 툴이다. 특정 패턴의 문자열에 일치하는 프로세스만 보여주는 Filter 기능과 부하나 메모리 순서대로 보여주는 Sort 기능을 자주 사용한다. 프로세스 상태를 보면서 바로 프로세스를 죽이는 기능도 있다. 또한 strace도 쉽게 확인할수 있다. 버전에 따라 기능에 차이가 있으니 최신버전을 사용하는 것이 좋다.

dstat

dstat은 CPU, Disk IO, 네트워크 트래픽을 확인할 때 사용한다.

기타

업데이트 해야 할 내용.

  • vmstat
  • iostat
  • iotop
  • top
  • free
  • lsof
  • ps
  • strace
  • tcpdump
  • uptime
  • ngrep

서브라임텍스트 속도 향상 팁

OSX에서 서브라임텍스트가 아주 느려지는 문제가 갑자기 생겼다. 텍스트를 입력하고, 방향키를 누르면 랙이 나타나는 증상이다. 그래서 원인을 찾으려고 몇몇 시도를 했다.

  • 안 쓰는 플러그인 제거
  • OSX 최적화
  • 서브라임텍스트 설정 변경

Sublimelinter 때문에 그럴 수도 있겠다 싶어서 delay 시간을 조절했다. 효과는 없었다. 설정의 문제가 아니라 어떤 플러그인에 의해서 발생하는 문제인 것 같다고 생각했다.

이제 어떤 플러그인이나 설정이 문제를 발생하게 만드는지 알아보려고 했다.

우선 서브라임텍스트를 종료했다. 아래 디렉토리에서 두 개의 디렉토리를 다른 폴더로 이동했다.

  • Installed Packages
  • Packages

다시 서브라임텍스트를 열었고, 문제가 발생하지 않았다. 플러그인 문제다.

Installed Pacakges 디렉토리 안에 의심가는 플러그인을 넣어가면서 테스트를 했다. 결국 Jekyll 플러그인을 넣으니 문제가 다시 발생했다.

더 자세히 알아봤는데, Jekyll 플러그인에서 설정 문제였는데 그 내용은 따로 글을 작성했다.

아무튼 플러그인이나 소프트웨어는 필요한 것만 써야겠다고 생각했다.

OSX 최적화 노트

회사에서 윈도 PC를 사용하고, 집에서는 맥을 사용한다. 회사 PC 성능이 좋아서 작업하면서 느리다고 생각한 적이 없는데, 집에서 작업을 하면 너무 느려서 컴퓨터를 끄곤했다. 특히 서브라임텍스트에서 텍스트를 입력하고, 방향키를 사용하면 랙이 3초 이상 발생한다. 한글을 입력했을 때, 이런 문제가 잘 발생했다. 에디터를 사용하지 못할 정도였다.

이 문제 외에도 부팅시간 후에 앱이 열리는 시간이 느린 문제도 있었다. 이런 문제이 있어서 최적화를 해야겠다고 생각했다.

불필요한 소프트웨어 제거

가장 간단하게 할 수 있는 것이 사용하지 않는 프로그램을 삭제하는 것이다. 언인스톨 소프트웨어를 사용하지 않았다. 기본적으로 응용프로그램 폴더에서 직접 휴지통으로 옮기는 방식으로 지웠고, 흔적들이 보이면 개별적으로 지웠다.

  • AhnLab : AhnLab > ASTx > astxStatus.app이 있는데, 같은 디렉토리에 언인스톨러가 있어서 실행했다. 디렉토리가 남는데, 빈 디렉토리도 삭제했다. 인터넷뱅킹 하다가 설치된 것 같다. 이제 모바일 뱅킹만 사용해야겠다.
  • Alfred : 좋다고 해서 설치했는데, 잘 안써서 지웠다.
  • ALZip : 쓸일이 없어서 지웠다.
  • Calibre(캘리버)
  • CodeBlocks
  • CrossMail : 이건 뭔지 모르겠다. 언인스톨러가 있어서 실행했다.
  • Delfino : 인터넷뱅킹할 때 설치된 거 같다. 언인스톨러로 지웠다.
  • Dia : Plantuml이 있어서 더 이상 사용하지 않아서 지웠다.
  • Double Commander : 사용해봤는데, 별로 편하지 않아서 지웠다. 그냥 Finder를 써야겠다.
  • Emacs : Gui 환경에서는 더 생산성 좋은 에디터가 많아서 굳이 쓸 필요가 없을 것 같다.
  • GIMP : 래스터 이미지 다룰 일 있을 때 다시 설치해야겠다.
  • Inkscape : 벡터 이미지를 다룰 일 있을 때 다시 설치해야겠다.
  • Go2Shell : 파인더에서 열린 폴더 경로로 새 창을 띄워주는 프로그램인데, 잘 안쓴다.
  • GPG Keychain : OpenPGP 키를 다루는 애플리케이션인데, 다음에 필요할 때 설치해야겠다.
    • 시스템 환경설정에서 GPGPreferences 패널 제거
  • iBrowse : 아이폰 파일에 접근할 수 있는 프로그램인데, 잘 안쓴다.
  • iExplorer : iBrowse와 유사하지만 기능은 더 강력한 프로그램인데, 역시 잘 안쓰고, 데모버전 기간도 지나 있었다.
  • MySQLWorkbench : Sequel Pro를 주로 사용해서 이건 지웠다.
  • Opera : 이제 메이저 브라우저에서 벗어난 거 같아서 Opera로 테스트할 필요가 없어졌다.
  • Pencil : Plantuml이 있어서 더 이상 사용하지 않는다.
  • PhotoScape X : 미리보기 앱을 그냥 써도 될 것 같다.
  • Skype : 전화영어할 때 썼었는데, 안써서 지웠다.
  • StarUML : 이것도 Plantuml이 있어서 지웠다.
  • Veraport : 인터넷뱅킹할 때 설치된 것 같다. 언인스톨러가 있어서 실행했다.
  • XBMC : 미디어 플레이어. 안써서 지웠다.
  • BitTorrent Sync : 파일 동기화
  • Framer : 프로토타이핑 도구. 테스트로 써보고 지움.
  • Sublime Text 2 : 3버전 사용해서 지웠다.
  • Chrome 원격 데스크톱 호스트 : 원격 제어. 언인스톨러로 제거.
  • Mindjet MindManager : 마인드맵 그리는 프로그램.
  • FreeMind : 마인드맵 그리는 프로그램.
  • NetNewsWire : RSS 리더
  • SSH Tunnel Manager : SSH 터널링 프로그램. ssh 사용하면서 제거.
  • teleport : 마우스 키보드 공유 프로그램
  • Synergy : 마우스 키보드 공유 프로그램
  • Tab Notes Free : 포스트잇 프로그램
  • MagicanPaster : CPU, Disk, Memory 상태 보는 위젯.
  • Atom : 에디터
  • Disk Inventory X : 디스크 용량 시각화
  • iFunBox : 아이폰, 아이패드 파일, 앱 관리 유틸리티
  • Audacity : 멀티트랙 레코딩, 에디팅하는 오디오 프로그램
  • 한컴오피스 한글 2014 VP 뷰어 : hwp 문서 뷰어
  • Leawo Video Converter Lite : 비디오 파일 변환. CD/DVD Burn, Copy 도구
  • Music Converter : 음악파일 변환.(벨소리)
  • Screen Capture Tool-Lite : 화면 동영상으로 캡쳐
  • The Unarchiver : 압축 해제 프로그램
  • VirtualBox : 가상 머신
  • Unison : 파일 동기화
  • X-Mirage : PC를 Airplay 서버로 만드는 프로그램.

TeX

삭제방법

시스템 환경설정 – Tex Distribution – 오른쪽 마우스 보튼 클릭 후 패널 제거 선택

서비스 제거

MS Office

베네수엘라 대란 때 샀을 때 설치했다가 환불하고 안 지웠었는데, 이제 지웠다.

  • Microsoft Excel, OneNote, Outlook, PowerPoint, Word

Teamviewer

plist만 남아있었다.

삭제방법

nprotect

인터넷 뱅킹 관련해서 설치했다가 지웠는데, plist 파일이 남아있었다.

다음 방법으로 지웠다.

realvnc vncserver

제거를 했는데, plist 파일이 남아있었다.

다음 방법으로 지웠다.

Growl

삭제하는 방법

  • 시스템 환경설정 – Growl
  • Stop Grow
  • Start Growl at Login 체크 해제
  • Show Growl icon in the menu bar 체크 해제
  • 다시 뒤로 돌아가서 CTRL을 누르고, Growl을 클릭 – 환경설정 패널 제거
  • 다음 파일 삭제

Vagrant

잘 사용하지 않아서 지웠다. 지우는 방법은 다음과 같다.

XQuartz

수동으로 제거해야한다. 가능하면 XQuartz를 요구하는 앱을 사용하지 않을 생각이다.

https://gist.github.com/pwnsdx/d127873e24cef159d4d603accaf37ee4

Evernote

삭제방법

모든 브라우저를 닫고, 다음 명령을 실행한다.

MySQL

Silverlight

공유 기능 끄기

시스템 환경 설정 – 공유

다음 공유 서비스가 켜져 있었다.

  • 화면 공유 : vnc
  • 파일 공유 : smb, afp
  • 원격 로그인 : ssh

모두 해제했다.

시작 프로그램 제거

시스템 환경설정 > 사용자 및 그룹 > 로그인 항목

필요없는 응용프로그램을 – 버튼을 사용해서 제거한다.

  • ITunesHelper : iPod, iPhone, iPad가 연결됐는지 확인하는 백그라운드 애플리케이션
    • 필요할 때만 iTunes를 직접 여니까 제거했다.
  • EOS Utility : Canon 카메라 연결 도구
  • WDDriveUtilityHelper : WD Drive Utilities. WD drive(외장하드)를 설정, 관리, 진단하는 프로그램
  • WDSecurityHelper : 외장하드 관련된 건데, 정확히 어떤 동작을 하는지 모르겠다.

프로세스 확인하기

활성 상태 보기 앱을 실행해서 프로세스 이름으로 정렬해서 눈에 띄는 것이 있는지 확인한다. 여기서 delfino 같은 걸 찾았다. 메모리나 CPU 사용량으로 정렬해서 확인해보고, 높은 것이 있으면 위에 i 아이콘이 있는 버튼을 눌러 상세 정보를 보고 판단한다.

블루투스 끄기

이제 블루투스 키보드, 마우스, 이어폰을 사용하지 않아서 모두 제거하고 블루투스 자체를 사용하지 않음으로 설정했다.

시스템 환경설정 > Bluetooth

Siri 끄기

Siri도 사용하지 않아서 껐다.

시스템 환경설정 > Siri

런치패드에 물음표 생겼을 때

런치패드에서 물음표 생긴 아이콘을 휴지통으로 마우스로 드래그해서 이동하면 된다.

How do I get rid of this question mark shown in Launchpad?