python unicode은 utf-8, utf-16 같은 encoding과는 다른 것이었다. 이것 때문에 엄청 해맸다.ㅜㅜ

http://wiki.python.org/moin/UnicodeEncoding 사이트의 내용을 번역해 본다.

파이선에서는 여러가지 Unicode 인코딩을 지원한다.

다음은 주로 쓰이는 유니코드 인코딩이다.
utf-8
utf-16

아주 중요한점은 이 유니코드 인코딩과 파이선 유니코드와는 별개라는 것이다.
 
다음은 utf-8 이나 utf-16 인코딩의 byte string과 파이선 unicode string의 차이점을 보여준다.

u"foo" - 이건 파이선의 unicode string 이다.
"foo" - 이건 그냥 byte string - 3 바이트 이다.
u"foo".encode('utf-8') -- 처음에 파이선 unicode string을 만든다음에, 이걸 다시 utf-8 으로 인코딩 한 byte string을 나타낸다.

'foo'를 표현하는 데는 3바이트가 필요하지만 u'foo'를 표연하는 데는 몇 바이트가 필요한지 알 필요가 없다.  
AND

python 에는 list comprehension 이라는 것이 있다. 리스트를 쉽게 만들 수 있게 해주는 문법이다.

1. 0 부터 99 까지 정수를 가지는 리스트를 만들어 보자.
>>> result = [ x for x in range(0,100) ]>>> print result [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60,61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]>>>
한 줄에 원하는 것을 만들 수 있어서 정말 편하다.

문법을 이해 하자면, 맨 앞의 x 가 리스트의 element로 들어가는 표현이다. x 라고 쓰지 않고 2**x 와 같이 쓴다면, 2 의 x 승의 값이 리스트로 들어 간다. x 값은 그 뒤에 나오는 for 문에 의해서 반복되어진다.

for 문은 중복해서 사용 가능하다. 
>>> result = [(x,y) for x in range(0,10) for y in range(0,10)]>>> print result[(0, 0), (0, 1), (0, 2) , (0, 3), (0, 4), (0, 5), (0, 6), (0, 7), (0, 8), (0, 9),(1, 0), (1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (1, 7), (1, 8), (1, 9),(2, 0), (2, 1), (2, 2), (2, 3), (2, 4), (2, 5), (2, 6), (2, 7), (2, 8), (2, 9),(3, 0), (3, 1), (3, 2), (3, 3), (3, 4), (3, 5), (3, 6), (3, 7), (3, 8), (3, 9),(4, 0), (4, 1), (4, 2), (4, 3), (4, 4), (4, 5), (4, 6), (4, 7), (4, 8), (4, 9),(5, 0), (5, 1), (5, 2), (5, 3), (5, 4), (5, 5), (5, 6), (5, 7), (5, 8), (5, 9),(6, 0), (6, 1), (6, 2), (6, 3), (6, 4), (6, 5), (6, 6), (6, 7), (6, 8), (6, 9),(7, 0), (7, 1), (7, 2), (7, 3), (7, 4), (7, 5), (7, 6), (7, 7), (7, 8), (7, 9),(8, 0), (8, 1), (8, 2), (8, 3), (8, 4), (8, 5), (8, 6), (8, 7), (8, 8), (8, 9),(9, 0), (9, 1), (9, 2), (9, 3), (9, 4), (9, 5), (9, 6), (9, 7), (9, 8), (9, 9)]
if 문을 사용해서 list에 추가 할때 filter를 사용 할 수도 있다.
>>> result = [ x for x in range (0,100) if x%2!=0 and x%3!=0]>>> print result[1, 5, 7, 11, 13, 17, 19, 23, 25, 29, 31, 35, 37, 41, 43, 47, 49, 53, 55, 59, 61, 65, 67, 71, 73, 77, 79, 83, 85, 89, 91, 95, 97]
python 사용하면서 아주 만족도가 높은 문법이다.
AND

trac 의 한 소스를 보다가 아래와 같은 문장을 보았다.


${ticket.exists and 'Submit changes' or 'Create ticket'}
ticket.exists 가 참이면 'Submit changes' 를 거짓이면 'Create ticket' 을 의미하게 되는 문장이다.
이 문장을 문법적으로 이해하려고 했는데 잘 이해가 되지 않았다.

python 에서 and 와 or 문은 True 나 False로 evaluation 되지 않는다.

x and y 는 첫번째로 x를 evaulation 하고 true 이면 x의 evaulation 값을 리턴하고, false이면 y의 evaluation 값을 리턴한다.

x or y 는 x를 evaluation 하고 true 이면 x의 evaulation 값을, false 이면 y이 evaulation 값을 리턴한다.

${ticket.exists and 'Submit changes' or 'Create ticket'} 문장을 보면 ticket.exists 가 참이면 'Submit changes' 를 evalutation 한다 이는 참임으로 'Submit changes' 스트링이 결과값이다. ticket.exists 가 False 이면 ticket.exists and 'Submit changes' 전체가 ticket.exists 로 계산되고  ticket.exists or 'Create ticket' 을 연산하게 된다.

나중에 python.kr 사이트에서 게시물 검색중 관련된 내용을 알았다.
C언어에서 a ? b : c 라는 표현을 python으로 옮길 때,
a and b or c 와 같이 표현하면 된다는 것을, 하지만 이때 b는 항상 true 로 판별되어야만 가능하다는 것을.....
AND

네이트 톡을 PDA 로 클리핑하여 보려고, 파이선 스크립트를 만들었다.
대부분의 게시판은 로그인을 요구하지 않았는데, 일부 게시판은 로그인을 요구하길래, 로그인이
가능한 스크립트를 만들다 보니 쿠키 핸들링이 필요하여 사용한던 내용을 정리해본다.
                               (A)                                        (B)
[브라우저 Client] <---------> [클리핑 스크립트] <---------> [네이트 톡 서버]

클리핑을 위해서는 위와 같은 네트웍 구성도가 된다.
클리핑 스크립트에 아이디/비밀번호 를 넣어 놓기가 좀 그래서, 브라우저 Client에서 쿠키로 스크립트쪽으로
보내도록 했다. (폼 데이터로 보내도록 해도 상관은 없다)

일단 (A)에서 클라이언트에서 보내주는 쿠키를 꺼내 보려면, os.environ["HTTP_COOKIE"] 값을 참조하면된다.

try:
    cookies = os.environ["HTTP_COOKIE"]
except KeyError:
    print "cookie is not set"
else :
    info = cookies.split(';')
    for item in info:
        if 'id' in item:
            login_id = item.split('=')[1]
        if 'passwd' in item:
            login_pw = item.split('=')[1]
(A) 에서 브라우저가 쿠키를 id=userId;passwd=userpw 이렇게 보내게 되면 id/pw 에 userid/passwd 값이
들어온다.

(B)에서 네이트 톡에 로그인 하기 위해서는 POST 로 form data를 전송하고 응답으로 받은 쿠키값을 session으로 이용해야 한다. 이 쿠키세션값을 담아 놓는 놈이 CookieJar 이다.

http 요청을 위해서는 urllib2 를 사용하고 Cookie 핸들링은 cookielib 를 사용한다.

cj = cookielib.CookieJar()
opner = urllib2.build_opener (urllib2.HTTPCookieProcessor(cj))
r = opener.open("http://xso.nate.com/login.jsp")
login_postdata = {'redirect':'http:/www.nate.com', "ID":login_id,"domain":"nate.com","PASSWD":login_pw,"ssl":""} # 로그인 폼 값
params = urllib.urlencode (login_postdata)
r = opener.open("http://xso.nate.com/servlets/LoginServlet", params)           

여기까지하면 id/pw 가 정확하다면 네이트에 로그인 세션이 생성되어 cj에 담기게 된다.
이 이후로 opener 를 이용하면 로그인 세션이 살아 있게 된다.

AND