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 도 지원하면 좋을텐데 누군가 메일링리스트에 글을 남긴건 봤는데 흐지부지 된듯 하더군.