2010년 12월 27일 월요일

지금은 ROI 테스트 중

ConAd ROI에 참여해주세요!!! 클릭 해주세요

2010년 4월 26일 월요일

[Django] html 페이지에서 int -> str형으로 변환 방법???

이 부분 또한 '파이썬 마을'에 문의 해 본 결과 해결 방법을 제시해 준 댓글이 있었다

그 내용을 토대로 나름대로 처리한 방법을 적어 본다.

 

우선 html 페이지에서 if문을 사용하다 보면 int형과 str형을 비교 할 때가 생기게 된다.
이때 서로 같은 형이어야 하는데 이걸 변환하는데 어떻게 해줘야 할지 몰라 고민 하는 분들이
많거나 따로 클래스를 만들어 사용 하시는 분들을 계시던군요

 

저는 다음 원문을 참고 하였습니다.

URL : http://docs.djangoproject.com/en/dev/ref/templates/builtins/#stringformat

if문을 다음과 같이 처리하여 현재 사용을 하고 있습니다.

{% ifequal entries.slot_status|stringformat:"s" entry.instance_code|stringformat:"s" %}

위의 비교 구문을 보면 둘다 문자형으로 변경하였는데 slot_status는 int형이며 instance_code는 str형이다. int형을 str형으로 변경하여 비교 하였을때 비교가 되지 않아 기존 str형도 다시 stringformat을 사용하여 문자형으로 변경하여 비교를 하였다.

이때 정상작동 하였으며 혹시나 이런 증상이 생기면 둘다 같은 구문으로 변경하여 해보는 것도 나쁘지 않을꺼 같다.

[Django] 기존 DB Table을 모델에 추가하여 사용하기

요즘 Django를 이용해 웹페이지를 작업 중에 있다.
이 과정에서 erwin으로 ERD를 그려 작업 해 놓은 DB가 있는데 이걸 Django 모델에서
바로 불러와서 사용 할려면 어떻게 해야 하나 많은 생각을 하고 검색하고 하는 과정에서
자주 들리는 '파이썬 마을'에서 문의를 한 결과 답을 알게 되었다.
혹시나 저처럼 헤메고 있으신 분들이 있으 실꺼 같아 이렇게 내용을 정리 해 본다.

방법은 아래와 같다.

1. 기존 DB 를 Django setting.py에 설정을 하여 접속이 가능하게 설정을 한다.
2. 다음 명령어를 입력 하도록 한다.
   python manage.py inspectdb > 저장하고자 하는 파일명.py
3. 명령어를 실행한 폴더에 '저장하고자 하는 파일명.py' 파일이 있음을 확인 할 수 있으며
    그 클래스들을 기존 model.py에 붙여 넣기 하셔서 사용을 하면 된다.

한번 알게 되면 정말 쉽게 DB 생성을 해 사용할 수가 있다.
혹시 몰라 원문URL을 아래에 링크 걸겠다.

URL : http://docs.djangoproject.com/en/dev/howto/legacy-databases/

2010년 4월 20일 화요일

Apache 웹 서버 장애 해결하기 1 (접속이 느려지거나 접속이 안 될 때)

접속이 느려지거나 접속이 안 될 때
가끔 접속자가 많은 서버를 운영하다 보면 갑자기 웹 접속이 되지 않거나 접속 이 너무 느려 아파치 데몬 개수를 확인해 보면 httpd가 256개나 떠 있는 경우 가 있다.
기본적으로 아파치 웹 서버의 경우 Max Clients가 256으로 설정되어 있어 동시에 256개의 데몬이 뜨게 되면 더 이상의 접속을 받아들이지 않고, 기 존의 프로세스가 죽을 때까지 대기한 후 접속이 끊기게 되면 그제서야 접속을 받아들이게 된다.
따라서 동시 접속이 많은 경우에는 이전의 웹 접속이 끊길 때까지 대기해야 하 므로 접속 속도가 느린 것처럼 느끼게 되는 것이다.
일반적으로 정상적인 접속 의 경우에 256개의 프로세스가 모두 뜨는 경우는 그리 많지 않기에 현재의 상 태가 비정상적인 접속인지 여부를 판단해야 한다. 이를 판단할 수 있는 방법 은 netstat -na grep ES로 ESTA BLISHED된 연결 상태를 확인하여 클라이언트 의 IP가 정상적인 연결인지 여부를 확인하면 된다.
또는 netstat -nagrep ESawk '{print $5}'sort로 클라이언트의 IP만 따로 소트하여 확인해 봐도 된다. 통상적으로 HTTP 1.1 규약에서부터 적용되기 시작 한 KeepAlive 기능을 지정하였을 경우 한 클라이언트 IP에서 동시에 3~5개 정 도의 http 프로세스를 생성하므로 한 IP에서 3~5개 정도의 프로세스를 생성하는 것은 정상적인 현상이다.
비정상적인 접속의 경우에는 다음과 같은 이유가 있을 수 있다.

Apache의 access_log에 관련된 파일형식 남기지 않게 하는 방법

이미지 서버를 구축해 사용하다 보면 access_log에 여러가지 파일형식의 로그들이 쌓여서
용량이 초과하는 경우가 많았을것이다. 여기서 로그들을 주석처리해서 막아 버리는 방법도
있지만 아래와 같이 해서 부분적으로 로그 쌓임을 방지 할수가 있다.

Apache httpd.conf 파일을 열어 다음의 내용들을 추가 하도록 하자.

### JPG Red Deny ####
SetEnvIf Request_URI \.jpg worm
SetEnvIf Referer \.jpg worm

### GIF Red Deny ####
SetEnvIf Request_URI \.gif worm
SetEnvIf Referer \.gif worm

### SWF Red Deny ####
SetEnvIf Request_URI \.swf worm
SetEnvIf Referer \.swf worm

### html Red Deny ####
SetEnvIf Request_URI \.html worm
SetEnvIf Referer \.html worm

### CodeRed Deny ####
SetEnvIf Request_URI \.ida worm
SetEnvIf Referer \.ida worm

### Nimda Deny #####
SetEnvIf Request_URI cmd\.exe worm
SetEnvIf Referer cmd\.exe worm
SetEnvIf Request_URI root\.exe worm
SetEnvIf Referer root\.exe worm
SetEnvIf Request_URI admin\.dll worm
SetEnvIf Referer admin\.dll worm

CustomLog /usr/local/apache/logs/access_log common env=!worm

진한 부분이 CustomLog 부분에 추가해줘야 할 부분이다.

Apache log들 용량을 줄이고 싶을때 사용하는 명령어

아파치 로그를 확인 하다보면 엄청난 양의 access_log,error_log를 확인할때가 있을것이다.
이때 이 양을 0으로 만드는 방법을 소개 하겠다.

cat /dev/null > access_log
cat /dev/null > error_log

Apache 버젼 확인 방법

부끄럽지만 내가 일하면서 알게 된 명령어ㅋㅋ
/usr/local/apache/bin/httpd -v
끝~~

2010년 4월 14일 수요일

Apache 웹서버에서 폴더 리스트가 출력 안되게 할려면...

Apache를 이용해 웹서버를 구축후에 이런 문의를 받았다
"폴더 리스트가 나오는데 안나오게 할 수 없나요"
이 문의를 받고 난 열심히 웹서핑을 시작하였다.

찾아낸 정보는 다음과 같다.

Apache 설정 파일인 httpd.conf 파일을 열고
/를 키워드 검색을 하자. 찾을 단어는 'FollowSymLinks'
찾게 되면 다음과 같은 문구를 볼수 있다.
Options Includes Indexes FollowSymLinks

그럼 여기서 어떻게 하면 되느냐 indexes를 지워주도록 한다.
그리고 Apache Restart를 해준후에 접근을 해보자. 그럼 원하던대로...

p.s 가상호스트일 경우에는 가상호스트 설정부분에도 indexes를 삭제해주면 된다.

2010년 4월 12일 월요일

cannot restore segment prot after reloc: Permission denied 

[root@localhost libexec]# /usr/local/apache/bin/apachectl start
Syntax error on line 205 of /usr/local/apache/conf/httpd.conf:
Cannot load /usr/local/apache/libexec/mod_pyapache.so into server: /usr/local/apache/libexec/mod_pyapache.so: cannot restore segment prot after reloc: Permission denied

이런 황당한 에러는... 아래와 같이 하면 해결됨.

[root@localhost libexec]# restorecon -R -v /usr/local/apache/libexec

또는

[root@localhost libexec]# chcon -t texrel_shlib_t /usr/local/apache/libexec/mod_pyapache.so

Exception handling과 readability

프로그래밍을 하다 보면 참으로 어처구니없이도 많은 Exception을 만나게 됩니다.
언어와 플랫폼에 무관하게 언제든지 exception은 프로그래머를 잡아먹을 기세로 눈을 번뜩이고 있습니다. 그래서 사용하는 exception처리 기법이 try-catch 구조 입니다.

의외로 경력 깨나 된다는 분들도 try-catch 구문을 무시하는 경향이 있습니다.
readability(가독성)을 몹시 떨어뜨리는 데다가 로직의 흐름을 한눈에 보기 힘들게 만들기도 하고, 코드가 길어지게 합니다. 때로는 디버그를 위해서 어떤 에러가 나는지를 직접 에러를 일으켜 보면서 따라가 봐야 할 때도 있습니다. 그래서 경험많은 프로그래머들도 깜빡 빼먹기 쉽습니다.

이쯤 읽으셨으면 "나는 이거 안읽어도 되겠다", 혹은 "한번 읽어봐야겠다"는 판단이 드실겁니다. 맞게 판단하셨으니 그렇게 하시면 됩니다^^ 어렵게 익힌 테크닉이나 심오한 로직따위는 나오지 않습니다.;;;

각설하고..
try-catch의 아이디어는 간단합니다.

어떤 코드를 우선 try(시도)합니다. 시도 결과 exception이 발생하면, 미리 정의된 exception 대응 행동(catch)을 수행합니다. 요즘의 대부분의 CPU는 exception이 생기는 몇가지 상황을 정의해 두었고 이 때에 특정 핀에 신호가 뜸으로서 exception을 알려줍니다. 이를 직접 사용하기도 하고, 컴파일러, 특정 API 또는 인터프리터레벨에서 한단계 더 포장하여 사용하는 경우도 많이 있습니다.
뭐가 됐건 간에 시도후에 실패하면 처리할 코드를 미리 정의해 두는게 기본 아이디어입니다.

C++, C# 등에서는,
[CODE type=cpp]
try {
// some statements...
} catch (Exception e) {
// handling statements...
}
[/CODE]
이와 같은 구문을 쓰죠.. 발생한 exception은 보통 객체(객체의 참조)로 전달받을수 있는데, 이는 사용하는 컴파일러, API, SDK, Framwork등 오만가지 이름으로 불리워지는 개발 플랫폼-_-에 의해 그 Type 명이 달라지기도 하므로 사용하는 개발환경의 문서를 참고하여 만들면 됩니다.

Python에서는
[CODE type=python]
try:
# some statements
except:
# handling statements
[/CODE]
이렇게 쓰면 됩니다.

미리 정의된 구체적인 Exception을 핸들링 할 때에는, 예를들어,
[CODE type=python]
try:
# some statements
except KeyboardInterrupt:
# Ctrl-C handling statements
except:
# handling statements
else:
# No exception
[/CODE]
이런 구문으로 Ctrl-C키를 눌러 중단시그널을 보냈을 경우와 기타 exception이 일어났을 경우, exception이 하나도 안생겼을 경우 수행할 코드까지 모두 정의 가능합니다.
[CODE type=python]
try:
# some statements
finally:
# whether an exception is asserted or not
[/CODE]
이렇게 하면 try후에 exception이 있던 없던 간에 finally 코드가 수행됩니다.
하지만 except: 구문과 finally: 구문은 함께 있을수는 없습니다. Python document에 의하면, 어떤 것을 먼저 수행해야 하는지가 모호해 지기 때문에 막는다고 되어있군요..

어찌됐건 예기치 못한 에러 상황에서 애써 작성한 프로그램이 죽어버리는 일이 생기지 않도록 하려면 exception handler를 만들어 주어서 에러를 견뎌 내도록 만들어 주어야 합니다.
이게 말이 쉽지 막상 그렇게 코드를 만들려고 하면 보통 짜증나는 일이 아닙니다.ㅡ_ㅡ

다음 예를 보죠..
[code type=python]
def get_host_and_port(s_addr='localhost:13579'):
'''
s_addr로 hostname:port notation의 서버주소를 받아서 호스트명과 포트번호를 쪼갠다.
'''
s_fields = s_addr.split(':')
from string import atoi
return s_fields[0], atoi(s_fields[1])
[/code]
이 간단한 함수는 고맙게도 왠만해서는 매우 훌륭히 작동해 줍니다^^
Python의 interactive-mode prompt에서 수행하면 이렇게 됩니다.
[code type=python]
>>> get_host_and_port('asdf.com:1234')
('asdf.com', 1234)
[/code]

그런데 문제가 있죠..
[code type=python]
>>> get_host_and_port('asdf.com')
Traceback (most recent call last):
File "", line 1, in ?
File "", line 4, in get_host_and_port
IndexError: list index out of range
[/code]
그렇습니다. 포트번호를 안주면 에러가 납니다.
그래서 코드를 고칩니다.
[code type=python]
def get_host_and_port(s_addr='localhost:13579'):
'''
s_addr로 hostname:port notation의 서버주소를 받아서 호스트명과 포트번호를 쪼갠다.
'''
s_fields = s_addr.split(':')
from string import atoi
try:
hostname = s_fields[0]
portnum = atoi(s_fields[1])
except:
portnum = 13579 # default port로 가정
return hostname, portnum
[/code]
이번에는 잘 될까요?

[code type=python]
>>> get_host_and_port('asdf.com')
('asdf.com', 13579)
>>> get_host_and_port(3)
Traceback (most recent call last):
File "", line 1, in ?
File "", line 5, in get_host_and_port
AttributeError: 'int' object has no attribute 'split'
[/code]
이전에 exception을 내던 문제는 해결됐는데 다른 문제가 또 있군요..
이번 문제는 parameter의 type문제 입니다. 결정을 해야 합니다. 숫자 파라메터를 받을수 없다고 exception을 내버리던지, 에러를 리턴하던지, 무시하고 미리 정의된 기본값으로 리턴할지..

이렇게 수정해 봅니다.
[code type=python]
def get_host_and_port(s_addr='localhost:13579'):
'''
s_addr로 hostname:port notation의 서버주소를 받아서 호스트명과 포트번호를 쪼갠다.
'''
try:
s_fields = s_addr.split(':')
except:
return ('localhost', 13579)

from string import atoi
try:
hostname = s_fields[0]
portnum = atoi(s_fields[1])
except:
portnum = 13579 # default port로 가정
return hostname, portnum
[/code]
처음의 단 두줄짜리 함수가 이렇게 지저분하게 indenting되며 늘어집니다.
자칫 코드에 로직이 선명히 보이지 않게 될 수 있습니다.
지금 예로 든 함수도 적절히 디버그되지 못하였습니다. 다만 try-catch 구문의 거의 유일한 단점인 가독성 저해를 강조해 보려고 일부러 저렇게 만든 것입니다. 가져다 쓰지 마세요. 위험한 프로그램을 만들어 줄겁니다;;;
(참고로 위 함수는 리턴이 두번 나옵니다. 매우 바람직하지 못하므로 도저히 피해갈수 없는 상황을 제외하고서는 절대 여러개의 리턴을 가지는 함수를 만들지 마세요. 석달후에 후회합니다. 게다가 아직도 핸들링되지 않은 exception발생가능성이 10,12,16 라인 등에 도사리고 있습니다. 로직 자체에도 결함이 있습니다. 귀차니즘의 압박으로...쿨럭;;;)

이렇게 코드가 더러워진듯 보여도 실제 저 코드를 사용하는 프로그램이 죽어버릴 가능성은 많이 줄어들었습니다^^

안정적으로 잘 돌아가는 프로그램일수록 소스코드는 try-catch로 얼룩져 있습니다.
개발직후 갖은 혹독한 테스트 환경에서 수도없이 많은 어처구니없는 exception을 리포팅 받아 모두 적절히 견뎌낼 수 있도록 만들어지기 때문에 안정적인 프로그램이라고 칭송받는 겁니다. 많은 이들이 욕하는 M$의 제품군들 역시 수많은 try-catch로 얼룩져 있으며, 윈도우98시절에 비해 현재는 M$의 소프트웨어가 대단한 안정성 향상을 이룩했다는 것을 누구나 인정합니다.
(절대 밝혀져서는 안될 어둠의 루트로 M$ 코드의 일부를 본적이 있습니다^^;;;)

try-catch의 거의 유일한 단점이 코드를 지저분하게 만드는 것이라고 했는데, 사실 습관 들이기 나름으로 가독성을 저해하지 않기도 합니다. 이건 제가 뭐라 말할 수 있는 성격이 아니군요.. 프로그래머 각자가 exception handling 코드를 포함해서도 읽기 좋은 코드로 만드는 습관을 들이는 것이 스스로에게도 도움되는 일일 것입니다. try-catch를 가급적 nesting안한다던지.. 등등등

유일한 단점이 아니라 "거의" 유일한 단점이라고 했는데, 다른 단점들도 많이 있겠지만 또 한가지 들수 있는 단점은, 완벽한 try-catch는 에러를 내지 않는다는 겁니다. 이건 또 무슨 말일까요?ㅡ_ㅡ

try-catch로 잘 막아서 절대 에러가 나지 않는 어떤 함수를 만들었다고 해 봅시다.
이런 함수를 다른팀의 누군가가 사용하려고 합니다. 이사람은 잘못된 parameter를 입력으로 넘겨주는 엄청난 버그를 만들어 놓고도 절대 발견하지 못합니다. 우리가 제공해준 함수는 어떤 잘못된 입력이 와도 어쨌거나 에러 없이 코드를 수행하고 적당히 리턴값을 만들어 주니까요.. 버그를 만든 사람은 역시 다른팀 코드를 가져다 쓰니 로직에 문제가 생긴다고 생각해 버리겠죠..

그래서 assert나 raise (어떤 언어에서는 throw)구문을 활용해서 적절히 일부러 exception을 일으켜 주거나, 전통적인 C함수의 방법처럼 리턴코드를 항상 리턴값에 포함시켜서, 현재 리턴값은 exception handling의 결과임을 알리는 방법을 사용해야 합니다. exception으로 인해 소프트웨어가 멈추지는 않더라도 call-stack의 상위 코드에 exception발생사실을 알려줄 필요가 있다는 거죠..

도무지 엔지니어링의 세계는 얼마나 많은 trade-off를 더 해야 할지 모르는 세계입니다.
저는 아직도 어디까지를 raise하고 어디까지를 감춘채 handling할지를 결정보지 못했습니다. 아마 적어도 제가 죽기전에는 그런 공식은 나오지 않을겁니다.

마지막으로 은근히 유용한 try-catch 구문의 장점을 말씀드리겠습니다.
"실력있어 보인다"는 겁니다.ㅡ_ㅡ;;; 서두에도 말했던 것처럼 생각보다 많은 개발자 분들이 십수년의 경력에도 불구하고 exception에는 관대합니다. 이 글을 읽으신 여러분이 exception에 엄격해 진다면 실력있어 보이는 것을 넘어 실력있는 개발자로 인정 받으실 겁니다.

자신감을 가지세요.. 여러분이 생각하는것보다 훨씬 많은 사람이 당신의 코드를 보고 감탄합니다. 진짜로 여러분이 만든 코드는 뛰어납니다. 모든 사람의 머리가 다르기 때문에 항상 새로운 코드가 만들어지기 때문입니다. 자신있게 작성하고 테스트하고 진화(evolution, innovation)해야 더 훌륭한 코드를 만들수 있을 겁니다.

[출처 : 루미넌스 - TechNote]

python 2.2 에서 MySQL_Python1.2.0 설치할 경우 에러 발생시

invalid distribution option 'download_url' 애러시
setup.py 의 39번째 라인에 추가.

if sys.version < '2.2.3':
from distutils.dist import DistributionMetadata
DistributionMetadata.classifiers = None
DistributionMetadata.download_url = None
추가 해준다.

파이썬으로 하는 웹 클라이언트 프로그래밍

[한빛미디어] 2002-12-16 11:51 / 조회수 1,369

저자: 데이브 워너(Dave Warner), 역 전순재

웹 클라이언트 프로그래밍은 웹에서 정보를 찾게 도와주는 강력한 테크닉이다. 웹 클라이언트는 (웹 주소 앞에 붙은 http) 하이퍼 텍스트 전송 프로토콜[1]을 사용하여 웹 서버로부터 데이터를 열람하는 프로그램 모두를 말한다. 웹 브라우저는 클라이언트이다. 웹 크롤러(crawler) 역시 클라이언트이다. 이 프로그램은 웹을 자동적으로 돌아다니면서 정보를 수집한다. 웹 클라이언트를 사용하면 웹에서 다른 사람들이 제공하는 서비스들을 이용할 수 있으며 웹 사이트에 역동적인 특징들을 추가할 수도 있다.

개발자들이 사용하는 툴박스에는 자연스럽게 웹 클라이언트 프로그래밍이 들어있다. 펄(Perl) 열성팬들은 이미 수년간 웹 클라이언트 프로그래밍을 이용해 왔다. 이런 웹 클라이언트 프로그래밍은 파이썬으로 처리하면 편리성과 유연성이 더욱 높은 수준에 이른다. 여기에 필요한 모든 기능들은 모듈 3개로 해결할 수 있다. HTTPLIB, URLLIB, 그리고 더 새로워진 XMLRPCLIB가 바로 그것들이다. 진정한 파이썬 스타일로, 각 모듈은 기존의 모듈 위에 구축되어 애플리케이션에 견고하면서도 잘 디자인된 기반을 제공한다. XMLRPCLIB는 다음에 논하기로 하고 본 기사에서는 첫 번째 모듈 두 개에 대해 다루겠다.

우리가 볼 예제에서는 미어캣(Meerkat)을 사용하겠다. 이럴 경우 여러분이 필자와 같은 생각을 가지고 있다면 시간을 들여 오픈 소스 공동체의 동향과 개발 상황들을 추적해서 경쟁력을 확보할 것이다. 미어캣(Meerkat)은 이 작업을 훨씬 더 쉽게 만들어주는 도구이다. 미어켓은 오픈 와이어 서비스(open wire service)로서 오픈 소스 컴퓨팅과 관련된 방대한 양의 정보를 수집하고 정리한다. 미어캣의 브라우저 인터페이스는 유연하고 맞춤가능하지만, 웹 클라이언트 프로그래밍을 사용하면 우리는 이 정보를 훓어보고, 추출하는 것은 물론이고 나중에 사용하기 위해 오프 라인에 저장할 수도 있다. 우리는 먼저 HTTPLIB를 상호대화적으로 사용하여 미어켓에 접근할 것이다. 그리고 나서 URLLIB를 통해 미어켓의 개방 API(Meerkat's Open API)에 접근해 들어가 맞춤가능한 정보 수집도구를 만들어 볼 것이다.

HTTPLIB

HTTPLIB는 소켓(socket) 모듈을 살짝 감싼 포장자(wrapper)이다. 앞에서 언급한 3개의 라이브러리 중에서 웹 사이트에 접근할 때 가장 제어가 쉬운 모듈이 HTTPLIB이다. 그렇지만 과업을 달성하기 위해서는 추가 작업을 더 해야만 제대로 제어할 수 있다. http 통신규약(protocol)은 "정보를 저장하지 않기(stateless)" 때문이다. 따라서 이전의 요구는 전혀 기억하지 않는다. 각 요구에 대해 여러분은 HTTPLIB 객체를 새롭게 구성하여 웹 사이트에 접속해야 한다. 요구들은 웹 서버와 대화를 형성하고 웹 브라우저를 흉내낸다. 라엘 돈페스트(Rael Dornfest)의 개방 API를 사용해서 미어켓에 접속해 보자. 그리고 어떤 결과를 얻는지 살펴 보자. 대화는 일련의 서술문들을 구축함으로써 시작된다. 먼저 원하는 작업이 무엇인지 서술한다. 그리고 나서 웹 서버에게 여러분을 식별시킨다.
>>> import httplib
>>> host = 'www.oreillynet.com'
>>> h = httplib.HTTP(host)
>>> h.putrequest('GET', '/meerkat/?_fl=minimal')
>>> h.putheader('Host', host)
>>> h.putheader('User-agent', 'python-httplib')
>>> h.endheaders()
>>>

GET 요청은 어느 페이지를 받기 원하는지 서버에게 전달한다. 호스트 헤더(Host header)는 질의하고자 하는 도메인 이름을 서버에게 전달한다. 현대적인 서버들은 HTTP 1.1을 사용하여 여러 도메인을 같은 주소에서 사용할 수 있다. 만약 서버에게 어떤 도메인 이름을 원하는지 알려주지 않는다면, 여러분은 '302' 출력전환(redirection) 응답을 반환 코드로 얻게 될 것이다. 사용자-에이전트 헤더(User-agent header)는 서버에게 여러분이 어떤 종류의 클라이언트인지 알려 준다. 그래야만 서버는 여러분에게 보낼 수 있는 것과 없는 것이 무엇인지를 이해할 수 있기 때문이다. 이것이 웹 서버가 요구를 처리하기 위해 필요한 정보이다. 다음으로 여러분은 응답을 요구한다.
>>> returncode, returnmsg, headers = h.getreply()
>>> if returncode == 200: #OK
... f = h.getfile()
... print f.read()
...

이렇게 하면 현재의 미어켓 페이지를 간략한 형태(minimal flavor)로 출력할 것이다. 응답 머리부와 응답 내용은 개별적으로 반환되며, 이렇게 하면 반환된 데이터의 문제를 해결하거나 해석하는데 모두 도움이 된다. 만약 응답 머리부를 보고 싶다면, print headers를 사용하면 된다.

HTTPLIB 모듈은 소켓 프로그래밍의 기계적인 면을 구별해준다. 게다가 HTTPLIB 모듈은 버퍼링을 위해 파일 객체를 사용하기 때문에 친숙하게 데이터 조작에 접근할 수 있지만 더욱 강력한 웹 클라이언트 애플리케이션을 위한 빌딩 블록이나 문제가 생긴 웹사이트와 상호 대화를 나누기 위한 빌딩 블록으로 더 잘 맞는다. HTTPLIB 모듈이 가지는 유용한 디버그 능력은 두 영역 모두에 도움을 준다. 객체 초기화 후에 어느 곳에서나 h.set_debuglevel(1) 메소드를 호출하면 HTTPLIB에 접근할 수 있다. (예제에서는 다음의 h = httplib.HTTP(host) 라인이다). 디버그 수준이 1에 설정되어 있으면 HTTPLIB 모듈은 getreply()을 호출한 결과들과 요청들을 화면에 응답할 것이다.

파이썬의 상호대화적인 특성 덕분에 즐겁게 HTTPLIB를 사용하여 웹 사이트를 분석할 수 있다. 이 모듈을 익히면 웹 사이트의 문제점들을 진단하기 위한 강력하고 유연한 도구를 가지게 되는 것이다. 또 시간을 가지고 HTTPLIB에 대한 소스를 살펴보라. 200줄도 안되는 코드임에도 불구하고, HTTPLIB를 사용하면 빠르고 쉽게 파이썬으로 소켓 프로그래밍을 시작할 수 있다.

URLLIB

URLLIB는 HTTPLIB에서 발견되는 기능에 대해 세련된 인터페이스를 제공한다. URLLIB 모듈은 웹 사이트를 분석하는 것보다는 데이터 그 자체를 찾아 내는데 가장 유용하게 사용된다. 다음 코드는 URLLIB를 사용해서 위와 똑같은 상호작용을 한다. (주의: 마지막 줄을 화면 출력을 위해 두 줄로 쪼개었지만, 여러분의 스크립트에서는 나누지 말 것!)
>>> import urllib
>>> u = urllib.urlopen
('http://www.oreillynet.com/meerkat/?_fl=minimal')

이것이 다이다! 한 줄로 미어켓(Meerkat)에 접근해서 데이터를 얻었으며, 그 데이터를 임시 저장소에 보관했다. 해더 정보에 접근하려면
>>> print u.headers

그리고 전체 파일을 보려면
>>>print u.read()

그러나 이것이 전부는 아니다. URLLIB는 HTTP뿐만 아니라 FTP, Gopher, 심지어는 같은 방식으로 지역 파일에도 접근할 수 있다. 이 모듈이 제공하는 많은 유틸리티 기능에는 url 해석하기, 문자열을 url-안전 형태로 코드전환(encode)하기, 그리고 한참 긴 데이터 전송 중에 진행 표시를 제공하기가 있다.

미어켓을 사용하는 예제 하나

한 그룹의 고객(client)들이 있는데 그들이 최신 리눅스 소식을 이메일로 꾸준히 받아보기를 바라고 있다고 상상해보자. 우리는 짧은 스크립트를 작성할 수 있다. URLLIB를 사용하여 이 정보를 Meerkat으로부터 얻는다. 링크의 목록을 구축한다. 그리고 그 링크들을 나중에 전송하기 위해 파일에 저장한다. 미어켓(Meerkat)의 저자인 라엘 돈페스트(Rael Dornfest)는 미어켓 API를 통해 우리 대신 대부분의 작업을 이미 완성해 놓았다. 남아있는 것은 요구를 구성하고, 링크를 해석하며, 나중에 전송하기 위해 그 결과를 저장하는 것 뿐이다.

단지 이것 때문에 사람들이 미어캣으로 전향하는 것일까? 이러한 "정보받기(passive)" 서비스를 제공하면 사람들은 그 정보를 한가할 때 볼 수 있다. 그리고 그 정보를 골라서 친숙한 형식(예를 들어 이메일)으로 저장할 수 있다. 월요일 아침에 메일함에서 뉴스들이 도착하기를 기다리기만 하면, 한 주간 "말려 올라간" 정보들을 하나도 놓치지 않을 것이다.

미어캣의 간략한 형식(minimal flavor)은 기사가 15개로 제한되므로 데이터를 놓칠 가능성을 줄이기 위해 우리는 스크립트를 (즉, Unix의 cron 작업 또는 NT의 AT 명령어를 사용하여) 매 시간 실행시킬 것이다. 여기에 우리가 사용할 url이 있다 (주의: 우리는 이 줄을 두 개의 줄로 나누어 화면에 표시했다. 이 URL을 사용한 결과는 여기에서 볼 수 있다).
http://www.oreillynet.com/meerkat/?p=5
&t=1HOUR&_fl=minimal&_de=0&_ca=0&_ch=0&_da=0

이 코드는 지난 한 시간 동안에 있었던 모든 리눅스 이야기들(profile=5)을 끌어 와서, 데이터를 간략한 형식(minimal flavor)으로 보여준다. 설명도 없고, 범주정보도 없으며, 채널 정보, 데이터 정보도 없다. 우리는 또한 정규 표현식 모듈의 도움을 받아 링크 정보를 추출하고 출력결과를 추가 모드로 열려진 파일 객체로 방향전환할 것이다.

결론

우리는 겨우 이 모듈들의 표면만을 건드려 보았다. 웹 클라이언트 작업에 사용할 수 있는 것 말고도 파이썬에는 다른 많은 네트워크 프로그래밍 모듈을 사용할 수 있다. 웹 클라이언트 프로그래밍은 특히 방대한 양의 계산표형 테이터를 다룰 때 유용하게 사용할 수 있다. 최근의 한 전자 데이터 교환(EDI) 프로젝트에서 우리는 웹 클라이언트 프로그래밍을 사용하여 거추장스러운 독점 소프트웨어 패키지를 우회하였다. 갱신된 가격 정보를 웹으로부터 직접 얻어서 데이터베이스에 집어 넣었다. 그렇게 함으로써 우리는 많은 시간을 절약하고 좌절감을 극복할 수 있었다.

웹 클라이언트 프로그래밍은 웹 사이트의 구조와 견고성을 테스트하는 데에도 유용하게 사용될 수 있다. 일반적으로는 죽은 링크들을 점검하는 방법으로 사용된다. 표준 파이썬 배포본에는 이것에 대한 완전한 예제가 딸려온다. 이 예제는 URLLIB에 기초한다. Tk-기반의 프론트 엔드[2] 모듈인 웹체커(Webchecker)는 파이썬 배포본의 tools 하부디렉토리 아래에서 찾아볼 수 있다. 또다른 파이썬 도구인 린봇(Linbot)은 URLLIB 모듈의 기능을 개선해 준다. 린봇으로 여러분은 웹 사이트의 문제를 모두 해결할 수 있다. 웹 사이트들이 점점 더 복잡해짐에 따라 웹 사이트의 질을 확인하기 위해서는 다른 웹 클라이언트 애플리케이션들이 필요하게 될 것이다.

웹 클라이언트 프로그래밍에는 함정이 하나 있다. 여러분의 프로그램은 페이지의 형식이 조금만 변경되어도 영향을 받는다. 반드시 웹 사이트가 오늘 데이터를 출력하는 방식이 내일도 그대로 유지된다고 장담할 수는 없다. 페이지의 형식이 바뀌면 프로그램도 바뀌어야 한다. 사람들이 XML에 그렇게 흥분하는 이유 중 하나가 바로 이것 때문이다. 웹에서 데이터에 태그를 붙여 의미를 주면 형식은 중요하지 않게 된다. XML 표준이 진화하고 범세계적으로 인정됨에 따라, 훨씬 더 쉽게 그리고 튼튼하게 XML 데이터를 처리하게 될 것이다.

우리가 여기에서 다룬 도구들에는 약간의 제한이 있다. HTTPLIB 모듈과 URLLIB모듈은 클라이언트-기반 작업에는 탁월하지만 오직 한 번에 한 개의 요청만을 처리할 수 있기 때문에 서버를 구축하는데 사용해서는 안된다. 비동기적인 처리방법을 제공하기 위해 샘 러싱(Sam Rushing)은 멋진 도구모음을 구축하였다. 이 도구모음은 asyncore.py 를 포함하여 표준 파이썬 배포본에 딸려 온다. 이 접근법을 사용하는 가장 강력한 예제는 조프(ZOPE)이다. 조프는 애플리케이션 서버로서 샘 러싱(Sam Rushing)의 메듀사 엔진(Medusa engine)을 사용하여 구축한 빠른 http 서버를 포함하고 있다.

다음 기사에서는 XML과 웹 클라이언트 프로그래밍을 어떻게 XMLRPCLIB 모듈에 결합하는지에 대해 논의해볼 생각이다. XML을 사용하면 미어켓(Meerkat) API로부터 더욱 많은 기능을 짜낼 수 있다.
--------------------------------------------------------------------------------
각주
[1] Hyper Text Transfer Protocol
[2] front end: 프론트 엔드
예) GUI는 front end 이며 구현된 기능들은 back end이다.

--------------------------------------------------------------------------------
데이브 워너(Dave Warner)는 Federal Data Corporation사의 선임 프로그래머이자 데이터베이스 관리자(DBA)이다. 그는 P자로 시작하는 언어(Python, Perl, PowerBuilder)로 관계형 데이터베이스에 접근하는 방법을 연구하고 있다.
출처: Hanbit Network

linux서버에서 python으로 mysql 사용하는 cgi쉽게 만들기

집필자 : shinmoosung 님이 쓰신 글입니다. 좋은 자료가 될꺼 같아 가지고 왔습니다.


먼저 리눅스 서버를 설치하고,
1. apache 2.0.x이상
2. python최신버전
3. mysql 최신버전
4. MySQLdb(mysql.org의 download에 보면, python 연결용 connector들을 제공한다)

각각의 프로그램의 설치는 이곳에서 설명을 생략한다.

단, apache의 httpd.conf에서는 AddHandler cgi-script .cgi를 설정하는 것과 cgi가 실행될
디렉토리에서 Options +ExecCGI 를 해주어야 cgi가 실행되므로 잊지 않고 설정한다.

이제 python의 라이브러가가 설치된 디렉토리로 간다.
python2.4.x버전에 설치되었다면 보통 /usr/lib/python2.4 폴더가 된다.

이곳에서 dp.py파일을 만들고

import _mysql
class usedb:
def __init__(self,MyDB='test'):
self.db = _mysql.connect(user='mysql',db=MyDB)
def __del__(self):
conn.close()
def query(self, SQLstr=''):
if SQLstr == '':
return "Nothing to execute"
self.db.query(SQLstr)
return self.db.store_result().fetch_row(0)

의 내용을 입력하고 저장한다. 그리고 파일권한은 644로 해둔다.
위의 내용에서 볼 수 있는 것처럼 mysql에는 기본적으로 test데이터 베이스가 있으므로, 데이터베이스를 지정하지 않았을 때는 자동적으로 그것을 사용하게 하였다.

user는 mysql계정으로 사용한다. 이것은 최근의 mysql버전의 설치에서 기본적으로 만들게 되는 계정이므로 그대로 사용한다.

이제 cgi를 실행하도록 된 디렉토리로 가서 아래의 내용으로

test.cgi를 만든다.
#!/usr/bin/python
print "Content-Type: text/html\n"
from db import usedb

s = "show tables;"
d = usedb('information_schema')
print d.query(s)

d = usedb()
print d.query(s)

파일을 저장하고 권하는 755로 한다.

그리고 웹에서 접속해 보면 test.cgi는 python을 이용하여, mysql의 데이터베이스를 사용하는 것을 볼 수 있다.
information_schema는 최신 mysql에서 기본적으로 제공하는 데이터베이스이다.
usedb() 처럼 데이터 베이스를 지정하지 않은 경우 자동적으로 test데이터베이스를 사용한다. SQL문법에 대한 설명은 생략한다.

이상으로 linux의 apache서버에서 python을 사용하여 cgi를 작성한 후, mysql데이터 베이스를 사용할 수 있는 방법을 설명하였다.

이상의 내용은 본인이 밤을 새워가면서, 외국의 자료들을 찾아가면서 얻은 값진 지식입니다. 국내에서는 이러한 지식을 보지 못했네요. 아직까지는요. MySQLdb를 써도 좋기는 합니다.
앞의 내용이 잘못된 부분이 있어서 코드를 완전히 수정해서 다시 올립니다. 신고
shinmoosung (2006-04-10 14:04)출처 : [직접 서술] 앞의 내용처럼 본인이 직접 코딩한 것입니다. 다른 분들이 발전시켜도 좋습니다.

앞의 내용은 제가 약간 이해를 못한 부분이 있어서 약간의 문제를 포함하고 있었음을 사과드립니다.
아래의 내용은 완전히 테스트를 통해 확인한 내용입니다.

먼저 클래스를 정의한 db.py의 내용을 아래처럼 수정합니다.

--------------------------------------------------------------------------------
import _mysql

class usedb:
def __init__(self, MyDB='test'):
self.DBname=MyDB
def do(self, SQLstr=''):
if SQLstr == '':
return "Nothing to do"
self.db=_mysql.connect(db=self.DBname,user='root')
self.db.query(SQLstr)
self.result=self.db.store_result().fetch_row(0)
self.db.close()
return self.result



--------------------------------------------------------------------------------

user='root' 부분은 각자의 mysql설정에 따라서 실행이 가능한 계정이면 됩니다.
즉, user='mysql'일 수도 있고, mysql설정에 따라서 아주 생략해도 되기도 합니다.
이제는 cgi가 실행되는 디렉토리에 test.cgi를 생성해서 다음의 내용을 입력합니다.

--------------------------------------------------------------------------------

#!/usr/bin/python
print "content-type:text/html\n"



from db import *
import cgitb; cgitb.enable()


d = usedb('mysql')
s= d.do("show tables;")
print s
print "

"

d = usedb('information_schema')
print d.do('show tables;')
--------------------------------------------------------------------------------

import cgitb; cgitb.enable()은 코드 디버깅을 위한 것이므로, 디버깅이 끝나면 삭제합니다.
이 예제 cgi에서는 mysql데이터베이스와 information_schema데이터베이스의 테이블목록을 보여주는 단순한 쿼리를 실행합니다.

일단 이것이 성공하면, 다른 SQL쿼리들도 된다는 이야기이지요.

웹에서 http://서버/test.cgi 로 실행합니다.

(리눅스)linux apache에서 python을 사용해서 mysql사용하기 신고
shinmoosung (2006-04-10 15:24)출처 : [직접 서술] 제가 직접!!! 연구하고 작성한 코드들입니다. 부족한 부분은 다른 사람들이 고쳐서 쓰세요. 이로써 리눅스의 아파치 서버에서 파이썬(python)으로 mysql데이터베이스 프로그래밍이 아주~~ 쉽게 가능해졌네요... php, jsp, asp 모두 물렀거라! 가장 쉬운 파이썬 나가신다~

앞에서 작성된 db.py 클래스 코드에 데이터베이스를 생성하는 createdb 메서드와 dropdb 메서드를 추가하여 완성한 코드를 올립니다.


db.py

--------------------------------------------------------------------------------
import _mysql

class usedb:

def __init__(self, MyDB='test'):
self.DBname=MyDB

def do(self, SQLstr=''):
if SQLstr == '':
return "Nothing to do"
self.db=_mysql.connect(db=self.DBname,user='root')
self.db.query(SQLstr)
self.result=self.db.store_result().fetch_row(0)
self.db.close()
return self.result

def createdb(self, MyDB):

"""db이름이 지정되지 않았으면 오류"""
if MyDB == '':
return "Specify the Database name to be created."

self.db=_mysql.connect(db='test',user='root')

"""같은 이름의 db가 있으면 오류"""
self.db.query("show databases;")
self.result=self.db.store_result().fetch_row(0)
for i in self.result:
if i[0] == MyDB:
self.db.close()
return "Database already exits!"

"""db 생성 및 결과 반환"""
self.db.query("create database " + MyDB + ";")
self.db.query("show databases;")
self.result=self.db.store_result().fetch_row(0)
for i in self.result:
if i[0] == MyDB:
return "Database successfully created!"
self.db.close()

def dropdb(self, MyDB):

"""db이름이 지정되지 않았으면 오류"""
if MyDB == '':
return "Specify the Database name to drop."

self.db=_mysql.connect(db='test',user='root')

"""삭제할 db가 있으면 삭제 실행"""
self.db.query("show databases;")
self.result=self.db.store_result().fetch_row(0)
for i in self.result:
if i[0] == MyDB:
self.db.query("drop database " + MyDB + ";")
self.db.close()
return "Database successfully droped!"
self.db.close()
return "Specified database not exits!"



--------------------------------------------------------------------------------

자세한 사용설명은 위의 내용을 참고하시고,
실제 사용 코드는 다음과 같습니다.

--------------------------------------------------------------------------------
#!/usr/bin/python
print "content-type:text/html\n"

from db import *
import cgitb; cgitb.enable()

#데이터 베이스 생성

d = usedb()
s = d.createdb("mydb")
print s
print "

" # -->그냥 줄넘기기 *^^*


#데이터 베이스 삭제
s = d.dropdb("mydb")
print s
print "

"
--------------------------------------------------------------------------------

출처 : [직접 서술] 이상의 내용은 본인이 밤을 새워가면서, 외국의 자료들을 찾아가면서 얻은 값진 지식입니다. 국내에서는 이러한 지식을 보지 못했네요. 아직까지는요. MySQLdb를 써도 좋기는 합니다.

Comparing Python to Other Languages(Python과 다른 언어와의 비교)

Disclaimer: This essay was written sometime in 1997. It shows its age. It is retained here merely as a historical artifact. --Guido van Rossum

Python is often compared to other interpreted languages such as Java, JavaScript, Perl, Tcl, or Smalltalk. Comparisons to C++, Common Lisp and Scheme can also be enlightening. In this section I will briefly compare Python to each of these languages. These comparisons concentrate on language issues only. In practice, the choice of a programming language is often dictated by other real-world constraints such as cost, availability, training, and prior investment, or even emotional attachment. Since these aspects are highly variable, it seems a waste of time to consider them much for this comparison.

Java
Python programs are generally expected to run slower than Java programs, but they also take much less time to develop. Python programs are typically 3-5 times shorter than equivalent Java programs. This difference can be attributed to Python's built-in high-level data types and its dynamic typing. For example, a Python programmer wastes no time declaring the types of arguments or variables, and Python's powerful polymorphic list and dictionary types, for which rich syntactic support is built straight into the language, find a use in almost every Python program. Because of the run-time typing, Python's run time must work harder than Java's. For example, when evaluating the expression a+b, it must first inspect the objects a and b to find out their type, which is not known at compile time. It then invokes the appropriate addition operation, which may be an overloaded user-defined method. Java, on the other hand, can perform an efficient integer or floating point addition, but requires variable declarations for a and b, and does not allow overloading of the + operator for instances of user-defined classes.

For these reasons, Python is much better suited as a "glue" language, while Java is better characterized as a low-level implementation language. In fact, the two together make an excellent combination. Components can be developed in Java and combined to form applications in Python; Python can also be used to prototype components until their design can be "hardened" in a Java implementation. To support this type of development, a Python implementation written in Java is under development, which allows calling Python code from Java and vice versa. In this implementation, Python source code is translated to Java bytecode (with help from a run-time library to support Python's dynamic semantics).

Javascript
Python's "object-based" subset is roughly equivalent to JavaScript. Like JavaScript (and unlike Java), Python supports a programming style that uses simple functions and variables without engaging in class definitions. However, for JavaScript, that's all there is. Python, on the other hand, supports writing much larger programs and better code reuse through a true object-oriented programming style, where classes and inheritance play an important role.

Perl
Python and Perl come from a similar background (Unix scripting, which both have long outgrown), and sport many similar features, but have a different philosophy. Perl emphasizes support for common application-oriented tasks, e.g. by having built-in regular expressions, file scanning and report generating features. Python emphasizes support for common programming methodologies such as data structure design and object-oriented programming, and encourages programmers to write readable (and thus maintainable) code by providing an elegant but not overly cryptic notation. As a consequence, Python comes close to Perl but rarely beats it in its original application domain; however Python has an applicability well beyond Perl's niche.

Tcl
Like Python, Tcl is usable as an application extension language, as well as a stand-alone programming language. However, Tcl, which traditionally stores all data as strings, is weak on data structures, and executes typical code much slower than Python. Tcl also lacks features needed for writing large programs, such as modular namespaces. Thus, while a "typical" large application using Tcl usually contains Tcl extensions written in C or C++ that are specific to that application, an equivalent Python application can often be written in "pure Python". Of course, pure Python development is much quicker than having to write and debug a C or C++ component. It has been said that Tcl's one redeeming quality is the Tk toolkit. Python has adopted an interface to Tk as its standard GUI component library.

Tcl 8.0 addresses the speed issuse by providing a bytecode compiler with limited data type support, and adds namespaces. However, it is still a much more cumbersome programming language.

Smalltalk
Perhaps the biggest difference between Python and Smalltalk is Python's more "mainstream" syntax, which gives it a leg up on programmer training. Like Smalltalk, Python has dynamic typing and binding, and everything in Python is an object. However, Python distinguishes built-in object types from user-defined classes, and currently doesn't allow inheritance from built-in types. Smalltalk's standard library of collection data types is more refined, while Python's library has more facilities for dealing with Internet and WWW realities such as email, HTML and FTP.

Python has a different philosophy regarding the development environment and distribution of code. Where Smalltalk traditionally has a monolithic "system image" which comprises both the environment and the user's program, Python stores both standard modules and user modules in individual files which can easily be rearranged or distributed outside the system. One consequence is that there is more than one option for attaching a Graphical User Interface (GUI) to a Python program, since the GUI is not built into the system.

C++
Almost everything said for Java also applies for C++, just more so: where Python code is typically 3-5 times shorter than equivalent Java code, it is often 5-10 times shorter than equivalent C++ code! Anecdotal evidence suggests that one Python programmer can finish in two months what two C++ programmers can't complete in a year. Python shines as a glue language, used to combine components written in C++.

Common Lisp and Scheme
These languages are close to Python in their dynamic semantics, but so different in their approach to syntax that a comparison becomes almost a religious argument: is Lisp's lack of syntax an advantage or a disadvantage? It should be noted that Python has introspective capabilities similar to those of Lisp, and Python programs can construct and execute program fragments on the fly. Usually, real-world properties are decisive: Common Lisp is big (in every sense), and the Scheme world is fragmented between many incompatible versions, where Python has a single, free, compact implementation.



--Guido van Rossum저. (이강성 역)

Java (자바)
Javascript (자바스크립트)
Perl (펄)
Tcl (티클)
Smalltalk (스몰톡)
C++
Common Lisp and Scheme


--------------------------------------------------------------------------------
Python은 흔히 Java, JavaScript, Perl, Tcl 또는 Samlltalk와 같은 인터프리터 언어와 비교된다. C++, Common Lisp 그리고 Scheme과 같은 비교되 부각된다. 이 절에서 난 이들 언어를 간단히 비교할 것이다. 이 비교는 언어적인 측면에서만 다룬다. 실제적으로, 프로그래밍 언어의 선택은 다른 실세계 제약(비용, 유용성, 학습 그리고 선행 투자비용 혹은 감성적인 친근감까지도)에 의해 자주 언급되기도 한다. 이러한 면들은 아주 가변적이고, 이러한 면으로 비교를 한다는 것은 시간 낭비에 가깝다.

Java (자바)
일반적으로 Python 프로그램은 Java 프로그램 보다는 느리게 수행된다. 하지만 Python 프로그램은 개발하는 시간이 훨씬 적게 걸린다. Python 프로그램은 Java 프로그램보다도 3-5배 정도 코드가 짧다. 이 차이는 Python의 내장 고수준 데이터 형과 동적인 형결정 기능에서 기인한다고 생각한다. 예를 들면, Python 프로그래머는 인수나 변수의 형을 선언하는데 시간을 허비하지 않고, 구문적인 지원이 언어안에 내장되어 있는 Python의 강력한 다형질의 리스트(polymorphic list)와 사전 형은 거의 모든 Python 프로그램에서 유용하게 활용되고 있다. 실행시간 형결정으로 인해서 Python의 실행시간에 Java가 하는 것보다 좀더 많은 일을 한다. 예를 들면, a+b와 같은 식을 계산할 때, 먼저 컴파일시에 알려지지 않은 a와 b 객체를 검사하여 그들의 형을 알아내야 한다. 그리고 나서 적절한 덧셈 연산을 호출한다. 그 덧셈 연산은 객체에 따라 사용자에 의해 오버로드(overloaded)된 것일 수 있다. 반면에, Java는 효과적인 정수형, 실수형 덧셈을 한다. 하지만 a와 b의 변수선언을 요구하고, + 연산자에 대한 사용자 정의 연산자 오버로딩을 허용하지 않는다.

이러한 이유들로, Python은 '접착' 언어로서 아주 적당한 반면, Java는 저수준 구현 언어로 특성화 지을 수 있다. 사실 이 두 언어는 아주 훌륭한 조합을 이룬다. Java에서 개발된 요소(components)들이 Python에서 활용된다; Python 역시 Java로 구현되기 전에 그 프로토타입을 정하는데 활용된다. 이러한 형의 개발을 지원하기 위해, Java로 쓰여진 Python 구현(implementation)이 개발중이다. 이것은 Java에서 Python을 호출하고 그 반대도 가능하게 해준다. 이 구현으로, Python 소스코드는 Java 바이트코드로 (Python의 동적 의미를 지원하기 위한 실행시간 라이브러리의 도움으로)번역된다.

Javascript (자바스크립트)
Python의 '객체기반' 부분 집합이 대략 JavaScript와 동일하다. JavaScript와 같이 (그러나 Java와는 다르게), Python은 클래스안에 정의하지 않아도 되는, 단순한 함수와 변수를 사용하는 프로그래밍 스타일을 지원한다. 하지만 JavaScript는 이것이 지원하는 전부이다. Python은, 반면에, 훨씬 큰 프로그램을 클래스와 상속이 중요한 역할을 하는 진정한 객체 지향 프로그래밍 스타일을 통하여 더 좋은 코드 재사용을 하도록 지원한다.

Perl (펄)
Python과 Perl은 비슷한 배경에서 개발되었다(유닉스 스크립트언어에서 성장했다). 그리고 많은 비슷한 기능을 지원한다. 그러나 철학은 다르다. Perl은 보편적인 응용지향 태스크를 지원하는데 중심을 두었지만 (예:내장 정규식 표현, 파일 스캐닝과 보고서 생성 기능들), Python은 보편적인 프로그래밍 방법론 (자료구조 설계 및 객체지향 프로그래밍)을 지원한다. 그리고 프로그래머가 우와하고(elegant) 암호같지 않은 코드를 통해 일기 쉽고 관리하기 쉽도록 한다. 결과적으로, Python이 Perl과 가깝지만 그 원래 응용 영역을 침범하는 일은 많지 않다. 하지만 Python은 Perl의 적합한 응용분야 외에 많은 부분에서 적용성을 갖는다.

Tcl (티클)
Python과 같이 Tcl은 독립적인 프로그래밍 언어 분 아니라, 응용 확장언어(extension language)로도 사용된다. 하지만, 전통적으로 모든 데이터를 문자열로 처리하는 Tcl은 자료구조에 약하고 Python 보다 실행에 시간이 많이 걸린다. Tcl은 또한 모듈러 이름영역(name space)와 같은, 큰 프로그램을 쓰기에 적합한 특징들을 가지고 있지 않다. 따라서 Tcl을 사용하는 전형적인 큰 응용 프로그램은 특별히 그 응용에 필요한 C나 C++로 확장된 부분을 갖는다. 이에 반해서 Python 응용 프로그램은 '순수한 Python'으로만 흔히 기술된다. 물론 순수한 Python을 이용한 개발은 C나 C++부분을 쓰고 디버깅하는 것보다도 훨씬 빠르다. Tcl의 결점을 매우는 부분이 Tk 툴킷이다. Python은 Tk을 표준 GUI 라이브러리로 쓰도록 적용했다.

Tcl 8.0은 바이트코드를 도입하여 빠른 처리를 했고, 제한된 데이터 형 지원과 이름영역을 지원한다고 하지만 여전히 거추장스러운 프로그래밍 언어이다.

Smalltalk (스몰톡)
아마도 Python과 Smalltalk의 가장큰 차이는 Python이 보다 더 '주류(mainstream)' 구문을 가진다는 것이다. Python은 Smalltalk과 같이 동적인 형결정과 결합(binding)을 한다. Python의 모든 것은 객체이다. 하지만, Python은 내장 객체 형과 사용자 정의 클래스를 구별하고, 내장 형으로부터의 상속은 현재로서 허용하지 않는다. Smalltalk의 데어터 타입의 표준 라이브러리 모음은 훨씬 섬세한 반면, Python의 라이브러리는 인터넷과 WWW 세계 (email, HTML, FTP등) 에 적응하기 좋은 많은 기능을 제공한다.

Python은 개발환경과 코드 배포에 있어서 다른 철학을 갖는다. Smalltalk이 환경과 사용자 프로그램을 포함하는 통일된 '시스템 이미지'를 갖는데 반해, Python은 표준 모듈과 사용자 모듈을 다른 파일에 저장하여 쉽게 재배열되고 시스템 밖으로 배포될 수 있다. 한 결과를 예를 들면, GUI가 시스템 안에서 설계된 것이 아니므로, GUI를 붙이기 위한 한가지 이상의 선택이 Python 프로그램에 있다.

C++
Java에 대해서 이야기 한 대부분이 C++에도 적용된다. Python코드가 Java 코드보다 3-5배 짧으며, C++코드에 비해 5-10배 짧다!! 일 예로 한명의 Python 프로그래머는 C++프로그래머 두 명이 1년에 끝낼 수 없는 일을 두달만에 끝낼 수 있다. Python은 C++로 쓰여진 코드를 사용하는 접착 언어로 빛을 발한다.

Common Lisp and Scheme
이들 언어는 동적인 의미해석에서 Python에 가깝다. 그러나 구문해석 접근은 너무 달라서 매우 심한 논쟁거리가 될 만한 비교가 된다: Lisp의 구문적인 부족함이 장점일까 단점일까? Python은 Lisp과 같은 내성적인 능력(capabilities)이 있고, Python 프로그램은 아주 쉽게 프로그램 부분을 구성해서 실행할 수 있다는 것을 밝혀야겠다. 일반적으로, 실세계 실체가 결정적이다: Common Lisp은 크다(어떠한 관점에서도 그렇다). Scheme 세계는 많은 어울리지 않는 버전들로 나누어져있다. 그에 반해서 Python은 하나이고, 무료이고, 작게 구현되었다. 더 자세한 Scheme와의 비교에 관해선 Moshe Zadka가 쓴 Python vs. Scheme을 보라.

2010년 4월 9일 금요일

Python을 배워야 하는 이유

cinsk의 그림
  

개인적으로나 업무상으로나 여러 스크립트 언어를 쓸 경우가 많은데, Python에 가장 큰 점수를 주고 싶습니다. Eric Raymond씨도 "How To Become A Hacker"란 글에서 프로그래밍을 배우고 싶다면 python을 배우라고 쓴 적이 있습니다. 저도, 꽤 많은 언어를 쓰고 있다고 생각하지만, Python만큼 강력하며, 쉽게 배울 수 있는 언어를 본 적이 없습니다. Python 언어에 대한 자세한 사항은 Python 관련 책이나 문서에서 충분히 얻을 수 있을 것이므로, Python에 대한 특징을 바라보는 입장에서 정리해 보았습니다. 여가 시간이 있거나, 배우고 싶은 언어를 찾고 있다면, Python을 익혀보기를 강력하게 추천합니다.


Programming에 대한 경험이 없는 사람의 경우



  • 복잡한 문법(어느 정도 주관적인 기준으로 바라본 것이긴 하지만)을 필요로 하는 Perl이나 C, C++에 비해 문법이 간단하다. 따라서 배우기 쉽다는 장점이 있다.

  • C와 비교했을 때, 포인터와 같은 배우기 힘든 개념이 없기 때문에, 상대적으로 많은 시간을 프로그램 구조와 디자인 등에 투자할 수 있다.

  • C++과 비교했을때, OOP의 기본적인 사항들은 더욱 빠르게 배울 수 있다.


  • 기본적으로 인터프리터 방식이기 때문에, 코드의 결과를 바로바로 확인해 볼 수 있고, 다양한 운영체제를 지원한다. 또한 원할 경우, 바로 실행 파일(.exe)을 만들어 낼 수도 있다.


  • 다양한 라이브러리를 지원하기 때문에, 상대적으로 적은 양의 코드만으로도 GUI 프로그램, game, CGI 프로그램등을 빠르게 만들 수 있다.



C/C++ 프로그래머인 경우



  • C/C++ 그리고 Bourne shell과 유사한 문법을 가지고 있기 때문에, 기타 다른 스크립트 언어에 비해 익히는 속도가 매우 빠르다.


  • OS에 관련된 기능들은 (예: POSIX interface) 대부분 C/C++에서 제공되는 함수와 같은 이름을 쓰고, 심지어 인자 타입이나 의미까지 비슷한 경우가 많기 때문에, 익혀야하는 함수들이 타 스크립트 언어와 비교할 때 많지 않다.


  • class, virtual function, 제한적인 operator overloading을 지원하기 때문에 C++에서 썼던 디자인 방식 그대로 적용할 수 있다.


  • Mixed language programming -- Python은 기타 다른 스크립트 언어에 비해 C/C++로 python module을 작성하기가 매우 쉽다. (어느 정도 주관적인 견해 포함)


  • 제한적이나마 lambda expression을 제공하기 때문에, LISP/Scheme 등에 익숙한 사람들도 비슷한 코드를 쉽게 만들 수 있다. map(), apply() 함수 제공, closure 제공


  • 다른 스크립트 언어에 비해 문서화가 잘 되어 있으며 (Tutorial, Library Reference, Language Reference 제공), 문법 자체에 LISP/Scheme과 마찬가지로 documentation string을 집어 넣을 수 있고, built-in 함수인 dir()을 쓰면, 함수, 모듈, 오브젝트가 제공하는 심볼 테이블을 바로 볼 수 있기 때문에 다른 스크립트 언어를 쓸 때에 비해, 따로 문서를 찾아보는 빈도가 낮아진다.


  • 함수, 클래스 또는 변수에 Decorator를 직접 제작할 수 있다. Decorator란 C/C++ 문법상 qualifier에 해당하는 것으로 다양한 wrapper를 만들거나 class인 경우 static, class method를 지정할 수 있다. Python 2.4 Decorators 참고



기타 사항



  • Dictionary (Postscript의 dictionary나 다른 언어의 associative array에 해당) 타입이 제공된다. 또한 immutable list에 가까운 tuple 타입이 제공되며, 서로 대입이 가능하기 때문에, 한 줄의 코드로 변수 값을 치환할 수도 있다.


  • 모든 타입은 repr() 연산을 써서 문자열로 변경할 수 있다. 또한 eval() 연산을 써서 문자열을 평가한 후 python type으로 불러 올 수 있다. 따라서 이 기능과 여러 DB 모듈을 잘 활용하면, 모든 Python type을 DB에 저장/로드하는 것이 가능해진다.


  • GTK+ binding이 제공되며, GTK+ C API 또는 C++ API(gtkmm)에 비해 훨씬 간단하게 GUI application을 작성할 수 있다. 또한 이미 GTK binary가 MS Windows 용으로 제공되기 때문에, 간단하게 Windows application도 만들 수 있다. (Pygtk 참고)


  • Python은 SDL binding을 제공하기 때문에, 게임을 만들어 보고 싶은 개발자에게도 최적의 언어라고 할 수 있다. (PyGame 참고)

  • Python 자체적으로 cgi, urllib, httplib 등의 모듈을 제공하며, 다양한 XML parsing module도 제공하며, Berkeley DB, GDBM, sqlite, oracle, ODBC등의 DB 모듈도 제공하기 때문에, Web application을 쉽게 만들 수 있다.


  • zlib, bz2, gzip, zipfie, tarfile등의 모듈을 자체적으로 제공하기 때문에 압축 파일 관련 처리가 매우 쉽다.


  • 다양한 os 기능과 함께 curses 모듈도 제공, terminal에서 실행되는 installer나 administrative tool을 만들기가 편리하다.


  • Built-in source debugger인 pdb를 제공한다.


  • 실제 개발할 때 Emacs(Pymacs, python-mode package 활용)에서 완벽하게 interpreter를 지원하며, 다양한 형태의 (buffer, region)등을 python 실행 결과를 확인할 수도 있다. 또한 Emacs 내부에서 디버거를 실행할 수 있으며(M-x pdb), Web browser w3m package를 쓰면 따로 도움말을 보기 위해 browser를 띄울 필요도 없기 때문에 매우 편리하다! (python-mode, w3m, emacs-w3m 참고)

파이썬(Python) 사용 현황

파이썬은 많은 제품이나 기업 및 연구기관에서 사용되고 있다. 아래에 그 대표적인 것을 몇개 들어 본다.

파이썬으로 작성된 자유/오픈소스 소프트웨어
Anaconda
BitTorrent
MailMan
MoinMoin
Plucker
Portage
PySol
ViewCVS
Zope / Plone
Trac

파이썬을 내부적으로 사용하는 소프트웨어
Blender
Inkscape
Paint Shop Pro
Shade
TRIBON (3D CAD Software)

파이썬을 이용하고 있는 기업·정부 기관
야후
구글
인더스트리얼 라이트 앤드 매직 (ILM)
미국항공우주국 (NASA)
미국 해양 대기청 (NOAA)

파이썬(Python) 언어 확장

ctypes

파이썬(Python) 한글 다루기

원래 파이썬은 미국 지역에서 개발되었기 때문에, 한글이나 한자와 같은 2바이트 문자를 지원하지 않았다.
그러나 Python 2.0 에서 유니코드 문자형이 새롭게 도입되어 다국어를 취급할 수 있게 되었다.
다른 스크립트 언어와 달리, 파이썬에서는 문자의 인코딩과 내부 유니코드 표현을 명확하게 구별한다.
유니코드 문자는 메모리에 저장되는 추상적인 개체이다. 화면에 나타내거나 파일 입출력을 할 때는 변환 코덱의 힘을 빌려서 특정 인코딩으로 변환한다. 또, 소스 코드의 문자 코드를 인식하는 기능이 있어, 다른 문자 코드로 쓰여진 프로그램의 동작이 달라질 위험을 해소하고 있다.
파이썬 2.4 에서는, CJK 코덱이 표준으로 배포판에 포함되게 되었기 때문에, 현재는 한글 처리에 문제는 거의 없다. 통합 개발 환경 IDLE에서의 한글 입출력도 기본적으로 가능하다고 한다.

파이썬(Python) 라이브러리

파이썬에는 「건전지 포함("Battery Included")」이란 기본개념이 있어, 프로그래머가 바로 사용할 수 있는 라이브러리와 통합 환경이 이미 배포판과 함께 제공된다.
이 때문에 파이썬의 표준 라이브러리는 매우 충실하다. 여기에는 정규 표현식을 비롯해 운영체제의 시스템 콜이나 XML 처리, 직렬화, HTTP ,FTP 등의 각종 네트워크 프로토콜, 전자 메일이나 CSV파일의 처리, 데이터베이스 접속, GUI, HTML, 파이썬 코드 구문 분석 툴 등이 포함된다.
써드파티 라이브러리도 풍부하며, 행렬 연산 패키지 Numeric Python 이나 이미지 처리용 Python Imaging Library, SDL 랩퍼인 PyGame 등은 잘 알려져 있다.
다만, 마이너 라이브러리까지 포함하면 너무 많아서 수습이 되지 않기 때문에, 최근 PyPI (Python Packages Index) 로 불리는 라이브러리의 저장소(repository)를 관리하는 기구가 새롭게 도입되었다.

파이썬(Python) 데이터형

파이썬은 기본 데이터형으로 정수형, 긴 정수형(long integer),부동 소수점수형, 복소수형, 문자형, 유니코드 문자형, 함수형을 갖고 있다.
긴 정수형(long integer)은 메모리가 허락하는 한 무제한의 자리수로 정수 계산이 가능하다.
여기에 집합적 데이터형으로 리스트형, 터퓰(tuple)형, 사전형, 중복을 허락하지 않는 집합형이 있다. 리스트형, 사전형은 내부의 값을 나중에 바꿀 수 있고, 터퓰형은 한 번 값을 정하면 내부의 값을 바꿀 수 없다.
집합형은 변경 가능하게도 변경 불능으로도 만들 수 있다. 또 많은 객체 지향 언어와 같이, 유저가 새롭게 자신의 형을 정의하는 것도 가능하다.
파이썬은
동적 타이핑 언어이기 때문에, 변수가 아닌 값이 타입을 가지고 있고, 변수는 모두 값의 참조(C++의 reference)이다.

파이썬(Python) 문법

파이썬의 문법에서 가장 잘 알려진 특징은 들여쓰기를 이용한 블럭 구조를 들 수 있다. 이것은 통상 C등에서 쓰이는 괄호를 이용한 블럭 구조를 대신한 것으로 매줄에서 처음오는 공백에 의해 눈에 보이는 블록 구조가 논리적인 제어구조와 일치하게 하는 방식이다. 아래는 C와 파이썬으로 재귀호출을 사용한 차례곱을 계산하는 함수를 정의한 것이다.

Python:
def factorial(x):
if x == 0:
return 1
else:
return x * factorial(x - 1)

들여쓰기가 잘 된 C:
int factorial(int x)
{
if(x == 0) {
return 1;
} else {
return x * factorial(x - 1);
}
}

이렇게 비교하여 보면 파이썬과 정리되어 들여쓰기가 된 C 언어와는 차이가 거의 없어 보인다. 그러나 여기서 중요한 것은 위쪽의 C 형식은 가능한 여러가지 스타일 중에 하나일 뿐이라는 사실이다.
즉 C로는 똑같은 구문을 다음과 같이 쓸 수도 있다.
읽기 어렵게 쓰인 C:int factorial(int x) {
if(x == 0) {return 1;} else
{return x * factorial(x - 1); } }
파이썬으로는 이렇게 쓰는 것이 허용되지 않는다. 파이썬에서 들여쓰기는 한가지 스타일이 아니라 필수적인 문법에 속한다. 파이썬의 이러한 엄격한 스타일 제한은 쓰는 사람에 관계없이 통일성을 유지하게 하며, 그 결과 가독성이 향상될 수 있는 장점이 있지만, 다른 한편 프로그램을 쓰는 스타일을 선택할 자유를 제약하는 것이란 의견도 있다.

파이썬(Python) 언어의 기능

파이썬은 언어 자신의 기능은 작게하여 사용자가 언제나 필요로 하는 최소한의 기능만을 제공하도록 만들어져 있다.
이것은 펄의 TIMTOWTDI (there's more than one way to do it - 문제를 해결하는 방법은 단 한가지가 아니다) 철학과는 대조적인 것이며, 파이썬에서는 다른 유저가 썼더라도 동일한 일을 하는 프로그램은 대체로 모두 비슷한 코드로 수렴한다.
기본 기능에 없는 많은 기능이 라이브러리에 의해서 제공되고 있다.
또, 파이썬 에서는 프로그램의 문서화가 매우 중시되고 있어 언어의 기본 기능에 포함되어 있다.
파이썬은 원래 교육용으로 설계되었기 때문에 읽기 쉽고, 그래서 효율적인 코드를 가능한 간단하게 쓸 수 있도록 하려는 철학이 구석구석까지 침투하고 있어, 파이썬 커뮤니티에서도 알기 쉬운 코드를 선호하는 경향이 강하다.

2010년 4월 8일 목요일

원격 접속 시 강제로 PC 리부팅 하는 방법

원격 접속을 한 후에 원격 PC를 리부팅 해야 하는데 리부팅 버튼이 없는 경우가 있습니다.
이런 상황에서 어떻게 하면 리부팅을 할 수 있을까요?
그 방법 아래와 같이 하시면 됩니다.

1. 실행 창에 cmd 입력 후 도스창을 하나 띄움
2. shutdown -r -f -t 00 이렇게 치면 바로 리부팅 합니다.
(-r 은 리부팅 옵션이고 -f 는 응용프로그램 강제로 종료하는 것이고 -t 00은 0초 후에
 바로 리부팅 하라는 말입니다. -t 옵션을 안주면 1분 후에 리부팅합니다.)

2010년 3월 23일 화요일

파이썬(Python) 동작하는 플랫폼

파이썬 최초 버전은 매킨토시에서 개발되었지만, 현재는 다양한 플랫폼에서 동작한다.

마이크로소프트 윈도(9x계 및 NT계는 최신판, 3.1 및 MS-DOS는 구판만)

매킨토시(OS 9 이전 및 OS X 이후 함께)

각종UNIX

Linux

PalmOS

Nokia Series 60

파이썬(Python)에 영향을 준 언어

ABC : 들여쓰기에 의한 블럭 구분

Modula-2 : 모듈 기능

ICON : 사전, 슬라이스 연산자 등

SETL : 리스트의 내포 표현

C, C++ : 기본적인 문법

SmallTalk : 객체 지향

Lisp, Scheme : 함수형 언어적 특징

파이썬(Python) 개요

파이썬은 초보자부터 전문가까지 폭넓은 사용자층을 보유하고 있다. 동적 타이핑(dynamic typing) 범용 프로그래밍 언어로, 루비와 자주 비교된다. 다양한 플랫폼에서 쓸 수 있고, 라이브러리(모듈)가 풍부하여, 대학을 비롯한 여러 교육 기관, 연구 기관 및 산업계에서 이용이 증가하고 있다. 또 파이썬은 순수한 프로그램 언어로써의 기능 외에도 다른 언어로 쓰여진 모듈들을 연결하는 풀언어(glue language)로써 자주 이용된다. 실제 파이썬은 많은 상용 애플리케이션에서 스크립트 언어로써 채용되고 있다. 도움말 문서화도 잘 되어 있으며, 유니코드 문자열을 지원해서 다양한 언어의 문자처리에도 능하다. 파이썬은 기본적으로 인터프리터 위에서 실행될 것을 염두에 두어 설계되었으며 다음과 같은 특징을 갖고 있다.: 동적 타이핑(dynamic typing). (실행 시간에 타입 체킹이 이루어진다.) 객체의 멤버에 대한 접근이 제한되어 있지 않다. (속성이나 전용의 메서드 훅을 만들어 제한할 수는 있음.) 모듈, 클래스, 객체등의 언어의 요소가 내부로부터 액세스 가능하고, 리플렉션을 이용한 기술이 가능. 인터프리터로는 오리지날 C 로 쓰여진 버전 CPython 외에, C 스택을 사용하지 않는 스택리스 파이썬이나, Java 가상 머신 상에서 동작하는 Jython(과거 JPython이라고 불렸음), .NET 플랫폼 상에서 동작하는 IronPython, 파이썬으로 재구현하는 PyPy 등이 있다. 현대의 파이썬은 여전히 인터프리터 언어인 것처럼 동작하나 사용자가 모르는 사이에 스스로 파이썬 소스코드를 컴파일하여 바이트 코드(Byte code)를 생성함으로써 다음 번 수행 시에는 빠른 속도를 보여준다. 파이썬의 이러한 특징으로 소스코드의 유출 등의 보안 문제도 해결할 수 있게 되었다. 파이썬에서는 들여쓰기(indentation)를 사용해서 블럭을 구분하는 독특한 문법을 채용하고 있다. 이 문법은 파이썬에 익숙한 사용자나 기존 프로그래밍 언어에서 들여쓰기의 중요성을 높이 평가하는 사용자에게는 잘 받아 들여지고 있지만, 다른 언어의 유저에게서는 프로그래머의 코딩 스타일을 제한한다는 비판도 많다. 이 밖에도 네이티브 바이너리를 생성해 주는 C/C++ 등의 언어에 비해 수행 속도가 느리다는 단점이 있다. 그러나 비즈니스 분야 등 일반적인 컴퓨터 응용 환경에서는 속도가 그리 중요하지 않고, 빠른 속도를 요하는 프로그램의 경우에도 프로토타이핑 후 빠른 속도가 필요한 부분만 선택적으로 C언어 등으로 모듈화 할 수 있다(ctypes, SWIG, SIP 등 wrapper생성 프로그램들이 많이 있다). 또한 Pyrex, Psyco, NumPy 등을 이용하면 빠른 수치 연산이 가능하기 때문에 과학 및 공학 분야에서도 많이 이용되고 있다.

파이썬(Python)은?

1989년 암스테르담에서 프로그래머귀도 반 로섬(Guido van Rossum)에 의해 개발되기 시작한 프로그래밍 언어로, 플랫폼 독립적이며 인터프리터식, 객체지향적, 동적 타이핑(dynamically typed) 대화형 언어이다. 파이썬이라는 이름은 귀도가 좋아하는 코미디 〈Monty Pythons Flying Circus〉에서 따온 것이다. 외래어 표기법에 따르면 Python은 영어를 기준으로 할 때 한글로 '파이선'으로 적어야 하나, 정식으로 채택된 한글 표기는 파이썬이다.

2010년 1월 11일 월요일

cakePHP 설치 시 주의 할 사항...

그냥 cakePHP를 설치 하는 분들이 다 설치 해놓고 아파치 설정이라 던지 간단한 설정들을 빼먹고 하실까봐 이렇게 정리 해 봐요.

우선 제가 겪은 문제점 cakePHP 1.2.5 + PHP 5.3 궁합이 안 맞다는 점.
타임 관련 함수 때문에 오류가 발생!!!

그래서 PHP 버젼을 5.2로 다운그레이드 해서 오류 해결하였음.

혹시나 하는 맘에 mod_rewrite 설정을 하면서 몇가지 실수 할 사항을 정리 해 보면
우선 mod_rewrite.so가 존재 하지 않는 다면 다음과 같이 설치를 한다.

/아파치 경로/bin/apxs -a -i -c /아파치 설치본 경로/modules/mappers/mod_rewrite.c

설치가 완료 되거나 이미 설치가 되어 있다면 httpd.conf에서 다음과 같이 설정이 되어 있는지 혹은 추가 해야 되는지 확인하도록 한다.

LoadModule rewrite_module     modules/mod_rewrite.so
추가가 되어 있는지

<Directory "/아파치 경로/htdocs">
   AllowOverride All
</Directory>

위와 같이 All로 되어 있는지를 확인 한 후 저장 하도록 한다.(.htaccess 파일을 사용할 수 있게 하기 위함.)
그리고 apache를 재시작 해주도록 한다.

그럼 설정 완료.
그외의 오류 들은 웹페이지 들을 보며 해결 하시길...
(해결 하는데 별 어려움 없이 해결 하실 수 있을 꺼에요.)