집 수리를 위한 할 일 목록 2차 정리

완료된 항목은 제거하고 할 일만 나열한다.

방문, 화장실 문/문틀은 남색이므로 가장 마지막에 한다.

문은 떼어내지 않고 문틀을 칠할 때 같이 칠한다.

거실의 문틀을 칠할 때, 문이 붙어 있는 모든 공간의 안쪽 문틀도 칠해야 하므로, 화장실의 문틀의 퍼티 작업이 완료되어 있어야 한다.


작업 공간 순서는 “부엌 -> 화장실 -> 거실/현관/큰방/작은방” 이 된다.

청소는 청소끼리, 커버링/마스킹은 커버링/마스킹끼리, 젯소는 젯소끼리 묶어서 하는 것을 기본으로 하고, 페인트는 연한색에서 진한색으로 묶어서 함께 하는 것을 기본 정책으로 한다.

젯소는 칠한 후 적어도 4시간, 페인트도 적어도 3시간 텀을 둔다. 퍼티는 메꾸는 것처럼 두텁게 바른 경우에는 하루, 아닌 경우에는 적어도 5시간 텀을 둔다. 우레탄 폼은 3시간 텀을 둔다.

아래에서 파악한 추가 준비물은 다음과 같다.

공통: 커버링 테이프

부엌: 가스 쇼바

옷방: 스토퍼 혹은 충격 완화 물건

화장실: 방수용 실리콘, 변기 커버, 환풍기, 문고리

페인트칠을 위해 해야 할 부분과 페인트칠 이후에 해도 되는 부분을 분리한다.

* 페인트칠을 위해 해야 하는 작업    ———————————————–


현관

벽면 칠하기 전 걸레받이 커버링 테이프

신발장 커버링 테이프

현관 문 벽면과 현관 옆 벽면 하얀색 벽용 페인트칠 1

현관 문 벽면과 현관 옆 벽면 하얀색 벽용 페인트칠 2

거실

바닥면 전체 커버링 테이프

걸레받이 청소

걸레받이 젯소 1회

걸레받이 하얀색 가구용 페인트칠 1

걸레받이 하얀색 가구용 페인트칠 2

베란다 창틀 옆 마스킹 테이프

베란다 창틀 하얀색 가구용 페인트칠 1

베란다 창틀 하얀색 가구용 페인트칠 2

큰 방 쪽 벽면 청소

큰 방 쪽 벽면 옆과 천장 마스킹/커버링 테이프

큰 방 쪽 벽면 하얀색 벽용 페인트칠 1

큰 방 쪽 벽면 하얀색 벽용 페인트칠 2

에어컨 환기구 커버 청소

에어컨 환기구 젯소 1회

에어컨 환기구 하얀색 가구용 페인트칠 1

에어컨 환기구 하얀색 가구용 페인트칠 2

문틀 청소

문틀 옆 마스킹 테이프

문틀 젯소 1회

문틀 남색 가구용 페인트칠 1

문틀 남색 가구용 페인트칠 2

화장실 문 구멍난 부분, 썩은 부분 퍼티질

화장실 문 구멍난 부분, 썩은 부분 퍼티 사포질

화장실 문 구멍난 부분, 썩은 부분 퍼티 청소

문 4개 젯소 1회

문 4개 남색 가구용 페인트칠 1

문 4개 남색 가구용 페인트칠 2

큰방

벽면 곰팡이 난 부분 벽지 제거

벽면 곰팡이 난 부분 곰팡이 제거

벽면 곰팡이 난 부분 곰팡이 방지제 발포

벽면 곰팡이 난 부분 퍼티 바르기

벽면 곰팡이 난 부분 퍼티 사포질

벽면 곰팡이 난 부분 퍼티 청소

벽면 곰팡이 난 부분 퍼티 젯소 1회

벽면 4 청소

벽면 4 옆/천장 커버링/마스킹

벽면 4, 걸레받이 회색 벽용 페인트칠 1

벽면 4, 걸레받이 회색 벽용 페인트칠 2

작은방

걸레받이 하얀색 가구용 페인트칠 1

걸레받이 하얀색 가구용 페인트칠 2

창틀 하얀색 가구용 페인트칠 1

창틀 하얀색 가구용 페인트칠 2

화장실

문틀 옆 썩은 부분 퍼티 사포질

문틀 옆 썩은 부분 퍼티 청소

* 페인트 칠 이후 해도 되는 작업    ————————————————–

부엌

싱크대 유리문 가스 쇼바 교체


작은방

큰 창 윤활제 살포


옷방

문 손잡이 부딪히는 벽면 부분 스토퍼 혹은, 충격 완화용 물건 붙히기

화장실

문고리 교체

환풍기 교체

변기 커버 교체

세면기 배수관 방수용 실리콘으로 고정

장을 더 고정시키거나, 떼어내기(떼어내면 상태보고 추가 작업 필요할 수 있음)


집 수리를 위한 할 일 목록

할 일이 너무 많으니까 정리가 안된다. 무작정 하면 시간도 더 걸릴거 같고.

가구 놓고, 배치하고 하려면, 살림살이 채우려면 시간이 없다.

재료도 한번에 쓸 때 같이 쓰는게 좋다. 롤러나 붓의 세척 시간도 줄일 수 있고,

페인트나 젯소, 퍼티는 뚜껑을 땄다가 다시 밀봉할 때 신경 쓰인다.

기본적으로 페인트칠은 “청소 -> 커버링/마스킹 -> 젯소 -> 페인트 1 -> 페인트 2” 이다.

젯소를 바르지 않고 바로 벽면을 칠할 때는 “청소 -> 커버링/마스킹 -> 페인트 1 -> 페인트 2” 이다.

부엌을 먼저 한 후에, 거실의 큰 베란다 창문을 부엌으로 옮긴 후 거실 작업을 한다. 때문에 부엌 작업을 제일 우선 마쳐야 한다.

방문, 화장실 문/문틀은 남색이므로 가장 마지막에 한다.

문의 경첩이 붙은 면도 칠할 때, 붙은 채로는 칠하기 불편하고, 가장 진한색 페인트가 벽면이나 문틀에 튈 수 있으므로 모두 떼어낸다. 경첩은 떼지 않고 함께 칠한다. 떼어낸 문은 모두 베란다에 둔다. 거실 작업을 끝낸 후 거실 가운데 칠할 수 있는 공간을 만든다.

거실의 문틀을 칠할 때, 문이 붙어 있는 모든 공간의 안쪽 문틀도 칠해야 하므로, 화장실의 문틀의 퍼티 작업이 완료되어 있어야 한다.

따라서 작업 공간 순서는 “부엌 -> 화장실 -> 거실/현관/큰방/작은방” 이 된다.

청소는 청소끼리, 커버링/마스킹은 커버링/마스킹끼리, 젯소는 젯소끼리 묶어서 하는 것을 기본으로 하고, 페인트는 연한색에서 진한색으로 묶어서 함께 하는 것을 기본 정책으로 한다.

젯소는 칠한 후 적어도 3시간, 페인트도 적어도 4시간 텀을 둔다. 퍼티는 메꾸는 것처럼 두텁게 바른 경우에는 하루, 아닌 경우에는 적어도 5시간 텀을 둔다. 우레탄 폼은 3시간 텀을 둔다.

현재까지의 완료 목록을 포함하여 작업 목록을 일단 작성한다. 내가 작업하지 않은 부분은 어디까지 된건지 파악이 정확히 안됐으므로, 파악해서 완료를 체크한다.

아래에서 파악한 추가 준비물은 다음과 같다.

공통: 커버링 테이프, 마스킹 테이프

부엌: 가스 쇼바, 추

거실: 불연성(혹은 난연성) 우레탄 폼, 목공 본드, 클램프, 스텐 나사

큰방: 락스, 곰팡이 방지제

옷방: 스토퍼 혹은 충격 완화 물건

화장실: 방수용 실리콘, 변기 커버, 환풍기, 문고리

다쓰고 보니, 내가 헷갈릴만 했다, 정리가 안될만 했다 싶다.

내일은 이를 바탕으로 작업 순서의 의존성을 파악해 작업 순서를 배치/결정한다.

부엌

싱크대 바닥 커버링 테이프 (완료)

싱크대 금속 커버링 & 마스킹 테이프 (완료)

벽면 바닥 커버링 테이프 (완료)

걸레받이 청소 (완료)

걸레받이 젯소 1회 (완료)

베란다 창틀 청소 1회 (완료)

베란다 창틀 젯소 1회 (완료)

베란다 창틀 하얀색 가구용 페인트칠 1 (완료)

베란다 창틀 하얀색 가구용 페인트칠 2 (완료)

싱크대 청소 (완료)

싱크대 젯소 1회 (완료)

싱크대 하얀색 가구용 페인트칠 1 (맨 아래면 남음)

싱크대 하얀색 가구용 페인트칠 2 (윗면과 옆면, 맨 아래면 남음)

벽면 구멍 퍼티 바르기 (완료)

벽면 구멍 퍼티 사포질 (완료)

벽면 구멍 퍼티 청소 (완료)

벽면 구멍 퍼티 젯소 1회

벽면 파란색 페인트칠 1

벽면 파란색 페인트칠 1

벽면 파란색 페인트칠 2

싱크대 유리문 가스 쇼바 교체

싱크대 샤워기 줄 꼬인거 풀거나 추를 추가 장착

현관

걸레받이 옆 마스킹 테이프 (완료)

신발장 아래 커버링 테이프 (완료)

걸레받이 청소 (생략)

걸레받이 젯소 1회 (완료)

걸레받이 하얀색 가구용 페인트칠 1 (완료)

걸레받이 하얀색 가구용 페인트칠 2 (완료)

신발장 청소 (생략)

신발장 젯소 1회 (완료)

신발장 하얀색 가구용 페인트칠 1 (완료)

신발장 하얀색 가구용 페인트칠 2 (완료)

벽면 칠하기 전 걸레받이 커버링 테이프

신발장 커버링 테이프

현관 문 벽면과 현관 옆 벽면 하얀색 벽용 페인트칠 1

현관 문 벽면과 현관 옆 벽면 하얀색 벽용 페인트칠 2

거실

바닥면 전체 커버링 테이프

걸레받이 청소

걸레받이 옆 마스킹 테이프

걸레받이 젯소 1회

걸레받이 하얀색 가구용 페인트칠 1

걸레받이 하얀색 가구용 페인트칠 2

베란다 창틀 청소

베란다 창틀 옆 전선 떼기

베란다 창틀 옆 마스킹 테이프

베란다 창틀 젯소 1회

베란다 창틀 하얀색 가구용 페인트칠 1

베란다 창틀 하얀색 가구용 페인트칠 2

에어컨 구멍 퍼티 바르기

에어컨 구멍 퍼티 사포질

에어컨 구멍 퍼티 청소

에어컨 구멍 젯소

큰 방 쪽 벽면 청소

큰 방 쪽 벽면 옆과 천장 마스킹/커버링 테이프

큰 방 쪽 벽면 하얀색 벽용 페인트칠 1

큰 방 쪽 벽면 하얀색 벽용 페인트칠 2

에어컨 환기구 커버 청소

에어컨 환기구 젯소 1회

에어컨 환기구 하얀색 가구용 페인트칠 1

에어컨 환기구 하얀색 가구용 페인트칠 2

문 떼어내서 베란다로 이동

문틀 청소

문틀 옆 마스킹 테이프

문틀 젯소 1회

문틀 남색 가구용 페인트칠 1

문틀 남색 가구용 페인트칠 2

문 4개 시트지 제거

문 4개 청소

화장실 문 목공 본드 및 클램프

화장실 문 목공 스텐 나사 박기

화장실 문 구멍난 부분 우레탄 폼 발사

화장실 문 구멍난 부분 우레탄 폼 잘라내기

화장실 문 구멍난 부분, 썩은 부분 퍼티질

화장실 문 구멍난 부분, 썩은 부분 퍼티 사포질

화장실 문 구멍난 부분, 썩은 부분 퍼티 청소

문 4개 젯소 1회

문 4개 남색 가구용 페인트칠 1

문 4개 남색 가구용 페인트칠 2

큰방

바닥면 전체 커버링 테이프

걸레받이 청소

걸레받이 옆 마스킹 테이프

걸레받이 젯소 1회

창틀 두개 청소

창틀 두개 옆 마스킹 테이프

창틀 젯소 1회

창틀 하얀색 가구용 페인트칠 1

창틀 하얀색 가구용 페인트칠 2

벽면 곰팡이 난 부분 벽지 제거

벽면 곰팡이 난 부분 곰팡이 제거

벽면 곰팡이 난 부분 곰팡이 방지제 발포

벽면 곰팡이 난 부분 퍼티 바르기

벽면 곰팡이 난 부분 퍼티 사포질

벽면 곰팡이 난 부분 퍼티 청소

벽면 곰팡이 난 부분 퍼티 젯소 1회

벽면 4 청소

벽면 4 옆/천장 커버링/마스킹

벽면 4, 걸레받이 회색 벽용 페인트칠 1

벽면 4, 걸레받이 회색 벽용 페인트칠 2

작은방

바닥면 전체 커버링 테이프(완료)

걸레받이 청소

걸레받이 옆 마스킹 테이프

걸레받이 젯소 1회

걸레받이 하얀색 가구용 페인트칠 1

걸레받이 하얀색 가구용 페인트칠 2

창틀 청소

창틀 옆 마스킹/커버링

창틀 젯소 1회

창틀 하얀색 가구용 페인트칠 1

창틀 하얀색 가구용 페인트칠 2

큰 창 윤활제 살포

옷방

문 손잡이 부딪히는 벽면 부분 스토퍼 혹은, 충격 완화용 물건 붙히기

화장실

문 아래 썩은 부분 퍼티 바르기

문 아래 썩은 부분 퍼티 사포질

문 아래 썩은 부분 퍼티 청소

문고리 교체

환풍기 교체

변기 커버 교체

세면기 배수관 방수용 실리콘으로 고정

장을 더 고정시키거나, 떼어내기(떼어내면 상태보고 추가 작업 필요할 수 있음)

파베 초콜릿 만들기

1. 코코아 함량이 65% 이상인 초콜렛을 뜨거운 물 위에 보울을 올려두고 그 위에서 은근히 녹인다.
2. 90% 정도 녹았다 싶으면 무염버터를 넣고 저으면서 끝까지 녹인다.
3. 뜨거운 물 위에서 떼어내고, 초콜릿과 1/2, 혹은 1/3 비율의 생크림을 넣고 잘 저어 섞는다. 생크림 비율이 높으면 초콜릿이 더 잘 녹는다고 한다. 생크림은 휘핑크림 말고, 크림 파스타 등에 들어가는 액체 형태의 생크림.
4. 열전도율이 높은 그릇에 비닐 봉지를 깔고 그 위에 녹인 초콜릿을 붓는다. 슬슬 흔들어 높이가 고르게 만든다.
5. 냉장고에서 약 30분 정도 식힌다.
6. 꺼내서 네모나게 잘라 녹차가루, 코코아 가루를 묻히면 완성

[Windows] Tortoise*를 사용할 때 Icon Overlay 안보이는 문제

Windows 7 등에서 TortoiseCVS, TortoiseSVN, TortoiseGit, TortoiseHg 등을 사용할 때, 아이콘 오버레이가 안보이는 경우가 있다.

이 경우 레지스트리 문제인데, HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers 아래에 Sub key 가 너무 많아서 그렇다. 15개 까지만 보인다고 한다.

잘 안쓰이는 Icon Overlay 항목에 그냥 “z_”를 추가시켜서 정렬했을 때 아래로 가도록 만들자. 수정 후에는 로그오프/로그인. 간단히 재부팅해도 되고~

참고 : http://stackoverflow.com/questions/1057734/tortoisesvn-icons-not-showing-up-under-windows-7

구글의 Python Tutorial

[번역] 구글의 파이썬 튜토리얼 요약.
원문은 Google’s Python Class(https://developers.google.com/edu/python/)

* Python 환경 설정

나올 때 윈도우에서는 Ctrl-Z, 다른 OS에서는 Ctrl-D

* Introduction

if __name__ == ‘__main__’:
    main()

sys.argv[0]는 프로그램 이름, sys.argv[1]은 첫번째 인자, sys.argv[2]는 두번째 인자…

TAB 문자 대신 Space들을 입력.

help(len) : len 함수에 대한 문서를 출력
dir(sys): sys 모듈에 대한 전반적인 문서
help(sys.exit): sys 내의 exit() 함수에 대한 문서

* Strings

파이썬 스트링은 “immutable”하다. 즉, 생성 후에 값을 변경할 수 없다. 따라서 다른 값이 되면 새로운 스트링이 생성된다.

“”” 로 여러줄 string 가능

[ ]로 문자 접근 가능
Slice로 substring 얻기
len(string) 은 string의 길이. sequence 타입에는 다 사용 가능
‘+’ 로 concatenate.

Value를 string 으로 변경하고 싶을 때는 str() 함수를 사용

pi = 3.14
text = ‘The value of pi is ‘ + str(pi)

정수로 나눗셈을 할 때는 // 를 사용. 6 // 5 == 1

print 뒤에 줄바꿈을 하고 싶지 않으면 마지막에 , 를 붙인다.
r 을 앞에 붙이면 ‘raw’ string. \ 를 특별히 취급하지 않는다. r’x\nx’ 는 ‘x\nx’ 가 됨. u 를 앞에 붙이면 unicode.

s.lower(), s.upper(): 소문자, 대문자로
s.strip(): 앞 뒤의 whitespace 제거
s.isalpha() / s.isdigit() / s.isspace(): 알파벳인지, 숫자인지, space인지
s.startswith(‘other’), s.endswith(‘other’): s 스트링이 다른 특정 스트링으로 시작하거나 끝나는지.
s.find(‘other’): s 스트링 안의 다른 스트링을 찾는다. 찾으면 인덱스 리턴, 못찾으면 -1
s.replace(‘old’, ‘new’): 모든 ‘old’를 ‘new’로 변경한 string 리턴
s.split(‘delim’): 주어진 delimiter로 자른 substring 리스트를 리턴,
s.join(list): split()의 반대, s를 delimiter로 리스트를 합친다.

길이가 1인 string 에 ==, <= 등의 작업을 할 수 있다. char 타입이 따로 없다.

H  e  l  l  o
0  1  2  3  4
-5 -4 -3 -2 -1

s[1:4]는 ‘ell’, s[1:]는 ‘ello’, s[:]는 ‘Hello’의 복사본, s[1:100]은 ‘ello’ – 더 큰 index를 사용하면 string의 length나 마찬가지가 된다.
s[-1]은 ‘o’, s[-4]은 ‘e’, s[:-3]은 ‘He’, s[-3:]은 ‘llo’
s[:n] + s[n:] == s 는 항상 참. n이 음수거나, index영역을 벗어났을 때도 성립.

% 연산자를 사용해 printf 같은 format string. %d는 int, %s는 string, %f/%g는 float, 오른쪽에 튜플.

text = “%d little pigs come out or I’ll %s and %s and %s” % (3, ‘huff’, ‘puff’, ‘blow down’)

너무 길면 전체 expression을 괄호로 싸면 된다.

text = (“%d little pigs come out or I’ll %s and %s and %s” %
    (3, ‘huff’, ‘puff’, ‘blow down’))

unistring.encode()와 unicode로 encoding 변환.

s = unistring.encode(‘utf-8’)
t = unicode(s, ‘utf-8’)
t == unistring

if / elif/ else. “zero” 값들(None, 0, “”, ”, [], {}, False)은 false, True/False로 boolean 값, and, or, not 사용. ()로 expression 을 감싸지 않는다.

* Lists

= 을 사용하면 그냥 reference.
‘+’ 를 사용해 list를 합칠 수 있다.

for와 in 으로 iteration

squares = [1, 4, 9, 16]
sum = 0
for num in squares:
    sum += num
print sum ## 30

in 은 독립적으로 어떤 원소가 list(또는 다른 collection)에 있는지 테스트 할 수 있다.

list = [‘larry’, ‘curly’, ‘moe’]
if ‘curly’ in list:
    print ‘yay’

range(n)은 0, 1, 2, …, n-1 까지의 숫자를 리턴. range(a, b) 는 a, a+1, a+2, …, b-1 까지를 리턴.

for i in range(100):
    print i

xrange()는 전체 리스트를 만드는 과정을 없애 성능 상 좋다.

while

i = 0
while i < len(a):
    print a[i]
    i = i + 3

list.append(elem): 리스트를 수정하여 가장 뒤에 elem 추가. 리턴하지 않는다.
list.insert(index, elem): index에 elem을 추가. 리턴하지 않는다.
list.extend(list2): list2의 원소들을 list에 추가. 리턴하지 않는다.
list.index(elem): elem이 있으면 index 리턴, 없으면 ValueError를 발생. ValueError 없이 확인하려면 in 을 사용.
list.remove(elem): 첫번째 elem을 제거, 없으면 ValueError. 리턴하지 않는다.
list.sort(): list를 sort. 리턴하지 않는다. sorted()를 더 자주 사용.
list.reverse(): list를 역순으로 변경. 리턴하지 않는다.
list.pop(index): index의 원소를 제거하고 리턴. index를 생략하면 가장 끝의 원소를 리턴(append()와 반대)

* Sorting

sorted()를 사용. reverse=True를 전달하면 역순. Case sensitive하다.

strs = [‘aa’, ‘BB’, ‘zz’, ‘CC’]
print sorted(strs) ## [‘BB’, ‘CC’, ‘aa’, ‘zz’] 
print sorted(strs, reverse=True) ## [‘zz’, ‘aa’, ‘CC’, ‘BB’]

key로 함수를 전달하면 해당 함수를 key로 정렬. key=len, key=str.lower 하면 대소문자 동일하게 취급하여 정렬.

print sorted(strs, key=str.lower) ## [‘aa’, ‘BB’, ‘CC’, ‘zz’]

key로 custom 함수 전달 가능

def MyFn(s):
    return s[-1]
print sorted(strs, key=MyFn)

cmp=cmpFn 선택 인자를 전달할 수도 있음. 내장 함수는 cmp(a, b)로 -/0/+ 로 순서를 리턴

Tuple은 struct와 비슷한 역할. 변경 불가능, 크기가 변하지 않음. () 를 통해 만듦. 크기가 1인 튜플은 ( 1, ) 처럼 , 을 넣어 만듦.

변수 할당에 사용 가능. 반환값이 여러 값을 가진 경우도 사용 가능
(x, y, z) = (42, 13, “Hike”)
(err_string, err_code) = foo()

[ _expr_ for var in list ] 형태로 원하는 형태의 리스트 생성 가능.

fruits = [‘apple’, ‘cherry’, ‘banana’, ‘lemon’]
afruits = [ s.upper() for s in fruits if ‘a’ in s ] ## [‘APPLE’, ‘BANANA’]

* Dictionaries and Files

dict = {}
dict[‘a’] = ‘alpha’
dict[‘g’] = ‘gamma’
dict[‘o’] = ‘omega’

print dict[‘a’] ## ‘alpha’
dict[‘a’] = 6
‘a’ in dict ## True
## print dict[‘z’] ## Throws KeyError
if ‘z’ in dict: print dict[‘z’] ## KeyError를 피한다.
print dict.get(‘z’) ## None

dict.get(key, not-found) 형태로 키가 없을 경우 not-found 로 설정한 값을 리턴하도록 할 수도 있다.

dict.keys(): key 리스트
dict.values(): value 리스트
dict.items(): (key, value) 튜플의 리스트

for k, v in dict.items(): print k, ‘>’, v

iterkeys(), itervalues(), iteritems()는 전체 리스트를 만들지 않아 성능 상 좋다.

hash = {}
hash[‘word’] = ‘garfield’
hash[‘count’] = 42
s = ‘I want %(count)d copies of %(word)s’ % hash # ‘I want 42 copies of garfield’

del 로 변수, list 원소, dict key/value를 지울 수 있다.

Files open(), close(). open 시 ‘rU’를 사용하면 줄바꿈을 ‘\n’으로 변형하여 준다.

f = open(‘foo.txt’,’rU’)
for line in f: ## 파일을 한 줄씩 방문
    print line, ## line 끝에 이미 줄바꿈이 포함되어 있으므로 print가 줄바꿈하지 않도록 한다.
f.close()

f.readlines()는 전체를 메모리에 올리고 줄들의 list를 리턴, read()는 전체 파일을 하나의 string으로.

파일에 쓰려면, f.write(string). print를 사용하려면, print >> f, string. python 3에서는 print(string, file=f)

codes는 unicode를 읽을 때 사용 가능

import codecs
f = codecs.open(‘foo.txt’, ‘rU’, ‘utf-8’)
for line in f: # line은 unicode string이 됨.

* Regular expression

import re
str = ‘an example word:cat!!’
match = re.search(r’word:\w\w\w’, str)
if match:
    print ‘검색 성공’, match.group() ## 발견 word:cat
else
    print ‘검색 실패’

패턴 스트링은 항상 r로 시작.

a, X, 9: 있는 그대로의 문자를 매치
.: 아무 문자 하나를 매치. \n 은 제외
\w: 하나의 word에 쓰이는 문자 하나를 매치(단어가 아님). a-z, A-Z, 0-9, _ [a-zA-Z0-9_]를 매치.
\W: non-word에 쓰이는 문자 하나를 매치
\b: word와 non-word의 경계
\s: 하나의 whitespace 문자[ \n\r\t\f]를 매치
\S: whitespace 이외의 문자를 매치
\d: 숫자 [0-9]
^: 시작
$: 끝
\를 붙여 위의 것들을 그저 문자로 사용 가능

+: 왼쪽 패턴 1개 이상.
*: 왼쪽 패턴 0개 이상.
?: 왼쪽 패턴 0개 혹은 1개
+와 *는 가장 왼쪽의 것을 찾고, greedy 하다. 

r'[\w.-]+@[\w.-]+’ 로 @ 주위에 ‘.’와 ‘-‘도 매치하도록 할 수 있다. -가 구간을 매치하지 않도록 하려면 가장 마지막에 넣는다.
[] 안의 내용을 ^로 시작하면 집합을 뒤집는다. [^ab]는 ‘a’와 ‘b’를 제외한 모든 문자를 뜻한다.

패턴 안에 ( )를 넣으면 그룹으로 구분할 수 있게 해준다.

str = ‘purple alice-b@google.com monkey dishwasher’
match = re.search(r'([\w.-]+)@([\w.-]+)’, str)
if match
    print match.group() ## ‘alice-b@google.com’
    print match.group(1) ## ‘alice-b’
    print match.group(2) ## ‘google.com’

findall(): 모든 패턴에 해당하는 string 리스트를 리턴

f = open(‘text.txt’, ‘r’)
strings = re.findall(r’some pattern’, f.read())

findall 에 ( )를 넣으면 그룹에 해당하는 튜플 리스트를 만든다.

str = ‘purple alice@google.com, blah monkey bob@abc.com blah dishwasher’
tuples = re.findall(r'(\w\.-]+)@([\w\.-]+)’, str)
print tuples ## [(‘alice’, ‘google.com’), (‘bob’, ‘abc.com’)]
for tuple in tuples:
    print tuple[0] ## username
    print tuple[1] ## host

re.search(pat, str, re.IGNORECASE) 처럼 추가 옵션 가능
IGNORECASE: 대소문자 구별하지 않음
DOTALL: 마침표 . 이 newline을 매치하도록 한다. 보통은 newline을 제외한 모든것들을 매치.
MULTILINE: 여러줄로 이루어진 string에서 ^와 $가 줄의 시작과 끝을 매치하도록 한다. 보통은 ^ $는 전체 스트링의 시작과 끝을 매치한다.

정규 표현식의 확장으로 .*? 나 .+?처럼 ?를 끝에 더해서 greedy 하지 않게 변경할 수 있다.

str = ‘<b>foo</b> and <i>so on</i>’
match = re.search(r'(<.*>)’, str)
if match:
    print match.group() ##'<b>foo</b> and <i>so on</i>’
match = re.search(r'(<.*?>)’, str)
if match:
    print match.group() ## ‘<b>’

re.sub(pat, replacement, str) 은 str에서 pat과 매치되는 모든 스트링들을 찾아 replacement로 치환한다. replacement 스트링은 \1, \2 를 이용하여 group(1), group(2)를 표현할 수 있다.

str = ‘purple alice@google.com, blah monkey bob@abc.com blah dishwasher’
print re.sub(r'([\w\.-]+)@([\w\.-]+)’, r’\1@yo-yo-dyne.com’, str)
# purple alice@yo-yo-dyne.com, blah monkey bob@yo-yo-dyne.com blah dishwasher

* Utilities

os 모듈
filenames = os.listdir(dir): dir에 있는 .과 ..을 제외한 파일이름들의 리스트, 절대경로가 아님.
os.path.join(dir, filename): filename과 dir을 합쳐서 path를 만든다.
os.path.abspath(path): path를 받아서 절대 경로를 리턴
os.path.dirname(path), os.path.basename(path): dir/foo/bar.html을 받아서 dirname ‘dir/foo’와 basename’bar.html’을 리턴
os.path.exists(path): path 가 존재하면 True를 리턴
os.mkdir(dir_path): dir 하나를 만든다.
os.makedirs(dir_path): dir_path를 만들기 위한 모든 디렉토리들을 만든다.
shutil.copy(source-path, dest-path): 파일을 복사한다. 복사될 디렉토리가 존재해야 한다.

commands 모듈: 외부 명령을 실행하고 결과물을 얻어옴.
(status, output) = commands.getstatusoutput(cmd): cmd를 실행하고 exit할 때까지 기다려서,
status int값과 output text를 tuple로 리턴한다. stdout과 stderr이 하나의 출력물로 합쳐져서 나타난다.
output = commands.getoutput(cmd): 위와 동일, status값을 받지 않는다는 것만 다름.
commands.getstatus() 라는 함수는 사용하지 말아라.
sub-process에 대한 더 많은 제어권을 원하면 “popen2” 모듈을 보라.
os.system(cmd): cmd의 결과물을 여러분 코드의 output으로 출력하고, error 코드를 리턴.

try/except. ‘except IOError, e:’ 의 형태로 exception 객체에 대한 포인터를 얻을 수 있다.

try:
  f = open(filename, ‘rU’)
  text = f.read()
  f.close()
except IOError:
  sys.stderr.write(‘problem reading:’ + filename)

urllib 모듈: url을 마치 file처럼 읽을 수 있게 한다. urlparse 모듈은 url을 분해하거나 합치는 기능을 제공
ufile = urllib.urlopen(url): url에 대한 file 같은 객체를 리턴
text = ufile.read(): 파일처럼 읽음. readlines()도 사용 가능
info = ufile.info(): 요청에 대한 meta 정보를 리턴. info.gettype() 으로 ‘text/html’ 같은 mime 타입을 얻어 옴.
baseurl = ufile.geturl(): 요청에 대한 “base” url을 얻어옴. redirect로 인해 open할 때 사용한 url과 다를 수 있다.
urllib.urlretrieve(url, filename): url의 데이터를 다운받아 filename의 file로 저장한다.
urlparse.urljoin(baseurl, url): full url을 만든다.

def wget2(url):
  try:
    ufile.urllib.urlopen(url)
    if ufile.info().gettype() == ‘text/html’:
      print ufile.read()
  except IOError:
    prit ‘problem reading url:’, url

[Linux:Kernel] Documentation/io-mapping.txt

이 문서의 저작권은 GPL 라이센스를 따릅니다(This document is released under GPL license).
Documentation/io-mapping.txt
번역: 양정석 <dasomoli@gmailREMOVETHIS.com>
linux/io-mapping.h 안의 io_mapping 함수들은 CPU에 I/O 디바이스들의 작은 영역을
효율적으로 맵핑하는 추상화를 제공합니다. 애초의 용도는 ioremap_wc가 커널 주소
영역을 너무 많이 소비할 때 처럼 CPU에 전체 영역을 정적으로 맵핑할 수 없을 때,
32비트 프로세서들에서 큰 그래픽 영역을 제공하기 위함입니다.
맵핑 객체는 드라이버 초기화 중에 다음을 사용하여 생성합니다
        struct io_mapping *io_mapping_create_wc(unsigned long base,
                                                unsigned long size)
                ‘base’는 맵핑 가능하게 만들어 질 영역의 버스 주소인 반면,
                ‘size’는 얼마나 크게 영역을 맵핑할 것인지를 나타냅니다.
                둘다 바이트 수 입니다.
                이 _wc 변형은 io_mapping_map_atomic_wc나 io_mapping_map_wc로만
                사용할 수 있는 맵핑을 제공합니다.
이 맵핑 객체로, 개별 페이지들이 자동적으로, 혹은 아니게 필요한 스케줄링 환경에
따라 맵핑될 수 있습니다. 물론, 어토믹 맵핑은 더 효율적입니다:
        void *io_mapping_map_atomic_wc(struct io_mapping *mapping,
                                       unsigned long offset)
                ‘offset’은 정의된 맵핑 영역 안에서의 오프셋입니다. 생성 함수
                에서 지정된 영역을 넘어서서 주소를 접근하는 것은 정의되지
                않은 결과를 불러옵니다. 페이지 정렬되지 않은 오프셋을
                사용하는 것도 정의되지 않은 결과를 불러옵니다. 반환 값은
                CPU 주소 공간 안의 한 페이지를 가리킵니다.
                이 _wc 변형은 페이지로의 write-combining 맵핑을 반환하고,
                io_mapping_create_wc에 의해 생성된 맵핑에만 사용가능합니다.
                태스크가 이 맵핑된 페이지를 잡고 있는 동안 슬립하지 않음을
                알아두세요.
        void io_mapping_unmap_atomic(void *vaddr)
                ‘vaddr’은 반드시 마지막 io_mapping_map_atomic_wc 호출에
                의해 반환된 값이어야 합니다. 이것은 지정된 페이지를 맵핑
                해제하고 그 태스크가 다시 한번 잠들 수 있게 합니다.
여러분이 그 락을 잡은 동안 슬립해야할 필요가 있다면, 극히 더 느리긴 하지만,
어토믹이 아닌 변형을 사용할 수 있습니다.
        void *io_mapping_map_wc(struct io_mapping *mapping,
                                unsigned long offset)
                이것은 태스크가 맵핑된 페이지를 잡고 있는 동안 슬립할 수 있다는
                것을 제외하면 io_mapping_map_atomic_wc와 같이 동작합니다.
        void io_mapping_unmap(void *vaddr)
                이것은 io_mapping_map_wc로 매핑된 페이지들이 사용되는 것을
                제외하면 io_mapping_unmap_atomic과 같이 동작합니다.
드라이버에 가까운 시간에, io_mapping 객체는 반드시 해제되어야만 합니다:
        void io_mapping_free(struct io_mapping *mapping)
현재 구현:
이들 함수의 초기 구현은 이미 구현된 맵핑 메카니즘을 사용해서 오직 추상 계층만
제공하고 새로운 기능은 없습니다.
64비트 프로세서에서 io_mapping_create_wc는 자원으로의 영구적으로 커널이 볼 수
있는 맵핑을 생성하는 전체 영역을 위해서 ioremap_wc를 호출합니다. 그 map_atomic과
map 함수들은 ioremap_wc에 의해 반환되는 가상 주소의 기준점으로부터의 요청된
오프셋을 더합니다.
HIGHMEM이 정의된 32비트 프로세서에서는 io_mappinc_map_atomic_wc가
kmap_atomic_pfn을 지정된 페이지를 어토믹하게 맵핑하는데 사용됩니다;
kmap_atimic_pfn은 디바이스 페이지와 사용될 것이라고 정말 여겨지지 않았습니다만,
이 용도를 위한 효율적인 맵핑을 제공합니다.
HIGHMEM 정의가 없는 32비트 프로세서에서는 io_mapping_map_atomic_wc와
io_mapping_map_wc 모두 새로운 맵핑을 모든 프로세서에 알리기 위해서 IPI를 수행하는
극악하게 비효율적인 함수인 ioremap_wc를 사용합니다. 이것은 극적인 성능 저하를
가져옵니다.

[Linux:Kernel] Documentation/printk-formats.txt

이 문서의 저작권은 GPL 라이센스를 따릅니다(This document is released under GPL license).

변수가 아래 타입이라면,           printk형식 지시자를 사용하세요:
———————————————————
                int                     %d 나 %x
                unsigned int            %u 나 %x
                long                    %ld 나 %lx
                unsigned long           %lu 나 %lx
                long long               %lld 나 %llx
                unsigned long long      %llu 나 %llx
                size_t                  %zu 나 %zx
                ssize_t                 %zd 나 %zx

가공되지 않은 포인터 값은 %p로 출력되는 것이 ‘좋습니다’. 커널은 포인터
형식을 위해 다음의 확장된 형식 지시자를 지원합니다:

심볼/함수 포인터:

        %pF     versatile_init+0x0/0x110
        %pf     versatile_init
        %pS     versatile_init+0x0/0x110
        %pSR    versatile_init+0x9/0x110
                (__builtin_extract_return_addr() 변환으로)
        %ps     versatile_init
        %pB     prev_fn_of_versatile_init+0x88/0x88

        심볼과 함수 포인터를 출력하기 위해서, (‘S’)로 오프셋과 함께, 혹은 (‘s’)로
        오프셋 없이, ‘S’와 ‘s’ 지시자들로 심볼 이름을 나타냅니다. KALLSYMS 없는
        커널 상에서 사용되면, 심볼 주소가 대신 출력됩니다.

        ‘B’ 지시자는 오프셋과 함께 심볼 이름을 나타내고, 스택 트레이스를 출력할
        때 사용되어야 합니다. 이 지시자는 Tail-Call이 사용되고, noreturn GCC 속성으로
        표시되었을 때 일어날 컴파일러 최적화의 효과를 고려하게 합니다.

        ia64, ppc64, 그리고 parisc64 아키텍처에서 함수 포인터들은 실제로는
        가장 먼저 풀어야 할 함수 기술자들입니다. ‘F’와 ‘f’ 지시자는 이 해결을
        수행하여 ‘S’와 ‘s’ 지시자와 같은 기능을 제공합니다.

커널 포인터:

        %pK     0x01234567 나 0x0123456789abcdef

        권한이 없는 사용자에게 가려져야 할 커널 포인터를 출력하기 위해서 사용.
        %pK의 동작은 kptr_restrict sysctl에 의존적입니다.
        – 더 자세한 사항은 Documentation/sysctl/kernel.txt를 보세요.

구조체 자원:

        %pr     [mem 0x60000000-0x6fffffff flags 0x2200] or
                [mem 0x0000000060000000-0x000000006fffffff flags 0x2200]
        %pR     [mem 0x60000000-0x6fffffff pref] or
                [mem 0x0000000060000000-0x000000006fffffff pref]

        구조체 자원을 출력하기 위해 사용. ‘R’과 ‘r’ 지시자는 디코딩된 플래그
        멤버들이 있게(‘R’) 혹은 없게(‘r’) 자원을 출력합니다.

phys_addr_t 타입의 물리 주소:

        %pa[p]  0x01234567 나 0x0123456789abcdef

        CPU 데이터 경로의 너비와 상관없이, 빌드 옵션에 의해서 다양하게 될 수 있는
        phys_addr_t 타입(그리고 resource_size_t 같은 그 변형)의 출력을 위해서 사용.
        참조로 넘김.
        

dma_addr_t 타입의 DMA 주소:

        %pad    0x01234567 나 0x0123456789abcdef

        CPU 데이터 경로의 너비와 상관없이, 빌드 옵션에 의해서 다양하게 될 수 있는
        dma_addr_t 타입의 출력을 위해서 사용. 참조로 넘김.

16진수 문자열의 비가공 버퍼:
        %*ph    00 01 02  …  3f
        %*phC   00:01:02: … :3f
        %*phD   00-01-02- … -3f
        %*phN   000102 … 3f

        명확한 구분자로 된 16진수 문자열로 작은 버퍼(64 바이트 길이까지의)를
        출력할 때 사용. 더 큰 버퍼는 print_hex_dump()의 사용을 고려하세요.

MAC/FDDI 주소:

        %pM     00:01:02:03:04:05
        %pMR    05:04:03:02:01:00
        %pMF    00-01-02-03-04-05
        %pm     000102030405
        %pmR    050403020100

        16진수 표기로 된 6바이트 MAC/FDDI 주소를 출력할 때 사용. ‘M’과
        ‘m’ 지시자는 바이트 구분자가 있게(‘M’) 혹은 없게(‘m’) 주소를 출력합니다.
        기본 바이트 구분자는 콜론(‘:’)입니다.

        FDDI 주소들이 쓰이는 곳에서 ‘F’ 지시자는 기본 구분자 대신에 대시(‘-‘)
        구분자를 사용하기 위해서 ‘M’ 지시자 이후에 사용될 수 있습니다.

        블루투스 주소를 위해서 리틀 엔디언으로 된 블루투스 주소의 보이는 형태의
        거꾸로 된 바이트 순서 맞춤을 사용하기 위해서 ‘R’ 지시자가 쓰이면 좋습니다.

IPv4 주소:

        %pI4    1.2.3.4
        %pi4    001.002.003.004
        %p[Ii]4[hnbl]

        IPv4의 점으로 구분된 10진수 주소를 출력할 때 사용. ‘I4’와 ‘i4’ 지시자는
        앞 쪽 0들이 있게(‘i4’) 혹은 없게(‘I4’) 주소를 출력합니다.

        덧붙는 ‘h’, ‘n’, ‘b’, 그리고 ‘l’ 지사자들은 각각 호스트, 네트워크,
        빅 또는    리틀 엔디언 주소를 나타내는데 사용됩니다. 아무 지시자가 없다면,
        기본 네트워크/빅 엔디언 오더가 사용됩니다.

IPv6 주소:

        %pI6    0001:0002:0003:0004:0005:0006:0007:0008
        %pi6    00010002000300040005000600070008
        %pI6c   1:2:3:4:5:6:7:8

        IPv6 네트워크-오더 16비트 16진수 주소를 출력할 때 사용. ‘I6’와 ‘i6’
        지시자는 콜론 구분자가 있게(‘I6’) 혹은 없게(‘i6’) 주소를 출력합니다.
        앞 쪽의 0들은 항상 사용됩니다.
        
        덧붙는 ‘c’ 지시자는 ‘I’ 지시자와 함께 http://tools.ietf.org/html/rfc5952에
        쓰여 있는 압축된 IPv6 주소를 출력하는데 사용할 수 있습니다.

IPv4/IPv6 주소 (일반적인, 포트와 함께, flowinfo, 범위):

        %pIS    1.2.3.4         나 0001:0002:0003:0004:0005:0006:0007:0008
        %piS    001.002.003.004 나 00010002000300040005000600070008
        %pISc   1.2.3.4         나 1:2:3:4:5:6:7:8
        %pISpc  1.2.3.4:12345   나 [1:2:3:4:5:6:7:8]:12345
        %p[Ii]S[pfschnbl]

        그 타입이 AF_INET인지 AF_INET6인지 구분할 필요 없이 IP 주소를 줄력할 때
        사용. ‘IS’ 또는 ‘iS’를 통해 지정된 유효한 ‘struct socketaddr’로의
        포인터는 이 형식 지시자에게 넘겨질 수 있습니다.

        덧붙는 ‘p’, ‘f’, 그리고 ‘s’ 지시자는 포트(IPv4, IPv6), flowinfo(IPv6),
        범위(IPv6)를 지정하는데 사용됩니다. 포트는 “:” 접두어를 갖고, flowinfo는
        ‘/’, 그리고 스코프는 ‘%’를 갖고, 각각 실제 값이 뒤 따릅니다.

        IPv6 주소의 경우에 http://tools.ietf.org/html/rfc5952에서 기술된
        압축된 IPv6 주소는 지시자 ‘c’를 사용하면 사용됩니다. IPv6 주소는
        추가적인 지시자        ‘p’, ‘f’, ‘s’의 경우에
        https://tools.ietf.org/html/draft-ietf-6man-text-addr-representation-07 에
        제안된 것처럼 ‘[‘, ‘]’로 둘러싸입니다.

        IPv4 주소의 경우, 덧붙는 ‘h’, ‘n’, ‘b’, 그리고 ‘l’ 지시자가 잘 사용될 수
        있고, IPv6 주소의 경우에는 무시됩니다.

        더 많은 예제:

        %pISfc          1.2.3.4         나 [1:2:3:4:5:6:7:8]/123456789
        %pISsc          1.2.3.4         나 [1:2:3:4:5:6:7:8]%1234567890
        %pISpfc         1.2.3.4:12345   나 [1:2:3:4:5:6:7:8]:12345/123456789

UUID/GUID 주소:

        %pUb    00010203-0405-0607-0809-0a0b0c0d0e0f
        %pUB    00010203-0405-0607-0809-0A0B0C0D0E0F
        %pUl    03020100-0504-0706-0809-0a0b0c0e0e0f
        %pUL    03020100-0504-0706-0809-0A0B0C0E0E0F

        16바이트 UUID/GUID 주소를 출력하기 위해 사용. 덧붙는 ‘l’, ‘L’, ‘b’,
        그리고, ‘B’ 지시자는 리틀 엔디언 오더를 소문자(‘l’) 또는 대문자(‘L’)
        16진수 문자로 – 그리고 빅 엔디언 오더를 소문자(‘b’) 또는 대문자(‘B’)
        16진수 문자로 표시하는데 사용됩니다.

        아무 추가 지시자도 붙지 않으면 기본으로 리틀 엔디언 오더에 소문자로
        출력될 것입니다.

dentry 이름:
        %pd{,2,3,4}
        %pD{,2,3,4}

        dentry 이름을 출력하는데 사용; 만약 우리가 d_move()로 경쟁 상태를 만들면,
        그 이름은 오래된 것과 새 것이 섞일 것입니다. 웁스를 일으키지 않습니다.
        %pd dentry는 우리가 사용하곤 했던 %s dentry->d_name.name와 같지만 더
        안전합니다. %pd<n>은 마지막 n 컴포넌트를 출력합니다. %pD는 struct file에
        같은 동작을 합니다.

struct va_format:

        %pV

        struct va_fotmat 구조체를 출력하는데 사용. 이들은 다음과 같은 va_list와
        형식 문자열을 포함합니다:

        struct va_format {
                const char *fmt;
                va_list *va;
        };

        형식 문자열이나 va_list 인자들의 정확성을 확인하기 위한 어떤 메카니즘 없이
        이 기능을 사용하지 마세요.

u64는 %llu/&llx로 ‘출력해야’ 합니다:

        printk(“%llu”, u64_var);

s64는 %lld/%llx로 ‘출력해야’ 합니다:

        printk(“%lld”, s64_var);

Example:
<type>이 그 크기의 설정 옵션(예를 들면, sector_t, blkcnt_t)이나 그 크기의 아키텍처
(예를 들면, tcflag_t)에 의존적이라면, 가능한 가장 큰 타입의 형식 지시자를 쓰고
명시적으로 형을 변환하세요.
예제:

        printk(“test: sector number/total blocks: %llu/%llu\n”,
                (unsigned long long)sector, (unsigned long long)blockcount);

다시 알림: sizeof() 결과는 size_t 타입입니다.

여러분의 협력과 주의에 감사합니다.
By Randy Dunlap <rdunlap@infradead.org> and
Andrew Murray <amurray@mpc-data.co.uk>
그리고 우리말 번역에 양정석 <dasomoli@gmail.com>

[Ubuntu] root 인증서 설치

프록시를 사용하는 환경에서 https 프로토콜을 사용할 때 인증 오류가 나는 경우, ca-certificate 인증 문제일 경우가 많다. 프록시 사용에 따른 인증서를 제공한다면 이걸 시스템 전역적으로 설치해주면 해결된다. 절차는 간단하다.

$ sudo mkdir /usr/share/ca-certificates/extra
$ sudo cp foo.crt /usr/share/ca-certificates/extra/
$ sudo dpkg-reconfigure ca-certificates

하고나서 껐다켜야 잘 되던데? 왜그런거지..

출처: http://askubuntu.com/questions/73287/how-do-i-install-a-root-certificate