분류 전체보기 - 해당되는 글 13건

HTML에서 이미지를 읽을 때 대부분의 경우 URL을 이용하지만,
때때로 Data URI Schema를 이용해야 하는 경우도 있다.
다음은 Python에서 이미지 데이터를 Data URI Schema로 얻는 코드이다.

from cStringIO import StringIO

from PIL import Image

import urllib, base64


# 이미지 객체에서 값 얻기

base = Image.new('RGBA', (w, h), (0, 0, 0, 0))

# do something on Image object

raw = StringIO()

base.save(raw, 'PNG')

b64png = 'https://t1.daumcdn.net/cfile/tistory/2362D34056EA60EB26"margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">

file = urllib2.urlopen(url)

buf = StringIO(file.read()) 

b64png = 'https://t1.daumcdn.net/cfile/tistory/2623EE4156EA60EC25
|
Javascript는 기본형 이외의 대부분의 자료들을 'object'라고 표현한다.
자료구조 중 Array와 Dictionary도 typeof 연산자로 구별할 수 없다.
별로 중요한 것은 아니지만, 그냥 갑자기 궁금해져서 궁리해 보았다.

찾아낸 방법 중 가장 마음에 드는 두 가지는 아래와 같다.

> a = new Array()
> a instanceof Array
true
> a.constructor === Array
true 


 jQuery 1.7에서는 'isArray'라는 함수를 구현해 놓았는데,
toString.call(obj)를 통해 "[object Array]" 문자열을 얻은 뒤
class2type이라는 내장 Dictionary에 대입하여 "array" 문자열인지 비교하는 방식을 사용하였다.
왜 이렇게 복잡한 방법을 썼는지는 잘 모르겠음 ㅋ
|
어제 (2011/10/26) 개발용 Macbook-Air를 Lion으로 업데이트 했다.
뭐, 여러가지 향상된 UX라던가 iOS와 동질감을 느낄만한 요소들이 많이 생겼지만,
내게 그게 중요한 건 아니었고... ㅋ

문제는 현재 진행 중인 프로젝트와 관련하여 Python 환경이 전부 초기화 되었다는 것이다.
업데이트 된  Lion에는 Python 2.5/2.6/2.7이 설치되어 있었고 기본 버전은 2.5로 되어있었다. 
개인적으로 선호하는 버전은 2.6 인데...

구글링 등을 이용해 찾은 버전 변경은 아무리 해도 먹질 않았다.
다들 Lion에서도 된다고 써있었는데 왜 내겐 안되는지...
취향 상 root 권한으로 시스템에 손대는 것은 좋아하지 않지만,
이번은 어쩔수 없었다.

다음과 같은 방법으로 기본 Python 버전을 2.6으로 변경할 수 있다.

$ cd /opt/local/bin
$ sudo rm python
$ sudo ln -s /opt/local/bin/python2.6 python
$ sudo rm python-config
$ sudo ln -s /opt/local/bin/python2.6-config python-config
$ sudo rm pythonw
$ sudo ln -s /opt/local/bin/pythonw2.6 pythonw

여기서 문제가 한가지 더 발생 했는데,
Python package가 설치되는 site-packages 폴더와
Aptana가 기본으로 인식하고 읽어들이는 site-packages 폴더의  위치가 다르다.
아... 거지같아...
다음과 같이 문제를 해결했다.

$ cd /Library/Python/2.6
$ sudo rm -rf site-packages
$ sudo ln -s /opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/ site-packages

이제 모든 것이 제대로 동작한다.
 
|
이전 글에서 AWS EC2를 이용해 웹서버 용 인스턴스를 생성하는 방법을 알아보았다.

하지만, 지금은 OS 동작만 외부와 연결할 수는 없다.

외부와 접속할 수 있는 수단이 없기 때문이다.
이제 서버를 안전하게 마음대로 주무를 수 있도록 하는 마법의 SSH 연결을 시도하겠다.


1. 먼저 외부 IP가 없다면, 서버는 외부의 입력을 받아들일 수 없다.
    따라서 외부 IP를 구하는 것이 우선이다.
1-1. EC2 탭에 아직 머물러 있다면,
      'NETWORK & SECURITY >> Elastic IPs' 메뉴를 선택한다.
1-2. 'Allocate New Address' 버튼을 찾아서 누르고, 팝업에서 'Yes, Allocate'를 누른다.
1-3. 생성된 아이피의 체크박스에 체크를 하고, 'Associate Address' 버튼을 찾아 누른다.
1-4. Select-Box에서 앞서 만든 인스턴스를 선택하고, 'Yes, Associate'를 누른다.

이제 'Instance ID' 항목이 빈칸에서 내 인스턴스 아이디로 바뀌었다면,
해당 아이피로 외부에서 접근이 가능하다.
다음으로 SSH로 접근을 해야하는데, 우리는 패스워드를 모른다.
그래서 pem 파일을 잘 보관하라고 한 것이다.

2. 이제 SSH 접속을 해보자.
    지금부터의 설명은 Mac OS X에서의 상황이다.
2-1. pem 파일을 적당한 폴더에 넣는다.
      내 파일의 위치는 
~/Documents/workdata/aws_certification/xxx.pem 이다.
2-2. 만약 pem 파일의 권한이 나 이외의 누군가에게도 있다면,
       SSH는 인증파일을 통한 인증을 거부하고 패스워드를 요청한다.
       때문에, 'chmod 0400 
~/Documents/workdata/aws_certification/xxx.pem'으로 권한 변경을 해준다.
2-3. ssh -i ~/Documents/workdata/aws_certification/ghilbut.pem root@[IP Address]  명령을 실행한다.
           성공적으로 root  권한을 획득하여 접속할 수 있다.

참고로 인스턴트를 중단시키면, IP 연결이 해제되므로
정지 후 재시동 시에는 반드시 IP를 다시 연결하도록 한다. 
|
AWS(Amazon Web Service)는 이미 클라우드 컴퓨팅의 대명사로 자리잡았다.
그 동안 서버 기동을 위해 하드웨어와 무수한 전쟁을 치루어 왔고
한동안 포스팅이 뜸했던 이유 중 하나도
글 쓰며 사용한 테스트 서버가 원인 불명의 사망을 하였기 때문에
이번 기회에 AWS에 모든 플랫폼을 옮겨 볼 생각이다.

첫 글은 데비안 서버를 AWS의 EC2 서비스를 이용하여 구현하는 것에 대해 쓰겠다.
그림은 없으니 글만 보고 찰떡같이 이해하시길 바란다.


1. AWS에 가입한다.

2. 화면 상단의 'Sign in the AWS Management Console' 링크로 간다.

3. EC2 탭을 선택한다.

4. 'Launch Instance' 버튼을 누른다.

5. 이제 사용자가 원하는 OS를 골라야 한다.

5-1. 테스트 용인데 비싼거 쓸 필요 있겠는가?
       아마존에서는 그래서 처음 시작하는 사람들을 위해 무료 체험을 허용한다.
       단, 인스턴스 파워나 용량 등의 제한이 있다.
5-2. 'Community AIMs'를 선택한다.
5-3. Viewing의 Select-Box에서 'Free tier eligible'을 선택한다.
5-4. 옆의 Text-Box에 Debian이라고 친다.
        검색창이므로 Debian 외에 다른걸 원하면 마음대로 검색어 치면 된다.
        다만, 띄어쓰기를 포함한 지능검색이 잘 안되므로 키워드 하나에만 의존해야 할 것이다.
5-5. 본인은 아래 사양의 이미지를 골랐다.
        AMI ID: ami-80e915e9
        Manifest: 624081292306/debian-6.0-squeeze-base-x86_64-20110417
 

6. 'INSTANCE DETAIL' 단계는 해당 이미지에 내 인스턴스만의 설정을 거는 부분이다.
6-1. 인스턴스 개수와 타입 등을 정한다. 당분간 무료로 쓰고 싶다면 그냥 넘어가자.
6-2. 커널 아이디 등을 설정하라고 나오는데 이것도 그냥 두면 된다.
6-3. 태깅을 해야하는데, Key에 Name이라고 된 칸의 Value에 원하는 서버 이름을 적자.
        이 부분이 관리창에 나타나는 서버 이름이 된다.
        중복 이름도 상관 없다. 같은 성격의 서버라면 다 같은 이름을 주어도 된다.

7. 'CREATE KEY PAIR' 단계다.
7-1. 이름 넣는 칸에 키 이름을 적는다.
7-2. 'Create & Download your Key Pair'를 Click 하면,
        7-1에서 적었던 {키이름}.pem 파일이 다운로드 된다.
        이 파일은 반드시 잘 보관해야만 한다.
        한번 만들어진 키쌍은 다른 인스턴트 생성에도 중복하여 사용할 수 있다.

8. 'CONFIGURE FIREWALL' 단계이다.
8-1. default가 있기는 하지만 하나 만들도록 한다.
8-2. 'Create a new Security Group'을 선택한다.
8-3. 이름과 설명을 간략히 쓰고,
       SSH, HTTP, HTTPS를 선택한 후 각각 'Add Rule' 버튼을 눌러 적용한다.

9. 마지막으로 'REVIEW' 단계에서 정보들을 확인한 후,
    'Launch' 버튼을 누르면 인스턴스가 실행된다.
 

이제 좌측 메뉴의 'Instances >> Instances' 메뉴로 들어가면 내 인스턴스를 확인할 수 있다.

|
여기를 참고하시라.
결과물 괜찮게 나옴... 
|
여기를 참고하시라.
아주 친절하게 설명되어 있다. 

참고한 페이지의 내용을 요약하자면,

1. site.cfg 파일을 열어서 아래와 같이 수정하고
registry_key = SOFTWARE\MySQL AB\MySQL Server 5.0
registry_key = SOFTWARE\MySQL AB\MySQL Server 5.5 

2. 여기에 가서 config-win.h 파일을 다운로드 받은 후
"C:\Program Files\Microsoft Visual Studio 9.0\VC\include" 폴더에 복사하고

3. "C:\Program Files\MySQL\MySQL Server 5.5\lib\mysqlclient.lib" 파일을
"C:\Program Files\Microsoft Visual Studio 9.0\VC\lib" 폴더에 복사한다.

4. 마지막으로 MySQL-python-1.2.3 폴더에 가서
커맨드 라인에 "python.exe setup.py install"이라고 입력한다.

 챠란~
|
개인적으로 개발 환경은 Mac OS X 서버 환경은 Debian을 좋아하지만,
본인 의사와는 상관 없이 윈도우즈 서버와 놀아야 할 때가 있다.
이런 경우 Python Extension을 설치할 때
pyo 또는 dll과 같은 파일들에 대한 바이너리 호환성 문제가 종종 발생한다.
M2Crypto가 그랬고 MySQLdb에서도 경험했다.
Visual Studio로 매번 컴파일 하는 것도 힘들고,
VS2008로 컴파일된 바이너리와 Apache 2.2 충돌 문제를 피하려면
install script 수정도 해줘야 하기에
그냥 웹에서 긁어다 쓰기로 결심...
그 중
이곳이 괜찮아서 기록을 남긴다.
윈도우에서 바이너리 설치가 필요한 Python Extention이 필요한 분들은
링크를 따라가시길 추천한다. 


나는 1시간만에 위의 '땡잡았다.'라는 생각이 한심한 생각이었다는 것을 깨닳았다.
과거에 M2Crypto의 설치를 직접 했다면 이 깨닳음에 몇 일을 절약할 수 있었을 것이다.
(M2Crypto는 본인의 멘토가 설치하셨다.)
어쨌거나 MySQL-python Extension은 똑바로 동작하지 않았고,
그것이 구 버전의 MySQL 라이브러리와 연결되어 있다는 것을 알게 되었다.
결국 내가 원하는 최신 버전의 조합을 갖는 바이너리를 찾는데 실패했고 
직접 컴파일해야 한다는 사실을 받아들이게 되었다.

하고싶은 말은 설치해보고 안되면, 직접하라는 것이다.
안되는 바이너리 패키지로 시간 낭비 하는 것은 좋지 않다. 
|
django에서 syncdb를 통해 테이블을 생성할 경우
테이블 이름은 '{appname}_{classname}'으로 지정된다.

이와 같은 경우 몇 가지 문제 케이스와 직면할 수 있는데,
1. legacy system에 django를 적용해야 할 경우 기존 database table들의 변경 없이 사용해야 한다.
2. 다양한 시스템(PHP, ASP, JSP, ROR, Etc.)이 하나의 database에 접근할 때,
    django의 naming rule을 강제할 수 없다.
위의 두 가지가 대표적이다. 

때문에, django에서는 table 명을 다음과 같이 강제 지정할 수 있다.

class Sessions(models.Model): 
    {... some fields}
    class Meta:
        db_table = u'sessions' 

위와 같이 지정하면 django는 database에 '{appname}_sessions'가 아닌 'sessions'로 생성 및 접근하게 된다.

'django' 카테고리의 다른 글

database에서 models.py 추출하기  (0) 2011.06.09
aptana에서 django 프로젝트 설정하기  (0) 2011.05.31
|

프로젝트를 진행하다 보면, 랜덤 값이 필요한 경우가 많이 생긴다.
특히 보안이 필요하다면 더욱 더...
암호화 된 값들과 해쉬 값들, 그리고 그것들로 위장한 의미 없는 값들...
단순한 인덱싱 조차도 1, 2, 3, 4, 5, ... 로 사용하는 것이 허용되지 않기도 한다.

다양한 케이스에서 랜덤값이 필요하게 되면서 알게된 것이 두 가지가 있다.
첫째는 python의 기본 random 모듈로는 요구 사항을 만족 시킬수 없는 부분이 있다.
둘째는 기본 random 모듈 이외에 추가적인 좋은 방법들이 있다.

그래서 이번에 사용한 방법들을 정리하고자 한다.

본인은 현재 '열혈강의 파이썬 개정판: 이강성저'를 참고서적으로 보고 있으며,
아래의 정리 내용은 책에 없는 내용만을 포함하고 있다.
아래 방법들을 사용하기에 앞 서
책에서 기본적인 내용을 우선 읽어보기를 권하는 바이다. 


1. random 모듈 [문서]

>>> import random
>>> import string
>>> c = string.letters + string.digits
>>> c
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
>>> v = ''.join(random.sample(c, 6))
>>> v
'yxEeLl' 


2. uuid 모듈 [문서]

세부적인 사항은 문서 링크를 참고하면 된다.
단순히 적당한 길이의 random 문자열이 필요하다면, 아래의 코드도 괜찮은 선택이다.

>>> import uuid
>>> uuid.uuid1()
UUID('8f9f01b8-923e-11e0-889b-1093e9020660')
>>> str(uuid.uuid1())
'98c3d57a-923e-11e0-ae95-1093e9020660'
>>> uuid.uuid4() 
UUID('6a81a0ca-dcfc-4024-883e-5abb29238b4d')
>>> str(uuid.uuid4()) 
'7ed3f7b9-84a5-4066-8e9c-e5e1bc370573' 


3. os 모듈의 urandom

os 모듈에는 urandom이라는 함수가 있다.
이 함수는 원하는 길이(byte단위)의 unsigned 수치값을 만들어 준다.
물론 int 형이나 long 형이 아니기 때문에 약간의 가공이 필요할 수 있다.
아래 방법은 암호화 알고리즘의 키를 생성하는데 유용하다.

>>> import os
>>> import binascii
>>> os.urandom(16)
'h\xb4\xaa<\x12\xa5\xc8\xaf\xa2sCr\x93\x01f\xdc'
>>> binascii.hexlify(os.urandom(16))
'7a26ada27ace29eb422c04efe7313526'
>>> int(binascii.hexlify(os.urandom(16)), 16)
69812220901636122490437131090184792388L 

|

ghilbut's Blog is powered by Daum & tistory