<시작>

간단한 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)
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])
Posted by WebPeace

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

문자셋 지정 예 

# -*- coding: cp949 -*-
# -*- coding: utf8 -*-
# -*- coding: ansi -*-
Posted by WebPeace
사용자 삽입 이미지
.NET은 MS의 전유물이다??
사실 맞는말이다. 하지만 Google을 헤엄쳐 다니다 보면 많은 개발자들의 Windows용 Application의 Linux Porting 프로젝트를 살펴 볼 수 있다. (sourceforge나 kldp.org 뭐 이런 싸이트들..)
 .NET 환경도 마찬가지로 멀티플랫폼을 위해 (특히 유닉스 환경을 위해) 구축된 환경이 존재하는데 이름하여 Mono이다.
(자세한 정보는 http://www.go-mono.com을 통해 확인할 수 있다.) 사실 2004년 부터 이 프로젝트를 눈여겨 봐왔는데 상당히 개발이 많이 진척된 듯 하다. 현재 Mono 1.2.16에서는 windows 고유의 클래스인 System.Winform() 클래스까지 구현된 것으로 보인다. (Mono를 개발하고 있는 Novel사에서는 아직 불안정하다고 한다)
 Mono에 대한 나의 경험은 이정도로 하기로 하고, 소개할 책은 Mono에 대한 문서를 Internet에서 PDF나 Html Form의 Document 밖에 구할 수 없다고 생각한 사람들, 새로운 것을 접하고 싶은 사람들을 위한 책이다.
 Mono의 구버전을 기준으로 설명이 되었지만 대체적으로 Mono의 기본적인 개념이나 Mono가 지원하는 Feature 등을 이야기하고 있다. 나름대로 설명이 상당히 깨끗하게 되어있는 책이라고 볼 수 있다. (사실 많은 컴퓨터에 관련된 지식을 인터넷으로 찾고 읽어보지만, 상당히 Instant한 정보들이라 뭐 하나를 배워보고자 할때는 좋지 않은 거 같다. 그러한 사람들에게 추천하고 싶은 책이다, 물론! Mono에 대해서 알고 싶은 사람들에게..)
 개인적으로 .NET Web Application을 표현하는 양식인 ASP.NET에 예전부터 관심이 많았으나 오픈소스 신봉자인 나로써는 굉장히 구미가 땅겼다고 보면 된다.
 글이 상당히 두서 없는데, 책에 대한 설명은 요정도로 하고 Mono에 대한 이야기와 여러가지 내가 알고 있는 지식들을 한 번 다음에 포스팅 해 볼 생각이다. (시험 기간이 끝나고...)
Posted by WebPeace

 C에서는 String을 character array로 처리하기 때문에 분명 다른언어보다 문자열 처리가 어려운 반면에 Low Level의 문자처리가 가능한 장점이 있다.

 보통 C에서 쓰이는 gets()함수는 New Line Character ('\n')까지 글자를 받아들일 수 있는 장점이 있지만 Character Array의 저장공간이 넘어서 메모리에 까지 Character을 저장하기 때문에 주로 BOF Hacker의 공격대상이 된다. 이에 대한 버그를 수정하고 char을 array가 아니라 pointer로 처리하여 메모리의 낭비를 적게한 gets함수를 나름대로 수정해 보았다.

/* 입력된 글자가 저장되어 있는 양만큼의 메모리 포인터를 return */
/* Argument에 입력된 integer pointer에 입력된 문자의 수 return */

char *get_line2mem(int *char_num) {
     int n = -1;
     char temp;
     char *input;
     while(1) {
          temp = getch_linux();
          input = realloc(input, ++n * sizeof(char));
          input[n] = temp;
          if(temp == '\n') {
               input[n] = '\0';
               break;
           }
      }
     *char_num = n;
     return input;
}

Posted by WebPeace

 Windows/DOS 환경에서 지원하는 Turbo C에서는 "conio.h"라는 패키지에서 getch(), getche()함수를 지원한다. 하지만, gcc를 이용한 컴파일에 사용되는 glibc에는 stdio.h/stdlib.h를 눈을 뒤집어 쓰고 찾아봐도 위 함수를 지원하지 않는다.

 그럼 리눅스에서는 이런함수를 어떻게 대체해서 쓸까? 찾아본 결과, 아래와 같이 대체하여 쓸 수 있다고 한다!!

/* 꼭 include 해주도록 한다. */
#include <termios.h>
#include <unistd.h>

char getche_linux(void) {
    struct termios oldt, newt;
    int ch;
    tcgetattr(STDIN_FILENO, &oldt);
    newt = oldt;
    newt.c_lflag &= ~(ICANON | ECHO);
    tcsetattr(STDIN_FILENO, TCSANOW, &newt);
    ch = getchar();
    printf("%c", ch);
    tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
    return ch;
}

 위의 진한 소스코드 부분을 조금더 응용하여, 진한 부분을

 printf("*");로 치환하게 되면 비밀번호를 입력하는 형태의 입력 방식을 구현할 수 있다. 또한 printf()명령을 사용하지 않으면 getch함수를 구현할 수 있다. (위의 함수는 getche()함수를 구현한 것이다.)

Posted by WebPeace

사이드바 열기