Python + Django + Oracle

2009/11/05 01:37

Java + IIS + Tomcat + Spring + iBatis + Oracle 로 진행 하려던, 두 달짜리 프로젝트를, IIS + Python + Django + Oracle 로 하기 위해서 찾아보다가, "Django에 오라클 지원이 되긴 하지만, 커넥션 풀이 지원되지 않는 것 같다??"는 정보를 얻고는, 이를 극복하기 위해 여러 방안을 알아보고 있다. ㅠㅠ (IIS와 Oracle은 고객(?)의 환경인듯. -_-)

더불어, Django를 올리더라도, IIS에서 파이썬 프로세스가 매번 재실행되지 않아야 할텐데 싶어서 이것도 동시에 알아보고 있다. 이 쪽은 원래는 wsgi로 생각하다가, twisted.web(비동기인 모양이다)의 성능이 엄청나다고 해서, 이쪽에 또 혹~했다. -_-;; 근데 뭔가 알아볼수록 점점 더 복잡해지는 것 같아서, 이러다가 다시 자바로 돌아가는게 아닌지 걱정이 좀 된다.

내가 원하는 것은, IIS가 돌아가는 환경에서, 오라클을 DBCP 쓰듯이 쓰면서, WAS는 Django의 컨트롤러와 간단한 템플릿 엔진을 사용하고, 모델은 Django를 사용할 수 있으면 이걸 쓰고, 안되면, SQLAlchemy를 사용하는 것인데... 뭔가 간단치 않은 것 같다. 자바로 개발하기는 싫은데. ㅠㅠ (멤버십에 있는 내 PC에서 이클립스가 너무 느려서 파이썬으로 하려는거 아니다... 진짜다... 후... 그냥 PC를 사버리고, 자바로 할까... -_-;;)

TornadoWeb (epoll을 쓰기 때문에, Windows에서는 안된다.)
http://www.tornadoweb.org/

Twisted.Web
http://twistedmatrix.com/trac/wiki/TwistedWeb

SQLAlchemy - Connection Pooling
http://www.sqlalchemy.org/docs/05/reference/sqlalchemy/pooling.html

SQLAlchemy - Oracle
http://www.sqlalchemy.org/docs/05/reference/dialects/oracle.html

Oracle Backend with SessionPool (Django #7732)
http://code.djangoproject.com/ticket/7732

Django with twisted.web.wsgi
http://clemesha.org/blog/2009/apr/23/Django-on-Twisted-using-latest-twisted-web-wsgi/

Building Oracle Database-backed Web Applications in Django
http://www.oracle.com/technology/pub/articles/vasiliev-django.html

Connecting To Oracle Directly (Without settings.py)
http://blog.awarelabs.com/2007/connecting-to-oracle-directly-without-settingspy/

Django and Oracle (한글)
http://biohackers.net/wiki/DjangoAndOracle

pyorapool : An oracle connection pooling daemon for python based projects
http://pyorapool.googlecode.com/

Oracle & Python
http://demmer.ipax.at/blog/oracle-python/

Django on Windows with IIS and SQL Server
http://code.djangoproject.com/wiki/DjangoOnWindowsWithIISAndSQLServer

원래는, "검증된 것만 사용해서 빨리빨리 끝내자"라는 계획이었는데, 뭔가 점점 일이 커지는 것 같기도 하고;; 아 그냥, 순결한 마음가짐으로, servlet/jsp 날코딩으로 RESTful하게 만들어놓고, SproutCore와 jQuery로 적당히 때워줘야 하는걸까? 흠...

고객(?)의 요구사항에, "아무나 불러서 유지보수하기 쉽게"도 있었는데, (유지보수 비용을 낮추기 위한 프레임웍들임에도 불구하고) 뭔가 유지보수와는 점점 거리가 멀어지는 것 같기도 하고. -_-

-- 이상한 나라의 종텐.


Daum 날씨 사이트에서, 서울의 오늘 날씨를 문자로 보내주는 프로그램을 만들었다. 예전에 만들었던, 학교 식당 메뉴를 문자로 보내주는 프로그램에서, BeautifulSoup의 막강한 파싱 능력에 감동받으면서 달랑 몇 줄만 수정한 거라서.. 30분만에 만들었다. 허접한 소스를 공개한다. 라이센스는 Copyleft Allrights are Free이다. 이 코드의 DNA가 널리널리 퍼져나가길.

주소는 여기 : http://jong10.springnote.com/pages/1590644.xhtml

p.s. 원래는 네이버 날씨로 하려다가, 오늘 최저기온이 안 나오길래..


Jython, 일원짜리 팁들

2008/05/27 00:21

Jython

요 며칠간 삽질을 한 소소한 기록이다. 기록은 기억을 지배하므로 남겨둔다.

jythonc로 컴파일(!)하면, JVM용 클래스 파일로 만들 수 있다.

  • 다만, jythonc는 jython보다 버전이 늦게 올라 가는 듯?
  • 자바에서 사용할 메소드들에는 "@sig public int getNumber(boolean flag)" 와 같은 표시를 해준다.
  • jythonc로 컴파일 할 때에, -all 옵션을 주면, 여기저기 잘 붙는다.

Jython에는 unsigned가 없다.

  • Jython 자체가 Java로 만들어졌고, JVM 위에서 돌아가기 때문인듯.
  • array()에서 'B' 와 같은 unsigned byte도 당연히 지원되지 않는다.

Jython에서 만든 클래스를 Java에서 사용할 때,

  • 생성자에 매개변수가 없으면 @sig를 안써도 된다. (1개 이상 있으면 써야함.)
  • primitive type의 배열은 자이썬에서 리턴하고, 자바에서 받을 수 있다.
  • Jython에서 String[]을 리턴할 방법은 없지만, ArrayList에 add()한 후에 리턴하면 된다.
  • String의 인코딩은 UTF-8 인듯. (아마도..) 어차피 영문은 상관없다.

hex()의 결과는, Jython과 Python이 다르다.

  • hex(-129)를 하면, Jython에서는 "0xffffff7f"가 나오고, Python에서는 "-0x81"이 나온다.
  • 하지만, 사실 파이썬도 내부적으로는 0xffffff7f와 같은 2의 보수 형태로 저장한다. 2의 보수에서만 가능한 몇가지 성질이 그대로 적용된다.
  • 즉, 파이썬이나 자이썬이나 음수에 대한 자료 저장 형식은 같지만, hex()를 하거나, "%X" % 숫자 등의 방법으로 16진수로 표현된 문자열로 변환하면 결과가 다르게 나온다. 자이썬은 그대로를 문자열로 옮겨주는 경우이고, 파이썬은 숫자만 먼저 바꾼 후에 부호를 나중에 붙이는 방식이다. 일장일단이 있다.

-- Jong10


문자로 받은 화면 몇일전, 학교에서 수업시간에 어느 선배님이 "학교 식당의 식단을 문자로 받는 프로그램"에 대한 이야기를 들려주셨습니다. 파이썬으로 만든 프로그램이었는데, Beautiful Soup를 사용하면 엄청나게! 쉽다고 하셨었죠.

그래서 이틀전에, 시험 공부를 하려다가 뜬금없이.. 구글링을 해봤습니다. -_-; 파이썬 마을에서 Twill을 사용해서 문자를 보내는 예제를 찾았고, Beautiful Soup의 공식 도큐먼트를 보니깐.. 간단히 될 것 같더군요!

그래서... 만들어버렸습니다.

숭실대 정보대 식당의 식단을 문자로 받아보는 프로그램입니다.

food2sms.py : http://jong10.springnote.com/pages/1144338.xhtml

간략히 설명하면,
Beautiful Soup를 사용해서 특정 사이트에서 식단 정보를 긁어오고,
Twill을 사용해서, 문자천국 사이트에 접속 및 로그인 하고,
문자천국 사이트에서 내용을 기입한 후에..
보내기 버튼을 클릭하는 방식입니다.

보다 자세한 정보와 소스코드는 위의 링크에 있습니다. Copyleft입니다.

Beautiful Soup 라이브러리는.. 쫌.. 개사기더군요. -_-; 이거 뭐, 발로도 파싱을 할 수 있게 해놨네요. Twill 라이브러리도 상당히 만족스럽습니다. 쿠키를 지원하지 않는 듯 한게 흠이지만요.. 파이썬으로 프로그래밍을 해본 것이 처음인데, 꽤 만족스럽습니다. 그래도 루비의 보다 더 깔끔한 객체지향적인 문법이 더 마음에 들긴 합니다.

-- Jong10


Emacs에는 Python Mode라는 것이 있습니다. 열혈강의 파이썬 개정판 ver2에서 예제를 쳐보던 중에 Emacs의 구문 강조 기능이 아래와 같이 이상하게 나오더군요. (뭐야.. 코드인데 왜 문자열로 인식하는거야 ㅠㅠ)

파이썬 문법은 맞지만, 제대로 인식하지 못하는 에디터

p = re.compile('''href=([^'"]\S+?)[\s>]|href="([^"]*?)"|href='([^']*?)\'''', re.I)

바로 요 한줄 때문에 바보가 되어버린 것입니다. 이게 뭐, 강조에만 문제가 생기면 그냥 무시하고 예제를 때렸겠습니다만, 아랫 부분들이 전부 문자열로 인식되버리니깐, Emacs의 TAB 기능이 마비되더군요. -_-; 스페이스바로 하나하나 indent를 맞출 수도 없는 노릇이고..

"아.. 이거 다른 에디터를 찾아봐야하나.."하고 고민하다가, 결국 위 코드를 요렇게 고쳤습니다. 작은 따옴표 3개로 감쌌던 문자열을, 큰 따옴표로 하고, 대신에 그 안에 있는 글자들에서 따옴표들에 역슬래쉬를 붙여준거죠.

p = re.compile("href=([^'\"]\S+?)[\s>]|href=\"([^\"]*?)\"|href='([^']*?)'", re.I)

요 지저분한 코드로 바꿨더니, 아래 그림처럼 잘~ 나오더군요.

에디터가 이해하기 쉽게 고쳐준 모습

Syntax Highlighting 기능은 대부분의 에디터에선 정규표현식으로 검사를 해요. 예를 들어, Editplus에서는 ^[a-z_].*\([^;]*$ 라는 정규식 패턴에 부합되는 부분을 함수 본체로 인식합니다. (그래서 자동 줄변환도 되죠!).

하지만, 언어들이 복잡해져감에 따라서 정규식으로는 모든 문법을 커버하는 것이 힘든가 봅니다.
이맥스 파이썬 모드.. 살짝 실망했어요. ㅠㅠ

-- Jong10

p.s. Windows Live Writer로 지금 이 글을 작성하고 있는데, 자꾸만 C-x C-s를 누르네요 -_-;


1원짜리 팁!

Emacs의 설정파일 .emacs에서 컬러테마를 적용할 때에는,

(setq load-path (cons (expand-file-name "C:/~생략~/.emacs.d/") load-path))
(load-library "color-theme")

(require 'color-theme)
(color-theme-initialize) ;; <-- 요걸 몰라서 삽질했네!!
(color-theme-charcoal-black) ;; 테마 이름

요러 코롬 합니다. 자세한 것은 EmacsWiki: Color Theme에 있어요.
참조했던 사이트에는 color-theme-initialize가 안나와있어서 한참 헤맸네요. ㅠㅠ
(Color Theme는 따로 받아서 깔아줘야 함.)

 

팁 하나 더,
Emacs에서 파이썬 모드 사용하는거..

파이썬모드 다운로드: http://sourceforge.net/projects/python-mode/

python-mode.el을 load-path에 추가하고,

(autoload 'python-mode "python-mode" "Python Mode." t)
(add-to-list 'auto-mode-alist '("\\.py\\'" . python-mode))
(add-to-list 'interpreter-mode-alist '("python" . python-mode))

아래의 훅!도 넣어주면 좋아요.

(add-hook 'python-mode-hook
           (lambda ()
             (set (make-variable-buffer-local 'beginning-of-defun-function)
                  'py-beginning-of-def-or-class)
             (setq outline-regexp "def\\|class ")))
역시 자세한 것은, EmacsWiki: Python Mode에 있어요.
 
-- Jong10