태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

'python'에 해당되는 글 5건

  1. 2012.08.23 Amazon glacier ... 를 쓸 뻔 했던 이야기
  2. 2010.02.04 사용소감: Google protocol buffer (4)
  3. 2008.08.09 Spiral number galaxy (4)
  4. 2008.07.22 Statement vs Expression (4)
  5. 2008.06.11 방법당하다 by python-mysqldb 1.2.1_p2 (5)

Amazon glacier ... 를 쓸 뻔 했던 이야기

Tech 2012. 8. 23. 23:03

오늘은 평소에 삽질하던거랑 상관 없는 단독삽질. Amazon glacier를 써본다.

1. What is glacier?
아마존의 Archiving storage service. 저장 용량에 비해 매우 싼 대신, 트래픽 비용이 있고 꺼내오는 것도 실시간이 아니다.

참고자료:
http://www.zdnet.co.kr/news/news_view.asp?artice_id=20120822145556
http://aws.amazon.com/ko/glacier/

내가 개인 서버를 꾸려서 archive 디렉토리에 넣어둔 데이터가 대략 200G 정도 되는데, 이걸 glacier에 던져두고 싶다.
요금은 한달에 3천원 정도 예상한다. (미국 동부 0.01 USD/GB/MONTH 기준)

2. Create a vault
Amazon AWS 계정이 필요하다. 웹 콘솔에서 Services -> Glacier 를 클릭하면 결제정보가 없는 경우 payment method 를 확인한다고 뜨고, 결제 정보가 잘 들어가 있는 경우 Create vault 버튼이 덩그라니 보인다.
Vault 는 아카이브를 모으는 창고 같은 개념이다. 난 DGoonStorage 라는 이름의 vault 를 만들었다.
왼쪽 위 Region 에서 적절한 장소를 고르는걸 잊지 말자. 난 제일 싼 미국 동부(…)로 했다.
귀찮으니 Notification 설정 따위는 그냥 다 스킵.
Vault를 생성하고 나면 뭔가 보인다 …
하지만 여기서 바로 업로드를 할 수는 없다. Glacier는 콘솔에서 Vault생성/리스트업 이외의 작업이 불가하다.
파일을 업로드/다운로드하는 것 모두 "프로그래밍" 이 필요하다. 그게 내가 이런 쓰잘데기 없는 문서를 쓰는 이유이기도 하고…

3. Unit
Glacier에 저장되는 단위는 위에서 생성한 Vault, 그리고 Archive, 마지막으로 File 이 있다.

Archive는 하나 혹은 여러개의 File을 묶는 단위이다. Archive에는 Unique identifier가 발급되며 업로드/다운로드의 단위가 된다.
한 번의 업로드 요청으로 업로드 가능한 것은 4GB 까지. Archive 하나의 최대 용량은 40TB.
큰 Archive는 Multipart 요청으로 여러개의 조각으로 쪼개서 올려야 한다는 것.
그리고 Archive는 일단 정해지면 추가나 덮어쓰기가 불가하다. 삭제하고 다시 올리는 수 밖에 없다.
+ 올리고 3개월 이내, 혹은 업로드 중에 그만두고 삭제하면 '삭제비용'이 따로 든다!

Vault는 여러개의 Archive를 묶는 단위이다. Upto 1000 vaults per account per region 이라고 한다.
Archive가 하나도 없는 Vault만이 삭제가 가능하므로 Vault를 지우려면 안에 있는 Archive를 먼저 지워야 한다.

4. Amazon API
Python Boto 라는 훌륭한 라이브러리가 있다. 예전에 API 세팅할 때에는 자바로 삽질하느라 짜증났는데, 세상 좋아졌다.
하지만 Glacier는 비교적 최신에 릴리즈된 서비스라서 아직 boto 에 구현이 되어 있지 않다.

BOTO 관련 링크:
https://github.com/boto/boto
http://docs.pythonboto.org/en/latest/index.html

하지만 boto 베이스로 glacier upload/download 를 구현한 코드들이 gist 어딘가를 떠돌고 있으니(https://gist.github.com/3426839, https://gist.github.com/3424129), 조만간에 boto 에서 지원하리라 생각한다.
boto 설정을 위해서는 AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY 두 개가 필요하다. 이것은 웹 콘솔에서

Security credentials -> Access Keys

에서 보거나 생성할 수 있다. 이걸 boto 라이브러리에게 전달하는 방법은 설정파일, 환경변수, connect 할때 직접 등 여러가지가 있다.
나는 ~/.boto 파일에

[Credentials]
aws_access_key_id = <MY_ACCESS_KEY>
aws_secret_access_key = <MY_SECRET_KEY>

이렇게 적어넣는 방법을 사용했다. boto 라이브러리는 pip install boto 로 설치 가능하다.



나도 일단 boto 위에 만들어보려고 하는데, glacier api reference 찾는게 좀 어렵다. 검색해도 잘 안나오네. 검색해서 찾는데 30분이나 걸렸다.

Developer guide: http://docs.amazonwebservices.com/amazonglacier/latest/dev/
API Ref for glacier: http://docs.amazonwebservices.com/amazonglacier/latest/dev/amazon-glacier-api.html

금방 될 줄 알았는데, 일단 문서를 읽어봐야 할테니 시간 좀 걸리겠네 …
boto 에 추가될때까지 기다리는게 더 빠를지도!



5. Epilogue

잠시 검색 후: issue 를 보니,

https://github.com/boto/boto/issues/929
https://github.com/boto/boto/tree/glacier

이렇게 벌써 브랜치가 생겨있다. 빠르네 ㅋㅋㅋ

아, 회사 일 할게 많아서 오늘은 삽질을 별로 못했다. 남은 시간은 boto 라이브러리(와 glacier 브랜치) 코드나 읽으며 보내야겠다. boto는 회사일에도 유용할 듯. 자바 껒여.



'Tech' 카테고리의 다른 글

Amazon glacier ... 를 쓸 뻔 했던 이야기  (0) 2012.08.23
회사일 하면서 삽질하거나 느낀거 끄적  (2) 2012.08.10
D2, array.reverse property has a side-effect. orz  (45) 2011.07.12
Thrift in D  (6) 2011.05.15
fix: ugly gitweb page  (3) 2010.12.12
(1/2) Programming in clojure  (4) 2010.08.08
Trackbacks 0 : Comments 0

Write a comment


사용소감: Google protocol buffer

Tech 2010. 2. 4. 16:57
일단 관련 링크 몇개


회사에서 새로 만드는 시스템을 크게 몇 개의 컴포넌트로 잘라서 디커플링을 시도했다. 시스템 전체를 흐르는 데이터가 거치는 각 단계마다 투입되는 자원량을 조절할 수 있어야 하며, 머신도 나뉘어야 ... 하고 코드 의존성도 님하 좀 ㅠㅠ

이 과정에서 함수 인자, 혹은 글로벌 자료구조 등으로 공유하던 데이터를 넘겨줄 방법 - 그러니까 IPC - 이 필요하게 되었고, 대부분의 정보 전달을 Queue with Persistent layer 로 대체할 수 있었다. 반응성보다는 단위 시간당 처리량이 중요한 시스템이라서 ...

여러개의 큐 서버가 만들어지고, 여기에 데이터를 넣고 빼고 하게 되는데 이 과정에서 딸려오는 귀차니즘이 소켓통신. 그리고 몇 가지 이유로 인하여 큐 서버를 포함하여 관련되는 코드들이 자바/C/C++/Python 들이 섞일 수 있는 가능성을 가지게 되었다. (사실 이게 디커플링의 의도중 하나이긴 한데 ...)

파이썬만 있다면야 pickling 이라는 편한 방법이 있지만, 다른 언어가 들어오면 조금 골치아파지고... 이런 상황에서 Google protocol buffer 가 떠올라서 가져다 사용. 가장 큰 특징은,

  1. Code generation
  - 유피넬의 누군가(...)가 세미나에서도 이야기했던 방법인데, Definition data structure -> Code to handle 방향으로 코드를 생성해 버린다. 코드 레벨에서 서버/클라를 포함한 이 데이터를 다루는 녀석들이 모두 공유할 수 있다.
  - 코드 생성이기 때문에, 오타라던가 ( ... ) 양쪽 코드의 불일치 등으로 생기는 문제는 거의 제로
  - 데이터 정의가 바뀌면 코드 생성->컴파일->링크 를 다시 해야 한다
  - 이 툴(그러니까 google protocol buffer)를 도입함으로써 생기는 제약이 별로 없다 - 프레임웍을 가져다 쓰는거에 비하면야...

  2. Structured data definition
  - 일반적인 클래스 디자인과 비슷하게 데이터를 정의할 수 있다
  - 만들어진 데이터 타입들을 조합하여 복잡한 블럭을 만들 수 있다

  3. Language support
  - 고려중인 Java/C++/Python 세가지 모두 코드를 찍어내준다
  - 언어와 상관 없이 이 코드들은 서로 호환되는 데이터를 만든다 (Serialize/Parse 결과가 일치한다는 뜻)

그리고 부가적으로 빠르다, 같은게 있긴 하다. ... 하지만 아직 확인해보진 않았으니 뭐 ... 그래봐야 내가 직접 만든 코드보다 백만배 빠르진 않겠지... 훌륭한 점은 퍼포먼스 저하를 최소한으로 막고(과연 그럴까?는 코드를 까봐야 알겠지만...) 사용하기 편해졌어! 를 확보한 것, 이라고 생각할 수 있는데.

뭐 이 장점들은 확실히 강력한 것 같다. 단점은... Composite type 에 대한 assignment를 막아놓은게 좀 귀찮은데, 이건 내부 구현에 따라오는 이슈인 것 같다. 로직에서 다루는 데이터 타입과 데이터 주고받기에 쓰이는 타입이 다르면 - 로직에서 프로토콜 버퍼 객체를 사용하지 않으면 - Send/Recv 할 때 데이터의 복사가 한번 일어나게 되는데 이건 좀 곤란한 것 같다. ... 하지만, 잘 살펴보면 보내거나 받는 데이터를 Stream으로 만들어서 해결할 수 있을 것 같기도 한데, 지금은 튜토리얼만 슥 보고 대충 가져다 쓰는거라 뭐 ... 복사 없이도 처리가 가능할 것 같긴 하니까 이건 패스.

큰 코드조각은 아니지만, 유용한 걸 잘 만든다. 구현 자체는 논외로 하고, 컨셉이 좋지. (더불어 리카님도 굿 ㅋ) 어느 정도에서 Abstraction layer를 만들어야 사용성을 최소한으로 해치면서 Drawback을 줄일 수 있을지 - 에 대한 감이 좋아 보인다. 이런건 좀 배우자.

쓰고 나서 보니 소감이라기엔 좀 이상하다. 그냥 "써봤음" 문서. 낄낄낄.

'Tech' 카테고리의 다른 글

iterator invalidation  (5) 2010.05.10
사용소감2: Google protocol buffer  (1) 2010.02.11
사용소감: Google protocol buffer  (4) 2010.02.04
TDD: 켄트백아저씨가 쓴 책이지?  (2) 2009.12.29
git/git-svn on working machine  (2) 2009.12.17
Links on xml and related techs  (1) 2009.12.09
Trackbacks 0 : Comments 4
  1. Favicon of http://ricanet.com Rica 2010.02.05 07:46 Modify/Delete Reply

    네?_?....

    • Favicon of http://deisys.net dgoon 2010.02.05 08:52 Modify/Delete

      엇.. 리카 아니엇나? 내가 '이런 경우에는 코드를 찍어내자!' 는 아이디어를 첨 들은건 리카한테서였던것 같은데 ... ?

  2. Favicon of http://ricanet.com Rica 2010.02.05 10:08 Modify/Delete Reply

    제가 썼던 방식은 프리프로세서 매크로였어요. 그나마 ipkn의 아이디어를 가져다가 새로 구현한 거였고요.
    (핸들링 체계는 독자적으로 만들었지만)
    참고: http://ricanet.com/new/view.php?id=blog/091007

    rein이 코드 제너레이터를 사용한 것으로 알고 있습니다.
    참고: http://rein.kr/blog/archives/1924
    구글 프로토콜 버퍼를 언급하고 있네요. ㅋ_ㅋ

    • Favicon of http://deisys.net dgoon 2010.02.05 10:37 Modify/Delete

      아항 그랬군... 오래되서 기억이 가물가물 (..) 치매인가.

Write a comment


Spiral number galaxy

Tech 2008. 8. 9. 17:37
http://codingdojo.metaschool.org/5198
http://gall.dcinside.com/list.php?id=programming&no=84262&page=1&search_pos=-80935&k_type=1000

따라해봤음. ㅋㅋㅋ 나의 첫 curses 프로그램임 >_</ 재밌네 ~

import math
import time
import curses

def close_to_center(polar):
    return polar[0] < 1

def get_next_coord(polar):
    r = polar[0]
    theta = polar[1]
    r -= 0.2
    theta += (math.pi / 2.0) + 0.2
    return (r, theta)

def polar_to_euclid(polar):
    r = polar[0]
    theta = polar[1]
    return (int(r * math.cos(theta)), int(r * math.sin(theta)))

def draw(start, center):
    current = start
    i = 1
    while not close_to_center(current):
        pos = polar_to_euclid(current)
        stdscr.addstr(pos[1] + center[1], pos[0]*2 + center[0], "%s" % i, curses.A_NORMAL)
        current = get_next_coord(current)
        i += 1

if __name__ == '__main__':
    try:
        stdscr = curses.initscr()
        curses.noecho()
        curses.cbreak()
        stdscr.keypad(1)
        stdscr.timeout(0)
        r, theta = 0, 0

        while True:
            max_y, max_x = stdscr.getmaxyx()
            center = (max_x/2, max_y/2)
            r = min(center) - 1
            theta += 0.03

            stdscr.clear()
            draw((r, theta), center)
            stdscr.addstr(1, 1, "Ctrl-C to quit")
            time.sleep(0.005)
            stdscr.refresh()
    except KeyboardInterrupt:
        pass
    finally:
        stdscr.keypad(0)
        curses.echo()
        curses.nocbreak()
        curses.endwin()


뱅글뱅글

뱅글뱅글




'Tech' 카테고리의 다른 글

MySQL -> XML: CDATA Sanitize?  (2) 2008.09.26
하위 디렉토리에 있는 모든 .svn 을 날리는 법  (5) 2008.09.11
Spiral number galaxy  (4) 2008.08.09
투명 필름 문제(Scheme)  (4) 2008.08.01
Statement vs Expression  (4) 2008.07.22
emacs: switch indentation  (0) 2008.07.18
Trackbacks 1 : Comments 4
  1. Favicon of http://shurain.egloos.com 슈레인 2008.08.11 11:19 Modify/Delete Reply

    변태같은 모양이 나오네여

  2. Favicon of http://deisys.net deisys 2008.08.11 12:27 Modify/Delete Reply

    슈레인 // 나선력이야 ㅋㅋㅋ

  3. Favicon of http://etnalry.textcube.com/ etnalry 2008.08.12 23:07 Modify/Delete Reply

    반대로 돌렸네. ㅎㅎ

  4. Favicon of http://deisys.net dgoon 2008.08.13 01:43 Modify/Delete Reply

    etnalry // 오리지널이 이렇게 돌아 ㅋㅋ

Write a comment


Statement vs Expression

Tech 2008. 7. 22. 11:54
오늘 파이썬의 eval, exec 를 쓰다가 얼래? 라는 상황에 봉착했다.

C/C++ 에서는 대입문 - 이 사실 문(statement)이 아니라 식(expression)이다. 따라서 다음 코드가 동작한다.

#include <stdio.h>

int main() {
    int x = 10;
    printf("%d\n", x = 20);

    return 0;
}


실행하면 20 이란는 숫자가 콘솔에 찍힌다. 파이썬에서는 대입이 맞다. 따라서

print x=10


이런 파이썬 코드는 유효하지 않다. 별 생각 없이 쓰고 있었는데, 파이썬에 대해 아무것도 모르고 있었구나 -_-; ... 뿐 아니라 프로그래밍 언어 자체에 대해 기초가 부족했다. 아 뼈아퍼라...

사실, 문과 식을 구분해서 쓰는 사람이 그다지 많지는 않다(고 느낀다). 나도 가끔 필요할 때만 확인해보곤 하는데 ... 자, 정확히 statement, expression 이 무엇인지 설명한다면? 이라고 하니까 바로 답이 튀어나오지 않는다. 그래서 위키에서 긁어왔다.

In computer programming a statement can be thought of as the smallest standalone element of an imperative programming language. A program is formed by a sequence of one or more statements. A statement will have internal components (eg, expressions). - From wikipedia


An expression in a programming language is a combination of values, variables, operators, and functions that are interpreted (evaluated) according to the particular rules of precedence and of association for a particular programming language, which computes and then produces (returns, in a stateful environment) another value. The expression is said to evaluate to that value. As in mathematics, the expression is (or can be said to have) its evaluated value; the expression is a representation of that value. - From wikipedia

그냥 개인적인 생각이지만, 해보면 쉽다 쉽다 - 하는 함수형 언어를 사람들이 처음 접할때 많이 좌절하곤 하는데 그 이유가 이게 아닐까 한다. Imperative language에 익숙한 상황에서는 statement 의 나열로 문제를 해결하려고 하기 쉬운데, Functional language에서는 그게 쉽지 않다 - 기 보다는 제한적이거나 불가한 경우도 있다. 함수형 언어를 써보면 새로운 접근 방식을 익히게 된다고 하는데, 그 새로운 접근이 뭐냐? 라고 물으면 좀 난감했는데, 일단 이렇게 정리해볼 수 있으려나?

Expression oriented problem solving

Expression은 side-effect가 있을 수도 있고, 없을 수도 있다 - 고 한다. 이에 반해 Statement는 Side-effect를 만들어내기 위한 것이라고도 하는데 (statements do not return results and are executed solely for their side effects, - From wikipedia), side-effect를 지향/지양 하는 정도에 따라서도 접근이 달라질 수 있는 것 같다.

역시 기본부터 차근차근 다져야 하는데, 이런것도 확실히 정리 안해두고 코드를 만지고 있었다니 부끄럽다. :'( 일단 낙서 종료.

side-effect, referential transparency 등에 대해서도 살짝 정리해둬야겠다.

'Tech' 카테고리의 다른 글

Spiral number galaxy  (4) 2008.08.09
투명 필름 문제(Scheme)  (4) 2008.08.01
Statement vs Expression  (4) 2008.07.22
emacs: switch indentation  (0) 2008.07.18
방법당하다 by python-mysqldb 1.2.1_p2  (5) 2008.06.11
Troubleshooting: apt-get update -> Dynamic MMap out of room  (0) 2008.06.05
Trackbacks 0 : Comments 4
  1. Favicon of http://etnalry.tistory.com etnalry 2008.07.23 23:35 신고 Modify/Delete Reply

    이봐.. 실망이야. ㅋㅋ

  2. 2008.07.24 00:55 Modify/Delete Reply

    비밀댓글입니다

  3. Favicon of https://deisys.tistory.com 가난한 d-goon 2008.07.24 07:13 신고 Modify/Delete Reply

    etnalry // 그르게 나도 실망 ㅋ

    ??????? // 훗, 툴에 집착하지 않기로... =_=

  4. Favicon of http://15016foodsnut.com/michaelkorsbags.php Michael Kors outlet 2013.07.16 22:28 Modify/Delete Reply

    슬퍼서 우는거 아니야..바람이 불어서 그래..눈이 셔서..

Write a comment


방법당하다 by python-mysqldb 1.2.1_p2

Tech 2008. 6. 11. 18:38
할일이 좀 있어서 python-mysqldb 모듈을 가지고 간단한 프로그램을 만들었다. 사용법은 참 간단했다.

import MySQLdb
db = MySQLdb.connect(host="localhost", user="deisys", db="deisys", passwd="xxxxxx")
cursor = db.cursor()

여기서부터는 cursor 를 가지고 놀면 된다. cursor.execute("show tables"), cursor.execute("create table test (id int)") 뭐 이런 식으로 ... 그래서 테스트를 위해서 엔트리 1억개를 insert 하는 코드를 만들었다. 대충 이런 모양이다.

 ...
 29 # Generate a bunch of (from, to) pairs and insert into the table
 30 values = []
 31 for x in xrange(0, VN):
 32     from = x
 33     digest.update(str(x))
 34     to = hash(digest.hexdigest()) % CN
 35     values.append( (from, to) )
 36     if from % CHUNK_SIZE == CHUNK_SIZE-1:
 37         query = "INSERT INTO info_test (from, to) VALUES " + ", ".join([str(x) for x in values])
 38         cursor.execute(query)
 39         values = [ ]
 ...

그런데... 몇분쯤은 걸리겠지 하는 생각에 엔터를 눌렀는데, 실행이 순식간에 끝난다. 엉? 엔트리 1억개를 넣는건데 1초도 안걸리다니, 요즘 DB가 졸 짱쎄졌구나! 라는 생각에 터미널 창에서 select * from info_test limit 1000; 을 때려 보았다.

mysql> select * from info_test limit 1000;
Empty set (0.00 sec)

mysql> _

엉? 뭐지? -_-; 그리고 삽질 시작. (cursor.close(), db.close() 도 밑에서 잘 해 주었다)

한시간쯤 뇌가 날아갔다가, 군것질을 하고 돌아오셨다. 그동안 몇몇 테스트를 해보면서 내린 결론은,

insert만 안된다

는 것. 왜 그럴까... insert는 쓰기 작업이고, 자주 일어나고, 연속적으로 일어나는 경우가 많으니까 아마도 어댑터가 나름 캐싱했을것 같은데 ... -> 빙고!

썅썅봐 -_-; db.close() 앞에 db.commit() 을 넣어주니까 제대로 들어간다. API에 보면,

commit(...)

Commits the current transaction


라고 달랑 한줄 나와있고, 나는 트랜잭션을 쓴 적이 없다. -_-; 아니 저게 없으면 방법당한다고 어디 한마디라도 써놓던가... ㅠㅠ 그리고 예의상(매너?) cursor.close() 나 db.close() 에서 들고 있는 캐시는 다 처리해 주어야 하는것 아님? -_-+

예전에 하둡님도 close 할때 flush 안해주셔서 초큼 난감했었는데, 이거 요즘 유행인가보다.

'Tech' 카테고리의 다른 글

Statement vs Expression  (4) 2008.07.22
emacs: switch indentation  (0) 2008.07.18
방법당하다 by python-mysqldb 1.2.1_p2  (5) 2008.06.11
Troubleshooting: apt-get update -> Dynamic MMap out of room  (0) 2008.06.05
스팸폭탄 맞았음  (0) 2008.05.23
Chunker's rolling out!  (3) 2008.03.27
Trackbacks 0 : Comments 5
  1. Favicon of http://rein.upnl.org rein 2008.06.12 00:10 Modify/Delete Reply

    DB 쿼리가 기본적으로 트랜잭션인건 MySQL빼고는 다 그런...듯한 것 같아요;

    일종의 dry-run이 되어주기도하고 (먼산)

    + db.auto_commit 인가를 True로 해주면 모든 쿼리가 바로바로 실행됩니다(아마)

  2. Favicon of http://deisys.net deisys 2008.06.12 09:31 Modify/Delete Reply

    rein // autocommit 쓰고 있음 ...ㅎㅎ

  3. Favicon of http://deisys.net deisys 2008.06.12 10:06 Modify/Delete Reply

    rein // 아니, autocommit 을 쓰면 졸라 느려지네? =_=/

  4. Favicon of http://www.waityet.net waityet 2008.06.14 09:40 Modify/Delete Reply

    ㅋ..저 코드라면 autocommit 하면 짱 느려지시겠지 =_=;;
    근데..확실히
    cursor나 connection을 close할때 commit을 안해주심은..
    뭔가 아리송하네...

  5. Favicon of http://deisys.net dgoon 2008.06.14 09:59 Modify/Delete Reply

    waityet // 좀 해주면 오죽 좋음!?

Write a comment