64비트 배포판에서 32비트 executable이 실행이 안되길래 strace로 보니 /lib/ld-linux.so.2를 찾다가 못찾아서 실행이 중단된다.
ia32-libs 깔려고보니..
ia32-libs 패키지가 없어지고 gcc-multilib meta 패키지로 대체된 듯 하다.
sudo dpkg --add-architecture i386
sudo apt-get install gcc-multilib
64비트 배포판에서 32비트 executable이 실행이 안되길래 strace로 보니 /lib/ld-linux.so.2를 찾다가 못찾아서 실행이 중단된다.
ia32-libs 깔려고보니..
ia32-libs 패키지가 없어지고 gcc-multilib meta 패키지로 대체된 듯 하다.
sudo dpkg --add-architecture i386
sudo apt-get install gcc-multilib
매번 할 때마다 그냥 그때그때 찾아서 했는데, 이제 찾는 것도 귀찮다…..
요약하면, sudo gparted 하여 우분투 설치 파티션 알아냄. 거의 ext4 파티션. 나의 경우 /dev/sda4
sudo mount /dev/sda4 /mnt
sudo mount –bind /dev /mnt/dev &&
sudo mount –bind /dev/pts /mnt/dev/pts &&
sudo mount –bind /proc /mnt/proc &&
sudo mount –bind /sys /mnt/sys
sudo chroot /mnt
grub-install /dev/sda
grub-install –recheck /dev/sda
update-grub
exit &&
sudo umount /mnt/sys &&
sudo umount /mnt/proc &&
sudo umount /mnt/dev/pts &&
sudo umount /mnt/dev &&
sudo umount /mnt
2. Default 설정 등 파일은 /etc/default/grub 에 있음. 설정 바꾼 후 update-grub 하면 그대로 설정됨.
GRUB_DEFAULT=0
#GRUB_HIDDEN_TIMEOUT=0
GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT=”quiet splash”
GRUB_CMDLINE_LINUX=””
2차 목록을 기준으로 페인트 칠을 위해 할 일을 군으로 정렬한다.
현관: 벽면 칠하기 전 걸레받이 커버링 테이프
현관: 신발장 커버링 테이프
큰방: 벽면 곰팡이 난 부분 벽지 제거
큰방: 벽면 곰팡이 난 부분 곰팡이 제거
큰방: 벽면 곰팡이 난 부분 곰팡이 방지제 발포
큰방: 벽면 곰팡이 난 부분 퍼티 바르기
큰방: 벽면 곰팡이 난 부분 퍼티 사포질
거실: 큰 방 쪽 벽면 청소
거실: 큰 방 쪽 벽면 옆과 천장 마스킹/커버링 테이프
거실: 바닥면 전체 커버링 테이프
거실: 베란다 창틀 옆 마스킹 테이프
큰방: 벽면 곰팡이 난 부분 퍼티 청소
거실: 에어컨 환기구 커버 청소
거실: 걸레받이 청소
거실: 문틀 청소
큰방: 벽면 곰팡이 난 부분 퍼티 젯소 1회
거실: 에어컨 환기구 젯소 1회
거실: 걸레받이 젯소 1회
거실: 문틀 젯소 1회
거실: 화장실 문 구멍난 부분, 썩은 부분 퍼티질
거실: 화장실 문 구멍난 부분, 썩은 부분 퍼티 사포질
거실: 화장실 문 구멍난 부분, 썩은 부분 퍼티 청소
거실: 에어컨 환기구 하얀색 가구용 페인트칠 1
거실: 에어컨 환기구 하얀색 가구용 페인트칠 2
거실: 베란다 창틀 하얀색 가구용 페인트칠 1
거실: 베란다 창틀 하얀색 가구용 페인트칠 2
작은방: 걸레받이 하얀색 가구용 페인트칠 1
작은방: 걸레받이 하얀색 가구용 페인트칠 2
작은방: 창틀 하얀색 가구용 페인트칠 1
작은방: 창틀 하얀색 가구용 페인트칠 2
거실: 걸레받이 하얀색 가구용 페인트칠 1
거실: 걸레받이 하얀색 가구용 페인트칠 2
현관: 현관 문 벽면과 현관 옆 벽면 하얀색 벽용 페인트칠 1
현관: 현관 문 벽면과 현관 옆 벽면 하얀색 벽용 페인트칠 2
거실: 큰 방 쪽 벽면 하얀색 벽용 페인트칠 1
거실: 큰 방 쪽 벽면 하얀색 벽용 페인트칠 2
화장실: 문틀 옆 썩은 부분 퍼티 사포질
화장실: 문틀 옆 썩은 부분 퍼티 청소
거실: 문틀 옆 마스킹 테이프
거실: 문 4개 젯소 1회
거실: 문틀 남색 가구용 페인트칠 1
거실: 문틀 남색 가구용 페인트칠 2
거실: 문 4개 남색 가구용 페인트칠 2
큰방: 벽면 4 청소
큰방: 벽면 4 옆/천장 커버링/마스킹
큰방: 벽면 4, 걸레받이 회색 벽용 페인트칠 1
큰방: 벽면 4, 걸레받이 회색 벽용 페인트칠 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
화장실
문틀 옆 썩은 부분 퍼티 사포질
문틀 옆 썩은 부분 퍼티 청소
* 페인트 칠 이후 해도 되는 작업 ————————————————–
부엌
싱크대 유리문 가스 쇼바 교체
작은방
큰 창 윤활제 살포
옷방
문 손잡이 부딪히는 벽면 부분 스토퍼 혹은, 충격 완화용 물건 붙히기
화장실
문고리 교체
환풍기 교체
변기 커버 교체
세면기 배수관 방수용 실리콘으로 고정
장을 더 고정시키거나, 떼어내기(떼어내면 상태보고 추가 작업 필요할 수 있음)
마우스/키보드 공유 유틸리티로 MS mouse without borders 라는게 있길래 설치해 보니 잘된다~
Synergy와 비슷한데, 윈도끼리의 공유는 MS 거니까 더 잘되겠지 하고 설치.
할 일이 너무 많으니까 정리가 안된다. 무작정 하면 시간도 더 걸릴거 같고.
가구 놓고, 배치하고 하려면, 살림살이 채우려면 시간이 없다.
재료도 한번에 쓸 때 같이 쓰는게 좋다. 롤러나 붓의 세척 시간도 줄일 수 있고,
페인트나 젯소, 퍼티는 뚜껑을 땄다가 다시 밀봉할 때 신경 쓰인다.
기본적으로 페인트칠은 “청소 -> 커버링/마스킹 -> 젯소 -> 페인트 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
걸레받이 하얀색 가구용 페인트칠 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
큰 창 윤활제 살포
옷방
문 손잡이 부딪히는 벽면 부분 스토퍼 혹은, 충격 완화용 물건 붙히기
화장실
문 아래 썩은 부분 퍼티 바르기
문 아래 썩은 부분 퍼티 사포질
문 아래 썩은 부분 퍼티 청소
문고리 교체
환풍기 교체
변기 커버 교체
세면기 배수관 방수용 실리콘으로 고정
장을 더 고정시키거나, 떼어내기(떼어내면 상태보고 추가 작업 필요할 수 있음)
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
[번역] 구글의 파이썬 튜토리얼 요약.
원문은 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
이전 설치 시 삽질을 많이 했었는데, 지금은 웹 상에 작성된 놓은 한글 가이드 문서가 있다.
Gerrit 코드리뷰(Code Review) 설치 가이드 1부 – 준비
Gerrit 코드리뷰(Code Review) 설치 가이드 2부 – Http 인증 설정
Gerrit 코드리뷰(Code Review) 설치 가이드 3부 – Gerrit 설치
Gerrit 코드리뷰(Code Review) 설치 가이드 4부 – Gerrit 설정
내가 정리했던 문서는 오래되기도 했고, 부끄러워 못 내놓겠다. ㅋ