<시작>

간단한 WebTool들의 Automation을 위해 cPAMIE를 통한 Internet Explorer의 Control을 많이 이용함

하지만, Internet Explorer의 Automation을 도와주는 cPAMIE는 다음 문제를 가지고 있다.

- 하위 호환성 문제 (cPAMIE for Python 2.4와 2.6의 문법 및 동작이 다름)
- COM(Component Object Model)을 통해 Internet Explorer과 통신하기 때문에 Windows 환경에 종속적
- 고급적인 Browser Control을 위해서는 COM에서 사용하는 함수를 알아야 함

이를 해결하기 위해 다양한 Platform에서 동작하는 WebBrowser Control (Automation) Tool인 Selenium을 이용

<Firefox 3.0.x 설치>

 Firefox 공식페이지

<Selenium-Core XPCom 및 Selenium-Core Server의 설치>

 Selenium-CoreXPI : (Firefox Module이므로 Firefox에서 설치) 
 Selenium-RC : 해당 파일을 다운 받아 selenium-server-1.0-beta-2 폴더만을 압축을 풀어 특정 폴더에 복사

<Selenium-Core Server의 실행>

 Windows나 리눅스/Mac의 Terminal을 열어 selenium-server의 압축을 푼 폴더로 이동하여 해당 명령을 실행함으로써 Server를 가동한다.

Prompt> java -jar selenium-server.jar -interactive

<Python-SeleniumRC Module의 설치>

- easy_install을 통해 SeleniumRC Client-Driver Python Module를 설치한다.

Prompt> easy_install selenium


<Script Test 예제 (Google 검색)>

- 다음 스크립트 파일을 Python에서 Test 해보도록 한다.

import selenium
# Selenium Connection 인스턴스 생성
a = selenium.selenium("localhost", 4444, "*firefox", "http://www.google.com")

# 해당 인스턴스 정보에 따라 Firefox에 창을 생성
a.start()

# http://www.google.com을 기준으로 /의 위치의 문서 열기 -> http://www.google.com/
a.open("/")

# q라는 form input 개체안에 SearchKeyword라는 단어를 입력한다
a.type("q", "SearchKeyword")

# BtnG 이름을 가진 버튼 클릭 (Google의 폼 전송 버튼이 BtnG)
a.click("btnG")

# 검색결과창의 HTML 소스를 긁어온다.
source = a.get_html_source()

# 창 닫기
a.close()

# 인스턴스 해제 및 Firefox의 종료
a.stop()
Posted by WebPeace™

<시작>

shell 접속을 자동화하기 위해 Python에서 SSH를 접속하는 모듈을 필요로 함
해당 모듈이 paramiko이며 pycrypto에 대한 Dependency가 있어 먼저 pycrypto를 설치해야 함

(easy_install를 이용한 설치가 보통 쉬우나 win32에서는 pycrypto의 소스코드 컴파일에 따른 스크립트 수정이 필요하므로 각개격파로 설치)

(1) pycrypto 설치

  • 정식 배포본은 소스코드로만 배포되는데 소스코드의 컴파일을 위해서는 Cygwin의 MingW나 VS.NET 2003을 필요로 하므로 미리 컴파일된 파일을 첨부했음

    Pycrypto Win32 Binary for Python 2.4: pycrypto-2.0.1.win32-py2.4.zip
    Pycrypto Win32 Binary for Python 2.5: pycrypto-2.0.1.win32-py2.5.zip

    각자 자신의 컴퓨터에 맞는 Python 버전을 선택하여 바이너리를 설치하도록 한다. (Windows Installer이므로 쉽게 설치 가능함)

(2) Paramiko 설치

  • 정식 배포본 : paramiko-1.7.4.zip

    다운로드 후 압축을 푼다.
    시작 -> 실행 -> cmd (명령 프롬프트 열기)
    아래처럼 커맨드 창이 뜨면 python setup.py install이라 입력하고 엔터

C:\paramiko-1.7.4> python setup.py install

(3) 테스트

  • IDLE나 Python Command에서 다음과 같이 입력한다.

>> import paramiko
  • 아무런 에러없이 import가 진행되면 설치 완료


<Paramiko DEMO Test>

para_demo.zip

(1) 위의 demo파일을 다운로드 받아 특정 폴더에 압축을 푼다.
(2) demo.py 실행

C:\para_demo> python demo.py

<타 프로그램에 이용하기 위한 간단한 예제>

import paramiko import sys import socket import os # SSHClient 인스턴스 생성 client = paramiko.SSHClient() # 저장된 Host 키값이 없으면 Policy에 따라 자동적으로 Host 키값 추가 client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # SSH 접속 정보 입력 client.connect(hostname='ipaddress', username='ID', password='PW') # 실행할 커맨드 입력 stdin, stdout, stderr = client.exec_command("ls -al") # 접속 종료 client.close() # SSH에서 결과로 뿌려주는 output 출력 (stdout) for line in stdout: print line.strip('\n')
주의) 이 프로그램은 cd나 pwd와 같은 명령어를 통한 폴더 이동 후 interactive한 path의 유지가 불가능함
둘 이상의 interactive한 명령어를 실행하려면 Thread를 통해 SSH의 Channel Session을 유지시켜줘야 함. 
이는 위의 para_demo.zip의 interactive.py 코드의 windows_shell()이나 posix_shell() 참조 
관련문서 : http://www.lag.net/pipermail/paramiko/2007-December/000582.html 

팁) 확인 해 본 결과 아래식으로 몇가지의 명령어를 동시 실행 가능하다 
(원래 터미널에서 ;로 여러 명령어를 한 줄에 쓸 수 있음)

# 명령어 리스트
cmd_list = ['cd target', 'ls -al', 'quelist']

# ;로 붙이기
req = ';'.join(cmd_list)

# 커맨드 실행
stdin, stdout, stderr = client.exec_command(req)
이올린에 북마크하기(0) 이올린에 추천하기(0)
Posted by WebPeace™

Python에서는 일반적인 형식의 데이터가 아닌 형태를 포함하고 있는 list를 정렬 할 때 key를 통한 효율적인 sort가 가능함

Key에 입력되는 Argument는 Variable이 아니라 Function 이름 (Pointer)임

# Sort를 하는 기준인 Key를 반환하는 Function : input된 list의 두번째 value를 반환
def sortrule_selection(item):
    return item[1]

# 위에서 정의한 Method
a = [[1, 5], [3, 4], [4, 7], [2, 6]]
a.sort(key=sortrule_selection)

# 또는 lambda를 이용하여 직접적으로 함수의 정의가 가능함, 위와 같은 기능을 하는 코드
a.sort(key=lambda item:item[1])
이올린에 북마크하기(0) 이올린에 추천하기(0)
Posted by WebPeace™

Linux 및 Mac OS X의 POSIX 기반의 운영체제에서 작동하는 wxPython Module은 기본적으로 문자셋을 지정해줘야 인식함

문자셋 지정 예 

# -*- coding: cp949 -*-
# -*- coding: utf8 -*-
# -*- coding: ansi -*-
이올린에 북마크하기(0) 이올린에 추천하기(0)
Posted by WebPeace™

 난 솔직히 이전부터 영화나 소설 작품에 울지 않는, 눈물이 메말라 버린 인간이었다. 20년이라는 어떻게 보면 길지도 않은 삶인데다가, 그다지 문학적 감수성도 풍부하지 않았고 그렇다고 6.25 전쟁, 5.18 혁명 같은 역사의 굴레속에도 살지 않은 인간, 즉 풍랑을 견뎌 보지 않은 온실 속의 화초라고나 할까.. (절대로 귀하게 자랐다는 말은 아니다. 단지, 삶의 굴곡이 없었을 뿐)
 하지만, 옛 격언에 "겪어보지 않은 자 어찌 알리오."라는 말이 있듯이.. 좀 특이한 작품을 이야기해볼까한다. (스포일이 있으니 아직 보시지 않은 분들은 조용히 Backspace를 누르시길.. 영화를 보고 읽을 것을 강력히 추천하는 바이다.)

 세상은 언제나 현실적이다. 세상에는 "바람과 함께 사라지다"와 같은 불꽃 같은 로맨스도 존재하지 않고, "슈렉"과 같은 개연성 없는 해피엔딩도 존재하지 않는다. 단지, 원인과 결과라는 굴레 속에 사람들의 슬픔과 기쁨, 아픔이 얽히고 설키어 응어리 질 뿐..
 이 영화는 그러한 세상의 현실성을 꿈과 같은 작화에 담은 작품이다. 한마디로 배경과 그들의 추억은 꿈과 같지만 현실로 돌아오는 순간 이 영화의 감동은 시작된다. (작자 주 : 이 영화를 보고 감동이라는 단어는 적절치 않다는 사람 분명히 존재할 것이다. 작자도 감동이라는 단어를 적절히 다른 단어로 바꾸고 싶지만, 나와 비슷한 느낌을 가진 사람들에게는 분명히 감동이라 전달될 것이라 생각하기에 그냥 단어를 놔둔다.)

 - 첫사랑이라는 느낌의 표현 : 누군가는 한 번쯤은 겪어 봤을 아름다운 이야기
 첫사랑을 떠올리면 사람들은 보통 어떻게 생각을 할까? 이 영화에서 표현한 타카키(남자 주인공 분)의 첫사랑은 말그대로 아련한 추억일까? 아니면 현실을 살아가는 데 방해가 되는 제거해야 할 응어리 일까...
 사실 이 영화에서의 1화 "벚꽃 무리"에서는 어느 드라마, 소설, 영화에서나 표현 할 수 있는 "사랑 이야기"이다. 아름다운 벚꽃 무리의 배경으로 부터 시작하여, 아름다운 벚꽃 무리의 배경으로 끝나는 1화, "벚꽃무리"는 아름다운 첫사랑의 이야기를 표현하기에 충분하다. 하지만, 이것으로 첫사랑에 대한 청자들의 느낌을 표현 할 수는 없다. 왜냐, 사람들은 추억이나 해피앤딩만으로는 이러한 이야기들을 그저 시시콜콜하고 뻔한 사랑이야기로 넘겨 버릴 것이 뻔할테니..
 하지만, 3화의 "초속 5cm"에서 그러한 사랑이야기를 아련한 추억이냐, 방해가 되는데 제거해야 할 것이냐를 청자에게 결정권을 넘기면서 첫사랑이라는 느낌의 표현을 시작하게 된다. 청자는 그러한 선택의 기로속에서 자신의 경험을 비추어 보면서 알 수 없는 감정이입에 끌리 듯이 현실에서는 끌어낼 수 없는 자신의 첫사랑의 이야기를 떠올리게 된다. 특히나 배경음악으로 깔리는 "one more time, one more chance"는 첫사랑에 대한 미련 아닌 미련을 표현하고 있지만, 지나가는 그림들은 현실 세계를 보여주며 더욱더 청자들의 아쉬움과 미련을 극대화 시킨다. 이는 1화에서 보여주었던 첫사랑의 이야기가 아름답고 아련하면 아련할 수록 마지막에서 보여주는 현실이 더욱더 슬프고 아쉬운 것이다.

- 짝사랑 : 역설? 짝사랑은 사랑이 아니지만, 사랑이다.
 짝사랑, 생각하면 참으로 가슴아픈 단어이다. 짝사랑을 하는 대상이 몰라 주는 것도 상당히 아픈 일이지만, 그러한 현실을 알면서도 자신의 감정을 조절 할 수 없다는 현실 자체도 상당히 슬프다. 2화 "우주비행사"는 바로 이러한 짝사랑을 나타내었다.
 대사중에 이런게 있었다. "나는 ㅇㅇ를 사랑하지만, ㅇㅇ는 날 사랑하지 않는 것을 알고, 하지만 그래도 난 ㅇㅇ를 사랑 할 수 밖에 없어." 짝사랑은 온전한 사랑이 아니지만, 사람이기에, 사랑이기에 분명 냉철한 판단에 아님을 알고서도 할 수 밖에 없는게 짝사랑이라는 것..

- 숨겨진 의미들과... 첫사랑, 짝사랑, 이별 사랑의 삼박자의 감동 포인트
 살면서 누구나 한 번 쯤은 겪어 봤을 이야기, 그런 시시콜콜한 이야기 속에서 작가는 현실적인 결말에 감동을 걸었고, 사람들은 그러한 이야기 속에서 주인공들 속에서 자신을 발견한다. 그로테스크한 일상들의 배경은 이별과 현실에 대한 표현을 극대화 시켰으며, 그러한 일상속에서 보여지는 숨겨진 사물들 하나하나의 의미는 이 영화의 감동을 더욱더 극대화 시킨다. 3화에서 비록 빠른 장면 전환때문에 제대로 보지 못했던 "말"들도, 그들의 표정도.. 1화에서 보여주었던 편지를 전달하지 않았던 것도, 스치며 지나가는 "다이죠브(괜찮아)"라는 말도.. 다 한 맥락에서 볼 수 있다.

- 원점으로 : 첫사랑.. 설레나..후에 시리게 남는다.
 그 건널목에서 과연 첫사랑을 만났다면 나는 그렇게 매몰차게 지나갈 수 있겠는가?  그렇게 쉽게 첫사랑과 연락을 끊었을까? 그렇게 첫사랑을 사랑했다면 한 번 쯤은 붙잡을 용기가 없는가? 필자는 마지막 장면에서 이러한 고민들을 했다. 자연스럽게 시리게 남은 나의 첫사랑에 대한 똑같은 잣대의 질문이 주어졌고, 이러한 질문 하나하나를 생각할 때마다 가슴 한 켠이 시려오는 건 메말랐던 감정의 우물을 조금이라도 적신 기분이지 않을까 생각해본다.

- 글 쓴 후에
 사실 이런 글을 쓰고 나서 내 자신에 너무 실망한다. 분명 내가 받은 것은 200%인데 글로 표현할 수 있는 것은 20% 뿐인 것 같아 상당히 서운하다. 하지만, 이러한 감정을 Native하게 느끼는 방법은 영화를 여러 번 보는 것이 가장 좋은 방법임은 틀림없다.

이올린에 북마크하기(0) 이올린에 추천하기(0)
Posted by WebPeace™