2010년 12월 31일 금요일

NoSQL 구현체 비교

Cassandra vs MongoDB vs CouchDB vs Redis vs Riak vs HBase comparison

좋은글.
mongodb 도입을 검토하다 만적이 있는데 다음엔 redis 를 검토해봐야할듯.

추가. 2011/01/06
Visual Guide to NoSQL Systems

2010년 12월 30일 목요일

잼나는 디버깅 스토리

The Best Debugging Story I’ve Ever Heard
reddit

반전 쩐다.
지하철서 정말 잼나게 읽은 글.

2010년 12월 29일 수요일

upstart 를 이용해서 daemon 죽었을때 다시 띄우기

http://upstart.ubuntu.com/

서버등을 돌리다가 죽는경우 다시 띄우거나 하는 작업이 필요한데 개발중에는 repeat.sh 등을 만들어서 쓰고 있지만 데모용으로 띄울경우는 init 등에서의 작업이 필요. ubuntu 가 가진 upstart 를 쓸때의 간단한 사용법을 적어둔다.

  1. /tmp/a.out 에 데몬이 있다고 가정해보자.
  2. /etc/init/foo.conf 작성
    description "shit"
    exec /tmp/a.out
    respawn
  3. sudo initctl reload-configuration 으로 foo.conf 읽고
  4. sudo start foo 로 프로세스 돌리고
  5. initctl status foo 로 확인
  6. sudo stop foo 로 프로세스 정지
좀더 상세한 사항은 init(5), initctl 등의 manpage 참고

2010년 12월 28일 화요일

GNU screen

이전위키에 있던 내용을 옮겨왔다.
tmux 도 한번 써보고 싶은데 당장 급해서 일단 screen 쓰다가 옮겨놓은것.


관련링크

외워둘만한명령들

  • 도움말은 C-a ?
  • screen 상태에서 C-a C-d 로 디태치, screen -ls 로 세션들을 확인하고 screen -r 세션이름 을 통해 resume
  • 만약 디태치를 하는것을 깜박하고 장비앞을 떠났다면 screen -d 를 통해서 screen 세션 외부에서 디태치 가능
  • 로깅이 필요하면 C-a H 현 한화면만 잡으려면 C-a h
  • 새 창을 열려면 C-a c 또는 screen 안에서 screen vi 등으로 실행
  • 창간의 전환은 C-a C-a, C-a n, C-a C-p, 등으로 앞뒤로 움직이거나 C-a " 로 리스팅해서 전환 또는 C-a 숫자 로 전환
  • C-a 를 프로세스에 보내려면 C-a a
  • 브레이크를 보내려면 C-a C-b
  • clear 하려면 C-a C
  • 현재 창의 정보는 C-a i
  • 리플레시하려면 C-a l
  • 창을 나누려면 C-a S 나뉜 창간에 포커스 이동은 C-a TAB 현재창만 남기려면 C-a Q 현재창을 닫으려면 C-a X
  • copy 하려면 C-a [ paste 하려면 C-a ] 이쪽은 좀 복잡한 기능들이 많이 붙어있다.
이외에도 존내 많은 기능과 바인딩들이 있다. C-a 때문에 emacs 와 바인딩이 겹치는게 좀 피곤해서 잘 안쓰지만 외부장비에 접속했을경우엔 아주 도움되는 유틸리티.

.screenrc

http://gentoo-wiki.com/TIP_Using_screen 에서 따왔다.

startup_message off
hardstatus alwayslastline                                                                                                                        
hardstatus string '%{gk}[ %{G}%H %{g}][%= %{wk}%?%-Lw%?%{=b kR}(%{W}%n*%f %t%?(%u)%?%{=b kR})%{= kw}%?%+Lw%?%?%= %{g}][%{Y}%l%{g}]%{=b C}[ %m/%d %c ]%{W}'

2010년 12월 24일 금요일

python, yield 를 이용한 코루틴

이전글 작성하고 어떻게 그코드가 돌아가나 했더니 언젠가부터 yield 가 값을 리턴해줄수 있게 됐네.
http://www.python.org/dev/peps/pep-0342/

즉 yield 로 빠져나간 흐름을 받은 곳에서 send(값) 를 불러주면 yield 의결과로 그 값이 리턴되고 throw(예외) 를 불러주면 yield 했던 그자리에서 예외가 떨어지게 된다.

우왕굿.

generator 의 복사가 가능한지 좀더 찾아봐야겠다...

blogger 에 코드하이라이팅 적용

http://blog.cartercole.com/2009/10/awesome-syntax-highlighting-made-easy.html
를 참고했다.

나중에 검색할일을 생각해서 간단히 사용법만 적어둔다.
참고로 lisp brush 는 https://github.com/knuthaug/sh-lisp 에서 따온것.

blahblah
def foo():
    pass
(defun foo () 
  nil)

2010년 12월 22일 수요일

텍스트큐브에서 블로거 로

비밀글 처리 병신같네.
소스넣는방법부터 찾아봐야겠다.

repeat.sh 만들어봤다.

종종 쓰이네


#! /usr/bin/env bash
SLEEP=1
COUNT=1
while [ 1 ] ; do
    echo "repeat($COUNT th): " $@
    $@
    sleep $SLEEP
    let COUNT++
done

2010년 12월 17일 금요일

ulimit 값 변경해주기

리눅스 설치때마다 한번씩 해주는 작업이라 항상 가물가물하다.
이번에 적어두자.

http://posidev.com/blog/2009/06/04/set-ulimit-parameters-on-ubuntu/ 가 원문.

  1. /etc/security/limits.conf 에 적당히 내용 추가
    yoonkn           soft    nofile          20000       
    yoonkn           hard    nofile          65000
    yoonkn           soft    core            100000
    yoonkn           hard    core            100000
  2. /etc/pam.d/common-session 에 아래 내용 추가
    session required pam_limits.so
  3. reboot



gevent, 하나의 소켓을 두개의 그린렛이 공유할때 한쪽이 소켓을 닫아버리면?



돌다리는 두들겨야 제맛.

[code python]
#! /usr/bin/env python
# -*- coding: utf-8 -*-
#
# gevent 사용시 하나의 그린렛이 소켓에 대고 뭔가를 읽으려고 블럭중인데
# 다른 그린렛이 그 소켓을 닫아버릴경우 어떤일이 생기는가를 테스트해본 코드.
#
# 결론만 적자면
# victim 과 killer 가 sock 을 공유하고 victim 이 sock 에대고 블러킹
# recv 를 하는 도중에 killer 가 sock 을 닫아버리면 victim 쪽에서는
# recv 가 "" 를 리턴해주는 형태로 진행.

import gevent
import gevent.socket


def victim(sock):
    print("victim started")
    buf = sock.recv(1024)
    print("victim ended")

    # 외부에서 소켓을 닫을경우 recv 가 "" 를 리턴해준다. gracefully
    # closed 된 상황으로 인식하고 진행하면 되겠군.
    assert type(buf) == str and buf == ""

    # 혹시나 끊어진 sock 에 대고 send 를 하면 EBADF 가 떨어진다.


def killer(sock, n):
    print("killer started")
    gevent.sleep(n)
    print("killer shoots")
    sock.close()
    print("killer ended")


if __name__ == "__main__":
    # 공유할 소켓
    sock = gevent.socket.create_connection(("127.0.0.1",7777))
    # 소켓읽다 뒤질놈
    gevent.spawn(victim, sock)
    # n 초 뒤에 소켓 죽일놈
    gevent.spawn(killer, sock, 1)
    # join 걸기 귀찮아서 그냥 슬립으로
    gevent.sleep(3)
[/code]   








2010년 12월 16일 목요일

emacs, python 에서 id-utils 사용




간단히 적어둔다.
리눅스환경에서만 테스트 됐음. 윈도에서는 map 파일을 어떻게 찾을지 모르겠네. 매번 실행시 인자로 주면 되긴 하겠는데...

  1. 파이썬스캐너가 없어서 .py 는 기본설정으로 실행시 ignore 되버림.
  2. /usr/share/misc/id-lang.map 를 열어서 *.py 를 text 로 취급하도록 수정. man mkid 참고.
  3. 이제 mkid 가 python 소스들을 읽고 ID 파일을 남기게 되었다.
  4. emacs 쪽에서 idutils.el 세팅 이글 참고
  5. 익숙한 키인 M-. 에 바인딩했다. ctags 는 버리고 gid 로 대체해보려는건데.. 흠. 바보짓일수도?
    (defun use-idutils-as-tagging-tool ()
      (local-set-key "\M-." 'gid))
    (add-hook 'python-mode-hook 'use-idutils-as-tagging-tool)
  6. 이제 M-. 으로 심볼 찾아 돌아다니는게 가능해졌는데 소스 수정후 mkid 를 불러줘야 하는 불편함이 있다.
  7. mkid 를 적당한때 부르는 방법이야 많겠지만 내가 당장 원하는 모양은 원하는 시점에 키 몇개 누르면 mkid 가 실행되는것.
  8. anything 을 이용해서 프로젝트관리를 하는 편인데 이중에 mkid 실행하기 메뉴를 추가해줬다. 저 함수는 더 깔끔하게 짜는 방법이 있을거 같은데 당장은 저코드만 떠오르네.
    (defun yoonkn-anything-projects-mkid (name)
      (let ((curdir default-directory)
            (prjdir (yoonkn-anything-projects-get-dir name)))
        (unwind-protect
            (progn
             (cd prjdir)
             (call-process "mkid"))
          (cd curdir))))
    (defvar anything-my-source-yoonkn-projects
      '((name . "내 프로젝트들")
        (candidates . yoonkn-anything-projects-candidates)
        (action . (("dired 실행하기" . yoonkn-anything-projects-dired)
                   ("psvn 실행하기"  . yoonkn-anything-projects-psvn)
                   ("mkid 실행하기"  . yoonkn-anything-projects-mkid)))))
  9. 이제 mkid 돌리는것도 간단히 실행가능. 우왕ㅋ굳ㅋ



추가. 2010/12/17
집에서 windows7 환경에 idutils 를 돌려보니 에러나더군. 씁. gnu global 이 text 도 지원하면 좋을텐데 누군가 메일링리스트에 글을 남긴건 봤는데 흐지부지 된듯 하더군.

2010년 12월 14일 화요일

mercurial 리파지토리를 dropbox 로 관리중인데 일부 리파지토리가 깨졌다

오늘 리눅스 세팅하면서 내 개인 리파지토리에서 클론을 해대다가 깨진것 발견.
흠. 검색해보니 나만 겪는 문제는 아닌듯하다.

http://forums.dropbox.com/topic.php?id=5579
http://stackoverflow.com/questions/1964347/mercurial-and-i-guess-git-with-dropbox-any-drawbacks

리파지토리 보관할 다른 방법을 찾아봐야겠다.
집에 다시 서버를 돌려야 하나?