Monday, March 28, 2011

binary 데이터 핸들링

요즘 binary 데이터를 처리할 일이 많이 생긴다. sff 파일도 그렇고 ab1파일도 그렇고. 단 한번도  binary 파일을 처리해보지 못한 나에겐 공포의 영역. 해서 함 해보기로 한다. 까짓거 사람이 만든건데 뭐 별거 있겠어.


우선은 누가 짜놓은 ab1 파일 파싱하는 프로그램을 봤는데 struct 모듈을 사용한다.

http://www.thegreatgoodplace.com/tt/study/316 (길원이형 블로그를 보게 될 줄이야...)


헌데 잘 이해가 안된다. 우선 쉬운 블로그를 찾아보자.

http://seorenn.blogspot.com/2011/02/python-struct-padding.html


음.. 때려 맞추자면 pack이 binary로 만들어 주는거고 unpack이 binary로 된걸 python 형식의 string으로 바꿔주는듯.. padding이란 말이 나오는데 뭐 % operator에 숫자 붙인 것처럼 데이터가 특정 사이즈만큼 안될 때 0 bit로 넣어주는거 같고.. 음.. 생각해보니 binary 라는게 그냥 데이터가 틈(?) 없이 계속 나열되어 있는 것이겠군. 그렇다면 파일 format 그러니까 몇바이트까지가 하나의 데이터고 또 몇바이트까지가 하나의 데이터고 이런 정해진 포멧만 알고 특정 바이트까지로 구분해서 읽으면 그게 데이터가 되겠다는 생각이 든다. 아닐수 있지만.. 여튼


이제 struct 모듈의 full 설명을 볼 차례다.
http://docs.python.org/library/struct.html
pack이랑 unpack은 위에서 말한거랑 같고 pack_into랑 unpack_from 이 있는데 이는 특정 buffer에서 offset 값서 부터 읽거나 쓰는거 같은거..  
byte order, size, and alignment 아.. 요것이 중요한거 같은데. format 의 첫 character가 @,=,<,>,!(!는 poor souls을 위한 거란다. 나인가 보다 네트워크는 big인걸 까먹는 나) 중에 하나 선택하는건데 이게 byte order, size, alignment를 뭘로 할거냐. 그러니까 native 라 함은 하드웨어 특유의 방식 byte order 같은 경우에는 intel cpu의 경우 little endian 이다 뭐 이런거 뜻하는 걸거고(확인하려면 sys.byteorder를 사용하란다).. size는 링크 안에 표가 있다. 아.. 근데 alignment가 뭔지 모르겠다.. 뭐지 이거.. 아. 예제를 보아하니 format이 다른 연속의 데이터가 있을때 이를 맞춰주는거를 alignment라고 하는거 같은데 정확하지 않다.




첫 url 링크의 프로그램을 보면 ab1 파일의 binary format과 프로그램이 있는데 struct를 알고보면 굉장히 프로그램이 단순다하는 걸 알게 된다. 다만 전부 unpack의 format이 big-endian 인데 이는 ab1 파일 자체가 그렇게 되어 있기 때문에.


아 그리고 전에 포스팅 했던 bit 연산자도 다시 볼 필요가 있겠다.
http://graphy21.blogspot.com/2010/10/bit.html

Saturday, March 26, 2011

iphone 개발 수업 3주차-2

3/26
<UITable view>
같은 형태의 데이터를 list 형태로 반복해서 출력. MVC로 구성
섹션: 리스트에서 그룹
섹션 헤더 : 섹션의 이름
섹션 푸터 : 섹션 마지막의 메뉴같은것(?)
셀 : 그룹을 이루는 하나 하나의 항목; contentView


UITableView : MVC 에서 view의 역할


UITableViewDataSource : MVC 에서 model의 역할, 데이터 관리
-(NSInteger)numberOfSectionInTableView:(UITableView *)TableView ; 섹션(group)의 수를 return(섹션이 없을때 return 값은 1)
-(NSInteger)tableView:(UITableView *)TableView numberOfRowsInSection:(NSInteger*)section;
-(UITableViewCell *)tableView:(UITableView *)TableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
UITableViewDataSource 에서는 위의 3 메소드를 반드시 정의해줘야 한다.


UITableViewDelegate : controller의 역할, 이벤트 관리


MainWindow 객체 안에 UITableView가 있고 MainWindow화면을 관리하는 UIViewController 객체가 UITableView 의 내용을 알기 위해 UITableViewDataSource의 메소드들을 호출하는데 먼저 numberOfSectionInTableView를 호출해서 섹션의 갯수를 알아냄, 그 다음에 tableView를 호출해서 섹션하나에 몇개의 셀이 있는지 알아냄(섹션 갯수만큼 호출). 그 뒤 UITableViewDataSource 를 호출해서 셀의 내용을 받는다(한 화면에 보여줄 셀 갯수만큼 호출).  
---------------------------------------------------------------------------------------------------


< Navigation based application in SimpleHumanResource Architecture (SimpleHumanResource 라는 프로젝트로 Navigation based application 의 architecture를 알아보자) >
1.SimpleHumanResourceAppDelegate 안에 시스템 이벤트 처리 메소드와 아래의 것들이 있다.
UIwindow *window;  MainWindow관리(title, frame등)
UINavigationController *navigationController; MainWindow내용 전환(UIViewController들을 전환)


2.RootViewController ; 첫화면으로 이는 UIViewController, UITableViewDataSource(내용관리를 위한 프로토콜), UITableViewDelegate(이벤트를 위한 프로토콜)를 상속받은 UITableViewController을 상속받음. 즉 화면 내용, UITableView의 내용, 이벤트를 다 관리(이것은 첫화면을 UITableView를 나타내기 위해서 UITableView와 관련된 것들을 상속 받았는데, 그게 싫다면 그냥 UIViewController만 상속 받으면 된다).


3.만약 또 다른 화면을 만들고 싶다면 2번에서처럼  UIViewController를 상속받은 클래스를 만들면 된다.


2번 3번에서 만든 여러개의 화면이 공유하는 데이터나 내용은 1번의 SimpleHumanResourceAppDelegate에 넣으면 된다. [[UIApplication SharedApplication] delegate]를 사용하면 공유 정보리스트 중 SimpleHumanResourceAppDelegate를 리턴하게 된다.


UIViewController에는 IBOutlet UIView * view를 속성을 가지고 있다. UITableViewController는 IBOulet UITableView* tableView 를 가지고 있다. 그렇기 때문에 RootViewController는 이 속성을 자동으로 가지게 된다.




Outlet과 ReferenceOutlet의 차이는? Referencing Outlet 이 주소값을 받을 속성들.
----------------------------------------------------------------------------------------------------


<JSON>
서버나 클라이언트가 각각 구성된 언어가 다르기 때문에 특정 객체를 넘겨줄때 사용하는 것으로 원래는 xml을 사용했는데 xml 이 복잡하기에 JSON을 웹에서 많이 사용한다.
예를 들어 서버는 python으로 개발이 됐는데 client 는 objective-c로 된 어플을 사용중이라면 데이터 교환을 위한 통일된 형태가 필요하다. 이럴 때 사용되는 데이터 교환의 표준이 xml. 
그러면 xml을 개발자들이 잘 안쓰는 이유? xml 파싱하기가 쉽지 않아서
그래서 표준은 아직 아니지만 형식을 가진 문자열인 JSON 을 많이 사용한다. 이렇게 JSON 문자열로 서버에서 클라이언트로 데이터를 보낸다.
http://www.json.org/

Friday, March 25, 2011

iphone 개발 수업 3주차

3/25
< Collection >
-객체들의 주소 저장
-크기가 가변
-검색, 삭제, 수정이 쉽다 (삭제, 수정, 추가 가능한 것들은 mutable이 들어간 클래스들).
NSSet <- NSMutableSet 이 상속 : 삽입한 순서와 저장 순서가 다름, 객체의 중복 저장이 안된다.
NSArray <- NSMutableArray 이 상속 : 포인터 배열, 삽입순서와 저장한 순서가 같다. 중복 저장 가능. 배열대신 사용하면 편리하다.
NSDictionary <- NSMutableDictionary 상속 :  key 값으로 value의 검색이 가능.
아래 그림은 12시 부터 시계 방향으로 NSSet, NSArray, NSDictionary 의 클래스 설명.


그 위의 객체에 이름이 objects로 끝나는 메소드를 사용하려면 마지막 인자로 반드시 nil 을 넣어줘야 한다.
NSDictionary의 key 는 중복이 안되는데 이는 사실 NSSet 으로 관리한다. 그렇기 때문에 key를 꺼낼때 NSSet 이 ordering 한 순서로 나온다.


클래스의 메소드가 - 이면 반드시 alloc을 해서 객체를 생성해서 사용해야 하는것이고, + 로 된 메소드는 클래스 메소드로서 객체 생성 없이 클래스 이름으로 사용할 수 있다. 그리고 + 으로 되어 있으면 autorelease 되어 진다. 그럼 뭘 사용해야 하느냐? 그건 선택 나름.


다시 한번 1주차의 마지막에 언급된 architecture와 life cycle 그리고 2주차의 view-based application 을 읽고 이해하길 바란다.
-------------------------------------------------------------------------------------------------


<Notification>
노티피케이션이 필요할 때 :
1.  2주차에서 마지막에 나온 예 MyPickerViewDelegate예제를 보면 InstaTwitViewController는 그 안의 객체인 MyPickerViewDelegate의 메모리 주소를 알고 있지만 반대로 MyPickerViewDelegate는 InstaTwitViewController 의 메모리 위치를 알지 못한다. 그렇기 때문에 InstaTwitViewController의 메소드를 사용할수가 없다. 이럴 때 노티피케이션을 사용하면 해결, 곧 사용하고자 하는 객체의 메모리 주소를 모를 때 사용
2. 이벤트 발생시 동시에 여러개 메소드를 호출할때
3. 호출되는 객체가 무엇이지 모를 때
예를 들어 MainWindow에 버튼이 있을때 그 버튼을 누를 때 객체 A,B,C 의 메소드가 동시에 실행되어져야 할때, 혹은 어떤 객체의 메소드가 호출되는지 모를때 노티피케이션을 사용한다.


이는 InstaTwitViewController객체가 NSNotificationCenter 객체에게 NSPickerView 선택시 알려달라고 요청함. 그러면 NSNotification이 백그라운드로 감시하다가 이벤트가 발생하면 InstaTwitViewContoller에게 알려준다.
그러면 통보하고자 하는 MyPickerViewDelegate에서 NSNotificationCenter에 통보하는 실행문을 넣는다. 그러면 MyPickerViewDelegate에서 특정 메소드가 호출될때 NSNotificationCenter에 통보를 하고 이 객체가 다시 InstaTwitViewController 객체에 NSNotification 객체(이 안에 정보가 다 있다)통보가 된다.


이 순서는 NSNotificationCenter 를 InstaTwitViewController객체 안에 생성하고 등록한다. 그러면 이벤트가 발생하였을 때 NSNotificationCenter가 InstaTwitViewController객체에게 통보를 하게 된다. 
생성 : NSNotification 은 어플 실행시 생성, 딱 하나만 생성, 리눅스의 데몬처럼 백그라운드로 실행, [NSNotificationCenter defaultCenter] 하면 NSNotification이 리턴된다.
등록 : [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(UiUpdate) name:@"name" object:nil userInfo:nil] ; self, 즉 자신 객체를 등록하고 이벤트 발생시 호출될 메소드는 UiUpdate라는 메소드이고(@selector는 메소드의 주소를 return)  이름은 name으로 하고 object는 nil 이다(object에는 주소를 넣을 수 있다, 이러면 NSNotificationCenter 객체가 이벤트 발생을 통보시, 즉 메소드 호출 시 그 주소를 인자로 넘긴다) 라는 의미.
통보 : [[NSNotificationCenter defaultCenter] postNotificationName:@"PickerViewDidChanged" object:self userInfo:nil] ; 통보하는 곳의 이름은 PickerViewDidChaged이고 self, 나 자신을 넘기고 더 넘기고자 하는 더 필요한 데이터는 없다라는 의미


원래 특정 이벤트의 발생을 감시하는 것은 UIApplication이 하는 일이였으나 UIApplication이 감시하는 이벤트는 시스템적인 이벤트, 그러니까 버튼이 눌리는 것 같은 이벤트, 그러나 나머지 이벤트 즉 시스템적인 이벤트를 제외한 이벤트는 NSNotificationCenter가 모니터링한다. 
-----------------------------------------------------------------------------------------------


속성을 다른 객체에서 사용하려면 1. set,get 메소드를 정의하거나 2. @property로 선언하거나 3. keyofvalue dictionary를 이용한다.


<Key Value Dictionary>
일반적으로 객체는 NSObject를 상속하는데 NSObject 클래스에는 NSMutableDictionary가 있어서 key 값으로 NSObject를 상속받은 클래스의 속성을, value로는 그 속성의 속성값(그러니까 속성안에 들어가 있는 값)을 가지고 있다. 이를 이용하면 코딩이 짧아짐.


그런데 이 key value observing이 꼭 대입이 되는 것은 아니다. 예를 들어 IBOulet으로 선언된 속성(즉 interface builder로 만든 view(xml에 정의된)의 주소를 넣을 속성)는 반드시 set,get 메소드를 만들거나 property로 선언해서 사용해야 한다.


사용방법 : NSObject 를 상속받은 클래스 MyCandle이라는 것이 있을때 keyofvalue Dictionary 를 사용하려면 [MyCandle valueForKey:@"candleState"];는 property로 사용할때의 MyCandle.candleState와 동일한 의미, [MyCandle setValue:NO forKey:@"candleState"];  는 MyCandle.candleState = NO; 과 동일.


<Key Value Observing>
NSObject를 상속받은 클래스 MyCandle의 속성과 keyofvalue dictionary는 MyCandle 이 감시하면서 그 두값을 같게 맞추는데 둘중 하나가 변했을때 알려달라, 곧 메소드를 호출해 달라. 그런데 Notification과는 달리 호출되는 메소드 이름(observeValueForKeyPath)이 정해져 있다. 그래서 메소드를 @selector로 해서 인자로 넘길일은 없다.


설정 : [MyCandle addObserver:self forKeyPath:@"candleState" option:NSKeyValueObservingOptionNew|NSKeyValueObservingOld context:nil]; candleState속성이 수정시 self, 즉 나 자신에게 수정된 값이 뭔지(NSKeyValueObservingOptionNew), 그리고 예전값이 뭐였는지(NSKeyValueObservingOld) 그리고 통보할때 nil(지금은 nil이기 때문에 아무것도 없다)을 전달하면서 알려달라라는 의미.
호출되는 메소드 : -(void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void*)context ; keyPath는 값이 수정된 속성이름, object는 통보자의 주소, change에는 바꾸기 전의 값과 바뀐후의 값이 dictionary(NSKeyValueChangeNewValue와 NSKeyValueChangeOldKey를 key로 갖는다)로, context 는 addObserver호출시 전달했던 인자.


등록시 option의 인자를 NSKeyValueObservingOptionInitial 은 원래 등록을 하면 감시가 시작되는 것이 아니라 등록하는 메소드(그러니까 등록 statement가 있는 메소드)가 끝나야 호출이 되는데(왜냐면 single thread이기 때문에) 이 option 을 사용하면 등록하는 순간 바로 monitoring 을 시작한다. 


notification과 key value observing 이랑 유사한데 그럼 언제 key value observing  를 사용하느냐? 값이 바뀌었을 때 통보할 때


이벤트가 발생했을때 호출되는 메소드는  return 값이 없다.

sqlite3

sql이 필요하게 됐다. sqlite3를 쓰기로 한다. 그닥 큰 db가 아니라서. 

sqlite3 설치
다운받고 그냥 install (configure=>make=>make check=>make install), 끝

sqlite3 사용법
내가 사용하는 건 굉장히 단순한 select문만 필요한거라.. 근데 첨에 하면 어떻게 실행시키고 어떻게 db를 만드는지 조차 생소한다. 알고나면 아.. 쉽네.. 
주의할건 special command. cvs file을 table로 load 할려면 special command의 .import 를 사용할 것. 다만 먼저 .separator를 할것.

python으로 연동하기

Thursday, March 24, 2011

make report file using open office, python module Appy

논문을 읽다가 이틀을 읽다보니 루즈하고 지겹고 재미도 없고 정체되고.. 해서 당장은 필요가 없지만 아마도 나중에 필요하게 될 것을 한 번 프로그래밍 해보자는 생각에..


당면해 있는.. 아니지 급한건 아닌데 언제가는 풀어야 할 문제들.. 생각해보니 2가지.
1. 하나는 read에서 trim이 안된 primer등을 제거하는것. global alignment 알고리즘으로 가야 하는건지.. 아니면 그냥 string search로 가야 하는건지. 지금 생각은 최장 공통 문자열 탐색(LCS)으로 찾아서 그게 cutoff(지금 생각하자면 하나의 base pair mismatch까지 허용) 를 통과하면 그 영역은 trim하는 식으로다가 할생각이긴한데.. 이건 좀 찾아봐야 할거 같다. 지금 내가 뭔소리 하는지도 파악이 안되니.
2. report form을 template로 정해놓고 특정부분 영역의 값만 바꾸는 그러니까 파이프 라인 돌리고 나면 샘플마다 다른 그림과 결과가 생길건데 기존의 template에다가 요 데이터만 넣는 것을 어찌 할까 했는데.. 


오늘 해결해보고자 하는건 2번. report file format은 pdf로다가 하는걸로(html로 하려는 의도도 있었지만 왠지 html은 가벼워 보인다는 여론이.. 근데 요즘 html5를 보기 시작했는데.. 허이구 이거 그냥 태그의 모임이 다가 아닌듯한 느낌이랄까. 여튼). 그래서 이것저것 알아보기 시작함. 우선은 text2pdf 같은 module이 있나 봤는데. 음.. 모르겠다. 어쩌다 어쩌다 찾게된 방법. open office와 appy라는 python module을 사용하는것

<open office>
http://download.openoffice.org/
예전에 원철이 형이 쓰는거 본거 같은데.. 그 때 pdf 변환이 바로 된다고 좋다고 하셨던거 같은데.. 여튼 보니까 pdf 버튼이 있다. 와. 좋다. 근데 영문판으로 깔길 권장한다. 어짜피 사용법이 naver에서는 잘 안나오고 구글링해야 하는데. 이게 옵션이 영어로 되다보니 한글판 깔면 매치가 안된다. 뭔 옵션을 이야기 하는건지..

<appy module>
http://appyframework.org/pod.html
appy가 happy의 h를 제거한 단어란거(확실한건 아니다). 어떻게 해야하는지 위 url을 살펴보면 나온다. 하지만 나같은 완전 초보를 위해서 내가 한 삽질을 반복하지 않기 위해 내 삽질을 소개하자면(내 삽질은 사실 url의 text만 잘 읽으면 다 나온다). 
기본 컨셉은 이거다. open office로 template를 만든다. 그리고 그 template 안에 바뀌어야할 문자열 내지는 테이블 안의 특정 cell을 tracking change로 표시해둔다. 아니면 insert의 note로 표시. 아 근데 사실 이게 문제였다. 도대체 tracking change가 뭐냐고? 아 다음 url을 참고한다. http://www.tutorialsforopenoffice.org/tutorial/Change_A_Document_Red_Lining_Or_Tracking_Changes.html 여기 보면 나오는데.. 아무것도 아니다. 그냥 왜 office에서 에디팅하고 그 흔적을 남겨 놓는것, 그걸 지칭한다. 한글판으로 설명하자면 편집=>변경사항=>기록. 이 모드에서 기록된 부분은 python script로 변환 가능하다. 그리고 insert 메뉴의 note는 뭐냐. 삽입=> 설명 옵션을 뜻하며 여기에다가 python script를 써주면 프로그래밍이 된다. 나머지는 위 url를 좀더 자세히 들여다 볼것.
아.. 그리고 한가지.. template에서 특정값을 바꿔서 결과 내는건 template가 있다면 open office가 필요 없다. 다만 그 결과를 odt 형식이 아닌pdf 형식으로 바꾸려 한다면 그 때 appy 모듈이 open office를 사용하기 때문에 서버에 open office 가 깔려 있어야 한다.

Monday, March 21, 2011

suffix tree (1)

whole genome alignment, Silva에서의 alignment 과정 그리고 금선생 추천 책 등등에서 많이 만나온 용어 suffix tree. 정리해야 겠다. 일단. 참고 문헌은 http://www.cs.ucf.edu/~shzhang/Combio10/lec3.pdf 과 algorithms on Strings, Trees, and Sequence의 5장부터로 한다. 과연 볼수 있을려나..


네이버링으로 대략적으로 알아본 결과 reference가 m길이의 T 문자열일때 query가 n 길이의 S 문자열이면 KMP나 보이어-무어의 방법(이 두가지 방법 다 뇌를 자극하는 알고리즘에 나온다. 기억이 가물하지만)이 O(m)의 시간이 걸리는데 비해 suffix tree는 reference를 한번 preprocessing (O(m)) 하면 O(n)의 시간만에 T에서 S를 찾아낸다(hashing 인건가). 또한 i번째 leaf 노드에서 루트까지 node의 값을 연결하면 T[i:m]의 문자열이 나온다. 그리고 suffix tree를 구하는 방식은 여러가지인데 특정 문자열에 대한 suffix tree는 unique하다. 또한 문자열 안에 substring이 몇번 나오나 혹은 어디에 있나 하는 정보를 root에서 부터 원하는 substring까지의 노드를 찾고 거기서 부터 연결된 leaf 갯수를 새면 그 정보가 나온다. 요정도..


<from UFC >
: ucf 자료를 보면 순서가 suffix의 대한 intro, definition, exact string matching problem, building suffix tree 순으로 되어 있다.  그림은 위 링크의 pdf를 참조하길. 


-hash table 보다 suffix tree가 났냐? hash가 더 이해하기 쉽고 뭐.. 시간도 비슷하지만 문젠 hash table은 query의 문자열의 길이가 고정이라는거. 그리고 다른 string match trick이 안먹힌다는데.. 이건 계속 봐야 알겠음.


-suffix tree의 정의 : 
1. rooted directed tree로 문자열 길이만큼의 leaves를 갖는다.
2. root 노드를 제외한 internal 노드는 최소한 2개의 자식 노드를 갖으며 각 edge(연결선)은 문자열의 substring으로 labeling되어 있다.
3. 한 노드에서 나가는 edge들의 시작 character는 동일할 수 없다.
4. suffix tree의 key feature는 i 번째 leaf에서 edge의 label들을 연결하면 문자열의 i번째에서 시작하는 substring이 된다.
5. 문자열의 마지막 character는 unique charater여야 한다.


-exact string matching problem
reference 문자열 ST를 O(m) 시간 만큼 걸려서 suffix tree를 만들고 query 문자열 P를 ST에서의 unique path로 찾는다. root 에서부터 query의 문자열이 되는 path를 찾는다. path의 마지막 노드 아래의 leaf가 query를 포함하고 있는 suffix가 되겠다.


-building the suffix tree
1.Naive method : O(m**2)의 시간이 걸린단다. 이해는 잘된다. root에서 부터 제일 긴 suffix 부터 node를 붙인다. 예를 들어 papua 라는 문자열을 suffix tree로 만들려면 우선은 papua에서 제일 긴 suffix 인 papua를 root 노드에서 부터 연결한다. 그 다음의 젤 긴 suffix인 apua를 또 root에서 새로운 노드로 붙인다. 그다음 suffix는 pua인데 suffix tree의 정의에 따라 자식 노드들의 첫 character는 같으면 안되기때문에 아까의 papua와 pua가 첫 글자가 겹치기 때문에 이를 root에서 공통으로 edge를 만들고  apua와 ua로 노드를 분리 시킨다. 이런식으로 마무리.
2. 원래 suffix tree의 reference의 preprocessing 시간이 O(m)이라고 했는데 이는 1973년 Weiner에 의해 소개됐고 이후 space efficient 한 방법을 McCreight가 1976년 소개, 그 뒤 1995년 더 단순한 on-line algorithm이 Ukkonen에 의해 소개
3. Ukkonen's algorithm : 1에서부터 m 까지의 prefix를 하나씩 따서 그것의 suffix들을 tree에 extension하는 방식(이 말이 이해는 안갈건데 pdf 그림보면 안다). 이때 extension은 3가지 rule( 1.s[j:i+1] 을 extend 할때 s[j:i]까지의 label이 있는 edge를 찾으면 그 edge에 i+1번째 character를 extend한다. 2. 만약 root에서 시작되는 edge중 s[j:i]까지 매치되는 edge가 없으면 맞는데까지에서 새로운 edge와 노드를 만든다. 3.이미 s[j:i+1]까지의 문자열이 정확히 매치되면 nothing to do)에 따른다. 여기까지는 기본 방법이고, 여기다가 speed up 방법이 있는데 요건 이해가 안됨.


여전히 알고리즘 시간에 대한 계산이 이해가 잘 안된다. 음.. 그리고 예전 알고리즘 책 볼때도 느낀건데 어떻게 진행하는지는 이해는 하는데 왜는 깊게 이해 안되는 느낌이랄까.. 명화를 감상하는데 아 저기에 뭐가 있고 저기에 뭐가 그려져 있구나. 근데 이게 무슨 느낌으로 그린거지?하고 이해하지 못하는 느낌. 내가 볼때 반복만이 이 느낌을 채울수 있다고 본다. 

Friday, March 18, 2011

iphone 개발 수업 2주차

3/18
그 전체 화면의 기본이 되는 객체는 UIWindow 이고 이는 UIApplication 객체가 MainWindow.xib 를 읽어서 생성한다.


IBOutlet [변수] : UIApplication 이 MainWindow.xib 이름의 xml을 가지고 객체 생성하는데 이 때 만든 객체의 주소를 다음 [변수]에 대입하기 위해서 사용. 
그 뒤에 그 [변수] 를 가지고 그 객체의 속성을 바꿀 수 있다. [변수].text = @"메시지" 처럼


UIResponder : 화면 관련 객체들에 어떤 이벤트가 발생 하는가를 계속 모니터링 하는 객체, 이는 UIApplication안에 속성으로 있어서 UIApplication이 생성될 때 생긴다.


IBAction 은 이벤트 함수를 선언할 때 쓰이는 것으로 UIReponder에게 UIWindow 의 특정 객체에 특정 이벤트가 생기면 그 이벤트 함수를 호출해 달라고 명시 하는것 


UIResponder에 의해 특정 이벤트가 발생하는 것이 모니터링 되고 IBAction이 명시된 이벤트 함수에 맞는 이벤트가 발생하면 그 이벤트 함수를 호출한다. 호출된 이벤트 함수의  return type 이 void 이다.


UIResponder가 이벤트 함수를 호출할때 매개변수인 sender 에는 이벤트가 발생한 객체의 주소가 들어간다.
-----------------------------------------------------------------------------------------


아이폰에서는 폴더를 번들이라는 용어로 사용한다.


개발할때는  classes, Resources등으로 소스들이 나뉘는데 사실은 하나의 번들 안에 들어가 있는 것이다.


개발한 어플을 아이폰에 설치하면 설치자마다 그 어플의 위치(경로)가 다를수 있는데 경로를 알고 싶을때 사용하는 클래스가 NSBundle과 CFBundleRef 가 있다. CFBundleRef 는 NSBundle과 같은 역할을 하나 C 로 구성되어 있어서 내부가 불분명한 불투과형의 함수이다.


NSBundle : 현재 어플의 실행 경로 정보, 어플이 있는 번들에 존재하는 파일, resource를 찾아서 경로를 리턴.
[NSBundle mainBundle] : 현재 자신 어플의 정보(자신의 현재 경로와 그안의 파일과 리소스의 경로) 가지고 있는 객체를 리턴한다. 
[[NSBundle mainBundle] pathForResource:@"candle on" ofType:@"jpg"] : NSBundle 클래스의 mainBundle 메소드를 호출해서 NSBundle 객체를 생성하고 candle on 이라는 파일명과 jpg 라는 확장자를 가지는 경로를 리턴한다.


UIImage : 메모리로 이미지 출력(아이폰은 우선 이미지를 메모리로 로딩해서 로딩이 끝나면 화면에 출력. 로딩될 때 버벅대는 과정을 화면에 나타나지 않게 한다)
[[UIImage alloc] iniWithContentOfFile:candleOnPath] : candleOnPath 변수에 들어 있는 경로의 파일을 메모리레 출력


 object-c 는 항상 객체의 주소만 가져올수 있다.
---------------------------------------------------------------------------------------------


3/19
<쓰레드>
어플리케이션 그러니까 하나의 프로세스를 구성하는 기능 하나하나를 쓰레드라고 한다. object-c에서는 메소드 하나를 쓰레드 하나라고 생각한다.
 NSOperationQueue : 메서드들을 멀티쓰레드로 실행시켜 준다. 실행시키고자 하는 메소드는 메소드대로 생성한 뒤에 그 메소드를 NSInvocationOperation의 객체로 만들어서 NSOperationQueue에 넣어주면 multithread로 프로그램이 돌게 된다.
NSInvocationOperation : 멀티쓰레드로 실행될 메소드의 정보가 들어가게 된다.
[[NSInvocationOperation alloc] initWithTarget:self selector:@selector(come) object:nil] : self 는 멀티쓰레드로 실행할 메서드를 포함한 객체의 주소를 의미, @selector(come)는 come 이라는 메소드의 주소가 return 된다, object:nil은 come 이라는 메소드가 실행될때 전달하고자 하는 메시지를 나타냄.


new 메소드는 alloc이후 init 을 한것과 동일. 즉 [someClass new] == [[someClass alloc] init].


other Sources 에 보면 _prefix.pch라는 파일이 있는데 이는 매크로서 다른 소스 파일에서 import 문을 명시하지 않아도 저절로 import 가 된다. 


NSMutableArray 클래스 : object-c 에서의 array 클래스로 그 배열안에는 객체만을 넣을 수 있다.


Object-c에서의 동기화 : 하나의 쓰레드에서 작업을 마칠때까지 다른 쓰레드는 공유 객체에 접근 불가. object-c에서는 동기화 방법이 mutex(특정쓰레드에서 객체를 사용할때 다른 쓰레드에서 아예 접근하지 못하게 하는 것) 하나밖에 없다.
@synchronized(array){some thing work} :  something work 이 끝나기 까지 array 객체는 다른 쓰레드에서 접근하지 못하게 된다.
property 지정시  attribute의 nonatomic 을 nonatomic 으로 지정하면 multithread에서 접근이 가능
---------------------------------------------------------------------------------------------------


<객체의 life cycle>
someclass *aa = [[someclass alloc] init] 식으로 alloc 메소드를 호출하면 객체가 생성되고 이때 retainCount 속성이 1이 된다. 이 retainCount 속성값이 0이 되는 순간 someclass의 dealloc 메소드가 호출되면서 객체가 소멸된다. 객체가 소멸되면 다른 변수가 그 객체를 참조하더라도 더이상 사용할 수 없게 된다. 
retainCount 값을 증가시키는 방법 : retain 메소드를 호출( [aa retain])하거나 array에 추가([array addObject: aa])하게되면 retainCount 값이 증가
retainCount 값을 감소키시는 방법 : release 메소드를 호출([aa release])하거나 array에서 삭제([array removeObject:aa])하게 되면 retainCount 값이 감소하게 된다.


@propery (retain) UIImage *candle : candle 을 다른 변수에 대입시 retain 메소드가 자동 호출되게 한다.
-----------------------------------------------------------------------------------------------------


<iOS project의 종류>
1. Window-Based Application
main 메소드에서 UIApplicationMain 호출 하면 UIApplication 객체가 생성되어 loop 돌면서 이벤트가 발생하는 모니터링 발생하면 UIApplicationDelegate 객체에 알려줌. UIApplicationDelegate 시스템 이벤트, UI 이벤트 때마다 호출되는데 시스템 이벤트 처리, UI 이벤트 처리를 담당
2. View-Based Application
UIApplicationDelegate :  window based application과 유사하나 UIapplicationDelegate가 담당했던 UI 이벤트가 UIViewController로 넘겨줘서 UIViewController가 이를 처리한다. UIApplicationDelegate는 시스템 이벤트만 담당. Window based application에서는 UIapplicationDelegate가 시스템 이벤트와 UI 이벤트를 모두 담당해야 했기에 비대해짐.
3.Navigation-Based Application
화면이 여러개인 application. 화면이 전환되는 Application. 대부분의 어플이 이 타입으로 만들어져 있다.
UIApplicationDelegate가 이벤트를 처리하는데 그 객체 안에 UINavigationController라는 객체가 속성이 있는데 이것이 화면 전환을 한다. 이건 stack으로 되어 있다.
-----------------------------------------------------------------------------------------------------


<MVC model>
Model : 데이터, 메시지 - UIPickerViewDataSource. 여기에 있는 내용이 View 표시되는 .
View : 화면에 출력되는 객체 - UIPickerView
Control : View Model 연결 - UIPickerViewDelegate
View Control 방식으로 UIViewController 객체를 사용하려면  MVC pattern 으로 사용해야 한다.


instraTwitAppDelegate -> 시스템 이벤트에 대한 컨트롤
instraTwitViewController -> 화면(버튼등)에 대한 컨트롤, UIViewContoroller 를 상속한 클래스, 이 안에 UIPickerView가 속성으로 정의되어 있다.
MyPickerViewDataSource -> Model 로서 UIPickerView 객체의 데이터를 설정
MyPickerViewDelegate -> UIPickerView 객체에 대한 컨트롤
UIPickerView -> View 


위 iOS 의 project 종류의 하나인 view-based application 에서의 설명처럼 원래 UIApplicationDeleagate 인 instraTwitAppDelegate 가 UI 이벤트에 대한 컨트롤을 UIViewController인 instraTwitViewController 에게 넘겼다. 그리고 instraTwitViewController가 화면에 전체적인 내용을 컨트롤. 이 UIViewController 갯수만큼 xib파일이 생긴다.

Monday, March 14, 2011

metagenomics를 위한 논문 탐험

자 대략적으로 누구랩 레포트로 큰그림은 그려봤으니 실질적으로 논문들을 볼 차례다. 시작점은 a core gut microbiome in obese and lean twins로 한다. (참.. 이것 참.. 이 논문을 genomeweb에서 2년전쯤 논문 서머리로 슬쩍 본적이 있었는데 결국 보게 되다니. 참 이거. 참..) 그리고 CD-hit, species richness 통계 관련 논문, 마지막으로 mothur 논문 순서로 하기로 한다.
<A core gut microbiome in obese and lean>
http://www.nature.com/nature/journal/v457/n7228/full/nature07540.html


원래는 위에 것 할려고 했는데 윗분의 BGI언급으로 인해 아래 논문으로 수정
<A human gut microbial gene catalogue established by metagenomic sequencing>
http://www.nature.com/nature/journal/v464/n7285/full/nature08821.html
이 논문의 위의 논문보다 나중에 나온것. 둘다 gut의 microbe 를 metagenome 연구를 했다는 공통점. 위 논문의 abstract만 보면 위 논문은 16s rRNA도 하고 전체 microbe의 genome (microbiome)을 시퀀싱 한거 같다. 이 논문은 Genome analyser (GA)를 가지고 124명의 유럽인들의 똥의 미생물의 microbiome, 그러니까 전체 genomic DNA를 시퀀싱. => 그래서 576.7 Gb 를 만들어냄(이전 논문의 200배, BGI에서 돈많이 썻다고 자랑함). => 그 뒤 assembly,=> 3.3 M 의 unique ORF 만들어냄. 그리고 마지막 말, 이 결과는 short read sequencing으로도 metagenomics를 할수 있음을 보인다는건데 이건 BGI가 illumina 계열의 기기만 있기 때문에 이것으로도 metagenome을 해도 된다. 뭐 이런 support를 위한 논문인냥 느껴지는 멘트이다. 그러면 short read sequencer로도 가능하냐? 이 문제에 대해선 다음의 논문[1] 을 추천하려 했지만.. 16s rRNA 에 대해서 물어본다면 답이 안되는 논문인듯 하다. 
metagenomic sequencing of gut microbiomes
124명의 건강하거나 과체중이거나 비만 혹은 염증성 장내질환(IBD)를 갖은 사람의 변의 microbe를 시퀀싱했다.두당 평균 4.5Gb 만들어냈고 이를 개인 각각 SOUPdenovo로 어샘블. 500bp 이상의 contig가 총 6.58M개 총 사이즈는 10.3Gb(N50 : 2.2kb), read의 42.7 %가 contig 만들어 지는데 이용됨. confirm으로 두 개체를 골라서 sanger 방법으로 시퀀싱한 리드를 contig에 매핑, 그 결과 98.7%가 맵핑됨. 이 값을 또 FLX와 비교(한 개체를 FLX로 시퀀싱한뒤 assembly해서 sanger read를 매핑해봄, 무서운 놈들). error-rate[2]와 뭐 이것저것 FLX에 떨어지지 않음을 증명. 어셈블 안된 리드들을 개체에 상관없이 모아서 다시 어셈블, 결과 0.4M개 총 370Mb(N50: 939bp) 의 contig 생성. 거꾸로 read들을 90% identity를 threshold(시퀀싱 error, strain variability를 고려해서)로 매핑, 결과 80%의 read가 매핑. 다른 논문의 데이터, 그리고 genbank와도 비교. 우월함을 입증.
a gene catalogue of the human gut microbiomes
ORF prediction에 MetaGene 사용. 100bp 이상의 ORF를 총 14,048,045개 찾음. 이건 총contig길이의 86.7%. 이는 평균적인 microbe의 비율과 비슷. (2/3의 ORF가 incomplete하다는데.. 이걸 어떻게 알지? incomplete하다의 의미가 정확히 뭔지 모르겠다). 그 ORF들의 redundancy를 없애고 총 3,299,822의 ORF로 추려냄, 이를 prevalent genes 이라고 함. 이 prevalent gene을 genome sequence가 있는 장내 세균과 비교. 상당수 매치됨. 음.. EstimateS 라는 프로그램을 써서 ICE를 계산해서 자기네들이 찾은 prevalent gene이 전체 추측되는 prevalent gene의 몇 %를 capture했나 라는 말이 나오는데 아.. 이는 잘 이해가 안된다[3]. 결론은 85% 이상을 capturing 한것으로 여겨진다는 것. 그리고 개체간에 얼마나 common gene이 있나를 체크했는데, 생각보다 prevalent gene이 생각보다 소수에 치우쳐 있다는 식으로 이야기함. 이것의 한 factor로 sampling depth를 들음. 그러나 역시나 개체간에 share하는 prevalent gene은 상당함. 재밌는것은 IBD 환자의 prevalent gene이 정상보다 갯수가 적음. 이는 IBD환자의 장내 미생물 diversity가 일반인보다 적다는 것과 일맥 상통.
common bacterial core


functions encoded by the prevalent gene set
ORF들을 NCBI의 NR(protein)과 KEGG, COG, eggNOG[4]에 있는 gene에다가 align함.[5]
bacterial functions important for life in the gut
functional complementarities fo the genome and metagenome








[1]http://aem.asm.org/cgi/reprint/74/5/1453.pdf 이논문이 2008년 초에 나온건데 abstract를 보면 100-200 bp의 read로 16s rRNA 시퀀싱 분석이 괜찮냐를 본 논문. 방법은 간단해 보인다. 거의 full length의 16s rRNA와 random하게 만들어낸 short read의 blast와 cog 분석 결과를 비교한다. blastx의 결과 당연하지만 full length에 비해 homolog hit이 현저하게 떨어진단다. 주의할 건 400bp 까지 read의 길이를 늘려도 내지는 depth를 늘려도 마찬가지라는거. 결국 Evalue가 낮은 hit 아니면 찾기 어렵다는것. 그리고 cog 분석도 마찬가지로 full... 근데 이거 16s rRNA에 국한된게 아닌듯 싶다. 그리고 nature 논문은 assembly후에 분석한 거라 이 의미가 없을 듯
[2]error-rate : 
[3]EstimatorS, ICE : http://viceroy.eeb.uconn.edu/EstimateSPages/EstSUsersGuide/EstimateSUsersGuide.htm
[4]eggNOG : http://eggnog.embl.de/
[5]rarefaction analysis :

metagenomics를 위한 잡다지식 but 완전 기초

누구랩의 분석레포트를 보는데 미생물의 분류학적 개념부터 나온다. 이것 부터 제대로 정립해야 하는게 사실이다. 그래서 정리해보자.


미생물이란
미생물(microbe) 라고 함은 바이러스(virus), 세균(bacteria), archaea,균류(fungi), 원생생물(protist) 로 나뉜단다. 
한국말로 하면 원생이랑 원핵 생물이라하면 헷갈리는데 원핵은 하나의 핵이란게 아니라 원시핵을 의미 하는 것으로 prokaryote을 말한다. 반면 protist은 eukaryote으로 대부분 단세포 생물. 
그럼 protist와 fungi가 뭐가 다르냐?(둘다 eukayote인데..) 아래 링크. 우선은 protist는 거의 단핵 생물. 그리고 fungi는 주로 saprotrophic (sapros+trophic = rotten+food = cell 밖에서 음식을 썩혀서 영양분을 soluble 하게 만든담 uptake). 그리고 세포벽도 차이.
archaea는 핵이 없는데 원핵 생물(prokaryote)과는 다른데 가장큰 차이는 세포벽을 구성에 큰차이 세포막에 있어서는 진핵생물과 차이.그런데 분자 생물학적으로 보면 eukaryote와 유사한 측면이 있다(chromatin 구조랑 RNA polymerase와 start codon도 eukaryote랑 유사).
자세한건 아래 링크
archea : http://100.naver.com/100.nhn?docid=828465
protist : http://navercast.naver.com/contents.nhn?contents_id=4203
difference between protist & fungi : http://answers.yahoo.com/question/index?qid=20080508155624AAVlMGj


종의 분류 in prokaryote
fungi랑 protist의 종의 개념은 형태나 reproductive behavior 에 많이 의존한다고 한다. 반면 prokayote의 종의 개념은 분자계통학적 연구방법에 따라 분류가 되는데 다음과 같은 두가지 기준이 있다. 두종이 구별되기 위한 조건 1. genome sequence가 달라야 한다. 그럼 어느정도? DNA-DNA hybridizaion 비교 일시 70% 이하로 hybridization되야 하고 2. 16sRNA 비교시 sequence similarity가 97% 이하여야 한다. 3. 단 위 두조건이 충족되더라도 형태나 생리적 표현 형질의차이가 없으면 다른 종으로 분류 할수 없다.


microbial community analysis (어떤 미생물이 얼마만큼 있는지 분석)
DGGE, TGGE, t-RFLP, SSCP 는 PCR로 16S rRNA gene을 증폭한담에 전기 영동으로 gel 상에 band의 형태로 미생물 군집의 변화를 본다. 음. 말 그대로 gel 걸어서 비슷한 것들끼리 분리되서 뭉치니까 그걸로 판단을 하는거 같고 근데 이것으론 데이터베이스와 그리고 종의 정보는 얻지 못함.
species richness : 시료내 종의 수 
OTU (operational taxonomic unit)으로 분류 대상이 되는 생물체의 개체 또는 군. 거의 종을 의미, 그러니까 species richness를 구한다는건 OTU의 수를 수한다는 구한다는 것과 동일하다고 할수 있을거 같다. 
1.일차적으로 read들을 filtering을 잘해서(quality filter, barcode & primer trimming) 2.CD-HIT과 같은 프로그램으로 read들을 clustering 후 3. 통계적 방법으로 실제의OTU를 추정 3.전체적인 종의 분포를 나타내는 diversity index를 구함.


의문점 및 checklist
1.누구랩 레포트를 보아하니 query를 blastn도 하고 megaBlast도하는데.. 음 왜 그러지 blastn만 하면 megablast 까지 커버가 되는거 아닌가? 굳이 둘다 하는 이유가 있나. 
2.그리고 blast후 비슷한 시퀀스를 뽑아낸 다음에 global alignment 를 하는데 여기서 말하길 clustalW의 것과 동일한 것을 사용한다고 하는데 (http://bioinformatics.oxfordjournals.org/content/4/1/11.abstract) 이건 일반적으로 알고 있는 needleman이랑은 다른 것인가?
3.read trimming을 할때 pairwise alignment를 해서 barcode와 primer를 제거해야 하는데 이를 어떤식으로 할것인가?
4.CD-HIT 관련 논문
5.species richness 의 통계적 추정 관련 논문
6.Mothur program
7.쌍둥이 내장내 miocrobiome metagenomics 논문

Sunday, March 13, 2011

네트워크 원리

어제 아이폰 수업을 마치고 회사에 들어왔는데 너무너무 아무것도 하기 싫어서 회사 안 책장을 뒤지다가 발견한 책. 사실 회사안에 있는 책은 2nd edition은 아니고 첫번째 에디션인데 내용은 차이가 없는 듯. 이제 읽기 시작했는데 인트로를 보니 내게 꼭 필요한책이 아닌가 싶다. 사실 얼마전에 TCP/IC 소켓 프로그래밍이란 책을 봤는데 (첫번째 시도에 5장인가까지 두번째 시도에는 13장까지.. 결국 마무리는 못지었지만..여튼) 어떻게 보면 내가 그 책을 본 이유가 네트워크 프로그래밍을 하고 싶어서라기보다 네트워크가 어떻게 돌아가는 지 알고 싶어서 였다. 그런 목적에서는 어쩌면 이 책이 더 적당하지 않을까 싶다. 이거 가능한 빨리 끝낸다. 
우선은 책의 구성이 참 맘에 든다. 일본인 저자인데.. 의외로 일본인이 지은 책을 실망한적이 없는거 같다. 이들은 참 생각을 많이 하고 책을 만들어 낸 느낌이 있다. 꼭 정석적으로라기 보다 어떻게 하면 조금 더 이해를 잘 시킬수 있을까라는 생각을 많이 하고 책을 만든다. 일단 첫부분에 전체 적인 내용을 요약한 테이블이 있는데. 음.. 이부터도 참 잘되어 있다. 고고

Saturday, March 12, 2011

iphone 개발 수업 1주차

3/11
프레임워크라는 것은  package 와 같은 개념. 그러니까 클래스 묶음.
iOS 는 4개의 계층으로 구성되어 있는데 맨 위의 계층만 거의 object-c로 구성. 그렇기에 개발 자체는 꼭 object-c일 필요는 없으나 프레임워크를 사용하려면 object-c 필요
NSLog 나 NSString 클래스는 UTF-8 을  사용한다. 그렇기에 ""앞에 @를 붙여서 @"somthing" 방식으로 사용한다.


3/12
alloc 하면 클래스를 메모리에 올림, 단 super, self 는 초기화된다. self에는 자기 자신의 메모리 주소를 가르킨다.
init 을 호출해야 그 클래스의 속성들 (refCount, )이 초기화 된다.
nil = Nil = NULL = 0
nil : alloc 했는데 오류, 포인터가 더이상 객체를 가르키지 않는다.
Nil : 포인터가 클래스 메소드를 더이상 가르키지 않는다.
NULL : 객체를 가르키는 포인터가 아닌 변수, 구조체를 가르키는 포인터가 더이상 변수 구조체를 가르키지 않는다.
사실 구분하지 않고 사용해도 효과는 동일


objective-c 2.0 버젼에서는
클래스 안의 속성값은 다른 클래스에서 접근할 수 없기 때문에 속성을 리턴하거나 수정하는 메소드를 정의해야 했다. 그런데 3.0버젼부터는 property를 사용하면 컴파일러가 자동으로 속성과 관련된 메소드를 만들어 준다. 그리고 3.0 에서는 자동 구현된 메소드는 . 연산자에 의해 접근이 가능하다(원래는 [object setAttr] 식으로 해야 하는데 object.setAttr가 가능하다, 단 자동 구현 메소드만).


property
선언부, interface 에서는 @property 구현부, implementation 에서는 @synthesize를 명시해야한다. retain은 객체 타입, assign은
아.  set, get 메소드가 생긴다라고 보기보다는 C++처럼 그냥 . 연산자로 속성에 접근이 가능하게 하는 효과가 생긴다. 그렇기에 set메소드처럼 사용하려면 class.attr = something, get메소드처럼 사용하려면 NSLog(@"%@",class.attr) 과 같이 사용한다. 이는 사실 컴파일러가 set, get 메소드를 정의하면서 동시에 연산자(=) 오버로딩에 의해 가능해진 것이다.
@property (<#attribute#>) <#type#> <#name#>
<#attribute#> 에는 3종류가 있는데 setter(assign, retain), nonatomic(atomic, nonatomic), getter(readwrite, readonly) 가 있다.
<#attribute#> 안써주면 default로 atomic 으로 설정된다. atomic 은 한번에 하나의 쓰레드에서만 접근 가능한 객체. nonatomic 으로 설정해주면 여러쓰레드가 동시 접근이 가능한 객체. 대부분의 속성은 nonatomatic 이다.


아이폰 앱의 Architecture 와 life cycle
앱의 아이콘 터치 => main 실행 => UIApplicationMain 함수 실행(이는 cocoa내부에 구현되어 있는 것으로 그 메소드의 인자에 의해 저절로 project 이름이 넘어가면서 3번 스텝에서 UIApplicationDelegate 클래스를 상속받은 클래스가 무엇인지 판단하게 된다) : 1. 프로젝트명-info.plist(앱전체 설정파일) 을 읽고 2. plist  파일에서 main nib file base base name 키를 보고 화면설정이 있는 파일 이름을 찾음(MainWindow.nib; xml 파일) 3. UIApplicationDelegate를 상속받은 클래스의 객체를 생성([[someClass alloc] init])(UIApplicationDelegate 클래스를 상속받은 객체는 반드시 하나), 이때 2번에서 읽은 파일에 읽은 xml 파일에 있는 화면 객체들을 생성해서 someClass 안에 있는 UI window 객체 타입의 window 변수에 넣는다. UI window는 기본적으로 안보이게 되어 있다.  4. UIApplication 객체 생성 5.그리고 UIApplication 객체가 무한 루프를 돌면서 event가 발생하는지 monitoring 하고 event에 따라서 거기에 맞는 someClass, 즉 3에서 생성한 클래스의 메소드 호출. 무한 루프는 iphone3 에서 home  버튼 누르면 끝났으나 4버젼부터는 home 버튼을 눌러도 background 로 돌고 메모리가 OS 에서 메모리가 부족하면 그 때 끝낸다.


무작정 따라하기
1. Main

Tuesday, March 8, 2011

metagenomics

요즘 구제역이다 뭐다 해서 가축들을 죄다 땅에 파 묻는 바람에 지하수에 구제역에 의한 오염이 있지 않나 뭐다나 해서 농진청에서 연구비를 지원하나보다. 덕분에 회사의 가장 힘없는 말단 사원인 난 metagenomics 세계로 뛰어 들게 된다(근데 들어보니 구제역은 바이러스 때문이라는데..). 평소에 metagenomics에 대해 생각이 없었는데.. 예전에 천교수님 발표 할때 들어보고.. 아 꽤 시장이 크구나라고 느낀게 전부인데.. 나는야 까라면 쪼금 반항해보고 결국 까고 마는 말단 사원이다(아.. 연구원이다.. 사원보다 월급 적게 받는).


뭐 덕분에 공부한다고 생각하고 하나하나 정리해보자.


metagenomics 란 무엇인가?


rRNA
metagenome 시퀀싱을 하면 일반적으로 rRNA를 시퀀싱한다 (물론 그냥 gDNA를 culture해서 orf도 prediction하고 protein 시퀀스를 이용해서 functional annotation도 하지만). 아직 까지 내가 아는 지식으론 아마도 그 orgamism들의 구성도를 보기 위해서? 여튼.. 아래 위키 for rRNA explanation
http://en.wikipedia.org/wiki/Ribosomal_RNA ribosomal RNAs는 LSU(large subunit), SSU(small subunit) 으로 구성되어 있는데 prokaryote의 경우 LSU로 50S가 SSU로 30S 가 있고 그 30S를 구성하는 rRNA가 바로 16S rRNA. 보통 rRNA sequencing 중 16S rRNA 시퀀싱을 많이 하는데 그 이유를 생각해 보자면 http://en.wikipedia.org/wiki/16S_ribosomal_RNA 에 마지막에 보면 16S rRNA에 universal primer를 쓸수 있을 정도로 conserved 한 region도 있고 반면에 굉장히 변화가 심한 hypervariable region도 있기 때문에 아마도 species를 구분하기에 적당해서가 아닐까.
참고로 다음 논문도 읽어볼만 할듯하다. 


Ribosomal RNA : a key to phylogeny
http://www.fasebj.org/content/7/1/113.full.pdf#page=1&view=FitH


metagenomics 분석 어떻게 해야 하나?
http://mmbr.asm.org/cgi/content/short/72/4/557
metagenomics를 위한 bioinfomatic 가이드라는 제목의 review인데.. 꼭 읽어봐야 할듯. intro 바로 처음에 나오듯이 이 리뷰는 functional metagenomics (특정 activity가 있는 것만 골라내서 cloning 해서 시퀀싱 한거)랑 구분하여 50Mbp 이상의 randomly sampled sequnces를 분석하는 가이드.


관련 데이터 베이스
들어보니 Silva, greengenes, EZ_taxon 이렇게 3개가 가장 많이 사용되는거 같다. 몇개 찾아보니 Silva가 가장 잘 되어 있는 느낌(?)이 드는데 우선 관련 논문


<Silva>
http://nar.oxfordjournals.org/content/35/21/7188.full?keytype=ref&ijkey=pwbw9T96ADMbJBk
일단 이러한 데이터 베이스의 목적은 넘쳐나는 rRNA데이터를 careful inpection, 그러니까 curration을 통해 rRNA가 biodiversity 연구에 도움이 되도록 하는데 있다(unified quality control & alignment of rRNA datasets). 
논문을 보니까 rRNA 를 이용한 phylogeny의 연구에 ARB 라는 software와 이를 위한 db를 많이 썼었던걸로 보인다. ARB 말고도 rRNA curation을 위한 3개의 main project를 소개한다(greengenes, RDP,그리고 하나가 european rRNA 데이터 베이스인데 이것이 Silva로 들어 간것으로 보인다.). 아 그리고 하나 greengene에서는 ARB compatible dataset을 가지고 있긴 한데 full length인것만 대해서만. 그리고 요즘은 LSU rRNA도 많이 사용한다네(특히 eukaryote의 경우). intro을 본 결론은 4개의 DB 그중 ARB랑 european rRNA은 Silva로 편입된거 같다.
-Sequence data
Silva의 버젼은 EMBL과 버젼이 똑같다. 곧 RNA와 관련된 키워드 모두 검색해서 EMBL에서 RNA 시퀀스를 가져온다는 말. 그리고 seed alignment를 제공한다는데.. silva의 예전 버젼 격인 ARB에서 release 한것을 그대로 유지한다는데.. 이 seed alignment라는게 뭔지 잘 모르겠다..
-Quality checks
1.unaligned uncleotides 중 300bp보다 짧거나, 2. 2%이상 ambiguities가 있거나, 3. 아니면 2%이상의 homopolymer (homotetramer(homo-4bp)이상)가 있거나, 4. vector랑 5%이상 매치되면 제거. 그리고 이 세가지(2,3,4 항목)의 평균을 구해서 100에서 빼면 이것이 sequence quality가 된다. 이후 필터링 통과한 시퀀스들은 seed alingment에 대해 SINA(silva incremental aligner)에 의해 alignment가 되어 진다. 근데 이 sequence quality로 뭐하는 것인지.. 이미 4가지 항목으로 필터링 했는데 그 뒤에 이 sequence quality를 왜 구하는건지..이 역시 아직 잘 모르겠음
-Aligner
ARB의 suffix tree[1] 방식을 이용해서 seed alignment에서 최대 40개까지 유사한 시퀀스를 찾는다. 이렇게해서 찾아진 시퀀스 들은 partial order graph[2]로 옮기고 이 graph 위에다가 query를 needleman 방식으로 align 한다. 이 과정에서 alignment quality와 basepair score를 구하고 이는 0~100 사이 값으로 normalized 한다. alignment를 마친뒤에 aligned된 bp가 300bp보다 작으면 버린다.
-Anomaly check
이건 seed sequence의 anomaly를 체크 하기 위한 것이거 같은데. pintail이란 프로그램을 사용한단다. seed sequence들 전보를 20 개의 sequence로 된 한 그룹에 대해 pairwise check를 하는데 만약 대부분의 alignment가 anomalous 하게 나오면 seed에서 제거한다는거 같은데.. 저 20개의 sequence가 정확히 뭔지 모르겠다.. 모르는거 투성이네. 에이
-Taxonomy
-Nomenclature
-SSU and LSU rRNA databases for ARB
Ref databases: Parc database의 subset, 1.length cutoff :거의 full length의 시퀀스(최소 1200bp). archaea의 경우 800bp. LSU의 경우 1900bp. 2.alignment curoff : alignment score가 SSU의 경우 50, LSU의 경우 30 이상. 이 뒤에 positional variability filtering이 있는데 잘 이해 안됨.
Parc databases: 위의 quality가 확인된 모든 sequences


[1]suffix tree: 이진트리나 레드블랙트리는 봤어도 suffix tree는 사실 제대로 본적이 없다. 금선생이 추천해준 책에 몇챕터에 걸쳐서 나오는데.. 아.. 역시 모든 지식은 연결된듯하다. 여튼 급한데로 훓어보는데.. http://graphy21.blogspot.com/2011/03/suffix-tree.html 
[2]http://bioinformatics.oxfordjournals.org/content/18/3/452.full.pdf#page=1&view=FitH 

Thursday, March 3, 2011

TSS, TxStart, CDSstart,

맨날 까먹고 헷갈리고.. 에이.. 
TSS : transcription start site. 그러니까 5'UTR 부분부터.
http://en.wikipedia.org/wiki/Transcription_start_site


txStart : TSS 랑 같은말


cdsStart : coding region start site로 start codon 부터 시작. 곧 protein 시작 부분.


그런데 헷갈렸던 것이 위 그림. 어떤 exon은 wholly or partially 5' UTR 이기때문에 exon start site가 cds start 랑 같지 않다.

Wednesday, March 2, 2011

RNA-seq 분석을 위한 논문 탐험

예전에 RNA-seq 한번 리뷰하고 거기서 ERNAGE라는 프로그램에 관한 논문을 정리 한적이 있었다. 이번에 정말로 RNA-seq 데이터를 다뤄야 하고 예전에는 거의 초점이 eukaryote에 맞춰졌기 때문에 bacteria의 transcriptome에 관련하여 좀더 논문들을 정리해 보고자 한다. 


start point 
http://www.ncbi.nlm.nih.gov/pmc/articles/PMC3025319/
내가 분석해야 하는 대상이 미생물 균주, bacteria 이기 때문에 우선 위 논문을 시작으로 한다. 위 리뷰논문을 보면 관련 논문을 잘 정리해 놨다. 마지막 limitations에 관한 내용을 보면 RNA secondary structure, random hexamer priming, second strand synthesis, PCR amplication stage에 의해 문제가 유발되는데 이는 ion-catalyzed hydrolysis와 direct RNA sequencing으로 어느정도 해결 가능하다고 마무리.. 아 그리고 figure1 이 실험종류와 단계에 대한 정리를 잘해놨다(결론적으로 directional 이나 아니냐 둘로 나뉘는데.. 확실히 directional로 실험을 해야 맞는거 같은데.. 안타깝게도 우리 데이터는 아닌듯). 오른쪽 그림 참조


second paper
http://www.biomedcentral.com/1471-2180/8/72
음.. 우리가 non-directional 로다가 실험을 했기에 또 기기가 FLX인 관계로 위 first point 의 reference 중 상황이 가장 유사한 논문이 바로 위 url. 일단 genome size 가 대략 3Mb, megaplasmid 가 있는거 빼곤 우리 상황이랑 비슷하다. 
아.. 이 논문은 아닌거 같다. BMC microbiology에 나온건데.. 초창기 논문이라 그런지 아마도 FLX로 다가 transcriptome을 거의 처음 했다는 이유로.. rRNA depletion을 했는데도 read의 90 % 가 rRNA에 mapping되니. 그래서 아마도 논문의 방향을 novel gene finding으로 전환한듯. 여튼 패스..


third paper
http://www.sciencemag.org/content/326/5957/1268.short
좀 뭔가 의미 있는 내용을 보기 위해 그냥 선택한 논문. science니까. 첫번째 논문에서 인용도 많이 한거 같고. 음.. 읽어보니 확실히 사이언스다. 두번째 논문 봤을 때는 이거 일주일이면 하겠다고 생각했는데.. 
spotted array, tiling array, rna-seq (rna-seq 도 directional 한 방법을 이용) 모두 이용해서 operon의 boundary를 정한다 (expression이 급격히 떨어지는 region). 그리고 operon이 poly- | mono- cistronic 인지 확인한다 (rna-seq만 이용했을때 false positive가 얼마인지도 조사). operon을 정하고 나면 promoter region을 찾고 대략적인 TSS와 CDS와의 거리도 조사한다. 또한 trascriotion end site의 2차구조를 봐서 hairpin 구조가 transcription termination에 영향이 있는지 확인한다. polycistronic operon에 있는 gene들의 decay behavior도 관측한다. 여까지는 대략적인 transcriptome landscape라고 할까. 
그 뒤 여러 다양한 조건에서의 expression 변화를 가지고 context-dependent modulation of operon structure involving repression or activation of operon internal or end-located genes (아.. 그러니까.. 음.. 하나의 operon 안에 여러 유전자가 위치에 따라 module화가 되어 (suboperon 마냥) 상황에 따라 오듈 단위로 다르게 expression 한다 뭐 이런.. 맞나..) 을 봤다. 또 이와 같은 이유는 eukaryote 에서 처럼 다양한 factor의 작용에 의한 것이 아닐까 추측 그리고 factor가 될만한 후보자들을 가지고 expression clustering. 해서 아.. factor가 많음 갑다라고 추측.


중요한건 the proteome organiztion is not explainable by the genome organizaion. 그리고 the expression heterogeneity within operon 이 아마도 생각했던것보다 bacteria의 transcriptional regulation이 eukaryote과 많이 유사하기 때문이지 않나 싶다는 것.


fourth paper
http://bioinformatics.oxfordjournals.org/content/early/2009/10/24/bioinformatics.btp612.full.pdf
다음은 분석 툴에 대한 논문이다. 정확히 이야기 하면 R package. 


checklist
1. Segmentation algorithm : for identification of uncovered region in tiling array
2. Local convolution method : finding operon boundary
3. How do they decide polycistronic & monocystronic operon (maybe by DSSS)
4. In polycistronic how they divide genes in operon
5. Sigma 70 promoter region (TSS located within 60bp from CDS start site)