Sunday, October 17, 2010

linux server

--apache server--

일단 hanil 서버를 관찰 결과를 보자면 fedora 13을 깔았는데 기본적으로 모든 서버가 다 작동 되는걸로 보인다.

apache server의 위치는 /etc/httpd/ 그 안에 conf 폴더가 설정 폴더.
-httpd.conf 파일을 내용: 대부분 주석에 내용으로 파악이 가능. 
httpd.conf 를 수정뒤 syntax error가 없는 지 확인하기 위해서 httpd -t 명령어를 이용하면 된다.


"keepAlive"에 대한 설명 : http://cafe.rootcenter.com/130079030932
"MPM"(multi_processing modules) : perfork, worker, perchild 방식이 있고, 현제 시스템의 방식은 httpd -l 명령어로 확인가능
1. perfork : 응답 프로세스를 미리 띄어 놓고, 클라이언트의 요청이 있을 때 자식 프로세스가 반응할 수 있도록 하는 설정
2. worker : 프로세스 기반의 서버인 prefork와 스레드로 클라이언트 요청에 응답하는 혼합된 스레드 서버.
3. perchild : 고정 프로세스 개수를 설정한 후 각 프로세스는 특정 스레드를 개수만큼 작동시킴.
"Listen" : 웹서버의 서비스 포트로 80 이 기본이며 다른 포트 번호를 사용할 경우  ServerName 지시자에 명시해야 한다.


"ServerAdmin" : 시스템 관리자 Email 주소
"Directory tag:아파치 서버가 접근하는 각 디렉토리에 아떠한 서비스와 기능들을 허용하고 또는 삭제 할 것인가 설정하는 부분
1.options: "indexes" : 웹사이트에 접속했을 때 index.html이 없을 경우 웹서버 스스로 그 디렉토리의 파일들을 보여 줄것이라는 의미, ExecCGI: CGI 스크립트 실행 허용,
SSI 란? http://blog.naver.com/v_kazel_v?Redirect=Log&logNo=110028893616
2.AllowOverride : 웹문서 디렉토리에서 접근 제한 설정 파일인 .htaccess 파일을 작동시킬 것인지 여부를 결정(접근 제한을 위해선 AllowOverride를 All로 설정하고 .htaccess 만들어 놓는다),
3.order : http://blog.naver.com/hkh119?Redirect=Log&logNo=120021176586
"UserDir" : 루트 이외의 다른 계정으로 홈페이지를 운영하고자 할때 사용자의 웹문서 기본 기렉토리를 UserDir 지시자로 지정 해준다. 먼저 default 로 되어 있는 UserDir disabled를 제거 하고 일반적으로 UserDir public_html 이라고 지정하고 나서 를 지정한다.
"DirectoryIndex" : 클라이언트가 웹서버에 대한 요청이 있을 때 클라이언트에 전달하는 html문서의 순서를 지정해 주는 지시자
"AccessFilleName" : 각 디렉토리에서 접근 제어 정보를 가지고 있는 파일명을 지정하는 지시자.


--보안--
기본적으로 파일이 생성되면 umask에 값을 뺀 값으로 퍼미션이 잡힌다. umask 명령어로 기본 umask 값을 볼수 있다(일반적으로 umak는 0022).
SUID,SGID 프로그램은 보안상 위험하다.
<참고>파일 권한 {'x'1:,'w':2,'r':4}, user,group,other 순, 4자 permission 구조 sticky bit(1000) : 모든 사용자가 쓰고 삭제 할수 있는 디렉토리를 의미, 파일구조 맨마지막에 t가 붙는다, SetGID(2000) : , SetUID(4000)
http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=110&docId=64531886&qb=Y2htb2QgU2V0dWlk&enc=utf8&section=kin&rank=2&search_sort=0&spq=0&pid=g7VyQB331xwssZijnSKssv--138254&sid=TLsxtXIPu0wAAC2@F3g
find / -type f \( -perm -04000 -o -perm -02000 \) : SUID/SGID 프로그램 존재 확인 명령어
find / -perm -2 -print : 누구나 쓰기 가능한 world-writable 파일을 모두 찾는 명령어
find / -nouser - nogroup -print : 유저 권한이 없는 파일 검색
find / -name .rhosts -print : 원격 호스트 파일 (.rhost) 파일 검색. 이는 제거 하는것이 좋다.

charttr : 파일 속성을 변경해주는 유틸리티로 루트 자신도 파일을 변경하지 못하도록하는 것.
lastlog : /etc/passwd에 등록되어 있는 사용자의 최근 로그인 상황을 볼수 있다(자주 사용하지 않을 사용자가 로긴 되어있을 경우 크래킹을 의심).

Nmap : 포트 스캔 도구
yum list  : 설치된 패키지와 업데이트 가능한 패키지 보기
yum list installed <패키지 명> : 특정 패키지 설치 확인
yum list available 'somthing*' : yum 가능한 패키지 보기(somthing이란 이름이 들어간 패키지)
yum check-update : 업데이트 가능한 패키지 보기
yum install <패키지 명> : 패키지 설치
yum info <패키지 명> : 패키지 정보 알아보기

yum install nmap 으로 nmap 설치 이후 hanil 서버의 열린 포트를 알아본다
nmap -sS  
그뒤 특정 포트에 대한 설정을 iptable이용하여 하면 STATE 필드가 filtered로 변한다.

Snort : 네트워크를 통한 침입에 대한 탐지 및 경고를 시스템 관리자에게 알려주는 네트워크 침입 탐지 시스템으로 libpcap 라이브러리를 이용하여 네트워크상의 패킷과 설정 파일에서 정의된 룰에 의해서 침입 및 공격을 알려주는 도구.
yum install snort
/etc/snort/snort.conf 파일에 설정 내용이 들어 있다(var HOME_NET 로 설정).
외부에서 포트 스캔을 하거나 접근 시도가 있으면 /var/log/snort 에 기록이 남는다.

lastlog : 텔넷 접속으로 로그인한 사용자를 추적할때 사용하는 명령어로 /var/log/lastlog의 내용 출력
last : /var/log/wtmp 파일에 저장된 정보를 읽어 들여 로그인한 사용자의 정보를 출력 (last graphy21 : 특정 사용자 로그인 정보)
xferlog : FTP로 파일 전송 기록을 저장하는 파일 (more xferlog)
커널과 시스템에 관련된 로그 메시지들은 syslogd와 klogd 두개의 데몬에 의해서 /var/log/messages에 기록된다.

--SElinux (Security Enhanced Linux)--
a
--TCP/IP 네트워크 (iptable 설정)--


Thursday, October 14, 2010

linux command

--send message in linux:
* 메세지 브로드캐스트
  wall 메세지
  ctrl+D

*개인에게 메세지 보내기
  write userid pts/number
  ctrl+d

--display cpu information:
cat proc/cpuinfo

--mail in linux (when sendmail server is running) : 
-check mail : mail
-writing mail :
mail graphy21@gmail.com
subject: something
something
.

2*(ctrl+c) mean cancel.
-writing mail by file : mail -s 'subject' graphy21@gmail.com < some_file.ext

--check running demon in kernel:
ps acx
-check zombi process & kill that:
ps axj # 'z' in STAT field in output mean zombi
kill -l # list of signal which can be send to process
kill [-signal number || signal] PID # example : kill -9 973

Tuesday, October 12, 2010

리눅스 운영체제의 이해와 개발

병렬 프로그래밍을 보다가 thread를 이용해서 posix에서 알아서 cpu를 조정하는 것을 알았다(우스워 보일지 모르지만 나름 굉장한 흥분된 발견이였다. python 예제에서 나왔을 때 아무 생각 없이 따라 했는데 연대 핸드아웃 프린트 물 보다보니 확실히 이해하는 순간... 여튼). 그러면 순간 드는 생각이 아니 그럼 os는 어떻게 알아서 thread를 관리하지? 라는 생각. 그래서 os가 어떻게 돌아가는지 알아야 겠다는 생각에 선택한 책.
상품평에 의하면 완전 쉬운 해설과 친절한 최고의 책과 같이 되어있지만... 나와 같은 허접덩이한테는 그저 외계어에 가깝다.
그런데 재밌는건 이해가 거의 안되지만(하다못해 처음 kernel을 다운 받아서 컴파일 하는 과정 조차 이해되지 않음) 왠지 모르게 재밌게 읽고 있다는 것이다. 신기..
내 목표는 이해와 개발이 아니라 끝까지 정독과 개념 잡기 정도 이다. 끝을 꼭 보자. 끝을 보도 책에 대한 나의 평가를 다시 붙이도록 한다.

Sunday, October 10, 2010

evolution of methylome

영건씨랑 이야기 하다 좀더 정리가 된거 같아서 관련 내용을 기록한다.

목표 : methylation의 evolution의 경향

기존의 논문은 dna sequence로 phylogeny tree를 만들고 그걸 기준으로 methylation pattern을 정리 한다. 정해진 트리에 맞춰서 transposon (repeat sequence) 과 genebody (혹은 exon과 intron 부위를 나눠서) methylation pattern(여러종을 보기때문에 CpG 뿐만 아니라 CHH등)을 보고 DNMT의 homologue 의 존재 여부와 연관을 지어 phylogeny의 어느 branch는 어떤 시퀀스(CG나 CHH)가 많이 methylation되어 있고 어느 부분은 그렇지 않다라는 식으로 정리한다.
우리는 아예 phylogeny를 methylation이 들어간 정보로 새로히 그려보고자 한다. 그리고 그 tree를 그리기 위한 genomic region을 크게 gene body 와 transposon으로 나누고 두 영역으로 그린 tree가 같은가를 본다.
FFP를 선택한 이유에 대해서는 기존의 multiple alignment를 통한 phylogeny tree를 그리는 것은 homology가 있는 시퀀스를 선택해서 그려야 하는데(특정 부위에 의한 biased가 있는게 아닐까 생각한다) 이러한 제약이 없다.

Wednesday, October 6, 2010

python 3부 : 모듈

이부분은 chapter의 순서와 상관없이 나가겠다. 보고 싶은것 부터..

chapter18 : 보다 견고한 코드 만들기
이부분에서는 unittest 모듈을 사용하는 방법을 알려준다.
일반적으로 unittest의 TestCase의 클래스를 상속 받는 클래스를 생성한다음에 TestSuite 에 넣고 실행. 자세한것은 책 참조

아 보다가 알아낸것 None은 "is" 연산자를 이용해야 한다는데 아래 링크 참조
http://jaredgrubb.blogspot.com/2009/04/python-is-none-vs-none.html

chapter19 : distutils를 이용한 배포
ㅁㅁ

etc
- timeit 모듈 : 실행 시간 재는 모듈
http://man.lupaworld.com/content/develop/diveintopython-html-5.4/diveintopython-5.4/performance_tuning/timeit.html

python appendix

디버깅
파이썬에서 C언어 디버깅을 위한 유틸인 gdb 처럼 비슷한 pdb를 제공한다.
pdbtest 라는 모듈이 있을때 이것을 디버깅 하기 위한 모듈이 pdb.
import pdb, pdbtest 한뒤 pdb.runcall(pdbtest.func) 과 같이 하면 pdbtest 모듈의 func 함수를 테스트 해볼 수 있다. 디버깅 모드로의 실행은 run, runcall. runeval 이 있다.
b (break) : 브레이크 포인트설정및 확인
w (where) : 현재 스택 프레임 확인 등....
디버깅 모드(Pdb)에서 help를 치면 각종 명령어를 볼수 있으며 특정 명령어에 대한 설명을 보려면 help <명령어> 하면 된다.

Sunday, October 3, 2010

python 1부 : 문법 2

1부의 내용이 너무 길어지는 바람에 포스팅을 나누기로한다. 
책을 4장까지 밖에 보지 않았지만 지금까지 느낀점을 이야기 하자면 이 책의 포지션이 좀 애매하다는 것이다. 컴퓨터 언어를 전혀 모르는 이를 위해 쓴거 같지도 않고 그렇다고 심화해서 좀더 깊이 설명한것도 아니고 어중간하게 설명한다는 점이다. 글을 보다 보면 C를 알고 있다는 전제 하에 설명한거 같은데 그렇다고 뚜렷하게 각각의 요소를 C의 구성요소로 어떻게 만들었는지 설명하는 것도 아니고.. 애매하다. 


C로 만들었다고 하는데 객체 개념이 어떻게 들어갔는지, C++도 C로 만들은 것인지 그렇다면 궁극적으로 C는 무엇으로 만들었는지(어셈블리어라고 생각하고 있지만)등의 궁금증이 생긴다. 이것 또한 저자한테 질문을 해봐야 겠다. 어제 토요일 늦게 질문을 올렸는데 월요일에 답변이 오지 않으면 왠지 실망할거 같은 느낌이다.


chapter5 : 클래스
클래스의 선언은 함수의 선언과 유사하게 def 대신 class 키워드를 사용하면 된다. 클래스가 선언과 동시에 클래스 객체가 생성된다(클래스 이름의 이름 공간이 생긴다). 클래스를 사용하기 위해선 인스턴스 객체를 생성해야 한다. class MyClass:Name='shkm';def Print(self):print(self.Name) 이라는 클래스가 있으면 p1 = Myclass()와 같이 인스턴스 객체를 만들게 되고 이는 클래스의 객체와 모든 멤버변수와 멤버함수를 공유하게 된다. 다만 인스턴스 객체의 멤버변수가 변하게 되면 (p1.Name='eykang') 변경된 내용을 인스턴스 객체 이름 공간에 저장하게 된다.
클래스의 멤버변수,함수들은 default로 public으로 정의 된다. 위의 Myclass 에서 보면 self가 나오는데 이는 C++의 this와 같은 역할(자기 자신을 가르키는 포인터)을 한다. 이 self는 예약어는 아니지만(곧 다른 이름으로 표현 가능) 관행상 self라고 하며 '정적메소드'와 '클래스메소드'를 제외한 메소드의 첫번째 매개변수는 self로 취급된다.
그럼 self로 메소드를 나타내야 하는 이유? 인스턴트 객체도 클래스 객체의 메소드를 가리키고 있기 때문에 메소드를 사용하기 위해서는 자기 자긴을 가르키는 포인터를 넘겨줘야 한다. 그러나 그 메소드를 실행할때는 p1.Print() 처럼 정작 self에 대한 매개 변수를 넘겨주지 않는데 이는 자동적으로 self가 들어가게 된다. 이와 같은 호출을 바운드 메서드 호출이라 한다.
파이썬에서는 실행시간에 각 클래스와 인스턴스 이름 공간에 멤버 변수를 추가하거나 삭제할 수있다. 이는 서로 이름 공간이 분리 되어 있기 때문이라고 이해하면 된다. 클래스 객체에 새로운 멤버 변수를 추가하면 이는 인스턴스 객체에서 참조할수 있는데 이는 객체에서의 멤버 변수 탐색이 인스턴스>클래스>전역 순이기 때문에 자기 자신에 없는 멤버변수라도 클래스 객체에 생기면 참조할수 있는 것이다. 반면에 인스턴스 객체에 새로운 멤버변수를 추가하게 되면 자기 자신의 인스턴스 객체에서만 참조가 가능하다. 인스턴스 객체 내의 내장 속성 __class__를 이용하면 클래스 객체의 멤버변수를 바꿀수도 참조 할수도 있다.
한 클래스가 다른 클래스의 상속인지 확인하거나 한 인스턴스 객체가 어떤 클래스로부터 생성되었는지 확인하기 위해 isinstance(인스턴스 객체, 클래스 객체) 를 이용할 수 있다.
클래스 생성시 객체를 초기화 하기 위해 생성자가 파이썬 역시 있으며 이는 __init__() 멤버함수이다. 소멸자는  __del__() 이다. 생성자는 인스턴스 객체 생성시 호출되면 소멸자는 인스턴스 객체의 참조 카운트가 0이 될때 호출된다.
정적 메서드 : 원래 클래스의 멤버 함수를 사용하기 위해서는 인스턴스 객체를 생성하고 그것을 통해서 가능한데(그렇기 때문에 이러한 멤버 함수는 반드시 인자로 self가 있어야 한다) 인스턴스 객체 없이 클래스를 통해 직접 호출할수 있는 맴버 함수를 static method라고 한다(객체를 통하지 않기때문에 self 매개변수가 필요 없다).
클래스 메서드 : 클래스 메서드는 정적 메서드와 동일하나 단 암묵적으로 클래스를 첫 인자로 받는다.
파이썬에서 클래스는 기본적으로 public의 속성인데 멤버 변수 이름 앞에 __를 붙이면 private가 된다.
클래스의 연산자 오버로딩을 위한 멤버 함수들이 있다(책 참조).
인스턴스 객체의 멤버 변수 정보를 알려면 인스턴스 객체.__dict__을 이용하면 된다.
클래스 객체.__bases__ 는 클래스 객체의 직계 base 클래스를 알 수 있다.
파이썬에서는 base 클래스의 생성자를 이용하려면 derived 클래스의 생성자 내에 명시적으로 base 클래스를 언바운드 메서드 호출(self 인자를 넘겨주면서 호출하는 것)을 해야 한다.
C++에서는 method overriding 하기 위해서는 base 클래스의 함수와 derived 클래스의 함수가 이름, 매개변수, 리턴값이 같아야 하나 python에서는 함수 이름만 같아도 된다.
책에는 안나온 내용이지만 클래스 내에 함수 overloading은 python에서 안되는 것 같다. 그러나 *argv 나 **argv 나 기본적으로 python 자체가 각 자료형에 맞게 polymorphism이 이뤄진다는 걸생각하면 C++의 함수 overloading의 문법이 아니라도 의미적으로 가능하다.
클래스 객체.__mro__ 라고하면 상속 구조 속에 이름을 찾는 순서가 튜플로 나타내어진다.
다중 상속일 때 derived 클래스에서 base 클래스의 생성자를 호출할경우 중복 호출이 일어 날수 있는데 이러한 일을 방지 하기 위해 super() 내장함수를 이용한다(super().__init__(self)).

chapter6 : 모듈
모듈 이란? 여러코드를 한데 묶어 다른 곳에서 재사용 할수 있는 코드 모음(보통 비슷한 기능을 하는 함수나 큰 기능을 수행하는데 필요한 일련의 함수와 데이터가 포함)
dir(모듈) 하면 모듈 내의 함수, 데이터의 종류를 볼수 있다.
모듈의 정보 : http://docs.python.org/release/3.0.1/library/index.html
python의 모듈 경로 찾기 :  1.현재 디렉토리 2.PYTHONPATH 3.표준라이브러리디렉토리 , 위의 경로들은 sys.path에서볼수 있으며 추가도 가능하다.
import 문은 어디서나 가능, 심지어 함수 안에서 조차.
from <모듈> import * 하면 __로 시작하는 모듈안의 어트리뷰트 (함수와 데이터)를 제외한 모든 어트리뷰트를 이름 공간에 임포트 합니다.
모듈 reload를 위해 import imp; imp.reload(<모듈>).
모듈도 객체이다. 곧 모듈이 import가 되면 메모리에 로딩되면서 레퍼런스를 전달해 준다.
모듈의 __name__ 속성은 자신이 모듈로 쓰이면 모듈 이름이, 자신이 main 프로그램으로 직접 호출이 되면 __main__을 리턴한다.
관련있는 여러개의 모듈을 묶은 것을 패키지라고 한다. 패키지 디렉토리 안에는 여러 모듈 디렉토리와 함께 __init__.py 파일이 있는데 이는 패키지가 import 될때 실행되는 파일이다. __init__.py 파일 안에 __all__ 속성은 form import * 을 실행할때 포함할 하위 패키지의 목록이다. 상위 패키지를 import  했다고 해서 하위 패키지가 import 되는 것이 아니다. 하위 패키지의 모듈을 사용하기 위해서는 반드시 하위 패키지를 import 해야 한다.

chapter7 : 예외처리
프로그램의 제어 흐름을 조정하기 위해 사용하는 이벤트를 exception(예외)라고 한다.
이건 책 참조. 각종 내장 예외에 대한 것들.
try:
except:
finally:
raise 구문
assert 구문

chapter8 : 입출력
2.x 버젼에선 print는 함수가 아니였으나 3 버젼에서는 함수다.
locals(),vars(),globals() 함수는 지역변수들을 사전 형태로 반환한다.
open으로 파일 객체를 만들면 read(),readline(),readlines() 뿐만 아니라 seek()과 tell()함수도 제공된다.
seek() : 사용자가 원하는 위치로 파일 포인터를 이동
tell() :현재 파일에서 어디까지 읽고 썻는지 위치를 반환
with 구문을 이용하면 close()을 안해도 된다.
with open('test.txt') as f: print(f.readlines());print(f.cloased) 를 False 가 나오는데 위 구문을 마치고 f.closed로 확인해 보면 파일 객체인 f가 닫혀 있는걸 확인 할수 있다.
colors = ['red','green','black']이라는 변수가 있을때 이 내용을 그대로 파일에 넣고 나중에 읽었을때 그대로 리스트로 받을 수 있는데 이는 pickle이라는 모듈을 이용하면 된다.
import pickle; f= open('colors.txt','wb'); pickle.dump(colors,f); f.close(); del colors; f = open('colors.txt',rb); colors=pickle.load(f); f.close() 이렇게 하면 리스트 내용이 바이너리로 colors.txt 파일에 들어갔다가 고대로 pickle.load()로 읽어 들이면 바로 리스트로 입력이 된다(pickle을 이용할땐 반드시 바이너리 형식을 이용해야 한다). 이러한 pickle의 대상은 파이썬의 대부분의 객체가 가능하다(기본 자료형, 사용자 정의 클래스). 다만 pickle.dump로 사용자 정의 클래스를 파일에 바이너리로 저장했다가 다시 load로 읽어 들일때 그 클래스가 프로그램 내에 사전에 정의 되어 있어야 한다. 그렇지 않으면 AttributeError 발생

chapter9 : C/C++와 연동